Merge remote-tracking branch 'origin/iipbs/st/dev' into feature/review-skeleton-sein

This commit is contained in:
2026-02-05 15:26:13 +09:00
16 changed files with 821 additions and 108 deletions
@@ -13,7 +13,7 @@ export const SeweragePenetrationRateInpColumn = {
// 수계 및 권역
{ name: 'rvbsn', fieldName: 'rvbsn', header: { text: '수계' }, editable: false },
{ name: 'bstrm', fieldName: 'bstrm', header: { text: '지류' }, editable: false },
{ name: 'bstrm', fieldName: 'bstrm', header: { text: '지류' } },
// 수계영향권별분류
{ name: 'mdbsn', fieldName: 'mdbsn', header: { text: '세부단위유역' }, editable: false },
@@ -48,8 +48,8 @@ export const getFooterAvgSummary = (grid: GridView, column: DataColumn) => {
return Math.floor(avg * 10) / 10;
}
// "구분" 필드의 고유값들을 찾는 함수 (첫 번째, 두 번째)
const getDivisionValues = (grid: GridView, divisionFieldName: string = '구분'): string[] => {
// 구분 필드의 고유값들을 찾는 함수 (첫 번째, 두 번째). 기본 필드명 'rgnNm'
const getDivisionValues = (grid: GridView, divisionFieldName: string = 'rgnNm'): string[] => {
const dataSource = grid.getDataSource();
const rowCount = dataSource.getRowCount();
const uniqueValues = new Set<string>();
@@ -65,13 +65,13 @@ const getDivisionValues = (grid: GridView, divisionFieldName: string = '구분')
return Array.from(uniqueValues);
};
// "구분" 필드 값에 따라 필터링하여 합계 계산하는 함수
// 구분 필드 값에 따라 필터링하여 합계 계산하는 함수. 기본 필드명 'rgnNm'
// divisionIndex: 0 = 첫 번째 고유값, 1 = 두 번째 고유값
export const getFooterSummaryByDivision = (
grid: GridView,
column: DataColumn,
grid: GridView,
column: DataColumn,
divisionIndex: number,
divisionFieldName: string = '구분'
divisionFieldName: string = 'rgnNm'
) => {
const dataSource = grid.getDataSource();
const rowCount = dataSource.getRowCount();
@@ -107,13 +107,13 @@ export const getFooterSummaryByDivision = (
return sum;
};
// "구분" 필드 값에 따라 필터링하여 평균 계산하는 함수
// 구분 필드 값에 따라 필터링하여 평균 계산하는 함수. 기본 필드명 'rgnNm'
// divisionIndex: 0 = 첫 번째 고유값, 1 = 두 번째 고유값
export const getFooterAvgSummaryByDivision = (
grid: GridView,
column: DataColumn,
grid: GridView,
column: DataColumn,
divisionIndex: number,
divisionFieldName: string = '구분'
divisionFieldName: string = 'rgnNm'
) => {
const dataSource = grid.getDataSource();
const rowCount = dataSource.getRowCount();
@@ -173,67 +173,51 @@ const createAvgFooter = (format: string) => ({
},
});
// "구분" 값에 따라 필터링하는 Footer 배열 생성 함수 (2줄)
const createSumFooterArrayByDivision = (format: string) => [
// 구분 값에 따라 필터링하는 Footer 배열 생성 함수 (2줄). 기본 필드명 'rgnNm'
const createSumFooterArrayByDivision = (format: string, divisionFieldName: string = 'rgnNm') => [
{
numberFormat: format,
valueCallback: (
grid: GridView,
column: DataColumn,
footerIndex: number,
columnFooter: unknown,
grid: GridView,
column: DataColumn,
footerIndex: number,
columnFooter: unknown,
value: number | string | undefined
) => {
// footerIndex: 0 = 첫 번째 footer 행 (첫 번째 "구분" 값), 1 = 두 번째 footer 행 (두 번째 "구분" 값)
// footerIndex를 divisionIndex로 사용
return getFooterSummaryByDivision(grid, column, footerIndex);
},
) => getFooterSummaryByDivision(grid, column, footerIndex, divisionFieldName),
},
{
numberFormat: format,
valueCallback: (
grid: GridView,
column: DataColumn,
footerIndex: number,
columnFooter: unknown,
grid: GridView,
column: DataColumn,
footerIndex: number,
columnFooter: unknown,
value: number | string | undefined
) => {
// footerIndex: 0 = 첫 번째 footer 행 (첫 번째 "구분" 값), 1 = 두 번째 footer 행 (두 번째 "구분" 값)
// footerIndex를 divisionIndex로 사용
return getFooterSummaryByDivision(grid, column, footerIndex);
},
) => getFooterSummaryByDivision(grid, column, footerIndex, divisionFieldName),
},
];
// "구분" 값에 따라 필터링하는 평균 Footer 배열 생성 함수 (2줄)
const createAvgFooterArrayByDivision = (format: string) => [
// 구분 값에 따라 필터링하는 평균 Footer 배열 생성 함수 (2줄). 기본 필드명 'rgnNm'
const createAvgFooterArrayByDivision = (format: string, divisionFieldName: string = 'rgnNm') => [
{
numberFormat: format,
valueCallback: (
grid: GridView,
column: DataColumn,
footerIndex: number,
columnFooter: unknown,
grid: GridView,
column: DataColumn,
footerIndex: number,
columnFooter: unknown,
value: number | string | undefined
) => {
// footerIndex: 0 = 첫 번째 footer 행 (첫 번째 "구분" 값), 1 = 두 번째 footer 행 (두 번째 "구분" 값)
// footerIndex를 divisionIndex로 사용
return getFooterAvgSummaryByDivision(grid, column, footerIndex);
},
) => getFooterAvgSummaryByDivision(grid, column, footerIndex, divisionFieldName),
},
{
numberFormat: format,
valueCallback: (
grid: GridView,
column: DataColumn,
footerIndex: number,
columnFooter: unknown,
grid: GridView,
column: DataColumn,
footerIndex: number,
columnFooter: unknown,
value: number | string | undefined
) => {
// footerIndex: 0 = 첫 번째 footer 행 (첫 번째 "구분" 값), 1 = 두 번째 footer 행 (두 번째 "구분" 값)
// footerIndex를 divisionIndex로 사용
return getFooterAvgSummaryByDivision(grid, column, footerIndex);
},
) => getFooterAvgSummaryByDivision(grid, column, footerIndex, divisionFieldName),
},
];
@@ -1,10 +1,15 @@
import type { SewerageSupplyRateItem } from "@/entities/statistics/model/statistics-input-interface";
export function toGridRows(items: SewerageSupplyRateItem[]): Record<string, string | number>[] {
/**
* 객체 배열을 그리드 row 형식으로 변환 (null/undefined → "").
* 어떤 엔티티 타입이든 공통 사용 가능.
*/
export function toGridRows<T extends object>(
items: T[]
): Record<string, string | number>[] {
return items.map((item) => {
const row: Record<string, string | number> = {};
for (const [key, value] of Object.entries(item)) {
row[key] = value === null || value === undefined ? "" : value;
row[key] =
value === null || value === undefined ? "" : (value as string | number);
}
return row;
});