From c2d471c5a2d57c77b5d3f64d683cf4c41af84fc6 Mon Sep 17 00:00:00 2001 From: jyha00 Date: Wed, 4 Jun 2025 09:27:59 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=88=98=EC=9A=94=EB=A7=A4=EC=B9=AD?= =?UTF-8?q?=EA=B2=80=ED=86=A0=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A7=8C?= =?UTF-8?q?=EB=93=9C=EB=8A=94=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/matDmd/coMatRvw/page.tsx | 69 +++++++++++ apps/wr/app/page.tsx | 12 ++ .../prfmncReg/pbnstPrfmncReg/page.tsx | 23 +++- .../wr/app/store/matDmd/coMatRvw/headList.tsx | 109 ++++++++++++++++++ apps/wr/app/store/matDmd/coMatRvw/index.tsx | 34 ++++++ .../store/prfmncReg/pbnstPrfmncReg/index.tsx | 4 +- apps/wr/app/store/store.tsx | 9 +- apps/wr/public/sample_pbnstPrfmncReg.xlsx | Bin 0 -> 13777 bytes 8 files changed, 251 insertions(+), 9 deletions(-) create mode 100644 apps/wr/app/matMng/matDmd/coMatRvw/page.tsx create mode 100644 apps/wr/app/store/matDmd/coMatRvw/headList.tsx create mode 100644 apps/wr/app/store/matDmd/coMatRvw/index.tsx create mode 100644 apps/wr/public/sample_pbnstPrfmncReg.xlsx diff --git a/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx b/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx new file mode 100644 index 000000000..4b2dfcef8 --- /dev/null +++ b/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx @@ -0,0 +1,69 @@ +"use client"; + +import { useWrStore } from "@/app/store"; +import { ContentsDiv, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, Title, UiTable } from "@common/business_components/ui"; +import ListDiv from "@common/business_components/ui/list_div"; +import { Button, Label } from "@common/components/ui"; + + +export default function coMatRvw() { + const { code, coRvw, } = useWrStore((state) => state); + const { coRvwHeadList, } = coRvw; + return ( + <> + +
+
+ + <SearchDiv> + <SearchFormLeft> + + <div className="col-span-2 flex flex-row space-x-2"> + <Label className="w-28 mt-2 text-xl text-gray-600">{'시설명'}</Label> + <SearchInput + className={"w-full text-2xl"} + label="" + textValue={""} + setText={(e) => { + }} + /> + </div> + </SearchFormLeft> + <SearchFormRight + className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> + <div className="space-y"> + <div className="flex flex-row space-x-2"> + <Button + size={"sm"} + onClick={(e) => { }} + > + 조회 + </Button> + </div> + </div> + </SearchFormRight> + </SearchDiv> + </div> + </div> + + <div className="grid grid-cols-6 gap-4 "> + <div className="col-span-6"> + <ListDiv> + <UiTable + headName={[]} + tableData={[]} + children={undefined} + headlist={coRvwHeadList} + pageSize={20} + total={100000} + cellClick={(index: number | undefined, headId: string) => { + }} + onPageChange={() => { }} + ></UiTable> + </ListDiv> + </div> + </div> + </ContentsDiv> + </> + ) +} \ No newline at end of file diff --git a/apps/wr/app/page.tsx b/apps/wr/app/page.tsx index a4955b36a..a6f5856c3 100644 --- a/apps/wr/app/page.tsx +++ b/apps/wr/app/page.tsx @@ -119,6 +119,18 @@ 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="matMng/matDmd/coMatRvw">수요처 매칭 검토</Link> + </Button> + </div> + </div> + </div> </div> </> ); diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx index e3f3e9fe9..2d29672b3 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx @@ -2,34 +2,45 @@ import { useWrStore } from "@/app/store"; import type { pubHasuType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; -import { yearOptions } from "@/components/lib/func/commom"; +import { excelDownload, yearOptions } from "@/components/lib/func/commom"; import { ContentsDiv, Title, SearchDiv, SearchFormLeft, SelectBox, SearchInput, SearchFormRight, ScrollArea, UiTable } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { Button, Label } from "@common/components/ui"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useCallback } from "react"; export default function prfmncPrfmncReg() { const { code, prfmnc, prfmncHasuInit, searchFclts, } = useWrStore((state) => state); - const { pbnstPrfmncHeadList, monthHeadList,prfmncRes } = prfmnc; + const { pbnstPrfmncHeadList, monthHeadList, prfmncRes } = prfmnc; const [bdstTable, setbdstTable] = useState<pubHasuType[]>(); const [searchTxt, setSearchTxt] = useState<string>(); const [searchYear, setSearchYear] = useState<string>(String(new Date().getFullYear())); + const excelClick = useCallback(() => { + console.log("dd") + excelDownload( + prfmnc.excelList, + "하수재이용실적", + "sample_pbnstPrfmncReg.xlsx", + "A1:O1" + ); + }, [prfmnc.excelList]) + useEffect(() => { if (!prfmnc.isInit) { prfmncHasuInit("1", "11"); } }, [prfmnc.isInit, prfmncHasuInit]); useEffect(() => { + setbdstTable(prfmncRes) console.log("prfmnc.prfmncRes", prfmncRes) - },[prfmncRes]); + }, [prfmncRes]); return ( <> <ContentsDiv> <div className="grid grid-cols-4 gap-4"> <div className="col-span-4"> - <Title title={"하수재이용 시설 등록"} /> + <Title title={"하수재이용실적 등록"} /> <SearchDiv> <SearchFormLeft> <div className="col-span-2 flex flex-row space-x-2"> @@ -79,7 +90,7 @@ export default function prfmncPrfmncReg() { > 파일등록 </Button> - <Button color="green" size={"sm"} onClick={() => { }}> + <Button color="green" size={"sm"} onClick={excelClick}> 양식받기 </Button> </div> diff --git a/apps/wr/app/store/matDmd/coMatRvw/headList.tsx b/apps/wr/app/store/matDmd/coMatRvw/headList.tsx new file mode 100644 index 000000000..906c97047 --- /dev/null +++ b/apps/wr/app/store/matDmd/coMatRvw/headList.tsx @@ -0,0 +1,109 @@ +import { z } from "zod"; +import type { CommonTableProps } from "../../common/type/headder"; + +export const sttnHeadListType = z.array( + z.object({ + id: z.string(), + title: z.string(), + visible: z.boolean(), + }) +); + +export const coRvwHeadListExport: z.infer<typeof sttnHeadListType> = [ + { + id: "ctpv", + title: "시도", + visible: true, + }, + { + id: "sgg", + title: "시군구", + visible: true, + }, + { + id: "coNm", + title: "회사명", + visible: true, + }, + { + id: "addr", + title: "공장주소", + visible: true, + }, + { + id: "telNo", + title: "전화번호", + visible: true, + }, + { + id: "regDt", //바꾸기 + title: "신청일자", + visible: true, + }, + { + id: "state", //바꾸기 + title: "진행상태", + visible: true, + }, +]; + + +// id는 다확인해야함 +export const coRvwNodeListExport: CommonTableProps[] = [ + { + id: "ctpv", + title: "시도", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "sgg", + title: "시군구", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "coNm", + title: "회사명", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "addr", + title: "공장주소", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + },{ + id: "telNo", + title: "전화번호", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "regDt", //바꾸기 + title: "신청일자", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "state", //바꾸기 + title: "진행상태", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + +]; \ No newline at end of file diff --git a/apps/wr/app/store/matDmd/coMatRvw/index.tsx b/apps/wr/app/store/matDmd/coMatRvw/index.tsx new file mode 100644 index 000000000..6e62da829 --- /dev/null +++ b/apps/wr/app/store/matDmd/coMatRvw/index.tsx @@ -0,0 +1,34 @@ +import type { z } from "zod"; +import type { sttnHeadListType } from "../coSttn/headList"; +import { coRvwHeadListExport, coRvwNodeListExport } from "./headList"; +import type { CommonTableProps } from "../../common/type/headder"; + +const coRvwHeadList = coRvwHeadListExport; +const coRvwNodeList = coRvwNodeListExport; + +export type coRvwState = { + coRvw: { + isInit: boolean; + coRvwHeadList: z.infer<typeof sttnHeadListType>; + coRvwNodeList: CommonTableProps[]; + + }; +}; + +export const coRvwStateExport: coRvwState = { + coRvw: { + isInit: false, + coRvwHeadList: coRvwHeadList, + coRvwNodeList: coRvwNodeList, + } +} + +export type coRvwType = coRvwState & coRvwActions; + +type coRvwActions = { +}; + +export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => { + return { + } +} \ No newline at end of file diff --git a/apps/wr/app/store/prfmncReg/pbnstPrfmncReg/index.tsx b/apps/wr/app/store/prfmncReg/pbnstPrfmncReg/index.tsx index a726aa463..282c277ec 100644 --- a/apps/wr/app/store/prfmncReg/pbnstPrfmncReg/index.tsx +++ b/apps/wr/app/store/prfmncReg/pbnstPrfmncReg/index.tsx @@ -15,6 +15,7 @@ export type pbnstPrfmncState = { pbnstPrfmncHeadList: TableUpperProps[]; monthHeadList: TableUpperProps[]; prfmncRes: pubHasuType[]; + excelList: Number[]; } } @@ -24,6 +25,7 @@ export const pbnstPrfmncStateExport: pbnstPrfmncState = { pbnstPrfmncHeadList: pbnstPrfmncHeadList, monthHeadList: monthHeadList, prfmncRes: [], + excelList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], } } @@ -60,7 +62,7 @@ export const pbnstPrfmncActionsExport: (set: any) => pbnstPrfmncActions = (set: prfmncHasuInit: async (page: string, sggOrCity: string) => { try { const prfmncRes = await hasuListFetch(page, sggOrCity); -console.log("prfmncRes", prfmncRes) + console.log("prfmncRes", prfmncRes) return set((state: pbnstPrfmncState) => ({ ...state, prfmnc: { diff --git a/apps/wr/app/store/store.tsx b/apps/wr/app/store/store.tsx index 4bc699604..aa3d19851 100644 --- a/apps/wr/app/store/store.tsx +++ b/apps/wr/app/store/store.tsx @@ -89,6 +89,7 @@ import { coSttnActionsExport, coSttnStateExport, type coSttnState, type coSttnTy import { ldrmntCoSttnActionsExport, ldrmntCoSttnStateExport, type ldrmntCoSttnState, type ldrmntCoSttnType } from "./matDmd/ldrmntCoSttn"; // 옮겨야함 import { searchActions, type comFcltActions, type comFcltState } from "./common/searchCode"; import { pbnstPrfmncActionsExport, pbnstPrfmncStateExport, type pbnstPrfmncState, type pbnstPrfmncType } from "./prfmncReg/pbnstPrfmncReg"; +import { coRvwActionsExport, coRvwStateExport, type coRvwState, type coRvwType } from "./matDmd/coMatRvw"; export type WrStore = comCodeType & pubFacType & @@ -108,7 +109,8 @@ export type WrStore = comCodeType & comFcltActions&comFcltState& coSttnType& // 옮겨야함 ldrmntCoSttnType& // 옮겨야함 - pbnstPrfmncType + pbnstPrfmncType& + coRvwType ; export const StoreZus = ( @@ -129,7 +131,8 @@ export const StoreZus = ( pbnstSttnState& coSttnState& // 옮겨야함 ldrmntCoSttnState& // 옮겨야함 - pbnstPrfmncState + pbnstPrfmncState& + coRvwState = { ...comCodeStateExport, ...pubFacStateExport, @@ -149,6 +152,7 @@ export const StoreZus = ( ...coSttnStateExport, // 옮겨야함 ...ldrmntCoSttnStateExport, // 옮겨야함 ...pbnstPrfmncStateExport, + ...coRvwStateExport, } ) => { return createStore<WrStore>()((set) => { @@ -179,6 +183,7 @@ export const StoreZus = ( ...coSttnActionsExport(set), // 옮겨야함 ...ldrmntCoSttnActionsExport(set), // 옮겨야함 ...pbnstPrfmncActionsExport(set), + ...coRvwActionsExport(set) }; }); }; diff --git a/apps/wr/public/sample_pbnstPrfmncReg.xlsx b/apps/wr/public/sample_pbnstPrfmncReg.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..67f0d559e096443366eeff0f951b5648e422a972 GIT binary patch literal 13777 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 Shv`NDD7@8qS~LD}_WuAe7T<ON literal 0 HcmV?d00001 From 103defd7001dd44dc5910a8ea3fe8f7c499feb16 Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Wed, 4 Jun 2025 16:17:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=88=98=EC=9A=94=EB=A7=A4=EC=B9=AD?= =?UTF-8?q?=EA=B2=80=ED=86=A0,=20=EC=9E=AC=EC=9D=B4=EC=9A=A9=EA=B2=80?= =?UTF-8?q?=ED=86=A0=EC=9D=B4=EB=A0=A5=20=ED=99=94=EB=A9=B4=20=ED=8D=BC?= =?UTF-8?q?=EB=B8=94=EB=A6=AC=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/matDmd/coMatRvw/page.tsx | 341 ++++++++++++++++- .../app/matMng/matDmd/ruseRvwHstry/page.tsx | 353 ++++++++++++++++++ apps/wr/app/page.tsx | 5 + .../prfmncReg/pbnstPrfmncReg/page.tsx | 6 +- .../store/matDmd/ruseRvwHstry/headList.tsx | 185 +++++++++ .../app/store/matDmd/ruseRvwHstry/index.tsx | 34 ++ apps/wr/app/store/store.tsx | 11 +- 7 files changed, 918 insertions(+), 17 deletions(-) create mode 100644 apps/wr/app/matMng/matDmd/ruseRvwHstry/page.tsx create mode 100644 apps/wr/app/store/matDmd/ruseRvwHstry/headList.tsx create mode 100644 apps/wr/app/store/matDmd/ruseRvwHstry/index.tsx diff --git a/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx b/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx index 4b2dfcef8..8e5bf6a75 100644 --- a/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx +++ b/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx @@ -1,14 +1,42 @@ "use client"; import { useWrStore } from "@/app/store"; -import { ContentsDiv, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, Title, UiTable } from "@common/business_components/ui"; +import { formTableName } from "@/components/lib/class/comClass"; +import { ContentsDiv, Form, FormField, FormUi, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiTable } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; -import { Button, Label } from "@common/components/ui"; +import { Button, DatePicker, Input, Label } from "@common/components/ui"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useState } from "react"; +import { useFieldArray, useForm } from "react-hook-form"; +import { z } from "zod"; export default function coMatRvw() { - const { code, coRvw, } = useWrStore((state) => state); - const { coRvwHeadList, } = coRvw; + const { coRvw, } = useWrStore((state) => state); + const { coRvwHeadList, } = coRvw; + const [fromDate, setFromDate] = useState<Date>(new Date()); + const [toDate, setToDate] = useState<Date>(new Date()); + + const schema = z.object({ + fcltCpct: z.number().optional(), + }); + + const form = useForm<z.infer<typeof schema>>({ + resolver: zodResolver(schema), + defaultValues: { + fcltCpct: 0, + } + }); + + const { + fields: [], + append, + remove, + } = useFieldArray({ + control: form.control, + name: "", + }); + return ( <> <ContentsDiv> @@ -17,12 +45,42 @@ export default function coMatRvw() { <Title title={"수요매칭검토"} /> <SearchDiv> <SearchFormLeft> - - <div className="col-span-2 flex flex-row space-x-2"> - <Label className="w-28 mt-2 text-xl text-gray-600">{'시설명'}</Label> + <div className="col-span-8 flex flex-row"> + <SelectBox + className="col-span-2 w-1/3 h-full text-2xl" + label="시도" + selectClass={""} + selectArray={[]} + value={""} + onSelectValue={(val: string | number) => { } + } + /> + <SelectBox + className="col-span-2 w-1/3 h-full text-2xl" + label="시군구" + selectClass={""} + selectArray={[]} + value={""} + onSelectValue={(val: string | number) => { } + } + /> + <div className="col-span-5 w-full"> + <div className="flex flex-row items-center"> + <Label className="text-xl text-gray-600">수요신청년도</Label> + <div className="flex flex-row"> + <DatePicker mode={'single'} + selected={fromDate} + onSelect={(date: Date | undefined) => { if (date) setFromDate(date) }} /> + <span>~</span> + <DatePicker mode={'single'} + selected={toDate} + onSelect={(date: Date | undefined) => { if (date) setToDate(date) }} /> + </div> + </div> + </div> <SearchInput - className={"w-full text-2xl"} - label="" + className={"text-2xl"} + label="회사명" textValue={""} setText={(e) => { }} @@ -50,7 +108,7 @@ export default function coMatRvw() { <div className="col-span-6"> <ListDiv> <UiTable - headName={[]} + headName={"수요매칭검토현황"} tableData={[]} children={undefined} headlist={coRvwHeadList} @@ -60,10 +118,271 @@ export default function coMatRvw() { }} onPageChange={() => { }} ></UiTable> + <hr /> + <Form {...form}> + <h3 className="mt-4 ml-2 text-2xl font-medium text-label">표준공사비 산정</h3> + <div className="flex items-center mx-3 mb-3"> + <h1 className="">처리시설 표준공사비 산정</h1> + + <Button + size={"sm"} + onClick={(e) => { }} + > + 계산 + </Button> + <Button + size={"sm"} + onClick={(e) => { }} + > + 저장 + </Button> + + </div> + <div className="grid grid-cols-12 gap-4 ml-4 mr-4"> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="용도"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="요구수량(M3/d)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <Label className="">용도에 따른 처리공정<i className="diveicon di-search" /></Label> + + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value || ""} + className="mt-2" + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="처리시설 용량(요구수량 * 365일)"> + <Input + placeholder="" + type="number" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>처리시설용량에 따른 공사비(백만원)</Label> + <Button + size={"sm"} + onClick={(e) => { }} + className="bg-none" + > + 공사비 산정표 보기 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="number" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>시설부대경비 요율(%)</Label> + <Button + size={"sm"} + onClick={(e) => { }} + > + 요율표 보기 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="number" + step="0.01" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + + <div className="col-span-3 mt-4"> + <Label>총사업비 (백만원)<i className="diveicon di-search" /></Label> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + className="mt-2" + type="number" + step="0.01" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>공급처 선정</Label> + <Button + size={"sm"} + onClick={(e) => { }} + className="bg-none" + > + 후보지 선택 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + + <div className="col-span-4 mt-4"> + <div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="공급관로 표준공사비(백만원)"> + <Input + placeholder="" + type="text" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="mt-4"> + <Label>관로 표준공사비 산정 프로그램</Label> + <Button + size={"sm"} + onClick={(e) => { }} + className="bg-none" + > + 다운로드 + </Button> + </div> + <div className="col-span-4 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <Label className="text-xl">처리시설 + 공급관로 총사업비(백만원) + <FormUi label=""> + <Input + placeholder="" + type="text" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + readOnly={true} + value={field.value ?? 0} + /> + </FormUi> + </Label> + )} + /> + </div> + </div> + </div> + </Form> </ListDiv> </div> </div> - </ContentsDiv> + </ContentsDiv > </> ) } \ No newline at end of file diff --git a/apps/wr/app/matMng/matDmd/ruseRvwHstry/page.tsx b/apps/wr/app/matMng/matDmd/ruseRvwHstry/page.tsx new file mode 100644 index 000000000..be8fe5472 --- /dev/null +++ b/apps/wr/app/matMng/matDmd/ruseRvwHstry/page.tsx @@ -0,0 +1,353 @@ +"use client"; + +import { useWrStore } from "@/app/store"; +import { formTableName } from "@/components/lib/class/comClass"; +import { ContentsDiv, Form, FormField, FormUi, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiTable } from "@common/business_components/ui"; +import ListDiv from "@common/business_components/ui/list_div"; +import { Button, DatePicker, Input, Label } from "@common/components/ui"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useState } from "react"; +import { useFieldArray, useForm } from "react-hook-form"; +import { z } from "zod"; + + +export default function ruseRvwHstry() { + const { ruseHstry, } = useWrStore((state) => state); + const { ruseHstryHeadList, } = ruseHstry; + const [fromDate, setFromDate] = useState<Date>(new Date()); + const [toDate, setToDate] = useState<Date>(new Date()); + const schema = z.object({ + fcltCpct: z.number().optional(), + }); + + const form = useForm<z.infer<typeof schema>>({ + resolver: zodResolver(schema), + defaultValues: { + fcltCpct: 0, + } + }); + + const { + fields: [], + append, + remove, + } = useFieldArray({ + control: form.control, + name: "", + }); + + return ( + <> + <ContentsDiv> + <div className="grid grid-cols-4 gap-4"> + <div className="col-span-4"> + <Title title={"재이용검토이력"} /> + <SearchDiv> + <SearchFormLeft> + <div className="col-span-8 flex flex-row"> + <SelectBox + className="col-span-2 w-1/3 h-full text-2xl" + label="시도" + selectClass={""} + selectArray={[]} + value={""} + onSelectValue={(val: string | number) => { } + } + /> + <SelectBox + className="col-span-2 w-1/3 h-full text-2xl" + label="시군구" + selectClass={""} + selectArray={[]} + value={""} + onSelectValue={(val: string | number) => { } + } + /> + <div className="col-span-5 w-full"> + <div className="flex flex-row items-center"> + <Label className="text-xl text-gray-600">수요신청년도</Label> + <div className="flex flex-row"> + <DatePicker mode={'single'} + className="w-full" + selected={fromDate} + onSelect={(date: Date | undefined) => { if (date) setFromDate(date) }} /> + <span>~</span> + <DatePicker mode={'single'} + selected={toDate} + onSelect={(date: Date | undefined) => { if (date) setToDate(date) }} /> + </div> + </div> + </div> + <SearchInput + className={"text-2xl"} + label="시설명" + textValue={""} + setText={(e) => { + }} + /> + <SearchInput + className={"text-2xl"} + label="회사명" + textValue={""} + setText={(e) => { + }} + /> + </div> + </SearchFormLeft> + <SearchFormRight + className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> + <div className="space-y"> + <div className="flex flex-row space-x-2"> + <Button + size={"sm"} + onClick={(e) => { }} + > + 조회 + </Button> + <Button + size={"sm"} + onClick={(e) => { }} + > + 검토완료 + </Button> + </div> + </div> + </SearchFormRight> + </SearchDiv> + </div> + </div> + + <div className="grid grid-cols-6 gap-4 "> + <div className="col-span-6"> + <ListDiv> + <UiTable + headName={"재이용검토현황"} + tableData={[]} + children={undefined} + headlist={ruseHstryHeadList} + pageSize={20} + total={100000} + cellClick={(index: number | undefined, headId: string) => { + }} + onPageChange={() => { }} + ></UiTable> + <hr /> + <Form {...form}> + <h3 className="mt-4 ml-2 text-2xl font-medium text-label">수요신청 상세현황</h3> + <h1 className="mt-1 ml-3">표준공사비 산정</h1> + <div className="flex items-center mx-3 mb-3"> + <h1 className="">처리시설 표준공사비 산정</h1> + <Button + size={"sm"} + onClick={(e) => { }} + > + 재계산 + </Button> + <Button + size={"sm"} + onClick={(e) => { }} + > + 저장 + </Button> + + </div> + <div className="grid grid-cols-12 gap-4 ml-4 mr-4"> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="용도"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="요구수량(M3/d)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <Label className="">용도에 따른 처리공정<i className="diveicon di-search" /></Label> + + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value || ""} + className="mt-2" + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="처리시설 용량(요구수량 * 365일)"> + <Input + placeholder="" + type="number" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>처리시설용량에 따른 공사비(백만원)</Label> + <Button + size={"sm"} + onClick={(e) => { }} + className="bg-none" + > + 공사비 산정표 보기 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="number" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>시설부대경비 요율(%)</Label> + <Button + size={"sm"} + onClick={(e) => { }} + > + 요율표 보기 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="number" + step="0.01" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + + <div className="col-span-3 mt-4"> + <Label>총사업비 (백만원)<i className="diveicon di-search" /></Label> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + className="mt-2" + type="number" + step="0.01" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>공급처 선정</Label> + <Button + size={"sm"} + onClick={(e) => { }} + className="bg-none" + > + 후보지 선택 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + + <div className="col-span-4 mt-4"> + <div className="mt-4"> + <Label>관로 표준공사비 산정</Label> + </div> + </div> + </div> + </Form> + </ListDiv> + </div> + </div> + </ContentsDiv > + </> + ) +} \ No newline at end of file diff --git a/apps/wr/app/page.tsx b/apps/wr/app/page.tsx index a6f5856c3..ff6ef558d 100644 --- a/apps/wr/app/page.tsx +++ b/apps/wr/app/page.tsx @@ -129,6 +129,11 @@ export default function Home() { <Link href="matMng/matDmd/coMatRvw">수요처 매칭 검토</Link> </Button> </div> + <div className="col-span-2"> + <Button className="w-full"> + <Link href="matMng/matDmd/ruseRvwHstry">재이용검토이력</Link> + </Button> + </div> </div> </div> </div> diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx index c0d31cfeb..c5dce841b 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx @@ -22,7 +22,7 @@ import { set } from "react-hook-form"; import { Toaster } from "react-hot-toast"; export default function prfmncPrfmncReg() { - const { code, prfmnc, prfmncHasuInit, searchFclts } = useWrStore( + const { code, prfmnc, prfmncHasuInit, } = useWrStore( (state) => state ); const { pbnstPrfmncHeadList, monthHeadList, prfmncRes } = prfmnc; @@ -38,7 +38,7 @@ export default function prfmncPrfmncReg() { const excelClick = useCallback(() => { console.log("dd") excelDownload( - prfmnc.excelList, + [[]], "하수재이용실적", "sample_pbnstPrfmncReg.xlsx", "A1:O1" @@ -104,7 +104,7 @@ export default function prfmncPrfmncReg() { <Button size={"sm"} onClick={() => {setIsExcelOPen(true)}}> 파일등록 </Button> - <Button color="green" size={"sm"} onClick={() => {}}> + <Button color="green" size={"sm"} onClick={excelClick}> 양식받기 </Button> </div> diff --git a/apps/wr/app/store/matDmd/ruseRvwHstry/headList.tsx b/apps/wr/app/store/matDmd/ruseRvwHstry/headList.tsx new file mode 100644 index 000000000..f394229cf --- /dev/null +++ b/apps/wr/app/store/matDmd/ruseRvwHstry/headList.tsx @@ -0,0 +1,185 @@ +import { z } from "zod"; +import type { CommonTableProps } from "../../common/type/headder"; + +export const sttnHeadListType = z.array( + z.object({ + id: z.string(), + title: z.string(), + visible: z.boolean(), + }) +); + +export const ruseHstryHeadListExport: z.infer<typeof sttnHeadListType> = [ + { + id: "ctpv", + title: "시도", + visible: true, + }, + { + id: "sgg", + title: "시군구", + visible: true, + }, + { + id: "coNm", + title: "회사명", + visible: true, + }, + { + id: "addr", + title: "공장주소", + visible: true, + }, + { + id: "telNo", + title: "전화번호", + visible: true, + }, + { + id: "regDt", //바꾸기 + title: "신청일자", + visible: true, + }, + { + id: "rvwDt", //바꾸기 + title: "검토일자", + visible: true, + }, + { + id: "matDt", //바꾸기 + title: "매칭 완료일자", + visible: true, + }, + { + id: "gong", //바꾸기 + title: "공급처", + visible: true, + }, + { + id: "dmndQty", //바꾸기 + title: "요구수량(M3/d)", + visible: true, + }, + { + id: "useUsgCd", //바꾸기 + title: "사용용도", + visible: true, + }, + { + id: "state", //바꾸기 + title: "진행상태", + visible: true, + }, + { + id: "matYn", //바꾸기 + title: "매칭완료 여부", + visible: true, + }, +]; + + +// id는 다확인해야함 +export const ruseHstryNodeListExport: CommonTableProps[] = [ + { + id: "ctpv", + title: "시도", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "sgg", + title: "시군구", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "coNm", + title: "회사명", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "addr", + title: "공장주소", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + },{ + id: "telNo", + title: "전화번호", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "regDt", //바꾸기 + title: "신청일자", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "rvwDt", //바꾸기 + title: "검토일자", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + },{ + id: "matDt", //바꾸기 + title: "매칭 완료일자", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + },{ + id: "gong", //바꾸기 + title: "공급처", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "dmndQty", //바꾸기 + title: "요구수량(M3/d)", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "useUsgCd", //바꾸기 + title: "사용용도", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "state", //바꾸기 + title: "진행상태", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + { + id: "matYn", //바꾸기 + title: "매칭완료 여부", + visible: true, + row: 1, + rowSpan: 1, + colSpan: 1, + }, + +]; \ No newline at end of file diff --git a/apps/wr/app/store/matDmd/ruseRvwHstry/index.tsx b/apps/wr/app/store/matDmd/ruseRvwHstry/index.tsx new file mode 100644 index 000000000..e41f792b6 --- /dev/null +++ b/apps/wr/app/store/matDmd/ruseRvwHstry/index.tsx @@ -0,0 +1,34 @@ +import type { z } from "zod"; +import type { sttnHeadListType } from "../coSttn/headList"; +import type { CommonTableProps } from "../../common/type/headder"; +import { ruseHstryHeadListExport, ruseHstryNodeListExport } from "./headList"; + +const ruseHstryHeadList = ruseHstryHeadListExport; +const ruseHstryNodeList = ruseHstryNodeListExport; + +export type ruseHstryState = { + ruseHstry: { + isInit: boolean; + ruseHstryHeadList: z.infer<typeof sttnHeadListType>; + ruseHstryNodeList: CommonTableProps[]; + + }; +}; + +export const ruseHstryStateExport: ruseHstryState = { + ruseHstry: { + isInit: false, + ruseHstryHeadList: ruseHstryHeadList, + ruseHstryNodeList: ruseHstryNodeList, + } +} + +export type ruseHstryType = ruseHstryState & ruseHstryActions; + +type ruseHstryActions = { +}; + +export const ruseHstryActionsExport: (set: any) => ruseHstryActions = (set: any) => { + return { + } +} \ No newline at end of file diff --git a/apps/wr/app/store/store.tsx b/apps/wr/app/store/store.tsx index aa3d19851..297983882 100644 --- a/apps/wr/app/store/store.tsx +++ b/apps/wr/app/store/store.tsx @@ -90,6 +90,7 @@ import { ldrmntCoSttnActionsExport, ldrmntCoSttnStateExport, type ldrmntCoSttnSt import { searchActions, type comFcltActions, type comFcltState } from "./common/searchCode"; import { pbnstPrfmncActionsExport, pbnstPrfmncStateExport, type pbnstPrfmncState, type pbnstPrfmncType } from "./prfmncReg/pbnstPrfmncReg"; import { coRvwActionsExport, coRvwStateExport, type coRvwState, type coRvwType } from "./matDmd/coMatRvw"; +import { ruseHstryActionsExport, ruseHstryStateExport, type ruseHstryState, type ruseHstryType } from "./matDmd/ruseRvwHstry"; export type WrStore = comCodeType & pubFacType & @@ -110,7 +111,8 @@ export type WrStore = comCodeType & coSttnType& // 옮겨야함 ldrmntCoSttnType& // 옮겨야함 pbnstPrfmncType& - coRvwType + coRvwType& + ruseHstryType ; export const StoreZus = ( @@ -132,7 +134,8 @@ export const StoreZus = ( coSttnState& // 옮겨야함 ldrmntCoSttnState& // 옮겨야함 pbnstPrfmncState& - coRvwState + coRvwState& + ruseHstryState = { ...comCodeStateExport, ...pubFacStateExport, @@ -153,6 +156,7 @@ export const StoreZus = ( ...ldrmntCoSttnStateExport, // 옮겨야함 ...pbnstPrfmncStateExport, ...coRvwStateExport, + ...ruseHstryStateExport, } ) => { return createStore<WrStore>()((set) => { @@ -183,7 +187,8 @@ export const StoreZus = ( ...coSttnActionsExport(set), // 옮겨야함 ...ldrmntCoSttnActionsExport(set), // 옮겨야함 ...pbnstPrfmncActionsExport(set), - ...coRvwActionsExport(set) + ...coRvwActionsExport(set), + ...ruseHstryActionsExport(set), }; }); }; From f4687be7659c3c3974a4a23a48a3ef5d2fc5b17d Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Wed, 4 Jun 2025 17:31:24 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EC=88=98=EC=9A=94=EB=A7=A4=EC=B9=AD?= =?UTF-8?q?=EA=B2=80=ED=86=A0,=20=EC=9E=AC=EC=9D=B4=EC=9A=A9=EA=B2=80?= =?UTF-8?q?=ED=86=A0=EC=9D=B4=EB=A0=A5=20=EC=A1=B0=ED=9A=8C=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/matDmd/coMatRvw/page.tsx | 43 +- .../app/matMng/matDmd/ruseRvwHstry/page.tsx | 624 +++++++++--------- 2 files changed, 351 insertions(+), 316 deletions(-) diff --git a/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx b/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx index 8e5bf6a75..b7bafc693 100644 --- a/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx +++ b/apps/wr/app/matMng/matDmd/coMatRvw/page.tsx @@ -2,20 +2,25 @@ import { useWrStore } from "@/app/store"; import { formTableName } from "@/components/lib/class/comClass"; -import { ContentsDiv, Form, FormField, FormUi, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiTable } from "@common/business_components/ui"; +import { getCity } from "@/components/lib/func/commom"; +import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; +import { ContentsDiv, Form, FormField, FormUi, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiTable, type SelectDataType } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { Button, DatePicker, Input, Label } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useFieldArray, useForm } from "react-hook-form"; import { z } from "zod"; export default function coMatRvw() { - const { coRvw, } = useWrStore((state) => state); + const { code, coRvw, } = useWrStore((state) => state); const { coRvwHeadList, } = coRvw; const [fromDate, setFromDate] = useState<Date>(new Date()); const [toDate, setToDate] = useState<Date>(new Date()); + const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>() + const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" }); + const schema = z.object({ fcltCpct: z.number().optional(), @@ -28,6 +33,18 @@ export default function coMatRvw() { } }); + const getSelCity = (val: string | number) => { + const cityValue = String(val); // Ensure val is treated as a string + const data = getCity(cityValue, code.sggCd); + setSelectSgg(data); + setObjSearch({ city: cityValue, sgg: '' }); + }; + + const getSgg = (val: string | number) => { + console.log(val); + setObjSearch({ ...objSearch, sgg: String(val) }) + }; + const { fields: [], append, @@ -37,6 +54,14 @@ export default function coMatRvw() { name: "", }); + useEffect(() => { + if (fromDate > toDate) { + const newFromDate = new Date(toDate); + newFromDate.setDate(toDate.getDate() - 1); + setFromDate(newFromDate); + } + }, [toDate]); + return ( <> <ContentsDiv> @@ -50,19 +75,15 @@ export default function coMatRvw() { className="col-span-2 w-1/3 h-full text-2xl" label="시도" selectClass={""} - selectArray={[]} - value={""} - onSelectValue={(val: string | number) => { } - } + selectArray={code.cityCd || []} + onSelectValue={getSelCity} /> <SelectBox className="col-span-2 w-1/3 h-full text-2xl" label="시군구" selectClass={""} - selectArray={[]} - value={""} - onSelectValue={(val: string | number) => { } - } + selectArray={selectSgg || []} + onSelectValue={getSgg} /> <div className="col-span-5 w-full"> <div className="flex flex-row items-center"> diff --git a/apps/wr/app/matMng/matDmd/ruseRvwHstry/page.tsx b/apps/wr/app/matMng/matDmd/ruseRvwHstry/page.tsx index be8fe5472..9b3d2262f 100644 --- a/apps/wr/app/matMng/matDmd/ruseRvwHstry/page.tsx +++ b/apps/wr/app/matMng/matDmd/ruseRvwHstry/page.tsx @@ -2,23 +2,37 @@ import { useWrStore } from "@/app/store"; import { formTableName } from "@/components/lib/class/comClass"; -import { ContentsDiv, Form, FormField, FormUi, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiTable } from "@common/business_components/ui"; +import { getCity } from "@/components/lib/func/commom"; +import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; +import { ContentsDiv, Form, FormField, FormUi, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiTable, type SelectDataType } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { Button, DatePicker, Input, Label } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useFieldArray, useForm } from "react-hook-form"; import { z } from "zod"; export default function ruseRvwHstry() { - const { ruseHstry, } = useWrStore((state) => state); + const { code, ruseHstry, } = useWrStore((state) => state); const { ruseHstryHeadList, } = ruseHstry; const [fromDate, setFromDate] = useState<Date>(new Date()); const [toDate, setToDate] = useState<Date>(new Date()); - const schema = z.object({ - fcltCpct: z.number().optional(), - }); + const schema = z.object({}); + const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>() + const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" }); + + const getSelCity = (val: string | number) => { + const cityValue = String(val); // Ensure val is treated as a string + const data = getCity(cityValue, code.sggCd); + setSelectSgg(data); + setObjSearch({ city: cityValue, sgg: '' }); + }; + + const getSgg = (val: string | number) => { + console.log(val); + setObjSearch({ ...objSearch, sgg: String(val) }) + }; const form = useForm<z.infer<typeof schema>>({ resolver: zodResolver(schema), @@ -36,318 +50,318 @@ export default function ruseRvwHstry() { name: "", }); - return ( - <> - <ContentsDiv> - <div className="grid grid-cols-4 gap-4"> - <div className="col-span-4"> - <Title title={"재이용검토이력"} /> - <SearchDiv> - <SearchFormLeft> - <div className="col-span-8 flex flex-row"> - <SelectBox - className="col-span-2 w-1/3 h-full text-2xl" - label="시도" - selectClass={""} - selectArray={[]} - value={""} - onSelectValue={(val: string | number) => { } - } - /> - <SelectBox - className="col-span-2 w-1/3 h-full text-2xl" - label="시군구" - selectClass={""} - selectArray={[]} - value={""} - onSelectValue={(val: string | number) => { } - } - /> - <div className="col-span-5 w-full"> - <div className="flex flex-row items-center"> - <Label className="text-xl text-gray-600">수요신청년도</Label> - <div className="flex flex-row"> - <DatePicker mode={'single'} - className="w-full" - selected={fromDate} - onSelect={(date: Date | undefined) => { if (date) setFromDate(date) }} /> - <span>~</span> - <DatePicker mode={'single'} - selected={toDate} - onSelect={(date: Date | undefined) => { if (date) setToDate(date) }} /> - </div> +return ( + <> + <ContentsDiv> + <div className="grid grid-cols-4 gap-4"> + <div className="col-span-4"> + <Title title={"재이용검토이력"} /> + <SearchDiv> + <SearchFormLeft> + <div className="col-span-8 flex flex-row"> + <SelectBox + className="col-span-2 w-1/3 h-full text-2xl" + label="시도" + selectClass={""} + selectArray={code.cityCd || []} + onSelectValue={getSelCity} + > + {""} + </SelectBox> + <SelectBox + className="col-span-2 w-1/3 h-full text-2xl" + label="시군구" + selectClass={""} + selectArray={selectSgg || []} + onSelectValue={getSgg} + > + {""} + </SelectBox> + <div className="col-span-5 w-full"> + <div className="flex flex-row items-center"> + <Label className="text-xl text-gray-600">수요신청년도</Label> + <div className="flex flex-row"> + <DatePicker mode={'single'} + className="w-full" + selected={fromDate} + onSelect={(date: Date | undefined) => { if (date) setFromDate(date) }} /> + <span>~</span> + <DatePicker mode={'single'} + selected={toDate} + onSelect={(date: Date | undefined) => { if (date) setToDate(date) }} /> </div> </div> - <SearchInput - className={"text-2xl"} - label="시설명" - textValue={""} - setText={(e) => { - }} - /> - <SearchInput - className={"text-2xl"} - label="회사명" - textValue={""} - setText={(e) => { - }} - /> </div> - </SearchFormLeft> - <SearchFormRight - className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> - <div className="space-y"> - <div className="flex flex-row space-x-2"> - <Button - size={"sm"} - onClick={(e) => { }} - > - 조회 - </Button> - <Button - size={"sm"} - onClick={(e) => { }} - > - 검토완료 - </Button> - </div> - </div> - </SearchFormRight> - </SearchDiv> - </div> - </div> - - <div className="grid grid-cols-6 gap-4 "> - <div className="col-span-6"> - <ListDiv> - <UiTable - headName={"재이용검토현황"} - tableData={[]} - children={undefined} - headlist={ruseHstryHeadList} - pageSize={20} - total={100000} - cellClick={(index: number | undefined, headId: string) => { - }} - onPageChange={() => { }} - ></UiTable> - <hr /> - <Form {...form}> - <h3 className="mt-4 ml-2 text-2xl font-medium text-label">수요신청 상세현황</h3> - <h1 className="mt-1 ml-3">표준공사비 산정</h1> - <div className="flex items-center mx-3 mb-3"> - <h1 className="">처리시설 표준공사비 산정</h1> + <SearchInput + className={"text-2xl"} + label="시설명" + textValue={""} + setText={(e) => { + }} + /> + <SearchInput + className={"text-2xl"} + label="회사명" + textValue={""} + setText={(e) => { + }} + /> + </div> + </SearchFormLeft> + <SearchFormRight + className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> + <div className="space-y"> + <div className="flex flex-row space-x-2"> <Button size={"sm"} onClick={(e) => { }} > - 재계산 + 조회 </Button> <Button size={"sm"} onClick={(e) => { }} > - 저장 + 검토완료 </Button> - </div> - <div className="grid grid-cols-12 gap-4 ml-4 mr-4"> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="용도"> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="요구수량(M3/d)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <Label className="">용도에 따른 처리공정<i className="diveicon di-search" /></Label> - - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value || ""} - className="mt-2" - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="처리시설 용량(요구수량 * 365일)"> - <Input - placeholder="" - type="number" - step="0.001" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <div className="flex items-center justify-between"> - <Label>처리시설용량에 따른 공사비(백만원)</Label> - <Button - size={"sm"} - onClick={(e) => { }} - className="bg-none" - > - 공사비 산정표 보기 - </Button> - </div> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - type="number" - step="0.001" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <div className="flex items-center justify-between"> - <Label>시설부대경비 요율(%)</Label> - <Button - size={"sm"} - onClick={(e) => { }} - > - 요율표 보기 - </Button> - </div> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - type="number" - step="0.01" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - - <div className="col-span-3 mt-4"> - <Label>총사업비 (백만원)<i className="diveicon di-search" /></Label> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - className="mt-2" - type="number" - step="0.01" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <div className="flex items-center justify-between"> - <Label>공급처 선정</Label> - <Button - size={"sm"} - onClick={(e) => { }} - className="bg-none" - > - 후보지 선택 - </Button> - </div> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - - <div className="col-span-4 mt-4"> - <div className="mt-4"> - <Label>관로 표준공사비 산정</Label> - </div> - </div> - </div> - </Form> - </ListDiv> - </div> + </div> + </SearchFormRight> + </SearchDiv> </div> - </ContentsDiv > - </> - ) + </div> + + <div className="grid grid-cols-6 gap-4 "> + <div className="col-span-6"> + <ListDiv> + <UiTable + headName={"재이용검토현황"} + tableData={[]} + children={undefined} + headlist={ruseHstryHeadList} + pageSize={20} + total={100000} + cellClick={(index: number | undefined, headId: string) => { + }} + onPageChange={() => { }} + ></UiTable> + <hr /> + <Form {...form}> + <h3 className="mt-4 ml-2 text-2xl font-medium text-label">수요신청 상세현황</h3> + <h1 className="mt-1 ml-3">표준공사비 산정</h1> + <div className="flex items-center mx-3 mb-3"> + <h1 className="">처리시설 표준공사비 산정</h1> + <Button + size={"sm"} + onClick={(e) => { }} + > + 재계산 + </Button> + <Button + size={"sm"} + onClick={(e) => { }} + > + 저장 + </Button> + + </div> + <div className="grid grid-cols-12 gap-4 ml-4 mr-4"> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="용도"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="요구수량(M3/d)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <Label className="">용도에 따른 처리공정<i className="diveicon di-search" /></Label> + + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value || ""} + className="mt-2" + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="처리시설 용량(요구수량 * 365일)"> + <Input + placeholder="" + type="number" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>처리시설용량에 따른 공사비(백만원)</Label> + <Button + size={"sm"} + onClick={(e) => { }} + className="bg-none" + > + 공사비 산정표 보기 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="number" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>시설부대경비 요율(%)</Label> + <Button + size={"sm"} + onClick={(e) => { }} + > + 요율표 보기 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="number" + step="0.01" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + + <div className="col-span-3 mt-4"> + <Label>총사업비 (백만원)<i className="diveicon di-search" /></Label> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + className="mt-2" + type="number" + step="0.01" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>공급처 선정</Label> + <Button + size={"sm"} + onClick={(e) => { }} + className="bg-none" + > + 후보지 선택 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + + <div className="col-span-4 mt-4"> + <div className="mt-4"> + <Label>관로 표준공사비 산정</Label> + </div> + </div> + </div> + </Form> + </ListDiv> + </div> + </div> + </ContentsDiv > + </> +) } \ No newline at end of file From 789b9d38ae2a853f52fdb32026cf71af4be2cb6a Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Wed, 4 Jun 2025 18:59:17 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=ED=95=98=EC=88=98=EC=9E=AC=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=20=ED=98=84=ED=99=A9=20=EC=97=91=EC=85=80=20=EB=8B=A4?= =?UTF-8?q?=EC=9A=B4=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruseFcltMng/fcltSttn/pbnstSttn/page.tsx | 21 ++++-- .../ruseFcltMng/fcltSttn/pbnstSttn/excel.tsx | 28 ++++++++ .../ruseFcltMng/fcltSttn/pbnstSttn/index.tsx | 67 +++++++++++++----- apps/wr/public/sample_pbnstSttn.xlsx | Bin 0 -> 9196 bytes 4 files changed, 93 insertions(+), 23 deletions(-) create mode 100644 apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/excel.tsx create mode 100644 apps/wr/public/sample_pbnstSttn.xlsx diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx index a662ffb7a..837cf23f1 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx @@ -15,20 +15,27 @@ import HeadChModal from "@/components/ui/modal/sttn/headChModal/headChModal"; import { useCallback, useEffect, useRef, useState } from "react"; import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; import type { customPbnst } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; +import { excelDownload, getCityOrSgg } from "@/components/lib/func/commom"; export default function PbnstSttn() { - const { code, pbnstSttn } = useWrStore( - (state) => state - ); - + const { code, pbnstSttn, pbnstSttnSearch } = useWrStore((state) => state); + const ref = useRef<ReturnType>({} as ReturnType); + const codeData = getCityOrSgg(ref); const [pageNation, setPageNation] = useState(1); const [isChHead, setIsChHead] = useState(false); const [bdstTable, setBdstTable] = useState<customPbnst[]>(); const excelClick = useCallback(() => { - }, []); + // if (codeData) pbnstSttnSearch(1, "10000", codeData); + excelDownload( + [[]], + "하수재이용시설 현황", + "sample_pbnstSttn.xlsx", + "A1:U2" + ); + }, [pbnstSttnSearch, codeData]); return ( <> @@ -65,7 +72,7 @@ export default function PbnstSttn() { // pbnstSttnSearch(1, "20", con); }} excelClick={excelClick} - initClick={function (): void {}} + initClick={function (): void { }} btnClass={btnClass} ref={ref} /> @@ -83,7 +90,7 @@ export default function PbnstSttn() { headlist={pbnstSttn.pbnstSttHeadList} pageSize={20} total={100000} - cellClick={(index: number | undefined,headId:string)=>{} } + cellClick={(index: number | undefined, headId: string) => { }} onPageChange={setPageNation} ></UiTable> </ListDiv> diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/excel.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/excel.tsx new file mode 100644 index 000000000..a85a009a4 --- /dev/null +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/excel.tsx @@ -0,0 +1,28 @@ +import type { customPbnst } from "../../fcltReg/pbnstReg/type"; + +export const excelPbnstSttnParsing = (data: any[]): string[][] => { + const excelExportData: string[][] = []; + + data.forEach((item) => { + excelExportData.push([ + item.a, + String(item.aaa), + item.aaaa ?? "", + item.operMngCd ?? "", + String(item.cityText ?? ""), + String(item.sggText ?? ""), + String(item.bdnstNm ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + String(item.archArea ?? ""), + ]) + }) + return excelExportData; +} \ No newline at end of file diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx index e1a60d921..cb6b8e392 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx @@ -3,11 +3,12 @@ import type { z } from "zod"; import { pbnSttHeadListExport, pbnstSttNodeListExport - } from "./headList"; +} from "./headList"; import { fetchType, getFetch } from "@/components/lib/api"; import { controlHeadView } from "../rainSttn"; import type { sttnHeadListType } from "../rainSttn/headList"; import type { customPbnst } from "../../fcltReg/pbnstReg/type"; +import { excelPbnstSttnParsing } from "./excel"; const pbnstSttHeadList = pbnSttHeadListExport; const pbnstSttNodeList = pbnstSttNodeListExport; @@ -26,6 +27,7 @@ type pbnstSttnActions = { pbnstChSttnHead: ( headList: z.infer<typeof sttnHeadListType>, ) => void; + pbnstSttnSearch: (page: number, total: string, con: string) => void; }; export type pbnstSttnType = pbnstSttnState & pbnstSttnActions; @@ -34,8 +36,8 @@ export const pbnstSttnStateExport: pbnstSttnState = { pbnstSttn: { pbnstSttHeadList: pbnstSttHeadList, pbnstSttNodeList: pbnstSttNodeList, - pbnstSttnRes:[], - excelList:[], + pbnstSttnRes: [], + excelList: [], isInit: false, }, }; @@ -45,19 +47,52 @@ export const pbnstSttnActionsExport: (set: any) => pbnstSttnActions = ( ) => { return { pbnstChSttnHead: async ( - headList: z.infer<typeof sttnHeadListType> - ): Promise<void> => { - - console.log('head ', headList) - const changeNodeList= controlHeadView(headList,pbnstSttNodeList) - - return set((state: pbnstSttnState) => ({ - pbnstSttn: { - ...state.pbnstSttn, - pbnstSttHeadList: headList, - pbnstSttNodeList: changeNodeList, - }, - })); + headList: z.infer<typeof sttnHeadListType> + ): Promise<void> => { + + console.log('head ', headList) + const changeNodeList = controlHeadView(headList, pbnstSttNodeList) + + return set((state: pbnstSttnState) => ({ + pbnstSttn: { + ...state.pbnstSttn, + pbnstSttHeadList: headList, + pbnstSttNodeList: changeNodeList, }, + })); + }, + pbnstSttnSearch: async (page: number, total: string, con: string) => { + try { + const pbnstSttnRes = await getFetch( + fetchType.WR, + `/reuseFc/waterreuseFc/${page}/${total}/${con}` + ); + if (Number(total) > 9000) { + const pbnstExcel = excelPbnstSttnParsing(pbnstSttnRes); + set((state: pbnstSttnState) => { + return { + ...state, + pbnstSttn: { + ...state.pbnstSttn, + excelList: pbnstExcel, + }, + }; + }); + } else + set((state: pbnstSttnState) => { + + return { + ...state, + pbnstSttn: { + ...state.pbnstSttn, + pbnstSttnRes: pbnstSttnRes, + isInit: false, + }, + }; + }); + } catch (erTxt) { + console.log("error", erTxt); + } + }, } } diff --git a/apps/wr/public/sample_pbnstSttn.xlsx b/apps/wr/public/sample_pbnstSttn.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8bbd47ea3b7a624c63debf7eca9da822aa4f69fa GIT binary patch literal 9196 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 Z`$!dec<Al|0Lai!Ff?>)QU3h){{ZXE^dA5K literal 0 HcmV?d00001