+
+ 도시침수예방사업 {id ? "수정" : "등록"}
+
+ {notice && (
+
+ {notice}
+
+ )}
+
+ 기본정보
+
+ {
+ const code = String(value);
+ setCtpvCd(code);
+ setSggCd("0");
+ setForm((f) => ({
+ ...f,
+ ctpvNm:
+ ctpv.find((o) => String(o.val) === code)?.text ?? null,
+ sggNm: null,
+ }));
+ }}
+ />
+ {
+ const code = String(value);
+ setSggCd(code);
+ setForm((f) => ({
+ ...f,
+ sggNm:
+ availableSgg.find((o) => String(o.val) === code)?.text ??
+ null,
+ }));
+ }}
+ />
+
+
+ {BASIC_FIELDS.map(([key, label, type]) => (
+
+ ))}
+
+
+
+ {DETAIL_META.map((meta) => {
+ const detail = form.details.find(
+ (item) => item.bizPrgrsSe === meta.code,
+ ) ?? {
+ bizPrgrsSe: meta.code,
+ rnwtrPumpst: [],
+ pumpImpd: [],
+ impdFclt: [],
+ };
+ return (
+
+
+ {meta.code} {meta.title}
+
+
+
+ setForm((current) => ({
+ ...current,
+ details: [
+ ...current.details.filter(
+ (item) => item.bizPrgrsSe !== meta.code,
+ ),
+ next,
+ ],
+ }))
+ }
+ />
+
+
+ );
+ })}
+
+
+
+ {id && (
+
+ )}
+
+
+ >
+ );
+}
diff --git a/apps/sn/src/features/ctyFldngPrvtnBiz/ui/CtyFldngPrvtnBizListPage.tsx b/apps/sn/src/features/ctyFldngPrvtnBiz/ui/CtyFldngPrvtnBizListPage.tsx
new file mode 100644
index 000000000..a91daaa51
--- /dev/null
+++ b/apps/sn/src/features/ctyFldngPrvtnBiz/ui/CtyFldngPrvtnBizListPage.tsx
@@ -0,0 +1,599 @@
+"use client";
+
+import { useCallback, useEffect, useMemo, useRef, useState } from "react";
+import { useRouter, useSearchParams } from "next/navigation";
+
+import {
+ SearchDiv,
+ SearchFormLeft,
+ SearchFormRight,
+ SelectBox,
+ UiTable,
+} from "@common/business_components/ui";
+import ListDiv from "@common/business_components/ui/list_div";
+import {
+ Button,
+ Input,
+ Label,
+ TableHead,
+ TableRow,
+} from "@common/components/ui";
+
+import { formatDate } from "../../common/util";
+import {
+ getAllCtyFldngPrvtnBusinesses,
+ getCtyFldngPrvtnBusinesses,
+ uploadCtyFldngPrvtnExcel,
+} from "../api/cty-fldng-prvtn-biz-api";
+import {
+ downloadCtyFldngPrvtnExcel,
+ parseCtyFldngPrvtnExcel,
+} from "../lib/cty-fldng-prvtn-biz-excel";
+import type {
+ CtyFldngPrvtnBiz,
+ CtyFldngPrvtnBizPage,
+} from "../model/cty-fldng-prvtn-biz-types";
+
+import LoadingOverlay from "@/components/ui/LoadingBar";
+import useStore from "@/store/useStore";
+
+const PAGE_SIZE = 10;
+const ACTION =
+ "rounded-sm bg-blue-600 px-4 py-2 text-sm font-medium !text-white hover:bg-blue-700";
+const ALL = { text: "전체", val: "0" };
+const EMPTY_PAGE: CtyFldngPrvtnBizPage = {
+ content: [],
+ totalElements: 0,
+ totalPages: 0,
+ number: 0,
+ size: PAGE_SIZE,
+};
+const DETAIL_FIELDS = [
+ "area",
+ "designFreqCn",
+ "rainStrCn",
+ "pvodPrfrncGoalRainStr",
+ "exlnPplSumLen",
+ "exlnPplNbldpLen",
+ "exlnPplImprvmLen",
+ "rnwtrPumpstSumCn",
+ "rnwtrPumpst",
+ "pumpImpdSumCn",
+ "pumpImpd",
+ "impdFcltSumCn",
+ "impdFclt",
+ "tnlDmtr",
+ "tnlLen",
+ "tnlRscpt",
+ "tnlExcvDpth",
+ "rnwtrInflwFcltCnt",
+ "mnhlSftyFcltCnt",
+ "tpco",
+ "gvexp",
+ "lcexp",
+ "bgngYmd",
+ "cmcnYmd",
+ "frstAprvCn",
+ "frstChgAprvCn",
+ "scndChgAprvCn",
+ "rmrkSrcCn",
+] as const;
+const DETAIL_LABELS = [
+ "면적",
+ "설계빈도",
+ "강우강도",
+ "방재성능목표",
+ "우수관로합계",
+ "우수관로신설",
+ "우수관로개량",
+ "빗물펌프장합계",
+ "빗물펌프장",
+ "펌프저류합계",
+ "펌프저류",
+ "저류시설합계",
+ "저류시설",
+ "터널직경",
+ "터널길이",
+ "터널저수용량",
+ "터널굴착깊이",
+ "빗물유입시설수",
+ "맨홀안전시설수",
+ "총사업비",
+ "국비",
+ "지방비",
+ "시작일",
+ "준공일",
+ "최초승인",
+ "1차변경승인",
+ "2차변경승인",
+ "비고출처",
+];
+const BASIC_HEADLIST = [
+ { id: "rowNumber", title: "NO", widthPercent: 4 },
+ { id: "seqNo", title: "순번", widthPercent: 5 },
+ { id: "stp", title: "단계", widthPercent: 6 },
+ { id: "ctpvNm", title: "시도", widthPercent: 7 },
+ { id: "sggNm", title: "시군구", widthPercent: 7 },
+ { id: "envoNm", title: "환경청", widthPercent: 7 },
+ { id: "dsgnYrCycl", title: "지정년도", widthPercent: 7 },
+ { id: "dsgnYmd", title: "지정일", widthPercent: 7 },
+ { id: "dsgnArea", title: "지정면적", widthPercent: 6 },
+ { id: "dsgnType", title: "지정유형", widthPercent: 7 },
+ { id: "drareaNm", title: "배수구역", widthPercent: 9 },
+ { id: "drndstNm", title: "배수분구", widthPercent: 9 },
+ { id: "pstn", title: "위치", widthPercent: 12 },
+ { id: "bizNm", title: "사업명", widthPercent: 14 },
+ { id: "bizCd", title: "사업코드", widthPercent: 8 },
+ { id: "prplPrst", title: "추진현황", widthPercent: 8 },
+ { id: "bizPrplPrst", title: "사업추진현황", widthPercent: 10 },
+ { id: "tpco", title: "총사업비", widthPercent: 7 },
+ { id: "gvexp", title: "국비", widthPercent: 7 },
+ { id: "lcexp", title: "지방비", widthPercent: 7 },
+];
+const TAIL_HEADLIST = [
+ { id: "picNm", title: "담당자", widthPercent: 7 },
+ { id: "picCnpl", title: "연락처", widthPercent: 8 },
+ { id: "excptnMttrCn", title: "특이사항", widthPercent: 14 },
+];
+const DETAIL_GROUPS = [
+ { code: "EM", title: "중점관리지역 지정", color: "#EDFEE7" },
+ { code: "MP", title: "하수도정비대책 수립", color: "#E7F4FE" },
+ { code: "DD", title: "실시설계", color: "#EDFEE7" },
+ { code: "CW", title: "시설공사", color: "#E7F4FE" },
+] as const;
+type Search = {
+ ctpvNm: string;
+ sggNm: string;
+ dsgnYmdFrom: string;
+ dsgnYmdTo: string;
+ prplPrst: string;
+ bizNm: string;
+};
+type TableRow = Record