[CLAUDE] PurchaseEvaluation: rename 71 WorkItems theo format PMH anh Kiet FDC chot (MAT-n/SUB-n/MEP-SUB-n/MEP-EQU-n + ten "STT nhom ten") + FE sort numeric
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 4m33s

- anh Kiet 16:59: "MA CV gom chu MEP-SUB-1 roi ten 1 MEP Sub MEP (Full) - dung kieu vay".
- DbInitializer seed tuples 71 ma moi (VT->MAT, TP->SUB, MEP-0n->MEP-SUB-n, TB->MEP-EQU-n).
- scripts/s59-rename-workitems-pmh.sql DA CHAY prod + LocalDB Dev TRUOC push (UPDATE giu Id,
  71/71, OLD-CODES=0, verify JSON qua API prod tieng Viet nguyen ven).
- FE x2 app (SHA256 mirror): PeWorkspaceCreateView + PeHeaderForm sort numeric-aware
  (ma khong pad -> string-sort loan "10"<"2") + tree Panel 1 workItemName numeric:true.
- scripts/master-import-data.generated.md sync 71 dong W| + note mapping.
This commit is contained in:
pqhuy1987
2026-06-11 17:14:06 +07:00
parent bbd1554f74
commit c869d2617d
9 changed files with 286 additions and 148 deletions

View File

@ -59,10 +59,14 @@ export function PeHeaderForm({
})
// S57bis — list Hạng mục công việc (active only, mirror PeWorkspaceCreateView).
// S59 — sort numeric-aware client (mã PMH không pad số — mirror CreateView).
const workItems = useQuery({
queryKey: ['catalogs', 'work-items'],
queryFn: async () => (await api.get<WorkItemOption[]>('/catalogs/work-items')).data,
select: rows => rows.filter(r => r.isActive !== false),
select: rows => rows
.filter(r => r.isActive !== false)
.sort((a, b) => (a.category ?? '').localeCompare(b.category ?? '', 'vi')
|| a.code.localeCompare(b.code, 'vi', { numeric: true })),
})
const [form, setForm] = useState({

View File

@ -87,10 +87,15 @@ export function PeWorkspaceCreateView({
})
// S57bis — list Hạng mục công việc (active only — filter client nếu BE trả isActive).
// S59 — sort numeric-aware client: mã PMH không pad số (MAT-1..16, MEP-SUB-1…)
// → BE OrderBy(Code) string xếp "MAT-10" trước "MAT-2"; re-sort {numeric:true}.
const workItems = useQuery({
queryKey: ['catalogs', 'work-items'],
queryFn: async () => (await api.get<WorkItemOption[]>('/catalogs/work-items')).data,
select: rows => rows.filter(r => r.isActive !== false),
select: rows => rows
.filter(r => r.isActive !== false)
.sort((a, b) => (a.category ?? '').localeCompare(b.category ?? '', 'vi')
|| a.code.localeCompare(b.code, 'vi', { numeric: true })),
})
// Mig 23 — fetch list quy trình duyệt V2 (filter ApplicableType khớp defaultType).

View File

@ -170,7 +170,8 @@ export function PurchaseEvaluationsListPage() {
for (const yg of arr) {
yg.projects.sort((a, b) => a.projectName.localeCompare(b.projectName, 'vi'))
for (const pg of yg.projects) {
pg.workItems.sort((a, b) => a.workItemName.localeCompare(b.workItemName, 'vi'))
// S59 — numeric:true vì tên PMH bắt đầu bằng STT không pad ("2 Mat…" < "10 Mat…")
pg.workItems.sort((a, b) => a.workItemName.localeCompare(b.workItemName, 'vi', { numeric: true }))
for (const wg of pg.workItems) {
wg.items.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
}

View File

@ -59,10 +59,14 @@ export function PeHeaderForm({
})
// S57bis — list Hạng mục công việc (active only, mirror PeWorkspaceCreateView).
// S59 — sort numeric-aware client (mã PMH không pad số — mirror CreateView).
const workItems = useQuery({
queryKey: ['catalogs', 'work-items'],
queryFn: async () => (await api.get<WorkItemOption[]>('/catalogs/work-items')).data,
select: rows => rows.filter(r => r.isActive !== false),
select: rows => rows
.filter(r => r.isActive !== false)
.sort((a, b) => (a.category ?? '').localeCompare(b.category ?? '', 'vi')
|| a.code.localeCompare(b.code, 'vi', { numeric: true })),
})
const [form, setForm] = useState({

View File

@ -87,10 +87,15 @@ export function PeWorkspaceCreateView({
})
// S57bis — list Hạng mục công việc (active only — filter client nếu BE trả isActive).
// S59 — sort numeric-aware client: mã PMH không pad số (MAT-1..16, MEP-SUB-1…)
// → BE OrderBy(Code) string xếp "MAT-10" trước "MAT-2"; re-sort {numeric:true}.
const workItems = useQuery({
queryKey: ['catalogs', 'work-items'],
queryFn: async () => (await api.get<WorkItemOption[]>('/catalogs/work-items')).data,
select: rows => rows.filter(r => r.isActive !== false),
select: rows => rows
.filter(r => r.isActive !== false)
.sort((a, b) => (a.category ?? '').localeCompare(b.category ?? '', 'vi')
|| a.code.localeCompare(b.code, 'vi', { numeric: true })),
})
// Mig 23 — fetch list quy trình duyệt V2 (filter ApplicableType khớp defaultType).

View File

@ -170,7 +170,8 @@ export function PurchaseEvaluationsListPage() {
for (const yg of arr) {
yg.projects.sort((a, b) => a.projectName.localeCompare(b.projectName, 'vi'))
for (const pg of yg.projects) {
pg.workItems.sort((a, b) => a.workItemName.localeCompare(b.workItemName, 'vi'))
// S59 — numeric:true vì tên PMH bắt đầu bằng STT không pad ("2 Mat…" < "10 Mat…")
pg.workItems.sort((a, b) => a.workItemName.localeCompare(b.workItemName, 'vi', { numeric: true }))
for (const wg of pg.workItems) {
wg.items.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
}

View File

@ -67,77 +67,81 @@ P|ZOTE01|2025|Zotefoams new manufacturing plant|Building and building service|Zo
# PROJECTS_TOTAL=62
## WORKITEMS | Code | Category | Name
W|VT-01|Vật tư - Xây dựng|Bê tông
W|VT-02|Vật tư - Xây dựng|Thép cây, Thép lưới hàn
W|VT-03|Vật tư - Xây dựng|Cọc ly tâm
W|VT-04|Vật tư - Xây dựng|Cống ly tâm
W|VT-05|Vật tư - Xây dựng|Cừ tràm
W|VT-06|Vật tư - Xây dựng|Kim loại ( rọ đầu cọc, V mạ kẽm, Vinox, bản mã…)
W|VT-07|Vật tư - Xây dựng|Nắp gang
W|VT-08|Vật tư - Xây dựng|Gạch xây, Xi măng, cát, đá, gạch trồng cỏ
W|VT-09|Vật tư - Xây dựng|Gạch trồng cỏ, gạch trang trí…
W|VT-10|Vật tư - Xây dựng|Gạch ốp lát
W|VT-11|Vật tư - Xây dựng|Ván khuôn
W|VT-12|Vật tư - Xây dựng|Sơn nước
W|VT-13|Vật tư - Xây dựng|Phụ gia (sika, vinkem, Gps…)
W|VT-14|Vật tư - Xây dựng|PVC, vải địa
W|VT-15|Vật tư - Xây dựng|Nẹp inox, nẹp nhựa
W|VT-16|Vật tư - Xây dựng|Khác
W|TP-01|Thầu phụ - Xây dựng|Thầu phụ cọc ( cơ, robot)
W|TP-02|Thầu phụ - Xây dựng|Thầu phụ cọc Khoan nhồi
W|TP-03|Thầu phụ - Xây dựng|Thầu phụ cọc CDM
W|TP-04|Thầu phụ - Xây dựng|Kết cấu thép
W|TP-05|Thầu phụ - Xây dựng|Cáp dự ứng lực
W|TP-06|Thầu phụ - Xây dựng|Panel
W|TP-07|Thầu phụ - Xây dựng|Nhôm kính, alu
W|TP-08|Thầu phụ - Xây dựng|Cửa thép, Cửa cuốn, sectional door
W|TP-09|Thầu phụ - Xây dựng|Cửa gỗ
W|TP-10|Thầu phụ - Xây dựng|Cơ khí hoàn thiện lan can, cầu thang
W|TP-11|Thầu phụ - Xây dựng|Dây cứu sinh
W|TP-12|Thầu phụ - Xây dựng|Nội thất
W|TP-13|Thầu phụ - Xây dựng|Vách trần thạch cao
W|TP-14|Thầu phụ - Xây dựng|Vách ngăn di động
W|TP-15|Thầu phụ - Xây dựng|Vách ngăn vệ sinh
W|TP-16|Thầu phụ - Xây dựng|Granit
W|TP-17|Thầu phụ - Xây dựng|Hoàn thiện sàn thảm, vinyl
W|TP-18|Thầu phụ - Xây dựng|Chống mối
W|TP-19|Thầu phụ - Xây dựng|Chống thấm
W|TP-20|Thầu phụ - Xây dựng|Sơn PU, Epoxy, liquid
W|TP-21|Thầu phụ - Xây dựng|Dock Leveler.
W|TP-22|Thầu phụ - Xây dựng|Cẩu trục
W|TP-23|Thầu phụ - Xây dựng|Trạm cân
W|TP-24|Thầu phụ - Xây dựng|Thang máy, thang hàng, …
W|TP-25|Thầu phụ - Xây dựng|Sàn nâng.
W|TP-26|Thầu phụ - Xây dựng|Landscape
W|TP-27|Thầu phụ - Xây dựng|Cổng xếp.
W|TP-28|Thầu phụ - Xây dựng|Logo, Bảng hiệu.
W|TP-29|Thầu phụ - Xây dựng|TP thi công Màng nhựa
W|TP-30|Thầu phụ - Xây dựng|Khác
W|MEP-01|MEP|MEP (Full)
W|MEP-02|MEP|Hệ thống trung thế
W|MEP-03|MEP|PCCC (Phòng cháy chữa cháy).
W|MEP-04|MEP|Hệ thống điện, điện nhẹ
W|MEP-05|MEP|Hệ thống HVAC, Utility (Thông gió & Điều hòa không khí & Phù trợ).
W|MEP-06|MEP|Hệ thống cấp thoát nước
W|MEP-07|MEP|Hệ thống xử lý nước thải
W|MEP-08|MEP|Hệ thống solar
W|MEP-09|MEP|Khác
W|TB-01|Thiết bị|Máy biến áp
W|TB-02|Thiết bị|Tủ điện
W|TB-03|Thiết bị|Tủ trung thế.
W|TB-04|Thiết bị|Busway
W|TB-05|Thiết bị|Cáp điện
W|TB-06|Thiết bị|Thiết bị Utility (Máy nén khí, Hút bụi hút mùi, Boiler,...)
W|TB-07|Thiết bị|Máy lạnh
W|TB-08|Thiết bị|Ống thép, inox
W|TB-09|Thiết bị|Thang máng cáp
W|TB-10|Thiết bị|Ống PVC, HDPE
W|TB-11|Thiết bị|Thiết bị báo cháy
W|TB-12|Thiết bị|Đèn (đèn chiếu sáng, đèn năng lượng, đèn exit….)
W|TB-13|Thiết bị|Thiết bị chữa cháy (Sprinkler, Chữa cháy khí, FM200,…)
W|TB-14|Thiết bị|Bơm (bơm PCCC, Bơm nước…)
W|TB-15|Thiết bị|Bồn nước, Thiết bị vệ sinh
W|TB-16|Thiết bị|Khác
# S59 (2026-06-11) RENAMED theo format PMH anh Kiệt FDC chốt ("MÃ CV gồm chữ MEP-SUB-1
# rồi tên 1 MEP Sub MEP (Full) — đúng kiểu vậy"): Code = nhóm+STT không pad, Name =
# "STT nhóm tên". Mapping cũ→mới: VT-nn→MAT-n · TP-nn→SUB-n · MEP-0n→MEP-SUB-n ·
# TB-nn→MEP-EQU-n (scripts/s59-rename-workitems-pmh.sql — UPDATE giữ Id, prod+Dev).
W|MAT-1|Vật tư - Xây dựng|1 Mat Bê tông
W|MAT-2|Vật tư - Xây dựng|2 Mat Thép cây, Thép lưới hàn
W|MAT-3|Vật tư - Xây dựng|3 Mat Cọc ly tâm
W|MAT-4|Vật tư - Xây dựng|4 Mat Cống ly tâm
W|MAT-5|Vật tư - Xây dựng|5 Mat Cừ tràm
W|MAT-6|Vật tư - Xây dựng|6 Mat Kim loại ( rọ đầu cọc, V mạ kẽm, Vinox, bản mã…)
W|MAT-7|Vật tư - Xây dựng|7 Mat Nắp gang
W|MAT-8|Vật tư - Xây dựng|8 Mat Gạch xây, Xi măng, cát, đá, gạch trồng cỏ
W|MAT-9|Vật tư - Xây dựng|9 Mat Gạch trồng cỏ, gạch trang trí…
W|MAT-10|Vật tư - Xây dựng|10 Mat Gạch ốp lát
W|MAT-11|Vật tư - Xây dựng|11 Mat Ván khuôn
W|MAT-12|Vật tư - Xây dựng|12 Mat Sơn nước
W|MAT-13|Vật tư - Xây dựng|13 Mat Phụ gia (sika, vinkem, Gps…)
W|MAT-14|Vật tư - Xây dựng|14 Mat PVC, vải địa
W|MAT-15|Vật tư - Xây dựng|15 Mat Nẹp inox, nẹp nhựa
W|MAT-16|Vật tư - Xây dựng|16 Mat Khác
W|SUB-1|Thầu phụ - Xây dựng|1 Sub Thầu phụ cọc ( cơ, robot)
W|SUB-2|Thầu phụ - Xây dựng|2 Sub Thầu phụ cọc Khoan nhồi
W|SUB-3|Thầu phụ - Xây dựng|3 Sub Thầu phụ cọc CDM
W|SUB-4|Thầu phụ - Xây dựng|4 Sub Kết cấu thép
W|SUB-5|Thầu phụ - Xây dựng|5 Sub Cáp dự ứng lực
W|SUB-6|Thầu phụ - Xây dựng|6 Sub Panel
W|SUB-7|Thầu phụ - Xây dựng|7 Sub Nhôm kính, alu
W|SUB-8|Thầu phụ - Xây dựng|8 Sub Cửa thép, Cửa cuốn, sectional door
W|SUB-9|Thầu phụ - Xây dựng|9 Sub Cửa gỗ
W|SUB-10|Thầu phụ - Xây dựng|10 Sub Cơ khí hoàn thiện lan can, cầu thang
W|SUB-11|Thầu phụ - Xây dựng|11 Sub Dây cứu sinh
W|SUB-12|Thầu phụ - Xây dựng|12 Sub Nội thất
W|SUB-13|Thầu phụ - Xây dựng|13 Sub Vách trần thạch cao
W|SUB-14|Thầu phụ - Xây dựng|14 Sub Vách ngăn di động
W|SUB-15|Thầu phụ - Xây dựng|15 Sub Vách ngăn vệ sinh
W|SUB-16|Thầu phụ - Xây dựng|16 Sub Granit
W|SUB-17|Thầu phụ - Xây dựng|17 Sub Hoàn thiện sàn thảm, vinyl
W|SUB-18|Thầu phụ - Xây dựng|18 Sub Chống mối
W|SUB-19|Thầu phụ - Xây dựng|19 Sub Chống thấm
W|SUB-20|Thầu phụ - Xây dựng|20 Sub Sơn PU, Epoxy, liquid
W|SUB-21|Thầu phụ - Xây dựng|21 Sub Dock Leveler.
W|SUB-22|Thầu phụ - Xây dựng|22 Sub Cẩu trục
W|SUB-23|Thầu phụ - Xây dựng|23 Sub Trạm cân
W|SUB-24|Thầu phụ - Xây dựng|24 Sub Thang máy, thang hàng, …
W|SUB-25|Thầu phụ - Xây dựng|25 Sub Sàn nâng.
W|SUB-26|Thầu phụ - Xây dựng|26 Sub Landscape
W|SUB-27|Thầu phụ - Xây dựng|27 Sub Cổng xếp.
W|SUB-28|Thầu phụ - Xây dựng|28 Sub Logo, Bảng hiệu.
W|SUB-29|Thầu phụ - Xây dựng|29 Sub TP thi công Màng nhựa
W|SUB-30|Thầu phụ - Xây dựng|30 Sub Khác
W|MEP-SUB-1|MEP|1 MEP Sub MEP (Full)
W|MEP-SUB-2|MEP|2 MEP Sub Hệ thống trung thế
W|MEP-SUB-3|MEP|3 MEP Sub PCCC (Phòng cháy chữa cháy).
W|MEP-SUB-4|MEP|4 MEP Sub Hệ thống điện, điện nhẹ
W|MEP-SUB-5|MEP|5 MEP Sub Hệ thống HVAC, Utility (Thông gió & Điều hòa không khí & Phù trợ).
W|MEP-SUB-6|MEP|6 MEP Sub Hệ thống cấp thoát nước
W|MEP-SUB-7|MEP|7 MEP Sub Hệ thống xử lý nước thải
W|MEP-SUB-8|MEP|8 MEP Sub Hệ thống solar
W|MEP-SUB-9|MEP|9 MEP Sub Khác
W|MEP-EQU-1|Thiết bị|1 MEP _ Equ Máy biến áp
W|MEP-EQU-2|Thiết bị|2 MEP _ Equ Tủ điện
W|MEP-EQU-3|Thiết bị|3 MEP _ Equ Tủ trung thế.
W|MEP-EQU-4|Thiết bị|4 MEP _ Equ Busway
W|MEP-EQU-5|Thiết bị|5 MEP _ Equ Cáp điện
W|MEP-EQU-6|Thiết bị|6 MEP _ Equ Thiết bị Utility (Máy nén khí, Hút bụi hút mùi, Boiler,...)
W|MEP-EQU-7|Thiết bị|7 MEP _ Equ Máy lạnh
W|MEP-EQU-8|Thiết bị|8 MEP _ Equ Ống thép, inox
W|MEP-EQU-9|Thiết bị|9 MEP _ Equ Thang máng cáp
W|MEP-EQU-10|Thiết bị|10 MEP _ Equ Ống PVC, HDPE
W|MEP-EQU-11|Thiết bị|11 MEP _ Equ Thiết bị báo cháy
W|MEP-EQU-12|Thiết bị|12 MEP _ Equ Đèn (đèn chiếu sáng, đèn năng lượng, đèn exit….)
W|MEP-EQU-13|Thiết bị|13 MEP _ Equ Thiết bị chữa cháy (Sprinkler, Chữa cháy khí, FM200,…)
W|MEP-EQU-14|Thiết bị|14 MEP _ Equ Bơm (bơm PCCC, Bơm nước…)
W|MEP-EQU-15|Thiết bị|15 MEP _ Equ Bồn nước, Thiết bị vệ sinh
W|MEP-EQU-16|Thiết bị|16 MEP _ Equ Khác
# WORKITEMS_TOTAL=71 (VatTu=16 ThauPhu=30 MEP=9 ThietBi=16)
## SUPPLIERS (3) | Code | Name | Type(NhaThauPhu/NhaCungCap) | TaxCode | Phone | Email | Address | ContactPerson | NotePacked

View File

@ -0,0 +1,109 @@
-- ============================================================================
-- S59 đợt 3 (2026-06-11) — RENAME 71 WorkItems theo format PMH anh Kiệt FDC chốt
-- (Zalo 16:59 "MÃ CV gồm chữ MEP-SUB-1 rồi tên 1 MEP Sub MEP (Full) — đúng kiểu vậy"):
-- Mã CV = nhóm + STT không pad: MAT-n / SUB-n / MEP-SUB-n / MEP-EQU-n
-- Tên CV = "STT nhóm tên": "1 Mat Bê tông", "1 MEP Sub MEP (Full)"…
-- UPDATE giữ nguyên Id (phiếu PE/2026/A/001 vừa tạo trỏ WorkItemId vẫn đúng).
-- PHẢI chạy TRƯỚC khi deploy commit seed mới (per-code idempotent: nếu deploy
-- trước, app restart thấy mã mới "thiếu" sẽ ADD 71 row mới = 142).
-- Run: sqlcmd -S .\SQLEXPRESS -d SolutionErp -i s59-rename-workitems-pmh.sql
-- ============================================================================
SET QUOTED_IDENTIFIER ON;
SET NOCOUNT ON;
PRINT '=== BEFORE ===';
SELECT 'TOTAL' AS T, COUNT(*) AS C FROM WorkItems
UNION ALL SELECT 'OLD-CODES', COUNT(*) FROM WorkItems WHERE Code LIKE 'VT-%' OR Code LIKE 'TP-%' OR (Code LIKE 'MEP-0%') OR Code LIKE 'TB-%';
BEGIN TRANSACTION;
-- VẬT TƯ - XÂY DỰNG: VT-01..16 -> MAT-1..16
UPDATE WorkItems SET Code=N'MAT-1', Name=N'1 Mat Bê tông' WHERE Code=N'VT-01';
UPDATE WorkItems SET Code=N'MAT-2', Name=N'2 Mat Thép cây, Thép lưới hàn' WHERE Code=N'VT-02';
UPDATE WorkItems SET Code=N'MAT-3', Name=N'3 Mat Cọc ly tâm' WHERE Code=N'VT-03';
UPDATE WorkItems SET Code=N'MAT-4', Name=N'4 Mat Cống ly tâm' WHERE Code=N'VT-04';
UPDATE WorkItems SET Code=N'MAT-5', Name=N'5 Mat Cừ tràm' WHERE Code=N'VT-05';
UPDATE WorkItems SET Code=N'MAT-6', Name=N'6 Mat Kim loại ( rọ đầu cọc, V mạ kẽm, Vinox, bản mã…)' WHERE Code=N'VT-06';
UPDATE WorkItems SET Code=N'MAT-7', Name=N'7 Mat Nắp gang' WHERE Code=N'VT-07';
UPDATE WorkItems SET Code=N'MAT-8', Name=N'8 Mat Gạch xây, Xi măng, cát, đá, gạch trồng cỏ' WHERE Code=N'VT-08';
UPDATE WorkItems SET Code=N'MAT-9', Name=N'9 Mat Gạch trồng cỏ, gạch trang trí…' WHERE Code=N'VT-09';
UPDATE WorkItems SET Code=N'MAT-10', Name=N'10 Mat Gạch ốp lát' WHERE Code=N'VT-10';
UPDATE WorkItems SET Code=N'MAT-11', Name=N'11 Mat Ván khuôn' WHERE Code=N'VT-11';
UPDATE WorkItems SET Code=N'MAT-12', Name=N'12 Mat Sơn nước' WHERE Code=N'VT-12';
UPDATE WorkItems SET Code=N'MAT-13', Name=N'13 Mat Phụ gia (sika, vinkem, Gps…)' WHERE Code=N'VT-13';
UPDATE WorkItems SET Code=N'MAT-14', Name=N'14 Mat PVC, vải địa' WHERE Code=N'VT-14';
UPDATE WorkItems SET Code=N'MAT-15', Name=N'15 Mat Nẹp inox, nẹp nhựa' WHERE Code=N'VT-15';
UPDATE WorkItems SET Code=N'MAT-16', Name=N'16 Mat Khác' WHERE Code=N'VT-16';
-- THẦU PHỤ - XÂY DỰNG: TP-01..30 -> SUB-1..30
UPDATE WorkItems SET Code=N'SUB-1', Name=N'1 Sub Thầu phụ cọc ( cơ, robot)' WHERE Code=N'TP-01';
UPDATE WorkItems SET Code=N'SUB-2', Name=N'2 Sub Thầu phụ cọc Khoan nhồi' WHERE Code=N'TP-02';
UPDATE WorkItems SET Code=N'SUB-3', Name=N'3 Sub Thầu phụ cọc CDM' WHERE Code=N'TP-03';
UPDATE WorkItems SET Code=N'SUB-4', Name=N'4 Sub Kết cấu thép' WHERE Code=N'TP-04';
UPDATE WorkItems SET Code=N'SUB-5', Name=N'5 Sub Cáp dự ứng lực' WHERE Code=N'TP-05';
UPDATE WorkItems SET Code=N'SUB-6', Name=N'6 Sub Panel' WHERE Code=N'TP-06';
UPDATE WorkItems SET Code=N'SUB-7', Name=N'7 Sub Nhôm kính, alu' WHERE Code=N'TP-07';
UPDATE WorkItems SET Code=N'SUB-8', Name=N'8 Sub Cửa thép, Cửa cuốn, sectional door' WHERE Code=N'TP-08';
UPDATE WorkItems SET Code=N'SUB-9', Name=N'9 Sub Cửa gỗ' WHERE Code=N'TP-09';
UPDATE WorkItems SET Code=N'SUB-10', Name=N'10 Sub Cơ khí hoàn thiện lan can, cầu thang' WHERE Code=N'TP-10';
UPDATE WorkItems SET Code=N'SUB-11', Name=N'11 Sub Dây cứu sinh' WHERE Code=N'TP-11';
UPDATE WorkItems SET Code=N'SUB-12', Name=N'12 Sub Nội thất' WHERE Code=N'TP-12';
UPDATE WorkItems SET Code=N'SUB-13', Name=N'13 Sub Vách trần thạch cao' WHERE Code=N'TP-13';
UPDATE WorkItems SET Code=N'SUB-14', Name=N'14 Sub Vách ngăn di động' WHERE Code=N'TP-14';
UPDATE WorkItems SET Code=N'SUB-15', Name=N'15 Sub Vách ngăn vệ sinh' WHERE Code=N'TP-15';
UPDATE WorkItems SET Code=N'SUB-16', Name=N'16 Sub Granit' WHERE Code=N'TP-16';
UPDATE WorkItems SET Code=N'SUB-17', Name=N'17 Sub Hoàn thiện sàn thảm, vinyl' WHERE Code=N'TP-17';
UPDATE WorkItems SET Code=N'SUB-18', Name=N'18 Sub Chống mối' WHERE Code=N'TP-18';
UPDATE WorkItems SET Code=N'SUB-19', Name=N'19 Sub Chống thấm' WHERE Code=N'TP-19';
UPDATE WorkItems SET Code=N'SUB-20', Name=N'20 Sub Sơn PU, Epoxy, liquid' WHERE Code=N'TP-20';
UPDATE WorkItems SET Code=N'SUB-21', Name=N'21 Sub Dock Leveler.' WHERE Code=N'TP-21';
UPDATE WorkItems SET Code=N'SUB-22', Name=N'22 Sub Cẩu trục' WHERE Code=N'TP-22';
UPDATE WorkItems SET Code=N'SUB-23', Name=N'23 Sub Trạm cân' WHERE Code=N'TP-23';
UPDATE WorkItems SET Code=N'SUB-24', Name=N'24 Sub Thang máy, thang hàng, …' WHERE Code=N'TP-24';
UPDATE WorkItems SET Code=N'SUB-25', Name=N'25 Sub Sàn nâng.' WHERE Code=N'TP-25';
UPDATE WorkItems SET Code=N'SUB-26', Name=N'26 Sub Landscape' WHERE Code=N'TP-26';
UPDATE WorkItems SET Code=N'SUB-27', Name=N'27 Sub Cổng xếp.' WHERE Code=N'TP-27';
UPDATE WorkItems SET Code=N'SUB-28', Name=N'28 Sub Logo, Bảng hiệu.' WHERE Code=N'TP-28';
UPDATE WorkItems SET Code=N'SUB-29', Name=N'29 Sub TP thi công Màng nhựa' WHERE Code=N'TP-29';
UPDATE WorkItems SET Code=N'SUB-30', Name=N'30 Sub Khác' WHERE Code=N'TP-30';
-- MEP: MEP-01..09 -> MEP-SUB-1..9 (chạy TRƯỚC khối MEP-EQU để LIKE 'MEP-0%' không đụng)
UPDATE WorkItems SET Code=N'MEP-SUB-1', Name=N'1 MEP Sub MEP (Full)' WHERE Code=N'MEP-01';
UPDATE WorkItems SET Code=N'MEP-SUB-2', Name=N'2 MEP Sub Hệ thống trung thế' WHERE Code=N'MEP-02';
UPDATE WorkItems SET Code=N'MEP-SUB-3', Name=N'3 MEP Sub PCCC (Phòng cháy chữa cháy).' WHERE Code=N'MEP-03';
UPDATE WorkItems SET Code=N'MEP-SUB-4', Name=N'4 MEP Sub Hệ thống điện, điện nhẹ' WHERE Code=N'MEP-04';
UPDATE WorkItems SET Code=N'MEP-SUB-5', Name=N'5 MEP Sub Hệ thống HVAC, Utility (Thông gió & Điều hòa không khí & Phù trợ).' WHERE Code=N'MEP-05';
UPDATE WorkItems SET Code=N'MEP-SUB-6', Name=N'6 MEP Sub Hệ thống cấp thoát nước' WHERE Code=N'MEP-06';
UPDATE WorkItems SET Code=N'MEP-SUB-7', Name=N'7 MEP Sub Hệ thống xử lý nước thải' WHERE Code=N'MEP-07';
UPDATE WorkItems SET Code=N'MEP-SUB-8', Name=N'8 MEP Sub Hệ thống solar' WHERE Code=N'MEP-08';
UPDATE WorkItems SET Code=N'MEP-SUB-9', Name=N'9 MEP Sub Khác' WHERE Code=N'MEP-09';
-- THIẾT BỊ: TB-01..16 -> MEP-EQU-1..16
UPDATE WorkItems SET Code=N'MEP-EQU-1', Name=N'1 MEP _ Equ Máy biến áp' WHERE Code=N'TB-01';
UPDATE WorkItems SET Code=N'MEP-EQU-2', Name=N'2 MEP _ Equ Tủ điện' WHERE Code=N'TB-02';
UPDATE WorkItems SET Code=N'MEP-EQU-3', Name=N'3 MEP _ Equ Tủ trung thế.' WHERE Code=N'TB-03';
UPDATE WorkItems SET Code=N'MEP-EQU-4', Name=N'4 MEP _ Equ Busway' WHERE Code=N'TB-04';
UPDATE WorkItems SET Code=N'MEP-EQU-5', Name=N'5 MEP _ Equ Cáp điện' WHERE Code=N'TB-05';
UPDATE WorkItems SET Code=N'MEP-EQU-6', Name=N'6 MEP _ Equ Thiết bị Utility (Máy nén khí, Hút bụi hút mùi, Boiler,...)' WHERE Code=N'TB-06';
UPDATE WorkItems SET Code=N'MEP-EQU-7', Name=N'7 MEP _ Equ Máy lạnh' WHERE Code=N'TB-07';
UPDATE WorkItems SET Code=N'MEP-EQU-8', Name=N'8 MEP _ Equ Ống thép, inox' WHERE Code=N'TB-08';
UPDATE WorkItems SET Code=N'MEP-EQU-9', Name=N'9 MEP _ Equ Thang máng cáp' WHERE Code=N'TB-09';
UPDATE WorkItems SET Code=N'MEP-EQU-10', Name=N'10 MEP _ Equ Ống PVC, HDPE' WHERE Code=N'TB-10';
UPDATE WorkItems SET Code=N'MEP-EQU-11', Name=N'11 MEP _ Equ Thiết bị báo cháy' WHERE Code=N'TB-11';
UPDATE WorkItems SET Code=N'MEP-EQU-12', Name=N'12 MEP _ Equ Đèn (đèn chiếu sáng, đèn năng lượng, đèn exit….)' WHERE Code=N'TB-12';
UPDATE WorkItems SET Code=N'MEP-EQU-13', Name=N'13 MEP _ Equ Thiết bị chữa cháy (Sprinkler, Chữa cháy khí, FM200,…)' WHERE Code=N'TB-13';
UPDATE WorkItems SET Code=N'MEP-EQU-14', Name=N'14 MEP _ Equ Bơm (bơm PCCC, Bơm nước…)' WHERE Code=N'TB-14';
UPDATE WorkItems SET Code=N'MEP-EQU-15', Name=N'15 MEP _ Equ Bồn nước, Thiết bị vệ sinh' WHERE Code=N'TB-15';
UPDATE WorkItems SET Code=N'MEP-EQU-16', Name=N'16 MEP _ Equ Khác' WHERE Code=N'TB-16';
PRINT '=== AFTER (expect TOTAL 71 / OLD-CODES 0 / NEW-CODES 71) ===';
SELECT 'TOTAL' AS T, COUNT(*) AS C FROM WorkItems
UNION ALL SELECT 'OLD-CODES', COUNT(*) FROM WorkItems WHERE Code LIKE 'VT-%' OR Code LIKE 'TP-%' OR (Code LIKE 'MEP-0%') OR Code LIKE 'TB-%'
UNION ALL SELECT 'NEW-MAT', COUNT(*) FROM WorkItems WHERE Code LIKE 'MAT-%'
UNION ALL SELECT 'NEW-SUB', COUNT(*) FROM WorkItems WHERE Code LIKE 'SUB-%'
UNION ALL SELECT 'NEW-MEP-SUB', COUNT(*) FROM WorkItems WHERE Code LIKE 'MEP-SUB-%'
UNION ALL SELECT 'NEW-MEP-EQU', COUNT(*) FROM WorkItems WHERE Code LIKE 'MEP-EQU-%';
SELECT TOP 5 Code, Name FROM WorkItems WHERE Code LIKE 'MEP-SUB-%' ORDER BY Code;
COMMIT TRANSACTION;
PRINT 'S59 rename PMH COMMITTED.';

View File

@ -2562,79 +2562,84 @@ public static class DbInitializer
if (addedProjects > 0) logger.LogInformation("Seeded {Count} real projects (S55 import)", addedProjects);
// ---------- WORKITEMS (71) — (Code, Category, Name) ----------
// S59 (2026-06-11) anh Kiệt FDC chốt format theo file PMH: Mã CV = nhóm+STT
// không pad (MAT-1 / SUB-1 / MEP-SUB-1 / MEP-EQU-1), Tên CV = "STT nhóm tên"
// ("1 MEP Sub MEP (Full)" — "đúng kiểu vậy"). Đã UPDATE rename prod+Dev cùng
// commit (scripts/s59-rename-workitems-pmh.sql) — giữ nguyên Id rows.
// FE sort client numeric-aware (mã không pad → string-sort loạn "10"<"2").
var workItems = new (string Code, string Category, string Name)[]
{
("VT-01", "Vật tư - Xây dựng", "Bê tông"),
("VT-02", "Vật tư - Xây dựng", "Thép cây, Thép lưới hàn"),
("VT-03", "Vật tư - Xây dựng", "Cọc ly tâm"),
("VT-04", "Vật tư - Xây dựng", "Cống ly tâm"),
("VT-05", "Vật tư - Xây dựng", "Cừ tràm"),
("VT-06", "Vật tư - Xây dựng", "Kim loại ( rọ đầu cọc, V mạ kẽm, Vinox, bản mã…)"),
("VT-07", "Vật tư - Xây dựng", "Nắp gang"),
("VT-08", "Vật tư - Xây dựng", "Gạch xây, Xi măng, cát, đá, gạch trồng cỏ"),
("VT-09", "Vật tư - Xây dựng", "Gạch trồng cỏ, gạch trang trí…"),
("VT-10", "Vật tư - Xây dựng", "Gạch ốp lát"),
("VT-11", "Vật tư - Xây dựng", "Ván khuôn"),
("VT-12", "Vật tư - Xây dựng", "Sơn nước"),
("VT-13", "Vật tư - Xây dựng", "Phụ gia (sika, vinkem, Gps…)"),
("VT-14", "Vật tư - Xây dựng", "PVC, vải địa"),
("VT-15", "Vật tư - Xây dựng", "Nẹp inox, nẹp nhựa"),
("VT-16", "Vật tư - Xây dựng", "Khác"),
("TP-01", "Thầu phụ - Xây dựng", "Thầu phụ cọc ( cơ, robot)"),
("TP-02", "Thầu phụ - Xây dựng", "Thầu phụ cọc Khoan nhồi"),
("TP-03", "Thầu phụ - Xây dựng", "Thầu phụ cọc CDM"),
("TP-04", "Thầu phụ - Xây dựng", "Kết cấu thép"),
("TP-05", "Thầu phụ - Xây dựng", "Cáp dự ứng lực"),
("TP-06", "Thầu phụ - Xây dựng", "Panel"),
("TP-07", "Thầu phụ - Xây dựng", "Nhôm kính, alu"),
("TP-08", "Thầu phụ - Xây dựng", "Cửa thép, Cửa cuốn, sectional door"),
("TP-09", "Thầu phụ - Xây dựng", "Cửa gỗ"),
("TP-10", "Thầu phụ - Xây dựng", "Cơ khí hoàn thiện lan can, cầu thang"),
("TP-11", "Thầu phụ - Xây dựng", "Dây cứu sinh"),
("TP-12", "Thầu phụ - Xây dựng", "Nội thất"),
("TP-13", "Thầu phụ - Xây dựng", "Vách trần thạch cao"),
("TP-14", "Thầu phụ - Xây dựng", "Vách ngăn di động"),
("TP-15", "Thầu phụ - Xây dựng", "Vách ngăn vệ sinh"),
("TP-16", "Thầu phụ - Xây dựng", "Granit"),
("TP-17", "Thầu phụ - Xây dựng", "Hoàn thiện sàn thảm, vinyl"),
("TP-18", "Thầu phụ - Xây dựng", "Chống mối"),
("TP-19", "Thầu phụ - Xây dựng", "Chống thấm"),
("TP-20", "Thầu phụ - Xây dựng", "Sơn PU, Epoxy, liquid"),
("TP-21", "Thầu phụ - Xây dựng", "Dock Leveler."),
("TP-22", "Thầu phụ - Xây dựng", "Cẩu trục"),
("TP-23", "Thầu phụ - Xây dựng", "Trạm cân"),
("TP-24", "Thầu phụ - Xây dựng", "Thang máy, thang hàng, …"),
("TP-25", "Thầu phụ - Xây dựng", "Sàn nâng."),
("TP-26", "Thầu phụ - Xây dựng", "Landscape"),
("TP-27", "Thầu phụ - Xây dựng", "Cổng xếp."),
("TP-28", "Thầu phụ - Xây dựng", "Logo, Bảng hiệu."),
("TP-29", "Thầu phụ - Xây dựng", "TP thi công Màng nhựa"),
("TP-30", "Thầu phụ - Xây dựng", "Khác"),
("MEP-01", "MEP", "MEP (Full)"),
("MEP-02", "MEP", "Hệ thống trung thế"),
("MEP-03", "MEP", "PCCC (Phòng cháy chữa cháy)."),
("MEP-04", "MEP", "Hệ thống điện, điện nhẹ"),
("MEP-05", "MEP", "Hệ thống HVAC, Utility (Thông gió & Điều hòa không khí & Phù trợ)."),
("MEP-06", "MEP", "Hệ thống cấp thoát nước"),
("MEP-07", "MEP", "Hệ thống xử lý nước thải"),
("MEP-08", "MEP", "Hệ thống solar"),
("MEP-09", "MEP", "Khác"),
("TB-01", "Thiết bị", "Máy biến áp"),
("TB-02", "Thiết bị", "Tủ điện"),
("TB-03", "Thiết bị", "Tủ trung thế."),
("TB-04", "Thiết bị", "Busway"),
("TB-05", "Thiết bị", "Cáp điện"),
("TB-06", "Thiết bị", "Thiết bị Utility (Máy nén khí, Hút bụi hút mùi, Boiler,...)"),
("TB-07", "Thiết bị", "Máy lạnh"),
("TB-08", "Thiết bị", "Ống thép, inox"),
("TB-09", "Thiết bị", "Thang máng cáp"),
("TB-10", "Thiết bị", "Ống PVC, HDPE"),
("TB-11", "Thiết bị", "Thiết bị báo cháy"),
("TB-12", "Thiết bị", "Đèn (đèn chiếu sáng, đèn năng lượng, đèn exit….)"),
("TB-13", "Thiết bị", "Thiết bị chữa cháy (Sprinkler, Chữa cháy khí, FM200,…)"),
("TB-14", "Thiết bị", "Bơm (bơm PCCC, Bơm nước…)"),
("TB-15", "Thiết bị", "Bồn nước, Thiết bị vệ sinh"),
("TB-16", "Thiết bị", "Khác"),
("MAT-1", "Vật tư - Xây dựng", "1 Mat Bê tông"),
("MAT-2", "Vật tư - Xây dựng", "2 Mat Thép cây, Thép lưới hàn"),
("MAT-3", "Vật tư - Xây dựng", "3 Mat Cọc ly tâm"),
("MAT-4", "Vật tư - Xây dựng", "4 Mat Cống ly tâm"),
("MAT-5", "Vật tư - Xây dựng", "5 Mat Cừ tràm"),
("MAT-6", "Vật tư - Xây dựng", "6 Mat Kim loại ( rọ đầu cọc, V mạ kẽm, Vinox, bản mã…)"),
("MAT-7", "Vật tư - Xây dựng", "7 Mat Nắp gang"),
("MAT-8", "Vật tư - Xây dựng", "8 Mat Gạch xây, Xi măng, cát, đá, gạch trồng cỏ"),
("MAT-9", "Vật tư - Xây dựng", "9 Mat Gạch trồng cỏ, gạch trang trí…"),
("MAT-10", "Vật tư - Xây dựng", "10 Mat Gạch ốp lát"),
("MAT-11", "Vật tư - Xây dựng", "11 Mat Ván khuôn"),
("MAT-12", "Vật tư - Xây dựng", "12 Mat Sơn nước"),
("MAT-13", "Vật tư - Xây dựng", "13 Mat Phụ gia (sika, vinkem, Gps…)"),
("MAT-14", "Vật tư - Xây dựng", "14 Mat PVC, vải địa"),
("MAT-15", "Vật tư - Xây dựng", "15 Mat Nẹp inox, nẹp nhựa"),
("MAT-16", "Vật tư - Xây dựng", "16 Mat Khác"),
("SUB-1", "Thầu phụ - Xây dựng", "1 Sub Thầu phụ cọc ( cơ, robot)"),
("SUB-2", "Thầu phụ - Xây dựng", "2 Sub Thầu phụ cọc Khoan nhồi"),
("SUB-3", "Thầu phụ - Xây dựng", "3 Sub Thầu phụ cọc CDM"),
("SUB-4", "Thầu phụ - Xây dựng", "4 Sub Kết cấu thép"),
("SUB-5", "Thầu phụ - Xây dựng", "5 Sub Cáp dự ứng lực"),
("SUB-6", "Thầu phụ - Xây dựng", "6 Sub Panel"),
("SUB-7", "Thầu phụ - Xây dựng", "7 Sub Nhôm kính, alu"),
("SUB-8", "Thầu phụ - Xây dựng", "8 Sub Cửa thép, Cửa cuốn, sectional door"),
("SUB-9", "Thầu phụ - Xây dựng", "9 Sub Cửa gỗ"),
("SUB-10", "Thầu phụ - Xây dựng", "10 Sub Cơ khí hoàn thiện lan can, cầu thang"),
("SUB-11", "Thầu phụ - Xây dựng", "11 Sub Dây cứu sinh"),
("SUB-12", "Thầu phụ - Xây dựng", "12 Sub Nội thất"),
("SUB-13", "Thầu phụ - Xây dựng", "13 Sub Vách trần thạch cao"),
("SUB-14", "Thầu phụ - Xây dựng", "14 Sub Vách ngăn di động"),
("SUB-15", "Thầu phụ - Xây dựng", "15 Sub Vách ngăn vệ sinh"),
("SUB-16", "Thầu phụ - Xây dựng", "16 Sub Granit"),
("SUB-17", "Thầu phụ - Xây dựng", "17 Sub Hoàn thiện sàn thảm, vinyl"),
("SUB-18", "Thầu phụ - Xây dựng", "18 Sub Chống mối"),
("SUB-19", "Thầu phụ - Xây dựng", "19 Sub Chống thấm"),
("SUB-20", "Thầu phụ - Xây dựng", "20 Sub Sơn PU, Epoxy, liquid"),
("SUB-21", "Thầu phụ - Xây dựng", "21 Sub Dock Leveler."),
("SUB-22", "Thầu phụ - Xây dựng", "22 Sub Cẩu trục"),
("SUB-23", "Thầu phụ - Xây dựng", "23 Sub Trạm cân"),
("SUB-24", "Thầu phụ - Xây dựng", "24 Sub Thang máy, thang hàng, …"),
("SUB-25", "Thầu phụ - Xây dựng", "25 Sub Sàn nâng."),
("SUB-26", "Thầu phụ - Xây dựng", "26 Sub Landscape"),
("SUB-27", "Thầu phụ - Xây dựng", "27 Sub Cổng xếp."),
("SUB-28", "Thầu phụ - Xây dựng", "28 Sub Logo, Bảng hiệu."),
("SUB-29", "Thầu phụ - Xây dựng", "29 Sub TP thi công Màng nhựa"),
("SUB-30", "Thầu phụ - Xây dựng", "30 Sub Khác"),
("MEP-SUB-1", "MEP", "1 MEP Sub MEP (Full)"),
("MEP-SUB-2", "MEP", "2 MEP Sub Hệ thống trung thế"),
("MEP-SUB-3", "MEP", "3 MEP Sub PCCC (Phòng cháy chữa cháy)."),
("MEP-SUB-4", "MEP", "4 MEP Sub Hệ thống điện, điện nhẹ"),
("MEP-SUB-5", "MEP", "5 MEP Sub Hệ thống HVAC, Utility (Thông gió & Điều hòa không khí & Phù trợ)."),
("MEP-SUB-6", "MEP", "6 MEP Sub Hệ thống cấp thoát nước"),
("MEP-SUB-7", "MEP", "7 MEP Sub Hệ thống xử lý nước thải"),
("MEP-SUB-8", "MEP", "8 MEP Sub Hệ thống solar"),
("MEP-SUB-9", "MEP", "9 MEP Sub Khác"),
("MEP-EQU-1", "Thiết bị", "1 MEP _ Equ Máy biến áp"),
("MEP-EQU-2", "Thiết bị", "2 MEP _ Equ Tủ điện"),
("MEP-EQU-3", "Thiết bị", "3 MEP _ Equ Tủ trung thế."),
("MEP-EQU-4", "Thiết bị", "4 MEP _ Equ Busway"),
("MEP-EQU-5", "Thiết bị", "5 MEP _ Equ Cáp điện"),
("MEP-EQU-6", "Thiết bị", "6 MEP _ Equ Thiết bị Utility (Máy nén khí, Hút bụi hút mùi, Boiler,...)"),
("MEP-EQU-7", "Thiết bị", "7 MEP _ Equ Máy lạnh"),
("MEP-EQU-8", "Thiết bị", "8 MEP _ Equ Ống thép, inox"),
("MEP-EQU-9", "Thiết bị", "9 MEP _ Equ Thang máng cáp"),
("MEP-EQU-10", "Thiết bị", "10 MEP _ Equ Ống PVC, HDPE"),
("MEP-EQU-11", "Thiết bị", "11 MEP _ Equ Thiết bị báo cháy"),
("MEP-EQU-12", "Thiết bị", "12 MEP _ Equ Đèn (đèn chiếu sáng, đèn năng lượng, đèn exit….)"),
("MEP-EQU-13", "Thiết bị", "13 MEP _ Equ Thiết bị chữa cháy (Sprinkler, Chữa cháy khí, FM200,…)"),
("MEP-EQU-14", "Thiết bị", "14 MEP _ Equ Bơm (bơm PCCC, Bơm nước…)"),
("MEP-EQU-15", "Thiết bị", "15 MEP _ Equ Bồn nước, Thiết bị vệ sinh"),
("MEP-EQU-16", "Thiết bị", "16 MEP _ Equ Khác"),
};
var existingWorkItemCodes = await db.WorkItems.Select(w => w.Code).ToListAsync();