Báo cáo chuyển đổi warehouse-service

batch · batch/update · api

POST/api/client/page/batches/update

Vòng
2
Cổng G1–G6
PENDING_SONAR
Bước
sonar-check
Nhánh đích
feat/thongpd/migrate-batch2

Báo cáo sai lệch — batch/update — vòng 2

0. Kết luận nhanh

  • Điều kiện đạt: G1 ✅ G2 ✅ G3 ✅ G4 — G5 ✅ G6 ✅ → CHỜ KIỂM SONAR
  • Trạng thái: SẴN SÀNG CHO NGƯỜI XEM
  • Tầng rủi ro: B → người cần đọc: spec + báo cáo + đoạn bị gắn cờ (mục 3)
  • Số quy tắc: 9 · PASS 5 · DEVIATION có chủ đích 3 (R-01 D-02, R-02 D-01, R-09 D-05) · DEVIATION KHÔNG chủ đích 0 · UNVERIFIED 1 (R-06 dirty-check)
  • Coverage thấp nhất: F-01 100% dòng
  • Finding logic: CRITICAL 0 · MAJOR 0 (vòng 1 có 1, đã sửa) · MINOR 1 · UNSURE 0
  • Nghi vấn bug code cũ (mục 3c): 4 (CAO 0) · Quyết định tự chốt cần xác nhận (mục 3d): 6
  • Chạy bằng: /mig-auto · Số vòng: 2 / lần sửa 1/3

1. Điều kiện đạt

Mã Mục tiêu Kết quả Bằng chứng
G1 mvnw verify ✅ verify/round-2/build.md (610 test)
G2 Test khớp test-plan ✅ verify/round-2/tc-map.md (19/19), oracle.md
G3 Coverage ✅ verify/round-2/coverage.md
G4 Sonar CHỜ NGƯỜI sonar-ide.md
G5 Finding CRITICAL/MAJOR ✅ verify/round-2/review-logic.md (thu hẹp, 1 MINOR)
G6 Lách cổng ✅ verify/round-2/gates.md

Không chặn nhưng cần người: Integration test CHƯA CHẠY · Golden master CHƯA CHẠY (GM-01)

Coverage theo luồng

Luồng Tên % dòng % nhánh
F-01 Sửa lô (không id thì tạo) 100% 100% (logic dùng lại đo ở batch/create)

2. Ma trận truy vết

Quy tắc Tầng Code mới Test Golden Kết luận
R-01 B BatchController.update TC-01..03 — DEVIATION có chủ đích (D-02)
R-02 B BatchManagementService.save TC-04, 05 — DEVIATION có chủ đích (D-01)
R-03 B loadOwnBatch TC-06 — PASS
R-04 B kiểm trùng TC-07..09 GM-01 PASS (giữ D-04)
R-05 B update, BatchNormalizedName, BatchStatusPolicy TC-10..13 — PASS
R-06 B BatchDirtyCheck, BatchWriter (flush) TC-14, 15 GM-01 UNVERIFIED (D-07)
R-07 B controller, service TC-16, 17 — PASS (giữ D-08)
R-08 B service nhánh tạo TC-18 — PASS (giữ D-03)
R-09 B translate, flush TC-19 (+EXTRA-1) — DEVIATION có chủ đích (D-05)

3. Người cần xem

# Vị trí Vì sao cần người xem
1 infrastructure/relational/batch/adapter/BatchWriter.java:85-90 Fix 1: flush() ngay ở nhánh sửa — file của batch/create (K-28, đã chạy lại test create); flush đẩy mọi entity managed trong transaction
2 BatchManagementService.java (update), BatchDirtyCheck.java mô phỏng dirty-check (D-07), lotNo thô trong response (D-08)
3 F-logic-1 vòng 2 (MINOR) cũ nạp lô 2 lần, mới 1 lần: lô bị xoá đồng thời + request không đổi gì → cũ 417, mới 200 (mục 3d #6)
4 G4 Chưa kiểm Sonar

3b. Phân tích luồng sau chuyển

Chi tiết: verify/round-2/flow-analysis.md (vòng 1: verify/round-1/flow-analysis.md)

Luồng Tên Số bước KHỚP / KHÁC / CHỈ CÓ Ở CŨ / CHỈ CÓ Ở MỚI Lệch luồng đã duyệt (spec mục 6) Điểm dev cần chú ý
F-01 Sửa lô (không id thì tạo) KHỚP 8 / KHÁC 4 (có chủ đích: D-01, D-02, D-03 + D-11 create, D-05) / CHỈ CÓ Ở CŨ 2 (bước nạp lại lô của F-logic-1; kiểm gói D-09) / CHỈ CÓ Ở MỚI 0 lệch spec mục 6: không BatchWriter.java:85-90 vừa thêm flush: UPDATE chạy ngay trong translate, và flush đẩy mọi entity đang managed. BatchDirtyCheck vẫn UNVERIFIED. Code mới chỉ đọc lô một lần (F-logic-1).

3c. Nghi vấn bug / sai ở code cũ (đã GIỮ nguyên khi chuyển)

B-01 /update không có id tạo lô mới

  • Mức nghi ngờ: THẤP — có thể do dùng chung hàm lưu.
  • Ở đâu: code cũ backend:web/rest/BatchesManagementResource.java:47-52 → code mới BatchController.update → BatchManagementService.save
  • Code cũ đang làm gì: API "sửa" không kèm id sẽ tạo lô mới với mã LH<n+1>.
  • Ví dụ cụ thể: POST /update {"comId":10,"lotNo":"A1",…} (không id), công ty có 5 lô → tạo LH6, trả "Tạo mới thành công!".
  • Vì sao nghi là sai: tên API là sửa.
  • Ảnh hưởng nếu đúng là bug: client quên gửi id sẽ tạo lô trùng nội dung.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-18 (BatchManagementServiceTest$Update#updateWithoutIdCreates, BatchControllerTest$Update#createdThroughUpdate).
  • Nếu muốn sửa: /update bắt buộc id (400) ở controller; đổi TC-18.
  • Liên quan: D-03, R-08

B-02 Kiểm trùng bằng số lô chưa làm sạch; dữ liệu đã trùng sẵn thì không sửa được

  • Mức nghi ngờ: TRUNG BÌNH
  • Ở đâu: code cũ backend:service/impl/BatchesManagementServiceImpl.java:206-217 → code mới BatchManagementService.save, BatchJpaRepository.findDuplicate
  • Code cũ đang làm gì: so trùng bằng số lô thô; nếu đã có 2 lô trùng hệt nhau thì câu kiểm trùng lỗi.
  • Ví dụ cụ thể: có lô 9 A1; sửa lô 5 thành " A1" cùng ngày → không báo trùng, lưu A1 → hai lô A1. Sau đó sửa lô 5 chỉ đổi cảnh báo 30 → 60 → lỗi hệ thống 500, không sửa được lô 5 nữa.
  • Vì sao nghi là sai: kiểm trùng bị lách bởi khoảng trắng và tự khoá chính dữ liệu trùng.
  • Ảnh hưởng nếu đúng là bug: lô trùng không sửa/không thêm được, phải xử lý tay trong DB.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-08 (BatchManagementServiceTest$Update#duplicatedRowsAlready).
  • Nếu muốn sửa: kiểm trùng bằng số lô đã làm sạch và bỏ qua chính lô đang sửa trong câu truy vấn; đổi TC-08.
  • Liên quan: D-04, R-04

B-03 Tab trong số lô làm tên tìm kiếm có dấu cách

  • Mức nghi ngờ: THẤP
  • Ở đâu: code cũ backend:util/Common.java:1315-1329 → BatchNormalizedName
  • Code cũ đang làm gì: tên chuẩn hoá tính trên số lô thô; tab thành dấu cách khi lưu.
  • Ví dụ cụ thể: sửa số lô "Lô<tab>B" → normalized_name="lh5|lo b" → tìm "lob" không ra.
  • Vì sao nghi là sai: tên chuẩn hoá lẽ ra không có dấu cách.
  • Ảnh hưởng nếu đúng là bug: hiếm.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-11 (BatchManagementServiceTest$Update#tabInLotNo).
  • Nếu muốn sửa: tính trên giá trị đã làm sạch; đổi TC-11.
  • Liên quan: D-06, R-05

B-04 Sửa lô trả số lô chưa làm sạch

  • Mức nghi ngờ: THẤP
  • Ở đâu: code cũ backend:service/impl/BatchesManagementServiceImpl.java:249-258 → BatchManagementService.update
  • Code cũ đang làm gì: response dựng trước khi lưu nên trả số lô đúng như gửi.
  • Ví dụ cụ thể: sửa " A 1 " → response " A 1 ", DB "A 1".
  • Vì sao nghi là sai: response khác dữ liệu đã lưu.
  • Ảnh hưởng nếu đúng là bug: hiển thị lệch tới khi tải lại.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-16, TC-17 (BatchControllerTest$Update#updated, BatchManagementServiceTest$Update#rawLotNoWhenDirty).
  • Nếu muốn sửa: trả giá trị đã làm sạch; đổi TC-16, TC-17.
  • Liên quan: D-08, R-07

3d. Quyết định AI tự chốt và thay đổi tự động (cần người xác nhận)

# Nguồn AI đã làm gì Khác code cũ ở điểm nào (input → cũ / mới) Người cần xác nhận gì
1 spec-review Spec qua 1 lần review (tầng B, không CRITICAL); đã sửa theo MAJOR: R-04, D-04 (F-spec-1, dữ liệu trùng sẵn) — Đọc kỹ R-04
2 D-01 (PHỤ THUỘC NGOÀI) Chỉ giữ 2 kiểm token/công ty token cũ sau đổi mật khẩu → cũ 500 / mới sửa Chấp nhận
3 D-02 (ADR BẮT KHÁC) Body theo starter trùng → cũ "data":null / mới không có key Chấp nhận
4 D-05 (ADR BẮT KHÁC) 417 → 500 giữ EXCEPTION_ERROR; lỗi lúc UPDATE nay cũng EXCEPTION_ERROR nhờ flush (fix 1) lô có code NULL → cũ 417 / mới 500 Chấp nhận
5 D-07 (MƠ HỒ) Mô phỏng dirty-check UNVERIFIED Chạy GM-01
6 F-logic-1 vòng 2 (MINOR, chưa có D-xx) Đọc lô một lần lô bị xoá đồng thời, request không đổi gì → cũ 417 / mới 200 Chấp nhận hay cần đọc lại lô trước khi trả

4. Finding đã xác nhận

  • Vòng 1 F-logic-1 (MAJOR, transaction): CONFIRMED (verify/round-1/verification.md) → ĐÃ SỬA ở fix 1.
  • Vòng 2 F-logic-1 (MINOR, parity): xem 3d #6.

5. Finding bị loại

Không có.

6. Xử lý của người

Vấn đề Cổng Chỉ thị
Chưa kiểm Sonar G4

7. So với vòng trước

Vấn đề Vòng trước Vòng này
F-logic-1 (MAJOR) UPDATE lúc commit ngoài translate MỚI ĐÃ HẾT
F-logic-2 (MINOR) đọc lô một lần MỚI CÒN (F-logic-1 vòng 2)

8. Thay đổi trong repo đích

5 file (verify/round-2/changed-files.md): BatchController (thêm /update, gom save chung), BatchWriter (flush), 3 file test. BatchWriter, BatchRelationalRepositoryTest thuộc batch/create — đã chạy lại test, xanh.

9. Đề xuất bổ sung kinh nghiệm

Đề xuất Đưa vào đâu
Adapter bọc lỗi DB (translate) phải flush() ở nhánh sửa entity managed, nếu không lỗi UPDATE chạy lúc commit ngoài khối bọc → sai mã lỗi; test bằng mock save không bắt được lessons.md 1b
/create và /update dùng chung save: làm unit create đủ cả hai nhánh, unit update chỉ thêm endpoint + test nhánh sửa — tiết kiệm một lần implement lessons.md Phần 2 (làm tắt)

Nguồn của trang này

  • Báo cáo sai lệch migrations/batch/update/report.md vòng 2 · sha256 b144f2d398b5

v1 dựng 2026-11-09 14:46 · base commit đích 661efe9b8c