"use client"; import { useEffect, useMemo, useRef, useState } from "react"; import SubPageHeader from "@/components/SubPageHeader"; import { useDmStore } from "@/app/store"; import type { DemandCompBizType } from "@/app/store/sdmMng"; type TopField = { label: string; value: string; required?: boolean }; type PairField = { label: string; value: string }; type SessionUser = { dmdInfoId?: string }; const formatDate = (value: string | Date | "" | undefined) => { if (!value) return "-"; const date = new Date(value); if (Number.isNaN(date.getTime())) return String(value); const yyyy = date.getFullYear(); const mm = String(date.getMonth() + 1).padStart(2, "0"); const dd = String(date.getDate()).padStart(2, "0"); return `${yyyy}-${mm}-${dd}`; }; const formatValue = (value: string | number | null | undefined) => { if (value === null || value === undefined || value === "") return "-"; return String(value); }; const formatBelow = (value: string | number | null | undefined) => { if (value === null || value === undefined || value === "") return "-"; if (Number(value) === -1) return "불검출"; return `${value} 이하`; }; function StatusBadge({ v }: { v: string }) { const cls = v === "신청" ? "text-red-600" : "text-lime-600"; return {v || "-"}; } export default function DemandStatusPage() { const { getSdmInfoStatusList, Sdm, Common } = useDmStore((state) => state); const { successLogin, sdmInfoStatusList } = Sdm; const { selectSidoData, selectSigunData } = Common; const detailRef = useRef(null); const [isLoginStorageInfo, setIsLoginStorageInfo] = useState(false); const [selectedDmdInfoSn, setSelectedDmdInfoSn] = useState(null); const [transformedSdmInfoStatusList, setTransformedSdmInfoStatusList] = useState([]); useEffect(() => { const user = sessionStorage.getItem("user"); if (user) { setIsLoginStorageInfo(true); } }, []); useEffect(() => { if (!successLogin && !isLoginStorageInfo) return; const user = sessionStorage.getItem("user"); if (!user) return; try { const userData = JSON.parse(user) as SessionUser; const dmdInfoId = userData.dmdInfoId?.trim(); if (dmdInfoId) { getSdmInfoStatusList(dmdInfoId); } } catch (error) { console.error("Error parsing user data:", error); } }, [successLogin, isLoginStorageInfo, getSdmInfoStatusList]); useEffect(() => { const mappedList = sdmInfoStatusList.map((item) => ({ ...item, ctpvCd: selectSidoData.find((sido) => sido.val === item.ctpvCd?.trim())?.text || item.ctpvCd, sggCd: selectSigunData.find((sigun) => sigun.val === item.sggCd?.trim())?.text || item.sggCd, })); setTransformedSdmInfoStatusList(mappedList); }, [sdmInfoStatusList, selectSidoData, selectSigunData]); useEffect(() => { const first = transformedSdmInfoStatusList[0]; if (!first) { setSelectedDmdInfoSn(null); return; } if (selectedDmdInfoSn == null) { setSelectedDmdInfoSn(first.dmdInfoSn); return; } const exists = transformedSdmInfoStatusList.some( (item) => item.dmdInfoSn === selectedDmdInfoSn, ); if (!exists) { setSelectedDmdInfoSn(first.dmdInfoSn); } }, [transformedSdmInfoStatusList, selectedDmdInfoSn]); const selectedSdmInfoStatus = useMemo(() => { if (!transformedSdmInfoStatusList.length) return null; return ( transformedSdmInfoStatusList.find((item) => item.dmdInfoSn === selectedDmdInfoSn) ?? transformedSdmInfoStatusList[0] ); }, [transformedSdmInfoStatusList, selectedDmdInfoSn]); const topFields: TopField[] = useMemo(() => { if (!selectedSdmInfoStatus) return []; return [ { label: "요구시기", value: formatDate(selectedSdmInfoStatus.dmndTmng), required: true }, { label: "요구수량(㎥/d)", value: formatValue(selectedSdmInfoStatus.dmndQty) }, { label: "사용용도", value: formatValue(selectedSdmInfoStatus.useUsgCd) }, { label: "희망단가(원/㎥)", value: formatValue(selectedSdmInfoStatus.wntUntprc) }, ]; }, [selectedSdmInfoStatus]); const waterFields: PairField[] = useMemo(() => { if (!selectedSdmInfoStatus) return []; return [ { label: "총대장균군수(개/100mL)", value: formatBelow(selectedSdmInfoStatus.grssClfg) }, { label: "결합잔류염소(mg/L)", value: formatBelow(selectedSdmInfoStatus.combResdch) }, { label: "탁도(NTU)", value: formatBelow(selectedSdmInfoStatus.trbt) }, { label: "생물학적산소요구량(BOD)(mg/L)", value: formatBelow(selectedSdmInfoStatus.blgcOxygDmndQnt) }, { label: "냄새", value: formatValue(selectedSdmInfoStatus.smll) }, { label: "색도(도)", value: formatBelow(selectedSdmInfoStatus.crmty) }, { label: "총질소(T-N)(mg/L)", value: formatBelow(selectedSdmInfoStatus.tn) }, { label: "총인(T-P)(mg/L)", value: formatBelow(selectedSdmInfoStatus.tph) }, { label: "수소이온농도(pH)", value: formatValue(selectedSdmInfoStatus.ph) }, { label: "염화물(mgCL/L)", value: formatBelow(selectedSdmInfoStatus.clIonQnt) }, { label: "전기전도도(μS/cm)", value: formatBelow(selectedSdmInfoStatus.cdtnv) }, { label: "비고", value: formatValue(selectedSdmInfoStatus.rmrk) }, ]; }, [selectedSdmInfoStatus]); const candidateNames = useMemo(() => { const list = selectedSdmInfoStatus?.splyCndtList ?? []; return [ list[0]?.ruseUtztnFcltNm ?? "", list[1]?.ruseUtztnFcltNm ?? "", list[2]?.ruseUtztnFcltNm ?? "", ]; }, [selectedSdmInfoStatus]); const onSelectSdmInfoStatus = (dmdInfoSn: number | "") => { setSelectedDmdInfoSn(dmdInfoSn); requestAnimationFrame(() => { detailRef.current?.scrollIntoView({ behavior: "smooth", block: "start" }); }); }; return (
수요정보 신청현황
{transformedSdmInfoStatusList.length === 0 ? ( ) : ( transformedSdmInfoStatusList.map((sdmInfoStatus, index) => { const active = sdmInfoStatus.dmdInfoSn === selectedSdmInfoStatus?.dmdInfoSn; return ( onSelectSdmInfoStatus(sdmInfoStatus.dmdInfoSn)} onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { onSelectSdmInfoStatus(sdmInfoStatus.dmdInfoSn); } }} className={[ "border-t border-neutral-200 outline-none", "cursor-pointer", active ? "bg-slate-50" : "hover:bg-slate-50", "focus-visible:ring-2 focus-visible:ring-slate-300", ].join(" ")} aria-selected={active} > ); }) )}
NO. 시도 시군구 회사명 공장주소 전화번호 신청일자 진행상태
조회된 신청내역이 없습니다.
{sdmInfoStatus.index || index + 1} {formatValue(sdmInfoStatus.ctpvCd)} {formatValue(sdmInfoStatus.sggCd)} {formatValue(sdmInfoStatus.dmdCoNm)} {formatValue(sdmInfoStatus.daddr)} {formatValue(sdmInfoStatus.telno)} {formatDate(sdmInfoStatus.dmndTmng)}
수요신청 상세현황
{!selectedSdmInfoStatus ? (
상세 정보를 표시할 신청건이 없습니다.
) : (
요구수량
{topFields.map((field) => (
{field.label} {field.required ? * : null}
{field.value}
))}
요구수질
{waterFields.map((field) => (
{field.label}
{field.value}
))}
공급처 후보지
{candidateNames.map((candidateName, index) => (
후보지{index + 1}
{candidateName}
))}
수요신청 진행상태
진행상태
{formatValue(selectedSdmInfoStatus.status)}
공급처매칭결과
{formatValue(selectedSdmInfoStatus.ruseUtztnFcltNm)}
)}
); }