diff --git a/apps/as/src/pages/instl-sncn/ui/cnfm-regist-page.tsx b/apps/as/src/pages/instl-sncn/ui/cnfm-regist-page.tsx index af9806488..aab93e671 100644 --- a/apps/as/src/pages/instl-sncn/ui/cnfm-regist-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/cnfm-regist-page.tsx @@ -1220,7 +1220,7 @@ function CnfmRegistPage() { {/* ── 필수 첨부파일 ── */}
-

첨부파일

+

필수 첨부파일

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 6593ee011..4fa68e474 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 @@ -1,11 +1,14 @@ "use client"; +/* eslint-disable @typescript-eslint/no-explicit-any, import/order */ + import { useRouter } from "next/navigation"; import { useQuery } from "@tanstack/react-query"; import { Button } from "@common/components"; import { InstlSncnApi } from "@/entities/instl-sncn"; import { dayjs } from "@/shared/lib"; +import { PROXY_HOST } from "@/shared/config"; import "./cnfm-page.css"; @@ -25,15 +28,30 @@ function CnfmViewPage({ id }: { id: string }) { return
상세 정보를 찾을 수 없습니다.
; } - const data = query.data; + const data = query.data as any; + + // support API shape where payload includes detDto + lists + const det = data.detDto ?? data; + const bizSclList = data.bizSclList ?? []; + const bizCstList = data.bizCstList ?? []; + const cklstResultList = data.cklstResultList ?? []; + const esntlFileList = data.esntlFileList ?? []; + const etcFileList = data.etcFileList ?? []; + + const fmt = (v: number | null | undefined) => + typeof v === "number" ? v.toLocaleString() : v === null || v === undefined ? "" : String(v); + + const indentPx = (indNm: string | undefined) => { + if (!indNm) return 0; + const spaces = indNm.length - indNm.trimStart().length; + return (spaces / 4) * 16; + }; return (

설치인가 상세보기

-

- 문서번호: {data.instlSncnDocNo} -

+

문서번호: {det.instlSncnDocNo}

@@ -42,27 +60,25 @@ function CnfmViewPage({ id }: { id: string }) {
- + - + - + - + - + - + - +
사업명{data.bizNm || "-"}{det.bizNm || "-"} 업무구분{data.taskSeCdNm || data.taskSeComCd || "-"}{det.taskSeCdNm || det.taskSeComCd || "-"}
사업기간 - {(data.bizBgngYr || "-") + " ~ " + (data.bizEndYr || "-")} - {(det.bizBgngYr || "-") + " ~ " + (det.bizEndYr || "-")} 진행상태{data.prgrsSttsCdNm || data.prgrsSttsComCd || "-"}{det.prgrsSttsCdNm || det.prgrsSttsComCd || "-"}
행정동ID{data.dongId || "-"}{det.dongId || "-"} 예산사업코드{data.bgtBizCd || "-"}{det.bgtBizCd || "-"}
사업내용{data.bizCn || "-"}{det.bizCn || "-"}
@@ -74,27 +90,27 @@ function CnfmViewPage({ id }: { id: string }) { 신청자명 - {data.aplcntNm || "-"} + {det.aplcntNm || "-"} 신청자 연락처 - {data.aplcntMblTelno || "-"} + {det.aplcntMblTelno || "-"} 신청자 소속 - {data.aplcntOgdpNm || "-"} + {det.aplcntOgdpNm || "-"} 신청자 이메일 - {data.aplcntEmlAddr || "-"} + {det.aplcntEmlAddr || "-"} 설계자명 - {data.dsgnrNm || "-"} + {det.dsgnrNm || "-"} 설계자 연락처 - {data.dsgnrTelno || "-"} + {det.dsgnrTelno || "-"} 설계자 소속 - {data.dsgnrOgdpNm || "-"} + {det.dsgnrOgdpNm || "-"} 설계자 이메일 - {data.dsgnrEmlAddr || "-"} + {det.dsgnrEmlAddr || "-"} @@ -106,20 +122,200 @@ function CnfmViewPage({ id }: { id: string }) { 등록일시 - {data.regDt ? dayjs(data.regDt).format("YYYY-MM-DD HH:mm:ss") : "-"} + {det.regDt ? dayjs(det.regDt).format("YYYY-MM-DD HH:mm:ss") : "-"} 수정일시 - {data.mdfcnDt ? dayjs(data.mdfcnDt).format("YYYY-MM-DD HH:mm:ss") : "-"} + {det.mdfcnDt ? dayjs(det.mdfcnDt).format("YYYY-MM-DD HH:mm:ss") : "-"} 등록자명 - {data.rgtrNm || "-"} + {det.rgtrNm || "-"} 첨부파일그룹ID - {data.atchFileGroupId || "-"} + {det.atchFileGroupId || "-"}
+ {/* 사업규모 */} +
+

사업규모

+
+ + + + + + + + + + + + {bizSclList.length === 0 ? ( + + + + ) : ( + 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; + return ( + + + + + + + + ); + }) + )} + +
구분기본계획(A)예산반영(B)금회설계시(C)증감(C-B)
조회된 사업규모 항목이 없습니다.
{node.cnstpSeCdNm}
{fmt(a)}
{fmt(b)}
{fmt(c)}
{diff > 0 ? `+${fmt(diff)}` : fmt(diff)}
+
+
+ + {/* 총사업비 */} +
+

총사업비 (단위: 백만원)

+
+ + + + + + + + + + + + + {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; + + return ( + + {node.treeLevel <= 2 ? ( + + ) : ( + <> + + + + )} + + + + + + + + ); + })} + +
구분예산반영(A)표준사업비(B)금회설계시(C)증감%
{node.acntgSeCdNm}{node.acntgSeCdNm}
{fmt(a)}
{fmt(b)}
{fmt(c)}
{diff > 0 ? `+${fmt(diff)}` : fmt(diff)}
{b !== 0 ? `${Math.round((diff / b) * 100)}%` : "-"}
+
+
+ + {/* 체크리스트 */} +
+

체크리스트

+
+ + + + + + + + + + {cklstResultList.length === 0 ? ( + + + + ) : ( + cklstResultList.map((row: any) => ( + + + + + + )) + )} + +
검토항목주요 검토내용검토 결과
조회된 체크리스트 항목이 없습니다.
{row.cklstArtclNm}{row.treeLevel > 1 ? "└ " : ""}{row.rvwCn}{row.bchckUseYn === "Y" ? (row.rvwRsltAnmlyYn === "Y" ? "예" : row.rvwRsltAnmlyYn === "N" ? "아니오" : "-") : "-"}
+
+
+ + {/* 첨부파일 */} +
+

필수 첨부파일

+
+ + + + + + + + + + {esntlFileList.length === 0 ? ( + + + + ) : ( + esntlFileList.map((f: any) => ( + + + + + + )) + )} + +
필수 자료명파일형식파일
조회된 필수 첨부파일 항목이 없습니다.
+
+ {f.esntlAtchFileNm} + {f.esntlAtchYn === "Y" ? * : null} +
+
{(f.esntlAtchFileRmrk || "").replaceAll(",", "/") || "-"} + {f.atflCd ? ( + {f.orgnlFileNm || "다운로드"} + ) : ( + 첨부없음 + )} +
+
+ +

기타 첨부파일

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