Phân tích luồng sau chuyển — rsinoutward/by-id — vòng 2 (thu hẹp)
logic-reviewerviết dựa trên code đã implement (worktreeC:/Projects/warehouse-service-wt/ws1), đối chiếu với code cũ. Viết tắt:backend:=easyposbackend1:src/main/java/vn/softdreams/easypos/,base:=easyposbase:src/main/java/sds/ep/baseservice/; code mới tính từsrc/main/java/com/softdreams/easypos/warehouse/.
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: xem verify/round-1/flow-analysis.md
(Code main của F-01 không đổi. Chỉ test thêm dòng giả. Phiếu không có dòng giờ dừng ở F-03 bước 3, xem bên dưới.)
F-02 IMEI/serial — không đổi so với vòng 1: xem verify/round-1/flow-analysis.md
F-03 Lô và tồn theo lô
- Điểm vào: cũ
backend:service/impl/RsInoutWardManagementServiceImpl.java:705,713-755→ mớiapplication/rsinoutward/RsInoutwardDetailQueryService.java:85-90 - Quy tắc: R-09, R-10, R-11
Sơ đồ luồng mới (theo code thực tế)
sequenceDiagram
participant S as RsInoutwardDetailQueryService
participant B as BatchQueryService
participant A as RsInoutwardBatchOnHandAssembler
participant CP as CompanyConfigPort
participant I as InventoryQueryService → BatchOnHandRelationalRepository
S->>B: findLots → findLotsInCompany(comId, batchIds kể cả null) — không có dòng thì bỏ qua
S->>A: buildBatchOnHandMap(comId, ppuIds)
A->>CP: checkOverStock → findOverStockRawValue, parseInt (lỗi → EXCEPTION_ERROR)
A->>I: findWarehouseOnHands(comId, ppuIds) — rỗng vẫn chạy; lỗi SQL → EXCEPTION_ERROR
alt ppuIds rỗng
A-->>S: SystemException EXCEPTION_ERROR (D-04)
end
A->>B: findLotsByIds(batchId khác null) — nhóm 1000, không lọc công ty
A->>I: findBatchInitMinDates — N2 → #tmp_wh_filter → MIN(ri.date)
A->>A: item theo khoá ppu-kho (onHand != null, lô có), sortItems
S->>A: attachToLines(itemsByKey, rows) — quantity gán vào list dùng chung
S->>S: LineLookups.lotOf ghi đè lotNo/expDate/mfgDate
Đối chiếu từng bước
| # | Luồng cũ | Luồng mới | Kết luận |
|---|---|---|---|
| 1 | createBatchMap backend:service/impl/BillManagementServiceImpl.java:11921-11930 (rỗng → bỏ qua; JPQL) |
findLots RsInoutwardDetailQueryService.java:135-145 (native IN) |
KHỚP khi rỗng; danh sách có null: F-logic-2 vòng 1 (UNSURE, report 3d) |
| 2 | over_stock parseInt không trim base:services/impl/BaseInventoryServiceImpl.java:1101-1105 |
checkOverStock RsInoutwardBatchOnHandAssembler.java:148-158 |
KHỚP |
| 3 | getWarehouseOnHand(comId, ppuIds) BaseInventoryServiceImpl.java:1107; rỗng → in () lỗi → 417 |
findWarehouseOnHands RsInoutwardBatchOnHandAssembler.java:75; rỗng → ném EXCEPTION_ERROR tường minh :76-79 (sau truy vấn) |
KHÁC có chủ đích (D-04 GIỮ, D-03 417→500). Sửa F-logic-1 vòng 1 |
| 4 | createBatchMapOptimal nhóm 1000 :1112 |
loadLots :160-169 |
KHỚP |
| 5 | createBatchMinDateMap :1161-1177, khoá đảo hai lần → ppu-batch-warehouse |
loadMinDates :171-185, minDateKey(ppu, batch, warehouse) |
KHỚP (D-07) |
| 6 | Item khi onHand != null và batchesMap.containsKey, không loại tồn ≤ 0 :1115-1155 |
:89-97 |
KHỚP |
| 7 | sortBatchOnHand :1179-1200 |
sortItems :188-207 |
KHỚP |
| 8 | Map batchId-detailId → getQuantity(), list dùng chung RsInoutWardManagementServiceImpl.java:727-753 |
attachToLines :110-132, assignQuantities :134-145 |
KHỚP (D-06) |
| 9 | Lô tìm thấy ghi đè lotNo/expDate/mfgDate :735-741 |
LineLookups.lotOf RsInoutwardDetailQueryService.java:168-174 |
KHỚP |
Dữ liệu và side effect
| Bảng / topic / cache | Cũ | Mới | Ghi chú |
|---|---|---|---|
config |
đọc over_stock |
như cũ | đọc cả khi không có dòng, như cũ |
inventory LEFT JOIN batches_detail |
đọc, com_id, ppu_id IN; rỗng → lỗi |
đọc, rỗng vẫn chạy rồi ném lỗi | D-04 |
batches |
com_id + id IN (dòng); id IN không lọc công ty (tồn) |
như cũ | |
business_type, rs_inoutward(_detail), #tmp_wh_filter |
đọc, bảng tạm | như cũ; không chạy khi ppuIds rỗng | F-logic-3 vòng 1 (nhánh lỗi) |
| Ghi | không | không |
Transaction, khoá, idempotency, tenant
- Ranh giới transaction: cũ
readOnly+@ReadQuery→ mớireadOnlyởgetOneById. Lỗi D-04 ném ra trong transaction chỉ đọc nên không có gì phải rollback. - Khoá / cập nhật nguyên tử: không có.
- Idempotency, event: không có.
- Lọc
comId:inventory,config,business_type,rs_inoutwardlọc theo công ty. Khi nạp tồn theo lô,batcheskhông lọc công ty, giống code cũ.
Lệch so với luồng mới đã duyệt (spec mục 6)
Không.
Dev cần chú ý khi review
| Vị trí | Vì sao |
|---|---|
RsInoutwardBatchOnHandAssembler.java:75-79 |
Vẫn chạy truy vấn tồn với danh sách rỗng rồi mới ném lỗi (D-04). Đừng đổi thành bỏ qua truy vấn hoặc trả rỗng: làm vậy là đổi hành vi giữ theo D-04 |
RsInoutwardDetailQueryService.java:113-115 |
Nhánh HeaderWarehouse.NONE không chạy tới được, vì hết dòng thì luôn lỗi ở assembler (F-logic-1 vòng 2, spec R-06) |
RsInoutwardDetailQueryService.java:140-141 |
batchIds có null bind vào native IN. F-logic-2 vòng 1 (UNSURE) vẫn còn mở |