import WithDraggable from '@/components/common/draggable/WithDraggable' import { useState, useEffect, useContext } from 'react' import PowerConditionalSelect from '@/components/floor-plan/modal/circuitTrestle/step/PowerConditionalSelect' import StepUp from '@/components/floor-plan/modal/circuitTrestle/step/StepUp' import { useMessage } from '@/hooks/useMessage' import { usePopup } from '@/hooks/usePopup' import PassivityCircuitAllocation from './step/type/PassivityCircuitAllocation' import { useMasterController } from '@/hooks/common/useMasterController' import { correntObjectNoState } from '@/store/settingAtom' import { useRecoilValue } from 'recoil' import { GlobalDataContext } from '@/app/GlobalDataProvider' import { useRecoilState } from 'recoil' import { makersState, modelsState, modelState, pcsCheckState, selectedMakerState, selectedModelsState, seriesState } from '@/store/circuitTrestleAtom' import { POLYGON_TYPE } from '@/common/common' import { useSwal } from '@/hooks/useSwal' import { canvasState } from '@/store/canvasAtom' import { useTrestle } from '@/hooks/module/useTrestle' import { selectedModuleState } from '@/store/selectedModuleOptions' 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' import { usePlan } from '@/hooks/usePlan' import { QcastContext } from '@/app/QcastProvider' const ALLOCATION_TYPE = { AUTO: 'auto', PASSIVITY: 'passivity', } export default function CircuitTrestleSetting({ id }) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { apply, setViewCircuitNumberTexts } = useTrestle() const { swalFire } = useSwal() const { saveEstimate } = useEstimate() const canvas = useRecoilValue(canvasState) const [tabNum, setTabNum] = useState(1) const [allocationType, setAllocationType] = useState(ALLOCATION_TYPE.AUTO) const [circuitAllocationType, setCircuitAllocationType] = useState(1) const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext) const selectedModules = useRecoilValue(selectedModuleState) const { getPcsAutoRecommendList, getPcsVoltageChk, getPcsVoltageStepUpList } = useMasterController() // 회로할당(승합설정)에서 선택된 값들을 저장할 상태 추가 const [selectedStepUpValues, setSelectedStepUpValues] = useState({}) const [getStepUpSelections, setGetStepUpSelections] = useState(null) // const { trigger: setCircuitData } = useCanvasPopupStatusController(4) // const [stepUpListData, setStepUpListData] = useRecoilState(stepUpListDataState) const [stepUpListData, setStepUpListData] = useState([]) const [seletedOption, setSeletedOption] = useState(null) const { setModuleStatisticsData } = useCircuitTrestle() const { handleCanvasToPng } = useImgLoader() const { saveCanvas } = usePlan() const { setIsGlobalLoading } = useContext(QcastContext) const { makers, setMakers, selectedMaker, setSelectedMaker, series, setSeries, models, setModels, selectedModels, setSelectedModels, pcsCheck, setPcsCheck, getOptYn, getPcsItemList, getSelectedPcsItemList, getUseModuleItemList, getRoofSurfaceList, getModuleList, removeNotAllocationModules, } = useCircuitTrestle() // const { trigger: moduleSelectedDataTrigger } = useCanvasPopupStatusController(2) useEffect(() => { if (!managementState) { setManagementState(managementStateLoaded) } // setCircuitData({ // makers, // selectedMaker, // series, // models, // selectedModels, // pcsCheck, // }) }, []) // 수동할당 시 모듈 삭제 // 시리즈중 자동으로 추천 PCS 정보 조회 const onAutoRecommend = () => { if (series.filter((s) => s.selected).length === 0) { swalFire({ title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.validation.error02'), type: 'alert', }) return } const params = { ...getOptYn(), useModuleItemList: getUseModuleItemList(), roofSurfaceList: getRoofSurfaceList(), pcsItemList: getPcsItemList(), } // 파워컨디셔너 추천 목록 조회 if (selectedModels.length === 0) { // 시리즈중 자동으로 추천 PCS 정보 조회 getPcsAutoRecommendList(params).then((res) => { if (res.data?.pcsItemList) { let pcsItemList = [] let pcsObj = {} models.forEach((model) => { pcsObj[model.itemId] = model }) res.data?.pcsItemList.forEach((item) => { if (pcsObj[item.itemId]) { pcsItemList.push({ ...pcsObj[item.itemId], isUsed: false, id: uuidv4(), }) } }) // 회로 구성 가능 여부 체크 요청 파라미터 const pcsVoltageChkParams = { ...getOptYn(), useModuleItemList: getUseModuleItemList(), roofSurfaceList: getRoofSurfaceList(), pcsItemList: pcsItemList, } // 추천 목록 선택 setSelectedModels(pcsItemList) // 회로 구성 가능 여부 체크 getPcsVoltageChk(pcsVoltageChkParams).then((res) => { if (res.resultCode === 'S') { setTabNum(2) } else { swalFire({ title: res.resultMsg, type: 'alert', }) } }) } else { // 데이터가 없는 경우 오류 메시지 확인 필요 if (res.result.resultCode === 'E') { swalFire({ title: res.result.resultMsg, type: 'alert', }) } else { swalFire({ title: '파워컨디셔너를 추가해 주세요.', type: 'alert', }) } } }) } else { // 회로 구성 가능 여부 체크 getPcsVoltageChk({ ...params, pcsItemList: getSelectedPcsItemList() }).then((res) => { if (res.resultCode === 'S') { // 회로 구성 가능 여부 체크 통과 시 승압설정 정보 조회 getPcsVoltageStepUpList({ ...params, pcsItemList: getSelectedPcsItemList(), }).then((res) => { if (res?.result.resultCode === 'S' && res?.data) { setTabNum(2) } else { swalFire({ text: getMessage('common.message.send.error') }) } }) } else { swalFire({ title: res.resultMsg, type: 'alert', }) } }) } } // 자동할당 버튼 클릭 시 const onAutoAllocation = () => { let moduleStdQty = 0 let moduleMaxQty = 0 const selectedModels = models.filter((m) => m.selected) // 시리즈중 자동으로 추천 PCS 정보 조회 if (selectedModels.length === 0) { onAutoRecommend() } else { // 모듈 최소 매수 moduleStdQty = selectedModels.reduce((acc, model) => { return acc + parseInt(model.moduleStdQty) }, 0) moduleMaxQty = selectedModels.reduce((acc, model) => { return acc + parseInt(model.moduleMaxQty) }, 0) } // const target = pcsCheck.max ? moduleMaxQty : moduleStdQty // const placementModules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE) // if (placementModules.length > target) { // swalFire({ // title: '배치가능 매수를 초과합니다. 파워컨디셔너를 다시 선택해 주세요.', // type: 'alert', // }) // return // } // setAllocationType(ALLOCATION_TYPE.AUTO) // setTabNum(2) } // 수동할당 버튼 클릭 시 const onPassivityAllocation = () => { if (selectedModels.length === 0) { const params = { ...getOptYn(), useModuleItemList: getUseModuleItemList(), roofSurfaceList: getRoofSurfaceList().map((surface) => { return { ...surface, moduleList: surface.moduleList.map((module) => { return { itemId: module.itemId, uniqueId: module.uniqueId, } }), } }), pcsItemList: getPcsItemList(), } // 파워컨디셔너 추천 목록 조회 getPcsAutoRecommendList(params).then((res) => { if (res.data?.pcsItemList) { let pcsItemList = [] let pcsObj = {} models.forEach((model) => { pcsObj[model.itemId] = model }) res.data?.pcsItemList.forEach((item) => { if (pcsObj[item.itemId]) { pcsItemList.push({ ...pcsObj[item.itemId], isUsed: false, id: uuidv4(), }) } }) const pcsVoltageChkParams = { ...getOptYn(), useModuleItemList: getUseModuleItemList(), roofSurfaceList: getRoofSurfaceList(), pcsItemList: pcsItemList.map((item) => { return { itemId: item.itemId, pcsMkrCd: item.pcsMkrCd, pcsSerCd: item.pcsSerCd, } }), } setSelectedModels(pcsItemList) getPcsVoltageChk(pcsVoltageChkParams).then((res) => { setAllocationType(ALLOCATION_TYPE.PASSIVITY) }) } else { swalFire({ title: res.result.resultMsg, type: 'alert', confirmFn: () => { return }, }) return } }) } else { const moduleStdQty = selectedModels.reduce((acc, model) => { return acc + parseInt(model.moduleStdQty) }, 0) const moduleMaxQty = selectedModels.reduce((acc, model) => { return acc + parseInt(model.moduleMaxQty) }, 0) const target = pcsCheck.max ? moduleMaxQty : moduleStdQty const placementModules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE) if (placementModules.length > target) { swalFire({ title: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.validation.error01'), type: 'alert', }) return } setAllocationType(ALLOCATION_TYPE.PASSIVITY) } } // StepUp에서 선택된 값들을 처리하는 함수 수정 const handleStepUpValuesSelected = (selectionData) => { const { gooodsNo } = selectionData setSelectedStepUpValues((prev) => ({ ...prev, [gooodsNo]: selectionData, })) } // StepUp 컴포넌트 초기화 핸들러 const handleStepUpInitialize = (getCurrentSelections) => { setGetStepUpSelections(() => getCurrentSelections) } // 회로할당(승압설정) 저장 버튼 클릭 시 const onApply = async () => { setIsGlobalLoading(true) canvas .getObjects() .filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) .map((obj) => { obj.pcses = getStepUpListData() }) setViewCircuitNumberTexts(false) handleCanvasToPng(1) //회로할당 저장 클릭 시 const result = await apply() //회로할당 저장 시 result=null인 경우에도 회로번호 텍스트 표시 유지 처리 setViewCircuitNumberTexts(true) if (result) { handleCanvasToPng(2) // 캔버스 저장 await saveCanvas(false) // 견적서 저장 await saveEstimate(result) } // removeNotAllocationModules() } // 이전 버튼 클릭 시 const onClickPrev = () => { // setAllocationType(ALLOCATION_TYPE.AUTO) swalFire({ text: getMessage('modal.circuit.trestle.setting.circuit.allocation.passivity.all.power.conditional.reset.info'), type: 'alert', icon: 'warning', confirmFn: () => { 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 obj.circuitNumber = null }) if (allocationType === ALLOCATION_TYPE.PASSIVITY) { setAllocationType(ALLOCATION_TYPE.AUTO) setTabNum(1) } else { setTabNum(1) } canvas.renderAll() setModuleStatisticsData() }, }) } // 파워컨디셔너 컴포넌트 속성 const powerConditionalSelectProps = { tabNum, setTabNum, makers, setMakers, selectedMaker, setSelectedMaker, series, setSeries, models, setModels, selectedModels, setSelectedModels, managementState, getUseModuleItemList, } // 수동할당 컴포넌트 속성 const passivityProps = { tabNum, setTabNum, pcsCheck, selectedModels, setSelectedModels, getOptYn, getUseModuleItemList, getRoofSurfaceList, } // 승압설정 컴포넌트 속성 const stepUpProps = { tabNum, setTabNum, models, setModels, allocationType, circuitAllocationType, setCircuitAllocationType, selectedModels, setSelectedModels, getSelectedPcsItemList, getOptYn, // 옵션 Y/N getUseModuleItemList, // 사용된 모듈아이템 List getRoofSurfaceList, // 지붕면 목록 getPcsItemList, // PCS 아이템 목록 onValuesSelected: handleStepUpValuesSelected, // 선택된 값들을 처리하는 함수 stepUpListData, setStepUpListData, seletedOption, setSeletedOption, getModuleList, } // 승압설정 목록 조회 const getStepUpListData = () => { return stepUpListData[0].pcsItemList.map((item) => { return item.serQtyList .filter((serQty) => serQty.selected) .map((serQty) => { return { pcsMkrCd: item.pcsMkrCd, pcsSerCd: item.pcsSerCd, pcsItemId: item.itemId, pscOptCd: seletedOption.code, paralQty: serQty.paralQty, connections: item.connList?.length ? [ { connItemId: item.connList[0].itemId, }, ] : [], } })[0] }) } const handleStepUp = () => { const notAllocationModules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE && !obj.circuit) if (notAllocationModules.length > 0) { swalFire({ title: getMessage('not.allocation.exist.module'), type: 'alert', }) return } setTabNum(2) } // 닫기 버튼 클릭 시 처리하는 함수 추가 const handleClose = () => { // // 회로 번호 텍스트 제거 // const circuitTexts = canvas.getObjects().filter((obj) => obj.name === 'circuitNumber') // canvas.remove(...circuitTexts) // // 모듈의 회로 정보 초기화 // canvas // .getObjects() // .filter((obj) => obj.name === POLYGON_TYPE.MODULE) // .forEach((obj) => { // obj.circuit = null // obj.pcsItemId = null // obj.circuitNumber = null // }) // canvas.renderAll() closePopup(id) } return (

{getMessage('modal.circuit.trestle.setting')}

{/*
{getMessage('modal.circuit.trestle.setting.power.conditional.select')}
{getMessage('modal.circuit.trestle.setting.circuit.allocation')}({getMessage('modal.circuit.trestle.setting.step.up.allocation')})
{tabNum === 1 && allocationType === ALLOCATION_TYPE.AUTO && } {tabNum === 1 && allocationType === ALLOCATION_TYPE.PASSIVITY && } {tabNum === 2 && } {tabNum === 1 && allocationType === ALLOCATION_TYPE.AUTO && (
)} {tabNum === 1 && allocationType === ALLOCATION_TYPE.PASSIVITY && (
)} {tabNum === 2 && (
{/*
)}
) }