From e464d298ad4b89a47fe53636968de360150a1059 Mon Sep 17 00:00:00 2001 From: ljpark Date: Mon, 19 Jan 2026 13:24:29 +0900 Subject: [PATCH] =?UTF-8?q?wr:=2036=20=EA=B3=84=ED=86=B5=EB=8F=84=20?= =?UTF-8?q?=ED=8F=89=EB=A9=B4=EB=8F=84=20=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/fo/app/pages/(with-layout)/rdi/page.tsx | 3 +- .../matMng/coMat/ruseCaseMng/page.tsx | 156 ++++++++++-------- .../ruseFcltMng/fcltReg/pbnstReg/page.tsx | 4 + .../app/store/matDmd/ruseCaseMng/headList.tsx | 4 +- .../fcltReg/pbnstReg/mngReg/mngRegForm.tsx | 7 +- .../src/ui/file-upload/lib/file_upload.tsx | 1 + .../ui/search_address/SearchAddressModal.tsx | 2 +- .../src/ui/table/index.tsx | 7 +- 8 files changed, 108 insertions(+), 76 deletions(-) diff --git a/apps/fo/app/pages/(with-layout)/rdi/page.tsx b/apps/fo/app/pages/(with-layout)/rdi/page.tsx index 47142e0a1..98120523a 100644 --- a/apps/fo/app/pages/(with-layout)/rdi/page.tsx +++ b/apps/fo/app/pages/(with-layout)/rdi/page.tsx @@ -215,7 +215,8 @@ export default function Rdi() {
- +
diff --git a/apps/wr/app/(with-layout)/matMng/coMat/ruseCaseMng/page.tsx b/apps/wr/app/(with-layout)/matMng/coMat/ruseCaseMng/page.tsx index afea9d894..6001d8827 100644 --- a/apps/wr/app/(with-layout)/matMng/coMat/ruseCaseMng/page.tsx +++ b/apps/wr/app/(with-layout)/matMng/coMat/ruseCaseMng/page.tsx @@ -24,6 +24,7 @@ import { Button, Label } from "@common/components/ui"; import { useEffect, useState } from "react"; import toast, { Toaster } from "react-hot-toast"; import { useTranslation } from "react-i18next"; +import * as XLSX from "xlsx"; export default function RuseCaseMng() { const { code, ruseCaseMng, selectRuseCaseMng, ruseCaseMngInit } = useWrStore( @@ -76,7 +77,9 @@ export default function RuseCaseMng() { }; useEffect(() => { - if (excelList !== undefined && excelList.length === 0) { + if (!excelList) return; + + if (excelList.length === 0) { toast.error(t("excelDownErrMsg")); return; } @@ -86,74 +89,93 @@ export default function RuseCaseMng() { } // 받은 파일 바인너리 처리 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", - }, + const replaceHeaderText = (text: string) => + text + .replaceAll("사업시작일", "사업시작년") + .replaceAll("사업종료일", "사업종료년"); + + const wb = XLSX.read(blobRet, { type: "array" }); + wb.SheetNames.forEach((sheetName) => { + const sheet = wb.Sheets[sheetName]; + if (!sheet) return; + + Object.keys(sheet).forEach((addr) => { + if (addr.startsWith("!")) return; + const cell = sheet[addr] as XLSX.CellObject | undefined; + if (!cell || typeof cell.v !== "string") return; + const next = replaceHeaderText(cell.v); + if (next !== cell.v) cell.v = next; + }); + }); + const updatedBlob = XLSX.write(wb, { bookType: "xlsx", type: "array" }); + + 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, ]; - // 버퍼에 있는 엑셀데이터 전달 후 json으로 변환 - await filePickedBlobArray(blobRet, "물재이용사례현황", sheetParameter); - } + }); + + const sheetParameter: SheetParameter[] = [ + { + data: excelData1, + headerNum: 2, + headerRange: "A1:AX1", + sheetName: "물재이용사례", + startCol: "A", + }, + ]; + // 버퍼에 있는 엑셀데이터 전달 후 json으로 변환 + await filePickedBlobArray(updatedBlob, "물재이용사례현황", sheetParameter); }); }, [excelList]); diff --git a/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/pbnstReg/page.tsx b/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/pbnstReg/page.tsx index d5d0e9b33..e460aa31e 100644 --- a/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/pbnstReg/page.tsx +++ b/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/pbnstReg/page.tsx @@ -45,6 +45,10 @@ import { useTranslation } from "react-i18next"; * indexMng: 시설정보 * indexBiz: 차수별 정보 * 로 하수재이용 시설에 등록된 시설 및 차수별 정보를 관리한다. + * 🔗 사용 API + * 하수재이용시설을 등록 /reuseFc/pubFc + * 첨부파일 삭제 /attach-service/api/v1/atfl/attachments/atflCd// + * 첨부파일 다운로드 /attach-service/api/v1/atflcd/download/ * */ export default function PublicReuseFaciltyInsert() { diff --git a/apps/wr/app/store/matDmd/ruseCaseMng/headList.tsx b/apps/wr/app/store/matDmd/ruseCaseMng/headList.tsx index 8ed65ee7d..c201f5d28 100644 --- a/apps/wr/app/store/matDmd/ruseCaseMng/headList.tsx +++ b/apps/wr/app/store/matDmd/ruseCaseMng/headList.tsx @@ -11,14 +11,14 @@ export const ruseCaseHeadListExport: TableUpperProps[] = [ }, { id: "bizBgngDate", - title: "사업시작일", + title: "사업시작년", visible: true, row: 0, rowSpan: 2, }, { id: "bizEndDate", - title: "사업종료일", + title: "사업종료년", visible: true, row: 0, rowSpan: 2, diff --git a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx index 6fd110297..d4e7fe940 100644 --- a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx @@ -35,10 +35,11 @@ export type FilesType = { file: File; }; +const diagramFileTypes = ".pdf,.jpg,.jpeg,.png,.bmp"; /** * 재이용시설 등록 - 하수재이용 시설등록 - * 재이용시설 등록 - 하수재이용 시설현황 + * 재이용시설 등록 - 하수재이용 시설현황 * - layout.tsx에 의해 공통 레이아웃이 적용됨 * - with-layout 적용 * - 하수처리시설에 하수재이용 시설 시설 정보를 등록한다. @@ -459,7 +460,7 @@ export function PbnstMngForm({ setFiles={(files: File[] | null) => { if (files) fileHandler(files, "relation"); }} - fileTypes=".pdf" + fileTypes={diagramFileTypes} onFileClick={(index) => { fileDownLoad( relationfiles?.find( @@ -497,7 +498,7 @@ export function PbnstMngForm({ setFiles={(files: File[] | null) => { if (files) fileHandler(files, "plan"); }} - fileTypes=".pdf" + fileTypes={diagramFileTypes} onFileClick={(index) => { fileDownLoad( planFiles?.find( diff --git a/packages/common/business_components/src/ui/file-upload/lib/file_upload.tsx b/packages/common/business_components/src/ui/file-upload/lib/file_upload.tsx index 42662ab1d..030ddda95 100644 --- a/packages/common/business_components/src/ui/file-upload/lib/file_upload.tsx +++ b/packages/common/business_components/src/ui/file-upload/lib/file_upload.tsx @@ -93,6 +93,7 @@ export const FileUploader = forwardRef< ".jpeg": "image/jpeg", ".png": "image/png", ".gif": "image/gif", + ".bmp": "image/bmp", ".doc": "application/msword", ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".xls": "application/vnd.ms-excel", diff --git a/packages/common/business_components/src/ui/search_address/SearchAddressModal.tsx b/packages/common/business_components/src/ui/search_address/SearchAddressModal.tsx index 55529f89a..699d3cc50 100644 --- a/packages/common/business_components/src/ui/search_address/SearchAddressModal.tsx +++ b/packages/common/business_components/src/ui/search_address/SearchAddressModal.tsx @@ -24,7 +24,7 @@ export function SearchAddressModal({ open, onOpenChange, onSelect }: SearchAddre size: PAGE_SIZE }); const [isResetPage, setIsResetPage] = useState(false); - const [isResetSelection, setIsResetSelection] = useState(false); + const [isResetSelection] = useState(false); const [selectedRowIndex, setSelectedRowIndex] = useState(undefined); const [selectedZip, setSelectedZip] = useState(); const [isSelectedZip, setIsSelectedZip] = useState(false); diff --git a/packages/common/business_components/src/ui/table/index.tsx b/packages/common/business_components/src/ui/table/index.tsx index a0b421db8..1a0fc57c0 100644 --- a/packages/common/business_components/src/ui/table/index.tsx +++ b/packages/common/business_components/src/ui/table/index.tsx @@ -119,7 +119,6 @@ export function UiTable({ }; const leafCols = getLeafCols(headlist); - return ( <> {headName ? ( @@ -263,7 +262,11 @@ export function UiTable({ item.visible != false).length - - headlist.filter((item) => item.visible != false && item.colSpan).length + headlist.filter( + (item) => + item.visible != false && + (item.colSpan || ["A", "B", "C"].includes(item.id)), + ).length } className="h-24 text-center text-gray-500" >