From 96750b27018664bec33d0eee68b5cc214ec292a5 Mon Sep 17 00:00:00 2001 From: kmh Date: Fri, 22 May 2026 11:38:42 +0900 Subject: [PATCH] Expand lock guard to 7 companies (COMPANY_8/9/10/16/28/29/31) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply the same Layer 3 pattern as COMPANY_7 (commit 47170444) to the remaining work-instruction screens. Backend Layer 1/2 (workInstructionController is_locked + save guard) is shared, so frontend mapping is the only change needed. Per company: - SelectedItem interface: add detailId? + locked? fields - relatedDetails.map: add detailId: d.detail_id, locked: d.is_locked === true COMPANY_30 already had this mapping (mhkim work survived the merge there), so it is excluded from this commit. Verification: frontend tsc on changed files → 0 errors. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../(main)/COMPANY_10/production/work-instruction/page.tsx | 6 ++++++ .../(main)/COMPANY_16/production/work-instruction/page.tsx | 6 ++++++ .../(main)/COMPANY_28/production/work-instruction/page.tsx | 6 ++++++ .../(main)/COMPANY_29/production/work-instruction/page.tsx | 6 ++++++ .../(main)/COMPANY_31/production/work-instruction/page.tsx | 6 ++++++ .../(main)/COMPANY_8/production/work-instruction/page.tsx | 6 ++++++ .../(main)/COMPANY_9/production/work-instruction/page.tsx | 6 ++++++ 7 files changed, 42 insertions(+) diff --git a/frontend/app/(main)/COMPANY_10/production/work-instruction/page.tsx b/frontend/app/(main)/COMPANY_10/production/work-instruction/page.tsx index 8e474428..5d51b29f 100644 --- a/frontend/app/(main)/COMPANY_10/production/work-instruction/page.tsx +++ b/frontend/app/(main)/COMPANY_10/production/work-instruction/page.tsx @@ -69,6 +69,9 @@ interface SelectedItem { // 기준수(BOM 0레벨 base_qty) / 배치수(자동) / 배분(균등|순차) baseQty?: number | null; splitMode?: "even" | "sequential"; + // 수정 모드: 기존 detail row 식별 + 잠금 상태 + detailId?: string; + locked?: boolean; } // 배치수 산출: baseQty>0 && qty>baseQty면 ceil(qty/baseQty), 아니면 1 @@ -458,6 +461,9 @@ export default function WorkInstructionPage() { equipmentIds: (d.detail_equipment_ids || "").split(",").filter(Boolean), workTeams: (d.detail_work_teams || "").split(",").filter(Boolean), workers: (d.detail_workers || "").split(",").filter(Boolean), + // 잠금 상태 (생산실적 있음) + 기존 detail row 식별자 + detailId: d.detail_id, + locked: d.is_locked === true, })); setEditItems(items); setAddQty(""); setAddEquipment(""); setAddWorkTeam(""); setAddWorker(""); diff --git a/frontend/app/(main)/COMPANY_16/production/work-instruction/page.tsx b/frontend/app/(main)/COMPANY_16/production/work-instruction/page.tsx index 1f922fe6..c82f3f04 100644 --- a/frontend/app/(main)/COMPANY_16/production/work-instruction/page.tsx +++ b/frontend/app/(main)/COMPANY_16/production/work-instruction/page.tsx @@ -69,6 +69,9 @@ interface SelectedItem { // 기준수(BOM 0레벨 base_qty) / 배치수(자동) / 배분(균등|순차) baseQty?: number | null; splitMode?: "even" | "sequential"; + // 수정 모드: 기존 detail row 식별 + 잠금 상태 + detailId?: string; + locked?: boolean; } // 배치수 산출: baseQty>0 && qty>baseQty면 ceil(qty/baseQty), 아니면 1 @@ -462,6 +465,9 @@ export default function WorkInstructionPage() { equipmentIds: (d.detail_equipment_ids || "").split(",").filter(Boolean), workTeams: (d.detail_work_teams || "").split(",").filter(Boolean), workers: (d.detail_workers || "").split(",").filter(Boolean), + // 잠금 상태 (생산실적 있음) + 기존 detail row 식별자 + detailId: d.detail_id, + locked: d.is_locked === true, })); setEditItems(items); setAddQty(""); setAddEquipment(""); setAddWorkTeam(""); setAddWorker(""); diff --git a/frontend/app/(main)/COMPANY_28/production/work-instruction/page.tsx b/frontend/app/(main)/COMPANY_28/production/work-instruction/page.tsx index 102a6356..5467799c 100644 --- a/frontend/app/(main)/COMPANY_28/production/work-instruction/page.tsx +++ b/frontend/app/(main)/COMPANY_28/production/work-instruction/page.tsx @@ -69,6 +69,9 @@ interface SelectedItem { // 기준수(BOM 0레벨 base_qty) / 배치수(자동) / 배분(균등|순차) baseQty?: number | null; splitMode?: "even" | "sequential"; + // 수정 모드: 기존 detail row 식별 + 잠금 상태 + detailId?: string; + locked?: boolean; } // 배치수 산출: baseQty>0 && qty>baseQty면 ceil(qty/baseQty), 아니면 1 @@ -458,6 +461,9 @@ export default function WorkInstructionPage() { equipmentIds: (d.detail_equipment_ids || "").split(",").filter(Boolean), workTeams: (d.detail_work_teams || "").split(",").filter(Boolean), workers: (d.detail_workers || "").split(",").filter(Boolean), + // 잠금 상태 (생산실적 있음) + 기존 detail row 식별자 + detailId: d.detail_id, + locked: d.is_locked === true, })); setEditItems(items); setAddQty(""); setAddEquipment(""); setAddWorkTeam(""); setAddWorker(""); diff --git a/frontend/app/(main)/COMPANY_29/production/work-instruction/page.tsx b/frontend/app/(main)/COMPANY_29/production/work-instruction/page.tsx index 102a6356..5467799c 100644 --- a/frontend/app/(main)/COMPANY_29/production/work-instruction/page.tsx +++ b/frontend/app/(main)/COMPANY_29/production/work-instruction/page.tsx @@ -69,6 +69,9 @@ interface SelectedItem { // 기준수(BOM 0레벨 base_qty) / 배치수(자동) / 배분(균등|순차) baseQty?: number | null; splitMode?: "even" | "sequential"; + // 수정 모드: 기존 detail row 식별 + 잠금 상태 + detailId?: string; + locked?: boolean; } // 배치수 산출: baseQty>0 && qty>baseQty면 ceil(qty/baseQty), 아니면 1 @@ -458,6 +461,9 @@ export default function WorkInstructionPage() { equipmentIds: (d.detail_equipment_ids || "").split(",").filter(Boolean), workTeams: (d.detail_work_teams || "").split(",").filter(Boolean), workers: (d.detail_workers || "").split(",").filter(Boolean), + // 잠금 상태 (생산실적 있음) + 기존 detail row 식별자 + detailId: d.detail_id, + locked: d.is_locked === true, })); setEditItems(items); setAddQty(""); setAddEquipment(""); setAddWorkTeam(""); setAddWorker(""); diff --git a/frontend/app/(main)/COMPANY_31/production/work-instruction/page.tsx b/frontend/app/(main)/COMPANY_31/production/work-instruction/page.tsx index fd0a77c1..b47504dc 100644 --- a/frontend/app/(main)/COMPANY_31/production/work-instruction/page.tsx +++ b/frontend/app/(main)/COMPANY_31/production/work-instruction/page.tsx @@ -69,6 +69,9 @@ interface SelectedItem { // 기준수(BOM 0레벨 base_qty) / 배치수(자동) / 배분(균등|순차) baseQty?: number | null; splitMode?: "even" | "sequential"; + // 수정 모드: 기존 detail row 식별 + 잠금 상태 + detailId?: string; + locked?: boolean; } // 배치수 산출: baseQty>0 && qty>baseQty면 ceil(qty/baseQty), 아니면 1 @@ -471,6 +474,9 @@ export default function WorkInstructionPage() { equipmentIds: (d.detail_equipment_ids || "").split(",").filter(Boolean), workTeams: (d.detail_work_teams || "").split(",").filter(Boolean), workers: (d.detail_workers || "").split(",").filter(Boolean), + // 잠금 상태 (생산실적 있음) + 기존 detail row 식별자 + detailId: d.detail_id, + locked: d.is_locked === true, })); setEditItems(items); setAddQty(""); setAddEquipment(""); setAddWorkTeam(""); setAddWorker(""); diff --git a/frontend/app/(main)/COMPANY_8/production/work-instruction/page.tsx b/frontend/app/(main)/COMPANY_8/production/work-instruction/page.tsx index 8e474428..5d51b29f 100644 --- a/frontend/app/(main)/COMPANY_8/production/work-instruction/page.tsx +++ b/frontend/app/(main)/COMPANY_8/production/work-instruction/page.tsx @@ -69,6 +69,9 @@ interface SelectedItem { // 기준수(BOM 0레벨 base_qty) / 배치수(자동) / 배분(균등|순차) baseQty?: number | null; splitMode?: "even" | "sequential"; + // 수정 모드: 기존 detail row 식별 + 잠금 상태 + detailId?: string; + locked?: boolean; } // 배치수 산출: baseQty>0 && qty>baseQty면 ceil(qty/baseQty), 아니면 1 @@ -458,6 +461,9 @@ export default function WorkInstructionPage() { equipmentIds: (d.detail_equipment_ids || "").split(",").filter(Boolean), workTeams: (d.detail_work_teams || "").split(",").filter(Boolean), workers: (d.detail_workers || "").split(",").filter(Boolean), + // 잠금 상태 (생산실적 있음) + 기존 detail row 식별자 + detailId: d.detail_id, + locked: d.is_locked === true, })); setEditItems(items); setAddQty(""); setAddEquipment(""); setAddWorkTeam(""); setAddWorker(""); diff --git a/frontend/app/(main)/COMPANY_9/production/work-instruction/page.tsx b/frontend/app/(main)/COMPANY_9/production/work-instruction/page.tsx index 7cb6ab2e..2905adc7 100644 --- a/frontend/app/(main)/COMPANY_9/production/work-instruction/page.tsx +++ b/frontend/app/(main)/COMPANY_9/production/work-instruction/page.tsx @@ -66,6 +66,9 @@ interface SelectedItem { equipmentIds?: string[]; workTeams?: string[]; workers?: string[]; + // 수정 모드: 기존 detail row 식별 + 잠금 상태 + detailId?: string; + locked?: boolean; } // 공용 다중선택 Popover 컴포넌트 (설비/작업조/작업자에 재사용) @@ -420,6 +423,9 @@ export default function WorkInstructionPage() { equipmentIds: (d.detail_equipment_ids || "").split(",").filter(Boolean), workTeams: (d.detail_work_teams || "").split(",").filter(Boolean), workers: (d.detail_workers || "").split(",").filter(Boolean), + // 잠금 상태 (생산실적 있음) + 기존 detail row 식별자 + detailId: d.detail_id, + locked: d.is_locked === true, })); setEditItems(items); setAddQty(""); setAddEquipment(""); setAddWorkTeam(""); setAddWorker("");