From 3ba11b55083cc19f64db6bb4594d3561177ba5e8 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Tue, 29 Jul 2025 20:11:51 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EB=B9=97=EB=AC=BC=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=ED=95=AD=EB=AA=A9=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=A0=90=EA=B2=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prfmncReg/chkgdnReg/rainChkgdn/excel.tsx | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx index 6d6ef18a6..a484f87c2 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx @@ -6,6 +6,7 @@ import { isInvalidNumber, parseRawValue, } from "@/components/lib/func/excelFunc"; +import toast from "react-hot-toast"; export const useTypes = [ "조경용수", "청소화장실용수", @@ -16,6 +17,18 @@ export const useTypes = [ "기타", ]; + +export const chkMngType =[ + '위탁', + '자체' +] +export const chkSpwtPositnType = [ + '유량계', + '수위계', + '펌프적산전력계', + '기타' +] + export type Buildingtype = { bdstInfoSn: number; ctpvCd: 1; @@ -143,43 +156,56 @@ export const excelToRainChkData = (excelData: any, year: string) => { }) .filter((el: any) => el !== undefined); +console.log("rainChkgdData", rainChkgdData); if (rainChkgdData.length > 0) { rainChkgdData.forEach((rain: any) => { const defaultMessage = `[시설명: ${rain.bdstNm}, 점검일: ${rain.chckYmd}, 이용용도: ${rain.guideDetails[0]?.utztnUsgCd}] 항목에서 `; if (rain.chckYmd && isInvalidDate(rain.chckYmd)) { issues.push( - defaultMessage + `점검일: 날짜 형식 아님 (${rain.chckYmd})` + defaultMessage + `점검일: 날짜 형식 아님 입력값 : (${rain.chckYmd})` ); } if (rain.anlOperCst.length > 2 && isInvalidNumber(rain.anlOperCst)) { issues.push( defaultMessage + - ` 연간운영비(원/년): 숫자 형식 아님 (${rain.anlOperCst})` + ` 연간운영비(원/년): 숫자 형식 아님 /입력값:${rain.anlOperCst}` ); } + if (rain.oilqMeasMthd.length > 1 && !chkMngType.includes(rain.oilqMeasMthd)) { + issues.push( + defaultMessage + `유량측정방법: 위탁 혹은 자체 만 허용) /입력값:${rain.oilqMeasMthd}` + ); + } + if (rain.spwtPositn.length > 1 && !chkSpwtPositnType.includes(rain.spwtPositn)) { + issues.push( + defaultMessage + `측정위치: 유량계, 수위계, 펌프적산전력계, 기타 중 하나만 허용) /입력값:${rain.spwtPositn}` + ); + } + + rain.rainyDetails?.forEach((key) => { if (key.ph?.length > 1 && isInvalidNumber(key.ph)) { - issues.push(defaultMessage + `PH: 숫자 형식 아님 (${key.ph})`); + issues.push(defaultMessage + `PH: 숫자 형식 아님 /입력값:${key.ph}`); } if (key.trbt?.length > 1 && isInvalidNumber(key.trbt)) { - issues.push(defaultMessage + `탁도: 숫자 형식 아님 (${key.trbt})`); + issues.push(defaultMessage + `탁도: 숫자 형식 아님 /입력값:${key.trbt}`); } if (key.grssClfg?.length > 1 && isInvalidNumber(key.grssClfg)) { issues.push( - defaultMessage + `총대장균군수: 숫자 형식 아님 (${key.grssClfg})` + defaultMessage + `총대장균군수: 숫자 형식 아님 /입력값:${key.grssClfg}` ); } if (key.levyAmt?.length > 1 && isInvalidNumber(key.levyAmt)) { issues.push( defaultMessage + - `과태료부과금액(천원): 숫자 형식 아님 (${key.levyAmt})` + `과태료부과금액(천원): 숫자 형식 아님 /입력값:${key.levyAmt}` ); } if (key.vltnDt?.length > 2 && isInvalidDate(key.vltnDt)) { issues.push( defaultMessage + - `과태료 부과일(위반일): 날짜 형식 아님 (${key.vltnDt})` + `과태료 부과일(위반일): 날짜 형식 아님 /입력값:${key.vltnDt}` ); } }); @@ -188,17 +214,19 @@ export const excelToRainChkData = (excelData: any, year: string) => { if (isInvalidNumber(guide.splyUswtrUtztnQnt)) { issues.push( defaultMessage + - `대체_${mm}: 숫자 형식 아님 (${guide.splyUswtrUtztnQnt})` + `대체_${mm}: 숫자 형식 아님 /입력값:${guide.splyUswtrUtztnQnt}` ); } if (isInvalidNumber(guide.ruseFcltUtztnQnt)) { issues.push( defaultMessage + - `빗물_${mm}: 숫자 형식 아님 (${guide.ruseFcltUtztnQnt})` + `빗물_${mm}: 숫자 형식 아님 /입력값:${guide.ruseFcltUtztnQnt}` ); } }); }); + }else{ + toast.error("데이터가 없습니다. 점검 데이터를 확인해주세요."); } if (issues.length > 0) { From e5f2cb2182f407a78d25edc05f81e5cc6f49deaf Mon Sep 17 00:00:00 2001 From: jyha00 Date: Tue, 29 Jul 2025 20:40:05 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EB=AC=BC=EC=9E=AC=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=EC=82=AC=EB=A1=80=EA=B4=80=EB=A6=AC=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx | 238 ++++++++++-------- .../app/store/matDmd/ruseCaseMng/headList.tsx | 2 +- .../wr/app/store/matDmd/ruseCaseMng/index.tsx | 154 +++++++----- .../ruseCaseMng/ruseCaseMngExcelModal.tsx | 38 ++- apps/wr/public/sample_ruseCaseMng.xlsx | Bin 20324 -> 20272 bytes 5 files changed, 245 insertions(+), 187 deletions(-) diff --git a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx index e45a0a0f2..813b4e23f 100644 --- a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx +++ b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx @@ -17,35 +17,45 @@ import { UiModal, UiTable, type SelectDataType, + type SheetParameter, } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; -import { Button } from "@common/components/ui"; +import { Button, Label } from "@common/components/ui"; import { useEffect, useState } from "react"; -import { Toaster } from "react-hot-toast"; +import toast, { Toaster } from "react-hot-toast"; +import { useTranslation } from "react-i18next"; export default function RuseCaseMng() { - const { code, ruseCaseMng, selectRuseCaseMng } = useWrStore((state) => state); - const { ruseCaseMngList, status, count } = ruseCaseMng; + const { code, ruseCaseMng, selectRuseCaseMng, ruseCaseMngInit } = useWrStore((state) => state); + const { ruseCaseMngList, status, count, excelList } = ruseCaseMng; const [selectSgg, setSelectSgg] = useState([]); const [objSearch, setObjSearch] = useState({ sgg: "", city: "" }); - + const [sidoCd, setSidoCd] = useState(""); const [sigunguCd, setSigunguCd] = useState(""); - const [selectUtz, setSelectUtz] = useState(["조경용수"]); + // const [selectUtz, setSelectUtz] = useState(["조경용수"]); + const [selectUtz, setSelectUtz] = useState(""); const [name, setName] = useState(""); + const [resetPage, isResetPage] = useState(false); + const { t } = useTranslation('base'); // 물재이용사례 조회 - const searchRuseCaseMng = async (pageNo: number, pageSize: number) => { + const searchRuseCaseMng = async (isExcel: boolean, pageNo: number, pageSize: number) => { await selectRuseCaseMng( + isExcel, pageNo, pageSize, - sidoCd ?? "", - sigunguCd ?? "", - selectUtz[0] ?? "", + sidoCd ?? "", + sigunguCd ?? "", + selectUtz ?? "", name ?? "" ); } + useEffect(() => { + ruseCaseMngInit(); + }, []) + // 시도 선택 const getSelCity = (val: string | number) => { const cityValue = String(val); @@ -69,91 +79,97 @@ export default function RuseCaseMng() { isModal: boolean; }>({ isModal: false }); - // 다운로드 - const download = () => { - searchRuseCaseMng(1, 10000);; - + + useEffect(() => { + + if (excelList !== undefined && excelList.length === 0) { + toast.error(t('excelDownErrMsg')); + return; + } fetch(`/sample_ruseCaseMng.xlsx`, {}).then(async (response) => { - if (!response.ok) { - throw Error(response.statusText); - } - // 받은 파일 바인너리 처리 - const blobRet = await response.arrayBuffer(); - - const excelData1 = ruseCaseMngList.map((item) => { - return [ - item.ruseBizNm, - item.bizBgngDate, - item.bizEndDate, - item.splyFcltKnd, - item.splyFcltNm, - item.splyFcltCpct, - item.dmdFcltNm, - item.dmdFcltAddr, - item.ruseFcltCpct, - item.ruseFcltPplLen, - item.ruseFcltUsg, - item.ruseFcltSplyCpct, - item.ruseFcltPrcsMsrc, - item.grnteWqUsg, - item.grnteWqGrssClfg, - item.grnteWqCombResdch, - item.grnteWqTrbt, - item.grnteWqBod, - item.grnteWqSmll, - item.grnteWqCrmty, - item.grnteWqTn, - item.grnteWqTp, - item.grnteWqPh, - item.grnteWqClIonQnt, - item.grnteWqCndctStat, - item.grnteWqRmrk, - item.reqBizGrssCst, - item.reqBizReuseFcltCst, - item.reqBizPplCst, - item.reqBizArchCst, - item.reqBizMchnCst, - item.reqBizMtrngCst, - item.reqBizGisCst, - item.reqBizCctvCst, - item.reqBizCmcnCst, - item.reqBizWstCst, - item.reqBizDesignCst, - item.reqBizSpvsCst, - item.reqBizSbsdCst, - item.reqBizEtc, - item.prcmPlanGrssCst, - item.prcmPlanNlep, - item.prcmPlanLcep, - item.prcmPlanBrdnCst, - item.prcmPlanEcqrRt, - item.clclnGrssCst, - item.clclnNlep, - item.clclnLcep, - item.clclnBrdnCst, - item.clclnEcqrRt, - ]; - }); - - const sheetParameter = [ - { - data: excelData1, - headerNum: 2, - headerRange: 'A1:AX1', - sheetName: '물재이용사례', - startCol: 'A' + if (!response.ok) { + throw Error(response.statusText); + } + // 받은 파일 바인너리 처리 + const blobRet = await response.arrayBuffer(); + if(excelList){ + const excelData1 = excelList.map((item) => { + return [ + item.ruseBizNm, + item.bizBgngDate, + item.bizEndDate, + item.splyFcltKnd, + item.splyFcltNm, + item.splyFcltCpct, + item.dmdFcltNm, + item.dmdFcltAddr, + item.ruseFcltCpct, + item.ruseFcltPplLen, + item.ruseFcltUsg, + item.ruseFcltSplyCpct, + item.ruseFcltPrcsMsrc, + item.grnteWqUsg, + item.grnteWqGrssClfg, + item.grnteWqCombResdch, + item.grnteWqTrbt, + item.grnteWqBod, + item.grnteWqSmll, + item.grnteWqCrmty, + item.grnteWqTn, + item.grnteWqTp, + item.grnteWqPh, + item.grnteWqClIonQnt, + item.grnteWqCndctStat, + item.grnteWqRmrk, + item.reqBizGrssCst, + item.reqBizReuseFcltCst, + item.reqBizPplCst, + item.reqBizArchCst, + item.reqBizMchnCst, + item.reqBizMtrngCst, + item.reqBizGisCst, + item.reqBizCctvCst, + item.reqBizCmcnCst, + item.reqBizWstCst, + item.reqBizDesignCst, + item.reqBizSpvsCst, + item.reqBizSbsdCst, + item.reqBizEtc, + item.prcmPlanGrssCst, + item.prcmPlanNlep, + item.prcmPlanLcep, + item.prcmPlanBrdnCst, + item.prcmPlanEcqrRt, + item.clclnGrssCst, + item.clclnNlep, + item.clclnLcep, + item.clclnBrdnCst, + item.clclnEcqrRt, + ]; + }); + + const sheetParameter: SheetParameter[] = [ + { + data: excelData1, + headerNum: 2, + headerRange: 'A1:AX1', + sheetName: '물재이용사례', + startCol: 'A' + } + ]; + // 버퍼에 있는 엑셀데이터 전달 후 json으로 변환 + await filePickedBlobArray(blobRet, '물재이용사례현황', sheetParameter); } - ]; - // 버퍼에 있는 엑셀데이터 전달 후 json으로 변환 - await filePickedBlobArray(blobRet, '물재이용사례현황', sheetParameter); }); - } + + + }, [excelList]) // 양식받기 const sampleDownLoad = () => { excelDownload( [[]], - "물재이용사례 관리", + "물재이용사례 관리 등록양식", "sample_ruseCaseMng.xlsx", "A1:AX1", 2 @@ -161,7 +177,7 @@ export default function RuseCaseMng() { } useEffect(() => { - if(status === 200){ + if (status === 200) { setIsExcelOpen({ isModal: false }); } }, [status]); @@ -174,7 +190,7 @@ export default function RuseCaseMng() { <SearchDiv> <SearchFormLeft> - <div className="col-span-8 flex flex-row"> + <div className="col-span-8 flex flex-row items-center"> <SelectBox className="col-span-2 w-1/3 h-full text-2xl" label="시도" @@ -183,24 +199,28 @@ export default function RuseCaseMng() { onSelectValue={getSelCity} /> <SelectBox - className="col-span-2 w-1/3 h-full text-2xl" + className="col-span-2 w-1/3 h-full text-2xl ml-4" label="시군구" selectClass={""} selectArray={selectSgg || []} onSelectValue={getSgg} /> <SelectBox - className="col-span-2 w-1/3 h-full text-2xl" + className="col-span-2 w-1/3 h-full text-2xl ml-4" label="용도" selectClass={""} selectArray={ruseUtzType} onSelectValue={(val) => { - if (val) setSelectUtz([String(val)]); + if (val) setSelectUtz(String(val)); }} + value={selectUtz || ruseUtzType[0]?.val} /> + <Label className="w-28 text-xl ml-4 mr-6"> + {"수요처명"} + </Label> <SearchInput - className={"text-2xl"} - label="수요처명" + className={"col-span-2 w-1/3 text-2xl"} + label="" textValue={name} setText={(e) => { setName(e); @@ -211,13 +231,29 @@ export default function RuseCaseMng() { <SearchFormRight className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2"> <div className="space-y"> <div className="flex flex-row space-x-2"> - <Button size={"sm"} onClick={() => { searchRuseCaseMng(1, 20) }}> + <Button size={"sm"} onClick={() => { + searchRuseCaseMng(false, 1, 10); + isResetPage(true); + }}> 조회 </Button> <Button size={"sm"} onClick={() => { setIsExcelOpen({ isModal: true }); }}> 엑셀등록 </Button> - <Button size={"sm"} onClick={() => { download() }}> + <Button size={"sm"} onClick={() => { + selectRuseCaseMng( + true, + 1, + count, + sidoCd ?? "", + sigunguCd ?? "", + selectUtz ?? "", + name ?? "" + ); + // download() + + + }} className={"green"}> 다운로드 </Button> <Button size={"sm"} onClick={() => { sampleDownLoad() }}> @@ -239,10 +275,12 @@ export default function RuseCaseMng() { headlist={ruseCaseMng.ruseHeadList} pageSize={20} total={count} - cellClick={() => {}} + cellClick={undefined} onPageChange={(pageNo: number) => { - searchRuseCaseMng(pageNo, 10); + searchRuseCaseMng(false, pageNo, 10); + isResetPage(false) }} + resetPageNo={resetPage} /> </div> </ListDiv> @@ -254,9 +292,9 @@ export default function RuseCaseMng() { <UiModal open={isExcelOpen.isModal} onOpenChange={() => { - setIsExcelOpen({ isModal: !isExcelOpen.isModal }) + setIsExcelOpen({ isModal: !isExcelOpen.isModal }) }} - bodyClass={"w-[40vw] max-w-none"} + bodyClass={"w-[35vw] max-w-none"} body={<RuseCaseMngExcel />} /> </> diff --git a/apps/wr/app/store/matDmd/ruseCaseMng/headList.tsx b/apps/wr/app/store/matDmd/ruseCaseMng/headList.tsx index 8c3a232e7..bc71fbf81 100644 --- a/apps/wr/app/store/matDmd/ruseCaseMng/headList.tsx +++ b/apps/wr/app/store/matDmd/ruseCaseMng/headList.tsx @@ -1,7 +1,6 @@ import type { SelectDataType } from "@common/business_components/ui"; import type { TableUpperProps } from "../../common/type/header"; -//★☆★☆ 여기서부터 수정하기 ★☆★☆ export const ruseCaseHeadListExport: TableUpperProps[] = [ { id: "ruseBizNm", @@ -358,6 +357,7 @@ export const ruseCaseHeadListExport: TableUpperProps[] = [ ]; export const ruseUtzType: SelectDataType[] = [ + { text: "전체", val: "0" }, { text: "조경용수", val: "조경용수" }, { text: "청소화장실용수", val: "청소화장실용수" }, { text: "세척살수용수", val: "세척살수용수" }, diff --git a/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx b/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx index 5ae2e67b4..160e1f7f3 100644 --- a/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx +++ b/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx @@ -4,90 +4,93 @@ import type { TableUpperProps } from "../../common/type/header"; import { ruseCaseHeadListExport } from "./headList"; export type ruseCaseState = { ruseCaseMng: { - ruseHeadList:TableUpperProps[]; - ruseCaseMngList:ruseCaseMngExcelProps[]; + ruseHeadList: TableUpperProps[]; + ruseCaseMngList: ruseCaseMngExcelProps[]; status: number; count: number; + excelList?: ruseCaseMngExcelProps[]; }; }; export interface ruseCaseMngExcelProps { - ruseBizNm: string, - bizBgngDate: string, - bizEndDate: string, - splyFcltKnd: string, - splyFcltNm: string, - splyFcltCpct: number | 0 |'', - dmdFcltNm: string, - dmdFcltAddr: string, - ruseFcltCpct: number | 0 |'', - ruseFcltPplLen: string, - ruseFcltUsg: string, - ruseFcltSplyCpct: number | 0 |'', - ruseFcltPrcsMsrc: string, - grnteWqUsg: string, - grnteWqGrssClfg: number | 0 |'', - grnteWqCombResdch: number | 0 |'', - grnteWqTrbt: string, - grnteWqBod: string, - grnteWqSmll: string, - grnteWqCrmty: string, - grnteWqTn: string, - grnteWqTp: string, - grnteWqPh: string, - grnteWqClIonQnt: string, - grnteWqCndctStat: string, - grnteWqRmrk: string, - reqBizReuseFcltCst: number | 0 |'', - reqBizPplCst: number | 0 |'', - reqBizArchCst: number | 0 |'', - reqBizMchnCst: number | 0 |'', - reqBizMtrngCst: number | 0 |'', - reqBizGisCst: number | 0 |'', - reqBizCctvCst: number | 0 |'', - reqBizCmcnCst: number | 0 |'', - reqBizWstCst: number | 0 |'', - reqBizDesignCst: number | 0 |'', - reqBizSpvsCst: number | 0 |'', - reqBizSbsdCst: number | 0 |'', - reqBizEtc: string, - reqBizGrssCst: number | 0 |'', - prcmPlanNlep: number | 0 |'', - prcmPlanLcep: number | 0 |'', - prcmPlanBrdnCst: number | 0 |'', - prcmPlanEcqrRt: number | 0 |'', - prcmPlanGrssCst: number | 0 |'', - clclnNlep: number | 0 |'', - clclnLcep: number | 0 |'', - clclnBrdnCst: number | 0 |'', - clclnEcqrRt: number | 0 |'', - clclnGrssCst: number | 0 |'', + ruseBizNm: string, + bizBgngDate: string, + bizEndDate: string, + splyFcltKnd: string, + splyFcltNm: string, + splyFcltCpct: number | 0 | '', + dmdFcltNm: string, + dmdFcltAddr: string, + ruseFcltCpct: number | 0 | '', + ruseFcltPplLen: string, + ruseFcltUsg: string, + ruseFcltSplyCpct: number | 0 | '', + ruseFcltPrcsMsrc: string, + grnteWqUsg: string, + grnteWqGrssClfg: number | 0 | '', + grnteWqCombResdch: number | 0 | '', + grnteWqTrbt: string, + grnteWqBod: string, + grnteWqSmll: string, + grnteWqCrmty: string, + grnteWqTn: string, + grnteWqTp: string, + grnteWqPh: string, + grnteWqClIonQnt: string, + grnteWqCndctStat: string, + grnteWqRmrk: string, + reqBizReuseFcltCst: number | 0 | '', + reqBizPplCst: number | 0 | '', + reqBizArchCst: number | 0 | '', + reqBizMchnCst: number | 0 | '', + reqBizMtrngCst: number | 0 | '', + reqBizGisCst: number | 0 | '', + reqBizCctvCst: number | 0 | '', + reqBizCmcnCst: number | 0 | '', + reqBizWstCst: number | 0 | '', + reqBizDesignCst: number | 0 | '', + reqBizSpvsCst: number | 0 | '', + reqBizSbsdCst: number | 0 | '', + reqBizEtc: string, + reqBizGrssCst: number | 0 | '', + prcmPlanNlep: number | 0 | '', + prcmPlanLcep: number | 0 | '', + prcmPlanBrdnCst: number | 0 | '', + prcmPlanEcqrRt: number | 0 | '', + prcmPlanGrssCst: number | 0 | '', + clclnNlep: number | 0 | '', + clclnLcep: number | 0 | '', + clclnBrdnCst: number | 0 | '', + clclnEcqrRt: number | 0 | '', + clclnGrssCst: number | 0 | '', } type ruseCaseActions = { - selectRuseCaseMng: (pageNo: number, pageSize: number, sidoCd: string, sigunguCd: string, usageCd : string, name: string) => Promise<void>; + ruseCaseMngInit: () => void; + selectRuseCaseMng: (isExcel: boolean, pageNo: number, pageSize: number, sidoCd: string, sigunguCd: string, usageCd: string, name: string) => Promise<void>; insertRuseCaseMng: (data: any) => Promise<void>; }; -export const fetchSearchRuseCaseMng = async (pageNo: number, pageSize: number, sidoCd: string, sigunguCd: string, usageCd : string, name: string) => { - const tailUrl = '/'+pageNo+'/'+pageSize+ ((sigunguCd !== '전체' && sigunguCd !=='') ? `/${sigunguCd}` : (sidoCd != '전체' && sidoCd != '') ? `/${sidoCd}` : `/0`) + (usageCd? `/${usageCd}` : '/0') + (name? `/${name}` : ''); - const resp = await getFetchWithCount(fetchType.WR,`/reuseFc/pubFcRuseCase${tailUrl}`); - return {data:resp.data, count:resp.count}; +export const fetchSearchRuseCaseMng = async (pageNo: number, pageSize: number, sidoCd: string, sigunguCd: string, usageCd: string, name: string) => { + const tailUrl = '/' + pageNo + '/' + pageSize + ((sigunguCd !== '전체' && sigunguCd !== '') ? `/${sigunguCd}` : (sidoCd != '전체' && sidoCd != '') ? `/${sidoCd}` : `/0`) + (usageCd ? `/${usageCd}` : '/0') + (name ? `/${name}` : ''); + const resp = await getFetchWithCount(fetchType.WR, `/reuseFc/pubFcRuseCase${tailUrl}`); + return { data: resp.data, count: resp.count }; }; export const fetchInsertRuseCaseMng = async (data: any) => { const response = await postFectch('/reuseFc/pubFcRuseCase', data, fetchType.WR); - return {data:response.data, status:response.status}; + return { data: response.data, status: response.status }; }; export type ruseCaseType = ruseCaseState & ruseCaseActions; export const ruseCaseStateExport: ruseCaseState = { ruseCaseMng: { - ruseHeadList:ruseCaseHeadListExport, - ruseCaseMngList:[], + ruseHeadList: ruseCaseHeadListExport, + ruseCaseMngList: [], status: 0, count: 0, + excelList: undefined, }, }; @@ -95,8 +98,8 @@ export const ruseCaseActionsExport: (set: any) => ruseCaseActions = ( set: any ) => { return { - selectRuseCaseMng: async (pageNo: number, pageSize: number, sidoCd: string, sigunguCd: string, usageCd : string, name: string) => { - const res = await fetchSearchRuseCaseMng(pageNo, pageSize, sidoCd, sigunguCd, usageCd, name); + ruseCaseMngInit: async () => { + const res = await getFetchWithCount(fetchType.WR, `/reuseFc/pubFcRuseCase/1/10/0/0`); set((state: ruseCaseState) => ({ ruseCaseMng: { ...state.ruseCaseMng, @@ -105,12 +108,35 @@ export const ruseCaseActionsExport: (set: any) => ruseCaseActions = ( }, })); }, + selectRuseCaseMng: async (isExcel: boolean, pageNo: number, pageSize: number, sidoCd: string, sigunguCd: string, usageCd: string, name: string) => { + const res = await fetchSearchRuseCaseMng(pageNo, pageSize, sidoCd, sigunguCd, usageCd, name); + if (isExcel) { + set((state: ruseCaseState) => { + return { + ...state, + ruseCaseMng: { + ...state.ruseCaseMng, + count: res.count, + excelList: res.data + }, + }; + }); + } else { + set((state: ruseCaseState) => ({ + ruseCaseMng: { + ...state.ruseCaseMng, + ruseCaseMngList: res.data, + count: res.count, + }, + })); + } + }, insertRuseCaseMng: async (data: any) => { const response = await fetchInsertRuseCaseMng(data); - if(response.status === 200){ + if (response.status === 200) { toast.success("물재이용사례 등록이 완료되었습니다. "); - }else{ + } else { toast.error("물재이용사례 등록에 실패하였습니다. "); } set((state: ruseCaseState) => ({ diff --git a/apps/wr/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal.tsx b/apps/wr/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal.tsx index 57424996e..a809c88f6 100644 --- a/apps/wr/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal.tsx +++ b/apps/wr/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal.tsx @@ -1,14 +1,14 @@ +import { useWrStore } from "@/app/store"; import { coRegExcel } from "@/app/store/matDmd/coSttn/headList"; -import type { ruseCaseMngExcelProps } from "@/app/store/matDmd/ruseCaseMng/index"; import { reUseCaseNames } from "@/app/store/matDmd/ruseCaseMng/excel"; -import { filePicked, FileUpload, FormUi, Title } from "@common/business_components/ui"; -import { Form, FormField } from "@common/business_components/ui/form"; -import { Button } from "@common/components/ui"; +import type { ruseCaseMngExcelProps } from "@/app/store/matDmd/ruseCaseMng/index"; +import { filePicked, Title } from "@common/business_components/ui"; +import { Form } from "@common/business_components/ui/form"; +import { Button, Input } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; import { useState } from "react"; import { useForm } from "react-hook-form"; import type { z } from "zod"; -import { useWrStore } from "@/app/store"; export default function RuseCaseMngExcel() { const { insertRuseCaseMng } = useWrStore((state) => state); @@ -79,6 +79,7 @@ export default function RuseCaseMngExcel() { }; Object.keys(reUseCaseNames).forEach((key: string) => { + console.log("reUseCaseNames", reUseCaseNames) if (item && reUseCaseNames[key] !== undefined) { const mappedKey = reUseCaseNames[key]; if (mappedKey && object.hasOwnProperty(mappedKey)) { @@ -146,23 +147,16 @@ export default function RuseCaseMngExcel() { </div> <div> - <FormField - control={form.control} - name="file" - render={() => ( - <FormUi label=""> - <FileUpload - files={file ? [file] : []} - setFiles={(files: File[] | null) => { - console.log("files", files) - if (files && files?.length === 1) setFiles(files[0]); - }} - fileTypes="" - maxFiles={1} - ></FileUpload> - </FormUi> - )} - /> + <div className="space-y-4 p-4"> + <Input + type="file" + onChange={(e) => { + const selectedFile = e.target.files?.[0]; + if (selectedFile) setFiles(selectedFile); + }} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" + /> + </div> </div> </form> </Form> diff --git a/apps/wr/public/sample_ruseCaseMng.xlsx b/apps/wr/public/sample_ruseCaseMng.xlsx index 96027d557fe2cfc60d3de10c313c49d78f984591..3676b4f71f972b6d877a9f03946a2c5af8cd5b0e 100644 GIT binary patch delta 9160 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 delta 9127 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 From 0c16b9d14df0f523bbdd6908536b40f9e88e6d56 Mon Sep 17 00:00:00 2001 From: leedj312 <dlehd467@gmail.com> Date: Thu, 31 Jul 2025 13:28:21 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EC=A4=91=EC=88=98=EB=8F=84=20=EC=A7=80?= =?UTF-8?q?=EB=8F=84=EC=A0=90=EA=B2=80=20=EC=97=91=EC=85=80=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=98=A4=EB=A5=98=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prfmncReg/chkgdnReg/rswrtChkgdn/excel.tsx | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/excel.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/excel.tsx index 262b1cb30..aa550dcd1 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/excel.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/excel.tsx @@ -1,5 +1,10 @@ import type { SelectDataType } from "@common/business_components/ui"; -import { useTypes, type Buildingtype } from "../rainChkgdn/excel"; +import { + chkMngType, + chkSpwtPositnType, + useTypes, + type Buildingtype, +} from "../rainChkgdn/excel"; import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import type { rswtChkZodType } from "."; import { @@ -171,14 +176,14 @@ export const excelToRswtGuideData = ( .filter((el: any) => el !== undefined); if (rswtChkgdData.length > 0) { - rswtExcelDataCheck(rswtChkgdData,issues) + rswtExcelDataCheck(rswtChkgdData, issues); } if (issues.length > 0) { return { data: [], issues }; } - return { data:rswtChkgdData, issues: [] }; + return { data: rswtChkgdData, issues: [] }; }; export const excelToRswtPolution = (excelData: any, issues: string[]) => { @@ -248,25 +253,25 @@ export const excelToRswtPolution = (excelData: any, issues: string[]) => { }) .filter((el: any) => el !== undefined); if (rswtChkgdData.length > 0) { - rswtExcelDataCheck(rswtChkgdData,issues) + rswtExcelDataCheck(rswtChkgdData, issues); } if (issues.length > 0) { return { data: [], issues }; } - return { data:rswtChkgdData, issues: [] }; + return { data: rswtChkgdData, issues: [] }; }; - -const rswtExcelDataCheck=(rswtChkgdData:rswtChkZodType[], issues:string[]) =>{ +const rswtExcelDataCheck = ( + rswtChkgdData: rswtChkZodType[], + issues: string[] +) => { rswtChkgdData.forEach((rswt: any) => { const defaultMessage = `*중수도 수질 [NO: ${rswt.bdstRuseFcltSn}, 점검일: ${rswt.chckYmd}, 이용용도: ${rswt.utztnUsgCd}] 항목에서 `; if (rswt.chckYmd && isInvalidDate(rswt.chckYmd)) { - issues.push( - defaultMessage + `점검일: 날짜 형식 아님 (${rswt.chckYmd})` - ); + issues.push(defaultMessage + `점검일: 날짜 형식 아님 (${rswt.chckYmd})`); } if (rswt.anlOperCst.length > 2 && isInvalidNumber(rswt.anlOperCst)) { issues.push( @@ -279,6 +284,25 @@ const rswtExcelDataCheck=(rswtChkgdData:rswtChkZodType[], issues:string[]) =>{ defaultMessage + ` 처리용량(m³): 숫자 형식 아님 (${rswt.prcsCpct})` ); } + if ( + rswt.oilqMeasMthd.length > 1 && + !chkMngType.includes(rswt.oilqMeasMthd) + ) { + issues.push( + defaultMessage + + `유량측정방법: 위탁 혹은 자체 만 허용) /입력값:${rswt.oilqMeasMthd}` + ); + } + if ( + rswt.spwtPositn.length > 1 && + !chkSpwtPositnType.includes(rswt.spwtPositn) + ) { + issues.push( + defaultMessage + + `측정위치: 유량계, 수위계, 펌프적산전력계, 기타 중 하나만 허용) /입력값:${rswt.spwtPositn}` + ); + } + if (rswt?.rswtrPollutions && rswt?.rswtrPollutions.length > 0) { rswt.rswtrPollutions.forEach((pol) => { if (isInvalidNumber(pol.grssClfgUswtr)) { @@ -301,8 +325,7 @@ const rswtExcelDataCheck=(rswtChkgdData:rswtChkZodType[], issues:string[]) =>{ } if (isInvalidNumber(pol.bod)) { issues.push( - defaultMessage + - `${pol.node}분기_BOD: 숫자 형식 아님 (${pol.bod})` + defaultMessage + `${pol.node}분기_BOD: 숫자 형식 아님 (${pol.bod})` ); } if (isInvalidNumber(pol.smll)) { @@ -319,8 +342,7 @@ const rswtExcelDataCheck=(rswtChkgdData:rswtChkZodType[], issues:string[]) =>{ } if (isInvalidNumber(pol.tph)) { issues.push( - defaultMessage + - `${pol.node}분기_T-P: 숫자 형식 아님 (${pol.tph})` + defaultMessage + `${pol.node}분기_T-P: 숫자 형식 아님 (${pol.tph})` ); } if (isInvalidNumber(pol.tn)) { @@ -358,7 +380,5 @@ const rswtExcelDataCheck=(rswtChkgdData:rswtChkZodType[], issues:string[]) =>{ } }); } - }) - - -} \ No newline at end of file + }); +};