Merge branch 'dev' of https://git.hanasys.jp/qcast3/qcast-front into hotfix/dev_yscha

This commit is contained in:
ysCha 2026-04-16 13:18:59 +09:00
commit 83101a8e09

View File

@ -134,9 +134,7 @@ export default function StepUp(props) {
const moduleIds = targetSurface.modules.map((module) => module.id)
/** 기존 모듈 텍스트 삭제 */
canvas
.getObjects()
.filter((obj) => moduleIds.includes(obj.parentId))
;[...canvas.getObjects().filter((obj) => moduleIds.includes(obj.parentId))]
.forEach((text) => canvas.remove(text))
/** 새로운 모듈 회로 정보 추가 */
@ -410,61 +408,100 @@ export default function StepUp(props) {
* 주어진 stepUpListData 기준으로 캔버스의 모든 module circuit 텍스트를 다시 그린다.
* 모든 pcsItem selected serQty 순회해 적용한다.
*/
const applyCircuitsToCanvas = (stepUpListSrc) => {
/**
* 모듈에 circuit 텍스트를 추가하는 공통 함수
*/
const addCircuitTextToModule = (module) => {
const targetModule = canvas.getObjects().find((obj) => obj.id === module.uniqueId)
if (targetModule && module.circuit !== '' && module.circuit !== null) {
const moduleCircuitText = new fabric.Text(module.circuit, {
left: targetModule.left + targetModule.width / 2,
top: targetModule.top + targetModule.height / 2,
fontFamily: circuitNumberText.fontFamily.value,
fontWeight: circuitNumberText.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal',
fontStyle: circuitNumberText.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal',
fontSize: circuitNumberText.fontSize.value,
fill: circuitNumberText.fontColor.value,
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 applyCircuitsToCanvas = (stepUpListSrc, mainIdx, subIdx) => {
if (!stepUpListSrc?.[0]?.pcsItemList) return
/** 모든 모듈 circuit 데이터 초기화 */
canvas
.getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE)
.forEach((module) => {
if (mainIdx >= 1) {
/**
* 우측 PCS (mainIdx >= 1) 클릭 :
* 해당 pcsItem selected serQty 찾아서 moduleList circuit 갱신한다.
* 좌측 PCS circuit 그대로 유지.
*/
const pcsItem = stepUpListSrc[0].pcsItemList[mainIdx]
const sel = pcsItem?.serQtyList?.find((sq) => sq.selected)
if (!sel) return
// pcsItem moduleList circuit
const moduleUniqueIds = new Set()
sel.roofSurfaceList.forEach((rs) => {
rs.moduleList.forEach((m) => moduleUniqueIds.add(m.uniqueId))
})
// circuit +
const targetModuleObjs = canvas.getObjects().filter(
(obj) => obj.name === POLYGON_TYPE.MODULE && moduleUniqueIds.has(obj.id),
)
targetModuleObjs.forEach((module) => {
module.circuit = null
module.circuitNumber = null
module.pcsItemId = null
})
/** 기존 circuit 텍스트 객체 모두 제거 */
canvas
.getObjects()
.filter((obj) => obj.name === 'circuitNumber')
.forEach((text) => canvas.remove(text))
const textsToRemove = [...canvas.getObjects().filter(
(obj) => obj.name === 'circuitNumber' && moduleUniqueIds.has(obj.parentId),
)]
textsToRemove.forEach((text) => canvas.remove(text))
stepUpListSrc[0].pcsItemList.forEach((pcsItem) => {
const sel = pcsItem.serQtyList?.find((sq) => sq.selected)
if (!sel) return
// circuit
sel.roofSurfaceList.forEach((roofSurface) => {
const targetSurface = canvas.getObjects().filter((obj) => obj.id === roofSurface.roofSurfaceId)[0]
if (!targetSurface) return
roofSurface.moduleList.forEach((module) => addCircuitTextToModule(module))
})
} else {
/**
* 좌측 PCS (mainIdx === 0) 클릭 :
* 전체 모듈 circuit 초기화 모든 pcsItem selected 적용
*/
canvas
.getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE)
.forEach((module) => {
module.circuit = null
module.circuitNumber = null
module.pcsItemId = null
})
roofSurface.moduleList.forEach((module) => {
const targetModule = canvas.getObjects().find((obj) => obj.id === module.uniqueId)
if (targetModule && module.circuit !== '' && module.circuit !== null) {
const moduleCircuitText = new fabric.Text(module.circuit, {
left: targetModule.left + targetModule.width / 2,
top: targetModule.top + targetModule.height / 2,
fontFamily: circuitNumberText.fontFamily.value,
fontWeight: circuitNumberText.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal',
fontStyle: circuitNumberText.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal',
fontSize: circuitNumberText.fontSize.value,
fill: circuitNumberText.fontColor.value,
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 circuitTexts = [...canvas.getObjects().filter((obj) => obj.name === 'circuitNumber')]
circuitTexts.forEach((text) => canvas.remove(text))
stepUpListSrc[0].pcsItemList.forEach((pcsItem) => {
const sel = pcsItem.serQtyList?.find((sq) => sq.selected)
if (!sel) return
sel.roofSurfaceList.forEach((roofSurface) => {
roofSurface.moduleList.forEach((module) => addCircuitTextToModule(module))
})
})
})
}
canvas.renderAll()
setModuleStatisticsData()
@ -483,8 +520,7 @@ export default function StepUp(props) {
setStepUpListData(tempStepUpListData)
/** PCS 2개 이상 또는 첫번째 PCS 선택 시에만 실행 */
const needsRefetch =
tempStepUpListData[0].pcsItemList.length > 1 && mainIdx === 0
const needsRefetch = tempStepUpListData[0].pcsItemList.length > 1 && mainIdx === 0
if (needsRefetch) {
/** 파워컨디셔너 옵션 조회 요청 파라미터 */
@ -522,10 +558,10 @@ export default function StepUp(props) {
const dataArray = Array.isArray(res.data) ? res.data : [res.data]
const newStepUpListData = formatStepUpListData(dataArray)
setStepUpListData(newStepUpListData)
applyCircuitsToCanvas(newStepUpListData)
applyCircuitsToCanvas(newStepUpListData, mainIdx, subIdx)
} else {
swalFire({ text: getMessage('common.message.send.error') })
applyCircuitsToCanvas(tempStepUpListData)
applyCircuitsToCanvas(tempStepUpListData, mainIdx, subIdx)
}
})
return
@ -533,7 +569,7 @@ export default function StepUp(props) {
}
/** API 재조회가 없는 경로: 현재 tempStepUpListData 로 즉시 캔버스 갱신 */
applyCircuitsToCanvas(tempStepUpListData)
applyCircuitsToCanvas(tempStepUpListData, mainIdx, subIdx)
}
/**
@ -551,7 +587,17 @@ export default function StepUp(props) {
paralQty: serQty.paralQty,
// : itemId 1,
connections: item.connList?.length
? [...new Map(item.connList.map((conn) => [conn.itemId, { connItemId: conn.itemId, connMaxParalCnt: conn.connMaxParalCnt }])).values()]
? [
...new Map(
item.connList.map((conn) => [
conn.itemId,
{
connItemId: conn.itemId,
connMaxParalCnt: conn.connMaxParalCnt,
},
]),
).values(),
]
: [],
}
})