wr: 하수재이용시설현황 속도 개선

This commit is contained in:
2026-06-10 11:16:10 +09:00
parent 814365d7de
commit cc21aaede1
5 changed files with 215 additions and 26 deletions
@@ -6,6 +6,12 @@ export function createDefaultPbnstItem(row: pubHasuType, index: number) {
return JSON.parse(JSON.stringify({
pbnstRuseFcltId: pk,
swtrmtFcltId: "",
swageTrtmfctId: row.bscFctCd || "",
swageBscFctNm: row.bscFctNm || "",
swageRgnCd: row.rgnCd || "",
swageAdstDstrCd: row.adstDstrCd || "",
swageRvbsnCd: row.rvbsnCd || "",
swageFctCpc: Number(row.fctCpc) || 0,
ruseUtztnFcltNm: "",
fcltCpct: 0,
ruseCpct: 0,
@@ -44,4 +50,4 @@ export function createDefaultPbnstItem(row: pubHasuType, index: number) {
cycl,
// 필요한 값 있으면 여기에 추가
} as fcBizType;
}
}
@@ -39,15 +39,13 @@ export default function PbnstSttn() {
auth,
code,
pbnstSttn,
pbnstSttnSearch,
pbnSttnInit,
pbnstSttnList,
getPbnStnDetail,
getFlcts, // 하수재이용시설(tb_wr_pbnst_ruse_fclt) 조회
resetPbnstDetail,
getLaeSeCdCheck,
} = useWrStore((state) => state);
const { pbnstSttnRes, fclts, pbnstSttnResCount } = pbnstSttn;
const { pbnstSttnRes, pbnstSttnResCount } = pbnstSttn;
const { laeSeCd } = auth; // 지자체구분코드
const [isReset, setIsReset] = useState(false);
@@ -110,16 +108,16 @@ export default function PbnstSttn() {
const excelClick = useCallback(() => {
isDownloadTriggered.current = true;
const fixedSearchValue = getFixedSearchValue(ref.current);
pbnstSttnSearch(
pbnstSttnList(
true,
String(1),
"100000",
fixedSearchValue,
pbnRuseNm,
searchYear,
fclts
[]
);
}, [pbnstSttnSearch, fclts, pbnRuseNm, searchYear, getFixedSearchValue]);
}, [pbnstSttnList, pbnRuseNm, searchYear, getFixedSearchValue]);
const cellCLick = useCallback(
(index: number | undefined) => {
@@ -134,28 +132,30 @@ export default function PbnstSttn() {
useEffect(() => {
getLaeSeCdCheck();
useInitRef.current = true;
if (!pbnstSttn.isFcltsLoaded) {
getFlcts(); // 하수재이용시설 조회
}
}, []);
useEffect(() => {
if (
useInitRef.current === true &&
laeSeCd !== undefined &&
pbnstSttn.isFcltsLoaded &&
!pbnstSttn.isTableLoaded &&
fclts.length > 0
!pbnstSttn.isTableLoaded
) {
pbnSttnInit("1", String(DEFAULT_LIST_SIZE), getFixedSearchValue(ref.current), searchYear, fclts);
pbnstSttnList(
false,
"1",
String(DEFAULT_LIST_SIZE),
getFixedSearchValue(ref.current),
pbnRuseNm,
searchYear,
[]
);
}
}, [
fclts,
laeSeCd,
pbnstSttn.isFcltsLoaded,
pbnstSttn.isTableLoaded,
pbnRuseNm,
searchYear,
pbnSttnInit,
pbnstSttnList,
getFixedSearchValue,
]);
@@ -262,16 +262,16 @@ export default function PbnstSttn() {
}
queryClick={() => {
const fixedSearchValue = getFixedSearchValue(ref.current);
pbnstSttnSearch(
pbnstSttnList(
false,
"1",
String(DEFAULT_LIST_SIZE),
fixedSearchValue,
pbnRuseNm,
searchYear,
fclts
[]
);
setIsReset(true);
// setIsReset(true);
}}
excelClick={excelClick}
initClick={function (): void {
@@ -301,16 +301,16 @@ export default function PbnstSttn() {
}}
onPageChange={(page: number) => {
const fixedSearchValue = getFixedSearchValue(ref.current);
pbnstSttnSearch(
pbnstSttnList(
false,
String(page),
String(DEFAULT_LIST_SIZE),
fixedSearchValue,
pbnRuseNm,
searchYear,
fclts
[]
);
setIsReset(false);
// setIsReset(false);
}}
resetPageNo={isReset}
widthFixed={true}
@@ -62,10 +62,18 @@ export type PbnstDemandComType = {
export const pubHasuZod = z.object({
choose: z.boolean().default(false),
bscFctCd: z.string(),
rvbsnCd: z.string().default(""), // 권역코드
rvbsn: z.string().default(""),
lgbsn: z.string().default(""),
mdmbsn: z.string().default(""),
rgnNm: z.string().default(""),
rgnCd: z.string().default(""), // 지역코드
adstDstrCd: z.string().default(""), // 행정구역코드
sido: z.string().default(""), // 시도
gugun: z.string().default(""), // 구군
bscFctNm: z.string().default(""), // 시설명
efflWqltStndrdNm: z.string().default(""), // 지역구분
tel: z.string().default(""),
fctCpc: z.number().default(0), // 시설용량
addr: z.string().nullish(), // 위치
});
@@ -258,6 +266,15 @@ const PrfSchema = z.object({
export const pbnstRegZod = z.object({
pbnstRuseFcltId: z.string().default(""),
swtrmtFcltId: z.string().default(""),
swageTrtmfctId: z.string().default(""),
swageBscFctNm: z.string().default(""),
swageRgnCd: z.string().default(""),
swageAdstDstrCd: z.string().default(""),
swageRvbsnCd: z.string().default(""),
swageFctCpc: z.preprocess(
(v) => (v !== null && v !== undefined ? Number(v) : v),
z.number().default(0)
),
ruseUtztnFcltNm: //z.string().default(''),
z.preprocess(
(v) => (v !== null && v !== undefined ? String(v).trim() : ""), // null/undefined → "", 공백 제거
@@ -3,7 +3,7 @@ import type {
TableUpperProps,
} from "@/app/store/common/type/header";
import type { FcPrfType } from "@/app/store/prfmncReg/pbnstPrfmncReg/type";
import { fetchType, getFetch, postFectch } from "@/components/lib/api";
import { fetchType, getFetch, getFetchWithCount, postFectch } from "@/components/lib/api";
import type { ReturnType } from "@common/business_components/ui";
import moment from "moment";
import { type z } from "zod";
@@ -54,6 +54,15 @@ export type pbnstSttnState = {
type pbnstSttnActions = {
pbnstChSttnHead: (headList: z.infer<typeof sttnHeadListType>) => void;
pbnstSttnList: (
isExcel: boolean,
page: string,
total: string,
reurnValue: ReturnType,
searchNm: string | undefined,
year: string,
fclts: string[]
) => void;
pbnstSttnSearch: (
isExcel: boolean,
page: string,
@@ -246,6 +255,119 @@ export const hasuListFetch = async (
return { data: data, count: getRuseList.count };
};
export const pbnstListFetch = async (
page: string,
total: string,
reurnValue: ReturnType,
searchNm: string | undefined,
year: string
) => {
let nameCd = "0";
let partStr = "A";
switch (reurnValue.partValue) {
case "R":
if (reurnValue.regionValue !== "0") {
if (reurnValue.unitWaterShedValue === "0") nameCd = reurnValue.regionValue;
else if (reurnValue.middleRegionValue === "0") nameCd = reurnValue.unitWaterShedValue;
else nameCd = reurnValue.middleRegionValue;
}
partStr = reurnValue.partValue;
break;
default:
if (reurnValue.sidoValue && reurnValue.sidoValue !== "0") nameCd = reurnValue.sidoValue;
if (reurnValue.sigunValue && reurnValue.sigunValue !== "0") nameCd = reurnValue.sigunValue;
partStr = reurnValue.envPartValue !== "0" ? reurnValue.envPartValue : "A";
break;
}
let url = `/reuseFc/pbnstList/${year}/${page}/${total}/${partStr}/${nameCd}/0/1/SW`;
if (searchNm && searchNm.length > 0) {
url += `?swtrmtFcltNm=${searchNm}`;
}
const response = await getFetchWithCount(fetchType.WR, url);
const wrList: WaterReuseFacility[] = Array.isArray(response.data)
? response.data
: [];
const swtrmtFcltIds = [
...new Set(
wrList
.map((item: WaterReuseFacility) => {
if (item.swtrmtFcltId && item.swtrmtFcltId.length > 0) {
return item.swtrmtFcltId;
}
if (item.pbnstRuseFcltId && item.pbnstRuseFcltId.length >= 11) {
return item.pbnstRuseFcltId.substring(0, 11);
}
return "";
})
.filter(Boolean)
),
];
let pbnListData: pubHasuType[] = [];
if (swtrmtFcltIds.length > 0) {
let foUrl = `/prcsFclt/ruseInfo/1/${swtrmtFcltIds.length + 1}`;
if (searchNm && searchNm.length > 0) {
foUrl += `/${searchNm}`;
}
const pbnList = await postFectch(
foUrl,
swtrmtFcltIds,
fetchType.COMMON
);
pbnListData = Array.isArray(pbnList?.data) ? pbnList.data : [];
}
const data: WaterReuseFacility[] = wrList.map((item: WaterReuseFacility) => {
const swtrmtFcltId =
item.swtrmtFcltId && item.swtrmtFcltId.length > 0
? item.swtrmtFcltId
: item.pbnstRuseFcltId?.substring(0, 11) ?? "";
const findData = pbnListData.find(
(fclt: pubHasuType) => fclt.bscFctCd === swtrmtFcltId
);
return {
...item,
swtrmtFcltId,
rvbsn: findData?.rvbsn || item.rvbsn || "-",
lgbsn: findData?.lgbsn || item.lgbsn || "-",
mdmbsn: findData?.mdmbsn || item.mdmbsn || "-",
rgnNm: findData?.rgnNm || item.rgnNm || "-",
sido: findData?.sido || item.sido || "-",
gugun: findData?.gugun || item.gugun || "-",
bscFctNm: findData?.bscFctNm || item.bscFctNm || "-",
efflWqltStndrdNm:
findData?.efflWqltStndrdNm || item.efflWqltStndrdNm || "-",
tel: findData?.tel || item.tel || "-",
fctCpc: Number(findData?.fctCpc ?? item.fctCpc) || 0,
ruseUtztnFcltNm: item.ruseUtztnFcltNm || "-",
fcltCpct: Number(item.fcltCpct) || 0,
splyExtraCpct: Number(item.splyExtraCpct) || 0,
ruseCpct: Number(item.ruseCpct) || 0,
usageTotal: Number(item.usageTotal) || 0,
inUsage: Number(item.inUsage) || 0,
outUsage: Number(item.outUsage) || 0,
operMthd: item.operMthd || "-",
rprtvBzenty: item.rprtvBzenty || "-",
bgngDt: item.bgngDt || "",
endDt: item.endDt || "",
prfList: item.prfList ?? [],
};
});
return { data, count: response.count };
};
export const pbnstSttnActionsExport: (set: any) => pbnstSttnActions = (
set: any
) => {
@@ -261,6 +383,49 @@ export const pbnstSttnActionsExport: (set: any) => pbnstSttnActions = (
},
}));
},
pbnstSttnList: async (
isExcel: boolean,
page: string,
total: string,
reurnValue: ReturnType,
searchNm: string | undefined,
year: string,
_fclts: string[]
) => {
try {
const pbnstSttnRes = await pbnstListFetch(
page,
total,
reurnValue,
searchNm,
year
);
if (isExcel) {
const pbnstExcel = excelPbnstSttnParsing(pbnstSttnRes.data);
set((state: pbnstSttnState) => ({
...state,
pbnstSttn: {
...state.pbnstSttn,
excelList: pbnstExcel,
},
}));
} else {
set((state: pbnstSttnState) => ({
...state,
pbnstSttn: {
...state.pbnstSttn,
pbnstSttnRes: pbnstSttnRes.data,
pbnstSttnResCount: pbnstSttnRes.count,
pbnstDetail: {} as customPbnst,
isTableLoaded: true,
},
}));
}
} catch (error) {
console.log("error", error);
}
},
//테이블 헤드를 조정한다.
pbnstChSttnHead: async (
headList: z.infer<typeof sttnHeadListType>
@@ -1,10 +1,11 @@
import type { PrfType } from "@/app/store/prfmncReg/pbnstPrfmncReg/type";
export type WaterReuseFacility = {
swtrmtFcltId?: string;
bscFctNm: string; // 기본시설명 (예: "난지")
efflWqltStndrdNm: string; // 방류수 수질 기준명 (예: "500톤 이상(Ⅲ지역)")
fcltCpct: number; // 시설 용량 (숫자형, 예: 1)
fctCpc: string; // 시설 처리 능력 (예: "2360000")
fctCpc: number; // 시설 처리 능력 (예: 2360000)
gugun: string; // 구군 정보 (예: " ")
inUsage: number; // 유입량 (예: 1387)
lgbsn: string; // 대수계 (예: "한강본류")