wr: 재이용시설현황 지차제

This commit is contained in:
2026-04-14 14:57:26 +09:00
parent 7359f19e7d
commit 0411b2a894
8 changed files with 500 additions and 137 deletions
@@ -37,17 +37,20 @@ import { useCallback, useEffect, useRef, useState } from "react";
import { useAlertStore } from "@/src/shared/lib";
import { useTranslation } from "react-i18next";
const defaultSigunOptions: SelectDataType[] = [{ text: "전체", val: "0" }];
export default function HtdflSttn() {
const { auth, code, htdflSttn, htdflSttnSearch, initHtdfl } = useWrStore((state) => state);
const { auth, code, htdflSttn, htdflSttnSearch, initHtdfl, getLaeSeCdCheck } = useWrStore((state) => state);
const { laeSeCd } = auth; // 지자체구분코드
const { htdflSttnRes, htdflSttnResCount } = htdflSttn;
const isDownloadTriggered = useRef(false);
const skipNextSearchRef = useRef(true);
const { t } = useTranslation('base');
const [pageNation, setPageNation] = useState(1);
const [isChHead, setIsChHead] = useState(false);
const [resetPage, isResetPage] = useState(false);
const [bdstTable, setBdstTable] = useState<customRainBdst[]>();
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>()
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>(defaultSigunOptions)
const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" });
const [detailModal, setDetailModal] = useState<{
isOpen: boolean;
@@ -59,22 +62,23 @@ export default function HtdflSttn() {
// }>({ isOpen: false, chBuilding: [] });
const [fcltNm, setFcltNm] = useState<string>("");
const alert = useAlertStore((state) => state.setMessage);
console.log("laeSeCd : ", laeSeCd);
useEffect(() => {
htdflSttnSearch(false, pageNation, htdflSttnSize, String(getConValue()), fcltNm, code.cityCd, code.sggCd);
isResetPage(false)
}, [pageNation]);
const isAllAreaUser = laeSeCd === "0";
const isLaeSeCdReady =
laeSeCd === "0" || laeSeCd.length === 2 || laeSeCd.length === 5;
const fixedSidoValue =
!isAllAreaUser && laeSeCd?.length ? laeSeCd.slice(0, 2) : "";
const fixedSigunValue =
!isAllAreaUser && laeSeCd?.length === 5 ? laeSeCd : "0";
const getSelCity = (val: string | number) => {
const cityValue = String(val);
if (cityValue === "0") {
setSelectSgg([]);
setSelectSgg(defaultSigunOptions);
setObjSearch({ city: cityValue, sgg: "" });
} else {
const data = getCity(cityValue, code.sggCd);
setSelectSgg(data);
setSelectSgg(data.length > 0 ? data : defaultSigunOptions);
const firstSggVal = data.find(item => item.val === "0")?.val || (data[0]?.val ?? "");
setObjSearch({ city: cityValue, sgg: firstSggVal });
@@ -85,16 +89,24 @@ export default function HtdflSttn() {
setObjSearch({ ...objSearch, sgg: String(val) })
};
const getConValue = () => {
const getConValue = (): string => {
if (!objSearch.city || objSearch.city === "0") {
return "0";
}
if (objSearch.sgg && objSearch.sgg !== "0") {
return objSearch.sgg;
return String(objSearch.sgg);
}
return objSearch.city;
return String(objSearch.city);
};
const getFixedConValue = useCallback((): string => {
if (laeSeCd === undefined || laeSeCd === "0") {
return getConValue();
}
return laeSeCd.length === 5 ? laeSeCd : laeSeCd.slice(0, 2);
}, [laeSeCd, objSearch]);
const cellClick = (index: number | undefined, headId: string) => {
if (
headId !== "chBuildingYn" &&
@@ -106,9 +118,37 @@ export default function HtdflSttn() {
};
const excelClick = useCallback(() => {
if (!isLaeSeCdReady) {
return;
}
isDownloadTriggered.current = true;
htdflSttnSearch(true, 1, htdflSttnResCount, String(getConValue()), fcltNm, code.cityCd, code.sggCd);
}, [htdflSttnSearch, objSearch, code.cityCd, code.sggCd, fcltNm, htdflSttnResCount]);
htdflSttnSearch(true, 1, htdflSttnResCount, String(getFixedConValue()), fcltNm, code.cityCd, code.sggCd);
}, [htdflSttnSearch, fcltNm, htdflSttnResCount, code.cityCd, code.sggCd, getFixedConValue, isLaeSeCdReady]);
useEffect(() => {
getLaeSeCdCheck();
}, [getLaeSeCdCheck]);
useEffect(() => {
if (!isLaeSeCdReady) {
return;
}
if (laeSeCd === "0") {
setSelectSgg(defaultSigunOptions);
setObjSearch({ city: "0", sgg: "" });
return;
}
const cityValue = laeSeCd.slice(0, 2);
const sigunOptions = getCity(cityValue, code.sggCd);
setSelectSgg(sigunOptions.length > 0 ? sigunOptions : defaultSigunOptions);
setObjSearch({
city: cityValue,
sgg: laeSeCd.length === 5 ? laeSeCd : "0",
});
}, [laeSeCd, code.sggCd, isLaeSeCdReady]);
useEffect(() => {
if (!isDownloadTriggered.current) {
@@ -135,10 +175,27 @@ export default function HtdflSttn() {
}, [htdflSttn.excelList, code]);
useEffect(() => {
if (!htdflSttn.isInit) {
initHtdfl(false, 1, htdflSttnSize, "0", fcltNm, code.cityCd, code.sggCd);
if (!isLaeSeCdReady || htdflSttn.isInit) {
return;
}
}, [htdflSttn.isInit, initHtdfl]);
skipNextSearchRef.current = true;
initHtdfl(false, 1, htdflSttnSize, String(getFixedConValue()), fcltNm, code.cityCd, code.sggCd);
}, [htdflSttn.isInit, initHtdfl, fcltNm, code.cityCd, code.sggCd, getFixedConValue, isLaeSeCdReady]);
useEffect(() => {
if (!isLaeSeCdReady) {
return;
}
if (skipNextSearchRef.current) {
skipNextSearchRef.current = false;
return;
}
htdflSttnSearch(false, pageNation, htdflSttnSize, String(getFixedConValue()), fcltNm, code.cityCd, code.sggCd);
isResetPage(false)
}, [pageNation, htdflSttnSearch, fcltNm, code.cityCd, code.sggCd, getFixedConValue, isLaeSeCdReady]);
useEffect(() => {
const data = tableData(htdflSttnRes, { code });
@@ -171,15 +228,24 @@ export default function HtdflSttn() {
className="col-span-2 w-1/6 h-full text-2xl"
label="시도"
selectClass={""}
selectArray={code.cityCd}
selectArray={
!isAllAreaUser && fixedSidoValue
? code.cityCd.filter((item) => item.val === fixedSidoValue)
: code.cityCd
}
value={objSearch.city || "0"}
onSelectValue={getSelCity}
/>
<SelectBox
className="col-span-2 w-1/6 h-full text-2xl ml-4"
label="시군구"
selectClass={""}
selectArray={selectSgg || []}
value={objSearch.sgg} // value props 추가
selectArray={
!isAllAreaUser && laeSeCd?.length === 5
? (selectSgg || defaultSigunOptions).filter((item) => item.val === "0" || item.val === fixedSigunValue)
: selectSgg || defaultSigunOptions
}
value={objSearch.sgg || "0"}
onSelectValue={getSgg}
/>
<div className="col-span-2 flex flex-row space-x-2 ml-3 mt-2">
@@ -201,7 +267,10 @@ export default function HtdflSttn() {
<Button
className={btnClass}
onClick={() => {
htdflSttnSearch(false, 1,htdflSttnSize, String(getConValue()), fcltNm, code.cityCd, code.sggCd);
if (!isLaeSeCdReady) {
return;
}
htdflSttnSearch(false, 1,htdflSttnSize, String(getFixedConValue()), fcltNm, code.cityCd, code.sggCd);
isResetPage(true)
}}
>
@@ -42,7 +42,7 @@ export default function PbnstSttn() {
pbnstSttnSearch,
pbnSttnInit,
getPbnStnDetail,
getFlcts,
getFlcts, // 하수재이용시설 조회
resetPbnstDetail,
getLaeSeCdCheck,
} = useWrStore((state) => state);
@@ -119,6 +119,7 @@ export default function PbnstSttn() {
},
[getPbnStnDetail, pbnstSttnRes]
);
useEffect(() => {
getLaeSeCdCheck();
useInitRef.current = true;
@@ -126,9 +127,10 @@ export default function PbnstSttn() {
useEffect(() => {
if (!pbnstSttn.isInit) {
getFlcts();
getFlcts(); // 하수재이용시설 조회
}
}, [pbnstSttn.isInit]);
useEffect(() => {
if (useInitRef.current === true && laeSeCd !== undefined && fclts.length > 0) {
pbnSttnInit("1", "15", getFixedSearchValue(ref.current), searchYear, fclts);
@@ -257,6 +259,7 @@ export default function PbnstSttn() {
ref={ref}
isAdmin={!isAllAreaUser}
initSidoValue={fixedSidoValue}
initSigunValue={fixedSigunValue !== "0" ? fixedSigunValue : ""}
/>
</div>
</div>
@@ -35,18 +35,21 @@ import { useCallback, useEffect, useRef, useState } from "react";
import { useAlertStore } from "@/src/shared/lib";
import { useTranslation } from "react-i18next";
const defaultSigunOptions: SelectDataType[] = [{ text: "전체", val: "0" }];
export default function RainSttn() {
const { code, rainSttn, rainSttnSearch, rainSttnInit } = useWrStore(
const { auth, code, rainSttn, rainSttnSearch, rainSttnInit, getLaeSeCdCheck } = useWrStore(
(state) => state
);
const { rainSttnRes, rainSttnResCount } = rainSttn;
const { laeSeCd } = auth;
const [pageNation, setPageNation] = useState(1);
const [isChHead, setIsChHead] = useState(false);
const [bdstTable, setBdstTable] = useState<customRainBdst[]>();
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>();
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>(defaultSigunOptions);
const [resetPage, isResetPage] = useState(false);
const isDownloadTriggered = useRef(false);
const [isDownloadTriggered, setIsDownloadTriggered] = useState(false);
const [objSearch, setObjSearch] = useState<objSearchType>({
sgg: "",
city: "",
@@ -59,6 +62,14 @@ export default function RainSttn() {
const [fcltNm, setFcltNm] = useState<string>("");
const { t } = useTranslation("base");
const alert = useAlertStore((state) => state.setMessage);
const skipNextSearchRef = useRef(true);
const isAllAreaUser = laeSeCd === "0";
const isLaeSeCdReady =
laeSeCd === "0" || laeSeCd.length === 2 || laeSeCd.length === 5;
const fixedSidoValue =
!isAllAreaUser && laeSeCd?.length ? laeSeCd.slice(0, 2) : "";
const fixedSigunValue =
!isAllAreaUser && laeSeCd?.length === 5 ? laeSeCd : "0";
const cellClick = (index: number | undefined) => {
if (index !== undefined && bdstTable !== undefined) {
@@ -69,11 +80,11 @@ export default function RainSttn() {
const getSelCity = (val: string | number) => {
const cityValue = String(val);
if (cityValue === "0") {
setSelectSgg([]);
setSelectSgg(defaultSigunOptions);
setObjSearch({ city: cityValue, sgg: "" });
} else {
const data = getCity(cityValue, code.sggCd);
setSelectSgg(data);
setSelectSgg(data.length > 0 ? data : defaultSigunOptions);
const firstSggVal =
data.find((item) => item.val === "0")?.val || (data[0]?.val ?? "");
setObjSearch({ city: cityValue, sgg: firstSggVal });
@@ -84,21 +95,135 @@ export default function RainSttn() {
setObjSearch({ ...objSearch, sgg: String(val) });
};
const getConValue = () => {
const getConValue = (): string => {
if (!objSearch.city || objSearch.city === "0") {
return "0";
}
if (objSearch.sgg && objSearch.sgg !== "0") {
return objSearch.sgg;
return String(objSearch.sgg);
}
return objSearch.city;
return String(objSearch.city);
};
useEffect(() => {
if (!rainSttn.isInit) {
rainSttnInit(false, 1, rainSttnSize, "0", fcltNm, code as unknown as Record<string, SelectDataType[]>);
const getFixedConValue = useCallback((): string => {
if (laeSeCd === undefined || laeSeCd === "0") {
return getConValue();
}
}, [rainSttn.isInit, rainSttnInit]);
return laeSeCd.length === 5 ? laeSeCd : laeSeCd.slice(0, 2);
}, [laeSeCd, objSearch]);
useEffect(() => {
getLaeSeCdCheck();
}, [getLaeSeCdCheck]);
useEffect(() => {
if (!isLaeSeCdReady) {
return;
}
if (laeSeCd === "0") {
setSelectSgg(defaultSigunOptions);
setObjSearch({ city: "0", sgg: "" });
return;
}
const cityValue = laeSeCd.slice(0, 2);
const sigunOptions = getCity(cityValue, code.sggCd);
setSelectSgg(sigunOptions.length > 0 ? sigunOptions : defaultSigunOptions);
setObjSearch({
city: cityValue,
sgg: laeSeCd.length === 5 ? laeSeCd : "0",
});
}, [laeSeCd, code.sggCd, isLaeSeCdReady]);
useEffect(() => {
if (!isLaeSeCdReady || rainSttn.isInit) {
return;
}
skipNextSearchRef.current = true;
rainSttnInit(
false,
1,
rainSttnSize,
getFixedConValue(),
fcltNm,
code as unknown as Record<string, SelectDataType[]>
);
}, [rainSttn.isInit, rainSttnInit, fcltNm, code, getFixedConValue, isLaeSeCdReady]);
useEffect(() => {
if (!isLaeSeCdReady) {
return;
}
if (skipNextSearchRef.current) {
skipNextSearchRef.current = false;
return;
}
rainSttnSearch(
false,
pageNation,
rainSttnSize,
String(getFixedConValue()),
fcltNm,
code as unknown as Record<string, SelectDataType[]>
);
isResetPage(false);
}, [pageNation, rainSttnSearch, fcltNm, code, getFixedConValue, isLaeSeCdReady]);
useEffect(() => {
if (!isLaeSeCdReady) {
return;
}
if (!isDownloadTriggered) {
return;
}
if (rainSttn.excelList.length > 0) {
const sheetArray: SheetParameter[] = [{
data: rainSttn.excelList,
headerNum: 3,
headerRange: "A1:W3",
sheetName: 'sheet1',
startCol: 'A',
decimalArray0: [6,10,12,14,16] // 0부터 시작
}];
excelDownloadNumStyle(
"빗물이용시설 현황",
"sample_rainSttn.xlsx", // public 폴더에 있는 template 파일 경로
sheetArray
);
} else {
alert(t("excelDownErrMsg"));
}
setIsDownloadTriggered(false);
}, [rainSttn.excelList, isDownloadTriggered, alert, t, isLaeSeCdReady]);
const excelClick = useCallback(() => {
if (!isLaeSeCdReady) {
return;
}
setIsDownloadTriggered(true);
rainSttnSearch(
true,
1,
rainSttnResCount,
String(getFixedConValue()),
fcltNm,
code as unknown as Record<string, SelectDataType[]>
);
}, [
rainSttnSearch,
fcltNm,
rainSttnResCount,
code,
getFixedConValue,
isLaeSeCdReady,
]);
useEffect(() => {
const data = tableData(rainSttnRes, { code });
@@ -143,60 +268,6 @@ export default function RainSttn() {
setBdstTable(chData);
}, [code, rainSttnRes]);
useEffect(() => {
rainSttnSearch(
false,
pageNation,
rainSttnSize,
String(getConValue()),
fcltNm,
code as unknown as Record<string, SelectDataType[]>
);
isResetPage(false);
}, [pageNation]);
useEffect(() => {
if (!isDownloadTriggered.current) {
return;
}
if (rainSttn.excelList.length > 0) {
const sheetArray: SheetParameter[] = [{
data: rainSttn.excelList,
headerNum: 3,
headerRange: "A1:W3",
sheetName: 'sheet1',
startCol: 'A',
decimalArray0: [6,10,12,14,16] // 0부터 시작
}];
excelDownloadNumStyle(
"빗물이용시설 현황",
"sample_rainSttn.xlsx", // public 폴더에 있는 template 파일 경로
sheetArray
);
} else {
alert(t("excelDownErrMsg"));
}
isDownloadTriggered.current = false;
}, [rainSttn.excelList]);
const excelClick = useCallback(() => {
isDownloadTriggered.current = true;
rainSttnSearch(
true,
1,
rainSttnResCount,
String(getConValue()),
fcltNm,
code as unknown as Record<string, SelectDataType[]>
);
}, [
rainSttnSearch,
objSearch,
code.cityCd,
code.sggCd,
fcltNm,
rainSttnResCount,
]);
return (
<>
@@ -210,15 +281,24 @@ export default function RainSttn() {
className="col-span-2 w-1/6 h-full text-2xl"
label="시도"
selectClass={""}
selectArray={code.cityCd}
selectArray={
!isAllAreaUser && fixedSidoValue
? code.cityCd.filter((item) => item.val === fixedSidoValue)
: code.cityCd
}
value={objSearch.city || "0"}
onSelectValue={getSelCity}
/>
<SelectBox
className="col-span-2 w-1/6 h-full text-2xl ml-4"
label="시군구"
selectClass={""}
selectArray={selectSgg || []}
value={objSearch.sgg} // value props 추가
selectArray={
!isAllAreaUser && laeSeCd?.length === 5
? (selectSgg || defaultSigunOptions).filter((item) => item.val === "0" || item.val === fixedSigunValue)
: selectSgg || defaultSigunOptions
}
value={objSearch.sgg || "0"}
onSelectValue={getSgg}
/>
<div className="col-span-2 flex flex-row space-x-2 ml-3 mt-2">
@@ -243,7 +323,7 @@ export default function RainSttn() {
false,
1,
rainSttnSize,
String(getConValue()),
String(getFixedConValue()),
fcltNm,
code as unknown as Record<string, SelectDataType[]>
);
@@ -35,24 +35,35 @@ import { useCallback, useEffect, useRef, useState } from "react";
import { useAlertStore } from "@/src/shared/lib";
import { useTranslation } from "react-i18next";
const defaultSigunOptions: SelectDataType[] = [{ text: "전체", val: "0" }];
export default function RswtSttn() {
const { code, rswtSttn, rswtSttnSearch, rswtSttnInit } = useWrStore(
const { auth, code, rswtSttn, rswtSttnSearch, rswtSttnInit, getLaeSeCdCheck } = useWrStore(
(state) => state
);
const [pageNation, setPageNation] = useState(1);
const { rswtSttnRes, rswtSttnResCount } = rswtSttn;
const { laeSeCd } = auth;
const [isChHead, setIsChHead] = useState(false);
const [resetPage, isResetPage] = useState(false);
const [bdstTable, setBdstTable] = useState<customRswtBdst[]>();
const isDownloadTriggered = useRef(false);
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>()
const skipNextSearchRef = useRef(true);
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>(defaultSigunOptions)
const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" });
const [detailModal, setDetailModal] = useState<{ isOpen: boolean, data: customRswtBdst | undefined }>({ data: undefined, isOpen: false })
const [fcltNm, setFcltNm] = useState<string>("");
const { t } = useTranslation('base');
const alert = useAlertStore((state) => state.setMessage);
const isAllAreaUser = laeSeCd === "0";
const isLaeSeCdReady =
laeSeCd === "0" || laeSeCd.length === 2 || laeSeCd.length === 5;
const fixedSidoValue =
!isAllAreaUser && laeSeCd?.length ? laeSeCd.slice(0, 2) : "";
const fixedSigunValue =
!isAllAreaUser && laeSeCd?.length === 5 ? laeSeCd : "0";
const cellClick = (index: number | undefined) => {
if ( index !== undefined && bdstTable !== undefined) {
@@ -64,11 +75,11 @@ export default function RswtSttn() {
const cityValue = String(val);
if (cityValue === "0") {
setSelectSgg([]);
setSelectSgg(defaultSigunOptions);
setObjSearch({ city: cityValue, sgg: "" });
} else {
const data = getCity(cityValue, code.sggCd);
setSelectSgg(data);
setSelectSgg(data.length > 0 ? data : defaultSigunOptions);
const firstSggVal = data.find(item => item.val === "0")?.val || (data[0]?.val ?? "");
setObjSearch({ city: cityValue, sgg: firstSggVal });
@@ -79,21 +90,63 @@ export default function RswtSttn() {
setObjSearch({ ...objSearch, sgg: String(val) })
};
const getConValue = () => {
const getConValue = (): string => {
if (!objSearch.city || objSearch.city === "0") {
return "0";
}
if (objSearch.sgg && objSearch.sgg !== "0") {
return objSearch.sgg;
return String(objSearch.sgg);
}
return objSearch.city;
return String(objSearch.city);
};
useEffect(() => {
if (!rswtSttn.isInit&&code) {
rswtSttnInit(false, 1, rswtSttnSize, code.userSiSggCd, fcltNm, code as unknown as Record<string, SelectDataType[]>);
const getFixedConValue = useCallback((): string => {
if (laeSeCd === undefined || laeSeCd === "0") {
return getConValue();
}
}, [rswtSttn.isInit, rswtSttnInit]);
return laeSeCd.length === 5 ? laeSeCd : laeSeCd.slice(0, 2);
}, [laeSeCd, objSearch]);
useEffect(() => {
getLaeSeCdCheck();
}, [getLaeSeCdCheck]);
useEffect(() => {
if (!isLaeSeCdReady) {
return;
}
if (laeSeCd === "0") {
setSelectSgg(defaultSigunOptions);
setObjSearch({ city: "0", sgg: "" });
return;
}
const cityValue = laeSeCd.slice(0, 2);
const sigunOptions = getCity(cityValue, code.sggCd);
setSelectSgg(sigunOptions.length > 0 ? sigunOptions : defaultSigunOptions);
setObjSearch({
city: cityValue,
sgg: laeSeCd.length === 5 ? laeSeCd : "0",
});
}, [laeSeCd, code.sggCd, isLaeSeCdReady]);
useEffect(() => {
if (!isLaeSeCdReady || rswtSttn.isInit) {
return;
}
skipNextSearchRef.current = true;
rswtSttnInit(
false,
1,
rswtSttnSize,
getFixedConValue(),
fcltNm,
code as unknown as Record<string, SelectDataType[]>
);
}, [rswtSttn.isInit, rswtSttnInit, fcltNm, code, getFixedConValue, isLaeSeCdReady]);
useEffect(() => {
const data = tableData(rswtSttnRes, { code });
@@ -150,14 +203,27 @@ export default function RswtSttn() {
}, [rswtSttn.excelList]);
const excelClick = useCallback(() => {
if (!isLaeSeCdReady) {
return;
}
isDownloadTriggered.current = true;
rswtSttnSearch(true, 1, rswtSttnResCount, String(getConValue()), fcltNm, code as unknown as Record<string, SelectDataType[]>);
}, [rswtSttnSearch, objSearch, code.cityCd, code.sggCd, fcltNm, rswtSttnResCount]);
rswtSttnSearch(true, 1, rswtSttnResCount, String(getFixedConValue()), fcltNm, code as unknown as Record<string, SelectDataType[]>);
}, [rswtSttnSearch, fcltNm, rswtSttnResCount, code, getFixedConValue, isLaeSeCdReady]);
useEffect(() => {
rswtSttnSearch(false, pageNation, rswtSttnSize, String(getConValue()), fcltNm, code as unknown as Record<string, SelectDataType[]>);
if (!isLaeSeCdReady) {
return;
}
if (skipNextSearchRef.current) {
skipNextSearchRef.current = false;
return;
}
rswtSttnSearch(false, pageNation, rswtSttnSize, String(getFixedConValue()), fcltNm, code as unknown as Record<string, SelectDataType[]>);
isResetPage(false)
}, [pageNation]);
}, [pageNation, rswtSttnSearch, fcltNm, code, getFixedConValue, isLaeSeCdReady]);
return (
<>
@@ -171,7 +237,12 @@ export default function RswtSttn() {
className="col-span-2 w-1/6 h-full text-2xl"
label="시도"
selectClass={""}
selectArray={code.cityCd}
selectArray={
!isAllAreaUser && fixedSidoValue
? code.cityCd.filter((item) => item.val === fixedSidoValue)
: code.cityCd
}
value={objSearch.city || "0"}
onSelectValue={
getSelCity
}
@@ -180,8 +251,12 @@ export default function RswtSttn() {
className="col-span-2 w-1/6 h-full text-2xl ml-4"
label="시군구"
selectClass={""}
selectArray={selectSgg || []}
value={objSearch.sgg} // value props 추가
selectArray={
!isAllAreaUser && laeSeCd?.length === 5
? (selectSgg || defaultSigunOptions).filter((item) => item.val === "0" || item.val === fixedSigunValue)
: selectSgg || defaultSigunOptions
}
value={objSearch.sgg || "0"}
onSelectValue={
getSgg
}
@@ -205,7 +280,10 @@ export default function RswtSttn() {
<Button
className={btnClass}
onClick={() => {
rswtSttnSearch(false, 1, rswtSttnSize, String(getConValue()), fcltNm, code as unknown as Record<string, SelectDataType[]>);
if (!isLaeSeCdReady) {
return;
}
rswtSttnSearch(false, 1, rswtSttnSize, String(getFixedConValue()), fcltNm, code as unknown as Record<string, SelectDataType[]>);
isResetPage(true)
}}
>
@@ -17,6 +17,7 @@ import { headMakeprfmnc } from "../../prfmncReg/chkgdnReg/TableHead";
export default function PbnstPrfmncSttn() {
const {
auth,
code,
tableHeadMaker,
pbnstPrfmncSttn,
@@ -24,8 +25,10 @@ export default function PbnstPrfmncSttn() {
pbnstPrfmncSearch,
getFlctsSttn,
prfmnc,
pbnNmSearch
pbnNmSearch,
getLaeSeCdCheck
} = useWrStore((state) => state);
const { laeSeCd } = auth;
const { monthHeadList } = prfmnc
const { pbnstPrfHeadList, prfmncResCount, prfmncRes, rawData, selectYearList, fclts } = pbnstPrfmncSttn;
// const [isChHead, setIsChHead] = useState(false);
@@ -42,6 +45,39 @@ export default function PbnstPrfmncSttn() {
const [excelData, setExcelData] = useState<any[]>([]);
const [pageNation, setPageNation] = useState(1);
const [resetPage, isResetPage] = useState(false);
const skipNextSearchRef = useRef(true);
const isAllAreaUser = laeSeCd === "0";
const isLaeSeCdReady =
laeSeCd === "0" || laeSeCd.length === 2 || laeSeCd.length === 5;
const fixedSidoValue =
!isAllAreaUser && laeSeCd?.length ? laeSeCd.slice(0, 2) : "";
const fixedSigunValue =
!isAllAreaUser && laeSeCd?.length === 5 ? laeSeCd : "0";
const getFixedSearchValue = useCallback(
(baseValue: ReturnType): ReturnType => {
if (isAllAreaUser) {
return baseValue;
}
const fixedSidoText =
code.cityCd.find((item) => item.val === fixedSidoValue)?.text ?? "";
const fixedSigunText =
fixedSigunValue !== "0"
? code.sggCd.find((item) => item.val === fixedSigunValue)?.text ?? ""
: "";
return {
...baseValue,
partValue: "A",
sidoValue: fixedSidoValue,
sigunValue: fixedSigunValue,
sidoText: fixedSidoText,
sigunText: fixedSigunText,
};
},
[isAllAreaUser, fixedSidoValue, fixedSigunValue, code.cityCd, code.sggCd]
);
const excelClick = useCallback(() => {
if (!excelData || excelData.length === 0) {
@@ -489,7 +525,18 @@ export default function PbnstPrfmncSttn() {
}, [outLineData]);
useEffect(() => {
const returnType: ReturnType = {
getLaeSeCdCheck();
tableHeadMaker(Number(searchYear), Number(searchYear));
getFlctsSttn();
}, [getLaeSeCdCheck, tableHeadMaker, searchYear, getFlctsSttn]);
useEffect(() => {
if (!isLaeSeCdReady || fclts.length === 0) {
return;
}
skipNextSearchRef.current = true;
const initialValue = getFixedSearchValue({
sidoValue: "0",
sigunValue: "0",
partValue: "A",
@@ -498,17 +545,31 @@ export default function PbnstPrfmncSttn() {
middleRegionValue: "",
envPartValue: "",
sidoText: "",
sigunText: ""
}
tableHeadMaker(Number(searchYear), Number(searchYear));
getFlctsSttn();
pbnstPrfmncSearch(1, returnType, "", searchYear, searchYear, fclts)
}, []);
sigunText: "",
});
pbnstPrfmncSearch(1, initialValue, "", searchYear, searchYear, fclts);
}, [fclts, isLaeSeCdReady, getFixedSearchValue, pbnstPrfmncSearch, searchYear]);
useEffect(() => {
pbnstPrfmncSearch(pageNation, ref.current, pbnRuseNm, fromDate, toDate, pbnstPrfmncSttn.fclts);
if (!isLaeSeCdReady || fclts.length === 0) {
return;
}
if (skipNextSearchRef.current) {
skipNextSearchRef.current = false;
return;
}
pbnstPrfmncSearch(
pageNation,
getFixedSearchValue(ref.current),
pbnRuseNm,
fromDate,
toDate,
pbnstPrfmncSttn.fclts
);
isResetPage(false)
}, [fclts, pageNation]);
}, [fclts, pageNation, pbnRuseNm, fromDate, toDate, pbnstPrfmncSttn.fclts, isLaeSeCdReady, getFixedSearchValue, pbnstPrfmncSearch]);
useEffect(() => {
const tableData = prfmncRes.map((e, idx) => {
@@ -525,8 +586,8 @@ export default function PbnstPrfmncSttn() {
useEffect(() => {
if (pbnRuseNm.length > 1)
pbnNmSearch("1", "23", ref.current, pbnRuseNm, searchYear, []);
}, [pbnRuseNm]);
pbnNmSearch("1", "23", getFixedSearchValue(ref.current), pbnRuseNm, searchYear, []);
}, [pbnRuseNm, getFixedSearchValue, pbnNmSearch, searchYear]);
const cellClick = (index: number | undefined, headId: string) => {
if (index !== undefined && headId !== undefined) {
@@ -539,8 +600,18 @@ export default function PbnstPrfmncSttn() {
<div className="grid grid-cols-4 gap-4 ">
<div className="col-span-4">
<SearchBaseForm
selectSidoData={code.cityCd}
selectSigunData={code.sggCd}
selectSidoData={
!isAllAreaUser && fixedSidoValue
? code.cityCd.filter((item) => item.val === fixedSidoValue)
: code.cityCd
}
selectSigunData={
!isAllAreaUser && laeSeCd?.length === 5
? code.sggCd.filter((item) => item.val === laeSeCd)
: !isAllAreaUser && laeSeCd?.length
? code.sggCd.filter((item) => item.val.slice(0, 2) === fixedSidoValue)
: code.sggCd
}
selectRegionData={code.rvbsnCd}
selectUnitWaterShedData={code.lgbsnCd}
selectMiddleRegionData={code.mdmbsnCd}
@@ -594,7 +665,11 @@ export default function PbnstPrfmncSttn() {
</div>
</div>}
queryClick={function (returnType: ReturnType): void {
pbnstPrfmncSearch(1, returnType, pbnRuseNm ?? "", fromDate, toDate, fclts);
if (!isLaeSeCdReady || fclts.length === 0) {
return;
}
const fixedSearchValue = getFixedSearchValue(returnType);
pbnstPrfmncSearch(1, fixedSearchValue, pbnRuseNm ?? "", fromDate, toDate, fclts);
if (fromDate && toDate) {
const fromNum = Number(fromDate);
const toNum = Number(toDate);
@@ -618,7 +693,11 @@ export default function PbnstPrfmncSttn() {
setToDate(String(new Date().getFullYear()))
}}
btnClass={btnClass}
ref={ref} isAdmin={false} />
ref={ref}
isAdmin={!isAllAreaUser}
initSidoValue={fixedSidoValue}
initSigunValue={fixedSigunValue !== "0" ? fixedSigunValue : ""}
/>
</div>
</div>
<div className="grid grid-cols-6 gap-4 ">
@@ -112,6 +112,12 @@ export const hasuListFetch = async (
year: string,
flcts: string[]
) => {
// 시설 코드가 없으면 FO 조회를 호출하지 않고 빈 결과 반환
if (flcts.length === 0) {
return { data: [], count: 0 };
}
let url = ``;
let filteredFclt = flcts;
const filterData =
@@ -163,6 +169,11 @@ export const hasuListFetch = async (
url += "/" + searchNm;
}
// 시설 코드가 없으면 FO 조회를 호출하지 않고 빈 결과 반환
if (filteredFclt.length === 0) {
return { data: [], count: 0 };
}
const pbnList = await postFectch(
`/prcsFclt/ruseInfo/1/${filteredFclt.length}/` + url,
filteredFclt,
@@ -26,6 +26,7 @@ type SearchBaseType = {
leftSelectClassName?: string;
buttonOrder?: ("query" | "init" | "excel")[];
initSidoValue?: string | '';
initSigunValue?: string | '';
excelDisabled?: boolean;
}
export type ReturnType = {
@@ -61,11 +62,12 @@ function SearchBaseForm ({
leftSelectClassName,
buttonOrder,
initSidoValue='',
initSigunValue='',
excelDisabled=false,
}: SearchBaseType) {
const [partValue, setPartValue] = useState<string>("A");
const [sidoValue, setSidoValue] = useState<string>(initSidoValue?initSidoValue:"0");
const [sigunValue, setSigunValue] = useState<string>("0");
const [sigunValue, setSigunValue] = useState<string>(initSigunValue?initSigunValue:"0");
const [sidoText, setSidoText] = useState<string>("");
const [sigunText, setSigunText] = useState<string>("");
const [regionValue, setRegionValue] = useState<string>("0");
@@ -115,18 +117,24 @@ function SearchBaseForm ({
if(initSidoValue){
setSidoValue(initSidoValue);
}
if(initSigunValue){
setSigunValue(initSigunValue);
}
setResetTrigger(true);
initClick();
}, [initSidoValue, setResetTrigger, initClick]);
}, [initSidoValue, initSigunValue, setResetTrigger, initClick]);
useEffect(() => {
if (resetTrigger) {
if(initSidoValue!=""){
setSidoValue(initSidoValue);
}
if(initSigunValue!=""){
setSigunValue(initSigunValue);
}
setResetTrigger(false);
}
}, [resetTrigger]);
}, [resetTrigger, initSidoValue, initSigunValue]);
const excelDownload = () => {
excelClick({
partValue: partValue,
@@ -179,6 +187,7 @@ function SearchBaseForm ({
leftClassName={leftClassName}
leftSelectClassName={leftSelectClassName}
initSidoValue={initSidoValue}
initSigunValue={initSigunValue}
>
{leftChildren}
</SearchFormLeft>
@@ -47,6 +47,7 @@ type SearchFormLeftProps = {
leftClassName?: string;
leftSelectClassName?: string;
initSidoValue?: string;
initSigunValue?: string;
}
export type EnvPartSelectDataType = SelectDataType & {
@@ -59,12 +60,12 @@ const selectPartData:SelectDataType[] = [
{ text: "환경청별", val: 'G' },
];
function SearchFormLeft({ isShowPart = false, children, selectSidoData = [], selectSigunData = [], selectRegionData = [], selectUnitWaterShedData = [], selectMiddleRegionData = [], selectEnvPartData = [], setRtnPartValue, setRtnSidoValue, setRtnSidoText, setRtnSigunValue, setRtnSigunText, setRtnRegionValue, setRtnUnitWaterShedValue, setRtnMiddleRegionValue, setRtnEnvPartValue, setRtnEnvPartSidoValue, setRtnEnvPartSigunValue, resetTrigger = false, isAdmin = false, leftClassName, leftSelectClassName, initSidoValue }: SearchFormLeftProps) {
function SearchFormLeft({ isShowPart = false, children, selectSidoData = [], selectSigunData = [], selectRegionData = [], selectUnitWaterShedData = [], selectMiddleRegionData = [], selectEnvPartData = [], setRtnPartValue, setRtnSidoValue, setRtnSidoText, setRtnSigunValue, setRtnSigunText, setRtnRegionValue, setRtnUnitWaterShedValue, setRtnMiddleRegionValue, setRtnEnvPartValue, setRtnEnvPartSidoValue, setRtnEnvPartSigunValue, resetTrigger = false, isAdmin = false, leftClassName, leftSelectClassName, initSidoValue, initSigunValue }: SearchFormLeftProps) {
/******************선택된 데이터******************/
const [partValue, setPartValue] = useState<string>('A');
//행정별 시도 시군구
const [sidoValue, setSidoValue] = useState<string>(initSidoValue?initSidoValue : '0');
const [sigunValue, setSigunValue] = useState<string>('0');
const [sigunValue, setSigunValue] = useState<string>(initSigunValue?initSigunValue : '0');
const [sidoText, setSidoText] = useState<string>('');
const [sigunText, setSigunText] = useState<string>('');
//유역별
@@ -87,6 +88,39 @@ function SearchFormLeft({ isShowPart = false, children, selectSidoData = [], sel
const [filteredEnvPartSigunData, setFilteredEnvPartSigunData] = useState<SelectDataType[]>([{ text: "전체", val: '0' }]);
const [initTrigger, setInitTrigger] = useState<boolean>(false);
useEffect(() => {
if (!initSidoValue) return;
if (!selectSidoData.some((item) => item.val === initSidoValue)) return;
const selectedSido = selectSidoData.find((item) => item.val === initSidoValue);
setSidoValue(initSidoValue);
setSidoText(selectedSido?.text || "");
if (setRtnSidoValue) setRtnSidoValue(initSidoValue);
if (setRtnSidoText) setRtnSidoText(selectedSido?.text || "");
initializeSigunData(initSidoValue);
}, [initSidoValue, selectSidoData]);
useEffect(() => {
if (!initSidoValue || !initSigunValue) return;
const initializedSigunData = [
{ text: "전체", val: '0' },
...selectSigunData.filter(
(item: SelectDataType) => item.val.substring(0, 2) === initSidoValue
)
];
const selectedSigun = initializedSigunData.find((item) => item.val === initSigunValue);
if (!selectedSigun) return;
setFilteredSigunData(initializedSigunData);
setSigunValue(initSigunValue);
setSigunText(selectedSigun.text || "");
if (setRtnSigunValue) setRtnSigunValue(initSigunValue);
if (setRtnSigunText) setRtnSigunText(selectedSigun.text || "");
}, [initSidoValue, initSigunValue, selectSigunData, setRtnSigunText, setRtnSigunValue]);
// 시군구 세팅
const initializeSigunData = (sidoCd: string) => {
if (sidoCd === '0') {
@@ -204,7 +238,7 @@ function SearchFormLeft({ isShowPart = false, children, selectSidoData = [], sel
setRtnSidoText(selectedSido?.text || '');
}
initializeSigunData(val);
onSelectValue('0', 'sigun');
onSelectValue(val === initSidoValue && initSigunValue ? initSigunValue : '0', 'sigun');
break;
case 'sigun':
if (setRtnSigunValue) {
@@ -276,7 +310,7 @@ function SearchFormLeft({ isShowPart = false, children, selectSidoData = [], sel
const resetAllValues = () => {
setPartValue('A');
setSidoValue(initSidoValue?initSidoValue:'0');
setSigunValue('0');
setSigunValue(initSigunValue?initSigunValue:'0');
setRegionValue('0');
setUnitWaterShedValue('0');
setMiddleRegionValue('0');
@@ -291,7 +325,7 @@ function SearchFormLeft({ isShowPart = false, children, selectSidoData = [], sel
if (setRtnPartValue) setRtnPartValue('A');
if (setRtnSidoValue) setRtnSidoValue(initSidoValue?initSidoValue:'0');
if (setRtnSigunValue) setRtnSigunValue('0');
if (setRtnSigunValue) setRtnSigunValue(initSigunValue?initSigunValue:'0');
if (setRtnRegionValue) setRtnRegionValue('0');
if (setRtnUnitWaterShedValue) setRtnUnitWaterShedValue('0');
if (setRtnMiddleRegionValue) setRtnMiddleRegionValue('0');