From ca369c3acb88fda64b4e52e949d16631e75b1415 Mon Sep 17 00:00:00 2001 From: jyha00 Date: Thu, 5 Jun 2025 13:30:08 +0900 Subject: [PATCH] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=EA=B4=80=EB=A6=AC,?= =?UTF-8?q?=20=EC=9E=A0=EC=9E=AC=EC=88=98=EC=9A=94=EC=B2=98=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EC=97=91=EC=85=80=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/matDmd/coSttn/page.tsx | 233 ++++++++++++------ .../app/matMng/matDmd/ldrmntCoSttn/page.tsx | 198 +++++++++------ apps/wr/app/page.tsx | 2 +- apps/wr/app/store/matDmd/coSttn/excel.tsx | 17 ++ apps/wr/app/store/matDmd/coSttn/index.tsx | 37 ++- .../app/store/matDmd/ldrmntCoSttn/index.tsx | 25 +- apps/wr/public/sample_coSttn.xlsx | Bin 0 -> 8550 bytes apps/wr/public/sample_ldrmntCoSttn.xlsx | Bin 0 -> 8958 bytes 8 files changed, 340 insertions(+), 172 deletions(-) create mode 100644 apps/wr/app/store/matDmd/coSttn/excel.tsx create mode 100644 apps/wr/public/sample_coSttn.xlsx create mode 100644 apps/wr/public/sample_ldrmntCoSttn.xlsx diff --git a/apps/wr/app/matMng/matDmd/coSttn/page.tsx b/apps/wr/app/matMng/matDmd/coSttn/page.tsx index 146046bda..b7e6c6c8e 100644 --- a/apps/wr/app/matMng/matDmd/coSttn/page.tsx +++ b/apps/wr/app/matMng/matDmd/coSttn/page.tsx @@ -3,35 +3,54 @@ import { useWrStore } from "@/app/store"; import { btnClass } from "@/app/store/common/code"; import type { customCoSttnBdst } from "@/app/store/matDmd/coSttn"; -import { getCityOrSgg, tableData } from "@/components/lib/func/commom"; +import { excelDownload, getCity, getCityOrSgg, tableData } from "@/components/lib/func/commom"; import { ContentsDiv, SearchBaseForm, + SearchDiv, + SearchFormLeft, + SearchFormRight, + SearchInput, + SelectBox, Title, UiModal, UiTable, - type ReturnType + type ReturnType, + type SelectDataType } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; -import { Button } from "@common/components/ui"; +import { Button, DatePicker, Label } from "@common/components/ui"; import { useCallback, useEffect, useRef, useState } from "react"; import SdmInsertForm, { type DemandCompType } from "@common/business_components/ui/sdmInsertForm"; +import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; -export default function coSttn() { +export default function CoSttn() { const [bdstTable, setBdstTable] = useState(); - - - const [pageNation, setPageNation] = useState(1); - const { code, coSttn, coSttnInit, getDemandCompList,regDemandCompany,demandCompList} = useWrStore((state) => state); - const { coSttnRes } = coSttn; - const [isDmdModal, setIsDmdModal] = useState<{isMoal: boolean, data: DemandCompType}>({isMoal: false, data: {} as DemandCompType}) + + const [pageNation, setPageNation] = useState(1); + const { code, coSttn, coSttnInit, coSttnSearch, getDemandCompList, regDemandCompany, demandCompList } = useWrStore((state) => state); + const { coSttnRes } = coSttn; + const [isDmdModal, setIsDmdModal] = useState<{ isMoal: boolean, data: DemandCompType }>({ isMoal: false, data: {} as DemandCompType }) + const [fromDate, setFromDate] = useState(new Date()); + const [toDate, setToDate] = useState(new Date()); + const [selectSgg, setSelectSgg] = useState() + const [objSearch, setObjSearch] = useState({ sgg: "", city: "" }); const ref = useRef({} as ReturnType); const codeData = getCityOrSgg(ref); - - const excelClick = useCallback(() => { - }, []); + + const getSelCity = (val: string | number) => { + const cityValue = String(val); // Ensure val is treated as a string + const data = getCity(cityValue, code.sggCd); + setSelectSgg(data); + setObjSearch({ city: cityValue, sgg: '' }); + }; + + const getSgg = (val: string | number) => { + console.log(val); + setObjSearch({ ...objSearch, sgg: String(val) }) + }; useEffect(() => { if (!coSttn.isInit) { @@ -41,65 +60,117 @@ export default function coSttn() { useEffect(() => { if (coSttnRes.length > 0 && code.cityCd.length > 0) { - const data = tableData(coSttnRes, { code }); - const chData = data - .map((item: any) => ({ - ...item - })) - // .filter((item: any) => item !== undefined); - setBdstTable(chData); - } - }, [coSttnRes]) + const data = tableData(coSttnRes, { code }); + const chData = data + .map((item: any) => ({ + ...item + })) + // .filter((item: any) => item !== undefined); + setBdstTable(chData); + } + }, [coSttnRes]); - return( + useEffect(() => { + if (coSttn.excelList.length > 0) { + if (coSttn.excelList.length === 0) return; + excelDownload( + coSttn.excelList, + "수요처 관리", + "sample_coSttn.xlsx", + "A1:F1", + 2 + ); + } + }, [coSttn.excelList]); + + const excelClick = useCallback(() => { + console.log("??") + coSttnSearch("마인드원", 1); + }, [coSttnSearch]); + + return ( <>
- <SearchBaseForm - selectSidoData={code.cityCd} - selectSigunData={code.sggCd} - selectRegionData={code.rvbsnCd} - selectUnitWaterShedData={code.lgbsnCd} - selectMiddleRegionData={code.mdmbsnCd} - selectEnvPartData={code.lclgvrnmntCd} - rightChildren={ - <div> + <SearchDiv> + <SearchFormLeft> + <div className="col-span-10 flex flex-row"> + <SelectBox + className="col-span-2 w-1/6 h-full text-2xl" + label="시도" + selectClass={""} + selectArray={code.cityCd || []} + onSelectValue={getSelCity} + /> + <SelectBox + className="col-span-2 w-1/6 h-full text-2xl" + label="시군구" + selectClass={""} + selectArray={selectSgg || []} + onSelectValue={getSgg} + /> + <div className="col-span-5 w-auto"> + <div className="flex flex-row items-center"> + <Label className="text-xl text-gray-600">수요신청년도</Label> + <div className="flex flex-row w-1/4"> + <DatePicker mode={'single'} + selected={fromDate} + onSelect={(date: Date | undefined) => { if (date) setFromDate(date) }} /> + <span>~</span> + <DatePicker mode={'single'} + selected={toDate} + onSelect={(date: Date | undefined) => { if (date) setToDate(date) }} /> + </div> + </div> + </div> + <SearchInput + className={"text-2xl"} + label="회사명" + textValue={""} + setText={(e) => { + }} + /> + </div> + </SearchFormLeft> + <SearchFormRight + className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> + <div className="flex flex-row space-x-2"> <Button - className={btnClass} - onClick={() => { - setIsDmdModal({ ...isDmdModal, isMoal:true }); - }} + size={"sm"} + onClick={(e) => { }} + > + 조회 + </Button> + <Button + size={"sm"} + className={btnClass} + onClick={() => { + setIsDmdModal({ ...isDmdModal, isMoal: true }); + }} > 등록 </Button> <Button - className={btnClass} - onClick={() => { - /* 저장 로직 */ - }} + size={"sm"} + className={btnClass} + onClick={() => { + /* 저장 로직 */ + }} > 저장 </Button> + <Button + size={"sm"} + className={`${btnClass} green`} + onClick={excelClick} + > + 다운로드 + </Button> </div> - } - leftChildren={undefined} - queryClick={function (returnType: ReturnType): void { - // '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}' - let con; - if (returnType.sigunValue != "0") { - con = returnType.sigunValue; - } else { - con = returnType.sidoValue; - } - // coSttnSearch(1, "20", con); - }} - excelClick={excelClick} - initClick={function (): void {}} - btnClass={btnClass} - ref={ref} - /> + </SearchFormRight> + </SearchDiv> </div> </div> <div className="grid grid-cols-6 gap-4 "> @@ -111,35 +182,35 @@ export default function coSttn() { headlist={coSttn.coSttHeadList} pageSize={20} total={10000} - cellClick={(index: number | undefined,headId:string)=>{} } + cellClick={(index: number | undefined, headId: string) => { }} onPageChange={setPageNation} ></UiTable> </ListDiv> </div> </div> - <UiModal - bodyClass={"w-[40vw] max-w-none h-[90vh]"} - open={isDmdModal.isMoal} - onOpenChange={() => { - setIsDmdModal({ isMoal: false, data: {} as DemandCompType }); - }} - body={ - <SdmInsertForm - selectSidoData={code.cityCd} - selectSigunData={code.sggCd} - dataList={demandCompList} - rtnValue={(searchText: string, pageCnt: number) => { - getDemandCompList(searchText, pageCnt); - }} - rtnInputData={(data) => { - console.log(" rtn data ", data); - regDemandCompany(data as DemandCompType); - setIsDmdModal({ isMoal: false, data: data as DemandCompType }); - }} - bodyClassNm={"w-full mx-auto bg-white rounded-lg shadow-md p-6"} - ></SdmInsertForm> - } - ></UiModal> + <UiModal + bodyClass={"w-[40vw] max-w-none h-[90vh]"} + open={isDmdModal.isMoal} + onOpenChange={() => { + setIsDmdModal({ isMoal: false, data: {} as DemandCompType }); + }} + body={ + <SdmInsertForm + selectSidoData={code.cityCd} + selectSigunData={code.sggCd} + dataList={demandCompList} + rtnValue={(searchText: string, pageCnt: number) => { + getDemandCompList(searchText, pageCnt); + }} + rtnInputData={(data) => { + console.log(" rtn data ", data); + regDemandCompany(data as DemandCompType); + setIsDmdModal({ isMoal: false, data: data as DemandCompType }); + }} + bodyClassNm={"w-full mx-auto bg-white rounded-lg shadow-md p-6"} + ></SdmInsertForm> + } + ></UiModal> </ContentsDiv> </> diff --git a/apps/wr/app/matMng/matDmd/ldrmntCoSttn/page.tsx b/apps/wr/app/matMng/matDmd/ldrmntCoSttn/page.tsx index b6e5ccb7e..2a730f8d5 100644 --- a/apps/wr/app/matMng/matDmd/ldrmntCoSttn/page.tsx +++ b/apps/wr/app/matMng/matDmd/ldrmntCoSttn/page.tsx @@ -1,109 +1,158 @@ "use client"; import { useWrStore } from "@/app/store"; -import { Button } from "@common/components/ui"; import { btnClass } from "@/app/store/common/code"; -import ListDiv from "@common/business_components/ui/list_div"; +import type { customCoBdst } from "@/app/store/matDmd/coReg"; import { + excelDownload, + getCity, tableData, } from "@/components/lib/func/commom"; -import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; -import type { customCoBdst } from "@/app/store/matDmd/coReg"; +import CoRegExcel from "@/components/ui/modal/coReg/coRegExcel/coRegExcel"; +import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; +import CoDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/coDatailModal"; import { ContentsDiv, SearchBaseForm, + SearchDiv, + SearchFormLeft, + SearchFormRight, + SearchInput, + SelectBox, Title, UiModal, UiTable, type ReturnType, + type SelectDataType, } from "@common/business_components/ui"; -import CoDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/coDatailModal"; -import CoRegExcel from "@/components/ui/modal/coReg/coRegExcel/coRegExcel"; +import ListDiv from "@common/business_components/ui/list_div"; +import { Button, DatePicker, Label } from "@common/components/ui"; import { useCallback, useEffect, useRef, useState } from "react"; -export default function ldrmntCoSttn() { +export default function LdrmntCoSttn() { const { code, ldrmntCoSttn } = useWrStore( - (state) => state + (state) => state ); const { ldrmntCoSttnRes } = ldrmntCoSttn; const [bdstTable, setBdstTable] = useState<customCoBdst[]>(); - const [detailModal, setDetailModal] = useState<{isOpen:boolean,data:customCoBdst|undefined}>({data:undefined,isOpen:false }) + const [detailModal, setDetailModal] = useState<{ isOpen: boolean, data: customCoBdst | undefined }>({ data: undefined, isOpen: false }) const [pageNation, setPageNation] = useState(1); const [isRegExcel, setIsRegExcel] = useState(false); - + const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>() + const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" }); + const ref = useRef<ReturnType>({} as ReturnType); const excelClick = useCallback(() => { + excelDownload( + [[]], + "잠재수요처 관리", + "sample_ldrmntCoSttn.xlsx", + "A1:AL1", + 2 + ); }, []); - const cellClick=(index:number|undefined, headId: string)=>{ - if(index!==undefined && bdstTable!==undefined){ - setDetailModal({isOpen:true ,data:bdstTable[index] }) + const cellClick = (index: number | undefined, headId: string) => { + if (index !== undefined && bdstTable !== undefined) { + setDetailModal({ isOpen: true, data: bdstTable[index] }) } } - useEffect(() => { - if (ldrmntCoSttnRes.length > 0 && code.cityCd.length > 0) { - const data = tableData(ldrmntCoSttnRes, { code }); - console.log("data", data); - const chData = data - .map((item: any) => ({ - ...item - - })) - .filter((item: any) => item !== undefined); - - setBdstTable(chData); - } - }, [code, ldrmntCoSttnRes, ldrmntCoSttn.ldrmntCoSttHeadList]); + const getSelCity = (val: string | number) => { + const cityValue = String(val); // Ensure val is treated as a string + const data = getCity(cityValue, code.sggCd); + setSelectSgg(data); + setObjSearch({ city: cityValue, sgg: '' }); + }; - return( + const getSgg = (val: string | number) => { + console.log(val); + setObjSearch({ ...objSearch, sgg: String(val) }) + }; + + useEffect(() => { + if (ldrmntCoSttnRes.length > 0 && code.cityCd.length > 0) { + const data = tableData(ldrmntCoSttnRes, { code }); + console.log("data", data); + const chData = data + .map((item: any) => ({ + ...item + + })) + .filter((item: any) => item !== undefined); + + setBdstTable(chData); + } + }, [code, ldrmntCoSttnRes, ldrmntCoSttn.ldrmntCoSttHeadList]); + + return ( <> <ContentsDiv> <div className="grid grid-cols-4 gap-4 "> <div className="col-span-4"> <Title title={"잠재수요처 관리"} /> - <SearchBaseForm - selectSidoData={code.cityCd} - selectSigunData={code.sggCd} - selectRegionData={code.rvbsnCd} - selectUnitWaterShedData={code.lgbsnCd} - selectMiddleRegionData={code.mdmbsnCd} - selectEnvPartData={code.lclgvrnmntCd} - rightChildren={ - <div> + <SearchDiv> + <SearchFormLeft> + <div className="col-span-10 flex flex-row"> + <SelectBox + className="col-span-2 w-1/6 h-full text-2xl" + label="시도" + selectClass={""} + selectArray={code.cityCd || []} + onSelectValue={getSelCity} + /> + <SelectBox + className="col-span-2 w-1/6 h-full text-2xl ml-4" + label="시군구" + selectClass={""} + selectArray={selectSgg || []} + onSelectValue={getSgg} + /> + <SearchInput + className={"text-2xl ml-4"} + label="회사명" + textValue={""} + setText={(e) => { + }} + /> + </div> + </SearchFormLeft> + <SearchFormRight + className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> + <div className="flex flex-row space-x-2"> <Button - className={btnClass} - onClick={() => setIsRegExcel(!isRegExcel)} + size={"sm"} + onClick={(e) => { }} + > + 조회 + </Button> + <Button + size={"sm"} + className={btnClass} + onClick={() => { }} > 엑셀등록 </Button> <Button - className={btnClass} - onClick={() => { - // 저장 로직 - }} + size={"sm"} + className={btnClass} + onClick={() => { + /* 저장 로직 */ + }} + > + 다운로드 + </Button> + <Button + size={"sm"} + className={`${btnClass} green`} + onClick={excelClick} > 양식받기 </Button> </div> - } - leftChildren={undefined} - queryClick={function (returnType: ReturnType): void { - // '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}' - let con; - if (returnType.sigunValue != "0") { - con = returnType.sigunValue; - } else { - con = returnType.sidoValue; - } - // ldrmntCoSttnSearch(1, "20", con); - }} - excelClick={excelClick} - initClick={function (): void {}} - btnClass={btnClass} - ref={ref} - /> + </SearchFormRight> + </SearchDiv> </div> </div> <div className="grid grid-cols-6 gap-4 "> @@ -112,33 +161,30 @@ export default function ldrmntCoSttn() { <UiTable headName={[]} tableData={bdstTable || []} - children={ - <HeadMakeColSpan upHeadList={ldrmntCoSttn.ldrmntCoSttNodeList} /> - } headlist={ldrmntCoSttn.ldrmntCoSttHeadList} pageSize={20} total={10000} - cellClick={(index: number | undefined,headId:string)=>{cellClick(index ?? undefined,headId)} } + cellClick={(index: number | undefined, headId: string) => { cellClick(index ?? undefined, headId) }} onPageChange={setPageNation} ></UiTable> </ListDiv> </div> - <UiModal + <UiModal open={detailModal.isOpen} - onOpenChange={()=>{ - setDetailModal({...detailModal, isOpen:!detailModal.isOpen}) + onOpenChange={() => { + setDetailModal({ ...detailModal, isOpen: !detailModal.isOpen }) }} - bodyClass={"w-[40vw] max-w-none max-h-[calc(100%-70px)]"} - body={<CoDetailModal formObj={detailModal.data}/>}/> + bodyClass={"w-[40vw] max-w-none max-h-[calc(100%-70px)]"} + body={<CoDetailModal formObj={detailModal.data} />} /> - <UiModal - bodyClass={"w-[40vw] max-w-none"} - open={isRegExcel} - body={<CoRegExcel></CoRegExcel>} - onOpenChange={setIsRegExcel} - /> + <UiModal + bodyClass={"w-[40vw] max-w-none"} + open={isRegExcel} + body={<CoRegExcel></CoRegExcel>} + onOpenChange={setIsRegExcel} + /> </div> - + </ContentsDiv> </> diff --git a/apps/wr/app/page.tsx b/apps/wr/app/page.tsx index 4798d2856..090791a69 100644 --- a/apps/wr/app/page.tsx +++ b/apps/wr/app/page.tsx @@ -136,7 +136,7 @@ export default function Home() { </div> <div className="col-span-2"> <Button className="w-full"> - <Link href="matMng/matDmd/ruseCaseMng">물재이용사례관리</Link> + <Link href="matMng/matDmd/ruseCaseMng">물재이용사례 관리</Link> </Button> </div> </div> diff --git a/apps/wr/app/store/matDmd/coSttn/excel.tsx b/apps/wr/app/store/matDmd/coSttn/excel.tsx new file mode 100644 index 000000000..39d669664 --- /dev/null +++ b/apps/wr/app/store/matDmd/coSttn/excel.tsx @@ -0,0 +1,17 @@ +import type { customCoSttnBdst } from "."; + +export const excelCoSttnParsing = (data: customCoSttnBdst[]): string[][] => { + const excelExportData: string[][] = []; + + data.forEach((item) => { + excelExportData.push([ + String(item.ctpvCd), + String(item.sggCd), + item.dmdCoNm ?? "", + item.daddr ?? "", + String(item.dmdInfoPk ?? ""), + item.telno ?? "" + ]); + }); + return excelExportData; +}; diff --git a/apps/wr/app/store/matDmd/coSttn/index.tsx b/apps/wr/app/store/matDmd/coSttn/index.tsx index 702808740..edacd7044 100644 --- a/apps/wr/app/store/matDmd/coSttn/index.tsx +++ b/apps/wr/app/store/matDmd/coSttn/index.tsx @@ -2,6 +2,7 @@ import type { CommonTableProps } from "@/app/store/common/type/headder"; import { fetchType, getFetch } from "@/components/lib/api"; import { z } from "zod"; import { coSttHeadListExport, coSttNodeListExport } from "./headList"; +import { excelCoSttnParsing } from "./excel"; // 테이블 헤드 리스트 const coSttNodeList = coSttNodeListExport; @@ -31,7 +32,8 @@ export type coSttnState = { }; type coSttnActions = { - coSttnInit:(con:string) => void + coSttnInit:(con:string) => void; + coSttnSearch: (txt: string, cnt: number) => void; }; export type coSttnType = coSttnState & coSttnActions; @@ -57,7 +59,6 @@ export const coSttnActionsExport: (set: any) => coSttnActions = ( fetchType.WR, `/reuseFc/request/마인드원/3` ); - console.log(coSttnRes, "ㅠㅠ") set((state: coSttnState) => { return { ...state, @@ -72,5 +73,37 @@ export const coSttnActionsExport: (set: any) => coSttnActions = ( console.log(e) } }, + coSttnSearch: async (txt: string, cnt: number) => { + try { + const coSttnRes = await getFetch( + fetchType.WR, + `/reuseFc/request/${txt}/${cnt}` + ); + if (Number(cnt) > 0) { + const coExcel = excelCoSttnParsing(coSttnRes); + set((state: coSttnState) => { + return { + ...state, + coSttn: { + ...state.coSttn, + excelList: coExcel, + }, + }; + }); + } else + set((state: coSttnState) => { + return { + ...state, + coSttn: { + ...state.coSttn, + coSttnRes: coSttnRes, + isInit: false, + }, + }; + }); + } catch (erTxt) { + console.log("error", erTxt); + } + }, } } \ No newline at end of file diff --git a/apps/wr/app/store/matDmd/ldrmntCoSttn/index.tsx b/apps/wr/app/store/matDmd/ldrmntCoSttn/index.tsx index 35d127904..83a8a4ed0 100644 --- a/apps/wr/app/store/matDmd/ldrmntCoSttn/index.tsx +++ b/apps/wr/app/store/matDmd/ldrmntCoSttn/index.tsx @@ -1,24 +1,25 @@ -import type { z } from "zod"; import type { CommonTableProps } from "@/app/store/common/type/headder"; -import { coSttNodeListExport, coSttHeadListExport } from "../coSttn/headList"; -import type { customCoBdst } from "../../matDmd/coReg"; -import type { sttnHeadListType } from "../coSttn/headList"; +import { coSttHeadListExport, coSttNodeListExport } from "../coSttn/headList"; +import type { customCoSttnBdst } from "../coSttn"; // 테이블 헤드 리스트 const coSttNodeList = coSttNodeListExport; const coSttHeadList = coSttHeadListExport; -const ldrmntCoSttnRes: customCoBdst[] = []; +const ldrmntCoSttnRes: customCoSttnBdst[] = []; -const ldrmntCoList = {ctpv: "이거머임", - sgg: "01", - coNm: "회사요", +const ldrmntCoList = [{ + ctpvCd: "이거머임", + sggCd: "01", + dmdCoNm: "회사요", bznmNo: "abc123", - addr: "서울 강남구", - telNo: "010-1234-5678"} + dmdInfoPk: "1111", + daddr: "서울 강남구", + telno: "010-1234-5678" +}] export type ldrmntCoSttnState = { ldrmntCoSttn: { - ldrmntCoSttnRes: customCoBdst[]; + ldrmntCoSttnRes: customCoSttnBdst[]; ldrmntCoSttHeadList: CommonTableProps[]; ldrmntCoSttNodeList: CommonTableProps[]; excelList: []; @@ -35,7 +36,7 @@ export const ldrmntCoSttnStateExport: ldrmntCoSttnState = { ldrmntCoSttn: { ldrmntCoSttHeadList: coSttHeadList, ldrmntCoSttNodeList: coSttNodeList, - ldrmntCoSttnRes: [ldrmntCoList], + ldrmntCoSttnRes: ldrmntCoList, excelList: [], isInit: false, }, diff --git a/apps/wr/public/sample_coSttn.xlsx b/apps/wr/public/sample_coSttn.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..836ee002eb3d159176d8c8ef6c00ee06fc168bff GIT binary patch literal 8550 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 E5A?FDasU7T literal 0 HcmV?d00001 diff --git a/apps/wr/public/sample_ldrmntCoSttn.xlsx b/apps/wr/public/sample_ldrmntCoSttn.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..646e8e4b81c0381182ba5de492344c0d8a650d8f GIT binary patch literal 8958 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 CeRZ1v literal 0 HcmV?d00001