feat: 13. 하수도서비스 수준 화면 구현

- 각 tab별로 columns, columnLayout 분리
- tab 1. 민원 (ComplaintInpColumn.ts)
- tab 2. 주민친화시설 (ResidentFriendlyFacilityInpColumn.ts)
- 하수도서비스 수준 Component 완성
This commit is contained in:
2026-01-09 16:38:38 +09:00
parent c73a01d27d
commit 4da4f5cd62
3 changed files with 212 additions and 1 deletions
@@ -1,10 +1,54 @@
import SearchForm from "../../module/SearchForm";
import { useState } from "react";
import SearchForm from "@/components/module/SearchForm";
import { TabDataGrid } from '@rsone/components';
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 { ComplaintInpColumn } from "@/components/util/column/input/sewerageServiceLevel/ComplaintInpColumn";
import { ResidentFriendlyFacilityInpColumn } from "@/components/util/column/input/sewerageServiceLevel/ResidentFriendlyFacilityInpColumn";
// 하수도 통계 관리 > 13. 하수도 서비스 수준
const SewerageServiceLevelInp = () => {
const [rowDataMap, setRowDataMap] = useState<Map<string, Record<string, string | number>[]>>(new Map());
// tab List
const SewerageServiceLevelInpTabList = [
ComplaintInpColumn,
ResidentFriendlyFacilityInpColumn
];
const submitExceptionFunc = () => {
console.log('submit exception');
// 예외 제출 로직
};
const getLastYearDataFunc = () => {
console.log('get last year data');
// 지난연도 데이터 가져오기 로직
};
const submitFunc = () => {
console.log('submit');
// 제출 로직
};
const saveFunc = () => {
console.log('save');
// 저장 로직
};
return (
<>
<SearchForm userMenual={true} />
<div className="flex justify-end items-center gap-[0.6rem] m-[0.6rem]">
<SubmitExceptionButton SubmitExceptionFunc={submitExceptionFunc} />
<LastYearDataButton getLastYearDataFunc={getLastYearDataFunc} />
<SubmitButton submitFunc={submitFunc} />
<SaveButton saveFunc={saveFunc} />
</div>
<TabDataGrid columnInfo={SewerageServiceLevelInpTabList} rowDataMap={rowDataMap} setRowDataMap={setRowDataMap} />
</>
);
};
@@ -0,0 +1,79 @@
import { footerInt, footerDecimal1 } from "@/components/util/grid/footerSummary";
// 하수도 통계 관리 > 13. 하수도 서비스 수준 > tab 1: 민원
export const ComplaintInpColumn = {
columns: [
// 행정구역
{ name: 'SIDO', fieldName: '시도', header: { text: '시도' }, editable: false },
{ name: 'GUGUN', fieldName: '시군구', header: { text: '시군구' }, editable: false, footer: { text: '합계' } },
// 행정코드 (hidden)
{ name: 'ADST_CD', fieldName: '행정구역코드', header: { text: '행정구역코드' }, visible: false },
{ name: 'ADST_DONG', fieldName: '행정구역명', header: { text: '행정구역명' }, visible: false },
// 하수처리인구(명)
{ name: 'SWGE_PROC_POPLTN', fieldName: '하수처리인구(명)', header: { text: '하수처리인구(명)' }, editable: false, footer: footerInt },
// 민원유형(건)
{ name: 'CVPL_CM', fieldName: '총계', header: { text: '총계' }, editable: false, footer: footerInt },
{ name: 'CVPL_BSML', fieldName: '악취', header: { text: '악취' }, footer: footerInt },
{ name: 'CVPL_DCWTR_QLTWTR', fieldName: '하수관로', header: { text: '하수관로' }, footer: footerInt },
{ name: 'CVPL_FIVW', fieldName: '배수설비', header: { text: '배수설비' }, footer: footerInt },
{ name: 'CVPL_POLLUTN_ACDNT', fieldName: '맨홀', header: { text: '맨홀' }, footer: footerInt },
{ name: 'CVPL_SSOS', fieldName: '정화조', header: { text: '정화조' }, footer: footerInt },
{ name: 'CVPL_CHRGE', fieldName: '하수도요금', header: { text: '하수도요금' }, footer: footerInt },
{ name: 'CVPL_UNKD', fieldName: '기타', header: { text: '기타' }, footer: footerInt },
// 기준인구당 민원건수(건/10,000명)
{ name: 'STDR_POPLTN_PER_CVPL', fieldName: '기준인구당민원건수(건/10,000명)', header: { text: '기준인구당민원건수(건/10,000명)' }, editable: false, footer: footerDecimal1 },
// 비고
{ name: 'RMK', fieldName: '비고', header: { text: '비고' } },
// Hidden: 의견 필드
{ name: 'WRTER_OPINION', fieldName: '작성자의견', header: { text: '작성자의견' }, visible: false },
{ name: 'CHCKER_OPINION', fieldName: '검토자의견', header: { text: '검토자의견' }, visible: false },
// Hidden: Check fields : 데이터 변경 여부를 판단하는 필드로, UI에서 숨김 처리
{ name: 'CHK_SWGE_PROC_POPLTN', fieldName: 'CHK_SWGE_PROC_POPLTN', header: { text: 'CHK_SWGE_PROC_POPLTN' }, visible: false },
{ name: 'CHK_CVPL_CM', fieldName: 'CHK_CVPL_CM', header: { text: 'CHK_CVPL_CM' }, visible: false },
{ name: 'CHK_CVPL_BSML', fieldName: 'CHK_CVPL_BSML', header: { text: 'CHK_CVPL_BSML' }, visible: false },
{ name: 'CHK_CVPL_DCWTR_QLTWTR', fieldName: 'CHK_CVPL_DCWTR_QLTWTR', header: { text: 'CHK_CVPL_DCWTR_QLTWTR' }, visible: false },
{ name: 'CHK_CVPL_FIVW', fieldName: 'CHK_CVPL_FIVW', header: { text: 'CHK_CVPL_FIVW' }, visible: false },
{ name: 'CHK_CVPL_POLLUTN_ACDNT', fieldName: 'CHK_CVPL_POLLUTN_ACDNT', header: { text: 'CHK_CVPL_POLLUTN_ACDNT' }, visible: false },
{ name: 'CHK_CVPL_SSOS', fieldName: 'CHK_CVPL_SSOS', header: { text: 'CHK_CVPL_SSOS' }, visible: false },
{ name: 'CHK_CVPL_CHRGE', fieldName: 'CHK_CVPL_CHRGE', header: { text: 'CHK_CVPL_CHRGE' }, visible: false },
{ name: 'CHK_CVPL_UNKD', fieldName: 'CHK_CVPL_UNKD', header: { text: 'CHK_CVPL_UNKD' }, visible: false },
{ name: 'CHK_STDR_POPLTN_PER_CVPL', fieldName: 'CHK_STDR_POPLTN_PER_CVPL', header: { text: 'CHK_STDR_POPLTN_PER_CVPL' }, visible: false },
],
columnLayout: [
{
name: 'group_admin',
header: { text: '행정구역' },
items: ['SIDO', 'GUGUN']
},
'SWGE_PROC_POPLTN',
{
name: 'group_complaint_type',
header: { text: '민원유형(건)' },
items: [
'CVPL_CM',
'CVPL_BSML',
'CVPL_DCWTR_QLTWTR',
'CVPL_FIVW',
'CVPL_POLLUTN_ACDNT',
'CVPL_SSOS',
'CVPL_CHRGE',
'CVPL_UNKD'
]
},
'STDR_POPLTN_PER_CVPL',
'RMK'
],
rowStartNum: 2,
fixedColumns: 1,
tabKey: 'complaintInp',
tabLabel: '민원'
};
@@ -0,0 +1,88 @@
import { footerInt, footerDecimal1 } from "@/components/util/grid/footerSummary";
// 하수도 통계 관리 > 13. 하수도 서비스 수준 > tab 2: 주민친화시설
export const ResidentFriendlyFacilityInpColumn = {
columns: [
// 행정구역
{ name: 'SIDO', fieldName: '시도', header: { text: '시도' }, editable: false },
{ name: 'GUGUN', fieldName: '시군구', header: { text: '시군구' }, editable: false, footer: { text: '합계' } },
// 시설 기본 정보
{ name: 'BSC_FCT_NM', fieldName: '처리장명', header: { text: '처리장명' }, editable: false },
{ name: 'FCT_CPC', fieldName: '시설용량(m³/일)', header: { text: '시설용량(m³/일)' }, editable: false, footer: footerInt },
// 처리장면적(㎡)
{ name: 'PRCPLT_AR', fieldName: '처리장면적(㎡)', header: { text: '처리장면적(㎡)' }, footer: footerDecimal1 },
// 주민친화시설 면적(㎡)
{ name: 'TOTAL_AR', fieldName: '총계', header: { text: '총계' }, editable: false, footer: footerInt },
{ name: 'RESTRM_AR', fieldName: '휴게시설', header: { text: '휴게시설' }, footer: footerInt },
{ name: 'CHILDPLAY_AR', fieldName: '어린이놀이공간', header: { text: '어린이놀이공간' }, footer: footerInt },
{ name: 'ALSFC_AR', fieldName: '체력단련시설', header: { text: '체력단련시설' }, footer: footerInt },
{ name: 'PLGRND_AR', fieldName: '운동시설', header: { text: '운동시설' }, footer: footerInt },
{ name: 'PRKPLCE_AR', fieldName: '주차장', header: { text: '주차장' }, footer: footerInt },
{ name: 'CTLSTT_AR', fieldName: '교육및문화시설', header: { text: '교육및문화시설' }, footer: footerInt },
{ name: 'NRPRK_AR', fieldName: '습지조성(생태공원)', header: { text: '습지조성(생태공원)' }, footer: footerInt },
{ name: 'ETC_AR', fieldName: '기타', header: { text: '기타' }, footer: footerInt },
// 비고
{ name: 'RMK', fieldName: '비고', header: { text: '비고' } },
// Hidden: 시설 정보
{ name: 'STPN_SEQ', fieldName: '싯러일련번호', header: { text: '싯러일련번호' }, visible: false },
{ name: 'ADST_CD', fieldName: '행정동코드', header: { text: '행정동코드' }, visible: false },
{ name: 'BSC_FCT_CD', fieldName: '기초시설코드', header: { text: '기초시설코드' }, visible: false },
// Hidden: 의견 필드
{ name: 'WRTER_OPINION', fieldName: '작성자의견', header: { text: '작성자의견' }, visible: false },
{ name: 'CHCKER_OPINION', fieldName: '검토자의견', header: { text: '검토자의견' }, visible: false },
// Hidden: 활용율 필드
{ name: 'PRCUSE_RT', fieldName: '주민친화시설활용율(%)', header: { text: '주민친화시설활용율(%)' }, visible: false },
// Hidden: Check fields : 데이터 변경 여부를 판단하는 필드로, UI에서 숨김 처리
{ name: 'CHK_PRCPLT_AR', fieldName: 'CHK_PRCPLT_AR', header: { text: 'CHK_PRCPLT_AR' }, visible: false },
{ name: 'CHK_TOTAL_AR', fieldName: 'CHK_TOTAL_AR', header: { text: 'CHK_TOTAL_AR' }, visible: false },
{ name: 'CHK_RESTRM_AR', fieldName: 'CHK_RESTRM_AR', header: { text: 'CHK_RESTRM_AR' }, visible: false },
{ name: 'CHK_CHILDPLAY_AR', fieldName: 'CHK_CHILDPLAY_AR', header: { text: 'CHK_CHILDPLAY_AR' }, visible: false },
{ name: 'CHK_ALSFC_AR', fieldName: 'CHK_ALSFC_AR', header: { text: 'CHK_ALSFC_AR' }, visible: false },
{ name: 'CHK_PLGRND_AR', fieldName: 'CHK_PLGRND_AR', header: { text: 'CHK_PLGRND_AR' }, visible: false },
{ name: 'CHK_PRKPLCE_AR', fieldName: 'CHK_PRKPLCE_AR', header: { text: 'CHK_PRKPLCE_AR' }, visible: false },
{ name: 'CHK_CTLSTT_AR', fieldName: 'CHK_CTLSTT_AR', header: { text: 'CHK_CTLSTT_AR' }, visible: false },
{ name: 'CHK_NRPRK_AR', fieldName: 'CHK_NRPRK_AR', header: { text: 'CHK_NRPRK_AR' }, visible: false },
{ name: 'CHK_ETC_AR', fieldName: 'CHK_ETC_AR', header: { text: 'CHK_ETC_AR' }, visible: false },
{ name: 'CHK_PRCUSE_RT', fieldName: 'CHK_PRCUSE_RT', header: { text: 'CHK_PRCUSE_RT' }, visible: false },
],
columnLayout: [
{
name: 'group_admin',
header: { text: '행정구역' },
items: ['SIDO', 'GUGUN']
},
'BSC_FCT_NM',
'FCT_CPC',
'PRCPLT_AR',
{
name: 'group_resident_friendly_facility',
header: { text: '주민친화시설 면적(㎡)' },
items: [
'TOTAL_AR',
'RESTRM_AR',
'CHILDPLAY_AR',
'ALSFC_AR',
'PLGRND_AR',
'PRKPLCE_AR',
'CTLSTT_AR',
'NRPRK_AR',
'ETC_AR'
]
},
'RMK'
],
rowStartNum: 2,
fixedColumns: 3,
tabKey: 'residentFriendlyFacilityInp',
tabLabel: '주민친화시설'
};