Merge commit 'c69a829de20d5c7241b458eb7a351e3b3414de28' into iipbs/wr/form_fuction

This commit is contained in:
jyha00
2025-06-11 14:42:56 +09:00
25 changed files with 1607 additions and 640 deletions
+12 -13
View File
@@ -1,5 +1,6 @@
"use client";
import { useWrStore } from "@/app/store";
import { ruseUtzType } from "@/app/store/matDmd/ruseCaseMng/headList";
import { getCity } from "@/components/lib/func/commom";
import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal";
import { ContentsDiv, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiTable, type SelectDataType } from "@common/business_components/ui";
@@ -8,9 +9,11 @@ import { Button } from "@common/components/ui";
import { useState } from "react";
export default function RuseCaseMng() {
const { code, } = useWrStore((state) => state);
const { code,ruseCase} = useWrStore((state) => state);
const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>()
const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" });
const [selectUtz, setSelectUtz] = useState<string[] | []>()
const [searchTxt, setSearchTxt] = useState<string>()
const getSelCity = (val: string | number) => {
const cityValue = String(val);
@@ -20,7 +23,6 @@ export default function RuseCaseMng() {
};
const getSgg = (val: string | number) => {
console.log(val);
setObjSearch({ ...objSearch, sgg: String(val) })
};
return (
@@ -50,21 +52,18 @@ export default function RuseCaseMng() {
className="col-span-2 w-1/3 h-full text-2xl"
label="용도"
selectClass={""}
selectArray={[]}
onSelectValue={() => { }}
/>
<SelectBox
className="ml-4 col-span-2 w-1/3 h-full text-2xl"
label=" "
selectClass={""}
selectArray={[]}
onSelectValue={() => { }}
selectArray={ruseUtzType}
onSelectValue={(val) => {
if(val)
setSelectUtz([String(val)])}}
/>
<SearchInput
className={"text-2xl"}
label=""
label="수요처명"
textValue={""}
setText={(e) => {
setSearchTxt(e)
}}
/>
</div>
@@ -111,7 +110,7 @@ export default function RuseCaseMng() {
headName={"물재이용사례 현황"}
tableData={[]}
children={undefined}
headlist={[]}
headlist={ruseCase.ruseHeadList}
pageSize={20}
total={100000}
cellClick={(index: number | undefined, headId: string) => {
-106
View File
@@ -1,106 +0,0 @@
"use client";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import * as z from "zod";
import { Form } from "@common/business_components/ui";
import { Button } from "@common/components/ui";
import { DmdRegForm } from "@/components/ui/form/matDmd/dmdRegform/component";
import toast, { Toaster } from "react-hot-toast";
import { useRouter } from "next/navigation";
const formSchema = z.object({
dmdSel: z.string().min(1),
dmdTmng: z.coerce.date(),
dmdWq: z.string().min(1).optional(),
useUsgCd: z.string(),
wntUntprc: z.string().min(1),
grssClfg: z.string().min(1),
tn: z.string().min(1).optional(),
combResdch: z.string().min(1).optional(),
tp: z.string().min(1).optional(),
trbt: z.string().min(1).optional(),
ph: z.string().min(1).optional(),
bod: z.string().min(1).optional(),
clIonQnt: z.string().min(1).optional(),
smll: z.string().min(1).optional(),
cdtnv: z.string().min(1).optional(),
crmty: z.string().min(1).optional(),
rmrk: z.string().min(1).optional(),
sply1: z.string().min(1).optional(),
sply2: z.string().min(1).optional(),
sply3: z.string().min(1).optional(),
password: z.string().min(1),
});
export default function MyForm() {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
dmdSel:'',
dmdTmng: new Date(),
dmdWq: "",
useUsgCd: "",
wntUntprc: "",
grssClfg: "",
tn: "",
combResdch: "",
tp: "",
trbt: "",
ph: "",
bod: "",
clIonQnt: "",
smll: "",
cdtnv: "",
crmty: "",
rmrk: "",
sply1: "",
sply2: "",
sply3: "",
password: "",
},
});
const router = useRouter();
async function onSubmit(values: z.infer<typeof formSchema>) {
try {
toast.success("✅ 수요신청이 완료되었습니다.");
await new Promise((resolve) => setTimeout(resolve, 3000));
router.push("../../")
} catch (error) {
toast.error("수요신청을 다시입력해주시길 바랍니다.");
}
}
return (
<>
<div className="grid h-40 grid-cols-3 place-content-center">
<h1 className=" col-start-2 col-span-1 text-4xl underline">
수요 신청정보입력
</h1>
</div>
<div className="grid grid-cols-5 gap-4 overflow-hidden">
<div className="col-span-1 " />
<div className="col-span-3 max-h-[78vh] overflow-y-scroll ">
<div>
<Form {...form}>
<form
onSubmit={form.handleSubmit(onSubmit)}
className="space-y-8 max-w-3xl mx-auto"
>
<DmdRegForm> {form}</DmdRegForm>
<Button type="submit"> 수요신청</Button>
</form>
</Form>
</div>
</div>
<div className="col-span-1 ">
<Toaster position="top-center" />
</div>
</div>
</>
);
}
+21
View File
@@ -153,6 +153,27 @@ export default function Home() {
</div>
</div>
</div>
{/* 통계*/}
<div>
<h2 className="text-xl font-semibold mb-4">통계 매칭</h2>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-2">
<Button className="w-full">
<Link href="stats/rainStat">빗물재이용시설통계</Link>
</Button>
</div>
<div className="col-span-2">
<Button className="w-full">
<Link href="stats/rswtStat">중수도시설통계</Link>
</Button>
</div>
<div className="col-span-2">
<Button className="w-full">
<Link href="stats/matStat">물재이용사례 관리</Link>
</Button>
</div>
</div>
</div>
</div>
</>
);
@@ -20,10 +20,14 @@ import type {
customPbnst,
pubHasuType,
} from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type";
import { excelDownload, getCityOrSgg, yearOptions } from "@/components/lib/func/commom";
import { PbnstRegModal } from "@/components/ui/modal/fcltReg/pbnstRegModal/pbnstRegModal";
import {
excelDownload,
getCityOrSgg,
yearOptions,
} from "@/components/lib/func/commom";
import SearchInputText from "@/components/ui/searchInput/searchInput";
import type { WaterReuseFacility } from "@/app/store/ruseFcltMng/fcltSttn/pbnstSttn/type";
import { PbnstSttnModal } from "@/components/ui/modal/sttn/pbnstSttnModal/pbnstSttnModal";
export default function PbnstSttn() {
const {
@@ -37,10 +41,6 @@ export default function PbnstSttn() {
const ref = useRef<ReturnType>({} as ReturnType);
const codeData = getCityOrSgg(ref);
const [isRuseReg, setIsRuseReg] = useState<{
isModal: boolean;
data: pubHasuType;
}>({ isModal: false, data: {} as pubHasuType });
const [searchYear, setSearchYear] = useState<string>(
String(new Date().getFullYear())
);
@@ -52,11 +52,14 @@ export default function PbnstSttn() {
isModal: boolean;
data: customPbnst;
}>({ isModal: false, data: {} as customPbnst });
const [clickPk , setClickPk] = useState<string>("")
const [pbnRuseNm, setPbnRuseNm] = useState<string>("");
const excelClick = useCallback(() => {
pbnstSttnSearch("1", '10000', ref.current , '', searchYear);
}, [pbnstSttnSearch, searchYear,ref.current]);
pbnstSttnSearch("1", "10000", ref.current, "", searchYear);
}, [pbnstSttnSearch, searchYear, ref.current]);
const cellCLick = useCallback(
(index: number | undefined) => {
@@ -66,7 +69,8 @@ export default function PbnstSttn() {
pbnstSttn.pbnstSttnRes[index]
) {
const pbnstRuseFcltPk = pbnstSttn.pbnstSttnRes[index].pbnstRuseFcltPk;
getPbnStnDetail(pbnstRuseFcltPk.slice(0, 11));
// setClickPk(pbnstRuseFcltPk)
getPbnStnDetail(pbnstRuseFcltPk);
}
},
[getPbnStnDetail, pbnstSttn.pbnstSttnRes]
@@ -86,17 +90,28 @@ export default function PbnstSttn() {
if (!pbnstSttn.isInit) {
pbnSttnInit("1", "13", ref.current, searchYear);
}
}, [pbnstSttn.isInit, pbnSttnInit,ref.current]);
}, [pbnstSttn.isInit, pbnSttnInit, ref.current]);
useEffect(() => {
setBdstTable(pbnstSttn.pbnstSttnRes);
}, [pbnstSttn.pbnstSttnRes]);
useEffect(() => {
if (pbnRuseNm.length > 1)
pbnNmSearch("1", "23", ref.current, pbnRuseNm, searchYear);
}, [pbnRuseNm]);
useEffect(() => {
if (pbnstSttn.pbnstDetail.pbnstRuseFcltPk)
setPbnDetaileData({
isModal: true,
data: pbnstSttn.pbnstDetail,
});
}, [pbnstSttn.pbnstDetail]);
useEffect(() => {
console.log('pbnDetaileData.isModal ', pbnDetaileData.isModal)
},[pbnDetaileData.isModal])
return (
<>
<ContentsDiv>
@@ -122,18 +137,18 @@ export default function PbnstSttn() {
}
leftChildren={
<>
<div className="flex flex-row space-x-2">
<SelectBox
className="w-48 h-full text-2xl"
label="연도"
selectClass={""}
selectArray={yearOptions}
value={searchYear}
onSelectValue={(val: string | number) =>
setSearchYear(String(val))
}
/>
</div>
<div className="flex flex-row space-x-2">
<SelectBox
className="w-48 h-full text-2xl"
label="연도"
selectClass={""}
selectArray={yearOptions}
value={searchYear}
onSelectValue={(val: string | number) =>
setSearchYear(String(val))
}
/>
</div>
<SearchInputText
label={"하수처리시설"}
initValue={pbnRuseNm ?? ""}
@@ -143,10 +158,9 @@ export default function PbnstSttn() {
setRtnData={function (rtnData: any[]): void {
setBdstTable(rtnData);
}}
searchList={pbnstSttn.pbnstSearchData||[]}
searchList={pbnstSttn.pbnstSearchData || []}
></SearchInputText>
</>
</>
}
queryClick={function (returnType: ReturnType): void {
// '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}'
@@ -162,6 +176,7 @@ export default function PbnstSttn() {
initClick={function (): void {}}
btnClass={btnClass}
ref={ref}
isAdmin={false}
/>
</div>
</div>
@@ -203,14 +218,14 @@ export default function PbnstSttn() {
/>
<UiModal
body={
<PbnstRegModal
data={isRuseReg.data || ({} as customPbnst)}
></PbnstRegModal>
<PbnstSttnModal
data={pbnDetaileData.data || ({} as customPbnst)}
></PbnstSttnModal>
}
bodyClass="w-[68vw] max-w-none h-[90vh]"
open={isRuseReg.isModal}
open={pbnDetaileData.isModal}
onOpenChange={(open) => {
setIsRuseReg({ data: {} as pubHasuType, isModal: open });
setPbnDetaileData({ data: {} as customPbnst, isModal: false });
}}
/>
</ContentsDiv>
@@ -84,12 +84,10 @@ export default function prfmncPrfmncReg() {
isModal: false,
data: prfmncRes[index] || ({} as FcPrfType),
});
const inUsageData = initValInUsage;
const outUsageData = initValOutUsage;
const inUsageData = [...initValInUsage];
const outUsageData = [...initValOutUsage];
const inSubtotal = subTotalObj;
const outSubtotal = subTotalObj;
if (prfmncRes[index]?.prfList) {
prfmncRes[index].prfList?.forEach((prfItem) => {
const month = Number(prfItem?.ym?.slice(4)); // "MM"
+74
View File
@@ -0,0 +1,74 @@
'use client'
import { useWrStore } from "@/app/store";
import { yearOptions } from "@/components/lib/func/commom";
import { ContentsDiv, Title, SearchDiv, SearchFormLeft, SelectBox, UiTable } from "@common/business_components/ui";
import ListDiv from "@common/business_components/ui/list_div";
import { Button } from "@common/components/ui";
import { useState } from "react";
export default function MatStat(){
const { code, matStat } = useWrStore((state) => {
return state;
});
const [pageNation, setPageNation] = useState(1);
const [searchYear, setSearchYear] = useState<string>(
String(new Date().getFullYear())
);
return(
<>
<ContentsDiv>
<div className="grid grid-cols-4 gap-4">
<div className="col-span-4">
<Title title={"재이용 통계"} />
<SearchDiv>
<SearchFormLeft>
<SelectBox
className="w-full h-full text-2xl"
label="통계년도"
selectClass={""}
selectArray={yearOptions}
value={searchYear}
onSelectValue={(val: string | number) =>
setSearchYear(String(val))
}
/>
<div className="flex flex-row space-x-2 items-center">
<Button className="" size={"sm"} onClick={(e) => {}}>
조회
</Button>
<Button className="" size={"sm"} onClick={(e) => {}}>
다운로드
</Button>
<Button className="" size={"sm"} onClick={(e) => {}}>
전체통계다운로드
</Button>
</div>
</SearchFormLeft>
{/* <SearchFormRight>
</SearchFormRight> */}
</SearchDiv>
</div>
</div>
<div className="grid grid-cols-6 gap-4">
<div className="col-span-6 h-full min-h-0">
<ListDiv className="min-h-0">
{/* <ScrollArea className="h-[60vh]"> */}
<UiTable
tableData={[]}
headlist={matStat.matStatHeadList}
pageSize={20}
total={10000}
headName={"건축물 목록"}
cellClick={(val, headId) => {}}
onPageChange={setPageNation}
></UiTable>
{/* </ScrollArea> */}
</ListDiv>
</div>
</div>
</ContentsDiv>
</>
)
}
+81
View File
@@ -0,0 +1,81 @@
"use client";
import { useWrStore } from "@/app/store";
import { yearOptions } from "@/components/lib/func/commom";
import {
ContentsDiv,
SearchDiv,
SearchFormLeft,
SelectBox,
Title,
UiTable,
} from "@common/business_components/ui";
import ListDiv from "@common/business_components/ui/list_div";
import { Button } from "@common/components/ui";
import { useState } from "react";
export default function rainStat() {
const { code, rainStat } = useWrStore((state) => {
return state;
});
const [pageNation, setPageNation] = useState(1);
const [searchYear, setSearchYear] = useState<string>(
String(new Date().getFullYear())
);
return (
<>
<ContentsDiv>
<div className="grid grid-cols-4 gap-4">
<div className="col-span-4">
<Title title={"재이용 통계"} />
<SearchDiv>
<SearchFormLeft>
<SelectBox
className="w-full h-full text-2xl"
label="통계년도"
selectClass={""}
selectArray={yearOptions}
value={searchYear}
onSelectValue={(val: string | number) =>
setSearchYear(String(val))
}
/>
<div className="flex flex-row space-x-2 items-center">
<Button className="" size={"sm"} onClick={(e) => {}}>
조회
</Button>
<Button className="" size={"sm"} onClick={(e) => {}}>
다운로드
</Button>
<Button className="" size={"sm"} onClick={(e) => {}}>
전체통계다운로드
</Button>
</div>
</SearchFormLeft>
{/* <SearchFormRight>
</SearchFormRight> */}
</SearchDiv>
</div>
</div>
<div className="grid grid-cols-6 gap-4">
<div className="col-span-6 h-full min-h-0">
<ListDiv className="min-h-0">
{/* <ScrollArea className="h-[60vh]"> */}
<UiTable
tableData={[]}
headlist={rainStat.rainStatHeadList}
pageSize={20}
total={10000}
headName={"건축물 목록"}
cellClick={(val, headId) => {}}
onPageChange={setPageNation}
></UiTable>
{/* </ScrollArea> */}
</ListDiv>
</div>
</div>
</ContentsDiv>
</>
);
}
+75
View File
@@ -0,0 +1,75 @@
'use client'
import { useWrStore } from "@/app/store";
import { yearOptions } from "@/components/lib/func/commom";
import { ContentsDiv, SearchDiv, SearchFormLeft, SelectBox, Title, UiTable } from "@common/business_components/ui";
import ListDiv from "@common/business_components/ui/list_div";
import { Button } from "@common/components/ui";
import { useState } from "react";
export default function RswtStat() {
const { code, rswtStat } = useWrStore((state) => {
return state;
});
const [pageNation, setPageNation] = useState(1);
const [searchYear, setSearchYear] = useState<string>(
String(new Date().getFullYear())
);
return(
<>
<ContentsDiv>
<div className="grid grid-cols-4 gap-4">
<div className="col-span-4">
<Title title={"재이용 통계"} />
<SearchDiv>
<SearchFormLeft>
<SelectBox
className="w-full h-full text-2xl"
label="통계년도"
selectClass={""}
selectArray={yearOptions}
value={searchYear}
onSelectValue={(val: string | number) =>
setSearchYear(String(val))
}
/>
<div className="flex flex-row space-x-2 items-center">
<Button className="" size={"sm"} onClick={(e) => {}}>
조회
</Button>
<Button className="" size={"sm"} onClick={(e) => {}}>
다운로드
</Button>
<Button className="" size={"sm"} onClick={(e) => {}}>
전체통계다운로드
</Button>
</div>
</SearchFormLeft>
{/* <SearchFormRight>
</SearchFormRight> */}
</SearchDiv>
</div>
</div>
<div className="grid grid-cols-6 gap-4">
<div className="col-span-6 h-full min-h-0">
<ListDiv className="min-h-0">
{/* <ScrollArea className="h-[60vh]"> */}
<UiTable
tableData={[]}
headlist={rswtStat.rswtStatHeadList}
pageSize={20}
total={10000}
headName={"건축물 목록"}
cellClick={(val, headId) => {}}
onPageChange={setPageNation}
></UiTable>
{/* </ScrollArea> */}
</ListDiv>
</div>
</div>
</ContentsDiv>
</>
)
}
+332 -25
View File
@@ -1,48 +1,355 @@
import { z } from "zod";
export const sttnHeadListType = z.array(
z.object({
id: z.string(),
title: z.string(),
visible: z.boolean(),
})
);
import type { SelectDataType } from "@common/business_components/ui";
import type { TableUpperProps } from "../../common/type/header";
//★☆★☆ 여기서부터 수정하기 ★☆★☆
export const coRvwHeadListExport: z.infer<typeof sttnHeadListType> = [
export const ruseCaseHeadListExport: TableUpperProps[] = [
{
id: "ctpv",
title: "시도",
id: "a",
title: "사업명",
visible: true,
row: 0,
rowSpan: 2,
},
{
id: "sgg",
title: "시군구",
id: "b",
title: "사업기간",
visible: true,
row: 0,
rowSpan: 2,
},
{
id: "coNm",
title: "회사명",
id: "c",
title: "공급처",
visible: true,
row: 0,
colSpan: 3,
},
{
id: "addr",
title: "공장주소",
id: "d",
title: "시설종류",
visible: true,
row: 1,
},
{
id: "telNo",
title: "전화번호",
id: "e",
title: "공급처명",
visible: true,
row: 1,
},
{
id: "regDt", //바꾸기
title: "신청일자",
id: "f",
title: "시설용량(m³/일)",
visible: true,
row: 1,
},
{
id: "state", //바꾸기
title: "진행상태",
id: "g",
title: "수요처",
visible: true,
row: 0,
colSpan: 2,
},
];
{
id: "h",
title: "수요처명",
visible: true,
row: 1,
},
{
id: "i",
title: "주소",
visible: true,
row: 1,
},
{
id: "q",
title: "재이용시설",
visible: true,
row: 0,
colSpan: 5,
},
{
id: "q2",
title: "시설용량(m³/일)",
visible: true,
row: 1,
},
{
id: "q3",
title: "관로(km)",
visible: true,
row: 1,
},
{
id: "q4",
title: "용도",
visible: true,
row: 1,
},
{
id: "q5",
title: "공급량(m³/일)",
visible: true,
row: 1,
},
{
id: "q6",
title: "처리공법",
visible: true,
row: 1,
},
{
id: "k",
title: "보증수질",
visible: true,
row: 0,
colSpan: 13,
},
{
id: "k1",
title: "용도별",
visible: true,
row: 1,
},
{
id: "k2",
title: "총대장균군수​(개/100ml)",
visible: true,
row: 1,
},
{
id: "k3",
title: "결합잔류염소(mg/L)",
visible: true,
row: 1,
},
{
id: "k4",
title: "탁도(NTU)",
visible: true,
row: 1,
},
{
id: "k5",
title: "생물학적​산소요구량(BOD)(mg/L)​",
visible: true,
row: 1,
},
{
id: "k6",
title: "냄새​",
visible: true,
row: 1,
},
{
id: "k7",
title: "색도​",
visible: true,
row: 1,
},
{
id: "k8",
title: "총질소(T-N)(mg/L)​",
visible: true,
row: 1,
},
{
id: "k9",
title: "총인(T-P)(mg/L)",
visible: true,
row: 1,
},
{
id: "k10",
title: "수소이온농도(PH)​",
visible: true,
row: 1,
},
{
id: "k11",
title: "수소이온농도(PH)​",
visible: true,
row: 1,
},
{
id: "k12",
title: "전기전도도​(㎲/cm",
visible: true,
row: 1,
},
{
id: "k13",
title: "비고​",
visible: true,
row: 1,
},
{
id: "h",
title: "소요사업비(백만원)",
visible: true,
row: 0,
colSpan: 14,
},
{
id: "h1",
title: "총",
visible: true,
row: 1,
},
{
id: "h2",
title: "토목재이용시설",
visible: true,
row: 1,
},
{
id: "h3",
title: "토목관로",
visible: true,
row: 1,
},
{
id: "h4",
title: "건축",
visible: true,
row: 1,
},
{
id: "h5",
title: "기계",
visible: true,
row: 1,
},
{
id: "h6",
title: "전기・계측",
visible: true,
row: 1,
},
{
id: "h7",
title: "GIS・DB",
visible: true,
row: 1,
},
{
id: "h8",
title: "CCTV",
visible: true,
row: 1,
},
{
id: "h9",
title: "시공및준공",
visible: true,
row: 1,
},
{
id: "h10",
title: "페기물",
visible: true,
row: 1,
},
{
id: "h11",
title: "설계비",
visible: true,
row: 1,
},
{
id: "h12",
title: "감리비",
visible: true,
row: 1,
},
{
id: "h13",
title: "시설부대비",
visible: true,
row: 1,
},
{
id: "h14",
title: "기타",
visible: true,
row: 1,
},
{
id: "i",
title: "자원조달계획(백만원)",
visible: true,
row: 0,
colSpan: 4,
},
{
id: "i1",
title: "총",
visible: true,
row: 1,
},
{
id: "i2",
title: "국비",
visible: true,
row: 1,
},
{
id: "i3",
title: "지방비",
visible: true,
row: 1,
},
{
id: "i4",
title: "원인자부담",
visible: true,
row: 1,
},
{
id: "j",
title: "사업비정산(백만원)",
visible: true,
row: 0,
colSpan: 5,
},
{
id: "j1",
title: "총",
visible: true,
row: 1,
},
{
id: "j2",
title: "국비",
visible: true,
row: 1,
},
{
id: "j3",
title: "지방비",
visible: true,
row: 1,
},
{
id: "j4",
title: "원인자부담",
visible: true,
row: 1,
},
{
id: "j5",
title: "국고비율",
visible: true,
row: 1,
},
];
export const ruseUtzType: SelectDataType[] = [
{ text: "조경용수", val: "조경용수" },
{ text: "청소화장실용수", val: "청소화장실용수" },
{ text: "세척살수용수", val: "세척살수용수" },
{ text: "농업용수", val: "농업용수" },
{ text: "공업용수", val: "공업용수" },
{ text: "친수용수", val: "친수용수" },
{ text: "기타", val: "기타" },
];
@@ -0,0 +1,24 @@
import type { TableUpperProps } from "../../common/type/header";
import { ruseCaseHeadListExport } from "./headList";
export type ruseCaseState = {
ruseCase: {
ruseHeadList:TableUpperProps[];
};
};
type ruseCaseActions = {
};
export type ruseCaseType = ruseCaseState & ruseCaseActions;
export const ruseCaseStateExport: ruseCaseState = {
ruseCase: {
ruseHeadList:ruseCaseHeadListExport,
},
};
export const ruseCaseActionsExport: (set: any) => ruseCaseActions = (
set: any
) => {
return {
};
};
@@ -158,7 +158,6 @@ const dmdColist = z.object({
export const fcBizSchema = z.object({
pbnstRuseFcltBizPk: z.number().nullish(),
pbnstRuseFcltFk: z.string().nullish(),
@@ -1,5 +1,8 @@
import type { sttnHeadListType } from "../rainSttn/headList";
import type { CommonTableProps } from "@/app/store/common/type/header";
import type {
CommonTableProps,
TableUpperProps,
} from "@/app/store/common/type/header";
import { z } from "zod";
export const pbnSttHeadListExport: z.infer<typeof sttnHeadListType> = [
@@ -27,7 +30,7 @@ export const pbnSttHeadListExport: z.infer<typeof sttnHeadListType> = [
},
{ id: "bscFctNm", title: "시설명", visible: true },
{ id: "efflWqltStndrdNm", title: "지역구분", visible: true },
{ id: "fctCpc", title: "시설용량(톤/일)", visible: true },
{ id: "tel", title: "전화번호", visible: true },
{ id: "ruseUtztnFcltNm", title: "재이용시설명", visible: true },
@@ -203,7 +206,7 @@ export const pbnstSttNodeListExport: CommonTableProps[] = [
rowSpan: 1,
colSpan: 1,
},
{
{
id: "cityText",
title: "시도",
upName: "adminDiv",
@@ -310,5 +313,240 @@ export const pbnstSttNodeListExport: CommonTableProps[] = [
row: 2,
rowSpan: 1,
colSpan: 1,
}
];
},
];
export const ruseFcltNodeListExport: TableUpperProps[] = [
{ id: "cycl", title: "차수", visible: true, row: 1, rowSpan: 3, colSpan: 1 },
{ id: "seCd", title: "구분", visible: true, row: 1, rowSpan: 3, colSpan: 1 },
{
id: "busiTotal",
title: "사업개요",
visible: true,
row: 1,
rowSpan: 1,
colSpan: 10,
},
{
id: "ruseFclt",
title: "재처리시설",
visible: true,
row: 1,
rowSpan: 1,
colSpan: 5,
},
{
id: "mainSply",
title: "메인공급펌프용량",
visible: true,
row: 1,
rowSpan: 3,
colSpan: 1,
},
{
id: "buziFee",
title: "사업비(백만원)",
visible: true,
row: 2,
rowSpan: 1,
colSpan: 6,
},
{
id: "instlAprvSncnDt",
title: "설치승인・인가일",
visible: true,
row: 2,
rowSpan: 2,
colSpan: 1,
},
{
id: "bizCmcnDay",
title: "사업준공일",
visible: true,
row: 2,
rowSpan: 2,
colSpan: 1,
},
{
id: "rprcsFcltCpct",
title: "시설용량(m³/일)",
visible: true,
row: 2,
rowSpan: 2,
colSpan: 1,
},
{
id: "rprcsMthdCd",
title: "재처리방식",
visible: true,
row: 2,
rowSpan: 2,
colSpan: 1,
},
{
id: "majorPrcsMsrcCd",
title: "주처리공법",
visible: true,
row: 2,
rowSpan: 2,
colSpan: 1,
},
{
id: "inoutYn",
title: "위치처리장(내・외)",
visible: true,
row: 2,
rowSpan: 2,
colSpan: 1,
},
{
id: "addr",
title: "위치(주소)",
visible: true,
row: 2,
rowSpan: 2,
colSpan: 1,
},
{ id: "gvsbs", title: "국고", visible: true, row: 3, rowSpan: 1, colSpan: 1 },
{
id: "lcep",
title: "지방비",
visible: true,
row: 3,
rowSpan: 1,
colSpan: 1,
},
{
id: "cusrAlotm",
title: "민간투자비",
visible: true,
row: 3,
rowSpan: 1,
colSpan: 1,
},
{
id: "cusrAlotm2",
title: "원인자부담금",
visible: true,
row: 3,
rowSpan: 1,
colSpan: 1,
},
{ id: "etc", title: "기타", visible: true, row: 3, rowSpan: 1, colSpan: 1 },
{
id: "totalMoney",
title: "합계",
visible: true,
row: 3,
rowSpan: 1,
colSpan: 1,
},
];
export const ruseSplyHeadListExport: TableUpperProps[] = [
{ id: "cycl", title: "차수", visible: true },
{ id: "orgwtWtritQnt", title: "원수취수량", visible: true },
{ id: "tmsYn", title: "하수처리량TMS 전후", visible: true },
{ id: "dschgFmYn", title: "하수처리장 방류 유량계 전·후​", visible: true },
{ id: "dtlPstnExpln", title: "상세위치 설명", visible: true },
];
export const rusePplHeadListExport: TableUpperProps[] = [
{ id: "cycl", title: "차수", visible: true },
{ id: "ppMqlt", title: "관재질", type: "select", visible: true },
{ id: "pdmt", title: "관경", type: "select", visible: true },
{ id: "cpct", title: "연장", edit: true, visible: true },
];
export const ruseGuranteeHeadListExport: TableUpperProps[] = [
{ id: "cycl", title: "차수", visible: true },
{ id: "bod", title: "BOD(mg/L)", visible: true },
{ id: "grssClfg", title: "총대장균군수(개/mg)", visible: true },
{ id: "combResdch", title: "결합잔류염소(mh/L)", visible: true },
{ id: "trbt", title: "탁도(NTU)", visible: true },
{ id: "smll", title: "냄새", visible: true },
{ id: "crmty", title: "색도", visible: true },
{ id: "tn", title: "총질소(mg/L)", visible: true },
{ id: "tph", title: "총인(mg/L)", visible: true },
{ id: "ph", title: "수소이온농도", visible: true },
{ id: "clIonQnt", title: "염화물(mg/L)", visible: true },
{ id: "cdtnv", title: "전기전도도(μs/cm)​", visible: true },
];
export const ruseDmdHeadListExport: TableUpperProps[] = [
{ id: "cycl", title: "차수", visible: true },
{ id: "dmdCoNm", title: "수요처명", visible: true },
{ id: "daddr", title: "위치(주소)", visible: true },
{ id: "useUsgCd", title: "사용용도", visible: true },
{ id: "splyBgngDay", title: "공급시작일", visible: true },
{ id: "splyEndDay", title: "공급종료일", visible: true },
{ id: "splyCpct", title: "공급량(m³/일)", visible: true },
{ id: "splyFmYon", title: "공급유량계 유무", visible: true },
];
export const ruseFcltHeadListExport: CommonTableProps[] = [
{ id: "cycl", title: "차수", visible: true},
{ id: "seCd", title: "구분", visible: true},
{ id: "gvsbs", title: "국고", visible: true },
{
id: "lcep",
title: "지방비",
visible: true,
},
{
id: "cusrAlotm",
title: "민간투자비",
visible: true,
},
{
id: "cusrAlotm2",
title: "원인자부담금",
visible: true,
},
{ id: "etc", title: "기타", visible: true },
{
id: "totalMoney",
title: "합계",
visible: true,
},
{
id: "instlAprvSncnDt",
title: "설치승인・인가일",
visible: true,
},
{
id: "bizCmcnDay",
title: "사업준공일",
visible: true,
},
{
id: "rprcsFcltCpct",
title: "시설용량(m³/일)",
visible: true,
},
{
id: "rprcsMthdCd",
title: "재처리방식",
visible: true,
},
{
id: "majorPrcsMsrcCd",
title: "주처리공법",
visible: true,
},
{
id: "inoutYn",
title: "위치처리장(내・외)",
visible: true,
},
{
id: "addr",
title: "위치(주소)",
visible: true,
},
{
id: "mainSply",
title: "메인공급펌프용량",
visible: true,
},
];
@@ -1,6 +1,6 @@
import type { CommonTableProps } from "@/app/store/common/type/header";
import type { CommonTableProps, TableUpperProps } from "@/app/store/common/type/header";
import type { z } from "zod";
import { pbnSttHeadListExport, pbnstSttNodeListExport } from "./headList";
import { pbnSttHeadListExport, pbnstSttNodeListExport, ruseDmdHeadListExport, ruseFcltHeadListExport, ruseFcltNodeListExport, ruseGuranteeHeadListExport, rusePplHeadListExport, ruseSplyHeadListExport } from "./headList";
import { fetchType, getFetch, postFectch } from "@/components/lib/api";
import { controlHeadView } from "../rainSttn";
import type { sttnHeadListType } from "../rainSttn/headList";
@@ -20,6 +20,12 @@ export type pbnstSttnState = {
pbnstSttHeadList: CommonTableProps[];
pbnstSttNodeList: CommonTableProps[];
pbnstDetail: customPbnst;
ruseFcltNodeList:TableUpperProps[]
ruseSplyHeadList:TableUpperProps[]
rusePplHeadList:TableUpperProps[]
ruseGuranteeHeadList:TableUpperProps[]
ruseDmdHeadList:TableUpperProps[]
ruseFcltHeadList:TableUpperProps[]
excelList: [];
isInit: boolean;
};
@@ -40,7 +46,7 @@ type pbnstSttnActions = {
reurnValue: ReturnType,
year: string
) => void;
getPbnStnDetail: (bscFctCd: string) => void;
getPbnStnDetail: (pbnstRuseFcltPk: string) => void;
pbnNmSearch: (
page: string,
total: string,
@@ -56,6 +62,12 @@ export const pbnstSttnStateExport: pbnstSttnState = {
pbnstSttn: {
pbnstSttHeadList: pbnstSttHeadList,
pbnstSttNodeList: pbnstSttNodeList,
ruseFcltNodeList:ruseFcltNodeListExport,
ruseSplyHeadList:ruseSplyHeadListExport,
rusePplHeadList:rusePplHeadListExport,
ruseGuranteeHeadList:ruseGuranteeHeadListExport,
ruseDmdHeadList:ruseDmdHeadListExport,
ruseFcltHeadList:ruseFcltHeadListExport,
pbnstSttnRes: [],
pbnstDetail: {} as customPbnst,
pbnstSearchData: [],
@@ -158,6 +170,7 @@ const hasuListFetch = async (
endDt: item.operList[0]?.endDt.toLocaleDateString?? "",
searchNm: findData.bscFctNm,
searchPk: findData.bscFctCd,
prfList:item?.prfList??[]
};
}
);
@@ -254,10 +267,13 @@ export const pbnstSttnActionsExport: (set: any) => pbnstSttnActions = (
console.log("error", erTxt);
}
},
getPbnStnDetail: async (bscFctCd: string) => {
getPbnStnDetail: async (pbnstRuseFcltPk: string) => {
try {
const pbnstDetail = await getFetch("wr", `/reuseFc/pubFc/${bscFctCd}`);
console.log("pbnstDetail ", pbnstDetail);
let pbnstDetail = await getFetch("wr", `/reuseFc/pubFc/${pbnstRuseFcltPk}`);
if(pbnstDetail.length>=0){
pbnstDetail= pbnstDetail.find((item: customPbnst) =>item.pbnstRuseFcltPk === pbnstRuseFcltPk)
}
console.log( 'pbnstDetail ', pbnstDetail)
set((state: pbnstSttnState) => {
return {
...state,
@@ -1,3 +1,5 @@
import type { PrfType } from "@/app/store/prfmncReg/pbnstPrfmncReg/type";
export type WaterReuseFacility = {
bscFctNm: string; // 기본시설명 (예: "난지")
efflWqltStndrdNm: string; // 방류수 수질 기준명 (예: "500톤 이상(Ⅲ지역)")
@@ -21,4 +23,5 @@ export type WaterReuseFacility = {
rprtvBzenty: string;
bgngDt: string;
endDt: string;
prfList:PrfType[];
};
@@ -0,0 +1,68 @@
import type { TableUpperProps } from "../../common/type/header";
export const matStatHeadListExport :TableUpperProps[]=[
{
id: "시도",
title: "시도",
row:0,
rowSpan:2
},
{
id: "개소",
title: "개소",
row:0,
rowSpan:2
},
{
id: "요구수량",
title: "요구수량",
row:0,
rowSpan:2
},
{
id: "용도",
title: "용도",
row:0,
colSpan:6
},
{
id: "조경용수",
title: "조경용수",
row:1,
},
{
id: "청소화장실용수",
title: "청소화장실용수",
row:1,
},
{
id: "농업용수",
title: "농업용수",
row:1,
},
{
id: "공업용수",
title: "공업용수",
row:1,
},
{
id: "친수용수",
title: "친수용수",
row:1,
},
{
id: "기타",
title: "기타",
row:1,
},
{
id: "사업비",
title: "사업비(천원)",
row:0,
rowSpan:2
},
]
+28
View File
@@ -0,0 +1,28 @@
import type { TableUpperProps } from "../../common/type/header";
import { matStatHeadListExport } from "./headList";
type matStatActions = {
}
export type matStatState = {
matStat: {
matStatHeadList:TableUpperProps[]
}
}
export type matStatType = matStatState & matStatActions;
export const matStatExport: matStatState = {
matStat: {
matStatHeadList:matStatHeadListExport
}
}
export const matStatActionsExport: (set: any) => matStatActions = (
set: any
) => {
return {
}
}
@@ -0,0 +1,70 @@
import type { TableUpperProps } from "../../common/type/header";
export const rainStatHeadListExport: TableUpperProps[] = [
{
id: "시도",
title: "시도",
row:0,
rowSpan:2
},
{
id: "개소",
title: "개소",
row:0,
rowSpan:2
},
{
id: "설치비",
title: "설치비(백만원)",
row:0,
rowSpan:2
},
{
id: "저류조용량",
title: "저류조용량(m³/년)",
row:0,
rowSpan:2
},
{
id: "이용용도",
title: "이용용도",
row:0,
colSpan:6
},
{
id: "조경용수",
title: "조경용수",
row:1,
},
{
id: "청소화장실용수",
title: "청소화장실용수",
row:1,
},
{
id: "농업용수",
title: "농업용수",
row:1,
},
{
id: "공업용수",
title: "공업용수",
row:1,
},
{
id: "친수용수",
title: "친수용수",
row:1,
},
{
id: "기타",
title: "기타",
row:1,
},
{
id: "연간운영비",
title: "연간운영비(백만원/년)",
row:0,
rowSpan:2
},
];
@@ -0,0 +1,28 @@
import type { TableUpperProps } from "../../common/type/header";
import { rainStatHeadListExport } from "./headList";
type rainStatActions = {
}
export type rainStatState = {
rainStat: {
rainStatHeadList:TableUpperProps[]
}
}
export type rainStatType = rainStatState & rainStatActions;
export const rainStatExport: rainStatState = {
rainStat: {
rainStatHeadList:rainStatHeadListExport
}
}
export const rainStatActionsExport: (set: any) => rainStatActions = (
set: any
) => {
return {
}
}
@@ -0,0 +1,101 @@
import type { TableUpperProps } from "../../common/type/header";
export const rswtStatHeadListExport :TableUpperProps[]=[
{
id: "시도",
title: "시도",
row:0,
rowSpan:2
},
{
id: "개소",
title: "개소",
row:0,
rowSpan:2
},
{
id: "시설현황",
title: "시설현황",
row:0,
colSpan:2
},
{
id: "건축연면적(m³)",
title: "건축연면적(m³)",
row:1,
},
{
id: "처리용량",
title: "처리용량(m³)",
row:1,
},
{
id: "물사용량",
title: "물사용량(m³/년)",
row:0,
rowSpan:2
},
{
id: "청소화장실용수",
title: "중수도+대체수이용량(m³/년)",
row:0,
rowSpan:2
},
{
id: "중수도이용량",
title: "중수도이용량(m³/년)",
row:0,
rowSpan:2
},
{
id: "대체수이용량",
title: "대체수이용량(m³/년)",
row:0,
rowSpan:2
},
{
id: "용도",
title: "용도",
row:0,
colSpan:6
},
{
id: "조경용수",
title: "조경용수",
row:1,
},
{
id: "청소화장실용수",
title: "청소화장실용수",
row:1,
},
{
id: "농업용수",
title: "농업용수",
row:1,
},
{
id: "공업용수",
title: "공업용수",
row:1,
},
{
id: "친수용수",
title: "친수용수",
row:1,
},
{
id: "기타",
title: "기타",
row:1,
},
{
id: "연간운영비",
title: "연간운영비(백만원/년)",
row:0,
rowSpan:2
},
]
@@ -0,0 +1,28 @@
import type { TableUpperProps } from "../../common/type/header";
import { rswtStatHeadListExport } from "./headList";
type rswtStatActions = {
}
export type rswtStatState = {
rswtStat: {
rswtStatHeadList:TableUpperProps[]
}
}
export type rswtStatType = rswtStatState & rswtStatActions;
export const rswtStatExport: rswtStatState = {
rswtStat: {
rswtStatHeadList:rswtStatHeadListExport
}
}
export const rswtStatActionsExport: (set: any) => rswtStatActions = (
set: any
) => {
return {
}
}
+24 -4
View File
@@ -93,6 +93,10 @@ import { coRvwActionsExport, coRvwStateExport, type coRvwState, type coRvwType }
import { ruseHstryActionsExport, ruseHstryStateExport, type ruseHstryState, type ruseHstryType } from "./matDmd/ruseRvwHstry";
import { pbnstPrfmncSttnActionsExport, pbnstPrfmncSttnExport, type pbnstPrfmncSttnState, type pbnstPrfmncSttnType } from "./prfmncSttn/pbnstPrfmncSttn";
import { drgtActionsExport, drgtStateExport, type drgtState, type drgtType } from "./matDmd/drgtSttn";
import { ruseCaseActionsExport, ruseCaseStateExport, type ruseCaseType, type ruseCaseState } from "./matDmd/ruseCaseMng";
import { rainStatActionsExport, rainStatExport, type rainStatState, type rainStatType } from "./stats/rainStat";
import { type rswtStatType, type rswtStatState, rswtStatExport, rswtStatActionsExport } from "./stats/rswtStat";
import { matStatActionsExport, matStatExport, type matStatState, type matStatType } from "./stats/matStat";
export type WrStore = comCodeType &
pubFacType &
@@ -116,7 +120,11 @@ export type WrStore = comCodeType &
coRvwType&
ruseHstryType&
pbnstPrfmncSttnType&
drgtType
drgtType&
ruseCaseType&
rainStatType&
rswtStatType&
matStatType
;
export const StoreZus = (
@@ -141,7 +149,11 @@ export const StoreZus = (
coRvwState&
ruseHstryState&
pbnstPrfmncSttnState&
drgtState
drgtState&
ruseCaseState&
rainStatState&
rswtStatState&
matStatState
= {
...comCodeStateExport,
...pubFacStateExport,
@@ -164,7 +176,11 @@ export const StoreZus = (
...coRvwStateExport,
...ruseHstryStateExport,
...pbnstPrfmncSttnExport,
...drgtStateExport
...drgtStateExport,
...ruseCaseStateExport,
...rainStatExport,
...rswtStatExport,
...matStatExport
}
) => {
return createStore<WrStore>()((set) => {
@@ -198,7 +214,11 @@ export const StoreZus = (
...coRvwActionsExport(set),
...ruseHstryActionsExport(set),
...pbnstPrfmncSttnActionsExport(set),
...drgtActionsExport(set)
...drgtActionsExport(set),
...ruseCaseActionsExport(set),
...rainStatActionsExport(set),
...rswtStatActionsExport(set),
...matStatActionsExport(set)
};
});
};
@@ -46,7 +46,7 @@ export function PbnstMngForm({
fileDownLoad,
getBizCycle,
getpbnstInsertIndex,
appendRuseFclt
appendRuseFclt,
} = useWrStore((state) => state);
const [regFileList, setRegFileList] = useState<fcFileType[] | null>(null);
@@ -69,7 +69,17 @@ export function PbnstMngForm({
pbnst.pbnsUpdateIndex.mng >= 0 &&
pbnst.pbnstRes
? pbnst.pbnstRes[pbnst.pbnsUpdateIndex.mng]
: pbnstRegZod.parse({}),
: formType === "sttn" && firstFcltData
? {
ruseUtztnFcltNm: firstFcltData?.ruseUtztnFcltNm,
fcltCpct: firstFcltData?.fcltCpct,
hasuhasu: firstFcltData?.hasuhasu,
ruseCpct: firstFcltData?.ruseCpct,
splyExtraCpct: firstFcltData?.splyExtraCpct,
fcOpers: firstFcltData?.fcOpers,
fcFiles: firstFcltData?.fcFiles,
}
: pbnstRegZod.parse({}),
});
const {
fields: fcOpersField,
@@ -89,17 +99,16 @@ export function PbnstMngForm({
getBizCycle(pbnst.pbnstRes[val]);
form.reset(pbnst.pbnstRes[val]);
form.setValue('hasuhasu' , Number(pbnst.efflAmnt)??0)
form.setValue("hasuhasu", Number(pbnst.efflAmnt) ?? 0);
getpbnstInsertIndex({ ...pbnst.pbnsUpdateIndex, mng: val });
}
};
const plusHist = () => {
const currentTableDataFromRef = ref.current ? [...ref.current] : [];
const regData = {
choose: false,
pbnstRuseFcltFk:form.getValues('pbnstRuseFcltPk')??"",
pbnstRuseFcltFk: form.getValues("pbnstRuseFcltPk") ?? "",
rgtr: "",
mdfr: "",
operMthd: "",
@@ -195,15 +204,13 @@ export function PbnstMngForm({
// 등록할때 신규 값을 계속 가지고 있으려고
useEffect(() => {
if (
formType === "reg" &&
firstFcltData &&
(form.getValues("swtrmtFcltFk") === "" ||
form.getValues("swtrmtFcltFk") === undefined)
) {
form.setValue("swtrmtFcltFk", firstFcltData.swtrmtFcltFk);
form.setValue(
"pbnstRuseFcltPk",
String(firstFcltData.pbnstRuseFcltPk)
);
form.setValue("pbnstRuseFcltPk", String(firstFcltData.pbnstRuseFcltPk));
form.setValue("fcBizs", firstFcltData.fcBizs);
}
}, [firstFcltData]);
@@ -251,41 +258,38 @@ export function PbnstMngForm({
}
}
}, [pbnst.pbnsUpdateIndex, pbnst.pbnstRes, formType, getBizCycle]);
//신규 등록시 입력할때 데이터 넣기
useEffect(() => {
const formData = form.watch();
formData.fcOpers = ref.current ? [...ref.current] : [];
formData.fcFiles = regFileList ? [...regFileList] : [];
if (formType === "reg") {
console.log('formData ', formData)
console.log("formData ", formData);
pbnstMngData([formData] as customPbnst[]);
} else if (formType === "update"){
const updateRes = pbnst.pbnstRes?.map((item)=>{
if(item.pbnstRuseFcltPk === item.pbnstRuseFcltPk){
item=formData as customPbnst
} else if (formType === "update") {
const updateRes = pbnst.pbnstRes?.map((item) => {
if (item.pbnstRuseFcltPk === item.pbnstRuseFcltPk) {
item = formData as customPbnst;
}
return item
})
return item;
});
pbnstMngData(updateRes as customPbnst[]);
}
}, [form.formState, regFileList, formType, pbnst.pbnstRes]);
useEffect(() => {
// pbnstMngData(pbnst.pbnstMngRegData);
// pbnstMngData(pbnst.pbnstMngRegData);
}, [pbnst.pbnstMngRegData]);
useEffect(() => {
if ( pbnst.pbnstRes && pbnst.pbnstRes?.length<= 0) return;
if (pbnst.pbnstRes && pbnst.pbnstRes?.length <= 0) return;
const fcltNmList = pbnst.pbnstRes?.map((item, index) => ({
text: item.ruseUtztnFcltNm,
val: String(index),
}));
if(fcltNmList)
setFcltNm(fcltNmList);
if (fcltNmList) setFcltNm(fcltNmList);
}, [pbnst.pbnstRes]);
// 2. Define a submit handler.
@@ -295,9 +299,6 @@ export function PbnstMngForm({
pbnstInsert(values);
}
useEffect(() => {
if (relationfiles) {
setRegFileList(regFileFilter(relationfiles, "계통도", regFileList || []));
@@ -324,7 +325,18 @@ export function PbnstMngForm({
재이용 시설명
</Label>
{formType === "reg" ? (
{formType === "update" ? (
<SelectBox
label=""
className="mt-4 ml-2"
selectClass={undefined}
selectArray={fcltNm ?? []}
onSelectValue={(val) => {
selectFclt(Number(val));
}}
value={""}
/>
) : (
<FormField
control={form.control}
name="ruseUtztnFcltNm"
@@ -342,17 +354,6 @@ export function PbnstMngForm({
</FormUi>
)}
/>
) : (
<SelectBox
label=""
className="mt-4 ml-2"
selectClass={undefined}
selectArray={fcltNm ?? []}
onSelectValue={(val) => {
selectFclt(Number(val));
}}
value={""}
/>
)}
</div>
@@ -1,91 +0,0 @@
import { useWrStore } from "@/app/store";
import { selectClass } from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { DatePicker, FormField, FormItem, FormLabel, FormUi, SelectBox } from "@common/business_components";
import { Button, Input } from "@common/components";
import { useState } from "react";
export function CoRegForm(form:any){
const { dmd } = useWrStore((state) => state);
return(
<>
<FormField
control={form.control}
name="ctpv"
render={({ field }) => (
<FormUi label="시도">
<SelectBox selectClass={selectClass} label={""} selectArray={dmd.selectSido} onSelectValue={field.onChange} className={""} />
</FormUi>
)}
/>
<FormField
control={form.control}
name="sgg"
render={({ field }) => (
<FormUi label="시군구">
<SelectBox selectClass={selectClass} label={""} selectArray={dmd.selectSgg} onSelectValue={field.onChange} className={""} />
</FormUi>
)}
/>
<FormField
control={form.control}
name="coNm"
render={({ field }) => (
<FormUi label="회사명">
<Input placeholder="" type="text" {...field} />
</FormUi>
)}
/>
<FormField
control={form.control}
name="bznmNo"
render={({ field }) => (
<FormUi label="사업자번호">
<Input
placeholder="a0123456789"
type="text"
{...field} />
</FormUi>
)}
/>
<FormField
control={form.control}
name="addr"
render={({ field }) => (
<FormUi label="주소">
<Input
placeholder="성북로24길 16"
type="text"
{...field} />
</FormUi>
)}
/>
<FormField
control={form.control}
name="telNo"
render={({ field }) => (
<FormUi label="전화번호">
<Input
placeholder="01033332222"
type="text"
{...field} />
</FormUi>
)}
/>
</>
)
}
@@ -1,316 +0,0 @@
import { useWrStore } from "@/app/store";
import { selectClass } from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { DatePicker, FormField, FormItem, FormLabel, FormUi, SelectBox } from "@common/business_components";
import { Button, Input } from "@common/components";
import { useState } from "react";
export function DmdRegForm(form: any) {
const { dmd } = useWrStore((state) => state);
const [dmdDate, setDmdDate] = useState(new Date())
const onChangeDate = (val: Date|undefined) => {
if(val)setDmdDate(val)
}
return (
<>
<FormField
control={form.control}
name="dmdSel"
render={({ field }) => (
<FormUi label="수요처명">
<Input
placeholder="수요처명 검색"
type="text"
{...field} />
</FormUi>
)}
/>
<FormField
control={form.control}
name="dmdTmng"
render={({ field }) => (
<FormItem className="flex flex-col">
<FormLabel>요구시기</FormLabel>
<DatePicker mode={"single"} field={{ value: dmdDate, onChange: onChangeDate }} selectClass={undefined} />
</FormItem>
)}
/>
<FormField
control={form.control}
name="dmdWq"
render={({ field }) => (
<FormUi label="요구수질">
<Input
placeholder="55.22"
type="text"
{...field} />
</FormUi>
)}
/>
<FormField
control={form.control}
name="useUsgCd"
render={({ field }) => (
<FormUi label="사용용도">
<SelectBox selectClass={selectClass} label={""} selectArray={dmd.selectUsg} onSelectValue={field.onChange} className={""} />
</FormUi>
)}
/>
<FormField
control={form.control}
name="wntUntprc"
render={({ field }) => (
<FormUi label="희망단가">
<Input
placeholder="1000000000000000"
type="text"
{...field} />
</FormUi>
)}
/>
<div className="grid grid-cols-4">
<h1 className=" col-span-2 pl-5 text-2xl underline">
요구수질
</h1>
</div>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-6">
<FormField
control={form.control}
name="grssClfg"
render={({ field }) => (
<FormUi label="총대장균군">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
<div className="col-span-6">
<FormField
control={form.control}
name="tn"
render={({ field }) => (
<FormUi label="총질소">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
</div>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-6">
<FormField
control={form.control}
name="combResdch"
render={({ field }) => (
<FormUi label="결합잔류염소">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
<div className="col-span-6">
<FormField
control={form.control}
name="tp"
render={({ field }) => (
<FormUi label="총인">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
</div>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-6">
<FormField
control={form.control}
name="trbt"
render={({ field }) => (
<FormUi label="탁도">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
<div className="col-span-6">
<FormField
control={form.control}
name="ph"
render={({ field }) => (
<FormUi label="수소이온농도">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
</div>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-6">
<FormField
control={form.control}
name="bod"
render={({ field }) => (
<FormUi label="생물학적 산소요구량">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
<div className="col-span-6">
<FormField
control={form.control}
name="clIonQnt"
render={({ field }) => (
<FormUi label="염화물">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
</div>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-6">
<FormField
control={form.control}
name="smll"
render={({ field }) => (
<FormUi label="냄새">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
<div className="col-span-6">
<FormField
control={form.control}
name="cdtnv"
render={({ field }) => (
<FormUi label="전기전도도">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
</div>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-6">
<FormField
control={form.control}
name="crmty"
render={({ field }) => (
<FormUi label="색도">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
<div className="col-span-6">
<FormField
control={form.control}
name="rmrk"
render={({ field }) => (
<FormUi label="비고">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
</div>
<div className="grid grid-cols-4">
<h1 className=" col-span-1 pl-2 text-2xl underline">
공급후보지 선택
</h1>
<div className=" col-start-3 col-span-1 ">
<Button >
후보지 조회
</Button>
</div>
<div className=" col-start-4 col-span-1 ">
<Button >
유사사례조회
</Button>
</div>
</div>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-4">
<FormField
control={form.control}
name="sply1"
render={({ field }) => (
<FormUi label="후보지_1">
<Input placeholder="후보지1" type="text" {...field} />
</FormUi>
)}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="sply2"
render={({ field }) => (
<FormUi label="후보지_2">
<Input placeholder="후보지2" type="text" {...field} />
</FormUi>
)}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="sply3"
render={({ field }) => (
<FormUi label="후보지_3">
<Input placeholder="후보지3" type="text" {...field} />
</FormUi>
)}
/>
</div>
</div>
<div className="grid grid-cols-4">
<h1 className=" col-span-2 pl-2 text-2xl underline">
수요신청 비밀번호
</h1>
<div className="col-start-3 col-span-2">
<FormField
control={form.control}
name="password"
render={({ field }) => (
<FormUi label="">
<Input placeholder="10" type="text" {...field} />
</FormUi>
)}
/>
</div>
</div>
</>
);
}
@@ -0,0 +1,286 @@
import { useWrStore } from "@/app/store";
import type { TableUpperProps } from "@/app/store/common/type/header";
import { initValInUsage, initValOutUsage, subTotalObj, totalObj, type PrfType } from "@/app/store/prfmncReg/pbnstPrfmncReg/type";
import type {
customPbnst,
fcBizType,
} from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type";
import { PbnstMngForm } from "@/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm";
import { ScrollArea, Title, UiTable } from "@common/business_components/ui";
import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan";
import {
Tabs,
TabsList,
TabsTrigger,
Button,
TabsContent,
} from "@common/components/ui";
import { useEffect, useState } from "react";
import { set } from "react-hook-form";
export function PbnstSttnModal({ data }: { data: customPbnst }) {
const { code, pbnstSttn,prfmnc } = useWrStore((state) => state);
const [fcltTab, setFcltTab] = useState<string>("fclt");
const [ruseTab, setRuseTab] = useState<string>("inoutTotal");
const [ruseBizData, setRuseBizData] = useState<{
data: any[];
head: TableUpperProps[];
}>();
const [ruseHeadList, setRuseHeadList] = useState<TableUpperProps[]>([]);
const [ruseTableData, setRuseTableData] = useState<TableUpperProps[]>([]);
const [prfData , setPrfData] = useState<{inPrf: any[],outPrf: any[], totalPrf:any[] }> ()
const {monthHeadList } = prfmnc;
useEffect(() => {
let tableData;
if (fcltTab === "fclt") {
tableData = data.fcBizs?.map((item: fcBizType) => {
return {
cycl: item.cycl + "차",
seCd: item.seCd,
gvsbs: item.gvsbs??'-',
lcep: item.lcep??'-',
cusrAlotm: item.cusrAlotm??'-',
etc: item.etc??'-',
totalMoney:
Number(item.addr) +
Number(item.gvsbs) +
Number(item.lcep) +
Number(item.cusrAlotm),
instlAprvSncnDt: item.instlAprvSncnDt?.toISOString??'-',
bizCmcnDay: item.bizCmcnDay?.toISOString??'-',
rprcsFcltCpct: item.rprcsFcltCpct??'-',
rprcsMthdCd: item.rprcsMthdCd??'-',
majorPrcsMsrcCd: item.majorPrcsMsrcCd??'-',
inoutYn: item.inoutYn??'-',
addr: item.addr??'-',
};
});
} else if (fcltTab === "sply") {
tableData = data.fcBizs.flatMap((item: fcBizType) => {
return item?.fcOrgwts?.map((fcOrgwt) => {
return {
cycl: item.cycl + "차",
orgwtWtritQnt: fcOrgwt.orgwtWtritQnt,
tmsYn: fcOrgwt.tmsYn,
dschgFmYn: fcOrgwt.dschgFmYn,
dtlPstnExpln: fcOrgwt.dtlPstnExpln,
};
})
});
} else if (fcltTab === "ppi") {
tableData = data.fcBizs?.flatMap((item: fcBizType) => {
return item?.pplInstls?.map((ppl) => {
return {
cycl: item.cycl + "차",
ppMqlt: ppl.ppMqlt,
pdmt: ppl.pdmt,
cpct: ppl.cpct,
};
})
});
} else if (fcltTab === "guarantee") {
tableData = data.fcBizs?.map((item: fcBizType) => {
return {
cycl: item.cycl + "차",
bod: item.bod,
grssClfg: item.grssClfg,
combResdch: item.combResdch,
trbt: item.trbt,
smll: item.smll,
crmty: item.crmty,
tph: item.tph,
tn: item.tn,
ph: item.ph,
cdtnv: item.cdtnv,
};
});
} else if (fcltTab === "dmdCo") {
tableData = data.fcBizs?.flatMap((item: fcBizType) => {
return item?.fcDemands?.map((dmd) => {
return {
cycl: item.cycl + "차",
dmdCoNm: dmd.dmdCoNm,
daddr: dmd.daddr,
useUsgCd: dmd.useUsgCd,
splyBgngDay: dmd.splyBgngDay?.toISOString,
splyEndDay: dmd.splyEndDay?.toISOString,
splyCpct: dmd.splyCpct,
splyFmYn: dmd.splyFmYn,
};
})
});
}
console.log(tableData);
if (tableData && tableData.length > 0) {
setRuseTableData(tableData as any[]);
}
}, [fcltTab, data]);
useEffect(() => {
if (fcltTab === "fclt") {
setRuseHeadList(pbnstSttn.ruseFcltHeadList);
} else if (fcltTab === "sply") {
setRuseHeadList(pbnstSttn.ruseSplyHeadList);
} else if (fcltTab === "ppi") {
setRuseHeadList(pbnstSttn.rusePplHeadList);
} else if (fcltTab === "guarantee") {
setRuseHeadList(pbnstSttn.ruseGuranteeHeadList);
} else if (fcltTab === "dmdCo") {
setRuseHeadList(pbnstSttn.ruseDmdHeadList);
}
}, [
fcltTab,
pbnstSttn.ruseFcltHeadList,
pbnstSttn.ruseSplyHeadList,
pbnstSttn.rusePplHeadList,
pbnstSttn.ruseGuranteeHeadList,
pbnstSttn.ruseDmdHeadList,
]);
const getTablePrfData = (prfList:PrfType[]) => {
const inUsageData = [...initValInUsage];
const outUsageData = [...initValOutUsage];
const inSubtotal = subTotalObj;
const outSubtotal = subTotalObj;
if (prfList) {
prfList?.forEach((prfItem) => {
const month = Number(prfItem?.ym?.slice(4)); // "MM"
const monthKey = `${month}월`;
inUsageData.forEach((inData: any) => {
const usageKey = inData.usage;
const value = (prfItem as any)[usageKey] ?? 0;
inData[monthKey] = value;
inData.total += value;
if (inSubtotal && usageKey !== "subtotal") {
(inSubtotal as any)[monthKey] =
((inSubtotal as any)[monthKey] ?? 0) + value;
inSubtotal.total += value;
}
});
outUsageData.forEach((outData: any) => {
const usageKey = outData.usage;
const value = (prfItem as any)[usageKey] ?? 0;
outData[monthKey] = value;
outData.total += value;
if (usageKey !== "subtotal") {
(outSubtotal as any)[monthKey] =
((outSubtotal as any)[monthKey] ?? 0) + value;
outSubtotal.total += value;
}
});
});
inUsageData.push(inSubtotal);
outUsageData.push(outSubtotal);
const usageTotalObj: { [key: string]: any } = totalObj;
for (const key in usageTotalObj) {
if (["usage", "gubun", "edit"].includes(key)) continue;
const val =
(Number((inSubtotal as any)[key]) || 0) +
(Number((outSubtotal as any)[key]) || 0);
(usageTotalObj as any)[key] = val;
}
const tableData = [...inUsageData, ...outUsageData, usageTotalObj];
setPrfData({
inPrf: inUsageData,
outPrf: outUsageData,
totalPrf: tableData,
});
}
}
useEffect(() => {
if(pbnstSttn.pbnstSttnRes&&data){
const prfList = pbnstSttn.pbnstSttnRes.find((item) => item.pbnstRuseFcltPk=== data.pbnstRuseFcltPk )?.prfList
if(prfList){
getTablePrfData(prfList)
}
}
}, [pbnstSttn.pbnstSttnRes, data]);
useEffect(() => {}, [ruseBizData?.head]);
return (
<>
<div>
<Title title={"하수재이용 시설 상세정보"} />
<ScrollArea className={"h-[70vh]"}>
<PbnstMngForm firstFcltData={data} formType={"sttn"} />
<Tabs defaultValue="mng" onValueChange={setFcltTab}>
<TabsList className="">
<TabsTrigger className="!text-xl" value="fclt">
하수처리수 재이용시설 현황
</TabsTrigger>
<TabsTrigger className="!text-xl" value="sply">
재이용 원수 취수 현황
</TabsTrigger>
<TabsTrigger className="!text-xl" value="ppi">
재이용 공급관로 현황
</TabsTrigger>
<TabsTrigger className="!text-xl" value="guarantee">
재이용 보증수질 현황
</TabsTrigger>
<TabsTrigger className="!text-xl" value="dmdCo">
재이용 수요처 현황
</TabsTrigger>
</TabsList>
<TabsContent className="max-h-full" value={fcltTab}>
<UiTable
headName={undefined}
tableData={ruseTableData || []}
headlist={ruseHeadList || []}
pageSize={0}
total={0}
cellClick={undefined}
onPageChange={function (page: number): void {
throw new Error("Function not implemented.");
}}
children={fcltTab==='fclt'?<HeadMakeColSpan upHeadList={pbnstSttn.ruseFcltNodeList} />:undefined}
></UiTable>
</TabsContent>
</Tabs>
<Tabs defaultValue="mng" onValueChange={setRuseTab}>
<TabsList className="">
<TabsTrigger className="!text-xl" value="totalPrf">
장내외합계
</TabsTrigger>
<TabsTrigger className="!text-xl" value="inPrf">
장내용수
</TabsTrigger>
<TabsTrigger className="!text-xl" value="outPrf">
장외용수
</TabsTrigger>
</TabsList>
<TabsContent className="max-h-full" value={ruseTab}>
{prfData && (
<UiTable
headName={undefined}
tableData={prfData[ruseTab as keyof typeof prfData] || []}
headlist={monthHeadList || []}
pageSize={0}
total={0}
cellClick={undefined}
onPageChange={function (page: number): void {
throw new Error("Function not implemented.");
}}
></UiTable>
)}
</TabsContent>
</Tabs>
</ScrollArea>
</div>
</>
);
}