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

Tồn kho · inventory/listener-cogs-update-async · listener

RABBIT${spring.rabbitmq.queues.cogs-update-async}

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

Báo cáo sai lệch — inventory/listener-cogs-update-async — vòng 1

0. Kết luận nhanh

  • Điều kiện đạt: G1 ✅ G2 ✅ G3 ✅ G4 — G5 ✅ G6 ✅ → CHỜ KIỂM SONAR (máy đạt hết, chờ người kiểm G4)
  • Trạng thái: SẴN SÀNG CHO NGƯỜI XEM
  • Tầng rủi ro: A (ghi đơn giá/tiền phiếu xuất, hoá đơn, lệnh huỷ hàng) → người cần đọc: spec + báo cáo + toàn bộ diff
  • Số quy tắc: 5 · PASS 4 (R-02…R-05) · DEVIATION có chủ đích 1 (R-01 — D-01 dùng lại D-04/D-08/D-09 của listener-cogs-completion) · DEVIATION KHÔNG chủ đích 0 · UNVERIFIED: TC-14 (đồng bộ lệnh huỷ — cú pháp SQL Server)
  • Coverage thấp nhất: F-01 100% dòng / 90% nhánh
  • Finding logic: CRITICAL 0 · MAJOR 0 · MINOR 1 · UNSURE 0
  • Nghi vấn bug code cũ (mục 3c): 3 (CAO 1) · Quyết định tự chốt cần xác nhận (mục 3d): 4
  • Chạy bằng: /mig-auto lượt 20261105-2144 (spec qua 1 lần spec-reviewer, chưa có người duyệt) · Số vòng: 1 verify / lần sửa 0/3
  • Phạm vi còn nghi vấn (❓) — như listener-cogs-completion.

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

Mã Mục tiêu Kết quả Bằng chứng
G1 mvnw verify ✅ verify/round-1/build.md (764 test, SpotBugs 0, ArchUnit 36/36)
G2 Test khớp test-plan ✅ verify/round-1/oracle.md (19/20 khớp; TC-14 UNVERIFIED do H2 không chạy cú pháp SQL Server)
G3 Coverage mỗi luồng ✅ verify/round-1/coverage.md
G4 Sonar CHỜ NGƯỜI sonar-ide.md
G5 0 CRITICAL/MAJOR ✅ verify/round-1/review-logic.md (1 MINOR)
G6 Không lách cổng ✅ verify/round-1/gates.md; 12 file đều có trong impl-notes.md

Không chặn nhưng cần người: TC-14 chạy trên SQL Server thật · Golden master GM-01 CHƯA CHẠY (tầng A).

Coverage theo luồng

Luồng Tên % dòng % nhánh
F-01 Nhận message, đọc task log, ghi kết quả, ack/nack 100.0% (44/44) 90.0% (9/10)
F-02 Áp cập nhật đơn giá / tiền vào phiếu, hoá đơn, lệnh huỷ 100.0% (58/58) 100.0% (16/16)

2. Ma trận truy vết

Quy tắc Tầng Code mới Test Golden Kết luận
R-01 A CogsUpdateAsyncConsumer, CogsUpdateTaskService TC-01..05 — DEVIATION (có chủ đích, D-01)
R-02 B CogsTaskLogMongoStore.parseUpdate TC-06, 07 — PASS
R-03 A CogsBatchUpdateService, CogsUpdateRelationalRepository TC-08..16 GM-01 PASS — giữ NGHI BUG D-03; TC-14 UNVERIFIED
R-04 A CogsUpdateRelationalRepository.addWardDeltas TC-17 GM-01 PASS — giữ NGHI BUG D-04, D-07
R-05 A CogsUpdateTaskService, consumer TC-18..20 — PASS (text lỗi tầng transaction khác — F-logic-1)

3. Người cần xem

# Vị trí Vì sao cần người xem
1 Toàn bộ diff (verify/round-1/changes.diff, 12 file) Tầng A
2 …/infrastructure/relational/cogs/adapter/CogsUpdateRelationalRepository.java SYNC_PRODUCTION_ORDER_SQL UPDATE … FROM … JOIN riêng SQL Server — chỉ khoá được câu SQL, chưa chạy thật (TC-14 UNVERIFIED)
3 CogsUpdateRelationalRepository Ghi bảng bill_product, production_order_detail của context khác (D-05, transitional)
4 F-logic-1 (MINOR) Lỗi lúc mở/commit transaction: error_message khác text cũ (cũ getMessage(), mới toString() của nguyên nhân)
5 Sửa file của unit listener-cogs-completion CogsTaskLogStore, CogsTaskLogMongoStore thêm parseUpdate

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

Chi tiết: 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 Nhận message, đọc task log, ghi kết quả, ack/nack 7 / 3 (D-04/D-09, D-08, D-07 của LC) / 0 / 0 không text lỗi tầng transaction (F-logic-1); ghi status 1 sau commit → giao lại cộng delta lần nữa
F-02 Áp cập nhật vào phiếu, hoá đơn, lệnh huỷ 8 / 1 (bỏ đếm dòng — chỉ log) / 0 / 0 không SQL Server-only UPDATE…FROM; cộng dồn tiền phiếu không chống lặp

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

B-01 Đơn giá dòng phiếu và chênh lệch tiền phiếu đi hai message riêng: lỗi một bên là tiền phiếu lệch vĩnh viễn

  • Mức nghi ngờ: CAO — lỗi DB tạm thời (deadlock, mất kết nối) ở một trong hai message là đủ; không retry, tính lại còn làm lệch thêm.
  • Ở đâu: code cũ base:services/impl/BaseCogsHistoryServiceImpl.java:157-180 (bên gửi tách hai task log), async:…/CogsUpdateAsyncListener.java:94-97,111-112 → code mới (giữ nguyên) …/application/cogs/CogsUpdateTaskService.java, …/CogsBatchUpdateService.java
  • Code cũ đang làm gì: đơn giá từng dòng phiếu xuất và phần chênh lệch tổng tiền phiếu được gửi thành hai việc riêng, mỗi việc ghi DB riêng; việc nào lỗi thì bị bỏ, không chạy lại.
  • Ví dụ cụ thể: phiếu 900 tổng 1.000, dòng 904 thành tiền 100 → giá vốn mới cho 150. Việc "dòng" lỗi, việc "phiếu" thành công → phiếu 1.050, dòng vẫn 100. Người bấm tính lại → lại +50 → phiếu 1.100, dòng 150 (đúng phải là 1.050).
  • Vì sao nghi là sai: tổng tiền phiếu phải bằng tổng các dòng; ở đây lệch và không tự sửa được.
  • Ảnh hưởng nếu đúng là bug: báo cáo giá trị xuất kho, công nợ theo tổng phiếu sai.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-17 (CogsUpdateRelationalRepositoryTest#deltaAppliedTwice), TC-10.
  • Nếu muốn sửa: gộp cập nhật dòng và phiếu vào một task log/transaction ở bên gửi (cogs-calculate) và ở đây; đổi định dạng message.
  • Liên quan: D-07, D-04, R-03, R-04

B-02 Message giao lại sau khi đã ghi DB thì tiền phiếu bị cộng hai lần

  • Mức nghi ngờ: TRUNG BÌNH — cần crash/lỗi Mongo đúng giữa lúc commit DB và lúc ghi status 1.
  • Ở đâu: code cũ base:repositories/impl/BaseCogsHistoryRepositoryCustomImpl.java:155-158, async:…/CogsUpdateAsyncListener.java:63 → mới …/CogsUpdateRelationalRepository.java ADD_WARD_DELTA_SQL
  • Code cũ đang làm gì: cộng chênh lệch vào tiền phiếu; chống làm lại chỉ bằng trạng thái task log ghi sau khi DB đã commit. deltaAmount null → tiền phiếu thành NULL.
  • Ví dụ cụ thể: phiếu 900 tiền 1.000, chênh +50; DB commit xong thì service tắt → message giao lại → 1.100.
  • Vì sao nghi là sai: thao tác cộng dồn cần chống lặp trong cùng transaction.
  • Ảnh hưởng nếu đúng là bug: tiền phiếu sai khi có sự cố triển khai/khởi động lại.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-16, TC-17.
  • Nếu muốn sửa: ghi khoá idempotency (id task log) vào DB trong cùng transaction với UPDATE.
  • Liên quan: D-04, R-04

B-03 Cập nhật theo id, không kiểm công ty

  • Mức nghi ngờ: THẤP — id luôn do bước tính (đã lọc công ty) sinh ra.
  • Ở đâu: CR:79,118,155-158,189-197 → CogsUpdateRelationalRepository
  • Code cũ đang làm gì: UPDATE chỉ WHERE id = ?, message không mang comId.
  • Ví dụ cụ thể: task log công ty 10 chứa dòng 904 thuộc công ty 11 → dòng của công ty 11 vẫn bị đổi.
  • Vì sao nghi là sai: trái tiêu chí C-01 (mọi truy vấn kho lọc comId).
  • Ảnh hưởng nếu đúng là bug: chỉ khi dữ liệu task log bị sai/ghi tay.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-13..16 (không có com_id trong điều kiện).
  • Nếu muốn sửa: thêm com_id của document vào điều kiện.
  • Liên quan: D-03, R-03

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 D-01 Dùng lại mọi quyết định nhận message của listener-cogs-completion (trừ D-06) như report unit đó mục 3d Xem migrations/inventory/listener-cogs-completion/report.md#3d
2 D-02 Không IdempotencyStore (lệch ADR-0301 có chủ đích) không khác cũ Chốt ngoại lệ ADR
3 D-05 Adapter JDBC ghi bill_product, production_order_detail không khác dữ liệu Chấp nhận ghi chung DB tạm thời
4 D-06 error_message: lỗi đọc → message Jackson; NPE → "java.lang.NullPointerException"; lỗi DB → toString() của nguyên nhân lỗi commit transaction → cũ getMessage() / mới toString() của nguyên nhân (F-logic-1) Chấp nhận khác text lỗi

Spec qua 1 lần review; các R-xx đã sửa theo MAJOR: R-03, R-04, R-05 — người đọc kỹ đúng các quy tắc này.

4. Finding đã xác nhận

Không có CRITICAL/MAJOR. MINOR: F-logic-1 (verify/round-1/review-logic.md).

5. Finding bị loại

Finding Lý do loại
— —

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

Vấn đề Cổng Chỉ thị
Kiểm Sonar trong IDE (sonar-ide.md) G4

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

Vòng đầu.

8. Thay đổi trong repo đích

12 file (verify/round-1/changed-files.md): 5 main mới (consumer, 2 service, repository port, adapter JDBC), sửa CogsTaskLogStore/CogsTaskLogMongoStore (unit 1 cùng lượt); 4 test mới, sửa CogsTaskLogMongoStoreTest.

9. Đề xuất bổ sung kinh nghiệm (/mig-learn gom vào proposal để người duyệt)

Đề xuất Đưa vào đâu
H2 MODE=MSSQLServer không chạy UPDATE <alias> … FROM … JOIN — khoá câu SQL bằng DataSource giả + ghi UNVERIFIED, không viết test-plan kiểu "H2" cho câu này lessons.md (1c)
Chèn mã Java qua node -e: "\\s" thành "\s" (escape hợp lệ trong Java 15+ = dấu cách) → regex sai mà vẫn compile lessons.md (1c) — trùng ý K-29 đề xuất ở 20261105-1459
Code cũ bọc lỗi new RuntimeException(e) → error_message = e.toString(); NPE trên Java 11 = "java.lang.NullPointerException" legacy-facts.md

Nguồn của trang này

  • Báo cáo sai lệch migrations/inventory/listener-cogs-update-async/report.md vòng 1 · sha256 a1bfd3190f46

v1 dựng 2026-11-06 00:42 · base commit đích a06ccfa6d4