Báo cáo sai lệch — rsinoutward/by-id — 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: C (chỉ đọc) → người đọc spec + báo cáo
- Số quy tắc: 15 · PASS 9 · DEVIATION có chủ đích 4 (R-01, R-02, R-13, R-14) · DEVIATION KHÔNG chủ đích 0 · UNVERIFIED 2 (R-03/R-05/R-10 SQL thật; R-15 replica)
- Coverage thấp nhất: F-01 99,7% dòng / 96,8% nhánh (vòng 1; vòng 2 xem
verify/round-2/coverage.md) - Finding logic: CRITICAL 0 · MAJOR 1 đã sửa (F-logic-1 v1) · MAJOR UNSURE 1 (F-logic-2 v1) · MINOR 3
- Nghi vấn bug code cũ (mục 3c): 3 (CAO 0) · Quyết định tự chốt cần xác nhận (mục 3d): 12
- Chạy bằng:
/mig-auto(spec dospec-reviewerkiểm 1 lần — tầng C) · 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 (659 test) |
| G2 | Test khớp test-plan | ✅ | verify/round-2/tc-map.md (39/39), oracle.md |
| G3 | Coverage mỗi luồng | ✅ | verify/round-2/coverage.md |
| G4 | Sonar | CHỜ NGƯỜI | sonar-ide.md |
| G5 | 0 CRITICAL/MAJOR CONFIRMED | ✅ | verify/round-2/review-logic.md (1 MINOR); vòng 1 verification.md |
| G6 | Không lách cổng | ✅ | verify/round-2/gates.md (44 file, có trong impl-notes.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)
2. Ma trận truy vết
| Quy tắc | Code mới | Test | Kết luận |
|---|---|---|---|
| R-01 | RsInoutwardQueryController#getOneById |
TC-01, TC-02 | DEVIATION có chủ đích (D-02) |
| R-02 | RsInoutwardDetailQueryService |
TC-03, TC-04 | DEVIATION có chủ đích (D-01) |
| R-03 | RsInoutwardDetailRelationalRepository |
TC-05..07 | UNVERIFIED (SQL thật) |
| R-04 | RsInoutwardPaymentSourceRelationalAdapter |
TC-08..11 | PASS |
| R-05 | RsInoutwardDetailRelationalRepository |
TC-12, TC-13 | UNVERIFIED (SQL thật) |
| R-06 | service | TC-14, TC-15 | PASS |
| R-07 | LegacyAmount |
TC-16 | PASS |
| R-08 | service + SerialValidationDataReader |
TC-17..19 | PASS |
| R-09 | BatchQueryService |
TC-20, TC-21 | PASS (F-logic-2 UNSURE) |
| R-10 | RsInoutwardBatchOnHandAssembler, BatchOnHandRelationalRepository |
TC-22..30 | UNVERIFIED (bảng tạm, in () thật) |
| R-11 | assembler | TC-31..33 | PASS |
| R-12 | DTO + RsInoutwardDetailWebMapper |
TC-34..36 | PASS; minDate UNVERIFIED (D-07) |
| R-13 | adapter bọc lỗi | TC-37 | DEVIATION có chủ đích (D-03) |
| R-14 | — | TC-38 | DEVIATION có chủ đích (D-12) |
| R-15 | @Transactional(readOnly = true) |
TC-39 | UNVERIFIED (D-11) |
3. Người cần xem
| # | Vị trí | Vì sao cần người xem |
|---|---|---|
| 1 | …/infrastructure/relational/inventory/adapter/BatchOnHandRelationalRepository.java |
Bảng tạm #tmp_wh_filter qua JDBC thô; luôn DROP kể cả khi INSERT lỗi (cũ để sót — F-logic-3 v1, MINOR); chỉ kiểm bằng mock |
| 2 | …/infrastructure/relational/batch/adapter/BatchRelationalRepository.java |
F-logic-2 (MAJOR, UNSURE): native IN với list có null |
| 3 | File dùng chung bị chạm: BatchQueryService, BatchRepository, InventoryQueryService (constructor đổi), CompanyConfigPort + adapter, RsInoutwardQueryController (unit get-all-transactions), WarehouseTransferServiceTest |
K-28: đã chạy lại test unit trước (431 test xanh) |
| 4 | Adapter inventory/batch/config dùng RsInoutwardErrorCode của context rsinoutward (F-logic-4 v1, MINOR) |
Phụ thuộc chéo context — cân nhắc mã lỗi chung |
3b. Phân tích luồng sau chuyển
Chi tiết: verify/round-1/flow-analysis.md, verify/round-2/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 | Kiểm công ty, đọc phiếu + nguồn tiền + dòng | không đổi so với vòng 1 (KHỚP 6 / KHÁC 4 / CHỈ CÓ Ở CŨ 0 / CHỈ CÓ Ở MỚI 0) | không | Nhánh kho null khi không có dòng không chạy tới được (F-logic-1) |
| F-02 | IMEI/serial | không đổi so với vòng 1 (KHỚP 2 / KHÁC 2 / CHỈ CÓ Ở CŨ 0 / CHỈ CÓ Ở MỚI 0) | không | Thứ tự IMEI theo kết quả truy vấn $in của Mongo (D-09) |
| F-03 | Lô và tồn theo lô | KHỚP 8 / KHÁC 1 / CHỈ CÓ Ở CŨ 0 / CHỈ CÓ Ở MỚI 0 (KHÁC: lỗi tường minh khi ppu rỗng, có chủ đích theo D-04, D-03) | không | RsInoutwardBatchOnHandAssembler.java:75-79: không đổi thành bỏ qua truy vấn; RsInoutwardDetailQueryService.java:140-141: batchIds có null (F-logic-2 vòng 1 còn mở) |
3c. Nghi vấn bug / sai ở code cũ (đã GIỮ nguyên khi chuyển)
B-01 Phiếu không còn dòng hiển thị → "Lỗi hệ thống"
- Mức nghi ngờ: TRUNG BÌNH
- Ở đâu: cũ
easyposbackend1:…/service/impl/RsInoutWardManagementServiceImpl.java:705,720-724,easyposbase:…/repositories/BaseInventoryRepository.java:112-116→ mớiRsInoutwardBatchOnHandAssembler.buildBatchOnHandMap - Code cũ đang làm gì: dòng chi tiết bị loại hết (SP/ĐVT công ty khác, kho đã xoá cứng) nhưng vẫn tra tồn với danh sách rỗng → câu SQL
in ()lỗi. - Ví dụ cụ thể: phiếu NK005 có 1 dòng ở kho đã xoá → mở chi tiết → cũ 417, mới 500 "Lỗi hệ thống". Lẽ ra: trả phiếu với
detail: []. - Đã xử lý khi chuyển: GIỮ (mới ném lỗi tường minh). Test khoá:
TC-15,TC-21,TC-29. - Nếu muốn sửa: bỏ bước tra tồn khi rỗng, đổi TC-15/21/29.
- Liên quan: D-04, R-10
B-02 Kho của phiếu lấy theo dòng chi tiết cuối
- Mức nghi ngờ: THẤP
- Ở đâu: cũ
RsInoutWardManagementServiceImpl.java:680-682→ mớiRsInoutwardDetailQueryService - Ví dụ cụ thể: dòng 1 kho K1, dòng 2 kho K2 → phiếu hiện kho K2 (thứ tự dòng không cố định — D-08).
- Đã xử lý khi chuyển: GIỮ. Test khoá:
TC-14. - Liên quan: D-05, R-06
B-03 Danh sách tồn theo lô dùng chung giữa các dòng cùng SP + kho
- Mức nghi ngờ: THẤP
- Ở đâu: cũ
RsInoutWardManagementServiceImpl.java:743-753→ mớiRsInoutwardBatchOnHandAssembler.attachToLines - Ví dụ cụ thể: d1 (SP A, kho K1, lô L1, SL 5), d2 (SP A, kho K1, lô L1, SL 3) → cả hai dòng thấy
L1.quantity = 3.000000. - Đã xử lý khi chuyển: GIỮ. Test khoá:
TC-32,TC-33. - Liên quan: D-06, R-11
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 | Người cần xác nhận gì |
|---|---|---|---|---|
| 1 | F-logic-2 v1 (MAJOR, UNSURE) | Không sửa | Nếu Hibernate 6 + MSSQL lỗi khi bind null trong b.id IN (:batchIds): phiếu mọi dòng không có lô → mới 500, cũ 200 |
Chạy GM-01 với phiếu không có lô; nếu lỗi → lọc null trước khi truy vấn (kết quả không đổi) |
| 2 | auto-changes #1 | Sửa test-plan TC-15: không dòng → lỗi EXCEPTION_ERROR |
Không khác cũ (cũ lỗi in ()) |
Xác nhận |
| 3 | spec qua 1 lần review (tầng C) | Các mục sửa theo MAJOR: R-10 (minDate có giá trị, bảng tạm, over_stock), D-07, mục 5 |
— | Đọc kỹ R-10, D-07 |
| 4 | D-01 | Chỉ giữ kiểm "token có công ty" | manager không công ty → cũ RS_INOUT_WARD_ID_NOT_FOUND / mới COMPANY_NOT_EXISTS_CODE; token cũ sau đổi mật khẩu → cũ 500 / mới trả phiếu |
Đồng ý |
| 5 | D-02 | Body theo starter | id=abc → cũ 400 rỗng / mới 400 body starter |
Đồng ý |
| 6 | D-03 | 417 → 500 giữ mã | lỗi hệ thống 417 / 500 | Đồng ý |
| 7 | D-07 | Giữ truy vấn ngày khởi tạo; minDate JSON ISO UTC |
Định dạng minDate chưa chạy thử |
Xác nhận định dạng + múi giờ JVM cũ |
| 8 | D-08 | Giữ không ORDER BY | — | Xác nhận |
| 9 | D-09 | Gom truy vấn IMEI một lần | Thứ tự IMEI theo kết quả $in |
Đồng ý |
| 10 | D-10, D-11 | Giờ tường GMT+7; đọc replica | — | Xác nhận múi giờ JVM cũ; ADR-0201 nói read-by-id → primary |
| 11 | D-12, D-13 | Không kiểm gói; text theo locale starter | công ty hết hạn → cũ 400 / mới 200; Accept-Language: en → text tiếng Anh |
Chốt chung với get-all-transactions |
| 12 | F-logic-3 v1 (MINOR) | Bảng tạm luôn được xoá kể cả khi INSERT lỗi | Chỉ khác nhánh lỗi | Đồng ý (chưa có D-xx — sau bước C không sửa decisions) |
| 13 | F-logic-1 v2 (MINOR) | Không sửa | Spec R-06 "không dòng → kho null" không chạy tới được (R-10 lỗi trước) | Sửa câu chữ spec R-06 khi duyệt |
4. Finding đã xác nhận
- F-logic-1 (vòng 1, MAJOR, parity) — list ppu rỗng dựa vào DB báo lỗi. Xác minh: CONFIRMED (
verify/round-1/verification.md). Đã sửa ở fix 1 → ĐÃ HẾT ở vòng 2. - MINOR (không xác minh): F-logic-3, F-logic-4 (vòng 1), F-logic-1 (vòng 2) — xem mục 3, 3d.
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 (Analyze VCS Changed Files trong ws1) | G4 |
7. So với vòng trước
| Vấn đề | Vòng trước | Vòng này |
|---|---|---|
| F-logic-1 v1 (MAJOR) | MỚI | ĐÃ HẾT |
| F-logic-2 v1 (UNSURE) | MỚI | CÒN |
| F-logic-1 v2 (MINOR, spec R-06) | — | MỚI |
8. Thay đổi trong repo đích
44 file (verify/round-2/changed-files.md), chỉ trong src/main, src/test; không sửa pom.xml. Gồm file mới của unit và sửa file dùng chung (mục 3 #3).
9. Đề xuất bổ sung kinh nghiệm
| Đề xuất | Đưa vào đâu |
|---|---|
Khi thấy "khoá tra lệch" ở code cũ, kiểm thứ tự tham số constructor tại chỗ gọi — hai lần đảo có thể triệt tiêu (BaseBatchInitDateResult) |
lessons.md (1a) |
Native query có IN (:list): Hibernate 6 xử lý list rỗng / phần tử null khác Hibernate 5 — đừng dựa vào DB để tái tạo lỗi in () cũ, ném tường minh; lọc null nếu kết quả không đổi |
lessons.md (1b, bổ sung K-04) |
| Test-plan không nên có case "giả định nhánh không lỗi" khi spec đã chốt nhánh đó lỗi (TC-15) | lessons.md (1c) |