From 7053966007354362c37c69c7b5c775933fe4efb8 Mon Sep 17 00:00:00 2001 From: YangJinSoo94 Date: Fri, 27 Jun 2025 09:28:57 +0900 Subject: [PATCH 1/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=EC=97=91=EC=85=80?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=ED=8C=9D=EC=97=85=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=EB=B0=8F=20=ED=8C=9D=EC=97=85=EB=93=B1=EB=A1=9D=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx | 86 +++++---- .../wr/app/store/matDmd/ruseCaseMng/excel.tsx | 109 +++++++++++ .../wr/app/store/matDmd/ruseCaseMng/index.tsx | 110 ++++++++++- .../ruseCaseMng/ruseCaseMngExcelModal.tsx | 172 ++++++++++++++++++ 4 files changed, 432 insertions(+), 45 deletions(-) create mode 100644 apps/wr/app/store/matDmd/ruseCaseMng/excel.tsx create mode 100644 apps/wr/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal.tsx diff --git a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx index 4950ab0da..ad5a4f751 100644 --- a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx +++ b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx @@ -1,30 +1,48 @@ "use client"; + import { useWrStore } from "@/app/store"; import { ruseUtzType } from "@/app/store/matDmd/ruseCaseMng/headList"; import { getCity } from "@/components/lib/func/commom"; +import RuseCaseMngExcel from "@/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal"; import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; -import { ContentsDiv, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiTable, type SelectDataType } from "@common/business_components/ui"; +import { + ContentsDiv, + SearchDiv, + SearchFormLeft, + SearchFormRight, + SearchInput, + SelectBox, + Title, + UiModal, + UiTable, + type SelectDataType, +} from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { Button } from "@common/components/ui"; import { useState } from "react"; export default function RuseCaseMng() { - const { code,ruseCase} = useWrStore((state) => state); - const [selectSgg, setSelectSgg] = useState() + const { code, ruseCaseMng } = useWrStore((state) => state); + const [selectSgg, setSelectSgg] = useState(); const [objSearch, setObjSearch] = useState({ sgg: "", city: "" }); - const [selectUtz, setSelectUtz] = useState() - const [searchTxt, setSearchTxt] = useState() + const [selectUtz, setSelectUtz] = useState(); + const [searchTxt, setSearchTxt] = useState(); const getSelCity = (val: string | number) => { const cityValue = String(val); const data = getCity(cityValue, code.sggCd); setSelectSgg(data); - setObjSearch({ city: cityValue, sgg: '' }); + setObjSearch({ city: cityValue, sgg: "" }); }; const getSgg = (val: string | number) => { - setObjSearch({ ...objSearch, sgg: String(val) }) + setObjSearch({ ...objSearch, sgg: String(val) }); }; + + const [isExcelOpen, setIsExcelOpen] = useState<{ + isModal: boolean; + }>({ isModal: false }); + return ( <> @@ -54,47 +72,32 @@ export default function RuseCaseMng() { selectClass={""} selectArray={ruseUtzType} onSelectValue={(val) => { - if(val) - setSelectUtz([String(val)])}} + if (val) setSelectUtz([String(val)]); + }} /> - { - setSearchTxt(e) + setSearchTxt(e); }} /> - - +
- - - -
@@ -103,24 +106,33 @@ export default function RuseCaseMng() {
-
+
{ - }} - onPageChange={() => { }} - > + cellClick={(index: number | undefined, headId: string) => {}} + onPageChange={() => {}} + />
+ + {/* 엑셀 등록 모달 */} + { + setIsExcelOpen({ isModal: !isExcelOpen.isModal }) + }} + bodyClass={"w-[40vw] max-w-none"} + body={} + /> - ) + ); } \ No newline at end of file diff --git a/apps/wr/app/store/matDmd/ruseCaseMng/excel.tsx b/apps/wr/app/store/matDmd/ruseCaseMng/excel.tsx new file mode 100644 index 000000000..ebbaa8b7a --- /dev/null +++ b/apps/wr/app/store/matDmd/ruseCaseMng/excel.tsx @@ -0,0 +1,109 @@ +import { z } from "zod"; + +export const reUseCaseExcel = z.object({ + file: z.any() +}); + +type nameMap = { + [key: string]: string; +} + +export const reUseCaseNames: nameMap = { + "사업명": "ruseBizNm", + "사업시작일": "bizBgngDate", + "사업종료일": "bizEndtDate", + "공급처_시설종류": "splyFcltKnd", + "공급처명": "splyFcltNm", + "공급처_시설용량(㎥/일)": "splyFcltCpct", + "수요처명": "dmdFcltNm", + "수요처_주소": "dmdFcltAddr", + "재이용시설_시설용량(㎥/일)": "ruseFcltCpct", + "재이용시설_관로(km)": "ruseFcltPplLen", + "재이용시설_용도": "ruseFcltUsg", + "재이용시설_공급량(㎥/일)": "ruseFcltSplyCpct", + "재이용시설_처리공법": "ruseFcltPrcsMsrc", + "보증수질_용도별": "grnteWqUsg", + "보증수질_총대장균군수": "grnteWqGrssClfg", + "보증수질_결합잔류염소": "grnteWqCombResdch", + "보증수질_탁도": "grnteWqTrbt", + "보증수질_생물학적산소요구량(BOD)(mg/L)": "grnteWqBod", + "보증수질_냄새": "grnteWqSmll", + "보증수질_색도(도)": "grnteWqCrmty", + "보증수질_총질소(T-N)(mg/L)": "grnteWqTn", + "보증수질_총인(T-P)(mg/L)": "grnteWqTp", + "보증수질_수소이온농도(pH)": "grnteWqPh", + "보증수질_염화물": "grnteWqClIonQnt", + "보증수질_전기전도도": "grnteWqCndctStat", + "보증수질_비고": "grnteWqRmrk", + "소요사업비_총(백만원)": "reqBizGrssCst", + "소요사업비_토목_재이용시설(백만원)": "reqBizReuseFcltCst", + "소요사업비_토목_관로(백만원)": "reqBizPplCst", + "소요사업비_건축(백만원)": "reqBizArchCst", + "소요사업비_기계(백만원)": "reqBizMchnCst", + "소요사업비_전기.계측(백만원)": "reqBizMtrngCst", + "소요사업비_GIS DB(백만원)": "reqBizGisCst", + "소요사업비_CCTV(백만원)": "reqBizCctvCst", + "소요사업비_시공 및 준공(백만원)": "reqBizCmcnCst", + "소요사업비_폐기물(백만원)": "reqBizWstCst", + "소요사업비_설계비(백만원)": "reqBizDesignCst", + "소요사업비_감리비(백만원)": "reqBizSpvsCst", + "소요사업비_시설부대비(백만원)": "reqBizSbsdCst", + "소요사업비_기타(백만원)": "reqBizEtc", + "재원조달계획_총(백만원)": "prcmPlanGrssCst", + "재원조달계획_국비(백만원)": "prcmPlanNlep", + "재원조달계획_지방비(백만원)": "prcmPlanLcep", + "재원조달계획_원인자부담(백만원)": "prcmPlanBrdnCst", + "재원조달계획_국고비율(백만원)": "prcmPlanEcqrRt", + "사업비 정산_총(백만원)": "clclnGrssCst", + "사업비 정산_국비(백만원)": "clclnNlep", + "사업비 정산_지방비(백만원)": "clclnLcep", + "사업비 정산_원인자부담(백만원)": "clclnBrdnCst", + "사업비 정산_국고비율(백만원)": "clclnEcqrRt" +} + +interface PbnstSttnItem { + rvbsn: string; + lgbsn: number; + mdmbsn?: string; + rgnNm?: string; + sido?: number; + gugun?: number; + bscFctNm?: string; + efflWqltStndrdNm?: string; + fctCpc?: number; + tel?: string; + ruseUtztnFcltNm?: string; + fcltCpct?: number; + splyExtraCpct?: number; + ruseCpct?: number; + usageTotal?: number; + inUsage?: number; + outUsage?: number; +} + +export const excelPbnstSttnParsing = (data: PbnstSttnItem[]): string[][] => { + const excelExportData: string[][] = []; + + data.forEach((item) => { + excelExportData.push([ + item.rvbsn, + String(item.lgbsn), + item.mdmbsn ?? "", + item.rgnNm ?? "", + String(item.sido ?? ""), + String(item.gugun ?? ""), + String(item.bscFctNm ?? ""), + String(item.efflWqltStndrdNm ?? ""), + String(item.fctCpc ?? ""), + String(item.tel ?? ""), + String(item.ruseUtztnFcltNm ?? ""), + String(item.fcltCpct ?? ""), + String(item.splyExtraCpct ?? ""), + String(item.ruseCpct ?? ""), + String(item.usageTotal ?? ""), + String(item.inUsage ?? ""), + String(item.outUsage ?? ""), + ]) + }) + return excelExportData; +}; \ No newline at end of file diff --git a/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx b/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx index c54b0db1a..274af07af 100644 --- a/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx +++ b/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx @@ -1,24 +1,118 @@ +import { fetchType, postFectch } from "@/components/lib/api"; import type { TableUpperProps } from "../../common/type/header"; import { ruseCaseHeadListExport } from "./headList"; +import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; export type ruseCaseState = { - ruseCase: { - ruseHeadList:TableUpperProps[]; - }; + ruseCaseMng: { + ruseHeadList:TableUpperProps[]; + ruseCaseMngList:TableUpperProps[]; }; -type ruseCaseActions = { }; + +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 |'', +} + +type ruseCaseActions = { + selectRuseCaseMng: (sidoCd: string, sigunguCd: string, usageCd : string, name: string) => Promise; + insertRuseCaseMng: (data: any) => Promise; +}; + +export const fetchSearchRuseCaseMng = async (sidoCd: string, sigunguCd: string, usageCd : string, name: string) => { + const tailUrl = (sidoCd && !sigunguCd ? `/${sigunguCd}` : sigunguCd ? `/${sigunguCd}` : '/0') + (usageCd ? `/${usageCd}` : '') + (name ? `/${name}` : ''); + console.log('tailUrl : ', tailUrl); + const response = await postFectch(`/reuseFc/pubFcRuseCase${tailUrl}`, {usageCd, name}, fetchType.WR); + return []; +}; + +export const fetchInsertRuseCaseMng = async (data: any) => { + console.log('data : ', data) + const response = await postFectch('/reuseFc/pubFcRuseCase', data, fetchType.WR); + return response.data; +}; + export type ruseCaseType = ruseCaseState & ruseCaseActions; export const ruseCaseStateExport: ruseCaseState = { - ruseCase: { - ruseHeadList:ruseCaseHeadListExport, + ruseCaseMng: { + ruseHeadList:ruseCaseHeadListExport, + ruseCaseMngList:[], }, }; -export const ruseCaseActionsExport: (set: any) => ruseCaseActions = ( + +export const ruseCaseActionsExport: (set: any) => ruseCaseActions = ( set: any ) => { return { - + selectRuseCaseMng: async (sidoCd: string, sigunguCd: string, usageCd : string, name: string) => { + const res = await fetchSearchRuseCaseMng(sidoCd, sigunguCd, usageCd, name); + + set((state: ruseCaseState) => ({ + ruseCaseMng: { + ...state.ruseCaseMng, + ruseCaseMngList: data, + }, + })); + }, + + insertRuseCaseMng: async (data: any) => { + const response = await fetchInsertRuseCaseMng(data); + if(response.status === 200){ + ToastFormUi({ + body: "잠재수요처 등록이 완료되었습니다. ", + title: "잠재수요처 등록", + }); + } + }, }; }; diff --git a/apps/wr/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal.tsx b/apps/wr/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal.tsx new file mode 100644 index 000000000..57424996e --- /dev/null +++ b/apps/wr/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal.tsx @@ -0,0 +1,172 @@ +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 { 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); + const form = useForm>({ + resolver: zodResolver(coRegExcel), + }); + + const [file, setFiles] = useState(); + + const onSubmit = () => { + if (file) { + filePicked(file, 0).then((res: unknown) => { + try { + const newArray: ruseCaseMngExcelProps[] = [] + const dataArray = Array.isArray(res) ? res : []; + dataArray.forEach((item: Record) => { + const object: ruseCaseMngExcelProps = { + ruseBizNm: '', + bizBgngDate: '', + bizEndDate: '', + splyFcltKnd: '', + splyFcltNm: '', + splyFcltCpct: 0, + dmdFcltNm: '', + dmdFcltAddr: '', + ruseFcltCpct: 0, + ruseFcltPplLen: '', + ruseFcltUsg: '', + ruseFcltSplyCpct: 0, + ruseFcltPrcsMsrc: '', + grnteWqUsg: '', + grnteWqGrssClfg: 0, + grnteWqCombResdch: 0, + grnteWqTrbt: '', + grnteWqBod: '', + grnteWqSmll: '', + grnteWqCrmty: '', + grnteWqTn: '', + grnteWqTp: '', + grnteWqPh: '', + grnteWqClIonQnt: '', + grnteWqCndctStat: '', + grnteWqRmrk: '', + reqBizReuseFcltCst: 0, + reqBizPplCst: 0, + reqBizArchCst: 0, + reqBizMchnCst: 0, + reqBizMtrngCst: 0, + reqBizGisCst: 0, + reqBizCctvCst: 0, + reqBizCmcnCst: 0, + reqBizWstCst: 0, + reqBizDesignCst: 0, + reqBizSpvsCst: 0, + reqBizSbsdCst: 0, + reqBizEtc: '', + reqBizGrssCst: 0, + prcmPlanNlep: 0, + prcmPlanLcep: 0, + prcmPlanBrdnCst: 0, + prcmPlanEcqrRt: 0, + prcmPlanGrssCst: 0, + clclnNlep: 0, + clclnLcep: 0, + clclnBrdnCst: 0, + clclnEcqrRt: 0, + clclnGrssCst: 0, + }; + + Object.keys(reUseCaseNames).forEach((key: string) => { + if (item && reUseCaseNames[key] !== undefined) { + const mappedKey = reUseCaseNames[key]; + if (mappedKey && object.hasOwnProperty(mappedKey)) { + let value; + + if(value === "-"){ + value = ''; + } + if(key === "사업시작일" || key === "사업종료일"){ + if(item[key]?.toString().split(".")[1]?.length === 1){ + value = `${item[key]?.toString().split(".")[0] || ""}${item[key]?.toString().split(".")[1]?.length === 1 ? "0" : ""}${item[key]?.toString().split(".")[1] || ""}` + }else{ + value = `${item[key]?.toString().split(".")[0] || ""}${item[key]?.toString().split(".")[1] || ""}` + } + }else if(key === "재이용시설_관로(km)" || key?.toString().includes("보증수질_")){ + value = item[key]?.toString().trim() || ''; + }else{ + if(item[key]?.toString().includes("%") && Number(item[key]?.toString().replaceAll("%", ""))){ + value = item[key]?.toString().replaceAll("%", ""); + }else{ + value = item[key]; + } + } + + if(value === null || value?.toString().trim() === "-" || value?.toString().trim() === ""){ + if (typeof object[mappedKey as keyof ruseCaseMngExcelProps] === 'number') { + (object as unknown as Record)[mappedKey] = ''; + } else { + (object as unknown as Record)[mappedKey] = ''; + } + }else if (typeof object[mappedKey as keyof ruseCaseMngExcelProps] === 'number' && Number(value?.toString().replaceAll("%", "").replaceAll(",", ""))) { + (object as unknown as Record)[mappedKey] = Number(value?.toString().replaceAll("%", "").replaceAll(",", "")); + }else{ + (object as unknown as Record)[mappedKey] = value?.toString().trim() || ''; + } + } + } + }); + newArray.push(object); + }); + console.log("newArray : ", newArray); + insertRuseCaseMng(newArray); + } catch (e) { + console.log(e) + } + }); + }; + } + + return ( + <> +
+
+ +
+ +
+
+

+ {"물재이용 사례 파일"} +

+ +
+ +
+ ( + + { + console.log("files", files) + if (files && files?.length === 1) setFiles(files[0]); + }} + fileTypes="" + maxFiles={1} + > + + )} + /> +
+
+ +
+ + ); +} \ No newline at end of file From f949319db3a30920eff8cf4a57cced7ef52ed4ca Mon Sep 17 00:00:00 2001 From: YangJinSoo94 Date: Fri, 27 Jun 2025 09:31:56 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C=EC=A7=84=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx index ad5a4f751..fecbb4ac6 100644 --- a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx +++ b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx @@ -22,12 +22,22 @@ import { Button } from "@common/components/ui"; import { useState } from "react"; export default function RuseCaseMng() { - const { code, ruseCaseMng } = useWrStore((state) => state); + const { code, ruseCaseMng, selectRuseCaseMng } = useWrStore((state) => state); const [selectSgg, setSelectSgg] = useState(); const [objSearch, setObjSearch] = useState({ sgg: "", city: "" }); const [selectUtz, setSelectUtz] = useState(); const [searchTxt, setSearchTxt] = useState(); + const [sidoCd, setSidoCd] = useState(""); + const [sigunguCd, setSigunguCd] = useState(""); + const [usageCd, setUsageCd] = useState(""); + const [name, setName] = useState(""); + + const searchRuseCaseMng = async () => { + const res = await selectRuseCaseMng(sidoCd, sigunguCd, usageCd, name); + console.log('res : ', res); + } + const getSelCity = (val: string | number) => { const cityValue = String(val); const data = getCity(cityValue, code.sggCd); From 401b68fe24ad83c0ef2adc94c7f81f19e4a8b2bf Mon Sep 17 00:00:00 2001 From: YangJinSoo94 Date: Fri, 27 Jun 2025 11:21:03 +0900 Subject: [PATCH 3/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=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=99=95=EC=9D=B8=EC=A4=91,=20=EC=83=98?= =?UTF-8?q?=ED=94=8C=EC=96=91=EC=8B=9D=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx | 69 ++++++++++++------ .../wr/app/store/matDmd/ruseCaseMng/index.tsx | 9 ++- apps/wr/public/sample_ruseCaseMng.xlsx | Bin 0 -> 19429 bytes 3 files changed, 53 insertions(+), 25 deletions(-) create mode 100644 apps/wr/public/sample_ruseCaseMng.xlsx diff --git a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx index ac68c4a66..5e4bddaad 100644 --- a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx +++ b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx @@ -2,7 +2,7 @@ import { useWrStore } from "@/app/store"; import { ruseUtzType } from "@/app/store/matDmd/ruseCaseMng/headList"; -import { getCity } from "@/components/lib/func/commom"; +import { excelDownload, getCity } from "@/components/lib/func/commom"; import RuseCaseMngExcel from "@/components/ui/modal/coMat/ruseCaseMng/ruseCaseMngExcelModal"; import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; import { @@ -23,36 +23,61 @@ import { useState } from "react"; export default function RuseCaseMng() { const { code, ruseCaseMng, selectRuseCaseMng } = useWrStore((state) => state); - const [selectSgg, setSelectSgg] = useState(); + const [selectSgg, setSelectSgg] = useState([{val: "0", text: "전체"}]); const [objSearch, setObjSearch] = useState({ sgg: "", city: "" }); - const [selectUtz, setSelectUtz] = useState(); - const [searchTxt, setSearchTxt] = useState(); - + const [sidoCd, setSidoCd] = useState(""); const [sigunguCd, setSigunguCd] = useState(""); - const [usageCd, setUsageCd] = useState(""); + const [selectUtz, setSelectUtz] = useState(["조경용수"]); const [name, setName] = useState(""); + // 물재이용사례 조회 const searchRuseCaseMng = async () => { - const res = await selectRuseCaseMng(sidoCd, sigunguCd, usageCd, name); + console.log(selectUtz); + const res = await selectRuseCaseMng(sidoCd, sigunguCd, selectUtz, name); console.log('res : ', res); } + // 시도 선택 const getSelCity = (val: string | number) => { const cityValue = String(val); + const cityText = code.cityCd.find((item: any) => item.cityCd === cityValue)?.text; + setSidoCd(cityText || ""); + const data = getCity(cityValue, code.sggCd); setSelectSgg(data); setObjSearch({ city: cityValue, sgg: "" }); }; + // 시군구 선택 const getSgg = (val: string | number) => { + const sggValue = String(val); + const sggText = selectSgg?.find((item: any) => item.sggCd === sggValue)?.sggNm; + setSigunguCd(sggText || ""); setObjSearch({ ...objSearch, sgg: String(val) }); }; + // 엑셀 등록 모달 const [isExcelOpen, setIsExcelOpen] = useState<{ isModal: boolean; }>({ isModal: false }); + // 다운로드 + const download = () => { + console.log("다운로드"); + } + + // 양식받기 + const sampleDownLoad = () => { + excelDownload( + [[]], + "물재이용사례 관리", + "sample_ruseCaseMng.xlsx", + "A1:AX1", + 2 + ); + } + return ( <> @@ -88,9 +113,9 @@ export default function RuseCaseMng() { { - setSearchTxt(e); + setName(e); }} />
@@ -98,7 +123,7 @@ export default function RuseCaseMng() {
- -
@@ -119,16 +144,18 @@ export default function RuseCaseMng() {
- {}} - onPageChange={() => {}} - /> +
+ {}} + onPageChange={() => {}} + /> +
diff --git a/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx b/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx index 274af07af..0b40c1826 100644 --- a/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx +++ b/apps/wr/app/store/matDmd/ruseCaseMng/index.tsx @@ -1,4 +1,4 @@ -import { fetchType, postFectch } from "@/components/lib/api"; +import { fetchType, getFetch, postFectch } from "@/components/lib/api"; import type { TableUpperProps } from "../../common/type/header"; import { ruseCaseHeadListExport } from "./headList"; import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; @@ -71,8 +71,9 @@ type ruseCaseActions = { export const fetchSearchRuseCaseMng = async (sidoCd: string, sigunguCd: string, usageCd : string, name: string) => { const tailUrl = (sidoCd && !sigunguCd ? `/${sigunguCd}` : sigunguCd ? `/${sigunguCd}` : '/0') + (usageCd ? `/${usageCd}` : '') + (name ? `/${name}` : ''); console.log('tailUrl : ', tailUrl); - const response = await postFectch(`/reuseFc/pubFcRuseCase${tailUrl}`, {usageCd, name}, fetchType.WR); - return []; + const resp = await getFetch(fetchType.WR,`/reuseFc/pubFcRuseCase${tailUrl}`); + console.log('resp : ', resp); + return resp; }; export const fetchInsertRuseCaseMng = async (data: any) => { @@ -96,7 +97,7 @@ export const ruseCaseActionsExport: (set: any) => ruseCaseActions = ( return { selectRuseCaseMng: async (sidoCd: string, sigunguCd: string, usageCd : string, name: string) => { const res = await fetchSearchRuseCaseMng(sidoCd, sigunguCd, usageCd, name); - + console.log('res : ', res); set((state: ruseCaseState) => ({ ruseCaseMng: { ...state.ruseCaseMng, diff --git a/apps/wr/public/sample_ruseCaseMng.xlsx b/apps/wr/public/sample_ruseCaseMng.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3a88e0623e067d483927ce6dfdc452c2dbb2ee19 GIT binary patch literal 19429 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 VpMfz503d?DD8Mi-mUw#f{{gi`Sz7=A literal 0 HcmV?d00001