[ST] - refactor: 입력 11-1 운영데이터 가져오기 기능 추가

This commit is contained in:
2026-11-11 16:37:28 +09:00
parent 8087ed343c
commit 0307ee9fd6
3 changed files with 150 additions and 64 deletions
@@ -186,10 +186,10 @@ function mapListToGridRows<T extends { verificationResult?: SewageExcretaSlurgeV
});
}
const SewageExcretaSlurgeInpTabList = [
SlurgeProcessingFacStatusInpColumn,
DigestorOperatingStatusInpColumn,
SewageSlurgeProcessingFacStatusInpColumn,
const SewageExcretaSlurgeInpTabList = [
SlurgeProcessingFacStatusInpColumn,
DigestorOperatingStatusInpColumn,
SewageSlurgeProcessingFacStatusInpColumn,
ExcretaSlurgeProcessingStatusInpColumn,
] as const;
@@ -1342,18 +1342,18 @@ const SewageExcretaSlurgeInp = () => {
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 && (
<div className="card !py-0">
<div className="flex justify-end items-center gap-[0.6rem] m-[0.6rem]">
<div className="card !py-0">
<div className="flex justify-end items-center gap-[0.6rem] m-[0.6rem]">
<VerificationResultButton
VerificationResultButtonFunc={openVerificationHistoryDialog}
isVerificationFailed={
@@ -2107,19 +2158,19 @@ const SewageExcretaSlurgeInp = () => {
updateOperateDataButtonFunc={updateOperateDataButtonFunc}
/>
)}
{submitOk && <SubmitButton submitFunc={submitFunc} />}
{submitOk && <SubmitButton submitFunc={submitFunc} />}
</>
)}
{activeTabStatus?.lclgvSbmsnSttsCd === "2" && submitOk && inputPeriodEnterable && (
<CancelSubmitButton cnacelSubmitFunc={cnacelSubmitFunc} />
)}
{showSaveInToolbar && <SaveButton saveFunc={saveFunc} />}
</div>
</div>
</div>
</div>
)}
{showSecondaryToolbarCard && (
<div className="card !py-0">
<div className="flex justify-end items-center gap-[0.6rem] m-[0.6rem]">
<div className="card !py-0">
<div className="flex justify-end items-center gap-[0.6rem] m-[0.6rem]">
{showNotApplicableForActiveTab && (
<NotApplicableCheckButton
isCheck={isNotApplicableForActiveTab}
@@ -2128,12 +2179,12 @@ const SewageExcretaSlurgeInp = () => {
)}
{showArticleEditButtons && (
<>
<AddArticleButton addArticleFunc={addArticleFunc} />
<DeleteArticleButton deleteArticleFunc={deleteArticleFunc} />
<AddArticleButton addArticleFunc={addArticleFunc} />
<DeleteArticleButton deleteArticleFunc={deleteArticleFunc} />
</>
)}
</div>
</div>
</div>
</div>
)}
{isLoading && (
<div className="absolute inset-0 z-50 [data-theme='black']:bg-transparent rounded-lg p-10 flex justify-center items-center">
@@ -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<SlurgeProcessingFacStatusOperationDataUpdateResponse> {
const response =
await stClient.put<SlurgeProcessingFacStatusOperationDataUpdateResponse>(
`${BASE}/slurge-processing-fac-status/operation-data/update`,
request,
);
return response.data;
}
/** 소화조 운영현황 조회 — ST00110002 */
public async getDigestorOperatingStatusList(
params: SewageExcretaSlurgeRequestParams,
@@ -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<SlurgeProcessingFacStatusSubmitResponse>;
/** 찌꺼기(슬러지)처리시설현황 운영 데이터 업데이트 — ST00110001 */
updateSlurgeProcessingFacStatusOperationData(
request: SlurgeProcessingFacStatusOperationDataUpdateRequest,
): Promise<SlurgeProcessingFacStatusOperationDataUpdateResponse>;
/** 소화조 운영현황 조회 — ST00110002 */
getDigestorOperatingStatusList(
params: SewageExcretaSlurgeRequestParams,