수요매칭검토 수정
iipbs_wr / build (push) Waiting to run

This commit is contained in:
leedj312
2025-07-06 16:15:08 +09:00
parent c5f7d62908
commit 103c5d3cb1
6 changed files with 248 additions and 208 deletions
+13 -5
View File
@@ -93,12 +93,12 @@ export default function CoMatRvw() {
const form = useForm<z.infer<typeof DmdCoReqSchema>>({
resolver: zodResolver(DmdCoReqSchema),
shouldUnregister: true
shouldUnregister: false,
// defaultValues: DmdCoReqSchema.parse({})
});
const TableCellClick = (index: number) => {
console.log(coMatRvwRes);
if (coMatRvwRes && coMatRvwRes[index]) {
setSelectData(coMatRvwRes[index]);
setSelectionVersion((v) => v + 1); // 행을 클릭할 때마다 버전을 1씩 증가
@@ -107,7 +107,6 @@ export default function CoMatRvw() {
const useUsgCdWatch = useWatch({ control: form.control, name: "useUsgCd" });
useEffect(() => {
console.log(' useUsgCdWatch page ' ,useUsgCdWatch)
if (useUsgCdWatch) {
form.setValue(
"demandCst.usgPrcsProcs",
@@ -160,7 +159,15 @@ export default function CoMatRvw() {
useEffect(() => {
if (selectData) {
form.reset(selectData);
try {
DmdCoReqSchema.parse(selectData);
} catch (e) {
if (e instanceof z.ZodError) {
console.log(e.flatten());
}
}
form.reset( selectData);
setSelectionVersion((v) => v + 1); // 강제로 바뀌었다고 알리기
}
}, [selectData, form]);
@@ -168,6 +175,7 @@ export default function CoMatRvw() {
<>
<ContentsDiv>
<div className="grid grid-cols-4 gap-4">
<div className="col-span-4">
<Title title={"수요매칭검토"} />
<SearchDiv>
@@ -288,7 +296,7 @@ export default function CoMatRvw() {
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="demandCo.regDt"
name="dmndTmng"
render={({ field }) => (
<FormUi label="요구시기">
<Input
+27 -10
View File
@@ -61,17 +61,29 @@ export default function CoSttn() {
const [seartchTxt, setSearchTxt] = useState<string>();
const [upadateData, setUpdateData] = useState<DemandCompType>();
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 getSelCity = useCallback((val: string | number) => {
const cityValue = String(val);
const data = getCity(cityValue, code.sggCd);
setSelectSgg(data);
// 시/도를 변경하면 시/군/구는 '전체'("0")로 초기화합니다.
setObjSearch({ city: cityValue, sgg: "0" });
}, [code.sggCd]);
const getSgg = (val: string | number) => {
setObjSearch({ ...objSearch, sgg: String(val) });
};
const getSgg = useCallback((val: string | number) => {
setObjSearch((prev) => ({ ...prev, sgg: String(val) }));
}, []);
useEffect(() => {
// code.cityCd 데이터가 로드되었고, 아직 시/도 선택이 안된 초기 상태일 때 실행
if (code.cityCd && code.cityCd.length > 0 && !objSearch.city) {
const firstCityVal = code.cityCd[0]?.val;
if (firstCityVal) {
// 첫 번째 시/도 값으로 상태를 초기화합니다.
getSelCity(firstCityVal);
}
}
}, [code.cityCd, objSearch.city, getSelCity]);
useEffect(() => {
if (!coSttn.isInit) {
coSttnInit("1", "13", "0");
@@ -124,8 +136,11 @@ export default function CoSttn() {
const searchClick = () => {
const con = (objSearch.sgg && objSearch.sgg !== "0") ? objSearch.sgg : objSearch.city;
if (con) {
if (seartchTxt && seartchTxt?.length > 0) {
console.log(' seartchTxt ', seartchTxt)
coSttnTxtSearch("1", "13", String(con), seartchTxt ?? "");
} else {
coSttnSearch("1", "13", String(con));
@@ -147,13 +162,15 @@ export default function CoSttn() {
selectClass={""}
selectArray={code.cityCd || []}
onSelectValue={getSelCity}
value={objSearch.city}
/>
<SelectBox
className="col-span-2 w-1/6 h-full text-2xl"
label="시군구"
selectClass={""}
selectArray={selectSgg?selectSgg : [{text:"전체",val:"0"}]}
selectArray={selectSgg || []}
onSelectValue={getSgg}
value={objSearch.sgg}
/>
<SearchInput
className={"!text-3xl"}
+11 -8
View File
@@ -94,10 +94,13 @@ export const comFcltSearchAction: (set: any) => comFcltActions = (set: any) => {
`/reuseFc/request/${searchNm}/${cnt}`
);
console.log(coList);
set((state: comFcltState) => {
return (state.demandCompList = [...coList]);
});
if(coList&&coList.length>0){
set((state: comFcltState) => {
return (state.demandCompList = [...coList]);
});
}
},
regDemandCompany: async (data: DemandCompType) => {
try {
@@ -112,9 +115,10 @@ export const comFcltSearchAction: (set: any) => comFcltActions = (set: any) => {
} else {
message = "fail";
}
set((state: comFcltState) => {
state.dmdIsSucees = message;
return state;
return state.dmdIsSucees = message;
});
} catch (err) {
console.log(err);
@@ -132,8 +136,7 @@ export const comFcltSearchAction: (set: any) => comFcltActions = (set: any) => {
}
set((state: comFcltState) => {
state.dmdIsSucees = message;
return state;
return state.dmdIsSucees = message;
});
} catch (err) {
console.log(err);
+38 -31
View File
@@ -1,13 +1,18 @@
import { constCostHeadListExport, coRvwHeadListExport, coRvwNodeListExport, rateFeeHeadListExport } from "./headList";
import {
constCostHeadListExport,
coRvwHeadListExport,
coRvwNodeListExport,
rateFeeHeadListExport,
} from "./headList";
import type { CommonTableProps } from "../../common/type/header";
import type { DedMatUpdateType, DmdCoReqType } from "./type";
import { fetchType, getFetch, putFectch } from "@/components/lib/api";
import toast from "react-hot-toast/headless";
import toast from "react-hot-toast";
const coRvwHeadList = coRvwHeadListExport;
const coRvwNodeList = coRvwNodeListExport;
const rateFeeHeadList =rateFeeHeadListExport;
const constCostHeadList=constCostHeadListExport
const rateFeeHeadList = rateFeeHeadListExport;
const constCostHeadList = constCostHeadListExport;
export type coRvwState = {
coRvw: {
isInit: boolean;
@@ -25,8 +30,8 @@ export const coRvwStateExport: coRvwState = {
coMatRvwRes: [],
coRvwHeadList: coRvwHeadList,
coRvwNodeList: coRvwNodeList,
rateFeeHeadList:rateFeeHeadList,
constCostHeadList:constCostHeadList
rateFeeHeadList: rateFeeHeadList,
constCostHeadList: constCostHeadList,
},
};
@@ -37,7 +42,7 @@ type coRvwActions = {
pageNo: number,
pageCnt: number,
startYear: string,
endYear: string,
endYear: string
) => void;
coMatRvwUpdate: (
splyCd: string,
@@ -50,7 +55,7 @@ type coRvwActions = {
startYear: string,
endYear: string,
sggCd: string,
dmdCoNm: string,
dmdCoNm: string
) => void;
coMatRvwInqua: (
pageNo: number,
@@ -65,7 +70,7 @@ const coMatInit = async (
pageNo: number,
pageCnt: number,
startYear: string,
endYear: string,
endYear: string
) => {
const url = `/reuseFc/request/infoList/sub/${pageNo}/${pageCnt}/${startYear}/${endYear}`;
const coMatRvwRes = await getFetch(fetchType.WR, url);
@@ -79,7 +84,7 @@ export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => {
pageNo: number,
pageCnt: number,
startYear: string,
endYear: string,
endYear: string
) => {
const coMatRvwRes = await coMatInit(pageNo, pageCnt, startYear, endYear);
@@ -98,27 +103,29 @@ export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => {
data: DedMatUpdateType
) => {
try {
const isUpdate = await putFectch(
const response = await putFectch(
`/reuseFc/request/cst/${splyCd}/${dmdCd}`,
data
);
if(isUpdate){
toast.error("수요 매칭 검토 검토로 저장되었습니다.");
if (response.status === 200) {
toast.success("매칭 검토로 저장되었습니다.");
const coMatRvwRes = await coMatInit(
1,
10,
new Date().getFullYear().toString(),
new Date().getFullYear().toString()
);
return set((state: coRvwState) => ({
...state,
coRvw: {
...state.coRvw,
coMatRvwRes: coMatRvwRes,
init: false,
},
}));
} else {
toast.error("매칭 검토 저장에 실패했습니다.");
}
const coMatRvwRes = coMatInit(
1,
10,
new Date().getFullYear().toString(),
new Date().getFullYear().toString(),
);
return set((state: coRvwState) => ({
...state,
coRvw: {
...state.coRvw,
init: false,
coMatRvwRes: coMatRvwRes,
},
}));
} catch (e) {
toast.error("매칭 검토 저장 오류입니다.");
}
@@ -129,7 +136,7 @@ export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => {
startYear: string,
endYear: string,
sggCd: string,
dmdCoNm: string,
dmdCoNm: string
) => {
let url = `/reuseFc/request/infoList/sub/${pageNo}/${pageCnt}/${startYear}/${endYear}`;
@@ -144,7 +151,7 @@ export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => {
url += `/0`;
}
console.log(' url ', url)
console.log(" url ", url);
const coMatRvwRes = await getFetch(fetchType.WR, url);
return set((state: coRvwState) => ({
@@ -166,7 +173,7 @@ export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => {
let url = `/reuseFc/request/infoList/sub/${pageNo}/${pageCnt}/${startYear}/${endYear}`;
if (sggCd.length > 0) {
url += `/${sggCd}/0`;
}else if(sggCd ==='0'){
} else if (sggCd === "0") {
url += `/0/0`;
}
const coMatRvwRes = await getFetch(fetchType.WR, url);
@@ -180,6 +187,6 @@ export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => {
} catch (e) {
console.log(" error ", e);
}
}
},
};
};
+129 -139
View File
@@ -1,157 +1,147 @@
import { z } from "zod";
const DemandInfoSchema = z.object({
dmdInfoSn: z.number().nullish(),
dmdInfoFk: z.string().nullish(),
dmndTmng: z.coerce.date().nullish(),
dmndQty: z.number().nullish(),
wntUntprc: z.number().nullish(),
grssClfg: z.number().nullish(),
combResdch: z.number().nullish(),
trbt: z.number().nullish(),
blgcOxygDmndQnt: z.number(),
smll: z.number().nullish(),
crmty: z.number().nullish(),
tn: z.number().nullish(),
tph: z.number().nullish(),
ph: z.number(),
clIonQnt: z.number().nullish(),
cdtnv: z.number().nullish(),
rmrk: z.string().nullish(),
useUsgCd: z.string().nullish(),
mtchnCmptnYmd: z.string().nullish(),
rvwCmptnYmd: z.string().nullish()
});
const DemandMatchingSchema = z.object({
dmdInfoFk: z.string().nullish(),
splyFcltFk: z.string().nullish(),
splyFcltFlg: z.string().nullish(),
pbnstRuseFcltBizFk: z.number().nullish(),
splyBgngDay: z.coerce.date().nullish(),
splyEndDay: z.coerce.date().nullish(),
splyCpct: z.number().nullish(),
splyFmYn: z.string().nullish(),
useUsgCd: z.string().nullish(),
dmdInfoSn: z.number().nullish(),
splyCndtList:z.array(z.string().nullish() ).nullish()
});
const DemandCoSchema = z.object({
dmdInfoPk: z.string().nullish(),
dmdCoNm: z.string().nullish(),
ctpvCd: z.string().nullish(),
sggCd: z.string().nullish(),
daddr: z.string().nullish(),
splyBgngDay: z.coerce.date().nullish(),
splyEndDay: z.coerce.date().nullish(),
splyCpct: z.number().nullish(),
splyFmYn: z.string().nullish(),
telno: z.string().nullish(),
useUsgCd: z.string().nullish(),
regDt: z.coerce.date().nullish(),
rgtr: z.string().nullish(),
mdfcnDt: z.coerce.date().nullish(),
mdfr: z.string().nullish(),
dmdAplyPswd: z.string().nullish(),
demandInfo: z.array(DemandInfoSchema.nullish()).nullish(), // 안쓰는 거임
demandMatchings: z.array(DemandMatchingSchema.nullish()).nullish()// 안쓰는 거임
});
const DemandCstSchema = z.object({
dmdInfoSn: z.number().nullish(),
usgPrcsProcs: z.string().nullish(),
cstrnCst: z.number(),
fcltSbsdCstrnCst: z.number(),
prcsFcltCpctCstrnCst: z.number()
});
export const DmdCoReqSchema = z.object({
cityText:z.string().nullish(),
sggText:z.string().nullish(),
dmdInfoSn: z.number().nullish(),
dmdInfoFk: z.string().nullish(),
dmndTmng: z.coerce.date().nullish(),
dmndQty: z.number(),
wntUntprc: z.number().nullish(),
grssClfg: z.number().nullish(),
combResdch: z.number().nullish(),
trbt: z.number().nullish(),
blgcOxygDmndQnt: z.number(),
smll: z.number().nullish(),
crmty: z.number().nullish(),
tn: z.number().nullish(),
tph: z.number().nullish(),
ph: z.number().nullish(),
clIonQnt: z.number().nullish(),
cdtnv: z.number(),
rmrk: z.string().nullish(),
useUsgCd: z.string().nullish(),
mtchnCmptnYmd: z.string().nullish(),
rvwCmptnYmd: z.string().nullish(),
demandCo: DemandCoSchema.nullish(),
demandMatching: DemandMatchingSchema.nullish(),
demandCst: DemandCstSchema,
ruseUtztnFcltNm:z.string().nullish(),
totalConstCost:z.number().nullish(),
const DemandInfoSchema = z.object({
dmdInfoSn: z.number(),
dmdInfoFk: z.string().nullish(),
dmndTmng: z.coerce.date().nullish(),
dmndQty: z.number().nullish(),
wntUntprc: z.number().nullish(),
grssClfg: z.number().nullish(),
combResdch: z.number().nullish(),
trbt: z.number().nullish(),
blgcOxygDmndQnt: z.number(),
smll: z.number().nullish(),
crmty: z.number().nullish(),
tn: z.number().nullish(),
tph: z.number().nullish(),
ph: z.number(),
clIonQnt: z.number().nullish(),
cdtnv: z.number().nullish(),
rmrk: z.string().nullish(),
useUsgCd: z.string().nullish(),
mtchnCmptnYmd: z.string().nullish(),
rvwCmptnYmd: z.string().nullish(),
});
});
const DemandMatchingSchema = z.object({
dmdInfoFk: z.string().nullish(),
splyFcltFk: z.string().nullish(),
splyFcltFlg: z.string().nullish(),
pbnstRuseFcltBizFk: z.number().nullish(),
splyBgngDay: z.coerce.date().nullish(),
splyEndDay: z.coerce.date().nullish(),
splyCpct: z.number().nullish(),
splyFmYn: z.string().nullish(),
useUsgCd: z.string().nullish(),
dmdInfoSn: z.number().nullish(),
splyCndtList: z.array(z.string().nullish()).nullish(),
});
const DemandCoSchema = z.object({
dmdInfoPk: z.string().nullish(),
dmdCoNm: z.string().nullish(),
ctpvCd: z.string().nullish(),
sggCd: z.string().nullish(),
daddr: z.string().nullish(),
splyBgngDay: z.coerce.date().nullish(),
splyEndDay: z.coerce.date().nullish(),
splyCpct: z.number().nullish(),
splyFmYn: z.string().nullish(),
telno: z.string().nullish(),
useUsgCd: z.string().nullish(),
regDt: z.coerce.date().nullish(),
rgtr: z.string().nullish(),
mdfcnDt: z.coerce.date().nullish(),
mdfr: z.string().nullish(),
dmdAplyPswd: z.string().nullish(),
demandInfo: z.array(DemandInfoSchema.nullish()).nullish(), // 안쓰는 거임
demandMatchings: z.array(DemandMatchingSchema.nullish()).nullish(), // 안쓰는 거임
});
const DemandCstSchema = z.object({
dmdInfoSn: z.number().nullish(),
usgPrcsProcs: z.string().nullish(),
cstrnCst: z.number().default(0),
fcltSbsdCstrnCst: z.number().default(0),
prcsFcltCpctCstrnCst: z.number().default(0),
});
export const DmdCoReqSchema = z.object({
cityText: z.string().nullish(),
sggText: z.string().nullish(),
dmdInfoSn: z.number().default(0),
dmdInfoFk: z.string().default(''),
dmndTmng: z.coerce.date().nullish(),
dmndQty: z.number().nullish(), // null 또는 undefined 허용
blgcOxygDmndQnt: z.number().nullish(),
wntUntprc: z.number().nullish(),
grssClfg: z.number().nullish(),
combResdch: z.number().nullish(),
trbt: z.number().nullish(),
smll: z.number().nullish(),
crmty: z.number().nullish(),
tn: z.number().nullish(),
tph: z.number().nullish(),
ph: z.number().nullish(),
clIonQnt: z.number().nullish(),
cdtnv: z.number().nullish(),
rmrk: z.string().nullish(),
useUsgCd: z.string().nullish(),
mtchnCmptnYmd: z.string().nullish(),
rvwCmptnYmd: z.string().nullish(),
demandCo: DemandCoSchema.nullish(),
demandMatching: DemandMatchingSchema.nullish(),
demandCst: DemandCstSchema.nullish(),
ruseUtztnFcltNm: z.string().nullish(),
totalConstCost: z.number().nullish(),
});
export type DmdCoReqType = z.infer<typeof DmdCoReqSchema>;
export type DmdMatTableType = {
cityText:string,
sggText:string,
dmdCoNm:string,
daddr:string,
telno:string,
regDt:string,
splyFcltFlg:string
}
cityText: string;
sggText: string;
dmdCoNm: string;
daddr: string;
telno: string;
regDt: string;
splyFcltFlg: string;
};
export type DedMatUpdateType =
{
export type DedMatUpdateType = {
dmdInfoSn: number;
usgPrcsProcs: string;
cstrnCst: number;
fcltSbsdCstrnCst: number;
prcsFcltCpctCstrnCst: number;
rgtr: string;
}
};
export type RvwHistTableType = {
cityText:string,
sggText:string,
dmdCoNm:string,
daddr:string,
telno:string,
regDt:string,
rvwCmptnYmd:string,
mtchnCmptnYmd:string,
ruseUtztnFcltNm:string,
dmndQty:string,
useUsgCd:string,
splyFcltFlg:string
completeYn:boolean
dmdInfoSn :string
cityText: string;
sggText: string;
dmdCoNm: string;
daddr: string;
telno: string;
regDt: string;
rvwCmptnYmd: string;
mtchnCmptnYmd: string;
ruseUtztnFcltNm: string;
dmndQty: string;
useUsgCd: string;
splyFcltFlg: string;
completeYn: boolean;
dmdInfoSn: string;
};
}
export type conCostFeeType= {
yr: string,
fctCpc: string,
fctCd: string,
stdCost: string
}
export type conCostFeeType = {
yr: string;
fctCpc: string;
fctCd: string;
stdCost: string;
};
export type rateFeeType = {
yr: string,
incExpCd: string,
stdCost: number,
rt: number
}
yr: string;
incExpCd: string;
stdCost: number;
rt: number;
};
@@ -74,14 +74,19 @@ export default function ConCostForm({
const cstrnCst = form.watch("demandCst.cstrnCst");
const useUsgCdWatch = form.watch("useUsgCd");
useEffect(() =>{
console.log('usgPrcsProcsWatch ', usgPrcsProcsWatch)
console.log('useUsgCdWatch ' , useUsgCdWatch)
},[usgPrcsProcsWatch, useUsgCdWatch, selectionVersion])
const calculateConstCost = useCallback(() => {
const usgPrcsProcs = usgPrcsProcsWatch;
if(!dmndQtyWatch){
toast.error('요구수량(M3/d)을 확인해주세요 계산할수 없습니다. ')
return
}
if(usgPrcsProcs === null || usgPrcsProcs === undefined){
toast.error('용도에 따른 처리공정을 확인할수 없습니다. 용도를 확인해주세요. ')
return
}
const dmndQtyYear = dmndQtyWatch * 365;
if (usgPrcsProcs && usgPrcsProcs?.length > 0) {
const firstProc = getConstFctCode(usgPrcsProcs?.split("+")[0] || "") || "";
@@ -131,20 +136,23 @@ export default function ConCostForm({
}, [constCostRes, rateFeeRes, usgPrcsProcsWatch, dmndQtyWatch]);
const onSubmit = (value: DmdCoReqType) => {
if( !form.getValues('demandCst.prcsFcltCpctCstrnCst') ){
if(value.demandCst&& !value.demandCst.prcsFcltCpctCstrnCst ){
toast.error('공사비 계산 진행 후 저장을 눌러주새요')
return
}
if (type === "mat") {
const data: DedMatUpdateType = {
dmdInfoSn: form.getValues("dmdInfoSn"),
usgPrcsProcs: form.getValues("demandCst.usgPrcsProcs")|| "",
cstrnCst: form.getValues("demandCst.cstrnCst"),
fcltSbsdCstrnCst: form.getValues("demandCst.fcltSbsdCstrnCst"),
prcsFcltCpctCstrnCst: form.getValues("demandCst.prcsFcltCpctCstrnCst"),
rgtr: TEST_UUID,
};
coMatRvwUpdate("11000SW001R1", form.getValues("dmdInfoFk"), data);
if(value.demandCst ){
const data: DedMatUpdateType = {
dmdInfoSn: value.dmdInfoSn,
usgPrcsProcs: value.demandCst.usgPrcsProcs|| "",
cstrnCst: value.demandCst.cstrnCst ||0,
fcltSbsdCstrnCst: value.demandCst.fcltSbsdCstrnCst ||0,
prcsFcltCpctCstrnCst: value.demandCst.prcsFcltCpctCstrnCst ||0,
rgtr: TEST_UUID,
};
coMatRvwUpdate("11000SW001R1", form.getValues("dmdInfoFk"), data);
}
} else if (type === "hist") {
delete value.totalConstCost
@@ -159,6 +167,13 @@ export default function ConCostForm({
console.log(" form ", form.formState.errors);
}, [form.formState]);
useEffect(() => {
form.register("dmdInfoSn");
form.register("dmdInfoFk");
form.register("ruseUtztnFcltNm");
}, []);
return (
<>
<hr className="mt-8" />