From a72281ba85ee0a77a36cbb2b33b0e3180c29ff1f Mon Sep 17 00:00:00 2001 From: truthwing Date: Fri, 9 May 2025 13:30:16 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=A4=91=EC=88=98=EB=8F=84=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=EC=97=90=20=EB=94=B0=EB=9D=BC=EC=84=9C=20=EB=B6=84?= =?UTF-8?q?=EA=B8=B0=20=EB=B6=80=EB=B6=84=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruseFcltMng/prfmncReg/chkgdnReg/page.tsx | 11 +- apps/wr/app/store/common/code/index.ts | 168 ++++++++------- .../prfmncReg/chkgdnReg/rainChkgdn/excel.tsx | 71 ++----- .../prfmncReg/chkgdnReg/rainChkgdn/index.tsx | 200 +++++++++--------- .../prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx | 17 ++ .../ui/modal/chkgdExcel/chkgdExcel.tsx | 7 +- 6 files changed, 230 insertions(+), 244 deletions(-) diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx index 2e8b4ee48..7eadc17c1 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx @@ -28,7 +28,7 @@ import { Toaster } from "react-hot-toast"; //----------------------- export default function Page() { - const { code, rainChkgdn, rainChkInit,rainChkDetilUpdate, rainChkDelete , rainChkExcelDownload } = useWrStore((state) => { + const { code, rainChkgdn, rainChkInit,rainChkDetilUpdate, rainChkDelete , rainChkExcelDownload, rswtrChkExcelDownload } = useWrStore((state) => { return state; }); const [isRegExcel, setIsRegExcel] = useState(false); @@ -60,9 +60,12 @@ export default function Page() { }, [rainChkgdn.excelList]); const excelClick= useCallback(()=>{ - - rainChkExcelDownload(code.cityCd, code.sggCd); - }, [rainChkExcelDownload, code.cityCd, code.sggCd]); + if(selFcltDiv === "RNB") { + rainChkExcelDownload(code.cityCd, code.sggCd); + } else { + rswtrChkExcelDownload(code.cityCd, code.sggCd); + } + }, [rainChkExcelDownload, rswtrChkExcelDownload, code.cityCd, code.sggCd]); diff --git a/apps/wr/app/store/common/code/index.ts b/apps/wr/app/store/common/code/index.ts index e5f25e318..86a03a120 100644 --- a/apps/wr/app/store/common/code/index.ts +++ b/apps/wr/app/store/common/code/index.ts @@ -3,25 +3,25 @@ import type { EnvPartSelectDataType, SelectDataType } from "@common/business_com -export const btnClass= "p-4 m-2 text-white rounded-sm text-lg font-medium " +export const btnClass = "p-4 m-2 text-white rounded-sm text-lg font-medium " - const yn :SelectDataType[]=[ - {val:'Y', text:'Y'}, - {val:'N', text:'N'}, +const yn: SelectDataType[] = [ + { val: 'Y', text: 'Y' }, + { val: 'N', text: 'N' }, ] //공통 건축물 용도 - const bdstUsgCd: SelectDataType[] = [ - { val: '-1', text: "확인불가" }, - { val: '1', text: "운동장" }, - { val: '2', text: "체육관" }, - { val: '3', text: "공공업무시설" }, - { val: '4', text: "공공기관의청사" }, - { val: '5', text: "아파트" }, - { val: '6', text: "연립주택" }, - { val: '7', text: "다세대주택" }, - { val: '8', text: "기숙사" }, - { val: '9', text: "초등학교" }, +const bdstUsgCd: SelectDataType[] = [ + { val: '-1', text: "확인불가" }, + { val: '1', text: "운동장" }, + { val: '2', text: "체육관" }, + { val: '3', text: "공공업무시설" }, + { val: '4', text: "공공기관의청사" }, + { val: '5', text: "아파트" }, + { val: '6', text: "연립주택" }, + { val: '7', text: "다세대주택" }, + { val: '8', text: "기숙사" }, + { val: '9', text: "초등학교" }, { val: '10', text: "중학교" }, { val: '11', text: "고등학교" }, { val: '12', text: "전문대학" }, @@ -31,7 +31,7 @@ export const btnClass= "p-4 m-2 text-white rounded-sm text-lg font-medium " { val: '16', text: "기타" }, ]; //빗물 집수면 종류 용도 - const rainFcltCd = [ +const rainFcltCd = [ { val: "1", text: "지붕" }, { val: "2", text: "건물옥상" }, { val: "3", text: "골프장 연못" }, @@ -44,7 +44,7 @@ export const btnClass= "p-4 m-2 text-white rounded-sm text-lg font-medium " { val: "10", text: "확인불가" }, ]; // 중수도 필수 원수종류 - const rswtBdstType: SelectDataType[] = [ +const rswtBdstType: SelectDataType[] = [ { text: "숙박업", val: "17" }, { text: "목욕장업", val: "18" }, { text: "공장", val: "19" }, @@ -84,28 +84,36 @@ const orgwtKndCd = [ { text: "기타", val: "5" }, ]; - const chBuCd = [ +const chBuCd = [ { val: "증축", text: "증축" }, { val: "개축", text: "개축" }, { val: "재축", text: "재축" }, ] - - +export const buildingType = { + RST:"RST", + RNB:"RNB", + HTB:"HTB" +} export type comCodeState = { code: { isInit: boolean; - chBuCd:SelectDataType[] + chBuCd: SelectDataType[] rainFcltCd: SelectDataType[]; bdstUsgCd: SelectDataType[]; cityCd: SelectDataType[]; sggCd: SelectDataType[]; - rvbsnCd:SelectDataType[]; - mdmbsnCd:SelectDataType[]; - lgbsnCd:SelectDataType[]; - lclgvrnmntCd:EnvPartSelectDataType[]; - orgwtKndCd:SelectDataType[]; - yn:SelectDataType[]; + rvbsnCd: SelectDataType[]; + mdmbsnCd: SelectDataType[]; + lgbsnCd: SelectDataType[]; + lclgvrnmntCd: EnvPartSelectDataType[]; + orgwtKndCd: SelectDataType[]; + yn: SelectDataType[]; + buildingType: { + RST:string, + RNB:string, + HTB:string + } }; }; @@ -114,7 +122,7 @@ export type comCodeType = comCodeState & comCodeActions; export const getSggCd = async (set: any) => { const sgg = await getFetch("common", "/addr/sgg"); const sggCd = sgg.map((item: any) => ({ - val:item.adstDstrCd, + val: item.adstDstrCd, text: item.gugun, })); set((state: comCodeState) => ({ @@ -130,7 +138,7 @@ export const getCityCd = async (set: any) => { val: item.adstDstrCd, text: item.sido, })); - cityCd.unshift({val:'0',text:'전체'}) + cityCd.unshift({ val: '0', text: '전체' }) set((state: comCodeState) => ({ code: { ...state.code, @@ -141,61 +149,61 @@ export const getCityCd = async (set: any) => { // 권역 API 호출 함수 추가 export const getRegionCd = async (set: any) => { - try{ - const rvbsn = await getFetch("common", "/addr/sarea"); - const rvbsnCd = rvbsn.map((item: any) => ({ - val: item.rvbsnCd, - text: item.rvbsn, - })); - rvbsnCd.unshift({val:'0',text:'전체'}) - set((state: comCodeState) => ({ - code: { - ...state.code, - rvbsnCd: rvbsnCd, - }, - })); -}catch(error){ - console.error('권역 데이터를 가져오는데 실패했습니다:', error); -} + try { + const rvbsn = await getFetch("common", "/addr/sarea"); + const rvbsnCd = rvbsn.map((item: any) => ({ + val: item.rvbsnCd, + text: item.rvbsn, + })); + rvbsnCd.unshift({ val: '0', text: '전체' }) + set((state: comCodeState) => ({ + code: { + ...state.code, + rvbsnCd: rvbsnCd, + }, + })); + } catch (error) { + console.error('권역 데이터를 가져오는데 실패했습니다:', error); + } }; // 중권역 API 호출 함수 추가 export const getMiddleRegionCd = async (set: any) => { - try{ - const mdmbsn = await getFetch("common", "/addr/midArea"); - const mdmbsnCd = mdmbsn.map((item: any) => ({ - val: item.rvbsnCd, - text: item.mdmbsn, - })); - mdmbsnCd.unshift({val:'0',text:'전체'}) - set((state: comCodeState) => ({ - code: { - ...state.code, - mdmbsnCd: mdmbsnCd, - }, - })); -}catch(error){ - console.error('중권역 데이터를 가져오는데 실패했습니다:', error); -} + try { + const mdmbsn = await getFetch("common", "/addr/midArea"); + const mdmbsnCd = mdmbsn.map((item: any) => ({ + val: item.rvbsnCd, + text: item.mdmbsn, + })); + mdmbsnCd.unshift({ val: '0', text: '전체' }) + set((state: comCodeState) => ({ + code: { + ...state.code, + mdmbsnCd: mdmbsnCd, + }, + })); + } catch (error) { + console.error('중권역 데이터를 가져오는데 실패했습니다:', error); + } }; // 단위유역 API 호출 함수 추가 -export const getUnitWaterShedCd =async (set: any) => { - try{ +export const getUnitWaterShedCd = async (set: any) => { + try { const lgbsn = await getFetch("common", "/addr/largeArea"); const lgbsnCd = lgbsn.map((item: any) => ({ val: item.rvbsnCd, text: item.lgbsn, })); - lgbsnCd.unshift({val:'0',text:'전체'}) + lgbsnCd.unshift({ val: '0', text: '전체' }) set((state: comCodeState) => ({ code: { ...state.code, lgbsnCd: lgbsnCd, }, })); - }catch(error){ + } catch (error) { console.error('대영역 데이터를 가져오는데 실패했습니다:', error); } }; @@ -203,23 +211,23 @@ export const getUnitWaterShedCd =async (set: any) => { // 환경청 데이터 -export const getEnvPartCd =async (set: any) => { - try{ +export const getEnvPartCd = async (set: any) => { + try { const lclgvrnmnt = await getFetch('common', '/addr/govArea'); const lclgvrnmntCd = lclgvrnmnt.map((item: any) => ({ val: item.lclgvrnmntCd, text: item.lclgvrnmntNm, - adstDliStrCd: item.adstDliStrCd || '' + adstDliStrCd: item.adstDliStrCd || '' })); - lclgvrnmntCd.unshift({val:'0',text:'전체' ,adstDliStrCd: '' }) + lclgvrnmntCd.unshift({ val: '0', text: '전체', adstDliStrCd: '' }) set((state: comCodeState) => ({ code: { ...state.code, lclgvrnmntCd: lclgvrnmntCd, }, })); - }catch(error){ + } catch (error) { console.error('환경청 데이터를 가져오는데 실패했습니다:', error); } }; @@ -231,16 +239,16 @@ export const comCodeStateExport: comCodeState = { isInit: false, rainFcltCd: rainFcltCd, bdstUsgCd: bdstUsgCd, - chBuCd:chBuCd, - orgwtKndCd:orgwtKndCd, + chBuCd: chBuCd, + orgwtKndCd: orgwtKndCd, cityCd: [], sggCd: [], - rvbsnCd:[], - mdmbsnCd:[], - lgbsnCd:[], - lclgvrnmntCd:[], - yn:yn, - + rvbsnCd: [], + mdmbsnCd: [], + lgbsnCd: [], + lclgvrnmntCd: [], + yn: yn, + buildingType:buildingType, }, }; @@ -276,11 +284,11 @@ export const codeActionExport: (set: any) => comCodeActions = (set: any) => { })); }, - divCityCd: async(cd: string) => { + divCityCd: async (cd: string) => { set((state: comCodeState) => ({ code: { ...state.code, - sggCd:state.code.sggCd.filter((item) => { return item.val.toString().slice(0,2) === cd }), + sggCd: state.code.sggCd.filter((item) => { return item.val.toString().slice(0, 2) === cd }), }, })); }, diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx index d6c8d8345..e8783ecef 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx @@ -1,7 +1,7 @@ +import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import type { SelectDataType } from "@common/business_components"; import type { rainChkZodType } from "."; -import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; -import { excelSerialToDateString } from "@/components/lib/func/commom"; +import { buildingType } from '../../../common/code/index'; const useTypes = [ "조경용수", "청소화장실용수", @@ -29,58 +29,25 @@ export type Buildingtype = { export const buildingToExcelType = ( buildings: Buildingtype[], sidoCode: SelectDataType[], - sggCdoe: SelectDataType[] + sggCdoe: SelectDataType[], + bdType: string, ) => { const excelData: string[][] = []; - buildings.forEach((building) => { - useTypes.forEach((useType) => { - excelData.push([ - building.bdstInfoPk.toString(), - sidoCode.find((sido) => sido.val === building.ctpvCd.toString()) - ?.text || "", - sggCdoe.find((sido) => sido.val === building.sggCd.toString())?.text || - "", - building.daddr, - building.bdstNm, - "", - "", - "", - "", - useType, - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - ]); + if(bdType===buildingType.RNB){ + buildings.forEach((building) => { + useTypes.forEach((useType) => { + excelData.push([ + building.bdstInfoPk.toString(), + sidoCode.find((sido) => sido.val === building.ctpvCd.toString()) + ?.text || "", + sggCdoe.find((sido) => sido.val === building.sggCd.toString())?.text || "",building.daddr,building.bdstNm,"","","","",useType,"","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + ]); + }); }); - }); - return excelData; + return excelData; + }else if(bdType===buildingType.RST){ + + } }; export const excelToRainChkData = ( @@ -106,7 +73,7 @@ export const excelToRainChkData = ( return { bdstRuseFcltFk: Number(item["NO"]), - chckYmd: item["점검일"] , + chckYmd: item["점검일"] , spwtPositn: item["유량측정방법"], rgtr: TEST_UUID, oilqMeasMthd: item["운영관리형태"], diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx index ec3464ab8..d544013d6 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx @@ -1,15 +1,15 @@ +import { buildingType } from "@/app/store/common/code"; import { TEST_UUID, type TableUpperProps, } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { deleteFectch, fetchType, getFetch, postFectch, putFectch } from "@/components/lib/api"; +import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; import type { SelectDataType } from "@common/business_components/ui"; import { z } from "zod"; -import { buildingToExcelType, excelToRainChkData } from "./excel"; -import toast from "react-hot-toast"; -import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; +import { buildingToExcelType } from "./excel"; -const guideDetail=z.object({ +const guideDetail = z.object({ chkgdnFk: z.number().nullable(), utztnUsgCd: z.string(), chckYmd: z.string(), @@ -44,7 +44,7 @@ export const rainChkZod = z.object({ rgtr: z.string().nullable(), mdfcnDt: z.string().nullable(), mdfr: z.string().nullable(), - }).nullable() , + }).nullable(), rainyDetails: z.array( z.object({ chkgdnFk: z.number().nullable(), @@ -69,21 +69,21 @@ export type rainChkZodType = z.infer; export const rainRegExcel = z.object({ bdstInfoPk: z.number().default(111111111), chckYr: z.string() - .default("") - .refine( - (year) => year.length === 0 || /^\d{4}$/.test(year), - { message: "4자리 연도만 입력하세요" } - ) - .refine( - (year) => { - if (year.length === 0) return true; // 빈 문자열은 통과 - const numYear = Number(year); - return !isNaN(numYear) && numYear <= new Date().getFullYear(); - }, - { message: "현재 년도보다 높은 수를 입력할 수 없습니다." } - ), -file: z.instanceof(File).optional(), -}); + .default("") + .refine( + (year) => year.length === 0 || /^\d{4}$/.test(year), + { message: "4자리 연도만 입력하세요" } + ) + .refine( + (year) => { + if (year.length === 0) return true; // 빈 문자열은 통과 + const numYear = Number(year); + return !isNaN(numYear) && numYear <= new Date().getFullYear(); + }, + { message: "현재 년도보다 높은 수를 입력할 수 없습니다." } + ), + file: z.instanceof(File).optional(), +}); export const fcltDiv = [ { val: "RST", text: "중수도시설" }, @@ -167,16 +167,16 @@ export const rainChkgdnHeadList: TableUpperProps[] = [ export const ruseHeadList: TableUpperProps[] = [ { id: "utztnUsgCd", title: "이용용도" }, - { id: "ruseTotal", title: "계", upName: "ruseWater", upSequnce: 1 }, - { id: "ruse01", title: "1월", upName: "ruseWater", upSequnce: 2 }, - { id: "ruse02", title: "2월", upName: "ruseWater", upSequnce: 3 }, - { id: "ruse03", title: "3월", upName: "ruseWater", upSequnce: 4 }, - { id: "ruse04", title: "4월", upName: "ruseWater", upSequnce: 5 }, - { id: "ruse05", title: "5월", upName: "ruseWater", upSequnce: 6 }, - { id: "ruse06", title: "6월", upName: "ruseWater", upSequnce: 7 }, - { id: "ruse07", title: "7월", upName: "ruseWater", upSequnce: 8 }, - { id: "ruse08", title: "8월", upName: "ruseWater", upSequnce: 9 }, - { id: "ruse09", title: "9월", upName: "ruseWater", upSequnce: 10 }, + { id: "ruseTotal", title: "계", upName: "ruseWater", upSequnce: 1 }, + { id: "ruse01", title: "1월", upName: "ruseWater", upSequnce: 2 }, + { id: "ruse02", title: "2월", upName: "ruseWater", upSequnce: 3 }, + { id: "ruse03", title: "3월", upName: "ruseWater", upSequnce: 4 }, + { id: "ruse04", title: "4월", upName: "ruseWater", upSequnce: 5 }, + { id: "ruse05", title: "5월", upName: "ruseWater", upSequnce: 6 }, + { id: "ruse06", title: "6월", upName: "ruseWater", upSequnce: 7 }, + { id: "ruse07", title: "7월", upName: "ruseWater", upSequnce: 8 }, + { id: "ruse08", title: "8월", upName: "ruseWater", upSequnce: 9 }, + { id: "ruse09", title: "9월", upName: "ruseWater", upSequnce: 10 }, { id: "ruse10", title: "10월", upName: "ruseWater", upSequnce: 11 }, { id: "ruse11", title: "11월", upName: "ruseWater", upSequnce: 12 }, { id: "ruse12", title: "12월", upName: "ruseWater", upSequnce: 13 }, @@ -184,16 +184,16 @@ export const ruseHeadList: TableUpperProps[] = [ export const splHeadList: TableUpperProps[] = [ { id: "utztnUsgCd", title: "이용용도" }, - { id: "splTotal", title: "계", upName: "splWater", upSequnce: 1 }, - { id: "spl01", title: "1월", upName: "splWater", upSequnce: 2 }, - { id: "spl02", title: "2월", upName: "splWater", upSequnce: 3 }, - { id: "spl03", title: "3월", upName: "splWater", upSequnce: 4 }, - { id: "spl04", title: "4월", upName: "splWater", upSequnce: 5 }, - { id: "spl05", title: "5월", upName: "splWater", upSequnce: 6 }, - { id: "spl06", title: "6월", upName: "splWater", upSequnce: 7 }, - { id: "spl07", title: "7월", upName: "splWater", upSequnce: 8 }, - { id: "spl08", title: "8월", upName: "splWater", upSequnce: 9 }, - { id: "spl09", title: "9월", upName: "splWater", upSequnce: 10 }, + { id: "splTotal", title: "계", upName: "splWater", upSequnce: 1 }, + { id: "spl01", title: "1월", upName: "splWater", upSequnce: 2 }, + { id: "spl02", title: "2월", upName: "splWater", upSequnce: 3 }, + { id: "spl03", title: "3월", upName: "splWater", upSequnce: 4 }, + { id: "spl04", title: "4월", upName: "splWater", upSequnce: 5 }, + { id: "spl05", title: "5월", upName: "splWater", upSequnce: 6 }, + { id: "spl06", title: "6월", upName: "splWater", upSequnce: 7 }, + { id: "spl07", title: "7월", upName: "splWater", upSequnce: 8 }, + { id: "spl08", title: "8월", upName: "splWater", upSequnce: 9 }, + { id: "spl09", title: "9월", upName: "splWater", upSequnce: 10 }, { id: "spl10", title: "10월", upName: "splWater", upSequnce: 11 }, { id: "spl11", title: "11월", upName: "splWater", upSequnce: 12 }, { id: "spl12", title: "12월", upName: "splWater", upSequnce: 13 }, @@ -302,8 +302,8 @@ export type rainChkgdnState = { splHeadList: TableUpperProps[]; rswtDetailHeadList: TableUpperProps[]; isInit: boolean; - isModalClose:boolean; - excelList:[]; + isModalClose: boolean; + excelList: []; }; }; @@ -311,9 +311,9 @@ type rainChkgdnActions = { rainChkInit: (sggCd: string, searchTxt: string) => void; rainChkDetilUpdate(rainChk: rainChkZodType[]): Promise; rainChkGuidUpdate(rainChk: rainChkZodType): Promise; - rainChkExcelDownload(sidoCode: SelectDataType[],sggCode: SelectDataType[]): Promise - rainChkExcelDataUPload(excelData:rainChkZodType[]) : Promise - rainChkDelete( chkgdnPks:number[] ) :Promise + rainChkExcelDownload(sidoCode: SelectDataType[], sggCode: SelectDataType[]): Promise + rainChkExcelDataUPload(excelData: rainChkZodType[]): Promise + rainChkDelete(chkgdnPks: number[]): Promise }; export type rainChkgdnType = rainChkgdnState & rainChkgdnActions; @@ -323,20 +323,20 @@ export const rainChkgdnStateExport: rainChkgdnState = { rainChkgdnHeadList: rainChkgdnHeadList, rainHeadNm: rainHeadNm, rainChk: rainChk, - splHeadList:splHeadList, + splHeadList: splHeadList, ruseHeadList: ruseHeadList, rswtDetailHeadList: rswtDetailHeadList, isInit: false, - isModalClose:false, - excelList:[] + isModalClose: false, + excelList: [] }, }; const makeMdfrChk = (data: rainChkZodType[], type: string, toDo: string) => { - const chData=data.map((item) => { + const chData = data.map((item) => { item.mdfr = TEST_UUID; - + if (type === "rainyDetails") { item.rainyDetails.forEach((item) => { item.mdfr = TEST_UUID; @@ -366,25 +366,23 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( set: any ) => { return { - rainChkExcelDownload:async(sidoCode:SelectDataType[], sggCode:SelectDataType[])=>{ - - // 로그인한 아이디의 시도 or 시군구로 들어가야하는데 현재는 그냥 0으로 하드코딩 - const data = await getFetch(fetchType.WR, `/reuseFc/buildingFlg/RNB/41`) - // const excelList = buildingToExcelType(data, sidoCode, sggCode); + rainChkExcelDownload: async (sidoCode: SelectDataType[], sggCode: SelectDataType[]) => { - const excelList = buildingToExcelType(data, sidoCode, sggCode); + // 로그인한 아이디의 시도 or 시군구로 들어가야하는데 현재는 그냥 0으로 하드코딩 + const data = await getFetch(fetchType.WR, `/reuseFc/buildingFlg/${buildingType.RNB}/41`) + const excelList = buildingToExcelType(data, sidoCode, sggCode, buildingType.RNB); set((state: rainChkgdnState) => ({ rainChkgdn: { ...state.rainChkgdn, - excelList:excelList + excelList: excelList }, })); }, - rainChkExcelDataUPload: async(excelData:rainChkZodType[] ) =>{ - try{ + rainChkExcelDataUPload: async (excelData: rainChkZodType[]) => { + try { const res = await postFectch("/reuseChk/rainyExcel", excelData); if (res.ok) { - ToastFormUi({body:"지도점검 등록이 완료되었습니다. " ,title:'지도점검 등록'}) + ToastFormUi({ body: "지도점검 등록이 완료되었습니다. ", title: '지도점검 등록' }) } const rainChkRes = await initFetch('2024', '0'); return set((state: rainChkgdnState) => ({ @@ -394,9 +392,9 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( rainChk: rainChkRes, }, })); - }catch(error){ + } catch (error) { console.log(error); - ToastFormUi({body:"지도점검 등록이 실패되었습니다." ,title:'지도점검 등록'}) + ToastFormUi({ body: "지도점검 등록이 실패되었습니다.", title: '지도점검 등록' }) } }, rainChkInit: async (searchTxt: string, sggCd: string) => { @@ -414,13 +412,13 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( console.log(error); } }, - rainChkDetilUpdate: async (rainChk: rainChkZodType[] ) => { + rainChkDetilUpdate: async (rainChk: rainChkZodType[]) => { try { const chData = await makeMdfrChk(rainChk, "rain", "rainDetil"); const res = await postFectch("/reuseChk/rainyExcel", rainChk); if (res.ok) { - ToastFormUi({body:"지도점검 보급수 및 밋물이용량 수정이 완료되었습니다. " ,title:'지도점검 수정'}) + ToastFormUi({ body: "지도점검 보급수 및 밋물이용량 수정이 완료되었습니다. ", title: '지도점검 수정' }) } const rainChkRes = await initFetch('2024', '0'); return set((state: rainChkgdnState) => ({ @@ -436,49 +434,45 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( } }, rainChkGuidUpdate: async (rainChk: rainChkZodType) => { - try{ - //const chData = await makeMdfrChk(rainChk, "guideDetails", "rainDetil"); - const res = await putFectch("/reuseChk/rainy", rainChk); - if (res.ok) { - ToastFormUi({body:"지도점검 수질 및 과태료 수정이 완료되었습니다. " ,title:'지도점검 수정'}) - } - const rainChkRes = await initFetch('2024', '0'); - return set((state: rainChkgdnState) => ({ - ...state, - rainChkgdn: { - ...state.rainChkgdn, - rainChk: rainChkRes, - }, - })); - }catch(error){ - console.log(error); + try { + //const chData = await makeMdfrChk(rainChk, "guideDetails", "rainDetil"); + const res = await putFectch("/reuseChk/rainy", rainChk); + if (res.ok) { + ToastFormUi({ body: "지도점검 수질 및 과태료 수정이 완료되었습니다. ", title: '지도점검 수정' }) } - - - }, - rainChkDelete: async (chkgdnPks:number[] ) =>{ - try{ - const res = await deleteFectch(`/reuseChk/rainy`,chkgdnPks); - - if(res.ok){ - ToastFormUi({body:"삭제가 완료되었습니다. " ,title:'지도점검 삭제'}) - } - const rainChkRes = await initFetch('2024', '0'); - return set((state: rainChkgdnState) => ({ - ...state, - rainChkgdn: { - ...state.rainChkgdn, - rainChk: rainChkRes, - }, - })); - - - }catch(error){ - ToastFormUi({body:"삭제를 실패했습니다.. " ,title:'지도점검 삭제'}) - + const rainChkRes = await initFetch('2024', '0'); + return set((state: rainChkgdnState) => ({ + ...state, + rainChkgdn: { + ...state.rainChkgdn, + rainChk: rainChkRes, + }, + })); + } catch (error) { + console.log(error); } + }, + rainChkDelete: async (chkgdnPks: number[]) => { + try { + const res = await deleteFectch(`/reuseChk/rainy`, chkgdnPks); + + if (res.ok) { + ToastFormUi({ body: "삭제가 완료되었습니다. ", title: '지도점검 삭제' }) + } + const rainChkRes = await initFetch('2024', '0'); + return set((state: rainChkgdnState) => ({ + ...state, + rainChkgdn: { + ...state.rainChkgdn, + rainChk: rainChkRes, + }, + })); + } catch (error) { + ToastFormUi({ body: "삭제를 실패했습니다.. ", title: '지도점검 삭제' }) + + } } diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx index 7cfc37c65..9ba3e1404 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx @@ -1,5 +1,9 @@ import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import type { chHeadType } from "../rainChkgdn"; +import type { SelectDataType } from "@common/business_components"; +import { fetchType, getFetch } from "@/components/lib/api"; +import { buildingToExcelType } from "../rainChkgdn/excel"; +import { buildingType } from "@/app/store/common/code"; @@ -50,6 +54,7 @@ export type rswtChkgdnState = { type rswtChkgdnActions = { rswtChkgdnInit: (sggCd: string, searchTxt: string, flag: string) => void; + rswtrChkExcelDownload(sidoCode: SelectDataType[],sggCode: SelectDataType[]): Promise }; export type rswtChkgdnType = rswtChkgdnState & rswtChkgdnActions; @@ -64,9 +69,21 @@ export const rswtChkgdnStateExport: rswtChkgdnState = { export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( set: any ) => { + rswtrChkExcelDownload: async (sidoCode: SelectDataType[],sggCode: SelectDataType[]) => { + const data = await getFetch(fetchType.WR, `/reuseFc/buildingFlg/${buildingType.RST}/41`) + const excelList = buildingToExcelType(data, sidoCode, sggCode, buildingType.RST); + set((state: rswtChkgdnState) => ({ + rswtChkgdn: { + ...state.rswtChkgdn, + excelList:excelList + }, + })); + } + } return { rswtChkgdnInit: async (sggCd: string, searchTxt: string, flg: string) => { }, + , }; }; diff --git a/apps/wr/components/ui/modal/chkgdExcel/chkgdExcel.tsx b/apps/wr/components/ui/modal/chkgdExcel/chkgdExcel.tsx index 895af4388..ddd762a12 100644 --- a/apps/wr/components/ui/modal/chkgdExcel/chkgdExcel.tsx +++ b/apps/wr/components/ui/modal/chkgdExcel/chkgdExcel.tsx @@ -1,21 +1,18 @@ import { useWrStore } from "@/app/store"; -import { rainChkZod, rainRegExcel, type rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; +import { rainRegExcel, type rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; import { excelToRainChkData } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel"; -import { selectClass } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { - DatePicker, filePicked, FileUpload, Form, FormField, FormUi, - Title, + Title } from "@common/business_components/ui"; import { Button, Input } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; -import toast, { Toaster } from "react-hot-toast"; import type { z } from "zod"; import { ToastFormUi } from "../../toast/toastFromUi"; From cc17bd834f17886c42e4f4b59f38bc6fbbd0a457 Mon Sep 17 00:00:00 2001 From: truthwing Date: Fri, 9 May 2025 13:30:27 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=83=98=ED=94=8C=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=ED=8F=AC=ED=95=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/public/sample_rs_chk.xlsx | Bin 0 -> 12511 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/wr/public/sample_rs_chk.xlsx diff --git a/apps/wr/public/sample_rs_chk.xlsx b/apps/wr/public/sample_rs_chk.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e114862bd44577b7fea40e232b736abc91181abe GIT binary patch literal 12511 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 literal 0 HcmV?d00001