Merge branch 'dev' into dev-yj
This commit is contained in:
commit
ef696385c7
@ -9,14 +9,12 @@ import { usePlan } from '@/hooks/usePlan'
|
||||
|
||||
import WithDraggable from '@/components/common/draggable/WithDraggable'
|
||||
import { useCanvas } from '@/hooks/useCanvas'
|
||||
import { useRecoilValue } from 'recoil'
|
||||
import { canvasState } from '@/store/canvasAtom'
|
||||
// import { initImageLoaderPopup } from '@/lib/planAction'
|
||||
|
||||
export default function ImgLoad() {
|
||||
const { currentCanvasPlan, setCurrentCanvasPlan } = usePlan()
|
||||
const { getMessage } = useMessage()
|
||||
const { canvas, handleCanvasToPng } = useCanvas()
|
||||
const { canvas } = useCanvas()
|
||||
const { floorPlanState, setFloorPlanState } = useContext(FloorPlanContext)
|
||||
const {
|
||||
refImage,
|
||||
|
||||
@ -23,6 +23,7 @@ import { v4 as uuidv4 } from 'uuid'
|
||||
import { useEstimate } from '@/hooks/useEstimate'
|
||||
import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle'
|
||||
import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupStatusController'
|
||||
import { useImgLoader } from '@/hooks/floorPlan/useImgLoader'
|
||||
|
||||
const ALLOCATION_TYPE = {
|
||||
AUTO: 'auto',
|
||||
@ -46,10 +47,13 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
// 회로할당(승합설정)에서 선택된 값들을 저장할 상태 추가
|
||||
const [selectedStepUpValues, setSelectedStepUpValues] = useState({})
|
||||
const [getStepUpSelections, setGetStepUpSelections] = useState(null)
|
||||
const { trigger: setCircuitData } = useCanvasPopupStatusController(4)
|
||||
// const { trigger: setCircuitData } = useCanvasPopupStatusController(4)
|
||||
// const [stepUpListData, setStepUpListData] = useRecoilState(stepUpListDataState)
|
||||
const [stepUpListData, setStepUpListData] = useState([])
|
||||
const [seletedOption, setSeletedOption] = useState(null)
|
||||
|
||||
const { handleCanvasToPng } = useImgLoader()
|
||||
|
||||
const {
|
||||
makers,
|
||||
setMakers,
|
||||
@ -71,19 +75,19 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
getModuleList,
|
||||
removeNotAllocationModules,
|
||||
} = useCircuitTrestle()
|
||||
|
||||
// const { trigger: moduleSelectedDataTrigger } = useCanvasPopupStatusController(2)
|
||||
useEffect(() => {
|
||||
if (!managementState) {
|
||||
setManagementState(managementStateLoaded)
|
||||
}
|
||||
setCircuitData({
|
||||
makers,
|
||||
selectedMaker,
|
||||
series,
|
||||
models,
|
||||
selectedModels,
|
||||
pcsCheck,
|
||||
})
|
||||
// setCircuitData({
|
||||
// makers,
|
||||
// selectedMaker,
|
||||
// series,
|
||||
// models,
|
||||
// selectedModels,
|
||||
// pcsCheck,
|
||||
// })
|
||||
}, [])
|
||||
|
||||
// 수동할당 시 모듈 삭제
|
||||
@ -137,7 +141,7 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
...getOptYn(),
|
||||
useModuleItemList: getUseModuleItemList(),
|
||||
roofSurfaceList: getRoofSurfaceList(),
|
||||
pcsItemList: getPcsItemList(),
|
||||
pcsItemList: pcsItemList,
|
||||
}
|
||||
// 추천 목록 선택
|
||||
setSelectedModels(pcsItemList)
|
||||
@ -245,10 +249,6 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
// 파워컨디셔너 추천 목록 조회
|
||||
getPcsAutoRecommendList(params).then((res) => {
|
||||
if (res.data?.pcsItemList) {
|
||||
const itemList = models.filter((model) => {
|
||||
return res.data?.pcsItemList.map((item) => item.itemId).includes(model.itemId)
|
||||
})
|
||||
|
||||
let pcsItemList = []
|
||||
let pcsObj = {}
|
||||
models.forEach((model) => {
|
||||
@ -339,12 +339,11 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
|
||||
setViewCircuitNumberTexts(false)
|
||||
|
||||
//TODO : 이미지 저장
|
||||
handleCanvasToPng(1)
|
||||
|
||||
const result = await apply()
|
||||
if (result) {
|
||||
// TODO : 이미지 저장
|
||||
|
||||
handleCanvasToPng(2)
|
||||
setViewCircuitNumberTexts(true)
|
||||
await saveEstimate(result)
|
||||
}
|
||||
@ -353,21 +352,25 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
|
||||
// 이전 버튼 클릭 시
|
||||
const onClickPrev = () => {
|
||||
setAllocationType(ALLOCATION_TYPE.AUTO)
|
||||
// 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))
|
||||
const circuitModules = canvas.getObjects().filter((obj) => obj.name === 'module')
|
||||
canvas.remove(...circuitModules.map((module) => module.circuit))
|
||||
circuitModules.forEach((obj) => {
|
||||
obj.circuit = null
|
||||
obj.pcsItemId = null
|
||||
})
|
||||
setAllocationType(ALLOCATION_TYPE.AUTO)
|
||||
|
||||
if (allocationType === ALLOCATION_TYPE.PASSIVITY) {
|
||||
setAllocationType(ALLOCATION_TYPE.AUTO)
|
||||
} else {
|
||||
setTabNum(1)
|
||||
}
|
||||
|
||||
canvas.renderAll()
|
||||
},
|
||||
})
|
||||
@ -513,7 +516,7 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
)}
|
||||
{tabNum === 2 && (
|
||||
<div className="grid-btn-wrap">
|
||||
<button className="btn-frame modal mr5" onClick={() => setTabNum(1)}>
|
||||
<button className="btn-frame modal mr5" onClick={() => onClickPrev()}>
|
||||
{getMessage('modal.common.prev')}
|
||||
</button>
|
||||
{/* <button className="btn-frame modal act" onClick={() => apply()}> */}
|
||||
|
||||
@ -37,6 +37,7 @@ export default function PowerConditionalSelect(props) {
|
||||
const { getPcsMakerList, getPcsModelList } = useMasterController()
|
||||
const selectedModules = useRecoilValue(selectedModuleState)
|
||||
const { swalFire } = useSwal()
|
||||
// const [moduleSelectionData, setModuleSelectionData] = useRecoilState(moduleSelectionDataState)
|
||||
const modelHeader = [
|
||||
{ name: getMessage('시리즈'), width: '15%', prop: 'pcsSerNm', type: 'color-box' },
|
||||
{ name: getMessage('명칭'), width: '15%', prop: 'goodsNo', type: 'color-box' },
|
||||
@ -129,12 +130,7 @@ export default function PowerConditionalSelect(props) {
|
||||
const pcsSerList = selectedSeries.map((series) => {
|
||||
return { pcsSerCd: series.pcsSerCd }
|
||||
})
|
||||
const moduleItemList = selectedModules.itemList?.map((module) => {
|
||||
return {
|
||||
itemId: module.itemId,
|
||||
mixMatlNo: module.mixMatlNo,
|
||||
}
|
||||
})
|
||||
const moduleItemList = getUseModuleItemList()
|
||||
getPcsModelList({ pcsMkrCd, pcsSerList, moduleItemList }).then((res) => {
|
||||
if (res?.result.code === 200 && res?.data) {
|
||||
setModels(
|
||||
|
||||
@ -52,6 +52,18 @@ export default function PanelEdit(props) {
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
const completeSurfaces = canvas.getObject().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE && obj.isComplete)
|
||||
|
||||
if (completeSurfaces.length > 0) {
|
||||
swalFire({
|
||||
title: getMessage('modal.module.can.not.edit'),
|
||||
type: 'alert',
|
||||
icon: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case PANEL_EDIT_TYPE.MOVE:
|
||||
moduleMove(length, direction)
|
||||
|
||||
@ -7,6 +7,9 @@ import { moduleStatisticsState } from '@/store/circuitTrestleAtom'
|
||||
import { useRecoilValue, useResetRecoilState } from 'recoil'
|
||||
import { useModule } from '@/hooks/module/useModule'
|
||||
import { useEavesGableEdit } from '@/hooks/roofcover/useEavesGableEdit'
|
||||
import { canvasState } from '@/store/canvasAtom'
|
||||
import { POLYGON_TYPE } from '@/common/common'
|
||||
import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle'
|
||||
|
||||
export default function PanelBatchStatistics() {
|
||||
const { getMessage } = useMessage()
|
||||
@ -15,11 +18,18 @@ export default function PanelBatchStatistics() {
|
||||
x: 0,
|
||||
y: 30,
|
||||
})
|
||||
const canvas = useRecoilValue(canvasState)
|
||||
const { header, rows, footer } = useRecoilValue(moduleStatisticsState)
|
||||
const { setModuleStatisticsData } = useModule()
|
||||
const { setModuleStatisticsData } = useCircuitTrestle()
|
||||
|
||||
useEffect(() => {
|
||||
const roofSurfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
|
||||
console.log('🚀 ~ useEffect ~ roofSurfaces1:', roofSurfaces)
|
||||
setModuleStatisticsData()
|
||||
console.log(
|
||||
'🚀 ~ useEffect ~ roofSurfaces2:',
|
||||
canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE),
|
||||
)
|
||||
}, [])
|
||||
|
||||
return (
|
||||
|
||||
@ -137,16 +137,6 @@ export function useMasterController() {
|
||||
* @returns
|
||||
*/
|
||||
const getPcsModelList = async (params = null) => {
|
||||
const test = {
|
||||
pcsMkrCd: 'MKR003',
|
||||
pcsSerList: [{ pcsSerCd: 'SER007' }, { pcsSerCd: 'SER009' }, { pcsSerCd: 'SER010' }],
|
||||
moduleItemList: [
|
||||
{ itemId: '107015', mixMatlNo: null },
|
||||
{ itemId: '107077', mixMatlNo: null },
|
||||
{ itemId: '107015', mixMatlNo: null },
|
||||
],
|
||||
}
|
||||
|
||||
return await post({ url: '/api/v1/master/getPcsSeriesItemList', data: params }).then((res) => {
|
||||
return res
|
||||
})
|
||||
|
||||
70
src/hooks/floorPlan/useImgLoader.js
Normal file
70
src/hooks/floorPlan/useImgLoader.js
Normal file
@ -0,0 +1,70 @@
|
||||
import { useRecoilValue } from 'recoil'
|
||||
import { canvasState } from '@/store/canvasAtom'
|
||||
import { useCanvas } from '../useCanvas'
|
||||
import { useAxios } from '../useAxios'
|
||||
import { usePlan } from '../usePlan'
|
||||
import { POLYGON_TYPE } from '@/common/common'
|
||||
|
||||
/**
|
||||
* 이미지 로더 hook
|
||||
* @returns {function} handleCanvasToPng
|
||||
*/
|
||||
export function useImgLoader() {
|
||||
const canvas = useRecoilValue(canvasState)
|
||||
const { removeMouseLines } = useCanvas()
|
||||
const { currentCanvasPlan } = usePlan()
|
||||
const { post } = useAxios()
|
||||
|
||||
/**
|
||||
* 이미지 저장 시 왼쪽 위, 오른쪽 아래 좌표
|
||||
* return [start, end]
|
||||
*/
|
||||
const getImageCoordinates = () => {
|
||||
const margin = 20
|
||||
|
||||
const objects = canvas.getObjects().filter((obj) => [POLYGON_TYPE.ROOF, 'lengthText', 'arrow'].includes(obj.name))
|
||||
|
||||
const minX = objects.reduce((acc, cur) => (cur.left < acc ? cur.left : acc), objects[0].left)
|
||||
const minY = objects.reduce((acc, cur) => (cur.top < acc ? cur.top : acc), objects[0].top)
|
||||
|
||||
const maxX = objects.reduce((acc, cur) => (cur.left + cur.width > acc ? cur.left + cur.width : acc), 0)
|
||||
const maxY = objects.reduce((acc, cur) => (cur.top + cur.height > acc ? cur.top + cur.height : acc), 0)
|
||||
return [
|
||||
{ x: minX - margin, y: minY - margin },
|
||||
{ x: maxX + margin, y: maxY + margin },
|
||||
]
|
||||
}
|
||||
|
||||
/**
|
||||
* 캔버스를 이미지로 저장
|
||||
* @param {integer} type 1: 모듈만 있는 상태, 2: 가대까지 올린 상태
|
||||
*/
|
||||
const handleCanvasToPng = async (type) => {
|
||||
removeMouseLines()
|
||||
|
||||
canvas.getObjects('image').forEach((obj) => {
|
||||
if (obj.getSrc) {
|
||||
const img = new Image()
|
||||
img.crossOrigin = 'anonymous'
|
||||
img.src = obj.getSrc()
|
||||
obj.setElement(img)
|
||||
}
|
||||
})
|
||||
|
||||
canvas.renderAll()
|
||||
|
||||
const res = await post({
|
||||
url: `${process.env.NEXT_PUBLIC_HOST_URL}/image/canvas`,
|
||||
data: {
|
||||
objectNo: currentCanvasPlan.objectNo,
|
||||
planNo: currentCanvasPlan.planNo,
|
||||
type,
|
||||
canvasToPng: canvas.toDataURL('image/png').replace('data:image/png;base64,', ''),
|
||||
coordinates: getImageCoordinates(),
|
||||
},
|
||||
})
|
||||
console.log('🚀 ~ handleCanvasToPng ~ res:', res)
|
||||
}
|
||||
|
||||
return { handleCanvasToPng }
|
||||
}
|
||||
@ -9,6 +9,7 @@ import { useModuleBasicSetting } from './useModuleBasicSetting'
|
||||
import { useMessage } from '../useMessage'
|
||||
import { selectedModuleState } from '@/store/selectedModuleOptions'
|
||||
import { moduleStatisticsState } from '@/store/circuitTrestleAtom'
|
||||
import { useCircuitTrestle } from '../useCirCuitTrestle'
|
||||
|
||||
export const MODULE_REMOVE_TYPE = {
|
||||
LEFT: 'left',
|
||||
@ -38,7 +39,7 @@ export function useModule() {
|
||||
const { getMessage } = useMessage()
|
||||
const { checkModuleDisjointObjects } = useModuleBasicSetting()
|
||||
const selectedModules = useRecoilValue(selectedModuleState)
|
||||
const setModuleStatistics = useSetRecoilState(moduleStatisticsState)
|
||||
const { setModuleStatisticsData } = useCircuitTrestle()
|
||||
|
||||
const moduleMove = (length, direction) => {
|
||||
const selectedObj = canvas.getActiveObjects() //선택된 객체들을 가져옴
|
||||
@ -979,93 +980,6 @@ export function useModule() {
|
||||
.filter((obj) => [BATCH_TYPE.OPENING, BATCH_TYPE.TRIANGLE_DORMER, BATCH_TYPE.PENTAGON_DORMER, BATCH_TYPE.SHADOW].includes(obj.name))
|
||||
}
|
||||
|
||||
const setModuleStatisticsData = () => {
|
||||
if (selectedModules?.length === 0) return
|
||||
const tempHeader = [
|
||||
{ name: getMessage('simulator.table.sub1'), prop: 'name' },
|
||||
{ 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: 'wpOut' },
|
||||
]
|
||||
const surfaceObjects = {}
|
||||
const surfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
|
||||
const rows = surfaces.map((surface) => {
|
||||
surfaceObjects[surface.id] = {
|
||||
roofSurface: canvas.getObjects().filter((obj) => obj.id === surface.parentId)[0].directionText,
|
||||
circuit: '-',
|
||||
amount: 0,
|
||||
wpOut: 0,
|
||||
circuits: {},
|
||||
}
|
||||
|
||||
surface.modules.forEach((module) => {
|
||||
if (!surfaceObjects[surface.id][module.moduleInfo.itemId]) {
|
||||
// 지붕면에 모듈 존재 여부
|
||||
surfaceObjects[surface.id][module.moduleInfo.itemId] = 0 // 모듈 초기화
|
||||
}
|
||||
|
||||
surfaceObjects[surface.id][module.moduleInfo.itemId]++
|
||||
surfaceObjects[surface.id].wpOut += +module.moduleInfo.wpOut
|
||||
if (module.circuit) {
|
||||
if (!surfaceObjects[surface.id].circuits[module.circuitNumber]) {
|
||||
surfaceObjects[surface.id].circuits[module.circuitNumber] = {
|
||||
circuit: module.circuitNumber,
|
||||
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
|
||||
}
|
||||
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]++
|
||||
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits.wpOut += +module.moduleInfo.wpOut
|
||||
surfaceObjects[surface.id].wpOut -= +module.moduleInfo.wpOut
|
||||
surfaceObjects[surface.id][module.moduleInfo.itemId]--
|
||||
}
|
||||
})
|
||||
})
|
||||
let tempRows = []
|
||||
Object.keys(surfaceObjects).forEach((key) => {
|
||||
let tempRow = {
|
||||
name: surfaceObjects[key].roofSurface,
|
||||
circuit: surfaceObjects[key].circuit,
|
||||
wpOut: parseFloat(surfaceObjects[key].wpOut / 1000),
|
||||
}
|
||||
selectedModules.itemList.forEach((module) => {
|
||||
tempRow[module.itemId] = surfaceObjects[key][module.itemId]
|
||||
})
|
||||
tempRows.push(tempRow)
|
||||
|
||||
Object.keys(surfaceObjects[key].circuits).forEach((circuit) => {
|
||||
let row = {
|
||||
name: surfaceObjects[key].roofSurface,
|
||||
circuit: surfaceObjects[key].circuits[circuit].circuit,
|
||||
wpOut: parseFloat(surfaceObjects[key].circuits[circuit].circuits.wpOut / 1000),
|
||||
}
|
||||
selectedModules.itemList.forEach((module) => {
|
||||
row[module.itemId] = surfaceObjects[key].circuits[circuit].circuits[module.itemId]
|
||||
})
|
||||
tempRows.push(row)
|
||||
})
|
||||
})
|
||||
|
||||
const tempFooter = {
|
||||
name: getMessage('modal.panel.batch.statistic.total'),
|
||||
circuit: '-',
|
||||
wpOut: tempRows.reduce((acc, row) => acc + row.wpOut, 0),
|
||||
}
|
||||
selectedModules.itemList.forEach((module) => {
|
||||
tempFooter[module.itemId] = tempRows.reduce((acc, row) => acc + row[module.itemId], 0)
|
||||
})
|
||||
setModuleStatistics({ header: tempHeader, rows: tempRows.filter((row) => row.wpOut !== 0), footer: tempFooter })
|
||||
}
|
||||
|
||||
return {
|
||||
moduleMove,
|
||||
moduleMultiMove,
|
||||
@ -1080,6 +994,5 @@ export function useModule() {
|
||||
modulesRemove,
|
||||
moduleRoofRemove,
|
||||
alignModule,
|
||||
setModuleStatisticsData,
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,9 +24,7 @@ export function useCanvas(id) {
|
||||
const [canvasSize] = useRecoilState(canvasSizeState)
|
||||
const [fontSize] = useRecoilState(fontSizeState)
|
||||
const { setCanvasForEvent, attachDefaultEventOnCanvas } = useCanvasEvent()
|
||||
const { post } = useAxios()
|
||||
const {} = useFont()
|
||||
const { currentCanvasPlan, setCurrentCanvasPlan } = usePlan()
|
||||
|
||||
/**
|
||||
* 처음 셋팅
|
||||
@ -544,70 +542,6 @@ export function useCanvas(id) {
|
||||
canvas.clear()
|
||||
}
|
||||
|
||||
/**
|
||||
* 이미지 저장 시 왼쪽 위, 오른쪽 아래 좌표
|
||||
* return [start, end]
|
||||
*/
|
||||
const getImageCoordinates = () => {
|
||||
const margin = 20
|
||||
|
||||
const objects = canvas.getObjects().filter((obj) => [POLYGON_TYPE.ROOF, 'lengthText', 'arrow'].includes(obj.name))
|
||||
|
||||
const minX = objects.reduce((acc, cur) => (cur.left < acc ? cur.left : acc), objects[0].left)
|
||||
const minY = objects.reduce((acc, cur) => (cur.top < acc ? cur.top : acc), objects[0].top)
|
||||
|
||||
const maxX = objects.reduce((acc, cur) => (cur.left + cur.width > acc ? cur.left + cur.width : acc), 0)
|
||||
const maxY = objects.reduce((acc, cur) => (cur.top + cur.height > acc ? cur.top + cur.height : acc), 0)
|
||||
return [
|
||||
{ x: minX - margin, y: minY - margin },
|
||||
{ x: maxX + margin, y: maxY + margin },
|
||||
]
|
||||
}
|
||||
|
||||
/**
|
||||
* 캔버스를 이미지로 저장
|
||||
* @param {integer} type 1: 모듈만 있는 상태, 2: 가대까지 올린 상태
|
||||
*/
|
||||
const handleCanvasToPng = async (type) => {
|
||||
removeMouseLines()
|
||||
// const currentCanvasStatus = canvas?.toDataURL('image/png').replace('data:image/png;base64,', '')
|
||||
// const currentCanvasStatus = canvas
|
||||
// ?.toDataURL({
|
||||
// width: canvas.width,
|
||||
// height: canvas.height,
|
||||
// left: 0,
|
||||
// top: 0,
|
||||
// format: 'png',
|
||||
// })
|
||||
// .replace('data:image/png;base64,', '')
|
||||
canvas.getObjects('image').forEach((obj) => {
|
||||
if (obj.getSrc) {
|
||||
const img = new Image()
|
||||
img.crossOrigin = 'anonymous'
|
||||
img.src = obj.getSrc()
|
||||
obj.setElement(img)
|
||||
}
|
||||
})
|
||||
canvas.renderAll()
|
||||
|
||||
// const dataURL = canvas.toDataURL({
|
||||
// format: 'png',
|
||||
// quality: 1,
|
||||
// })
|
||||
|
||||
const res = await post({
|
||||
url: `${process.env.NEXT_PUBLIC_HOST_URL}/image/canvas`,
|
||||
data: {
|
||||
objectNo: currentCanvasPlan.objectNo,
|
||||
planNo: currentCanvasPlan.planNo,
|
||||
type,
|
||||
canvasToPng: canvas.toDataURL('image/png').replace('data:image/png;base64,', ''),
|
||||
coordinates: getImageCoordinates(),
|
||||
},
|
||||
})
|
||||
console.log('🚀 ~ handleCanvasToPng ~ res:', res)
|
||||
}
|
||||
|
||||
const getCurrentCanvas = () => {
|
||||
return canvas.toJSON([
|
||||
'selectable',
|
||||
@ -655,6 +589,5 @@ export function useCanvas(id) {
|
||||
handleCadImageInit,
|
||||
backImg,
|
||||
setBackImg,
|
||||
handleCanvasToPng,
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,10 +1,19 @@
|
||||
import { GlobalDataContext } from '@/app/GlobalDataProvider'
|
||||
import { POLYGON_TYPE } from '@/common/common'
|
||||
import { canvasState } from '@/store/canvasAtom'
|
||||
import { makersState, modelsState, pcsCheckState, selectedMakerState, selectedModelsState, seriesState } from '@/store/circuitTrestleAtom'
|
||||
import {
|
||||
makersState,
|
||||
modelsState,
|
||||
moduleStatisticsState,
|
||||
pcsCheckState,
|
||||
selectedMakerState,
|
||||
selectedModelsState,
|
||||
seriesState,
|
||||
} from '@/store/circuitTrestleAtom'
|
||||
import { selectedModuleState } from '@/store/selectedModuleOptions'
|
||||
import { useContext } from 'react'
|
||||
import { useRecoilState, useRecoilValue } from 'recoil'
|
||||
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
|
||||
import { useMessage } from './useMessage'
|
||||
|
||||
export function useCircuitTrestle() {
|
||||
const [makers, setMakers] = useRecoilState(makersState)
|
||||
@ -16,6 +25,9 @@ export function useCircuitTrestle() {
|
||||
const selectedModules = useRecoilValue(selectedModuleState)
|
||||
const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext)
|
||||
const canvas = useRecoilValue(canvasState)
|
||||
|
||||
const setModuleStatistics = useSetRecoilState(moduleStatisticsState)
|
||||
const { getMessage } = useMessage()
|
||||
const getOptYn = () => {
|
||||
return {
|
||||
maxConnYn: pcsCheck.max ? 'Y' : 'N',
|
||||
@ -47,6 +59,7 @@ export function useCircuitTrestle() {
|
||||
|
||||
// 사용된 모듈아이템 목록
|
||||
const getUseModuleItemList = () => {
|
||||
console.log('🚀 ~ getUseModuleItemList ~ selectedModules:', selectedModules)
|
||||
return selectedModules?.itemList?.map((m) => {
|
||||
return {
|
||||
itemId: m.itemId,
|
||||
@ -163,6 +176,96 @@ export function useCircuitTrestle() {
|
||||
|
||||
const setPowerConditionerData = () => {}
|
||||
|
||||
const setModuleStatisticsData = () => {
|
||||
console.log(canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE))
|
||||
if (selectedModules?.length === 0) return
|
||||
const tempHeader = [
|
||||
{ name: getMessage('simulator.table.sub1'), prop: 'name' },
|
||||
{ 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: 'wpOut' },
|
||||
]
|
||||
const surfaceObjects = {}
|
||||
const surfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
|
||||
|
||||
surfaces.forEach((surface) => {
|
||||
surfaceObjects[surface.id] = {
|
||||
roofSurface: canvas.getObjects().filter((obj) => obj.id === surface.parentId)[0].directionText,
|
||||
circuit: '-',
|
||||
amount: 0,
|
||||
wpOut: 0,
|
||||
circuits: {},
|
||||
}
|
||||
|
||||
surface.modules.forEach((module) => {
|
||||
if (!surfaceObjects[surface.id][module.moduleInfo.itemId]) {
|
||||
// 지붕면에 모듈 존재 여부
|
||||
surfaceObjects[surface.id][module.moduleInfo.itemId] = 0 // 모듈 초기화
|
||||
}
|
||||
|
||||
surfaceObjects[surface.id][module.moduleInfo.itemId]++
|
||||
surfaceObjects[surface.id].wpOut += +module.moduleInfo.wpOut
|
||||
if (module.circuit) {
|
||||
if (!surfaceObjects[surface.id].circuits[module.circuitNumber]) {
|
||||
surfaceObjects[surface.id].circuits[module.circuitNumber] = {
|
||||
circuit: module.circuitNumber,
|
||||
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
|
||||
}
|
||||
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits[module.moduleInfo.itemId]++
|
||||
surfaceObjects[surface.id].circuits[module.circuitNumber].circuits.wpOut += +module.moduleInfo.wpOut
|
||||
surfaceObjects[surface.id].wpOut -= +module.moduleInfo.wpOut
|
||||
surfaceObjects[surface.id][module.moduleInfo.itemId]--
|
||||
}
|
||||
})
|
||||
})
|
||||
let tempRows = []
|
||||
Object.keys(surfaceObjects).forEach((key) => {
|
||||
let tempRow = {
|
||||
name: surfaceObjects[key].roofSurface,
|
||||
circuit: surfaceObjects[key].circuit,
|
||||
wpOut: parseFloat(surfaceObjects[key].wpOut / 1000),
|
||||
}
|
||||
selectedModules.itemList.forEach((module) => {
|
||||
tempRow[module.itemId] = surfaceObjects[key][module.itemId]
|
||||
})
|
||||
tempRows.push(tempRow)
|
||||
|
||||
Object.keys(surfaceObjects[key].circuits).forEach((circuit) => {
|
||||
let row = {
|
||||
name: surfaceObjects[key].roofSurface,
|
||||
circuit: surfaceObjects[key].circuits[circuit].circuit,
|
||||
wpOut: parseFloat(surfaceObjects[key].circuits[circuit].circuits.wpOut / 1000),
|
||||
}
|
||||
selectedModules.itemList.forEach((module) => {
|
||||
row[module.itemId] = surfaceObjects[key].circuits[circuit].circuits[module.itemId]
|
||||
})
|
||||
tempRows.push(row)
|
||||
})
|
||||
})
|
||||
|
||||
const tempFooter = {
|
||||
name: getMessage('modal.panel.batch.statistic.total'),
|
||||
circuit: '-',
|
||||
wpOut: tempRows.reduce((acc, row) => acc + row.wpOut, 0),
|
||||
}
|
||||
selectedModules.itemList.forEach((module) => {
|
||||
tempFooter[module.itemId] = tempRows.reduce((acc, row) => acc + row[module.itemId], 0)
|
||||
})
|
||||
canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
|
||||
setModuleStatistics({ header: tempHeader, rows: tempRows.filter((row) => row.wpOut !== 0), footer: tempFooter })
|
||||
}
|
||||
|
||||
return {
|
||||
makers,
|
||||
setMakers,
|
||||
@ -183,5 +286,6 @@ export function useCircuitTrestle() {
|
||||
getRoofSurfaceList,
|
||||
getModuleList,
|
||||
removeNotAllocationModules,
|
||||
setModuleStatisticsData,
|
||||
}
|
||||
}
|
||||
|
||||
@ -417,6 +417,7 @@
|
||||
"modal.module.circuit.number.edit": "モジュール一括回路番号の変更",
|
||||
"modal.module.circuit.number.edit.info": "回路番号を入力してください。",
|
||||
"modal.module.circuit.number": "回路番号",
|
||||
"modal.module.can.not.edit": "회로 구성을 완료한 모듈은 변경할 수 없습니다.(JA)",
|
||||
"modal.line.property.change": "変更する属性を選択してください。",
|
||||
"modal.line.property.change.unselect": "変更するラインを選択してください。",
|
||||
"modal.line.property.change.confirm": "プロパティを変更しますか?",
|
||||
|
||||
@ -417,6 +417,7 @@
|
||||
"modal.module.circuit.number.edit": "모듈 일괄 회로 번호 변경",
|
||||
"modal.module.circuit.number.edit.info": "회로 번호를 입력해주세요.",
|
||||
"modal.module.circuit.number": "회로 번호",
|
||||
"modal.module.can.not.edit": "회로 구성을 완료한 모듈은 변경할 수 없습니다.",
|
||||
"modal.line.property.change": "변경할 속성을 선택해 주세요.",
|
||||
"modal.line.property.change.unselect": "변경할 라인을 선택해 주세요.",
|
||||
"modal.line.property.change.confirm": "속성을 변경하시겠습니까?",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user