From 166b25d665575ff795833ceaa1be258c16526391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 10:35:54 +0900 Subject: [PATCH 01/12] =?UTF-8?q?=EB=B6=80=EA=B3=BC=EC=98=88=EA=B3=A0=20va?= =?UTF-8?q?lidation=20=EC=A0=80=EC=9E=A5,=20=EA=B3=84=EC=82=B0=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/crdnLevyPrvntc/levyPrvntcPopup.jsp | 281 ++++++++++-------- 1 file changed, 158 insertions(+), 123 deletions(-) diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp index 46e22f3..696dc4e 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp @@ -187,7 +187,7 @@ 경과년수
별잔가율 - 기초공시율 + 기초공사율 건축물
과세시가 시가표준액
(1,000원미만절삭) @@ -213,7 +213,7 @@ - + = @@ -1168,47 +1168,166 @@ }, /** - * 폼 유효성 검증 - * 중요로직: 필수 입력 필드 및 데이터 유효성을 검증하여 저장 가능 여부를 판단합니다. - * @returns {boolean} 유효성 검증 결과 + * 공통 필드 유효성 검증 함수 + * 중요로직: 필드별 검증 규칙을 통합 관리하여 중복 코드를 제거합니다. + * @param {string} validationType - 검증 타입 ('save' 또는 'calculation') + * @returns {Object} 검증 결과 객체 { isValid: boolean, message: string, focusElement: string } */ - validateForm: function() { - // 필수 필드 검증 - if (!$('#actInfoId').val()) { - alert('행위정보를 선택해주세요.'); - return false; + validateCommon: function(validationType) { + // 1. 행위정보 선택 검증 (저장 시에만) + if (validationType === 'save' && !$('#actInfoId').val()) { + return { + isValid: false, + message: '행위정보를 선택해주세요.', + focusElement: null + }; } - - if (!$('#bscsCstrnSeCd').val()) { - $('#bscsCstrnSeCd').focus(); - alert('기초공사구분을 선택해주세요.'); - return false; + + // 2. 기초공사구분 검증 (저장 시에만) + if (validationType === 'save' && !$('#bscsCstrnSeCd').val()) { + return { + isValid: false, + message: '기초공사율을 선택해주세요.', + focusElement: '#bscsCstrnSeCd' + }; } - - // 산정률2 유효성 검증 - if (!$('#cmpttnRt2Cd').val()) { - alert('산정률2를 선택해주세요.'); - $('#cmpttnRt2Cd').focus(); - return false; + + // 3. 건물기준시가액 검증 (계산 시에만) + if (validationType === 'calculation') { + var bldgNewPrcCrtrAmt = $('#bldgNewPrcCrtrAmt').inputmask('unmaskedvalue') || '0'; + if (!bldgNewPrcCrtrAmt || parseFloat(bldgNewPrcCrtrAmt) <= 0) { + return { + isValid: false, + message: '건물기준시가액을 입력해주세요.', + focusElement: '#bldgNewPrcCrtrAmt' + }; + } } - - var vltnArea = parseFloat($('#vltnArea').inputmask('unmaskedvalue')) || 0; - if (vltnArea <= 0) { - alert('위반면적을 입력해주세요.'); - $('#vltnArea').focus(); - return false; + + // 4. 구조지수 검증 (계산 시에만) + if (validationType === 'calculation') { + var strctIdx = $('#strctIdx').inputmask('unmaskedvalue') || '0'; + if (!strctIdx || parseFloat(strctIdx) <= 0) { + return { + isValid: false, + message: '구조지수를 입력해주세요.', + focusElement: '#strctIdx' + }; + } + } + + // 5. 용도지수 검증 (계산 시에만) + if (validationType === 'calculation') { + var usgIdx = $('#usgIdx').inputmask('unmaskedvalue') || '0'; + if (!usgIdx || parseFloat(usgIdx) <= 0) { + return { + isValid: false, + message: '용도지수를 입력해주세요.', + focusElement: '#usgIdx' + }; + } + } + + // 6. 위치지수 검증 (계산 시에만) + if (validationType === 'calculation') { + var pstnIdx = $('#pstnIdx').inputmask('unmaskedvalue') || '0'; + if (!pstnIdx || parseFloat(pstnIdx) <= 0) { + return { + isValid: false, + message: '위치지수를 입력해주세요.', + focusElement: '#pstnIdx' + }; + } + } + + // 7. 경과년수별잔가율 검증 (계산 시에만) + if (validationType === 'calculation') { + var elpsYrRdvlrt = $('#elpsYrRdvlrt').inputmask('unmaskedvalue') || '0'; + if (!elpsYrRdvlrt || parseFloat(elpsYrRdvlrt) <= 0) { + return { + isValid: false, + message: '경과년수별잔가율을 입력해주세요.', + focusElement: '#elpsYrRdvlrt' + }; + } + } + + // 8. 기초공사율 검증 (계산 시에만) + if (validationType === 'calculation') { + var bscsCstrnRt = $('#bscsCstrnRt').inputmask('unmaskedvalue') || '0'; + if (!bscsCstrnRt || parseFloat(bscsCstrnRt) <= 0) { + return { + isValid: false, + message: '기초공사율을 선택해주세요.', + focusElement: '#bscsCstrnSeCd' + }; + } + } + + // 9. 위반면적 검증 (공통) + var vltnArea = $('#vltnArea').inputmask('unmaskedvalue') || '0'; + if (!vltnArea || parseFloat(vltnArea) <= 0) { + return { + isValid: false, + message: '위반면적을 입력해주세요.', + focusElement: '#vltnArea' + }; + } + + // 10. 산정률 검증 (공통 - 계산 시 또는 저장 시 체크) + var cmpttnRtRate = $('#cmpttnRtRate').val(); + if (!cmpttnRtRate || parseFloat(cmpttnRtRate) <= 0) { + return { + isValid: false, + message: '산정률을 선택해주세요.', + focusElement: '#cmpttnRtCd' + }; + } + + // 11. 산정률2 검증 (공통) + var cmpttnRt2Rate = $('#cmpttnRt2Rate').val(); + if (!cmpttnRt2Rate || parseFloat(cmpttnRt2Rate) <= 0) { + return { + isValid: false, + message: '산정률2를 선택해주세요.', + focusElement: '#cmpttnRt2Cd' + }; + } + + // 12. 계산 완료 여부 검증 (저장 시에만) + if (validationType === 'save') { + var taxableMarketPrice = $("#taxableMarketPrice").val(); // 건축물과세시가 + var standardMarketPrice = $("#standardMarketPrice").val(); // 시가표준액 + var standardMarketPrice_bottom = $("#standardMarketPrice_bottom").val(); // 시가표준액(하단) + var cmpttnAmt = $("#cmpttnAmt").val(); // 산정액 + var levyWholAmt = $("#levyWholAmt").val(); // 부과총액 + + if (!(taxableMarketPrice && standardMarketPrice && standardMarketPrice_bottom && cmpttnAmt && levyWholAmt)) { + return { + isValid: false, + message: '[계산하기] 버튼을 클릭 하여 계산을 완료하시기 바랍니다.', + focusElement: null + }; + } } - var taxableMarketPrice = $("#taxableMarketPrice").val(); - var standardMarketPrice = $("#standardMarketPrice").val(); - var standardMarketPrice_bottom = $("#standardMarketPrice_bottom").val(); - var cmpttnAmt = $("#cmpttnAmt").val(); - var levyWholAmt = $("#levyWholAmt").val(); - if( !(taxableMarketPrice && standardMarketPrice && standardMarketPrice_bottom && cmpttnAmt && levyWholAmt) ){ - alert('[계산하기] 버튼을 클릭 하여 계산을 완료하시기 바랍니다.'); + return { isValid: true }; // 모든 검증 통과 + }, + + /** + * 폼 유효성 검증 (저장용) + * 중요로직: 저장 시 필요한 모든 필드를 검증합니다. + * @returns {boolean} 유효성 검증 결과 + */ + validateForm: function() { + var result = this.validateCommon('save'); // 공통 검증 함수 호출 + if (!result.isValid) { + alert(result.message); // 오류 메시지 표시 + if (result.focusElement) { + $(result.focusElement).focus(); // 문제 필드로 포커스 이동 + } return false; } - return true; }, @@ -1425,96 +1544,12 @@ }, /** - * 통합 계산 필수값 검증 함수 - * 중요로직: 건축물과세시가 계산부터 부과총액까지 전체 계산에 필요한 모든 필수값을 검증합니다. + * 통합 계산 필수값 검증 함수 (계산용) + * 중요로직: 계산 시 필요한 모든 필드를 검증합니다. + * @returns {Object} 검증 결과 객체 { isValid: boolean, message: string, focusElement: string } */ validateCalculationInputs: function() { - // 1. 건축물과세시가 계산에 필요한 값들 검증 - var bldgNewPrcCrtrAmt = $('#bldgNewPrcCrtrAmt').inputmask('unmaskedvalue') || '0'; // 건물기준시가액 - if (!bldgNewPrcCrtrAmt || parseFloat(bldgNewPrcCrtrAmt) <= 0) { - return { - isValid: false, - message: '건물기준시가액을 입력해주세요.', - focusElement: '#bldgNewPrcCrtrAmt' - }; - } - - var strctIdx = $('#strctIdx').inputmask('unmaskedvalue') || '0'; // 구조지수 - if (!strctIdx || parseFloat(strctIdx) <= 0) { - return { - isValid: false, - message: '구조지수를 입력해주세요.', - focusElement: '#strctIdx' - }; - } - - var usgIdx = $('#usgIdx').inputmask('unmaskedvalue') || '0'; // 용도지수 - if (!usgIdx || parseFloat(usgIdx) <= 0) { - return { - isValid: false, - message: '용도지수를 입력해주세요.', - focusElement: '#usgIdx' - }; - } - - var pstnIdx = $('#pstnIdx').inputmask('unmaskedvalue') || '0'; // 위치지수 - if (!pstnIdx || parseFloat(pstnIdx) <= 0) { - return { - isValid: false, - message: '위치지수를 입력해주세요.', - focusElement: '#pstnIdx' - }; - } - - var elpsYrRdvlrt = $('#elpsYrRdvlrt').inputmask('unmaskedvalue') || '0'; // 경과년수별잔가율 - if (!elpsYrRdvlrt || parseFloat(elpsYrRdvlrt) <= 0) { - return { - isValid: false, - message: '경과년수별잔가율을 입력해주세요.', - focusElement: '#elpsYrRdvlrt' - }; - } - - var bscsCstrnRt = $('#bscsCstrnRt').inputmask('unmaskedvalue') || '0'; // 기초공사율 - if (!bscsCstrnRt || parseFloat(bscsCstrnRt) <= 0) { - return { - isValid: false, - message: '기초공사율을 선택해주세요.', - focusElement: '#bscsCstrnSeCd' - }; - } - - // 2. 위반면적 검증 - var vltnArea = $('#vltnArea').inputmask('unmaskedvalue') || '0'; // 위반면적 - if (!vltnArea || parseFloat(vltnArea) <= 0) { - return { - isValid: false, - message: '위반면적을 입력해주세요.', - focusElement: '#vltnArea' - }; - } - - // 3. 산정률 검증 - var cmpttnRtRate = $('#cmpttnRtRate').val(); // 산정률 비율값 - if (!cmpttnRtRate || parseFloat(cmpttnRtRate) <= 0) { - return { - isValid: false, - message: '산정률을 선택해주세요.', - focusElement: '#cmpttnRtCd' - }; - } - - // 4. 산정률2 검증 - var cmpttnRt2Rate = $('#cmpttnRt2Rate').val(); // 산정률2 비율값 - if (!cmpttnRt2Rate || parseFloat(cmpttnRt2Rate) <= 0) { - return { - isValid: false, - message: '산정률2를 선택해주세요.', - focusElement: '#cmpttnRt2Cd' - }; - } - - return { isValid: true }; // 모든 검증 통과 + return this.validateCommon('calculation'); // 공통 검증 함수 호출 }, /** From a8039a0e1499dd2fc42230b394415ab8502c38bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 10:47:28 +0900 Subject: [PATCH 02/12] =?UTF-8?q?=EB=B6=80=EA=B3=BC=EC=98=88=EA=B3=A0=20?= =?UTF-8?q?=EB=85=84=EB=8F=84=EA=B3=84=EC=82=B0=20=EC=BF=BC=EB=A6=AC=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 --- .../crdn/crndRegistAndView/main/CrdnLevyPrvntcMapper_maria.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/main/CrdnLevyPrvntcMapper_maria.xml b/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/main/CrdnLevyPrvntcMapper_maria.xml index fe570e4..b6d1b58 100644 --- a/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/main/CrdnLevyPrvntcMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/main/CrdnLevyPrvntcMapper_maria.xml @@ -45,7 +45,7 @@ pi.PSTN_IDX_NO, -- 위치지수 NO pi.PSTN_IDX, -- 위치지수 substring(t3.ACT_BGNG_YMD,1,4) as ELPS_YR_RDVLRT_YR, - CASE WHEN (CAST(substring(t3.ACT_BGNG_YMD,1,4) as SIGNED)-CAST(t1.CRDN_YR as SIGNED)) >= strct.RDVLRT_CN_YR_CNT THEN strct.LAST_YR_RDVLRT + CASE WHEN ( CAST(t1.CRDN_YR as SIGNED) - CAST(substring(t3.ACT_BGNG_YMD,1,4) as SIGNED) ) >= strct.RDVLRT_CN_YR_CNT THEN strct.LAST_YR_RDVLRT ELSE 1-( (CAST(t1.CRDN_YR as SIGNED) - CAST(substring(t3.ACT_BGNG_YMD,1,4) as SIGNED)) * strct.DPRT From e4f822d40b69d08f3781d3704acf2d82a0f2a795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 13:37:10 +0900 Subject: [PATCH 03/12] =?UTF-8?q?=EB=B6=80=EA=B3=BC=EC=98=88=EA=B3=A0=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/crdnLevyPrvntc/levyPrvntcPopup.jsp | 130 +++++++++--------- 1 file changed, 66 insertions(+), 64 deletions(-) diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp index 696dc4e..69cb108 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp @@ -718,23 +718,8 @@ LevyPrvntcPopup.levyInfoIdSelect = existingData.levyInfoId; - // 위반면적 설정 - $('#vltnArea').val(existingData.vltnArea || '').trigger('focus'); - - // 산정률1 설정 (행위유형) - $('#cmpttnRtDisplay').val((existingData.cmpttnRt || '') + ' %'); // 산정률 표시 필드 (퍼센트 포함) - $('#cmpttnRtCd').val(existingData.cmpttnRtCd || ''); // 산정률 코드 설정 - $('#cmpttnRt').val(existingData.cmpttnRt || ''); // 산정률 값 설정 - $('#cmpttnRtRate').val(existingData.cmpttnRtRate || ''); // 계산용 비율값 - - // 기초공사구분 및 비율 - $('#bscsCstrnSeCd').val(existingData.bscsCstrnSeCd || ''); // 기초공사구분 코드 설정 - $('#bscsCstrnRt').val(existingData.bscsCstrnRt || ''); // 기초공사율 값 설정 - - // 건물기준시가액 - $('#bldgNewPrcCrtrAmtNo').val(existingData.bldgNewPrcCrtrAmtNo || ''); // 건물기준시가액 번호 설정 - $('#bldgNewPrcCrtrAmtDisplay').val(existingData.bldgNewPrcCrtrAmtDisplay || ''); // 건축물용도명 - $('#bldgNewPrcCrtrAmt').val(existingData.bldgCrtrMprcAmt || '').trigger('focus'); // 건물기준시가액 값 설정 + // 건축물과세시가 + $('#taxableMarketPrice').val(existingData.bdstTxtnMprc || '').trigger('focus'); // 구조지수 $('#strctIdxCd').val(existingData.strctIdxCd || ''); // 구조지수 코드 설정 @@ -755,11 +740,31 @@ $('#elpsYrRdvlrt_yr').val((existingData.elpsYrRdvlrtYr || '') + ' 년'); // 행위시작년도 $('#elpsYrRdvlrt').val(existingData.elpsYrRdvlrt || ''); // 경과년수별잔가율 값 설정 - // 산정률2 - $('#cmpttnRt2Cd').val(existingData.cmpttnRt2Cd || ''); // 산정률2 코드 설정 - $('#cmpttnRt2').val(existingData.cmpttnRt2 || ''); // 산정률2 값 설정 - $('#cmpttnRt2Display').val((existingData.cmpttnRt2 || '') + ' %'); // 산정률2 표시 필드 (퍼센트 포함) - $('#cmpttnRt2Rate').val(existingData.cmpttnRt2Rate || ''); // 계산용 비율값 + // 기초공사구분 및 비율 + $('#bscsCstrnSeCd').val(existingData.bscsCstrnSeCd || ''); // 기초공사구분 코드 설정 + $('#bscsCstrnRt').val(existingData.bscsCstrnRt || ''); // 기초공사율 값 설정 + + // 기초공사율 계산을 위한 기준 비율들 저장 (hidden으로) + if (!$('#bscsCstrnYBdstCmpttnRt').length) { + $('').appendTo('body'); + $('').appendTo('body'); + $('').appendTo('body'); + } + $('#bscsCstrnYBdstCmpttnRt').val(existingData.bscsCstrnYBdstCmpttnRt || ''); + $('#bscsCstrnNBdstCmpttnRt').val(existingData.bscsCstrnNBdstCmpttnRt || ''); + $('#dupEtbldgBdstCmpttnRt').val(existingData.dupEtbldgBdstCmpttnRt || ''); + + // 건물기준시가액 + $('#bldgNewPrcCrtrAmtNo').val(existingData.bldgNewPrcCrtrAmtNo || ''); // 건물기준시가액 번호 설정 + $('#bldgNewPrcCrtrAmtDisplay').val(existingData.bldgNewPrcCrtrAmtDisplay || ''); // 건축물용도명 + $('#bldgNewPrcCrtrAmt').val(existingData.bldgCrtrMprcAmt || '').trigger('focus'); // 건물기준시가액 값 설정 + + // 시가표준액 + $('#standardMarketPrice').val(existingData.mprcStdAmt || '').trigger('focus'); + $('#standardMarketPrice_bottom').val(existingData.mprcStdAmt || '').trigger('focus'); + + // 위반면적 설정 + $('#vltnArea').val(existingData.vltnArea || '').trigger('focus'); // 가감산 정보 $('#adtnRtCd').val(existingData.adtnRtCd || ''); // 가산율 코드 설정 @@ -773,28 +778,6 @@ $('#adsbmtnEnfcRt').val(existingData.adsbmtnEnfcRt || '100'); // 가감산시행령률 값 설정 $('#adsbmtnEnfcRtDisplay').val((existingData.adsbmtnEnfcRt || '100') + ' %'); // 가감산시행령률 표시 필드 (퍼센트 포함) - // 산정액 및 부과총액 - $('#cmpttnAmt').val(existingData.cmpttnAmt || '').trigger('focus'); // 산정액 값 설정 - $('#levyWholAmt').val(existingData.levyWholAmt || ''); // 부과총액 값 설정 - $('#levyWholAmtDisplay').text((existingData.levyWholAmt ? Number(existingData.levyWholAmt).toLocaleString() : '0') + ' 원'); - - // 시가표준액 - $('#standardMarketPrice').val(existingData.mprcStdAmt || '').trigger('focus'); - $('#standardMarketPrice_bottom').val(existingData.mprcStdAmt || '').trigger('focus'); - - // 건축물과세시가 - $('#taxableMarketPrice').val(existingData.bdstTxtnMprc || '').trigger('focus'); - - // 기초공사율 계산을 위한 기준 비율들 저장 (hidden으로) - if (!$('#bscsCstrnYBdstCmpttnRt').length) { - $('').appendTo('body'); - $('').appendTo('body'); - $('').appendTo('body'); - } - $('#bscsCstrnYBdstCmpttnRt').val(existingData.bscsCstrnYBdstCmpttnRt || ''); - $('#bscsCstrnNBdstCmpttnRt').val(existingData.bscsCstrnNBdstCmpttnRt || ''); - $('#dupEtbldgBdstCmpttnRt').val(existingData.dupEtbldgBdstCmpttnRt || ''); - // 가감산 버튼 텍스트 업데이트 if (existingData.adtnRt && parseFloat(existingData.adtnRt) > 0) { $('#btnOpenAddPopup').text('+ 가산 [' + existingData.adtnRt + '%]'); @@ -808,6 +791,23 @@ $('#btnOpenMinusPopup').text('- 감산 [0%]'); } + // 산정률1 설정 (행위유형) + $('#cmpttnRtDisplay').val((existingData.cmpttnRt || '') + ' %'); // 산정률 표시 필드 (퍼센트 포함) + $('#cmpttnRtCd').val(existingData.cmpttnRtCd || ''); // 산정률 코드 설정 + $('#cmpttnRt').val(existingData.cmpttnRt || ''); // 산정률 값 설정 + $('#cmpttnRtRate').val(existingData.cmpttnRtRate || ''); // 계산용 비율값 + + // 산정률2 + $('#cmpttnRt2Cd').val(existingData.cmpttnRt2Cd || ''); // 산정률2 코드 설정 + $('#cmpttnRt2').val(existingData.cmpttnRt2 || ''); // 산정률2 값 설정 + $('#cmpttnRt2Display').val((existingData.cmpttnRt2 || '') + ' %'); // 산정률2 표시 필드 (퍼센트 포함) + $('#cmpttnRt2Rate').val(existingData.cmpttnRt2Rate || ''); // 계산용 비율값 + + // 산정액 및 부과총액 + $('#cmpttnAmt').val(existingData.cmpttnAmt || '').trigger('focus'); // 산정액 값 설정 + $('#levyWholAmt').val(existingData.levyWholAmt || ''); // 부과총액 값 설정 + $('#levyWholAmtDisplay').text((existingData.levyWholAmt ? Number(existingData.levyWholAmt).toLocaleString() : '0') + ' 원'); + // 기존 데이터 로딩 시 계산하기 버튼 숨김 (이미 계산된 결과가 있으므로) LevyPrvntcPopup.hideCalculateButton(); // 기존 부과정보 로드 시 계산하기 버튼 숨김 @@ -822,26 +822,6 @@ */ var setActInfoToForm = function(rowData) { var vltnArea = rowData.calcArea; // 면적 - 조치면적 : 위반면적 - $('#vltnArea').val(vltnArea).trigger('focus').trigger('change'); // 위반면적, change 이벤트 트리거 - - // 행위유형에 따른 산정률1 설정 - $('#cmpttnRtDisplay').val(rowData.actCmpttnRt+ ' %'); // 산정률 표시 필드 (퍼센트 포함) - $('#cmpttnRtCd').val(rowData.actTypeCd); // 산정률 코드 설정 - $('#cmpttnRt').val(rowData.actCmpttnRt); // 산정률 값 설정 - $('#cmpttnRtRate').val(rowData.actCmpttnRtRate); // 산정률 계산용 비율값 설정 - - $('#bscsCstrnRt').val(''); // 기초공사율 - $('#bscsCstrnSeCd').val(''); // 기초공사구분 - - // 기초공사율 계산을 위한 기준 비율들 초기화 (hidden으로) - if (!$('#bscsCstrnYBdstCmpttnRt').length) { - $('').appendTo('body'); - $('').appendTo('body'); - $('').appendTo('body'); - } - $('#bscsCstrnYBdstCmpttnRt').val(''); - $('#bscsCstrnNBdstCmpttnRt').val(''); - $('#dupEtbldgBdstCmpttnRt').val(''); $('#bldgNewPrcCrtrAmtNo').val(rowData.bldgNewPrcCrtrAmtNo); // 건물기준시가액(NO) $('#bldgNewPrcCrtrAmtDisplay').val(rowData.bdstUsg); // 건물기준시가액(건축물 용도) @@ -862,8 +842,30 @@ $('#elpsYrRdvlrt_yr').val(rowData.elpsYrRdvlrtYr+' 년'); // 경과년수별잔가율(상단) $('#elpsYrRdvlrt').val(rowData.elpsYrRdvlrt); // 경과년수별잔가율(하단) + $('#bscsCstrnRt').val(''); // 기초공사율 + $('#bscsCstrnSeCd').val(''); // 기초공사구분 + + // 기초공사율 계산을 위한 기준 비율들 초기화 (hidden으로) + if (!$('#bscsCstrnYBdstCmpttnRt').length) { + $('').appendTo('body'); + $('').appendTo('body'); + $('').appendTo('body'); + } + $('#bscsCstrnYBdstCmpttnRt').val(''); + $('#bscsCstrnNBdstCmpttnRt').val(''); + $('#dupEtbldgBdstCmpttnRt').val(''); $('#bscsCstrnSeCd').trigger('change'); // 기초공사구분 변경 이벤트 트리거 + $('#vltnArea').val(vltnArea).trigger('focus').trigger('change'); // 위반면적, change 이벤트 트리거 + + // 행위유형에 따른 산정률1 설정 + $('#cmpttnRtDisplay').val(rowData.actCmpttnRt+ ' %'); // 산정률 표시 필드 (퍼센트 포함) + $('#cmpttnRtCd').val(rowData.actTypeCd); // 산정률 코드 설정 + $('#cmpttnRt').val(rowData.actCmpttnRt); // 산정률 값 설정 + $('#cmpttnRtRate').val(rowData.actCmpttnRtRate); // 산정률 계산용 비율값 설정 + + $('#cmpttnRt2Cd').val('').trigger('change'); // 산정률2 변경 이벤트 트리거 + // 계산하기 버튼 표시 (값이 변경된 경우) LevyPrvntcPopup.showCalculateButton(); // 신규 행위정보 선택 시 계산하기 버튼 표시 }; From ecc7d69baa3b5a4edf39c13d3d1668d626ddbce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 13:51:36 +0900 Subject: [PATCH 04/12] =?UTF-8?q?=EB=B6=80=EA=B3=BC=EC=98=88=EA=B3=A0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EC=A0=81=EC=9A=A9=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/crdnLevyPrvntc/levyPrvntcPopup.jsp | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp index 69cb108..d5a0c50 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp @@ -79,6 +79,130 @@ │ - 모든 행위정보 완료 시 자동 합산 │ └─────────────────────────────────────────────────────────────────────────────┘ +■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ + +■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ +■ 데이터베이스 테이블 및 컬럼 상세 정보 (쿼리 조회 기준) +■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ + +■ 1. 건물기준시가액 (bldgNewPrcCrtrAmt) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 조회 테이블: tb_bldg_new_prc_crtr_amt (건물신축가격기준액) +• 매칭 조건: + - YR = t1.CRDN_YR (단속연도) + - NO = SUBSTRING(용도지수코드,1,1) (용도지수 첫자리 번호) +• 주요 컬럼: + - BLDG_NEW_PRC_CRTR_AMT: 건물신축가격기준액 (DECIMAL(13)) + - BDST_USG: 건축물용도 (VARCHAR(60)) +• 저장위치: tb_levy_info.BLDG_CRTR_MPRC_AMT / BLDG_NEW_PRC_CRTR_AMT_NO + +■ 2. 구조지수 (strctIdx) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 조회 테이블: tb_strct_idx (구조지수) +• 주요 컬럼: + - STRCT_IDX_CD: 구조지수코드 (VARCHAR(3)) [PK] + - STRCT_IDX: 구조지수값 (DECIMAL(10,2)) + - STRCT_NM: 구조명 (VARCHAR(100)) + - RDVLRT_CN_YR_CNT: 잔가율내용연도수 (DECIMAL(2)) + - LAST_YR_RDVLRT: 최종연도잔가율 (DECIMAL(4,2)) + - DPRT: 감가상각률 (DECIMAL(4,4)) +• 추가 계산용 컬럼: + - BSCS_CSTRN_Y_BDST_CMPTTN_RT: 기초공사Y건축물산정비율 + - BSCS_CSTRN_N_BDST_CMPTTN_RT: 기초공사N건축물산정비율 + - DUP_ETBLDG_BDST_CMPTTN_RT: 복측증축건축물산정비율 +• 저장위치: tb_levy_info.STRCT_IDX_CD / STRCT_IDX + +■ 3. 용도지수 (usgIdx) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 조회 테이블: tb_usg_idx (용도지수) +• 주요 컬럼: + - USG_IDX_CD: 용도지수코드 (VARCHAR(5)) [PK] + - USG_IDX: 용도지수값 (DECIMAL(10,2)) + - USG_NM: 용도명 (VARCHAR(300)) + - MAIN_USG_NM: 주요용도명 (VARCHAR(100)) + - LWR_USG_NM: 하위용도명 (VARCHAR(100)) +• 저장위치: tb_levy_info.USG_IDX_CD / USG_IDX + +■ 4. 위치지수 (pstnIdx) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 조회 테이블: tb_pstn_idx (위치지수) +• 매칭 조건: 공시지가(OALP) BETWEEN 시작가격 AND 종료가격 (범위 매칭) +• 주요 컬럼: + - PSTN_IDX_NO: 위치지수번호 (VARCHAR(2)) [PK] + - PSTN_IDX: 위치지수값 (DECIMAL(10,2)) + - BLDG_ANX_LAND_BGNG_PRC: 건물부속토지시작가격 (DECIMAL) + - BLDG_ANX_LAND_END_PRC: 건물부속토지종료가격 (DECIMAL) +• 저장위치: tb_levy_info.PSTN_IDX_NO / PSTN_IDX + +■ 5. 경과년수별잔가율 (elpsYrRdvlrt) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 계산 방식: 동적 계산 (구조지수의 감가상각 정보 활용) +• 관련 테이블: + - tb_strct_idx: 감가상각률(DPRT), 잔가율내용연도수(RDVLRT_CN_YR_CNT), 최종연도잔가율(LAST_YR_RDVLRT) + - tb_act_info: 행위시작일자(ACT_BGNG_YMD) + - tb_crdn: 단속연도(CRDN_YR) +• 계산 공식: + - 경과년수 = CAST(단속연도 as SIGNED) - CAST(SUBSTRING(행위시작일자,1,4) as SIGNED) + - IF 경과년수 >= 잔가율내용연도수 THEN 최종연도잔가율 + - ELSE 1 - (경과년수 × 감가상각률) +• 저장위치: tb_levy_info.ELPS_YR_RDVLRT + +■ 6. 기초공사율 (bscsCstrnRt) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 계산 방식: 구조지수 테이블의 기초공사 관련 비율 조회 +• 관련 테이블: tb_strct_idx +• 계산용 컬럼: + - BSCS_CSTRN_Y_BDST_CMPTTN_RT: 기초공사 있음(Y) 건축물산정비율 + - BSCS_CSTRN_N_BDST_CMPTTN_RT: 기초공사 없음(N) 건축물산정비율 +• 선택 방식: 기초공사구분코드(bscsCstrnSeCd)에 따라 해당 비율 적용 +• 저장위치: tb_levy_info.BSCS_CSTRN_SE_CD / BSCS_CSTRN_RT + +■ 7. 가감산시행령률 (adsbmtnEnfcRt) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 기본값: 100 (고정값) +• 관련 테이블: tb_adsbmtn_rt (가감산율) +• 주요 컬럼: + - ADSBMTN_RT_CD: 가감산율코드 + - ADSBMTN_RT_SE_CD: 가감산율구분코드 ('01':가산, '02':감산) + - ADSBMTN_RT: 가감산율 +• 계산 방식: (100 + 가산율 - 감산율) 형태로 적용 +• 저장위치: tb_levy_info.ADSBMTN_ENFC_RT + +■ 8. 산정률 (cmpttnRt) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 조회 테이블: tb_act_type (행위유형) +• 매칭 조건: ACT_TYPE_CD = 행위정보.행위유형코드 +• 주요 컬럼: + - ACT_TYPE_CD: 행위유형코드 (VARCHAR(3)) [PK] + - CMPTTN_RT: 산정률 (DECIMAL(3)) + - VLTN_BDST: 위반건축물 (VARCHAR(100)) +• 저장위치: tb_levy_info.CMPTTN_RT_CD / CMPTTN_RT + +■ 9. 산정률2 (cmpttnRt2) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• 조회 테이블: tb_cmpttn_rt_2 (산정률2) +• 조회 조건: USE_YN = 'Y' (사용중인 항목만) +• 주요 컬럼: + - CMPTTN_RT_2_CD: 산정률2코드 + - CMPTTN_RT_2: 산정률2값 (DECIMAL(3)) + - VLTN_MTTR: 위반사항 + - USE_YN: 사용여부 +• 저장위치: tb_levy_info.CMPTTN_RT_2_CD / CMPTTN_RT_2 + +■ 10. 추가 관련 테이블 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +• tb_levy_info: 모든 계산 결과의 최종 저장소 (스냅샷 방식) +• tb_act_info: 행위정보 (행위시작일자, 행위유형코드, 위반면적 등) +• tb_pstn_info: 위치정보 (공시지가 OALP) +• tb_crdn: 단속정보 (단속연도, 단속번호) + +■ 계산 흐름 요약 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +1. 기준 데이터 조회: 단속연도, 용도지수, 공시지가 기준으로 각종 마스터 테이블 JOIN +2. 동적 계산: 경과년수별잔가율만 단속연도와 행위시작연도 차이로 실시간 계산 +3. 스냅샷 저장: 계산된 모든 값을 tb_levy_info에 저장하여 데이터 변경에 무관하게 복원 가능 +4. 이행강제금: 모든 행위정보별 부과총액 합계로 최종 산출 + ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ --> From 08db0074c2f7c163e89a62d9e9195284a0ef33ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 13:53:58 +0900 Subject: [PATCH 05/12] =?UTF-8?q?=EB=B6=80=EA=B3=BC=EC=98=88=EA=B3=A0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EC=A0=81=EC=9A=A9=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80=20-=20=EC=98=A4=ED=83=80=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 --- .../crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp index d5a0c50..36ee129 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp @@ -79,7 +79,6 @@ │ - 모든 행위정보 완료 시 자동 합산 │ └─────────────────────────────────────────────────────────────────────────────┘ -■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■ 데이터베이스 테이블 및 컬럼 상세 정보 (쿼리 조회 기준) @@ -163,7 +162,7 @@ • 관련 테이블: tb_adsbmtn_rt (가감산율) • 주요 컬럼: - ADSBMTN_RT_CD: 가감산율코드 - - ADSBMTN_RT_SE_CD: 가감산율구분코드 ('01':가산, '02':감산) + - ADSBMTN_RT_SE_CD: 가감산율구분코드 ('1':가산, '2':감산) - ADSBMTN_RT: 가감산율 • 계산 방식: (100 + 가산율 - 감산율) 형태로 적용 • 저장위치: tb_levy_info.ADSBMTN_ENFC_RT From 4ddc68afedeb6bae6ec5856bad25caf1141c98e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 13:55:57 +0900 Subject: [PATCH 06/12] =?UTF-8?q?=EB=B6=80=EA=B3=BC=EC=98=88=EA=B3=A0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EC=A0=81=EC=9A=A9=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80=20-=20=EC=98=A4=ED=83=80=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 --- .../crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp index 36ee129..ee727f5 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp @@ -16,7 +16,7 @@ ■ 4단계 계산 프로세스 (서버에서 순차 처리) -1. 건축물과세시가(bdstTxtnMprc) 계산 - 이부분은 율 이라고 표현되지만 0.85, 1 등 이미지 % 100 처리 된 값으로 표현됨 +1. 건축물과세시가(bdstTxtnMprc) 계산 - [이부분은 율 이라고 표현되지만 0.85, 1 등, %가 아닌 나누기 100 처리 된 값으로 표현됨] - 공식: bldgNewPrcCrtrAmt × strctIdx × usgIdx × pstnIdx × (elpsYrRdvlrt) × (bscsCstrnRt) - 설명: 건물기준시가액 × 구조지수 × 용도지수 × 위치지수 × 경과년수별잔가율 × 기초공사율 - 반올림: setScale(0, RoundingMode.HALF_UP) - 소수점 반올림 From 6ec28a652ab97d4658085d136aa3137d8aaf1dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 13:56:45 +0900 Subject: [PATCH 07/12] =?UTF-8?q?=EB=B6=80=EA=B3=BC=EC=98=88=EA=B3=A0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EC=A0=81=EC=9A=A9=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80=20-=20=EC=98=A4=ED=83=80=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 --- .../crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp index ee727f5..56c7c42 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp @@ -16,7 +16,7 @@ ■ 4단계 계산 프로세스 (서버에서 순차 처리) -1. 건축물과세시가(bdstTxtnMprc) 계산 - [이부분은 율 이라고 표현되지만 0.85, 1 등, %가 아닌 나누기 100 처리 된 값으로 표현됨] +1. 건축물과세시가(bdstTxtnMprc) 계산 - [경과년수별잔가율, 기초공사율 : 율 이라고 표현되지만 0.85, 1 등, %가 아닌 나누기 100 처리 된 값으로 표현됨] - 공식: bldgNewPrcCrtrAmt × strctIdx × usgIdx × pstnIdx × (elpsYrRdvlrt) × (bscsCstrnRt) - 설명: 건물기준시가액 × 구조지수 × 용도지수 × 위치지수 × 경과년수별잔가율 × 기초공사율 - 반올림: setScale(0, RoundingMode.HALF_UP) - 소수점 반올림 From 028b2c6e1b20ac4fed657e4bbcdbc0009a1c5bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 14:05:39 +0900 Subject: [PATCH 08/12] =?UTF-8?q?=EB=B6=80=EA=B3=BC=EC=98=88=EA=B3=A0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EC=A0=81=EC=9A=A9=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80=20-=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp index 56c7c42..cae30af 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/crdnLevyPrvntc/levyPrvntcPopup.jsp @@ -153,6 +153,7 @@ • 계산용 컬럼: - BSCS_CSTRN_Y_BDST_CMPTTN_RT: 기초공사 있음(Y) 건축물산정비율 - BSCS_CSTRN_N_BDST_CMPTTN_RT: 기초공사 없음(N) 건축물산정비율 + - DUP_ETBLDG_BDST_CMPTTN_RT: 복측증축 건축물산정비율 • 선택 방식: 기초공사구분코드(bscsCstrnSeCd)에 따라 해당 비율 적용 • 저장위치: tb_levy_info.BSCS_CSTRN_SE_CD / BSCS_CSTRN_RT From 1f2f87aae48f1a9743ca86bba5d7220d34d4f94d Mon Sep 17 00:00:00 2001 From: kjh Date: Thu, 25 Sep 2025 16:11:31 +0900 Subject: [PATCH 09/12] =?UTF-8?q?=EC=A1=B0=EC=B9=98=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DB-DDL/maria/dml/tb_cd_detail.sql | 7 ++++++- DB-DDL/maria/dml/tb_cd_group.sql | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/DB-DDL/maria/dml/tb_cd_detail.sql b/DB-DDL/maria/dml/tb_cd_detail.sql index dce9be9..f664db8 100644 --- a/DB-DDL/maria/dml/tb_cd_detail.sql +++ b/DB-DDL/maria/dml/tb_cd_detail.sql @@ -118,4 +118,9 @@ INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, US -- 가감산율 구분 (ADSBMTN_RT_SE_CD) INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ADSBMTN_RT_SE_CD', '1', '가산율', '가산율', 1, 'Y', NULL, NULL, NULL, NULL, NULL, NOW(), 'SYSTEM', NULL, NULL); -INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ADSBMTN_RT_SE_CD', '2', '감산율', '감산율', 2, 'Y', NULL, NULL, NULL, NULL, NULL, NOW(), 'SYSTEM', NULL, NULL); \ No newline at end of file +INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ADSBMTN_RT_SE_CD', '2', '감산율', '감산율', 2, 'Y', NULL, NULL, NULL, NULL, NULL, NOW(), 'SYSTEM', NULL, NULL); + +-- 조치 처리 상태 (ACTN_PRCS_STTS_CD) +INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ACTN_PRCS_STTS_CD', '1', '미조치', '미조치', 1, 'Y', NULL, NULL, NULL, NULL, NULL, NOW(), 'SYSTEM', NULL, NULL); +INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ACTN_PRCS_STTS_CD', '2', '부분조치', '부분조치', 2, 'Y', NULL, NULL, NULL, NULL, NULL, NOW(), 'SYSTEM', NULL, NULL); +INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ACTN_PRCS_STTS_CD', '3', '조치완료', '조치완료', 3, 'Y', NULL, NULL, NULL, NULL, NULL, NOW(), 'SYSTEM', NULL, NULL); diff --git a/DB-DDL/maria/dml/tb_cd_group.sql b/DB-DDL/maria/dml/tb_cd_group.sql index fd478ea..718c3f6 100644 --- a/DB-DDL/maria/dml/tb_cd_group.sql +++ b/DB-DDL/maria/dml/tb_cd_group.sql @@ -3,7 +3,7 @@ INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, R INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ORG_CD', '조직', '조직을 나타내는 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER_STATUS_CD', '사용자 상태', '사용자의 상태 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); --- 신규 코드그룹 추가 (이슈: 적발방법/지목/지종/행정동/소유자구분/지역구분/단속처리상태/단속사진구분/이행업무구분/이행대상자구분/기초공사구분/가감산율구분) +-- 신규 코드그룹 추가 (이슈: 적발방법/지목/지종/행정동/소유자구분/지역구분/단속처리상태/단속사진구분/이행업무구분/이행대상자구분/기초공사구분/가감산율구분/조치처리상태) -- 중요: 기존 라인 보존, 맨 하단에 추가 (한글 주석) INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DSCL_MTHD_CD', '적발 방법', '적발(인지) 방법 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('LDCG_CD', '지목', '토지 대표 지목 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); @@ -16,4 +16,5 @@ INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, R INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('IMPLT_TASK_SE_CD', '이행 업무 구분', '이행 업무 구분 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('IMPLT_TRPR_SE_CD', '이행 대상자 구분', '이행 대상자 구분 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BSCS_CSTRN_SE_CD', '기초공사 구분', '기초 공사 구분 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); -INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ADSBMTN_RT_SE_CD', '가감산율 구분', '가감산율 구분 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); \ No newline at end of file +INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ADSBMTN_RT_SE_CD', '가감산율 구분', '가감산율 구분 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); +INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ACTN_PRCS_STTS_CD', '조치 처리 상태', '조치 처리 상태 코드', 'Y', NOW(), 'SYSTEM', NULL, NULL); From 9e4144c1c2fbe8eda300b5a9a08d8b1672dfb0ff Mon Sep 17 00:00:00 2001 From: kjh Date: Thu, 25 Sep 2025 16:17:47 +0900 Subject: [PATCH 10/12] =?UTF-8?q?=EC=A1=B0=EC=B9=98=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A1=B0=EC=B9=98=20=EA=B4=80=EB=A0=A8=20=EC=BB=AC=EB=9F=BC?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=B6=94=EA=B0=80(?= =?UTF-8?q?=ED=96=89=EC=9C=84=20=EC=A0=95=EB=B3=B4,=20=EB=8B=A8=EC=86=8D?= =?UTF-8?q?=20=EC=82=AC=EC=A7=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DB-DDL/maria/ddl/ibmsdb/tb_act_info.sql | 3 +++ DB-DDL/maria/ddl/ibmsdb/tb_actn_info.sql | 20 ++++++++++++++++++++ DB-DDL/maria/ddl/ibmsdb/tb_crdn_photo.sql | 1 + 3 files changed, 24 insertions(+) create mode 100644 DB-DDL/maria/ddl/ibmsdb/tb_actn_info.sql diff --git a/DB-DDL/maria/ddl/ibmsdb/tb_act_info.sql b/DB-DDL/maria/ddl/ibmsdb/tb_act_info.sql index 4c963e4..c51a8a5 100644 --- a/DB-DDL/maria/ddl/ibmsdb/tb_act_info.sql +++ b/DB-DDL/maria/ddl/ibmsdb/tb_act_info.sql @@ -17,6 +17,9 @@ create table tb_act_info VRTC decimal(10, 2) null comment '세로', AREA decimal(10, 2) null comment '면적', RMRK varchar(1000) null comment '비고', + ACTN_LAST_YMD varchar(8) null comment '조치 최종 일자', + ACTN_WHOL_AREA decimal(10, 2) null comment '조치 총 면적', + ACTN_PRCS_STTS_CD varchar(1) null comment '조치 처리 상태 코드', REG_DT datetime null comment '등록 일시', RGTR varchar(11) null comment '등록자', MDFCN_DT datetime null comment '수정 일시', diff --git a/DB-DDL/maria/ddl/ibmsdb/tb_actn_info.sql b/DB-DDL/maria/ddl/ibmsdb/tb_actn_info.sql new file mode 100644 index 0000000..7ea974b --- /dev/null +++ b/DB-DDL/maria/ddl/ibmsdb/tb_actn_info.sql @@ -0,0 +1,20 @@ +create table tb_actn_info +( + ACTN_INFO_ID varchar(10) not null comment '조치 정보 ID' + primary key, + SGG_CD varchar(5) not null comment '시군구 코드', + CRDN_YR char(4) null comment '단속 연도', + CRDN_NO varchar(6) null comment '단속 번호', + ACT_INFO_ID varchar(10) not null comment '행위 정보 ID', + ACTN_YMD varchar(8) null comment '조치 일자', + ACTN_AREA decimal(10, 2) null comment '조치 면적', + ACTN_RMRK varchar(1000) null comment '조치 비고', + REG_DT datetime null comment '등록 일시', + RGTR varchar(11) null comment '등록자', + MDFCN_DT datetime null comment '수정 일시', + MDFR varchar(11) null comment '수정자', + DEL_YN char not null comment '삭제 여부', + DEL_DT datetime null comment '삭제 일시', + DLTR varchar(11) null comment '삭제자' +) + comment '조치 정보'; diff --git a/DB-DDL/maria/ddl/ibmsdb/tb_crdn_photo.sql b/DB-DDL/maria/ddl/ibmsdb/tb_crdn_photo.sql index a003e79..0f7ecea 100644 --- a/DB-DDL/maria/ddl/ibmsdb/tb_crdn_photo.sql +++ b/DB-DDL/maria/ddl/ibmsdb/tb_crdn_photo.sql @@ -8,6 +8,7 @@ create table tb_crdn_photo CRDN_PHOTO_PATH varchar(100) null comment '단속 사진 경로', CRDN_PHOTO_NM varchar(500) null comment '단속 사진 명', CRDN_PHOTO_SE_CD char not null comment '단속 사진 구분 코드', + AACTN_INFO_ID varchar(10) null comment '조치 정보 ID'; ORGNL_PHOTO_NM varchar(500) null comment '원본 사진 명', REG_DT datetime null comment '등록 일시', RGTR varchar(11) null comment '등록자', From 2abaa33f4ed676a390d86c18554d1b74e46ee28e Mon Sep 17 00:00:00 2001 From: kjh Date: Thu, 25 Sep 2025 16:18:44 +0900 Subject: [PATCH 11/12] =?UTF-8?q?=EC=A1=B0=EC=B9=98=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=8B=9C=ED=80=80=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DB-DDL/maria/ddl/ibmsdb/seq_actn_info_id.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 DB-DDL/maria/ddl/ibmsdb/seq_actn_info_id.sql diff --git a/DB-DDL/maria/ddl/ibmsdb/seq_actn_info_id.sql b/DB-DDL/maria/ddl/ibmsdb/seq_actn_info_id.sql new file mode 100644 index 0000000..0ff73f6 --- /dev/null +++ b/DB-DDL/maria/ddl/ibmsdb/seq_actn_info_id.sql @@ -0,0 +1,7 @@ +CREATE SEQUENCE seq_actn_info_id + START WITH 1 + INCREMENT BY 1 + MINVALUE 1 + MAXVALUE 9999999999 + CACHE 1000 + NOCYCLE; From 6cdb478d3aeaa8a30061178671ab0ec2835f1bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Thu, 25 Sep 2025 17:01:23 +0900 Subject: [PATCH 12/12] =?UTF-8?q?=EB=B6=88=EB=B2=95=ED=96=89=EC=9C=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20-=20=EC=A1=B0=EC=B9=98=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EB=A1=9C=EC=A7=81=20=EC=9E=AC=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CrdnActInfoController.java | 57 ++-- .../service/CrdnActInfoService.java | 16 +- .../service/impl/CrdnActInfoServiceImpl.java | 47 ++- src/main/resources/application-dev.yml | 4 + src/main/resources/application-local.yml | 6 +- src/main/resources/application-prd.yml | 4 + src/main/resources/application.yml | 4 +- .../crdnActInfo/CrdnActInfoMapper_maria.xml | 2 +- .../crdnActInfo/CrdnPhotoMapper_maria.xml | 2 + .../crdnActInfo/crdnActInfoRegistPopup.jsp | 316 ++++++++++++------ .../webapp/resources/xit/xit-validation.js | 9 +- 11 files changed, 312 insertions(+), 155 deletions(-) diff --git a/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/controller/CrdnActInfoController.java b/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/controller/CrdnActInfoController.java index e9e052d..6029d06 100644 --- a/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/controller/CrdnActInfoController.java +++ b/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/controller/CrdnActInfoController.java @@ -111,14 +111,14 @@ public class CrdnActInfoController { // 수정 모드인 경우 기존 데이터 및 사진 목록 조회 if ("U".equals(mode) && actInfoId != null) { data = service.selectActInfoByPk(actInfoId); - // 중요한 로직 주석: 수정 모드에서 기존 등록된 사진 목록을 조회하여 화면에 표시한다. + // 중요한 로직 주석: 수정 모드에서 기존 등록된 모든 사진 목록(단속+조치)을 조회하여 화면에 표시한다. photoList = photoService.selectPhotoListByActInfoIdAndPhotoSeCd( - CrdnPhotoVO.builder().actInfoId(actInfoId).crdnPhotoSeCd("1").build()); + CrdnPhotoVO.builder().actInfoId(actInfoId).build()); // 사진구분코드 없이 전체 조회 } ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/crdnActInfo/crdnActInfoRegistPopup" + TilesConstants.POPUP); mav.addObject("data", data); - mav.addObject("photoList", photoList); + mav.addObject("crdnPhotoList", photoList); // 변수명을 JSP에서 사용하는 crdnPhotoList로 변경 mav.addObject("mode", mode); mav.addObject("crdnYr", crdnYr); mav.addObject("crdnNo", crdnNo); @@ -213,13 +213,13 @@ public class CrdnActInfoController { /** * 불법위반행위정보 등록 (파일 포함 가능, AJAX) - * 중요한 로직 주석: 행위정보 등록과 함께 사진 파일도 처리한다. 모든 로직은 service 단에서 한 트랜잭션으로 처리된다. + * 중요한 로직 주석: 행위정보 등록과 함께 단속/조치 사진 파일도 처리한다. 모든 로직은 service 단에서 한 트랜잭션으로 처리된다. * @param vo 등록할 불법위반행위정보 - * @param photoFiles 업로드할 사진 파일 목록 (선택사항) - * @param crdnPhotoSeCd 사진 구분 코드 + * @param crdnPhotoFiles 업로드할 단속 사진 파일 목록 (선택사항) + * @param actnPhotoFiles 업로드할 조치 사진 파일 목록 (선택사항) * @return 등록 결과 */ - @Operation(summary = "불법위반행위정보 등록", description = "불법위반행위정보를 등록합니다. 사진 파일도 함께 처리 가능합니다.") + @Operation(summary = "불법위반행위정보 등록", description = "불법위반행위정보를 등록합니다. 단속/조치 사진 파일도 함께 처리 가능합니다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "등록 성공"), @ApiResponse(responseCode = "500", description = "서버 오류") @@ -227,11 +227,12 @@ public class CrdnActInfoController { @PostMapping("/insert.ajax") public ResponseEntity insertAjax( @ModelAttribute CrdnActInfoVO vo, - @RequestParam(value = "photoFiles", required = false) List photoFiles, - @RequestParam(value = "crdnPhotoSeCd", required = false) String crdnPhotoSeCd) { - - log.debug("불법위반행위정보 등록 요청: {}, 파일 개수: {}", vo, - photoFiles != null ? photoFiles.size() : 0); + @RequestParam(value = "crdnPhotoFiles", required = false) List crdnPhotoFiles, + @RequestParam(value = "actnPhotoFiles", required = false) List actnPhotoFiles) { + + log.debug("불법위반행위정보 등록 요청: {}, 단속 사진 개수: {}, 조치 사진 개수: {}", + vo, crdnPhotoFiles != null ? crdnPhotoFiles.size() : 0, + actnPhotoFiles != null ? actnPhotoFiles.size() : 0); CrdnRegistAndViewVO crdnVO = new CrdnRegistAndViewVO(); @@ -243,8 +244,8 @@ public class CrdnActInfoController { vo.setRgtr(SessionUtil.getUserId()); vo.setMdfr(SessionUtil.getUserId()); - // 중요한 로직 주석: service 단에서 행위정보 등록과 사진 파일 처리를 한 트랜잭션으로 처리 - int result = service.insertActInfoWithFiles(vo, photoFiles, crdnPhotoSeCd); + // 중요한 로직 주석: service 단에서 행위정보 등록과 단속/조치 사진 파일 처리를 한 트랜잭션으로 처리 + int result = service.insertActInfoWithFiles(vo, crdnPhotoFiles, actnPhotoFiles); if (result > 0) { return ApiResponseUtil.success(MessageConstants.Common.SAVE_SUCCESS); @@ -256,13 +257,13 @@ public class CrdnActInfoController { /** * 불법위반행위정보 수정 (파일 포함 가능, AJAX) - * 중요한 로직 주석: 행위정보 수정과 함께 사진 파일도 처리한다. 모든 로직은 service 단에서 한 트랜잭션으로 처리된다. + * 중요한 로직 주석: 행위정보 수정과 함께 단속/조치 사진 파일도 처리한다. 모든 로직은 service 단에서 한 트랜잭션으로 처리된다. * @param vo 수정할 불법위반행위정보 - * @param photoFiles 업로드할 사진 파일 목록 (선택사항) - * @param crdnPhotoSeCd 사진 구분 코드 + * @param crdnPhotoFiles 업로드할 단속 사진 파일 목록 (선택사항) + * @param actnPhotoFiles 업로드할 조치 사진 파일 목록 (선택사항) * @return 수정 결과 */ - @Operation(summary = "불법위반행위정보 수정", description = "불법위반행위정보를 수정합니다. 사진 파일도 함께 처리 가능합니다.") + @Operation(summary = "불법위반행위정보 수정", description = "불법위반행위정보를 수정합니다. 단속/조치 사진 파일도 함께 처리 가능합니다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "수정 성공"), @ApiResponse(responseCode = "500", description = "서버 오류") @@ -270,17 +271,18 @@ public class CrdnActInfoController { @PostMapping("/update.ajax") public ResponseEntity updateAjax( @ModelAttribute CrdnActInfoVO vo, - @RequestParam(value = "photoFiles", required = false) List photoFiles, - @RequestParam(value = "crdnPhotoSeCd", required = false) String crdnPhotoSeCd) { - - log.debug("불법위반행위정보 수정 요청: {}, 파일 개수: {}", vo, - photoFiles != null ? photoFiles.size() : 0); + @RequestParam(value = "crdnPhotoFiles", required = false) List crdnPhotoFiles, + @RequestParam(value = "actnPhotoFiles", required = false) List actnPhotoFiles) { + + log.debug("불법위반행위정보 수정 요청: {}, 단속 사진 개수: {}, 조치 사진 개수: {}", + vo, crdnPhotoFiles != null ? crdnPhotoFiles.size() : 0, + actnPhotoFiles != null ? actnPhotoFiles.size() : 0); vo.setMdfr(SessionUtil.getUserId()); vo.setSggCd(SessionUtil.getSessionVO().getUser().getOrgCd()); // 업데이트 화면에서 신규파일 등록 시 필요 - // 중요한 로직 주석: service 단에서 행위정보 수정과 사진 파일 처리를 한 트랜잭션으로 처리 - int result = service.updateActInfoWithFiles(vo, photoFiles, crdnPhotoSeCd); + // 중요한 로직 주석: service 단에서 행위정보 수정과 단속/조치 사진 파일 처리를 한 트랜잭션으로 처리 + int result = service.updateActInfoWithFiles(vo, crdnPhotoFiles, actnPhotoFiles); if (result > 0) { return ApiResponseUtil.success(MessageConstants.Common.SAVE_SUCCESS); @@ -324,14 +326,15 @@ public class CrdnActInfoController { public String photoView( @Parameter(description = "행위정보ID") @RequestParam String actInfoId, @Parameter(description = "사진순번") @RequestParam String crdnPhotoSn, + @Parameter(description = "단속조치사진구분") @RequestParam String crdnPhotoSeCd, Model model) { - log.debug("단속 사진 보기 요청 - actInfoId: {}, crdnPhotoSn: {}", actInfoId, crdnPhotoSn); + log.debug("단속 사진 보기 요청 - actInfoId: {}, crdnPhotoSn: {}, crdnPhotoSeCd: {}", actInfoId, crdnPhotoSn, crdnPhotoSeCd); // 중요한 로직 주석: 해당 행위정보의 모든 사진 목록 조회 CrdnPhotoVO searchVO = CrdnPhotoVO.builder() .actInfoId(actInfoId) - .crdnPhotoSeCd("1") // 단속 사진 + .crdnPhotoSeCd(crdnPhotoSeCd) // 단속 사진 .build(); List photoList = photoService.selectPhotoListByActInfoIdAndPhotoSeCd(searchVO); diff --git a/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/service/CrdnActInfoService.java b/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/service/CrdnActInfoService.java index b4cd8a0..93437ed 100644 --- a/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/service/CrdnActInfoService.java +++ b/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/service/CrdnActInfoService.java @@ -27,13 +27,13 @@ public interface CrdnActInfoService { /** * 불법위반행위정보 등록 (파일 포함) - * 중요한 로직 주석: 행위정보 등록과 함께 사진 파일도 처리한다. 모든 로직은 한 트랜잭션으로 처리된다. + * 중요한 로직 주석: 행위정보 등록과 함께 단속/조치 사진 파일도 처리한다. 모든 로직은 한 트랜잭션으로 처리된다. * @param vo 등록할 불법위반행위정보 - * @param photoFiles 업로드할 사진 파일 목록 (선택사항) - * @param crdnPhotoSeCd 사진 구분 코드 + * @param crdnPhotoFiles 업로드할 단속 사진 파일 목록 (선택사항) + * @param actnPhotoFiles 업로드할 조치 사진 파일 목록 (선택사항) * @return 등록 결과 */ - int insertActInfoWithFiles(CrdnActInfoVO vo, List photoFiles, String crdnPhotoSeCd); + int insertActInfoWithFiles(CrdnActInfoVO vo, List crdnPhotoFiles, List actnPhotoFiles); /** * 불법위반행위정보 상세 조회 (PK 기준) @@ -44,13 +44,13 @@ public interface CrdnActInfoService { /** * 불법위반행위정보 수정 (파일 포함) - * 중요한 로직 주석: 행위정보 수정과 함께 사진 파일도 처리한다. 모든 로직은 한 트랜잭션으로 처리된다. + * 중요한 로직 주석: 행위정보 수정과 함께 단속/조치 사진 파일도 처리한다. 모든 로직은 한 트랜잭션으로 처리된다. * @param vo 수정할 불법위반행위정보 - * @param photoFiles 업로드할 사진 파일 목록 (선택사항) - * @param crdnPhotoSeCd 사진 구분 코드 + * @param crdnPhotoFiles 업로드할 단속 사진 파일 목록 (선택사항) + * @param actnPhotoFiles 업로드할 조치 사진 파일 목록 (선택사항) * @return 수정 결과 */ - int updateActInfoWithFiles(CrdnActInfoVO vo, List photoFiles, String crdnPhotoSeCd); + int updateActInfoWithFiles(CrdnActInfoVO vo, List crdnPhotoFiles, List actnPhotoFiles); /** * 불법위반행위정보 삭제 (논리삭제) diff --git a/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/service/impl/CrdnActInfoServiceImpl.java b/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/service/impl/CrdnActInfoServiceImpl.java index 9d62e46..f6ccb9b 100644 --- a/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/service/impl/CrdnActInfoServiceImpl.java +++ b/src/main/java/go/kr/project/crdn/crndRegistAndView/crdnActInfo/service/impl/CrdnActInfoServiceImpl.java @@ -54,9 +54,10 @@ public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements C @Override @Transactional - public int insertActInfoWithFiles(CrdnActInfoVO vo, List photoFiles, String crdnPhotoSeCd) { - log.debug("불법위반행위정보 등록 (파일 포함): {}, 파일 개수: {}", vo, - photoFiles != null ? photoFiles.size() : 0); + public int insertActInfoWithFiles(CrdnActInfoVO vo, List crdnPhotoFiles, List actnPhotoFiles) { + log.debug("불법위반행위정보 등록 (파일 포함): {}, 단속 사진 개수: {}, 조치 사진 개수: {}", + vo, crdnPhotoFiles != null ? crdnPhotoFiles.size() : 0, + actnPhotoFiles != null ? actnPhotoFiles.size() : 0); try { // 중요한 로직 주석: 먼저 행위정보를 등록한다 (insertActInfo 메서드에서 actInfoId가 자동 설정됨) @@ -65,10 +66,16 @@ public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements C if (result > 0) { log.debug("행위정보 등록 완료: actInfoId={}", vo.getActInfoId()); - // 중요한 로직 주석: 파일이 있는 경우에만 사진 처리를 진행한다 - if (photoFiles != null && !photoFiles.isEmpty()) { - int photoResult = photoService.insertPhotosWithFiles(photoFiles, vo.getActInfoId(), crdnPhotoSeCd, vo); - log.debug("사진 파일 처리 완료: actInfoId={}, 등록된 사진 수={}", vo.getActInfoId(), photoResult); + // 중요한 로직 주석: 단속 사진이 있는 경우 처리 (CRDN_PHOTO_SE_CD = '1') + if (crdnPhotoFiles != null && !crdnPhotoFiles.isEmpty()) { + int crdnPhotoResult = photoService.insertPhotosWithFiles(crdnPhotoFiles, vo.getActInfoId(), "1", vo); + log.debug("단속 사진 파일 처리 완료: actInfoId={}, 등록된 단속 사진 수={}", vo.getActInfoId(), crdnPhotoResult); + } + + // 중요한 로직 주석: 조치 사진이 있는 경우 처리 (CRDN_PHOTO_SE_CD = '2') + if (actnPhotoFiles != null && !actnPhotoFiles.isEmpty()) { + int actnPhotoResult = photoService.insertPhotosWithFiles(actnPhotoFiles, vo.getActInfoId(), "2", vo); + log.debug("조치 사진 파일 처리 완료: actInfoId={}, 등록된 조치 사진 수={}", vo.getActInfoId(), actnPhotoResult); } } else { log.error("행위정보 등록 실패: {}", vo); @@ -91,9 +98,10 @@ public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements C @Override @Transactional - public int updateActInfoWithFiles(CrdnActInfoVO vo, List photoFiles, String crdnPhotoSeCd) { - log.debug("불법위반행위정보 수정 (파일 포함): {}, 파일 개수: {}", vo, - photoFiles != null ? photoFiles.size() : 0); + public int updateActInfoWithFiles(CrdnActInfoVO vo, List crdnPhotoFiles, List actnPhotoFiles) { + log.debug("불법위반행위정보 수정 (파일 포함): {}, 단속 사진 개수: {}, 조치 사진 개수: {}", + vo, crdnPhotoFiles != null ? crdnPhotoFiles.size() : 0, + actnPhotoFiles != null ? actnPhotoFiles.size() : 0); try { // 중요한 로직 주석: 먼저 행위정보를 수정한다 @@ -102,11 +110,17 @@ public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements C if (result > 0) { log.debug("행위정보 수정 완료: actInfoId={}", vo.getActInfoId()); - // 중요한 로직 주석: 새로운 파일이 있는 경우에만 사진 추가 처리를 진행한다 + // 중요한 로직 주석: 새로운 단속 사진이 있는 경우 추가 처리 (CRDN_PHOTO_SE_CD = '1') // 기존 사진의 개별 삭제는 별도의 Ajax 호출로 처리되므로 여기서는 신규 추가만 한다 - if (photoFiles != null && !photoFiles.isEmpty()) { - int photoResult = photoService.insertPhotosWithFiles(photoFiles, vo.getActInfoId(), crdnPhotoSeCd, vo); - log.debug("사진 파일 추가 완료: actInfoId={}, 추가된 사진 수={}", vo.getActInfoId(), photoResult); + if (crdnPhotoFiles != null && !crdnPhotoFiles.isEmpty()) { + int crdnPhotoResult = photoService.insertPhotosWithFiles(crdnPhotoFiles, vo.getActInfoId(), "1", vo); + log.debug("단속 사진 파일 추가 완료: actInfoId={}, 추가된 단속 사진 수={}", vo.getActInfoId(), crdnPhotoResult); + } + + // 중요한 로직 주석: 새로운 조치 사진이 있는 경우 추가 처리 (CRDN_PHOTO_SE_CD = '2') + if (actnPhotoFiles != null && !actnPhotoFiles.isEmpty()) { + int actnPhotoResult = photoService.insertPhotosWithFiles(actnPhotoFiles, vo.getActInfoId(), "2", vo); + log.debug("조치 사진 파일 추가 완료: actInfoId={}, 추가된 조치 사진 수={}", vo.getActInfoId(), actnPhotoResult); } } else { log.error("행위정보 수정 실패: {}", vo); @@ -130,7 +144,10 @@ public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements C if (vo.getActInfoId() != null) { try { photoService.deletePhotosByActInfoIdAndCrdnPhotoSecd(vo.getActInfoId(), "1", vo.getDltr()); - log.debug("행위정보 관련 사진 삭제 완료: actInfoId={}", vo.getActInfoId()); + log.debug("행위정보 단속 사진 삭제 완료: actInfoId={}, crdnPhotoSeCd={}", vo.getActInfoId(), "1"); + + photoService.deletePhotosByActInfoIdAndCrdnPhotoSecd(vo.getActInfoId(), "2", vo.getDltr()); + log.debug("행위정보 조치 사진 삭제 완료: actInfoId={}, crdnPhotoSeCd={}", vo.getActInfoId(), "2"); } catch (Exception e) { log.warn("행위정보 관련 사진 삭제 중 오류 발생: actInfoId={}", vo.getActInfoId(), e); // 사진 삭제 실패해도 행위정보 삭제는 진행 diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 0c94a3f..0baaa36 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,5 +1,9 @@ # Local profile spring: + servlet: + multipart: + max-file-size: 15MB # 개별 파일 최대 크기를 15MB로 증가, multipart 를 이용시 header, type 등 정보가 붙어서 over head 가 발생할 수 있다고 함. + max-request-size: 150MB # 전체 요청 최대 크기를 150MB로 증가, multipart 를 이용시 header, type 등 정보가 붙어서 over head 가 발생할 수 있다고 함. config: activate: on-profile: dev diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 374859b..a398cf7 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,5 +1,9 @@ # Local profile spring: + servlet: + multipart: + max-file-size: 15MB # 개별 파일 최대 크기를 15MB로 증가, multipart 를 이용시 header, type 등 정보가 붙어서 over head 가 발생할 수 있다고 함. + max-request-size: 150MB # 전체 요청 최대 크기를 150MB로 증가, multipart 를 이용시 header, type 등 정보가 붙어서 over head 가 발생할 수 있다고 함. config: activate: on-profile: local @@ -94,7 +98,7 @@ file: path: d:/data/@projectName@/file max-size: 10 # 단일 파일 최대 크기 (MB) max-total-size: 100 # 총 파일 최대 크기 (MB) - max-files: 10 # 최대 파일 개수 + max-files: 20 # 최대 파일 개수 allowed-extensions: hwp,jpg,jpeg,png,gif,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,zip real-file-delete: true # 실제 파일 삭제 여부 sub-dirs: diff --git a/src/main/resources/application-prd.yml b/src/main/resources/application-prd.yml index ec70b86..68a9ce6 100644 --- a/src/main/resources/application-prd.yml +++ b/src/main/resources/application-prd.yml @@ -1,5 +1,9 @@ # Local profile spring: + servlet: + multipart: + max-file-size: 15MB # 개별 파일 최대 크기를 15MB로 증가, multipart 를 이용시 header, type 등 정보가 붙어서 over head 가 발생할 수 있다고 함. + max-request-size: 150MB # 전체 요청 최대 크기를 150MB로 증가, multipart 를 이용시 header, type 등 정보가 붙어서 over head 가 발생할 수 있다고 함. config: activate: on-profile: prd diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f5a6a40..0088dea 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,9 +7,7 @@ server: charset: UTF-8 enabled: true force: true # 서버가 지정한 인코딩(UTF-8)을 항상 강제로 적용, 클라이언트의 요청과 상관없이 서버 인코딩이 우선 - multipart: - max-file-size: 10MB - max-request-size: 50MB + Globals: DbType: maria diff --git a/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/crdnActInfo/CrdnActInfoMapper_maria.xml b/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/crdnActInfo/CrdnActInfoMapper_maria.xml index d1c7197..88189e4 100644 --- a/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/crdnActInfo/CrdnActInfoMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/crdnActInfo/CrdnActInfoMapper_maria.xml @@ -209,7 +209,7 @@ VRTC = #{vrtc}, AREA = #{area}, RMRK = #{rmrk}, - ACTN_YMD = #{actnYmd}, + ACTN_YMD = replace(#{actnYmd},'-',''), ACTN_AREA = #{actnArea}, ACTN_RMRK = #{actnRmrk}, MDFCN_DT = NOW(), diff --git a/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/crdnActInfo/CrdnPhotoMapper_maria.xml b/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/crdnActInfo/CrdnPhotoMapper_maria.xml index bc3dbfb..b1ddda1 100644 --- a/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/crdnActInfo/CrdnPhotoMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/crdn/crndRegistAndView/crdnActInfo/CrdnPhotoMapper_maria.xml @@ -25,7 +25,9 @@ FROM tb_crdn_photo p LEFT JOIN tb_cd_detail cd ON cd.CD_GROUP_ID = 'CRDN_PHOTO_SE_CD' AND cd.CD_ID = p.CRDN_PHOTO_SE_CD WHERE p.ACT_INFO_ID = #{actInfoId} + AND p.CRDN_PHOTO_SE_CD = #{crdnPhotoSeCd} + AND p.DEL_YN = 'N' ORDER BY p.CRDN_PHOTO_SN ASC diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/crdnActInfo/crdnActInfoRegistPopup.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/crdnActInfo/crdnActInfoRegistPopup.jsp index 5fe314f..0a42edc 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/crdnActInfo/crdnActInfoRegistPopup.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/crdnActInfo/crdnActInfoRegistPopup.jsp @@ -20,15 +20,15 @@