fix: 공정실행 카드 표시 3건 수정

- 분할접수 카드 구분: 같은 공정 복수 SPLIT 시 "접수 #1", "접수 #2" 표시
- 재작업 카드 전공정 표시: is_rework='Y' 카드는 공정 필터 무시, 모든 공정에서 표시
- 대기/완료 탭: 선택한 공정 기준으로만 카드 표시 (기존 동작 확인)
- DefectTypeModal: 전공정/지정공정 UI 이미 구현 확인 (수정 불필요)
This commit is contained in:
SeongHyun Kim
2026-04-06 14:27:49 +09:00
parent d1d823d5ca
commit 5c9447a321
2 changed files with 1382 additions and 2 deletions

View File

@@ -916,7 +916,9 @@ export function WorkOrderList() {
const filteredProcesses = useMemo(() => {
if (selectedProcess === "__all__") return []; // 공정 미선택 시 빈 목록
return masterProcesses.filter((proc) => {
if (proc.process_code !== selectedProcess) return false;
const isRework = proc.is_rework === "Y" || proc.is_rework === "true" || proc.is_rework === "1";
// 재작업 카드는 공정 필터 무시 (모든 공정에서 표시)
if (!isRework && proc.process_code !== selectedProcess) return false;
if (selectedEquipment !== "__all__") {
const wi = instructionMap[proc.wo_id];
if (!wi) return false;
@@ -932,7 +934,9 @@ export function WorkOrderList() {
/* ---- Tab counts ---- */
const tabCounts = useMemo(() => {
const preFiltered = masterProcesses.filter((proc) => {
if (selectedProcess !== "__all__" && proc.process_code !== selectedProcess) return false;
const isRework = proc.is_rework === "Y" || proc.is_rework === "true" || proc.is_rework === "1";
// 재작업 카드는 공정 필터 무시 (모든 공정에서 표시)
if (selectedProcess !== "__all__" && !isRework && proc.process_code !== selectedProcess) return false;
if (selectedEquipment !== "__all__") {
const wi = instructionMap[proc.wo_id];
if (!wi) return false;
@@ -1043,6 +1047,35 @@ export function WorkOrderList() {
});
};
/* ---- Helper: get split order label (접수 #N) ---- */
const splitOrderMap = useMemo(() => {
// 같은 wo_id + seq_no를 가진 SPLIT들을 그룹화하여 순서 부여
const groups: Record<string, WorkOrderProcess[]> = {};
for (const proc of allProcesses) {
if (!proc.parent_process_id) continue; // 마스터 행은 제외
if (proc.status !== "in_progress" && proc.status !== "completed") continue;
const key = `${proc.wo_id}__${proc.seq_no}`;
if (!groups[key]) groups[key] = [];
groups[key].push(proc);
}
const result: Record<string, { order: number; total: number }> = {};
for (const key of Object.keys(groups)) {
const splits = groups[key];
if (splits.length <= 1) continue; // 1개면 순서 표시 불필요
// accepted_at 기준 정렬 (없으면 started_at, 그마저 없으면 id)
splits.sort((a, b) => {
const ta = a.accepted_at ? new Date(a.accepted_at).getTime() : (a.started_at ? new Date(a.started_at).getTime() : 0);
const tb = b.accepted_at ? new Date(b.accepted_at).getTime() : (b.started_at ? new Date(b.started_at).getTime() : 0);
return ta - tb || a.id.localeCompare(b.id);
});
for (let i = 0; i < splits.length; i++) {
result[splits[i].id] = { order: i + 1, total: splits.length };
}
}
return result;
}, [allProcesses]);
/* ---- Helper: get previous process info ---- */
const getPrevProcessInfo = (proc: WorkOrderProcess) => {
const siblings = (processesByWo[proc.wo_id] || [])
@@ -1244,6 +1277,9 @@ export function WorkOrderList() {
// Additional available for in_progress
const additionalAvailable = Math.max(0, planQty - inputQty);
// Split order label
const splitInfo = splitOrderMap[proc.id];
// Rework info: origin process + rework round
let reworkRound = 1;
let originProcessName = proc.process_name || proc.process_code;
@@ -1298,6 +1334,11 @@ export function WorkOrderList() {
)}
<h3 className="text-xl font-extrabold text-gray-900 truncate">
{wi?.work_instruction_no || "작업지시"}
{splitInfo && (
<span className="text-sm font-bold text-blue-500 ml-1">
( #{splitInfo.order})
</span>
)}
</h3>
</div>
<span className={`shrink-0 ml-2 text-sm font-bold px-3 py-1.5 rounded-full ${badge.bg} ${badge.text}`}>