Merge branch 'dev' into dev-yj

This commit is contained in:
yjnoh 2025-02-08 15:40:02 +09:00
commit 22c115c92d
8 changed files with 52 additions and 22 deletions

View File

@ -183,6 +183,8 @@ export const SAVE_KEY = [
'roofMaterial', 'roofMaterial',
'isComplete', 'isComplete',
'moduleInfo', 'moduleInfo',
'circuitNumber',
'circuit',
] ]
export const OBJECT_PROTOTYPE = [fabric.Line.prototype, fabric.Polygon.prototype, fabric.Triangle.prototype] export const OBJECT_PROTOTYPE = [fabric.Line.prototype, fabric.Polygon.prototype, fabric.Triangle.prototype]

View File

@ -7,8 +7,9 @@ import { useCanvasSetting } from '@/hooks/option/useCanvasSetting'
import { usePopup } from '@/hooks/usePopup' import { usePopup } from '@/hooks/usePopup'
import '@/styles/contents.scss' import '@/styles/contents.scss'
import { notFound, useSearchParams } from 'next/navigation' import { notFound, useSearchParams } from 'next/navigation'
import { useRecoilState } from 'recoil' import { useRecoilState, useResetRecoilState } from 'recoil'
import { correntObjectNoState } from '@/store/settingAtom' import { correntObjectNoState } from '@/store/settingAtom'
import { currentMenuState } from '@/store/canvasAtom'
export default function FloorPlan({ children }) { export default function FloorPlan({ children }) {
const [correntObjectNo, setCurrentObjectNo] = useRecoilState(correntObjectNoState) const [correntObjectNo, setCurrentObjectNo] = useRecoilState(correntObjectNoState)
@ -19,6 +20,12 @@ export default function FloorPlan({ children }) {
const { closeAll } = usePopup() const { closeAll } = usePopup()
const { menuNumber, setMenuNumber } = useCanvasMenu() const { menuNumber, setMenuNumber } = useCanvasMenu()
const { fetchSettings, fetchBasicSettings } = useCanvasSetting() const { fetchSettings, fetchBasicSettings } = useCanvasSetting()
const resetCurrentMenu = useResetRecoilState(currentMenuState)
useEffect(() => {
return () => {
resetCurrentMenu()
}
}, [])
// URL objectNo // URL objectNo
useEffect(() => { useEffect(() => {

View File

@ -1,11 +1,12 @@
import { GlobalDataContext } from '@/app/GlobalDataProvider' import { GlobalDataContext } from '@/app/GlobalDataProvider'
import QSelectBox from '@/components/common/select/QSelectBox' import QSelectBox from '@/components/common/select/QSelectBox'
import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupStatusController'
import { useMasterController } from '@/hooks/common/useMasterController' import { useMasterController } from '@/hooks/common/useMasterController'
import { useMessage } from '@/hooks/useMessage' import { useMessage } from '@/hooks/useMessage'
import { useSwal } from '@/hooks/useSwal' import { useSwal } from '@/hooks/useSwal'
import { pcsCheckState } from '@/store/circuitTrestleAtom' import { pcsCheckState } from '@/store/circuitTrestleAtom'
import { globalLocaleStore } from '@/store/localeAtom' import { globalLocaleStore } from '@/store/localeAtom'
import { selectedModuleState } from '@/store/selectedModuleOptions' import { moduleSelectionDataState, selectedModuleState } from '@/store/selectedModuleOptions'
import { isNullOrUndefined } from '@/util/common-utils' import { isNullOrUndefined } from '@/util/common-utils'
import { useContext, useEffect, useState } from 'react' import { useContext, useEffect, useState } from 'react'
import { useRecoilState } from 'recoil' import { useRecoilState } from 'recoil'
@ -37,7 +38,8 @@ export default function PowerConditionalSelect(props) {
const { getPcsMakerList, getPcsModelList } = useMasterController() const { getPcsMakerList, getPcsModelList } = useMasterController()
const selectedModules = useRecoilValue(selectedModuleState) const selectedModules = useRecoilValue(selectedModuleState)
const { swalFire } = useSwal() const { swalFire } = useSwal()
// const [moduleSelectionData, setModuleSelectionData] = useRecoilState(moduleSelectionDataState) const { trigger: moduleSelectedDataTrigger } = useCanvasPopupStatusController(2)
const [moduleSelectionData, setModuleSelectionData] = useRecoilState(moduleSelectionDataState)
const modelHeader = [ const modelHeader = [
{ name: getMessage('시리즈'), width: '15%', prop: 'pcsSerNm', type: 'color-box' }, { name: getMessage('시리즈'), width: '15%', prop: 'pcsSerNm', type: 'color-box' },
{ name: getMessage('명칭'), width: '15%', prop: 'goodsNo', type: 'color-box' }, { name: getMessage('명칭'), width: '15%', prop: 'goodsNo', type: 'color-box' },
@ -66,7 +68,6 @@ export default function PowerConditionalSelect(props) {
useEffect(() => { useEffect(() => {
if (makers.length === 0) { if (makers.length === 0) {
getPcsMakerList().then((res) => { getPcsMakerList().then((res) => {
console.log('getPcsMakerList', res.data)
setMakers(res.data) setMakers(res.data)
}) })
} }
@ -130,7 +131,12 @@ export default function PowerConditionalSelect(props) {
const pcsSerList = selectedSeries.map((series) => { const pcsSerList = selectedSeries.map((series) => {
return { pcsSerCd: series.pcsSerCd } return { pcsSerCd: series.pcsSerCd }
}) })
const moduleItemList = getUseModuleItemList() const moduleItemList = moduleSelectionData.module.itemList.map((item) => {
return {
itemId: item.itemId,
mixMatlNo: item.mixMatlNo,
}
})
getPcsModelList({ pcsMkrCd, pcsSerList, moduleItemList }).then((res) => { getPcsModelList({ pcsMkrCd, pcsSerList, moduleItemList }).then((res) => {
if (res?.result.code === 200 && res?.data) { if (res?.result.code === 200 && res?.data) {
setModels( setModels(
@ -179,7 +185,7 @@ export default function PowerConditionalSelect(props) {
setSelectedMaker(option) setSelectedMaker(option)
const param = { const param = {
pcsMkrCd: option.pcsMkrCd, pcsMkrCd: option.pcsMkrCd,
mixMatlNo: getUseModuleItemList()[0].mixMatlNo, mixMatlNo: moduleSelectionData.module.mixMatlNo,
} }
getPcsMakerList(param).then((res) => { getPcsMakerList(param).then((res) => {

View File

@ -2,6 +2,7 @@ import { GlobalDataContext } from '@/app/GlobalDataProvider'
import { POLYGON_TYPE } from '@/common/common' import { POLYGON_TYPE } from '@/common/common'
import { useMasterController } from '@/hooks/common/useMasterController' import { useMasterController } from '@/hooks/common/useMasterController'
import { useModule } from '@/hooks/module/useModule' import { useModule } from '@/hooks/module/useModule'
import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle'
import { useMessage } from '@/hooks/useMessage' import { useMessage } from '@/hooks/useMessage'
import { useSwal } from '@/hooks/useSwal' import { useSwal } from '@/hooks/useSwal'
import { canvasState } from '@/store/canvasAtom' import { canvasState } from '@/store/canvasAtom'
@ -28,9 +29,9 @@ export default function PassivityCircuitAllocation(props) {
const { header, rows, footer } = useRecoilValue(moduleStatisticsState) const { header, rows, footer } = useRecoilValue(moduleStatisticsState)
const [circuitNumber, setCircuitNumber] = useState(1) const [circuitNumber, setCircuitNumber] = useState(1)
const [targetModules, setTargetModules] = useState([]) const [targetModules, setTargetModules] = useState([])
const { setModuleStatisticsData } = useModule()
const { getPcsManualConfChk } = useMasterController() const { getPcsManualConfChk } = useMasterController()
const isDisplayCircuitNumber = useRecoilValue(circuitNumDisplaySelector) const isDisplayCircuitNumber = useRecoilValue(circuitNumDisplaySelector)
const { setModuleStatisticsData } = useCircuitTrestle()
useEffect(() => { useEffect(() => {
setModuleStatisticsData() setModuleStatisticsData()
@ -260,7 +261,6 @@ export default function PassivityCircuitAllocation(props) {
return parseInt(circuitNumber[circuitNumber.length - 1]) return parseInt(circuitNumber[circuitNumber.length - 1])
}) })
const minCircuitNumber = Math.min(...circuitNumbers) const minCircuitNumber = Math.min(...circuitNumbers)
console.log(circuitNumbers, minCircuitNumber)
canvas.remove(...circuitModules.map((module) => module.circuit)) canvas.remove(...circuitModules.map((module) => module.circuit))
circuitModules.forEach((obj) => { circuitModules.forEach((obj) => {
obj.circuit = null obj.circuit = null

View File

@ -50,9 +50,7 @@ export default function PanelBatchStatistics() {
{rows.map((row, index) => ( {rows.map((row, index) => (
<tr key={`statistic-row-${index}`}> <tr key={`statistic-row-${index}`}>
{header.map((item, i) => ( {header.map((item, i) => (
<td key={`statistic-col-${i}`}> <td key={`statistic-col-${i}`}>{row[item.prop] ?? 0}</td>
{typeof row[item.prop] === 'number' ? row[item.prop].toLocaleString('ko-KR', { maximumFractionDigits: 4 }) : row[item.prop]}
</td>
))} ))}
</tr> </tr>
))} ))}

View File

@ -1899,7 +1899,7 @@ export const useTrestle = () => {
rackYn, rackYn,
racks: rackParams, racks: rackParams,
rackTotCnt: rackList.length ?? 0 + smartRackGroup.length ?? 0, rackTotCnt: rackList.length ?? 0 + smartRackGroup.length ?? 0,
rackFittingCnt: bracketList.length, rackFittingTotCnt: bracketList.length,
moduleRows: getMostLeftModules(surface), moduleRows: getMostLeftModules(surface),
cvrYn: moduleSelection.construction.setupCover ? 'Y' : 'N', cvrYn: moduleSelection.construction.setupCover ? 'Y' : 'N',
snowGdYn: moduleSelection.construction.setupSnowCover ? 'Y' : 'N', snowGdYn: moduleSelection.construction.setupSnowCover ? 'Y' : 'N',

View File

@ -190,7 +190,9 @@ export function useRoofShapeSetting(id) {
} }
case 4: { case 4: {
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine') outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
const pitch = outerLines.find((line) => line.attributes.type === LINE_TYPE.WALLLINE.SHED)?.attributes.pitch const pitch = outerLines.find((line) => line.attributes.type === LINE_TYPE.WALLLINE.SHED)?.attributes.pitch
let isValid = outerLines.every((line) => line.attributes.isFixed)
// 변별로 설정중 한쪽흐름일 경우 한쪽흐름의 pitch로 설정 // 변별로 설정중 한쪽흐름일 경우 한쪽흐름의 pitch로 설정
if (pitch) { if (pitch) {
outerLines.forEach((line) => { outerLines.forEach((line) => {
@ -203,6 +205,10 @@ export function useRoofShapeSetting(id) {
} }
}) })
} }
if (!isValid) {
swalFire({ text: '설정이 완료되지 않았습니다.', icon: 'error' })
return
}
break break
} }

View File

@ -10,10 +10,11 @@ import {
selectedModelsState, selectedModelsState,
seriesState, seriesState,
} from '@/store/circuitTrestleAtom' } from '@/store/circuitTrestleAtom'
import { selectedModuleState } from '@/store/selectedModuleOptions' import { moduleSelectionDataState, selectedModuleState } from '@/store/selectedModuleOptions'
import { useContext } from 'react' import { useContext } from 'react'
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
import { useMessage } from './useMessage' import { useMessage } from './useMessage'
import { useCanvasPopupStatusController } from './common/useCanvasPopupStatusController'
export function useCircuitTrestle() { export function useCircuitTrestle() {
const [makers, setMakers] = useRecoilState(makersState) const [makers, setMakers] = useRecoilState(makersState)
@ -25,7 +26,8 @@ export function useCircuitTrestle() {
const selectedModules = useRecoilValue(selectedModuleState) const selectedModules = useRecoilValue(selectedModuleState)
const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext) const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext)
const canvas = useRecoilValue(canvasState) const canvas = useRecoilValue(canvasState)
const { trigger: moduleSelectedDataTrigger } = useCanvasPopupStatusController(2)
const [moduleSelectionData, setModuleSelectionData] = useRecoilState(moduleSelectionDataState)
const setModuleStatistics = useSetRecoilState(moduleStatisticsState) const setModuleStatistics = useSetRecoilState(moduleStatisticsState)
const { getMessage } = useMessage() const { getMessage } = useMessage()
const getOptYn = () => { const getOptYn = () => {
@ -60,7 +62,7 @@ export function useCircuitTrestle() {
// 사용된 모듈아이템 목록 // 사용된 모듈아이템 목록
const getUseModuleItemList = () => { const getUseModuleItemList = () => {
console.log('🚀 ~ getUseModuleItemList ~ selectedModules:', selectedModules) console.log('🚀 ~ getUseModuleItemList ~ selectedModules:', selectedModules)
return selectedModules?.itemList?.map((m) => { return moduleSelectionData.module?.itemList?.map((m) => {
return { return {
itemId: m.itemId, itemId: m.itemId,
mixMatlNo: m.mixMatlNo, mixMatlNo: m.mixMatlNo,
@ -71,6 +73,10 @@ export function useCircuitTrestle() {
// 지붕면 목록 // 지붕면 목록
const getRoofSurfaceList = () => { const getRoofSurfaceList = () => {
const roofSurfaceList = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) const roofSurfaceList = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
const modules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE)
roofSurfaceList.forEach((surface) => {
surface.modules = modules.filter((module) => module.surfaceId === surface.id)
})
roofSurfaceList.sort((a, b) => a.left - b.left || b.top - a.top) roofSurfaceList.sort((a, b) => a.left - b.left || b.top - a.top)
return roofSurfaceList return roofSurfaceList
.map((obj) => { .map((obj) => {
@ -177,12 +183,17 @@ export function useCircuitTrestle() {
const setPowerConditionerData = () => {} const setPowerConditionerData = () => {}
const setModuleStatisticsData = () => { const setModuleStatisticsData = () => {
console.log(canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)) const roofSurfaceList = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
if (selectedModules?.length === 0) return const modules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE)
roofSurfaceList.forEach((surface) => {
surface.modules = modules.filter((module) => module.surfaceId === surface.id)
})
// console.log(moduleSelectionData)
if (!moduleSelectionData || !moduleSelectionData.module || moduleSelectionData.module?.itemList?.length === 0) return
const tempHeader = [ const tempHeader = [
{ name: getMessage('simulator.table.sub1'), prop: 'name' }, { name: getMessage('simulator.table.sub1'), prop: 'name' },
{ name: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.circuit'), prop: 'circuit' }, { name: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.circuit'), prop: 'circuit' },
...selectedModules?.itemList?.map((module) => { ...moduleSelectionData.module?.itemList?.map((module) => {
return { return {
name: module.itemNm, name: module.itemNm,
prop: module.itemId, prop: module.itemId,
@ -236,7 +247,7 @@ export function useCircuitTrestle() {
circuit: surfaceObjects[key].circuit, circuit: surfaceObjects[key].circuit,
wpOut: parseFloat(surfaceObjects[key].wpOut / 1000), wpOut: parseFloat(surfaceObjects[key].wpOut / 1000),
} }
selectedModules.itemList.forEach((module) => { moduleSelectionData.module.itemList.forEach((module) => {
tempRow[module.itemId] = surfaceObjects[key][module.itemId] tempRow[module.itemId] = surfaceObjects[key][module.itemId]
}) })
tempRows.push(tempRow) tempRows.push(tempRow)
@ -247,7 +258,7 @@ export function useCircuitTrestle() {
circuit: surfaceObjects[key].circuits[circuit].circuit, circuit: surfaceObjects[key].circuits[circuit].circuit,
wpOut: parseFloat(surfaceObjects[key].circuits[circuit].circuits.wpOut / 1000), wpOut: parseFloat(surfaceObjects[key].circuits[circuit].circuits.wpOut / 1000),
} }
selectedModules.itemList.forEach((module) => { moduleSelectionData.module.itemList.forEach((module) => {
row[module.itemId] = surfaceObjects[key].circuits[circuit].circuits[module.itemId] row[module.itemId] = surfaceObjects[key].circuits[circuit].circuits[module.itemId]
}) })
tempRows.push(row) tempRows.push(row)
@ -259,8 +270,8 @@ export function useCircuitTrestle() {
circuit: '-', circuit: '-',
wpOut: tempRows.reduce((acc, row) => acc + row.wpOut, 0), wpOut: tempRows.reduce((acc, row) => acc + row.wpOut, 0),
} }
selectedModules.itemList.forEach((module) => { moduleSelectionData.module.itemList.forEach((module) => {
tempFooter[module.itemId] = tempRows.reduce((acc, row) => acc + row[module.itemId], 0) tempFooter[module.itemId] = tempRows.reduce((acc, row) => acc + (row[module.itemId] ?? 0), 0)
}) })
canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
setModuleStatistics({ header: tempHeader, rows: tempRows.filter((row) => row.wpOut !== 0), footer: tempFooter }) setModuleStatistics({ header: tempHeader, rows: tempRows.filter((row) => row.wpOut !== 0), footer: tempFooter })