From 160874c6c7a73136e7e025742b356af665ddeab0 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 18:03:04 +0900 Subject: [PATCH 01/24] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8,=20?= =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81=EC=84=B8=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/popup/DocDownOptionPop.jsx | 36 +++++++++++++++++-- src/components/management/StuffDetail.jsx | 18 ++++++++-- src/locales/ja.json | 2 +- src/locales/ko.json | 2 +- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/components/estimate/popup/DocDownOptionPop.jsx b/src/components/estimate/popup/DocDownOptionPop.jsx index 0c859c59..3424b699 100644 --- a/src/components/estimate/popup/DocDownOptionPop.jsx +++ b/src/components/estimate/popup/DocDownOptionPop.jsx @@ -6,9 +6,8 @@ import { useRecoilValue } from 'recoil' import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { - // console.log('플랜번호::::::::::::', planNo) const { getMessage } = useMessage() - const { promiseGet } = useAxios() + const { promisePost } = useAxios() //다운로드 파일 EXCEL const [schUnitPriceFlg, setSchUnitPriceFlg] = useState('0') @@ -33,9 +32,40 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { // console.log(schDisplayFlg) // console.log(schWeightFlg) // console.log(schDrawingFlg) + //post방식 const url = '/api/estimate/excel-download' - const params = {} + const params = { + objectNo: objectRecoil.floorPlanObjectNo, + planNo: planNo, + schUnitPriceFlg: schUnitPriceFlg, + schDisplayFlg: schDisplayFlg, + schWeightFlg: schWeightFlg, + schDrawingFlg: schDrawingFlg, + } const options = { responseType: 'blob' } + + console.log('다운로드 PARAM:::', params) + return + await promisePost({ url: url, data: params, option: options }) + .then((resultData) => { + console.log('결과::::::', resultData) + if (resultData) { + const blob = new Blob([resultData.data], { type: resultData.headers['content-type'] || 'application/octet-stream' }) + const fileUrl = window.URL.createObjectURL(blob) + const link = document.createElement('a') + + link.href = fileUrl + // link.download = originFile.faileName //resultData에내려주는 파일명으로 변경?? + document.body.appendChild(link) + link.click() + link.remove() + window.URL.revokeObjectURL(fileUrl) + } + }) + .catch((error) => { + console.log('::FileDownLoad Error::', error) + alert('File does not exist.') + }) } return ( diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index ccb943c3..9f3cd1ec 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -19,10 +19,15 @@ import { useCommonCode } from '@/hooks/common/useCommonCode' import StuffPlanQGrid from './StuffPlanQGrid' import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' import { ManagementContext } from '@/app/management/ManagementProvider' +import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' export default function StuffDetail() { const setFloorPlanObjectNo = useSetRecoilState(floorPlanObjectState) //견적서 화면용 물건번호리코일 + const [estimatePopupOpen, setEstimatePopupOpen] = useState(false) + + const [popPlanNo, setPopPlanNo] = useState('1') //default 1 + //공통코드 const { commonCode, findCommonCode } = useCommonCode() const [selOptions, setSelOptions] = useState('') //선택한 1차점 @@ -266,11 +271,12 @@ export default function StuffDetail() { type="button" className="grid-btn" onClick={() => { - console.log('엑셀버튼클릭') + setFloorPlanObjectNo({ floorPlanObjectNo: params.data.objectNo }) + handleEstimatePopup(params.data.planNo) }} > - {getMessage('stuff.detail.planGrid.btn2')} + {getMessage('stuff.detail.planGrid.docDownload')} @@ -280,6 +286,12 @@ export default function StuffDetail() { ], }) + // 문서다운로드 팝업 오픈 셋팅 + const handleEstimatePopup = (planNo) => { + setPopPlanNo(planNo) + setEstimatePopupOpen(true) + } + useEffect(() => { if (objectNo) { setEditMode('EDIT') @@ -2433,6 +2445,8 @@ export default function StuffDetail() { {showWindSpeedButtonValid && ( )} + + {estimatePopupOpen && } ) } diff --git a/src/locales/ja.json b/src/locales/ja.json index 64902f47..f5b59ce6 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -733,7 +733,7 @@ "stuff.detail.planGridHeader.pcTypeNo": "パワーコンディショナー", "stuff.detail.planGridHeader.management": "管理", "stuff.detail.planGrid.btn1": "見積書の照会", - "stuff.detail.planGrid.btn2": "Excel", + "stuff.detail.planGrid.docDownload": "文書のダウンロード", "stuff.grid.noData": "照会されたデータがありません", "length": "長さ", "height": "高さ", diff --git a/src/locales/ko.json b/src/locales/ko.json index 5b47e7fd..01d06042 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -743,7 +743,7 @@ "stuff.detail.planGridHeader.pcTypeNo": "파워컨디셔너", "stuff.detail.planGridHeader.management": "관리", "stuff.detail.planGrid.btn1": "견적서 조회", - "stuff.detail.planGrid.btn2": "Excel", + "stuff.detail.planGrid.docDownload": "문서 다운로드", "stuff.grid.noData": "조회된 데이터가 없습니다", "length": "길이", "height": "높이", From eb5bb77f1f5dcd3989dc0f5a4c9494a0543b0d35 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 15 Nov 2024 08:58:51 +0900 Subject: [PATCH 02/24] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/popup/DocDownOptionPop.jsx | 55 ++++++++++++------- src/locales/ja.json | 8 +-- src/locales/ko.json | 8 +-- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/components/estimate/popup/DocDownOptionPop.jsx b/src/components/estimate/popup/DocDownOptionPop.jsx index 3424b699..139f6f7b 100644 --- a/src/components/estimate/popup/DocDownOptionPop.jsx +++ b/src/components/estimate/popup/DocDownOptionPop.jsx @@ -9,6 +9,8 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { const { getMessage } = useMessage() const { promisePost } = useAxios() + //EXCEL, PDF 구분 + const [schDownload, setSchDownload] = useState('EXCEL') //다운로드 파일 EXCEL const [schUnitPriceFlg, setSchUnitPriceFlg] = useState('0') @@ -24,38 +26,45 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { //문서 다운로드 const handleFileDown = async () => { - // console.log('물건번호:::', objectRecoil.floorPlanObjectNo) - // console.log('planNo::', planNo) - // 고른 옵션값들 - //0 : 견적가 Excel 1 : 정가용Excel 2: 견적가 PDF 3 :정가용PDF - // console.log(schUnitPriceFlg) - // console.log(schDisplayFlg) - // console.log(schWeightFlg) - // console.log(schDrawingFlg) - //post방식 const url = '/api/estimate/excel-download' + let sendUnitPriceFlg + if (schUnitPriceFlg === '0') { + sendUnitPriceFlg = '0' + } else if (schUnitPriceFlg === '1') { + sendUnitPriceFlg = '1' + } else if (schUnitPriceFlg === '2') { + sendUnitPriceFlg = '0' + } else { + sendUnitPriceFlg = '1' + } + const params = { objectNo: objectRecoil.floorPlanObjectNo, planNo: planNo, - schUnitPriceFlg: schUnitPriceFlg, + schDownload: schDownload, + schUnitPriceFlg: sendUnitPriceFlg, schDisplayFlg: schDisplayFlg, schWeightFlg: schWeightFlg, schDrawingFlg: schDrawingFlg, } const options = { responseType: 'blob' } - + let fileName console.log('다운로드 PARAM:::', params) - return await promisePost({ url: url, data: params, option: options }) .then((resultData) => { - console.log('결과::::::', resultData) if (resultData) { + console.log('결과::::::', resultData) const blob = new Blob([resultData.data], { type: resultData.headers['content-type'] || 'application/octet-stream' }) const fileUrl = window.URL.createObjectURL(blob) const link = document.createElement('a') - link.href = fileUrl - // link.download = originFile.faileName //resultData에내려주는 파일명으로 변경?? + + if (schDownload === 'EXCEL') { + fileName = 'EXCEL_DOWN.xlsx' + } else { + fileName = 'PDF_DOWN.pdf' + } + link.download = fileName document.body.appendChild(link) link.click() link.remove() @@ -104,28 +113,30 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) {
{ + setSchDownload('EXCEL') setSchUnitPriceFlg(e.target.value) }} /> - +
{ + setSchDownload('EXCEL') setSchUnitPriceFlg(e.target.value) }} /> - +
{ + setSchDownload('PDF') setSchUnitPriceFlg(e.target.value) }} /> - +
{ + setSchDownload('PDF') setSchUnitPriceFlg(e.target.value) }} /> - +
diff --git a/src/locales/ja.json b/src/locales/ja.json index f5b59ce6..6889f39e 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -860,10 +860,10 @@ "estimate.detail.docPopup.title": "ドキュメントダウンロードオプションの設定", "estimate.detail.docPopup.explane": "ダウンロードする文書のオプションを選択したら、 [文書のダウンロード]ボタンをクリックします.", "estimate.detail.docPopup.schUnitPriceFlg": "ダウンロードファイル", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg0": "見積もり Excel", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg1": "定価用 Excel", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg2": "見積もり PDF", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg3": "定価用 PDF", + "estimate.detail.docPopup.schUnitPriceFlg.excelFlg0": "見積もり Excel", + "estimate.detail.docPopup.schUnitPriceFlg.excelFlg1": "定価用 Excel", + "estimate.detail.docPopup.schUnitPriceFlg.pdfFlg0": "見積もり PDF", + "estimate.detail.docPopup.schUnitPriceFlg.pdfFlg1": "定価用 PDF", "estimate.detail.docPopup.schDisplayFlg": "見積提出先表示名", "estimate.detail.docPopup.schDisplayFlg.schDisplayFlg0": "販売店名", "estimate.detail.docPopup.schDisplayFlg.schDisplayFlg1": "案件名", diff --git a/src/locales/ko.json b/src/locales/ko.json index 01d06042..2916c9ed 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -870,10 +870,10 @@ "estimate.detail.docPopup.title": "문서다운로드 옵션설정", "estimate.detail.docPopup.explane": "다운로드할 문서 옵션을 선택한 후 문서 다운로드 버튼을 클릭합니다.", "estimate.detail.docPopup.schUnitPriceFlg": "다운로드 파일", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg0": "견적가 Excel", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg1": "정가용 Excel", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg2": "견적가 PDF", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg3": "정가용 PDF", + "estimate.detail.docPopup.schUnitPriceFlg.excelFlg0": "견적가 Excel", + "estimate.detail.docPopup.schUnitPriceFlg.excelFlg1": "정가용 Excel", + "estimate.detail.docPopup.schUnitPriceFlg.pdfFlg0": "견적가 PDF", + "estimate.detail.docPopup.schUnitPriceFlg.pdfFlg1": "정가용 PDF", "estimate.detail.docPopup.schDisplayFlg": "견적제출서 표시명", "estimate.detail.docPopup.schDisplayFlg.schDisplayFlg0": "판매점명", "estimate.detail.docPopup.schDisplayFlg.schDisplayFlg1": "안건명", From 55f4a2441917a77a49c9a5c869e5da6ae8ed47b5 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Fri, 15 Nov 2024 09:44:03 +0900 Subject: [PATCH 03/24] =?UTF-8?q?samePoint=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/qpolygon-utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index 3ed8f9a1..9a12e4b3 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1201,7 +1201,7 @@ export function removeDuplicatePolygons(polygons) { } export const isSamePoint = (a, b) => { - return Math.abs(Math.round(a.x) - Math.round(b.x)) <= 1 && Math.abs(Math.round(a.y) - Math.round(b.y)) <= 1 + return Math.abs(Math.round(a.x) - Math.round(b.x)) <= 2 && Math.abs(Math.round(a.y) - Math.round(b.y)) <= 2 } /** From ae8b838e4c84c71d612eea64d632f3c20a6ac24c Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Fri, 15 Nov 2024 09:57:15 +0900 Subject: [PATCH 04/24] =?UTF-8?q?=EC=A7=80=EB=B6=95=EA=B0=81=EB=8F=84=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/placementShape/PlacementShapeSetting.jsx | 1 - src/hooks/common/useCanvasConfigInitialize.js | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx index 6a69aaca..26d6f1b9 100644 --- a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx +++ b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx @@ -12,7 +12,6 @@ import { usePopup } from '@/hooks/usePopup' import SizeGuide from '@/components/floor-plan/modal/placementShape/SizeGuide' import MaterialGuide from '@/components/floor-plan/modal/placementShape/MaterialGuide' import WithDraggable from '@/components/common/draggable/WithDraggable' -import { SessionContext } from '@/app/SessionProvider' export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, setShowPlaceShapeModal }) { const [objectNo, setObjectNo] = useState('test123241008001') // 후에 삭제 필요 diff --git a/src/hooks/common/useCanvasConfigInitialize.js b/src/hooks/common/useCanvasConfigInitialize.js index a07d4a00..18d1a052 100644 --- a/src/hooks/common/useCanvasConfigInitialize.js +++ b/src/hooks/common/useCanvasConfigInitialize.js @@ -40,19 +40,19 @@ export function useCanvasConfigInitialize() { const flowTexts = canvas.getObjects().filter((obj) => obj.name === 'flowText') if (basicSetting.roofAngleSet === 'slope') { offsetTexts.forEach((obj) => { - obj.set({ text: `${obj.originText}-∠${obj.pitch}${angleUnit}` }) + obj.set({ text: `${!obj.originText ? '' : obj.originText + '-'}∠${obj.pitch}${angleUnit}` }) }) flowTexts.forEach((obj) => { - obj.set({ text: `${obj.originText}-∠${obj.pitch}${pitchText}` }) + obj.set({ text: `${!obj.originText ? '' : obj.originText + '-'}∠${obj.pitch}${pitchText}` }) }) } if (basicSetting.roofAngleSet === 'flat') { offsetTexts.forEach((obj) => { - obj.set({ text: `${obj.originText}-∠${getDegreeByChon(obj.pitch)}${angleUnit}` }) + obj.set({ text: `${!obj.originText ? '' : obj.originText + '-'}∠${getDegreeByChon(obj.pitch)}${angleUnit}` }) }) flowTexts.forEach((obj) => { - obj.set({ text: `${obj.originText}-∠${getDegreeByChon(obj.pitch)}${pitchText}` }) + obj.set({ text: `${!obj.originText ? '' : obj.originText + '-'}∠${getDegreeByChon(obj.pitch)}${pitchText}` }) }) } From 79139f53aa393e1e8040d5df549be88a66a91e81 Mon Sep 17 00:00:00 2001 From: minsik Date: Fri, 15 Nov 2024 10:08:50 +0900 Subject: [PATCH 05/24] =?UTF-8?q?zoom=20clear=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasMenu.jsx | 2 +- src/styles/_contents.scss | 238 +++++++++++++++++++++++ 2 files changed, 239 insertions(+), 1 deletion(-) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 09758a1e..26538599 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -248,7 +248,7 @@ export default function CanvasMenu(props) { handleZoom(false) }} > - {canvasZoom}% + {canvasZoom}% @@ -862,108 +926,114 @@ export default function Estimate({ params }) { {state?.itemList.length > 0 && - state.itemList.map((item, index) => { - return ( - - -
- onChangeSelect(item.dispOrder)} - checked={selection.has(item.dispOrder) ? true : false} - /> - -
- - {item?.dispOrder * 100} - -
-
- onChangeSelect(item.dispOrder)} + checked={selection.has(item.dispOrder) ? true : false} + /> +
- )} -
- - -
-
{item?.itemNo}
-
- {item?.fileUploadFlg === '1' && } - {item?.specialNoteCd && ( - - )} -
-
- - -
- { - //onChangeDisplayItem참고 - //itemChangeFlg = 1, partAdd = 0 셋팅 - console.log('수량변경::::::::', e.target.value) - }} - /> -
- - {item.unit} - -
-
- { - //onChangeDisplayItem참고 - //itemChangeFlg, partAdd 받아온 그대로 - console.log('단가변경:::::::', e.target.value) - }} - /> -
- {/*
- OPEN아이콘 처리 -
*/} -
- - {convertNumberToPriceDecimal(item?.saleTotPrice)} - - ) + /> + + + {item.unit} + +
+
+ { + //onChangeDisplayItem참고 + //itemChangeFlg, partAdd 받아온 그대로 + console.log('단가변경:::::::', e.target.value) + }} + /> +
+ {/*
+ OPEN아이콘 처리 +
*/} +
+ + {convertNumberToPriceDecimal(item?.saleTotPrice)} + + + ) + } else { + return null + } })} diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 4330a208..5c29dcc0 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -59,6 +59,12 @@ export const useEstimateController = (planNo) => { try { await get({ url: `/api/estimate/${objectRecoil.floorPlanObjectNo}/${planNo}/detail` }).then((res) => { if (isObjectNotEmpty(res)) { + if (res.itemList.length > 0) { + res.itemList.map((item) => { + item.delFlg = '0' + }) + } + setState(res) } }) @@ -133,27 +139,26 @@ export const useEstimateController = (planNo) => { const handleEstimateSubmit = async () => { //0. 필수체크 let flag = true - console.log('::담긴 estimateData:::', estimateData) + // console.log('첨부파일:::::', estimateData.fileList) //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 - if (estimateData.fileList.length < 1) { - if (estimateData.itemList.length > 1) { - estimateData.itemList.map((row) => { - if (row.fileUploadFlg === '1') { - if (estimateData.fileFlg === '0') { - alert(getMessage('estimate.detail.save.requiredMsg')) - flag = false - } - } - }) - } - } + // if (estimateData.fileList.length < 1) { + // if (estimateData.itemList.length > 1) { + // estimateData.itemList.map((row) => { + // if (row.fileUploadFlg === '1') { + // if (estimateData.fileFlg === '0') { + // alert(getMessage('estimate.detail.save.requiredMsg')) + // flag = false + // } + // } + // }) + // } + // } if (flag) { - //1. 첨부파일 저장 + //1. 첨부파일 저장시작 const formData = new FormData() - console.log('첨부파일:!!!', estimateData.fileList) formData.append('file', estimateData.fileList) formData.append('objectNo', estimateData.objectNo) formData.append('planNo', estimateData.planNo) @@ -161,7 +166,23 @@ export const useEstimateController = (planNo) => { formData.append('userId', estimateData.userId) await post({ url: '/api/file/fileUpload', data: formData }) + //첨부파일저장끝 + //제품라인 추가했는데 아이템 안고르고 저장하면itemId=''은 날리고 나머지 저장하기 + estimateData.itemList = estimateData.itemList.filter((item) => item.itemId !== '') + + let delCnt = 0 + estimateData.itemList.map((item) => { + if (item.delFlg === '1') { + delCnt++ + } + }) + if (delCnt === estimateData.itemList.length) { + return alert(getMessage('estimate.detail.save.requiredItem')) + } + + console.log('최종 정보::;', estimateData) + console.log('최종 남은 아이템정보:::', estimateData.itemList) //2. 상세데이터 저장 return await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { diff --git a/src/locales/ja.json b/src/locales/ja.json index d5165248..29c46150 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -844,6 +844,7 @@ "estimate.detail.header.showPrice": "価格表示", "estimate.detail.header.unitPrice": "定価", "estimate.detail.showPrice.pricingBtn": "Pricing", + "estimate.detail.showPrice.pricingBtn.noItemId": "Pricingが欠落しているアイテムがあります。 Pricingを進めてください.", "estimate.detail.showPrice.description1": "製品価格 OPEN", "estimate.detail.showPrice.description2": "追加, 変更資材", "estimate.detail.showPrice.description3": "添付必須", @@ -879,6 +880,7 @@ "estimate.detail.productFeaturesPopup.close": "閉じる", "estimate.detail.save.alertMsg": "保存されている見積書で製品を変更した場合、図面や回路には反映されません.", "estimate.detail.save.requiredMsg": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください.", + "estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります.", "estimate.detail.reset.confirmMsg": "保存した見積書情報が初期化され、図面情報が反映されます。本当に初期化しますか?", "simulator.title.sub1": "物件番号", "simulator.title.sub2": "作成日", diff --git a/src/locales/ko.json b/src/locales/ko.json index 15fbe6f5..71819055 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -849,11 +849,12 @@ "estimate.detail.sepcialEstimateProductInfo.pkgUnitPrice": "주택PKG단가 (W)", "estimate.detail.sepcialEstimateProductInfo.pkgWeight": "PKG 용량 (Kw)", "estimate.detail.sepcialEstimateProductInfo.pkgPrice": "PKG 금액", - "estimate.detail.sepcialEstimateProductInfo.calcFormula1": "(모듈수량 * 수량)÷100", + "estimate.detail.sepcialEstimateProductInfo.calcFormula1": "(모듈용량 * 수량)÷100", "estimate.detail.sepcialEstimateProductInfo.calcFormula2": "PKG단가(W) * PKG용량(W)", "estimate.detail.header.showPrice": "가격표시", "estimate.detail.header.unitPrice": "정가", "estimate.detail.showPrice.pricingBtn": "Pricing", + "estimate.detail.showPrice.pricingBtn.noItemId": "Pricing이 누락된 아이템이 있습니다. Pricing을 진행해주세요.", "estimate.detail.showPrice.description1": "제품 가격 OPEN", "estimate.detail.showPrice.description2": "추가, 변경 자재", "estimate.detail.showPrice.description3": "첨부필수", @@ -889,6 +890,7 @@ "estimate.detail.productFeaturesPopup.close": "닫기", "estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우, 도면 및 회로에 반영되지 않습니다.", "estimate.detail.save.requiredMsg": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.", + "estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.", "estimate.detail.reset.confirmMsg": "저장된 견적서 정보가 초기화되고, 도면정보가 반영됩니다. 정말로 초기화 하시겠습니까?", "simulator.title.sub1": "물건번호", "simulator.title.sub2": "작성일", From f1bede7bd3c41e18389e0e4d914c812d8a000818 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 15 Nov 2024 23:42:41 +0900 Subject: [PATCH 15/24] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83?= =?UTF-8?q?=EC=8B=9C=20=EB=A6=AC=EC=BD=94=EC=9D=BC=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/header/Header.jsx | 15 +++++++++++++-- src/components/management/Stuff.jsx | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx index 29cec36b..548387ef 100644 --- a/src/components/header/Header.jsx +++ b/src/components/header/Header.jsx @@ -4,7 +4,7 @@ import { Fragment, useCallback, useEffect, useState } from 'react' import Link from 'next/link' import { usePathname } from 'next/navigation' -import { useRecoilState, useRecoilValue } from 'recoil' +import { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil' import { dimmedStore, sessionStore } from '@/store/commonAtom' import { useMessage } from '@/hooks/useMessage' @@ -16,6 +16,8 @@ import UserInfoModal from '@/components/myInfo/UserInfoModal' import { useAxios } from '@/hooks/useAxios' import { globalLocaleStore } from '@/store/localeAtom' +import { stuffSearchState } from '@/store/stuffAtom' + export const ToggleonMouse = (e, act, target) => { const listWrap = e.target.closest(target) const ListItem = Array.from(listWrap.childNodes) @@ -34,6 +36,8 @@ export const ToggleonMouse = (e, act, target) => { export default function Header(props) { const [userInfoModal, setUserInfoModal] = useState(false) + const resetStuffRecoil = useResetRecoilState(stuffSearchState) + const { userSession } = props const [sessionState, setSessionState] = useRecoilState(sessionStore) const { getMessage } = useMessage() @@ -184,7 +188,14 @@ export default function Header(props) { {userInfoModal && }
-
diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 3dc9a2f4..e4153691 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -209,6 +209,7 @@ export default function Stuff() { endRow: pageNo * pageSize, schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : stuffSearchParams.schSelSaleStoreId, schSortType: 'R', + code: 'S', } setStuffSearch({ ...params, From 7ffe95b73e2de8259ebe6e5a5ecff4e2b1f8118e Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 08:43:55 +0900 Subject: [PATCH 16/24] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 152 ++++++++++++++---- .../estimate/useEstimateController.js | 46 +++--- 2 files changed, 143 insertions(+), 55 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 86f8b029..093815b8 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -20,6 +20,7 @@ import ProductFeaturesPop from './popup/ProductFeaturesPop' import { v4 as uuidv4 } from 'uuid' export default function Estimate({ params }) { + const fixedKey = 'itemKey' const [itemChangeYn, setItemChangeYn] = useState(false) const { session } = useContext(SessionContext) const [objectNo, setObjectNo] = useState('') //물건번호 @@ -304,8 +305,70 @@ export default function Estimate({ params }) { setSelection(newSelection) } + // 수량 변경 + const onChangeAmount = (value, dispOrder, index) => { + //itemChangeFlg = 1, partAdd = 0 셋팅 + let amount = value + amount = Number(value.replaceAll(',', '')) + if (isNaN(amount)) { + amount = 0 + } else { + amount = amount.toLocaleString() + } + let updateList = [] + let updates = {} + updates.amount = amount + updates.itemChangeFlg = '1' + updates.partAdd = '0' + updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].salePrice).toLocaleString() + + updateList = state.itemList.map((item) => { + if (item.dispOrder === dispOrder) { + return { ...item, ...updates } + } else { + return item + } + }) + + setState({ + itemList: updateList, + }) + + setItemChangeYn(true) + } + + // 단가 변경 + const onChangeSalePrice = (value, dispOrder, index) => { + //itemChangeFlg, partAdd 받아온 그대로 + let salePrice + salePrice = Number(value.replaceAll(',', '')) + if (isNaN(salePrice)) { + salePrice = 0 + } else { + salePrice = salePrice.toLocaleString() + } + let updateList = [] + let updates = {} + updates.salePrice = salePrice + updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].amount).toLocaleString() + + updateList = state.itemList.map((item) => { + if (item.dispOrder === dispOrder) { + return { ...item, ...updates } + } else { + return item + } + }) + + setState({ + itemList: updateList, + }) + + setItemChangeYn(true) + } + // 아이템 자동완성 검색시 아이템 변경 - const onChangeDisplayItem = (itemId, dispOrder) => { + const onChangeDisplayItem = (itemId, dispOrder, index) => { const param = { itemId: itemId, } @@ -333,17 +396,37 @@ export default function Estimate({ params }) { updates.specialNoteCd = res.spnAttrCds updates.itemGroup = res.itemGroup updates.delFlg = '0' // 삭제플래그 0 + updates.saleTotPrice = res.salePrice * state.itemList[index].amount + //104671 + let bomList = res.itemBomList updateList = state.itemList.map((item) => { if (item.dispOrder === dispOrder) { return { ...item, ...updates } + } else if (item.paDispOrder === dispOrder) { + return { ...item, delFlg: '1' } } else { return item } }) - setState({ - itemList: updateList, - }) + //paDispOrder + if (bomList) { + bomList.map((bomItem, index) => { + let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + bomItem.dispOrder = index + 1 + newItemDispOrder + bomItem.delFlg = '0' + bomItem.objectNo = objectNo + bomItem.planNo = planNo + }) + + setState({ + itemList: [...updateList, ...bomList], + }) + } else { + setState({ + itemList: updateList, + }) + } setItemChangeYn(true) }) @@ -358,6 +441,9 @@ export default function Estimate({ params }) { if (row2 === row.dispOrder) { delList.push({ ...row }) } + if (row2 === row.paDispOrder) { + delList.push({ ...row }) + } }) }) @@ -390,14 +476,16 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { - // console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn) - console.log('아이템상태가져오기::::::::::', state.itemList) - } + console.log('아이템 상태 가져오기::::::::::', state.itemList) + // console.log('토탈쪽 셋팅해주기위한 함수::::::', itemList) + //delFlg 0인거 중에.. + setItemChangeYn(false) - //다시 false로 돌리기 여기서할지 가격정보 변경하는거 끝나고할지.. - setItemChangeYn(false) + // settingToalInfo(state.itemList) + } }, [itemChangeYn]) + // const settingToalInfo = (itemList) => {} return (
@@ -588,10 +676,10 @@ export default function Estimate({ params }) { <>
- +
- +
@@ -880,7 +968,7 @@ export default function Estimate({ params }) { type="button" onClick={() => { addItem() - setItemChangeYn(true) + // setItemChangeYn(true) }} > @@ -926,16 +1014,17 @@ export default function Estimate({ params }) { {state?.itemList.length > 0 && - state.itemList.map((item) => { + state.itemList.map((item, index) => { if (item.delFlg === '0') { return ( <> - +
onChangeSelect(item.dispOrder)} checked={selection.has(item.dispOrder) ? true : false} /> @@ -955,13 +1044,13 @@ export default function Estimate({ params }) { options={displayItemList} onChange={(e) => { if (isObjectNotEmpty(e)) { - onChangeDisplayItem(e.itemId, item.dispOrder) + onChangeDisplayItem(e.itemId, item.dispOrder, index) } }} getOptionLabel={(x) => x.itemName} getOptionValue={(x) => x.itemId} - isClearable={true} - isDisabled={false} + isClearable={false} + isDisabled={item?.paDispOrder ? true : false} value={displayItemList.filter(function (option) { return option.itemId === item.itemId })} @@ -997,11 +1086,10 @@ export default function Estimate({ params }) { { - //onChangeDisplayItem참고 - //itemChangeFlg = 1, partAdd = 0 셋팅 - console.log('수량변경::::::::', e.target.value) + onChangeAmount(e.target.value, item.dispOrder, index) }} />
@@ -1013,12 +1101,22 @@ export default function Estimate({ params }) { { - //onChangeDisplayItem참고 - //itemChangeFlg, partAdd 받아온 그대로 - console.log('단가변경:::::::', e.target.value) + onChangeSalePrice(e.target.value, item.dispOrder, index) }} />
@@ -1027,7 +1125,7 @@ export default function Estimate({ params }) {
*/} - {convertNumberToPriceDecimal(item?.saleTotPrice)} + {item?.saleTotPrice} ) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 5c29dcc0..07f50ec8 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -82,7 +82,9 @@ export const useEstimateController = (planNo) => { } const addItem = () => { - const newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + 1 + // const newItemDispOrder = (Math.max(...state.itemList.map((item) => item.dispOrder)) / 100 + 1) * 100 + let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + newItemDispOrder = (Math.floor(newItemDispOrder / 100) + 1) * 100 setState({ itemList: [ ...state.itemList, @@ -96,8 +98,8 @@ export const useEstimateController = (planNo) => { amount: '', //수량 unitPrice: '0', unit: '', //단위 - salePrice: '0', //단가 - saleTotPrice: '0', //금액(부가세별도) + salePrice: '', //단가 + saleTotPrice: '', //금액(부가세별도) itemChangeFlg: '1', //추가시 체인지플래그 1로 partAdd: '1', //NEW 체인지 플래그 delFlg: '0', //삭제 플래그 0 삭제하면 1 @@ -143,18 +145,18 @@ export const useEstimateController = (planNo) => { // console.log('첨부파일:::::', estimateData.fileList) //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 - // if (estimateData.fileList.length < 1) { - // if (estimateData.itemList.length > 1) { - // estimateData.itemList.map((row) => { - // if (row.fileUploadFlg === '1') { - // if (estimateData.fileFlg === '0') { - // alert(getMessage('estimate.detail.save.requiredMsg')) - // flag = false - // } - // } - // }) - // } - // } + if (estimateData.fileList.length < 1) { + if (estimateData.itemList.length > 1) { + estimateData.itemList.map((row) => { + if (row.fileUploadFlg === '1') { + if (estimateData.fileFlg === '0') { + alert(getMessage('estimate.detail.save.requiredMsg')) + flag = false + } + } + }) + } + } if (flag) { //1. 첨부파일 저장시작 @@ -184,24 +186,12 @@ export const useEstimateController = (planNo) => { console.log('최종 정보::;', estimateData) console.log('최종 남은 아이템정보:::', estimateData.itemList) //2. 상세데이터 저장 - return + // return await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { if (res) { alert(getMessage('estimate.detail.save.alertMsg')) } }) - - // try { - // const result = await promisePost({ - // url: ESTIMATE_API_ENDPOINT, - // data: estimateData, - // }) - // alert(getMessage('estimate.detail.save.alertMsg')) - // return result - // } catch (error) { - // console.error('Failed to submit estimate:', error) - // throw error - // } } } From 5ba9c19f3ec546a4c3f4368fd6bd0469d7a5c1cc Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 09:21:08 +0900 Subject: [PATCH 17/24] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 4 ++-- src/components/management/StuffDetail.jsx | 7 ++++++- src/components/management/StuffSearchCondition.jsx | 5 ++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index e4153691..e6b281c4 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -39,9 +39,9 @@ export default function Stuff() { const copyNo = async (value) => { try { await navigator.clipboard.writeText(value) - alert(getMessage('stuff.detail.header.message2')) + alert(getMessage('stuff.detail.header.successCopy')) } catch (error) { - alert(getMessage('stuff.detail.header.message3')) + alert(getMessage('stuff.detail.header.failCopy')) } } diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 9f3cd1ec..eea328d8 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -301,10 +301,12 @@ export default function StuffDetail() { } promiseGet({ url: `/api/object/${objectNo}/detail` }).then((res) => { if (res.status === 200) { - if (res.data != null) { + if (isObjectNotEmpty(res.data)) { setManagementState(res.data) } else { setManagementState({}) + alert(getMessage('stuff.detail.header.notExistObjectNo')) + router.push('/management/stuff') } if (isNotEmptyArray(res.data.planList)) { setPlanGridProps({ ...planGridProps, planGridData: res.data.planList }) @@ -314,6 +316,9 @@ export default function StuffDetail() { } else { setManagementState({}) setPlanGridProps({ ...planGridProps, planGridData: [] }) + + alert(getMessage('stuff.detail.header.notExistObjectNo')) + router.push('/management/stuff') } }) } else { diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 4a625539..f1476fc7 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -312,8 +312,8 @@ export default function StuffSearchCondition() { } else { //X누름 //화면에선 지우는데 리코일은 조회누르지 않으면 보존 - setSchSelSaleStoreId('') - // stuffSearch.schSelSaleStoreId = '' + // setSchSelSaleStoreId('') //값이 안비워짐.. + setSchSelSaleStoreId(null) //2차점 판매점목록비우기 setOtherSaleStoreList([]) @@ -333,7 +333,6 @@ export default function StuffSearchCondition() { if (session.storeLvl === '1') { if (stuffSearch.schOtherSelSaleStoreId === '') { // 화면에선 지우는데 조회누르기 전이면 리코일은 남김 - // stuffSearch.schSelSaleStoreId = '' setSchSelSaleStoreId(session.storeId) } else { // 화면에선 지우는데 조회누르기 전이면 리코일은 남김 From 5002b1904392a0774d426b1140b8f2b7892f511c Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 09:54:57 +0900 Subject: [PATCH 18/24] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSearchCondition.jsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index f1476fc7..1c7ececb 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -116,8 +116,10 @@ export default function StuffSearchCondition() { schAddress: address, schObjectName: objectName, schDispCompanyName: dispCompanyName, - schSelSaleStoreId: stuffSearch?.schSelSaleStoreId, - schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId, + // schSelSaleStoreId: stuffSearch?.schSelSaleStoreId, + // schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId, + schSelSaleStoreId: schSelSaleStoreId, + schOtherSelSaleStoreId: otherSaleStoreId, schReceiveUser: receiveUser, schDateType: dateType, schFromDt: dayjs(startDate).format('YYYY-MM-DD'), @@ -157,6 +159,7 @@ export default function StuffSearchCondition() { setStuffSearch({ schSelSaleStoreId: '', schOtherSelSaleStoreId: '', + schDateType: 'U', }) } else { if (otherSaleStoreList.length > 1) { @@ -356,6 +359,7 @@ export default function StuffSearchCondition() { setobjectName(stuffSearch.schObjectName ? stuffSearch.schObjectName : objectName) setDispCompanyName(stuffSearch.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName) setReceiveUser(stuffSearch.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser) + setDateType(stuffSearch.schDateType ? stuffSearch.schDateType : dateType) }, [stuffSearch]) useEffect(() => { @@ -637,7 +641,7 @@ export default function StuffSearchCondition() { type="radio" name="radio_ptype" id="radio_u" - checked={stuffSearch.schDateType === 'U' ? true : false} + checked={dateType === 'U' ? true : false} value={'U'} onChange={(e) => { setDateType(e.target.value) @@ -651,7 +655,7 @@ export default function StuffSearchCondition() { type="radio" name="radio_ptype" id="radio_r" - checked={stuffSearch.schDateType === 'R' ? true : false} + checked={dateType === 'R' ? true : false} value={'R'} onChange={(e) => { setDateType(e.target.value) From 7dc02514ad1f7c7e781d66aebf3373391ba567eb Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Mon, 18 Nov 2024 10:03:15 +0900 Subject: [PATCH 19/24] =?UTF-8?q?=EB=B3=B4=EC=A1=B0=EC=84=A0=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=EC=83=9D=EC=84=B1=20line=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useAuxiliaryDrawing.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 6e95e79c..1a0d87bd 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -455,9 +455,24 @@ export function useAuxiliaryDrawing(id) { name: 'auxiliaryLine', }) - lineHistory.current.push(line) + const historyLines = [...lineHistory.current] + + const hasSameLine = historyLines.some((history) => { + return ( + (isSamePoint(history.startPoint, line.startPoint) && isSamePoint(history.endPoint, line.endPoint)) || + (isSamePoint(history.startPoint, line.endPoint) && isSamePoint(history.endPoint, line.startPoint)) + ) + }) + mousePointerArr.current = [] clear() + + if (hasSameLine) { + canvas.remove(line) + return + } + + lineHistory.current.push(line) } const mouseDown = (e) => { From f6cd20b6507a03ebdf85ff705c424deded895a15 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 12:25:32 +0900 Subject: [PATCH 20/24] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 35 +++++++++++++++++++++------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 093815b8..81d2a7e8 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -309,18 +309,19 @@ export default function Estimate({ params }) { const onChangeAmount = (value, dispOrder, index) => { //itemChangeFlg = 1, partAdd = 0 셋팅 let amount = value - amount = Number(value.replaceAll(',', '')) + amount = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(amount)) { amount = 0 } else { amount = amount.toLocaleString() } + let updateList = [] let updates = {} updates.amount = amount updates.itemChangeFlg = '1' updates.partAdd = '0' - updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].salePrice).toLocaleString() + updates.saleTotPrice = (Number(amount.replaceAll(',', '')) * state.itemList[index].salePrice.replaceAll(',', '')).toLocaleString() updateList = state.itemList.map((item) => { if (item.dispOrder === dispOrder) { @@ -341,7 +342,7 @@ export default function Estimate({ params }) { const onChangeSalePrice = (value, dispOrder, index) => { //itemChangeFlg, partAdd 받아온 그대로 let salePrice - salePrice = Number(value.replaceAll(',', '')) + salePrice = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(salePrice)) { salePrice = 0 } else { @@ -350,7 +351,7 @@ export default function Estimate({ params }) { let updateList = [] let updates = {} updates.salePrice = salePrice - updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].amount).toLocaleString() + updates.saleTotPrice = (Number(salePrice.replaceAll(',', '')) * state.itemList[index].amount.replaceAll(',', '')).toLocaleString() updateList = state.itemList.map((item) => { if (item.dispOrder === dispOrder) { @@ -476,16 +477,32 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { - console.log('아이템 상태 가져오기::::::::::', state.itemList) + // console.log('아이템 상태 가져오기::::::::::', state.itemList) // console.log('토탈쪽 셋팅해주기위한 함수::::::', itemList) //delFlg 0인거 중에.. - setItemChangeYn(false) + //수량(PCS) : totAmount + //용량( Kw) : totVolKw + //공급가액 : supplyPrice + //부가세(10%) : vatPrice + //총액 :totPrice - // settingToalInfo(state.itemList) + let totAmount = 0 + let amount = 0 + state.itemList.map((item) => { + if (item.delFlg === '0') { + amount = item.amount.replace(/[^0-9]/g, '').replaceAll(',', '') + totAmount += Number(amount) + } + }) + + setState({ + totAmount: totAmount, + }) + + setItemChangeYn(false) } }, [itemChangeYn]) - // const settingToalInfo = (itemList) => {} return (
@@ -1109,7 +1126,7 @@ export default function Estimate({ params }) { : item.pkgMaterialFlg === '1' ? false : true - : item.itemdId === '' + : item.itemId === '' ? true : item?.paDispOrder ? true From 4fcf5398097b5b59e0698c5964038a1b8bc4a7b7 Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 16:02:22 +0900 Subject: [PATCH 21/24] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20=EC=A1=B0=EC=A0=88=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/image/ImageSizeSetting.jsx | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 src/components/floor-plan/modal/image/ImageSizeSetting.jsx diff --git a/src/components/floor-plan/modal/image/ImageSizeSetting.jsx b/src/components/floor-plan/modal/image/ImageSizeSetting.jsx deleted file mode 100644 index 309df494..00000000 --- a/src/components/floor-plan/modal/image/ImageSizeSetting.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import WithDraggable from '@/components/common/draggable/WithDraggable' -import { useState } from 'react' -import { usePopup } from '@/hooks/usePopup' -import { useRecoilValue } from 'recoil' -import { contextPopupPositionState } from '@/store/popupAtom' -import { useMessage } from '@/hooks/useMessage' - -export default function ImageSizeSetting(props) { - const contextPopupPosition = useRecoilValue(contextPopupPositionState) - const { id, pos = contextPopupPosition, size, setSize } = props - const [sizeValue, setSizeValue] = useState(100) - const { getMessage } = useMessage() - const { closePopup } = usePopup() - - return ( - -
-
-

{getMessage('modal.image.size.setting')}

- -
-
-
- setSizeValue(e.target.value)} - /> - -
-
-
-
- ) -} From a7ab46d6e5e53d3fbfde5d17c36c021662c7fe48 Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 16:02:32 +0900 Subject: [PATCH 22/24] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20=EC=A1=B0=EC=A0=88=20=EB=8B=A4=EA=B5=AD=EC=96=B4=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ja.json | 1 - src/locales/ko.json | 1 - 2 files changed, 2 deletions(-) diff --git a/src/locales/ja.json b/src/locales/ja.json index 29c46150..d5721a78 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -284,7 +284,6 @@ "modal.panel.batch.statistic.total": "合計", "modal.flow.direction.setting": "流れ方向の設定", "modal.flow.direction.setting.info": "流れ方向を選択してください。", - "modal.image.size.setting": "画像のサイズ変更", "modal.actual.size.setting": "実測値設定", "modal.actual.size.setting.info": "※隅棟・谷・棟の実際の寸法を入力してください。", "modal.actual.size.setting.not.exist.auxiliary.line": "실측치 입력할 보조선을 선택해 주세요(JA)", diff --git a/src/locales/ko.json b/src/locales/ko.json index 71819055..fe4df330 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -289,7 +289,6 @@ "modal.panel.batch.statistic.total": "합계", "modal.flow.direction.setting": "흐름 방향 설정", "modal.flow.direction.setting.info": "흐름방향을 선택하세요.", - "modal.image.size.setting": "이미지 크기 조절", "modal.actual.size.setting": "실측치 설정", "modal.actual.size.setting.info": "※隅棟・谷・棟의 실제 치수를 입력해주세요.", "modal.actual.size.setting.not.exist.auxiliary.line": "실측치 입력할 보조선을 선택해 주세요", From e8cfe345e68bf3ed163f1318b769f93256aa568f Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 16:03:20 +0900 Subject: [PATCH 23/24] =?UTF-8?q?=EB=AA=A8=EB=93=88,=20=ED=9A=8C=EB=A1=9C?= =?UTF-8?q?=20=EA=B5=AC=EC=84=B1=EC=97=90=EC=84=9C=20=EC=A7=80=EB=B6=95?= =?UTF-8?q?=EB=8D=AE=EA=B0=9C=20=EB=A9=94=EB=89=B4=EB=A1=9C=20=EB=84=98?= =?UTF-8?q?=EC=96=B4=EA=B0=80=EC=A7=80=20=EB=AA=BB=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasMenu.jsx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 26538599..133cdfa2 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -184,7 +184,7 @@ export default function CanvasMenu(props) { }, [type, globalLocale]) useEffect(() => { - if (['2', '3'].includes(canvasSetting?.roofSizeSet?.toString())) { + if ([2, 3].some((num) => num === canvasSetting?.roofSizeSet)) { setMenuNumber(3) setType('surface') setCurrentMenu(MENU.BATCH_CANVAS.BATCH_DRAWING) @@ -195,8 +195,12 @@ export default function CanvasMenu(props) { } }, [canvasSetting]) + const checkMenuState = (menu) => { + return ([2, 3].some((num) => num === canvasSetting?.roofSizeSet) && menu.index === 2) || (menuNumber === 4 && menu.index === 2) + } + return ( -
+
num === menuNumber) ? 'active' : ''}`}>
    {canvasMenus.map((menu) => { @@ -205,11 +209,12 @@ export default function CanvasMenu(props) { key={`canvas-menu-${menu.index}`} className={`canvas-menu-item ${menuNumber === menu.index ? 'active' : ''}`} onClick={() => { - if (['2', '3'].includes(canvasSetting?.roofSizeSet?.toString()) && menu.index === 2) return + if ([2, 3].some((num) => num === canvasSetting?.roofSizeSet) && menu.index === 2) return + if (menuNumber === 4 && menu.index === 2) return onClickNav(menu) }} > - @@ -218,7 +223,7 @@ export default function CanvasMenu(props) { })}
- {menuNumber !== 6 && menuNumber !== 5 && ( + {![5, 6].some((num) => num === menuNumber) && ( <> {
@@ -314,8 +319,8 @@ export default function CanvasMenu(props) { )}
-
- {(menuNumber === 2 || menuNumber === 3 || menuNumber === 4) && } +
num === menuNumber) ? 'active' : ''}`}> + {[2, 3, 4].some((num) => num === menuNumber) && }
{/* 견적서(menuNumber=== 5) 상세화면인경우 문서다운로드 팝업 */} {estimatePopupOpen && } From 3223a858402fdb4602ff58f7817b4d02788ed1ec Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 16:04:01 +0900 Subject: [PATCH 24/24] =?UTF-8?q?=EC=A0=90,=20=EC=84=A0,=20=EC=9E=84?= =?UTF-8?q?=EC=9D=98=20=EA=B7=B8=EB=A6=AC=EB=93=9C=20=EC=BB=A8=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EB=89=B4=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=83=89=20=EC=84=A4=EC=A0=95=20=EB=AA=A8=EB=8B=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useContextMenu.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 5dae113c..8e7028d4 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -446,19 +446,24 @@ export function useContextMenu() { ]) break case 'lineGrid': + case 'dotGrid': + case 'tempGrid': setContextMenu([ [ { id: 'gridMove', name: getMessage('modal.grid.move'), + component: , }, { id: 'gridCopy', name: getMessage('modal.grid.copy'), + component: , }, { id: 'gridColorEdit', name: getMessage('contextmenu.grid.color.edit'), + component: , }, { id: 'remove',