From e9bee48e2869e1b9d5f011e170398e76186d6f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=8B=9D?= <43837214+Minsiki@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:01:58 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=EC=88=98=EB=8F=99=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EB=8B=A4=EA=B5=AD=EC=96=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ja.json | 2 ++ src/locales/ko.json | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/locales/ja.json b/src/locales/ja.json index 0514e960..225b8b34 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -153,7 +153,9 @@ "modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num": "設定する回路番号(1~)", "modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.info": "標準回路{0}章~{1}章", "modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset": "選択したパワーコンディショナーの回路番号の初期化", + "modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset.info": "선택된 파워 컨디셔너의 회로할당을 초기화합니다.(JA)", "modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset": "すべての回路番号の初期化", + "modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset.info": "회로 할당의 설정을 초기화합니다.(JA)", "modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num.fix": "番号確定", "modal.circuit.trestle.setting.step.up.allocation": "昇圧設定", "modal.circuit.trestle.setting.step.up.allocation.serial.amount": "シリアル枚数", diff --git a/src/locales/ko.json b/src/locales/ko.json index e6d5290a..b74bcd0f 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -153,7 +153,9 @@ "modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num": "설정할 회로번호(1~)", "modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.info": "표준회로{0}장~{1}장", "modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset": "선택된 파워컨디셔너의 회로번호 초기화", + "modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset.info": "선택된 파워 컨디셔너의 회로할당을 초기화합니다.", "modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset": "모든 회로번호 초기화", + "modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset.info": "회로 할당의 설정을 초기화합니다.", "modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num.fix": "번호 확정", "modal.circuit.trestle.setting.step.up.allocation": "승압 설정", "modal.circuit.trestle.setting.step.up.allocation.serial.amount": "직렬매수", From 88db95406b27c989909fc7414318a6f662ac055d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=8B=9D?= <43837214+Minsiki@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:02:48 +0900 Subject: [PATCH 2/9] =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EB=B0=B0=EC=B9=98=20?= =?UTF-8?q?=ED=9B=84=20'=EB=AA=A8=EB=93=88/=EA=B0=80=EB=8C=80=EC=84=A4?= =?UTF-8?q?=EC=A0=95'=20=EC=A7=84=EC=9E=85=EC=8B=9C=20'=EB=AA=A8=EB=93=88?= =?UTF-8?q?=20=EB=B0=B0=EC=B9=98'=20=ED=83=AD=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/basic/BasicSetting.jsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 51620935..a34fe3f8 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -6,7 +6,7 @@ import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchMod import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement' import Placement from '@/components/floor-plan/modal/basic/step/Placement' import { useRecoilValue, useRecoilState } from 'recoil' -import { canvasSettingState, isManualModuleSetupState } from '@/store/canvasAtom' +import { canvasSettingState, canvasState, isManualModuleSetupState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' @@ -19,6 +19,7 @@ import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupSta import { useMasterController } from '@/hooks/common/useMasterController' import { loginUserStore } from '@/store/commonAtom' import { currentCanvasPlanState } from '@/store/canvasAtom' +import { POLYGON_TYPE } from '@/common/common' export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() @@ -32,6 +33,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const addedRoofs = useRecoilValue(addedRoofsState) const loginUserState = useRecoilValue(loginUserStore) const currentCanvasPlan = useRecoilValue(currentCanvasPlanState) + const canvas = useRecoilValue(canvasState) // const { initEvent } = useContext(EventContext) const { manualModuleSetup, autoModuleSetup, manualFlatroofModuleSetup, autoFlatroofModuleSetup } = useModuleBasicSetting(1) @@ -88,6 +90,17 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const res = await updateObjectDate(params) } + useEffect(() => { + let hasModules = canvas + .getObjects() + .filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) + .some((obj) => obj.modules?.length > 0) + + if (hasModules) { + setTabNum(3) + } + }, []) + return (
From 871ac6bc2c7bc657e79bc33cdc807a51778a3b15 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 6 Feb 2025 17:48:01 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=EC=99=B8=EB=B2=BD=EC=84=A0=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=EA=B2=BD=EC=9A=B0=20=EC=A7=80=EB=B6=95=ED=98=95?= =?UTF-8?q?=EC=83=81=20=EC=84=A4=EC=A0=95=20=EC=95=88=EB=90=98=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useRoofShapeSetting.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hooks/roofcover/useRoofShapeSetting.js b/src/hooks/roofcover/useRoofShapeSetting.js index 3bd89625..8ccd4b07 100644 --- a/src/hooks/roofcover/useRoofShapeSetting.js +++ b/src/hooks/roofcover/useRoofShapeSetting.js @@ -167,9 +167,14 @@ export function useRoofShapeSetting(id) { ] const handleSave = () => { - let outerLines + let outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine' && obj.visible) let direction + if (outerLines.length < 2) { + swalFire({ text: '외벽선이 없습니다.', icon: 'error' }) + return + } + switch (shapeNum) { case 1: { outerLines = saveRidge() From 8f1710e3dc9e30a254e420c28f83f9af9a32fe04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=8B=9D?= <43837214+Minsiki@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:53:58 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=EB=A9=80=ED=8B=B0=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EC=A7=91=EA=B3=84=ED=91=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../circuitTrestle/CircuitTrestleSetting.jsx | 1 + .../step/PowerConditionalSelect.jsx | 9 +- .../modal/circuitTrestle/step/StepUp.jsx | 7 ++ .../step/type/PassivityCircuitAllocation.jsx | 106 +----------------- src/hooks/module/useModule.js | 10 +- 5 files changed, 25 insertions(+), 108 deletions(-) diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index 31f3aaa4..427631c0 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -500,6 +500,7 @@ export default function CircuitTrestleSetting({ id }) { selectedModels, setSelectedModels, managementState, + getUseModuleItemList, } // 수동할당 컴포넌트 속성 diff --git a/src/components/floor-plan/modal/circuitTrestle/step/PowerConditionalSelect.jsx b/src/components/floor-plan/modal/circuitTrestle/step/PowerConditionalSelect.jsx index 6b049002..715d3884 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/PowerConditionalSelect.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/PowerConditionalSelect.jsx @@ -27,6 +27,7 @@ export default function PowerConditionalSelect(props) { selectedModels, setSelectedModels, managementState, + getUseModuleItemList, } = props const [pcsCheck, setPcsCheck] = useRecoilState(pcsCheckState) @@ -159,8 +160,14 @@ export default function PowerConditionalSelect(props) { setModels([]) setSelectedModels([]) setSelectedMaker(option) + console.log('option', option) + getUseModuleItemList + const param = { + pcsMkrCd: option.pcsMkrCd, + mixMatlNo: getUseModuleItemList()[0].mixMatlNo, + } - getPcsMakerList(option).then((res) => { + getPcsMakerList(param).then((res) => { setSeries( res.data.map((series) => { return { ...series, selected: false } diff --git a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx index a7e8932e..ec5f554f 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx @@ -350,6 +350,12 @@ export default function StepUp(props) { return module.id }) + targetSurface.modules.map((module) => { + module.circuit = null + module.circuitNumber = null + module.pcsItemId = null + }) + // 모듈 목록 삭제 canvas .getObjects() @@ -363,6 +369,7 @@ export default function StepUp(props) { roofSurface.moduleList.forEach((module) => { const targetModule = canvas.getObjects().filter((obj) => obj.id === module.uniqueId)[0] + if (module.circuit === '') return const moduleCircuitText = new fabric.Text(module.circuit, { left: targetModule.left + targetModule.width / 2, top: targetModule.top + targetModule.height / 2, diff --git a/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx b/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx index 1c5595a6..c20c995b 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx @@ -33,9 +33,6 @@ export default function PassivityCircuitAllocation(props) { const isDisplayCircuitNumber = useRecoilValue(circuitNumDisplaySelector) useEffect(() => { - console.log('header, rows', header, rows) - console.log('selectedModels', selectedModels) - // setSurfaceInfo() setModuleStatisticsData() if (!managementState) { setManagementState(managementStateLoaded) @@ -78,80 +75,6 @@ export default function PassivityCircuitAllocation(props) { canvas.renderAll() } - const setSurfaceInfo = () => { - const surfaces = canvas.getObjects().filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name) - // setHeaders([header[0], { name: '회로', prop: 'circuit' }, ...header.slice(1)]) - // setRows( - // rows.map((row) => { - // return { - // ...row, - // circuit: '', - // } - // }), - // ) - // let totals = {} - - // rows.forEach((row) => { - // if (header.length === 4) { - // if (!totals[header[2].prop]) totals[header[2].prop] = 0 - // totals[header[2].prop] += +row[header[2].prop] - // } else if (header.length === 5) { - // if (!totals[header[2].prop]) totals[header[2].prop] = 0 - // totals[header[2].prop] += +row[header[2].prop] - // if (!totals[header[3].prop]) totals[header[3].prop] = 0 - // totals[header[3]] += +row[header[3]] - // } - // }) - // setFooter([ - // ...['합계', ''], - // ...Object.keys(totals).map((key) => { - // return totals[key] - // }), - // Object.keys(totals).reduce((acc, key) => { - // return acc + totals[key] - // }, 0), - // ]) - // let totalWpout = 0 - // const rows = surfaces.map((surface) => { - // let wpOut = 0 - // let moduleInfo = {} - // surface.modules.forEach((module) => { - // wpOut += +module.moduleInfo.wpOut - // if (!moduleInfo[module.moduleInfo.itemId]) moduleInfo[module.moduleInfo.itemId] = 0 - // moduleInfo[module.moduleInfo.itemId]++ - // }) - // totalWpout += wpOut - // console.log('🚀 ~ moduleData.rows=surfaces.map ~ module:', module) - // return { - // roofShape: DIRECTION[surface.direction], - // powerGeneration: wpOut.toLocaleString('ko-KR', { maximumFractionDigits: 4 }), - // ...moduleInfo, - // } - // }) - - // setTotalWpout(totalWpout) - // 지붕면 리스트 -> 지붕면에 있는 모듈 리스트 -> 발전량 총합 계산 - // wpOut - - // setModuleData({ - // header: [ - // { name: getMessage('modal.panel.batch.statistic.roof.shape'), prop: 'roofShape' }, - // { name: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.circuit'), prop: 'circuit' }, - // ...selectedModules.itemList.map((module) => { - // return { - // name: module.itemNm, - // prop: module.itemId, - // } - // }), - // { - // name: `${getMessage('modal.panel.batch.statistic.power.generation.amount')}(kW)`, - // prop: 'powerGeneration', - // }, - // ], - // rows: rows, - // }) - } - const handleCircuitNumberFix = () => { let uniqueCircuitNumbers = [ ...new Set( @@ -177,6 +100,7 @@ export default function PassivityCircuitAllocation(props) { return } else if (selectedModels.length > 1) { let result = false + uniqueCircuitNumbers.forEach((number) => { if ( number.split('-')[1] === circuitNumber + ')' && @@ -229,20 +153,14 @@ export default function PassivityCircuitAllocation(props) { setSelectedPcs(tempSelectedPcs) canvas.add(moduleCircuitText) }) - console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels) - // let pcsList = [...selectedModels.map((model) => ({ ...model }))] - let pcsList = JSON.parse(JSON.stringify(selectedModels)) - pcsList = pcsList.map((model) => { - console.log('🚀 ~ handleCircuitNumberFix ~ pcsList:', pcsList) + let pcsList = JSON.parse(JSON.stringify(selectedModels)).map((model) => { if (model.id === selectedPcs.id) { model.isUsed = true } return model }) - console.log('🚀 ~ handleCircuitNumberFix ~ pcsList:', pcsList) - const roofSurfaceList = canvas .getObjects() .filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name && obj?.modules.length > 0) @@ -261,7 +179,6 @@ export default function PassivityCircuitAllocation(props) { } }) - console.log('uniqueCircuitNumbers', uniqueCircuitNumbers) const usedPcses = pcsList.filter((model) => model.isUsed) const pcsItemList = usedPcses.map((model, index) => { return { @@ -289,7 +206,6 @@ export default function PassivityCircuitAllocation(props) { } getPcsManualConfChk(params).then((res) => { - console.log('targetModules', targetModules) if (res.resultCode === 'E') { swalFire({ text: res.resultMsg, @@ -321,8 +237,6 @@ export default function PassivityCircuitAllocation(props) { setModuleStatisticsData() }) } - console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels) - console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels) const getCircuitNumber = () => { if (selectedModels.length === 1) { @@ -334,7 +248,7 @@ export default function PassivityCircuitAllocation(props) { const initSelectedPcsCircuitNumber = () => { swalFire({ - title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.init.info'), + title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.selected.power.conditional.reset.info'), type: 'confirm', icon: 'warning', confirmFn: () => { @@ -355,7 +269,7 @@ export default function PassivityCircuitAllocation(props) { const initAllPcsCircuitNumber = () => { canvas.discardActiveObject() swalFire({ - title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.init.setting.info'), + title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset.info'), type: 'confirm', icon: 'warning', confirmFn: () => { @@ -444,18 +358,6 @@ export default function PassivityCircuitAllocation(props) {
))} - {/*
- - -
-
- - -
-
- - -
*/} diff --git a/src/hooks/module/useModule.js b/src/hooks/module/useModule.js index e468b6c7..2018d0fc 100644 --- a/src/hooks/module/useModule.js +++ b/src/hooks/module/useModule.js @@ -1010,10 +1010,10 @@ export function useModule() { wpOut: 0, circuits: { wpOut: 0 }, } + } - if (!surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]) { - surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId] = 0 - } + if (!surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]) { + surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId] = 0 } surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]++ surfaceObjects[surface.id].circuits[module.circuitNumber].circuits.wpOut += +module.moduleInfo.wpOut @@ -1027,7 +1027,7 @@ export function useModule() { let tempRow = { name: surfaceObjects[key].roofSurface, circuit: surfaceObjects[key].circuit, - wpOut: parseInt((surfaceObjects[key].wpOut / 1000).toFixed(3)), + wpOut: parseFloat(surfaceObjects[key].wpOut / 1000), } selectedModules.itemList.forEach((module) => { tempRow[module.itemId] = surfaceObjects[key][module.itemId] @@ -1038,7 +1038,7 @@ export function useModule() { let row = { name: surfaceObjects[key].roofSurface, circuit: surfaceObjects[key].circuits[circuit].circuit, - wpOut: parseInt((surfaceObjects[key].circuits[circuit].circuits.wpOut / 1000).toFixed(3)), + wpOut: parseFloat(surfaceObjects[key].circuits[circuit].circuits.wpOut / 1000), } selectedModules.itemList.forEach((module) => { row[module.itemId] = surfaceObjects[key].circuits[circuit].circuits[module.itemId] From 039374f71792705ceaaac6e5ee634ac8005e1451 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 6 Feb 2025 17:55:28 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=99=94=EB=A9=B4=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=EB=B6=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ja.json | 1 + src/locales/ko.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/locales/ja.json b/src/locales/ja.json index 0514e960..b6d0e154 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -877,6 +877,7 @@ "estimate.detail.roofCns": "屋根材・仕様施工", "estimate.detail.remarks": "備考", "estimate.detail.fileFlg": "後日資料提出", + "estimate.detail.dragFileGuide": "(※北面設置の場合、ファイル添付が必須です.)", "estimate.detail.header.fileList1": "ファイル添付", "estimate.detail.fileList.btn": "ファイル選択", "estimate.detail.fileList.extCheck": "画像ファイルのみ添付可能です。", diff --git a/src/locales/ko.json b/src/locales/ko.json index e6d5290a..7f03ba24 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -877,6 +877,7 @@ "estimate.detail.roofCns": "지붕재・사양시공", "estimate.detail.remarks": "비고", "estimate.detail.fileFlg": "후일자료제출", + "estimate.detail.dragFileGuide": "(※ 북면설치인 경우, 파일 첨부가 필수입니다.)", "estimate.detail.header.fileList1": "파일첨부", "estimate.detail.fileList.btn": "파일선택", "estimate.detail.fileList.extCheck": "이미지 파일만 첨부 가능합니다.", From 53344f1788850ceb15159b0a0414996e53496026 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 6 Feb 2025 18:00:20 +0900 Subject: [PATCH 6/9] =?UTF-8?q?#598=20=EC=9D=B4=EC=A0=84=20=EB=AC=BC?= =?UTF-8?q?=EA=B1=B4=EC=A0=95=EB=B3=B4=EC=97=90=EC=84=9C=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A0=20=EB=8F=84=EB=A9=B4=EB=8D=B0=EC=9D=B4=ED=83=80?= =?UTF-8?q?=EA=B0=80=20=EC=83=88=EB=A1=9C=EC=9A=B4=20=EB=AC=BC=EA=B1=B4?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EB=A1=9C=20=EB=A7=8C=EB=93=A0=20=ED=9B=84=20?= =?UTF-8?q?=ED=94=8C=EB=9E=9C1=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=B4?= =?UTF-8?q?=EB=8F=84=20=EC=9E=90=EB=8F=99=EC=9C=BC=EB=A1=9C=20=EA=B3=84?= =?UTF-8?q?=EC=86=8D=20=EB=85=B8=EC=B6=9C=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePlan.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index 2bb37a1e..04bb983f 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -3,7 +3,7 @@ import { useContext, useEffect, useState } from 'react' import { usePathname, useRouter, useSearchParams } from 'next/navigation' -import { useRecoilState } from 'recoil' +import { useRecoilState, useResetRecoilState } from 'recoil' import { canvasState, currentCanvasPlanState, plansState } from '@/store/canvasAtom' import { useAxios } from '@/hooks/useAxios' @@ -14,6 +14,8 @@ import { SAVE_KEY } from '@/common/common' import { readImage, removeImage } from '@/lib/fileAction' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' +import { outerLinePointsState } from '@/store/outerLineAtom' +import { placementShapeDrawingPointsState } from '@/store/placementShapeDrawingAtom' export function usePlan(params = {}) { const { floorPlanState } = useContext(FloorPlanContext) @@ -33,6 +35,10 @@ export function usePlan(params = {}) { const { get, promisePost, promisePut, promiseDel, promiseGet } = useAxios() const { setEstimateContextState } = useEstimateController() + + const resetOuterLinePoints = useResetRecoilState(outerLinePointsState) + const resetPlacementShapeDrawingPoints = useResetRecoilState(placementShapeDrawingPointsState) + /** * 마우스 포인터의 가이드라인을 제거합니다. */ @@ -284,6 +290,8 @@ export function usePlan(params = {}) { } else { if (!currentCanvasPlan || currentCanvasPlan.id !== newCurrentId) { await saveCanvas(true) + + clearRecoilState() } setCurrentCanvasPlan(plans.find((plan) => plan.id === newCurrentId)) setPlans((plans) => plans.map((plan) => ({ ...plan, isCurrent: plan.id === newCurrentId }))) @@ -296,6 +304,12 @@ export function usePlan(params = {}) { // setBgImage() }, [currentCanvasPlan]) + const clearRecoilState = () => { + //clear가 필요한 recoil state 관리 + resetOuterLinePoints() + resetPlacementShapeDrawingPoints() + } + const handleCurrentPlanUrl = () => { const currentPlan = plans.find((plan) => plan.isCurrent) // if (currentPlan) router.push(`${pathname}?pid=${currentPlan?.planNo}&objectNo=${floorPlanState?.objectNo}`) From 558da722152c5b9a844e9bd34fd00d087e926eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=8B=9D?= <43837214+Minsiki@users.noreply.github.com> Date: Thu, 6 Feb 2025 18:08:18 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=EB=8B=A8=EC=9C=84=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8(Unit=20Test)=20#608?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useRoofAllocationSetting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 550ce5f5..79e4d239 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -240,7 +240,7 @@ export function useRoofAllocationSetting(id) { const onDeleteRoofMaterial = (idx) => { const isSelected = currentRoofList[idx].selected - const newRoofList = [...currentRoofList].filter((_, index) => index !== idx) + const newRoofList = JSON.parse(JSON.stringify(currentRoofList)).filter((_, index) => index !== idx) if (isSelected) { newRoofList[0].selected = true } From 1e455c3fab75de04358fbd986cc4e545ee825556 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 6 Feb 2025 18:08:39 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EB=88=84=EB=9D=BD=EB=B6=84=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 1 + src/hooks/floorPlan/estimate/useEstimateController.js | 10 ++++++---- src/locales/ja.json | 1 + src/locales/ko.json | 1 + 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 18fd2343..01600c62 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -359,6 +359,7 @@ export default function Estimate({}) { docTpCd: estimateContextState?.estimateType, } + // console.log('param::::::::::', param) const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}` get({ url: apiUrl }).then((res) => { if (isNotEmptyArray(res?.data)) { diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 7654f3ba..74c35800 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -210,10 +210,12 @@ export const useEstimateController = (planNo) => { //새로 첨부한 파일이 없으면 //북면 먼저 체크 - if (estimateData?.northArrangement === '1') { - fileFlg = false - setIsGlobalLoading(false) - return swalFire({ text: getMessage('estimate.detail.save.requiredNorthArrangementFileUpload'), type: 'alert' }) + if (estimateData.fileFlg === '0') { + if (estimateData?.northArrangement === '1') { + fileFlg = false + setIsGlobalLoading(false) + return swalFire({ text: getMessage('estimate.detail.save.requiredNorthArrangementFileUpload'), type: 'alert' }) + } } if (estimateData.itemList.length > 1) { diff --git a/src/locales/ja.json b/src/locales/ja.json index 2dd2a719..3a25a063 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -945,6 +945,7 @@ "estimate.detail.save.alertMsg": "保存されました。見積書で製品を変更すると、図面や回路には反映されません。", "estimate.detail.copy.alertMsg": "コピーされました。", "estimate.detail.save.requiredFileUpload": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください。", + "estimate.detail.save.requiredNorthArrangementFileUpload": "北面にモジュールを配置した場合、北面配置許可書を必ず添付する必要があります.", "estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります。", "estimate.detail.save.requiredCharger": "担当者は必須です。", "estimate.detail.save.requiredObjectName": "案件名は必須です。", diff --git a/src/locales/ko.json b/src/locales/ko.json index a5675247..a4bfac39 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -945,6 +945,7 @@ "estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우 도면 및 회로에 반영되지 않습니다.", "estimate.detail.copy.alertMsg": "복사되었습니다.", "estimate.detail.save.requiredFileUpload": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.", + "estimate.detail.save.requiredNorthArrangementFileUpload": "북면에 모듈을 배치한 경우, 북면배치허가서를 반드시 첨부해야 합니다.", "estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.", "estimate.detail.save.requiredCharger": "담당자는 필수값 입니다.", "estimate.detail.save.requiredObjectName": "안건명은 필수값 입니다.", From a6c37cbb9458d12d12a7c73048d18c8389109000 Mon Sep 17 00:00:00 2001 From: changkyu choi Date: Thu, 6 Feb 2025 18:13:01 +0900 Subject: [PATCH 9/9] =?UTF-8?q?swalFire=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=ED=9A=8C=EB=A1=9C=ED=95=A0=EB=8B=B9=20?= =?UTF-8?q?=EC=8B=9C=20=ED=9A=8C=EB=A1=9C=EB=B2=88=ED=98=B8=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=ED=91=9C=EC=8B=9C=20=EC=84=A4=EC=A0=95=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/circuitTrestle/step/StepUp.jsx | 95 +++++++++++++------ 1 file changed, 67 insertions(+), 28 deletions(-) diff --git a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx index ec5f554f..804a2770 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx @@ -12,6 +12,7 @@ import { useMasterController } from '@/hooks/common/useMasterController' import { v4 as uuidv4 } from 'uuid' import { globalLocaleStore } from '@/store/localeAtom' import { POLYGON_TYPE } from '@/common/common' +import { useSwal } from '@/hooks/useSwal' import { circuitNumDisplaySelector } from '@/store/settingAtom' export default function StepUp(props) { @@ -28,6 +29,7 @@ export default function StepUp(props) { getModuleList, } = props const { getMessage } = useMessage() + const { swalFire } = useSwal() const globalLocale = useRecoilValue(globalLocaleStore) const [moduleTab, setModuleTab] = useState(1) const [moduleTabs, setModuleTabs] = useState({}) @@ -70,35 +72,73 @@ export default function StepUp(props) { ...props.getOptYn(), // 옵션 Y/N useModuleItemList: props.getUseModuleItemList(), // 사용된 모듈아이템 List roofSurfaceList: props.getRoofSurfaceList(), // 지붕면 목록 - pcsItemList: selectedModels.length === 0 ? props.getPcsItemList() : getSelectedPcsItemList(), // PCS 아이템 목록 + pcsItemList: props.getSelectedPcsItemList(), // PCS 아이템 목록 } - // 회로 구성 가능 여부 체크 - getPcsVoltageChk({ ...params, pcsItemList: getSelectedPcsItemList() }).then((res) => { - if (res.resultCode === 'S') { - // 회로 구성 가능 여부 체크 통과 시 승압설정 정보 조회 - getPcsVoltageStepUpList(params).then((res) => { - if (res?.result.code === 200 && res?.data) { - if (selectedModels.length === 0) { - setSelectedModels(res.data.pcsItemList) + // 회로 구성 가능 여부 체크 통과 시 승압설정 정보 조회 + getPcsVoltageStepUpList(params).then((res) => { + if (res.result.resultCode === 'S') { + if (res?.result.code === 200 && res?.data) { + const dataArray = Array.isArray(res.data) ? res.data : [res.data] + const stepUpListData = formatStepUpListData(dataArray) + + // PCS 승압설정 정보 SET + setStepUpListData(stepUpListData) + + // 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) { + selectedSerQty.roofSurfaceList.forEach((roofSurface) => { + 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().filter((obj) => obj.id === module.uniqueId)[0] + const moduleCircuitText = new fabric.Text(module.circuit, { + left: targetModule.left + targetModule.width / 2, + top: targetModule.top + targetModule.height / 2, + fill: 'black', + fontSize: 20, + width: targetModule.width, + height: targetModule.height, + textAlign: 'center', + originX: 'center', + originY: 'center', + name: 'circuitNumber', + parentId: targetModule.id, + circuitInfo: module.pcsItemId, + visible: isDisplayCircuitNumber, + }) + targetModule.circuit = moduleCircuitText + targetModule.pcsItemId = module.pcsItemId + targetModule.circuitNumber = module.circuit + canvas.add(moduleCircuitText) + }) + }) } - const dataArray = Array.isArray(res.data) ? res.data : [res.data] - const stepUpListData = formatStepUpListData(dataArray) + }) - // PCS 승압설정 정보 SET - setStepUpListData(stepUpListData) - - // PCS 옵션 조회 - const formattedOptCodes = formatOptionCodes(res.data.optionList) - setOptCodes(formattedOptCodes) - setSeletedOption(formattedOptCodes[0]) - } - }) - } else { - swalFire({ - title: res.resultMsg, - type: 'alert', - }) + canvas.renderAll() + } else { + swalFire({ + title: res.result.resultMsg, + type: 'alert', + }) + } } }) } catch (error) { @@ -170,7 +210,6 @@ export default function StepUp(props) { // Update res.data with modified pcsItemList res.data.pcsItemList = pcsItemListWithSerQty - setSelectedModels(pcsItemListWithSerQty) const dataArray = Array.isArray(res.data) ? res.data : [res.data] const stepUpListData = formatStepUpListData(dataArray) @@ -303,8 +342,8 @@ export default function StepUp(props) { // 선택된 행 정보 저장 setStepUpListData(tempStepUpListData) - console.log('🚀 ~ handleRowClick ~ tempStepUpListData:', tempStepUpListData) - console.log('🚀 ~ handleRowClick ~ selectedData:', selectedData) + // console.log('🚀 ~ handleRowClick ~ tempStepUpListData:', tempStepUpListData) + // console.log('🚀 ~ handleRowClick ~ selectedData:', selectedData) // 파워컨디셔너 옵션 조회 요청 파라미터 const params = {