Expand lock guard to 7 companies (COMPANY_8/9/10/16/28/29/31)

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) <noreply@anthropic.com>
This commit is contained in:
kmh
2026-05-22 11:38:42 +09:00
parent 471704445b
commit 96750b2701
7 changed files with 42 additions and 0 deletions

View File

@@ -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("");

View File

@@ -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("");

View File

@@ -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("");

View File

@@ -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("");

View File

@@ -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("");

View File

@@ -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("");

View File

@@ -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("");