From ad0c31e4acb7283a3b0bdf86d5960065de1706e2 Mon Sep 17 00:00:00 2001 From: lelalela Date: Mon, 13 Jan 2025 16:22:12 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=A4=91=EA=B0=84=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/basic/step/Module.jsx | 9 +- .../modal/basic/step/ModuleTabContents.jsx | 50 +++-- src/hooks/module/useModulePlace.js | 184 ++++++++++++++++++ src/hooks/module/useModuleSelection.js | 25 ++- 4 files changed, 238 insertions(+), 30 deletions(-) create mode 100644 src/hooks/module/useModulePlace.js diff --git a/src/components/floor-plan/modal/basic/step/Module.jsx b/src/components/floor-plan/modal/basic/step/Module.jsx index 5d3456c2..32b85e56 100644 --- a/src/components/floor-plan/modal/basic/step/Module.jsx +++ b/src/components/floor-plan/modal/basic/step/Module.jsx @@ -71,6 +71,10 @@ export default function Module({}) { useEffect(() => {}, [roofTab]) + useEffect(() => { + console.log('moduleSelectionData', moduleSelectionData) + }, []) + const handleRoofTab = (tab) => { setRoofTab(tab) } @@ -226,8 +230,9 @@ export default function Module({}) { key={index} index={index} addRoof={roof} - roofTab={roofTab} - moduleSelectionData={moduleSelectionData} + roofTab={index} + moduleCommonSelectionData={moduleSelectionData.common} + moduleConstructionSelectionData={moduleSelectionData.roofConstructions[index]} setModuleSelectionData={setModuleSelectionData} tempModuleSelectionData={tempModuleSelectionData} setTempModuleSelectionData={setTempModuleSelectionData} diff --git a/src/components/floor-plan/modal/basic/step/ModuleTabContents.jsx b/src/components/floor-plan/modal/basic/step/ModuleTabContents.jsx index 598d52d6..24f76a35 100644 --- a/src/components/floor-plan/modal/basic/step/ModuleTabContents.jsx +++ b/src/components/floor-plan/modal/basic/step/ModuleTabContents.jsx @@ -1,24 +1,25 @@ -import { useEffect, useState, useRef, useReducer } from 'react' -import { useRecoilValue, useRecoilState } from 'recoil' +import { useEffect, useState, useRef } from 'react' +import { useRecoilValue } from 'recoil' import { canvasSettingState, pitchSelector, pitchTextSelector } from '@/store/canvasAtom' import { useMessage } from '@/hooks/useMessage' import { useMasterController } from '@/hooks/common/useMasterController' import { useCommonCode } from '@/hooks/common/useCommonCode' import { moduleSelectionInitParamsState, selectedModuleState } from '@/store/selectedModuleOptions' -import { isNotEmptyArray, isObjectNotEmpty } from '@/util/common-utils' +import { isObjectNotEmpty } from '@/util/common-utils' import QSelectBox from '@/components/common/select/QSelectBox' export default function ModuleTabContents({ addRoof, roofTab, - moduleSelectionData, + moduleCommonSelectionData, + moduleConstructionSelectionData, setModuleSelectionData, tempModuleSelectionData, setTempModuleSelectionData, }) { const { getMessage } = useMessage() const canvasSetting = useRecoilValue(canvasSettingState) //캔버스 기본 셋팅 - const [roofMaterial, setRoofMaterial] = useState(addRoof) //지붕재 + const [roofMaterial, setRoofMaterial] = useState(addRoof) //지붕재` const globalPitch = useRecoilValue(pitchSelector) //피치 const globalPitchText = useRecoilValue(pitchTextSelector) //피치 텍스트 @@ -54,6 +55,10 @@ export default function ModuleTabContents({ const [isExistData, setIsExistData] = useState(false) + useEffect(() => { + console.log('addRoof', addRoof) + }, []) + //서까래간격 변경 const handleChangeRaftBase = (option) => { setSelectedRaftBase(option) @@ -89,11 +94,12 @@ export default function ModuleTabContents({ const getModuleOptionsListData = async (params) => { const optionsList = await getTrestleList(params) + if (optionsList.data.length > 0) { if (optionsList.data[0].trestleMkrCd && optionsList.data[0].constMthdCd === null) { setTrestleList(optionsList.data) if (isExistData) { - setSelectedTrestle({ ...moduleSelectionData.roofConstructions[roofTab].trestle }) + setSelectedTrestle({ ...moduleConstructionSelectionData.trestle }) } else { setConstMthdList([]) setRoofBaseList([]) @@ -103,7 +109,7 @@ export default function ModuleTabContents({ if (optionsList.data[0].trestleMkrCd && optionsList.data[0].constMthdCd && optionsList.data[0].roofBaseCd === null) { setConstMthdList(optionsList.data) if (isExistData) { - setSelectedConstMthd({ ...moduleSelectionData.roofConstructions[roofTab].trestle }) + setSelectedConstMthd({ ...moduleConstructionSelectionData.trestle }) } else { setRoofBaseList([]) } @@ -112,7 +118,7 @@ export default function ModuleTabContents({ if (optionsList.data[0].trestleMkrCd && optionsList.data[0].constMthdCd && optionsList.data[0].roofBaseCd) { setRoofBaseList(optionsList.data) if (isExistData) { - setSelectedRoofBase({ ...moduleSelectionData.roofConstructions[roofTab].trestle }) + setSelectedRoofBase({ ...moduleConstructionSelectionData.trestle }) } } } @@ -139,8 +145,6 @@ export default function ModuleTabContents({ constructionRef.current[index].classList.remove('white') constructionRef.current[index].classList.add('blue') - debugger - const selectedConstruction = constructionList[index] selectedConstruction.roofIndex = roofTab selectedConstruction.setupCover = false //처마력바 설치 여부 @@ -197,8 +201,8 @@ export default function ModuleTabContents({ }, [selectedRoofBase]) useEffect(() => { - if (isExistData) { - const selectedIndex = moduleSelectionData.roofConstructions[roofTab].construction.selectedIndex + if (isExistData && constructionList.length > 0) { + const selectedIndex = moduleConstructionSelectionData.construction.selectedIndex handleConstruction(selectedIndex) } }, [constructionList]) @@ -227,9 +231,11 @@ export default function ModuleTabContents({ setTrestleParams({ moduleTpCd: moduleSelectionInitParams.moduleTpCd, roofMatlCd: addRoof.roofMatlCd, raftBaseCd: addRoof.raftBaseCd }) setConstructionList([]) - if (isObjectNotEmpty(moduleSelectionData.roofConstructions[roofTab])) { - setConstructionParams({ ...moduleSelectionData.roofConstructions[roofTab].trestle, constMthdCd: '', roofBaseCd: '' }) - setRoofBaseParams({ ...moduleSelectionData.roofConstructions[roofTab].trestle, roofBaseCd: '' }) + if (isObjectNotEmpty(moduleConstructionSelectionData)) { + setConstructionParams({ ...moduleConstructionSelectionData.trestle, constMthdCd: '', roofBaseCd: '' }) + setRoofBaseParams({ ...moduleConstructionSelectionData.trestle, roofBaseCd: '' }) + setCvrChecked(moduleConstructionSelectionData.construction.setupCover) + setSnowGdChecked(moduleConstructionSelectionData.construction.setupSnowCover) setIsExistData(true) } } @@ -437,18 +443,24 @@ export default function ModuleTabContents({
- - + +
- +
diff --git a/src/hooks/module/useModulePlace.js b/src/hooks/module/useModulePlace.js new file mode 100644 index 00000000..73343547 --- /dev/null +++ b/src/hooks/module/useModulePlace.js @@ -0,0 +1,184 @@ +import { useRecoilState, useRecoilValue } from 'recoil' +import { useContext, useEffect, useState } from 'react' +import { GlobalDataContext } from '@/app/GlobalDataProvider' +import { useMasterController } from '@/hooks/common/useMasterController' +import { useCommonCode } from '@/hooks/common/useCommonCode' + +import { selectedModuleState, moduleSelectionInitParamsState } from '@/store/selectedModuleOptions' +import { pitchSelector } from '@/store/canvasAtom' + +export function useModuleSelection(props) { + const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext) + const globalPitch = useRecoilValue(pitchSelector) //피치 + + const [roughnessCodes, setRoughnessCodes] = useState([]) //면조도 목록 + const [windSpeedCodes, setWindSpeedCodes] = useState([]) //기준풍속 목록 + const [moduleList, setModuleList] = useState([{}]) //모듈 목록 + + const [selectedModules, setSelectedModules] = useRecoilState(selectedModuleState) //선택된 모듈 + const [selectedSurfaceType, setSelectedSurfaceType] = useState({}) //선택된 면조도 + const [installHeight, setInstallHeight] = useState('0') //설치 높이 + const [standardWindSpeed, setStandardWindSpeed] = useState({}) //기준풍속 + const [verticalSnowCover, setVerticalSnowCover] = useState('0') //수직적설량 + const [moduleSelectionInitParams, setModuleSelectionInitParams] = useRecoilState(moduleSelectionInitParamsState) //모듈 기본 데이터 ex) 면조도, 높이등등 + + const { getModuleTypeItemList } = useMasterController() + + const { findCommonCode } = useCommonCode() + + //탭별 파라메터 초기화 + useEffect(() => { + setInstallHeight(managementState?.installHeight) + setStandardWindSpeed(managementState?.standardWindSpeedId) + setVerticalSnowCover(managementState?.verticalSnowCover) + setSelectedSurfaceType(managementState?.surfaceType) + + const initParams = { + illuminationTp: managementState?.surfaceTypeValue, //면조도 + instHt: managementState?.installHeight, //설치높이 + stdWindSpeed: managementState?.standardWindSpeedId, //기준풍속 + stdSnowLd: managementState?.verticalSnowCover, //기준적설량 + inclCd: globalPitch, + } + setModuleSelectionInitParams(initParams) + }, [managementState]) + + useEffect(() => { + // 113700 면조도 + const roughnessCodeList = findCommonCode('113700') + roughnessCodeList.forEach((obj) => { + obj.name = obj.clCodeNm + obj.id = obj.clCode + }) + setRoughnessCodes(roughnessCodeList) + + // 202000 풍속 + const windCodeList = findCommonCode('202000') + windCodeList.forEach((obj) => { + obj.name = obj.clCodeNm + obj.id = obj.clCode + }) + setWindSpeedCodes(windCodeList) + + //지붕재 선택 + const roofsIds = props.addedRoofs.filter((obj) => obj.roofMatlCd).map((obj) => obj.roofMatlCd) + + if (roofsIds.length === 0) { + return + } + + //새로고침시 데이터 날아가는거 방지 + if (!managementState) { + setManagementState(managementStateLoaded) + } + + getModuleData(roofsIds) + }, []) + + const getModuleData = async (roofsIds) => { + const list = await getModuleTypeItemList(roofsIds) + //selectbox에 이름을 넣는다 + list.data.forEach((item) => { + item.name = item.itemNm + }) + //셀렉트박스 데이터 초기화 + setModuleList(list.data) + } + + const handleChangeModule = (option) => { + //선택된 모듈 + setSelectedModules(option) //선택값 저장 + + //init 데이터에 선택된 모듈 추가 + setModuleSelectionInitParams({ + ...moduleSelectionInitParams, + moduleTpCd: option.itemTp, + }) + } + + const handleChangeSurfaceType = (option) => { + setModuleSelectionInitParams({ + ...moduleSelectionInitParams, + illuminationTp: option.clCode, + }) + } + + const handleChangeWindSpeed = (option) => { + setModuleSelectionInitParams({ + ...moduleSelectionInitParams, + surfaceType: option.clCode, + }) + } + + const handleChangeInstallHeight = (option) => { + setInstallHeight(option) + + setModuleSelectionInitParams({ + ...moduleSelectionInitParams, + instHt: option, + }) + } + + const handleChangeVerticalSnowCover = (option) => { + setVerticalSnowCover(option) + + setModuleSelectionInitParams({ + ...moduleSelectionInitParams, + stdSnowLd: option, + }) + } + + useEffect(() => { + console.log('installHeight', installHeight) + }, [installHeight]) + + useEffect(() => { + console.log('verticalSnowCover', verticalSnowCover) + }, [verticalSnowCover]) + + //TODO: 설치높이, 기준적설량 debounce 적용해서 추가해야됨 + + // useEffect(() => { + // getConstructionListData(constructionListParams) + // }, [constructionListParams]) + + // const getConstructionListData = async (params) => { + // if (params.trestleMkrCd && params.constMthdCd && params.roofBaseCd) { + // const optionsList = await getConstructionList(params) + // console.log('optionsList', optionsList) + // setConstructionList(optionsList.data) + // } + // } + + //state 배열에 데이터 추가 함수 + // const addRoofTabParams = (key, value, excludeArray = []) => { + // const index = roofTabParams.findIndex((obj) => obj.roofTab === roofTab) + // if (index !== -1) { + // roofTabParams[index][key] = value + // if (excludeArray.length > 0) { + // excludeArray.forEach((exclude) => { + // roofTabParams[index][exclude] = '' + // }) + // } + // setRoofTabParams((prev) => [...prev.slice(0, index), roofTabParams[index], ...prev.slice(index + 1)]) + // } + // } + + return { + moduleSelectionInitParams, + selectedModules, + roughnessCodes, + windSpeedCodes, + managementState, + moduleList, + selectedSurfaceType, + installHeight, + standardWindSpeed, + verticalSnowCover, + handleChangeModule, + handleChangeSurfaceType, + handleChangeWindSpeed, + handleChangeInstallHeight, + handleChangeVerticalSnowCover, + } +} diff --git a/src/hooks/module/useModuleSelection.js b/src/hooks/module/useModuleSelection.js index 13fc543e..73343547 100644 --- a/src/hooks/module/useModuleSelection.js +++ b/src/hooks/module/useModuleSelection.js @@ -1,16 +1,14 @@ import { useRecoilState, useRecoilValue } from 'recoil' -import { useContext, useEffect, useReducer, useState, useRef } from 'react' +import { useContext, useEffect, useState } from 'react' import { GlobalDataContext } from '@/app/GlobalDataProvider' import { useMasterController } from '@/hooks/common/useMasterController' import { useCommonCode } from '@/hooks/common/useCommonCode' import { selectedModuleState, moduleSelectionInitParamsState } from '@/store/selectedModuleOptions' import { pitchSelector } from '@/store/canvasAtom' -import { useDebounceValue } from 'usehooks-ts' export function useModuleSelection(props) { const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext) - const globalPitch = useRecoilValue(pitchSelector) //피치 const [roughnessCodes, setRoughnessCodes] = useState([]) //면조도 목록 @@ -20,7 +18,7 @@ export function useModuleSelection(props) { const [selectedModules, setSelectedModules] = useRecoilState(selectedModuleState) //선택된 모듈 const [selectedSurfaceType, setSelectedSurfaceType] = useState({}) //선택된 면조도 const [installHeight, setInstallHeight] = useState('0') //설치 높이 - const [standardWindSpeed, setStandardWindSpeed] = useState('0') //기준풍속 + const [standardWindSpeed, setStandardWindSpeed] = useState({}) //기준풍속 const [verticalSnowCover, setVerticalSnowCover] = useState('0') //수직적설량 const [moduleSelectionInitParams, setModuleSelectionInitParams] = useRecoilState(moduleSelectionInitParamsState) //모듈 기본 데이터 ex) 면조도, 높이등등 @@ -46,11 +44,6 @@ export function useModuleSelection(props) { }, [managementState]) useEffect(() => { - //새로고침시 데이터 날아가는거 방지 - if (!managementState) { - setManagementState(managementStateLoaded) - } - // 113700 면조도 const roughnessCodeList = findCommonCode('113700') roughnessCodeList.forEach((obj) => { @@ -73,6 +66,12 @@ export function useModuleSelection(props) { if (roofsIds.length === 0) { return } + + //새로고침시 데이터 날아가는거 방지 + if (!managementState) { + setManagementState(managementStateLoaded) + } + getModuleData(roofsIds) }, []) @@ -129,6 +128,14 @@ export function useModuleSelection(props) { }) } + useEffect(() => { + console.log('installHeight', installHeight) + }, [installHeight]) + + useEffect(() => { + console.log('verticalSnowCover', verticalSnowCover) + }, [verticalSnowCover]) + //TODO: 설치높이, 기준적설량 debounce 적용해서 추가해야됨 // useEffect(() => {