Files
solution-erp/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k4c.md
2026-08-01 10:54:57 +07:00

6.6 KiB
Raw Blame History

IMPLFE-K4C: DONE

Lane FE K4c — WfView lọc theo nhóm (S166, 2026-08-01) — chốt cụm-2

Nền: K5 commit ce35f90. SPEC PIN: spec-cụm2 vá K4c-10 (phần WfView) + gate-K4b MAJOR-C (FLAG-3 lượt K4b của tôi: ?group= trên workflow-matrix chưa có consumer). Phạm vi: fe-user ONLY — fe-admin không có WorkflowMatrixViewPage (lead chốt 2026-07-27 giữ lệch; K4a đã comment tại isAdminHidden).

§0 Kế hoạch đo trước khi gõ

  • Đọc WorkflowMatrixViewPage.tsx: nguồn data, tên field code THẬT của DTO workflow, cách đọc ?type=
  • Xác nhận fetch toàn bộ hay fetch-theo-param (quyết queryKey có cần trục group không)
  • Đối chiếu khkkGroupWorkflowCode(n) (K4a) với code seed BE thật

§1 ĐO ĐĨA (ground truth) — TRƯỚC khi gõ

1.1 Tên field DTO — ĐỌC, không đoán

types/approvalWorkflowV2.ts:39-52 AwDefinitionDtocode: string (:41) — đúng tên đề bài dặn phải kiểm. Trang đang render nó ở :165 ({wf.code} v{version}). ⇒ wf.code === khkkGroupWorkflowCode(n) khớp field thật.

1.2 Nguồn dữ liệu ⇒ quyết định queryKey (mục 2 đề bài)

:59-67 useQuery({ queryKey: ['workflow-matrix', typeInt], … api.get('/approval-workflows-v2', { params: { applicableType: typeInt, isUserSelectable: true } }) }), rồi :70-71 summary?.history ?? []. ⇒ Trang tải TRỌN bộ quy trình của type, nhóm chỉ là lát cắt của chính payload đó ⇒ lọc CLIENT-side, KHÔNG thêm trục group vào queryKey. Thêm vào sẽ đẻ 8 lần gọi mạng cho cùng một payload + 8 ô cache trùng nội dung. Khai rõ theo đúng yêu cầu mục 2.

1.3 Đối chiếu helper K4a ↔ seed BE thật

DbInitializer.cs:609 var code = $"KHKK-N{n}" · :623 IsUserSelectable = true ⇒ 8 workflow nhóm THỰC SỰ lọt qua bộ lọc isUserSelectable: true của trang (nếu seed để false thì lọc kiểu gì cũng ra trang trắng — đo trước, không giả định). Helper khkkGroupWorkflowCode (types K4a) sinh đúng khuôn đó; cùng chuỗi BE dùng gác phiếu-pin-đúng-nhóm (ContractSigningPlanFeatures.cs:420 regex ^KHKK-N([1-8])$).

1.4 PageHeader (bản @/components/PageHeader)

Props = { title: ReactNode; description?: ReactNode; actions?: ReactNode }actions ⇒ đặt đường "Xem tất cả nhóm" ở đó, không phải chế thêm thanh công cụ. (Ghi để khỏi lặp bài S37: repo có ≥2 bản PageHeader khác chữ ký, phải đọc bản đang import.)

1.5 Trang gắn 3 route

/purchase-evaluations/workflow-matrix · /contracts/workflow-matrix · /khkk/workflow-matrix (App.tsx :71/:73/:83) ⇒ link "xem tất cả" phải bám useLocation().pathname, hardcode 1 đường là gãy 2 đường kia.

§2 THỰC THI — 1 file, fe-user ONLY (+68 / 5)

fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx:

  1. rawGroup = searchParams.get('group'); khkkGroup = typeInt === 10 && /^[1-8]$/.test(rawGroup) ? Number : null. Chốt chặn kép: sai type HOẶC group rác ⇒ null ⇒ 0 đổi hành vi.
  2. allWorkflows (đổi tên từ workflows) → workflows = lọc wf.code === khkkGroupWorkflowCode(khkkGroup) khi có nhóm. Nhiều VERSION cùng code thì giữ đủ (đúng nghĩa "quy trình của nhóm n", không phải "1 bản ghi").
  3. Header: badge tím Nhóm N{n} cạnh tiêu đề + description mở đầu bằng khkkGroupMenuLabel(n) ⇒ 8 leaf không còn mở ra 8 trang trông hệt nhau.
  4. actions: <Link to={${pathname}?type=${typeInt}}>Xem tất cả nhóm</Link> — bỏ group, giữ đường dẫn đang đứng.
  5. Trạng thái rỗng tách 2 nghĩa (bài "sai-thầm-lặng → thiếu-nhìn-thấy-được"): rỗng-vì-lọc in "…cho nhóm N{n} (loại phiếu này có {N} quy trình ở nhóm khác)"; rỗng-thật giữ nguyên câu cũ. Dùng chung 1 câu thì người dùng nhóm N5 tưởng cả module chưa cấu hình trong khi 7 nhóm kia đang chạy.

§3 CHỨNG

A. Acceptance 8 URL + các ca bỏ qua — chạy CHÍNH 2 khối đã ship (const rawGroup…const workflows =… cắt từ file bằng indexOf) + helper cắt từ types/khkk.ts (chỉ bỏ annotation n: number, có assert khuôn trước khi thế); dữ liệu thử là 8 code sinh theo khuôn đọc thẳng DbInitializer.cs. 21/21 OK:

A  ?type=10&group=1..8   → mỗi URL ĐÚNG 1 wf, code KHKK-N1..N8 khớp từng số
B  ?type=10 trần         → hiện CẢ 8
   group=0 · 9 · abc · rỗng · "03"  → KHÔNG lọc (hiện 8)   ← "03" là ca dễ lọt nếu dùng Number()
   type=1|2|3 kèm group=5           → BỎ QUA, 0 đổi hành vi
C  2 version cùng code KHKK-N3      → giữ đủ 2
D  CONTROL-ÂM ① gỡ vị-ngữ lọc (`=== code` → `true`) ⇒ ra 8 wf  (phép đo PHÂN BIỆT được)
   CONTROL-ÂM ② helper sai khuôn (`KHKK_N3`) ⇒ 0 wf, KHÔNG âm thầm khớp

B. Buildnpx tsc -b exit 0; npm run build fe-user PASS: 1950 modules, dist/assets/index-DBtbmn5s.js 1,643.96 kB (gzip 415.22) · index-CHYZ6n3Q.css 92.71 kB · 531ms. Warning >500KB + INEFFECTIVE_DYNAMIC_IMPORT = PRE-EXISTING.

C. Ràogit diff --stat: đúng 1 file fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx (68+/5). git diff --stat -- fe-admin = RỖNG (0-diff) đúng lệnh fe-user-ONLY. 0 BE, 0 file khác, 0 commit.

§4 FLAG cho lead

FLAG-1 (MINOR — đóng lại FLAG-3 của K4b): gate-K4b MAJOR-C xử lý xong, ?group= trên workflow-matrix nay có consumer. Còn lại 1 lệch cố ý đã khai từ K4a: leaf Khkk_WfView của nhóm 1 phía fe-admin trỏ Designer (/system/approval-workflows-v2/ContractSigningPlan) chứ không phải matrix ⇒ admin không có đường xem-luồng-theo-nhóm. Đúng chủ trương "fe-admin không có WorkflowMatrixViewPage" (lead chốt 2026-07-27), nêu lại để cụm-2 đóng sổ mà không ai tưởng là sót.

FLAG-2 (MINOR — quan sát, chưa cần làm): trang lọc theo code, nên nếu Admin đổi Code của một workflow nhóm trong Designer (ví dụ KHKK-N5KHKK-N05) thì leaf nhóm đó ra trang rỗng — có báo rõ nhờ câu rỗng-vì-lọc mới, không im lặng. Rào cứng đã nằm ở BE (Features.cs:420 cũng khớp ^KHKK-N([1-8])$ nên phiếu sẽ không pin được vào workflow đổi mã). Nếu muốn chặt hơn thì khoá sửa Code cho 8 workflow nhóm ở Designer — lane admin, không phải lượt này.

IMPLFE-K4C-END