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

rsinoutward · rsinoutward/html-preview · api

GET/api/page/rs-inoutward/html-preview/{id}

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

Báo cáo sai lệch — rsinoutward/html-preview — vòng 1

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: 14 · PASS 9 · DEVIATION có chủ đích 4 (R-01, R-02, R-03, R-14) · DEVIATION KHÔNG chủ đích 0 · UNVERIFIED 2 (R-05 đọc content trên MSSQL thật; R-14 replica)
  • Coverage thấp nhất: F-03 100% dòng / 92,2% nhánh
  • Finding logic: 0
  • 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): 10
  • Chạy bằng: /mig-auto (spec do spec-reviewer kiểm 1 lần — tầng C) · Số vòng: 1 / lần sửa 0/3

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 (747 test)
G2 Test khớp test-plan ✅ verify/round-1/tc-map.md (35/35), oracle.md
G3 Coverage ✅ verify/round-1/coverage.md
G4 Sonar CHỜ NGƯỜI sonar-ide.md
G5 0 CRITICAL/MAJOR ✅ verify/round-1/review-logic.md (0 finding) — không cần xác minh
G6 Không lách cổng ✅ verify/round-1/gates.md (36 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#getHtmlPreview TC-01, TC-02 DEVIATION có chủ đích (D-02)
R-02 controller bọc lỗi TC-03..05 DEVIATION có chủ đích (D-03: 417 → 500, giữ mã)
R-03 service, UserProfileRelationalAdapter TC-06, TC-07 DEVIATION có chủ đích (D-01, D-05)
R-04 service + RsInoutwardDetailRepository TC-08 PASS
R-05 PrintTemplateRelationalAdapter TC-09, TC-10 UNVERIFIED (content thật trên MSSQL)
R-06 PrintSeparatorParser, CompanyConfigRelationalAdapter TC-11, TC-12 PASS
R-07 RsInoutwardPrintDataBuilder TC-13..16 PASS
R-08 builder, VietnameseNumberWords TC-17..21 PASS
R-09 PrintTemplateRenderer, LegacyNumberFormat TC-22..26 PASS
R-10 PrintTableLookup TC-27, TC-28 PASS
R-11 PrintTableRenderer TC-29..32 PASS
R-12 renderer TC-33 PASS
R-13 DTO response TC-34 PASS
R-14 @Transactional(readOnly = true) TC-35 UNVERIFIED (D-09, D-10)

3. Người cần xem

# Vị trí Vì sao cần người xem
1 …/infrastructure/relational/printtemplate/adapter/PrintTemplateRelationalAdapter.java:52-60 Đọc content qua native query + toString() — nếu driver trả Clob sẽ sai; cần chạy MSSQL thật
2 …/infrastructure/relational/user/adapter/UserProfileRelationalAdapter.java Đọc ep_user.full_name theo id user trong token (D-05) — bảng của hệ thống khác
3 …/domain/rsinoutward/model/PrintTemplateRenderer.java, PrintTableRenderer.java Cố ý giữ replaceAll không quote giá trị (D-08) — không "sửa" khi refactor/Sonar
4 LegacyNumberFormat dùng Locale.ROOT Xác nhận bằng golden master
5 File unit trước bị chạm: RsInoutwardQueryController (constructor 5 tham số, bọc RuntimeException), RsInoutwardQueryControllerTest, RsInoutwardErrorCode, i18n, CompanyConfigPort + CompanyConfigRelationalAdapter (tách findRawValues dùng chung với over_stock của by-id) K-28: test unit trước đã chạy lại, xanh

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 Kiểm, đọc phiếu, mẫu, separator, trả kết quả KHỚP 6 / KHÁC 5 (tất cả có chủ đích: D-01, D-03/D-04, D-05, D-09/D-10, D-02/D-11) / CHỈ CÓ Ở CŨ 0 / CHỈ CÓ Ở MỚI 0 không PrintTemplateRelationalAdapter.java:52-60 đọc content bằng native query rồi toString(), chưa chạy trên MSSQL thật (K-13); CompanyConfigRelationalAdapter tách findRawValues dùng chung với over_stock của unit trước, cần chạy lại test của unit đó
F-02 Dựng dữ liệu in KHỚP 9 / KHÁC 1 (D-10: ngày phiếu LocalDateTime đổi sang múi Asia/Ho_Chi_Minh) / CHỈ CÓ Ở CŨ 0 / CHỈ CÓ Ở MỚI 0 không RsInoutwardPrintDataBuilder.java:190-201: thứ tự scale, số âm về 0, VAT, tổng dòng; :222-228 chỉ bắt IndexOutOfBoundsException
F-03 Thay biến mẫu KHỚP 10 / KHÁC 0 / CHỈ CÓ Ở CŨ 0 / CHỈ CÓ Ở MỚI 0 không Cố ý giữ replaceAll không quote giá trị (D-08), refactor sau không được "sửa"; LegacyNumberFormat dùng Locale.ROOT thay locale mặc định JVM, nên xác nhận bằng golden master

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

B-01 Ghi chú/tên có ký tự $ làm xem trước bản in báo "Lỗi hệ thống"

  • Mức nghi ngờ: TRUNG BÌNH — dữ liệu gõ tự do, dễ gặp.
  • Ở đâu: cũ easyposbackend1:…/service/impl/RsInoutWardManagementServiceImpl.java:8011,8087 → mới PrintTemplateRenderer, PrintTableRenderer
  • Code cũ đang làm gì: thay biến bằng replaceAll, coi $ và \ trong giá trị là ký hiệu đặc biệt.
  • Ví dụ cụ thể: ghi chú phiếu "Giá $5" → xem trước bản in → cũ 417, mới 500 "Lỗi hệ thống"; "Giá $0" in thành "Giá {Mo_ta}"; tên KH "A\B" in "AB". Lẽ ra: in nguyên văn.
  • Ảnh hưởng nếu đúng là bug: không xem/in được phiếu có ký tự $ trong dữ liệu.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-25.
  • Nếu muốn sửa: dùng Matcher.quoteReplacement(value) ở 2 chỗ thay; đổi TC-25.
  • Liên quan: D-08, R-09, R-11

B-02 Mã lỗi cụ thể bị che bởi "Lỗi hệ thống"

  • Mức nghi ngờ: THẤP
  • Ở đâu: cũ easyposbackend1:…/web/rest/RsInoutWardManagementResource.java:146-152 → mới RsInoutwardQueryController
  • Ví dụ cụ thể: công ty chưa chọn mẫu in phiếu kho → "Lỗi hệ thống" thay vì "Không tìm thấy mẫu in".
  • Đã xử lý khi chuyển: GIỮ (500 EXCEPTION_ERROR). Test khoá: TC-03, TC-04, TC-05.
  • Liên quan: D-04, R-02

B-03 Phiếu chuyển kho in tiêu đề "PHIẾU XUẤT KHO", không có đối tác

  • Mức nghi ngờ: THẤP
  • Ở đâu: cũ RsInoutWardManagementServiceImpl.java:7781,7830-7843 → mới RsInoutwardPrintDataBuilder
  • Ví dụ cụ thể: phiếu chuyển kho CK001 → tiêu đề "PHIẾU XUẤT KHO", tên/địa chỉ/MST đối tác trống.
  • Đã xử lý khi chuyển: GIỮ. Test khoá: TC-16.
  • Liên quan: D-06, 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ũ Người cần xác nhận gì
1 auto-changes #1 Sửa test-plan TC-22: 5 → 4 dấu | (lỗi gõ) Không khác cũ Xác nhận (không phải trường hợp "spec sai" của §10)
2 spec qua 1 lần review (tầng C) Các mục sửa theo MAJOR: R-07, R-10, R-11, mục 5 (bọc lỗi ở controller), D-06 — Đọc kỹ R-10, R-11
3 D-01 Chỉ giữ kiểm "token có công ty" token cũ sau đổi mật khẩu → cũ 417 / mới trả HTML Đồng ý
4 D-02 Body theo starter id=abc → body 400 khác Đồng ý
5 D-03 417 → 500, giữ EXCEPTION_ERROR cho mọi lỗi HTTP status Đồng ý
6 D-05 {Ten_nhan_vien} đọc ep_user.full_name theo id trong token user không hoạt động → cũ 417 / mới in tên Đồng ý
7 D-07 Giữ TOP 1 không ORDER BY — Xác nhận
8 D-09, D-10 Không kiểm gói; replica; giờ tường GMT+7 công ty hết hạn → cũ 400 / mới 200 Chốt chung
9 D-11 Text theo locale starter Accept-Language: en → text tiếng Anh Chốt chung với get-all-transactions (CHƯA QUYẾT)
10 impl giả định Số bằng chữ chỉ bắt IndexOutOfBoundsException (cũ Throwable); ObjectMapper separator riêng (FAIL_ON_UNKNOWN_PROPERTIES=false) reviewer đã đối chiếu: không khác quan sát được Xác nhận

4. Finding đã xác nhận

Không có.

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òng đầu.

8. Thay đổi trong repo đích

36 file (verify/round-1/changed-files.md), chỉ trong src/main, src/test; không sửa pom.xml.

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

Đề xuất Đưa vào đâu
Controller cũ bọc catch (Exception) → RuntimeException biến mọi lỗi nghiệp vụ thành 417 EXCEPTION_ERROR — lần controller trước khi chép mã lỗi của service; bọc ở controller mới (ngoài proxy @Transactional) legacy-facts.md / lessons.md (1a)
Code cũ dùng replaceAll với giá trị dữ liệu → $/\ là hành vi; giữ nguyên và ghi chú chống "sửa" khi xử lý Sonar lessons.md (1b)
Reflection getDeclaredField trên DTO cũ → thay bằng map tên thuộc tính cố định, kiểm đủ field và không có getter dư lessons.md (1b)

Nguồn của trang này

  • Báo cáo sai lệch migrations/rsinoutward/html-preview/report.md vòng 1 · sha256 d5473c72167a

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