212 lines
8.2 KiB
TypeScript
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
|
|
}
|
|
}));
|
|
}
|
|
}
|
|
} |