diff --git a/apps/st/src/components/statistics/total/SewerageServiceLevelTot.tsx b/apps/st/src/components/statistics/total/SewerageServiceLevelTot.tsx index 452419dc2..a8e483c1d 100644 --- a/apps/st/src/components/statistics/total/SewerageServiceLevelTot.tsx +++ b/apps/st/src/components/statistics/total/SewerageServiceLevelTot.tsx @@ -1,131 +1,99 @@ import { useRef, useState } from "react"; - import { useAlertStore } from "@/shared/lib"; -import { statisticsTotalStatusApi } from "@/entities/statistics/api/statistics-total-service"; -import { toGridRows } from "@/components/util/grid/gridFunction"; - +import { LoadingWithAnimation, Tabs, TabsContent, TabsList, TabsTrigger } from "@common/components"; import SearchForm from "@/components/module/SearchForm"; import DataGrid from "@/components/module/DataGrid"; -import { LoadingWithAnimation, Tabs, TabsContent, TabsList, TabsTrigger } from "@common/components"; - import type { ColumnInfo } from "@/components/type/DataGrid.type"; import type { SearchFormValues } from "@/components/type/SearchForm.type"; -import { ComplaintInpColumn } from "@/components/util/column/total/sewerageServiceLevel/ComplaintTotColumn"; -import { ResidentFriendlyFactTotColumn } from "@/components/util/column/total/sewerageServiceLevel/ResidentFriendlyFactTotColumn"; +import { toGridRows } from "@/components/util/grid/gridFunction"; +import CellColorInfo from "./CellColorInfo"; -const SewerageServiceLevelInpTabList = [ - ComplaintInpColumn, - ResidentFriendlyFactTotColumn, -]; -const SUPPORTED_TAB_KEYS = [ComplaintInpColumn.tabKey, ResidentFriendlyFactTotColumn.tabKey] as const; +// 13. 하수도서비스수준 컬럼 설정 +import { SewageComplaintTab1ColumnConfig } from "@/components/util/column/total/sewerageServiceLevel/ComplaintTotColumn"; +import { ResidentFriendlyFacilityTab2ColumnConfig } from "@/components/util/column/total/sewerageServiceLevel/ResidentFriendlyFactTotColumn"; + +import { statisticsTotalStatusApi } from "@/entities/statistics/api/statistics-total-service"; +import type { + SewerageServiceLevelRequest, + SewerageServiceLevelComplaintResponse, + SewerageServiceLevelResidentFriendlyFactResponse +} from "@/entities/statistics/model/statistics-total/statistics-service-level-total-interface"; + +const SewageServiceLevelColumnListTot = [ + SewageComplaintTab1ColumnConfig, + ResidentFriendlyFacilityTab2ColumnConfig +].filter(Boolean); + +const firstTabKey = SewageServiceLevelColumnListTot[0]?.tabKey ?? "ST00130001"; const SewerageServiceLevelTot = () => { const { setMessage: alert } = useAlertStore((state) => state); + const [rowDataMap, setRowDataMap] = useState[]>>(new Map()); - const [isLoading, setIsLoading] = useState(false); - const [activeTab, setActiveTab] = useState(ComplaintInpColumn.tabKey); - const lastSearchValuesRef = useRef(null); - - const columnInfo = SewerageServiceLevelInpTabList; + const [isLoading, setIsLoading] = useState(false); + const [activeTab, setActiveTab] = useState(firstTabKey); + const lastSearchedValuesRef = useRef(null); const handleReset = () => { setRowDataMap(new Map()); - setActiveTab(ComplaintInpColumn.tabKey); - lastSearchValuesRef.current = null; + setActiveTab(firstTabKey); + lastSearchedValuesRef.current = null; }; - const loadSewerageServiceLevelTotTabData = async ( - tabKey: string, - values: SearchFormValues, - mergeIntoExistingMap: boolean, - ) => { - const param = { + const loadGridData = async (tabKey: string, values: SearchFormValues): Promise => { + setIsLoading(true); + const param: SewerageServiceLevelRequest = { ctpvNm: values.sido === "ALL" ? "" : values.sido, sggNm: values.gugun === "ALL" ? "" : values.gugun, sewerBzmnCd: values.bsnmCd, statsYr: values.year, rowDataYn: values.isDetail, + summaryYn: values.isSummary !== 'ALL', + summaryYearCnt: values.isSummary !== 'ALL' ? Number(values.isSummary) : undefined }; - const fetcherMap = { - [ComplaintInpColumn.tabKey]: statisticsTotalStatusApi.getSewerageServiceLevelComplaint.bind( - statisticsTotalStatusApi, - ), - [ResidentFriendlyFactTotColumn.tabKey]: - statisticsTotalStatusApi.getSewerageServiceLevelResidentFriendlyFact.bind( - statisticsTotalStatusApi, - ), - }; - const fetcher = fetcherMap[tabKey]; - if (!fetcher) { - return false; - } - const response = await fetcher(param); - - if (response.status === "success" && response.data) { - const rows = toGridRows(response.data as object[]); - if (mergeIntoExistingMap) { - setRowDataMap((prev) => { - const next = new Map(prev); - next.set(tabKey, rows); - return next; - }); - } else { - const next = new Map[]>(); - next.set(tabKey, rows); - setRowDataMap(next); - } - return true; - } - alert(response.message || "데이터 조회 중 오류가 발생했습니다."); - return false; - }; - - const handleSearch = async (values: SearchFormValues) => { try { - setIsLoading(true); - let ok = false; - if (SUPPORTED_TAB_KEYS.includes(activeTab)) { - ok = await loadSewerageServiceLevelTotTabData(activeTab, values, true); - } - if (ok) { - lastSearchValuesRef.current = values; - } else { - lastSearchValuesRef.current = null; + // [TAB1] 민원 + if (tabKey === "ST00130001") { + const response: SewerageServiceLevelComplaintResponse = await statisticsTotalStatusApi.getSewerageServiceLevelComplaint(param); + if (response?.status === "success") { + setRowDataMap((prev) => new Map(prev).set(tabKey, toGridRows(response.data as object[]))); + return true; + } + } + // [TAB2] 주민친화시설 + else if (tabKey === "ST00130002") { + const response: SewerageServiceLevelResidentFriendlyFactResponse = await statisticsTotalStatusApi.getSewerageServiceLevelResidentFriendlyFact(param); + if (response?.status === "success") { + setRowDataMap((prev) => new Map(prev).set(tabKey, toGridRows(response.data as object[]))); + return true; + } } + return false; } catch { - alert("데이터 조회 중 오류가 발생했습니다."); - lastSearchValuesRef.current = null; + alert("서버 연결 중 오류가 발생했습니다."); + return false; } finally { setIsLoading(false); } }; + const handleSearch = async (values: SearchFormValues) => { + lastSearchedValuesRef.current = values; + await loadGridData(activeTab, values); + }; + const handleActiveTabChange = async (tabKey: string) => { setActiveTab(tabKey); - - const values = lastSearchValuesRef.current; - if (!values) return; - - const existing = rowDataMap.get(tabKey); - const hasData = Array.isArray(existing) && existing.length > 0; - if (hasData) return; - - if (SUPPORTED_TAB_KEYS.includes(tabKey)) { - try { - setIsLoading(true); - await loadSewerageServiceLevelTotTabData(tabKey, values, true); - } catch { - alert("데이터 조회 중 오류가 발생했습니다."); - } finally { - setIsLoading(false); - } - } + const values = lastSearchedValuesRef.current; + if (!values || rowDataMap.has(tabKey)) return; + await loadGridData(tabKey, values); }; return (
- + + {isLoading && (
@@ -133,58 +101,48 @@ const SewerageServiceLevelTot = () => {
)} + + +
void handleActiveTabChange(v)} className="w-full" variant="default"> - {columnInfo.map((info) => ( - - {info.tabLabel || info.tabKey} - + {SewageServiceLevelColumnListTot.map((info) => ( + {info.tabLabel} ))} - {columnInfo.map((info) => { - const tabKey = info.tabKey; - if (!info.columns || !info.columnLayout) { - return null; - } - - const rowData = rowDataMap.get(tabKey) ?? []; - const gridColumnInfo: ColumnInfo = { - columns: info.columns, - columnLayout: info.columnLayout, - }; - - return ( - - { - setRowDataMap((prev) => { - const next = new Map(prev); - const cur = next.get(tabKey) ?? []; - const n = typeof updater === "function" ? updater(cur) : updater; - next.set(tabKey, n); - return next; - }); - }} - isExcelImport={false} - isExcelExport - showHeaderCheckbox={false} - fixedColumns={info.fixedColumns} - enableSort={false} - cellStyleCallback={({ row }) => { - const rowType = String(row.rowType ?? ""); - if (rowType === "DETAIL") return undefined; - if (rowType === "BIZ_SUM") return "rg-cell-rowtype-biz-sum"; - return "rg-cell-rowtype-other"; - }} - /> - - ); - })} + + {SewageServiceLevelColumnListTot.map((info) => ( + + { + setRowDataMap((prev) => { + const next = new Map(prev); + const cur = next.get(info.tabKey) ?? []; + const n = typeof updater === "function" ? updater(cur) : updater; + next.set(info.tabKey, n); + return next; + }); + }} + isExcelImport={false} + isExcelExport={true} + showHeaderCheckbox={false} + fixedColumns={info.fixedColumns} + enableSort={false} + cellStyleCallback={({ row }) => { + const rowType = String(row.rowType ?? ''); + if (rowType === 'DETAIL') return undefined; + if (rowType === 'BIZ_SUM') return 'rg-cell-rowtype-biz-sum'; + if (rowType === 'SUMMARY') return 'rg-cell-rowtype-summary'; + return 'rg-cell-rowtype-other'; + }} + /> + + ))}
diff --git a/apps/st/src/components/util/column/total/sewerageServiceLevel/ComplaintTotColumn.ts b/apps/st/src/components/util/column/total/sewerageServiceLevel/ComplaintTotColumn.ts index 8ed48c355..3d06e995a 100644 --- a/apps/st/src/components/util/column/total/sewerageServiceLevel/ComplaintTotColumn.ts +++ b/apps/st/src/components/util/column/total/sewerageServiceLevel/ComplaintTotColumn.ts @@ -1,77 +1,36 @@ import { ValueType } from "realgrid"; -// 하수도 통계 관리 > 13. 하수도 서비스 수준 > tab 1: 민원 -export const ComplaintInpColumn = { - columns: [ - { name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" } }, - { name: "sggNm", fieldName: "sggNm", header: { text: "시군구" } }, - { name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" } }, - { - name: "swtrmtPpltnCnt", - fieldName: "swtrmtPpltnCnt", - header: { text: "하수처리장민원건수(건)" }, - valueType: ValueType.NUMBER, - dataFormat: "#,##0", - }, - { - name: "whol", - fieldName: "whol", - header: { text: "합계" }, - valueType: ValueType.NUMBER, - dataFormat: "#,##0", - }, - { name: "odorCnt", fieldName: "odorCnt", header: { text: "악취" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "swagePplCnt", fieldName: "swagePplCnt", header: { text: "하수관거" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "dschgWqCnt", fieldName: "dschgWqCnt", header: { text: "방류수수질" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "ldsCnt", fieldName: "ldsCnt", header: { text: "퇴적토" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "plltnAcdntCnt", fieldName: "plltnAcdntCnt", header: { text: "오염사고" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "sewerCrgAmt", fieldName: "sewerCrgAmt", header: { text: "하수도요금" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "etcCnt", fieldName: "etcCnt", header: { text: "기타" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { - name: "crtrPpltnCvlcptEvntcsCnt", - fieldName: "crtrPpltnCvlcptEvntcsCnt", - header: { text: "인구10만명당 민원건수(건)" }, - valueType: ValueType.NUMBER, - dataFormat: "#,##0.00", - }, - { name: "rmrk", fieldName: "rmrk", header: { text: "비고" } }, - { name: "statsYr", fieldName: "statsYr", header: { text: "통계연도" }, visible: false }, - { name: "admdstCd", fieldName: "admdstCd", header: { text: "행정코드" }, visible: false }, - { name: "rowType", fieldName: "rowType", header: { text: "행타입" }, visible: false }, - ].map((col) => ({ ...col, editable: false })), - - columnLayout: [ - { - name: "groupA", - hideChildHeaders: false, - header: { text: "행정구역" }, - items: ["ctpvNm", "sggNm", "admdstNm"], - }, - { - name: "groupB", - hideChildHeaders: false, - header: { text: "민원건수(건)" }, - items: [ - "whol", - "odorCnt", - "swagePplCnt", - "dschgWqCnt", - "ldsCnt", - "plltnAcdntCnt", - "sewerCrgAmt", - "etcCnt", - ], - }, - "swtrmtPpltnCnt", - "crtrPpltnCvlcptEvntcsCnt", - "rmrk", - "statsYr", - "admdstCd", - "rowType", - ], - - rowStartNum: 2, - fixedColumns: 1, +export const SewageComplaintTab1ColumnConfig = { tabKey: "ST00130001", tabLabel: "민원", + rowStartNum: 3, // 행정구역 3단 헤더 + fixedColumns: 1, + columns: [ + { name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" }, editable: false }, + { name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false }, + { name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" }, editable: false }, + { name: "swtrmtPpltnCnt", fieldName: "swtrmtPpltnCnt", header: { text: "하수처리인구\n(명)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + + // 민원유형 + { name: "whol", fieldName: "whol", header: { text: "총계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "odorCnt", fieldName: "odorCnt", header: { text: "악취" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "swagePplCnt", fieldName: "swagePplCnt", header: { text: "하수관로" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "dschgWqCnt", fieldName: "dschgWqCnt", header: { text: "배수설비" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "ldsCnt", fieldName: "ldsCnt", header: { text: "맨홀" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "plltnAcdntCnt", fieldName: "plltnAcdntCnt", header: { text: "정화조" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "sewerCrgAmt", fieldName: "sewerCrgAmt", header: { text: "하수도요금" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "etcCnt", fieldName: "etcCnt", header: { text: "기타" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + + { name: "crtrPpltnCvlcptEvntcsCnt", fieldName: "crtrPpltnCvlcptEvntcsCnt", header: { text: "기준인구당\n민원건수\n(건/10,000명)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.00", editable: false } + ], + columnLayout: [ + { name: "areaGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] }, + "swtrmtPpltnCnt", + { + name: "complaintGroup", + header: { text: "민원유형(건)" }, + items: ["whol", "odorCnt", "swagePplCnt", "dschgWqCnt", "ldsCnt", "plltnAcdntCnt", "sewerCrgAmt", "etcCnt"] + }, + "crtrPpltnCvlcptEvntcsCnt" + ] }; \ No newline at end of file diff --git a/apps/st/src/components/util/column/total/sewerageServiceLevel/ResidentFriendlyFactTotColumn.ts b/apps/st/src/components/util/column/total/sewerageServiceLevel/ResidentFriendlyFactTotColumn.ts index 1a121f49d..82890e8b9 100644 --- a/apps/st/src/components/util/column/total/sewerageServiceLevel/ResidentFriendlyFactTotColumn.ts +++ b/apps/st/src/components/util/column/total/sewerageServiceLevel/ResidentFriendlyFactTotColumn.ts @@ -1,81 +1,34 @@ import { ValueType } from "realgrid"; -// 하수도 통계 관리 > 13. 하수도 서비스 수준 > tab 2: 주민친화시설 -export const ResidentFriendlyFactTotColumn = { - columns: [ - { name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" } }, - { name: "sggNm", fieldName: "sggNm", header: { text: "시군구" } }, - { name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" } }, - { name: "swtrmtFcltNm", fieldName: "swtrmtFcltNm", header: { text: "처리장명" } }, - { - name: "fcltCpct", - fieldName: "fcltCpct", - header: { text: "시설용량(m³/일)" }, - valueType: ValueType.NUMBER, - dataFormat: "#,##0", - }, - { - name: "tmplntArea", - fieldName: "tmplntArea", - header: { text: "처리장면적(㎡)" }, - valueType: ValueType.NUMBER, - dataFormat: "#,##0.00", - }, - { - name: "whol", - fieldName: "whol", - header: { text: "총계" }, - valueType: ValueType.NUMBER, - dataFormat: "#,##0", - }, - { name: "brkFcltArea", fieldName: "brkFcltArea", header: { text: "휴게시설" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "childFrshpSpacArea", fieldName: "childFrshpSpacArea", header: { text: "어린이놀이공간" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "bdySportsFcltArea", fieldName: "bdySportsFcltArea", header: { text: "체력단련시설" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "sportsFcltArea", fieldName: "sportsFcltArea", header: { text: "운동시설" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "pkltArea", fieldName: "pkltArea", header: { text: "주차장" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "eduMultiFcltArea", fieldName: "eduMultiFcltArea", header: { text: "교육 및 문화시설" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "wtlndMakeArea", fieldName: "wtlndMakeArea", header: { text: "습지조성(생태공원)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "etcCnt", fieldName: "etcCnt", header: { text: "기타" }, valueType: ValueType.NUMBER, dataFormat: "#,##0" }, - { name: "rmrk", fieldName: "rmrk", header: { text: "비고" } }, - { name: "statsYr", fieldName: "statsYr", header: { text: "통계연도" }, visible: false }, - { name: "admdstCd", fieldName: "admdstCd", header: { text: "행정코드" }, visible: false }, - { name: "rowType", fieldName: "rowType", header: { text: "행타입" }, visible: false }, - ].map((col) => ({ ...col, editable: false })), - - columnLayout: [ - { - name: "groupA", - hideChildHeaders: false, - header: { text: "행정구역" }, - items: ["ctpvNm", "sggNm", "admdstNm"], - }, - "swtrmtFcltNm", - "fcltCpct", - "tmplntArea", - { - name: "groupB", - hideChildHeaders: false, - header: { text: "주민친화시설 면적(㎡)" }, - items: [ - "whol", - "brkFcltArea", - "childFrshpSpacArea", - "bdySportsFcltArea", - "sportsFcltArea", - "pkltArea", - "eduMultiFcltArea", - "wtlndMakeArea", - "etcCnt", - ], - }, - "rmrk", - "statsYr", - "admdstCd", - "rowType", - ], - - rowStartNum: 2, - fixedColumns: 3, +export const ResidentFriendlyFacilityTab2ColumnConfig = { tabKey: "ST00130002", tabLabel: "주민친화시설", + rowStartNum: 3, // 행정구역 3단 헤더 + fixedColumns: 1, + columns: [ + { name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" }, editable: false }, + { name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false }, + { name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" }, editable: false }, + { name: "swtrmtFcltNm", fieldName: "swtrmtFcltNm", header: { text: "처리장명" }, editable: false }, + { name: "tmplntArea", fieldName: "tmplntArea", header: { text: "처리장\n면적(㎡)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + // 주민친화시설 면적 + { name: "whol", fieldName: "whol", header: { text: "총계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "brkFcltArea", fieldName: "brkFcltArea", header: { text: "휴게시설" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "childFrshpSpacArea", fieldName: "childFrshpSpacArea", header: { text: "어린이놀이공간" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "bdySportsFcltArea", fieldName: "bdySportsFcltArea", header: { text: "체력단련시설" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "sportsFcltArea", fieldName: "sportsFcltArea", header: { text: "운동시설" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "pkltArea", fieldName: "pkltArea", header: { text: "주차장" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "eduMultiFcltArea", fieldName: "eduMultiFcltArea", header: { text: "교육 및\n문화시설" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "wtlndMakeArea", fieldName: "wtlndMakeArea", header: { text: "습지조성\n(생태공원)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "etcCnt", fieldName: "etcCnt", header: { text: "기타" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false } + ], + columnLayout: [ + { name: "areaGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] }, + "swtrmtFcltNm", "tmplntArea", + { + name: "facilityGroup", + header: { text: "주민친화시설 면적(㎡)" }, + items: ["whol", "brkFcltArea", "childFrshpSpacArea", "bdySportsFcltArea", "sportsFcltArea", "pkltArea", "eduMultiFcltArea", "wtlndMakeArea", "etcCnt"] + } + ] }; \ No newline at end of file diff --git a/apps/st/src/entities/statistics/api/statistics-total-service.ts b/apps/st/src/entities/statistics/api/statistics-total-service.ts index e5efbb39b..be7f839b9 100644 --- a/apps/st/src/entities/statistics/api/statistics-total-service.ts +++ b/apps/st/src/entities/statistics/api/statistics-total-service.ts @@ -23,6 +23,62 @@ import type { import type { PublicSewageInquirySummaryResponse } from "../model/statistics-total/statistics-sewage-public-total-interface"; +import type { + SewerReservoirMaintainTotalRequest, + SewerReservoirStatusTotalResponse, + SewerPumpStationStatusTotalResponse +} from "../model/statistics-total/statistics-sewage-reservoir-total-interface"; + +import type { + MediationPumpMaintainTotalRequest, + MediationPumpStatusTotalResponse +} from "../model/statistics-total/statistics-mediation-pump-total-interface"; + +import type { + ExcretaTreatmentMaintainTotalRequest, + ExcretaTreatmentStatusTotalResponse +} from "../model/statistics-total/statistics-excreta-treatment-total-interface"; + + +import type { + PrivateSewageFacilitySummaryRequest, + PrivateSewageTab1Response, + PrivateSewageTab2Response, + PrivateSewageTab3Response +} from "../model/statistics-total/statistics-private-sewage-total-interface"; + +import type { + SewerageFinanceSummaryRequest, + SewerageFinanceSettlementResponse, + SewerageFeeResponse, + SewerageUsageFeeResponse, + SewerageOrgCauseResponse +} from "../model/statistics-total/statistics-sewerage-finance-total-interface"; + +import type { + WaterReuseSummaryRequest, + SewerageReuseStatusTab1Response, + GrayWaterStatusTab2Response, + RainwaterUtilizationStatusTab3Response, + SewageWwtRtlztnRegStatusTab4Response, + SewageWwtRtlztnSncnStatusTab5Response +} from "../model/statistics-total/statistics-sewerage-reuse-total-interface"; + +import type { + SludgeSummaryRequest, + SludgeProcessingTab1Response, + DigestionTankOperTab2Response, + SewageSludgeOperTab3Response, + HumanWasteSludgeTab4Response +} from "../model/statistics-total/statistics-sludge-total-interface"; + +import type { + SewerageIndustry, + PublicSewageStaffTab1Response, + PublicHumanWasteStaffTab2Response, + HumanWasteCollectionTab3Response, + IndividualSewageTab4Response +} from "../model/statistics-total/statistics-sewerage-industry-interface"; export class StatisticsTotalApiService { @@ -42,21 +98,6 @@ export class StatisticsTotalApiService { return response.data; } - public async getSewerageServiceLevelComplaint(params: SewerageServiceLevelRequest): Promise { - const response = await stClient.get ( - `${ENDPOINT.ST_SERVICE.TOTAL}/sewage-complaint`, - { params: params } - ); - return response.data; - } - - public async getSewerageServiceLevelResidentFriendlyFact(params: SewerageServiceLevelRequest): Promise { - const response = await stClient.get ( - `${ENDPOINT.ST_SERVICE.TOTAL}/resident-friendly-facility`, - { params: params } - ); - return response.data; - } public async getSewagePipeFactInstallStatus( params: SewagePipeTotalRequest, @@ -122,7 +163,40 @@ export class StatisticsTotalApiService { return response.data; } - /** ST00060001 —공공하수처리시설 */ + /** ★ ST00040001 — 하수저류시설 현황(합계) API */ + public async getSewerReservoirStatusTotalList( + params: SewerReservoirMaintainTotalRequest, + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/sewer-reservoir-pump/reservoir-status`, + { params }, + ); + return response.data; + } + + /** ★ ST00040002 — 빗물펌프장 현황(합계) API */ + public async getSewerPumpStationStatusTotalList( + params: SewerReservoirMaintainTotalRequest, + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/sewer-reservoir-pump/pump-station-status`, + { params }, + ); + return response.data; + } + + /** ST00050001 — 중계펌프장 현황(합계) API */ + public async getMediationPumpStationStatusTotalList( + params: MediationPumpMaintainTotalRequest, + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/pump-station-status`, + { params }, + ); + return response.data; + } + /** + * ST00060001 —공공하수처리시설 */ public async getSewagePublicFacillityTotal( params: SewagePipeMaintainTotalRequest, ): Promise { @@ -132,6 +206,229 @@ export class StatisticsTotalApiService { ); return response.data; } -} + + + /** ST00070001 — 분뇨처리시설 현황(합계) API */ + public async getExcretaTreatmentStatusTotalList( + params: ExcretaTreatmentMaintainTotalRequest, + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/excreta-treatment-status`, + { params }, + ); + return response.data; + } + + /** ST00080001 — 개인하수처리시설 > 처리용량별 오수처리시설(Tab1) */ + public async getPrivateSewageTab1List( + params: PrivateSewageFacilitySummaryRequest, + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/private-sevage`, + { params }, + ); + return response.data; + } + + /** ST00080002 — 개인하수처리시설 > 정화조현황(Tab2) */ + public async getPrivateSewageTab2List( + params: PrivateSewageFacilitySummaryRequest, + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/private-tank-status`, + { params }, + ); + return response.data; + } + + /** ST00080003 — 개인하수처리시설 > 개인하수도 관리지역 지정공고 현황(Tab3) */ + public async getPrivatePrivateMgmtAreaList( + params: PrivateSewageFacilitySummaryRequest, + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/private-mgmt-area`, + { params }, + ); + return response.data; + } + + /** ST00090001 — 하수도 재정결산 조회(Tab1) */ + public async getSewerageFinancialList(params: SewerageFinanceSummaryRequest): Promise { + const response = await stClient.get(`${ENDPOINT.ST_SERVICE.TOTAL}/sewerage-financial`, { params }); + return response.data; + } + + /** ST00090002 — 하수도 요금 조회(Tab2) */ + public async getSewerageFeeList(params: SewerageFinanceSummaryRequest): Promise { + const response = await stClient.get(`${ENDPOINT.ST_SERVICE.TOTAL}/sewerage-fee`, { params }); + return response.data; + } + + /** ST00090003 — 하수도 사용료 조회(Tab3) */ + public async getSewerageUsageList(params: SewerageFinanceSummaryRequest): Promise { + const response = await stClient.get(`${ENDPOINT.ST_SERVICE.TOTAL}/sewerage-usage`, { params }); + return response.data; + } + + /** ST00090004 — 원인자 부담금 조회(Tab4) */ + public async getSewerageOrgCauseList(params: SewerageFinanceSummaryRequest): Promise { + const response = await stClient.get(`${ENDPOINT.ST_SERVICE.TOTAL}/sewerage-org-cause`, { params }); + return response.data; + } + + /** ST00100001 — 물재이용 > 공공하수처리수 재이용 현황 조회(Tab1) */ + public async getSewerageReuseTab1List( + params: WaterReuseSummaryRequest, + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/pbl-swage-ruswt`, + { params }, + ); + return response.data; + } + /** + * ST00100002 — 물재이용 > TAB2 중수도 현황 조회 + */ + async getGrayWaterStatusTab2List( + params: WaterReuseSummaryRequest + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/gray-water-status`, + { params }, + ); + return response.data; + + } + /** ★ ST00100003 — 물재이용 > TAB3 빗물이용시설현황 조회 */ + async getRainwaterStatusTab3List(params: WaterReuseSummaryRequest): Promise { + const response = await stClient.get(`${ENDPOINT.ST_SERVICE.TOTAL}/water-reuse`, { params }); + return response.data; + } + + /** ★ ST00100004 — 물재이용 > TAB4 하·폐수처리수 재이용시설 시공업 등록현황 조회 */ + async getWwtRtlztnRegStatusTab4List(params: WaterReuseSummaryRequest): Promise { + const response = await stClient.get(`${ENDPOINT.ST_SERVICE.TOTAL}/wwt-rtlztn-reg`, { params }); + return response.data; + } + + /** ★ ST00100005 — 물재이용 > TAB5 하·폐수처리수 재이용시설 시공업 인가현황 조회 */ + async getWwtRtlztnSncnStatusTab5List(params: WaterReuseSummaryRequest): Promise { + const response = await stClient.get(`${ENDPOINT.ST_SERVICE.TOTAL}/wwt-rtlztn-aprv`, { params }); + return response.data; + } + + /** + * ST00110001 — 하수및분뇨찌꺼기 > TAB1 찌꺼기처리시설현황 조회 + */ + async getSludgeProcessingTab1List( + params: SludgeSummaryRequest + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/sludge-processing`, + { params }, + ); + return response.data; + } + /** + * ST00110002 — 하수및분뇨찌꺼기 > TAB2 소화조 운영현황 조회 + */ + async getSludgeTab2List( + params: SludgeSummaryRequest + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/sludge-digestion-tank`, + { params }, + ); + return response.data; + } + + /** + * ST00110003 — 하수및분뇨찌꺼기 > TAB3 하수찌꺼기 처리시설 운영현황 조회 + */ + async getSludgeTab3List( + params: SludgeSummaryRequest + ): Promise { + // 제네릭을 추가하여 unknown 에러를 해결합니다. + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/sludge-facility-oper`, + { params } + ); + return response.data; + } + + /** + * ST00110004 — 하수및분뇨찌꺼기 > TAB4 분뇨찌꺼기(슬러지)처리현황 + */ + async getSludgeTab4List( + params: SludgeSummaryRequest + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/sludge-human-waste`, + { params }, + ); + return response.data; + } + + /** ST00120001[TAB1] 공공기관 하수분야 조회 */ + async getPublicSewageStaffTab1List( + params: SewerageIndustry + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/public-sewage-staff`, + { params } + ); + return response.data; + } + /** ST00120002[TAB2] 공공기관 분뇨분야 조회 */ + async getPublicHumanWasteStaffTab2List( + params: SewerageIndustry + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/public-human-waste-staff`, + { params } + ); + return response.data; + } + + /** [TAB3] 분뇨수집·운반업 조회 */ + async getHumanWasteCollectionTab3List( + params: SewerageIndustry + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/human-waste-collection`, + { params } + ); + return response.data; + } + + /** [TAB4] 개인하수처리관련업 조회 */ + async getIndividualSewageTab4List( + params: SewerageIndustry + ): Promise { + const response = await stClient.get( + `${ENDPOINT.ST_SERVICE.TOTAL}/indv-swtrmt-rel-bsns`, + { params } + ); + return response.data; + } + + /** [TAB1] 하수도서비스수준 - 민원 조회 */ + public async getSewerageServiceLevelComplaint(params: SewerageServiceLevelRequest): Promise { + const response = await stClient.get ( + `${ENDPOINT.ST_SERVICE.TOTAL}/sewage-complaint`, + { params: params } + ); + return response.data; + } + /** [TAB1] 하수도서비스수준 - 주민친화시설 조회 */ + public async getSewerageServiceLevelResidentFriendlyFact(params: SewerageServiceLevelRequest): Promise { + const response = await stClient.get ( + `${ENDPOINT.ST_SERVICE.TOTAL}/resident-friendly-facility`, + { params: params } + ); + return response.data; + } + } + export const statisticsTotalStatusApi = new StatisticsTotalApiService(); \ No newline at end of file diff --git a/apps/st/src/entities/statistics/model/statistics-total/statistics-service-level-total-interface.ts b/apps/st/src/entities/statistics/model/statistics-total/statistics-service-level-total-interface.ts index 49dd44a63..95a408ca4 100644 --- a/apps/st/src/entities/statistics/model/statistics-total/statistics-service-level-total-interface.ts +++ b/apps/st/src/entities/statistics/model/statistics-total/statistics-service-level-total-interface.ts @@ -4,14 +4,16 @@ export interface SewerageServiceLevelRequest { statsYr?: string; sewerBzmnCd?: string; rowDataYn?: boolean; + summaryYn?: boolean; + summaryYearCnt?: number; } -export interface SewerageServiceLevelComplaintTotalItem { +export interface SewageComplaintSummaryItem { statsYr: string; ctpvNm: string; - sggNm: string | null; - admdstCd: string; + sggNm: string; admdstNm: string; + admdstCd: string; rowType: string; swtrmtPpltnCnt: number; whol: number; @@ -23,24 +25,22 @@ export interface SewerageServiceLevelComplaintTotalItem { sewerCrgAmt: number; etcCnt: number; crtrPpltnCvlcptEvntcsCnt: number; - rmrk: string | null; } export interface SewerageServiceLevelComplaintResponse { status: string; message?: string; - data: SewerageServiceLevelComplaintTotalItem[]; + data: SewageComplaintSummaryItem[]; } export interface SewerageServiceLevelResidentFriendlyFactTotalItem { - statsYr: string; + statsYr: string; ctpvNm: string; sggNm: string; - admdstCd: string; admdstNm: string; + admdstCd: string; rowType: string; swtrmtFcltNm: string; - fcltCpct: number; tmplntArea: number; whol: number; brkFcltArea: number; @@ -51,7 +51,6 @@ export interface SewerageServiceLevelResidentFriendlyFactTotalItem { eduMultiFcltArea: number; wtlndMakeArea: number; etcCnt: number; - rmrk: string; } export interface SewerageServiceLevelResidentFriendlyFactResponse {