diff --git a/apps/sn/.env.local b/apps/sn/.env.local index d0be4b904..2d8993cb5 100644 --- a/apps/sn/.env.local +++ b/apps/sn/.env.local @@ -1,6 +1,7 @@ NEXT_PUBLIC_SITE_ID = SN NEXT_PUBLIC_PORT = 3002 NEXT_PUBLIC_PROXY_HOST = http://localhost:3002 +NEXT_PUBLIC_ADDR_URL = http://con.mind-one.co.kr:11082 NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 NEXT_PUBLIC_GEOSERVER_URL = http://rsone.iptime.org:10010/geoserver NEXT_PUBLIC_LX_GEOSERVER_URL = http://con.mind-one.co.kr:11306/geoserver diff --git a/apps/sn/.env.production b/apps/sn/.env.production index fab02e36c..9300c5ae3 100644 --- a/apps/sn/.env.production +++ b/apps/sn/.env.production @@ -1,9 +1,11 @@ NEXT_PUBLIC_SITE_ID = SN NEXT_PUBLIC_PORT = 11302 NEXT_PUBLIC_PROXY_HOST = http://con.mind-one.co.kr:11302 +NEXT_PUBLIC_ADDR_URL = http://con.mind-one.co.kr:11082 NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 NEXT_PUBLIC_GEOSERVER_URL = http://rsone.iptime.org:10010/geoserver NEXT_PUBLIC_LX_GEOSERVER_URL = http://con.mind-one.co.kr:11306/geoserver #TODO 운영에서 바꿔야 함 +NEXT_PUBLIC_RSONE_DC_URL = https://apigateway.rsonesoft.com #자료관 데이터 NEXT_PUBLIC_CLAIM_NAME = Authorization NEXT_PUBLIC_AUTH_USER_ID = token-id NEXT_PUBLIC_ACCESS_TOKEN = access-token diff --git a/apps/sn/app/(map-layout)/map/SearchModal.tsx b/apps/sn/app/(map-layout)/map/SearchModal.tsx index a549ece0b..35c5a445a 100644 --- a/apps/sn/app/(map-layout)/map/SearchModal.tsx +++ b/apps/sn/app/(map-layout)/map/SearchModal.tsx @@ -10,6 +10,9 @@ import { YearRangeSelectBox } from '@/components/ui/YearRangeSelectBox'; import { SidoSigunguSelectBox } from '@/components/ui/SidoSigunguSelectBox'; import { MsSwagePplCol2, SwtrmtFcltCol2, SwtrmtPrcsZoneCol2, MsSwageMhlCol2, ExclnSewagePumpCol2, stofcbrCol2 } from './components/common/table'; import LoadingOverlay from '@/components/ui/LoadingBar'; +//import { useDcTree, flattenFolders, useSggCd, useCityCd } from './components/searchModalReportApi'; +import { getDcTree,useDcTree,flattenFolders, useSggCd, useCityCd } from './components/searchModalReportApi'; +import { useCityCdStore, type SelectDataType } from './commonStore'; const API_URL = `${process.env.NEXT_PUBLIC_SEWERAGE_API_URL}`; @@ -51,22 +54,15 @@ const operationTableHeadlist = [ // 하수도정비 기본계획 보고서 const reportTableHeadlist = [ { id: "no", title: "NO" }, - { id: "approvalYear", title: "승인년도" }, { id: "sido", title: "시도" }, { id: "sigungu", title: "시군구" }, - { id: "treatmentPlant", title: "하수처리장" }, - { id: "treatmentZone", title: "하수처리구역" }, - { id: "reportCount", title: "보고서(00건)" }, - { id: "planMapCount", title: "하수도대장 평면도(00건)" }, + { id: "approvalYear", title: "승인년도" }, + { id: "plantZoneGugun", title: "구분" }, + { id: "reportGubun", title: "보고서구분" }, + { id: "fileName", title: "파일명" }, { id: "regDate", title: "등록일자" }, ]; -const 처리구역List = [ - { val: "0", text: "선택" }, - { val: "a", text: "A" }, - { val: "b", text: "B" }, -]; - // 날짜 조합 함수 const getDateString = ( year: string, @@ -99,9 +95,10 @@ const SearchModal: React.FC = ({ const [tableCount, setTableCount] = useState(0); const [curPage, setCurPage] = useState(1); const [basicType, setBasicType] = useState(BASIC_TYPES[0]?.val ?? ""); - const [시도, set시도] = useState(0); - const [시군구, set시군구] = useState(0); - const [처리구역, set처리구역] = useState(""); + const [ctpvCd, setCtpvCd] = useState('0'); + const [sigungu, setSigungu] = useState('0'); + //const [swageProcessingZone, set처리구역] = useState(""); + const [gubun, setGubun] = useState(""); // 하수정비기본계획 report // 날짜 상태 선언 const [시작1, set시작1] = useState(""); const [시작2, set시작2] = useState(""); @@ -124,12 +121,17 @@ const SearchModal: React.FC = ({ const [가동개시_종료_일, set가동개시_종료_일] = useState(''); const [fromDate, setFromDate] = useState(() => { const date = new Date(); date.setDate(date.getDate() - 7); return date }) const [toDate, setToDate] = useState(new Date()) + const [filteredSiguns, setFilteredSiguns] = useState([{ val: '0', text: '전체', sido: '0' }]); // 로딩바 const [isLoading, setIsLoading] = useState(false); // 상세 정보 조회를 위한 상태 추가 const [popupFeature, setPopupFeature] = useState(null); + const sidos = useCityCd(); + const siguns = useSggCd(); + const reportOriginData = useDcTree(""); + // 오늘 날짜 구하기 const today = new Date(); const todayYear = today.getFullYear().toString(); @@ -162,6 +164,7 @@ const SearchModal: React.FC = ({ else if (basicType === 'tb_ms_swage_pmstn') dynamicHeadlist = ExclnSewagePumpCol2; // 하수펌프장 else if (basicType === 'tb_ms_stofcbr') dynamicHeadlist = stofcbrCol2; // 우수토실 + // 조회 버튼 클릭 시 1페이지로 이동하도록 수정 const handleSearch = () => { setCurPage(1); // 페이지를 1로 초기화 @@ -177,7 +180,16 @@ const SearchModal: React.FC = ({ } }; - // 구분(basicType)이 바뀔 때마다 queryParams, filterParams 초기화 + const handleCtpvCdChange = (val: string|number) => { + const sidoOption = sidos.find((n) => n.val === val); + setCtpvCd(String(val)); + if (val !== '0' && sidoOption) { + const filterSiguns = siguns.filter(item => item.sido === sidoOption.text); + filterSiguns.unshift({ val: '0', text: '전체', sido: '0' }); + setFilteredSiguns(filterSiguns); + } + } + useEffect(() => { // filterParams 초기화 // setFilterParams({}); @@ -193,9 +205,8 @@ const SearchModal: React.FC = ({ set가동개시_종료_월(""); set가동개시_시작_일(""); set가동개시_종료_일(""); - set시도(0); - set시군구(0); - set처리구역(""); + setCtpvCd('0'); + setSigungu('0'); setYearFilter({ 시작: "", 종료: "", @@ -205,7 +216,7 @@ const SearchModal: React.FC = ({ setTableCount(0); setTableData([]); // queryParams는 fetchFilteredData 내에서 매번 새로 생성되므로 별도 상태 초기화는 필요 없음 - }, [activeTab, basicType]); + }, [activeTab, basicType, open]); // 페이지 변경 시마다 데이터 fetch useEffect(() => { @@ -216,6 +227,7 @@ const SearchModal: React.FC = ({ } }, [curPage]); + // 검색 API 호출 함수 const fetchFilteredData = async () => { setIsLoading(true); // 로딩 시작 @@ -243,14 +255,46 @@ const SearchModal: React.FC = ({ if (cqlFilters.length > 0) queryParams.append('cqlFiter', cqlFilters.join(' and ')); - console.log('API URL:', `${API_URL}/v1/fclts?${queryParams.toString()}`); - const res = await axios.get(`${API_URL}/v1/fclts?${queryParams.toString()}`); - console.log('필터링된 API 결과(개수):', res.data.count); - console.log('필터링된 API 결과(데이터):', res.data.data); + if (activeTab === 'report') { + //const reportOriginData = await getDcTree('경기도'); + const reportData = flattenFolders(reportOriginData); + let filterReportData = reportData; + if (ctpvCd !== "0") { + const sidoOption = sidos.find((n) => n.val === ctpvCd); + filterReportData = filterReportData.filter(item => item.sido === sidoOption?.text); + } + if (sigungu !== "0") { + const sigunguOption = filteredSiguns.find((n) => n.val === sigungu); + filterReportData = filterReportData.filter(item => item.sigungu === sigunguOption?.text); + } + if (yearFilter.시작 != "" && yearFilter.종료 == "") + filterReportData = filterReportData.filter(item => (item.approvalYear)? item.approvalYear >= yearFilter.시작+"년" : null); + if (yearFilter.시작 == "" && yearFilter.종료 != "") + filterReportData = filterReportData.filter(item => (item.approvalYear)? item.approvalYear <= yearFilter.종료+"년" : null); + if (yearFilter.시작 != "" && yearFilter.종료 != "") { + filterReportData = filterReportData.filter(item => { + return (item.approvalYear)? item.approvalYear >= yearFilter.시작+"년" && item.approvalYear <= yearFilter.종료+"년": null; + }); + } + if (gubun !== "") { + filterReportData = filterReportData.filter(item => (item.plantZoneGugun)? String(item.plantZoneGugun).includes(String(gubun)) : null); + } + console.log('report count:', filterReportData.length); + setTableCount(filterReportData.length || 0); + filterReportData = filterReportData.slice((curPage-1)*10, curPage*10); // paging + filterReportData = filterReportData?.map((item, index)=>({...item, no:(curPage-1)*10+index+1})); + setTableData(filterReportData || []); + + } else { + console.log('API URL:', `${API_URL}/v1/fclts?${queryParams.toString()}`); + const res = await axios.get(`${API_URL}/v1/fclts?${queryParams.toString()}`); + console.log('필터링된 API 결과(개수):', res.data.count); + console.log('필터링된 API 결과(데이터):', res.data.data); + setTableData(res.data.data || []); + setTableCount(res.data.count || []); + console.log('tableCount 상태 업데이트 후:', res.data.count); // tableCount 로그 추가 + } - setTableData(res.data.data || []); - setTableCount(res.data.count || []); - console.log('tableCount 상태 업데이트 후:', res.data.count); // tableCount 로그 추가 setShowTable(true); } catch (err) { console.error('API ERROR:', err); @@ -326,8 +370,8 @@ const SearchModal: React.FC = ({ // 하수처리구역용 CQL 필터 생성 const zoneCqlFilters = () => { const cqlFilters: string[] = []; - if (시도) cqlFilters.push(`ctpv_cd='${시도}'`); - if (시군구) cqlFilters.push(`sgg_cd='${시군구}'`); + if (ctpvCd) cqlFilters.push(`ctpv_cd='${ctpvCd}'`); + if (sigungu) cqlFilters.push(`sgg_cd='${sigungu}'`); if (변수1) cqlFilters.push(`swtrmt_zone_nm ILIKE '%${변수1}%'`); if (변수2) cqlFilters.push(`swtrmt_fclt_nm ILIKE '%${변수2}%'`); return cqlFilters; @@ -447,25 +491,9 @@ const SearchModal: React.FC = ({ const reportCqlFilters = () => { const cqlFilters: string[] = []; // 설치년도 범위 - if (시도) cqlFilters.push(`ctpv_cd='${시도}'`); - if (시군구) cqlFilters.push(`sgg_cd='${시군구}'`); - if (처리구역) cqlFilters.push(`처리구역='${처리구역}'`); - if (변수1) cqlFilters.push(`처리구역코드='${변수1}'`); - const startDate = getDateString( - yearFilter.시작, - 가동개시_시작_월, - 가동개시_시작_일, - "19000101", - ); - const endDate = getDateString( - yearFilter.종료, - 가동개시_종료_월, - 가동개시_종료_일, - `${todayYear}${todayMonth}${todayDate}`, - ); - cqlFilters.push( - `설치시작년도 >= '${startDate}' and 설치시작년도 <= '${endDate}'`, - ); + if (ctpvCd) cqlFilters.push(`ctpv_cd='${ctpvCd}'`); + if (sigungu) cqlFilters.push(`sgg_cd='${sigungu}'`); + return cqlFilters; }; @@ -694,13 +722,13 @@ const SearchModal: React.FC = ({
{ - set시도(sidoId); - set시군구(0); + setCtpvCd(sidoId); + setSigungu(0); }} - onSigunguChange={set시군구} + onSigunguChange={setSigungu} />