From f32f9187d11e1104423002d8bdcf198cbc69d893 Mon Sep 17 00:00:00 2001 From: ysCha Date: Mon, 18 May 2026 15:00:20 +0900 Subject: [PATCH] =?UTF-8?q?[DB]=20=EC=BB=AC=EB=9F=BC=20=EA=B8=B8=EC=9D=B4?= =?UTF-8?q?=20=EA=B0=80=EB=93=9C=20=E2=80=94=20addressee=20=ED=95=A9?= =?UTF-8?q?=EC=82=B0=2050=EC=9E=90=20+=20receiveUser=2020=EC=9E=90=20?= =?UTF-8?q?=ED=81=B4=EB=A6=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 1 + .../estimate/popup/EstimateCopyPop.jsx | 6 ++- src/components/management/StuffDetail.jsx | 38 +++++++++++++------ .../estimate/useEstimateController.js | 7 ++++ src/locales/ja.json | 2 + src/locales/ko.json | 2 + 6 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 7c7d4926..f3630069 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -1426,6 +1426,7 @@ export default function Estimate({}) { { if (estimateContextState?.charger) { - setCopyReceiveUser(session?.userNm) + // [RECEIVEUSER-CLIP20 2026-05-18] T_PLAN.CHARGER nvarchar(20) — 21자+ session 값 클립 + setCopyReceiveUser(session?.userNm?.slice(0, 20)) } }, [estimateContextState?.charger]) @@ -311,7 +312,8 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { type="text" className="input-light" required - defaultValue={session?.userNm} + maxLength={20} + defaultValue={session?.userNm?.slice(0, 20)} onChange={(e) => { setCopyReceiveUser(e.target.value) }} diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 68129345..874aa8fd 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -64,7 +64,7 @@ export default function StuffDetail() { const formInitValue = { // 물건번호 T...(임시) S...(진짜) planReqNo: '', //설계의뢰No - receiveUser: session?.userNm, //담당자 로그인사용자명 디폴트 + receiveUser: session?.userNm?.slice(0, 20), //담당자 로그인사용자명 디폴트 // [RECEIVEUSER-CLIP20 2026-05-18] DDL nvarchar(20) — 21자+ session 값 클립 objectStatusId: '0', //물건구분(신축:0 기축 : 1) objectName: '', //물건명 objectNameOmit: '', //경칭선택 @@ -652,7 +652,8 @@ export default function StuffDetail() { //설계의뢰No. form.setValue('planReqNo', managementState.planReqNo) //담당자 - form.setValue('receiveUser', managementState.receiveUser) + // [RECEIVEUSER-CLIP20 2026-05-18] DDL nvarchar(20) — 기 저장된 21자+ 값 클립 + form.setValue('receiveUser', managementState.receiveUser?.slice(0, 20)) //물건구분objectStatusId setSelectObjectStatusId(managementState.objectStatusId) @@ -1138,6 +1139,9 @@ export default function StuffDetail() { const _receiveUser = watch('receiveUser') //objectName: '', //물건명 const _objectName = watch('objectName') + // [NVARCHAR50-GUARD 2026-05-18] ADDRESSEE_COMPANY_NAME(nvarchar(50)) = objectName + ' ' + objectNameOmit 합산 maxLength + const _objectNameOmit = watch('objectNameOmit') + const objectNameMaxLength = Math.max(0, 50 - 1 - (_objectNameOmit?.length ?? 0)) // saleStoreId: '', //1차 판매점ID const _saleStoreId = watch('saleStoreId') // 2차 판매점명 @@ -1374,6 +1378,11 @@ export default function StuffDetail() { return swalFire({ text: getMessage('stuff.detail.save.valierror3', [errors]), type: 'alert', icon: 'warning' }) } + // [NVARCHAR50-GUARD 2026-05-18] ADDRESSEE_COMPANY_NAME = objectName + ' ' + objectNameOmit (nvarchar(50)) 합산 가드 + if (formData.objectName && (formData.objectName + ' ' + (formData.objectNameOmit ?? '')).length > 50) { + return swalFire({ text: getMessage('stuff.detail.save.objectNameTooLong'), type: 'alert', icon: 'warning' }) + } + const apiUrl = '/api/object/save-object' const params = { @@ -1610,6 +1619,11 @@ export default function StuffDetail() { } } + // [NVARCHAR50-GUARD 2026-05-18] ADDRESSEE_COMPANY_NAME = objectName + ' ' + objectNameOmit (nvarchar(50)) 합산 가드 + if (params.objectName && (params.objectName + ' ' + (params.objectNameOmit ?? '')).length > 50) { + return swalFire({ text: getMessage('stuff.detail.save.objectNameTooLong'), type: 'alert', icon: 'warning' }) + } + const apiUrl = '/api/object/save-object' if (objectNo) { setIsGlobalLoading(true) @@ -1883,7 +1897,7 @@ export default function StuffDetail() {
- +
@@ -1912,7 +1926,7 @@ export default function StuffDetail() { })} {/* 라디오끝 */}
- +
+
@@ -2153,7 +2167,7 @@ export default function StuffDetail() { )}
- +
@@ -2340,7 +2354,7 @@ export default function StuffDetail() { {getMessage('stuff.detail.remarks')}
- +
@@ -2475,7 +2489,7 @@ export default function StuffDetail() {
- +
@@ -2504,7 +2518,7 @@ export default function StuffDetail() { })} {/* 상세라디오끝 */}
- +
+
@@ -2754,7 +2768,7 @@ export default function StuffDetail() { )}
- +
@@ -2955,7 +2969,7 @@ export default function StuffDetail() { {getMessage('stuff.detail.remarks')}
- +
diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index b46d21ed..3f7120d8 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -207,6 +207,13 @@ export const useEstimateController = (planNo, flag) => { return swalFire({ text: getMessage('estimate.detail.save.requiredObjectName'), type: 'alert', icon: 'warning' }) } + // [NVARCHAR50-GUARD 2026-05-18] ADDRESSEE_COMPANY_NAME = objectName + ' ' + objectNameOmit (nvarchar(50)) 합산 가드 + if ((estimateData.objectName + ' ' + (estimateData.objectNameOmit ?? '')).length > 50) { + flag = false + setIsGlobalLoading(false) + return swalFire({ text: getMessage('estimate.detail.save.objectNameTooLong'), type: 'alert', icon: 'warning' }) + } + if (isNaN(Date.parse(estimateData.estimateDate))) { flag = false setIsGlobalLoading(false) diff --git a/src/locales/ja.json b/src/locales/ja.json index 2bc8f273..ba535999 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -801,6 +801,7 @@ "stuff.detail.save.valierror2": "設置高さ0より大きい値を入力してください", "stuff.detail.save.valierror3": "{0} 必須入力項目です。", "stuff.detail.save.valierror4": "二次販売店名は必須オプションです。", + "stuff.detail.save.objectNameTooLong": "物件名(敬称含む)は50文字以内で入力してください。", "stuff.detail.move.confirmMsg": "商品情報画面に移動します。 [保存]していない図面情報は削除されます。商品情報画面に移動しますか?", "stuff.planReqPopup.popTitle": "設計依頼検索", "stuff.planReqPopup.btn1": "検索", @@ -1051,6 +1052,7 @@ "estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります。", "estimate.detail.save.requiredCharger": "担当者は必須です。", "estimate.detail.save.requiredObjectName": "案件名は必須です。", + "estimate.detail.save.objectNameTooLong": "案件名(敬称含む)は50文字以内で入力してください。", "estimate.detail.save.requiredPkgAsp": "住宅PKG単価は0より大きい値を入力してください。", "estimate.detail.save.requiredEstimateDate": "見積日は必須です。", "estimate.detail.save.requiredItemId": "製品を選択してください。", diff --git a/src/locales/ko.json b/src/locales/ko.json index 5d9a5474..a596bffe 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -801,6 +801,7 @@ "stuff.detail.save.valierror2": "설치높이는 0보다 큰 값을 입력하세요", "stuff.detail.save.valierror3": "{0} 필수 입력 항목입니다.", "stuff.detail.save.valierror4": "2차 판매점명은 필수 선택사항입니다.", + "stuff.detail.save.objectNameTooLong": "물건명과 경칭을 합쳐 50자 이내로 입력해주세요.", "stuff.detail.move.confirmMsg": "물건정보 화면으로 이동합니다. [저장]하지 않은 도면정보는 삭제됩니다. 물건정보 화면으로 이동하시겠습니까?", "stuff.planReqPopup.popTitle": "설계 의뢰 검색", "stuff.planReqPopup.btn1": "검색", @@ -1051,6 +1052,7 @@ "estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.", "estimate.detail.save.requiredCharger": "담당자는 필수값 입니다.", "estimate.detail.save.requiredObjectName": "안건명은 필수값 입니다.", + "estimate.detail.save.objectNameTooLong": "안건명과 경칭을 합쳐 50자 이내로 입력해주세요.", "estimate.detail.save.requiredPkgAsp": "주택pkg 단가는 0보다 큰 값을 입력하세요.", "estimate.detail.save.requiredEstimateDate": "견적일은 필수값 입니다.", "estimate.detail.save.requiredItemId": "제품을 선택해주세요.",