From a183453390d9c6d1f8f1ba1c69e5000a226231a2 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Wed, 10 Sep 2025 14:33:53 +0900 Subject: [PATCH 1/3] =?UTF-8?q?A,B=ED=83=80=EC=9E=85=20=EC=A7=80=EB=B6=95?= =?UTF-8?q?=20=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePolygon.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index a1cbc4f0..2ae37440 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -852,7 +852,10 @@ export const usePolygon = () => { if (checkLineOverlap(innerLine, polygonLine)) { // innerLine의 type을 polygonLine의 type으로 변경 if (innerLine.attributes && polygonLine.attributes.type) { - // polygonLine.need = false + // innerLine이 polygonLine보다 긴 경우 polygonLine.need를 false로 변경 + if (polygonLine.length < innerLine.length) { + polygonLine.need = false + } innerLine.attributes.planeSize = innerLine.attributes.planeSize ?? polygonLine.attributes.planeSize innerLine.attributes.actualSize = innerLine.attributes.actualSize ?? polygonLine.attributes.actualSize innerLine.attributes.type = polygonLine.attributes.type @@ -1008,6 +1011,9 @@ export const usePolygon = () => { /*const originInnerStroke = innerLine.stroke innerLine.set({ stroke: 'red' }) canvas.renderAll()*/ + if (checkLineOverlap(line, innerLine)) { + return + } if (isPointOnLine(line, innerLine.startPoint)) { canvas.renderAll() if (isSamePoint(line.startPoint, innerLine.startPoint) || isSamePoint(line.endPoint, innerLine.startPoint)) { -- 2.47.2 From 3811f224d6952d28d4d4074e555190ba2612ba6c Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Wed, 10 Sep 2025 17:51:07 +0900 Subject: [PATCH 2/3] =?UTF-8?q?plan=20=EC=A0=80=EC=9E=A5=20=EC=A0=84=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=ED=95=9C=20setupsurface=20=EC=84=A0=ED=83=9D?= =?UTF-8?q?=EB=90=9C=20=EA=B2=BD=EC=9A=B0=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePlan.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index ba8776d4..cdb02fef 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -173,6 +173,13 @@ export function usePlan(params = {}) { * @param {boolean} saveAlert - 저장 완료 알림 표시 여부 */ const saveCanvas = async (saveAlert = true) => { + // 저장 전 선택되어 있는 object 제거 + const setupSurfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) + + setupSurfaces.forEach((surface) => { + surface.set({ fill: 'rgba(255,255,255,0.1)', strokeDashArray: [10, 4], strokeWidth: 1 }) + }) + const canvasStatus = currentCanvasData('save') const result = await putCanvasStatus(canvasStatus, saveAlert) //캔버스 저장 완료 후 -- 2.47.2 From 0666612c0a14d496e9107eecf6583eda00866ad8 Mon Sep 17 00:00:00 2001 From: ysCha Date: Wed, 10 Sep 2025 18:21:30 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[1216]=20=EB=AA=A8=EB=93=88=EC=97=90=20?= =?UTF-8?q?=EC=8B=9C=EB=A6=AC=EC=A6=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/basic/step/Orientation.jsx | 131 ++++++++++++++++-- src/locales/ja.json | 2 + src/locales/ko.json | 4 +- 3 files changed, 127 insertions(+), 10 deletions(-) diff --git a/src/components/floor-plan/modal/basic/step/Orientation.jsx b/src/components/floor-plan/modal/basic/step/Orientation.jsx index 14618a20..c5427d3b 100644 --- a/src/components/floor-plan/modal/basic/step/Orientation.jsx +++ b/src/components/floor-plan/modal/basic/step/Orientation.jsx @@ -7,16 +7,21 @@ import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' import QSelectBox from '@/components/common/select/QSelectBox' import { roofsState } from '@/store/roofAtom' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' +import { useCommonCode } from '@/hooks/common/useCommonCode' import Swal from 'sweetalert2' import { normalizeDecimal} from '@/util/input-utils' export const Orientation = forwardRef((props, ref) => { const { getMessage } = useMessage() + const { findCommonCode } = useCommonCode() const [hasAnglePassivity, setHasAnglePassivity] = useState(false) const basicSetting = useRecoilValue(basicSettingState) const [addedRoofs, setAddedRoofs] = useRecoilState(addedRoofsState) //지붕재 선택 const [roofsStore, setRoofsStore] = useRecoilState(roofsState) const [roofTab, setRoofTab] = useState(0) //지붕재 탭 + const [selectedModuleSeries, setSelectedModuleSeries] = useState(null) + const [moduleSeriesList, setModuleSeriesList] = useState([]) + const [filteredModuleList, setFilteredModuleList] = useState([]) const { roofs, setRoofs, @@ -80,9 +85,20 @@ export const Orientation = forwardRef((props, ref) => { useEffect(() => { if (selectedModules) { - setSelectedModules(moduleList.find((module) => module.itemId === selectedModules.itemId)) + const foundModule = moduleList.find((module) => module.itemId === selectedModules.itemId) + if (foundModule) { + setSelectedModules(foundModule) + + // 선택된 모듈의 시리즈로 업데이트 (시리즈 목록이 있는 경우에만) + if (moduleSeriesList.length > 0 && foundModule.moduleSerCd) { + const currentSeries = moduleSeriesList.find(series => series.moduleSerCd === foundModule.moduleSerCd) + if (currentSeries && (!selectedModuleSeries || selectedModuleSeries.moduleSerCd !== currentSeries.moduleSerCd)) { + setSelectedModuleSeries(currentSeries) + } + } + } } - }, [selectedModules]) + }, [selectedModules, moduleList, moduleSeriesList]) useEffect(() => { if (selectedSurfaceType) { @@ -206,6 +222,31 @@ export const Orientation = forwardRef((props, ref) => { return true } + const handleChangeModuleSeries = (e) => { + resetRoofs() + setSelectedModuleSeries(e) + + // 선택된 시리즈에 맞는 모듈 목록 필터링 및 첫 번째 모듈 선택 + if (e && moduleList.length > 0) { + let filtered + + if (e.moduleSerCd === 'ALL') { + // "전체" 선택 시 모든 모듈 표시 + filtered = moduleList + } else { + // 특정 시리즈 선택 시 해당 시리즈 모듈만 표시 + filtered = moduleList.filter(module => module.moduleSerCd === e.moduleSerCd) + } + + setFilteredModuleList(filtered) + + // 필터링된 목록의 첫 번째 모듈을 자동 선택 + if (filtered.length > 0) { + setSelectedModules(filtered[0]) + } + } + } + const handleChangeModule = (e) => { resetRoofs() setSelectedModules(e) @@ -264,12 +305,69 @@ export const Orientation = forwardRef((props, ref) => { setRoofsStore(newRoofs) } + // 모듈시리즈 목록 생성 및 commonCode와 매핑 useEffect(() => { - // 컴포넌트가 마운트될 때 selectedModules가 없으면 handleChangeModule 호출 - if (moduleList.length > 0 && (!selectedModules || !selectedModules.itemId)) { - handleChangeModule(moduleList[0]); + if (moduleList.length > 0 && moduleSeriesList.length === 0) { + const moduleSeriesCodes = findCommonCode(207100) || [] + + // moduleList에서 고유한 moduleSerCd 추출 + const uniqueSeriesCd = [...new Set(moduleList.map(module => module.moduleSerCd).filter(Boolean))] + + if (uniqueSeriesCd.length > 0) { + // moduleSerCd와 commonCode를 매핑하여 기본 moduleSeriesList 생성 + const mappedSeries = uniqueSeriesCd.map(serCd => { + const matchedCode = moduleSeriesCodes.find(code => code.clCode === serCd) + return { + moduleSerCd: serCd, + moduleSerNm: matchedCode ? matchedCode.clCodeNm : serCd + } + }) + + // "전체" 옵션을 맨 앞에 추가 + const allOption = { + moduleSerCd: 'ALL', + moduleSerNm: getMessage("board.sub.total") || 'ALL' + } + + const seriesList = [allOption, ...mappedSeries] + setModuleSeriesList(seriesList) + + // 현재 선택된 모듈이 있으면 해당 모듈의 시리즈를 찾아서 선택 + if (selectedModules && selectedModules.moduleSerCd) { + const currentSeries = seriesList.find(series => series.moduleSerCd === selectedModules.moduleSerCd) + if (currentSeries) { + setSelectedModuleSeries(currentSeries) + } else { + setSelectedModuleSeries(allOption) + } + } else { + // 선택된 모듈이 없으면 "전체"를 기본 선택 + setSelectedModuleSeries(allOption) + } + } } - }, [moduleList]); // 빈 의존성 배열로 마운트 시 한 번만 실행 + }, [moduleList, selectedModules]) + + // 초기 로딩 시에만 필터링된 모듈 목록 설정 + useEffect(() => { + if (moduleList.length > 0 && filteredModuleList.length === 0 && selectedModuleSeries) { + let filtered + + if (selectedModuleSeries.moduleSerCd === 'ALL') { + // "전체" 선택 시 모든 모듈 표시 + filtered = moduleList + } else { + // 특정 시리즈 선택 시 해당 시리즈 모듈만 표시 + filtered = moduleList.filter(module => module.moduleSerCd === selectedModuleSeries.moduleSerCd) + } + + setFilteredModuleList(filtered) + + if (filtered.length > 0 && !selectedModules) { + setSelectedModules(filtered[0]) + } + } + }, [moduleList, selectedModuleSeries]); return ( <>
@@ -336,11 +434,26 @@ export const Orientation = forwardRef((props, ref) => {
- {getMessage('modal.module.basic.setting.module.setting')} + {getMessage('modal.module.basic.setting.module.series.setting')}
- {moduleList && ( + {moduleSeriesList.length > 0 && ( handleChangeModuleSeries(e)} + /> + )} +
+
+
+ {getMessage('modal.module.basic.setting.module.setting2')} +
+ {filteredModuleList && ( +