From 679d9f8a3290542c41bcdf0d7944fee5030b5e88 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Mon, 3 Feb 2025 20:34:36 +0900 Subject: [PATCH 01/12] =?UTF-8?q?=EA=B0=80=EB=8C=80=20=EC=84=A4=EC=B9=98?= =?UTF-8?q?=20=ED=9B=84=20=EB=B9=BD=20=ED=95=A0=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20=EA=B0=80=EB=8C=80=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A7=80=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/common.js | 1 + .../floor-plan/modal/basic/step/Orientation.jsx | 10 ++++++---- src/hooks/common/useMenu.js | 3 +++ src/hooks/module/useTrestle.js | 10 +++++++++- src/hooks/useTempGrid.js | 4 ++-- src/util/canvas-util.js | 2 +- 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/common/common.js b/src/common/common.js index a35dc8c4..2578e138 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -177,6 +177,7 @@ export const SAVE_KEY = [ 'moduleRowsTotCnt', 'seq', 'smartRackId', + 'directionText', 'quotationParam', 'pcses', ] diff --git a/src/components/floor-plan/modal/basic/step/Orientation.jsx b/src/components/floor-plan/modal/basic/step/Orientation.jsx index 590c9d46..d06b6b39 100644 --- a/src/components/floor-plan/modal/basic/step/Orientation.jsx +++ b/src/components/floor-plan/modal/basic/step/Orientation.jsx @@ -28,8 +28,10 @@ export const Orientation = forwardRef(({ tabNum }, ref) => { }, [compasDeg]) const checkDegree = (e) => { - if (numberCheck(Number(e)) && Number(e) >= -180 && Number(e) <= 180) { - setCompasDeg(Number(e)) + if (Number(e) >= -180 && Number(e) <= 180) { + if (numberCheck(Number(e))) { + setCompasDeg(Number(e)) + } } else { setCompasDeg(compasDeg) } @@ -46,8 +48,8 @@ export const Orientation = forwardRef(({ tabNum }, ref) => { {Array.from({ length: 180 / 15 }).map((dot, index) => (
setCompasDeg(15 * (12 + index))} + className={`circle ${getDegreeInOrientation(compasDeg) === -1 * (-15 * index + 180) ? 'act' : ''}`} + onClick={() => setCompasDeg(-1 * (-15 * index + 180))} > {index === 0 && 180°} {index === 6 && -90°} diff --git a/src/hooks/common/useMenu.js b/src/hooks/common/useMenu.js index c0a4e1d5..5eadcf18 100644 --- a/src/hooks/common/useMenu.js +++ b/src/hooks/common/useMenu.js @@ -19,6 +19,7 @@ import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' import { useRecoilValue } from 'recoil' import { currentMenuState } from '@/store/canvasAtom' import { MENU } from '@/common/common' +import { useTrestle } from '@/hooks/module/useTrestle' export default function useMenu() { const menus = [] @@ -26,6 +27,7 @@ export default function useMenu() { const [popupId, setPopupId] = useState(uuidv4()) const { addPopup } = usePopup() const { deleteAllSurfacesAndObjects } = useSurfaceShapeBatch({}) + const { clear: trestleClear } = useTrestle() const handleMenu = (type) => { if (type === 'outline') { switch (currentMenu) { @@ -79,6 +81,7 @@ export default function useMenu() { if (type === 'module') { switch (currentMenu) { case MENU.MODULE_CIRCUIT_SETTING.BASIC_SETTING: + trestleClear() addPopup(popupId, 1, ) break case MENU.MODULE_CIRCUIT_SETTING.CIRCUIT_TRESTLE_SETTING: diff --git a/src/hooks/module/useTrestle.js b/src/hooks/module/useTrestle.js index 2fd95ba2..f9aa1de0 100644 --- a/src/hooks/module/useTrestle.js +++ b/src/hooks/module/useTrestle.js @@ -1882,5 +1882,13 @@ export const useTrestle = () => { } } - return { apply, getTrestleParams } + const clear = () => { + canvas.getObjects().forEach((obj) => { + if (obj.name === 'eaveBar' || obj.name === 'rack' || obj.name === 'halfEaveBar' || obj.name === 'smartRack') { + canvas.remove(obj) + } + }) + } + + return { apply, getTrestleParams, clear } } diff --git a/src/hooks/useTempGrid.js b/src/hooks/useTempGrid.js index 7bfcf263..d43a19c0 100644 --- a/src/hooks/useTempGrid.js +++ b/src/hooks/useTempGrid.js @@ -13,7 +13,7 @@ export function useTempGrid() { //임의 그리드 모드일 경우 let pointer = canvas.getPointer(e.e) - const tempGrid = new fabric.Line([pointer.x, 0, pointer.x, canvas.height], { + const tempGrid = new fabric.Line([pointer.x, -1500, pointer.x, 2500], { stroke: gridColor, strokeWidth: 1, selectable: true, @@ -41,7 +41,7 @@ export function useTempGrid() { //임의 그리드 모드일 경우 let pointer = { x: e.offsetX, y: e.offsetY } - const tempGrid = new fabric.Line([0, pointer.y, canvas.width, pointer.y], { + const tempGrid = new fabric.Line([-1500, pointer.y, 2500, pointer.y], { stroke: gridColor, strokeWidth: 1, selectable: true, diff --git a/src/util/canvas-util.js b/src/util/canvas-util.js index 5df32879..2204eaec 100644 --- a/src/util/canvas-util.js +++ b/src/util/canvas-util.js @@ -957,7 +957,7 @@ export const getAllRelatedObjects = (id, canvas) => { // 모듈,회로 구성에서 사용하는 degree 범위 별 값 export const getDegreeInOrientation = (degree) => { - if (degree >= 352) { + if (degree >= 180 || degree < -180) { return 0 } if (degree % 15 === 0) return degree From 12e615717a0911f99ab7bc6aabed69eebfb8a1f2 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 3 Feb 2025 20:45:50 +0900 Subject: [PATCH 02/12] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=20=EB=85=B8=EC=B6=9C=20&=20=EC=A0=80=EC=9E=A5=EC=8B=9C=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=20=EA=B4=80=EB=A0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 68 ++++++-------------- src/components/management/StuffHeader.jsx | 2 +- src/components/management/StuffSubHeader.jsx | 12 ++-- 3 files changed, 25 insertions(+), 57 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index bb820b7c..c352b9a5 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -283,15 +283,19 @@ export default function StuffDetail() { cellStyle: { justifyContent: 'center' }, cellRenderer: (params) => { let buttonStyle + let buttonStyle2 if (params.value == null) { buttonStyle = { display: 'none', } - } - if (managementState?.createUser === 'T01') { - if (session.userId !== 'T01') { - // #474 - buttonStyle = { display: 'none' } + buttonStyle2 = { + display: 'none', + } + } else { + if (managementState?.createSaleStoreId === 'T01') { + if (session?.storeId !== 'T01') { + buttonStyle = { display: 'none' } + } } } return ( @@ -312,7 +316,7 @@ export default function StuffDetail() { {getMessage('stuff.detail.planGrid.btn1')}
- + )) || ( diff --git a/src/components/main/MainContents.jsx b/src/components/main/MainContents.jsx index 3c1e184b..2985484e 100644 --- a/src/components/main/MainContents.jsx +++ b/src/components/main/MainContents.jsx @@ -14,10 +14,9 @@ import { useMainContentsController } from '@/hooks/main/useMainContentsControlle import { QcastContext } from '@/app/QcastProvider' import { useSwal } from '@/hooks/useSwal' -import BoardDetailModal from '../community/modal/BoardDetailModal' import { handleFileDown } from '@/util/board-utils' -export default function MainContents() { +export default function MainContents({ setFaqOpen, setFaqModalNoticeNo }) { const { swalFire } = useSwal() const { getMessage } = useMessage() @@ -116,10 +115,6 @@ export default function MainContents() { } } - // FAQ 팝업 관련 - const [open, setOpen] = useState(false) - const [modalNoticeNo, setModalNoticeNo] = useState('') - return (
@@ -178,7 +173,6 @@ export default function MainContents() {
- {open && }
{recentFaqList.length > 0 ? ( @@ -192,8 +186,8 @@ export default function MainContents() { className="faq-title pre" style={{ cursor: 'pointer' }} onClick={() => { - setOpen(true) - setModalNoticeNo(row.noticeNo) + setFaqOpen(true) + setFaqModalNoticeNo(row.noticeNo) }} > {row.title} From d0126343b9e2d37aeeed7c0fc814f75ccdbf0929 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 4 Feb 2025 10:26:15 +0900 Subject: [PATCH 11/12] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=A7=8C=EB=93=A4=EA=B8=B0=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useTrestle.js | 52 ++++++++++++++++++++++++++++++---- src/store/estimateAtom.js | 23 +++++++++++++++ 2 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 src/store/estimateAtom.js diff --git a/src/hooks/module/useTrestle.js b/src/hooks/module/useTrestle.js index 8f1ed94c..eb7ecbc2 100644 --- a/src/hooks/module/useTrestle.js +++ b/src/hooks/module/useTrestle.js @@ -1,16 +1,18 @@ -import { useRecoilValue } from 'recoil' +import { useRecoilState, useRecoilValue } from 'recoil' import { canvasState } from '@/store/canvasAtom' import { POLYGON_TYPE } from '@/common/common' import { moduleSelectionDataState } from '@/store/selectedModuleOptions' import { getDegreeByChon, getTrestleLength } from '@/util/canvas-util' import { v4 as uuidv4 } from 'uuid' import { useMasterController } from '@/hooks/common/useMasterController' +import { estimateParamAtom } from '@/store/estimateAtom' // 회로 및 가대설정 export const useTrestle = () => { const canvas = useRecoilValue(canvasState) const moduleSelectionData = useRecoilValue(moduleSelectionDataState) //다음으로 넘어가는 최종 데이터 const { getQuotationItem } = useMasterController() + const [estimateParam, setEstimateParam] = useRecoilState(estimateParamAtom) const apply = () => { //처마력바가 체크되어 있는 경우 exposedBottomPoints를 이용해 처마력바 그려줘야함. @@ -54,6 +56,10 @@ export const useTrestle = () => { }) const result = calculateForApi(surface) + + if (!result) { + return + } const centerPoints = result.centerPoints const exposedBottomModules = [] // 아래 두면이 모두 노출 되어있는 경우 @@ -439,16 +445,50 @@ export const useTrestle = () => { const quotationParam = getTrestleParams(surface) surface.set({ quotationParam }) - getQuoationItems() + }) + setQuoationItem() + } + + // itemList 조회 후 estimateParam에 저장 + const setQuoationItem = () => { + const surfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) + //surfaces.pcses들을 배열로 묶는다 + const pcses = surfaces[0].pcses + surfaces.forEach((surface, index) => { + if (index !== 0) { + pcses.concat(surface.pcses) + } + }) + const params = { trestles: surfaces.map((surface) => surface.quotationParam), pcses } + //견적서 itemList 조회 + getQuotationItem(params).then((res) => { + if (!res.data) { + return + } + const itemList = res.data + //northArrangement 북면 설치 여부 + const northArrangement = getNorthArrangement() + + setEstimateParam({ ...estimateParam, itemList, northArrangement }) }) } - const getQuoationItems = () => { + const getNorthArrangement = () => { const surfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) - const params = { trestles: surfaces.map((surface) => surface.quotationParam), pcses: surfaces[0].pcses ?? [] } - getQuotationItem(params).then((res) => { - console.log('res', res) + let northArrangement = '0' + + surfaces.forEach((surface) => { + const parent = canvas.getObjects().find((obj) => obj.id === surface.parentId) + const directionText = parent.directionText + // ['西北西','東北東'] 의 경우를 제외하고는 北이 들어간 경우 전부 북면으로 간주 + if (directionText.includes('北') && !directionText.includes('西北西') && !directionText.includes('東北東')) { + if (surface.modules.length > 0) { + northArrangement = '1' + } + } }) + + return northArrangement } const findNextModule = (currentPoint, centerPoints, direction) => { diff --git a/src/store/estimateAtom.js b/src/store/estimateAtom.js new file mode 100644 index 00000000..20cdaa7c --- /dev/null +++ b/src/store/estimateAtom.js @@ -0,0 +1,23 @@ +import { atom } from 'recoil' + +export const estimateParamAtom = atom({ + // 견적서 post parameter + key: 'estimateParamAtom', + default: { + saleStoreId: '', + objectNo: '', + planNo: '', + slope: '', + angle: '', + surfaceType: '', + setupHeight: '', + standardWindSpeedId: '', + snowfall: '', + northArrangement: '', + drawingFlg: '', + userId: '', + roofSurfaceList: [], + circuitItemList: [], + itemList: [], + }, +}) From eca01e68966801670d8038761dd98167297e1703 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Tue, 4 Feb 2025 11:01:14 +0900 Subject: [PATCH 12/12] =?UTF-8?q?=F0=9F=93=8Cfix:=20=ED=95=9C=EA=B5=AD?= =?UTF-8?q?=EC=96=B4=20=EB=AC=B8=EA=B5=AC=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ko.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/locales/ko.json b/src/locales/ko.json index 35b62925..f389807c 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -50,8 +50,8 @@ "modal.movement.flow.line.updown.up": "자릿수를 올리다", "modal.movement.flow.line.updown.down": "자릿수를 낮추다", "modal.movement.flow.line.info": "동선을 선택하고 이동 폭을 지정하십시오", - "modal.movement.flow.line.bottom.left": "\"높이변경 : 아래\": \"왼쪽\"", - "modal.movement.flow.line.top.right": "\"높이변경 : 위\": \"오른쪽\"", + "modal.movement.flow.line.bottom.left": "높이 변경: 아래, 왼쪽", + "modal.movement.flow.line.top.right": "높이 변경: 위, 오른쪽", "plan.menu.roof.cover.outline.edit.offset": "외벽선 편집 및 오프셋", "plan.menu.roof.cover.roof.surface.alloc": "지붕면 할당", "plan.menu.roof.cover.roof.shape.edit": "지붕형상 편집", @@ -84,8 +84,8 @@ "plan.menu.placement.surface.arrangement": "면형상 배치", "plan.menu.placement.surface.object": "오브젝트 배치", "plan.menu.placement.surface.all.remove": "배치면 전체 삭제", - "plan.menu.module.circuit.setting": "\"모듈\": \"회로 구성\"", - "plan.menu.module.circuit.setting.default": "모듈/가대설정", + "plan.menu.module.circuit.setting": "모듈·회로 구성", + "plan.menu.module.circuit.setting.default": "모듈·가대설정", "modal.module.basic.setting.orientation.setting": "방위 설정", "modal.module.basic.setting.orientation.setting.info": "※시뮬레이션 계산용 방위를 지정합니다. 남쪽의 방위를 설정해주세요.", "modal.module.basic.setting.orientation.setting.angle.passivity": "각도를 직접 입력",