From 49ec6423bdcbf4f2e7c55a3311a1100c2e695a97 Mon Sep 17 00:00:00 2001 From: jangwoong Date: Fri, 29 May 2026 13:25:16 +0900 Subject: [PATCH] =?UTF-8?q?[st=20frontend]=20as=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EB=B7=B0=20=EC=A0=95=EB=B3=B4=20=ED=91=9C=EC=8B=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/instl-sncn/ui/cnfm-view-page.tsx | 229 ++++++++++++------ apps/as/src/shared/lib/file-utils.ts | 12 + 2 files changed, 172 insertions(+), 69 deletions(-) create mode 100644 apps/as/src/shared/lib/file-utils.ts diff --git a/apps/as/src/pages/instl-sncn/ui/cnfm-view-page.tsx b/apps/as/src/pages/instl-sncn/ui/cnfm-view-page.tsx index 4fa68e474..98552b0ab 100644 --- a/apps/as/src/pages/instl-sncn/ui/cnfm-view-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/cnfm-view-page.tsx @@ -9,6 +9,7 @@ import { Button } from "@common/components"; import { InstlSncnApi } from "@/entities/instl-sncn"; import { dayjs } from "@/shared/lib"; import { PROXY_HOST } from "@/shared/config"; +import { formatFileSize } from "@/shared/lib/file-utils"; import "./cnfm-page.css"; @@ -47,6 +48,8 @@ function CnfmViewPage({ id }: { id: string }) { return (spaces / 4) * 16; }; + /* formatFileSize moved to shared lib: @/shared/lib/file-utils */ + return (
@@ -61,25 +64,26 @@ function CnfmViewPage({ id }: { id: string }) { 사업명 {det.bizNm || "-"} - 업무구분 - {det.taskSeCdNm || det.taskSeComCd || "-"} - - - 사업기간 - {(det.bizBgngYr || "-") + " ~ " + (det.bizEndYr || "-")} - 진행상태 - {det.prgrsSttsCdNm || det.prgrsSttsComCd || "-"} - - - 행정동ID - {det.dongId || "-"} - 예산사업코드 - {det.bgtBizCd || "-"} + 사업기간 + {(det.bizBgngYr || "-") + " ~ " + (det.bizEndYr || "-")} 사업내용 {det.bizCn || "-"} + + 업무구분 + {det.taskSeCdNm || det.taskSeComCd || "-"} + 행정동ID + {det.dongId || "-"} + + + 진행상태 + {det.prgrsSttsCdNm || det.prgrsSttsComCd || "-"} + 예산사업코드 + {det.bgtBizCd || "-"} + +
@@ -158,16 +162,16 @@ function CnfmViewPage({ id }: { id: string }) { ) : ( bizSclList.map((node: any) => { const pl = indentPx(node.indCnstpSeCdNm); - const a = Number(node.bscPlanQty) || 0; - const b = Number(node.bgtRfltQty) || 0; - const c = Number(node.tstmDesignQty) || 0; - const diff = c - b; + const bscPlanQty = Number(node.bscPlanQty) || 0; + const budgetReflct = Number(node.bgtRfltQty) || 0; + const tstmDesignQty = Number(node.tstmDesignQty) || 0; + const diff = tstmDesignQty - budgetReflct; return ( {node.cnstpSeCdNm} -
{fmt(a)}
-
{fmt(b)}
-
{fmt(c)}
+
{fmt(bscPlanQty)}
+
{fmt(budgetReflct)}
+
{fmt(tstmDesignQty)}
{diff > 0 ? `+${fmt(diff)}` : fmt(diff)}
); @@ -185,38 +189,70 @@ function CnfmViewPage({ id }: { id: string }) { - - - - - - + + + + + + + + + {bizCstList.map((node: any) => { + const pl = indentPx(node.indAcntgSeCdNm); - const a = Number(node.bscPlanAmt) || 0; - const b = Number(node.bgtRfltAmt) || 0; - const c = Number(node.tstmDesignAmt) || 0; - const diff = c - b; - + const bscPlanAmt = Number(node.bscPlanAmt) || 0; + const budgetReflct = Number(node.bgtRfltAmt) || 0; + const tstmDesignAmt = Number(node.tstmDesignAmt) || 0; + const diff = tstmDesignAmt - budgetReflct; + const showSubIcon = node.treeLevel >= 4; + const isLeaf = !bizCstList.some((n: any) => n.upAcntgSeCd === node.acntgSeCd); return ( - + {node.treeLevel <= 2 ? ( ) : ( <> - + )} - - - - - + + + + + ); })} @@ -234,7 +270,25 @@ function CnfmViewPage({ id }: { id: string }) { - + + + + + @@ -243,29 +297,49 @@ function CnfmViewPage({ id }: { id: string }) { ) : ( - cklstResultList.map((row: any) => ( - - - - - - )) + cklstResultList.map((row: any) => { + const key = `${row.cklstSn}_${row.cklstRvwSn}`; + const hasResult = row.rvwRsltAnmlyYn === "Y" || row.rvwRsltAnmlyYn === "N"; + const showRadios = row.bchckUseYn === "Y" || hasResult; + + return ( + + + + {!showRadios ? ( + <> + + + + ) : ( + <> + + + + )} + + ); + }) )}
구분예산반영(A)표준사업비(B)금회설계시(C)증감% + 구분 + 예산반영(A)표준사업비(B)금회설계시(C)증감
(C-B)%
{node.acntgSeCdNm}{node.acntgSeCdNm} + {showSubIcon && └} + {node.acntgSeCdNm} +
{fmt(a)}
{fmt(b)}
{fmt(c)}
{diff > 0 ? `+${fmt(diff)}` : fmt(diff)}
{b !== 0 ? `${Math.round((diff / b) * 100)}%` : "-"}
+
{fmt(bscPlanAmt)}
+
+
{fmt(budgetReflct)}
+
+
{fmt(tstmDesignAmt)}
+
+
{diff > 0 ? `+${fmt(diff)}` : fmt(diff)}
+
+
{budgetReflct !== 0 ? `${Math.round((diff / budgetReflct) * 100)}%` : "-"}
+
검토항목 주요 검토내용검토 결과검토 결과(-)
+ + + + + +
조회된 체크리스트 항목이 없습니다.
{row.cklstArtclNm}{row.treeLevel > 1 ? "└ " : ""}{row.rvwCn}{row.bchckUseYn === "Y" ? (row.rvwRsltAnmlyYn === "Y" ? "예" : row.rvwRsltAnmlyYn === "N" ? "아니오" : "-") : "-"}
{row.cklstArtclNm}{row.treeLevel > 1 ? "└ " : ""}{row.rvwCn}-- + + + +
- {/* 첨부파일 */} + {/* 필수 첨부파일 */}

필수 첨부파일

- - - + + + @@ -282,7 +356,6 @@ function CnfmViewPage({ id }: { id: string }) { {f.esntlAtchYn === "Y" ? * : null} - + )) )}
필수 자료명파일형식파일필수 자료명파일명크기
{(f.esntlAtchFileRmrk || "").replaceAll(",", "/") || "-"} {f.atflCd ? ( {f.orgnlFileNm || "다운로드"} @@ -290,30 +363,48 @@ function CnfmViewPage({ id }: { id: string }) { 첨부없음 )}
{formatFileSize(f.atflFlieSz)}
+
-

기타 첨부파일

- {etcFileList.length === 0 ? ( -
등록된 기타첨부파일이 없습니다.
- ) : ( - - )} + {/* 기타 첨부파일 */} +
+

기타 첨부파일

+
+ + + + + + + + + {etcFileList.length === 0 ? ( + + + + ) : ( + etcFileList.map((f: any) => ( + + + + + )) + )} + +
파일명크기
등록된 기타첨부파일이 없습니다.
+ {f.orgnlFileNm ? ( + {f.orgnlFileNm} + ) : ( + {f.physFileNm || f.atflId} + )} + {formatFileSize(f.atflFlieSz)}
+
diff --git a/apps/as/src/shared/lib/file-utils.ts b/apps/as/src/shared/lib/file-utils.ts new file mode 100644 index 000000000..b92a46fae --- /dev/null +++ b/apps/as/src/shared/lib/file-utils.ts @@ -0,0 +1,12 @@ +/* Shared file utilities for apps/as */ + +/** 파일 크기는 byte 단위로 제공된다고 가정하고 크기에 따라서 KB, MB 단위로 표시 */ +export const formatFileSize = (bytes?: number | null): string => { + if (bytes === null || bytes === undefined) return "-"; + const b = Number(bytes) || 0; + if (b >= 1024 * 1024) return `${(b / 1024 / 1024).toFixed(1)}MB`; + if (b >= 1024) return `${Math.round(b / 1024)}KB`; + return `${b}B`; +}; + +export default { formatFileSize };