Merge branch 'dev' into dev-yj

This commit is contained in:
yjnoh 2025-02-06 18:19:12 +09:00
commit c9696158e9
13 changed files with 144 additions and 146 deletions

View File

@ -359,6 +359,7 @@ export default function Estimate({}) {
docTpCd: estimateContextState?.estimateType, docTpCd: estimateContextState?.estimateType,
} }
// console.log('param::::::::::', param)
const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}` const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}`
get({ url: apiUrl }).then((res) => { get({ url: apiUrl }).then((res) => {
if (isNotEmptyArray(res?.data)) { if (isNotEmptyArray(res?.data)) {

View File

@ -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 PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement'
import Placement from '@/components/floor-plan/modal/basic/step/Placement' import Placement from '@/components/floor-plan/modal/basic/step/Placement'
import { useRecoilValue, useRecoilState } from 'recoil' import { useRecoilValue, useRecoilState } from 'recoil'
import { canvasSettingState, isManualModuleSetupState } from '@/store/canvasAtom' import { canvasSettingState, canvasState, isManualModuleSetupState } from '@/store/canvasAtom'
import { usePopup } from '@/hooks/usePopup' import { usePopup } from '@/hooks/usePopup'
import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation' import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation'
import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting'
@ -19,6 +19,7 @@ import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupSta
import { useMasterController } from '@/hooks/common/useMasterController' import { useMasterController } from '@/hooks/common/useMasterController'
import { loginUserStore } from '@/store/commonAtom' import { loginUserStore } from '@/store/commonAtom'
import { currentCanvasPlanState } from '@/store/canvasAtom' import { currentCanvasPlanState } from '@/store/canvasAtom'
import { POLYGON_TYPE } from '@/common/common'
export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
const { getMessage } = useMessage() const { getMessage } = useMessage()
@ -32,6 +33,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
const addedRoofs = useRecoilValue(addedRoofsState) const addedRoofs = useRecoilValue(addedRoofsState)
const loginUserState = useRecoilValue(loginUserStore) const loginUserState = useRecoilValue(loginUserStore)
const currentCanvasPlan = useRecoilValue(currentCanvasPlanState) const currentCanvasPlan = useRecoilValue(currentCanvasPlanState)
const canvas = useRecoilValue(canvasState)
// const { initEvent } = useContext(EventContext) // const { initEvent } = useContext(EventContext)
const { manualModuleSetup, autoModuleSetup, manualFlatroofModuleSetup, autoFlatroofModuleSetup } = useModuleBasicSetting(1) const { manualModuleSetup, autoModuleSetup, manualFlatroofModuleSetup, autoFlatroofModuleSetup } = useModuleBasicSetting(1)
@ -97,6 +99,17 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
const res = await updateObjectDate(params) 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)
}
}, [])
useEffect(() => { useEffect(() => {
if (canvasSetting.roofSizeSet !== '3') { if (canvasSetting.roofSizeSet !== '3') {
manualModuleSetup(placementRef) manualModuleSetup(placementRef)
@ -158,8 +171,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
</button> </button>
</> </>
)} )}
{console.log('canvasSetting.roofSizeSet', canvasSetting.roofSizeSet)} {canvasSetting.roofSizeSet && canvasSetting.roofSizeSet === 3 && (
{canvasSetting.roofSizeSet && canvasSetting.roofSizeSet == 3 && (
<> <>
<button className={`btn-frame modal mr5 ${isManualModuleSetup ? 'act' : ''}`} onClick={handleManualModuleSetup}> <button className={`btn-frame modal mr5 ${isManualModuleSetup ? 'act' : ''}`} onClick={handleManualModuleSetup}>
{getMessage('modal.module.basic.setting.passivity.placement')} {getMessage('modal.module.basic.setting.passivity.placement')}

View File

@ -507,6 +507,7 @@ export default function CircuitTrestleSetting({ id }) {
selectedModels, selectedModels,
setSelectedModels, setSelectedModels,
managementState, managementState,
getUseModuleItemList,
} }
// //

View File

@ -27,6 +27,7 @@ export default function PowerConditionalSelect(props) {
selectedModels, selectedModels,
setSelectedModels, setSelectedModels,
managementState, managementState,
getUseModuleItemList,
} = props } = props
const [pcsCheck, setPcsCheck] = useRecoilState(pcsCheckState) const [pcsCheck, setPcsCheck] = useRecoilState(pcsCheckState)
@ -159,8 +160,14 @@ export default function PowerConditionalSelect(props) {
setModels([]) setModels([])
setSelectedModels([]) setSelectedModels([])
setSelectedMaker(option) 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( setSeries(
res.data.map((series) => { res.data.map((series) => {
return { ...series, selected: false } return { ...series, selected: false }

View File

@ -12,6 +12,7 @@ import { useMasterController } from '@/hooks/common/useMasterController'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
import { globalLocaleStore } from '@/store/localeAtom' import { globalLocaleStore } from '@/store/localeAtom'
import { POLYGON_TYPE } from '@/common/common' import { POLYGON_TYPE } from '@/common/common'
import { useSwal } from '@/hooks/useSwal'
import { circuitNumDisplaySelector } from '@/store/settingAtom' import { circuitNumDisplaySelector } from '@/store/settingAtom'
export default function StepUp(props) { export default function StepUp(props) {
@ -28,6 +29,7 @@ export default function StepUp(props) {
getModuleList, getModuleList,
} = props } = props
const { getMessage } = useMessage() const { getMessage } = useMessage()
const { swalFire } = useSwal()
const globalLocale = useRecoilValue(globalLocaleStore) const globalLocale = useRecoilValue(globalLocaleStore)
const [moduleTab, setModuleTab] = useState(1) const [moduleTab, setModuleTab] = useState(1)
const [moduleTabs, setModuleTabs] = useState({}) const [moduleTabs, setModuleTabs] = useState({})
@ -70,35 +72,73 @@ export default function StepUp(props) {
...props.getOptYn(), // Y/N ...props.getOptYn(), // Y/N
useModuleItemList: props.getUseModuleItemList(), // List useModuleItemList: props.getUseModuleItemList(), // List
roofSurfaceList: props.getRoofSurfaceList(), // roofSurfaceList: props.getRoofSurfaceList(), //
pcsItemList: selectedModels.length === 0 ? props.getPcsItemList() : getSelectedPcsItemList(), // PCS pcsItemList: props.getSelectedPcsItemList(), // PCS
} }
// //
getPcsVoltageChk({ ...params, pcsItemList: getSelectedPcsItemList() }).then((res) => { getPcsVoltageStepUpList(params).then((res) => {
if (res.resultCode === 'S') { if (res.result.resultCode === 'S') {
// if (res?.result.code === 200 && res?.data) {
getPcsVoltageStepUpList(params).then((res) => { const dataArray = Array.isArray(res.data) ? res.data : [res.data]
if (res?.result.code === 200 && res?.data) { const stepUpListData = formatStepUpListData(dataArray)
if (selectedModels.length === 0) {
setSelectedModels(res.data.pcsItemList) // 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 canvas.renderAll()
setStepUpListData(stepUpListData) } else {
swalFire({
// PCS title: res.result.resultMsg,
const formattedOptCodes = formatOptionCodes(res.data.optionList) type: 'alert',
setOptCodes(formattedOptCodes) })
setSeletedOption(formattedOptCodes[0]) }
}
})
} else {
swalFire({
title: res.resultMsg,
type: 'alert',
})
} }
}) })
} catch (error) { } catch (error) {
@ -170,7 +210,6 @@ export default function StepUp(props) {
// Update res.data with modified pcsItemList // Update res.data with modified pcsItemList
res.data.pcsItemList = pcsItemListWithSerQty res.data.pcsItemList = pcsItemListWithSerQty
setSelectedModels(pcsItemListWithSerQty)
const dataArray = Array.isArray(res.data) ? res.data : [res.data] const dataArray = Array.isArray(res.data) ? res.data : [res.data]
const stepUpListData = formatStepUpListData(dataArray) const stepUpListData = formatStepUpListData(dataArray)
@ -303,8 +342,8 @@ export default function StepUp(props) {
// //
setStepUpListData(tempStepUpListData) setStepUpListData(tempStepUpListData)
console.log('🚀 ~ handleRowClick ~ tempStepUpListData:', tempStepUpListData) // console.log('🚀 ~ handleRowClick ~ tempStepUpListData:', tempStepUpListData)
console.log('🚀 ~ handleRowClick ~ selectedData:', selectedData) // console.log('🚀 ~ handleRowClick ~ selectedData:', selectedData)
// //
const params = { const params = {
@ -350,6 +389,12 @@ export default function StepUp(props) {
return module.id return module.id
}) })
targetSurface.modules.map((module) => {
module.circuit = null
module.circuitNumber = null
module.pcsItemId = null
})
// //
canvas canvas
.getObjects() .getObjects()
@ -363,6 +408,7 @@ export default function StepUp(props) {
roofSurface.moduleList.forEach((module) => { roofSurface.moduleList.forEach((module) => {
const targetModule = canvas.getObjects().filter((obj) => obj.id === module.uniqueId)[0] const targetModule = canvas.getObjects().filter((obj) => obj.id === module.uniqueId)[0]
if (module.circuit === '') return
const moduleCircuitText = new fabric.Text(module.circuit, { const moduleCircuitText = new fabric.Text(module.circuit, {
left: targetModule.left + targetModule.width / 2, left: targetModule.left + targetModule.width / 2,
top: targetModule.top + targetModule.height / 2, top: targetModule.top + targetModule.height / 2,

View File

@ -33,9 +33,6 @@ export default function PassivityCircuitAllocation(props) {
const isDisplayCircuitNumber = useRecoilValue(circuitNumDisplaySelector) const isDisplayCircuitNumber = useRecoilValue(circuitNumDisplaySelector)
useEffect(() => { useEffect(() => {
console.log('header, rows', header, rows)
console.log('selectedModels', selectedModels)
// setSurfaceInfo()
setModuleStatisticsData() setModuleStatisticsData()
if (!managementState) { if (!managementState) {
setManagementState(managementStateLoaded) setManagementState(managementStateLoaded)
@ -78,80 +75,6 @@ export default function PassivityCircuitAllocation(props) {
canvas.renderAll() 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 = () => { const handleCircuitNumberFix = () => {
let uniqueCircuitNumbers = [ let uniqueCircuitNumbers = [
...new Set( ...new Set(
@ -177,6 +100,7 @@ export default function PassivityCircuitAllocation(props) {
return return
} else if (selectedModels.length > 1) { } else if (selectedModels.length > 1) {
let result = false let result = false
uniqueCircuitNumbers.forEach((number) => { uniqueCircuitNumbers.forEach((number) => {
if ( if (
number.split('-')[1] === circuitNumber + ')' && number.split('-')[1] === circuitNumber + ')' &&
@ -229,20 +153,14 @@ export default function PassivityCircuitAllocation(props) {
setSelectedPcs(tempSelectedPcs) setSelectedPcs(tempSelectedPcs)
canvas.add(moduleCircuitText) canvas.add(moduleCircuitText)
}) })
console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels)
// let pcsList = [...selectedModels.map((model) => ({ ...model }))] let pcsList = JSON.parse(JSON.stringify(selectedModels)).map((model) => {
let pcsList = JSON.parse(JSON.stringify(selectedModels))
pcsList = pcsList.map((model) => {
console.log('🚀 ~ handleCircuitNumberFix ~ pcsList:', pcsList)
if (model.id === selectedPcs.id) { if (model.id === selectedPcs.id) {
model.isUsed = true model.isUsed = true
} }
return model return model
}) })
console.log('🚀 ~ handleCircuitNumberFix ~ pcsList:', pcsList)
const roofSurfaceList = canvas const roofSurfaceList = canvas
.getObjects() .getObjects()
.filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name && obj?.modules.length > 0) .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 usedPcses = pcsList.filter((model) => model.isUsed)
const pcsItemList = usedPcses.map((model, index) => { const pcsItemList = usedPcses.map((model, index) => {
return { return {
@ -289,7 +206,6 @@ export default function PassivityCircuitAllocation(props) {
} }
getPcsManualConfChk(params).then((res) => { getPcsManualConfChk(params).then((res) => {
console.log('targetModules', targetModules)
if (res.resultCode === 'E') { if (res.resultCode === 'E') {
swalFire({ swalFire({
text: res.resultMsg, text: res.resultMsg,
@ -321,8 +237,6 @@ export default function PassivityCircuitAllocation(props) {
setModuleStatisticsData() setModuleStatisticsData()
}) })
} }
console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels)
console.log('🚀 ~ handleCircuitNumberFix ~ selectedModels:', selectedModels)
const getCircuitNumber = () => { const getCircuitNumber = () => {
if (selectedModels.length === 1) { if (selectedModels.length === 1) {
@ -334,7 +248,7 @@ export default function PassivityCircuitAllocation(props) {
const initSelectedPcsCircuitNumber = () => { const initSelectedPcsCircuitNumber = () => {
swalFire({ 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', type: 'confirm',
icon: 'warning', icon: 'warning',
confirmFn: () => { confirmFn: () => {
@ -355,7 +269,7 @@ export default function PassivityCircuitAllocation(props) {
const initAllPcsCircuitNumber = () => { const initAllPcsCircuitNumber = () => {
canvas.discardActiveObject() canvas.discardActiveObject()
swalFire({ 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', type: 'confirm',
icon: 'warning', icon: 'warning',
confirmFn: () => { confirmFn: () => {
@ -444,18 +358,6 @@ export default function PassivityCircuitAllocation(props) {
</label> </label>
</div> </div>
))} ))}
{/* <div className="d-check-radio pop mb10">
<input type="radio" name="radio01" id="ra01" />
<label htmlFor="ra01">HQJP-KA55-5 (標準回路2枚10)</label>
</div>
<div className="d-check-radio pop mb10">
<input type="radio" name="radio01" id="ra02" />
<label htmlFor="ra02">HQJP-KA55-5 (標準回路2枚10)</label>
</div>
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra03" />
<label htmlFor="ra03">HQJP-KA55-5 (標準回路2枚10)</label>
</div>*/}
</div> </div>
</div> </div>
</div> </div>

View File

@ -210,10 +210,12 @@ export const useEstimateController = (planNo) => {
//새로 첨부한 파일이 없으면 //새로 첨부한 파일이 없으면
//북면 먼저 체크 //북면 먼저 체크
if (estimateData?.northArrangement === '1') { if (estimateData.fileFlg === '0') {
fileFlg = false if (estimateData?.northArrangement === '1') {
setIsGlobalLoading(false) fileFlg = false
return swalFire({ text: getMessage('estimate.detail.save.requiredNorthArrangementFileUpload'), type: 'alert' }) setIsGlobalLoading(false)
return swalFire({ text: getMessage('estimate.detail.save.requiredNorthArrangementFileUpload'), type: 'alert' })
}
} }
if (estimateData.itemList.length > 1) { if (estimateData.itemList.length > 1) {

View File

@ -1010,10 +1010,10 @@ export function useModule() {
wpOut: 0, wpOut: 0,
circuits: { wpOut: 0 }, circuits: { wpOut: 0 },
} }
}
if (!surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]) { 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] = 0
}
} }
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]++ surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]++
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits.wpOut += +module.moduleInfo.wpOut surfaceObjects[surface.id].circuits[module.circuitNumber].circuits.wpOut += +module.moduleInfo.wpOut
@ -1027,7 +1027,7 @@ export function useModule() {
let tempRow = { let tempRow = {
name: surfaceObjects[key].roofSurface, name: surfaceObjects[key].roofSurface,
circuit: surfaceObjects[key].circuit, circuit: surfaceObjects[key].circuit,
wpOut: parseInt((surfaceObjects[key].wpOut / 1000).toFixed(3)), wpOut: parseFloat(surfaceObjects[key].wpOut / 1000),
} }
selectedModules.itemList.forEach((module) => { selectedModules.itemList.forEach((module) => {
tempRow[module.itemId] = surfaceObjects[key][module.itemId] tempRow[module.itemId] = surfaceObjects[key][module.itemId]
@ -1038,7 +1038,7 @@ export function useModule() {
let row = { let row = {
name: surfaceObjects[key].roofSurface, name: surfaceObjects[key].roofSurface,
circuit: surfaceObjects[key].circuits[circuit].circuit, 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) => { selectedModules.itemList.forEach((module) => {
row[module.itemId] = surfaceObjects[key].circuits[circuit].circuits[module.itemId] row[module.itemId] = surfaceObjects[key].circuits[circuit].circuits[module.itemId]

View File

@ -240,7 +240,7 @@ export function useRoofAllocationSetting(id) {
const onDeleteRoofMaterial = (idx) => { const onDeleteRoofMaterial = (idx) => {
const isSelected = currentRoofList[idx].selected 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) { if (isSelected) {
newRoofList[0].selected = true newRoofList[0].selected = true
} }

View File

@ -167,9 +167,14 @@ export function useRoofShapeSetting(id) {
] ]
const handleSave = () => { const handleSave = () => {
let outerLines let outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine' && obj.visible)
let direction let direction
if (outerLines.length < 2) {
swalFire({ text: '외벽선이 없습니다.', icon: 'error' })
return
}
switch (shapeNum) { switch (shapeNum) {
case 1: { case 1: {
outerLines = saveRidge() outerLines = saveRidge()

View File

@ -3,7 +3,7 @@
import { useContext, useEffect, useState } from 'react' import { useContext, useEffect, useState } from 'react'
import { usePathname, useRouter, useSearchParams } from 'next/navigation' import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import { useRecoilState } from 'recoil' import { useRecoilState, useResetRecoilState } from 'recoil'
import { canvasState, currentCanvasPlanState, plansState } from '@/store/canvasAtom' import { canvasState, currentCanvasPlanState, plansState } from '@/store/canvasAtom'
import { useAxios } from '@/hooks/useAxios' import { useAxios } from '@/hooks/useAxios'
@ -14,6 +14,8 @@ import { SAVE_KEY } from '@/common/common'
import { readImage, removeImage } from '@/lib/fileAction' import { readImage, removeImage } from '@/lib/fileAction'
import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider'
import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController'
import { outerLinePointsState } from '@/store/outerLineAtom'
import { placementShapeDrawingPointsState } from '@/store/placementShapeDrawingAtom'
export function usePlan(params = {}) { export function usePlan(params = {}) {
const { floorPlanState } = useContext(FloorPlanContext) const { floorPlanState } = useContext(FloorPlanContext)
@ -33,6 +35,10 @@ export function usePlan(params = {}) {
const { get, promisePost, promisePut, promiseDel, promiseGet } = useAxios() const { get, promisePost, promisePut, promiseDel, promiseGet } = useAxios()
const { setEstimateContextState } = useEstimateController() const { setEstimateContextState } = useEstimateController()
const resetOuterLinePoints = useResetRecoilState(outerLinePointsState)
const resetPlacementShapeDrawingPoints = useResetRecoilState(placementShapeDrawingPointsState)
/** /**
* 마우스 포인터의 가이드라인을 제거합니다. * 마우스 포인터의 가이드라인을 제거합니다.
*/ */
@ -284,6 +290,8 @@ export function usePlan(params = {}) {
} else { } else {
if (!currentCanvasPlan || currentCanvasPlan.id !== newCurrentId) { if (!currentCanvasPlan || currentCanvasPlan.id !== newCurrentId) {
await saveCanvas(true) await saveCanvas(true)
clearRecoilState()
} }
setCurrentCanvasPlan(plans.find((plan) => plan.id === newCurrentId)) setCurrentCanvasPlan(plans.find((plan) => plan.id === newCurrentId))
setPlans((plans) => plans.map((plan) => ({ ...plan, isCurrent: plan.id === newCurrentId }))) setPlans((plans) => plans.map((plan) => ({ ...plan, isCurrent: plan.id === newCurrentId })))
@ -296,6 +304,12 @@ export function usePlan(params = {}) {
// setBgImage() // setBgImage()
}, [currentCanvasPlan]) }, [currentCanvasPlan])
const clearRecoilState = () => {
//clear가 필요한 recoil state 관리
resetOuterLinePoints()
resetPlacementShapeDrawingPoints()
}
const handleCurrentPlanUrl = () => { const handleCurrentPlanUrl = () => {
const currentPlan = plans.find((plan) => plan.isCurrent) const currentPlan = plans.find((plan) => plan.isCurrent)
// if (currentPlan) router.push(`${pathname}?pid=${currentPlan?.planNo}&objectNo=${floorPlanState?.objectNo}`) // if (currentPlan) router.push(`${pathname}?pid=${currentPlan?.planNo}&objectNo=${floorPlanState?.objectNo}`)

View File

@ -153,7 +153,9 @@
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num": "設定する回路番号1", "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.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": "選択したパワーコンディショナーの回路番号の初期化",
"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": "すべての回路番号の初期化",
"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.circuit.allocation.passivity.circuit.num.fix": "番号確定",
"modal.circuit.trestle.setting.step.up.allocation": "昇圧設定", "modal.circuit.trestle.setting.step.up.allocation": "昇圧設定",
"modal.circuit.trestle.setting.step.up.allocation.serial.amount": "シリアル枚数", "modal.circuit.trestle.setting.step.up.allocation.serial.amount": "シリアル枚数",
@ -877,6 +879,7 @@
"estimate.detail.roofCns": "屋根材・仕様施工", "estimate.detail.roofCns": "屋根材・仕様施工",
"estimate.detail.remarks": "備考", "estimate.detail.remarks": "備考",
"estimate.detail.fileFlg": "後日資料提出", "estimate.detail.fileFlg": "後日資料提出",
"estimate.detail.dragFileGuide": "(※北面設置の場合、ファイル添付が必須です.)",
"estimate.detail.header.fileList1": "ファイル添付", "estimate.detail.header.fileList1": "ファイル添付",
"estimate.detail.fileList.btn": "ファイル選択", "estimate.detail.fileList.btn": "ファイル選択",
"estimate.detail.fileList.extCheck": "画像ファイルのみ添付可能です。", "estimate.detail.fileList.extCheck": "画像ファイルのみ添付可能です。",
@ -942,6 +945,7 @@
"estimate.detail.save.alertMsg": "保存されました。見積書で製品を変更すると、図面や回路には反映されません。", "estimate.detail.save.alertMsg": "保存されました。見積書で製品を変更すると、図面や回路には反映されません。",
"estimate.detail.copy.alertMsg": "コピーされました。", "estimate.detail.copy.alertMsg": "コピーされました。",
"estimate.detail.save.requiredFileUpload": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください。", "estimate.detail.save.requiredFileUpload": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください。",
"estimate.detail.save.requiredNorthArrangementFileUpload": "北面にモジュールを配置した場合、北面配置許可書を必ず添付する必要があります.",
"estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります。", "estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります。",
"estimate.detail.save.requiredCharger": "担当者は必須です。", "estimate.detail.save.requiredCharger": "担当者は必須です。",
"estimate.detail.save.requiredObjectName": "案件名は必須です。", "estimate.detail.save.requiredObjectName": "案件名は必須です。",

View File

@ -153,7 +153,9 @@
"modal.circuit.trestle.setting.circuit.allocation.passivity.circuit.num": "설정할 회로번호(1~)", "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.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": "선택된 파워컨디셔너의 회로번호 초기화",
"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": "모든 회로번호 초기화",
"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.circuit.allocation.passivity.circuit.num.fix": "번호 확정",
"modal.circuit.trestle.setting.step.up.allocation": "승압 설정", "modal.circuit.trestle.setting.step.up.allocation": "승압 설정",
"modal.circuit.trestle.setting.step.up.allocation.serial.amount": "직렬매수", "modal.circuit.trestle.setting.step.up.allocation.serial.amount": "직렬매수",
@ -877,6 +879,7 @@
"estimate.detail.roofCns": "지붕재・사양시공", "estimate.detail.roofCns": "지붕재・사양시공",
"estimate.detail.remarks": "비고", "estimate.detail.remarks": "비고",
"estimate.detail.fileFlg": "후일자료제출", "estimate.detail.fileFlg": "후일자료제출",
"estimate.detail.dragFileGuide": "(※ 북면설치인 경우, 파일 첨부가 필수입니다.)",
"estimate.detail.header.fileList1": "파일첨부", "estimate.detail.header.fileList1": "파일첨부",
"estimate.detail.fileList.btn": "파일선택", "estimate.detail.fileList.btn": "파일선택",
"estimate.detail.fileList.extCheck": "이미지 파일만 첨부 가능합니다.", "estimate.detail.fileList.extCheck": "이미지 파일만 첨부 가능합니다.",
@ -942,6 +945,7 @@
"estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우 도면 및 회로에 반영되지 않습니다.", "estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우 도면 및 회로에 반영되지 않습니다.",
"estimate.detail.copy.alertMsg": "복사되었습니다.", "estimate.detail.copy.alertMsg": "복사되었습니다.",
"estimate.detail.save.requiredFileUpload": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.", "estimate.detail.save.requiredFileUpload": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.",
"estimate.detail.save.requiredNorthArrangementFileUpload": "북면에 모듈을 배치한 경우, 북면배치허가서를 반드시 첨부해야 합니다.",
"estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.", "estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.",
"estimate.detail.save.requiredCharger": "담당자는 필수값 입니다.", "estimate.detail.save.requiredCharger": "담당자는 필수값 입니다.",
"estimate.detail.save.requiredObjectName": "안건명은 필수값 입니다.", "estimate.detail.save.requiredObjectName": "안건명은 필수값 입니다.",