Files
frontend/apps/wr/app/store/stats/rswtStat/index.tsx
T
2025-07-22 20:41:37 +09:00

212 lines
8.2 KiB
TypeScript

import { fetchType, getFetch } from "@/components/lib/api";
import type { TableUpperProps } from "../../common/type/header";
import { rswtStatHeadListExport } from "./headList";
import { excelRswtStat } from "./excel";
export type RswtStatProps = {
cityText: string //시도명
ctpvCd: string //시도
sggCd: string //시군구
areaNm: string //행정구역명
bdstNm: string //시설명
daddr: string //주소
ctpvCnt: string //개소
archArea: number //건축연면적
filtrTrtmfctCpct: number //처리용량
wtrUsqty: number //물사용량
rswtAltSum: number //중수도+대체수이용량
rswtrUsqty: number //중수도이용량
altUswtrUtztnQnt: number //대체수이용량
lndwtr: number //조경용수
cleanToilUswtr: number //청소화장실용수
resn: number //세척살수용수
farmUswtr: number //농업용수
indstUswtr: number //공업용수
hydUswtr: number //친수용수
ithlEtcUswtr: number //기타
anlOperCst: number //연간운영비
guideStats: GuideStatProps[]
utztnUsgCd: string //이용코드
lawTrgtYn: string //법적의무대상여부
instlCmptnDt: string //설치완료일자
bdstUsgCd: number
}
export type GuideStatProps = {
utztnUsgCd: string
ruseFcltUtztnQnt: number
}
type rswtStatActions = {
searchRswtStatList: (year: string, city: { val: string; text: string }[]) => void;
}
export type ExcelType = {
[key: string]: string | number | undefined;
};
const excelDownList: ExcelType[] = [];
export type rswtStatState = {
rswtStat: {
rswtStatHeadList: TableUpperProps[];
rswtStatList: RswtStatProps[];
excelList: ExcelType[];
rswtDetailList: RswtStatProps[][];
}
}
export type rswtStatType = rswtStatState & rswtStatActions;
export const rswtStatExport: rswtStatState = {
rswtStat: {
rswtStatHeadList: rswtStatHeadListExport,
rswtStatList: [],
excelList: [],
rswtDetailList: []
}
}
export const rswtStatActionsExport: (set: any) => rswtStatActions = (
set: any
) => {
return {
searchRswtStatList: async (year: string, city: { val: string; text: string }[]) => {
const res = await getFetch(fetchType.WR, `/reuseChk/reuseWater/stat/${year}`)
const data = res.filter(item => {
const code = item.ctpvCd.trim();
return city.some(el => el.val === code);
});
const cityArr: any[] = [];
data.forEach((item: RswtStatProps) => {
let obj = cityArr.find((e) => {
return e.ctpvCd == item.ctpvCd
})
if (obj) {
obj.ctpvCnt += 1 //개소
// obj.archArea += item.archArea 건축면적 삭제
obj.filtrTrtmfctCpct += item.filtrTrtmfctCpct //처리용량
obj.wtrUsqty += item.wtrUsqty //물사용량
obj.rswtAltSum += (item.rswtrUsqty + item.altUswtrUtztnQnt) //중수도+대체수
obj.rswtrUsqty += item.rswtrUsqty //중수도사용량
obj.altUswtrUtztnQnt += item.altUswtrUtztnQnt //대체수이용량
obj.anlOperCst += item.anlOperCst //연간운영비용
} else {
obj = {
ctpvCd: item.ctpvCd,
ctpvCnt: 1,
filtrTrtmfctCpct: item.filtrTrtmfctCpct,
wtrUsqty: item.wtrUsqty,
rswtAltSum: item.rswtrUsqty + item.altUswtrUtztnQnt,
rswtrUsqty: item.rswtrUsqty,
altUswtrUtztnQnt: item.altUswtrUtztnQnt,
anlOperCst: item.anlOperCst,
lndwtr: 0,
cleanToilUswtr: 0,
farmUswtr: 0,
indstUswtr: 0,
hydUswtr: 0,
ithlEtcUswtr: 0,
}
cityArr.push(obj)
}
if (item.guideStats && item.guideStats.length > 0) {
item.guideStats.forEach((guide: GuideStatProps) => {
rswtStatHeadListExport.forEach((headItem: TableUpperProps) => {
if (headItem.title == guide.utztnUsgCd) {
if (!obj[headItem.id] || typeof obj[headItem.id] !== "number") obj[headItem.id] = 0;
if (typeof obj[headItem.id] === "number") {
obj[headItem.id] += guide.ruseFcltUtztnQnt;
}
}
});
})
}
});
const total: any = {
ctpvCd: "0",
ctpvCnt: 0,
filtrTrtmfctCpct: 0,
wtrUsqty: 0,
rswtAltSum: 0,
rswtrUsqty: 0,
altUswtrUtztnQnt: 0,
anlOperCst: 0,
lndwtr: 0,
cleanToilUswtr: 0,
farmUswtr: 0,
indstUswtr: 0,
hydUswtr: 0,
ithlEtcUswtr: 0,
};
cityArr.forEach(item => {
total.ctpvCnt += item.ctpvCnt;
total.archArea += item.archArea;
total.filtrTrtmfctCpct += item.filtrTrtmfctCpct;
total.wtrUsqty += item.wtrUsqty;
total.rswtAltSum += item.rswtAltSum;
total.rswtrUsqty += item.rswtrUsqty;
total.altUswtrUtztnQnt += item.altUswtrUtztnQnt;
total.anlOperCst += item.anlOperCst;
total.lndwtr += item.lndwtr;
total.cleanToilUswtr += item.cleanToilUswtr;
total.farmUswtr += item.farmUswtr;
total.indstUswtr += item.indstUswtr;
total.hydUswtr += item.hydUswtr;
total.ithlEtcUswtr += item.ithlEtcUswtr;
});
cityArr.unshift(total);
cityArr.forEach(item => {
excelDownList.push({
ctpvCd: item.ctpvCd,
ctpvCnt: item.ctpvCnt,
// archArea: item.archArea,
filtrTrtmfctCpct: item.filtrTrtmfctCpct,
wtrUsqty: item.wtrUsqty,
rswtAltSum: item.rswtAltSum,
rswtrUsqty: item.rswtrUsqty,
altUswtrUtztnQnt: item.altUswtrUtztnQnt,
lndwtr: item.lndwtr,
cleanToilUswtr: item.cleanToilUswtr,
farmUswtr: item.farmUswtr,
indstUswtr: item.indstUswtr,
hydUswtr: item.hydUswtr,
ithlEtcUswtr: item.ithlEtcUswtr,
anlOperCst: item.anlOperCst,
})
})
//상세
const rswtDetailList: RswtStatProps[] = [];
res.forEach((item: RswtStatProps) => {
const utztnUsgArray = new Array<string>();
item.guideStats.forEach((guideStat) => {
utztnUsgArray.push(guideStat.utztnUsgCd);
})
rswtDetailList.push({
...item,
rswtAltSum: item.rswtrUsqty + item.altUswtrUtztnQnt,
utztnUsgCd: utztnUsgArray.join(', '),
})
});
const excelDetailData = excelRswtStat(rswtDetailList);
set((state: rswtStatState) => ({
rswtStat: {
...state.rswtStat,
rswtStatList: cityArr,
excelList: excelDownList,
rswtDetailList: excelDetailData
}
}));
}
}
}