refactor: 01. 하수도 보급률 컬럼 분리, Grid 속성 적용

- SeweragePenetrationRateMng.tsx 에 포함되어있던 컬럼 정의를 SeweragePenetrationRateMngColumn.ts 파일로 분리
- Footer 합계 함수 적용 (소수점, 정수 적용)
- 컬럼별 수정가능 여부(editable) 설정
This commit is contained in:
2025-12-30 14:06:29 +09:00
parent 01ef993601
commit 90c977300c
2 changed files with 185 additions and 119 deletions
@@ -4,138 +4,26 @@ import SubmitButton from "@/components/button/SumitButton";
import SaveButton from "@/components/button/SaveButton";
import LastYearDataButton from "@/components/button/LastYearDataButton";
import SubmitExceptionButton from "@/components/button/SubmitExceptionButton";
import type { GridView, DataColumn } from "@/components/type/DataGrid.type";
import { getFooterSummary } from "@/components/util/grid/footerSummary";
import { SeweragePenetrationRateMngColumnInfo } from "@/components/util/column/management/SeweragePenetrationRateMngColumn";
// 하수도 통계 관리 > 01. 하수도 보급률
const SeweragePenetrationRateMng = () => {
const columns = [
{ name: 'sido', fieldName: '시도', header: { text: '시도' } },
{
name: 'sgg',
fieldName: '구군',
header: { text: '구군' },
footer: {
text: '합계'
},
},
{ name: 'rvbsn', fieldName: '수계', header: { text: '수계' } },
{ name: 'bstrm', fieldName: '지류', header: { text: '지류' } },
{ name: 'mdbsn', fieldName: '세부단위유역', header: { text: '세부단위유역' } },
{ name: 'lgbsn', fieldName: '중권역', header: { text: '중권역' } },
{ name: 'mdmbsn', fieldName: '소권역', header: { text: '소권역' } },
{ name: 'specl_cntrpln_ar', fieldName: '특별대책지역', header: { text: '특별대책지역' } },
{
name: 'total_popl',
fieldName: '총인구',
header: { text: '총인구' },
footer: {
expression: 'sum' as const,
numberFormat: '#,##0',
valueCallback: (grid: GridView, column: DataColumn) => {
return getFooterSummary(grid, column);
},
},
},
{ name: 'popl_sm', fieldName: '내국인', header: { text: '내국인' } },
{ name: 'frgnr_popl_sm', fieldName: '외국인', header: { text: '외국인' } },
{ name: 'area', fieldName: '행정참고자료면적(㎢)', header: { text: '행정참고자료면적(㎢)' } },
{ name: 'popltn_sm', fieldName: '총인구(명)', header: { text: '총인구(명)' } },
{ name: 'ar_sm', fieldName: '총면적(㎢)', header: { text: '총면적(㎢)' } },
{ name: 'swge_proc_zone_inner_sm', fieldName: '합계', header: { text: '합계' } },
{ name: 'pblswrg_popltn_sm', fieldName: '소계', header: { text: '소계' } },
{ name: 'pblswrg_prm_trt', fieldName: '물리적처리', header: { text: '물리적처리' } },
{ name: 'pblswrg_scd_trt', fieldName: '생물학적처리', header: { text: '생물학적처리' } },
{ name: 'pblswrg_tert_trt', fieldName: '고도처리', header: { text: '고도처리' } },
{ name: 'wstr_popltn_sm', fieldName: '소계', header: { text: '소계' } },
{ name: 'wstr_prm_trt', fieldName: '물리적처리', header: { text: '물리적처리' } },
{ name: 'wstr_scd_trt', fieldName: '생물학적처리', header: { text: '생물학적처리' } },
{ name: 'wstr_tert_trt', fieldName: '고도처리', header: { text: '고도처리' } },
{ name: 'not_conect_popltn', fieldName: '미접속인구', header: { text: '미접속인구' } },
{ name: 'swge_proc_zone_inner_ar', fieldName: '면적(㎢)', header: { text: '면적(㎢)' } },
{ name: 'swge_proc_zone_outer_sm', fieldName: '합계', header: { text: '합계' } },
{ name: 'town_unproc_popltn', fieldName: '미처리인구', header: { text: '미처리인구' } },
{ name: 'town_swtt_popltn', fieldName: '오수처리인구', header: { text: '오수처리인구' } },
{ name: 'town_wrrtn_popltn', fieldName: '정화조인구', header: { text: '정화조인구' } },
{ name: 'swge_proc_zone_outer_ar', fieldName: '면적(㎢)', header: { text: '면적(㎢)' } },
{ name: 'pblswrg_popltn_suprt', fieldName: '공공하수처리구역인구보급율(%)', header: { text: '공공하수처리구역인구보급율(%)' } },
{ name: 'adtrt_popltn_suprt', fieldName: '고도처리인구보급율(%)', header: { text: `고도처리인구보급율(%)` } },
{ name: 'swrg_instlrt', fieldName: '하수도설치율(%)', header: { text: '하수도설치율(%)' } },
{ name: 'rmk', fieldName: '비고', header: { text: '비고' } },
];
const columnLayout = [
{
name: 'groupA',
hideChildHeaders: false,
header: { text: '행정구역' },
items: ['sido', 'sgg'],
},
'rvbsn',
'bstrm',
{
name: 'groupB',
hideChildHeaders: false,
header: { text: '수계영향권별분류류' },
items: ['mdbsn', 'lgbsn', 'mdmbsn'],
},
'specl_cntrpln_ar',
{
name: 'groupC',
hideChildHeaders: false,
header: { text: '행정참고자료인구' },
items: ['total_popl', 'popl_sm', 'frgnr_popl_sm'],
},
'area',
'popltn_sm',
'ar_sm',
{
name: 'groupD',
hideChildHeaders: false,
header: { text: '하수처리구역내' },
items: [
'swge_proc_zone_inner_sm',
{
name: 'pblswrgGroup',
hideChildHeaders: false,
header: { text: '공공하수처리인구(명)' },
items: ['pblswrg_popltn_sm', 'pblswrg_prm_trt', 'pblswrg_scd_trt', 'pblswrg_tert_trt'],
},
{
name: 'wstrGroup',
hideChildHeaders: false,
header: { text: '폐수처리인구(명)' },
items: ['wstr_popltn_sm', 'wstr_prm_trt', 'wstr_scd_trt', 'wstr_tert_trt'],
},
'not_conect_popltn',
'swge_proc_zone_inner_ar'
],
},
{
name: 'groupE',
hideChildHeaders: false,
header: { text: '하수처리구역외' },
items: ['swge_proc_zone_outer_sm', 'town_swtt_popltn', 'town_unproc_popltn', 'town_wrrtn_popltn', 'swge_proc_zone_outer_ar'],
},
'pblswrg_popltn_suprt',
'adtrt_popltn_suprt',
'swrg_instlrt',
'rmk',
];
// 로직은 그대로 유지
const submitFunc = () => {
console.log('submit');
// 제출 로직
};
const saveFunc = () => {
console.log('submit');
console.log('save');
// 저장 로직
};
const getLastYearDataFunc = () => {
console.log('get last year data');
// 지난연도 데이터 가져오기 로직
// 전년도 데이터 가져오기
};
const SubmitExceptionFunc = () => {
@@ -152,7 +40,12 @@ const SeweragePenetrationRateMng = () => {
<LastYearDataButton getLastYearDataFunc={getLastYearDataFunc} />
<SubmitExceptionButton SubmitExceptionFunc={SubmitExceptionFunc} />
</div>
<DataGrid columnInfo={{ columns, columnLayout }} rowStartNum={3} isExcelImport={true} fixedColumns={1} />
<DataGrid
columnInfo={SeweragePenetrationRateMngColumnInfo}
rowStartNum={3}
isExcelImport={true}
fixedColumns={1}
/>
</>
);
};
@@ -0,0 +1,173 @@
import type { GridView, DataColumn } from "@/components/type/DataGrid.type";
import { getFooterSummary } from "@/components/util/grid/footerSummary";
// Footer 설정 생성 함수
const createSumFooter = (format: string) => ({
expression: 'sum' as const,
numberFormat: format,
valueCallback: (grid: GridView, column: DataColumn) => {
return getFooterSummary(grid, column);
},
});
// 1. 정수형 : #,##0
const footerInt = createSumFooter('#,##0');
// 2. 소수점 3자리 : #,##0.000
const footerDecimal3 = createSumFooter('#,##0.000');
// 3. 소수점 1자리 : #,##0.0
const footerDecimal1 = createSumFooter('#,##0.0');
/**
* 하수도 통계 관리 > 01. 하수도 보급률
* 단일 Tab
*/
export const SeweragePenetrationRateMngColumnInfo = {
columns: [
// [기본정보] 행정구역 - 수정 불가
{ name: 'sido', fieldName: '시도', header: { text: '시도' }, editable: false },
{
name: 'sgg',
fieldName: '구군',
header: { text: '구군' },
footer: { text: '합계' },
editable: false
},
// [기본정보] 수계 및 권역 - 수정 불가
{ name: 'rvbsn', fieldName: '수계', header: { text: '수계' }, editable: false },
{ name: 'bstrm', fieldName: '지류', header: { text: '지류' }, editable: false },
// [기본정보] 수계영향권별분류 - 수정 불가
{ name: 'mdbsn', fieldName: '세부단위유역', header: { text: '세부단위유역' }, editable: false },
{ name: 'lgbsn', fieldName: '중권역', header: { text: '중권역' }, editable: false },
{ name: 'mdmbsn', fieldName: '소권역', header: { text: '소권역' }, editable: false },
// [입력필드] 특별대책지역 - 수정 가능
{ name: 'specl_cntrpln_ar', fieldName: '특별대책지역', header: { text: '특별대책지역' } },
// [참조정보] 행정참고자료인구 - 수정 불가
{ name: 'total_popl', fieldName: '총인구', header: { text: '총인구' }, footer: footerInt, editable: false },
{ name: 'popl_sm', fieldName: '내국인', header: { text: '내국인' }, footer: footerInt, editable: false },
{ name: 'frgnr_popl_sm', fieldName: '외국인', header: { text: '외국인' }, footer: footerInt, editable: false },
// [참조정보] 행정참고자료면적 - 수정 불가
{ name: 'area', fieldName: '행정참고자료면적(㎢)', header: { text: '행정참고자료면적(㎢)' }, footer: footerDecimal3, editable: false },
// [자동계산] 총인구 (Nexacro: expr 존재) - 수정 불가
{ name: 'popltn_sm', fieldName: '총인구(명)', header: { text: '총인구(명)' }, footer: footerInt, editable: false },
// [입력필드] 총면적 (Nexacro: 입력 가능) - 수정 가능
{ name: 'ar_sm', fieldName: '총면적(㎢)', header: { text: '총면적(㎢)' }, footer: footerDecimal3 },
// [자동계산] 하수처리구역 내 합계 - 수정 불가
{ name: 'swge_proc_zone_inner_sm', fieldName: '합계', header: { text: '합계' }, footer: footerInt, editable: false },
// [자동계산] 공공하수 소계 - 수정 불가
{ name: 'pblswrg_popltn_sm', fieldName: '소계', header: { text: '소계' }, footer: footerInt, editable: false },
// [입력필드] 공공하수 상세 - 수정 가능
{ name: 'pblswrg_prm_trt', fieldName: '물리적처리', header: { text: '물리적처리' }, footer: footerInt },
{ name: 'pblswrg_scd_trt', fieldName: '생물학적처리', header: { text: '생물학적처리' }, footer: footerInt },
{ name: 'pblswrg_tert_trt', fieldName: '고도처리', header: { text: '고도처리' }, footer: footerInt },
// [자동계산] 폐수 소계 - 수정 불가
{ name: 'wstr_popltn_sm', fieldName: '소계', header: { text: '소계' }, footer: footerInt, editable: false },
// [입력필드] 폐수 상세 - 수정 가능
{ name: 'wstr_prm_trt', fieldName: '물리적처리', header: { text: '물리적처리' }, footer: footerInt },
{ name: 'wstr_scd_trt', fieldName: '생물학적처리', header: { text: '생물학적처리' }, footer: footerInt },
{ name: 'wstr_tert_trt', fieldName: '고도처리', header: { text: '고도처리' }, footer: footerInt },
// [입력필드] 미접속인구 - 수정 가능
{ name: 'not_conect_popltn', fieldName: '미접속인구', header: { text: '미접속인구' }, footer: footerInt },
// [입력필드] 구역내 면적 - 수정 가능
{ name: 'swge_proc_zone_inner_ar', fieldName: '면적(㎢)', header: { text: '면적(㎢)' }, footer: footerDecimal3 },
// [자동계산] 하수처리구역 외 합계 - 수정 불가
{ name: 'swge_proc_zone_outer_sm', fieldName: '합계', header: { text: '합계' }, footer: footerInt, editable: false },
// [입력필드] 구역외 상세 - 수정 가능
{ name: 'town_unproc_popltn', fieldName: '미처리인구', header: { text: '미처리인구' }, footer: footerInt },
{ name: 'town_swtt_popltn', fieldName: '오수처리인구', header: { text: '오수처리인구' }, footer: footerInt },
{ name: 'town_wrrtn_popltn', fieldName: '정화조인구', header: { text: '정화조인구' }, footer: footerInt },
// [입력필드] 구역외 면적 - 수정 가능
{ name: 'swge_proc_zone_outer_ar', fieldName: '면적(㎢)', header: { text: '면적(㎢)' }, footer: footerDecimal3 },
// [자동계산] 비율 (수식) - 수정 불가
{ name: 'pblswrg_popltn_suprt', fieldName: '공공하수처리구역인구보급율(%)', header: { text: '공공하수처리구역인구보급율(%)' }, footer: footerDecimal1, editable: false },
{ name: 'adtrt_popltn_suprt', fieldName: '고도처리인구보급율(%)', header: { text: `고도처리인구보급율(%)` }, footer: footerDecimal1, editable: false },
{ name: 'swrg_instlrt', fieldName: '하수도설치율(%)', header: { text: '하수도설치율(%)' }, footer: footerDecimal1, editable: false },
// [입력필드] 비고 - 수정 가능
{ name: 'rmk', fieldName: '비고', header: { text: '비고' } },
],
columnLayout: [
{
name: 'groupA',
hideChildHeaders: false,
header: { text: '행정구역' },
items: ['sido', 'sgg'],
},
'rvbsn',
'bstrm',
{
name: 'groupB',
hideChildHeaders: false,
header: { text: '수계영향권별분류' },
items: ['mdbsn', 'lgbsn', 'mdmbsn'],
},
'specl_cntrpln_ar',
{
name: 'groupC',
hideChildHeaders: false,
header: { text: '행정참고자료인구' },
items: ['total_popl', 'popl_sm', 'frgnr_popl_sm'],
},
'area',
'popltn_sm',
'ar_sm',
{
name: 'groupD',
hideChildHeaders: false,
header: { text: '하수처리구역내' },
items: [
'swge_proc_zone_inner_sm',
{
name: 'pblswrgGroup',
hideChildHeaders: false,
header: { text: '공공하수처리인구(명)' },
items: ['pblswrg_popltn_sm', 'pblswrg_prm_trt', 'pblswrg_scd_trt', 'pblswrg_tert_trt'],
},
{
name: 'wstrGroup',
hideChildHeaders: false,
header: { text: '폐수처리인구(명)' },
items: ['wstr_popltn_sm', 'wstr_prm_trt', 'wstr_scd_trt', 'wstr_tert_trt'],
},
'not_conect_popltn',
'swge_proc_zone_inner_ar'
],
},
{
name: 'groupE',
hideChildHeaders: false,
header: { text: '하수처리구역외' },
items: [
'swge_proc_zone_outer_sm',
'town_unproc_popltn',
'town_swtt_popltn',
'town_wrrtn_popltn',
'swge_proc_zone_outer_ar'
],
},
'pblswrg_popltn_suprt',
'adtrt_popltn_suprt',
'swrg_instlrt',
'rmk',
]
};