Files
frontend/apps/st/src/components/util/column/input/sewagePipe/ManholeStatusInpColumn.ts
T

225 lines
7.5 KiB
TypeScript

import type { ColumnConfig, ColumnLayoutItem } from "@/components/type/DataGrid.type";
import { footerInt } from "@/components/util/grid/footerSummary";
import { ValueType } from "realgrid";
// 하수도 통계 관리 > 02.하수관로 > tab 5. 맨홀 현황
// SeweragePipeInputManholeStatusItem + commonInfo.ctpvNm (그리드 행에 병합)
// API: yy14=2015년 이전(2014년 데이터) … yy{(현재연도-1)%100} (필드 접두 yy + 연도 끝자리)
const MANHOLE_START_YEAR = 2014;
const MANHOLE_LAST_DATA_YEAR = Math.max(MANHOLE_START_YEAR, new Date().getFullYear() - 1);
const MANHOLE_YY_MIN = MANHOLE_START_YEAR % 100;
const MANHOLE_YY_MAX = MANHOLE_LAST_DATA_YEAR % 100;
const calendarYearFromYy = (yy: number) => 2000 + yy;
/** yy14(2014) 구간은 헤더에 「2015년 이전」 표기 (합계·검토 컬럼과 동일) */
const manholeYearHeaderText = (yy: number): string => {
const y = calendarYearFromYy(yy);
return y === MANHOLE_START_YEAR ? "2015년 이전" : `${y}년`;
};
const intCol = (name: string, headerText: string): ColumnConfig => ({
name,
fieldName: name,
header: { text: headerText },
footer: footerInt,
// editable: false,
valueType: ValueType.NUMBER,
dataFormat: "#,##0",
});
const yearlySumFields = (suffix: "WholMnhlCnt" | "Step1MnhlCnt" | "Step2MnhlCnt" | "Step3MnhlCnt" | "Step4MnhlCnt" | "Step5MnhlCnt") =>
Array.from({ length: MANHOLE_YY_MAX - MANHOLE_YY_MIN + 1 }, (_, i) => `yy${MANHOLE_YY_MIN + i}${suffix}`);
function totalBlockColumns(): ColumnConfig[] {
return [
{
...intCol("totalWholMnhlCnt", "계"),
styleName: "rg-cell-total",
editable: false,
computed: { fields: yearlySumFields("WholMnhlCnt"), type: "sum" as const },
},
{
...intCol("totalStep1MnhlCnt", "주철"),
styleName: "rg-cell-total",
editable: false,
computed: { fields: yearlySumFields("Step1MnhlCnt"), type: "sum" as const },
},
{
...intCol("totalStep2MnhlCnt", "주철(조화)"),
styleName: "rg-cell-total",
editable: false,
computed: { fields: yearlySumFields("Step2MnhlCnt"), type: "sum" as const },
},
{
...intCol("totalStep3MnhlCnt", "콘크리트"),
styleName: "rg-cell-total",
editable: false,
computed: { fields: yearlySumFields("Step3MnhlCnt"), type: "sum" as const },
},
{
...intCol("totalStep4MnhlCnt", "기타"),
styleName: "rg-cell-total",
editable: false,
computed: { fields: yearlySumFields("Step4MnhlCnt"), type: "sum" as const },
},
{
...intCol("totalStep5MnhlCnt", "추락방지시설설치맨홀(개)"),
styleName: "rg-cell-total",
editable: false,
computed: { fields: yearlySumFields("Step5MnhlCnt"), type: "sum" as const },
},
];
}
function yyBlockColumns(yy: number): ColumnConfig[] {
const p = `yy${yy}`;
return [
{
...intCol(`${p}WholMnhlCnt`, "계"),
styleName: "rg-cell-total",
editable: false,
computed: {
fields: [
`${p}Step1MnhlCnt`,
`${p}Step2MnhlCnt`,
`${p}Step3MnhlCnt`,
`${p}Step4MnhlCnt`,
`${p}Step5MnhlCnt`,
],
type: "sum" as const,
},
},
intCol(`${p}Step1MnhlCnt`, "주철"),
intCol(`${p}Step2MnhlCnt`, "주철(조화)"),
intCol(`${p}Step3MnhlCnt`, "콘크리트"),
intCol(`${p}Step4MnhlCnt`, "기타"),
intCol(`${p}Step5MnhlCnt`, "추락방지시설설치맨홀(개)"),
];
}
function yyYearLayout(yy: number): ColumnLayoutItem {
const y = calendarYearFromYy(yy);
const p = `yy${yy}`;
return {
name: `year${y}`,
hideChildHeaders: false,
header: { text: manholeYearHeaderText(yy) },
items: [
{
name: `year${y}Material`,
hideChildHeaders: false,
header: { text: "맨홀뚜껑 재질(개)" },
items: [
`${p}WholMnhlCnt`,
`${p}Step1MnhlCnt`,
`${p}Step2MnhlCnt`,
`${p}Step3MnhlCnt`,
`${p}Step4MnhlCnt`,
],
},
`${p}Step5MnhlCnt`,
],
};
}
const yearLayoutItems: ColumnLayoutItem[] = [];
for (let yy = MANHOLE_YY_MIN; yy <= MANHOLE_YY_MAX; yy++) {
yearLayoutItems.push(yyYearLayout(yy));
}
export const ManholeStatusInpColumn = {
columns: [
{
name: "ctpvNm",
fieldName: "ctpvNm",
header: { text: "시도" },
footer: { text: "합계" },
editable: false,
styleName: "rg-cell-readonly",
},
{
name: "sggNm",
fieldName: "sggNm",
header: { text: "시군구" },
editable: false,
styleName: "rg-cell-readonly",
},
{
name: "admdstNm",
fieldName: "admdstNm",
header: { text: "행정구역명" },
editable: false,
styleName: "rg-cell-readonly",
},
{
name: "emphsMngSeNm",
fieldName: "emphsMngSeNm",
header: { text: "집중강우중점관리구역구분" },
editable: false,
styleName: "rg-cell-readonly",
footer: { text: "합계" },
// editable: false,
},
...totalBlockColumns(),
...Array.from({ length: MANHOLE_YY_MAX - MANHOLE_YY_MIN + 1 }, (_, i) =>
yyBlockColumns(MANHOLE_YY_MIN + i)
).flat(),
{ name: "rmrk", fieldName: "rmrk", header: { text: "비고" } },
{
name: "admdstCd",
fieldName: "admdstCd",
header: { text: "행정구역코드" },
visible: false,
editable: false,
styleName: "rg-cell-readonly",
},
{
name: "emphsMngSeCd",
fieldName: "emphsMngSeCd",
header: { text: "집중강우중점관리구역코드" },
visible: false,
editable: false,
styleName: "rg-cell-readonly",
},
] as ColumnConfig[],
columnLayout: [
{
name: "adminArea",
hideChildHeaders: false,
header: { text: "행정구역" },
items: [{ column: "ctpvNm", footerUserSpans: [{ colspan: 2 }] }, "sggNm"],
},
"admdstNm",
"emphsMngSeNm",
{
name: "yearlyTotal",
hideChildHeaders: false,
header: { text: "연도별총계" },
items: [
{
name: "yearlyTotalMaterial",
hideChildHeaders: false,
header: { text: "맨홀뚜껑 재질(개)" },
items: [
"totalWholMnhlCnt",
"totalStep1MnhlCnt",
"totalStep2MnhlCnt",
"totalStep3MnhlCnt",
"totalStep4MnhlCnt",
],
},
"totalStep5MnhlCnt",
],
},
...yearLayoutItems,
"rmrk",
"admdstCd",
"emphsMngSeCd",
] as ColumnLayoutItem[],
rowStartNum: 3,
fixedColumns: 2,
tabKey: "ST00020005",
tabLabel: "맨홀 현황",
};