78 lines
3.5 KiB
TypeScript
78 lines
3.5 KiB
TypeScript
|
|
"use client";
|
||
|
|
|
||
|
|
import ReportEngine, { ReportConfig } from "@/components/admin/report/ReportEngine";
|
||
|
|
|
||
|
|
const config: ReportConfig = {
|
||
|
|
key: "quality_report_v2",
|
||
|
|
title: "품질 리포트",
|
||
|
|
description: "품질/검사 다중 조건 비교 분석",
|
||
|
|
apiEndpoint: "/report/quality/data",
|
||
|
|
metrics: [
|
||
|
|
{ id: "defectQty", name: "불량수량", unit: "EA", color: "#ef4444" },
|
||
|
|
{ id: "defectRate", name: "불량률", unit: "%", color: "#f59e0b", isRate: true },
|
||
|
|
{ id: "inspQty", name: "검사수량", unit: "EA", color: "#3b82f6" },
|
||
|
|
{ id: "passQty", name: "합격수량", unit: "EA", color: "#10b981" },
|
||
|
|
{ id: "passRate", name: "합격률", unit: "%", color: "#8b5cf6", isRate: true },
|
||
|
|
{ id: "reworkQty", name: "재작업수량", unit: "EA", color: "#ec4899" },
|
||
|
|
{ id: "scrapQty", name: "폐기수량", unit: "EA", color: "#06b6d4" },
|
||
|
|
{ id: "claimCnt", name: "클레임건수", unit: "건", color: "#84cc16" },
|
||
|
|
],
|
||
|
|
groupByOptions: [
|
||
|
|
{ id: "item", name: "품목별" },
|
||
|
|
{ id: "defectType", name: "불량유형별" },
|
||
|
|
{ id: "process", name: "공정별" },
|
||
|
|
{ id: "inspector", name: "검사자별" },
|
||
|
|
{ id: "monthly", name: "월별" },
|
||
|
|
{ id: "quarterly", name: "분기별" },
|
||
|
|
{ id: "weekly", name: "주별" },
|
||
|
|
{ id: "daily", name: "일별" },
|
||
|
|
],
|
||
|
|
defaultGroupBy: "item",
|
||
|
|
defaultMetrics: ["defectQty"],
|
||
|
|
thresholds: [
|
||
|
|
{ id: "defectRate", label: "불량률 ≥", defaultValue: 5, unit: "%" },
|
||
|
|
{ id: "defectQty", label: "불량수량 ≥", defaultValue: 20, unit: "EA" },
|
||
|
|
],
|
||
|
|
filterFieldDefs: [
|
||
|
|
{ id: "item", name: "품목", type: "select", optionKey: "items" },
|
||
|
|
{ id: "defectType", name: "불량유형", type: "select", optionKey: "defectTypes" },
|
||
|
|
{ id: "process", name: "공정", type: "select", optionKey: "processes" },
|
||
|
|
{ id: "inspector", name: "검사자", type: "select", optionKey: "inspectors" },
|
||
|
|
{ id: "defectQty", name: "불량수량", type: "number" },
|
||
|
|
{ id: "defectRate", name: "불량률", type: "number" },
|
||
|
|
],
|
||
|
|
drilldownColumns: [
|
||
|
|
{ id: "date", name: "날짜", format: "date" },
|
||
|
|
{ id: "item", name: "품목" },
|
||
|
|
{ id: "defectType", name: "불량유형" },
|
||
|
|
{ id: "process", name: "공정" },
|
||
|
|
{ id: "inspector", name: "검사자" },
|
||
|
|
{ id: "inspQty", name: "검사수량", align: "right", format: "number" },
|
||
|
|
{ id: "defectQty", name: "불량수량", align: "right", format: "number" },
|
||
|
|
{ id: "defectRate", name: "불량률(%)", align: "right", format: "number" },
|
||
|
|
{ id: "passRate", name: "합격률(%)", align: "right", format: "number" },
|
||
|
|
],
|
||
|
|
rawDataColumns: [
|
||
|
|
{ id: "date", name: "날짜", format: "date" },
|
||
|
|
{ id: "item", name: "품목" },
|
||
|
|
{ id: "defectType", name: "불량유형" },
|
||
|
|
{ id: "process", name: "공정" },
|
||
|
|
{ id: "inspector", name: "검사자" },
|
||
|
|
{ id: "inspQty", name: "검사수량", align: "right", format: "number" },
|
||
|
|
{ id: "passQty", name: "합격수량", align: "right", format: "number" },
|
||
|
|
{ id: "defectQty", name: "불량수량", align: "right", format: "number" },
|
||
|
|
{ id: "reworkQty", name: "재작업", align: "right", format: "number" },
|
||
|
|
{ id: "scrapQty", name: "폐기", align: "right", format: "number" },
|
||
|
|
],
|
||
|
|
enrichRow: (d) => ({
|
||
|
|
...d,
|
||
|
|
defectRate: d.inspQty > 0 ? parseFloat((d.defectQty / d.inspQty * 100).toFixed(1)) : 0,
|
||
|
|
passRate: d.inspQty > 0 ? parseFloat((d.passQty / d.inspQty * 100).toFixed(1)) : 0,
|
||
|
|
}),
|
||
|
|
emptyMessage: "품질 데이터가 없습니다",
|
||
|
|
};
|
||
|
|
|
||
|
|
export default function QualityReportPage() {
|
||
|
|
return <ReportEngine config={config} />;
|
||
|
|
}
|