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

batch · batch/batches · api

GET/api/client/page/inventory-checking/batches

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/batches — 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 → người cần đọc: spec + báo cáo
  • Số quy tắc: 7 · PASS 3 · DEVIATION có chủ đích 3 (R-01 D-02/D-09, R-06 D-02, R-07 D-03/D-08) · DEVIATION KHÔNG chủ đích 0 · UNVERIFIED 1 (R-05 chuỗi ngày D-06, nguồn đọc D-07)
  • Coverage thấp nhất: F-01 ≥ 90%
  • Finding logic: vòng 1 CRITICAL 1 (đã sửa); vòng 2: 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): 8
  • 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 (699 test)
G2 Test khớp test-plan ✅ verify/round-2/tc-map.md (15/15), 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, 0)
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)

2. Ma trận truy vết

Quy tắc Tầng Code mới Test Golden Kết luận
R-01 C InventoryCheckingBatchController TC-01, 02 — DEVIATION có chủ đích (D-02, D-09)
R-02 C InventoryCheckBatchService, BatchPermission, JwtAuthorityClaimReader TC-03..06 (+EXTRA) GM-01 PASS (giữ D-04; D-10)
R-03 C BatchQueryService.findInventoryCheckBatches, WarehouseRelationalRepository.existsActive TC-07, 08 — PASS (giữ D-01)
R-04 C InventoryCheckBatchReader TC-09, 10 GM-01 PASS (giữ D-05); SQL mock
R-05 C reader, BatchWebMapper.toUtcDateTime TC-11, 12 GM-01 UNVERIFIED (D-06)
R-06 C controller TC-13 — DEVIATION có chủ đích (D-02)
R-07 C @Transactional(readOnly), reader TC-14, 15 — DEVIATION có chủ đích (D-03, D-08); UNVERIFIED nguồn đọc (D-07)

3. Người cần xem

# Vị trí Vì sao cần người xem
1 infrastructure/security/JwtAuthorityClaimReader.java Lệch thiết kế mục 5 (đã ghi 3d #1): đọc auth từ payload JWT header (không kiểm chữ ký — dựa vào jwt_verify của starter và path không public); gọi ngoài thread request → rỗng → 500
2 BatchQueryService.findInventoryCheckBatches Không đối chiếu comId với token (B-01, CAO)
3 Sửa file ngoài batch: WarehouseRelationalRepository (constructor thêm EntityManager), WarehouseQueryService, CurrentUserPort/Adapter, BatchQueryService (constructor thêm WarehouseQueryService) Đã chạy lại test liên quan
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

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 Lô có tồn của ĐVT trong kho cho kiểm kê KHỚP 8 / KHÁC 4 (đều có D-xx: D-08, D-02+D-09, D-02, D-03) / CHỈ CÓ Ở CŨ 0 / CHỈ CÓ Ở MỚI 0 không JwtAuthorityClaimReader không tự kiểm chữ ký: chỉ an toàn khi giữ jwt_verify và path không public; nó cần RequestContextHolder, gọi ngoài thread request thì ra 500; ngày Instant còn UNVERIFIED (D-06)

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

B-01 Xem được tồn theo lô của công ty khác

  • Mức nghi ngờ: CAO
  • Ở đâu: code cũ backend:service/impl/InventoryCheckingManagementServiceImpl.java:173-186 → code mới BatchQueryService.findInventoryCheckBatches
  • Code cũ đang làm gì: chỉ kiểm user có quyền kiểm kê (bất kỳ công ty nào) và kho thuộc comId gửi lên; không so comId với công ty đang đăng nhập.
  • Ví dụ cụ thể: nhân viên công ty 20 có quyền 3401 gọi ?comId=10&warehouseId=1&ppuId=55 → nhận danh sách lô và tồn của công ty 10.
  • Vì sao nghi là sai: lộ dữ liệu tồn kho giữa các khách hàng.
  • Ảnh hưởng nếu đúng là bug: đọc chéo dữ liệu.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-08 (a) (BatchQueryServiceTest$InventoryCheckBatches#companyFromParameter).
  • Nếu muốn sửa: gọi CurrentCompanyService.requireCompanyOfCurrentUser(comId) ở InventoryCheckBatchService.getBatches; đổi TC-08.
  • Liên quan: D-01, R-03

B-02 Claim quyền có mã trùng làm lỗi hệ thống

  • Mức nghi ngờ: THẤP
  • Ở đâu: backend:aop/CheckAuthorizeAspect.java (Set.of(authStr.split(","))) → BatchPermission
  • Code cũ đang làm gì: tập quyền dựng bằng Set.of, gặp phần tử trùng thì ném lỗi.
  • Ví dụ cụ thể: token có auth=",,3401" hoặc "3401,3401" → lỗi hệ thống dù có quyền.
  • Vì sao nghi là sai: dữ liệu quyền hợp lệ nhưng bị chặn.
  • Ảnh hưởng nếu đúng là bug: phụ thuộc cách phát token; hiếm.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-06 (InventoryCheckBatchServiceTest#duplicatedAuthorities).
  • Nếu muốn sửa: dùng new HashSet<>(Arrays.asList(...)); đổi TC-06.
  • Liên quan: D-04, R-02

B-03 Từ khoá không bỏ dấu, không escape

  • Mức nghi ngờ: THẤP
  • Ở đâu: base:repositories/impl/BaseInventoryCheckingQueryRepositoryImpl.java:142-151,176-178 → InventoryCheckBatchReader
  • Code cũ đang làm gì: chỉ trim + chữ thường, LIKE %k%.
  • Ví dụ cụ thể: keyword="a_1" khớp "ab1"; "lô" khớp "LO01" tuỳ collation.
  • Vì sao nghi là sai: khác các màn tìm lô khác.
  • Ảnh hưởng nếu đúng là bug: kết quả tìm rộng/hẹp hơn mong đợi.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-10.
  • Nếu muốn sửa: chuẩn hoá như BatchNormalizedName, escape ký tự đại diện; đổi TC-10.
  • Liên quan: D-05, R-04

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 F-logic-1 vòng 1 (CRITICAL, đã sửa) — lệch spec mục 5 Đọc auth nguyên văn từ payload JWT header Authorization (JwtAuthorityClaimReader) thay vì BaseUserDTO.getClaim("auth") (starter bỏ claim này) không khác kết quả; cũ còn nhận header Authorization-Gateway (bị chặn ở tầng xác thực mới) Chấp nhận đọc payload không kiểm lại chữ ký (dựa vào jwt_verify); hoặc yêu cầu starter giữ auth thô
2 spec-review Spec qua 1 lần review (tầng C), sửa theo MAJOR: D-06 (định dạng +00:00) — Đọc R-05, D-06
3 D-02 (ADR BẮT KHÁC) Body theo starter thiếu ppuId → cũ 400 rỗng / mới 400 starter Chấp nhận
4 D-03 (ADR BẮT KHÁC) 417 → 500 giữ mã thiếu claim auth → cũ 417 / mới 500 Chấp nhận
5 D-06 (MƠ HỒ) Ngày in ISO UTC +00:00 từ instant UNVERIFIED Chạy GM-01 so chuỗi ngày
6 D-07 (MƠ HỒ) readOnly = true (replica) UNVERIFIED Chạy thử
7 D-08 / D-09 / D-10 Không kiểm gói; ppuId bind qua record; 401 không thêm text hết hạn dùng thử → cũ 400 / mới trả; ppuId=abc → mã lỗi 400 có thể khác; text 401 do starter Chấp nhận
8 Thay đổi ngoài context batch WarehouseRelationalRepository thêm EntityManager, CurrentUserPort.findAuthorityClaim — Xem diff

4. Finding đã xác nhận

  • Vòng 1 F-logic-1 (CRITICAL, parity, R-02): CONFIRMED (verify/round-1/verification.md) → ĐÃ SỬA ở fix 1.

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 (CRITICAL) claim auth luôn rỗng MỚI ĐÃ HẾT

8. Thay đổi trong repo đích

28 file (verify/round-2/changed-files.md): mới controller/DTO/service/reader/permission/JWT reader + 3 test mới; sửa BatchWebMapper, BatchQueryService, BatchRepository, BatchRelationalRepository, BatchErrorCode, WarehouseQueryService, WarehouseRepository, WarehouseRelationalRepository, CurrentUserPort, CurrentUserAdapter, i18n, 4 file test sẵn có.

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

Đề xuất Đưa vào đâu
Starter BaseUserDTO.fromClaims bỏ claim auth (và các khoá dành riêng) khỏi getClaims(); chỉ có getUserAuthorities() đã trim/gộp. Kiểm quyền cần chuỗi gốc thì đọc payload JWT. Test phải dựng principal qua fromClaims hoặc header thật, không getClaims().put target-cheatsheet.md mục 3; lessons.md 1b/1c
@CheckAuthorize (monolith) = AOP kiểm auth chứa một trong các mã — ghi thành LF để unit sau dùng legacy-facts.md

Nguồn của trang này

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

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