Merge commit 'fcf39d222220095c78690c92a356fe2254a73c90' into iipbs/wr/dev
iipbs_wr / build (push) Waiting to run

This commit is contained in:
leedj312
2025-07-03 20:22:59 +09:00
38 changed files with 1005 additions and 515 deletions
+10 -8
View File
@@ -1,5 +1,4 @@
"use client";
import { useWrStore } from "@/app/store";
import {
DmdCoReqSchema,
@@ -9,6 +8,7 @@ import {
} from "@/app/store/matDmd/coMatRvw/type";
import { formH1Class, formTableName } from "@/components/lib/class/comClass";
import {
formatPhoneNumber,
getCity,
getdmdMatFlag,
tableData,
@@ -112,18 +112,20 @@ export default function CoMatRvw() {
}, [form.watch("useUsgCd")]);
useEffect(() => {
if (coMatRvwRes.length > 0) {
if (coMatRvwRes&&coMatRvwRes.length > 0) {
const data = coMatRvwRes?.map((item, index) => {
let flag = "";
flag = getdmdMatFlag(item?.demandMatching?.splyFcltFlg ??"");
flag = getdmdMatFlag(item?.demandMatching?.splyFcltFlg||undefined);
return {
...item,
ctpvCd: item.demandCo?.ctpvCd,
sggCd: item.demandCo?.sggCd,
dmdCoNm: item.demandCo?.dmdCoNm,
daddr: item.demandCo?.daddr,
telno: item.demandCo?.telno,
regDt: moment(item?.demandCo?.regDt).format("YYYY-MM-DD"),
telno: formatPhoneNumber(item.demandCo?.telno||'') ,
splyFcltFlg: flag,
};
});
@@ -181,7 +183,7 @@ export default function CoMatRvw() {
<div className="col-span-7 w-full">
<div className="flex flex-row items-center">
<Label className="text-xl text-gray-600 mx-6">
하수 재이용년도
수요신청년도
</Label>
<SelectBox
className="h-full w-32 text-2xl"
@@ -269,7 +271,7 @@ export default function CoMatRvw() {
></UiTable>
</ListDiv>
<hr />
<ScrollArea className="h-[49vh]">
{/* <ScrollArea className="h-[49vh]"> */}
<ListDiv>
<h3 className="mt-4 ml-2 text-2xl font-medium text-label">
수요신청 상세현황
@@ -662,7 +664,7 @@ export default function CoMatRvw() {
</Form>
<ConCostForm form={form} type={"mat"} />
</ListDiv>
</ScrollArea>
{/* </ScrollArea> */}
</div>
</div>
</ContentsDiv>
+7 -2
View File
@@ -26,6 +26,7 @@ import ListDiv from "@common/business_components/ui/list_div";
import SdmInsertForm from "@common/business_components/ui/sdmInsertForm";
import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form";
import { Button } from "@common/components/ui";
import moment from "moment";
import { useCallback, useEffect, useState } from "react";
import toast, { Toaster } from "react-hot-toast";
@@ -83,6 +84,10 @@ export default function CoSttn() {
const data = tableData(coSttnRes, { code });
const chData = data.map((item: any) => ({
...item,
regDt: moment(item.regDt).format("YYYY-MM-DD")
}));
// .filter((item: any) => item !== undefined);
setBdstTable(chData);
@@ -182,7 +187,7 @@ export default function CoSttn() {
onClick={() => {
/* 저장 로직 */
if (!upadateData) {
<ToastFormUi body={"수요처 변경을 원하는 행을 선택해주세요"} title={"수요처관리"}></ToastFormUi>;
toast.error("수요처 변경을 원하는 행을 선택해주세요")
}else{
setIsDmdModal({
...isDmdModal,
@@ -190,7 +195,7 @@ export default function CoSttn() {
}
}}
>
저장
수정
</Button>
<Button
size={"sm"}
@@ -28,8 +28,10 @@ import {
type SelectDataType
} from "@common/business_components/ui";
import ListDiv from "@common/business_components/ui/list_div";
import LoadingOverlay from "@common/business_components/ui/loadingBar";
import { Button } from "@common/components/ui";
import { useCallback, useEffect, useRef, useState } from "react";
import { Toaster } from "react-hot-toast";
export default function LdrmntCoSttn() {
const { code, ldrmnt, ldrmntInit, ldrmntSearch, } = useWrStore(
@@ -273,7 +275,7 @@ export default function LdrmntCoSttn() {
<div className="overflow-x-auto">
<ListDiv className="min-w-max">
<UiTable
headName={[]}
headName={undefined}
tableData={bdstTable || []}
headlist={ldrmntHeadListExport}
pageSize={20}
@@ -299,8 +301,9 @@ export default function LdrmntCoSttn() {
setIsExcelOpen({ isModal: !isExcelOpen.isModal })
}}
bodyClass={"w-[40vw] max-w-none"}
body={<CoRegExcel />}
body={<CoRegExcel isModal={(isOpen) => setIsExcelOpen({ isModal: isOpen })} />}
/>
<Toaster position="top-center"></Toaster>
</div>
@@ -8,6 +8,7 @@ import type {
} from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import {
excelDownload,
getCity,
getCityOrSgg,
tableData,
} from "@/components/lib/func/commom";
@@ -16,16 +17,22 @@ import SttnDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/sttnDeta
import {
ContentsDiv,
SearchBaseForm,
SearchDiv,
SearchFormLeft,
SearchFormRight,
SelectBox,
Title,
UiModal,
UiTable,
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 { useCallback, useEffect, useRef, useState } from "react";
import { excelHtdflSttnParsing } from "@/app/store/ruseFcltMng/fcltSttn/htdflSttn/excel";
import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan";
import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal";
export default function HtdflSttn() {
const { code, htdflSttn, htdflSttnSearch, initHtdfl } = useWrStore(
@@ -38,6 +45,8 @@ export default function HtdflSttn() {
const [pageNation, setPageNation] = useState(1);
const [isChHead, setIsChHead] = useState(false);
const [bdstTable, setBdstTable] = useState<customRainBdst[]>();
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>()
const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" });
const [detailModal, setDetailModal] = useState<{
isOpen: boolean;
data: customRainBdst | undefined;
@@ -50,13 +59,44 @@ export default function HtdflSttn() {
const codeData = getCityOrSgg(ref);
const excelClick = useCallback(() => {
if (codeData) htdflSttnSearch(1, "10000", codeData);
}, [htdflSttnSearch, codeData]);
// 최신 검색 조건 반영
const con = getConValue();
htdflSttnSearch(1, "10000", String(con), code.cityCd, code.sggCd);
}, [htdflSttnSearch, objSearch, code.cityCd, code.sggCd]);
useEffect(() => {
if (codeData != null) htdflSttnSearch(pageNation, "20", codeData);
if (codeData != null) htdflSttnSearch(pageNation, "20", codeData, code.cityCd, code.sggCd);
}, [pageNation]);
const getSelCity = (val: string | number) => {
const cityValue = String(val);
if (cityValue === "0") {
setSelectSgg([]);
setObjSearch({ city: cityValue, sgg: "" });
} else {
const data = getCity(cityValue, code.sggCd);
setSelectSgg(data);
const firstSggVal = data.find(item => item.val === "0")?.val || (data[0]?.val ?? "");
setObjSearch({ city: cityValue, sgg: firstSggVal });
}
};
const getSgg = (val: string | number) => {
setObjSearch({ ...objSearch, sgg: String(val) })
};
const getConValue = () => {
if (!objSearch.city || objSearch.city === "0") {
return "0";
}
if (objSearch.sgg && objSearch.sgg !== "0") {
return objSearch.sgg;
}
return objSearch.city;
};
const cellClick = (index: number | undefined, headId: string) => {
if (
headId !== "chBuildingYn" &&
@@ -67,20 +107,15 @@ export default function HtdflSttn() {
}
};
useEffect(() => {
const excelDown = async () => {
if (htdflSttn.excelList.length > 0) {
if (htdflSttn.excelList.length === 0) return;
const excelData = await tableData(htdflSttn.excelList, { code });
const htdflExcel = excelHtdflSttnParsing(excelData, code.cityCd, code.sggCd);
excelDownload(
htdflExcel as [[]],
"온배수시설 현황",
"sample_htdflSttn.xlsx",
"A1:S3"
);
}
};
excelDown();
if (htdflSttn.excelList.length > 0) {
if (htdflSttn.excelList.length === 0) return;
excelDownload(
htdflSttn.excelList,
"온배수시설 현황",
"sample_htdflSttn.xlsx",
"A1:S3"
);
}
}, [htdflSttn.excelList, code]);
useEffect(() => {
@@ -90,19 +125,16 @@ export default function HtdflSttn() {
}, [htdflSttn.isInit, initHtdfl]);
useEffect(() => {
if (htdflSttnRes.length > 0 && code.cityCd.length > 0) {
const data = tableData(htdflSttnRes, { code });
const chData = data
.map((item: any) => ({
...item,
...item.reuseBuilding[0],
...item.reuseBuilding[0].htdflObj,
chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N",
}))
.filter((item: any) => item.htdflObj !== undefined);
setBdstTable(chData);
}
const data = tableData(htdflSttnRes, { code });
const chData = data
.map((item: any) => ({
...item,
...item.reuseBuilding[0],
...item.reuseBuilding[0].htdflObj,
chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N",
}))
.filter((item: any) => item.htdflObj !== undefined);
setBdstTable(chData);
}, [code, htdflSttnRes, htdflSttn.htdflSttHeadList]);
return (
@@ -111,43 +143,65 @@ export default function HtdflSttn() {
<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={<Button
className={btnClass}
onClick={() => {
setIsChHead(true);
} }
>
조회항목설정
</Button>}
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;
}
htdflSttnSearch(pageNation, "20", con);
} }
excelClick={excelClick}
initClick={function (): void { } }
btnClass={btnClass}
ref={ref} isAdmin={false} />
<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 || []}
value={objSearch.sgg} // value props 추가
onSelectValue={getSgg}
/>
</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 items-center">
<Button
size={"sm"}
onClick={() => {
const con = getConValue();
htdflSttnSearch(1, "20", String(con), code.cityCd, code.sggCd);
}}
>
조회
</Button>
<Button
size={"sm"}
className={`${btnClass} green`}
onClick={excelClick}
>
다운로드
</Button>
<Button
size={"sm"}
className={btnClass}
onClick={() => {
setIsChHead(true);
}}
>
조회항목설정
</Button>
</div>
</SearchFormRight>
</SearchDiv>
</div>
</div>
<div className="grid grid-cols-6 gap-4 ">
<div className="col-span-6">
<ListDiv>
<UiTable
headName={[]}
headName={undefined}
tableData={bdstTable || []}
children={
<HeadMakeColSpan upHeadList={htdflSttn.htdflSttNodeList} />
@@ -82,7 +82,6 @@ export default function RainSttn() {
};
const getSgg = (val: string | number) => {
console.log("val", val)
setObjSearch({ ...objSearch, sgg: String(val) })
};
@@ -96,8 +95,6 @@ export default function RainSttn() {
return objSearch.city;
};
useEffect(() => {
if (!rainSttn.isInit) {
rainSttnInit(codeData ?? "0");
@@ -108,8 +105,6 @@ export default function RainSttn() {
const data = tableData(rainSttnRes, { code });
const chData = data
.map((item: any) => {
console.log("item", item);
console.log("왜안돼", item.reuseBuilding[0].rainyObj.dtfcltCpct)
return {
...item,
...item.reuseBuilding[0],
@@ -124,10 +119,16 @@ export default function RainSttn() {
? "확인불가"
: item.reuseBuilding[0].instlCstSprtAmt,
chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N",
pntfColArea: item.reuseBuilding[0].rainyObj.pntfColArea === -1
? "확인불가"
: item.reuseBuilding[0].rainyObj.pntfColArea,
filtrTrtmfctCpct: item.reuseBuilding[0].rainyObj.filtrTrtmfctCpct === -1
? "확인불가"
: item.reuseBuilding[0].rainyObj.filtrTrtmfctCpct,
archArea: Math.floor(item.archArea) === -1 ? "확인불가" : item.archArea,
};
})
.filter((item: any) => item.rainyObj !== undefined);
console.log("chData", chData)
setBdstTable(chData);
}, [code, rainSttnRes, rainSttn.rainSttHeadList]);
@@ -147,9 +148,6 @@ export default function RainSttn() {
}
}, [rainSttn.excelList]);
// const excelClick = useCallback(() => {
// if (codeData) rainSttnSearch(1, "10000", codeData, code.cityCd, code.sggCd);
// }, [rainSttnSearch, codeData, code.cityCd, code.sggCd]);
const excelClick = useCallback(() => {
// 최신 검색 조건 반영
const con = getConValue();
@@ -162,8 +160,6 @@ export default function RainSttn() {
<div className="grid grid-cols-4 gap-4 ">
<div className="col-span-4">
<Title title={"빗물재이용 시설 현황"} />
<SearchDiv>
<SearchFormLeft>
<div className="col-span-10 flex flex-row">
@@ -215,50 +211,6 @@ export default function RainSttn() {
</div>
</SearchFormRight>
</SearchDiv>
{/* <SearchBaseForm
selectSidoData={code.cityCd}
selectSigunData={code.sggCd}
selectRegionData={code.rvbsnCd}
selectUnitWaterShedData={code.lgbsnCd}
selectMiddleRegionData={code.mdmbsnCd}
selectEnvPartData={code.lclgvrnmntCd}
rightChildren={
<Button
className={btnClass}
onClick={() => {
setIsChHead(true);
}}
>
조회항목설정
</Button>
}
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;
}
rainSttnSearch(1, "20", con, code.cityCd, code.sggCd);
}}
excelClick={excelClick}
initClick={function (): void { }}
btnClass={btnClass}
ref={ref}
isAdmin={false}
/> */}
</div>
</div>
<div className="grid grid-cols-6 gap-4 ">
@@ -5,19 +5,26 @@ import type { chgBuilding } from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg";
import {
excelDownload,
getCity,
getCityOrSgg,
tableData,
} from "@/components/lib/func/commom";
import BdstChgModal from "@/components/ui/modal/fcltReg/bdstChgModal/bdstChgModal";
import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal";
import HeadChModal from "@/components/ui/modal/sttn/headChModal/headChModal";
import SttnDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/sttnDetailModal";
import {
ContentsDiv,
SearchBaseForm,
SearchDiv,
SearchFormLeft,
SearchFormRight,
SelectBox,
Title,
UiModal,
UiTable,
type ReturnType,
type SelectDataType,
} from "@common/business_components/ui";
import ListDiv from "@common/business_components/ui/list_div";
import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan";
@@ -34,6 +41,8 @@ export default function RswtSttn() {
const [isChHead, setIsChHead] = useState(false);
const ref = useRef<ReturnType>({} as ReturnType);
const [bdstTable, setBdstTable] = useState<customRswtBdst[]>();
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>()
const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" });
const [detailModal, setDetailModal] = useState<{ isOpen: boolean, data: customRswtBdst | undefined }>({ data: undefined, isOpen: false })
const [bdstChgProps, setBdstChgProps] = useState<{
isOpen: boolean;
@@ -58,6 +67,35 @@ export default function RswtSttn() {
}
}
const getSelCity = (val: string | number) => {
const cityValue = String(val);
if (cityValue === "0") {
setSelectSgg([]);
setObjSearch({ city: cityValue, sgg: "" });
} else {
const data = getCity(cityValue, code.sggCd);
setSelectSgg(data);
const firstSggVal = data.find(item => item.val === "0")?.val || (data[0]?.val ?? "");
setObjSearch({ city: cityValue, sgg: firstSggVal });
}
};
const getSgg = (val: string | number) => {
setObjSearch({ ...objSearch, sgg: String(val) })
};
const getConValue = () => {
if (!objSearch.city || objSearch.city === "0") {
return "0";
}
if (objSearch.sgg && objSearch.sgg !== "0") {
return objSearch.sgg;
}
return objSearch.city;
};
useEffect(() => {
if (!rswtSttn.isInit) {
rswtSttnInit("0");
@@ -65,22 +103,25 @@ export default function RswtSttn() {
}, [rswtSttn.isInit, rswtSttnInit]);
useEffect(() => {
if (rswtSttnRes?.length > 0 && code.cityCd.length > 0) {
const data = tableData(rswtSttnRes, { code });
const chData = data
.map((item: customRswtBdst) => ({
const data = tableData(rswtSttnRes, { code });
const chData = data
.map((item: customRswtBdst) => {
console.log("item", item)
return {
...item,
...item.reuseBuilding[0],
...item.reuseBuilding[0]?.rswtrObj,
chBuildingYn: item?.chgBuilding[0]?.bdstChgNm !== null && item?.chgBuilding.length > 0 ? 'Y' : 'N'
}))
.filter(
(item: customRswtBdst) =>
item.reuseBuilding[0]?.rswtrObj !== undefined
);
chBuildingYn: item?.chgBuilding[0]?.bdstChgNm !== null && item?.chgBuilding.length > 0 ? 'Y' : 'N',
instlCst: item.reuseBuilding[0]?.instlCst === -1 ? "확인불가" : item.reuseBuilding[0]?.instlCst,
instlCstSprtAmt: item.reuseBuilding[0]?.instlCstSprtAmt === -1 ? "확인불가" : item.reuseBuilding[0]?.instlCstSprtAmt,
}
})
.filter(
(item: customRswtBdst) =>
item.reuseBuilding[0]?.rswtrObj !== undefined
);
setBdstTable(chData);
}
setBdstTable(chData);
}, [code, rswtSttnRes]);
useEffect(() => {
@@ -95,13 +136,11 @@ export default function RswtSttn() {
}
}, [rswtSttn.excelList]);
const excelClick = useCallback(
(returnType: ReturnType) => {
if (codeCityOrSgg)
rswtSttnSearch(1, "10000", codeCityOrSgg, code.cityCd, code.sggCd);
},
[rswtSttnSearch, code.cityCd, code.sggCd, codeCityOrSgg]
);
const excelClick = useCallback(() => {
// 최신 검색 조건 반영
const con = getConValue();
rswtSttnSearch(1, "10000", String(con), code.cityCd, code.sggCd);
}, [rswtSttnSearch, objSearch, code.cityCd, code.sggCd]);
useEffect(() => {
if (codeCityOrSgg != null) rswtSttnSearch(pageNation, "20", codeCityOrSgg, code.cityCd, code.sggCd);
@@ -113,38 +152,64 @@ export default function RswtSttn() {
<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={<Button
className={btnClass}
onClick={() => {
setIsChHead(true);
} }
>
조회항목설정
</Button>}
leftChildren={undefined}
queryClick={function (returnType: ReturnType): void {
// '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}'
if (codeCityOrSgg)
rswtSttnSearch(1, "20", codeCityOrSgg, code.cityCd, code.sggCd);
} }
excelClick={excelClick}
initClick={function (): void { } }
btnClass={btnClass}
ref={ref} isAdmin={false} />
<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 || []}
value={objSearch.sgg} // value props 추가
onSelectValue={getSgg}
/>
</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 items-center">
<Button
size={"sm"}
onClick={() => {
const con = getConValue();
rswtSttnSearch(1, "20", String(con), code.cityCd, code.sggCd);
}}
>
조회
</Button>
<Button
size={"sm"}
className={`${btnClass} green`}
onClick={excelClick}
>
다운로드
</Button>
<Button
size={"sm"}
className={btnClass}
onClick={() => {
setIsChHead(true);
}}
>
조회항목설정
</Button>
</div>
</SearchFormRight>
</SearchDiv>
</div>
</div>
<div className="grid grid-cols-6 gap-4 ">
<div className="col-span-6">
<ListDiv>
<UiTable
headName={[]}
headName={undefined}
tableData={bdstTable || []}
children={
<HeadMakeColSpan upHeadList={rswtSttn.rswtSttNodeList} />
@@ -1,10 +1,14 @@
"use client";
import { useWrStore } from "@/app/store";
import { type rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn";
import type {
rswtChkZodType,
rswtrChkDetailsZodType,
import {
commonCd,
rainPageSize,
type rainChkZodType,
} from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn";
import {
rswtPageSize,
type rswtrChkDetailsZodType,
} from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn";
import {
excelArrayDownload,
@@ -15,6 +19,7 @@ import ChkgdExcel from "@/components/ui/modal/chkgd/chkgdExcel/chkgdExcel";
import ChkgdModal from "@/components/ui/modal/chkgd/chkgdModal/chkgdModal";
import RainChkgdTable from "@/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable";
import RswtChkgdTable from "@/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable";
import { SearchInput } from "@common/business_components";
import {
ContentsDiv,
SearchDiv,
@@ -25,9 +30,16 @@ import {
UiModal,
} from "@common/business_components/ui";
import ListDiv from "@common/business_components/ui/list_div";
import LoadingOverlay from "@common/business_components/ui/loadingBar";
import { Button, Label } from "@common/components/ui";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@common/components/ui/tooltip";
import { useCallback, useEffect, useState } from "react";
import { Toaster } from "react-hot-toast";
import toast, { Toaster } from "react-hot-toast";
export default function Page() {
const {
@@ -39,8 +51,10 @@ export default function Page() {
rainChkDelete,
rainChkExcelDownload,
rainChkHeadChange,
rainChkNmSearch,
isRainSttn,
rswtChkgdnInit,
rswtChkNmSearch,
rswtChkPolInit,
rswtChkDetilsUpdate,
rswtChkDelete,
@@ -57,39 +71,84 @@ export default function Page() {
rswtrChkDetailsZodType[]
>([]);
const [deleteIdx, setDeleteIdx] = useState<number[]>([]);
const [pageNation, setPageNation] = useState(1);
const [rainPageNation, setRainPageNation] = useState(1);
const [rswtPageNation, setRswtPageNation] = useState(1);
const [fcltNm, setFcltNm] = useState<string>("");
const [selFcltDiv, setSelFcltDiv] = useState("RNB");
const [isModal, setIsModal] = useState({
open: false,
data: {},
});
const cellClick = () => {
if (searchYear)
if (selFcltDiv === "RNB") {
rainChkInit("1", "20", searchYear, "0");
} else {
rswtChkgdnInit("1", "20", searchYear, "0");
}
};
const [searchYear, setSearchYear] = useState<string>(
String(new Date().getFullYear())
);
const cellClick = () => {
if (searchYear)
if (selFcltDiv === "RNB") {
if (fcltNm) {
rainChkNmSearch(
rainPageNation,
rainPageSize,
searchYear,
commonCd,
fcltNm
);
} else {
rainChkInit(rainPageNation, rainPageSize, searchYear, commonCd);
}
} else {
if (fcltNm) {
rswtChkNmSearch(
rainPageNation,
rainPageSize,
searchYear,
commonCd,
fcltNm
);
} else {
rswtChkgdnInit(rswtPageNation, rswtPageSize, searchYear, commonCd);
}
}
};
const rainPageChange = (pageNo: number) => {
if (pageNo > 0) {
setRainPageNation(pageNo);
rainChkInit(pageNo, rainPageSize, searchYear, commonCd);
}
};
const rswtPageChange = (pageNo: number) => {
if (pageNo > 0) {
setRswtPageNation(pageNo);
rswtChkgdnInit(pageNo, rswtPageSize, searchYear, commonCd);
}
};
useEffect(() => {
if (!rainChkgdn.isInit) {
rainChkInit("1", "20", new Date().getFullYear().toString(), "0");
rainChkInit(
1,
rainPageSize,
new Date().getFullYear().toString(),
commonCd
);
isRainSttn(false);
setIsModal({ data: {}, open: false });
setIsRegExcel(false);
}
}, [rainChkgdn.isInit, rainChkInit, rainPageSize]);
useEffect(() => {
if (!rswtChkgdn.isInit) {
rswtChkgdnInit("1", "20", new Date().getFullYear().toString(), "0");
rswtChkgdnInit(
1,
rswtPageSize,
new Date().getFullYear().toString(),
commonCd
);
setIsModal({ data: {}, open: false });
setIsRegExcel(false);
}
}, [rainChkgdn.isInit, rainChkInit]);
}, [rswtChkgdn.isInit, rswtChkgdnInit, rswtPageSize]);
useEffect(() => {
if (rswtChkgdn.excelList[0] && rswtChkgdn.excelList[0]?.data.length > 1) {
@@ -133,8 +192,8 @@ export default function Page() {
);
useEffect(() => {
//rainChkgdn.isSttn = false;
//rswtChkgdn.isSttn = false;
rainChkgdn.isSttn = false;
rswtChkgdn.isSttn = false;
if (!rainChkgdn.isSttn && !rswtChkgdn.isSttn) {
rainChkHeadChange({ rainChkgdn }, true);
rswtChkHeadChange({ rswtChkgdn }, true);
@@ -152,9 +211,17 @@ export default function Page() {
};
const chkUpdateTable = (selFcltDiv: string) => {
if (selFcltDiv === "RNB") {
rainChkDetilUpdate(updateRainDetail);
if (updateRainDetail && updateRainDetail.length > 0) {
rainChkDetilUpdate(updateRainDetail);
} else {
toast.error("수정을 원하는 행을 선택하고 저장버튼을 눌러주세요 ");
}
} else {
rswtChkDetilsUpdate(updateRswtDetail);
if (updateRswtDetail && updateRswtDetail.length > 0) {
rswtChkDetilsUpdate(updateRswtDetail);
} else {
toast.error("수정을 원하는 행을 선택하고 저장버튼을 눌러주세요 ");
}
}
};
@@ -176,10 +243,8 @@ export default function Page() {
selectArray={yearOptions}
value={searchYear}
onSelectValue={(val: string | number) => {
setSearchYear(String(val))
}
}
setSearchYear(String(val));
}}
/>
</div>
<div className="col-span-2 flex flex-row space-x-2">
@@ -193,12 +258,22 @@ export default function Page() {
selectArray={rainChkgdn.fcltDiv}
onSelectValue={(val: string | number) => {
if (val === "RST") rswtChkPolInit();
setSelFcltDiv(String(val))
}
}
setSelFcltDiv(String(val));
}}
value={selFcltDiv ?? rainChkgdn.fcltDiv[0]?.val}
/>
</div>
<div className="col-span-2 flex flex-row space-x-2">
<Label className="w-28 mt-2 text-xl text-gray-600">
{"시설명"}
</Label>
<SearchInput
className={"w-full h-full text-2xl"}
label={""}
textValue={fcltNm || ""}
setText={setFcltNm}
/>
</div>
</SearchFormLeft>
<SearchFormRight className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 ">
<div className="space-y">
@@ -219,14 +294,28 @@ export default function Page() {
>
삭제
</Button>
<Button
size={"sm"}
onClick={() => {
chkUpdateTable(selFcltDiv);
}}
>
저장
</Button>
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<Button
size={"sm"}
onClick={() => {
chkUpdateTable(selFcltDiv);
}}
>
저장
</Button>
</TooltipTrigger>
<TooltipContent side="bottom" sideOffset={5}>
<h2 className="text-xl">
아래 테이블에 선택을 체크하면 입력셀이 활성화 됩니다.
</h2>
</TooltipContent>
</Tooltip>
</TooltipProvider>
<Button
size={"sm"}
onClick={() => {
@@ -253,8 +342,8 @@ export default function Page() {
detailUp={setUpdateRainDetail}
handleClick={handleClick}
rainChkData={rainChkgdn.rainChk}
pageNation={pageNation}
onPageChange={setPageNation}
pageNation={rainPageNation}
onPageChange={rainPageChange}
/>
) : (
<RswtChkgdTable
@@ -262,8 +351,8 @@ export default function Page() {
deleteRswtData={setDeleteIdx}
handleRswtClick={handleClick}
rswtChkData={rswtChkgdn.rswtChkRes}
pageNation={pageNation}
onPageChange={setPageNation}
pageNation={rswtPageNation}
onPageChange={rswtPageChange}
/>
)}
</ListDiv>
@@ -271,17 +360,28 @@ export default function Page() {
</div>
<UiModal
open={isModal.open}
onOpenChange={() => {
setIsModal({ open: !open, data: {} });
onOpenChange={(open: boolean) => {
setIsModal((prev) => ({ ...prev, open }));
}}
bodyClass={"w-[80vw] max-w-none"}
body={<ChkgdModal type={selFcltDiv} obj={isModal.data} />}
body={
<ChkgdModal
type={selFcltDiv}
obj={isModal.data}
setIsModal={(open) => setIsModal((prev) => ({ ...prev, open }))}
/>
}
></UiModal>
<UiModal
open={isRegExcel}
onOpenChange={setIsRegExcel}
bodyClass={"w-[30vw] max-w-none"}
body={<ChkgdExcel type={selFcltDiv}></ChkgdExcel>}
body={
<ChkgdExcel
type={selFcltDiv}
setIsRegExcel={setIsRegExcel}
></ChkgdExcel>
}
/>
<Toaster position="top-center" />
</ContentsDiv>
@@ -68,8 +68,6 @@ export default function PbnstPrfmncSttn() {
chartData5: lineChartDataProps[];
chartData6: lineChartDataProps[];
chartData7: lineChartDataProps[];
chartData8: lineChartDataProps[];
chartData9: lineChartDataProps[];
}>();
const [outLineData, setOutLineData] = useState<{
chartData1: lineChartDataProps[];
@@ -78,6 +76,8 @@ export default function PbnstPrfmncSttn() {
chartData4: lineChartDataProps[];
chartData5: lineChartDataProps[];
chartData6: lineChartDataProps[];
chartData7: lineChartDataProps[];
chartData8: lineChartDataProps[];
}>();
type dnChartForm = { label: string, val: number, fill?: string };
@@ -228,16 +228,18 @@ export default function PbnstPrfmncSttn() {
indstUswtr += element.indstUswtr;
// 월별 합계
inUsageSum = element.wshwtr
inUsageSum =
element.wshwtr
+ element.coolUswtr
+ element.cleanUswtr
+ element.drwtUswtr
+ element.dltnUswtr
+ element.ithlRswtr
+ element.ithlEtcUswtr
+ element.cleanToilUswtr
+ element.resn;
outUsageSum = element.lndwtr
outUsageSum =
element.cleanToilUswtr
+ element.resn
+ element.lndwtr
+ element.hydUswtr
+ element.ugwtChr
+ element.farmUswtr
@@ -258,9 +260,10 @@ export default function PbnstPrfmncSttn() {
dltnUswtrData.push({ label: `${month}월`, val: element.dltnUswtr, color: "purple" });
ithlRswtrData.push({ label: `${month}월`, val: element.ithlRswtr, color: "green" });
ithlEtcUswtrData.push({ label: `${month}월`, val: element.ithlEtcUswtr, color: "blue" });
cleanToilUswtrData.push({ label: `${month}월`, val: element.cleanToilUswtr, color: "magenta" });
resnData.push({ label: `${month}월`, val: element.resn, color: "skyblue" });
lndwtrData.push({ label: `${month}월`, val: element.lndwtr, color: "red" });
hydUswtrData.push({ label: `${month}월`, val: element.hydUswtr, color: "orange" });
ugwtChrData.push({ label: `${month}월`, val: element.ugwtChr, color: "yellow" });
@@ -271,22 +274,18 @@ export default function PbnstPrfmncSttn() {
}
});
let dnTotalIn = 0;
let dnTotalOut = 0;
inUsageArr.forEach((item) => {
dnTotalIn += item
})
outUsageArr.forEach((item) => {
dnTotalOut += item
})
// 도넛차트 데이터
dnData.push({ label: "세척수", val: wshwtr, fill: "#F7CFD8" });
dnData.push({ label: "냉각수", val: coolUswtr, fill: "#F4F8D3" });
dnData.push({ label: "청소수", val: cleanUswtr, fill: "#A6D6D6" });
dnData.push({ label: "식수대", val: drwtUswtr, fill: "#8E7DBE" });
dnData.push({ label: "희석용수", val: dltnUswtr, fill: "#FF8383" });
dnData.push({ label: "중수도", val: ithlRswtr, fill: "#FFF574" });
dnData.push({ label: "기타", val: ithlEtcUswtr, fill: "#A1D6CB" });
dnData.push({ label: "청소화장실용수", val: cleanToilUswtr, fill: "#A19AD3" });
dnData.push({ label: "세척살수용수", val: resn, fill: "#B1F0F7" });
dnData.push({ label: "조경용수", val: lndwtr, fill: "#81BFDA" });
dnData.push({ label: "친수용수", val: hydUswtr, fill: "#F5F0CD" });
dnData.push({ label: "지하수충전", val: ugwtChr, fill: "#FADA7A" });
dnData.push({ label: "농업용수", val: farmUswtr, fill: "#A6AEBF" });
dnData.push({ label: "하천등유지용수", val: rvrKeepUswtr, fill: "#C5D3E8" });
dnData.push({ label: "공업용수", val: indstUswtr, fill: "#D0E8C5" });
dnData.push({ label: "장내용수", val: dnTotalIn, fill: "#8DD8FF" });
dnData.push({ label: "장외용수", val: dnTotalOut, fill: "#FFF085" });
// 장내용수 도넛
dnInData.push({ label: "세척수", val: wshwtr, fill: "#F7CFD8" });
@@ -296,10 +295,10 @@ export default function PbnstPrfmncSttn() {
dnInData.push({ label: "희석용수", val: dltnUswtr, fill: "#FF8383" });
dnInData.push({ label: "중수도", val: ithlRswtr, fill: "#FFF574" });
dnInData.push({ label: "기타", val: ithlEtcUswtr, fill: "#A1D6CB" });
dnInData.push({ label: "청소화장실용수", val: cleanToilUswtr, fill: "#A19AD3" });
dnInData.push({ label: "세척살수용수", val: resn, fill: "#B1F0F7" });
// 장외용수 도넛
dnOutData.push({ label: "청소화장실용수", val: cleanToilUswtr, fill: "#A19AD3" });
dnOutData.push({ label: "세척살수용수", val: resn, fill: "#B1F0F7" });
dnOutData.push({ label: "조경용수", val: lndwtr, fill: "#81BFDA" });
dnOutData.push({ label: "친수용수", val: hydUswtr, fill: "#F5F0CD" });
dnOutData.push({ label: "지하수충전", val: ugwtChr, fill: "#FADA7A" });
@@ -315,17 +314,17 @@ export default function PbnstPrfmncSttn() {
chartData4: drwtUswtrData,
chartData5: dltnUswtrData,
chartData6: ithlRswtrData,
chartData7: ithlEtcUswtrData,
chartData8: cleanToilUswtrData,
chartData9: resnData
chartData7: ithlEtcUswtrData
});
setOutLineData({
chartData1: lndwtrData,
chartData2: hydUswtrData,
chartData3: ugwtChrData,
chartData4: farmUswtrData,
chartData5: rvrKeepUswtrData,
chartData6: indstUswtrData,
chartData1: cleanToilUswtrData,
chartData2: resnData,
chartData3: lndwtrData,
chartData4: hydUswtrData,
chartData5: ugwtChrData,
chartData6: farmUswtrData,
chartData7: rvrKeepUswtrData,
chartData8: indstUswtrData,
});
setBarData(barData);
setChartData(dnData);
@@ -408,15 +407,7 @@ export default function PbnstPrfmncSttn() {
chartData7: {
label: '기타',
color: "blue",
},
chartData8: {
label: '청소화장실용수',
color: "magenta",
},
chartData9: {
label: '세척살수용수',
color: "skyblue",
},
}
} satisfies ChartConfig;
setLnInChartConfig(newChartConfig);
}
@@ -427,26 +418,34 @@ export default function PbnstPrfmncSttn() {
if (outLineData?.chartData1) {
const newChartConfig = {
chartData1: {
label: '조경용수',
label: '청소화장실용수',
color: "red",
},
chartData2: {
label: '세척살수용수',
color: "pink",
},
chartData3: {
label: '조경용수',
color: "gray",
},
chartData4: {
label: '친수용수',
color: "orange",
},
chartData3: {
chartData5: {
label: '지하수충전',
color: "yellow",
},
chartData4: {
chartData6: {
label: '농업용수',
color: "green",
},
chartData5: {
chartData7: {
label: '하천등유지용수',
color: "blue",
},
chartData6: {
chartData8: {
label: '공업용수',
color: "purple",
},
@@ -615,7 +614,7 @@ export default function PbnstPrfmncSttn() {
<h1 className="">장내·외 월별 하수재이용실적 현황</h1>
<div className="flex">
<div className="w-1/3">
<MainChart chartConfig={barChartConfig} chartData={barData} chartTitle={"월별 장내·외 용수 총 실적"} chartForm={CHART_FORM.DOUBLEBAR} />
<MainChart chartConfig={barChartConfig} chartData={barData} chartTitle={"월별 장내·외 용수 총 실적"} chartForm={CHART_FORM.DOUBLEBAR} showLegend={true} />
</div>
<div className="w-1/3">
<MainChart chartConfig={lnInChartConfig} chartData={inLineData} chartTitle={"월별 장내 용수 실적"} chartForm={CHART_FORM.LINE} />
@@ -627,25 +626,25 @@ export default function PbnstPrfmncSttn() {
<h1 className="">하수재이용실적 현황</h1>
<ListDiv className="col-span-8 pr-6 ">
{/* <ScrollArea className="h-[60vh]"> */}
{/* <div className="card-header">
{/* <div className="card-header">
<h3 className="text-2xl font-medium text-label">
{"하수처리수재이용 실적(m3) 등록결과"}
</h3>
</div> */}
<UiTable
headName={undefined}
tableData={prfData || []}
headlist={monthHeadList}
pageSize={0}
total={0}
cellClick={undefined}
onPageChange={function (page: number): void {
throw new Error("Function not implemented.");
}}>
</UiTable>
<UiTable
headName={undefined}
tableData={prfData || []}
headlist={monthHeadList}
pageSize={0}
total={0}
cellClick={undefined}
onPageChange={function (page: number): void {
throw new Error("Function not implemented.");
}}>
</UiTable>
{/* <ListDiv className="col-span-8 pr-6 ">
{/* <ListDiv className="col-span-8 pr-6 ">
<ScrollArea className="h-[60vh]">
<div className="card-header">
<h3 className="text-2xl font-medium text-label">
@@ -29,12 +29,12 @@ export const coRvwHeadListExport: CommonTableProps[]= [
visible: true,
},
{
id: "regDt", //바꾸기
id: "dmndTmng", //바꾸기
title: "신청일자",
visible: true,
},
{
id: "state", //바꾸기
id: "splyFcltFlg", //바꾸기
title: "진행상태",
visible: true,
},
@@ -103,12 +103,18 @@ export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => {
data
);
if(isUpdate){
toast.error("수요 매칭 검토 검토로 저장되었습니다.");
}
const coMatRvwRes = coMatInit(
1,
10,
new Date().getFullYear().toString(),
new Date().getFullYear().toString(),
);
return set((state: coRvwState) => ({
...state,
coRvw: {
+1 -1
View File
@@ -53,7 +53,7 @@ import { z } from "zod";
rgtr: z.string().nullish(),
mdfcnDt: z.coerce.date().nullish(),
mdfr: z.string().nullish(),
dmdAplyPswd: z.string(),
dmdAplyPswd: z.string().nullish(),
demandInfo: z.array(DemandInfoSchema.nullish()).nullish(), // 안쓰는 거임
demandMatchings: z.array(DemandMatchingSchema.nullish()).nullish()// 안쓰는 거임
});
@@ -44,6 +44,11 @@ export const coSttHeadListExport: z.infer<typeof sttnHeadListType> = [
title: "전화번호",
visible: true,
},
{
id: "regDt",
title: "등록일자",
visible: true,
},
];
export const coSttNodeListExport: CommonTableProps[] = [
+1 -1
View File
@@ -2,7 +2,7 @@ import type { CommonTableProps } from "@/app/store/common/type/header";
import { fetchType, getFetch, getFetchWithCount } from "@/components/lib/api";
import { coSttHeadListExport, coSttNodeListExport } from "./headList";
import { excelCoSttnParsing } from "./excel";
import type { DemandCompType } from "@common/business_components/ui";
import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form";
// 테이블 헤드 리스트
const coSttNodeList = coSttNodeListExport;
+43 -21
View File
@@ -20,6 +20,7 @@ export type ldrmntState = {
excelList: ExcelType[];
isInit: boolean;
ldrmntRes: customLdrmnt[];
isLoading: boolean;
};
};
@@ -35,6 +36,7 @@ type ldrmntActions = {
ldrmntSearch: (page: number, sggCd: string, total: string, coNm: string) => void;
ldrmntUpdate: (ldrmntRes: customLdrmnt) => void;
ldrmntDelete: () => void;
loadingOpen: (isOpen: boolean) => void
};
export type ldrmntType = ldrmntState & ldrmntActions;
@@ -46,6 +48,7 @@ export const ldrmntStateExport: ldrmntState = {
excelList: [],
isInit: false,
ldrmntRes: ldrmntRes,
isLoading: false,
},
};
@@ -75,31 +78,30 @@ export const ldrmntActionsExport: (set: any) => ldrmntActions = (
console.log(e)
}
},
loadingOpen: (isOpen) => {
return set((state: ldrmntState) => {
return {
...state,
ldrmnt: {
...state.ldrmnt,
isLoading: isOpen,
},
};
});
},
ldrmntRegData: async (data) => {
try {
const response = await postFectch(
"/reuseFc/request/temp",
data,
fetchType.WR
);
await deleteFectch(
`/reuseFc/request/temp`,
);
console.log('response ', response)
const response = await postFectch(
"/reuseFc/request/temp",
data,
fetchType.WR
);
if (response.status === 200) {
ToastFormUi({
body: "잠재수요처 등록이 완료되었습니다. ",
title: "잠재수요처 등록",
});
console.log('response ', response)
}
} catch (e) {
console.log(e)
ToastFormUi({
body: "잠재수요처 등록이 실패하였습니다. ",
title: "잠재수요처 등록",
});
}
},
ldrmntSearch: async (page: number, total: string, sggCd: string, coNm: string) => {
let searchUrl = "";
@@ -111,6 +113,7 @@ export const ldrmntActionsExport: (set: any) => ldrmntActions = (
searchUrl = `/reuseFc/request/temp/${page}/${total}/${sggCd}`;
}
}
try {
const ldrmntRes = await getFetch(
fetchType.WR,
@@ -178,11 +181,30 @@ export const ldrmntActionsExport: (set: any) => ldrmntActions = (
},
ldrmntDelete: async () => {
try {
set((state: ldrmntState) => {
return {
...state,
ldrmnt: {
...state.ldrmnt,
isLoading: true,
},
};
});
const response = await deleteFectch(
`/reuseFc/request/temp`,
);
} catch (error) {
console.log("error", error)
set((state: ldrmntState) => {
return {
...state,
ldrmnt: {
...state.ldrmnt,
isLoading: false,
},
};
});
console.error("Error ldrmntDelete:", error);
}
},
@@ -124,9 +124,9 @@ export const excelToRainChkData = (excelData: any, year: string) => {
trbt: Number(item["탁도"] || 0),
grssClfg: Number(item["총대장균군수"] || 0),
etc: item["기타"] || "", // 필드 누락 방지
vltnDt: vltnDt || "-",
vltnMttr: item["위반사항"] || "-",
levyAmt: Number(item["과태료부과금액(천원)"] || 0),
vltnDt: vltnDt || null,
vltnMttr: item["위반사항"] || "",
levyAmt: Number(item["과태료부과금액(천원)"] || null),
rgtr: TEST_UUID,
},
],
@@ -114,10 +114,22 @@ export type splRuseWaterType = {
ruse12: number;
};
export const rainHeadNmExport: chHeadType[] = [
export const rainMainHeadNmExport: chHeadType[] = [
{ headNm: "useQuilty", text: "이용수질(필요시)", length: 3 },
{ headNm: "feeHist", text: "과태료 부과내역", length: 3 },
];
export const rainRuseHeadNmExport: chHeadType[] = [
{ headNm: "useQuilty", text: "이용수질(필요시)", length: 3 },
{ headNm: "feeHist", text: "과태료 부과내역", length: 3 },
{ headNm: "ruseWater", text: "연간대체수 이용량(m³)", length: 13 },
{ headNm: "detailQulity", text: "분기", length: 11 },
];
export const rainSplHeadNmExport: chHeadType[] = [
{ headNm: "useQuilty", text: "이용수질(필요시)", length: 3 },
{ headNm: "feeHist", text: "과태료 부과내역", length: 3 },
{ headNm: "ruseWater", text: "연간보급수 이용량(m³)", length: 13 },
{ headNm: "detailQulity", text: "분기", length: 11 },
{ headNm: "splWater", text: "연간빗물 이용량(m³)", length: 13 },
];
@@ -3,18 +3,20 @@ import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import {
deleteFectch,
fetchType,
getCountFetch,
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 } from "./excel";
import {
rainChkgdnHeadListExport,
rainChkZod,
rainHeadNmExport,
rainMainHeadNmExport,
rainRuseHeadNmExport,
rainSplHeadNmExport,
ruseHeadListExport,
splHeadListExport,
type chHeadType,
@@ -22,38 +24,47 @@ import {
import type { TableUpperProps } from "@/app/store/common/type/header";
import toast from "react-hot-toast";
export const rainPageSize = 10;
export const commonCd = "41";
export type rainChkZodType = z.infer<typeof rainChkZod>;
const fcltDiv = [
{ val: "RST", text: "중수도시설" },
{ val: "RNB", text: "빗물이용시설" },
];
const rainHeadNm = rainHeadNmExport;
const rainRuseHeadNm = rainRuseHeadNmExport;
const rainSplHeadNm = rainSplHeadNmExport;
const rainChkgdnHeadList = rainChkgdnHeadListExport;
const ruseHeadList = ruseHeadListExport;
const splHeadList = splHeadListExport;
const rainMainHeadNm = rainMainHeadNmExport
const rainChk: rainChkZodType[] = [];
export type rainChkgdnState = {
rainChkgdn: {
rainChkgdnHeadList: TableUpperProps[];
rainSplHeadNm:chHeadType[]
rainRuseHeadNm:chHeadType[]
rainChk: rainChkZodType[];
rainHeadNm: chHeadType[];
ruseHeadList: TableUpperProps[];
splHeadList: TableUpperProps[];
isInit: boolean;
isModalClose: boolean;
fcltDiv: SelectDataType[];
rainMainHeadNm:chHeadType[]
excelList: [];
isSttn: boolean;
rainChkCount: number;
isLoading: boolean;
};
};
type rainChkgdnActions = {
rainChkInit: (
pageNo: string,
cnt: string,
pageNo: number,
cnt: number,
sggCd: string,
searchTxt: string
) => void;
@@ -66,6 +77,13 @@ type rainChkgdnActions = {
rainChkExcelDataUPload(excelData: rainChkZodType[]): Promise<void>;
rainChkDelete(chkgdnPks: number[]): Promise<void>;
rainChkHeadChange: (rainChkgdn: rainChkgdnState, isEdit: boolean) => void;
rainChkNmSearch: (
pageNo: number,
cnt: number,
year: string,
sggCd: string,
txt: string
) => void;
};
export type rainChkgdnType = rainChkgdnState & rainChkgdnActions;
@@ -73,7 +91,9 @@ export type rainChkgdnType = rainChkgdnState & rainChkgdnActions;
export const rainChkgdnStateExport: rainChkgdnState = {
rainChkgdn: {
rainChkgdnHeadList: rainChkgdnHeadList,
rainHeadNm: rainHeadNm,
rainRuseHeadNm: rainRuseHeadNm,
rainSplHeadNm:rainSplHeadNm,
rainMainHeadNm:rainMainHeadNm,
rainChk: rainChk,
splHeadList: splHeadList,
ruseHeadList: ruseHeadList,
@@ -82,6 +102,8 @@ export const rainChkgdnStateExport: rainChkgdnState = {
excelList: [],
fcltDiv: fcltDiv,
isSttn: false,
rainChkCount: 1,
isLoading: false,
},
};
@@ -103,20 +125,24 @@ const makeMdfrChk = (data: rainChkZodType[], type: string, toDo: string) => {
};
const initFetch = async (
pageNo: string,
cnt: string,
txt: string | undefined,
pageNo: number,
cnt: number,
year: string | undefined,
sgg: string | undefined
) => {
const currentYear = new Date().getFullYear().toString();
const rainRes = await getFetch(
console.log("cnt ", cnt);
const rainRes = await getCountFetch(
"wr",
`/reuseChk/rainy` +
(pageNo ? `/${pageNo}` : "/1") +
(cnt ? `/${cnt}` : "/20") +
(txt ? `/${txt}` : `/${currentYear}`) +
(cnt ? `/${cnt}` : "/10") +
(year ? `/${year}` : `/${currentYear}`) +
(sgg ? `/${sgg}` : "/0")
);
console.log(" rainRes ", rainRes);
return rainRes;
};
@@ -142,16 +168,24 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = (
}));
},
rainChkExcelDataUPload: async (excelData: rainChkZodType[]) => {
set((state: rainChkgdnType) => (
{ rainChkgdn: { ...state.rainChkgdn, isLoading: true } }));
try {
const res = await postFectch("/reuseChk/rainy", excelData);
if (res.status === 200) {
const currentYear = new Date().getFullYear().toString();
const rainChkRes = await initFetch("1", "20", currentYear, "0");
return set((state: rainChkgdnState) => ({
const rainChkRes = await initFetch(
1,
rainPageSize,
currentYear,
commonCd
);
set((state: rainChkgdnState) => ({
...state,
rainChkgdn: {
...state.rainChkgdn,
rainChk: rainChkRes,
rainChk: rainChkRes.data,
rainChkCount: rainChkRes.count,
},
}));
toast.success("지도점검 등록이 완료되었습니다.");
@@ -161,22 +195,62 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = (
} catch (error) {
console.log(error);
toast.error("지도점검 등록이 실패되었습니다.");
} finally {
set((state: rainChkgdnType) => ({ rainChkgdn: { ...state.rainChkgdn, isLoading: false } }));
}
},
rainChkInit: async (
pageNo: string,
cnt: string,
searchTxt: string,
pageNo: number,
cnt: number,
year: string,
sggCd: string
) => {
set((state: rainChkgdnType) => ({ rainChkgdn: { ...state.rainChkgdn, isLoading: true } }));
try {
const rainChkRes = await initFetch(pageNo, cnt, searchTxt, sggCd);
const rainChkRes = await initFetch(pageNo, cnt, year, sggCd);
set((state: rainChkgdnState) => ({
...state,
rainChkgdn: {
...state.rainChkgdn,
rainChk: rainChkRes.data,
rainChkCount: rainChkRes.count,
isInit: true, // 무한 루프 방지를 위해 isInit을 true로 설정
},
}));
} catch (error) {
console.log(error);
// 에러가 발생하더라도 무한 루프에 빠지지 않도록 isInit을 true로 설정합니다.
set((state: rainChkgdnType) => ({
rainChkgdn: { ...state.rainChkgdn, isInit: true },
}));
} finally {
set((state: rainChkgdnType) => ({ rainChkgdn: { ...state.rainChkgdn, isLoading: false } }));
}
},
rainChkNmSearch: async (
pageNo: number,
cnt: number,
year: string,
sggCd: string,
txt: string
) => {
try {
const currentYear = new Date().getFullYear();
const rainChkRes = await getCountFetch(
"wr",
`/reuseChk/rainy` +
(pageNo ? `/${pageNo}` : "/1") +
(cnt ? `/${cnt}` : "/10") +
(year ? `/${year}` : `/${currentYear}`) +
(sggCd ? `/${sggCd}` : "/0") +
(txt ? `/${txt}` : "")
);
return set((state: rainChkgdnState) => ({
...state,
rainChkgdn: {
...state.rainChkgdn,
rainChk: rainChkRes,
rainChk: rainChkRes.data,
rainChkCount: rainChkRes.count,
},
}));
} catch (error) {
@@ -187,26 +261,32 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = (
try {
const chData = await makeMdfrChk(rainChk, "rain", "rainDetil");
const res = await postFectch("/reuseChk/rainy", chData);
if (res.staus === 200) {
const res = await putFectch("/reuseChk/rainy/list", chData);
if (res) {
toast.success(
"지도점검 보급수 및 밋물이용량 수정이 완료되었습니다. "
"지도점검 대체수 및 밋물이용량 수정이 완료되었습니다. "
);
const currentYear = new Date().getFullYear().toString();
const rainChkRes = await initFetch("1", "20", currentYear, "11");
const rainChkRes = await initFetch(
1,
rainPageSize,
currentYear,
"41"
);
return set((state: rainChkgdnState) => ({
...state,
rainChkgdn: {
...state.rainChkgdn,
rainChk: rainChkRes,
rainChk: rainChkRes.data,
rainChkCount: rainChkRes.count,
},
}));
} else {
toast.error("지도점검 보급수 및 밋물이용량 수정 오류입니다.");
toast.error("지도점검 대체수 및 밋물이용량 수정 오류입니다.");
}
} catch (error) {
console.log(error);
toast.error("지도점검 보급수 및 밋물이용량 수정 오류입니다.");
toast.error("지도점검 대체수 및 밋물이용량 수정 오류입니다.");
}
},
rainChkGuidUpdate: async (rainChk: rainChkZodType) => {
@@ -217,17 +297,22 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = (
toast.success("지도점검 수질 및 과태료 수정이 완료되었습니다. ");
const currentYear = new Date().getFullYear().toString();
const rainChkRes = await initFetch("1", "20", currentYear, "11");
const rainChkRes = await initFetch(
1,
rainPageSize,
currentYear,
"41"
);
return set((state: rainChkgdnState) => ({
...state,
rainChkgdn: {
...state.rainChkgdn,
rainChk: rainChkRes,
rainChk: rainChkRes.data,
rainChkCount: rainChkRes.count,
},
}));
}else{
} else {
toast.error("지도점검 수질 및 과태료 수정 오류입니다.");
}
} catch (error) {
toast.error("지도점검 수질 및 과태료 수정 오류입니다.");
@@ -241,17 +326,22 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = (
toast.success("삭제가 완료되었습니다. ");
const currentYear = new Date().getFullYear().toString();
const rainChkRes = await initFetch("1", "20", currentYear, "11");
const rainChkRes = await initFetch(
1,
rainPageSize,
currentYear,
"41"
);
return set((state: rainChkgdnState) => ({
...state,
rainChkgdn: {
...state.rainChkgdn,
rainChk: rainChkRes,
rainChk: rainChkRes.data,
rainChkCount: rainChkRes.count,
},
}));
}else{
} else {
toast.error("삭제시 오류가 발생하였습니다.. ");
}
} catch (error) {
toast.error("삭제시 오류가 발생하였습니다.. ");
@@ -109,6 +109,24 @@ export const rswtChkgdZod = z.object({
rswtrPollutions: z.array(rswtrPolutionsZode),
});
export const rswtRuseHeadNmExport: chHeadType[] = [
{ headNm: "useQuilty", text: "이용수질(필요시)", length: 3 },
{ headNm: "feeHist", text: "과태료 부과내역", length: 3 },
{ headNm: "ruseWater", text: "연간중수 이용량(m³)", length: 13 },
{ headNm: "detailQulity", text: "분기", length: 11 },
];
export const rswtSplHeadNmExport: chHeadType[] = [
{ headNm: "useQuilty", text: "이용수질(필요시)", length: 3 },
{ headNm: "feeHist", text: "과태료 부과내역", length: 3 },
{ headNm: "detailQulity", text: "분기", length: 11 },
{ headNm: "splWater", text: "연간대체수 이용량(m³)", length: 13 },
];
export const rswtHeadNmExport: chHeadType[] = [
{ headNm: "useQuilty", text: "연간 평균 이용수질", length: 10 },
{ headNm: "feeHist", text: "과태료 부과내역", length: 3 },
@@ -126,7 +144,7 @@ export const rswtChkHeadListExport: TableUpperProps[] = [
{ id: "spwtPositn", title: "채수지점" ,mergeCell: true},
{ id: "chckYmd", title: "점검일" ,mergeCell: true},
{ id: "utztnUsgCd", title: "이용용도" },
{ id: "splyUswtrUtztnQnt", title: "연간보급수이용량(m³)" ,type: "number"},
{ id: "splyUswtrUtztnQnt", title: "연간대체수이용량(m³)" ,type: "number"},
{ id: "ruseFcltUtztnQnt", title: "연간중수도이용량(m³)",type: "number"},
{
@@ -1,6 +1,4 @@
import {
TEST_UUID,
} from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import type {
SelectDataType,
SheetParameter,
@@ -8,6 +6,7 @@ import type {
import {
deleteFectch,
fetchType,
getCountFetch,
getFetch,
postFectch,
putFectch,
@@ -20,15 +19,24 @@ import {
rswtDetailHeadListExport,
rswtHeadNmExport,
rswtrDetailsZod,
rswtRuseHeadNmExport,
rswtSplHeadNmExport,
} from "./headList";
import { z } from "zod";
import { ToastFormUi } from "@/components/ui/toast/toastFromUi";
import { type chHeadType } from "../rainChkgdn/headList";
import type { TableUpperProps } from "@/app/store/common/type/header";
import toast from "react-hot-toast";
export const rswtPageSize = 10;
const rswtChkHeadList = rswtChkHeadListExport;
const rswtDetailHeadList = rswtDetailHeadListExport;
const rswtHeadNm = rswtHeadNmExport;
const rswtRuseHeadNm =rswtRuseHeadNmExport
const rswtSplHeadNm =rswtSplHeadNmExport
export type rswtChkZodType = z.infer<typeof rswtChkgdZod>;
export type rswtrChkDetailsZodType = z.infer<typeof rswtrDetailsZod>;
export type rswtChkgdnState = {
@@ -40,13 +48,29 @@ export type rswtChkgdnState = {
excelList: SheetParameter[];
rswtChkRes: rswtChkZodType[];
rswtChkPolGuide: rswtChkZodType[];
rswtSplHeadNm:chHeadType[]
rswtRuseHeadNm:chHeadType[]
isInit: boolean;
isSttn: boolean
isSttn: boolean;
isLoading:boolean;
rswtChkCount: number;
};
};
type rswtChkgdnActions = {
rswtChkgdnInit: (pageNo: string, cnt: string, year: string, sggCd: string) => void;
rswtChkgdnInit: (
pageNo: number,
cnt: number,
year: string,
sggCd: string
) => void;
rswtChkNmSearch: (
pageNo: number,
cnt: number,
year: string,
sggCd: string,
txt: string
) => void;
rswtrChkExcelDownload(
sidoCode: SelectDataType[],
sggCode: SelectDataType[]
@@ -67,27 +91,41 @@ export const rswtChkgdnStateExport: rswtChkgdnState = {
rswtChkHeadList: rswtChkHeadList,
rswtDetailHeadList: rswtDetailHeadList,
rswtHeadNm: rswtHeadNm,
excelList: [{
data: [[]], headerNum: 0, headerRange: "A1:V3",
sheetName: "",
startCol: '1'
}],
rswtRuseHeadNm:rswtRuseHeadNm,
rswtSplHeadNm:rswtSplHeadNm,
excelList: [
{
data: [[]],
headerNum: 0,
headerRange: "A1:V3",
sheetName: "",
startCol: "1",
},
],
rswtChkRes: [],
rswtChkPolGuide: [],
isInit: false,
isSttn: false,
isLoading:false,
rswtChkCount: 1,
},
};
const initFetch = async (pageNo: string, cnt: string, year: string | undefined, sgg: string | undefined) => {
const initFetch = async (
pageNo: number,
cnt: number,
year: string | undefined,
sgg: string | undefined
) => {
const currentYear = new Date().getFullYear().toString();
const rswtChkRes = await getFetch(
const rswtChkRes = await getCountFetch(
"wr",
`/reuseChk/reuseWater` +
(pageNo ? `/${pageNo}` : "/1") +
(cnt ? `/${cnt}` : "/20") +
(year ? `/${year}` : `/${currentYear}`) +
(sgg ? `/${sgg}` : "/0")
(pageNo ? `/${pageNo}` : "/1") +
(cnt ? `/${cnt}` : "/20") +
(year ? `/${year}` : `/${currentYear}`) +
(sgg ? `/${sgg}` : "/0")
);
return rswtChkRes;
};
@@ -139,15 +177,59 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = (
},
}));
},
rswtChkgdnInit: async (pageNo: string, cnt: string, year: string, sggCd: string) => {
rswtChkgdnInit: async (
pageNo: number,
cnt: number,
year: string,
sggCd: string
) => {
set((state: rswtChkgdnType) => ({ rswtChkgdn: { ...state.rswtChkgdn, isLoading: true } }));
try {
const rswtChkRes = await initFetch(pageNo, cnt, year, sggCd);
set((state: rswtChkgdnState) => ({
...state,
rswtChkgdn: {
...state.rswtChkgdn,
rswtChkRes: rswtChkRes.data,
rswtChkCount: rswtChkRes.count,
isInit: true, // 무한 루프를 방지하기 위해 isInit을 true로 설정
},
}));
} catch (error) {
console.log(error);
set((state: rswtChkgdnType) => ({
rswtChkgdn: { ...state.rswtChkgdn, isInit: true },
}));
} finally {
set((state: rswtChkgdnType) => ({ rswtChkgdn: { ...state.rswtChkgdn, isLoading: false } }));
}
},
rswtChkNmSearch: async (
pageNo: number,
cnt: number,
year: string,
sggCd: string,
txt: string
) => {
try {
const currentYear = new Date().getFullYear().toString();
const rswtChkRes = await getCountFetch(
"wr",
`/reuseChk/reuseWater` +
(pageNo ? `/${pageNo}` : "/1") +
(cnt ? `/${cnt}` : "/20") +
(year ? `/${year}` : `/${currentYear}`) +
(sggCd ? `/${sggCd}` : "/0") +
(txt ? `/${txt}` : "")
);
return set((state: rswtChkgdnState) => ({
...state,
rswtChkgdn: {
...state.rswtChkgdn,
rswtChkRes: rswtChkRes,
rswtChkRes: rswtChkRes.data,
rswtChkCount: rswtChkRes.count,
isInit: false,
},
}));
@@ -157,6 +239,9 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = (
},
rswtChkExceDataUpload: async (excelData: rswtChkZodType[]) => {
try {
set((state: rswtChkgdnType) => (
{ rswtChkgdn: { ...state.rswtChkgdn, isLoading: true } }));
console.log('excelData ', excelData)
const res = await postFectch("/reuseChk/reuseWater", excelData);
if (res.ok) {
ToastFormUi({
@@ -165,65 +250,66 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = (
});
}
const currentYear = new Date().getFullYear().toString();
const rswtChkRes = await initFetch("1", "20", currentYear, "0");
const rswtChkRes = await initFetch(1, rswtPageSize, currentYear, "0");
return set((state: rswtChkgdnState) => ({
...state,
rswtChkgdn: {
...state.rswtChkgdn,
rswtChkRes: rswtChkRes
rswtChkRes: rswtChkRes.data,
rswtChkCount: rswtChkRes.count,
},
}));
} catch (error) {
console.log(error);
}finally{
set((state: rswtChkgdnType) => (
{ rswtChkgdn: { ...state.rswtChkgdn, isLoading: false } }));
}
},
rswtChkDetilsUpdate: async (rswtChk: rswtrChkDetailsZodType[]) => {
try {
const chData = await makeMdfrChk(rswtChk);
const res = await putFectch("/reuseChk/reuseWater", chData);
if (res.ok) {
ToastFormUi({
body: "지도점검 과태료 수정 수정이 완료되었습니다. ",
title: "지도점검 수정",
});
toast.success("지도점검 과태료 수정이 완료되었습니다. ",)
}
const currentYear = new Date().getFullYear().toString();
const rswtChkRes = await initFetch("1", "20", currentYear, "0");
const rswtChkRes = await initFetch(1, rswtPageSize, currentYear, "0");
return set((state: rswtChkgdnState) => ({
...state,
rswtChkgdn: {
...state.rswtChkgdn,
rswtChkRes: rswtChkRes,
rswtChkRes: rswtChkRes.data,
rswtChkCount: rswtChkRes.count,
},
}));
} catch (error) {
console.log(error);
alert("수정에 실패하였습니다.");
toast.error("지도점검 과태료 수정 오류입니다. ",)
}
},
rswtChkDelete: async (chkgdnPks: number[]) => {
try {
const res = await deleteFectch(`/reuseChk/reuseWater`, chkgdnPks);
if (res.ok) {
ToastFormUi({
body: "삭제가 완료되었습니다. ",
title: "지도점검 삭제",
});
if (res) {
toast.success("삭제가 완료되었습니다.")
}
const currentYear = new Date().getFullYear().toString();
const rswtChkRes = await initFetch("1", "20", currentYear, "0");
const rswtChkRes = await initFetch(1, rswtPageSize, currentYear, "0");
return set((state: rswtChkgdnState) => ({
...state,
rswtChkgdn: {
...state.rswtChkgdn,
rswtChkRes: rswtChkRes,
rswtChkRes: rswtChkRes.data,
rswtChkCount: rswtChkRes.count,
},
}));
} catch (error) {
ToastFormUi({ body: "삭제를 실패했습니다.. ", title: "지도점검 삭제" });
toast.error("삭제 오류입니다.")
}
},
rswtChkPolAndGuide: async (chkGdnPk: number) => {
@@ -240,7 +326,11 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = (
rswtChkPolGuide: rswtChkPolGuide,
},
}));
} catch (error) { }
} catch (error) {
}
},
rswtChkPolInit: () => {
try {
@@ -251,7 +341,7 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = (
rswtChkPolGuide: undefined,
},
}));
} catch (error) { }
} catch (error) {}
},
rwstPolAndGuideUpdate: async (rswtChk: rswtChkZodType[]) => {
try {
@@ -261,13 +351,10 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = (
chData[0]
);
if (res.ok) {
ToastFormUi({
body: "지도점검 연간 수질 및 보급수/중수도 수정이 완료되었습니다. ",
title: "지도점검 수정",
});
toast.success("지도점검 연간 수질 및 대체수/중수도 수정이 완료되었습니다.")
}
const currentYear = new Date().getFullYear().toString();
const rswtChkRes = await initFetch("1", "20", currentYear, "0");
const rswtChkRes = await initFetch(1, rswtPageSize, currentYear, "0");
return set((state: rswtChkgdnState) => ({
...state,
rswtChkgdn: {
@@ -277,10 +364,9 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = (
}));
} catch (error) {
console.log(error);
ToastFormUi({
body: "지도점검 연간 수질 및 보급수/중수도 수정이 실패하였습니다.. ",
title: "지도점검 수정",
});
toast.error("지도점검 연간 수질 및 대체수/중수도 수정 오류입니다.")
}
},
rswtChkHeadChange: async (rswtChkgdn: rswtChkgdnState, isEdit: boolean) => {
@@ -301,7 +387,7 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = (
rswtDetailHeadList: rswtDetailHeadList,
},
}));
} catch (e) { }
} catch (e) {}
},
};
};
@@ -2,7 +2,7 @@ import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"
import { getFetch } from "@/components/lib/api";
import type { SelectDataType } from "@common/business_components/ui";
import { rainChkgdnHeadSttnExport, ruseSttnHeadListExport, splSttnHeadListExport } from "./headList";
import { rainHeadNmExport, type chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList";
import { rainMainHeadNmExport, type chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList";
import { buildingExcelRainSttn } from "./excel";
import type { TableUpperProps } from "@/app/store/common/type/header";
@@ -15,7 +15,7 @@ const fcltDiv = [
const rainChkgdnHeadList = rainChkgdnHeadSttnExport;
const ruseHeadList = ruseSttnHeadListExport;
const splHeadList = splSttnHeadListExport;
const rainHeadNm = rainHeadNmExport
const rainHeadNm = rainMainHeadNmExport
const rainChk: rainChkZodType[] = [];
@@ -11,7 +11,7 @@ export const rswtChkSttnHeadListExport: TableUpperProps[] = [
{ id: "spwtPositn", title: "채수지점", mergeCell: true },
{ id: "chckYmd", title: "점검일", mergeCell: true },
{ id: "utztnUsgCd", title: "이용용도" },
{ id: "splyUswtrUtztnQnt", title: "연간보급수이용량(m³)", type: "number" },
{ id: "splyUswtrUtztnQnt", title: "연간대체수이용량(m³)", type: "number" },
{ id: "ruseFcltUtztnQnt", title: "연간중수도이용량(m³)", type: "number" },
{
@@ -148,7 +148,7 @@ export const pbnstPrfmncSttnActionsExport: (set: any) => pbnstPrfmncSttnActions
let usageSum = 0;
let year = "";
const yearsData = []
res.data.forEach((item) => {
if (item.prfList.length === 0) {
const year = ""; // 연도 정보가 없으면 빈 문자열, 필요시 item에서 추출
@@ -161,26 +161,26 @@ export const pbnstPrfmncSttnActionsExport: (set: any) => pbnstPrfmncSttnActions
item.prfList.forEach((acc) => {
year = acc.ym?.substring(0, 4) ?? "";
inUsageSum =
(acc.wshwtr ?? 0) +
(acc.coolUswtr ?? 0) +
(acc.cleanUswtr ?? 0) +
(acc.drwtUswtr ?? 0) +
(acc.dltnUswtr ?? 0) +
(acc.ithlRswtr ?? 0) +
(acc.ithlEtcUswtr ?? 0) +
(acc.cleanToilUswtr ?? 0) +
(acc.resn ?? 0);
(acc.wshwtr ?? 0) + //조경용수
(acc.coolUswtr ?? 0) + //냉각수
(acc.cleanUswtr ?? 0) + //청소수
(acc.drwtUswtr ?? 0) + //식수대
(acc.dltnUswtr ?? 0) + //희석용수
(acc.ithlRswtr ?? 0) + //중수도
(acc.ithlEtcUswtr ?? 0) //기타
outUsageSum =
(acc.lndwtr ?? 0) +
(acc.hydUswtr ?? 0) +
(acc.ugwtChr ?? 0) +
(acc.farmUswtr ?? 0) +
(acc.rvrKeepUswtr ?? 0) +
(acc.indstUswtr ?? 0);
(acc.cleanToilUswtr ?? 0) + //청소화장실용수
(acc.resn ?? 0)+ //세척살수용도
(acc.lndwtr ?? 0) + //조경용수
(acc.hydUswtr ?? 0) + //친수용수
(acc.ugwtChr ?? 0) + //지하수충전
(acc.farmUswtr ?? 0) + //농업용수
(acc.rvrKeepUswtr ?? 0) + //하천등유지용수
(acc.indstUswtr ?? 0); //공업용수
const yearData = yearsData.find(
(yearItem) =>
yearItem.year === year &&
yearItem.pbnstRuseFcltPk == acc.pbnstRuseFcltPk
yearItem.pbnstRuseFcltPk == acc.pbnstRuseFcltFk
);
if (yearData) {
@@ -5,6 +5,8 @@ import type { z } from "zod";
import { controlHeadView } from "../rainSttn";
import type { customHtdflBdst } from "../../fcltReg/htdflReg";
import { fetchType, getFetch } from "@/components/lib/api";
import type { SelectDataType } from "@common/business_components";
import { excelHtdflSttnParsing } from "./excel";
const htdflSttHeadList = htdflSttHeadListExport;
const htdflSttNodeList = htdflSttNodeListExport;
@@ -21,7 +23,8 @@ export type htdflSttnState = {
};
type htdflSttnActions = {
initHtdfl: (con: string) => void;
htdflSttnSearch: (page: number, total: string, con: string) => void;
htdflSttnSearch: (page: number, total: string, con: string, sidoCode: SelectDataType[],
sggCode: SelectDataType[]) => void;
htdflChSttnHead: (
headList: z.infer<typeof sttnHeadListType>,
) => void;
@@ -67,22 +70,23 @@ export const htdflSttnActionsExport: (set: any) => htdflSttnActions = (
console.log(error);
}
},
htdflSttnSearch: async (page: number, total: string, con: string) => {
htdflSttnSearch: async (page: number, total: string, con: string,
sidoCode: SelectDataType[],
sggCode: SelectDataType[]
) => {
try {
const htdflSttnRes = await getFetch(
fetchType.WR,
`/drain/facilityList/${page}/${total}/${con}`
);
if (Number(total) > 9000) {
const htdflExcel = excelHtdflSttnParsing(htdflSttnRes, sidoCode, sggCode);
set((state: htdflSttnState) => {
return {
...state,
htdflSttn: {
...state.htdflSttn,
excelList: htdflSttnRes,
excelList: htdflExcel,
},
};
});
@@ -426,7 +426,7 @@ export const rainSttNodeListExport: CommonTableProps[] = [
export const rainSttnDetailNodeListExport:CommonTableProps[] = [
{ id: "totalSplyUswtrUtztnQnt",
title: "연간보급수이용량(m³)",
title: "연간대체수이용량(m³)",
visible: true,
row: 1,
rowSpan: 2,
@@ -511,7 +511,7 @@ export const rainSttnDetailNodeListExport:CommonTableProps[] = [
export const rainSttnDetailHeadListExport:CommonTableProps[] = [
{ id: "totalSplyUswtrUtztnQnt",
title: "연간보급수이용량(m³)",
title: "연간대체수이용량(m³)",
visible: true,
row: 1,
rowSpan: 1,
+23
View File
@@ -46,6 +46,29 @@ export const getFetch = async (type: string, url: string) => {
}
};
export const getCountFetch = async (type: string, url: string) => {
const div =
type === fetchType.COMMON
? DEV_URL_FO
: type === fetchType.LOCAL
? LOCAL_URL
: type === fetchType.CS
? ''
: DEV_URL_WR;
const response = await fetch(div + url, {
method: "GET",
headers: {
accept: "application/json",
},
});
// JSON 응답 처리
const res = await response.json();
return res;
};
export const getFetchWithCount = async (type: string, url: string) => {
const div =
type === fetchType.COMMON
+23 -20
View File
@@ -54,27 +54,30 @@ export const rainChkTableData = (chkData: rainChkZodType[]) => {
export const rswtChkTableData = (chkData: rswtChkZodType[]) => {
// 1. chkgdnFk + utztnUsgCd 기준 누계 정보 만들기
const makeRswtData: any[] = [];
chkData?.forEach((root) => {
root.rswtrDetails.forEach((detail) => {
let flatRswtChk = {};
const findGuide = root.guideDetails.find(
(guide) => guide.utztnUsgCd === detail.utztnUsgCd
);
const findPoluttion = root.rswtrPollutions.find(
(polution) => polution.utztnUsgCd === detail.utztnUsgCd
);
const operMngCd = root?.reuseBuilding.operMngCd;
flatRswtChk = {
...root,
...detail,
...findGuide,
...findPoluttion,
...flatRswtChk,
operMngCd: operMngCd,
};
makeRswtData.push(flatRswtChk);
if(chkData&& chkData.length>0){
chkData?.forEach((root) => {
root.rswtrDetails.forEach((detail) => {
let flatRswtChk = {};
const findGuide = root.guideDetails.find(
(guide) => guide.utztnUsgCd === detail.utztnUsgCd
);
const findPoluttion = root.rswtrPollutions.find(
(polution) => polution.utztnUsgCd === detail.utztnUsgCd
);
const operMngCd = root?.reuseBuilding.operMngCd;
flatRswtChk = {
...root,
...detail,
...findGuide,
...findPoluttion,
...flatRswtChk,
operMngCd: operMngCd,
};
makeRswtData.push(flatRswtChk);
});
});
});
}
return makeRswtData;
};
+29 -13
View File
@@ -165,18 +165,34 @@ export const yearOptions: { val: string; text: string }[] = Array.from(
})
);
export const getdmdMatFlag = (flag: string|undefined) => {
let flagMat = "";
if(flag === undefined || flag === null) {
flagMat = "신청";
}else if(flag.trim() === "Sub") {
flagMat = "검토";
}else if(flag.trim() === "matched") {
flagMat = "매칭완료";
}else {
flagMat = "신청";
export const getdmdMatFlag = (flag: string | undefined | null): string => {
// 1. undefined나 null인 경우, '신청'을 반환합니다.
// (이 검사를 먼저 함으로써 아래에서 .trim()을 안전하게 사용할 수 있습니다.)
if (flag == null) {
return "신청";
}
return flagMat;
// 2. 이제 flag가 문자열임이 보장되므로 .trim()을 호출해 앞뒤 공백을 제거합니다.
const trimmedFlag = flag.trim();
if (trimmedFlag === "Sub") {
return "검토";
} else if (trimmedFlag === "matched") {
return "매칭완료";
}
// 3. 그 외 모든 경우(빈 문자열 포함)는 '신청'으로 처리합니다.
return "신청";
};
export const formatPhoneNumber=(tel:string) => {
const onlyNums = tel.replace(/[^0-9]/g, '');
if (onlyNums.length === 10) {
return onlyNums.replace(/(\d{2})(\d{4})(\d{4})/, '$1-$2-$3');
} else if (onlyNums.length === 11) {
return onlyNums.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3');
} else {
return tel; // 유효하지 않으면 빈 문자열
}
}
@@ -368,7 +368,7 @@ export default function ConCostForm({
childrenTriger={
<>
<Label className="underline">
총사업비 (백만원) <i className="diveicon di-search" />
처리시설 총사업비(백만원) <i className="diveicon di-search" />
</Label>
</>
}
@@ -405,7 +405,7 @@ export default function ConCostForm({
)}
/>
</div>
<div className="col-span-3 mt-4">
{/* <div className="col-span-3 mt-4">
<div className="flex items-center justify-between">
<Label>공급처 선정</Label>
<Button size={"sm"} onClick={(e) => {}} className="bg-none">
@@ -428,7 +428,7 @@ export default function ConCostForm({
</FormUi>
)}
/>
</div>
</div> */}
<div className="col-span-4 mt-4">
<FormField
control={form.control}
@@ -7,11 +7,9 @@ import {
excelToRswtGuideData,
excelToRswtPolution,
} from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/excel";
import { ToastFormUi } from "@/components/ui/toast/toastFromUi";
import {
filePicked,
filePickedArray,
FileUpload,
Form,
FormField,
FormUi,
@@ -26,7 +24,7 @@ import { useForm } from "react-hook-form";
import toast from "react-hot-toast";
import type { z } from "zod";
export default function ChkgdExcel({ type }: { type: string }) {
export default function ChkgdExcel({ type,setIsRegExcel }: { type: string, setIsRegExcel:(open:boolean) =>void }) {
const { rswtChkgdn, rainChkExcelDataUPload, rswtChkExceDataUpload } =
useWrStore((state) => {
return state;
@@ -146,29 +144,28 @@ export default function ChkgdExcel({ type }: { type: string }) {
const onSubmit = (values: z.infer<typeof chkgdRegExcel>) => {
if (values.chckYr === "") {
ToastFormUi({ body: "등록년도를 작성해주세요", title: "지도점검 등록" });
toast.error("등록년도를 작성해주세요");
return;
}
if (type === "RNB") {
if (excelData === undefined || excelData?.length === 0) {
ToastFormUi({
body: "빈 파일 및 파일 오류 입니다.",
title: "지도점검 등록",
});
toast.error("빈 파일 및 파일 오류 입니다.");
return;
} else {
rainChkExcelDataUPload(excelData as rainChkZodType[]);
setIsRegExcel(false)
}
} else if (type === "RST") {
if (excelRswtData === undefined || excelRswtData?.length === 0) {
ToastFormUi({
body: "빈 파일 및 파일 오류 입니다.",
title: "중수지도점검 등록",
});
toast.error("빈 파일 및 파일 오류 입니다.");
return;
} else {
rswtChkExceDataUpload(excelRswtData as rswtChkZodType[]);
setIsRegExcel(false)
}
}
};
@@ -10,7 +10,7 @@ import type { z } from "zod";
import React from "react";
import type { TableUpperProps } from "@/app/store/common/type/header";
export default function ChkgdModal({ type, obj }: { type: string; obj: any }) {
export default function ChkgdModal({ type, obj ,setIsModal }: { type: string; obj: any , setIsModal:(open:boolean)=>void}) {
const {
rainChkgdn,
rswtChkgdn,
@@ -79,6 +79,8 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) {
]);
useEffect(() => {
console.log('obj ', obj)
const result = obj.guideDetails?.reduce((acc: any, cur: any) => {
const code = cur.utztnUsgCd;
const month = cur.ym?.slice(4); // "MM"
@@ -114,9 +116,10 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) {
});
}
console.log("result ", result);
setGuidData(result as splRuseWaterType[]);
console.log('obj ', obj)
if (obj.rswtrPollutions) {
const resultPolution: Record<string, any[]> = {
"1": [],
@@ -217,12 +220,14 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) {
obj.guideDetails = realGuideDetail;
if (type === "RNB") {
rainChkGuidUpdate(obj);
setIsModal(false)
} else {
const polution = Object.values(upPolutionData)
.flat()
.filter((item) => item.utztnUsgCd !== "평균");
obj.rswtrPollutions = polution;
rwstPolAndGuideUpdate([obj]);
setIsModal(false)
}
};
@@ -262,12 +267,13 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) {
<ScrollArea className="h-[60vh]">
<div className="card-header">
<h3 className="text-2xl font-medium text-label">
{`연간보급수이용량`}
{`연간대체수이용량`}
</h3>
</div>
<GuideDetailsTable
chgRes={guidData || []}
headList={headList.ruseHeadList}
headList={headList.splHeadList}
upheadList={type === "RNB"? rainChkgdn.rainSplHeadNm :rswtChkgdn.rswtSplHeadNm}
type={""}
setChGuidData={(data) => {
setChGuidData(data);
@@ -280,7 +286,8 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) {
</div>
<GuideDetailsTable
chgRes={guidData || []}
headList={headList.splHeadList}
headList={headList.ruseHeadList}
upheadList={type === "RNB"? rainChkgdn.rainRuseHeadNm :rswtChkgdn.rswtRuseHeadNm}
type={""}
setChGuidData={(data) => {
setChGuidData(data);
@@ -302,6 +309,7 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) {
<GuideDetailsTable
chgRes={value}
headList={headList?.rswtDetailHeadList}
upheadList={rswtChkgdn.rswtSplHeadNm}
type={""}
setChGuidData={(data) => {
getPolutionData(data);
@@ -4,32 +4,36 @@ import type { customLdrmnt } from "@/app/store/matDmd/ldrmntCoSttn";
import { names } from "@/app/store/matDmd/ldrmntCoSttn/excel";
import { filePicked, FileUpload, FormUi, Title } from "@common/business_components/ui";
import { Form, FormField } from "@common/business_components/ui/form";
import LoadingOverlay from "@common/business_components/ui/loadingBar";
import { Button, Progress } from "@common/components/ui";
import { zodResolver } from "@hookform/resolvers/zod";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import toast from "react-hot-toast";
import type { z } from "zod";
export default function CoRegExcel() {
export default function CoRegExcel({ isModal }: { isModal: (open: boolean) => void }) {
const { ldrmnt,loadingOpen } = useWrStore((state) => state);
const { isLoading } = ldrmnt;
const form = useForm<z.infer<typeof coRegExcel>>({
resolver: zodResolver(coRegExcel),
});
const { ldrmntRegData, ldrmntDelete } = useWrStore((state) => state);
const [excelData, setExcelData] = useState<customLdrmnt[]>();
const [file, setFiles] = useState<File | undefined>();
useEffect(() => {
console.log("ldrmnt", ldrmnt)
}, [ldrmnt])
const onSubmit = (values: z.infer<typeof coRegExcel>) => {
ldrmntDelete();
loadingOpen(true);
if (file) {
filePicked(file, 0).then((res) => {
//TODO:loading
filePicked(file, 0).then(async (res) => {
try {
let array: { [key: string]: string | number }[] = []
let isError = false;
if (Array.isArray(res)) {
res.some((item, index) => {
let object: { [key: string]: string | number } = {}
@@ -43,26 +47,24 @@ export default function CoRegExcel() {
}
return false;
})
if (isError === true)
return true;
array.push(object)
if (index != 0 && index % 5000 == 0) {
ldrmntRegData(array);
array = []
array.length = 0;
}
return false;
})
}
if (isError === false)
ldrmntRegData(array);
await ldrmntRegData(array);
isModal(false);
loadingOpen(false);
toast.success(`잠재수요처 등록이 완료되었습니다.`);
} catch (e) {
console.log(e)
loadingOpen(false);
alert(e)
return true;
}
}).catch((e)=>{
console.log("file", e);
});
};
}
@@ -70,6 +72,7 @@ export default function CoRegExcel() {
return (
<>
<div>
<LoadingOverlay isLoading={isLoading}></LoadingOverlay>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<div>
@@ -4,6 +4,7 @@ import { useWrStore } from "@/app/store";
import type { TableUpperProps } from "@/app/store/common/type/header";
import type {
} from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn";
import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList";
import { InputTableBody } from "@/components/lib/func/TableData";
import {
Input,
@@ -18,11 +19,13 @@ import { useEffect, useState, type Dispatch, type SetStateAction } from "react"
export function GuideDetailsTable({
chgRes,
headList,
upheadList,
type,
setChGuidData,
}: {
chgRes: any[];
headList: TableUpperProps[];
upheadList:chHeadType[]
type: string;
setChGuidData: (chgRes: any[]) => void;
}) {
@@ -44,7 +47,7 @@ export function GuideDetailsTable({
<>
<div className={`card !m-[1.2rem] !p-0r `}>
<Table variant="secondary">
<TableHeader className="font-bold">{headMakeprfmnc(headList, rainChkgdn?.rainHeadNm)}</TableHeader>
<TableHeader className="font-bold">{headMakeprfmnc(headList, upheadList)}</TableHeader>
<TableBody >
{InputTableBody(inputData ?? [],headList, setInputData) }
</TableBody>
@@ -1,7 +1,7 @@
"use client";
import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead";
import { useWrStore } from "@/app/store";
import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn";
import { rainPageSize, type rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn";
import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList";
import type { TableUpperProps } from "@/app/store/common/type/header";
import { tableData } from "@/components/lib/func/commom";
@@ -17,6 +17,7 @@ import {
} from "@common/components/ui";
import { useCallback, useEffect, useState } from "react";
import UiPageNations from "@common/business_components/ui/table/uiPageNations";
import LoadingOverlay from "@common/business_components/ui/loadingBar";
export default function RainChkgdTable({
detailUp,
handleClick = () => { },
@@ -70,16 +71,12 @@ export default function RainChkgdTable({
}, [makeTableData, handleClick]);
useEffect(() =>{
},[rainChkgdn.rainChk])
useEffect(() => {
setSelectedIds([])// 셀렉트 초기화를 위한 작업
if (rainChkData) {
if (rainChkData&&rainChkData.length>0) {
const rainChg = rainChkData.map((item: any) => {
const rainChg = rainChkData?.map((item: any) => {
const bud = tableData([item.building], { code });
return {
...item,
@@ -89,6 +86,8 @@ export default function RainChkgdTable({
});
setMakeTableData(rainChkTableData(rainChg));
}else{
setMakeTableData([]);
}
}, [rainChkData, code]);
@@ -167,7 +166,7 @@ export default function RainChkgdTable({
} else {
setHeadList({
headList: rainChkgdn.rainChkgdnHeadList,
upHeadList: rainChkgdn.rainHeadNm
upHeadList: rainChkgdn.rainMainHeadNm
})
}
@@ -175,9 +174,15 @@ export default function RainChkgdTable({
}, [rainChkSttn.isSttn, rainChkgdn.rainChkgdnHeadList, rainChkSttn.rainChkgdnHeadList]);
useEffect(() =>{
console.log('rainChkgdn.count ', rainChkgdn.rainChkCount)
},[rainChkgdn.rainChkCount])
return (
<>
<LoadingOverlay isLoading={rainChkgdn.isLoading}></LoadingOverlay>
<Table variant="secondary">
<TableHeader className="font-bold">
{headMakeprfmnc(
headList?.headList,
@@ -197,9 +202,9 @@ export default function RainChkgdTable({
</TableBody>
</Table>
<UiPageNations
total={rainChkData?.length ?? 0}
total={rainChkgdn.rainChkCount||20}
cur={pageNation}
pageSize={20}
pageSize={rainPageSize}
onPageChange={onPageChange}
/>
</>
@@ -2,9 +2,10 @@
import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead";
import { useWrStore } from "@/app/store";
import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList";
import type {
rswtChkZodType,
rswtrChkDetailsZodType,
import {
rswtPageSize,
type rswtChkZodType,
type rswtrChkDetailsZodType,
} from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn";
import type { TableUpperProps } from "@/app/store/common/type/header";
import { tableData } from "@/components/lib/func/commom";
@@ -15,6 +16,7 @@ import {
import { Table, TableBody, TableHeader } from "@common/components/ui";
import { useCallback, useEffect, useState } from "react";
import UiPageNations from "@common/business_components/ui/table/uiPageNations";
import LoadingOverlay from "@common/business_components/ui/loadingBar";
export default function RswtChkgdTable({
detaiRswtlUpdate,
@@ -72,7 +74,6 @@ export default function RswtChkgdTable({
}, [rswtChkgdn.rswtChkPolGuide]);
useEffect(() => {
console.log("makeTableData ", makeTableData)
getRswtSttnExcel(makeTableData)
const selectedData = makeTableData
.map((item) => {
@@ -133,6 +134,7 @@ export default function RswtChkgdTable({
return (
<>
<LoadingOverlay isLoading={rswtChkgdn.isLoading}></LoadingOverlay>
<Table variant="secondary">
<TableHeader className="font-bold">
{headMakeprfmnc(headList?.headList, headList?.upHeadList)}
@@ -150,9 +152,9 @@ export default function RswtChkgdTable({
</TableBody>
</Table>
<UiPageNations
total={rswtChkData?.length ?? 0}
total={rswtChkgdn.rswtChkCount}
cur={pageNation}
pageSize={20}
pageSize={rswtPageSize}
onPageChange={onPageChange}
/>
</>
@@ -110,6 +110,12 @@ export default function Chart({chartConfig=undefined, chartData=[], chartTitle='
axisLine={true}
fontSize={12}
fontWeight={500}
tickFormatter={(value) => {
// 소수점이 있는 경우 소수점을 유지하고 천단위 콤마 추가
return value.toString().includes('.')
? value.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2 })
: value.toLocaleString();
}}
label={yFieldText ? { value: yFieldText, className:"text-[13px] font-bold", position: 'insideLeft', angle: -90, offset: -24, orientation: "left" } : undefined}
/>
<ChartTooltip cursor={false} content={<CustomTooltip active={undefined} payload={undefined} label={undefined} />}/>
@@ -127,7 +127,7 @@ export default function LineBarchart({
className="text-[12px] font-bold"
tickCount={6}
orientation="left"
domain={[0, Math.ceil(lineMaxValue * 1)]}
tickFormatter={(value) => value.toLocaleString()}
label={{ value: yFieldText, angle: -90, position: 'insideLeft' }}
/>}
{/* 오른쪽 Y축: barVal */}
@@ -136,7 +136,7 @@ export default function LineBarchart({
className="text-[12px] font-bold"
tickCount={6}
orientation="right"
domain={[0, Math.ceil(barMaxValue * 1)]}
tickFormatter={(value) => value.toLocaleString()}
label={{ value: yFieldText2, angle: -90, position: 'insideRight' }}
reversed={true}
/>}
@@ -193,7 +193,7 @@ export default function Linechart({
>
<CartesianGrid vertical={false} />
<XAxis dataKey="label" fontSize="8px" fontWeight="bold" />
<YAxis yAxisId="left" className="text-[12px] font-bold" domain={[0, Math.ceil(lineMaxValue * 1.1)]} tickCount={6} orientation="left" label={{ value: yFieldText, className:"text-[12px] font-bold", angle: -90, position: 'insideLeft' }} />
<YAxis yAxisId="left" className="text-[12px] font-bold" tickFormatter={(value) => value.toLocaleString()} tickCount={6} orientation="left" label={{ value: yFieldText, className:"text-[12px] font-bold", angle: -90, position: 'insideLeft' }} />
<Tooltip content={<CustomTooltip />} />
{showLegend && <Legend content={CustomLegend as ContentType}/>}
{Object.keys(chartData).map((key) => {
@@ -21,4 +21,5 @@ export * from "./table_div";
export * from "./title";
export * from "./sdmInsertForm";
export * from "./popover_ui";
export * from "./date_month_picker";
export * from "./date_month_picker";
export * from "./loadingBar";