건축물 데이터 검증 소스 수정

This commit is contained in:
leedj312
2025-08-18 14:53:00 +09:00
parent 6b88a8584b
commit 9c19f239c2
10 changed files with 92 additions and 52 deletions
@@ -1,7 +1,7 @@
"use client";
import { useWrStore } from "@/app/store";
import { type customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { formatCommaNumber, tableData } from "@/components/lib/func/commom";
import { rainRegSize, type customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { formatArchArea, tableData } from "@/components/lib/func/commom";
import RainRegForm from "@/components/ui/form/fcltReg/rainReg/rainRegForm";
import { BdstReg } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal";
import {
@@ -49,14 +49,11 @@ export default function Home() {
if (rainRes && rainRes.length > 0) {
const rainData = tableData(rainRes, { code }).map(
(item: customRainBdst) => {
const archArea =
item?.archArea.split(".")[0] !== "-1"
? item?.archArea.split(".")[0]
: "확인불가";
return {
...item,
archArea: formatCommaNumber(archArea),
archArea: formatArchArea(item?.archArea,1),
bdstChgYn: item.chgBuilding[0]?.bdstChgNm != null ? "Y" : "N",
frstArchPrmsnDt:item?.frstArchPrmsnDt||'확인불가'
};
}
);
@@ -129,7 +126,7 @@ export default function Home() {
<UiTable
tableData={bdstTable || []}
headlist={rain.upHeadList}
pageSize={20}
pageSize={rainRegSize}
total={rainResCount}
headName={"건축물 목록"}
cellClick={(val) => {
@@ -140,9 +137,9 @@ export default function Home() {
{/* </ScrollArea> */}
</ListDiv>
</div>
<div className="col-span-2 max-h-full">
<ListDiv className="">
<ScrollArea className="h-[65vh]">
<div className="col-span-2 ">
<ListDiv >
<ScrollArea className="h-[75vh]">
<RainRegForm
rainForm={rainForm ?? ({} as customRainBdst)}
isModal={false}
@@ -1,6 +1,6 @@
"use client";
import { useWrStore } from "@/app/store";
import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg";
import { rswtRegSize, type customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg";
import { tableData } from "@/components/lib/func/commom";
import RswtrRegForm from "@/components/ui/form/fcltReg/rswtrReg/rswtrRegForm";
import { BdstReg } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal";
@@ -134,7 +134,7 @@ export default function Home() {
<UiTable
tableData={bdstTable || []}
headlist={rswt.upHeadList}
pageSize={20}
pageSize={rswtRegSize}
total={rswtResCount}
headName={"건축물 목록"}
cellClick={cellClick}
@@ -145,7 +145,7 @@ export default function Home() {
</div>
<div className="col-span-2 max-h-full">
<ListDiv className="">
<ScrollArea className="h-[65vh]">
<ScrollArea className="h-[75vh]">
<RswtrRegForm
rswtForm={rswtForm ?? ({} as customRswtBdst)}
isModal={false}
@@ -71,6 +71,35 @@ export const bdstUsgCd: SelectDataType[] = [
{ val: "14", text: "골프장" },
{ val: "15", text: "대규모점포" },
{ val: "16", text: "기타" },
{ text: "숙박업", val: "17" },
{ text: "목욕장업", val: "18" },
{ text: "공장", val: "19" },
{ text: "발전시설", val: "20" },
{ text: "관광단지개발사업", val: "21" },
{ text: "도시개발사업", val: "22" },
{ text: "산업단지개발사업", val: "23" },
{ text: "택지개발사업", val: "24" },
{ text: "대규모점포(대형마트)", val: "25" },
{ text: "대규모점포(전문점)", val: "26" },
{ text: "대규모점포(백화점)", val: "27" },
{ text: "대규모점포(쇼핑센터)", val: "28" },
{ text: "대규모점포(복합쇼핑몰)", val: "29" },
{ text: "물류시설", val: "30" },
{ text: "운수시설(여객자동차터미널)", val: "31" },
{ text: "운수시설(철도시설)", val: "32" },
{ text: "운수시설(공항시설)", val: "33" },
{ text: "운수시설(항만시설)", val: "34" },
{ text: "업무시설(공공업무시설)", val: "35" },
{ text: "업무시설(금융업소)", val: "36" },
{ text: "업무시설(사무소)", val: "37" },
{ text: "업무시설(결혼상담소 등 소개업소)", val: "38" },
{ text: "업무시설(출판사)", val: "39" },
{ text: "업무시설(신문사)", val: "40" },
{ text: "업무시설(오피스텔)", val: "41" },
{ text: "교정시설", val: "42" },
{ text: "방송국", val: "43" },
{ text: "전신전화국", val: "44" },
{ text: "기타", val: "45" },
];
export const rswtBdstType: SelectDataType[] = [
@@ -6,7 +6,7 @@ import { makeMdfr, makeRstr } from "../bdstReg";
import { baseReuseBuildingSchema, chgBuildingSchema, validationMessages } from "./type";
export const TEST_UUID = '2d4b151d-1828-41e0-91d9-4cd28ea1cc7e'
export const rainRegSize =15
const rainyObjSchema = z.object({
bdstReuseFcltFk: z.number().nullish(),
pntfColKnd: z.string().min(1, { message: validationMessages.requiredSelect("종류") }),
@@ -99,7 +99,7 @@ export const rainFacStateExport: rainFacState = {
const initFetch = async (code: string | number) => {
// const rainRes =await getFetch("wr", `/reuseFc/rainyInfoList/1/10/${code}`);
const rainRes = await getFetchWithCount("wr", `/reuseFc/rainyInfoList/1/11/${code}`);
const rainRes = await getFetchWithCount("wr", `/reuseFc/rainyInfoList/1/${rainRegSize}/${code}`);
return rainRes;
};
export const rainFacActionsExport: (set: any) => rainFacSActions = (
@@ -108,7 +108,7 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = (
return {
getRainData: async (pageNation: number, code: string | number) => {
try {
const rainRes = await getFetchWithCount("wr", `/reuseFc/rainyInfoList/${pageNation}/11/${code}`);
const rainRes = await getFetchWithCount("wr", `/reuseFc/rainyInfoList/${pageNation}/${rainRegSize}/${code}`);
// 여기서 상태 업데이트
return set((state: rainFacState) => ({
@@ -149,7 +149,7 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = (
try {
// const rainRes = await getFetch('wr' , `/reuseFc/rainyInfoList/${pageNation}/20/41` +(txt? `/${txt}`:''))
const rainRes = await getFetchWithCount('wr', `/reuseFc/rainyInfoList/${pageNation}/11/41` + (txt ? `/${txt}` : ''))
const rainRes = await getFetchWithCount('wr', `/reuseFc/rainyInfoList/${pageNation}/${rainRegSize}/41` + (txt ? `/${txt}` : ''))
console.log("rainRes", rainRes)
set((state: rainFacState) => {
return {
@@ -6,14 +6,13 @@ export const validationMessages = {
requiredSelect: (field: string) => `${field}을(를) 선택해주세요.`,
yearFormat: '4자리 연도만 입력하세요',
};
export const baseReuseBuildingSchema = z.object({
bdstRuseFcltSn: z.number().nullish(),
bdstInfoSn: z.number().nullish(),
instlCmptnDt: z.coerce.date().default(() => new Date()),
instlCst: z
.number()
.max(9_999_999, { message: "최대 9,999,999까지 입력 가능합니다." })
.max(999_999_999_999, { message: "최대 1,000,000,000,000까지 입력 가능합니다." })
.nullish(),
operMngCd: z.string().optional().default(""),
anlOperCst: z.number().default(0),
@@ -7,6 +7,8 @@ import { z } from "zod";
import { makeMdfr, makeRstr } from "../bdstReg";
import { baseReuseBuildingSchema, chgBuildingSchema, validationMessages } from "../rainReg/type";
export const rswtRegSize =15;
const rswtrObjSchema = z.object({
bdstRuseFcltSn: z.number().nullish(),
//wtrUsqty: z.number({ required_error: validationMessages.required("물사용량(m³)") }).positive({ message: validationMessages.required("물사용량(m³)") }),
@@ -84,7 +86,7 @@ export const rswtFacStateExport: rswtFacState = {
};
const initFetch = async (code: string | number) => {
const rswtRes = await getFetchWithCount("wr", `/reuseFc/waterreuseFc/1/11/${code}`);
const rswtRes = await getFetchWithCount("wr", `/reuseFc/waterreuseFc/1/${rswtRegSize}/${code}`);
return rswtRes;
};
export const rswtFacActionsExport: (set: any) => rswtFacSActions = (
@@ -99,7 +101,7 @@ export const rswtFacActionsExport: (set: any) => rswtFacSActions = (
try {
const rswtRes = await getFetchWithCount(
"wr",
`/reuseFc/waterreuseFc/${pageNation}/11/${code}` +
`/reuseFc/waterreuseFc/${pageNation}/${rswtRegSize}/${code}` +
(txt ? `/${txt}` : "")
);
set((state: rswtFacState) => {
@@ -121,7 +123,7 @@ export const rswtFacActionsExport: (set: any) => rswtFacSActions = (
try {
const rswtRes = await getFetchWithCount(
"wr",
`/reuseFc/waterreuseFc/${pageNation}/11/${code}`
`/reuseFc/waterreuseFc/${pageNation}/${rswtRegSize}/${code}`
);
console.log(pageNation);
// 여기서 상태 업데이트
+25 -1
View File
@@ -272,4 +272,28 @@ export const formatYyyymmdd = (val: string | undefined) => {
}
const m = moment(val);
return m.isValid() ? m.format("YYYY-MM-DD") : val;
};
};
/**
* 문자열 숫자(콤마 포함 가능)를 반올림 처리해 반환.
* 숫자가 아닌 경우(예: "확인불가")는 원래 값을 그대로 반환.
*
* @param value 입력 문자열
* @param digits 소수점 자릿수 (기본 0 = 정수 반올림)
*/
export const formatArchArea =(value: string, digits: number=0 ) => {
// "확인불가" 등 숫자 아님 → 그대로 반환
const cleaned = value.replace(/,/g, "");
const num = parseFloat(cleaned);
if (isNaN(num)) {
return value;
}
// 반올림 (digits 자릿수까지)
const rounded = num.toFixed(digits);
// 다시 천 단위 콤마 찍어서 반환
return Number(rounded).toLocaleString();
}
@@ -14,9 +14,9 @@ import {
} from "@/components/lib/func/commom";
import { DatePicker, FormUi } from "@common/business_components";
import { Form, FormField, SelectBox } from "@common/business_components/ui";
import { Button, Input, ScrollArea } from "@common/components/ui";
import { Button, Input } from "@common/components/ui";
import { zodResolver } from "@hookform/resolvers/zod";
import { useEffect, useState } from "react";
import { useEffect } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
import BdstReg from "../bdstReg/bdstReg";
@@ -54,18 +54,12 @@ export default function RainRegForm({
"reuseBuilding.0.rainyObj.filtrTrtmfctYn",
]);
const [divStyle, setDivStyle] = useState("h-[53vh]");
// const [divStyle, setDivStyle] = useState("h-[53vh]");
useEffect(() => {
if(isMap=== true){
setDivStyle("h-[100vh]")
}else if (isModal === true) {
setDivStyle("h-[53vh] max-h-[37vh]")
} else if (readonly === true) {
setDivStyle("h-[62vh]")
} else {
setDivStyle("h-[57vh]")
}
}, [isModal, readonly ,isMap]);
}, [isMap]);
const cleanRainData = (raw: any): z.infer<typeof rainZod> => {
const buildings =
@@ -94,6 +88,8 @@ export default function RainRegForm({
grntchBdstCertYn: item?.grntchBdstCertYn ?? "Y",
rainyObj: {
...item?.rainyObj,
pntfColKnd:item.rainyObj?.pntfColKnd??'확인불가',
filtrTrtmfctPrs:item.rainyObj?.filtrTrtmfctPrs??'',
filtrTrtmfctYn: item?.rainyObj?.filtrTrtmfctYn ?? "Y",
},
})),
@@ -180,7 +176,7 @@ export default function RainRegForm({
)}
</div>
</div>
<ScrollArea className={divStyle}>
{/* <ScrollArea className={divStyle}> */}
{isModal && rainForm != undefined ? <BdstReg form={form} /> : <></>}
{isModal ? (
<h1 className="pl-3 text-xl col-span-10 mt-4">
@@ -614,7 +610,7 @@ export default function RainRegForm({
</div>
</div>
<BdstAdd form={form} readonly={readonly}></BdstAdd>
</ScrollArea>
{/* </ScrollArea> */}
</form>
</Form>
</div>
@@ -19,9 +19,9 @@ import {
FormUi,
SelectBox,
} from "@common/business_components/ui";
import { Button, Input, ScrollArea } from "@common/components/ui";
import { Button, Input } from "@common/components/ui";
import { zodResolver } from "@hookform/resolvers/zod";
import { useEffect, useState } from "react";
import { useEffect } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
import BdstAdd from "../bdstReg/bdstAdd";
@@ -46,18 +46,11 @@ export default function RswtrRegForm({
const { code, rswtBdstUpdate, rswtBdstReg } = useWrStore(
(state) => state
);
const [divStyle, setDivStyle] = useState("h-[53vh]");
// const [divStyle, setDivStyle] = useState("h-[53vh]");
useEffect(() => {
if(isMap){
setDivStyle("h-[100vh]")
}else if (isModal === true) {
setDivStyle("h-[53vh] max-h-[37vh]")
} else if (readonly === true) {
setDivStyle("h-[62vh]")
} else {
setDivStyle("h-[57vh]")
}
}, [isModal, readonly ,isMap]);
}, [isMap]);
// const defaultValues: z.infer<typeof rswtZod> = rswtZod.parse({});
const form = useForm<z.infer<typeof rswtZod>>({
@@ -176,7 +169,7 @@ export default function RswtrRegForm({
)}
</div>
</div>
<ScrollArea className={divStyle}>
{/* <ScrollArea className={divStyle}> */}
{isModal && rswtForm != undefined ? <BdstReg form={form} /> : <></>}
{isModal ? (
<h1 className="pl-3 text-xl col-span-10 mt-4 ">
@@ -506,7 +499,7 @@ export default function RswtrRegForm({
</div>
</div>
<BdstAdd form={form} readonly={readonly}></BdstAdd>
</ScrollArea>
{/* </ScrollArea> */}
</form>
</Form>
</div>
@@ -196,7 +196,7 @@ export function BdstReg<T extends MoType>({
</div>
</ScrollArea>
<div className="border-t border-gray-300 my-4"></div>
{/* <ScrollArea className="h-[40vh]"> */}
<ScrollArea className="h-[40vh]">
<div>
{moType === "RNB" ? (
<RainRegForm
@@ -226,7 +226,7 @@ export function BdstReg<T extends MoType>({
></HtdflRegForm>
)}
</div>
{/* </ScrollArea> */}
</ScrollArea>
</div>
</>
);