회로번호 초기화 기능 추가 및 미할당 모듈 삭제

번호 확정시 validation 추가
This commit is contained in:
김민식 2025-01-24 18:07:10 +09:00
parent 43ce1a1853
commit fa57be3c29
3 changed files with 238 additions and 113 deletions

View File

@ -50,6 +50,14 @@ export default function CircuitTrestleSetting({ id }) {
} }
}, []) }, [])
useEffect(() => {
if (allocationType === ALLOCATION_TYPE.PASSIVITY && tabNum === 2) {
const notAllocationModules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE && !obj.circuit)
canvas.remove(...notAllocationModules)
canvas.renderAll()
}
}, [tabNum])
const onAutoRecommend = () => { const onAutoRecommend = () => {
if (series.filter((s) => s.selected).length === 0) { if (series.filter((s) => s.selected).length === 0) {
swalFire({ swalFire({
@ -59,13 +67,11 @@ export default function CircuitTrestleSetting({ id }) {
return return
} }
console.log('🚀 ~ onAutoRecommend ~ selectedModules:', selectedModules)
const params = { const params = {
...getApiProps(), ...getOptYn(),
useModuleItemList: getSelectedModuleList(), useModuleItemList: getUseModuleItemList(),
roofSurfaceList: getRoofSurfaceList(), roofSurfaceList: getRoofSurfaceList(),
pcsItemList: getModelList(), pcsItemList: getPcsItemList(),
} }
getPcsAutoRecommendList(params).then((res) => { getPcsAutoRecommendList(params).then((res) => {
@ -81,7 +87,7 @@ export default function CircuitTrestleSetting({ id }) {
}) })
} }
const getApiProps = () => { const getOptYn = () => {
return { return {
maxConnYn: pcsCheck.max ? 'Y' : 'N', maxConnYn: pcsCheck.max ? 'Y' : 'N',
smpCirYn: pcsCheck.division ? 'Y' : 'N', smpCirYn: pcsCheck.division ? 'Y' : 'N',
@ -89,7 +95,7 @@ export default function CircuitTrestleSetting({ id }) {
} }
} }
const getModelList = () => { const getPcsItemList = () => {
return models.map((model) => { return models.map((model) => {
return { return {
itemId: model.itemId, itemId: model.itemId,
@ -113,27 +119,14 @@ export default function CircuitTrestleSetting({ id }) {
paralQty: 0, paralQty: 0,
rmdYn: 'Y', rmdYn: 'Y',
usePossYn: 'Y', usePossYn: 'Y',
roofSurfaceList: [ roofSurfaceList: getRoofSurfaceList(),
{
roofSurfaceId: '',
roofSurface: '',
roofSurfaceIncl: '',
moduleList: [
{
itemId: '',
circuit: '',
pcsItemId: '',
},
],
},
],
}, },
], ],
} }
}) })
} }
const getSelectedModuleList = () => { const getUseModuleItemList = () => {
return selectedModules.itemList.map((m) => { return selectedModules.itemList.map((m) => {
return { return {
itemId: m.itemId, itemId: m.itemId,
@ -157,6 +150,8 @@ export default function CircuitTrestleSetting({ id }) {
moduleList: obj.modules.map((module) => { moduleList: obj.modules.map((module) => {
return { return {
itemId: module.moduleInfo.itemId, itemId: module.moduleInfo.itemId,
circuit: module.circuitNumber ? module.circuitNumber : null,
pcsItemId: module.circuit ? module.circuit?.pcsItemId : null,
} }
}), }),
} }
@ -223,6 +218,25 @@ export default function CircuitTrestleSetting({ id }) {
setAllocationType(ALLOCATION_TYPE.PASSIVITY) setAllocationType(ALLOCATION_TYPE.PASSIVITY)
} }
const onClickPrev = () => {
setAllocationType(ALLOCATION_TYPE.AUTO)
swalFire({
text: '할당한 회로 번호가 초기화됩니다.',
type: 'alert',
icon: 'warning',
confirmFn: () => {
const circuitModules = canvas
.getObjects()
.filter((obj) => obj.name === 'module' && selectedModels.map((model) => model.id).includes(obj.circuit?.circuitInfo?.id))
canvas.remove(...circuitModules.map((module) => module.circuit))
circuitModules.forEach((obj) => {
obj.circuit = null
obj.pcsItemId = null
})
},
})
}
const powerConditionalSelectProps = { const powerConditionalSelectProps = {
tabNum, tabNum,
setTabNum, setTabNum,
@ -245,11 +259,10 @@ export default function CircuitTrestleSetting({ id }) {
pcsCheck, pcsCheck,
selectedModels, selectedModels,
setSelectedModels, setSelectedModels,
getApiProps, getOptYn,
getSelectedModuleList, getUseModuleItemList,
getSelectModelList, getSelectModelList,
getRoofSurfaceList, getRoofSurfaceList,
getModelList,
} }
const stepUpProps = { const stepUpProps = {
@ -257,12 +270,10 @@ export default function CircuitTrestleSetting({ id }) {
setTabNum, setTabNum,
models, models,
setModels, setModels,
circuitAllocationType, getOptYn, // Y/N
setCircuitAllocationType, getUseModuleItemList, // List
getApiProps, getRoofSurfaceList, //
getSelectedModuleList, getPcsItemList, // PCS
getRoofSurfaceList,
getModelList,
} }
return ( return (
@ -297,7 +308,7 @@ export default function CircuitTrestleSetting({ id }) {
)} )}
{tabNum === 1 && allocationType === ALLOCATION_TYPE.PASSIVITY && ( {tabNum === 1 && allocationType === ALLOCATION_TYPE.PASSIVITY && (
<div className="grid-btn-wrap"> <div className="grid-btn-wrap">
<button className="btn-frame modal mr5" onClick={() => setAllocationType(ALLOCATION_TYPE.AUTO)}> <button className="btn-frame modal mr5" onClick={() => onClickPrev()}>
{getMessage('modal.common.prev')} {getMessage('modal.common.prev')}
</button> </button>
<button className="btn-frame modal act" onClick={() => setTabNum(2)}> <button className="btn-frame modal act" onClick={() => setTabNum(2)}>

View File

@ -146,7 +146,7 @@ export default function PowerConditionalSelect(props) {
} }
const onRemoveSelectedModel = (model) => { const onRemoveSelectedModel = (model) => {
setModels(models.map((m) => ({ ...m, selected: m.code !== model.code ? m.selected : false }))) setSelectedModels(selectedModels.filter((m) => m.id !== model.id))
} }
const onChangeMaker = (option) => { const onChangeMaker = (option) => {

View File

@ -10,7 +10,20 @@ import { useContext, useEffect, useState } from 'react'
import { useRecoilValue } from 'recoil' import { useRecoilValue } from 'recoil'
export default function PassivityCircuitAllocation(props) { export default function PassivityCircuitAllocation(props) {
const { tabNum, setTabNum, selectedModels, getApiProps, getSelectedModuleList, getSelectModelList, getRoofSurfaceList, getModelList } = props // getOptYn,
// getUseModuleItemList,
// getSelectModelList,
// getRoofSurfaceList,
const {
tabNum,
setTabNum,
selectedModels,
getOptYn: getApiProps,
getUseModuleItemList: getSelectedModuleList,
getSelectModelList: getSelectModelList,
getRoofSurfaceList,
getModelList,
} = props
const { swalFire } = useSwal() const { swalFire } = useSwal()
const { getMessage } = useMessage() const { getMessage } = useMessage()
const canvas = useRecoilValue(canvasState) const canvas = useRecoilValue(canvasState)
@ -19,21 +32,39 @@ export default function PassivityCircuitAllocation(props) {
const moduleStatistics = useRecoilValue(moduleStatisticsState) const moduleStatistics = useRecoilValue(moduleStatisticsState)
// const [totalWpout, setTotalWpout] = useState(0) // const [totalWpout, setTotalWpout] = useState(0)
const [selectedPcs, setSelectedPcs] = useState(selectedModels[0]) const [selectedPcs, setSelectedPcs] = useState(selectedModels[0])
const { header, rows: row } = moduleStatistics // const { header, rows: row } = moduleStatistics
const [headers, setHeaders] = useState(header) const [header, setHeader] = useState(moduleStatistics.header)
const [rows, setRows] = useState(row) const [rows, setRows] = useState(moduleStatistics.rows)
const [footer, setFooter] = useState(['합계']) const [footer, setFooter] = useState(['합계'])
const [circuitNumber, setCircuitNumber] = useState(1) const [circuitNumber, setCircuitNumber] = useState(1)
const [targetModules, setTargetModules] = useState([]) const [targetModules, setTargetModules] = useState([])
const { getPcsManualConfChk } = useMasterController() const { getPcsManualConfChk } = useMasterController()
useEffect(() => { useEffect(() => {
console.log('🚀 ~ PassivityCircuitAllocation ~ selectedModels:', selectedModels) console.log('header, rows', header, rows)
}, []) // setSurfaceInfo()
setTableData()
if (!managementState) {
setManagementState(managementStateLoaded)
}
canvas
.getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE)
.forEach((obj) => {
obj.on('mousedown', (e) => handleTargetModules(obj))
})
useEffect(() => { return () => {
console.log('🚀 ~ PassivityCircuitAllocation ~ selectedPcs:', selectedPcs) canvas
}, [selectedPcs]) .getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE)
.forEach((obj) => {
obj.set({ strokeWidth: 0.3 })
obj.off('mousedown')
})
canvas.renderAll()
}
}, [])
const handleTargetModules = (obj) => { const handleTargetModules = (obj) => {
if (!Array.isArray(targetModules)) { if (!Array.isArray(targetModules)) {
@ -54,32 +85,9 @@ export default function PassivityCircuitAllocation(props) {
canvas.renderAll() canvas.renderAll()
} }
useEffect(() => {
setSurfaceInfo()
if (!managementState) {
setManagementState(managementStateLoaded)
}
const modules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE)
modules.forEach((obj) => {
obj.on('mousedown', (e) => handleTargetModules(obj))
})
return () => {
canvas
.getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE)
.forEach((obj) => {
obj.set({ strokeWidth: 0.3 })
obj.off('mousedown')
})
canvas.renderAll()
}
}, [])
const setSurfaceInfo = () => { const setSurfaceInfo = () => {
const surfaces = canvas.getObjects().filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name) const surfaces = canvas.getObjects().filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name)
setHeaders([header[0], { name: '회로', prop: 'circuit' }, ...header.slice(1)]) // setHeaders([header[0], { name: '', prop: 'circuit' }, ...header.slice(1)])
setRows( setRows(
rows.map((row) => { rows.map((row) => {
return { return {
@ -155,62 +163,144 @@ export default function PassivityCircuitAllocation(props) {
if (!circuitNumber || circuitNumber === 0) { if (!circuitNumber || circuitNumber === 0) {
swalFire({ swalFire({
text: '회로번호를 1 이상입력해주세요.', text: '회로번호를 1 이상입력해주세요.',
type: 'warning', type: 'alert',
icon: 'warning', icon: 'warning',
}) })
return return
} else if (targetModules.length === 0) { } else if (targetModules.length === 0) {
swalFire({ swalFire({
text: '모듈을 선택해주세요.', text: '모듈을 선택해주세요.',
type: 'warning', type: 'alert',
icon: 'warning', icon: 'warning',
}) })
return return
} else if (selectedModels.length > 1) {
const uniqueCircuitNumbers = [
...new Set(
canvas
.getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE && obj.circuitNumber)
.map((obj) => obj.circuitNumber),
),
]
let result = false
uniqueCircuitNumbers.forEach((number) => {
if (
number.split('-')[1] === circuitNumber + ')' &&
number.split('-')[0] !== '(' + (selectedModels.findIndex((model) => model.id === selectedPcs.id) + 1)
) {
result = true
}
})
if (result) {
swalFire({
text: '회로 번호가 같은 다른 파워 컨디셔너 모듈이 있습니다. 다른 회로 번호를 설정하십시오.',
type: 'alert',
icon: 'warning',
})
return
}
} }
canvas.discardActiveObject()
canvas
.getObjects()
.filter((obj) => targetModules.includes(obj.id))
.forEach((obj) => {
const moduleCircuitText = new fabric.Text(getCircuitNumber(), {
left: obj.left + obj.width / 2,
top: obj.top + obj.height / 2,
fill: 'black',
fontSize: 20,
width: obj.width,
height: obj.height,
textAlign: 'center',
originX: 'center',
originY: 'center',
name: 'circuitNumber',
parentId: obj.id,
circuitInfo: selectedPcs,
})
obj.set({
strokeWidth: 0.3,
})
obj.pcsItemId = selectedPcs.itemId
obj.circuit = moduleCircuitText
obj.circuitNumber = getCircuitNumber()
canvas.add(moduleCircuitText)
})
const roofSurfaceList = canvas
.getObjects()
.filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name)
.map((surface) => {
return {
roofSurfaceId: surface.id,
roofSurface: surface.direction,
roofSurfaceIncl: surface.incl,
moduleList: surface.modules.map((module) => {
return {
itemId: module.moduleInfo.itemId,
circuit: module.circuitNumber,
pcsItemId: module.pcsItemId,
}
}),
}
})
const pcsItemList = selectedModels.map((model) => {
return {
pcsMkrCd: model.pcsMkrCd,
pcsSerCd: model.pcsSerCd,
itemId: model.itemId,
itemNm: model.itemNm,
goodsNo: model.goodsNo,
serQtyList: [
{
serQty: 0,
paralQty: 0,
rmdYn: 'Y',
usePossYn: 'Y',
roofSurfaceList: roofSurfaceList,
},
],
}
})
const params = { const params = {
...getApiProps(), ...getApiProps(),
useModuleItemList: getSelectedModuleList(), useModuleItemList: getSelectedModuleList(),
pcsItemList: getSelectModelList(), pcsItemList: pcsItemList,
} }
console.log(params)
// getPcsManualConfChk(params).then((res) => {
// console.log(res)
//
// })
// canvas.discardActiveObject() getPcsManualConfChk(params).then((res) => {
// if (res.resultCode === 'E') {
// canvas swalFire({
// .getObjects() text: res.resultMsg,
// .filter((obj) => targetModules.includes(obj.id)) type: 'alert',
// .forEach((obj) => { icon: 'warning',
// const moduleCircuitText = new fabric.Text(getCircuitNumber(), { confirmFn: () => {
// left: obj.left + obj.width / 2, const circuitNumbers = canvas.getObjects().filter((obj) => obj.name === 'circuitNumber' && targetModules.includes(obj.parentId))
// top: obj.top + obj.height / 2, canvas.remove(...circuitNumbers)
// fill: 'black', canvas
// fontSize: 20, .getObjects()
// width: obj.width, .filter((obj) => obj.name === 'module' && targetModules.includes(obj.id))
// height: obj.height, .forEach((obj) => {
// textAlign: 'center', obj.pcsItemId = null
// originX: 'center', obj.circuit = null
// originY: 'center', obj.circuitNumber = null
// name: 'circuitNumber', })
// parentId: obj.id, canvas.renderAll()
// circuitInfo: selectedPcs, },
// }) })
// obj.set({
// strokeWidth: 0.3,
// })
// obj.pcsItemId = selectedPcs.itemId
// obj.circuit = moduleCircuitText return
// canvas.add(moduleCircuitText) }
// canvas.renderAll()
// console.log(obj) setTargetModules([])
// }) setCircuitNumber(+circuitNumber + 1)
// setTargetModules([]) })
// setCircuitNumber(+circuitNumber + 1)
// canvas.renderAll()
} }
const getCircuitNumber = () => { const getCircuitNumber = () => {
@ -221,12 +311,36 @@ export default function PassivityCircuitAllocation(props) {
} }
} }
const setTableData = () => {
const tempHeader = [
{ name: '지붕면', prop: 'name' },
{ name: '회로', prop: 'circuit' },
...selectedModules.itemList.map((module) => {
return {
name: module.itemNm,
prop: module.itemId,
}
}),
{ name: '발전량(kW)', prop: 'wpOut' },
]
const tempRows = rows.map((row) => {
return {
name: '',
circuit: '',
...selectedModules.itemList.map((module) => {
return {
name: module.itemNm,
prop: module.itemId,
}
}),
wpOut: 0,
}
})
console.log('tempHeader', tempHeader)
}
const initSelectedPcsCircuitNumber = () => { const initSelectedPcsCircuitNumber = () => {
console.log(
'module',
canvas.getObjects().filter((obj) => obj.name === 'module'),
)
console.log('selectedPcs', selectedPcs)
swalFire({ swalFire({
title: '선택된 파워 컨디셔너의 회로할당을 초기화합니다.', title: '선택된 파워 컨디셔너의 회로할당을 초기화합니다.',
type: 'confirm', type: 'confirm',
@ -281,7 +395,7 @@ export default function PassivityCircuitAllocation(props) {
<table> <table>
<thead> <thead>
<tr> <tr>
{headers.map((header, index) => ( {header.map((header, index) => (
<th key={'header' + index}>{header.name}</th> <th key={'header' + index}>{header.name}</th>
))} ))}
</tr> </tr>
@ -289,7 +403,7 @@ export default function PassivityCircuitAllocation(props) {
<tbody> <tbody>
{rows.map((row, index) => ( {rows.map((row, index) => (
<tr key={'row' + index}> <tr key={'row' + index}>
{headers.map((header, i) => ( {header.map((header, i) => (
<td className="al-c" key={'rowcell' + i}> <td className="al-c" key={'rowcell' + i}>
{row[header.prop]} {row[header.prop]}
</td> </td>