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ệchmigrations/rsinoutward/html-preview/report.mdvòng 1 · sha256 d5473c72167a
v1 dựng 2026-11-09 14:46 · base commit đích 661efe9b8c