Merge remote-tracking branch 'origin/iipbs/sn/ii' into iipbs/sn/dev

This commit is contained in:
swcho
2025-07-31 17:11:27 +09:00
7 changed files with 42 additions and 33 deletions
@@ -12,6 +12,8 @@ type LayerComponentProps = {
rainMeasureData?: any;
onSaveClick?: () => void;
onFormDataChange?: (data: any) => void; // 추가
chmbrXcnts: string;
chmbrYdnts: string;
gisObject?: Record<string, any>; // GIS 객체 추가
};
type LayerContentMap = {
@@ -686,5 +686,6 @@ export const numberFields = [
'swrPplEqpAr', 'swrTrtPopl', 'weirHg', 'weirLt',
'precdngDry', 'rainFall', 'cntncTime', 'rainIn',
'mesureIntrvl', 'qltwtrCo', 'rnysnFvlc', 'clarFvlc',
'bizAmt', 'count'
'bizAmt', 'count',
'chmbr_xcnts', 'chmbr_ydnts'
];
@@ -29,13 +29,16 @@ const Ssc = ({ featureData, isMainSsc, chmbrXcnts, chmbrYdnts, onSaveClick }: {
const [selectedRowIndex, setSelectedRowIndex] = useState<number>(-1);
const [curPage, setCurPage] = useState<number>(1);
const [curDetailPage, setCurDetailPage] = useState<number>(1);
const [isResetPage, setIsResetPage] = useState<boolean>(false);
const [isResetDetailPage, setIsResetDetailPage] = useState<boolean>(false);
const [isResetPage, setIsResetPage] = useState<boolean>(true);
const [isResetDetailPage, setIsResetDetailPage] = useState<boolean>(true);
const [isResetSelection, setIsResetSelection] = useState<boolean>(false);
const [curIdx, setCurIdx] = useState<number>(0);
console.log('featureData', featureData);
// 강우, 측정 정보 API 호출 함수
const fetchRainMeasureData = async (chmbrXcnts: string, chmbrYdnts: string) => {
setIsResetDetailPage(true);
setIsResetSelection(true);
if (!chmbrXcnts || !chmbrYdnts) {
console.warn('추가 데이터 호출 실패: 필수 매개변수 누락', { chmbrXcnts, chmbrYdnts });
return [];
@@ -76,6 +79,7 @@ const Ssc = ({ featureData, isMainSsc, chmbrXcnts, chmbrYdnts, onSaveClick }: {
// 수량/수질측정 정보 API 호출 함수
const fetchMntrngsData = async (adstDstrCd: string, manageNo: string) => {
setIsResetDetailPage(true);
if (!adstDstrCd || !manageNo) {
console.warn('추가 데이터 호출 실패: 필수 매개변수 누락', { adstDstrCd, manageNo });
return [];
@@ -87,7 +91,7 @@ const Ssc = ({ featureData, isMainSsc, chmbrXcnts, chmbrYdnts, onSaveClick }: {
size: '3',
});
console.log(`SSC 추가 데이터 API 호출 시작: v1/onsemiro/swgRain?${queryParams.toString()}`);
console.log(`SSC 추가 데이터 API 호출 시작: v1/onsemiro/swgRain/${adstDstrCd}/${manageNo}/mntrngs?${queryParams.toString()}`);
const result = await getData(`v1/onsemiro/swgRain/${adstDstrCd}/${manageNo}/mntrngs?${queryParams.toString()}`);
@@ -143,14 +147,14 @@ const Ssc = ({ featureData, isMainSsc, chmbrXcnts, chmbrYdnts, onSaveClick }: {
// featureData가 변경될 때 formData 초기화
useEffect(() => {
// showTable이 true일 때만 fetch (최초 렌더 방지)
setIsResetPage(false);
setIsResetDetailPage(true);
setIsResetDetailPage(false);
setSelectedRowIndex(-1);
if (chmbrXcnts && chmbrYdnts) fetchRainMeasureData(chmbrXcnts, chmbrYdnts);
}, [curPage]);
// 페이지 변경 시마다 데이터 fetch
useEffect(() => {
if (chmbrXcnts && chmbrYdnts) fetchMntrngsData(chmbrXcnts, chmbrYdnts);
if (chmbrXcnts && chmbrYdnts && selectedRowIndex !== -1) fetchMntrngsData(rainMeasureData[selectedRowIndex].adstDstrCd, rainMeasureData[selectedRowIndex].manageNo);
}, [curDetailPage]);
// 폼 데이터가 변경될 때 호출될 핸들러
@@ -187,7 +191,7 @@ const Ssc = ({ featureData, isMainSsc, chmbrXcnts, chmbrYdnts, onSaveClick }: {
onPageChange={setCurPage}
resetPageNo={isResetPage}
resetSelection={isResetSelection}
index={curIdx}
index={selectedRowIndex}
/>
{/* 측정정보 테이블 */}
@@ -201,7 +205,7 @@ const Ssc = ({ featureData, isMainSsc, chmbrXcnts, chmbrYdnts, onSaveClick }: {
onPageChange={setCurPage}
resetPageNo={isResetPage}
resetSelection={isResetSelection}
index={curIdx}
index={selectedRowIndex}
>
{/* 커스텀 헤더 */}
<TableRow>
@@ -229,6 +233,7 @@ const Ssc = ({ featureData, isMainSsc, chmbrXcnts, chmbrYdnts, onSaveClick }: {
total={totalDetailCount}
cellClick={undefined}
onPageChange={setCurDetailPage}
resetPageNo={isResetDetailPage}
/>
</div>
)
@@ -21,7 +21,6 @@ const FeatureClickEventPopup = ({ onClose, featureData }: { onClose: () => void,
const [layerNm, setLayerNm] = useState<string>(""); // 레이어 이름 상태
const [layerSpecificNm, setLayerSpecificNm] = useState<string>(""); // 레이어 이름 상태
const [tableData, setTableData] = useState<any>(null); // 피처 데이터
const [rainMeasureData, setRainMeasureData] = useState<any[]>([]); // 강우/측정 측정 정보
const [headlist, setHeadlist] = useState<{ id: string; title: string; }[]>([]); // 컬럼리스트 변경상태
const [headlist2, setHeadlist2] = useState<{ id: string; title: string; }[]>([]); // 컬럼리스트 변경상태
const [buttonChk, setButtonChk] = useState(true)
@@ -35,8 +34,8 @@ const FeatureClickEventPopup = ({ onClose, featureData }: { onClose: () => void,
const { setIsOpen: setIsModalRdii } = useRdiiChartModalStore();
const [isClicked, setIsClicked] = useState(true); // 클릭 여부 상태
const [isLoading, setIsLoading] = useState(false); // 로딩 상태
const [chmbrXcnts, setChmbrXcnts] = useState(); // 로딩 상태
const [chmbrYdnts, setChmbrYdnts] = useState(); // 로딩 상태
const [chmbrXcnts, setChmbrXcnts] = useState<string>(''); // 로딩 상태
const [chmbrYdnts, setChmbrYdnts] = useState<string>(''); // 로딩 상태
// 🎯 관로관리번호 추출
const pplMngNo = featureData?.values_?.fclt_mng_no || "";
@@ -406,7 +405,7 @@ const FeatureClickEventPopup = ({ onClose, featureData }: { onClose: () => void,
</h3>
</div>
<div className="flex items-center space-x-3">
{/* 🎯 하수관로일 때만 Infil/RDII 버튼 표시 */}
{/* 하수관로일 때만 Infil/RDII 버튼 표시 */}
{layerNm === '하수관로' && (
<>
<Button onClick={() => setIsModalInfil(true)}
@@ -442,9 +441,7 @@ const FeatureClickEventPopup = ({ onClose, featureData }: { onClose: () => void,
</div>
<Button
onClick={onClose}
// className="text-white hover:text-gray-300 focus:outline-none"
className="flex items-center space-x-4 text-white hover:text-gray-300 focus:outline-none"
// className="absolute top-8 right-4 text-white hover:text-gray-300 focus:outline-none"
size="xs"
>
✕
@@ -477,7 +474,6 @@ const FeatureClickEventPopup = ({ onClose, featureData }: { onClose: () => void,
featureData={fetchData}
isMainSsc={isMainSsc}
isDrtwSewagePump={isDrtwSewagePump}
// rainMeasureData={rainMeasureData}
onSaveClick={handleSaveClick}
chmbrXcnts={chmbrXcnts}
chmbrYdnts={chmbrYdnts}
@@ -486,7 +482,6 @@ const FeatureClickEventPopup = ({ onClose, featureData }: { onClose: () => void,
}
</div>
{/* 🎯 InfilChart 및 RdiiChart 컴포넌트 추가 */}
<InfilChart pplMngNo={pplMngNo} />
<RdiiChart pplMngNo={pplMngNo} />
</div>
-3
View File
@@ -41,8 +41,6 @@ export const postData = async (url: string, data: object): Promise<any> => {
body: JSON.stringify(data),
};
const res = await fetch(`${BASE_URL}/${url}`, options);
console.log('res', res);
console.log('res.status', res.status);
if (res.ok) {
const resData = await res.json();
return resData;
@@ -99,7 +97,6 @@ export const getDcData = async (url: string, data?: object): Promise<any> => {
// CMS API 호출
export const getCmsData = async (url: string, data?: object): Promise<any> => {
console.log(url);
const res = await fetch('/cms-service' + url, {
method: "GET",
});
@@ -34,7 +34,7 @@ export const formatDisplayData = (data: { [key: string]: any }): { [key: string]
// yyyy-mm-dd hh:mm:ss 형식 확인
const dateTimeRegex = /^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/;
const match = dateTimeStr.match(dateTimeRegex);
if (match && match.length >= 6) {
const year = match[1];
const month = match[2];
@@ -42,7 +42,7 @@ export const formatDisplayData = (data: { [key: string]: any }): { [key: string]
const hour = match[4];
const minute = match[5];
const second = match[6];
// 🎯 undefined 체크 후 parseInt 적용
if (year && month && day && hour && minute) {
// const formattedMonth = parseInt(month);
@@ -61,7 +61,7 @@ export const formatDisplayData = (data: { [key: string]: any }): { [key: string]
// 🎯 기존 날짜 포맷팅 (yyyymmdd -> yyyy년 m월 d일)
if (dateFields.includes(fieldId)) {
const dateStr = String(value).trim();
// 숫자 타입이거나 숫자로만 구성된 문자열인지 확인
if (/^\d+$/.test(dateStr)) {
formattedData[fieldId] = formatDateString(dateStr);
@@ -75,7 +75,12 @@ export const formatDisplayData = (data: { [key: string]: any }): { [key: string]
if (numberFields.includes(fieldId)) {
const numValue = Number(value);
if (!isNaN(numValue) && isFinite(numValue)) {
formattedData[fieldId] = numValue.toLocaleString('ko-KR');
// 소수점이 있는 경우 4자리까지 표시
if (!Number.isInteger(numValue)) {
formattedData[fieldId] = numValue.toLocaleString('ko-KR', { maximumFractionDigits: 4 });
} else {
formattedData[fieldId] = numValue.toLocaleString('ko-KR');
}
} else {
formattedData[fieldId] = String(value);
}
@@ -78,6 +78,10 @@ export function UiTable({
}
}, [tableData, headlist]);
useEffect(() => {
setIdx(index);
}, [index])
const handlePageChange = (page: number) => {
setCur(page);
onPageChange(page);
@@ -120,10 +124,10 @@ export function UiTable({
(boldArray.includes(index) ? (
<TableCell
className={`${head.align === "right" ? "text-right" : head.align === "center" ? "text-center" : "text-center"} ${cellClick && idx === index
? "cursor-pointer !font-[1000]"
: cellClick
? "cursor-pointer"
: ""
? "cursor-pointer !font-[1000]"
: cellClick
? "cursor-pointer"
: ""
} sticky top-20 z-40 bg-secondary !font-bold`}
style={{ top: `${headerHeight + index * 32 - 4}px` }}
onClick={() => handleCellClick(index, head.id)}
@@ -151,10 +155,10 @@ export function UiTable({
) : (
<TableCell
className={`${head.align === "right" ? "text-right" : head.align === "center" ? "text-center" : "text-center"} ${cellClick && idx === index
? "cursor-pointer !font-[1000]"
: cellClick
? "cursor-pointer"
: ""
? "cursor-pointer !font-[1000]"
: cellClick
? "cursor-pointer"
: ""
} mt-[${boldArray.length * 40}px]`}
onClick={() => handleCellClick(index, head.id)}
key={`cell-${head.id}-${index}`}