From 0307ee9fd671247a03f0fca174ef6c793080d3b1 Mon Sep 17 00:00:00 2001 From: rsone001 Date: Wed, 11 Nov 2026 16:37:28 +0900 Subject: [PATCH] =?UTF-8?q?[ST]=20-=20refactor:=20=EC=9E=85=EB=A0=A5=2011-?= =?UTF-8?q?1=20=EC=9A=B4=EC=98=81=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../input/SewageExcretaSlurgeInp.tsx | 179 +++++++++++------- ...ics-input-sewage-excreta-slurge-service.ts | 14 ++ ...s-input-sewage-excreta-slurge-interface.ts | 21 ++ 3 files changed, 150 insertions(+), 64 deletions(-) diff --git a/apps/st/src/components/statistics/input/SewageExcretaSlurgeInp.tsx b/apps/st/src/components/statistics/input/SewageExcretaSlurgeInp.tsx index a89a18e75..72fc2740e 100644 --- a/apps/st/src/components/statistics/input/SewageExcretaSlurgeInp.tsx +++ b/apps/st/src/components/statistics/input/SewageExcretaSlurgeInp.tsx @@ -186,10 +186,10 @@ function mapListToGridRows { noApplicable || !isSewageSlurgeFacTab ? [] : rowsForSubmit.map((row) => - buildSewageSlurgeProcessingFacStatusSaveItem(row, list), - ); + buildSewageSlurgeProcessingFacStatusSaveItem(row, list), + ); const excretaSlurgeSubmitList = noApplicable || !isExcretaSlurgeTab ? [] : rowsForSubmit.map((row) => - buildExcretaSlurgeProcessingStatusSaveItem(row, list), - ); + buildExcretaSlurgeProcessingStatusSaveItem(row, list), + ); const sewageSlurgeFacDeleteList = isSewageSlurgeFacTab ? (deleteListByTab.get(tabKey) ?? []) - .filter((row) => isPersistedArticleRowForTab(tabKey, row)) - .map((row) => buildSewageSlurgeProcessingFacStatusSaveItem(row, list)) + .filter((row) => isPersistedArticleRowForTab(tabKey, row)) + .map((row) => buildSewageSlurgeProcessingFacStatusSaveItem(row, list)) : []; if ( @@ -1374,10 +1374,10 @@ const SewageExcretaSlurgeInp = () => { (isDigestorTab ? SEWAGE_EXCRETA_DIGESTOR_OPERATING_STATS_CD : isSewageSlurgeFacTab - ? SEWAGE_EXCRETA_SEWAGE_SLURGE_FAC_STATUS_STATS_CD - : isExcretaSlurgeTab - ? SEWAGE_EXCRETA_EXCRETA_SLURGE_PROCESSING_STATS_CD - : SEWAGE_EXCRETA_SLURGE_PROCESSING_FAC_STATUS_STATS_CD); + ? SEWAGE_EXCRETA_SEWAGE_SLURGE_FAC_STATUS_STATS_CD + : isExcretaSlurgeTab + ? SEWAGE_EXCRETA_EXCRETA_SLURGE_PROCESSING_STATS_CD + : SEWAGE_EXCRETA_SLURGE_PROCESSING_FAC_STATUS_STATS_CD); const verificationQuery = { ...toInputSearchRegion(sidoListRef.current, lastSearchedValues), @@ -1429,32 +1429,32 @@ const SewageExcretaSlurgeInp = () => { setGlobalProgressLabel("일반 검증 진행 중..."); const response = isSlurgeFacTab ? await statisticsInputSewageExcretaSlurgeApi.submitSlurgeProcessingFacStatus({ - ...submitRequestBase, - userUuid: userInfo.userUnqId, - submitList: slurgeSubmitList, - }) + ...submitRequestBase, + userUuid: userInfo.userUnqId, + submitList: slurgeSubmitList, + }) : isDigestorTab - ? await statisticsInputSewageExcretaSlurgeApi.submitDigestorOperatingStatus({ + ? await statisticsInputSewageExcretaSlurgeApi.submitDigestorOperatingStatus({ ...submitRequestBase, userUuid: userInfo.userUnqId, submitList: digestorSubmitList, }) - : isSewageSlurgeFacTab - ? await statisticsInputSewageExcretaSlurgeApi.submitSewageSlurgeProcessingFacStatus( - { - ...submitRequestBase, - userUuid: userInfo.userUnqId, - submitList: sewageSlurgeFacSubmitList, - deleteList: sewageSlurgeFacDeleteList, - }, - ) - : await statisticsInputSewageExcretaSlurgeApi.submitExcretaSlurgeProcessingStatus( - { - ...submitRequestBase, - userUuid: userInfo.userUnqId, - submitList: excretaSlurgeSubmitList, - }, - ); + : isSewageSlurgeFacTab + ? await statisticsInputSewageExcretaSlurgeApi.submitSewageSlurgeProcessingFacStatus( + { + ...submitRequestBase, + userUuid: userInfo.userUnqId, + submitList: sewageSlurgeFacSubmitList, + deleteList: sewageSlurgeFacDeleteList, + }, + ) + : await statisticsInputSewageExcretaSlurgeApi.submitExcretaSlurgeProcessingStatus( + { + ...submitRequestBase, + userUuid: userInfo.userUnqId, + submitList: excretaSlurgeSubmitList, + }, + ); if (response.status !== "success") { alert(response.message ?? "데이터 제출 중 오류가 발생했습니다."); @@ -1535,7 +1535,58 @@ const SewageExcretaSlurgeInp = () => { }; const updateOperateDataButtonFunc = () => { - console.log("운영 데이터 업데이트"); + void (async () => { + if (!lastSearchedValues) { + alert("먼저 조회를 진행해주세요."); + return; + } + if (!(await confirm("자체발생량·함수율·자체 1차 처리량이 운영 데이터로 덮어씁니다."))) { + return; + } + + try { + showGlobalProgress({ label: "운영 데이터 업데이트 중...", progress: 0 }); + const userInfo = await getUserInfo(); + const request = { + statsYr: lastSearchedValues.year ?? "", + ctpvNm: lastSearchedValues.sido ?? "", + ...toInputSearchRegion(sidoListRef.current, lastSearchedValues), + userUuid: userInfo.userUnqId, + }; + + const response = + await statisticsInputSewageExcretaSlurgeApi.updateSlurgeProcessingFacStatusOperationData( + request, + ); + if (response.status !== "success") { + alert( + response.message || + "운영 데이터 업데이트 중 오류가 발생했습니다.", + ); + return; + } + + setGlobalProgress(50); + const tabKey = SlurgeProcessingFacStatusInpColumn.tabKey; + const param = + searchParamRef.current ?? + buildSewageExcretaSlurgeSearchParam(lastSearchedValues); + await loadActiveTabData(tabKey, param, lastSearchedValues, true, false); + setGlobalProgress(100); + alert("운영 데이터가 업데이트되었습니다."); + } catch (error) { + const message = + error && + typeof error === "object" && + "response" in error + ? (error as { response?: { data?: { message?: string } } }) + .response?.data?.message + : undefined; + alert(message || "운영 데이터 업데이트 중 오류가 발생했습니다."); + } finally { + hideGlobalProgress(); + } + })(); }; const cnacelSubmitFunc = () => { @@ -1649,8 +1700,8 @@ const SewageExcretaSlurgeInp = () => { const saveList = noApplicable ? [] : rowsForSave.map((row) => - buildSlurgeProcessingFacStatusSaveItem(row, list), - ); + buildSlurgeProcessingFacStatusSaveItem(row, list), + ); if (!noApplicable && saveList.length === 0 && buildSubmitOkForToolbar(searchContextByTab.get(tabKey) ?? lastSearchedValues)) { alert("해당사항 없음을 체크해주세요."); @@ -1675,8 +1726,8 @@ const SewageExcretaSlurgeInp = () => { const saveList = noApplicable ? [] : rowsForSave.map((row) => - buildDigestorOperatingStatusSaveItem(row, list), - ); + buildDigestorOperatingStatusSaveItem(row, list), + ); if (!noApplicable && saveList.length === 0 && buildSubmitOkForToolbar(searchContextByTab.get(tabKey) ?? lastSearchedValues)) { alert("해당사항 없음을 체크해주세요."); @@ -1698,8 +1749,8 @@ const SewageExcretaSlurgeInp = () => { const saveList = noApplicable ? [] : rowsForSave.map((row) => - buildSewageSlurgeProcessingFacStatusSaveItem(row, list), - ); + buildSewageSlurgeProcessingFacStatusSaveItem(row, list), + ); const deleteList = (deleteListByTab.get(tabKey) ?? []) .filter((row) => isPersistedArticleRowForTab(tabKey, row)) .map((row) => buildSewageSlurgeProcessingFacStatusSaveItem(row, list)); @@ -1728,8 +1779,8 @@ const SewageExcretaSlurgeInp = () => { const saveList = noApplicable ? [] : rowsForSave.map((row) => - buildExcretaSlurgeProcessingStatusSaveItem(row, list), - ); + buildExcretaSlurgeProcessingStatusSaveItem(row, list), + ); if (!noApplicable && saveList.length === 0 && buildSubmitOkForToolbar(searchContextByTab.get(tabKey) ?? lastSearchedValues)) { alert("해당사항 없음을 체크해주세요."); @@ -1781,17 +1832,17 @@ const SewageExcretaSlurgeInp = () => { const getCheckedItemIndexesFromGrid = (rowCount: number): number[] => { const gridView = getGridRef.current?.gridView as | { - getCheckedItems?: () => number[]; - getCheckedRows?: () => number[]; - } + getCheckedItems?: () => number[]; + getCheckedRows?: () => number[]; + } | undefined; const checked = (typeof gridView?.getCheckedItems === "function" ? gridView.getCheckedItems() : typeof gridView?.getCheckedRows === "function" - ? gridView.getCheckedRows() - : []) ?? []; + ? gridView.getCheckedRows() + : []) ?? []; return checked.filter( (idx) => Number.isInteger(idx) && idx >= 0 && idx < rowCount, @@ -1863,10 +1914,10 @@ const SewageExcretaSlurgeInp = () => { checkedIndexes.length > 0 ? new Set(checkedIndexes) : new Set( - currentRows - .map((row, idx) => (isCheckedRow(row) ? idx : -1)) - .filter((idx) => idx >= 0), - ); + currentRows + .map((row, idx) => (isCheckedRow(row) ? idx : -1)) + .filter((idx) => idx >= 0), + ); const removedRows = currentRows.filter((_, idx) => checkedIndexSet.has(idx)); const nextRows = currentRows.filter((_, idx) => !checkedIndexSet.has(idx)); @@ -2089,8 +2140,8 @@ const SewageExcretaSlurgeInp = () => { onValuesChange={setSearchValues} /> {showActionToolbarCard && ( -
-
+
+
{ updateOperateDataButtonFunc={updateOperateDataButtonFunc} /> )} - {submitOk && } + {submitOk && } )} {activeTabStatus?.lclgvSbmsnSttsCd === "2" && submitOk && inputPeriodEnterable && ( )} {showSaveInToolbar && } -
-
+
+
)} {showSecondaryToolbarCard && ( -
-
+
+
{showNotApplicableForActiveTab && ( { )} {showArticleEditButtons && ( <> - - + + )} -
-
+
+
)} {isLoading && (
diff --git a/apps/st/src/entities/statistics/api/input/statistics-input-sewage-excreta-slurge-service.ts b/apps/st/src/entities/statistics/api/input/statistics-input-sewage-excreta-slurge-service.ts index 57a908a37..a608ca82a 100644 --- a/apps/st/src/entities/statistics/api/input/statistics-input-sewage-excreta-slurge-service.ts +++ b/apps/st/src/entities/statistics/api/input/statistics-input-sewage-excreta-slurge-service.ts @@ -22,6 +22,8 @@ import type { SewageSlurgeProcessingFacStatusSubmitRequest, SewageSlurgeProcessingFacStatusSubmitResponse, SlurgeProcessingFacStatusApiResponse, + SlurgeProcessingFacStatusOperationDataUpdateRequest, + SlurgeProcessingFacStatusOperationDataUpdateResponse, SlurgeProcessingFacStatusSaveRequest, SlurgeProcessingFacStatusSaveResponse, SlurgeProcessingFacStatusSubmitRequest, @@ -68,6 +70,18 @@ export class StatisticsInputSewageExcretaSlurgeApiService implements StatisticsI return response.data; } + /** 찌꺼기(슬러지)처리시설현황 운영 데이터 업데이트 — ST00110001 */ + public async updateSlurgeProcessingFacStatusOperationData( + request: SlurgeProcessingFacStatusOperationDataUpdateRequest, + ): Promise { + const response = + await stClient.put( + `${BASE}/slurge-processing-fac-status/operation-data/update`, + request, + ); + return response.data; + } + /** 소화조 운영현황 조회 — ST00110002 */ public async getDigestorOperatingStatusList( params: SewageExcretaSlurgeRequestParams, diff --git a/apps/st/src/entities/statistics/model/input/statistics-input-sewage-excreta-slurge-interface.ts b/apps/st/src/entities/statistics/model/input/statistics-input-sewage-excreta-slurge-interface.ts index be9763b3d..f5556802d 100644 --- a/apps/st/src/entities/statistics/model/input/statistics-input-sewage-excreta-slurge-interface.ts +++ b/apps/st/src/entities/statistics/model/input/statistics-input-sewage-excreta-slurge-interface.ts @@ -205,6 +205,23 @@ export interface SlurgeProcessingFacStatusSubmitResponse { }; } +/** ST00110001 운영 데이터 업데이트 요청 */ +export interface SlurgeProcessingFacStatusOperationDataUpdateRequest { + statsYr: string; + ctpvNm: string; + /** 도에서만 사용, 특·광역시는 빈 값 */ + sggNm?: string; + sewerBzmnCd: string; + userUuid: string; +} + +/** ST00110001 운영 데이터 업데이트 응답 */ +export interface SlurgeProcessingFacStatusOperationDataUpdateResponse { + status: string; + message?: string; + data?: unknown | null; +} + /** * ST00110002 조회 `data.digestorOperatingStatusList[]` 한 행. * `DigestorOperatingStatusInpColumn` fieldName과 동일 (`ctpvNm` 그리드 값은 `commonInfo.ctpvNm` 시도명). @@ -561,6 +578,10 @@ export interface StatisticsInputSewageExcretaSlurgeService { submitSlurgeProcessingFacStatus( request: SlurgeProcessingFacStatusSubmitRequest, ): Promise; + /** 찌꺼기(슬러지)처리시설현황 운영 데이터 업데이트 — ST00110001 */ + updateSlurgeProcessingFacStatusOperationData( + request: SlurgeProcessingFacStatusOperationDataUpdateRequest, + ): Promise; /** 소화조 운영현황 조회 — ST00110002 */ getDigestorOperatingStatusList( params: SewageExcretaSlurgeRequestParams,