Merge branch 'dev' into feature/sqlite3
This commit is contained in:
commit
99bca1e040
36
docs/2025-02-13_Qcell_회의.txt
Normal file
36
docs/2025-02-13_Qcell_회의.txt
Normal file
@ -0,0 +1,36 @@
|
||||
1. 회로할당 ->
|
||||
수동 할당시 와트수 소수점 노출
|
||||
|
||||
2. 모듈 ->
|
||||
멀티 모듈일시 모듈 순번에 따라 배치면 그리기 적용해야됨
|
||||
멀티 모듈시 모듈 간격 붙여서 조정
|
||||
|
||||
3. contextMenu ->
|
||||
한번 클릭 후 contextMenu 호출 재호출시 화면에 안나옴
|
||||
|
||||
4. 수치 입력시 ->
|
||||
반각?전각? 입력 처리 필요????????????????
|
||||
|
||||
5. 지도 호출 ->
|
||||
최초 호출 후 삭제, 재호출 안됨
|
||||
|
||||
6. 도면 화면 ->
|
||||
redo, undo 제거
|
||||
|
||||
7. 모든 배치면 ->
|
||||
배치면 외각선 굵기 조절
|
||||
|
||||
8. 패브릭 캔버스 ->
|
||||
줌, 확대 기능 선택 오류 수정 필요
|
||||
|
||||
9. 모듈선택 ->
|
||||
모듈 선택 페이지 단계 변경 예정정(현업 화면에 너무 크게 적용)
|
||||
|
||||
10. 외벽선 삭제시 수치 삭제 처리 필요
|
||||
|
||||
11. 모듈 삭제 후 재 설치시 모듈이 겹친다고 오류남
|
||||
|
||||
12. 모듈 수동시 첫번째는 아무데나 놓을 수 있고 두번째 부터는 무조건 주변에 모듈이 있어야 한다는 조건이 있어야 한다고 함
|
||||
|
||||
13. 견적서 다운로드 이미지 정비율이 아님
|
||||
|
||||
10
docs/2025-02-14_Qcell_회의.txt
Normal file
10
docs/2025-02-14_Qcell_회의.txt
Normal file
@ -0,0 +1,10 @@
|
||||
1. 오픈 예정일정 -> 신상품 7월에 오픈 그와 같이 하는게 어떻냐?
|
||||
|
||||
2. 웹 상에서 단축키 모드 추가
|
||||
|
||||
3. 형이동 동선이동 작업 해보겠다.
|
||||
|
||||
4. 모듈 작업 확정 (좌하, 우상)
|
||||
|
||||
5. 발전 시뮬레이션 qsp에 이관 작업(유지보수)
|
||||
|
||||
@ -40,7 +40,7 @@ export default function QContextMenu(props) {
|
||||
if (!contextRef.current) return
|
||||
|
||||
const handleContextMenu = (e) => {
|
||||
// e.preventDefault() //기존 contextmenu 막고
|
||||
e.preventDefault() //기존 contextmenu 막고
|
||||
if (tempGridMode) return
|
||||
const position = {
|
||||
x: window.innerWidth / 2 < e.pageX ? e.pageX - 240 : e.pageX,
|
||||
|
||||
@ -296,7 +296,7 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) {
|
||||
type="button"
|
||||
className="btn-origin navy mr5"
|
||||
onClick={() => {
|
||||
handleEstimateCopy(sendPlanNo, copyReceiveUser, saleStoreId, otherSaleStoreId)
|
||||
handleEstimateCopy(sendPlanNo, copyReceiveUser, saleStoreId, otherSaleStoreId, setEstimateCopyPopupOpen)
|
||||
}}
|
||||
>
|
||||
{getMessage('estimate.detail.estimateCopyPopup.copyBtn')}
|
||||
|
||||
@ -221,6 +221,7 @@ export default function CanvasMenu(props) {
|
||||
await reloadCanvasStatus(objectNo, pid)
|
||||
break
|
||||
case 5:
|
||||
setIsGlobalLoading(true)
|
||||
promiseGet({ url: `/api/estimate/${objectNo}/${selectedPlan.planNo}/detail` }).then((res) => {
|
||||
if (res.status === 200) {
|
||||
const estimateDetail = res.data
|
||||
@ -230,6 +231,9 @@ export default function CanvasMenu(props) {
|
||||
setFloorPlanObjectNo({ floorPlanObjectNo: objectNo })
|
||||
setIsGlobalLoading(false)
|
||||
router.push(`/floor-plan/estimate/${menu.index}?pid=${selectedPlan.planNo}&objectNo=${objectNo}`)
|
||||
if (pathname === '/floor-plan/estimate/5') {
|
||||
setIsGlobalLoading(false)
|
||||
}
|
||||
} else {
|
||||
setIsGlobalLoading(false)
|
||||
swalFire({ text: getMessage('estimate.menu.move.valid1') })
|
||||
@ -239,7 +243,6 @@ export default function CanvasMenu(props) {
|
||||
break
|
||||
case 6:
|
||||
setIsGlobalLoading(true)
|
||||
//로딩바해제는 발전시뮬레이션 조회쪽에서(Simulator.jsx) setIsGlobalLoading(false)
|
||||
promiseGet({ url: `/api/estimate/${objectNo}/${selectedPlan.planNo}/detail` }).then((res) => {
|
||||
if (res.status === 200) {
|
||||
const estimateDetail = res.data
|
||||
@ -247,7 +250,9 @@ export default function CanvasMenu(props) {
|
||||
setMenuNumber(menu.index)
|
||||
setCurrentMenu(menu.title)
|
||||
router.push(`/floor-plan/simulator/${menu.index}?pid=${selectedPlan.planNo}&objectNo=${objectNo}`)
|
||||
setIsGlobalLoading(false)
|
||||
if (pathname === '/floor-plan/simulator/6') {
|
||||
setIsGlobalLoading(false)
|
||||
}
|
||||
} else {
|
||||
setIsGlobalLoading(false)
|
||||
swalFire({ text: getMessage('simulator.menu.move.valid1') })
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import WithDraggable from '@/components/common/draggable/WithDraggable'
|
||||
import { useState, useEffect, useContext } from 'react'
|
||||
import { useState, useEffect, useContext, useRef } 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'
|
||||
@ -33,7 +33,7 @@ const ALLOCATION_TYPE = {
|
||||
export default function CircuitTrestleSetting({ id }) {
|
||||
const { getMessage } = useMessage()
|
||||
const { closePopup } = usePopup()
|
||||
const { apply, setViewCircuitNumberTexts, getEstimateData } = useTrestle()
|
||||
const { apply, setViewCircuitNumberTexts, getEstimateData, clear: clearTrestle } = useTrestle()
|
||||
const { swalFire } = useSwal()
|
||||
const { saveEstimate } = useEstimate()
|
||||
const canvas = useRecoilValue(canvasState)
|
||||
@ -43,7 +43,7 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
const [circuitAllocationType, setCircuitAllocationType] = useState(1)
|
||||
const { managementState, setManagementState, managementStateLoaded } = useContext(GlobalDataContext)
|
||||
const selectedModules = useRecoilValue(selectedModuleState)
|
||||
const { getPcsAutoRecommendList, getPcsVoltageChk, getPcsVoltageStepUpList } = useMasterController()
|
||||
const { getPcsAutoRecommendList, getPcsVoltageChk, getPcsVoltageStepUpList, getPcsManualConfChk } = useMasterController()
|
||||
|
||||
// 회로할당(승합설정)에서 선택된 값들을 저장할 상태 추가
|
||||
const [selectedStepUpValues, setSelectedStepUpValues] = useState({})
|
||||
@ -53,10 +53,9 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
const [stepUpListData, setStepUpListData] = useState([])
|
||||
const [seletedOption, setSeletedOption] = useState(null)
|
||||
const { setModuleStatisticsData } = useCircuitTrestle()
|
||||
|
||||
const { handleCanvasToPng } = useImgLoader()
|
||||
const { saveCanvas } = usePlan()
|
||||
|
||||
const passivityCircuitAllocationRef = useRef()
|
||||
const { setIsGlobalLoading } = useContext(QcastContext)
|
||||
|
||||
const {
|
||||
@ -385,6 +384,12 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
obj.pcsItemId = null
|
||||
obj.circuitNumber = null
|
||||
})
|
||||
setSelectedModels(
|
||||
JSON.parse(JSON.stringify(selectedModels)).map((model) => {
|
||||
model.isUsed = false
|
||||
return model
|
||||
}),
|
||||
)
|
||||
|
||||
if (allocationType === ALLOCATION_TYPE.PASSIVITY) {
|
||||
setAllocationType(ALLOCATION_TYPE.AUTO)
|
||||
@ -392,6 +397,7 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
} else {
|
||||
setTabNum(1)
|
||||
}
|
||||
clearTrestle()
|
||||
|
||||
canvas.renderAll()
|
||||
setModuleStatisticsData()
|
||||
@ -479,16 +485,18 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
}
|
||||
|
||||
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
|
||||
} else {
|
||||
setTabNum(2)
|
||||
}
|
||||
handlePassivityAllocationCkeck()
|
||||
// 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
|
||||
// } else {
|
||||
// passivityCircuitAllocationRef.current.onApply()
|
||||
// setTabNum(2)
|
||||
// }
|
||||
}
|
||||
|
||||
// 닫기 버튼 클릭 시 처리하는 함수 추가
|
||||
@ -510,6 +518,83 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
closePopup(id)
|
||||
}
|
||||
|
||||
const handlePassivityAllocationCkeck = () => {
|
||||
let pcsCount = {}
|
||||
let result = {}
|
||||
canvas
|
||||
.getObjects()
|
||||
.filter((obj) => obj.name === POLYGON_TYPE.MODULE)
|
||||
.forEach((module) => {
|
||||
const circuitNumber = module.circuitNumber.replace(/[()]/g, '')
|
||||
pcsCount[circuitNumber] = (pcsCount[circuitNumber] || 0) + 1
|
||||
})
|
||||
for (const key in pcsCount) {
|
||||
const firstPart = key.split('-')[0] // '-' 기준으로 첫 번째 부분을 추출
|
||||
const value = pcsCount[key]
|
||||
|
||||
// 그룹이 없으면 초기화
|
||||
if (!result[firstPart]) {
|
||||
result[firstPart] = { maxValue: value, count: 1 }
|
||||
} else {
|
||||
// 이미 그룹이 있으면 큰 값으로 갱신, count는 증가
|
||||
result[firstPart].maxValue = Math.max(result[firstPart].maxValue, value)
|
||||
result[firstPart].count += 1
|
||||
}
|
||||
}
|
||||
const params = {
|
||||
...getOptYn(),
|
||||
useModuleItemList: getUseModuleItemList(),
|
||||
roofSurfaceList: getRoofSurfaceList(),
|
||||
pcsItemList: selectedModels.map((model, index) => {
|
||||
return {
|
||||
pcsMkrCd: model.pcsMkrCd,
|
||||
pcsSerCd: model.pcsSerCd,
|
||||
itemId: model.itemId,
|
||||
itemNm: model.itemNm,
|
||||
goodsNo: model.goodsNo,
|
||||
serQtyList: [
|
||||
{
|
||||
serQty: result[index + 1].maxValue,
|
||||
paralQty: result[index + 1].count,
|
||||
rmdYn: 'Y',
|
||||
usePossYn: 'Y',
|
||||
roofSurfaceList: canvas
|
||||
.getObjects()
|
||||
.filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name && obj?.modules.length > 0)
|
||||
.map((surface) => {
|
||||
return {
|
||||
roofSurfaceId: surface.id,
|
||||
roofSurface: surface.direction,
|
||||
roofSurfaceIncl: +canvas.getObjects().filter((obj) => obj.id === surface.parentId)[0].pitch,
|
||||
moduleList: surface.modules.map((module) => {
|
||||
return {
|
||||
itemId: module.moduleInfo.itemId,
|
||||
circuit: module.circuitNumber,
|
||||
pcsItemId: module.pcsItemId,
|
||||
}
|
||||
}),
|
||||
}
|
||||
}),
|
||||
},
|
||||
],
|
||||
}
|
||||
}),
|
||||
}
|
||||
|
||||
getPcsManualConfChk(params).then((res) => {
|
||||
if (res?.resultCode === 'E') {
|
||||
swalFire({
|
||||
text: res.resultMsg,
|
||||
type: 'alert',
|
||||
icon: 'warning',
|
||||
})
|
||||
return
|
||||
} else {
|
||||
setTabNum(2)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<WithDraggable isShow={true} pos={{ x: 50, y: 230 }}>
|
||||
<div className={`modal-pop-wrap l-2`}>
|
||||
@ -531,7 +616,9 @@ export default function CircuitTrestleSetting({ id }) {
|
||||
</div>
|
||||
</div>
|
||||
{tabNum === 1 && allocationType === ALLOCATION_TYPE.AUTO && <PowerConditionalSelect {...powerConditionalSelectProps} />}
|
||||
{tabNum === 1 && allocationType === ALLOCATION_TYPE.PASSIVITY && <PassivityCircuitAllocation {...passivityProps} />}
|
||||
{tabNum === 1 && allocationType === ALLOCATION_TYPE.PASSIVITY && (
|
||||
<PassivityCircuitAllocation {...passivityProps} ref={passivityCircuitAllocationRef} />
|
||||
)}
|
||||
{tabNum === 2 && <StepUp {...stepUpProps} onInitialize={handleStepUpInitialize} />}
|
||||
{tabNum === 1 && allocationType === ALLOCATION_TYPE.AUTO && (
|
||||
<div className="grid-btn-wrap">
|
||||
|
||||
@ -15,6 +15,7 @@ import { useRecoilState, useRecoilValue } from 'recoil'
|
||||
|
||||
export default function PassivityCircuitAllocation(props) {
|
||||
const {
|
||||
setTabNum,
|
||||
selectedModels,
|
||||
setSelectedModels,
|
||||
getOptYn: getApiProps,
|
||||
@ -88,14 +89,14 @@ export default function PassivityCircuitAllocation(props) {
|
||||
]
|
||||
if (!circuitNumber || circuitNumber === 0) {
|
||||
swalFire({
|
||||
text: '회로번호를 1 이상입력해주세요.',
|
||||
text: getMessage('module.circuit.minimun.error'),
|
||||
type: 'alert',
|
||||
icon: 'warning',
|
||||
})
|
||||
return
|
||||
} else if (targetModules.length === 0) {
|
||||
swalFire({
|
||||
text: '모듈을 선택해주세요.',
|
||||
text: getMessage('module.not.found'),
|
||||
type: 'alert',
|
||||
icon: 'warning',
|
||||
})
|
||||
@ -113,7 +114,7 @@ export default function PassivityCircuitAllocation(props) {
|
||||
})
|
||||
if (result) {
|
||||
swalFire({
|
||||
text: '회로 번호가 같은 다른 파워 컨디셔너 모듈이 있습니다. 다른 회로 번호를 설정하십시오.',
|
||||
text: getMessage('module.already.exist.error'),
|
||||
type: 'alert',
|
||||
icon: 'warning',
|
||||
})
|
||||
@ -185,7 +186,30 @@ export default function PassivityCircuitAllocation(props) {
|
||||
}),
|
||||
}
|
||||
})
|
||||
let pcsCount = {}
|
||||
let result = {}
|
||||
canvas
|
||||
.getObjects()
|
||||
.filter((obj) => obj.name === POLYGON_TYPE.MODULE)
|
||||
.forEach((module) => {
|
||||
if (module.circuitNumber) {
|
||||
const circuitNumber = module.circuitNumber.replace(/[()]/g, '')
|
||||
pcsCount[circuitNumber] = (pcsCount[circuitNumber] || 0) + 1
|
||||
}
|
||||
})
|
||||
for (const key in pcsCount) {
|
||||
const firstPart = key.split('-')[0] // '-' 기준으로 첫 번째 부분을 추출
|
||||
const value = pcsCount[key]
|
||||
|
||||
// 그룹이 없으면 초기화
|
||||
if (!result[firstPart]) {
|
||||
result[firstPart] = { maxValue: value, count: 1 }
|
||||
} else {
|
||||
// 이미 그룹이 있으면 큰 값으로 갱신, count는 증가
|
||||
result[firstPart].maxValue = Math.max(result[firstPart].maxValue, value)
|
||||
result[firstPart].count += 1
|
||||
}
|
||||
}
|
||||
const usedPcses = pcsList.filter((model) => model.isUsed)
|
||||
const pcsItemList = usedPcses.map((model, index) => {
|
||||
return {
|
||||
@ -196,8 +220,8 @@ export default function PassivityCircuitAllocation(props) {
|
||||
goodsNo: model.goodsNo,
|
||||
serQtyList: [
|
||||
{
|
||||
serQty: targetModules.length,
|
||||
paralQty: uniqueCircuitNumbers.length,
|
||||
serQty: result[index + 1].maxValue,
|
||||
paralQty: result[index + 1].count,
|
||||
rmdYn: 'Y',
|
||||
usePossYn: 'Y',
|
||||
roofSurfaceList: roofSurfaceList,
|
||||
@ -305,6 +329,173 @@ export default function PassivityCircuitAllocation(props) {
|
||||
})
|
||||
}
|
||||
|
||||
const onApply = () => {
|
||||
let uniqueCircuitNumbers = [
|
||||
...new Set(
|
||||
canvas
|
||||
.getObjects()
|
||||
.filter((obj) => obj.name === POLYGON_TYPE.MODULE && obj.circuitNumber)
|
||||
.map((obj) => obj.circuitNumber),
|
||||
),
|
||||
]
|
||||
if (!circuitNumber || circuitNumber === 0) {
|
||||
swalFire({
|
||||
text: getMessage('module.circuit.minimun.error'),
|
||||
type: 'alert',
|
||||
icon: 'warning',
|
||||
})
|
||||
return
|
||||
} else if (targetModules.length === 0) {
|
||||
swalFire({
|
||||
text: getMessage('module.not.found'),
|
||||
type: 'alert',
|
||||
icon: 'warning',
|
||||
})
|
||||
return
|
||||
} else if (selectedModels.length > 1) {
|
||||
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: getMessage('module.already.exist.error'),
|
||||
type: 'alert',
|
||||
icon: 'warning',
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
let tempSelectedPcs = { ...selectedPcs }
|
||||
canvas.discardActiveObject()
|
||||
canvas
|
||||
.getObjects()
|
||||
.filter((obj) => targetModules.includes(obj.id))
|
||||
.forEach((obj) => {
|
||||
if (obj.circuit) {
|
||||
canvas.remove(obj.circuit)
|
||||
}
|
||||
const moduleCircuitText = new fabric.Text(getCircuitNumber(), {
|
||||
left: obj.left + obj.width / 2,
|
||||
top: obj.top + obj.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: obj.width,
|
||||
height: obj.height,
|
||||
textAlign: 'center',
|
||||
originX: 'center',
|
||||
originY: 'center',
|
||||
name: 'circuitNumber',
|
||||
selectable: false,
|
||||
parentId: obj.id,
|
||||
circuitInfo: selectedPcs,
|
||||
visible: isDisplayCircuitNumber,
|
||||
})
|
||||
obj.set({
|
||||
strokeWidth: 0.3,
|
||||
})
|
||||
obj.pcsItemId = selectedPcs.itemId
|
||||
obj.pcsItemCode = selectedPcs.id
|
||||
obj.circuit = moduleCircuitText
|
||||
obj.circuitNumber = getCircuitNumber()
|
||||
tempSelectedPcs.used = true
|
||||
setSelectedPcs(tempSelectedPcs)
|
||||
canvas.add(moduleCircuitText)
|
||||
})
|
||||
|
||||
let pcsList = JSON.parse(JSON.stringify(selectedModels)).map((model) => {
|
||||
if (model.id === selectedPcs.id) {
|
||||
model.isUsed = true
|
||||
}
|
||||
return model
|
||||
})
|
||||
|
||||
const roofSurfaceList = canvas
|
||||
.getObjects()
|
||||
.filter((obj) => POLYGON_TYPE.MODULE_SETUP_SURFACE === obj.name && obj?.modules.length > 0)
|
||||
.map((surface) => {
|
||||
return {
|
||||
roofSurfaceId: surface.id,
|
||||
roofSurface: surface.direction,
|
||||
roofSurfaceIncl: +canvas.getObjects().filter((obj) => obj.id === surface.parentId)[0].pitch,
|
||||
moduleList: surface.modules.map((module) => {
|
||||
return {
|
||||
itemId: module.moduleInfo.itemId,
|
||||
circuit: module.circuitNumber,
|
||||
pcsItemId: module.pcsItemId,
|
||||
}
|
||||
}),
|
||||
}
|
||||
})
|
||||
const usedPcses = pcsList.filter((model) => model.isUsed)
|
||||
const pcsItemList = usedPcses.map((model, index) => {
|
||||
return {
|
||||
pcsMkrCd: model.pcsMkrCd,
|
||||
pcsSerCd: model.pcsSerCd,
|
||||
itemId: model.itemId,
|
||||
itemNm: model.itemNm,
|
||||
goodsNo: model.goodsNo,
|
||||
serQtyList: [
|
||||
{
|
||||
serQty: targetModules.length,
|
||||
paralQty: uniqueCircuitNumbers.length,
|
||||
rmdYn: 'Y',
|
||||
usePossYn: 'Y',
|
||||
roofSurfaceList: roofSurfaceList,
|
||||
},
|
||||
],
|
||||
}
|
||||
})
|
||||
|
||||
const params = {
|
||||
...getApiProps(),
|
||||
useModuleItemList: getSelectedModuleList(),
|
||||
pcsItemList: pcsItemList,
|
||||
}
|
||||
|
||||
getPcsManualConfChk(params).then((res) => {
|
||||
if (res?.resultCode === 'E') {
|
||||
swalFire({
|
||||
text: res.resultMsg,
|
||||
type: 'alert',
|
||||
icon: 'warning',
|
||||
confirmFn: () => {
|
||||
const circuitNumbers = canvas.getObjects().filter((obj) => obj.name === 'circuitNumber' && targetModules.includes(obj.parentId))
|
||||
canvas.remove(...circuitNumbers)
|
||||
canvas
|
||||
.getObjects()
|
||||
.filter((obj) => obj.name === 'module' && targetModules.includes(obj.id))
|
||||
.forEach((obj) => {
|
||||
obj.pcsItemId = null
|
||||
obj.circuit = null
|
||||
obj.circuitNumber = null
|
||||
})
|
||||
canvas.renderAll()
|
||||
},
|
||||
})
|
||||
setSelectedPcs({ ...selectedPcs, used: false })
|
||||
setTargetModules([])
|
||||
return
|
||||
}
|
||||
|
||||
setSelectedModels(pcsList)
|
||||
|
||||
setTargetModules([])
|
||||
setModuleStatisticsData()
|
||||
setTabNum(2)
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="properties-setting-wrap outer">
|
||||
|
||||
@ -7,10 +7,14 @@ import { LINE_TYPE } from '@/common/common'
|
||||
import { useSwal } from '@/hooks/useSwal'
|
||||
|
||||
export default function PlacementSurfaceLineProperty(props) {
|
||||
const { id, pos = { x: 50, y: 230 }, roof } = props
|
||||
const { id, pos = { x: 50, y: 230 }, roof, setIsHidden } = props
|
||||
const { closePopup } = usePopup()
|
||||
// const { handleSetEaves, handleSetGable, handleRollback, handleFix, closeModal } = usePropertiesSetting(id)
|
||||
const { roofLinesInit, handleSetRidge, handleSetEaves, handleSetGable, handleRollback, handleFix } = useRoofLinePropertySetting(id, roof)
|
||||
const { roofLinesInit, handleSetRidge, handleSetEaves, handleSetGable, handleRollback, handleFix } = useRoofLinePropertySetting({
|
||||
id,
|
||||
roof,
|
||||
setIsHidden,
|
||||
})
|
||||
const { getMessage } = useMessage()
|
||||
const { swalFire } = useSwal()
|
||||
|
||||
@ -29,6 +33,10 @@ export default function PlacementSurfaceLineProperty(props) {
|
||||
}
|
||||
|
||||
closePopup(id)
|
||||
|
||||
if (setIsHidden) {
|
||||
setIsHidden(false)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@ -83,6 +83,10 @@ export const useEstimateController = (planNo, flag) => {
|
||||
res.data.pkgAsp = roundedNumber.toString()
|
||||
}
|
||||
setEstimateContextState(res.data)
|
||||
} else {
|
||||
swalFire({ text: getMessage('stuff.detail.header.notExistObjectNo'), type: 'alert', icon: 'error' })
|
||||
setIsLoading(true)
|
||||
setIsGlobalLoading(false)
|
||||
}
|
||||
}
|
||||
})
|
||||
@ -90,8 +94,7 @@ export const useEstimateController = (planNo, flag) => {
|
||||
setIsGlobalLoading(false)
|
||||
} catch (error) {
|
||||
console.error('견적서 상세조회 Error: ', error)
|
||||
|
||||
swalFire({ text: getMessage('estimate.menu.move.valid1') })
|
||||
swalFire({ text: getMessage('stuff.detail.header.notExistObjectNo'), type: 'alert', icon: 'error' })
|
||||
setIsLoading(true)
|
||||
setIsGlobalLoading(false)
|
||||
}
|
||||
@ -415,7 +418,7 @@ export const useEstimateController = (planNo, flag) => {
|
||||
* (견적서 번호(estimateData.docNo)가 생성된 이후 버튼 활성화 )
|
||||
* T01관리자 계정 및 1차판매점에게만 제공
|
||||
*/
|
||||
const handleEstimateCopy = async (sendPlanNo, copyReceiveUser, saleStoreId, otherSaleStoreId) => {
|
||||
const handleEstimateCopy = async (sendPlanNo, copyReceiveUser, saleStoreId, otherSaleStoreId, setEstimateCopyPopupOpen) => {
|
||||
//todo: 추후 YJSS가 다시 나타날 경우 아래 swalFire 제거 필요
|
||||
if (estimateData.estimateType === 'YJSS') {
|
||||
return swalFire({ text: getMessage('estimate.detail.save.requiredEstimateType'), type: 'alert', icon: 'warning' })
|
||||
@ -455,6 +458,7 @@ export const useEstimateController = (planNo, flag) => {
|
||||
text: getMessage('estimate.detail.estimateCopyPopup.copy.alertMessage'),
|
||||
type: 'alert',
|
||||
confirmFn: () => {
|
||||
setEstimateCopyPopupOpen(false) //팝업닫고
|
||||
router.push(`/management/stuff/detail?objectNo=${newObjectNo.toString()}`, { scroll: false })
|
||||
},
|
||||
})
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -710,7 +710,7 @@ export const useTrestle = () => {
|
||||
slope,
|
||||
classType: currentAngleType === 'slope' ? '0' : '1',
|
||||
angle: getDegreeByChon(slope),
|
||||
azimuth: surfaceCompass ?? moduleCompass ?? 0,
|
||||
azimuth: getAzimuth(parent),
|
||||
moduleList,
|
||||
}
|
||||
})
|
||||
@ -726,6 +726,70 @@ export const useTrestle = () => {
|
||||
return { itemList, northArrangement, roofSurfaceList, circuitItemList }
|
||||
}
|
||||
|
||||
const getAzimuth = (parent) => {
|
||||
const { moduleCompass, surfaceCompass, direction } = parent
|
||||
|
||||
if (surfaceCompass) {
|
||||
if (surfaceCompass > 180) {
|
||||
return surfaceCompass - 360
|
||||
}
|
||||
return surfaceCompass
|
||||
}
|
||||
|
||||
switch (direction) {
|
||||
case 'south': {
|
||||
if (moduleCompass < 0) {
|
||||
return -1 * moduleCompass
|
||||
} else if (moduleCompass === 0) {
|
||||
return 0
|
||||
} else if (moduleCompass < 180) {
|
||||
return -1 * moduleCompass
|
||||
} else if (moduleCompass === 180) {
|
||||
return 180
|
||||
}
|
||||
}
|
||||
case 'north': {
|
||||
if (moduleCompass < 0) {
|
||||
return -1 * (180 + moduleCompass)
|
||||
} else if (moduleCompass === 0) {
|
||||
return 180
|
||||
} else if (moduleCompass < 180) {
|
||||
return 180 - moduleCompass
|
||||
} else if (moduleCompass === 180) {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
case 'west': {
|
||||
if (moduleCompass > -180 && moduleCompass < -90) {
|
||||
return -180 - (90 + moduleCompass)
|
||||
} else if (moduleCompass < 0) {
|
||||
return 180 - (90 + moduleCompass)
|
||||
} else if (moduleCompass === 0) {
|
||||
return 90
|
||||
} else if (moduleCompass < 180) {
|
||||
return 90 - moduleCompass
|
||||
} else if (moduleCompass === 180) {
|
||||
return -90
|
||||
}
|
||||
}
|
||||
case 'east': {
|
||||
if (moduleCompass < 0) {
|
||||
return -(90 + moduleCompass)
|
||||
} else if (moduleCompass === 0) {
|
||||
return -90
|
||||
} else if (moduleCompass < 90) {
|
||||
return -180 + (90 - moduleCompass)
|
||||
} else if (moduleCompass < 180) {
|
||||
return 180 + (90 - moduleCompass)
|
||||
} else if (moduleCompass === 180) {
|
||||
return 90
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
const getNorthArrangement = () => {
|
||||
const surfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE)
|
||||
let northArrangement = '0'
|
||||
@ -2086,7 +2150,7 @@ export const useTrestle = () => {
|
||||
moduleTpCd: module.itemTp,
|
||||
roofMatlCd: parent.roofMaterial.roofMatlCd,
|
||||
mixMatlNo: module.mixMatlNo,
|
||||
raftBaseCd: addRoof.raft,
|
||||
raftBaseCd: addRoof.raft ?? addRoof.raftBaseCd,
|
||||
inclCd: addRoof.pitch,
|
||||
roofPitch: !addRoof.roofPchBase ? addRoof.roofPchBase : Number(addRoof.roofPchBase),
|
||||
exposedLowerBottomTotCnt: result.exposedBottom, // 노출 최하면 갯수
|
||||
|
||||
@ -501,6 +501,67 @@ export function useCanvasSetting() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 기본설정(PlacementShapeSetting) 복사 저장
|
||||
*/
|
||||
const basicSettingCopySave = async (params) => {
|
||||
try {
|
||||
const patternData = {
|
||||
objectNo: correntObjectNo,
|
||||
planNo: Number(params.planNo),
|
||||
roofSizeSet: Number(params.roofSizeSet),
|
||||
roofAngleSet: params.roofAngleSet,
|
||||
roofMaterialsAddList: params.roofsData.map((item) => ({
|
||||
planNo: Number(item.planNo),
|
||||
roofApply: item.roofApply,
|
||||
roofSeq: item.roofSeq,
|
||||
roofMatlCd: item.roofMatlCd,
|
||||
roofWidth: item.roofWidth,
|
||||
roofHeight: item.roofHeight,
|
||||
roofHajebichi: item.roofHajebichi,
|
||||
roofGap: item.roofGap,
|
||||
roofLayout: item.roofLayout,
|
||||
roofPitch: item.roofPitch,
|
||||
roofAngle: item.roofAngle,
|
||||
})),
|
||||
}
|
||||
|
||||
await post({ url: `/api/canvas-management/canvas-basic-settings`, data: patternData }).then((res) => {
|
||||
swalFire({ text: getMessage(res.returnMessage) })
|
||||
})
|
||||
|
||||
/* CanvasSetting Recoil 설정 - roofSizeSet을 문자열로 변환 */
|
||||
setCanvasSetting({
|
||||
...basicSetting,
|
||||
roofSizeSet: String(params.roofSizeSet),
|
||||
})
|
||||
|
||||
/* 배치면초기설정 조회 */
|
||||
fetchBasicSettings(Number(params.planNo), null)
|
||||
|
||||
/* 메뉴 설정 */
|
||||
if (['2', '3'].includes(params?.roofSizeSet)) {
|
||||
setMenuNumber(3)
|
||||
setType('surface')
|
||||
setCurrentMenu(MENU.BATCH_CANVAS.BATCH_DRAWING)
|
||||
} else {
|
||||
setMenuNumber(2)
|
||||
setType('outline')
|
||||
setCurrentMenu(MENU.ROOF_COVERING.EXTERIOR_WALL_LINE)
|
||||
}
|
||||
|
||||
/* 모듈 선택 데이터 초기화 */
|
||||
resetModuleSelectionData()
|
||||
moduleSelectedDataTrigger({ common: {}, module: {}, roofConstructions: [] })
|
||||
const isModuleExist = canvas.getObjects().some((obj) => obj.name === POLYGON_TYPE.MODULE)
|
||||
if (!isModuleExist) {
|
||||
resetSelectedModules()
|
||||
}
|
||||
} catch (error) {
|
||||
swalFire({ text: error.message, icon: 'error' })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* CanvasSetting 조회 및 초기화
|
||||
*/
|
||||
@ -878,7 +939,7 @@ export function useCanvasSetting() {
|
||||
optionName = ['rack', 'smartRack', 'bracket', 'eaveBar', 'halfEaveBar']
|
||||
break
|
||||
case 'imageDisplay':
|
||||
optionName = ['9']
|
||||
optionName = ['backGroundImage']
|
||||
break
|
||||
case 'totalDisplay':
|
||||
/**
|
||||
@ -915,6 +976,7 @@ export function useCanvasSetting() {
|
||||
setAdsorptionRange,
|
||||
fetchSettings,
|
||||
fetchBasicSettings,
|
||||
basicSettingCopySave,
|
||||
frontSettings,
|
||||
globalFont,
|
||||
setGlobalFont,
|
||||
|
||||
@ -15,7 +15,8 @@ const LINE_COLOR = {
|
||||
ACTIVE: '#EA10AC',
|
||||
}
|
||||
|
||||
export function useRoofLinePropertySetting(id, roof) {
|
||||
export function useRoofLinePropertySetting(props) {
|
||||
const { id, roof, setIsHidden } = props
|
||||
const canvas = useRecoilValue(canvasState)
|
||||
const currentObject = useRecoilValue(currentObjectState)
|
||||
const history = useRef([])
|
||||
@ -25,10 +26,20 @@ export function useRoofLinePropertySetting(id, roof) {
|
||||
|
||||
useEffect(() => {
|
||||
if (currentObject && currentObject.name === 'roofLine') {
|
||||
roof.lines.forEach((line) => {
|
||||
const lineType = line.attributes?.type
|
||||
if (!lineType) {
|
||||
line.set({
|
||||
stroke: '#000000',
|
||||
strokeWidth: 4,
|
||||
})
|
||||
}
|
||||
})
|
||||
currentObject.set({
|
||||
stroke: LINE_COLOR.ACTIVE,
|
||||
strokeWidth: 4,
|
||||
})
|
||||
canvas.renderAll()
|
||||
}
|
||||
}, [currentObject])
|
||||
|
||||
@ -97,11 +108,8 @@ export function useRoofLinePropertySetting(id, roof) {
|
||||
}
|
||||
const lastLine = history.current.pop()
|
||||
|
||||
// delete lastLine.attributes
|
||||
lastLine.attributes = {
|
||||
...lastLine.attributes,
|
||||
type: null,
|
||||
}
|
||||
delete lastLine.attributes
|
||||
|
||||
lastLine.set({
|
||||
stroke: LINE_COLOR.DEFAULT,
|
||||
strokeWidth: 4,
|
||||
@ -132,6 +140,7 @@ export function useRoofLinePropertySetting(id, roof) {
|
||||
|
||||
canvas.renderAll()
|
||||
closePopup(id)
|
||||
if (setIsHidden) setIsHidden(false)
|
||||
}
|
||||
|
||||
const nextLineFocus = (selectedLine) => {
|
||||
|
||||
@ -20,6 +20,8 @@ import { useRoofFn } from '@/hooks/common/useRoofFn'
|
||||
import { outerLinePointsState } from '@/store/outerLineAtom'
|
||||
import { placementShapeDrawingPointsState } from '@/store/placementShapeDrawingAtom'
|
||||
import { getBackGroundImage } from '@/lib/imageActions'
|
||||
import PlacementSurfaceLineProperty from '@/components/floor-plan/modal/placementShape/PlacementSurfaceLineProperty'
|
||||
import { v4 as uuidv4 } from 'uuid'
|
||||
|
||||
export function useSurfaceShapeBatch({ isHidden, setIsHidden }) {
|
||||
const { getMessage } = useMessage()
|
||||
@ -35,7 +37,7 @@ export function useSurfaceShapeBatch({ isHidden, setIsHidden }) {
|
||||
const { swalFire } = useSwal()
|
||||
const { addCanvasMouseEventListener, initEvent } = useEvent()
|
||||
// const { addCanvasMouseEventListener, initEvent } = useContext(EventContext)
|
||||
const { closePopup } = usePopup()
|
||||
const { addPopup, closePopup } = usePopup()
|
||||
const { setSurfaceShapePattern } = useRoofFn()
|
||||
const currentCanvasPlan = useRecoilValue(currentCanvasPlanState)
|
||||
|
||||
@ -115,9 +117,13 @@ export function useSurfaceShapeBatch({ isHidden, setIsHidden }) {
|
||||
let imageRotate = 0
|
||||
if (xInversion && !yInversion) {
|
||||
if (rotate % 180 === 0 || rotate < 0) {
|
||||
imageRotate = Math.abs((rotate - 180) % 360)
|
||||
imageRotate = Math.abs(rotate % 360)
|
||||
} else {
|
||||
imageRotate = Math.abs((rotate + 180) % 4)
|
||||
if (rotate < 0) {
|
||||
imageRotate = Math.abs((rotate - 180) % 360)
|
||||
} else {
|
||||
imageRotate = Math.abs((rotate + 180) % 360)
|
||||
}
|
||||
}
|
||||
} else if (xInversion && yInversion) {
|
||||
imageRotate = Math.abs((rotate + 360) % 360)
|
||||
@ -134,7 +140,7 @@ export function useSurfaceShapeBatch({ isHidden, setIsHidden }) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
imageRotate = (rotate + 360) % 360
|
||||
imageRotate = (rotate + 4) % 4
|
||||
}
|
||||
obj.set({ angle: imageRotate })
|
||||
obj.setCoords() //좌표 변경 적용
|
||||
@ -190,10 +196,12 @@ export function useSurfaceShapeBatch({ isHidden, setIsHidden }) {
|
||||
setSurfaceShapePattern(batchSurface, roofDisplay.column)
|
||||
drawDirectionArrow(batchSurface)
|
||||
|
||||
if (setIsHidden) setIsHidden(false)
|
||||
// if (setIsHidden) setIsHidden(false)
|
||||
|
||||
// closePopup(id)
|
||||
initEvent()
|
||||
const popupId = uuidv4()
|
||||
addPopup(popupId, 2, <PlacementSurfaceLineProperty roof={batchSurface} id={popupId} setIsHidden={setIsHidden} />)
|
||||
})
|
||||
} else {
|
||||
if (setIsHidden) setIsHidden(false)
|
||||
|
||||
@ -3,7 +3,7 @@ import { fabric } from 'fabric'
|
||||
|
||||
import { actionHandler, anchorWrapper, polygonPositionHandler } from '@/util/canvas-util'
|
||||
|
||||
import { useRecoilState } from 'recoil'
|
||||
import { useRecoilState, useRecoilValue } from 'recoil'
|
||||
import { canvasSizeState, canvasState, fontSizeState } from '@/store/canvasAtom'
|
||||
import { QLine } from '@/components/fabric/QLine'
|
||||
import { QPolygon } from '@/components/fabric/QPolygon'
|
||||
@ -15,6 +15,7 @@ import { useAxios } from '@/hooks/useAxios'
|
||||
import { useFont } from '@/hooks/common/useFont'
|
||||
import { OBJECT_PROTOTYPE, POLYGON_TYPE, RELOAD_TYPE_PROTOTYPE, SAVE_KEY } from '@/common/common'
|
||||
import { usePlan } from './usePlan'
|
||||
import { imageDisplaySelector } from '@/store/settingAtom'
|
||||
|
||||
export function useCanvas(id) {
|
||||
const [canvas, setCanvas] = useRecoilState(canvasState)
|
||||
@ -24,6 +25,7 @@ export function useCanvas(id) {
|
||||
const [canvasSize] = useRecoilState(canvasSizeState)
|
||||
const [fontSize] = useRecoilState(fontSizeState)
|
||||
const { setCanvasForEvent, attachDefaultEventOnCanvas } = useCanvasEvent()
|
||||
const isImageDisplay = useRecoilValue(imageDisplaySelector)
|
||||
const {} = useFont()
|
||||
|
||||
/**
|
||||
@ -530,6 +532,7 @@ export function useCanvas(id) {
|
||||
lockRotation: false,
|
||||
lockScalingX: false,
|
||||
lockScalingY: false,
|
||||
visible: isImageDisplay,
|
||||
})
|
||||
// image = img
|
||||
canvas?.add(img)
|
||||
|
||||
@ -62,7 +62,6 @@ export function useCircuitTrestle() {
|
||||
|
||||
// 사용된 모듈아이템 목록
|
||||
const getUseModuleItemList = () => {
|
||||
console.log('🚀 ~ getUseModuleItemList ~ selectedModules:', selectedModules)
|
||||
return selectedModules?.itemList?.map((m) => {
|
||||
return {
|
||||
itemId: m.itemId,
|
||||
|
||||
@ -5,7 +5,7 @@ import { usePathname, useRouter } from 'next/navigation'
|
||||
|
||||
import { useRecoilState, useResetRecoilState } from 'recoil'
|
||||
|
||||
import { canvasState, currentCanvasPlanState, plansState } from '@/store/canvasAtom'
|
||||
import { canvasState, currentCanvasPlanState, plansState, canvasSettingState } from '@/store/canvasAtom'
|
||||
import { useAxios } from '@/hooks/useAxios'
|
||||
import { useMessage } from '@/hooks/useMessage'
|
||||
import { useSwal } from '@/hooks/useSwal'
|
||||
@ -39,7 +39,8 @@ export function usePlan(params = {}) {
|
||||
const resetOuterLinePoints = useResetRecoilState(outerLinePointsState)
|
||||
const resetPlacementShapeDrawingPoints = useResetRecoilState(placementShapeDrawingPointsState)
|
||||
|
||||
const { fetchBasicSettings } = useCanvasSetting()
|
||||
const { fetchBasicSettings, basicSettingCopySave } = useCanvasSetting()
|
||||
const [canvasSetting, setCanvasSetting] = useRecoilState(canvasSettingState)
|
||||
|
||||
/**
|
||||
* 마우스 포인터의 가이드라인 제거
|
||||
@ -184,41 +185,55 @@ export function usePlan(params = {}) {
|
||||
objectNo: objectNo,
|
||||
copyFlg: '0',
|
||||
}
|
||||
await promisePost({ url: '/api/object/add-plan', data: planData })
|
||||
.then((res) => {
|
||||
let newPlan = {
|
||||
id: res.data.canvasId,
|
||||
objectNo: objectNo,
|
||||
planNo: res.data.planNo,
|
||||
userId: userId,
|
||||
canvasStatus: '',
|
||||
isCurrent: true,
|
||||
bgImageName: null,
|
||||
mapPositionAddress: null,
|
||||
}
|
||||
try {
|
||||
const res = await promisePost({ url: '/api/object/add-plan', data: planData })
|
||||
let newPlan = {
|
||||
id: res.data.canvasId,
|
||||
objectNo: objectNo,
|
||||
planNo: res.data.planNo,
|
||||
userId: userId,
|
||||
canvasStatus: '',
|
||||
isCurrent: true,
|
||||
bgImageName: null,
|
||||
mapPositionAddress: null,
|
||||
}
|
||||
|
||||
if (isInitPlan) {
|
||||
/* 초기 플랜 생성인 경우 플랜 목록 초기화 */
|
||||
setCurrentCanvasPlan(newPlan)
|
||||
setPlans([newPlan])
|
||||
} else {
|
||||
if (isCopy) {
|
||||
/* 복제 플랜 생성인 경우 현재 캔버스 데이터를 복제 */
|
||||
newPlan.canvasStatus = currentCanvasData()
|
||||
newPlan.bgImageName = currentCanvasPlan?.bgImageName ?? null
|
||||
newPlan.mapPositionAddress = currentCanvasPlan?.mapPositionAddress ?? null
|
||||
}
|
||||
setCurrentCanvasPlan(newPlan)
|
||||
setPlans((plans) => [...plans.map((plan) => ({ ...plan, isCurrent: false })), newPlan])
|
||||
swalFire({ text: getMessage('plan.message.save') })
|
||||
}
|
||||
if (isInitPlan) {
|
||||
/* 초기 플랜 생성인 경우 플랜 목록 초기화 */
|
||||
setCurrentCanvasPlan(newPlan)
|
||||
setPlans([newPlan])
|
||||
|
||||
/* 플랜 추가 시 배치면초기설정 정보 조회 */
|
||||
fetchBasicSettings(newPlan.planNo, null)
|
||||
})
|
||||
.catch((error) => {
|
||||
swalFire({ text: error.response.data.message, icon: 'error' })
|
||||
})
|
||||
} else {
|
||||
if (isCopy) {
|
||||
/* 복제 플랜 생성인 경우 현재 캔버스 데이터를 복제 */
|
||||
newPlan.canvasStatus = currentCanvasData()
|
||||
newPlan.bgImageName = currentCanvasPlan?.bgImageName ?? null
|
||||
newPlan.mapPositionAddress = currentCanvasPlan?.mapPositionAddress ?? null
|
||||
|
||||
/* 복제 시 배치면 초기설정 복사 */
|
||||
basicSettingCopySave({
|
||||
...canvasSetting,
|
||||
planNo: newPlan.planNo,
|
||||
selectedRoofMaterial: {
|
||||
...canvasSetting.selectedRoofMaterial,
|
||||
planNo: newPlan.planNo,
|
||||
},
|
||||
roofsData: canvasSetting.roofsData.map((roof) => ({
|
||||
...roof,
|
||||
planNo: newPlan.planNo,
|
||||
})),
|
||||
})
|
||||
}
|
||||
setCurrentCanvasPlan(newPlan)
|
||||
setPlans((plans) => [...plans.map((plan) => ({ ...plan, isCurrent: false })), newPlan])
|
||||
|
||||
swalFire({ text: getMessage('plan.message.save') })
|
||||
}
|
||||
} catch (error) {
|
||||
swalFire({ text: error.response.data.message, icon: 'error' })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -275,7 +290,6 @@ export function usePlan(params = {}) {
|
||||
const objectNo = floorPlanState.objectNo
|
||||
|
||||
//견적서 or 발전시뮬
|
||||
|
||||
if (pathname !== '/floor-plan') {
|
||||
await promiseGet({ url: `/api/estimate/${objectNo}/${planNo}/detail` })
|
||||
.then((res) => {
|
||||
@ -304,9 +318,6 @@ export function usePlan(params = {}) {
|
||||
// 클릭한 플랜 탭으로 이동
|
||||
setCurrentCanvasPlan(plans.find((plan) => plan.id === newCurrentId))
|
||||
setPlans((plans) => plans.map((plan) => ({ ...plan, isCurrent: plan.id === newCurrentId })))
|
||||
|
||||
/* 플랜 이동 시 배치면초기설정 정보 조회 (견적서 메뉴 제외) */
|
||||
fetchBasicSettings(planNo, null)
|
||||
} else {
|
||||
swalFire({ text: getMessage('estimate.menu.move.valid1') })
|
||||
}
|
||||
@ -494,7 +505,13 @@ export function usePlan(params = {}) {
|
||||
* @param {string} planNo - 플랜번호
|
||||
*/
|
||||
const deleteBasicSettings = async (objectNo, planNo) => {
|
||||
await promiseDel({ url: `/api/canvas-management/canvas-basic-settings/delete-basic-settings/${objectNo}/${planNo}` })
|
||||
try {
|
||||
await promiseDel({ url: `/api/canvas-management/canvas-basic-settings/delete-basic-settings/${objectNo}/${planNo}` })
|
||||
} catch (error) {
|
||||
/* 오류를 무시하고 계속 진행 */
|
||||
console.log('Basic settings delete failed or not found:', error)
|
||||
// swalFire({ text: error.message, icon: 'error' })
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
@ -663,9 +663,9 @@
|
||||
"stuff.planReqPopup.title": "設計依頼のインポート",
|
||||
"stuff.temp.subTitle": "商品情報",
|
||||
"stuff.temp.subTitle2": "作図",
|
||||
"stuff.detail.header.notExistObjectNo": "存在しないものです。",
|
||||
"stuff.detail.header.successCopy": "物件番号がコピーされました。",
|
||||
"stuff.detail.header.failCopy": "物件番号のコピーに失敗しました。",
|
||||
"stuff.detail.header.notExistObjectNo": "存在しないもの番号です.",
|
||||
"stuff.detail.header.successCopy": "物件番号がコピーされました.",
|
||||
"stuff.detail.header.failCopy": "物件番号のコピーに失敗しました.",
|
||||
"stuff.detail.header.objectNo": "物件番号",
|
||||
"stuff.detail.header.specificationConfirmDate": "仕様確認日",
|
||||
"stuff.detail.header.lastEditDatetime": "更新日時",
|
||||
@ -1013,6 +1013,8 @@
|
||||
"module.place.select.one.module": "モジュールは1つだけ選択してください。",
|
||||
"batch.canvas.delete.all": "配置面の内容をすべて削除しますか?",
|
||||
"module.not.found": "インストールモジュールを選択してください。",
|
||||
"module.circuit.minimun.error": "회로번호는 1 이상입력해주세요.(JA)",
|
||||
"module.already.exist.error": "회로번호가 같은 다른 파워 컨디셔너 모듈이 있습니다. 다른 회로번호를 설정하십시오.(JA)",
|
||||
"construction.length.difference": "屋根面工法をすべて選択してください。",
|
||||
"menu.validation.canvas.roof": "パネルを配置するには、屋根面を入力する必要があります。",
|
||||
"batch.object.outside.roof": "オブジェクトは屋根に設置する必要があります。",
|
||||
|
||||
@ -663,7 +663,7 @@
|
||||
"stuff.planReqPopup.title": "설계의뢰 불러오기",
|
||||
"stuff.temp.subTitle": "물건정보",
|
||||
"stuff.temp.subTitle2": "도면작성",
|
||||
"stuff.detail.header.notExistObjectNo": "존재하지 않는 물건입니다.",
|
||||
"stuff.detail.header.notExistObjectNo": "존재하지 않는 물건번호 입니다.",
|
||||
"stuff.detail.header.successCopy": "물건번호가 복사되었습니다.",
|
||||
"stuff.detail.header.failCopy": "물건번호 복사에 실패했습니다.",
|
||||
"stuff.detail.header.objectNo": "물건번호",
|
||||
@ -1014,6 +1014,8 @@
|
||||
"module.place.select.one.module": "모듈은 하나만 선택해주세요.",
|
||||
"batch.canvas.delete.all": "배치면 내용을 전부 삭제하시겠습니까?",
|
||||
"module.not.found": "모듈을 선택하세요.",
|
||||
"module.circuit.minimun.error": "회로번호는 1 이상입력해주세요.",
|
||||
"module.already.exist.error": "회로번호가 같은 다른 파워 컨디셔너 모듈이 있습니다. 다른 회로번호를 설정하십시오.",
|
||||
"construction.length.difference": "지붕면 공법을 전부 선택해주세요.",
|
||||
"menu.validation.canvas.roof": "패널을 배치하려면 지붕면을 입력해야 합니다.",
|
||||
"batch.object.outside.roof": "오브젝트는 지붕내에 설치해야 합니다.",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user