From 3b2dfa3ed4a3ff3a12fc531e6828c4c777b3e9a7 Mon Sep 17 00:00:00 2001 From: changkyu choi Date: Tue, 25 Feb 2025 15:09:27 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/FloorPlan.jsx | 6 +- .../modal/circuitTrestle/step/StepUp.jsx | 158 ++++++++++-------- .../placementShape/PlacementShapeSetting.jsx | 72 +++----- .../roofcover/useRoofAllocationSetting.js | 74 ++++++-- src/store/settingAtom.js | 91 +++++++--- 5 files changed, 247 insertions(+), 154 deletions(-) diff --git a/src/components/floor-plan/FloorPlan.jsx b/src/components/floor-plan/FloorPlan.jsx index 25efa782..18f3ea0d 100644 --- a/src/components/floor-plan/FloorPlan.jsx +++ b/src/components/floor-plan/FloorPlan.jsx @@ -15,7 +15,6 @@ export default function FloorPlan({ children }) { const [correntObjectNo, setCurrentObjectNo] = useRecoilState(correntObjectNoState) const searchParams = useSearchParams() const objectNo = searchParams.get('objectNo') - const pid = searchParams.get('pid') const { closeAll } = usePopup() const { selectedMenu, setSelectedMenu } = useCanvasMenu() @@ -41,11 +40,10 @@ export default function FloorPlan({ children }) { * 설정 데이터 fetch */ useEffect(() => { - /** - * correntObjectNo가 없으면 실행하지 않음 - */ + /** correntObjectNo가 없으면 실행하지 않음 */ if (!correntObjectNo) return + /** CanvasSetting 데이터 fetch */ fetchSettings() return () => { diff --git a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx index 8b519e86..5320bef9 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx @@ -46,8 +46,6 @@ export default function StepUp(props) { const [selectedRows, setSelectedRows] = useState({}) const [isManualSelection, setIsManualSelection] = useState({}) - // 선택된 값들을 저장할 상태 추가 - const [selectedValues, setSelectedValues] = useState({}) const isDisplayCircuitNumber = useRecoilValue(circuitNumDisplaySelector) const circuitNumberText = useRecoilValue(fontSelector('circuitNumberText')) // useCanvasPopupStatusController(6) @@ -58,7 +56,7 @@ export default function StepUp(props) { useEffect(() => { if (allocationType === 'auto') { - // 자동일 때 모듈의 회로 정보 초기화 + /** 자동일 때 모듈의 회로 정보 초기화 */ canvas .getObjects() .filter((obj) => obj.name === POLYGON_TYPE.MODULE) @@ -70,40 +68,41 @@ export default function StepUp(props) { canvas.renderAll() - // PCS 자동 승압설정 정보 조회 + /** PCS 자동 승압설정 정보 조회 */ fetchAutoStepUpData() } else { - // PCS 수동 승압설정 정보 조회 + /** PCS 수동 승압설정 정보 조회 */ fetchPassiStepUpData() } }, []) - // PCS 자동 승압설정 정보 조회 + /** + * PCS 자동 승압설정 정보 조회 + */ const fetchAutoStepUpData = async () => { try { const params = { - ...props.getOptYn(), // 옵션 Y/N - useModuleItemList: props.getUseModuleItemList(), // 사용된 모듈아이템 List - roofSurfaceList: props.getRoofSurfaceList(), // 지붕면 목록 - pcsItemList: props.getSelectedPcsItemList(), // PCS 아이템 목록 + ...props.getOptYn() /** 옵션 Y/N */, + useModuleItemList: props.getUseModuleItemList() /** 사용된 모듈아이템 List */, + roofSurfaceList: props.getRoofSurfaceList() /** 지붕면 목록 */, + pcsItemList: props.getSelectedPcsItemList() /** PCS 아이템 목록 */, } - // 회로 구성 가능 여부 체크 통과 시 승압설정 정보 조회 + /** 회로 구성 가능 여부 체크 통과 시 승압설정 정보 조회 */ getPcsVoltageStepUpList(params).then((res) => { if (res?.result.resultCode === 'S' && res?.data) { const dataArray = Array.isArray(res.data) ? res.data : [res.data] const stepUpListData = formatStepUpListData(dataArray) - // PCS 승압설정 정보 SET + /** PCS 승압설정 정보 SET */ setStepUpListData(stepUpListData) - // PCS 옵션 조회 + /** PCS 옵션 조회 */ const formattedOptCodes = formatOptionCodes(res.data.optionList) setOptCodes(formattedOptCodes) setSeletedOption(formattedOptCodes[0]) - // 캔버스에 회로 정보 적용 - //stepUpListData[0].pcsItemList.forEach((pcsItem) => { + /** 캔버스에 회로 정보 적용 */ stepUpListData[0].pcsItemList.forEach((pcsItem) => { const selectedSerQty = pcsItem.serQtyList.find((serQty) => serQty.selected) if (selectedSerQty) { @@ -111,13 +110,13 @@ export default function StepUp(props) { const targetSurface = canvas.getObjects().filter((obj) => obj.id === roofSurface.roofSurfaceId)[0] const moduleIds = targetSurface.modules.map((module) => module.id) - // 기존 모듈 텍스트 삭제 + /** 기존 모듈 텍스트 삭제 */ canvas .getObjects() .filter((obj) => moduleIds.includes(obj.parentId)) .forEach((text) => canvas.remove(text)) - // 새로운 모듈 회로 정보 추가 + /** 새로운 모듈 회로 정보 추가 */ roofSurface.moduleList.forEach((module) => { const targetModule = canvas.getObjects().find((obj) => obj.id === module.uniqueId) if (targetModule && module.circuit !== '' && module.circuit) { @@ -154,10 +153,6 @@ export default function StepUp(props) { setModuleStatisticsData() } else { swalFire({ text: getMessage('common.message.send.error') }) - // swalFire({ - // title: res.result.resultMsg, - // type: 'alert', - // }) } }) } catch (error) { @@ -165,7 +160,9 @@ export default function StepUp(props) { } } - // PCS 수동 승압설정 정보 조회 + /** + * PCS 수동 승압설정 정보 조회 + */ const fetchPassiStepUpData = async () => { try { // 1-1 2-2 @@ -174,13 +171,13 @@ export default function StepUp(props) { // .filter((obj) => obj.name === POLYGON_TYPE.MODULE && obj.circuit) // .map((module) => module.circuitNumber) - // 모듈 데이터 가져오기 + /** 모듈 데이터 가져오기 */ const modules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE) - // PCS별 회로 정보를 저장할 객체 + /** PCS별 회로 정보를 저장할 객체 */ const pcsSummary = {} - // 각 모듈을 순회하며 PCS별 회로 정보 수집 + /** 각 모듈을 순회하며 PCS별 회로 정보 수집 */ modules.forEach((module) => { if (!module.circuit || !module.pcsItemId) return @@ -204,10 +201,10 @@ export default function StepUp(props) { pcsItemList: getSelectedPcsItemList(), } - // PCS 접속함 및 옵션 목록 조회 + /** PCS 접속함 및 옵션 목록 조회 */ getPcsConnOptionItemList(params).then((res) => { if (res?.result.code === 200 && res?.data) { - // PCS 아이템 리스트에 serQtyList 추가 + /** PCS 아이템 리스트에 serQtyList 추가 */ const pcsItemListWithSerQty = res.data.pcsItemList.map((pcsItem) => { const pcsData = pcsSummary[pcsItem.itemId] || { circuits: {}, totalModules: 0 } const circuitCounts = Object.values(pcsData.circuits) @@ -215,9 +212,9 @@ export default function StepUp(props) { ...pcsItem, serQtyList: [ { - // 한 회로당 최대 모듈 수 + /** 한 회로당 최대 모듈 수 */ serQty: circuitCounts.length > 0 ? Math.max(...circuitCounts) : 0, - // 회로 개수 + /** 회로 개수 */ paralQty: Object.keys(pcsData.circuits).length || 0, rmdYn: 'Y', usePossYn: 'Y', @@ -227,16 +224,16 @@ export default function StepUp(props) { } }) - // Update res.data with modified pcsItemList + /** res.data with modified pcsItemList */ res.data.pcsItemList = pcsItemListWithSerQty const dataArray = Array.isArray(res.data) ? res.data : [res.data] const stepUpListData = formatStepUpListData(dataArray) - // PCS 승압설정 정보 SET + /** PCS 승압설정 정보 SET */ setStepUpListData(stepUpListData) - // PCS 옵션 조회 + /** PCS 옵션 조회 */ const formattedOptCodes = formatOptionCodes(res.data.optionList) setOptCodes(formattedOptCodes) setSeletedOption(formattedOptCodes[0]) @@ -247,7 +244,9 @@ export default function StepUp(props) { } } - // PCS 옵션 조회 + /** + * PCS 옵션 조회 + */ const formatOptionCodes = (optionList = []) => { return optionList?.map((opt) => ({ code: opt.pcsOptCd ? opt.pcsOptCd : '', @@ -256,7 +255,9 @@ export default function StepUp(props) { })) } - // PCS 승압설정 정보 포맷 후 추천 값 저장 + /** + * PCS 승압설정 정보 포맷 후 추천 값 저장 + */ const formatStepUpListData = (dataArray = []) => { const formattedData = dataArray?.map((stepUps) => ({ ...stepUps, @@ -268,7 +269,9 @@ export default function StepUp(props) { return formattedData } - // PCS 옵션 포맷 + /** + * PCS 옵션 포맷 + */ const formatOptionList = (optionList = []) => { return optionList?.map((option) => ({ pcsOptCd: option.pcsOptCd ? option.pcsOptCd : '', @@ -277,7 +280,9 @@ export default function StepUp(props) { })) } - // PCS 아이템 포맷 + /** + * PCS 아이템 포맷 + */ const formatPcsItemList = (pcsItemList = []) => { return pcsItemList?.map((item, index) => ({ goodsNo: item.goodsNo ? item.goodsNo : '', @@ -291,7 +296,9 @@ export default function StepUp(props) { })) } - // PCS 연결 포맷 + /** + * PCS 연결 포맷 + */ const formatConnList = (connList = []) => { if (!connList) return [] // null인 경우 빈 배열 반환 @@ -305,7 +312,9 @@ export default function StepUp(props) { })) } - // PCS 시리즈 포맷 + /** + * PCS 시리즈 포맷 + */ const formatSerQtyList = (serQtyList = []) => { return serQtyList?.map((qty) => ({ code: uuidv4(), @@ -318,7 +327,9 @@ export default function StepUp(props) { })) } - // PCS RoofSurface 포맷 + /** + * PCS RoofSurface 포맷 + */ const formatRoofSurfaceList = (roofSurfaceList = []) => { return roofSurfaceList?.map((rsf) => ({ moduleList: formatModuleList(rsf.moduleList), @@ -327,7 +338,10 @@ export default function StepUp(props) { roofSurfaceIncl: rsf.roofSurfaceIncl ? +rsf.roofSurfaceIncl : '', })) } - // PCS MatModule 포맷 + + /** + * PCS MatModule 포맷 + */ const formatModuleList = (moduleList = []) => { return moduleList?.map((module) => ({ circuit: module.circuit ? module.circuit : '', @@ -337,7 +351,9 @@ export default function StepUp(props) { })) } - // 각 모듈의 탭을 변경하는 함수 + /** + * 각 모듈의 탭을 변경하는 함수 + */ const handleTabChange = (goodsNo, idx, tabNumber) => { setModuleTabs((prev) => ({ ...prev, @@ -345,9 +361,11 @@ export default function StepUp(props) { })) } - // 행 선택 핸들러 함수 추가 + /** + * 행 선택 핸들러 함수 추가 + */ const handleRowClick = (mainIdx, subIdx) => { - // 자동 승압 설정인 경우만 실행 + /** 자동 승압 설정인 경우만 실행 */ if (allocationType !== 'auto') return let tempStepUpListData = [...stepUpListData] @@ -359,26 +377,24 @@ export default function StepUp(props) { } item.selected = index === subIdx }) - // 선택된 행 정보 저장 + /** 선택된 행 정보 저장 */ setStepUpListData(tempStepUpListData) - // console.log('🚀 ~ handleRowClick ~ tempStepUpListData:', tempStepUpListData) - // console.log('🚀 ~ handleRowClick ~ selectedData:', selectedData) - - // PCS 2개 이상 또는 첫번째 PCS 선택 시에만 실행 + /** PCS 2개 이상 또는 첫번째 PCS 선택 시에만 실행 */ if (tempStepUpListData[0].pcsItemList.length > 1 && mainIdx === 0) { - // 파워컨디셔너 옵션 조회 요청 파라미터 + /** 파워컨디셔너 옵션 조회 요청 파라미터 */ const params = { ...props.getOptYn(), // 옵션 Y/N useModuleItemList: props.getUseModuleItemList(), // 사용된 모듈아이템 List roofSurfaceList: props.getRoofSurfaceList(), // 지붕면 목록 pcsItemList: props.getSelectedPcsItemList().map((pcsItem, index) => { - // PCS 아이템 목록 - // tempStepUpListData에서 해당 PCS 아이템 찾기 - // uniqueIndex를 사용하여 매칭 + /** PCS 아이템 목록 + * tempStepUpListData에서 해당 PCS 아이템 찾기 + * uniqueIndex를 사용하여 매칭 + */ const matchingPcsItem = tempStepUpListData[0].pcsItemList.find((item) => item.uniqueIndex === `${pcsItem.itemId}_${index}`) - // 선택된 serQty 찾기 + /** 선택된 serQty 찾기 */ const selectedSerQty = matchingPcsItem?.serQtyList.find((serQty) => serQty.selected)?.serQty || 0 return { @@ -388,34 +404,29 @@ export default function StepUp(props) { }), } - // PCS가 1개 이고 2번째 또는 3번째 PCS serQty가 0인 경우는 추천 API 실행하지 않음 + /** PCS가 1개 이고 2번째 또는 3번째 PCS serQty가 0인 경우는 추천 API 실행하지 않음 */ if (params.pcsItemList.length !== 1 && (params.pcsItemList[1]?.applySerQty !== 0 || params.pcsItemList[2]?.applySerQty) !== 0) { - // PCS 승압설정 정보 조회 - //const res = await getPcsVoltageStepUpList(params) - //getPcsManualConfChk(params).then((res) => { + /** PCS 승압설정 정보 조회 */ getPcsVoltageStepUpList(params).then((res) => { if (res?.result.resultCode === 'S' && res?.data) { const dataArray = Array.isArray(res.data) ? res.data : [res.data] const stepUpListData = formatStepUpListData(dataArray) - // PCS 승압설정 정보 SET + /** PCS 승압설정 정보 SET */ setStepUpListData(stepUpListData) - // PCS 옵션 조회 + /** PCS 옵션 조회 */ const formattedOptCodes = formatOptionCodes(res.data.optionList) setOptCodes(formattedOptCodes) setSeletedOption(formattedOptCodes[0]) } else { swalFire({ text: getMessage('common.message.send.error') }) - // swalFire({ - // title: res.result.resultMsg, - // type: 'alert', - // }) } }) } } + /** 모듈 목록 삭제 */ canvas .getObjects() .filter((obj) => obj.name === POLYGON_TYPE.MODULE) @@ -425,13 +436,14 @@ export default function StepUp(props) { module.pcsItemId = null }) + /** 선택된 모듈 목록 추가 */ selectedData.roofSurfaceList.forEach((roofSurface) => { const targetSurface = canvas.getObjects().filter((obj) => obj.id === roofSurface.roofSurfaceId)[0] const moduleIds = targetSurface.modules.map((module) => { return module.id }) - // 모듈 목록 삭제 + /** 모듈 목록 삭제 */ canvas .getObjects() .filter((obj) => moduleIds.includes(obj.parentId)) @@ -439,7 +451,7 @@ export default function StepUp(props) { canvas.remove(text) }) - // 모듈 목록 추가 + /** 모듈 목록 추가 */ canvas.renderAll() roofSurface.moduleList.forEach((module) => { @@ -475,7 +487,9 @@ export default function StepUp(props) { setModuleStatisticsData() } - // 현재 선택된 값들을 가져오는 함수 추가 + /** + * 현재 선택된 값들을 가져오는 함수 추가 + */ const getCurrentSelections = () => { const selectedValues = stepUpListData[0].pcsItemList.forEach((item) => { item.serQtyList.filter((serQty) => serQty.selected) @@ -496,20 +510,20 @@ export default function StepUp(props) { return selectedValues } - // props로 getCurrentSelections 함수 전달 + /** props로 getCurrentSelections 함수 전달 */ useEffect(() => { if (props.onInitialize) { props.onInitialize(getCurrentSelections) } }, []) - // stepUpListData가 변경될 때마다 업데이트하는 useEffect + /** stepUpListData가 변경될 때마다 업데이트하는 useEffect */ useEffect(() => { if (props.onInitialize) { - // onInitialize를 props에서 가져옴 + /** onInitialize를 props에서 가져옴 */ props.onInitialize(() => ({ ...getCurrentSelections(), - stepUpListData, // stepUpListData를 포함하여 반환 + stepUpListData /** stepUpListData를 포함하여 반환 */, })) } }, [stepUpListData]) @@ -524,9 +538,7 @@ export default function StepUp(props) { {optCodes.length > 0 && (
- {/* */} { return { ...roof, name: globalLocale === 'ko' ? roof.name : roof.nameJp } })} @@ -628,8 +640,6 @@ export default function StepUp(props) { - {/* - */} diff --git a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx index bfa86372..a7decdb7 100644 --- a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx +++ b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx @@ -17,10 +17,14 @@ import { globalLocaleStore } from '@/store/localeAtom' import { onlyNumberInputChange } from '@/util/input-utils' import { getChonByDegree, getDegreeByChon } from '@/util/canvas-util' +/** + * 지붕 레이아웃 + */ export const ROOF_MATERIAL_LAYOUT = { PARALLEL: 'P', STAIRS: 'S', } + export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, planNo, openPoint }) { const [showSizeGuideModal, setShowSizeGuidModal] = useState(false) const [showMaterialGuideModal, setShowMaterialGuidModal] = useState(false) @@ -31,9 +35,9 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla const { basicSetting, setBasicSettings, fetchBasicSettings, basicSettingSave } = useCanvasSetting() const [addedRoofs, setAddedRoofs] = useRecoilState(addedRoofsState) const { findCommonCode } = useCommonCode() - const [raftCodes, setRaftCodes] = useState([]) // 서까래 정보 - const [currentRoof, setCurrentRoof] = useState(null) // 현재 선택된 지붕재 정보 - const { closePopup } = usePopup() // usePopup에서 closeAll 함수 가져오기 + const [raftCodes, setRaftCodes] = useState([]) /** 서까래 정보 */ + const [currentRoof, setCurrentRoof] = useState(null) /** 현재 선택된 지붕재 정보 */ + const { closePopup } = usePopup() /** usePopup에서 closePopup 함수 가져오기 */ const roofRef = { roofCd: useRef(null), @@ -100,6 +104,9 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla if (openPoint && openPoint === 'canvasMenus') fetchBasicSettings(planNo, openPoint) }, []) + /** + * 배치면초기설정 데이터 조회 후 화면 오픈 + */ useEffect(() => { if (addedRoofs.length > 0) { const raftCodeList = findCommonCode('203800') @@ -145,6 +152,9 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla setCurrentRoof({ ...currentRoof, roofAngleSet: value }) } + /** + * 지붕재 변경 시 현재 지붕 정보 변경 + */ const handleRoofTypeChange = (value) => { const selectedRoofMaterial = roofMaterials.find((roof) => roof.roofMatlCd === value) @@ -159,15 +169,24 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla }) } + /** + * 입력 값 변경 시 현재 지붕 정보 변경 + */ const changeInput = (value, e) => { const { name } = e.target setCurrentRoof({ ...currentRoof, [name]: Number(value) }) } + /** + * 서까래 변경 시 현재 지붕 정보 변경 + */ const handleRafterChange = (value) => { setCurrentRoof({ ...currentRoof, raft: value }) } + /** + * 지붕 레이아웃 변경 시 현재 지붕 정보 변경 + */ const handleRoofLayoutChange = (value) => { if (+currentRoof.roofSizeSet === 3) { setCurrentRoof({ ...currentRoof, layout: ROOF_MATERIAL_LAYOUT.PARALLEL }) @@ -176,6 +195,9 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla setCurrentRoof({ ...currentRoof, layout: value }) } + /** + * 배치면초기설정 저장 버튼 클릭 + */ const handleSaveBtn = () => { const roofInfo = { ...currentRoof, @@ -321,7 +343,6 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla ? currentRoof?.roofMatlNm : currentRoof?.roofMatlNmJp } - //ref={roofRef.roofCd} options={roofMaterials.map((roof) => { return { ...roof, name: globalLocale === 'ko' ? roof.roofMatlNm : roof.roofMatlNmJp } })} @@ -332,23 +353,6 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla showKey="name" disabled={currentRoof?.roofSizeSet === '3'} /> - {/* */} {currentRoof && ['R', 'C'].includes(currentRoof.widAuth) && (
@@ -365,14 +369,6 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla disabled={currentRoof?.roofSizeSet === '3'} />
- {/*
- -
*/} )} {currentRoof && ['R', 'C'].includes(currentRoof.lenAuth) && ( @@ -390,14 +386,6 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla disabled={currentRoof?.roofSizeSet === '3'} /> - {/*
- -
*/} )} {currentRoof && ['C', 'R'].includes(currentRoof.raftAuth) && ( @@ -407,7 +395,6 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla
r.clCode === (currentRoof?.raft === undefined ? currentRoof?.raftBaseCd : currentRoof?.raft)) .clCodeNm @@ -419,15 +406,6 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla showKey="clCodeNm" disabled={currentRoof?.roofSizeSet === '3'} /> - {/* */}
)} diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 4dc7d839..5fb72a1f 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -27,7 +27,6 @@ import { moduleSelectionDataState } from '@/store/selectedModuleOptions' import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupStatusController' import { outerLinePointsState } from '@/store/outerLineAtom' -// 지붕면 할당 export function useRoofAllocationSetting(id) { const canvas = useRecoilValue(canvasState) const [correntObjectNo, setCorrentObjectNo] = useRecoilState(correntObjectNoState) @@ -40,8 +39,8 @@ export function useRoofAllocationSetting(id) { const roofMaterials = useRecoilValue(roofMaterialsSelector) const selectedRoofMaterial = useRecoilValue(selectedRoofMaterialSelector) const [basicSetting, setBasicSetting] = useRecoilState(basicSettingState) - const [currentRoofMaterial, setCurrentRoofMaterial] = useState(roofMaterials[0]) // 팝업 내 기준 지붕재 - const [roofList, setRoofList] = useRecoilState(addedRoofsState) // 배치면 초기설정에서 선택한 지붕재 배열 + const [currentRoofMaterial, setCurrentRoofMaterial] = useState(roofMaterials[0]) /** 팝업 내 기준 지붕재 */ + const [roofList, setRoofList] = useRecoilState(addedRoofsState) /** 배치면 초기설정에서 선택한 지붕재 배열 */ const [editingLines, setEditingLines] = useState([]) const [currentRoofList, setCurrentRoofList] = useState([]) const currentAngleType = useRecoilValue(currentAngleTypeSelector) @@ -57,14 +56,25 @@ export function useRoofAllocationSetting(id) { const resetPoints = useResetRecoilState(outerLinePointsState) useEffect(() => { + /** 배치면 초기설정에서 선택한 지붕재 배열 설정 */ setCurrentRoofList(roofList) }, []) useEffect(() => { - const roofBases = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) // roofPolygon.innerLines + const roofBases = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) /** roofPolygon.innerLines */ roofBases.forEach((roof) => { + /** 현재 선택된 라인인 경우 라인 두께 2로 설정 */ + if (editingLines.includes(line)) { + line.set({ + strokeWidth: 2, + stroke: 'black', + selectable: true, + }) + } + roof.innerLines.forEach((line) => { + /** 실측값이 없는 경우 라인 두께 4로 설정 */ if (!line.attributes.actualSize || line.attributes?.actualSize === 0) { line.set({ strokeWidth: 4, @@ -73,6 +83,7 @@ export function useRoofAllocationSetting(id) { }) } + /** 현재 선택된 라인인 경우 라인 두께 2로 설정 */ if (editingLines.includes(line)) { line.set({ strokeWidth: 2, @@ -82,6 +93,8 @@ export function useRoofAllocationSetting(id) { } }) }) + + /** 현재 선택된 객체가 보조라인, 피라미드, 힙인 경우 두께 4로 설정 */ if (currentObject && currentObject.name && ['auxiliaryLine', 'ridge', 'hip'].includes(currentObject.name)) { currentObject.set({ strokeWidth: 4, @@ -91,20 +104,21 @@ export function useRoofAllocationSetting(id) { }, [currentObject]) useEffect(() => { - // canvas.getObjects().filter((obj) => obj.type === 'QLine') + /** 현재 선택된 객체가 보조라인, 피라미드, 힙인 경우 두께 4로 설정 */ const roofBases = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) if (roofBases.length === 0) { swalFire({ text: '할당할 지붕이 없습니다.' }) closePopup(id) } - fetchBasicSettings(basicSetting.planNo, null) + /** 배치면 초기설정 조회 */ + fetchBasicSettings(basicSetting.planNo) }, []) /** - * 지붕면 할당 조회 및 초기화 + * 배치면 초기설정 조회 */ - const fetchBasicSettings = async (planNo, openPoint) => { + const fetchBasicSettings = async (planNo) => { try { await get({ url: `/api/canvas-management/canvas-basic-settings/by-object/${correntObjectNo}/${planNo}`, @@ -169,7 +183,6 @@ export function useRoofAllocationSetting(id) { }) } - // setCurrentRoofList(selectRoofs) setBasicSetting({ ...basicSetting, planNo: res[0].planNo, @@ -178,6 +191,7 @@ export function useRoofAllocationSetting(id) { roofsData: roofsArray, selectedRoofMaterial: selectRoofs.find((roof) => roof.selected), }) + setBasicInfo({ planNo: '' + res[0].planNo, roofSizeSet: '' + res[0].roofSizeSet, @@ -220,12 +234,17 @@ export function useRoofAllocationSetting(id) { //Recoil 설정 //setCanvasSetting({ ...basicSetting }) - fetchBasicSettings(basicSetting.planNo, null) + + /** 배치면 초기설정 조회 */ + fetchBasicSettings(basicSetting.planNo) } catch (error) { swalFire({ text: error.message, icon: 'error' }) } } + /** + * 지붕재 추가 + */ const onAddRoofMaterial = () => { if (currentRoofList.length >= 4) { swalFire({ type: 'alert', icon: 'error', text: getMessage('지붕재는 4개까지 선택 가능합니다.') }) @@ -243,6 +262,9 @@ export function useRoofAllocationSetting(id) { ]) } + /** + * 지붕재 삭제 + */ const onDeleteRoofMaterial = (idx) => { const isSelected = currentRoofList[idx].selected const newRoofList = JSON.parse(JSON.stringify(currentRoofList)).filter((_, index) => index !== idx) @@ -292,6 +314,9 @@ export function useRoofAllocationSetting(id) { closeAll() } + /** + * 지붕면 할당 + */ const handleAlloc = () => { if (!checkInnerLines()) { apply() @@ -304,6 +329,9 @@ export function useRoofAllocationSetting(id) { } } + /** + * 실측값 없는 경우 체크 + */ const checkInnerLines = () => { const roofBases = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) // roofPolygon.innerLines let result = false @@ -327,6 +355,9 @@ export function useRoofAllocationSetting(id) { return result } + /** + * 지붕면 할당 + */ const apply = () => { const roofBases = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF && !obj.roofMaterial) const wallLines = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.WALL) @@ -340,6 +371,8 @@ export function useRoofAllocationSetting(id) { } catch (e) { return } + + /** 라인 삭제 */ roofBase.innerLines.forEach((line) => { canvas.remove(line) }) @@ -347,10 +380,12 @@ export function useRoofAllocationSetting(id) { canvas.remove(roofBase) }) + /** 벽면 삭제 */ wallLines.forEach((wallLine) => { canvas.remove(wallLine) }) + /** 데이터 설정 */ const newRoofList = currentRoofList.map((roof, idx) => { return { ...roof, index: idx, ...basicInfo } }) @@ -370,6 +405,8 @@ export function useRoofAllocationSetting(id) { roof.set({ isFixed: true, }) + + /** 모양 패턴 설정 */ setSurfaceShapePattern( roof, roofDisplay.column, @@ -379,6 +416,7 @@ export function useRoofAllocationSetting(id) { drawDirectionArrow(roof) }) + /** 외곽선 삭제 */ const removeTargets = canvas.getObjects().filter((obj) => obj.name === 'outerLinePoint' || obj.name === 'outerLine') removeTargets.forEach((obj) => { canvas.remove(obj) @@ -387,9 +425,13 @@ export function useRoofAllocationSetting(id) { closeAll() setSelectedMenu('surface') + /** 모듈 선택 데이터 초기화 */ modifyModuleSelectionData() } + /** + * 라인 사이즈 설정 + */ const setLineSize = (id, size) => { const roofBases = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) roofBases.forEach((roof) => { @@ -452,6 +494,9 @@ export function useRoofAllocationSetting(id) { setCurrentRoofList(newRoofList) } + /** + * 레이아웃 변경 + */ const handleChangeLayout = (layoutValue, index) => { const newRoofList = currentRoofList.map((roof, idx) => { if (idx === index) { @@ -463,6 +508,9 @@ export function useRoofAllocationSetting(id) { setCurrentRoofList(newRoofList) } + /** + * 치수 입력방법(복시도입력/실측값입력/육지붕) + */ const handleChangeInput = (e, type = '', index) => { const value = e.target.value const newRoofList = currentRoofList.map((roof, idx) => { @@ -475,6 +523,9 @@ export function useRoofAllocationSetting(id) { setCurrentRoofList(newRoofList) } + /** + * 피치 변경 + */ const handleChangePitch = (e, index) => { let value = e.target.value @@ -504,6 +555,9 @@ export function useRoofAllocationSetting(id) { } } + /** + * 모듈 선택 데이터 트리거 + */ const { trigger: moduleSelectedDataTrigger } = useCanvasPopupStatusController(2) return { diff --git a/src/store/settingAtom.js b/src/store/settingAtom.js index 0addc5c8..012e5bdc 100644 --- a/src/store/settingAtom.js +++ b/src/store/settingAtom.js @@ -1,8 +1,12 @@ import { atom, selector } from 'recoil' +/** + * 디스플레이 설정 + */ export const settingModalFirstOptionsState = atom({ key: 'settingModalFirstOptions', default: { + /** 디스플레이 설정 */ option1: [ { id: 1, column: 'allocDisplay', name: 'modal.canvas.setting.first.option.alloc', selected: true }, { id: 2, column: 'outlineDisplay', name: 'modal.canvas.setting.first.option.outline', selected: true }, @@ -15,6 +19,7 @@ export const settingModalFirstOptionsState = atom({ { id: 9, column: 'imageDisplay', name: 'modal.canvas.setting.first.option.image', selected: false }, { id: 10, column: 'totalDisplay', name: 'modal.canvas.setting.first.option.total', selected: true }, ], + /** 치수 표시 */ dimensionDisplay: [ { id: 1, @@ -25,6 +30,7 @@ export const settingModalFirstOptionsState = atom({ { id: 2, column: 'realDimension', name: 'modal.canvas.setting.first.option.real.dimension', selected: false }, { id: 3, column: 'noneDimension', name: 'modal.canvas.setting.first.option.none.dimension', selected: false }, ], + /** 화면 표시 */ option2: [ { id: 1, column: 'onlyBorder', name: 'modal.canvas.setting.first.option.border', selected: true }, { id: 2, column: 'lineHatch', name: 'modal.canvas.setting.first.option.line', selected: false }, @@ -34,15 +40,20 @@ export const settingModalFirstOptionsState = atom({ dangerouslyAllowMutability: true, }) +/** + * 디스플레이 설정 - 문자 표시 + */ export const settingModalSecondOptionsState = atom({ key: 'settingModalSecondOptions', default: { + /** 문자 표시 */ option3: [ { id: 1, name: 'modal.canvas.setting.font.plan.edit.word' }, { id: 2, name: 'modal.canvas.setting.font.plan.edit.flow' }, { id: 3, name: 'modal.canvas.setting.font.plan.edit.dimension' }, { id: 4, name: 'modal.canvas.setting.font.plan.edit.circuit.num' }, ], + /** 흡수범위 */ option4: [ { id: 1, @@ -77,6 +88,9 @@ export const settingModalSecondOptionsState = atom({ dangerouslyAllowMutability: true, }) +/** + * 디스플레이 설정 - 그리드 표시 + */ export const settingModalGridOptionsState = atom({ key: 'settingModalGridOptions', default: [ @@ -88,7 +102,9 @@ export const settingModalGridOptionsState = atom({ dangerouslyAllowMutability: true, }) -// 디스플레이 설정 - 할당 표시 +/** + * 디스플레이 설정 - 할당 표시 + */ export const allocDisplaySelector = selector({ key: 'allocDisplaySelector', get: ({ get }) => { @@ -97,7 +113,9 @@ export const allocDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 외벽선 표시 +/** + * 디스플레이 설정 - 외벽선 표시 + */ export const outlineDisplaySelector = selector({ key: 'outlineDisplaySelector', get: ({ get }) => { @@ -106,7 +124,9 @@ export const outlineDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 그리드 표시 +/** + * 디스플레이 설정 - 그리드 표시 + */ export const gridDisplaySelector = selector({ key: 'gridDisplaySelector', get: ({ get }) => { @@ -115,7 +135,9 @@ export const gridDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 지붕선 표시 +/** + * 디스플레이 설정 - 지붕선 표시 + */ export const roofLineDisplaySelector = selector({ key: 'lineDisplaySelector', get: ({ get }) => { @@ -124,7 +146,9 @@ export const roofLineDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 문자 표시 +/** + * 디스플레이 설정 - 문자 표시 + */ export const wordDisplaySelector = selector({ key: 'wordDisplaySelector', get: ({ get }) => { @@ -133,7 +157,9 @@ export const wordDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 회로번호 표시 +/** + * 디스플레이 설정 - 회로번호 표시 + */ export const circuitNumDisplaySelector = selector({ key: 'circuitNumDisplaySelector', get: ({ get }) => { @@ -142,7 +168,9 @@ export const circuitNumDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 흐름 방향 표시 +/** + * 디스플레이 설정 - 흐름 방향 표시 + */ export const flowDisplaySelector = selector({ key: 'flowDisplaySelector', get: ({ get }) => { @@ -151,7 +179,9 @@ export const flowDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 가대 표시 +/** + * 디스플레이 설정 - 가대 표시 + */ export const trestleDisplaySelector = selector({ key: 'trestleDisplaySelector', get: ({ get }) => { @@ -160,7 +190,9 @@ export const trestleDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 이미지 표시 +/** + * 디스플레이 설정 - 이미지 표시 + */ export const imageDisplaySelector = selector({ key: 'imageDisplaySelector', get: ({ get }) => { @@ -169,7 +201,9 @@ export const imageDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 집계표 표시 +/** + * 디스플레이 설정 - 집계표 표시 + */ export const totalDisplaySelector = selector({ key: 'totalDisplaySelector', get: ({ get }) => { @@ -178,7 +212,9 @@ export const totalDisplaySelector = selector({ }, }) -// 디스플레이 설정 - 치수 표시 +/** + * 디스플레이 설정 - 치수 표시 + */ export const corridorDimensionSelector = selector({ key: 'corridorDimensionSelector', get: ({ get }) => { @@ -188,7 +224,9 @@ export const corridorDimensionSelector = selector({ dangerouslyAllowMutability: true, }) -// 디스플레이 설정 - 화면 표시 +/** + * 디스플레이 설정 - 화면 표시 + */ export const roofDisplaySelector = selector({ key: 'roofDisplaySelector', get: ({ get }) => { @@ -198,29 +236,39 @@ export const roofDisplaySelector = selector({ dangerouslyAllowMutability: true, }) +/** + * basicSetting 설정 + */ export const basicSettingState = atom({ key: 'basicSettingState', default: { - roofSizeSet: 1, - roofAngleSet: 'slope', - selectedRoofMaterial: {}, // 선택된 지붕재 - roofs: [], // 지붕면 할당에서 추가된 지붕재 목록 + roofSizeSet: 1 /** 지붕크기 */, + roofAngleSet: 'slope' /** 지붕각도 */, + selectedRoofMaterial: {} /** 선택된 지붕재 */, + roofs: [] /** 지붕면 할당에서 추가된 지붕재 목록 */, }, dangerouslyAllowMutability: true, }) +/** + * 지붕면 할당에서 추가된 지붕재 목록 + */ export const addedRoofsState = atom({ key: 'addedRoofsState', default: [], }) -// db에 등록된 지붕재 목록 +/** + * db에 등록된 지붕재 목록 + */ export const roofMaterialsAtom = atom({ key: 'roofMaterialState', default: [], }) -//현재 선택된 지붕재 +/** + * 현재 선택된 지붕재 + */ export const selectedRoofMaterialSelector = selector({ key: 'selectedRoofMaterialSelector', get: ({ get }) => { @@ -228,7 +276,9 @@ export const selectedRoofMaterialSelector = selector({ }, }) -// QSelectBox에서 사용할 지붕재 목록 +/** + * QSelectBox에서 사용할 지붕재 목록 + */ export const roofMaterialsSelector = selector({ key: 'roofMaterialsSelector', get: ({ get }) => { @@ -245,6 +295,9 @@ export const correntObjectNoState = atom({ default: '', }) +/** + * 지붕재 목록 조회 여부 + */ export const fetchRoofMaterialsState = atom({ key: 'fetchRoofMaterialsState', default: false,
名称昇圧回路数{getMessage('modal.circuit.trestle.setting.power.conditional.select.name')} {getMessage('modal.circuit.trestle.setting.step.up.allocation.circuit.amount')}