Merge branch 'iipbs/st/dev'

This commit is contained in:
2026-08-21 17:28:11 +09:00
33 changed files with 785 additions and 455 deletions
@@ -16,6 +16,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { statisticsInputExcretaTreatmentFacilityApi } from "@/entities/statistics/api/input/statistics-input-excreta-treatment-facility-service";
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
@@ -193,13 +194,6 @@ function mapExcretaTreatmentFacilityListToGridRows(
});
}
function nullableTrimmedString(
value: string | number | null | undefined,
): string | null {
const s = String(value ?? "").trim();
return s === "" ? null : s;
}
function toGridNumber(value: string | number | null | undefined): number {
const n = Number(value);
return Number.isFinite(n) ? n : 0;
@@ -212,9 +206,9 @@ function toApiYmd(value: string | number | Date | null | undefined): string | nu
function resolveExcretaTreatmentFacilityAdmdst(
row: Record<string, string | number>,
sggOptions: Sgg[],
): { admdstCd: string; admdstNm: string } {
const existingCd = String(row.admdstCd ?? "").trim();
const existingNm = String(row.admdstNm ?? "").trim();
): { admdstCd: string | null; admdstNm: string | null } {
const existingCd = nullableTrimmedString(row.admdstCd);
const existingNm = nullableTrimmedString(row.admdstNm);
if (existingCd && existingNm) {
return { admdstCd: existingCd, admdstNm: existingNm };
}
@@ -223,7 +217,10 @@ function resolveExcretaTreatmentFacilityAdmdst(
if (matched) {
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
}
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
return {
admdstCd: existingCd,
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
};
}
/** 그리드 행 → ST00070001 저장/삭제 API 항목 */
@@ -238,18 +235,18 @@ function buildExcretaTreatmentFacilitySaveItem(
return {
admdstCd,
admdstNm,
fcltSn: String(row.fcltSn ?? "").trim(),
fcltNm: String(row.fcltNm ?? ""),
fcltPstnCn: String(row.fcltPstnCn ?? ""),
telNo: String(row.telNo ?? ""),
fcltSn: nullableTrimmedString(row.fcltSn),
fcltNm: nullableTrimmedString(row.fcltNm),
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
telNo: nullableTrimmedString(row.telNo),
cmptnStrtYmd: toApiYmd(row.cmptnStrtYmd),
oprtngStrtYmd: toApiYmd(row.oprtngStrtYmd),
wholPjtcoAmt: toGridNumber(row.wholPjtcoAmt),
prcsFcltCpct: toGridNumber(row.prcsFcltCpct),
cpct: toGridNumber(row.cpct),
oprtngDayCnt: toGridNumber(row.oprtngDayCnt),
prcsMthdExpln: String(row.prcsMthdExpln ?? ""),
linkTmplntCn: String(row.linkTmplntCn ?? ""),
prcsMthdExpln: nullableTrimmedString(row.prcsMthdExpln),
linkTmplntCn: nullableTrimmedString(row.linkTmplntCn),
linkPrcsQnt: toGridNumber(row.linkPrcsQnt),
inflwBodWqVl: toGridNumber(row.inflwBodWqVl),
inflwTocWqVl: toGridNumber(row.inflwTocWqVl),
@@ -263,11 +260,11 @@ function buildExcretaTreatmentFacilitySaveItem(
dschgTnWqVl: toGridNumber(row.dschgTnWqVl),
dschgTpWqVl: toGridNumber(row.dschgTpWqVl),
dschgClfgCnt: toGridNumber(row.dschgClfgCnt),
wtsysNm: String(row.wtsysNm ?? ""),
trbtrNm: String(row.trbtrNm ?? ""),
msirbCn: String(row.msirbCn ?? ""),
ssirbCn: String(row.ssirbCn ?? ""),
operMthdCdCn: String(row.operMthdCdCn ?? ""),
wtsysNm: nullableTrimmedString(row.wtsysNm),
trbtrNm: nullableTrimmedString(row.trbtrNm),
msirbCn: nullableTrimmedString(row.msirbCn),
ssirbCn: nullableTrimmedString(row.ssirbCn),
operMthdCdCn: nullableTrimmedString(row.operMthdCdCn),
wholNope: toGridNumber(row.wholNope),
sftyAcdntEvntcsCnt: toGridNumber(row.sftyAcdntEvntcsCnt),
rmrk: nullableTrimmedString(row.rmrk),
@@ -62,6 +62,7 @@ import {
patchVerificationFailedByTab,
} from "@/components/util/input/verification-failed-flag";
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { useAdminStore } from "@/store/admin-store";
import { useTabStore } from "@/store/tab-store";
@@ -169,17 +170,6 @@ function mapRegionalListToGridRows<
});
}
function normalizeGridString(value: unknown): string {
if (value === null || value === undefined) return "";
return typeof value === "string" ? value : String(value);
}
function normalizeGridRmrk(value: unknown): string | null {
if (value === null || value === undefined) return null;
const s = typeof value === "string" ? value : String(value);
return s.trim() === "" ? null : s;
}
function buildColumnFormatNumber(
columns: { fieldName?: string; dataFormat?: string }[],
) {
@@ -208,8 +198,8 @@ function buildSewageTreatFactStatusSaveList(
const formatNumber = buildColumnFormatNumber(SewageTreatFactStatusInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
step1StaaPrcsQnt: formatNumber(d.step1StaaPrcsQnt, "step1StaaPrcsQnt"),
step2StaaPrcsQnt: formatNumber(d.step2StaaPrcsQnt, "step2StaaPrcsQnt"),
step3StaaPrcsQnt: formatNumber(d.step3StaaPrcsQnt, "step3StaaPrcsQnt"),
@@ -224,7 +214,7 @@ function buildSewageTreatFactStatusSaveList(
step5StaaExcpPrcsQnt: formatNumber(d.step5StaaExcpPrcsQnt, "step5StaaExcpPrcsQnt"),
step6StaaExcpPrcsQnt: formatNumber(d.step6StaaExcpPrcsQnt, "step6StaaExcpPrcsQnt"),
step7StaaExcpPrcsQnt: formatNumber(d.step7StaaExcpPrcsQnt, "step7StaaExcpPrcsQnt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
}));
}
@@ -234,8 +224,8 @@ function buildSepticTankStatusSaveList(
const formatNumber = buildColumnFormatNumber(SepticTankStatusInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
staaInsdSttkNprsflCnt: formatNumber(d.staaInsdSttkNprsflCnt, "staaInsdSttkNprsflCnt"),
step1StaaInsdSttkFrcCnt: formatNumber(d.step1StaaInsdSttkFrcCnt, "step1StaaInsdSttkFrcCnt"),
staaInsdSprktpFltrtbCnt: formatNumber(d.staaInsdSprktpFltrtbCnt, "staaInsdSprktpFltrtbCnt"),
@@ -264,7 +254,7 @@ function buildSepticTankStatusSaveList(
step6StaaExcpNope: formatNumber(d.step6StaaExcpNope, "step6StaaExcpNope"),
step7StaaExcpNope: formatNumber(d.step7StaaExcpNope, "step7StaaExcpNope"),
step8StaaExcpNope: formatNumber(d.step8StaaExcpNope, "step8StaaExcpNope"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
}));
}
@@ -274,8 +264,8 @@ function buildPrivateSewageDesigStatusSaveList(
const formatNumber = buildColumnFormatNumber(PrivateSewageDesigStatusInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
indvSwagePbancRgnCnt: formatNumber(d.indvSwagePbancRgnCnt, "indvSwagePbancRgnCnt"),
indvSwageDsgnScpLen: formatNumber(d.indvSwageDsgnScpLen, "indvSwageDsgnScpLen"),
spctnkGrssFcltCnt: formatNumber(d.spctnkGrssFcltCnt, "spctnkGrssFcltCnt"),
@@ -285,7 +275,7 @@ function buildPrivateSewageDesigStatusSaveList(
"drtwPrcsFcltGrssFcltCnt",
),
drtwPrcsFcltQnt: formatNumber(d.drtwPrcsFcltQnt, "drtwPrcsFcltQnt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
}));
}
@@ -52,6 +52,7 @@ import { toGridRows } from '@/components/util/grid/gridFunction';
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
import { patchFooterVerificationByTab,patchVerificationFailedByTab } from '@/components/util/input/verification-failed-flag';
import type { VerificationResultLikeMap } from '@/components/util/input/verification-result-display';
import { nullableTrimmedString } from '@/components/util/input/nullableString';
import { useAdminStore } from '@/store/admin-store';
import { useTabStore } from '@/store/tab-store';
@@ -277,19 +278,13 @@ const PublicSewageFacilityInp = () => {
return Number.isFinite(num) ? num : 0;
};
const toNullableString = (v: unknown): string | null => {
if (v === null || v === undefined) return null;
const s = typeof v === 'string' ? v : String(v);
return s.trim() === '' ? null : s;
};
return currentData.map((d) => ({
admdstCd: String(d.admdstCd ?? ''),
admdstNm: String(d.admdstNm ?? ''),
swtrmtFcltCd: String(d.swtrmtFcltCd ?? ''),
swtrmtFcltNm: String(d.swtrmtFcltNm ?? ''),
fcltSn: String(d.fcltSn ?? ''),
fcltPstnCn: d.fcltPstnCn === '' ? null : toNullableString(d.fcltPstnCn),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
swtrmtFcltCd: nullableTrimmedString(d.swtrmtFcltCd),
swtrmtFcltNm: nullableTrimmedString(d.swtrmtFcltNm),
fcltSn: nullableTrimmedString(d.fcltSn),
fcltPstnCn: nullableTrimmedString(d.fcltPstnCn),
inflwSwagePhysQnt: toNumber(d.inflwSwagePhysQnt),
inflwSwageBoilQnt: toNumber(d.inflwSwageBoilQnt),
inflwSwageAltdQnt: toNumber(d.inflwSwageAltdQnt),
@@ -298,7 +293,7 @@ const PublicSewageFacilityInp = () => {
prcsAltdCpct: toNumber(d.prcsAltdCpct),
prxyCtrtCn: normalizePrxyCtrtCn(d.prxyCtrtCn),
sftyAcdntEvntcsCnt: toNumber(d.sftyAcdntEvntcsCnt),
rmrk: toNullableString(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
}));
};
@@ -528,12 +523,12 @@ const PublicSewageFacilityInp = () => {
const saveList: PublicSewageMainFacilityMappingSaveItem[] = rightRows
.filter((r) => isCheckedRow(r))
.map((r) => ({
fcltSn: String(r.fcltSn ?? ''),
admdstCd: String(r.admdstCd ?? ''),
admdstNm: String(r.admdstNm ?? ''),
swtrmtFcltCd: String(r.swtrmtFcltCd ?? ''),
swtrmtFcltNm: String(r.swtrmtFcltNm ?? ''),
isMainYn: String(r.isMainYn ?? ''),
fcltSn: nullableTrimmedString(r.fcltSn),
admdstCd: nullableTrimmedString(r.admdstCd),
admdstNm: nullableTrimmedString(r.admdstNm),
swtrmtFcltCd: nullableTrimmedString(r.swtrmtFcltCd),
swtrmtFcltNm: nullableTrimmedString(r.swtrmtFcltNm),
isMainYn: nullableTrimmedString(r.isMainYn),
}));
const deleteList = rightRows
@@ -16,6 +16,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { statisticsInputPumpingStationApi } from "@/entities/statistics/api/input/statistics-input-pumping-station-service";
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
@@ -192,13 +193,6 @@ function mapPumpingStationListToGridRows(
});
}
function nullableTrimmedString(
value: string | number | null | undefined,
): string | null {
const s = String(value ?? "").trim();
return s === "" ? null : s;
}
function toGridNumber(value: string | number | null | undefined): number {
const n = Number(value);
return Number.isFinite(n) ? n : 0;
@@ -207,9 +201,9 @@ function toGridNumber(value: string | number | null | undefined): number {
function resolvePumpingStationAdmdst(
row: Record<string, string | number>,
sggOptions: Sgg[],
): { admdstCd: string; admdstNm: string } {
const existingCd = String(row.admdstCd ?? "").trim();
const existingNm = String(row.admdstNm ?? "").trim();
): { admdstCd: string | null; admdstNm: string | null } {
const existingCd = nullableTrimmedString(row.admdstCd);
const existingNm = nullableTrimmedString(row.admdstNm);
if (existingCd && existingNm) {
return { admdstCd: existingCd, admdstNm: existingNm };
}
@@ -218,7 +212,10 @@ function resolvePumpingStationAdmdst(
if (matched) {
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
}
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
return {
admdstCd: existingCd,
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
};
}
/** 그리드 행 → ST00050001 저장/삭제 API 항목 */
@@ -227,15 +224,14 @@ function buildPumpingStationSaveItem(
sggOptions: Sgg[] = [],
): PumpingStationSaveItem {
const { admdstCd, admdstNm } = resolvePumpingStationAdmdst(row, sggOptions);
const fcltSn = String(row.fcltSn ?? "").trim();
return {
admdstCd,
admdstNm,
fcltSn: fcltSn,
swtrmtFcltNm: String(row.swtrmtFcltNm ?? ""),
fcltNm: String(row.fcltNm ?? ""),
pumpSeNm: String(row.pumpSeNm ?? ""),
fcltPstnCn: String(row.fcltPstnCn ?? ""),
fcltSn: nullableTrimmedString(row.fcltSn),
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
fcltNm: nullableTrimmedString(row.fcltNm),
pumpSeNm: nullableTrimmedString(row.pumpSeNm),
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
planMltvArea: toGridNumber(row.planMltvArea),
sndyArea: toGridNumber(row.sndyArea),
@@ -9,6 +9,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
import { statisticsInputSewageExcretaRelatedApi } from "@/entities/statistics/api/input/statistics-input-sewage-excreta-related-service";
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
@@ -319,7 +320,7 @@ function buildSggNmColumn(
function resolvePublicInstitutionAdmdst(
row: Record<string, string | number>,
sggOptions: Sgg[],
): { admdstCd: string; admdstNm: string } {
): { admdstCd: string | null; admdstNm: string | null } {
const sggNm = String(row.sggNm ?? "").trim();
if (sggNm) {
const matched = sggOptions.find((s) => s.gugun === sggNm);
@@ -327,9 +328,12 @@ function resolvePublicInstitutionAdmdst(
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
}
}
const existingCd = String(row.admdstCd ?? "").trim();
const existingNm = String(row.admdstNm ?? "").trim();
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
const existingCd = nullableTrimmedString(row.admdstCd);
const existingNm = nullableTrimmedString(row.admdstNm);
return {
admdstCd: existingCd,
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
};
}
function mergeGridRowsWithMapRows(
@@ -369,13 +373,6 @@ function mergeGridRowsWithArticleMeta(
});
}
function nullableTrimmedString(
value: string | number | null | undefined,
): string | null {
const s = String(value ?? "").trim();
return s === "" ? null : s;
}
function toGridNumber(value: string | number | null | undefined): number {
const n = Number(value);
return Number.isFinite(n) ? n : 0;
@@ -390,8 +387,8 @@ function buildPublicInstitutionIndustrySaveItem(
return {
admdstCd,
admdstNm,
ognzSn: String(row.ognzSn ?? "").trim(),
ognzNm: String(row.ognzNm ?? "").trim(),
ognzSn: nullableTrimmedString(row.ognzSn),
ognzNm: nullableTrimmedString(row.ognzNm),
pbadmsNope: toGridNumber(row.pbadmsNope),
engrkCnt: toGridNumber(row.engrkCnt),
mchnCnt: toGridNumber(row.mchnCnt),
@@ -409,8 +406,8 @@ function buildExcretaRelatedIndustrySaveItem(
row: Record<string, string | number>,
): ExcretaRelatedIndustrySaveItem {
return {
admdstCd: String(row.admdstCd ?? "").trim(),
admdstNm: String(row.admdstNm ?? "").trim(),
admdstCd: nullableTrimmedString(row.admdstCd),
admdstNm: nullableTrimmedString(row.admdstNm),
bzentyCnt: toGridNumber(row.bzentyCnt),
empNope: toGridNumber(row.empNope),
n3TonUdrCnt: toGridNumber(row.n3TonUdrCnt),
@@ -427,8 +424,8 @@ function buildPrivateSewageTreatRelatedIndustrySaveItem(
row: Record<string, string | number>,
): PrivateSewageTreatRelatedIndustrySaveItem {
return {
admdstCd: String(row.admdstCd ?? "").trim(),
admdstNm: String(row.admdstNm ?? "").trim(),
admdstCd: nullableTrimmedString(row.admdstCd),
admdstNm: nullableTrimmedString(row.admdstNm),
designMdsrCnt: toGridNumber(row.designMdsrCnt),
designMdsrNope: toGridNumber(row.designMdsrNope),
mfbizCnt: toGridNumber(row.mfbizCnt),
@@ -1715,8 +1712,8 @@ const SewageExcretaRelatedInp = () => {
newRow.__isNewArticle = 1;
if (sggNm) {
const { admdstCd, admdstNm } = resolvePublicInstitutionAdmdst(newRow, list);
newRow.admdstCd = admdstCd;
newRow.admdstNm = admdstNm;
newRow.admdstCd = admdstCd ?? "";
newRow.admdstNm = admdstNm ?? "";
}
flushSync(() => {
@@ -17,6 +17,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
import { statisticsInputSewageExcretaSlurgeApi } from "@/entities/statistics/api/input/statistics-input-sewage-excreta-slurge-service";
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
@@ -441,13 +442,6 @@ function mergeGridRowsWithMapRows(
});
}
function nullableTrimmedString(
value: string | number | null | undefined,
): string | null {
const s = String(value ?? "").trim();
return s === "" ? null : s;
}
function toGridNumber(value: string | number | null | undefined): number {
const n = Number(value);
return Number.isFinite(n) ? n : 0;
@@ -456,7 +450,7 @@ function toGridNumber(value: string | number | null | undefined): number {
function resolveSlurgeFacStatusAdmdst(
row: Record<string, string | number>,
sggOptions: Sgg[],
): { admdstCd: string; admdstNm: string } {
): { admdstCd: string | null; admdstNm: string | null } {
const sggNm = String(row.sggNm ?? "").trim();
if (sggNm) {
const matched = sggOptions.find((s) => s.gugun === sggNm);
@@ -464,12 +458,15 @@ function resolveSlurgeFacStatusAdmdst(
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
}
}
const existingCd = String(row.admdstCd ?? "").trim();
const existingNm = String(row.admdstNm ?? "").trim();
const existingCd = nullableTrimmedString(row.admdstCd);
const existingNm = nullableTrimmedString(row.admdstNm);
if (existingCd || existingNm) {
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
return {
admdstCd: existingCd,
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
};
}
return { admdstCd: "", admdstNm: sggNm };
return { admdstCd: null, admdstNm: nullableTrimmedString(sggNm) };
}
/** 그리드 행 → ST00110001 저장/삭제 API 항목 */
@@ -481,12 +478,12 @@ function buildSlurgeProcessingFacStatusSaveItem(
return {
admdstCd,
admdstNm,
swtrmtFcltCd: String(row.swtrmtFcltCd ?? "").trim(),
swtrmtFcltNm: String(row.swtrmtFcltNm ?? "").trim(),
fcltSn: String(row.fcltSn ?? "").trim(),
swtrmtFcltCd: nullableTrimmedString(row.swtrmtFcltCd),
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
fcltSn: nullableTrimmedString(row.fcltSn),
itslfQnt: toGridNumber(row.itslfQnt),
otsdInflwQnt: toGridNumber(row.otsdInflwQnt),
transfTmplntNm: String(row.transfTmplntNm ?? "").trim(),
transfTmplntNm: nullableTrimmedString(row.transfTmplntNm),
transfPrcsQnt: toGridNumber(row.transfPrcsQnt),
srpFncRt: toGridNumber(row.srpFncRt),
itslfTs1RclmQnt: toGridNumber(row.itslfTs1RclmQnt),
@@ -495,31 +492,31 @@ function buildSlurgeProcessingFacStatusSaveItem(
itslfTs1DryQnt: toGridNumber(row.itslfTs1DryQnt),
itslfTs1FuelQnt: toGridNumber(row.itslfTs1FuelQnt),
itslfTs2CmpstgQnt: toGridNumber(row.itslfTs2CmpstgQnt),
cmpsPrcsFcltBzentyNm: String(row.cmpsPrcsFcltBzentyNm ?? "").trim(),
cmpsPrcsFcltBzentyNm: nullableTrimmedString(row.cmpsPrcsFcltBzentyNm),
incnrPrcsLfvlm: toGridNumber(row.incnrPrcsLfvlm),
incnrPrcsPrdctRmtrlQnt: toGridNumber(row.incnrPrcsPrdctRmtrlQnt),
incnrPrcsFmlyrQnt: toGridNumber(row.incnrPrcsFmlyrQnt),
incnrPrcsFcltNm: String(row.incnrPrcsFcltNm ?? "").trim(),
incnrPrcsFcltNm: nullableTrimmedString(row.incnrPrcsFcltNm),
stbznPrcsLfvlm: toGridNumber(row.stbznPrcsLfvlm),
stbznPrcsFmlyrQnt: toGridNumber(row.stbznPrcsFmlyrQnt),
stbznPrcsFcltNm: String(row.stbznPrcsFcltNm ?? "").trim(),
stbznPrcsFcltNm: nullableTrimmedString(row.stbznPrcsFcltNm),
dryPrcsLfvlm: toGridNumber(row.dryPrcsLfvlm),
dryPrcsIncnrQnt: toGridNumber(row.dryPrcsIncnrQnt),
dryPrcsFuelQnt: toGridNumber(row.dryPrcsFuelQnt),
dryPrcsPrdctRmtrlQnt: toGridNumber(row.dryPrcsPrdctRmtrlQnt),
dryPrcsFmlyrQnt: toGridNumber(row.dryPrcsFmlyrQnt),
dryPrcsCmpstgQnt: toGridNumber(row.dryPrcsCmpstgQnt),
dryPrcsFcltNm: String(row.dryPrcsFcltNm ?? "").trim(),
dryPrcsFcltNm: nullableTrimmedString(row.dryPrcsFcltNm),
fuelPrcsIncnrQnt: toGridNumber(row.fuelPrcsIncnrQnt),
fuelPrcsFuelQnt: toGridNumber(row.fuelPrcsFuelQnt),
fuelPrcsFcltNm: String(row.fuelPrcsFcltNm ?? "").trim(),
fuelPrcsFcltNm: nullableTrimmedString(row.fuelPrcsFcltNm),
otsdCnsgnRclmQnt: toGridNumber(row.otsdCnsgnRclmQnt),
otsdCnsgnIncnrQnt: toGridNumber(row.otsdCnsgnIncnrQnt),
otsdCnsgnFuelPwplQnt: toGridNumber(row.otsdCnsgnFuelPwplQnt),
otsdCnsgnPrdctRmtrlQnt: toGridNumber(row.otsdCnsgnPrdctRmtrlQnt),
otsdCnsgnFmlyrQnt: toGridNumber(row.otsdCnsgnFmlyrQnt),
otsdCnsgnCmpstgQnt: toGridNumber(row.otsdCnsgnCmpstgQnt),
otsdCnsgnFcltNm: String(row.otsdCnsgnFcltNm ?? "").trim(),
otsdCnsgnFcltNm: nullableTrimmedString(row.otsdCnsgnFcltNm),
cparTs1Whol: toGridNumber(row.cparTs1Whol),
rmrk: nullableTrimmedString(row.rmrk),
};
@@ -534,10 +531,10 @@ function buildDigestorOperatingStatusSaveItem(
const base = {
admdstCd,
admdstNm,
swtrmtFcltCd: String(row.swtrmtFcltCd ?? "").trim(),
swtrmtFcltNm: String(row.swtrmtFcltNm ?? "").trim(),
fcltSn: String(row.fcltSn ?? "").trim(),
digstnEnYn: String(row.digstnEnYn ?? "").trim(),
swtrmtFcltCd: nullableTrimmedString(row.swtrmtFcltCd),
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
fcltSn: nullableTrimmedString(row.fcltSn),
digstnEnYn: nullableTrimmedString(row.digstnEnYn),
};
if (isDigestorOperatingRowDisabled(row)) {
@@ -585,9 +582,9 @@ function buildSewageSlurgeProcessingFacStatusSaveItem(
return {
admdstCd,
admdstNm,
fcltSn: String(row.fcltSn ?? "").trim(),
fcltNm: String(row.fcltNm ?? "").trim(),
prcsMthExpln: String(row.prcsMthExpln ?? "").trim(),
fcltSn: nullableTrimmedString(row.fcltSn),
fcltNm: nullableTrimmedString(row.fcltNm),
prcsMthExpln: nullableTrimmedString(row.prcsMthExpln),
fcltCpct: toGridNumber(row.fcltCpct),
anlPrcsQnt: toGridNumber(row.anlPrcsQnt),
dayAvgOprtngHr: toGridNumber(row.dayAvgOprtngHr),
@@ -605,9 +602,9 @@ function buildExcretaSlurgeProcessingStatusSaveItem(
return {
admdstCd,
admdstNm,
fcltSn: String(row.fcltSn ?? "").trim(),
fcltNm: String(row.fcltNm ?? "").trim(),
fcltPstnCn: String(row.fcltPstnCn ?? "").trim(),
fcltSn: nullableTrimmedString(row.fcltSn),
fcltNm: nullableTrimmedString(row.fcltNm),
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
rcycQnt: toGridNumber(row.rcycQnt),
olandLfvlm: toGridNumber(row.olandLfvlm),
incnrQnt: toGridNumber(row.incnrQnt),
@@ -615,7 +612,7 @@ function buildExcretaSlurgeProcessingStatusSaveItem(
fuelQnt: toGridNumber(row.fuelQnt),
etcQnt: toGridNumber(row.etcQnt),
nondspsQnt: toGridNumber(row.nondspsQnt),
swtrmtFcltNm: String(row.swtrmtFcltNm ?? "").trim(),
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
rmrk: nullableTrimmedString(row.rmrk),
};
}
@@ -75,6 +75,7 @@ import {
patchFooterVerificationByTab,
patchVerificationFailedByTab,
} from "@/components/util/input/verification-failed-flag";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
import { useAdminStore } from "@/store/admin-store";
import { useStatisticsInputFocusStore } from "@/store/statistics-input-focus-store";
@@ -364,10 +365,10 @@ function buildRegionalFactSubmitListFromGrid(
return decimalPlaces > 0 ? parseFloat(num.toFixed(decimalPlaces)) : Math.round(num);
};
return currentData.map((d) => ({
admdstCd: String(d.admdstCd ?? ""),
sggNm: String(d.sggNm ?? ""),
admdstNm: String(d.admdstNm ?? ""),
goalYr: String(d.goalYr ?? ""),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
goalYr: nullableTrimmedString(d.goalYr),
wholPplMtncPlanPrlg: formatNumber(d.wholPplMtncPlanPrlg, "wholPplMtncPlanPrlg"),
wholPlanPrlg: formatNumber(d.wholPlanPrlg, "wholPlanPrlg"),
wholFcltPrlg: formatNumber(d.wholFcltPrlg, "wholFcltPrlg"),
@@ -403,7 +404,7 @@ function buildRegionalFactSubmitListFromGrid(
exlnOtflCnt: formatNumber(d.exlnOtflCnt, "exlnOtflCnt"),
sewerLdgrEdpPrlg: formatNumber(d.sewerLdgrEdpPrlg, "sewerLdgrEdpPrlg"),
sewerLdgrEdpRt: formatNumber(d.sewerLdgrEdpRt, "sewerLdgrEdpRt"),
rmrk: (d.rmrk as string | null) ?? null,
rmrk: nullableTrimmedString(d.rmrk),
}));
}
@@ -1257,12 +1258,12 @@ const SewagePipeInp = () => {
return decimalPlaces > 0 ? parseFloat(num.toFixed(decimalPlaces)) : Math.round(num);
};
const submitList = currentData.map((d) => ({
admdstCd: String(d.admdstCd ?? ""),
sggNm: String(d.sggNm ?? ""),
admdstNm: String(d.admdstNm ?? ""),
fcltSn: String(d.fcltSn ?? ""),
swtrmtFcltCd: String(d.swtrmtFcltCd ?? ""),
swtrmtFcltNm: String(d.swtrmtFcltNm ?? ""),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
fcltSn: nullableTrimmedString(d.fcltSn),
swtrmtFcltCd: nullableTrimmedString(d.swtrmtFcltCd),
swtrmtFcltNm: nullableTrimmedString(d.swtrmtFcltNm),
prcsFcltCpct: formatNumber(d.prcsFcltCpct, "prcsFcltCpct"),
prcsZoneArea: formatNumber(d.prcsZoneArea, "prcsZoneArea"),
cbsysPrcsZoneArea: formatNumber(d.cbsysPrcsZoneArea, "cbsysPrcsZoneArea"),
@@ -1284,7 +1285,7 @@ const SewagePipeInp = () => {
cbsysBrchlnPrlg: formatNumber(d.cbsysBrchlnPrlg, "cbsysBrchlnPrlg"),
exlnBrchlnPrlg: formatNumber(d.exlnBrchlnPrlg, "exlnBrchlnPrlg"),
drtwBrchlnPrlg: formatNumber(d.drtwBrchlnPrlg, "drtwBrchlnPrlg"),
rmrk: String(d.rmrk ?? ""),
rmrk: nullableTrimmedString(d.rmrk),
}));
const requestData: SeweragePipeInputFactInstallStatusSubmitRequest = {
...submitBase,
@@ -1328,11 +1329,11 @@ const SewagePipeInp = () => {
});
}
return {
admdstCd: String(d.admdstCd ?? ""),
admdstNm: String(d.admdstNm ?? ""),
pipeSeCd: String(d.pipeSeCd ?? ""),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
pipeSeCd: nullableTrimmedString(d.pipeSeCd),
yearlyStatList,
rmrk: String(d.rmrk ?? ""),
rmrk: nullableTrimmedString(d.rmrk),
lyngPrlgWhol: formatNumber(d.lyngPrlg, "lyngPrlg"),
dmltnPrlgWhol: formatNumber(d.dmltnPrlg, "dmltnPrlg"),
pipeByPrstWhol: formatNumber(d.pipeByPrstWhol, "pipeByPrstWhol"),
@@ -1366,7 +1367,7 @@ const SewagePipeInp = () => {
return decimalPlaces > 0 ? parseFloat(num.toFixed(decimalPlaces)) : Math.round(num);
};
const submitList = currentData.map((d) => ({
pipeSeCd: String(d.pipeSeCd ?? ""),
pipeSeCd: nullableTrimmedString(d.pipeSeCd),
step1PdmtPrlg: formatNumber(d.step1PdmtPrlg, "step1PdmtPrlg"),
step2PdmtPrlg: formatNumber(d.step2PdmtPrlg, "step2PdmtPrlg"),
step3PdmtPrlg: formatNumber(d.step3PdmtPrlg, "step3PdmtPrlg"),
@@ -1374,10 +1375,10 @@ const SewagePipeInp = () => {
step5PdmtPrlg: formatNumber(d.step5PdmtPrlg, "step5PdmtPrlg"),
sqrePdmtPrlg: formatNumber(d.sqrePdmtPrlg, "sqrePdmtPrlg"),
etcPdmtPrlg: formatNumber(d.etcPdmtPrlg, "etcPdmtPrlg"),
rmrk: String(d.rmrk ?? ""),
rmrk: nullableTrimmedString(d.rmrk),
pdmtByTsmWhol: formatNumber(d.pdmtByTsmWhol, "pdmtByTsmWhol"),
admdstCd: String(d.admdstCd ?? ""),
admdstNm: String(d.admdstNm ?? ""),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
}));
const requestData: SeweragePipeInputPipeDiameterStatusSubmitRequest = {
...submitBase,
@@ -1429,11 +1430,11 @@ const SewagePipeInp = () => {
});
}
return {
emphsMngSeCd: String(d.emphsMngSeCd ?? ""),
admdstCd: String(d.admdstCd ?? ""),
admdstNm: String(d.admdstNm ?? ""),
emphsMngSeCd: nullableTrimmedString(d.emphsMngSeCd),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
yearlyStats,
rmrk: String(d.rmrk ?? ""),
rmrk: nullableTrimmedString(d.rmrk),
};
});
const requestData: SeweragePipeInputManholeStatusSubmitRequest = {
@@ -1653,10 +1654,10 @@ const SewagePipeInp = () => {
const userInfo = await getUserInfo();
const saveList = currentData.map((d) => ({
admdstCd: String(d.admdstCd ?? ""),
sggNm: String(d.sggNm ?? ""),
admdstNm: String(d.admdstNm ?? ""),
goalYr: String(d.goalYr ?? ""),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
goalYr: nullableTrimmedString(d.goalYr),
wholPplMtncPlanPrlg: formatNumber(d.wholPplMtncPlanPrlg, "wholPplMtncPlanPrlg"),
wholPlanPrlg: formatNumber(d.wholPlanPrlg, "wholPlanPrlg"),
wholFcltPrlg: formatNumber(d.wholFcltPrlg, "wholFcltPrlg"),
@@ -1692,7 +1693,7 @@ const SewagePipeInp = () => {
exlnOtflCnt: formatNumber(d.exlnOtflCnt, "exlnOtflCnt"),
sewerLdgrEdpPrlg: formatNumber(d.sewerLdgrEdpPrlg, "sewerLdgrEdpPrlg"),
sewerLdgrEdpRt: formatNumber(d.sewerLdgrEdpRt, "sewerLdgrEdpRt"),
rmrk: (d.rmrk as string | null) ?? null,
rmrk: nullableTrimmedString(d.rmrk),
}));
const param: SeweragePipeInputRegionalFactStatusSaveRequest = {
@@ -1745,12 +1746,12 @@ const SewagePipeInp = () => {
const userInfo = await getUserInfo();
const saveList = currentData.map((d) => ({
admdstCd: String(d.admdstCd ?? ""),
sggNm: String(d.sggNm ?? ""),
admdstNm: String(d.admdstNm ?? ""),
fcltSn: String(d.fcltSn ?? ""),
swtrmtFcltCd: String(d.swtrmtFcltCd ?? ""),
swtrmtFcltNm: String(d.swtrmtFcltNm ?? ""),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
fcltSn: nullableTrimmedString(d.fcltSn),
swtrmtFcltCd: nullableTrimmedString(d.swtrmtFcltCd),
swtrmtFcltNm: nullableTrimmedString(d.swtrmtFcltNm),
prcsFcltCpct: formatNumber(d.prcsFcltCpct, "prcsFcltCpct"),
prcsZoneArea: formatNumber(d.prcsZoneArea, "prcsZoneArea"),
cbsysPrcsZoneArea: formatNumber(d.cbsysPrcsZoneArea, "cbsysPrcsZoneArea"),
@@ -1772,7 +1773,7 @@ const SewagePipeInp = () => {
cbsysBrchlnPrlg: formatNumber(d.cbsysBrchlnPrlg, "cbsysBrchlnPrlg"),
exlnBrchlnPrlg: formatNumber(d.exlnBrchlnPrlg, "exlnBrchlnPrlg"),
drtwBrchlnPrlg: formatNumber(d.drtwBrchlnPrlg, "drtwBrchlnPrlg"),
rmrk: String(d.rmrk ?? ""),
rmrk: nullableTrimmedString(d.rmrk),
}));
const param: SeweragePipeInputFactInstallStatusSaveRequest = {
@@ -1847,11 +1848,11 @@ const SewagePipeInp = () => {
});
}
return {
admdstCd: String(d.admdstCd ?? ""),
admdstNm: String(d.admdstNm ?? ""),
pipeSeCd: String(d.pipeSeCd ?? ""),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
pipeSeCd: nullableTrimmedString(d.pipeSeCd),
yearlyStatList,
rmrk: String(d.rmrk ?? ""),
rmrk: nullableTrimmedString(d.rmrk),
lyngPrlgWhol: formatNumber(d.lyngPrlg, "lyngPrlg"),
dmltnPrlgWhol: formatNumber(d.dmltnPrlg, "dmltnPrlg"),
pipeByPrstWhol: formatNumber(d.pipeByPrstWhol, "pipeByPrstWhol"),
@@ -1907,7 +1908,7 @@ const SewagePipeInp = () => {
};
const saveList = currentData.map((d) => ({
pipeSeCd: String(d.pipeSeCd ?? ""),
pipeSeCd: nullableTrimmedString(d.pipeSeCd),
step1PdmtPrlg: formatNumber(d.step1PdmtPrlg, "step1PdmtPrlg"),
step2PdmtPrlg: formatNumber(d.step2PdmtPrlg, "step2PdmtPrlg"),
step3PdmtPrlg: formatNumber(d.step3PdmtPrlg, "step3PdmtPrlg"),
@@ -1915,10 +1916,10 @@ const SewagePipeInp = () => {
step5PdmtPrlg: formatNumber(d.step5PdmtPrlg, "step5PdmtPrlg"),
sqrePdmtPrlg: formatNumber(d.sqrePdmtPrlg, "sqrePdmtPrlg"),
etcPdmtPrlg: formatNumber(d.etcPdmtPrlg, "etcPdmtPrlg"),
rmrk: String(d.rmrk ?? ""),
rmrk: nullableTrimmedString(d.rmrk),
pdmtByTsmWhol: formatNumber(d.pdmtByTsmWhol, "pdmtByTsmWhol"),
admdstCd: String(d.admdstCd ?? ""),
admdstNm: String(d.admdstNm ?? ""),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
}));
const userInfo = await getUserInfo();
@@ -1993,11 +1994,11 @@ const SewagePipeInp = () => {
});
}
return {
emphsMngSeCd: String(d.emphsMngSeCd ?? ""),
admdstCd: String(d.admdstCd ?? ""),
admdstNm: String(d.admdstNm ?? ""),
emphsMngSeCd: nullableTrimmedString(d.emphsMngSeCd),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
yearlyStats,
rmrk: String(d.rmrk ?? ""),
rmrk: nullableTrimmedString(d.rmrk),
};
});
@@ -63,6 +63,7 @@ import {
patchVerificationFailedByTab,
} from "@/components/util/input/verification-failed-flag";
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { useAdminStore } from "@/store/admin-store";
import { useStatisticsInputFocusStore } from "@/store/statistics-input-focus-store";
import { useTabStore } from "@/store/tab-store";
@@ -153,17 +154,6 @@ function tabRowDataExists(
return Array.isArray(rows) && rows.length > 0;
}
function normalizeGridString(value: unknown): string {
if (value === null || value === undefined) return "";
return typeof value === "string" ? value : String(value);
}
function normalizeGridRmrk(value: unknown): string | null {
if (value === null || value === undefined) return null;
const s = typeof value === "string" ? value : String(value);
return s.trim() === "" ? null : s;
}
const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));
async function waitForImrJobCompleted(
@@ -217,9 +207,9 @@ function buildRepairRowList(
const formatNumber = buildColumnFormatNumber(RepairStatusInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
sggNm: normalizeGridString(d.sggNm),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
mendngWhol: formatNumber(d.mendngWhol, "mendngWhol"),
cbsysMendngPrlg: formatNumber(d.cbsysMendngPrlg, "cbsysMendngPrlg"),
sprsysExlnPrlg: formatNumber(d.sprsysExlnPrlg, "sprsysExlnPrlg"),
@@ -235,7 +225,7 @@ function buildRepairRowList(
stofcbrCnt: formatNumber(d.stofcbrCnt, "stofcbrCnt"),
otflCnt: formatNumber(d.otflCnt, "otflCnt"),
cctvExmnPrlg: formatNumber(d.cctvExmnPrlg, "cctvExmnPrlg"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
}));
}
@@ -245,9 +235,9 @@ function buildDredgingRowList(
const formatNumber = buildColumnFormatNumber(PipeDredgingStatusInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
sggNm: normalizeGridString(d.sggNm),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
wholFcltPrlg: formatNumber(d.wholFcltPrlg, "wholFcltPrlg"),
wholSwagePpl: formatNumber(d.wholSwagePpl, "wholSwagePpl"),
cbsysPplPrlg: formatNumber(d.cbsysPplPrlg, "cbsysPplPrlg"),
@@ -267,7 +257,7 @@ function buildDredgingRowList(
oceanEmsnQnt: formatNumber(d.oceanEmsnQnt, "oceanEmsnQnt"),
rcycQnt: formatNumber(d.rcycQnt, "rcycQnt"),
etcQnt: formatNumber(d.etcQnt, "etcQnt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
}));
}
@@ -17,6 +17,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
import { statisticsInputSewageReservoirPumpApi } from "@/entities/statistics/api/input/statistics-input-sewage-reservoir-pump-service";
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
@@ -264,13 +265,6 @@ function mapSewageReservoirListToGridRows(
});
}
function nullableTrimmedString(
value: string | number | null | undefined,
): string | null {
const s = String(value ?? "").trim();
return s === "" ? null : s;
}
function toGridNumber(value: string | number | null | undefined): number {
const n = Number(value);
return Number.isFinite(n) ? n : 0;
@@ -290,13 +284,13 @@ function toPumpDmtrExpln(value: string | number | null | undefined): number {
function resolveSewageReservoirAdmdst(
sggNm: string,
sggOptions: Sgg[],
): { admdstCd: string; admdstNm: string } {
): { admdstCd: string | null; admdstNm: string | null } {
const trimmed = sggNm.trim();
const matched = sggOptions.find((s) => s.gugun === trimmed);
if (matched) {
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
}
return { admdstCd: "", admdstNm: trimmed };
return { admdstCd: null, admdstNm: nullableTrimmedString(trimmed) };
}
/** 그리드 행 → ST00040001 저장/삭제 API 항목 */
@@ -308,19 +302,18 @@ function buildSewageReservoirSaveItem(
String(row.sggNm ?? ""),
sggOptions,
);
const fcltSn = String(row.fcltSn ?? "").trim();
return {
admdstCd,
admdstNm,
// 항목 추가 직후 저장(신규) — 그리드 fcltSn 없음 → API에는 "1"
fcltSn: fcltSn,
fcltNm: String(row.fcltNm ?? ""),
fcltPstnCn: String(row.fcltPstnCn ?? ""),
fcltSn: nullableTrimmedString(row.fcltSn),
fcltNm: nullableTrimmedString(row.fcltNm),
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
planDesignFreqCnt: toGridNumber(row.planDesignFreqCnt),
fldngPrvtnYn: normalizeOxYnValue(row.fldngPrvtnYn),
wqPlltnMtgtYn: normalizeOxYnValue(row.wqPlltnMtgtYn),
rtlztnUsgYn: normalizeOxYnValue(row.rtlztnUsgYn),
fldngPrvtnYn: nullableTrimmedString(normalizeOxYnValue(row.fldngPrvtnYn)),
wqPlltnMtgtYn: nullableTrimmedString(normalizeOxYnValue(row.wqPlltnMtgtYn)),
rtlztnUsgYn: nullableTrimmedString(normalizeOxYnValue(row.rtlztnUsgYn)),
fcltStrctCn: nullableTrimmedString(row.fcltStrctCn),
wtrStrgZoneArea: toGridNumber(row.wtrStrgZoneArea),
impdFcltCpct: toGridNumber(row.impdFcltCpct),
@@ -337,17 +330,17 @@ function buildSewageReservoirSaveItem(
pumpFcltN3PerPpqty: toGridNumber(row.pumpFcltN3PerPpqty),
pumpFcltN3PumpCnt: toGridNumber(row.pumpFcltN3PumpCnt),
pumpFcltN3RsrvPumpCnt: toGridNumber(row.pumpFcltN3RsrvPumpCnt),
prcsgFcltYn: String(row.prcsgFcltYn ? (row.prcsgFcltYn === '무' ? 'N' : 'Y') : ""),
ddrztnEqpmYn: String(row.ddrztnEqpmYn ? (row.prcsgFcltYn === '무' ? 'N' : 'Y') : ""),
oslfEtgtYn: String(row.oslfEtgtYn ? (row.prcsgFcltYn === '무' ? 'N' : 'Y') : ""),
prcsgFcltYn: row.prcsgFcltYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
ddrztnEqpmYn: row.ddrztnEqpmYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
oslfEtgtYn: row.oslfEtgtYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
mltvMthCn: nullableTrimmedString(row.mltvMthCn),
impdMthCn: nullableTrimmedString(row.impdMthCn),
impdPrcsMthdCn: nullableTrimmedString(row.impdPrcsMthdCn),
dschgWtrsExpln: String(row.dschgWtrsExpln ?? ""),
dschgWtrsExpln: nullableTrimmedString(row.dschgWtrsExpln),
prcptnLastDspsQnt: toGridNumber(row.prcptnLastDspsQnt),
ctmnLastDspsQnt: toGridNumber(row.ctmnLastDspsQnt),
prcptnLastDspsMthdExpln: String(row.prcptnLastDspsMthdExpln ?? ""),
ctmnLastDspsMthdExpln: String(row.ctmnLastDspsMthdExpln ?? ""),
prcptnLastDspsMthdExpln: nullableTrimmedString(row.prcptnLastDspsMthdExpln),
ctmnLastDspsMthdExpln: nullableTrimmedString(row.ctmnLastDspsMthdExpln),
oprtngDayCnt: toGridNumber(row.oprtngDayCnt),
grssMltvQnt: toGridNumber(row.grssMltvQnt),
rmrk: nullableTrimmedString(row.rmrk),
@@ -363,18 +356,17 @@ function buildRainfallPumpStationSaveItem(
String(row.sggNm ?? ""),
sggOptions,
);
const fcltSn = String(row.fcltSn ?? "").trim();
return {
admdstCd,
admdstNm,
fcltSn: fcltSn,
fcltNm: String(row.fcltNm ?? ""),
fcltPstnCn: String(row.fcltPstnCn ?? ""),
fcltyKndCn: String(row.fcltyKndCn ?? ""),
fcltSn: nullableTrimmedString(row.fcltSn),
fcltNm: nullableTrimmedString(row.fcltNm),
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
fcltyKndCn: nullableTrimmedString(row.fcltyKndCn),
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
planDesignFreqCnt: toGridNumber(row.planDesignFreqCnt),
wtrStrgZoneArea: toGridNumber(row.wtrStrgZoneArea),
rsvrYn: String(row.rsvrYn ? (row.rsvrYn === "무" ? "N" : "Y") : ""),
rsvrYn: row.rsvrYn ? (row.rsvrYn === "무" ? "N" : "Y") : null,
rsvrImpndQnt: toGridNumber(row.rsvrImpndQnt),
abstnRgnImpdQnt: toGridNumber(row.abstnRgnImpdQnt),
grssPpqty: toGridNumber(row.grssPpqty),
@@ -390,14 +382,14 @@ function buildRainfallPumpStationSaveItem(
pumpFcltN3PerPpqty: toGridNumber(row.pumpFcltN3PerPpqty),
pumpFcltN3PumpCnt: toGridNumber(row.pumpFcltN3PumpCnt),
pumpFcltN3RsrvPumpCnt: toGridNumber(row.pumpFcltN3RsrvPumpCnt),
prcsgFcltYn: String(row.prcsgFcltYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : ""),
ddrztnEqpmYn: String(row.ddrztnEqpmYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : ""),
oslfEtgtYn: String(row.oslfEtgtYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : ""),
dschgWtrsExpln: String(row.dschgWtrsExpln ?? ""),
prcsgFcltYn: row.prcsgFcltYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
ddrztnEqpmYn: row.ddrztnEqpmYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
oslfEtgtYn: row.oslfEtgtYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
dschgWtrsExpln: nullableTrimmedString(row.dschgWtrsExpln),
prcptnLastDspsQnt: toGridNumber(row.prcptnLastDspsQnt),
ctmnLastDspsQnt: toGridNumber(row.ctmnLastDspsQnt),
prcptnLastDspsMthdExpln: String(row.prcptnLastDspsMthdExpln ?? ""),
ctmnLastDspsMthdExpln: String(row.ctmnLastDspsMthdExpln ?? ""),
prcptnLastDspsMthdExpln: nullableTrimmedString(row.prcptnLastDspsMthdExpln),
ctmnLastDspsMthdExpln: nullableTrimmedString(row.ctmnLastDspsMthdExpln),
oprtngDayCnt: toGridNumber(row.oprtngDayCnt),
grssMltvQnt: toGridNumber(row.grssMltvQnt),
rmrk: nullableTrimmedString(row.rmrk),
@@ -67,6 +67,7 @@ import {
patchVerificationFailedByTab,
} from "@/components/util/input/verification-failed-flag";
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { useAdminStore } from "@/store/admin-store";
import { useTabStore } from "@/store/tab-store";
@@ -168,17 +169,6 @@ function mapRegionalListToGridRows<
});
}
function normalizeGridString(value: unknown): string {
if (value === null || value === undefined) return "";
return typeof value === "string" ? value : String(value);
}
function normalizeGridRmrk(value: unknown): string | null {
if (value === null || value === undefined) return null;
const s = typeof value === "string" ? value : String(value);
return s.trim() === "" ? null : s;
}
function buildColumnFormatNumber(columns: { fieldName?: string; dataFormat?: string }[]) {
const columnFormatMap = new Map<string, string>();
columns.forEach((col) => {
@@ -214,9 +204,9 @@ function buildSewerageFinanceSettleSaveList(
const formatNumber = buildColumnFormatNumber(SewerageFinanceSettleInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
sggNm: normalizeGridString(d.sggNm),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
cnterGovSprtAmt: formatNumber(d.cnterGovSprtAmt, "cnterGovSprtAmt"),
mctpvLcexpAmt: formatNumber(d.mctpvLcexpAmt, "mctpvLcexpAmt"),
wareaSggLclAmt: formatNumber(d.wareaSggLclAmt, "wareaSggLclAmt"),
@@ -240,7 +230,7 @@ function buildSewerageFinanceSettleSaveList(
etcAcdntCrfwAmt: formatNumber(d.etcAcdntCrfwAmt, "etcAcdntCrfwAmt"),
etcNrcpAmt: formatNumber(d.etcNrcpAmt, "etcNrcpAmt"),
etcAmt: formatNumber(d.etcAmt, "etcAmt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
fnnByWholPjtcoAmt: formatNumber(d.fnnByWholPjtcoAmt, "fnnByWholPjtcoAmt"),
usgByWholPjtcoAmt: formatNumber(d.usgByWholPjtcoAmt, "usgByWholPjtcoAmt"),
tmplntWholAmt: formatNumber(d.tmplntWholAmt, "tmplntWholAmt"),
@@ -256,13 +246,13 @@ function buildSewerageChargeSaveList(
const formatNumber = buildColumnFormatNumber(SewerageChargeInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
sggNm: normalizeGridString(d.sggNm),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
anlLevyQnt: formatNumber(d.anlLevyQnt, "anlLevyQnt"),
levyAmt: formatNumber(d.levyAmt, "levyAmt"),
grssPrmcoAmt: formatNumber(d.grssPrmcoAmt, "grssPrmcoAmt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
avgUntprcAmt: formatNumber(d.avgUntprcAmt, "avgUntprcAmt"),
grssUnitPrmcoAmt: formatNumber(d.grssUnitPrmcoAmt, "grssUnitPrmcoAmt"),
rlztnRt: formatNumber(d.rlztnRt, "rlztnRt"),
@@ -275,9 +265,9 @@ function buildSewerageUsageFeeSaveList(
const formatNumber = buildColumnFormatNumber(SewerageUsageFeeInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
sggNm: normalizeGridString(d.sggNm),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
hshusLevyAmt: formatNumber(d.hshusLevyAmt, "hshusLevyAmt"),
hshusLevyQnt: formatNumber(d.hshusLevyQnt, "hshusLevyQnt"),
hshusUntprcAmt: formatNumber(d.hshusUntprcAmt, "hshusUntprcAmt"),
@@ -299,7 +289,7 @@ function buildSewerageUsageFeeSaveList(
etcLevyAmt: formatNumber(d.etcLevyAmt, "etcLevyAmt"),
etcLevyQnt: formatNumber(d.etcLevyQnt, "etcLevyQnt"),
etcLevyUntprcAmt: formatNumber(d.etcLevyUntprcAmt, "etcLevyUntprcAmt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
levyAmt: formatNumber(d.levyAmt, "levyAmt"),
levyQnt: formatNumber(d.levyQnt, "levyQnt"),
}));
@@ -311,16 +301,16 @@ function buildCauserBurdenSaveList(
const formatNumber = buildColumnFormatNumber(CauserBurdenInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
sggNm: normalizeGridString(d.sggNm),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
sggNm: nullableTrimmedString(d.sggNm),
admdstNm: nullableTrimmedString(d.admdstNm),
levyEvntcsCnt: formatNumber(d.levyEvntcsCnt, "levyEvntcsCnt"),
levyAmt: formatNumber(d.levyAmt, "levyAmt"),
mltvEqpmEvntcsCnt: formatNumber(d.mltvEqpmEvntcsCnt, "mltvEqpmEvntcsCnt"),
mltvEqpmAmt: formatNumber(d.mltvEqpmAmt, "mltvEqpmAmt"),
othrCstrnOthrActrCnt: formatNumber(d.othrCstrnOthrActrCnt, "othrCstrnOthrActrCnt"),
othrCstrnOthrActrAmt: formatNumber(d.othrCstrnOthrActrAmt, "othrCstrnOthrActrAmt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
trgtByWholClctnAmt: formatNumber(d.trgtByWholClctnAmt, "trgtByWholClctnAmt"),
}));
}
@@ -50,6 +50,7 @@ import { SeweragePenetrationRateInpColumn } from "@/components/util/column/input
import { getFooterSummary } from "@/components/util/grid/footerSummary";
import { toGridRows } from "@/components/util/grid/gridFunction";
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { isVerificationFailedFromCommonInfo } from "@/components/util/input/verification-failed-flag";
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
import { useAdminStore } from "@/store/admin-store";
@@ -130,14 +131,6 @@ function getSewerageSupplyRateParams(
};
}
function normalizeGridString(value: unknown): string | null {
if (typeof value !== "string") {
return null;
}
return value.trim() === "" ? null : value;
}
// 하수도 통계 관리 > 01. 하수도 보급률
const SeweragePenetrationRateInp = () => {
const { setMessage: alert } = useAlertStore((state) => state);
@@ -488,12 +481,12 @@ const SeweragePenetrationRateInp = () => {
};
const convertedData: SewerageSupplyRateSaveItem[] = currentData.map((d) => ({
sggNm: normalizeGridString(d.sggNm),
admdstCd: normalizeGridString(d.admdstCd),
admdstNm: normalizeGridString(d.admdstNm),
trbtrNm: normalizeGridString(d.trbtrNm),
sggNm: nullableTrimmedString(d.sggNm),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
trbtrNm: nullableTrimmedString(d.trbtrNm),
spcCtpnRgnCn:
d.spcCtpnRgnCn === '해당없음' ? null : normalizeGridString(d.spcCtpnRgnCn),
d.spcCtpnRgnCn === '해당없음' ? null : nullableTrimmedString(d.spcCtpnRgnCn),
ts1SwtrmtPpltnCnt: formatNumber(d.ts1SwtrmtPpltnCnt, 'ts1SwtrmtPpltnCnt'),
ts2SwtrmtPpltnCnt: formatNumber(d.ts2SwtrmtPpltnCnt, 'ts2SwtrmtPpltnCnt'),
ts3SwtrmtPpltnCnt: formatNumber(d.ts3SwtrmtPpltnCnt, 'ts3SwtrmtPpltnCnt'),
@@ -506,7 +499,7 @@ const SeweragePenetrationRateInp = () => {
drtwPrcsPpltnCnt: formatNumber(d.drtwPrcsPpltnCnt, 'drtwPrcsPpltnCnt'),
spctnkPpltnCnt: formatNumber(d.spctnkPpltnCnt, 'spctnkPpltnCnt'),
staaExcpArea: formatNumber(d.staaExcpArea, 'staaExcpArea'),
rmrk: normalizeGridString(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
wholPpltnCnt: formatNumber(d.wholPpltnCnt, 'wholPpltnCnt'),
wholArea: formatNumber(d.wholArea, 'wholArea'),
wholSwtrmtPpltnCnt: formatNumber(d.wholSwtrmtPpltnCnt, 'wholSwtrmtPpltnCnt'),
@@ -671,14 +664,14 @@ const SeweragePenetrationRateInp = () => {
const convertedData: SewerageSupplyRateSaveItem[] = currentData.map((d) => ({
// 행정구역
sggNm: normalizeGridString(d.sggNm), // 시군구
admdstCd: normalizeGridString(d.admdstCd), // 행정코드
admdstNm: normalizeGridString(d.admdstNm), // 행정구역명
trbtrNm: normalizeGridString(d.trbtrNm), // 지류
sggNm: nullableTrimmedString(d.sggNm), // 시군구
admdstCd: nullableTrimmedString(d.admdstCd), // 행정코드
admdstNm: nullableTrimmedString(d.admdstNm), // 행정구역명
trbtrNm: nullableTrimmedString(d.trbtrNm), // 지류
spcCtpnRgnCn:
d.spcCtpnRgnCn === '해당없음'
? null
: normalizeGridString(d.spcCtpnRgnCn), // 특별대책지역
: nullableTrimmedString(d.spcCtpnRgnCn), // 특별대책지역
// 공공하수처리인구(명) - 물리적/생물학적/고도처리
ts1SwtrmtPpltnCnt: formatNumber(d.ts1SwtrmtPpltnCnt, 'ts1SwtrmtPpltnCnt'), // 물리적처리
ts2SwtrmtPpltnCnt: formatNumber(d.ts2SwtrmtPpltnCnt, 'ts2SwtrmtPpltnCnt'), // 생물학적처리
@@ -694,7 +687,7 @@ const SeweragePenetrationRateInp = () => {
drtwPrcsPpltnCnt: formatNumber(d.drtwPrcsPpltnCnt, 'drtwPrcsPpltnCnt'), // 오수처리인구
spctnkPpltnCnt: formatNumber(d.spctnkPpltnCnt, 'spctnkPpltnCnt'), // 정화조인구
staaExcpArea: formatNumber(d.staaExcpArea, 'staaExcpArea'), // 하수처리구역 외 면적(㎢)
rmrk: normalizeGridString(d.rmrk), // 비고
rmrk: nullableTrimmedString(d.rmrk), // 비고
// 합계·소계(계산필드 저장용)
wholPpltnCnt: formatNumber(d.wholPpltnCnt, 'wholPpltnCnt'), // 총인구(명)
wholArea: formatNumber(d.wholArea, 'wholArea'), // 총면적(㎢)
@@ -56,6 +56,7 @@ import {
patchVerificationFailedByTab,
} from "@/components/util/input/verification-failed-flag";
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { useAdminStore } from "@/store/admin-store";
import { useTabStore } from "@/store/tab-store";
@@ -172,17 +173,6 @@ function mapServiceLevelListToGridRows<
});
}
function normalizeGridString(value: unknown): string {
if (value === null || value === undefined) return "";
return typeof value === "string" ? value : String(value);
}
function normalizeGridRmrk(value: unknown): string | null {
if (value === null || value === undefined) return null;
const s = typeof value === "string" ? value : String(value);
return s.trim() === "" ? null : s;
}
function buildColumnFormatNumber(
columns: { fieldName?: string; dataFormat?: string }[],
) {
@@ -211,8 +201,8 @@ function buildComplaintSaveList(
const formatNumber = buildColumnFormatNumber(ComplaintInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
admdstNm: normalizeGridString(d.admdstNm),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
swtrmtPpltnCnt: formatNumber(d.swtrmtPpltnCnt, "swtrmtPpltnCnt"),
dschgWqCnt: formatNumber(d.dschgWqCnt, "dschgWqCnt"),
odorCnt: formatNumber(d.odorCnt, "odorCnt"),
@@ -221,7 +211,7 @@ function buildComplaintSaveList(
swagePplCnt: formatNumber(d.swagePplCnt, "swagePplCnt"),
sewerCrgAmt: formatNumber(d.sewerCrgAmt, "sewerCrgAmt"),
etcCnt: formatNumber(d.etcCnt, "etcCnt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
whol: formatNumber(d.whol, "whol"),
crtrPpltnCvlcptEvntcsCnt: formatNumber(
d.crtrPpltnCvlcptEvntcsCnt,
@@ -236,11 +226,11 @@ function buildResidentFriendlyFactSaveList(
const formatNumber = buildColumnFormatNumber(ResidentFriendlyFactInpColumn.columns);
return currentData.map((d) => ({
admdstCd: normalizeGridString(d.admdstCd),
admdstNm: normalizeGridString(d.admdstNm),
swtrmtFcltCd: normalizeGridString(d.swtrmtFcltCd),
swtrmtFcltNm: normalizeGridString(d.swtrmtFcltNm),
fcltSn: normalizeGridString(d.fcltSn),
admdstCd: nullableTrimmedString(d.admdstCd),
admdstNm: nullableTrimmedString(d.admdstNm),
swtrmtFcltCd: nullableTrimmedString(d.swtrmtFcltCd),
swtrmtFcltNm: nullableTrimmedString(d.swtrmtFcltNm),
fcltSn: nullableTrimmedString(d.fcltSn),
tmplntArea: formatNumber(d.tmplntArea, "tmplntArea"),
brkFcltArea: formatNumber(d.brkFcltArea, "brkFcltArea"),
childFrshpSpacArea: formatNumber(d.childFrshpSpacArea, "childFrshpSpacArea"),
@@ -250,7 +240,7 @@ function buildResidentFriendlyFactSaveList(
eduMultiFcltArea: formatNumber(d.eduMultiFcltArea, "eduMultiFcltArea"),
wtlndMakeArea: formatNumber(d.wtlndMakeArea, "wtlndMakeArea"),
etcCnt: formatNumber(d.etcCnt, "etcCnt"),
rmrk: normalizeGridRmrk(d.rmrk),
rmrk: nullableTrimmedString(d.rmrk),
}));
}
@@ -17,6 +17,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
import { nullableTrimmedString } from "@/components/util/input/nullableString";
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
import { statisticsInputWaterReuseApi } from "@/entities/statistics/api/input/statistics-input-water-reuse-service";
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
@@ -235,13 +236,6 @@ function buildSggNmColumn(
};
}
function nullableTrimmedString(
value: string | number | null | undefined,
): string | null {
const s = String(value ?? "").trim();
return s === "" ? null : s;
}
function toGridNumber(value: string | number | null | undefined): number {
const n = Number(value);
return Number.isFinite(n) ? n : 0;
@@ -250,9 +244,9 @@ function toGridNumber(value: string | number | null | undefined): number {
function resolveArticleAdmdst(
row: Record<string, string | number>,
sggOptions: Sgg[],
): { admdstCd: string; admdstNm: string } {
const existingCd = String(row.admdstCd ?? "").trim();
const existingNm = String(row.admdstNm ?? "").trim();
): { admdstCd: string | null; admdstNm: string | null } {
const existingCd = nullableTrimmedString(row.admdstCd);
const existingNm = nullableTrimmedString(row.admdstNm);
if (existingCd && existingNm) {
return { admdstCd: existingCd, admdstNm: existingNm };
}
@@ -261,7 +255,10 @@ function resolveArticleAdmdst(
if (matched) {
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
}
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
return {
admdstCd: existingCd,
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
};
}
function getArticleRowSnField(tabKey: string): "fcltSn" | "bplcSn" | null {
@@ -297,11 +294,11 @@ function buildRecycledWaterStatusSaveItem(
return {
admdstCd,
admdstNm,
fcltSn: String(row.fcltSn ?? "").trim(),
fcltNm: String(row.fcltNm ?? "").trim(),
bldgSeCn: String(row.bldgSeCn ?? "").trim(),
fcltPstnCn: String(row.fcltPstnCn ?? "").trim(),
lglTrgtYn: String(row.lglTrgtYn ?? "").trim(),
fcltSn: nullableTrimmedString(row.fcltSn),
fcltNm: nullableTrimmedString(row.fcltNm),
bldgSeCn: nullableTrimmedString(row.bldgSeCn),
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
lglTrgtYn: nullableTrimmedString(row.lglTrgtYn),
cmptnStrtYmd: toCompactYmdOrNull(row.cmptnStrtYmd),
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
archWholArea: toGridNumber(row.archWholArea),
@@ -309,7 +306,7 @@ function buildRecycledWaterStatusSaveItem(
wtrUseQnt: toGridNumber(row.wtrUseQnt),
ruswtrUtztnQnt: toGridNumber(row.ruswtrUtztnQnt),
sbstCntUtztnQnt: toGridNumber(row.sbstCntUtztnQnt),
mnUsgCn: String(row.mnUsgCn ?? "").trim(),
mnUsgCn: nullableTrimmedString(row.mnUsgCn),
ruswtrOperAmt: toGridNumber(row.ruswtrOperAmt),
rmrk: nullableTrimmedString(row.rmrk),
};
@@ -323,18 +320,18 @@ function buildRainFallUtilFactStatusSaveItem(
return {
admdstCd,
admdstNm,
fcltSn: String(row.fcltSn ?? "").trim(),
fcltNm: String(row.fcltNm ?? "").trim(),
bdstTypCn: String(row.bdstTypCn ?? "").trim(),
fcltPstnCn: String(row.fcltPstnCn ?? "").trim(),
lglTrgtYn: String(row.lglTrgtYn ?? "").trim(),
fcltSn: nullableTrimmedString(row.fcltSn),
fcltNm: nullableTrimmedString(row.fcltNm),
bdstTypCn: nullableTrimmedString(row.bdstTypCn),
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
lglTrgtYn: nullableTrimmedString(row.lglTrgtYn),
cmptYmd: toCompactYmdOrNull(row.cmptYmd),
instlAmt: toGridNumber(row.instlAmt),
rcptMynCn: String(row.rcptMynCn ?? "").trim(),
filtrPrcsFcltYnExpln: String(row.filtrPrcsFcltYnExpln ?? "").trim(),
rcptMynCn: nullableTrimmedString(row.rcptMynCn),
filtrPrcsFcltYnExpln: nullableTrimmedString(row.filtrPrcsFcltYnExpln),
impdCpct: toGridNumber(row.impdCpct),
anlUseQnt: toGridNumber(row.anlUseQnt),
exlnUtlzUsgExpln: String(row.exlnUtlzUsgExpln ?? "").trim(),
exlnUtlzUsgExpln: nullableTrimmedString(row.exlnUtlzUsgExpln),
anlOperAmt: toGridNumber(row.anlOperAmt),
rmrk: nullableTrimmedString(row.rmrk),
};
@@ -348,10 +345,10 @@ function buildTreatWaterReuseDesignConstStatusSaveItem(
return {
admdstCd,
admdstNm,
bplcSn: String(row.bplcSn ?? "").trim(),
bplcNm: String(row.bplcNm ?? "").trim(),
rprsvNm: String(row.rprsvNm ?? "").trim(),
bplcPstnCn: String(row.bplcPstnCn ?? "").trim(),
bplcSn: nullableTrimmedString(row.bplcSn),
bplcNm: nullableTrimmedString(row.bplcNm),
rprsvNm: nullableTrimmedString(row.rprsvNm),
bplcPstnCn: nullableTrimmedString(row.bplcPstnCn),
coRegYmd: toCompactYmdOrNull(row.coRegYmd),
rmrk: nullableTrimmedString(row.rmrk),
};
@@ -365,10 +362,10 @@ function buildTreatWaterReuseBusinessApprStatusSaveItem(
return {
admdstCd,
admdstNm,
bplcSn: String(row.bplcSn ?? "").trim(),
bplcNm: String(row.bplcNm ?? "").trim(),
rprsvNm: String(row.rprsvNm ?? "").trim(),
bplcPstnCn: String(row.bplcPstnCn ?? "").trim(),
bplcSn: nullableTrimmedString(row.bplcSn),
bplcNm: nullableTrimmedString(row.bplcNm),
rprsvNm: nullableTrimmedString(row.rprsvNm),
bplcPstnCn: nullableTrimmedString(row.bplcPstnCn),
coRegYmd: toCompactYmdOrNull(row.coRegYmd),
rmrk: nullableTrimmedString(row.rmrk),
};
@@ -378,18 +375,18 @@ function buildPublicSewageTreatWaterReuseSaveItem(
row: Record<string, string | number>,
): PublicSewageTreatWaterReuseSaveItem {
return {
admdstCd: String(row.admdstCd ?? "").trim(),
admdstNm: String(row.admdstNm ?? row.sggNm ?? "").trim(),
fcltSn: String(row.fcltSn ?? "").trim(),
swtrmtFcltCd: String(row.swtrmtFcltCd ?? "").trim(),
swtrmtFcltNm: String(row.swtrmtFcltNm ?? "").trim(),
admdstCd: nullableTrimmedString(row.admdstCd),
admdstNm: nullableTrimmedString(row.admdstNm ?? row.sggNm),
fcltSn: nullableTrimmedString(row.fcltSn),
swtrmtFcltCd: nullableTrimmedString(row.swtrmtFcltCd),
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
wholPrcsQnt: toGridNumber(row.wholPrcsQnt),
lglYn: String(row.lglYn ?? "").trim(),
instlYn: String(row.instlYn ?? "").trim(),
lglYn: nullableTrimmedString(row.lglYn),
instlYn: nullableTrimmedString(row.instlYn),
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
instlAprvYmd: toCompactYmdOrNull(row.instlAprvYmd),
rprcsFcltCpct: toGridNumber(row.rprcsFcltCpct),
mtcnsNm: String(row.mtcnsNm ?? "").trim(),
mtcnsNm: nullableTrimmedString(row.mtcnsNm),
ruswtPplLen: toGridNumber(row.ruswtPplLen),
ruswtPumpLen: toGridNumber(row.ruswtPumpLen),
rmrk: nullableTrimmedString(row.rmrk),
@@ -14,12 +14,12 @@ import { CodeApi, CodeSelect } from "@/entities/code";
import {
type ApproveRequest,
type RejectRequest,
type ReportStatusResponseDto,
statisticsApprovalApi,
type StatisticsVerificationFilterState,
statisticsVerificationReportColumnInfo,
statisticsVerificationResultColumnInfo,
type StatisticsVerificationSubFilterState,
type StatsInputStatusList,
useSggList,
useSidoList,
useStatsVrfcRptData,
@@ -72,8 +72,8 @@ const getYearOptions = () => {
};
function isSameStatsInputStatusRow(
a: StatsInputStatusList,
b: StatsInputStatusList,
a: ReportStatusResponseDto,
b: ReportStatusResponseDto,
): boolean {
return (
a.ctpvNm === b.ctpvNm && a.sggNm === b.sggNm && a.statsCd === b.statsCd
@@ -132,11 +132,12 @@ const DEFAULT_FILTERS: StatisticsVerificationFilterState = {
statsYr: String(dayjs().year() - 1),
sewerBzmnCd: null,
statsCd: null,
laeSbmsnSttsCd: "3",
pbcpSbmsnSttsCd: "3",
};
const DEFAULT_SUB_FILTERS: StatisticsVerificationSubFilterState = {
...DEFAULT_FILTERS,
laeSbmsnSttsCd: "3",
prcsYnList: "1,2",
rejectCode: "0",
pbcpAprvYn: "N",
@@ -153,6 +154,13 @@ const REJECT_STATUS_OPTIONS = [
{ label: "공단반려", value: "2" },
];
const PBCP_SBMSN_STTS_OPTIONS = [
{ label: "미작성", value: "0" },
{ label: "작성중", value: "1" },
{ label: "승인", value: "3" },
{ label: "반려", value: "4" },
];
function StatisticsVerificationReport() {
const queryClient = useQueryClient();
const userInfo = useUserStore((state) => state.userInfo);
@@ -163,7 +171,7 @@ function StatisticsVerificationReport() {
const [subFilters, setSubFilters] =
useState<StatisticsVerificationSubFilterState>(DEFAULT_SUB_FILTERS);
const [selectedReportRows, setSelectedReportRows] = useState<
StatsInputStatusList[]
ReportStatusResponseDto[]
>([]);
const [selectedResultRows, setSelectedResultRows] = useState<
VerifyResultItem[]
@@ -227,9 +235,6 @@ function StatisticsVerificationReport() {
const statisticsVerificationReportQuery = useStatsVrfcRptData(
statisticsVerificationReportFilters,
);
const statisticsVerificationResultQuery =
useStatsVrfcRsltData(detailParams);
const statisticsVerificationReportData =
statisticsVerificationReportQuery.data ?? [];
const statisticsVerificationReportGridRows = useMemo(
@@ -237,6 +242,8 @@ function StatisticsVerificationReport() {
[statisticsVerificationReportData],
);
const statisticsVerificationResultQuery =
useStatsVrfcRsltData(detailParams);
const statisticsVerificationResultData = useMemo(
() =>
statisticsVerificationResultQuery.data?.pages.flatMap(
@@ -560,7 +567,7 @@ function StatisticsVerificationReport() {
function handleReportRefresh() {
queryClient.invalidateQueries({
queryKey: [ENDPOINT.ST_SERVICE.INPUT, "statistics-input-status"],
queryKey: [ENDPOINT.ST_SERVICE.INPUT, "validation-report"],
});
}
@@ -605,6 +612,12 @@ function StatisticsVerificationReport() {
onChange={handleFilterChange("statsYr")}
options={getYearOptions()}
/>
<FilterSelect
label="공단진행상태"
value={filters.pbcpSbmsnSttsCd ?? ""}
onChange={handleFilterChange("pbcpSbmsnSttsCd")}
options={PBCP_SBMSN_STTS_OPTIONS}
/>
<div className="flex items-center gap-2">
<Label>통계지표</Label>
<CodeSelect
@@ -645,7 +658,7 @@ function StatisticsVerificationReport() {
setRowData={() => {}}
showHeaderCheckbox={true}
gridHeight={30}
onRowClick={(row: StatsInputStatusList) => {
onRowClick={(row: ReportStatusResponseDto) => {
setSubFilters((prev) => ({
...prev,
ctpvNm: row?.ctpvNm ?? "",
@@ -0,0 +1,8 @@
/** 그리드/폼 문자열 → API 전송용. 빈값·공백만이면 null */
export function nullableTrimmedString(
value: string | number | null | undefined | unknown,
): string | null {
if (value === null || value === undefined) return null;
const s = typeof value === "string" ? value.trim() : String(value).trim();
return s === "" ? null : s;
}
@@ -2,6 +2,8 @@ import { stClient } from "@/shared/api";
import { ENDPOINT } from "@/shared/config";
import type {
ReportSearchRequestDto,
ReportStatusListApiResponse,
StatisticsInputStatusService,
StatsInputStatusListApiResponse,
StatsInputStatusListRequestParams,
@@ -17,6 +19,16 @@ export class StatisticsInputStatusApiService implements StatisticsInputStatusSer
);
return response.data;
}
public async getStatsValidationReport(
request: ReportSearchRequestDto,
): Promise<ReportStatusListApiResponse> {
const response = await stClient.get<ReportStatusListApiResponse>(
`${ENDPOINT.ST_SERVICE.INPUT}/stats-input-status/validation-report`,
{ params: request },
);
return response.data;
}
}
export const StatisticsInputStatusApi = new StatisticsInputStatusApiService();
@@ -122,18 +122,24 @@ export const useStatsVrfcRptData = (
return useQuery({
queryKey: [
ENDPOINT.ST_SERVICE.INPUT,
"statistics-input-status",
"validation-report",
submittedMainFilters?.statsYr ?? "",
submittedMainFilters?.ctpvNm ?? "",
submittedMainFilters?.sggNm ?? "",
submittedMainFilters?.sewerBzmnCd ?? "",
submittedMainFilters?.statsCd ?? "",
submittedMainFilters?.pbcpSbmsnSttsCd ?? "",
],
queryFn: async () => {
if (!submittedMainFilters) return [];
const {
ctpvSewerBzmnCd: _ctpvSewerBzmnCd,
sggSewerBzmnCd: _sggSewerBzmnCd,
...request
} = submittedMainFilters;
const response =
await StatisticsInputStatusApi.getStatisticsInputStatusList(
submittedMainFilters,
await StatisticsInputStatusApi.getStatsValidationReport(
request,
);
if (response.status !== "success")
throw new Error(response.message);
+5 -1
View File
@@ -76,7 +76,11 @@ export {
type ImrLogResponse,
} from "./model/imr/imr-interface";
export { imrVerificationHistoryColumns } from "./model/imr/imr-verification-history-columns";
export { type StatsInputStatusList } from "./model/input/statistics-input-status-interface";
export {
type ReportSearchRequestDto,
type ReportStatusResponseDto,
type StatsInputStatusList,
} from "./model/input/statistics-input-status-interface";
export { userListColumns } from "./model/notice-talk/notice-talk-sending-columns";
export {
type BusinessSendRequest,
@@ -97,10 +97,39 @@ export interface ExcretaTreatmentFacilityRequestParams {
*/
export type ExcretaTreatmentFacilitySaveItem = Omit<
ExcretaTreatmentFacilityItem,
"sggNm" | "verificationResult" | "cmptnStrtYmd" | "oprtngStrtYmd"
| "sggNm"
| "verificationResult"
| "cmptnStrtYmd"
| "oprtngStrtYmd"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "fcltNm"
| "fcltPstnCn"
| "telNo"
| "prcsMthdExpln"
| "linkTmplntCn"
| "wtsysNm"
| "trbtrNm"
| "msirbCn"
| "ssirbCn"
| "operMthdCdCn"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
fcltNm: string | null;
fcltPstnCn: string | null;
telNo: string | null;
cmptnStrtYmd: string | null;
oprtngStrtYmd: string | null;
prcsMthdExpln: string | null;
linkTmplntCn: string | null;
wtsysNm: string | null;
trbtrNm: string | null;
msirbCn: string | null;
ssirbCn: string | null;
operMthdCdCn: string | null;
};
/** 분뇨처리시설(ST00070001) 저장 API 요청 */
@@ -207,8 +207,8 @@ export interface PrivateSewageDesigStatusRequestParams {
* `sggNm`·계산필드(`wholDrtwPrcsFcltCnt`, `wholStaaCnt`, `staaExcpWhol`)·검증결과는 제외.
*/
export interface SewageTreatFactStatusSaveItem {
admdstCd: string;
admdstNm: string;
admdstCd: string | null;
admdstNm: string | null;
step1StaaPrcsQnt: number;
step2StaaPrcsQnt: number;
step3StaaPrcsQnt: number;
@@ -279,8 +279,8 @@ export interface SewageTreatFactStatusSubmitResponse {
* `staaExcpWhol`, `staaExcpPrcsMthByWhol`, `staaExcpPrcsCpctByWhol`)·검증결과는 제외.
*/
export interface SepticTankStatusSaveItem {
admdstCd: string;
admdstNm: string;
admdstCd: string | null;
admdstNm: string | null;
staaInsdSttkNprsflCnt: number;
step1StaaInsdSttkFrcCnt: number;
staaInsdSprktpFltrtbCnt: number;
@@ -364,8 +364,8 @@ export interface SepticTankStatusSubmitResponse {
* `sggNm`·검증결과는 제외.
*/
export interface PrivateSewageDesigStatusSaveItem {
admdstCd: string;
admdstNm: string;
admdstCd: string | null;
admdstNm: string | null;
indvSwagePbancRgnCnt: number;
indvSwageDsgnScpLen: number;
spctnkGrssFcltCnt: number;
@@ -107,7 +107,21 @@ export type PumpingStationSaveItem = Omit<
| "drtwPumpGrssPpqty"
| "exlnPumpGrssPpqty"
| "oprtngStrtYmd"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "swtrmtFcltNm"
| "fcltNm"
| "pumpSeNm"
| "fcltPstnCn"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
swtrmtFcltNm: string | null;
fcltNm: string | null;
pumpSeNm: string | null;
fcltPstnCn: string | null;
oprtngStrtYmd: string | null;
};
@@ -176,24 +176,54 @@ export type PrivateSewageTreatRelatedIndustryApiResponse =
/** ST00120001·ST00120002 저장 — `saveList` / `deleteList` 항목 (`sggNm`·계산필드·검증결과 제외) */
export type PublicInstitutionSewerIndustrySaveItem = Omit<
PublicInstitutionSewerIndustryItem,
"sggNm" | "verificationResult" | "empGrssCnt" | "techWholNope"
>;
| "sggNm"
| "verificationResult"
| "empGrssCnt"
| "techWholNope"
| "admdstCd"
| "admdstNm"
| "ognzSn"
| "ognzNm"
> & {
admdstCd: string | null;
admdstNm: string | null;
ognzSn: string | null;
ognzNm: string | null;
};
export type PublicInstitutionExcretaIndustrySaveItem = Omit<
PublicInstitutionExcretaIndustryItem,
"sggNm" | "verificationResult" | "empGrssCnt" | "techWholNope"
>;
| "sggNm"
| "verificationResult"
| "empGrssCnt"
| "techWholNope"
| "admdstCd"
| "admdstNm"
| "ognzSn"
| "ognzNm"
> & {
admdstCd: string | null;
admdstNm: string | null;
ognzSn: string | null;
ognzNm: string | null;
};
/** ST00120003·ST00120004 저장 — `saveList` 항목 (`sggNm`·계산필드·검증결과 제외) */
export type ExcretaRelatedIndustrySaveItem = Omit<
ExcretaRelatedIndustryItem,
"sggNm" | "verificationResult" | "fcltSecrPrstCnt"
>;
"sggNm" | "verificationResult" | "fcltSecrPrstCnt" | "admdstCd" | "admdstNm"
> & {
admdstCd: string | null;
admdstNm: string | null;
};
export type PrivateSewageTreatRelatedIndustrySaveItem = Omit<
PrivateSewageTreatRelatedIndustryItem,
"sggNm" | "verificationResult"
>;
"sggNm" | "verificationResult" | "admdstCd" | "admdstNm"
> & {
admdstCd: string | null;
admdstNm: string | null;
};
export interface SewageExcretaRelatedSaveRequestBase {
statsYr: string;
@@ -54,7 +54,7 @@ export interface SlurgeProcessingFacStatusItem {
sggNm: string;
admdstNm: string;
fcltSn: string;
swtrmtFcltNm: string;
swtrmtFcltNm: string | null;
swtrmtFcltCd: string;
gnamWhol: number;
itslfQnt: number;
@@ -132,7 +132,30 @@ export type SlurgeProcessingFacStatusSaveItem = Omit<
| "dryPrcsWhol"
| "fuelPrcsWhol"
| "otsdCnsgnWhol"
>;
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "swtrmtFcltCd"
| "transfTmplntNm"
| "cmpsPrcsFcltBzentyNm"
| "incnrPrcsFcltNm"
| "stbznPrcsFcltNm"
| "dryPrcsFcltNm"
| "fuelPrcsFcltNm"
| "otsdCnsgnFcltNm"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
swtrmtFcltCd: string | null;
transfTmplntNm: string | null;
cmpsPrcsFcltBzentyNm: string | null;
incnrPrcsFcltNm: string | null;
stbznPrcsFcltNm: string | null;
dryPrcsFcltNm: string | null;
fuelPrcsFcltNm: string | null;
otsdCnsgnFcltNm: string | null;
};
/** ST00110001 저장 API 요청 */
export interface SlurgeProcessingFacStatusSaveRequest {
@@ -193,7 +216,7 @@ export interface DigestorOperatingStatusItem {
admdstNm: string;
fcltSn: string;
swtrmtFcltCd: string;
swtrmtFcltNm: string;
swtrmtFcltNm: string | null;
digstnEnYn: string;
digstnCpct: number;
actlDrvnCpct: number;
@@ -228,8 +251,21 @@ export type DigestorOperatingStatusApiResponse =
*/
export type DigestorOperatingStatusSaveItem = Omit<
DigestorOperatingStatusItem,
"sggNm" | "verificationResult" | "digstnGasUtztnWholPrst"
>;
| "sggNm"
| "verificationResult"
| "digstnGasUtztnWholPrst"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "swtrmtFcltCd"
| "digstnEnYn"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
swtrmtFcltCd: string | null;
digstnEnYn: string | null;
};
/** ST00110002 저장 API 요청 */
export interface DigestorOperatingStatusSaveRequest {
@@ -317,8 +353,22 @@ export type SewageSlurgeProcessingFacStatusApiResponse =
*/
export type SewageSlurgeProcessingFacStatusSaveItem = Omit<
SewageSlurgeProcessingFacStatusItem,
"sggNm" | "verificationResult" | "oprtngRt" | "fcltPstnCn"
>;
| "sggNm"
| "verificationResult"
| "oprtngRt"
| "fcltPstnCn"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "fcltNm"
| "prcsMthExpln"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
fcltNm: string | null;
prcsMthExpln: string | null;
};
/** ST00110003 저장 API 요청 */
export interface SewageSlurgeProcessingFacStatusSaveRequest {
@@ -390,7 +440,7 @@ export interface ExcretaSlurgeProcessingStatusItem {
fuelQnt: number;
etcQnt: number;
nondspsQnt: number;
swtrmtFcltNm: string;
swtrmtFcltNm: string | null;
rmrk: string | null;
verificationResult?: SewageExcretaSlurgeVerificationResult;
}
@@ -412,8 +462,22 @@ export type ExcretaSlurgeProcessingStatusApiResponse =
*/
export type ExcretaSlurgeProcessingStatusSaveItem = Omit<
ExcretaSlurgeProcessingStatusItem,
"sggNm" | "verificationResult" | "gnam" | "wholDspsQnt"
>;
| "sggNm"
| "verificationResult"
| "gnam"
| "wholDspsQnt"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "fcltNm"
| "fcltPstnCn"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
fcltNm: string | null;
fcltPstnCn: string | null;
};
/** ST00110004 저장 API 요청 */
export interface ExcretaSlurgeProcessingStatusSaveRequest {
@@ -475,7 +539,7 @@ export interface PublicSewageFacilityItem {
admdstCd: string;
admdstNm: string;
swtrmtFcltCd: string;
swtrmtFcltNm: string;
swtrmtFcltNm: string | null;
fcltSn: string;
}
@@ -97,9 +97,9 @@ export type SewagePipeMaintainDredgingResponse = ApiResponse<SewagePipeMaintainD
/** ST00030001 하수관로 유지관리 > 개보수 저장·제출 API 행 */
export interface SewagePipeMaintainRepairSaveItem {
admdstCd: string;
sggNm: string;
admdstNm: string;
admdstCd: string | null;
sggNm: string | null;
admdstNm: string | null;
mendngWhol: number;
cbsysMendngPrlg: number;
sprsysExlnPrlg: number;
@@ -164,9 +164,9 @@ export interface SewagePipeMaintainRepairSubmitResponse {
/** ST00030002 하수관로 유지관리 > 관로준설 저장·제출 API 행 */
export interface SewagePipeMaintainDredgingSaveItem {
admdstCd: string;
sggNm: string;
admdstNm: string;
admdstCd: string | null;
sggNm: string | null;
admdstNm: string | null;
wholFcltPrlg: number;
wholSwagePpl: number;
cbsysPplPrlg: number;
@@ -172,9 +172,39 @@ export interface SewageReservoirRequestParams {
*/
export type SewageReservoirSaveItem = Omit<
SewageReservoirItem,
"sggNm" | "verificationResult" | "oprtngStrtYmd"
| "sggNm"
| "verificationResult"
| "oprtngStrtYmd"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "fcltNm"
| "fcltPstnCn"
| "fldngPrvtnYn"
| "wqPlltnMtgtYn"
| "rtlztnUsgYn"
| "prcsgFcltYn"
| "ddrztnEqpmYn"
| "oslfEtgtYn"
| "dschgWtrsExpln"
| "prcptnLastDspsMthdExpln"
| "ctmnLastDspsMthdExpln"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
fcltNm: string | null;
fcltPstnCn: string | null;
oprtngStrtYmd: string | null;
fldngPrvtnYn: string | null;
wqPlltnMtgtYn: string | null;
rtlztnUsgYn: string | null;
prcsgFcltYn: string | null;
ddrztnEqpmYn: string | null;
oslfEtgtYn: string | null;
dschgWtrsExpln: string | null;
prcptnLastDspsMthdExpln: string | null;
ctmnLastDspsMthdExpln: string | null;
};
/** 하수저류시설(ST00040001) 저장 API 요청 */
@@ -231,9 +261,37 @@ export interface SewageReservoirSubmitResponse {
*/
export type RainfallPumpStationSaveItem = Omit<
RainfallPumpStationItem,
"sggNm" | "verificationResult" | "oprtngStrtYmd"
| "sggNm"
| "verificationResult"
| "oprtngStrtYmd"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "fcltNm"
| "fcltPstnCn"
| "fcltyKndCn"
| "rsvrYn"
| "prcsgFcltYn"
| "ddrztnEqpmYn"
| "oslfEtgtYn"
| "dschgWtrsExpln"
| "prcptnLastDspsMthdExpln"
| "ctmnLastDspsMthdExpln"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
fcltNm: string | null;
fcltPstnCn: string | null;
fcltyKndCn: string | null;
oprtngStrtYmd: string | null;
rsvrYn: string | null;
prcsgFcltYn: string | null;
ddrztnEqpmYn: string | null;
oslfEtgtYn: string | null;
dschgWtrsExpln: string | null;
prcptnLastDspsMthdExpln: string | null;
ctmnLastDspsMthdExpln: string | null;
};
/**
@@ -91,9 +91,9 @@ export interface SewerageFinanceSettleRequestParams {
* `SewerageFinanceSettleInpColumn` fieldName과 동일 (`ctpvNm` 그리드 값은 요청 `ctpvNm` 시도명).
*/
export interface SewerageFinanceSettleSaveItem {
admdstCd: string;
sggNm: string;
admdstNm: string;
admdstCd: string | null;
sggNm: string | null;
admdstNm: string | null;
cnterGovSprtAmt: number;
mctpvLcexpAmt: number;
wareaSggLclAmt: number;
@@ -252,9 +252,9 @@ export interface SewerageChargeRequestParams {
* `SewerageChargeInpColumn` fieldName과 동일 (`ctpvNm` 그리드 값은 요청 `ctpvNm` 시도명).
*/
export interface SewerageChargeSaveItem {
admdstCd: string;
sggNm: string;
admdstNm: string;
admdstCd: string | null;
sggNm: string | null;
admdstNm: string | null;
anlLevyQnt: number;
levyAmt: number;
grssPrmcoAmt: number;
@@ -359,9 +359,9 @@ export interface SewerageUsageFeeRequestParams {
* `SewerageUsageFeeInpColumn` fieldName과 동일 (`ctpvNm` 그리드 값은 요청 `ctpvNm` 시도명).
*/
export interface SewerageUsageFeeSaveItem {
admdstCd: string;
sggNm: string;
admdstNm: string;
admdstCd: string | null;
sggNm: string | null;
admdstNm: string | null;
hshusLevyAmt: number;
hshusLevyQnt: number;
hshusUntprcAmt: number;
@@ -469,9 +469,9 @@ export interface CauserBurdenRequestParams {
* `trgtByWholClctnEvntcsCnt`는 조회·그리드 전용이며 저장·제출 요청에는 포함하지 않음.
*/
export interface CauserBurdenSaveItem {
admdstCd: string;
sggNm: string;
admdstNm: string;
admdstCd: string | null;
sggNm: string | null;
admdstNm: string | null;
levyEvntcsCnt: number;
levyAmt: number;
mltvEqpmEvntcsCnt: number;
@@ -128,8 +128,8 @@ export interface SewerageServiceLevelResidentFriendlyFactRequestParams {
/** ST00130001 저장 `saveList[]` 한 행 */
export interface SewerageServiceLevelComplaintSaveItem {
admdstCd: string;
admdstNm: string;
admdstCd: string | null;
admdstNm: string | null;
swtrmtPpltnCnt: number;
dschgWqCnt: number;
odorCnt: number;
@@ -162,11 +162,11 @@ export interface SewerageServiceLevelComplaintSaveResponse {
/** ST00130002 저장 `saveList[]` 한 행 */
export interface SewerageServiceLevelResidentFriendlyFactSaveItem {
admdstCd: string;
admdstNm: string;
swtrmtFcltCd: string;
swtrmtFcltNm: string;
fcltSn: string;
admdstCd: string | null;
admdstNm: string | null;
swtrmtFcltCd: string | null;
swtrmtFcltNm: string | null;
fcltSn: string | null;
tmplntArea: number;
brkFcltArea: number;
childFrshpSpacArea: number;
@@ -33,8 +33,63 @@ export type StatsInputStatusListApiResponse = ApiResponse<
message: string;
};
/** 통계 검증 리포트 RequestDto */
export interface ReportSearchRequestDto {
sewerBzmnCd?: string | null;
ctpvNm?: string | null;
sggNm?: string | null;
statsYr: string;
statsCd?: string | null;
/** 공단 상태 코드 (0:미작성, 1:작성중, 2:제출, 3:승인, 4:반려, 5:검토중) */
pbcpSbmsnSttsCd?: string | null;
}
/** 통계 검증 리포트 현황 조회 ResponseDto */
export interface ReportStatusResponseDto {
ctpvNm?: string;
sggNm?: string;
sewerBzmnCd?: string;
statsCd?: string;
menuTabName?: string;
laeSbmsnSttsCd?: string;
laeSbmsnSttsNm?: string;
laeSbmsnYmd?: string;
statPicSbmsnSttsCd?: string;
statPicSbmsnSttsNm?: string;
ctpvSbmsnYmd?: string;
pbcpSbmsnSttsCd?: string;
pbcpSbmsnSttsNm?: string;
pbcpCfmtnYmd?: string;
laePicNm?: string;
laePicTelNo?: string;
laeKbrdrDeptNm?: string;
laeKbrdrJbgdNm?: string;
laeIdfrNm?: string;
laeIdfrTelNo?: string;
laeIdfrDeptNm?: string;
laeIdfrJbgdNm?: string;
mctpvIdfrNm?: string;
mctpvIdfrTelNo?: string;
mctpvIdfrDeptNm?: string;
mctpvIdfrJbgdNm?: string;
lastCfmtnPicNm?: string;
lastCfmtnPicTelNo?: string;
lastCfmtnPicDeptNm?: string;
lastCfmtnPicJbgdNm?: string;
rjctOpnnCn?: string;
}
export type ReportStatusListApiResponse = ApiResponse<
ReportStatusResponseDto[]
> & {
message: string;
};
export interface StatisticsInputStatusService {
getStatisticsInputStatusList(
param: StatsInputStatusListRequestParams,
): Promise<StatsInputStatusListApiResponse>;
getStatsValidationReport(
request: ReportSearchRequestDto,
): Promise<ReportStatusListApiResponse>;
}
@@ -105,18 +105,18 @@ export type PublicSewageTreatWaterReuseApiResponse =
/** ST00100001 저장 — `saveList` 항목 */
export interface PublicSewageTreatWaterReuseSaveItem {
admdstCd: string;
admdstNm: string;
fcltSn: string;
swtrmtFcltCd: string;
swtrmtFcltNm: string;
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
swtrmtFcltCd: string | null;
swtrmtFcltNm: string | null;
wholPrcsQnt: number;
lglYn: string;
instlYn: string;
lglYn: string | null;
instlYn: string | null;
oprtngStrtYmd: string | null;
instlAprvYmd: string | null;
rprcsFcltCpct: number;
mtcnsNm: string;
mtcnsNm: string | null;
ruswtPplLen: number;
ruswtPumpLen: number;
rmrk: string | null;
@@ -209,10 +209,29 @@ export type RecycledWaterStatusApiResponse = ApiResponse<RecycledWaterStatusResp
/** ST00100002 저장 — `saveList` / `deleteList` 항목 (`sggNm`·검증결과 제외) */
export type RecycledWaterStatusSaveItem = Omit<
RecycledWaterStatusItem,
"sggNm" | "verificationResult" | "cmptnStrtYmd" | "oprtngStrtYmd"
| "sggNm"
| "verificationResult"
| "cmptnStrtYmd"
| "oprtngStrtYmd"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "fcltNm"
| "bldgSeCn"
| "fcltPstnCn"
| "lglTrgtYn"
| "mnUsgCn"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
fcltNm: string | null;
bldgSeCn: string | null;
fcltPstnCn: string | null;
lglTrgtYn: string | null;
cmptnStrtYmd: string | null;
oprtngStrtYmd: string | null;
mnUsgCn: string | null;
};
/** ST00100002 저장 API 요청 */
@@ -303,9 +322,31 @@ export type RainFallUtilFactStatusApiResponse =
/** ST00100003 저장 — `saveList` / `deleteList` 항목 (`sggNm`·검증결과 제외) */
export type RainFallUtilFactStatusSaveItem = Omit<
RainFallUtilFactStatusItem,
"sggNm" | "verificationResult" | "cmptYmd"
| "sggNm"
| "verificationResult"
| "cmptYmd"
| "admdstCd"
| "admdstNm"
| "fcltSn"
| "fcltNm"
| "bdstTypCn"
| "fcltPstnCn"
| "lglTrgtYn"
| "rcptMynCn"
| "filtrPrcsFcltYnExpln"
| "exlnUtlzUsgExpln"
> & {
admdstCd: string | null;
admdstNm: string | null;
fcltSn: string | null;
fcltNm: string | null;
bdstTypCn: string | null;
fcltPstnCn: string | null;
lglTrgtYn: string | null;
cmptYmd: string | null;
rcptMynCn: string | null;
filtrPrcsFcltYnExpln: string | null;
exlnUtlzUsgExpln: string | null;
};
/** ST00100003 저장 API 요청 */
@@ -388,8 +429,22 @@ export type TreatWaterReuseDesignConstStatusApiResponse =
/** ST00100004 저장 — `saveList` / `deleteList` 항목 (`sggNm`·검증결과 제외) */
export type TreatWaterReuseDesignConstStatusSaveItem = Omit<
TreatWaterReuseDesignConstStatusItem,
"sggNm" | "verificationResult" | "coRegYmd"
| "sggNm"
| "verificationResult"
| "coRegYmd"
| "admdstCd"
| "admdstNm"
| "bplcSn"
| "bplcNm"
| "rprsvNm"
| "bplcPstnCn"
> & {
admdstCd: string | null;
admdstNm: string | null;
bplcSn: string | null;
bplcNm: string | null;
rprsvNm: string | null;
bplcPstnCn: string | null;
coRegYmd: string | null;
};
@@ -474,8 +529,22 @@ export type TreatWaterReuseBusinessApprStatusApiResponse =
/** ST00100005 저장 — `saveList` / `deleteList` 항목 (`sggNm`·검증결과 제외) */
export type TreatWaterReuseBusinessApprStatusSaveItem = Omit<
TreatWaterReuseBusinessApprStatusItem,
"sggNm" | "verificationResult" | "coRegYmd"
| "sggNm"
| "verificationResult"
| "coRegYmd"
| "admdstCd"
| "admdstNm"
| "bplcSn"
| "bplcNm"
| "rprsvNm"
| "bplcPstnCn"
> & {
admdstCd: string | null;
admdstNm: string | null;
bplcSn: string | null;
bplcNm: string | null;
rprsvNm: string | null;
bplcPstnCn: string | null;
coRegYmd: string | null;
};
@@ -170,12 +170,12 @@ export interface PublicSewageMappingTargetsResponse {
/** ST00060002 중심처리시설 매핑 저장 — saveList 항목 */
export interface PublicSewageMainFacilityMappingSaveItem {
fcltSn: string;
admdstCd: string;
admdstNm: string;
swtrmtFcltCd: string;
swtrmtFcltNm: string;
isMainYn: string;
fcltSn: string | null;
admdstCd: string | null;
admdstNm: string | null;
swtrmtFcltCd: string | null;
swtrmtFcltNm: string | null;
isMainYn: string | null;
}
/** ST00060002 중심처리시설 매핑 저장 API 요청 */
@@ -205,11 +205,11 @@ export interface PublicSewageMainFacilityMappingSaveResponse {
/** ST00060001 공공하수처리시설 저장 — saveList 항목 */
export interface PublicSewageFacilitySaveItem {
admdstCd: string;
admdstNm: string;
swtrmtFcltCd: string;
swtrmtFcltNm: string;
fcltSn: string;
admdstCd: string | null;
admdstNm: string | null;
swtrmtFcltCd: string | null;
swtrmtFcltNm: string | null;
fcltSn: string | null;
fcltPstnCn: string | null;
inflwSwagePhysQnt: number;
@@ -96,14 +96,34 @@ export interface SeweragePipeInputRegionalResponse {
/** 지역별 시설현황(Tab1) 저장 — saveList 행 (검증 결과 제외) */
export type SeweragePipeInputRegionalFactStatusSaveItem = Omit<
SeweragePipeInputRegionalFactStatusItem,
"verificationResult"
>;
"verificationResult" | "admdstCd" | "sggNm" | "admdstNm" | "goalYr"
> & {
admdstCd: string | null;
sggNm: string | null;
admdstNm: string | null;
goalYr: string | null;
};
/** Tab2 저장 — saveList */
export type SeweragePipeInputFactInstallStatusSaveItem = Omit<
SeweragePipeInputFactInstallStatusItem,
"verificationResult"
>;
| "verificationResult"
| "admdstCd"
| "sggNm"
| "admdstNm"
| "fcltSn"
| "swtrmtFcltCd"
| "swtrmtFcltNm"
| "rmrk"
> & {
admdstCd: string | null;
sggNm: string | null;
admdstNm: string | null;
fcltSn: string | null;
swtrmtFcltCd: string | null;
swtrmtFcltNm: string | null;
rmrk: string | null;
};
/** 지역별 시설현황 저장 API 요청 */
export interface SeweragePipeInputRegionalFactStatusSaveRequest {
@@ -283,11 +303,11 @@ export interface SeweragePipeInputPipeTypeResponse {
/** 관종별 현황 저장 — saveList 항목 */
export interface SeweragePipeInputPipeTypeStatusSaveItem {
admdstCd: string;
admdstNm: string;
pipeSeCd: string;
admdstCd: string | null;
admdstNm: string | null;
pipeSeCd: string | null;
yearlyStatList: SeweragePipeInputPipeTypeYearlyStatItem[];
rmrk: string;
rmrk: string | null;
lyngPrlgWhol: number;
dmltnPrlgWhol: number;
pipeByPrstWhol: number;
@@ -351,7 +371,7 @@ export interface SeweragePipeInputPipeDiameterResponse {
/** 관경별 현황 저장 — saveList 항목 */
export interface SeweragePipeInputPipeDiameterStatusSaveItem {
pipeSeCd: string;
pipeSeCd: string | null;
step1PdmtPrlg: number;
step2PdmtPrlg: number;
step3PdmtPrlg: number;
@@ -359,10 +379,10 @@ export interface SeweragePipeInputPipeDiameterStatusSaveItem {
step5PdmtPrlg: number;
sqrePdmtPrlg: number;
etcPdmtPrlg: number;
rmrk: string;
rmrk: string | null;
pdmtByTsmWhol: number;
admdstCd: string;
admdstNm: string;
admdstCd: string | null;
admdstNm: string | null;
}
/** 관경별 현황 저장 API 요청 */
@@ -456,11 +476,11 @@ export interface SeweragePipeInputManholeStatusSaveYearlyStatItem {
/** 맨홀 현황 저장 — saveList 항목 */
export interface SeweragePipeInputManholeStatusSaveItem {
emphsMngSeCd: string;
admdstCd: string;
admdstNm: string;
emphsMngSeCd: string | null;
admdstCd: string | null;
admdstNm: string | null;
yearlyStats: SeweragePipeInputManholeStatusSaveYearlyStatItem[];
rmrk: string;
rmrk: string | null;
}
/** 맨홀 현황 저장 API 요청 */
@@ -29,14 +29,14 @@ export const statisticsVerificationReportColumnInfo: ColumnInfo = {
{
name: "laePicNm",
fieldName: "laePicNm",
header: { text: "작성자" },
header: { text: "지자체작성자" },
styleName: READ_ONLY_STYLE,
editable: false,
},
{
name: "laePicTelNo",
fieldName: "laePicTelNo",
header: { text: "작성자연락처" },
header: { text: "연락처" },
width: 130,
styleName: READ_ONLY_STYLE,
editable: false,
@@ -58,7 +58,7 @@ export const statisticsVerificationReportColumnInfo: ColumnInfo = {
{
name: "laeIdfrNm",
fieldName: "laeIdfrNm",
header: { text: "승인자" },
header: { text: "지자체승인자" },
styleName: READ_ONLY_STYLE,
editable: false,
},
@@ -76,6 +76,27 @@ export const statisticsVerificationReportColumnInfo: ColumnInfo = {
styleName: READ_ONLY_STYLE,
editable: false,
},
{
name: "lastCfmtnPicNm",
fieldName: "lastCfmtnPicNm",
header: { text: "공단확인자" },
styleName: READ_ONLY_STYLE,
editable: false,
},
{
name: "lastCfmtnPicDeptNm",
fieldName: "lastCfmtnPicDeptNm",
header: { text: "부서" },
styleName: READ_ONLY_STYLE,
editable: false,
},
{
name: "lastCfmtnPicJbgdNm",
fieldName: "lastCfmtnPicJbgdNm",
header: { text: "직급" },
styleName: READ_ONLY_STYLE,
editable: false,
},
{
name: "rjctOpnnCn",
fieldName: "rjctOpnnCn",
@@ -108,6 +129,9 @@ export const statisticsVerificationReportColumnInfo: ColumnInfo = {
"laeIdfrNm",
"laeIdfrDeptNm",
"laeIdfrJbgdNm",
"lastCfmtnPicNm",
"lastCfmtnPicDeptNm",
"lastCfmtnPicJbgdNm",
"rjctOpnnCn",
"sewerBzmnCd",
"statsCd",
@@ -1,12 +1,11 @@
import type { VerifyResultSearchRequest } from "../general-verification-interface";
import type { StatsInputStatusListRequestParams } from "../input/statistics-input-status-interface";
import type { ReportSearchRequestDto } from "../input/statistics-input-status-interface";
export type StatisticsVerificationFilterState =
StatsInputStatusListRequestParams & {
// 셀렉트 표시용 시도, 시군구 코드
ctpvSewerBzmnCd?: string | null;
sggSewerBzmnCd?: string | null;
};
export type StatisticsVerificationFilterState = ReportSearchRequestDto & {
// 셀렉트 표시용 시도, 시군구 코드
ctpvSewerBzmnCd?: string | null;
sggSewerBzmnCd?: string | null;
};
export type StatisticsVerificationSubFilterState = VerifyResultSearchRequest;