Merge remote-tracking branch 'origin/qcast-pub' into qcast-pub

# Conflicts:
#	src/locales/ja.json
#	src/locales/ko.json
This commit is contained in:
김민식 2025-02-10 15:15:24 +09:00
commit 94b97215e5
8 changed files with 77 additions and 17 deletions

View File

@ -74,7 +74,7 @@ export default function CanvasMenu(props) {
const [estimateCopyPopupOpen, setEstimateCopyPopupOpen] = useState(false) const [estimateCopyPopupOpen, setEstimateCopyPopupOpen] = useState(false)
const { getMessage } = useMessage() const { getMessage } = useMessage()
const { saveCanvas } = usePlan() const { saveCanvas, reloadCanvasStatus } = usePlan()
const { swalFire } = useSwal() const { swalFire } = useSwal()
const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent()
// const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext) // const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext)
@ -149,7 +149,7 @@ export default function CanvasMenu(props) {
setIsGlobalLoading(false) setIsGlobalLoading(false)
} }
const onClickNav = (menu) => { const onClickNav = async (menu) => {
switch (menu.index) { switch (menu.index) {
case 0: case 0:
swalFire({ swalFire({
@ -164,17 +164,45 @@ export default function CanvasMenu(props) {
case 1: case 1:
setType('placementShape') setType('placementShape')
onClickPlacementInitialMenu() onClickPlacementInitialMenu()
await reloadCanvasStatus(objectNo, pid)
break break
case 2: case 2:
setType('outline') setType('outline')
await reloadCanvasStatus(objectNo, pid)
break break
case 3: case 3:
setType('surface')
break
case 4:
console.log('🚀 ~ onClickNav ~ menu:', menu) console.log('🚀 ~ onClickNav ~ menu:', menu)
console.log('🚀 ~ onClickNav ~ menuNumber:', menuNumber) console.log('🚀 ~ onClickNav ~ menuNumber:', menuNumber)
if (menuNumber > menu.index) {
const modules = canvas.getObjects().filter((module) => module.name === POLYGON_TYPE.MODULE)
if (modules.length > 0) {
swalFire({
text: getMessage('module.delete.confirm'),
type: 'confirm',
confirmFn: () => {
//
const moduleSurfacesArray = canvas
.getObjects()
.filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE || obj.name === POLYGON_TYPE.MODULE)
if (moduleSurfacesArray.length > 0) {
moduleSurfacesArray.forEach((moduleSurface) => {
canvas.remove(moduleSurface)
})
canvas.renderAll()
}
setType('surface')
},
denyFn: () => {
setType('surface')
},
})
}
} else {
setType('surface')
}
await reloadCanvasStatus(objectNo, pid)
break
case 4:
if (menuNumber < menu.index) { if (menuNumber < menu.index) {
if (!checkMenuAndCanvasState()) { if (!checkMenuAndCanvasState()) {
swalFire({ text: getMessage('menu.validation.canvas.roof') }) swalFire({ text: getMessage('menu.validation.canvas.roof') })
@ -185,7 +213,7 @@ export default function CanvasMenu(props) {
} else { } else {
router.push(`/floor-plan?pid=${pid}&objectNo=${objectNo}`) router.push(`/floor-plan?pid=${pid}&objectNo=${objectNo}`)
} }
await reloadCanvasStatus(objectNo, pid)
break break
case 5: case 5:
setIsGlobalLoading(true) setIsGlobalLoading(true)
@ -591,10 +619,10 @@ export default function CanvasMenu(props) {
<li <li
key={`canvas-menu-${menu.index}`} key={`canvas-menu-${menu.index}`}
className={`canvas-menu-item ${menuNumber === menu.index ? 'active' : ''}`} className={`canvas-menu-item ${menuNumber === menu.index ? 'active' : ''}`}
onClick={() => { onClick={async () => {
if (['2', '3'].includes(canvasSetting?.roofSizeSet) && menu.index === 2) return if (['2', '3'].includes(canvasSetting?.roofSizeSet) && menu.index === 2) return
if (menuNumber === 4 && [1, 2].includes(menu.index)) return if (menuNumber === 4 && [1, 2].includes(menu.index)) return
onClickNav(menu) await onClickNav(menu)
}} }}
> >
<button className={checkMenuState(menu) ? 'no-click' : ''}> <button className={checkMenuState(menu) ? 'no-click' : ''}>

View File

@ -108,6 +108,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
.some((obj) => obj.modules?.length > 0) .some((obj) => obj.modules?.length > 0)
if (hasModules) { if (hasModules) {
orientationRef.current.handleNextStep()
setTabNum(3) setTabNum(3)
} }
}, []) }, [])

View File

@ -458,11 +458,8 @@ export default function CircuitTrestleSetting({ id }) {
swalFire({ swalFire({
title: getMessage('not.allocation.exist.module'), title: getMessage('not.allocation.exist.module'),
type: 'alert', type: 'alert',
confirmFn: () => {},
}) })
return return
// canvas.remove(...notAllocationModules)
// canvas.renderAll()
} }
setTabNum(2) setTabNum(2)
} }

View File

@ -21,6 +21,7 @@ import { useMasterController } from '@/hooks/common/useMasterController'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
// import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle' // import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle'
import { isObjectNotEmpty } from '@/util/common-utils' import { isObjectNotEmpty } from '@/util/common-utils'
import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle'
export function useModuleBasicSetting(tabNum) { export function useModuleBasicSetting(tabNum) {
const canvas = useRecoilValue(canvasState) const canvas = useRecoilValue(canvasState)
@ -49,6 +50,7 @@ export function useModuleBasicSetting(tabNum) {
const [saleStoreNorthFlg, setSaleStoreNorthFlg] = useState(false) const [saleStoreNorthFlg, setSaleStoreNorthFlg] = useState(false)
const [currentObject, setCurrentObject] = useRecoilState(currentObjectState) const [currentObject, setCurrentObject] = useRecoilState(currentObjectState)
const { setModuleStatisticsData } = useCircuitTrestle()
useEffect(() => { useEffect(() => {
// console.log('basicSetting', basicSetting) // console.log('basicSetting', basicSetting)
@ -275,10 +277,23 @@ export function useModuleBasicSetting(tabNum) {
//바로 들어올때 //바로 들어올때
const setupModules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE) const setupModules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE)
const eaveBars = canvas.getObjects().filter((obj) => obj.name === 'eaveBar' || obj.name === 'halfEaveBar')
const racks = canvas.getObjects().filter((obj) => obj.name === 'rack' || obj.name === 'smartRack')
const brackets = canvas.getObjects().filter((obj) => obj.name === 'brackets')
setupModules.forEach((obj) => { setupModules.forEach((obj) => {
canvas.bringToFront(obj) canvas.bringToFront(obj)
}) })
eaveBars.forEach((obj) => {
canvas.bringToFront(obj)
})
racks.forEach((obj) => {
canvas.bringToFront(obj)
})
brackets.forEach((obj) => {
canvas.bringToFront(obj)
})
//모듈설치면 클릭이벤트 //모듈설치면 클릭이벤트
addTargetMouseEventListener('mousedown', setupSurface, function () { addTargetMouseEventListener('mousedown', setupSurface, function () {
toggleSelection(setupSurface) toggleSelection(setupSurface)

View File

@ -61,8 +61,7 @@ export function useCircuitTrestle() {
// 사용된 모듈아이템 목록 // 사용된 모듈아이템 목록
const getUseModuleItemList = () => { const getUseModuleItemList = () => {
console.log('🚀 ~ getUseModuleItemList ~ selectedModules:', selectedModules) return selectedModules?.itemList?.map((m) => {
return moduleSelectionData.module?.itemList?.map((m) => {
return { return {
itemId: m.itemId, itemId: m.itemId,
mixMatlNo: m.mixMatlNo, mixMatlNo: m.mixMatlNo,

View File

@ -134,7 +134,7 @@ export function usePlan(params = {}) {
/** /**
* objectNo에 해당하는 canvas 목록을 조회 * objectNo에 해당하는 canvas 목록을 조회
*/ */
const getCanvasByObjectNo = async (userId, objectNo, planNo) => { const getCanvasByObjectNo = async (objectNo, planNo) => {
return await get({ url: `/api/canvas-management/canvas-statuses/by-object/${objectNo}` }).then((res) => return await get({ url: `/api/canvas-management/canvas-statuses/by-object/${objectNo}` }).then((res) =>
res.map((item) => ({ res.map((item) => ({
id: item.id, id: item.id,
@ -397,7 +397,7 @@ export function usePlan(params = {}) {
*/ */
const loadCanvasPlanData = async (userId, objectNo, planNo) => { const loadCanvasPlanData = async (userId, objectNo, planNo) => {
console.log('🚀 ~ loadCanvasPlanData ~ userId, objectNo, planNo:', userId, objectNo, planNo) console.log('🚀 ~ loadCanvasPlanData ~ userId, objectNo, planNo:', userId, objectNo, planNo)
await getCanvasByObjectNo(userId, objectNo, planNo).then(async (res) => { await getCanvasByObjectNo(objectNo, planNo).then(async (res) => {
if (res.length > 0) { if (res.length > 0) {
setCurrentCanvasPlan(res.find((plan) => plan.planNo === planNo)) setCurrentCanvasPlan(res.find((plan) => plan.planNo === planNo))
setPlans(res) setPlans(res)
@ -415,6 +415,22 @@ export function usePlan(params = {}) {
setPlans((plans) => plans.map((plan) => ({ ...plan, canvasStatus: null }))) setPlans((plans) => plans.map((plan) => ({ ...plan, canvasStatus: null })))
} }
/**
* plan canvasStatus 불러오기
*
* 견적서/발전시뮬레이션에서 플랜 이동 현재 플랜의 canvasStatus를 불러오기 위해 사용
*/
const reloadCanvasStatus = async (objectNo, planNo) => {
if (pathname === '/floor-plan/estimate/5' || pathname === '/floor-plan/simulator/6') {
await getCanvasByObjectNo(objectNo, planNo).then((res) => {
if (res.length > 0) {
setCurrentCanvasPlan((prev) => ({ ...prev, canvasStatus: res.find((plan) => plan.planNo === planNo).canvasStatus }))
setPlans((plans) => plans.map((plan) => ({ ...plan, canvasStatus: res.find((plan) => plan.planNo === planNo).canvasStatus })))
}
})
}
}
/** /**
* 현재 plan 이동 -> 새로운 링크로 이동 * 현재 plan 이동 -> 새로운 링크로 이동
*/ */
@ -434,5 +450,6 @@ export function usePlan(params = {}) {
handleDeletePlan, handleDeletePlan,
loadCanvasPlanData, loadCanvasPlanData,
resetCanvasStatus, resetCanvasStatus,
reloadCanvasStatus,
} }
} }

View File

@ -1010,7 +1010,9 @@
"batch.object.outside.roof": "オブジェクトは屋根に設置する必要があります。", "batch.object.outside.roof": "オブジェクトは屋根に設置する必要があります。",
"batch.object.notinstall.cross": "オブジェクトは重複してインストールできません。", "batch.object.notinstall.cross": "オブジェクトは重複してインストールできません。",
"module.not.batch.north": "북쪽에는 모듈을 배치할 수 없습니다.", "module.not.batch.north": "북쪽에는 모듈을 배치할 수 없습니다.",
"module.trestleDetail.not.exist": "가대 상세 정보가 없습니다.",
"max.select": "최대 {0}개까지 선택할 수 있습니다.(JA)", "max.select": "최대 {0}개까지 선택할 수 있습니다.(JA)",
"not.allocation.exist.module": "할당하지 않은 모듈이 있습니다.(JA)", "not.allocation.exist.module": "할당하지 않은 모듈이 있습니다.(JA)",
"roof.is.not.selected": "지붕을 선택해주세요.(JA)" "roof.is.not.selected": "지붕을 선택해주세요.(JA)",
"module.delete.confirm": "パネルを削除して面入力に戻ります。正しいですか?\nはいを選択すると削除し、面入力に戻ります。\nいいえ」を選択すると、削除せずに現在の状態を維持します。"
} }

View File

@ -1013,6 +1013,7 @@
"module.not.batch.north": "북쪽에는 모듈을 배치할 수 없습니다.", "module.not.batch.north": "북쪽에는 모듈을 배치할 수 없습니다.",
"module.trestleDetail.not.exist": "가대 상세 정보가 없습니다.", "module.trestleDetail.not.exist": "가대 상세 정보가 없습니다.",
"max.select": "최대 {0}개까지 선택할 수 있습니다.", "max.select": "최대 {0}개까지 선택할 수 있습니다.",
"module.delete.confirm": "패널을 삭제하고 면입력으로 돌아갑니다. 맞습니까?\n[예]를 선택하면 삭제하고, 면 입력으로 돌아갑니다.\n[아니오]를 선택하면 삭제하지 않고 현재 상태를 유지합니다.",
"not.allocation.exist.module": "할당하지 않은 모듈이 있습니다.", "not.allocation.exist.module": "할당하지 않은 모듈이 있습니다.",
"roof.is.not.selected": "지붕을 선택해주세요." "roof.is.not.selected": "지붕을 선택해주세요."
} }