wr: 통계

This commit is contained in:
2026-04-20 17:20:12 +09:00
parent 3d2dcb4ead
commit 9cf9081efc
8 changed files with 156 additions and 99 deletions
@@ -41,7 +41,7 @@ export default function RswtStat() {
"개소": item.ctpvCnt,
// "건축연면적(m³)": item.archArea,
"처리용량(m³)": item.filtrTrtmfctCpct,
"물사용량(m³/년)": item.wtrUsqty,
// "물사용량(m³/년)": item.wtrUsqty,
"중수도+대체수이용량(m³/년)": item.rswtAltSum,
"중수도이용량(m³/년)": item.rswtrUsqty,
"대체수이용량(m³/년)": item.altUswtrUtztnQnt,
@@ -59,8 +59,8 @@ export default function RswtStat() {
data: (data as unknown as JSON[]) ?? [],
fileName: "중수도재이용통계",
sheetNameArray: ["Sheet1"],
headerRange: "A1:N1",
decimalArray0: [1,2,3,4,5,6,7,8,9,10,11,12,13], // 0부터 시작
headerRange: "A1:M1",
decimalArray0: [1,2,3,4,5,6,7,8,9,10,11,12], // 0부터 시작
})
} else {
alert(t("excelDownErrMsg"))
@@ -174,15 +174,9 @@ export default function RswtStat() {
} else if (i == 12) {
const value = Number(item[12]) || 0;
sidoData[i] = (Number(sidoData[i]) + value) as string | number;
} else if (i == 13) {
const value = Number(item[13]) || 0;
sidoData[i] = (Number(sidoData[i]) + value) as string | number;
} else if (i == 14) {
const value = Number(item[14]) || 0;
sidoData[i] = (Number(sidoData[i]) + value) as string | number;
} else if (i == 16) {
const value = Number(item[16]) || 0;
sidoData[i] = (Number(sidoData[i]) + value) as string | number;
} else {
sidoData[i] = '';
}
@@ -209,7 +203,7 @@ export default function RswtStat() {
});
const sidoSummaryList = Array.from(sidoDataMap.values());
const sidoTotalSummary = [['전국', '', '합계', 0, '', '', 0, '', '', 0, 0, 0, 0, 0, 0, '']];
const sidoTotalSummary = [['전국', '', '합계', 0, '', '', 0, '', '', 0, 0, 0, 0, '', 0]];
sidoSummaryList.forEach((item: (string | number)[]) => {
item.forEach((value: string | number, index: number) => {
if (typeof value === 'number') {
@@ -226,7 +220,7 @@ export default function RswtStat() {
const sheetArray: SheetParameter[] = [{
data: excelData,
headerNum: 3,
headerRange: "A1:P3",
headerRange: "A1:O3",
sheetName: 'sheet1',
startCol: 'A',
decimalArray0: [1,2,3,4,5,6,7,8,9,10,11,12], // 0부터 시작
+31 -21
View File
@@ -1,41 +1,51 @@
import type { RainStatProps } from ".";
import { codeToText } from "@/components/lib/func/common";
import type { RainStatProps } from ".";
export const excelRainStat = (excelList:RainStatProps[]) : (string | number)[][] => {
const toUseTypeText = (val: string) =>
val
.split(",")
.map((code) => code.trim())
.filter(Boolean)
.map((code) => codeToText(code, "dmdUszCd") ?? code)
.join(", ");
export const excelRainStat = (
excelList: RainStatProps[]
): (string | number)[][] => {
const excelData: (string | number)[][] = [];
excelList.forEach((item) => {
excelList.forEach((item) => {
excelData.push([
//시도
item.ctpvCd ?? "",
//시군구
item.sggCd ?? "",
//행정구역명
String(item.areaNm) ?? "",
//행정구역명
String(item.areaNm) ?? "",
//시설명
String(item.bdstNm) ?? "",
//건축물용도코드 (값 없음)
//String(item.bdstUsgCd) ?? "",
"",
codeToText(String(item.bdstUsgCd ?? ""), "bdstUsgCd") ?? String(item.bdstUsgCd ?? ""),
//주소
String(item.daddr) ?? "",
//법적의무대상여부
String(item.lawTrgtYn)==="Y" ? "대상" : "미대상",
String(item.lawTrgtYn) === "Y" ? "대상" : "미대상",
//설치완료일자
String(item.instlCmptnDt).substring(0, 10) ?? "",
//설치비용
item.instlCst ?? "",
//접수면종류
String(item.pntfColKnd) ?? "",
//집수면종류
codeToText(String(item.pntfColKnd ?? ""), "rainFcltCd") ?? String(item.pntfColKnd ?? ""),
//여과등처리시설유무
String(item.filtrTrtmfctYn) ?? "",
//처리용량(저류조용량)
item.dtfcltCpct ?? "",
//연간사용량
item.wtrUsqty ?? "",
//이용용도코드
item.utztnUsgCd ?? "",
//연간운영비
item.anlOperCst ?? "",
]);
});
//처리용량(저류조용량)
item.dtfcltCpct ?? "",
//연간사용량
item.wtrUsqty ?? "",
//이용용도코드
toUseTypeText(item.utztnUsgCd ?? ""),
//연간운영비
item.anlOperCst ?? "",
]);
});
return excelData;
}
};
+28 -6
View File
@@ -89,6 +89,7 @@ export const rainStatActionsExport = (
searchRainStatList: async (year: string, city: SelectDataType[]) => {
const res = await fetchRainStatList(year);
const cityArr: any[] = [];
excelDownList.length = 0;
res.filter((resFilter: RainStatProps) =>
city.some((cityCd) =>
@@ -104,7 +105,6 @@ export const rainStatActionsExport = (
if (obj) {
obj.instlCst += item.instlCst;
obj.dtfcltCpct += item.dtfcltCpct;
obj.wtrUsqty += item.wtrUsqty;
obj.anlOperCst += item.anlOperCst;
obj.tmp += 1;
} else {
@@ -113,7 +113,7 @@ export const rainStatActionsExport = (
obj.instlCst = item.instlCst;
obj.tmp = 1;
obj.dtfcltCpct = item.dtfcltCpct;
obj.wtrUsqty = item.wtrUsqty;
obj.wtrUsqty = 0;
obj.anlOperCst = item.anlOperCst;
obj.lndwtr = 0; //조경용수
obj.cleanToilUswtr = 0; //청소화장실용수
@@ -138,6 +138,15 @@ export const rainStatActionsExport = (
});
});
}
obj.wtrUsqty =
obj.lndwtr +
obj.cleanToilUswtr +
obj.resn +
obj.farmUswtr +
obj.indstUswtr +
obj.hydUswtr +
obj.ithlEtcUswtr;
});
const totalObj = {
@@ -145,7 +154,7 @@ export const rainStatActionsExport = (
tmp: 0,
instlCst: 0, //설치비
dtfcltCpct: 0, //저류조용량
bdstUsgCd: 0, //연간사용량
wtrUsqty: 0, //연간사용량
lndwtr: 0, //조경용수
cleanToilUswtr: 0, //청소화장실용수
resn: 0, //세척살수용수
@@ -165,8 +174,8 @@ export const rainStatActionsExport = (
totalObj.dtfcltCpct += !isNaN(Number(item.dtfcltCpct))
? Number(item.dtfcltCpct)
: 0;
totalObj.bdstUsgCd += !isNaN(Number(item.bdstUsgCd))
? Number(item.bdstUsgCd)
totalObj.wtrUsqty += !isNaN(Number(item.wtrUsqty))
? Number(item.wtrUsqty)
: 0;
totalObj.lndwtr += !isNaN(Number(item.lndwtr))
? Number(item.lndwtr)
@@ -196,7 +205,7 @@ export const rainStatActionsExport = (
tmp: item.tmp,
instlCst: item.instlCst, //설치비
dtfcltCpct: item.dtfcltCpct, //저류조용량
bdstUsgCd: item.bdstUsgCd, //연간사용량
wtrUsqty: item.wtrUsqty, //연간사용량
lndwtr: item.lndwtr, //조경용수
cleanToilUswtr: item.cleanToilUswtr, //청소화장실용수
resn: item.resn, //세척살수용수
@@ -208,17 +217,30 @@ export const rainStatActionsExport = (
});
});
cityArr.forEach((item) => {
item.instlCst = Math.round(Number(item.instlCst) / 1000000);
item.anlOperCst = Math.round(Number(item.anlOperCst) / 1000000);
});
totalObj.instlCst = Math.round(Number(totalObj.instlCst) / 1000000);
totalObj.anlOperCst = Math.round(Number(totalObj.anlOperCst) / 1000000);
//상세
const rainDetailList: RainStatProps[] = [];
res.forEach((item: RainStatProps) => {
const utztnUsgArray = new Array<string>();
let wtrUsqty = 0;
item.guideStats.forEach((guideStat) => {
utztnUsgArray.push(guideStat.utztnUsgCd);
wtrUsqty += Number(guideStat.ruseFcltUtztnQnt) || 0;
});
rainDetailList.push({
...item,
instlCst: Math.round(Number(item.instlCst) / 1000000),
wtrUsqty,
utztnUsgCd: utztnUsgArray.join(", "),
anlOperCst: Math.round(Number(item.anlOperCst) / 1000000),
});
});
+48 -45
View File
@@ -1,50 +1,53 @@
import type { SelectDataType } from "@common/business_components/ui";
import { codeToText } from "@/components/lib/func/common";
import type { RswtStatProps } from ".";
export const excelRswtStat = (excelList: RswtStatProps[], rswtBdstType : SelectDataType[] ) : (string | number)[][] => {
const toUseTypeText = (val: string) =>
val
.split(",")
.map((code) => code.trim())
.filter(Boolean)
.map((code) => codeToText(code, "dmdUszCd") ?? code)
.join(", ");
console.log('bdstUsgCd ', rswtBdstType)
export const excelRswtStat = (
excelList: RswtStatProps[]
): (string | number)[][] => {
const excelData: (string | number)[][] = [];
excelList.forEach((item) => {
excelData.push([
//시도
String(item.ctpvCd) ?? "",
//시군구
String(item.sggCd) ?? "",
//행정구역명
String(item.areaNm) ?? "",
//건축물명
String(item.bdstNm) ?? "",
//건축물용도코드(빈칸)
//String(item.bdstUsgCd) ?? "",
rswtBdstType?.find((cd)=> cd.val === item.bdstUsgCd.toString())?.text ?? "", //건축물용도
//주소
String(item.daddr) ?? "",
//법적의무대상여부
String(item.lawTrgtYn)==="Y" ? "대상" : "미대상",
//설치완료일자
item.instlCmptnDt ? String(item.instlCmptnDt).substring(0, 10) : "",
//가동개시일(빈칸)
//String(item.instlCst) ?? "",
"",
//건축물면적
// item.archArea ?? "",
//처리용량
item.filtrTrtmfctCpct ?? "",
//물사용량
item.wtrUsqty ?? "",
//중수도+대체수이용량
item.rswtAltSum ?? "",
//중수도이용량
item.rswtrUsqty ?? "",
//대체수이용량
item.altUswtrUtztnQnt ?? "",
//중수도용도
String(item.utztnUsgCd) ?? "",
//연간운영비
item.anlOperCst ?? "",
]);
});
excelList.forEach((item) => {
excelData.push([
//시도
String(item.ctpvCd) ?? "",
//시군구
String(item.sggCd) ?? "",
//행정구역명
String(item.areaNm) ?? "",
//건축물명
String(item.bdstNm) ?? "",
//건축물용도코드
codeToText(String(item.bdstUsgCd ?? ""), "rswtBdstType") ?? String(item.bdstUsgCd ?? ""),
//주소
String(item.daddr) ?? "",
//법적의무대상여부
String(item.lawTrgtYn) === "Y" ? "대상" : "미대상",
//설치완료일자
item.instlCmptnDt ? String(item.instlCmptnDt).substring(0, 10) : "",
//가동개시일(빈칸)
"",
//처리용량
item.filtrTrtmfctCpct ?? "",
//물사용량
// item.wtrUsqty ?? "",
//중수도+대체수이용량
item.rswtAltSum ?? "",
//중수도이용량
item.rswtrUsqty ?? "",
//대체수이용량
item.altUswtrUtztnQnt ?? "",
//중수도용도
toUseTypeText(String(item.utztnUsgCd ?? "")),
//연간운영비
item.anlOperCst ?? "",
]);
});
return excelData;
}
};
@@ -30,12 +30,12 @@ export const rswtStatHeadListExport :TableUpperProps[]=[
row:0,
rowSpan:2
},
{
id: "wtrUsqty",
title: "물사용량(m³/년)",
row:0,
rowSpan:2
},
// {
// id: "wtrUsqty",
// title: "물사용량(m³/년)",
// row:0,
// rowSpan:2
// },
{
id: "rswtAltSum",
title: "중수도+대체수이용량(m³/년)",
@@ -105,4 +105,4 @@ export const rswtStatHeadListExport :TableUpperProps[]=[
},
]
]
+37 -9
View File
@@ -35,6 +35,7 @@ export type RswtStatProps = {
export type GuideStatProps = {
utztnUsgCd: string
splyUswtrUtztnQnt: number
ruseFcltUtztnQnt: number
}
@@ -80,7 +81,15 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = (
return city.some(el => el.val === code);
});
const cityArr: any[] = [];
excelDownList.length = 0;
data.forEach((item: RswtStatProps) => {
const itemAltUswtrUtztnQnt =
item.guideStats && item.guideStats.length > 0
? item.guideStats.reduce(
(sum, guide) => sum + (Number(guide.splyUswtrUtztnQnt) || 0),
0
)
: Number(item.altUswtrUtztnQnt) || 0;
let obj = cityArr.find((e) => {
return e.ctpvCd == item.ctpvCd
})
@@ -90,9 +99,7 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = (
// 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.altUswtrUtztnQnt += itemAltUswtrUtztnQnt //대체수이용량
obj.anlOperCst += item.anlOperCst //연간운영비용
} else {
obj = {
@@ -100,9 +107,9 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = (
ctpvCnt: 1,
filtrTrtmfctCpct: item.filtrTrtmfctCpct,
wtrUsqty: item.wtrUsqty,
rswtAltSum: item.rswtrUsqty + item.altUswtrUtztnQnt,
rswtrUsqty: item.rswtrUsqty,
altUswtrUtztnQnt: item.altUswtrUtztnQnt,
rswtAltSum: 0,
rswtrUsqty: 0,
altUswtrUtztnQnt: itemAltUswtrUtztnQnt,
anlOperCst: item.anlOperCst,
lndwtr: 0,
cleanToilUswtr: 0,
@@ -127,6 +134,15 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = (
});
})
}
obj.rswtrUsqty =
obj.lndwtr +
obj.cleanToilUswtr +
obj.farmUswtr +
obj.indstUswtr +
obj.hydUswtr +
obj.ithlEtcUswtr;
obj.rswtAltSum = obj.rswtrUsqty + obj.altUswtrUtztnQnt;
});
const total: any = {
@@ -163,6 +179,11 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = (
total.ithlEtcUswtr += item.ithlEtcUswtr;
});
cityArr.forEach(item => {
item.anlOperCst = Math.round(Number(item.anlOperCst) / 1000000);
});
total.anlOperCst = Math.round(Number(total.anlOperCst) / 1000000);
cityArr.unshift(total);
cityArr.forEach(item => {
@@ -189,16 +210,23 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = (
const rswtDetailList: RswtStatProps[] = [];
res.forEach((item: RswtStatProps) => {
const utztnUsgArray = new Array<string>();
let rswtrUsqty = 0;
let altUswtrUtztnQnt = 0;
item.guideStats.forEach((guideStat) => {
utztnUsgArray.push(guideStat.utztnUsgCd);
rswtrUsqty += Number(guideStat.ruseFcltUtztnQnt) || 0;
altUswtrUtztnQnt += Number(guideStat.splyUswtrUtztnQnt) || 0;
})
rswtDetailList.push({
...item,
rswtAltSum: item.rswtrUsqty + item.altUswtrUtztnQnt,
rswtAltSum: rswtrUsqty + altUswtrUtztnQnt,
rswtrUsqty,
altUswtrUtztnQnt,
utztnUsgCd: utztnUsgArray.join(', '),
anlOperCst: Math.round(Number(item.anlOperCst) / 1000000),
})
});
const excelDetailData = excelRswtStat(rswtDetailList,rswtBdstType);
const excelDetailData = excelRswtStat(rswtDetailList);
set((state: rswtStatState) => ({
rswtStat: {
...state.rswtStat,
@@ -209,4 +237,4 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = (
}));
}
}
}
}
Binary file not shown.
Binary file not shown.