From 8423bd9dac537825a45093c94002995ae5a3bee5 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Mon, 19 May 2025 17:13:43 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A7=80=EB=8F=84=EC=A0=90=EA=B2=80=20?= =?UTF-8?q?=ED=98=84=ED=99=A9=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prfmncReg/chkgdnReg/TableHead.tsx | 1 + .../ruseFcltMng/prfmncReg/chkgdnReg/page.tsx | 16 +- .../prfmncSttn/chkgdnSttn/page.tsx | 74 +++++---- .../chkgdnReg/rainChkgdn/headList.tsx | 3 + .../chkgdnReg/rswrtChkgdn/headList.tsx | 1 + .../chkgdnSttn/rainChkgdnSttn/excel.tsx | 41 +++++ .../chkgdnSttn/rainChkgdnSttn/headList.tsx | 5 +- .../chkgdnSttn/rainChkgdnSttn/index.tsx | 88 ++++++++--- .../chkgdnSttn/rswtChkgdnSttn/excel.tsx | 34 +++++ .../chkgdnSttn/rswtChkgdnSttn/headList.tsx | 142 ++++++++++++++++++ .../chkgdnSttn/rswtChkgdnSttn/index.tsx | 108 +++++++++++++ apps/wr/app/store/store.tsx | 11 +- apps/wr/components/lib/func/TableData.tsx | 20 ++- .../ui/modal/chkgd/chkgdModal/chkgdModal.tsx | 48 +++++- .../chkgdTable/rainChkgd/rainChkgdTable.tsx | 64 ++++++-- .../chkgdTable/rswtChkgd/rswtChkgdTable.tsx | 41 ++++- apps/wr/public/sample_rainChkSttn.xlsx | Bin 0 -> 9418 bytes apps/wr/public/sample_rswtChkSttn.xlsx | Bin 0 -> 9742 bytes 18 files changed, 611 insertions(+), 86 deletions(-) create mode 100644 apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/excel.tsx create mode 100644 apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/excel.tsx create mode 100644 apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/headList.tsx create mode 100644 apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/index.tsx create mode 100644 apps/wr/public/sample_rainChkSttn.xlsx create mode 100644 apps/wr/public/sample_rswtChkSttn.xlsx diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead.tsx index 978805d9d..130578654 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead.tsx @@ -10,6 +10,7 @@ export const headMakeprfmnc = ( <> {upHeadList + .filter((data) => data.visible != false) .map((head: TableUpperProps) => !head.upSequnce ? ( { if (!rainChkgdn.isInit) { rainChkInit("2024", "0"); - setIsModal({ data: {}, open: rainChkgdn.isModalClose }); + isRainSttn(false) + + setIsModal({ data: {}, open: false }); setIsRegExcel(false); } if (!rswtChkgdn.isInit) { rswtChkgdnInit("2024", "0"); - setIsModal({ data: {}, open: rainChkgdn.isModalClose }); + setIsModal({ data: {}, open: false }); setIsRegExcel(false); } }, [rainChkgdn.isInit, rainChkInit]); @@ -136,7 +139,6 @@ export default function Page() { const clickDelete = (data: number[],selFcltDiv:string) => { - if (data.length > 0) { if(selFcltDiv === "RNB"){ rainChkDelete(data); @@ -147,15 +149,17 @@ export default function Page() { }; const chkUpdateTable =(selFcltDiv:string) =>{ if(selFcltDiv === "RNB"){ + rainChkDetilUpdate(updateRainDetail) }else{ - console.log("updateRswtDetail ", updateRswtDetail) rswtChkDetilsUpdate(updateRswtDetail) } } + + return (
@@ -236,12 +240,14 @@ export default function Page() { deleteData={setDeleteIdx} detailUp={setUpdateRainDetail} handleClick={handleClick} + rainChkData={rainChkgdn.rainChk} /> ) : ( ) } diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/chkgdnSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/chkgdnSttn/page.tsx index eb943ca2c..8716c5cbf 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/chkgdnSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/chkgdnSttn/page.tsx @@ -30,17 +30,18 @@ import { Toaster } from "react-hot-toast"; export default function Page() { const { code, - rainChkgdn, - rswtChkgdn, + rainChkSttn, + rswtChkSttn, - rainChkInit, - rswtChkgdnInit, - rainChkHeadChange, - rswtChkHeadChange + + rainChkSttnInit, + rainChkSttnSearch, + rswtChkSttnInit, + isRainSttn, + isRswtSttn } = useWrStore((state) => { return state; }); - const [isRegExcel, setIsRegExcel] = useState(false); const [searchTxt, setSearchTxt] = useState(); const [selFcltDiv, setSelFcltDiv] = useState("RNB"); const [isModal, setIsModal] = useState({ @@ -48,33 +49,26 @@ export default function Page() { data: {}, }); const cellClick = () => { - if (searchTxt) rainChkInit(searchTxt, "0"); + if (searchTxt) rainChkSttnSearch(searchTxt, "0"); }; useEffect(() => { - if (!rainChkgdn.isInit) { - rainChkInit("2024", "0"); + if (!rainChkSttn.isInit) { + isRainSttn(true) + rainChkSttnInit( "0"); setIsModal({ data: {}, open: false }); } - }, [rainChkgdn.isInit, rainChkInit]); + }, [rainChkSttn.isInit, rainChkSttnInit]); useEffect(() => { - if (!rswtChkgdn.isInit) { - rswtChkgdnInit("2024", "0"); + if (!rswtChkSttn.isInit) { setIsModal({ data: {}, open: false }); + rswtChkSttnInit( "0"); + isRswtSttn(true) } - },[rswtChkgdn.isInit, rswtChkgdnInit]) + },[rswtChkSttn.isInit, rswtChkSttnInit]) - useEffect(() => { - rainChkgdn.isSttn=true - rswtChkgdn.isSttn=true - if (rainChkgdn.isSttn &&rswtChkgdn.isSttn) { - rainChkHeadChange({rainChkgdn}, false); - rswtChkHeadChange({rswtChkgdn}, false); - } - }, [rainChkgdn.isSttn ,rswtChkgdn.isSttn]); - @@ -84,8 +78,32 @@ export default function Page() { }, [isModal] ); +const excelDown=() =>{ + console.log("excelDown" , rainChkSttn.sttnExcelList) + if(rainChkSttn.sttnExcelList && selFcltDiv === "RNB"){ + excelDownload( + rainChkSttn.sttnExcelList, + "빗물이용시설 지도점검 현황", + "sample_rainChkSttn.xlsx", + "A1:Q1", + 3 + ); + + + }else if(rswtChkSttn.sttnExcelList && selFcltDiv === "RST"){ + console.log("rswtChkSttn " , rswtChkSttn.sttnExcelList) + excelDownload( + rswtChkSttn.sttnExcelList, + "중수도시설 지도점검 현황", + "sample_rswtChkSttn.xlsx", + "A1:Q1", + 3 + ); + } +} + return (
@@ -105,11 +123,11 @@ export default function Page() { className={"col-span-3 w-full h-full text-2xl"} label={"시설구분"} selectClass={""} - selectArray={rainChkgdn.fcltDiv} + selectArray={rainChkSttn.fcltDiv} onSelectValue={(val: string | number) => setSelFcltDiv(String(val)) } - value={selFcltDiv ?? rainChkgdn.fcltDiv[0]?.val} + value={selFcltDiv ?? rainChkSttn.fcltDiv[0]?.val} /> @@ -125,8 +143,8 @@ export default function Page() {
-
@@ -142,12 +160,14 @@ export default function Page() { deleteData={() => {}} detailUp={() => {}} handleClick={handleClick} + rainChkData={rainChkSttn.rainChkRes} /> ) : ( {}} deleteRswtData={() => {}} handleRswtClick={handleClick} + rswtChkData={rswtChkSttn.rswtChkRes} /> )} diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList.tsx index 6a60ec582..3729ab987 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList.tsx @@ -33,6 +33,8 @@ export const rainChkZod = z.object({ chkgdnPk: z.number().nullable(), bdstRuseFcltFk: z.number(), chckYmd: z.string(), + cityText:z.string().nullish(), + sggText:z.string().nullish(), prcsCpct: z.number().nullable(), spwtPositn: z.string().nullable(), regDt: z.string().nullable(), @@ -122,6 +124,7 @@ export const rainHeadNmExport: chHeadType[] = [ export const rainChkgdnHeadListExport: TableUpperProps[] = [ { id: "order", title: "순번", rowSpan: true }, + { id: "checkBox", title: "선택", rowSpan: true }, { id: "cityText", title: "시도", rowSpan: true }, { id: "sggText", title: "시군구", rowSpan: true }, { id: "bdstNm", title: "시설명", rowSpan: true }, diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList.tsx index e37708cc0..fe40fb441 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList.tsx @@ -116,6 +116,7 @@ export const rswtHeadNmExport: chHeadType[] = [ export const rswtChkHeadListExport: TableUpperProps[] = [ { id: "order", title: "순번", rowSpan: true }, + { id: "checkBox", title: "선택", rowSpan: true }, { id: "cityText", title: "시도" ,rowSpan: true }, { id: "sggText", title: "시군구",rowSpan: true }, { id: "bdstNm", title: "시설명" ,rowSpan: true}, diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/excel.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/excel.tsx new file mode 100644 index 000000000..78e0b878f --- /dev/null +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/excel.tsx @@ -0,0 +1,41 @@ +import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; + +type rainSttnExcelType = { + bdstInfoPk: number; + ctpvCd: 1; + sggCd: 1001; + daddr: "string3"; + bdstNm: "string"; + frstArchPrmsnDt: "2025-03-25"; + archArea: 0; + regDt: "2025-04-16"; + rgtr: null; + mdfcnDt: "2025-04-16"; + mdfr: null; +}; +export const buildingExcelRainSttn = (excelList: any[]) => { + const excelData: string[][] = []; + excelList.forEach((item, index) => { + excelData.push([ + String(item.cityText) ?? "", + String(item.sggText) ?? "", + String(item.bdstNm) ?? "", + item.operMngCd || String(item.operMngCd)===null? String(item.operMngCd) : "", + String(item.oilqMeasMthd) ?? "", + String(item.anlOperCst) ?? "", + String(item.dtfcltCpct) ?? "", + String(item.chckYmd) ?? "", + String(item.utztnUsgCd) ?? "", + String(item.totalSplyUswtrUtztnQnt) ?? "", + String(item.totalRuseFcltUtztnQnt) ?? "", + String(item.ph) ?? "", + String(item.trbt) ?? "", + String(item.grssClfg) ?? "", + String(item.vltnDt) ?? "", + String(item.vltnMttr) ?? "", + String(item.levyAmt) ?? "", + ]); + }); + + return excelData; +}; diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/headList.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/headList.tsx index 4cb16df01..768de0776 100644 --- a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/headList.tsx +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/headList.tsx @@ -2,7 +2,6 @@ import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; export const rainChkgdnHeadSttnExport: TableUpperProps[] = [ { id: 'order', title: "순번", rowSpan: true }, - { id: "checkBox", title: "체크박스", rowSpan: true }, { id: "cityText", title: "시도", rowSpan: true }, { id: "sggText", title: "시군구", rowSpan: true }, { id: "bdstNm", title: "시설명", rowSpan: true }, @@ -59,7 +58,7 @@ export const rainChkgdnHeadSttnExport: TableUpperProps[] = [ }, ]; -export const ruseHeadListExport: TableUpperProps[] = [ +export const ruseSttnHeadListExport: TableUpperProps[] = [ { id: "utztnUsgCd", title: "이용용도" }, { id: "ruseTotal", title: "계", upName: "ruseWater", upSequnce: 1 }, { id: "ruse01", title: "1월", upName: "ruseWater", upSequnce: 2 }, @@ -76,7 +75,7 @@ export const ruseHeadListExport: TableUpperProps[] = [ { id: "ruse12", title: "12월", upName: "ruseWater", upSequnce: 13 }, ]; -export const splHeadListExport: TableUpperProps[] = [ +export const splSttnHeadListExport: TableUpperProps[] = [ { id: "utztnUsgCd", title: "이용용도" }, { id: "splTotal", title: "계", upName: "splWater", upSequnce: 1 }, { id: "spl01", title: "1월", upName: "splWater", upSequnce: 2 }, diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx index 714057be0..9fd948856 100644 --- a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx @@ -1,54 +1,66 @@ import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; -import { - rainHeadNmExport, - rainChkgdnHeadListExport, - type chHeadType, -} from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; import { type TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { getFetch } from "@/components/lib/api"; import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; import type { SelectDataType } from "@common/business_components/ui"; +import { rainChkgdnHeadSttnExport, ruseSttnHeadListExport, splSttnHeadListExport } from "./headList"; +import { rainHeadNmExport, type chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; +import { buildingExcelRainSttn } from "./excel"; const fcltDiv = [ { val: "RST", text: "중수도시설" }, { val: "RNB", text: "빗물이용시설" }, ]; -const rainHeadNm = rainHeadNmExport; -const rainChkgdnHeadList = rainChkgdnHeadListExport; + +const rainChkgdnHeadList = rainChkgdnHeadSttnExport; +const ruseHeadList = ruseSttnHeadListExport; +const splHeadList = splSttnHeadListExport; +const rainHeadNm = rainHeadNmExport const rainChk: rainChkZodType[] = []; export type rainChkSttnState = { rainChkSttn: { - rainChkgdnHeadList: TableUpperProps[]; - rainChkSttn: rainChkZodType[]; - rainHeadNm: chHeadType[]; + rainChkRes: rainChkZodType[]; fcltDiv: SelectDataType[]; + rainChkgdnHeadList: TableUpperProps[]; + rainHeadNm:chHeadType[]; + ruseHeadList: TableUpperProps[]; + splHeadList: TableUpperProps[]; + sttnExcelList:[] isInit: boolean; + isSttn:boolean; }; }; type rainChkSttnActions = { - rainChkSttnInit: (searchTxt: string, sggCd: string) => void; + rainChkSttnInit: ( sggCd: string) => void; + rainChkSttnSearch: (searchTxt: string, sggCd: string) => void; + isRainSttn:(isSttn:boolean) => void; + getRainSttnExcel:(excelList:rainChkZodType[]) => void; }; export type rainChkSttnType = rainChkSttnState & rainChkSttnActions; export const rainChkSttnStateExport: rainChkSttnState = { rainChkSttn: { - rainChkgdnHeadList: rainChkgdnHeadList, - rainHeadNm: rainHeadNm, - rainChkSttn: [], + rainChkRes: [], fcltDiv: fcltDiv, + rainChkgdnHeadList: rainChkgdnHeadList, + ruseHeadList: ruseHeadList, + splHeadList: splHeadList, + rainHeadNm:rainHeadNm, isInit: false, + sttnExcelList:[], + isSttn:false, }, }; const initFetch = async (txt: string | undefined, sgg: string | undefined) => { const rainRes = await getFetch( "wr", - `/reuseChk/rainy` + (txt ? `/${txt}` : "2024") + (sgg ? `/${sgg}` : "/0") + `/reuseChk/rainy/` + (txt ? `${txt}` : "2024") + (sgg ? `/${sgg}` : "/0") ); return rainRes; }; @@ -56,7 +68,22 @@ export const rainChkSttnActionsExport: (set: any) => rainChkSttnActions = ( set: any ) => { return { - rainChkSttnInit: async (searchTxt: string, sggCd: string) => { + rainChkSttnInit: async ( sggCd: string) => { + try { + const rainChkRes = await initFetch(undefined, sggCd); + + return set((state: rainChkSttnState) => ({ + ...state, + rainChkSttn: { + ...state.rainChkSttn, + rainChkRes:rainChkRes + }, + })); + } catch (error) { + console.log(error); + } + }, + rainChkSttnSearch: async (searchTxt: string, sggCd: string) => { try { const rainChkRes = await initFetch(searchTxt, sggCd); @@ -70,6 +97,33 @@ export const rainChkSttnActionsExport: (set: any) => rainChkSttnActions = ( } catch (error) { console.log(error); } - }, + },isRainSttn :(isSttn:boolean) =>{ + try { + return set((state: rainChkSttnState) => ({ + ...state, + rainChkSttn: { + ...state.rainChkSttn, + isSttn:isSttn + }, + })); + } catch (error) { + console.log(error); + } + },getRainSttnExcel: async (excelList:rainChkZodType[]) => { + try { + + const excelData = buildingExcelRainSttn(excelList) + + return set((state: rainChkSttnState) => ({ + ...state, + rainChkSttn: { + ...state.rainChkSttn, + sttnExcelList:excelData + }, + })); + } catch (error) { + console.log(error); + } + } }; }; diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/excel.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/excel.tsx new file mode 100644 index 000000000..ff104bc91 --- /dev/null +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/excel.tsx @@ -0,0 +1,34 @@ + +export const buildingExcelRswtSttn = (excelList: any[]) => { + const excelData: string[][] = []; + excelList.forEach((item, index) => { + excelData.push([ + String(item.cityText) ?? "", + String(item.sggText) ?? "", + String(item.bdstNm) ?? "", + item.operMngCd===null ? "":item.operMngCd, + String(item.anlOperCst) ?? "", + String(item.prcsCpct) ?? "", + item.spwtPositn===null ? "":item.spwtPositn, + item.chckYmd ?? "", + String(item.utztnUsgCd) ?? "", + String(item.splyUswtrUtztnQnt) ?? "", + String(item.ruseFcltUtztnQnt) ?? "", + String(item.grssClfgUswtr) ?? "", + String(item.combResdch) ?? "", + String(item.trbt) ?? "", + String(item.bod) ?? "", + String(item.smll) ?? "", + String(item.tn) ?? "", + String(item.tph) ?? "", + String(item.ph) ?? "", + String(item.clIonQnt) ?? "", + String(item.vltnDt) ?? "", + String(item.vltnMttr) ?? "", + String(item.levyAmt) ?? "", + ]); + }); + + return excelData; + }; + \ No newline at end of file diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/headList.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/headList.tsx new file mode 100644 index 000000000..f3b018d10 --- /dev/null +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/headList.tsx @@ -0,0 +1,142 @@ +import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; + +export const rswtChkSttnHeadListExport: TableUpperProps[] = [ + { id: "order", title: "순번", rowSpan: true }, + { id: "cityText", title: "시도", rowSpan: true }, + { id: "sggText", title: "시군구", rowSpan: true }, + { id: "bdstNm", title: "시설명", rowSpan: true }, + { id: "operMngCd", title: "운영관리형태", rowSpan: true }, + { id: "anlOperCst", title: "연간운영비(원/년)", rowSpan: true }, + { id: "prcsCpct", title: "처리용량(m³)", rowSpan: true }, + { id: "spwtPositn", title: "채수지점", rowSpan: true }, + { id: "chckYmd", title: "점검일", rowSpan: true }, + { id: "utztnUsgCd", title: "이용용도" }, + { id: "splyUswtrUtztnQnt", title: "연간보급수이용량(m³)", type: "number" }, + { id: "ruseFcltUtztnQnt", title: "연간중수도이용량(m³)", type: "number" }, + + { + id: "grssClfgUswtr", + title: "총대장균군수", + upName: "useQuilty", + upSequnce: 1, + type: "number", + }, + { + id: "combResdch", + title: "결합잔류염소", + upName: "useQuilty", + upSequnce: 2, + type: "number", + }, + { + id: "trbt", + title: "탁도", + upName: "useQuilty", + upSequnce: 3, + type: "number", + }, + { + id: "bod", + title: "BOD", + upName: "useQuilty", + upSequnce: 4, + type: "number", + }, + { + id: "smll", + title: "냄새", + upName: "useQuilty", + upSequnce: 5, + type: "number", + }, + { + id: "crmty", + title: "색도", + upName: "useQuilty", + upSequnce: 6, + type: "number", + }, + { id: "tn", title: "T-N", upName: "useQuilty", upSequnce: 7, type: "number" }, + { + id: "tph", + title: "T-P", + upName: "useQuilty", + upSequnce: 8, + type: "number", + }, + { id: "ph", title: "PH", upName: "useQuilty", upSequnce: 9, type: "number" }, + { + id: "clIonQnt", + title: "염화물", + upName: "useQuilty", + upSequnce: 10, + type: "number", + }, + + { + id: "vltnDt", + title: "부과일(위반일)", + upName: "feeHist", + upSequnce: 1, + type: "text", + }, + { + id: "vltnMttr", + title: "위반사항", + upName: "feeHist", + upSequnce: 2, + type: "text", + }, + { + id: "levyAmt", + title: "부과금액(천원)", + upName: "feeHist", + upSequnce: 3, + type: "number", + }, +]; + +export const rswtDetailSttnHeadListExport: TableUpperProps[] = [ + { id: "utztnUsgCd", title: "이용용도" }, + + { + id: "grssClfgUswtr", + title: "총대장균군수", + upName: "detailQulity", + upSequnce: 2, + }, + { + id: "combResdch", + title: "결합잔류염소", + upName: "detailQulity", + upSequnce: 3, + }, + { + id: "trbt", + title: "탁도", + upName: "detailQulity", + upSequnce: 4, + }, + { id: "bod", title: "BOD", upName: "detailQulity", upSequnce: 5 }, + { + id: "smll", + title: "냄새", + upName: "detailQulity", + upSequnce: 6, + }, + { + id: "crmty", + title: "색도", + upName: "detailQulity", + upSequnce: 7, + }, + { id: "tn", title: "T-N", upName: "detailQulity", upSequnce: 8}, + { id: "tph", title: "T-P", upName: "detailQulity", upSequnce: 9 }, + { id: "ph", title: "PH", upName: "detailQulity", upSequnce: 10 }, + { + id: "clIonQnt", + title: "염화물", + upName: "detailQulity", + upSequnce: 11, + }, +]; diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/index.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/index.tsx new file mode 100644 index 000000000..f1dbd6c6e --- /dev/null +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/index.tsx @@ -0,0 +1,108 @@ +import { rswtHeadNmExport } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList"; +import { rswtChkSttnHeadListExport, rswtDetailSttnHeadListExport } from "./headList"; +import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; +import type { sheetParameter } from "@common/business_components/ui"; +import type { rswtChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn"; +import { getFetch } from "@/components/lib/api"; +import { buildingExcelRswtSttn } from "./excel"; + +const rswtChkHeadList = rswtChkSttnHeadListExport; +const rswtDetailHeadList = rswtDetailSttnHeadListExport; +const rswtHeadNm = rswtHeadNmExport; + + +export type rswtChkSttnState = { + rswtChkSttn: { + rswtChkSttnHeadList: TableUpperProps[]; + rswtDetailSttnHeadList: TableUpperProps[]; + rswtSttnHeadNm: chHeadType[]; + sttnExcelList: []; + rswtChkRes: rswtChkZodType[]; + isInit: boolean; + isSttn: boolean; + }; +}; + +type rswtChkSttnActions = { + rswtChkSttnInit: ( sggCd: string) => void; + isRswtSttn: (isSttn:boolean) => void; + getRswtSttnExcel:(excelList:rswtChkZodType[]) => void; + +}; + +export type rswtChkSttnType = rswtChkSttnState & rswtChkSttnActions; + +export const rswtChkStateExport: rswtChkSttnState = { + rswtChkSttn: { + rswtChkSttnHeadList: rswtChkHeadList, + rswtDetailSttnHeadList: rswtDetailHeadList, + rswtSttnHeadNm: rswtHeadNm, + sttnExcelList: [], + rswtChkRes: [], + isInit: false, + isSttn:false, + }, +}; + +const initFetch = async (year: string | undefined, sgg: string | undefined) => { + const rswtChkRes = await getFetch( + "wr", + `/reuseChk/reuseWater/` + + (year ? `${year}` : "2024") + + (sgg ? `/${sgg}` : "/0") + ); + return rswtChkRes; +}; + + +export const rswtChkSttnActionsExport: (set: any) => rswtChkSttnActions = ( + set: any +) => { + return { + rswtChkSttnInit: async ( sggCd: string) => { + try { + const rswtChkRes = await initFetch("2024", sggCd); + return set((state: rswtChkSttnState) => ({ + ...state, + rswtChkSttn: { + ...state.rswtChkSttn, + rswtChkRes: rswtChkRes, + isInit: false, + }, + })); + } catch (error) { + console.log(error); + } + },isRswtSttn :(isSttn:boolean) =>{ + try { + return set((state: rswtChkSttnState) => ({ + ...state, + rswtChkSttn: { + ...state.rswtChkSttn, + isSttn:isSttn + }, + })); + } catch (error) { + console.log(error); + } + },getRswtSttnExcel: async (excelList:rswtChkZodType []) => { + try { + + const excelData = buildingExcelRswtSttn(excelList) + + return set((state: rswtChkSttnState) => ({ + ...state, + rswtChkSttn: { + ...state.rswtChkSttn, + sttnExcelList:excelData + }, + })); + } catch (error) { + console.log(error); + } + } + + + }; +}; diff --git a/apps/wr/app/store/store.tsx b/apps/wr/app/store/store.tsx index ab2e78277..23cba135d 100644 --- a/apps/wr/app/store/store.tsx +++ b/apps/wr/app/store/store.tsx @@ -83,6 +83,7 @@ import { type rainChkSttnState, type rainChkSttnType, } from "./prfmncSttn/chkgdnSttn/rainChkgdnSttn"; +import { rswtChkStateExport, rswtChkSttnActionsExport, type rswtChkSttnState, type rswtChkSttnType } from "./prfmncSttn/chkgdnSttn/rswtChkgdnSttn"; export type WrStore = comCodeType & pubFacType & @@ -96,7 +97,8 @@ export type WrStore = comCodeType & rainSttnType & rswtSttnType & htdflSttnType & - rainChkSttnType; + rainChkSttnType& + rswtChkSttnType; export const StoreZus = ( initState: comCodeState & @@ -111,7 +113,8 @@ export const StoreZus = ( rainSttnState & rswtSttnState & htdflSttnState & - rainChkSttnState + rainChkSttnState& + rswtChkSttnState = { ...comCodeStateExport, ...pubFacStateExport, @@ -126,6 +129,7 @@ export const StoreZus = ( ...rswtSttnStateExport, ...htdflSttnStateExport, ...rainChkSttnStateExport, + ...rswtChkStateExport, } ) => { return createStore()((set) => { @@ -149,7 +153,8 @@ export const StoreZus = ( ...rainSttnActionsExport(set), ...rswtSttnActionsExport(set), ...htdflSttnActionsExport(set), - ...rainChkSttnActionsExport(set) + ...rainChkSttnActionsExport(set), + ...rswtChkSttnActionsExport(set) }; }); }; diff --git a/apps/wr/components/lib/func/TableData.tsx b/apps/wr/components/lib/func/TableData.tsx index e5f6c00db..250a431da 100644 --- a/apps/wr/components/lib/func/TableData.tsx +++ b/apps/wr/components/lib/func/TableData.tsx @@ -97,7 +97,10 @@ export const chRowspanTable = ( <> {makeTableData.map((row, rowIndex) => ( - {headList.map((head) => { + {headList + .map((head) => { + + const key = head.id; const isMerged = head.rowSpan; const value = row[key]; @@ -120,7 +123,7 @@ export const chRowspanTable = ( rowSpan={rowspan} className="align-middle text-center whitespace-nowrap" > - {key === "chekcBox" ? ( + {key === "checkBox" ? ( @@ -164,3 +167,16 @@ export const chRowspanTable = ( ); }; + + + +export const headVisibleChange= (headList: TableUpperProps[] , isEdit :boolean) => { + return headList.forEach(( head) => { + if(head.edit!== undefined) + head.edit=isEdit; + if(head.id==='checkBox' ){ + head.visible=false + } + + }); +} \ No newline at end of file diff --git a/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx b/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx index 13da8a8bd..90f78ab1a 100644 --- a/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx +++ b/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx @@ -8,11 +8,23 @@ import type { splRuseWaterType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgd import type { rswtrPolutionsZode } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList"; import type { z } from "zod"; import React from "react"; +import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { - const { rainChkgdn, rswtChkgdn, rainChkGuidUpdate, rwstPolAndGuideUpdate } = - useWrStore((state) => state); + const { + rainChkgdn, + rswtChkgdn, + rainChkSttn, + rswtChkSttn, + rainChkGuidUpdate, + rwstPolAndGuideUpdate, + } = useWrStore((state) => state); const [guidData, setGuidData] = useState(); + const [headList, setHeadList] = useState<{ + splHeadList: TableUpperProps[]; + ruseHeadList: TableUpperProps[]; + rswtDetailHeadList: TableUpperProps[]; + }>({ splHeadList: [], ruseHeadList: [], rswtDetailHeadList: [] }); const [polutionData, setPolutionData] = useState>({ "1": [] as z.infer[], @@ -43,6 +55,30 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { clIonQnt: 0, }); + ///현황일 경우 input 비활성화 한다. + useEffect(() => { + if (rainChkSttn.isSttn) { + setHeadList({ + splHeadList: rainChkSttn.splHeadList, + ruseHeadList: rainChkSttn.ruseHeadList, + rswtDetailHeadList: type === "RNB" ? [] : rswtChkSttn.rswtDetailSttnHeadList, + }); + } else { + setHeadList({ + splHeadList: rainChkgdn.splHeadList, + ruseHeadList: rainChkgdn.ruseHeadList, + rswtDetailHeadList: + type === "RNB" ? [] : rswtChkgdn.rswtDetailHeadList, + }); + } + }, [ + rainChkSttn.isSttn, + rainChkgdn.splHeadList, + rainChkSttn.splHeadList, + rswtChkgdn.rswtDetailHeadList, + rswtChkSttn.rswtDetailSttnHeadList + ]); + useEffect(() => { const result = obj.guideDetails?.reduce((acc: any, cur: any) => { const code = cur.utztnUsgCd; @@ -197,7 +233,7 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) {

{"○" + "" + `(${obj.bdstNm})`}

- {!rainChkgdn.isSttn ? ( + {!rainChkSttn.isSttn ? ( @@ -214,7 +250,7 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { { setChGuidData(data); @@ -227,7 +263,7 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { { setChGuidData(data); @@ -248,7 +284,7 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { { getPolutionData(data); diff --git a/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx b/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx index ed3f590b1..9c9bdbb24 100644 --- a/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx +++ b/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx @@ -2,9 +2,12 @@ import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; import { useWrStore } from "@/app/store"; import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; +import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; +import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { tableData } from "@/components/lib/func/commom"; import { chRowspanTable, + headVisibleChange, rainChkTableData } from "@/components/lib/func/TableData"; import { @@ -16,16 +19,21 @@ import { useCallback, useEffect, useState } from "react"; export default function RainChkgdTable({ detailUp, handleClick=() => {}, - deleteData + deleteData, + rainChkData, }: { detailUp: (data: rainChkZodType[]) => void; handleClick?: (data:any) => void; deleteData:(selectedIds:number[])=>void + rainChkData?: rainChkZodType[]; }) { - const { code, rainChkgdn } = useWrStore((state) => state); + const { code, rainChkgdn ,rainChkSttn,getRainSttnExcel } = useWrStore((state) => state); const [makeTableData, setMakeTableData] = useState([]); const [selectedIds, setSelectedIds] = useState([]); const [upRaintDetail, setUpRaintDetail] = useState([]); + const [headList, setHeadList] = useState< {headList:TableUpperProps[],upHeadList:chHeadType[]}>({headList:[], upHeadList:[]}); + + const toggleSelection = (pk: number, checked: boolean) => { setSelectedIds((prev) => checked ? [...prev, pk] : prev.filter((item) => item !== pk) @@ -60,20 +68,24 @@ export default function RainChkgdTable({ useEffect(() => { setSelectedIds([])// 셀렉트 초기화를 위한 작업 - const rainChg = rainChkgdn.rainChk.map((item: any) => { - const bud = tableData([item.building], { code }); - return { - ...item, - ...bud[0], - rowspan: item.rainyDetails?.length, - }; - }); - const tableTotalData = rainChkTableData(rainChg) - setMakeTableData(tableTotalData); - }, [rainChkgdn.rainChk, code]); + if(rainChkData){ + const rainChg = rainChkData.map((item: any) => { + const bud = tableData([item.building], { code }); + return { + ...item, + ...bud[0], + rowspan: item.rainyDetails?.length, + }; + }); + setMakeTableData(rainChkTableData(rainChg)); + } + }, [rainChkData, code]); useEffect(() => { //데이터를 평탄화 한것중에 체크박스 선택한 테이블만 선택 + + //현황 페이지에서 필요한 엑셀 데이터를 바뀔때마다 넣기 위해서 + getRainSttnExcel(makeTableData); const selectedData = makeTableData.filter((item) =>selectedIds.includes(item.chkgdnPk)); if (selectedData.length > 0) { @@ -123,6 +135,7 @@ export default function RainChkgdTable({ useEffect(() => { detailUp(upRaintDetail); + }, [upRaintDetail]); useEffect(() =>{ @@ -133,19 +146,38 @@ export default function RainChkgdTable({ },[selectedIds]) + ///현황일 경우 input 비활성화 한다. + useEffect(() => { + if(rainChkSttn.isSttn){ + + setHeadList({ + headList: rainChkSttn.rainChkgdnHeadList, + upHeadList: rainChkSttn.rainHeadNm + }) + }else{ + setHeadList({ + headList: rainChkgdn.rainChkgdnHeadList, + upHeadList: rainChkgdn.rainHeadNm + }) + + } + + }, [rainChkSttn.isSttn, rainChkgdn.rainChkgdnHeadList , rainChkSttn.rainChkgdnHeadList]); + + return ( {headMakeprfmnc( - rainChkgdn?.rainChkgdnHeadList, - rainChkgdn?.rainHeadNm + headList?.headList, + headList?.upHeadList )} {chRowspanTable( makeTableData, - rainChkgdn.rainChkgdnHeadList, + headList.headList, handleChange, toggleSelection, selectedIds, diff --git a/apps/wr/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable.tsx b/apps/wr/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable.tsx index d9caa86fd..b4f0281ac 100644 --- a/apps/wr/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable.tsx +++ b/apps/wr/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable.tsx @@ -1,9 +1,12 @@ "use client"; import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; import { useWrStore } from "@/app/store"; +import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; import type { + rswtChkZodType, rswtrChkDetailsZodType, } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn"; +import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { tableData } from "@/components/lib/func/commom"; import { chRowspanTable, @@ -16,14 +19,17 @@ export default function RswtChkgdTable({ detaiRswtlUpdate, handleRswtClick = () => {}, deleteRswtData, + rswtChkData, }: { detaiRswtlUpdate: (data: rswtrChkDetailsZodType[]) => void; handleRswtClick?: (data: any) => void; deleteRswtData: (selectedIds: number[]) => void; + rswtChkData: rswtChkZodType[]; }) { - const { code, rswtChkgdn, rswtChkgdnInit, rswtChkPolAndGuide } = useWrStore( + const { code, rswtChkgdn,rswtChkSttn , rswtChkgdnInit, rswtChkPolAndGuide,getRswtSttnExcel } = useWrStore( (state) => state ); + const [headList, setHeadList] = useState< {headList:TableUpperProps[],upHeadList:chHeadType[]}>({headList:[], upHeadList:[]}); const [makeTableData, setMakeTableData] = useState([]); const [selectedIds, setSelectedIds] = useState([]); @@ -61,6 +67,8 @@ export default function RswtChkgdTable({ }, [rswtChkgdn.rswtChkPolGuide]); useEffect(() => { + console.log("makeTableData ", makeTableData) + getRswtSttnExcel(makeTableData) const selectedData = makeTableData .map((item) => { return { @@ -78,8 +86,9 @@ export default function RswtChkgdTable({ useEffect(() => { setSelectedIds([]); // 셀렉트 초기화를 위한 작업 - const tableTotalData = rswtChkTableData(rswtChkgdn.rswtChkRes); - const rswtChkData = tableTotalData.map((item: any) => { + + const tableTotalData = rswtChkTableData(rswtChkData); + const makeRswtChkData = tableTotalData.map((item: any) => { const bud = tableData([item.building], { code }); return { ...item, @@ -87,8 +96,8 @@ export default function RswtChkgdTable({ rowspan: item.rswtrDetails?.length, }; }); - setMakeTableData(rswtChkData); - }, [rswtChkgdn.rswtChkRes, code]); + setMakeTableData(makeRswtChkData); + }, [rswtChkData, code]); useEffect(() => { detaiRswtlUpdate(upRswttDetail); @@ -101,17 +110,35 @@ export default function RswtChkgdTable({ } }, [selectedIds]); + ///현황일 경우 input 비활성화 한다. + useEffect(() => { + if(rswtChkSttn.isSttn){ + setHeadList({ + headList: rswtChkSttn.rswtChkSttnHeadList, + upHeadList: rswtChkSttn.rswtSttnHeadNm + }) + }else{ + setHeadList({ + headList: rswtChkgdn.rswtChkHeadList, + upHeadList: rswtChkgdn.rswtHeadNm + }) + + } + + }, [rswtChkSttn.isSttn, rswtChkgdn.rswtChkHeadList , rswtChkSttn.rswtChkSttnHeadList]); + + return ( <>
- {headMakeprfmnc(rswtChkgdn?.rswtChkHeadList, rswtChkgdn?.rswtHeadNm)} + {headMakeprfmnc(headList?.headList, headList?.upHeadList)} {chRowspanTable( makeTableData, - rswtChkgdn.rswtChkHeadList, + headList.headList, handleChange, toggleSelection, selectedIds, diff --git a/apps/wr/public/sample_rainChkSttn.xlsx b/apps/wr/public/sample_rainChkSttn.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dcab1be0ca4ba13122b47e1816caac1de691b98b GIT binary patch literal 9418 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 literal 0 HcmV?d00001