feat: 생산/품질/자재/출고/주문 관리 페이지 구현
- 생산관리: 대시보드, 작업지시, 작업실적, 작업자화면 - 품질관리: 검사관리 (리스트/등록/상세) - 자재관리: 입고관리, 재고현황 - 출고관리: 출하관리 (리스트/등록/상세/수정) - 주문관리: 수주관리, 생산의뢰 - 기존 컴포넌트 개선: CardTransactionInquiry, VendorDetail, QuoteRegistration - IntegratedListTemplateV2 개선 - 공통 컴포넌트 분석 문서 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
304
src/components/quality/InspectionManagement/mockData.ts
Normal file
304
src/components/quality/InspectionManagement/mockData.ts
Normal file
@@ -0,0 +1,304 @@
|
||||
import type {
|
||||
Inspection,
|
||||
InspectionStats,
|
||||
InspectionItem,
|
||||
} from './types';
|
||||
|
||||
// 검사 항목 템플릿 (조인트바 예시)
|
||||
export const inspectionItemsTemplate: InspectionItem[] = [
|
||||
{
|
||||
id: 'item-1',
|
||||
name: '가공상태',
|
||||
type: 'quality',
|
||||
spec: '결함 없을 것',
|
||||
},
|
||||
{
|
||||
id: 'item-2',
|
||||
name: '높이(H)',
|
||||
type: 'measurement',
|
||||
spec: '16.5 ± 1',
|
||||
unit: 'mm',
|
||||
},
|
||||
{
|
||||
id: 'item-3',
|
||||
name: '길이(L)',
|
||||
type: 'measurement',
|
||||
spec: '300 ± 4',
|
||||
unit: 'mm',
|
||||
},
|
||||
];
|
||||
|
||||
// Mock 검사 데이터 (스크린샷 기반)
|
||||
export const mockInspections: Inspection[] = [
|
||||
{
|
||||
id: '1',
|
||||
inspectionNo: 'QC-251219-01',
|
||||
inspectionType: 'IQC',
|
||||
requestDate: '2025-12-19',
|
||||
itemName: 'EGI 철골판 1.5ST',
|
||||
lotNo: 'MAT-251219-01',
|
||||
processName: '입고 검사',
|
||||
quantity: 100,
|
||||
unit: 'EA',
|
||||
status: '대기',
|
||||
inspector: undefined,
|
||||
items: [],
|
||||
remarks: '',
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
inspectionNo: 'QC-251219-02',
|
||||
inspectionType: 'PQC',
|
||||
requestDate: '2025-12-19',
|
||||
inspectionDate: '2025-12-19',
|
||||
itemName: '조인트바',
|
||||
lotNo: 'WO-251219-05',
|
||||
processName: '조립 공정',
|
||||
quantity: 50,
|
||||
unit: 'EA',
|
||||
status: '진행중',
|
||||
result: undefined,
|
||||
inspector: '홍길동',
|
||||
items: [
|
||||
{
|
||||
id: 'item-1',
|
||||
name: '가공상태',
|
||||
type: 'quality',
|
||||
spec: '결함 없을 것',
|
||||
result: '양호',
|
||||
judgment: '적합',
|
||||
},
|
||||
{
|
||||
id: 'item-2',
|
||||
name: '높이(H)',
|
||||
type: 'measurement',
|
||||
spec: '16.5 ± 1',
|
||||
unit: 'mm',
|
||||
measuredValue: 16.6,
|
||||
judgment: '적합',
|
||||
},
|
||||
{
|
||||
id: 'item-3',
|
||||
name: '길이(L)',
|
||||
type: 'measurement',
|
||||
spec: '300 ± 4',
|
||||
unit: 'mm',
|
||||
measuredValue: 301,
|
||||
judgment: '적합',
|
||||
},
|
||||
],
|
||||
remarks: '',
|
||||
},
|
||||
{
|
||||
id: '3',
|
||||
inspectionNo: 'QC-251218-03',
|
||||
inspectionType: 'FQC',
|
||||
requestDate: '2025-12-18',
|
||||
inspectionDate: '2025-12-18',
|
||||
itemName: '방화샤터 완제품',
|
||||
lotNo: 'WO-251218-02',
|
||||
processName: '최종 검사',
|
||||
quantity: 10,
|
||||
unit: 'EA',
|
||||
status: '완료',
|
||||
result: '합격',
|
||||
inspector: '김철수',
|
||||
items: [
|
||||
{
|
||||
id: 'item-1',
|
||||
name: '가공상태',
|
||||
type: 'quality',
|
||||
spec: '결함 없을 것',
|
||||
result: '양호',
|
||||
judgment: '적합',
|
||||
},
|
||||
{
|
||||
id: 'item-2',
|
||||
name: '높이(H)',
|
||||
type: 'measurement',
|
||||
spec: '16.5 ± 1',
|
||||
unit: 'mm',
|
||||
measuredValue: 16.6,
|
||||
judgment: '적합',
|
||||
},
|
||||
{
|
||||
id: 'item-3',
|
||||
name: '길이(L)',
|
||||
type: 'measurement',
|
||||
spec: '300 ± 4',
|
||||
unit: 'mm',
|
||||
measuredValue: 301,
|
||||
judgment: '적합',
|
||||
},
|
||||
],
|
||||
remarks: '',
|
||||
opinion: '특이사항 없음. 후공정(포장) 인계 완료함.',
|
||||
attachments: [
|
||||
{
|
||||
id: 'att-1',
|
||||
fileName: '현장_검사_사진_01.jpg',
|
||||
fileUrl: '/uploads/inspection/현장_검사_사진_01.jpg',
|
||||
fileType: 'image/jpeg',
|
||||
uploadedAt: '2025-12-18T10:30:00',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: '4',
|
||||
inspectionNo: 'QC-251218-04',
|
||||
inspectionType: 'PQC',
|
||||
requestDate: '2025-12-18',
|
||||
inspectionDate: '2025-12-18',
|
||||
itemName: '슬랫 성형품',
|
||||
lotNo: 'WO-251218-01',
|
||||
processName: '성형 공정',
|
||||
quantity: 200,
|
||||
unit: 'EA',
|
||||
status: '완료',
|
||||
result: '합격',
|
||||
inspector: '이영희',
|
||||
items: [
|
||||
{
|
||||
id: 'item-1',
|
||||
name: '가공상태',
|
||||
type: 'quality',
|
||||
spec: '결함 없을 것',
|
||||
result: '양호',
|
||||
judgment: '적합',
|
||||
},
|
||||
{
|
||||
id: 'item-2',
|
||||
name: '높이(H)',
|
||||
type: 'measurement',
|
||||
spec: '16.5 ± 1',
|
||||
unit: 'mm',
|
||||
measuredValue: 16.4,
|
||||
judgment: '적합',
|
||||
},
|
||||
{
|
||||
id: 'item-3',
|
||||
name: '길이(L)',
|
||||
type: 'measurement',
|
||||
spec: '300 ± 4',
|
||||
unit: 'mm',
|
||||
measuredValue: 299,
|
||||
judgment: '적합',
|
||||
},
|
||||
],
|
||||
remarks: '',
|
||||
opinion: '검사 완료. 이상 없음.',
|
||||
},
|
||||
{
|
||||
id: '5',
|
||||
inspectionNo: 'QC-251218-05',
|
||||
inspectionType: 'IQC',
|
||||
requestDate: '2025-12-18',
|
||||
inspectionDate: '2025-12-18',
|
||||
itemName: '스테인레스 코일',
|
||||
lotNo: 'MAT-251218-03',
|
||||
processName: '입고 검사',
|
||||
quantity: 5,
|
||||
unit: 'ROLL',
|
||||
status: '완료',
|
||||
result: '합격',
|
||||
inspector: '박민수',
|
||||
items: [
|
||||
{
|
||||
id: 'item-1',
|
||||
name: '가공상태',
|
||||
type: 'quality',
|
||||
spec: '결함 없을 것',
|
||||
result: '양호',
|
||||
judgment: '적합',
|
||||
},
|
||||
{
|
||||
id: 'item-2',
|
||||
name: '두께',
|
||||
type: 'measurement',
|
||||
spec: '1.2 ± 0.1',
|
||||
unit: 'mm',
|
||||
measuredValue: 1.19,
|
||||
judgment: '적합',
|
||||
},
|
||||
{
|
||||
id: 'item-3',
|
||||
name: '폭',
|
||||
type: 'measurement',
|
||||
spec: '1000 ± 5',
|
||||
unit: 'mm',
|
||||
measuredValue: 1001,
|
||||
judgment: '적합',
|
||||
},
|
||||
],
|
||||
remarks: '',
|
||||
opinion: '입고 검사 완료. 품질 적합.',
|
||||
},
|
||||
];
|
||||
|
||||
// 통계 데이터 계산
|
||||
export const calculateStats = (inspections: Inspection[]): InspectionStats => {
|
||||
const today = new Date().toISOString().split('T')[0];
|
||||
|
||||
const waitingCount = inspections.filter(i => i.status === '대기').length;
|
||||
const inProgressCount = inspections.filter(i => i.status === '진행중').length;
|
||||
const completedToday = inspections.filter(
|
||||
i => i.status === '완료' && i.inspectionDate === today
|
||||
).length;
|
||||
|
||||
const totalCompleted = inspections.filter(i => i.status === '완료').length;
|
||||
const defectCount = inspections.filter(i => i.result === '불합격').length;
|
||||
const defectRate = totalCompleted > 0 ? (defectCount / totalCompleted) * 100 : 0;
|
||||
|
||||
return {
|
||||
waitingCount,
|
||||
inProgressCount,
|
||||
completedCount: completedToday,
|
||||
defectRate: Math.round(defectRate * 10) / 10,
|
||||
};
|
||||
};
|
||||
|
||||
// 기본 통계 (mockData 기준)
|
||||
export const mockStats: InspectionStats = {
|
||||
waitingCount: 1,
|
||||
inProgressCount: 1,
|
||||
completedCount: 3,
|
||||
defectRate: 0.0,
|
||||
};
|
||||
|
||||
// 검사유형 라벨
|
||||
export const inspectionTypeLabels: Record<string, string> = {
|
||||
IQC: '입고검사',
|
||||
PQC: '공정검사',
|
||||
FQC: '최종검사',
|
||||
};
|
||||
|
||||
// 상태 컬러 매핑
|
||||
export const statusColorMap: Record<string, string> = {
|
||||
대기: 'bg-gray-100 text-gray-800',
|
||||
진행중: 'bg-blue-100 text-blue-800',
|
||||
완료: 'bg-green-100 text-green-800',
|
||||
};
|
||||
|
||||
// 판정 컬러 매핑
|
||||
export const judgmentColorMap: Record<string, string> = {
|
||||
합격: 'bg-green-100 text-green-800',
|
||||
불합격: 'bg-red-100 text-red-800',
|
||||
적합: 'text-green-600',
|
||||
부적합: 'text-red-600',
|
||||
};
|
||||
|
||||
// 측정값 판정 함수
|
||||
export const judgeMeasurement = (spec: string, value: number): '적합' | '부적합' => {
|
||||
// spec 예시: "16.5 ± 1" 또는 "300 ± 4"
|
||||
const match = spec.match(/^([\d.]+)\s*±\s*([\d.]+)$/);
|
||||
if (!match) return '적합'; // 파싱 실패 시 기본 적합
|
||||
|
||||
const [, targetStr, toleranceStr] = match;
|
||||
const target = parseFloat(targetStr);
|
||||
const tolerance = parseFloat(toleranceStr);
|
||||
|
||||
const min = target - tolerance;
|
||||
const max = target + tolerance;
|
||||
|
||||
return value >= min && value <= max ? '적합' : '부적합';
|
||||
};
|
||||
Reference in New Issue
Block a user