From 5580b4301f36f6b0b6abbbafd77f8590152d73d2 Mon Sep 17 00:00:00 2001 From: yangsein Date: Fri, 3 Jul 2026 13:02:40 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[feat]=EC=A7=91=EA=B3=84=2011=EB=B6=84?= =?UTF-8?q?=EB=87=A8=EC=B0=8C=EA=BA=BC=EA=B8=B0=20tab2=20=EC=86=8C?= =?UTF-8?q?=ED=99=94=EC=A1=B0=20=EC=BB=AC=EB=9F=BC=20=EB=A7=A4=ED=95=91=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DigestionTankTab2Column.ts | 50 ++++++++++--------- .../statistics-sludge-total-interface.ts | 29 +++++------ 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/apps/st/src/components/util/column/total/sludgeProcessing/DigestionTankTab2Column.ts b/apps/st/src/components/util/column/total/sludgeProcessing/DigestionTankTab2Column.ts index 65b1c50bc..06d7f7f17 100644 --- a/apps/st/src/components/util/column/total/sludgeProcessing/DigestionTankTab2Column.ts +++ b/apps/st/src/components/util/column/total/sludgeProcessing/DigestionTankTab2Column.ts @@ -9,34 +9,36 @@ export const DigestionTankTab2ColumnConfig = { { 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: "fcltNm", fieldName: "fcltNm", header: { text: "하수\n처리장명" }, editable: false }, - - { name: "digesterYn", fieldName: "digesterYn", header: { text: "소화조 유/무\n(Y/N)선택" }, editable: false }, - { name: "dsgnCpct", fieldName: "dsgnCpct", header: { text: "설계\n용량(㎥)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, - { name: "actlOperCpct", fieldName: "actlOperCpct", header: { text: "실제운전\n용량(㎥)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, - { name: "inputQnt", fieldName: "inputQnt", header: { text: "투입량\n(㎥/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, - { name: "tsConc", fieldName: "tsConc", header: { text: "투입 TS 농도\n(%)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, - { name: "oprtngDays", fieldName: "oprtngDays", header: { text: "가동일수\n(연간)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, - { name: "gnrtGasQnt", fieldName: "gnrtGasQnt", header: { text: "발생가스량\n(㎥/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, - + { name: "swtrmtFcltNm", fieldName: "swtrmtFcltNm", header: { text: "하수\n처리장명" }, editable: false }, + + { name: "digstnEnYn", fieldName: "digstnEnYn", header: { text: "소화조 유/무\n(Y/N)선택" }, editable: false }, + { name: "digstnCpct", fieldName: "digstnCpct", header: { text: "설계\n용량(㎥)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "actlDrvnCpct", fieldName: "actlDrvnCpct", header: { text: "실제운전\n용량(㎥)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "digstnGasInputQnt", fieldName: "digstnGasInputQnt", header: { text: "투입량\n(㎥/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "digstnGasInputSldDnst", fieldName: "digstnGasInputSldDnst", header: { text: "투입 TS 농도\n(%)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "digstnTnkOprtngDayCnt", fieldName: "digstnTnkOprtngDayCnt", header: { text: "가동일수\n(연간)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "ocrnGasQnt", fieldName: "ocrnGasQnt", header: { text: "발생가스량\n(㎥/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + // 소화가스 이용현황(하위 항목) - { name: "gasTotal", fieldName: "gasTotal", header: { text: "계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, - { name: "gasSale", fieldName: "gasSale", header: { text: "판매" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, - { name: "gasGen", fieldName: "gasGen", header: { text: "발전" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, - { name: "gasSelf", fieldName: "gasSelf", header: { text: "자체활용" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, - { name: "gasEtc", fieldName: "gasEtc", header: { text: "기타(CNG등)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, - - { name: "surplusGas", fieldName: "surplusGas", header: { text: "잉여가스량\n(㎥/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false } + { name: "digstnGasUtztnWholPrst", fieldName: "digstnGasUtztnWholPrst", header: { text: "계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "digstnGasUtztnNtslQnt", fieldName: "digstnGasUtztnNtslQnt", header: { text: "판매" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "digstnGasUtztnEtgtQnt", fieldName: "digstnGasUtztnEtgtQnt", header: { text: "발전" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "digstnGasUtztnItslfQnt", fieldName: "digstnGasUtztnItslfQnt", header: { text: "자체활용" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "digstnGasUtztnEtcQnt", fieldName: "digstnGasUtztnEtcQnt", header: { text: "기타(CNG등)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + + { name: "surplsGasQnt", fieldName: "surplsGasQnt", header: { text: "잉여가스량\n(㎥/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false } ], columnLayout: [ { name: "areaGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] }, - "fcltNm", - { name: "operGroup", header: { text: "소화조 운영현황" }, items: ["digesterYn", "dsgnCpct", "actlOperCpct", "inputQnt", "tsConc", "oprtngDays", "gnrtGasQnt", - { - name: "gasUsageGroup", - header: { text: "소화가스 이용현황(㎥/일)" }, - items: ["gasTotal", "gasSale", "gasGen", "gasSelf", "gasEtc"] - },"surplusGas" + "swtrmtFcltNm", + { name: "operGroup", header: { text: "소화조 운영현황" }, items: [ + "digstnEnYn", "digstnCpct", "actlDrvnCpct", "digstnGasInputQnt", "digstnGasInputSldDnst", "digstnTnkOprtngDayCnt", "ocrnGasQnt", + { + name: "gasUsageGroup", + header: { text: "소화가스 이용현황(㎥/일)" }, + items: ["digstnGasUtztnWholPrst", "digstnGasUtztnNtslQnt", "digstnGasUtztnEtgtQnt", "digstnGasUtztnItslfQnt", "digstnGasUtztnEtcQnt"] + }, + "surplsGasQnt" ] }, ] }; \ No newline at end of file diff --git a/apps/st/src/entities/statistics/model/statistics-total/statistics-sludge-total-interface.ts b/apps/st/src/entities/statistics/model/statistics-total/statistics-sludge-total-interface.ts index bae596f83..0f5229385 100644 --- a/apps/st/src/entities/statistics/model/statistics-total/statistics-sludge-total-interface.ts +++ b/apps/st/src/entities/statistics/model/statistics-total/statistics-sludge-total-interface.ts @@ -101,21 +101,22 @@ export interface DigestionTankOperStatusTotalItem { ctpvNm: string; sggNm: string; admdstNm: string; + admdstCd: string; rowType: string; - fcltNm: string; - digesterYn: string; - dsgnCpct: number; - actlOperCpct: number; - inputQnt: number; - tsConc: number; - oprtngDays: number; - gnrtGasQnt: number; - gasTotal: number; - gasSale: number; - gasGen: number; - gasSelf: number; - gasEtc: number; - surplusGas: number; + swtrmtFcltNm: string; + digstnEnYn: string; + digstnCpct: number; + actlDrvnCpct: number; + digstnGasInputQnt: number; + digstnGasInputSldDnst: number; + digstnTnkOprtngDayCnt: number; + ocrnGasQnt: number; + digstnGasUtztnWholPrst: number; + digstnGasUtztnNtslQnt: number; + digstnGasUtztnEtgtQnt: number; + digstnGasUtztnItslfQnt: number; + digstnGasUtztnEtcQnt: number; + surplsGasQnt: number; } export interface DigestionTankOperTab2Response { status: string; message?: string; data: DigestionTankOperStatusTotalItem[]; } From afcfbbbf615521cb52345f171661154dd2062818 Mon Sep 17 00:00:00 2001 From: yangsein Date: Fri, 3 Jul 2026 16:15:34 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EC=A7=91=EA=B3=84=ED=91=9C=20?= =?UTF-8?q?=EB=B9=84=EA=B3=A0=20=EC=A0=9C=EA=B1=B0=20,=20=ED=96=89?= =?UTF-8?q?=EC=A0=95=EB=8F=99=20=EC=9D=B8=EA=B5=AC=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0=20=EB=B2=84=ED=8A=BC=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../management/AdmdstRenewalTab.tsx | 11 +++++++++- .../management/hooks/useAdmdstRenewalTab.ts | 20 ++++++++++++++----- .../util/column/total/SewagePipeTotColumn.ts | 5 +---- .../total/SeweragePentrationRateTotColumn.ts | 8 ++------ .../SewerPrivateSewageTab2Column.ts | 2 +- .../api/statistics-ppltn-service.ts | 8 ++++++++ 6 files changed, 37 insertions(+), 17 deletions(-) diff --git a/apps/st/src/components/statistics/management/AdmdstRenewalTab.tsx b/apps/st/src/components/statistics/management/AdmdstRenewalTab.tsx index e125ab3be..8e8aba373 100644 --- a/apps/st/src/components/statistics/management/AdmdstRenewalTab.tsx +++ b/apps/st/src/components/statistics/management/AdmdstRenewalTab.tsx @@ -55,7 +55,16 @@ const AdmdstRenewalTab = ({ tab, statsYr }: Props) => { 추가된 행정구역 자료 -
+
+ + + + { + if (!newDate) return; + onChange(newDate); + setOpen(false); + }} + /> + + +
+ ); +}; const getSidoListFetcher = async (): Promise> => { return statisticsApi.getSidoList(); @@ -63,13 +153,45 @@ const LogHistory = () => { string, string | number > | null>(null); - const [startDate, setStartDate] = useState(() => + const [startDate, setStartDate] = useState(() => dayjs().subtract(1, "month").startOf("day").toDate(), ); - const [endDate, setEndDate] = useState(() => + const [endDate, setEndDate] = useState(() => dayjs().endOf("day").toDate(), ); + const handleStartDateChange = (date: Date) => { + const next = dayjs(date).startOf("day"); + const end = dayjs(endDate).startOf("day"); + + if (next.isAfter(end, "day")) { + alert("시작일은 종료일보다 늦을 수 없습니다."); + return; + } + if (next.isBefore(end.subtract(MAX_DATE_RANGE_YEARS, "year"), "day")) { + alert("조회 기간은 최대 1년까지 설정할 수 있습니다."); + return; + } + + setStartDate(next.toDate()); + }; + + const handleEndDateChange = (date: Date) => { + const next = dayjs(date).startOf("day"); + const start = dayjs(startDate).startOf("day"); + + if (next.isBefore(start, "day")) { + alert("종료일은 시작일보다 빠를 수 없습니다."); + return; + } + if (next.isAfter(start.add(MAX_DATE_RANGE_YEARS, "year"), "day")) { + alert("조회 기간은 최대 1년까지 설정할 수 있습니다."); + return; + } + + setEndDate(next.toDate()); + }; + const { data: sidoList } = useSWR>( "log-history-sido-list", getSidoListFetcher, @@ -141,10 +263,8 @@ const LogHistory = () => { const param: StatisticsLogRequest = { page: page1Based, size: PAGE_SIZE, - startDate: startDate - ? dayjs(startDate).format("YYYY-MM-DD") - : "", - endDate: endDate ? dayjs(endDate).format("YYYY-MM-DD") : "", + startDate: dayjs(startDate).format("YYYY-MM-DD"), + endDate: dayjs(endDate).format("YYYY-MM-DD"), ...(!(statsCd === "" || statsCd === "ALL") && { statsCd }), ...(sido && sido !== "ALL" && { ctpvNm: sido }), ...(gugun && gugun !== "ALL" && { sggNm: gugun }), @@ -199,17 +319,15 @@ const LogHistory = () => { const handleSearch = async (e: React.FormEvent) => { e.preventDefault(); - if (startDate && endDate) { - const start = dayjs(startDate); - const end = dayjs(endDate); - if (start.isAfter(end, "day")) { - alert("시작일은 종료일보다 늦을 수 없습니다."); - return; - } - if (end.isBefore(start, "day")) { - alert("종료일은 시작일보다 빠를 수 없습니다."); - return; - } + const start = dayjs(startDate); + const end = dayjs(endDate); + if (end.isBefore(start, "day")) { + alert("종료일은 시작일보다 빠를 수 없습니다."); + return; + } + if (!isWithinMaxDateRange(startDate, endDate)) { + alert("조회 기간은 최대 1년까지 설정할 수 있습니다."); + return; } await loadLogs(1); @@ -310,15 +428,15 @@ const LogHistory = () => {
- -
diff --git a/apps/st/src/entities/statistics/model/statistics-interface.ts b/apps/st/src/entities/statistics/model/statistics-interface.ts index f748a5c04..571835065 100644 --- a/apps/st/src/entities/statistics/model/statistics-interface.ts +++ b/apps/st/src/entities/statistics/model/statistics-interface.ts @@ -463,8 +463,6 @@ export interface StatiscicsManagementReviewHistoryItem { statsYr: string; ctpvNm: string; sggNm: string; - sewerBzmnCd: string; - statsCd: string; menuNm: string; wrterOpinionSm: string | null; chckerOpinionSm: string | null;