From 85421179471a706df4b116612c1604f24c2eb741 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Tue, 29 Apr 2025 10:24:13 +0900 Subject: [PATCH 1/2] =?UTF-8?q?excel=20test=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruseFcltMng/fcltSttn/rainSttn/page.tsx | 20 +- .../ruseFcltMng/prfmncReg/chkgdnReg/page.tsx | 15 +- .../prfmncReg/chkgdnReg/rainChkgdn/index.tsx | 2 +- .../ruseFcltMng/fcltReg/rainReg/index.tsx | 4 + .../store/ruseFcltMng/fcltSttn/sttn/excel.tsx | 92 +++++++-- .../store/ruseFcltMng/fcltSttn/sttn/index.tsx | 24 +-- apps/wr/components/lib/func/TableData.tsx | 144 ++++++++++++++ .../lib/func/{commom.ts => commom.tsx} | 20 +- .../guideDetailTable/guideDetailTable.tsx | 6 +- .../chkgdTable/rainChkgd/rainChkgdTable.tsx | 181 ++---------------- apps/wr/public/sample.xlsx | Bin 0 -> 15020 bytes apps/wr/public/sample_rainSttn.xlsx | Bin 0 -> 9091 bytes apps/wr/public/sample_rainSttn_test.xlsx | Bin 0 -> 8482 bytes 13 files changed, 281 insertions(+), 227 deletions(-) create mode 100644 apps/wr/components/lib/func/TableData.tsx rename apps/wr/components/lib/func/{commom.ts => commom.tsx} (67%) create mode 100644 apps/wr/public/sample.xlsx create mode 100644 apps/wr/public/sample_rainSttn.xlsx create mode 100644 apps/wr/public/sample_rainSttn_test.xlsx diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx index 2f2afbac0..aa5fd43e0 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx @@ -3,7 +3,7 @@ import { useWrStore } from "@/app/store"; import { btnClass } from "@/app/store/common/code"; import type { TableTripleProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; -import { tableData } from "@/components/lib/func/commom"; +import { excelDownload, tableData } from "@/components/lib/func/commom"; import HeadChModal from "@/components/ui/modal/headChModal/headChModal"; import { ContentsDiv, @@ -20,7 +20,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { headMakeTriple } from "./TableHead"; export default function RainSttn() { - const { code, sttnCommon, excelRainSttn,excelExportAction, rainSttnSearch } = + const { code, sttnCommon, excelExportAction, rainSttnSearch } = useWrStore((state) => state); const { rainRes } = sttnCommon; @@ -66,21 +66,14 @@ export default function RainSttn() { useEffect(() => { if(sttnCommon.excelList.length>0){ if (sttnCommon.excelList.length === 0) return; - fetch('/sample_rainy.xlsx', {}) - .then(async (response) => { - if (!response.ok) { - throw Error(response.statusText) - } - // 받은 파일 바인너리 처리 - const blobRet = await response.arrayBuffer() - // 버퍼에 있는 엑셀데이터 전달 후 json으로 변환 - const ret =await filePickedBlob(blobRet, sttnCommon.excelList ) - console.log('ret', ret); - }) + excelDownload(sttnCommon.excelList , '빗물재이용시설 현황','sample_rainSttn_test.xlsx') } + + }, [sttnCommon.excelList]); const excelClick = useCallback((returnType:ReturnType) => { + let con if (returnType.sigunValue != '0') { con = returnType.sigunValue @@ -114,7 +107,6 @@ export default function RainSttn() { } leftChildren={undefined} queryClick={function (returnType: ReturnType): void { - // page: string, total: string, con: string // '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}' let con if (returnType.sigunValue != '0') { diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx index c29a33a1f..5d8889db1 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx @@ -7,6 +7,7 @@ import { type rainChkZodType, } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import { excelDownload } from "@/components/lib/func/commom"; import ChkgdExcel from "@/components/ui/modal/chkgdExcel/chkgdExcel"; import ChkgdModal from "@/components/ui/modal/chkgdModal/chkgdModal"; import RainChkgdTable from "@/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable"; @@ -53,19 +54,7 @@ export default function Page() { useEffect(() => { - console.log("rainChkgdn.excelList", rainChkgdn.excelList); - if (rainChkgdn.excelList.length === 0) return; - fetch('/sample_rainy.xlsx', {}) - .then(async (response) => { - if (!response.ok) { - throw Error(response.statusText) - } - // 받은 파일 바인너리 처리 - const blobRet = await response.arrayBuffer() - // 버퍼에 있는 엑셀데이터 전달 후 json으로 변환 - const ret =await filePickedBlob(blobRet, rainChkgdn.excelList ) - console.log('ret', ret); - }) + excelDownload(rainChkgdn.excelList); }, [rainChkgdn.excelList]); const excelClick= useCallback(()=>{ diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx index 542c6e8b1..f8832a220 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx @@ -288,7 +288,7 @@ export type rainChkgdnState = { splHeadList: TableUpperProps[]; rswtDetailHeadList: TableUpperProps[]; isInit: boolean; - excelList:ExcelExportType[] | JSON[] + excelList:JSON[]; }; }; diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx index 0963cf72e..ccf0e2b32 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx @@ -101,6 +101,10 @@ export type TableUpperProps = { type?: string; }; + + + + export type TableTripleProps = { id: string; title: string; diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/excel.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/excel.tsx index b50d77923..5f4cc83ba 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/excel.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/excel.tsx @@ -24,20 +24,13 @@ export type ExcelSttnRainType={ }, "저류조용량": string, }, - "3.시설운영및 이용정보"?:{ - "운영관리코드": string, - "연간빗물운영량": string - }, + "3.인센티브 정보":{ "설치비지원":{ "설치지원비용여부": string, "설치지원비용": string, }, - "요금감면"?:{ - "감면여부": string, - "감면근거": string, - "감면금액": string, - }, + "녹색건축물인증여부":{ "녹색건축물인증여부": string, "녹색건축물인증년도": string, @@ -47,7 +40,7 @@ export type ExcelSttnRainType={ } } -const excelSttnParsing = (data: customRainBdst[]): ExcelSttnRainType[] => { +export const excelSttnParsing = (data: customRainBdst[]): ExcelSttnRainType[] => { const excelExportData: ExcelSttnRainType[] = [] data.forEach((item) => { excelExportData.push( @@ -89,8 +82,85 @@ const excelSttnParsing = (data: customRainBdst[]): ExcelSttnRainType[] => { } }) }); + + console.log(excelExportData) // excelItem = {} as ExcelSttnRainType // excelItem["1.건축물정보"]["행정구역"]["시도"] = item.sidoNm // excelItem["1.건축물정보"]["행정구역"]["시군구"] = item.sggNm return excelExportData; -} \ No newline at end of file +} + + + + +export type ExcelSttnRainTypeFlat = { + 행정구역: string; + 건축물명: string; + 주소: string; + 건축물용도코드: string; + 최초건축허가일: string; + 건축면적: string; + 법적의무대상: string; + 설치완료일시: string; + + 설치비용: string; + 집수면: string; + 여과등처리시설: string; + 저류조용량: string; + + 운영관리코드?: string; + 연간빗물운영량?: string; + + 설치지원비용여부: string; + 설치지원비용: string; + + 녹색건축물인증여부: string; + }; + + +export const excelSttnParsingJson = (data: customRainBdst[]): ExcelSttnRainTypeFlat[] => { + const excelExportData: ExcelSttnRainTypeFlat[] = []; + + data.forEach((item) => { + excelExportData.push({ + // 1.건축물정보 + "행정구역": JSON.stringify({ + 시도: String(item.ctpvCd), + 시군구: String(item.sggCd) + }), + "건축물명": item.bdstNm ?? "", + "주소": item.daddr ?? "", + "건축물용도코드": String(item.bdstInfoPk ?? ""), + "최초건축허가일": String(item.frstArchPrmsnDt ?? ""), + "건축면적": String(item.archArea ?? ""), + "법적의무대상": String(item.reuseBuilding?.[0]?.lawTrgtYn ?? ""), + "설치완료일시": String(item.reuseBuilding?.[0]?.instlCmptnDt ?? ""), + + // 2.빗물이용시설정보 + "설치비용": String(item.reuseBuilding?.[0]?.instlCst ?? ""), + "집수면": JSON.stringify({ + 집수지점종류: item.reuseBuilding?.[0]?.rainyObj?.pntfColKnd ?? "", + 집수지점면적: String(item.reuseBuilding?.[0]?.rainyObj?.pntfColArea ?? "") + }), + "여과등처리시설": JSON.stringify({ + 여과처리시설유무: String(item.reuseBuilding?.[0]?.rainyObj?.filtrTrtmfctYn ?? ""), + 여과처리시설용량: String(item.reuseBuilding?.[0]?.rainyObj?.filtrTrtmfctCpct ?? ""), + 여과처리시설처리공정: String(item.reuseBuilding?.[0]?.rainyObj?.filtrTrtmfctPrs ?? "") + }), + "저류조용량": String(item.reuseBuilding?.[0]?.rainyObj?.dtfcltCpct ?? ""), + + // 3.인센티브 정보 + "설치지원비용여부": String(item.reuseBuilding?.[0]?.instlCstSprtYn ?? ""), + "설치지원비용": String(item.reuseBuilding?.[0]?.instlCstSprtAmt ?? ""), + + "녹색건축물인증여부": JSON.stringify({ + 녹색건축물인증여부: String(item.reuseBuilding?.[0]?.grntchBdstCertYn ?? ""), + 녹색건축물인증년도: String(item.reuseBuilding?.[0]?.grntchBdstCertYr ?? ""), + 녹색건축물인증번호: String(item.reuseBuilding?.[0]?.grntchBdstCertNo ?? ""), + 녹색건축물인증등급: String(item.reuseBuilding?.[0]?.grntchBdstCertGrd ?? "") + }), + }); + }); + + return excelExportData; + }; \ No newline at end of file diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/index.tsx index f8e2c6c09..7972a949b 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/index.tsx @@ -4,7 +4,7 @@ import { type TableTripleProps, type TableUpperProps, } from "../../fcltReg/rainReg"; -import type { ExcelSttnRainType } from "./excel"; +import { excelSttnParsing, excelSttnParsingJson, type ExcelSttnRainType, type FlatExcelSttnRainType } from "./excel"; import { fetchType, getFetch } from "@/components/lib/api"; const pbnSttHeadNm: chHeadType[] = [ @@ -316,7 +316,6 @@ export type sttnState = { type sttnActions = { rainSttnSearch: (page: string, total: string, con: string) => void; chSttnHead: (checkList: string[], type: string) => void; - excelRainSttn:(data:JSON[] ) => void }; export type sttnType = sttnState & sttnActions; @@ -342,12 +341,14 @@ export const sttnActionsExport: (set: any) => sttnActions = (set: any) => { `/reuseFc/rainyInfoList/${page}/${total}/${con}` ); if(Number(total) > 9000){ + //const rainExcel= excelSttnParsing(rainRes) + const rainExcel= excelSttnParsing(rainRes) set((state: sttnState) => { return { ...state, sttnCommon: { ...state.sttnCommon, - excelList: rainRes, + excelList: rainExcel, }, }; }); @@ -367,21 +368,6 @@ export const sttnActionsExport: (set: any) => sttnActions = (set: any) => { console.log("error", erTxt); } }, - excelRainSttn: async (data: JSON[]) => { - //TODO: 엑셀 데이터 array 생성해서 return 필요. ExcelSttnRainType[]으로 생성해서 던져주면 됨. - - - set((state: sttnState) => { - return { - ...state, - sttnCommon: { - ...state.sttnCommon, - rainRes: rainRes, - isInit: false, - }, - }; - }); - }, chSttnHead: async (checkList: string[], type: string) => { const headList = type === "pbn" @@ -423,3 +409,5 @@ export const sttnActionsExport: (set: any) => sttnActions = (set: any) => { }, }; }; + + diff --git a/apps/wr/components/lib/func/TableData.tsx b/apps/wr/components/lib/func/TableData.tsx new file mode 100644 index 000000000..d6bc9f30e --- /dev/null +++ b/apps/wr/components/lib/func/TableData.tsx @@ -0,0 +1,144 @@ +import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; +import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import { Checkbox, Input, TableCell, TableRow } from "@common/components/ui"; + +export const rightTableData = (rainChk: rainChkZodType[]) => { + // 1. chkgdnFk + utztnUsgCd 기준 누계 정보 만들기 + const maketotal = rainChk.map((item: any) => { + const selectTotal = item.guideDetails.reduce((acc: any, cur: any) => { + const code = cur.utztnUsgCd; + const fk = cur.chkgdnFk; + + const key = `${fk}_${code}`; + acc[key] = acc[key] || { + totalSplyUswtrUtztnQnt: 0, + totalRuseFcltUtztnQnt: 0, + }; + + acc[key].totalSplyUswtrUtztnQnt += cur.splyUswtrUtztnQnt; + acc[key].totalRuseFcltUtztnQnt += cur.ruseFcltUtztnQnt; + + return acc; + }, {}); + + return selectTotal; // 모든 키: `${chkgdnFk}_${utztnUsgCd}` 형태 + }); + + // 2. 누계 정보들을 하나의 객체로 합치기 (평탄화) + const flatTotalMap = Object.assign({}, ...maketotal); + + // 3. rainyDetails에 누계 정보 주입 + + const updatedRainyDetails: any[] = []; + rainChk.forEach((rd: any) => { + const details = rd.rainyDetails.forEach((rainyItem: any) => { + const key = `${rainyItem.chkgdnFk}_${rainyItem.utztnUsgCd}`; + const totals = flatTotalMap[key] || { + totalSplyUswtrUtztnQnt: 0, + totalRuseFcltUtztnQnt: 0, + }; + + updatedRainyDetails.push({ + ...rd, + ...rd.building, + ...rainyItem, + ...totals, + rowspan: rd.rainyDetails?.length, + }); + }); + }); + + return updatedRainyDetails; +}; + + + + + +export const chRowspanTable = ( + makeTableData: any[], + headList: TableUpperProps[], + handleChange: ( + rowIndex: number, + field: keyof (typeof makeTableData)[0], + value: string | number + ) => void, + toggleSelection: (pk: number, checked: boolean) => void, + selectedIds: number[], + handleCellClick: (index: number, headId: string) => void + ) => { + + + + + // rowspan된 셀 렌더링 여부 추적용 + const renderedMap = new Map>(); + return ( + <> + {makeTableData.map((row, rowIndex) => ( + + {headList.map((head) => { + const key = head.id; + const isMerged = head.rowSpan; + const value = row[key]; + + // 병합 대상이면 중복 렌더링 여부 판단 + if (isMerged) { + const renderedSet = renderedMap.get(key) ?? new Set(); + if (renderedSet.has(rowIndex)) return null; // 이미 렌더링된 셀은 skip + + const rowspan = row.rowspan ?? 1; + for (let i = 0; i < rowspan; i++) { + renderedSet.add(rowIndex + i); + } + renderedMap.set(key, renderedSet); + + return ( + + {key === "order" ? ( + + toggleSelection(row.chkgdnPk, checked === true) + } + > + ) : ( + value + )} + + ); + } + + // 기본 셀 + return ( + handleCellClick(rowIndex, head.id)} + > + {key === "totalSplyUswtrUtztnQnt" || + key === "totalRuseFcltUtztnQnt" || + key === "utztnUsgCd" ? ( + `${value}` + ) : ( + { + handleChange(rowIndex, head.id, e.target.value); + }} + value={value} + /> + )} + + ); + })} + + ))} + + ); + }; \ No newline at end of file diff --git a/apps/wr/components/lib/func/commom.ts b/apps/wr/components/lib/func/commom.tsx similarity index 67% rename from apps/wr/components/lib/func/commom.ts rename to apps/wr/components/lib/func/commom.tsx index ecae649dd..6f18a5810 100644 --- a/apps/wr/components/lib/func/commom.ts +++ b/apps/wr/components/lib/func/commom.tsx @@ -1,5 +1,5 @@ import type { comCodeState, } from "@/app/store/common/code"; -import type { SelectDataType } from "@common/business_components/ui"; +import { filePickedBlob, type SelectDataType } from "@common/business_components/ui"; @@ -47,4 +47,20 @@ export const getCity = (val: string, sggCd: SelectDataType[]) => { }); } - \ No newline at end of file + + + export const excelDownload =(excelList: JSON[], fileNm:string ,sampleFile:string ) =>{ + console.log("excelList", excelList); + if (excelList.length === 0) return; + fetch(`/${sampleFile}`, {}) + .then(async (response) => { + if (!response.ok) { + throw Error(response.statusText) + } + // 받은 파일 바인너리 처리 + const blobRet = await response.arrayBuffer() + // 버퍼에 있는 엑셀데이터 전달 후 json으로 변환 + const ret =await filePickedBlob(blobRet, excelList,fileNm ) + + }) +} \ No newline at end of file diff --git a/apps/wr/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable.tsx b/apps/wr/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable.tsx index c38fc93d3..d87f4ca28 100644 --- a/apps/wr/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable.tsx +++ b/apps/wr/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable.tsx @@ -1,8 +1,7 @@ "use client"; -import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/page"; +import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; import { useWrStore } from "@/app/store"; import type { - rainChkZodType, splRuseWaterType, } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; @@ -30,7 +29,6 @@ export function GuideDetailsTable({ const { code, rainChkgdn } = useWrStore((state) => state); const [guidData, setGuidData] = useState(); - const nodeList = headMakeprfmnc(headList, rainChkgdn?.rainHeadNm); const handleChange = ( rowIndex: number, @@ -89,7 +87,7 @@ export function GuideDetailsTable({ <>
- {nodeList} + {headMakeprfmnc(headList, rainChkgdn?.rainHeadNm)} {tableBody(guidData ?? [])} diff --git a/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx b/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx index f34efa467..19a1164bd 100644 --- a/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx +++ b/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx @@ -1,167 +1,20 @@ "use client"; -import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/page"; import { useWrStore } from "@/app/store"; import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; -import type { TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { tableData } from "@/components/lib/func/commom"; import { UiModal } from "@common/business_components/ui"; import { - Checkbox, - Input, Table, TableBody, - TableCell, TableHeader, - TableRow, } from "@common/components/ui"; import { useEffect, useState } from "react"; import ChkgdModal from "../../../modal/chkgdModal/chkgdModal"; - -export const totalData = ( - makeTableData: any[], - headList: TableUpperProps[], - handleChange: ( - rowIndex: number, - field: keyof (typeof makeTableData)[0], - value: string | number - ) => void, - toggleSelection: (pk: number, checked: boolean) => void, - selectedIds: number[], - handleCellClick: (index: number, headId: string) => void -) => { - const mergeKeys = [ - "order", - "cityText", - "sggText", - "bdstNm", - "operMngCd", - "flowCheck", - "yearFee", - "rainDtnbaOpct", - "chckYmd", - ]; - - // rowspan된 셀 렌더링 여부 추적용 - const renderedMap = new Map>(); - return ( - <> - {makeTableData.map((row, rowIndex) => ( - - {headList.map((head) => { - const key = head.id; - const isMerged = head.rowSpan; - const value = row[key]; - - // 병합 대상이면 중복 렌더링 여부 판단 - if (isMerged) { - const renderedSet = renderedMap.get(key) ?? new Set(); - if (renderedSet.has(rowIndex)) return null; // 이미 렌더링된 셀은 skip - - const rowspan = row.rowspan ?? 1; - for (let i = 0; i < rowspan; i++) { - renderedSet.add(rowIndex + i); - } - renderedMap.set(key, renderedSet); - - return ( - - {key === "order" ? ( - - toggleSelection(row.chkgdnPk, checked === true) - } - > - ) : ( - value - )} - - ); - } - - // 기본 셀 - return ( - handleCellClick(rowIndex, head.id)} - > - {key === "totalSplyUswtrUtztnQnt" || - key === "totalRuseFcltUtztnQnt" || - key === "utztnUsgCd" ? ( - `${value}` - ) : ( - { - handleChange(rowIndex, head.id, e.target.value); - }} - value={value} - /> - )} - - ); - })} - - ))} - - ); -}; - -export const rightTableData = (rainChk: rainChkZodType[]) => { - // 1. chkgdnFk + utztnUsgCd 기준 누계 정보 만들기 - const maketotal = rainChk.map((item: any) => { - const selectTotal = item.guideDetails.reduce((acc: any, cur: any) => { - const code = cur.utztnUsgCd; - const fk = cur.chkgdnFk; - - const key = `${fk}_${code}`; - acc[key] = acc[key] || { - totalSplyUswtrUtztnQnt: 0, - totalRuseFcltUtztnQnt: 0, - }; - - acc[key].totalSplyUswtrUtztnQnt += cur.splyUswtrUtztnQnt; - acc[key].totalRuseFcltUtztnQnt += cur.ruseFcltUtztnQnt; - - return acc; - }, {}); - - return selectTotal; // 모든 키: `${chkgdnFk}_${utztnUsgCd}` 형태 - }); - - // 2. 누계 정보들을 하나의 객체로 합치기 (평탄화) - const flatTotalMap = Object.assign({}, ...maketotal); - - // 3. rainyDetails에 누계 정보 주입 - - const updatedRainyDetails: any[] = []; - rainChk.forEach((rd: any) => { - const details = rd.rainyDetails.forEach((rainyItem: any) => { - const key = `${rainyItem.chkgdnFk}_${rainyItem.utztnUsgCd}`; - const totals = flatTotalMap[key] || { - totalSplyUswtrUtztnQnt: 0, - totalRuseFcltUtztnQnt: 0, - }; - - updatedRainyDetails.push({ - ...rd, - ...rd.building, - ...rainyItem, - ...totals, - rowspan: rd.rainyDetails?.length, - }); - }); - }); - - return updatedRainyDetails; -}; - +import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; +import { + chRowspanTable, + rightTableData, +} from "@/components/lib/func/TableData"; export default function RainChkgdTable({ detailUp, }: { @@ -172,14 +25,14 @@ export default function RainChkgdTable({ const { rainChk } = rainChkgdn; const [selectedIds, setSelectedIds] = useState([]); const [upRaintDetail, setUpRaintDetail] = useState([]); - const [isModal, setIsModal] = useState({open:false, data:{}}); + const [isModal, setIsModal] = useState({ open: false, data: {} }); const handleCellClick = (index: number, headId: string) => { if ( headId === "totalSplyUswtrUtztnQnt" || headId === "totalRuseFcltUtztnQnt" ) { - setIsModal({open:true, data: makeTableData[index]}); + setIsModal({ open: true, data: makeTableData[index] }); } }; @@ -200,10 +53,7 @@ export default function RainChkgdTable({ ); }; - const nodeList = headMakeprfmnc( - rainChkgdn?.rainChkgdnHeadList, - rainChkgdn?.rainHeadNm - ); + useEffect(() => { const rainChg = rainChk.map((item: any) => { @@ -219,8 +69,6 @@ export default function RainChkgdTable({ setMakeTableData(rightTableData(rainChg)); }, [rainChk, code]); - - useEffect(() => { const selectedData = makeTableData.filter((item) => selectedIds.includes(item.chkgdnPk) @@ -271,10 +119,15 @@ export default function RainChkgdTable({ return ( <>
- {nodeList} + + {headMakeprfmnc( + rainChkgdn?.rainChkgdnHeadList, + rainChkgdn?.rainHeadNm + )} + - {totalData( + {chRowspanTable( makeTableData, rainChkgdn.rainChkgdnHeadList, handleChange, @@ -288,10 +141,10 @@ export default function RainChkgdTable({ { - setIsModal({ open:!open , data:{} }); + setIsModal({ open: !open, data: {} }); }} bodyClass={"w-[80vw] max-w-none"} - body={} + body={} > ); diff --git a/apps/wr/public/sample.xlsx b/apps/wr/public/sample.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ee4b23edbed49636ca8244b1ba1ed4829b24699a GIT binary patch literal 15020 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 KCztHc+kXMYgj1FP literal 0 HcmV?d00001 diff --git a/apps/wr/public/sample_rainSttn_test.xlsx b/apps/wr/public/sample_rainSttn_test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..57ea2f2229f1b936624c59999803b51aa76396a1 GIT binary patch literal 8482 zcmaia1yCGox9#9A0fKuN+}$C#ySux)2X~hQ4HgKl0TSGu;4rwm6I?IJx$osa+;{6u z)pSpH&sz1>`gZNTXRlF^hJeHXKm%X_WJ+0D=2E$R8vp=+9~=Nccsc7knc6rr(EmQh zBzDMkF(QVZNHhy4-|yQ=z~&Y-$t1Z6Tk!fzF0xypi%UXp9l>GcOknfPKRw>pZXMY< z<$L6((s~1DRq3ESM|$t%20l$1UJ|>H9F1J1i4BV;dEq5e%JNgq?cfuFB_0nLmT<;1 zq&IZI5QYJIM938 z+GHtr*ex(3wxECnup2qt0u8aj=R_0ob`3=#x@||(Wfp{NCF3>nmuBM<<5euZ=VRhd zBD_ec{BF7Bd%%Cvn<|1r)rziQH{oE8fW~;Eo@8fA?4$m(AVKK4v+XjRu`|+RstD^$- z_L#iZHz{>ViQs#RBg-;^owpB-LOz$fG?GJs3Eaah zq+16#@VbBA^ky1MV`ESj1Vwbf@rbqItjqVhGNpkp<6OF>}+iIMNd%!}J%?UxE<66eQ|0ozuaWKwS z-WkCytkcOfZ0cF&7p$K2G0@pif*eI8vnh(>=Kk|tpnj_Ej#++~30ti?vF#m2+*yyy zLf9RQ7UQl3k(@0L(8Azr+{6RKzqfY`!g`nQWqS!;LjBEuZm+Sulj-mMwM}^c67Z;^ z*Aj~)=lqU|m@1mZG+_IYQW6*eAkC|9b>RdFPrJx2SwFeP@7}-CNBLq_va~9&MZ|y}&4;e7E2X5-ksV z*xpzML8ecTVaV%cHIcUp^IYuFZB<;Wys`|{;G>Yg5INdGE+XH=;g?B9O6j!ySFxoO za$34H6W0VPVM-SVLe;n&sP|@}<+PwyBC@=W z@?`ljKh{JfT*3QjU6o!kmJ?rr9km}*rZEuKah3vClOc7T)%SpD0V1yGNQKdYzUY*eNy^Xgh<5_%k89S zCc+tJCe89ik^&Cnd0E!#jooK<`<1Js*4e#74H_rF!I$yq!XOf04#K-H%glFmJ}sU( zwGVez^SDh5*tPFCD+%&bu1Clubrj!^EVZ-dBv8ea{}8umh_I%0Sfd8$mzuER$0nsq z%kqRoJjR7mNo%&(QeClGtVC!iEN;|QB*x_5eoKZ|%L41n*v^`5-|eKdD|knw=+o?XhO(VEt4XeVvY2XxD;a9KSMPk-PFBR3+)WmFewI3XBzKFi|B0lav;{TJ@|8ooer1vI*@~Iy2E&fy|L{CD#C`KWF4U2jwTvC-Myt#2}A+ zbvZ`2t*SprADn;v=%A79``Pwa@ji6m=0G2Wriff2H+w()lMq>$OagGdo3xK8Q%w73 zL~pUFM;GoF{GT6CTZSb?eD>n)B--xIu9|yv#<+1vP*?t28tS@7YkEcQ-(iBrr*JNq$zE`z=_(*Q1u)z2JUTb+!qJ3Tp~TspR=8W zu3iw0`zE7pL#ddvOZIflgD=JWcFt+uHNYqV-zXx}o-lK5INs~=iUe&lwm5mnW0g&x zowsvcklv#i*CX3J35zf8OL{K?waGB_a%cge=l%BeO24&Ng)k-)IR5%YCUUdF!REsz z8InP2A%khBQL47oTScTwE7ux@3qnru_04bNyPrjp`v@Z}A)^K8KJglum}z*~J8c_- zRaVQ52og_CRha=HC+O`mLP?jt2j>FN} z<-E=+B8-P@WPl-wq)ik!&bnVpQ>iqGJieIm|p%uE9Vl7s29SKN{;Qb z5$EA?5NS(@8_n2&X4}Ftg6N&X=}kR2YX?i3iYexlG!?x&ski?jTS-410K6vL{+$Pv zaSOxzyF1wuI8y6m)iC97sl^D;c>0RcU?&De{F_E71t$d0 zL{OUB(Bbi1X*Nd%2+5Ns$7vpH>-65-k1;}&hpzne8$CR!GX20nURh?*#luk(? zFQ{r?KYHG^j2rW27I|ancfefCIPfJtfNWlu0bd{~B`jL&(IMq$e;PuRJ*?LD(De0bh8fREb z(3$cR90;xg_N#t|?}S2tXoGN*b)-@^M`w`3iP>@lBpmTgADv@Q^m8xSmb_Sqk|^7GunpFU^|in$Qz zvw(W;e?2(^S+=Tn;j?MxoPjifYaS_w3dgt0cXf1{ngZsdb{_o^SA?4%b;666VXsJf zeks74dNKvP59+eUP}6xwM#4MatT=3dNfn?LNeYqolw%kcOtJV#Iw;k3Gw;a6=lZh__X@6(9()`GS^+H2L! zSWC>b+0?DBYE=S>H-(Bf1LqlOHLD9*=UH2l2g5KvYY-MxaI9ZeGw2sXa7>AZiwzJC z=!l`Q$3yxq>~SZchVX4LyScH&iM+o@(Eo(pmtn=6UuAYDgi!-2=Ga5xs|S3& z0Zr%lN(9+r;CBtB)u}RMAf8h)g@a_#Ny)DvDp$CUJjike+O>t=A;u|!cO<2oWkiwSKtF2*Srfmp=ET%N~50v1O|U4|Ft#;|AB{QOD5H~|I8+s&8m zJ`eT*f0SQiiga{tbCX`GqGxj2`jWWWkMB}up0WpCn_e?#Y1dI~*lJ<6jIqDY%nFzO zctEFY8Y#qsxd|Lm_Y~t8j7d2S>$^0^Q%CVjEY>%BGsL*KWk!;H(Hv)l>x2f2)vDyg z+6-al+}MQ^J7xthfAGs-{DnVIc+~1qKVU+5qtKy+u#p64J*Si!mc#Q<+EWm!Obq5t zrQE${l7CO!@f9~U)FY@;_NEk+b)?+B#~7DuplMj*KLqL9r7q%F^o3g`T3497`-Zo@ zHceG`Gu0UrM*uHMduy^Am&x2+W?1IxC>^@@9mye_j7oUbBxZDYUxJq3DEpF+sTRL` z)JG-rg!;q!fdv)=)nSbYJE40?-yB(J%3}dGp#^%9om~y(`bk^ig@q&4aQ70mHVH}| zZ)_W`+Gu6%_J(<1a|FZ5{L9{oM$h>H72t+#vFXT$bwcLWhWBx9fccfB^H54ZhaVa205eL;LCP#wGX z%8wiD)jW^CRFM1@1=5tIj;oD#L%Np1#^caK&#e6VMd)vImmgi|cUFj%#7-j|=!W}T z1bGPq)9(Q4n+{qT>(xj}=wnBOqHy+4ui7`O&d0|1czsfx}no;Ie=zw6<& zj~2bB++-=#k{s?l%H zus$2s)@LE`gQ)ik>Y|}Hs9f}gzAn|>Un~{c&iRgjmCB5Xt_*qsnxC)t##pNaZ2)zo z2Bf_2*aRP!dcAu6KXBb}?4_a(QRjZcufZTUWaX?$#^_X1fQ{-7jty6oc#Fg6GmjY^ zsHpemOq4k%Fc+2Bxb{I)#po9fa9sGy4E7sBsUZG+PIIqpnJxy#p0Rw1B>}60}Oki=y|0CAO;_N?Ntbl@f{=?At%_`ep#nf%5vcrVB;3Lz6HzR72AZ zEvg9}@@>o*!0(C0PV+93e$_g~Drzl8Eg;%V6d zl<0WsmpA35&i()Mj;SXbj!MB>?JrtxHVIa9)w(HI+6pOZe?E(rnD(jlvaXyoOdVw(Pr(8&++oIVmQ7RcTx-FBEBQBjdxHw%9*j9TR$)rmVPEdttGMfPQ-O=_o{fj7`6)FfWy z1c}j%8j?btt0dKaF~U-E^npQv!M$rF1JPagyl^pHQfN4{HP?8Ub2J-9VLc+L6ojmn zIUX{>5$o@(#eQankKZ90vwiv{@3k|HB}rbtO+hhlbbp&27lKx7??l03N!6#48Evc5 z*8Yx^79EMpextn&k>kY1BYh0|Wb8A7r=ix&Tc@Lq(yS^7ESh*m7@l-@&5d7}KbmqA zyx(+4gDkG}y_}lEVyu>|PTY9RW=THDX1XQmY+7{Y@98%76COqn&~-|dYgDP7T$UYV z1USHlwbqH28;qKK#peSvy1EcuaT_iawr`I=AZIZSsT-^j4B4Bj5u_7Z)5I*R8u~`7 zpxB89BTjLc>FMg(HpzGo-2&kjdmBRB#p^RijDFGj35<^>YW2}_dT4cja=k^$>L~FI z*vEH6&}kSElnf9wg=k=YpMewW5dfZ&1k?cH5<#*N_Q5DY*l7|WU@A0|Uu(@xd)G&u zRn>4d8m0C*%Xlo5NEx*U1z{H)N&`!;92b>QE|ua&De)G3e@6ZHjbC<4Est<_*^yF6 zer)bdrV~}k<3txNfZb}km={q-$*U8vapq)|P%6ej;Fd(9)o~H$sQWvizVgr`R zDc5X!`bdy++tU>fRjkzd%$M;(FG7m2FctCKmXB4A*aCN~u&$+=7 z1Z-J6_A9mbM|i}t9y|tw<=Rgv015vy-h_;+Agg2ozK;&J{zzra?Jl)@{}~Q8J5b84V}}>vr-{(;W*89CHFodZ58tRY1398z z%p!Ex2=7BVolO?*ZI{qNn$NNEQQ+0_X8+?x_v4dX>ewmGgqCreZAX^j1g7CU%v)Cc z=x*_$fQT4%>~j;fsLl9o-XMI9doQQe*-kF5(%ON5o??cuGEMByq(5u~AP7$*DZ&;P zI-S(ak{}Lv^pQ_?68lGcEYC=3#LUzKSnoNTdN+g5@_u=fg*_BLAUbI@_qzcSg)3Bk z5{LCf(JrUre`n-M!pCG_o)&W&tQ{~sTYuC+yY)2HYW5)Plp0WRIxSg_pM(ol!Mp5ztx;AO)8*IK6_V2%#&;IZX(?`Z;BCJLwQh8?lieWk65z4sUX6uv(SHc`R*YiBxz%Pr@}>OCG^N z*eCmyEPk9;4}##t9pEC_8<2z7LW?UJB6*aX2qcIzmWZ$Ua;)W6o-zHHrFK3EOVr@z z@afc(Go1o3+y+@9|3uK*ctjYsaVvu6>F43aez(?!$|Zo^k6pRg^5}B&;Naph+H&vW z!g0Z8!r-PasnWgFb@FXI|J}7CWq^(NDgYL^=*e=o#mQ(~CKef;W8C)B7aeh@n4+ZW zI4H@TK|WM~$l5@RSZHVO6IP1obw}F$!QAOZ9Xq$zE1gquUCf7hZVoj%0W`sn_>5BIN9cx6$P8h7Kwsi!RytDA@uC;=e?}g5ml_ z#lu)soNy4SWnMNV<|NP)ezPD1_7@umoA5NK@M=Id+N0bUgkNzdn-> z*x5b9?fQ(B{cIhOuOt<1d}g*Exd&9@FuRMn(~uJZ+Iqu$U`%j0&ZbKwkxd0 z8`HUL_oW-6e-8xYDg{}0UnW&UkN^P2f44pshEAp?$}UcpcIJONpqS(pt9b{Ez7rVl zu=so6OeglcLaZRZjw^ssEv^Nc^*YE@YD0m#EZ=!Rt!uHd-o+%|iWYtjVGDo7u+OCE z;lb5o@7B+6$7eLV=&*$aIix{ra)z#!^jHF@I5wPKSD69x_Uy9sll>`Cm ztkUE}7wMvehNj}Q=A%pnRc&-t@m-&OM0NSGM~pp}_s5p>M|tEPNzCa6Ui*eC85v|& z32FwWwJCH#wk@yk0a~(soYXrVBK5chVhrceZ%~2$D1_R^y8}RN$EN*(UZQ z?6K}g?O|)oRV);G?+0oqFqSx4`{vf$@GQW0WX9Rk-U7vqICdSVhgmMiD?wy|!CtD& zl{HHLgCfw0SUSEIg#+W4`i4~txRpk22hU3z-dr{I-CXJNwQG-RMY$TIR@RWHTBFeC zr7qk)%)l!|`NmR+JnL5E+W|sBntVCnV%f4cgb6w|3nq0J47OenpFcO^?51YQbZeTX&S!#rd5ZI6nc-(L*ue^3 zqbuCwhJ!W4sJW9Vsf?qpHB_1?$H6j^3q6MLLvY}ba&dCsIW65Bf0bw1OiLLBuasx! z)dC>@l)IZ9PpHE2}3oB185TmY3>FMOsg}UXPfif%LPY zZchstSFCj}lr6T{-3Lw+#Z!DUX8l=W8{xcMBg_#tpn9lWuXL>WPrtm}{#{RQuYE-{ z`Ch$C^stz@gb33pE|qv~jl8a8&QVMy{-!8(SfGUE1C;oH(~!OaylTq$Ts+#Z1sX?E ztMCSDw=KD)kPp#3vL6+yTuo25w$W}%z7@Hn0-ts)oix`tZse_E6|ohRYSr89ZYDlH zdCj|DE32+2{ zLQZykyX!Xg#UCewd}PMW<+p=B+G1Zq2MH4nw>SugN?!O)-VrQ}<1KW6Ni+>R2w7`0 z#7q#1IX^oz-f(h=y*#jx;E+09_H|a>bCmx+b?$wkxpeuhOxlew-s8U>c zgHvn6JmVx>6-Dw@arm;^B^bWy2H)#=wJ@XGGs+j)U=qNNV4x2U5(V7jw$np^Q~^!M z1}oqoSwIt#!3qQ@4&a8>?gw3U4`4?zKmj{s^8dkAjh>GUF@JeR-dU0iPCHs1hNYyz zL0H8H5`br>-c*TnbGrLn3WB#w({nVGfP!+nCFAZ8nwA~1XIG=%Y$we(A)&iEvr}I$ zgB;Ev!(G)RDezq|6n5WquCf-zP|n$TU`Y43q+{#r*xfM{OPNw*v1{Qvb2E{DdS$=S zeF+Ku@REshq5c`oY75)jxtQ9y=&N`-m^$nJ{wZ3nGGrITh}x{aFF;)JhI22sgqk>v zKi2k3A<^nOP~!%;;Q8o_1*?e57C`v}5PCUW#jH!Ajf0F&g~68B$WW42kkV$%3Z1uRs@7_*W#oKW}tj9NFw( z(0M{7QzxxwNFaR($};;+Be0%W2fO)O2%9>tk}>3HvACg00qBkNH{)iONg0ON*wv z6P?&(;Lb!iR>w9S^f$7Bw3Z&P`9K46wUPH1eeklp|BL=Vw%%*_ zYj5f=T>Yg7c;!^R2EX=J{(`4o!uAFHzc?+gd0zVve|b({+=&;S*RI5Cg4ZLPzXZ_8 ze+d2#a9%@Sw>*ELU|9b^UpGLn8D5vhzYKUde;EFMh4MAw>$3HiaO{5&{w-p!Szc$5 gzbsMs0KoqvpD0K}y{P^BpAQIt@t4@)A^d&yUuPE!J^%m! literal 0 HcmV?d00001 From 2bf254eb3c9d6e64deb1e9c5d9aeb1402f263dbf Mon Sep 17 00:00:00 2001 From: leedj312 Date: Tue, 29 Apr 2025 10:27:44 +0900 Subject: [PATCH 2/2] =?UTF-8?q?excel=20=ED=8C=8C=EC=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=EB=A1=9C=20?= =?UTF-8?q?=EB=84=A3=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ui/excel_download/index.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/common/business_components/src/ui/excel_download/index.tsx b/packages/common/business_components/src/ui/excel_download/index.tsx index 7ebc53e2d..75b6485b6 100644 --- a/packages/common/business_components/src/ui/excel_download/index.tsx +++ b/packages/common/business_components/src/ui/excel_download/index.tsx @@ -50,7 +50,10 @@ export const filePicked=(oFile: File, headerNum:number=0):Promise =>{ + + + +export const filePickedBlob=(oFile: ArrayBuffer, data:JSON[],fileNm:string, headerNum:number=0):Promise =>{ // Create A File Reader HTML5 return new Promise((resolve) => { // Ready The Event For When A File Gets Selected @@ -62,14 +65,16 @@ export const filePickedBlob=(oFile: ArrayBuffer, data:JSON[], headerNum:number=0 if(index==0){ const sheet = wb.Sheets[sheetName]; if (sheet) { - XLSX.utils.sheet_add_json(sheet,data); + //오리진 확인 test 필요 + // XLSX.utils.sheet_add_json(sheet,data ,{origin: 3} ); + XLSX.utils.sheet_add_json(sheet,data ); jsonXls = XLSX.utils.sheet_to_json(sheet, { range: headerNum }) as unknown as JSON; - XLSX.writeFile(wb, "test.xlsx"); + XLSX.writeFile(wb, `${fileNm}.xlsx`); } else { console.error(`Sheet "${sheetName}" is undefined.`); } } }); resolve(jsonXls); - }); -} \ No newline at end of file + }); + } \ No newline at end of file