재부과 대상여부 체크 로직 및 재부과 체인이력 컬럼 추가

dev
박성영 3 months ago
parent 4bb3882cdb
commit 4bcfec38d1

@ -69,6 +69,33 @@ public class CrdnRelevyController {
return "crdn/crndRegistAndView/main/crdnRelevy/relevyPopup" + TilesConstants.POPUP;
}
/**
*
* @param crdnYr
* @param crdnNo
* @return
*/
@GetMapping("/selectRelevyCheckOne.ajax")
@Operation(summary = "당해년도 재부과 중복 체크", description = "해당 단속건이 당해년도 재부과를 이미 진행했는지 확인합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공"),
@ApiResponse(responseCode = "400", description = "잘못된 요청")
})
public ResponseEntity<?> selectRelevyCheckOne(
@Parameter(description = "단속 년도", required = true) @RequestParam String crdnYr,
@Parameter(description = "단속 번호", required = true) @RequestParam String crdnNo) {
log.debug("당해년도 재부과 중복 체크 요청: crdnYr={}, crdnNo={}", crdnYr, crdnNo);
CrdnRelevyVO searchVO = new CrdnRelevyVO();
searchVO.setCrdnYr(crdnYr);
searchVO.setCrdnNo(crdnNo);
CrdnRelevyVO relevyCheck = relevyService.selectRelevyCheckOne(searchVO);
return ApiResponseUtil.success(relevyCheck);
}
/**
* .
* @param crdnYr

@ -22,6 +22,9 @@ import java.util.List;
@Mapper
public interface CrdnRelevyMapper {
// 재부과 대상 체크
CrdnRelevyVO selectRelevyCheckOne(CrdnRelevyVO crdnRelevyVO);
// 재부과 대상정보 조회
CrdnRelevyVO selectCrdnPstnInfoOne(CrdnRelevyVO crdnRelevyVO);

@ -68,6 +68,10 @@ public class CrdnRelevyVO extends PagingVO {
private String frstCrdnYr;
/** 최초 단속 번호 */
private String frstCrdnNo;
/** 재부과 대상 단속 연도 : 어떤자료로부터 복사된건지 확인 */
private String relevyTrgtCrdnYr;
/** 재부과 대상 단속 번호 : 어떤자료로부터 복사된건지 확인 */
private String relevyTrgtCrdnNo;
/** 재부과 여부 */
private String relevyYn;
/** 가중 부과 대상 여부 */

@ -23,6 +23,14 @@ public interface CrdnRelevyService {
* */
CrdnRelevyVO selectCrdnPstnInfoOne(CrdnRelevyVO crdnRelevyVO);
/**
*
*
* @param crdnRelevyVO (crdnYr, crdnNo)
* @return VO, null
*/
CrdnRelevyVO selectRelevyCheckOne(CrdnRelevyVO crdnRelevyVO);
/**
* .
* , .

@ -64,6 +64,11 @@ public class CrdnRelevyServiceImpl implements CrdnRelevyService {
return relevyMapper.selectCrdnPstnInfoOne(crdnRelevyVO);
}
@Override
public CrdnRelevyVO selectRelevyCheckOne(CrdnRelevyVO crdnRelevyVO) {
return relevyMapper.selectRelevyCheckOne(crdnRelevyVO);
}
/**
* .
* .
@ -204,9 +209,6 @@ public class CrdnRelevyServiceImpl implements CrdnRelevyService {
}
}
// 7. 현재 진행 상태를 시정명령(30)으로 설정 및 최초단속 정보 업데이트
relevyMapper.updateCrdnStatus(relevyVO);
log.info("재부과 처리 완료: 신규 단속번호={}", newCrdnNo);
// 결과 반환

@ -3,6 +3,39 @@
<mapper namespace="go.kr.project.crdn.crndRegistAndView.main.mapper.CrdnRelevyMapper">
<!-- 해당 단속건이 당해년도 신규/재부과를 이미 진행했는지 확인 -->
<select id="selectRelevyCheckOne" parameterType="CrdnRelevyVO" resultType="CrdnRelevyVO">
/* CrdnRelevyMapper.selectRelevyCheckOne : 해당 단속건이 당해년도 신규/재부과를 이미 진행했는지 확인
1. 선택한 단속 자체가 당해년도인지 체크 (신규 등록 방지)
2. 선택한 단속의 최초 단속 정보를 찾아서, 그 최초 단속을 참조하는 당해년도 재부과가 있는지 체크
*/
SELECT
CRDN_YR,
CRDN_NO,
FRST_CRDN_YR,
FRST_CRDN_NO
FROM tb_crdn
WHERE (
/* 케이스1: 선택한 단속 자체가 당해년도인 경우 */
(CRDN_YR = #{crdnYr} AND CRDN_NO = #{crdnNo} AND CRDN_YR = YEAR(NOW()))
OR
/* 케이스2: 선택한 단속의 최초 단속을 참조하는 당해년도 재부과가 있는 경우 */
(
FRST_CRDN_YR = COALESCE(
(SELECT FRST_CRDN_YR FROM tb_crdn WHERE CRDN_YR = #{crdnYr} AND CRDN_NO = #{crdnNo}),
#{crdnYr}
)
AND FRST_CRDN_NO = COALESCE(
(SELECT FRST_CRDN_NO FROM tb_crdn WHERE CRDN_YR = #{crdnYr} AND CRDN_NO = #{crdnNo}),
#{crdnNo}
)
AND CRDN_YR = YEAR(NOW())
)
)
AND DEL_YN = 'N'
LIMIT 1
</select>
<!-- 단속-위치정보 단건 조회 -->
<select id="selectCrdnPstnInfoOne" parameterType="CrdnRelevyVO" resultType="CrdnRelevyVO">
/* CrdnRelevyMapper.selectCrdnPstnInfoOne : 단속-위치정보 단건 조회 */
@ -86,6 +119,8 @@
RMRK, /* 비고 - 재부과 사유 추가 */
FRST_CRDN_YR, /* 최초 단속 연도 - 원본 단속 연도 */
FRST_CRDN_NO, /* 최초 단속 번호 - 원본 단속 번호 */
RELEVY_TRGT_CRDN_YR, /* 재부과 대상 단속 연도 */
RELEVY_TRGT_CRDN_NO, /* 재부과 대상 단속 번호 */
RELEVY_YN, /* 재부과 여부 - 'Y' */
AGRVTN_LEVY_TRGT_YN, /* 가중 부과 대상 여부 */
CRDN_PRCS_STTS_CD, /* 단속 처리 상태 코드 - 30 (시정명령) */
@ -103,8 +138,10 @@
DSCL_YMD,
EXMNR,
#{relevyRsn},
#{srcCrdnYr}, /* 원본 단속 연도 */
#{srcCrdnNo}, /* 원본 단속 번호 */
COALESCE(FRST_CRDN_YR, #{srcCrdnYr}), /* 최초 단속 연도: 원본의 FRST가 있으면 사용, 없으면 원본이 최초 */
COALESCE(FRST_CRDN_NO, #{srcCrdnNo}), /* 최초 단속 번호: 원본의 FRST가 있으면 사용, 없으면 원본이 최초 */
#{srcCrdnYr}, /* 재부과 대상 단속 연도 : 어떤자료로부터 복사된건지 확인 */
#{srcCrdnNo}, /* 재부과 대상 단속 번호 : 어떤자료로부터 복사된건지 확인 */
'Y', /* 재부과 여부 */
AGRVTN_LEVY_TRGT_YN,
'30', /* 시정명령 상태 */
@ -238,20 +275,6 @@
</select>
<!-- 단속 상태 업데이트 -->
<update id="updateCrdnStatus" parameterType="CrdnRelevyVO">
/* CrdnRelevyMapper.updateCrdnStatus : 단속 상태 업데이트 */
UPDATE tb_crdn
SET CRDN_PRCS_STTS_CD = '30', /* 시정명령 */
FRST_CRDN_YR = #{srcCrdnYr}, /* 최초 단속 연도 */
FRST_CRDN_NO = #{srcCrdnNo}, /* 최초 단속 번호 */
RELEVY_YN = 'Y' /* 재부과 여부 */
WHERE CRDN_YR = #{newCrdnYr}
AND CRDN_NO = #{newCrdnNo}
AND DEL_YN = 'N'
</update>
<!-- ============================================================ -->
<!-- for문 중첩 방식을 위한 단건 조회/등록 쿼리들 -->
<!-- ============================================================ -->

@ -533,10 +533,26 @@
* @param crdnNo 단속 번호
*/
openRelevyPopup: function(crdnYr, crdnNo) {
var url = '<c:url value="/crdn/crndRegistAndView/crdnRelevy/relevyPopup.do"/>?mode=C' +
'&srcCrdnYr=' + encodeURIComponent(crdnYr) +
'&srcCrdnNo=' + encodeURIComponent(crdnNo);
openPopup(url, 1200, 490, 'relevyPopup');
var self = this;
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnRelevy/selectRelevyCheckOne.ajax"/>',
type: 'GET',
data: {
crdnYr: crdnYr,
crdnNo: crdnNo
},
success: function(response) {
if (response && response.success && response.data) {
alert('단속년도(' + response.data.crdnYr + '), 단속번호(' + response.data.crdnNo + ')로 이미 등록된 신규/재부과 자료가 있습니다.');
return;
} else {
var url = '<c:url value="/crdn/crndRegistAndView/crdnRelevy/relevyPopup.do"/>?mode=C' +
'&srcCrdnYr=' + encodeURIComponent(crdnYr) +
'&srcCrdnNo=' + encodeURIComponent(crdnNo);
openPopup(url, 1200, 490, 'relevyPopup');
}
}
});
},
/**

@ -136,16 +136,16 @@ var activeAjaxCount = 0;
$(document).ready(function() {
// Progress Block UI 생성
createProgressBlockUI();
console.log('[Ajax Block UI] 초기화 완료');
console.debug('[Ajax Block UI] 초기화 완료');
// activeAjaxCount 리셋 (페이지 로드 시)
activeAjaxCount = 0;
console.log('[Ajax Block UI] Ajax 카운터 초기화:', activeAjaxCount);
console.debug('[Ajax Block UI] Ajax 카운터 초기화:', activeAjaxCount);
});
// Ajax 시작 시 Progress Block UI 표시
$(document).ajaxSend(function(event, jqXHR, ajaxOptions) {
console.log('[Ajax Block UI] Ajax 시작:', ajaxOptions.url);
console.debug('[Ajax Block UI] Ajax 시작:', ajaxOptions.url);
// Block UI 제외 대상 URL 체크
if (ajaxOptions.url && ajaxOptions.url.indexOf('/system/user/duplicateCheck.ajax') !== -1) {
@ -154,7 +154,7 @@ $(document).ajaxSend(function(event, jqXHR, ajaxOptions) {
}
activeAjaxCount++;
console.log('[Ajax Block UI] 활성 Ajax 카운트 증가:', activeAjaxCount);
console.debug('[Ajax Block UI] 활성 Ajax 카운트 증가:', activeAjaxCount);
// 첫 번째 Ajax 요청일 때만 Progress Block UI 표시
if (activeAjaxCount === 1) {
@ -167,7 +167,7 @@ $(document).ajaxSend(function(event, jqXHR, ajaxOptions) {
var $overlay = $('#ajax-progress-overlay');
if ($overlay.length > 0) {
$overlay.css('display', 'flex').hide().fadeIn(200);
console.log('[Ajax Block UI] Block UI 표시 완료');
console.debug('[Ajax Block UI] Block UI 표시 완료');
} else {
console.error('[Ajax Block UI] Block UI 요소를 찾을 수 없음');
}
@ -176,16 +176,16 @@ $(document).ajaxSend(function(event, jqXHR, ajaxOptions) {
// Ajax 완료 시 Progress Block UI 제거 (성공/실패 모든 경우)
$(document).ajaxComplete(function(event, jqXHR, ajaxOptions) {
console.log('[Ajax Block UI] Ajax 완료:', ajaxOptions.url);
console.debug('[Ajax Block UI] Ajax 완료:', ajaxOptions.url);
// Block UI 제외 대상 URL 체크 (ajaxSend와 동일한 조건으로 수정)
if (ajaxOptions.url && ajaxOptions.url.indexOf('/system/user/duplicateCheck.ajax') !== -1) {
console.log('[Ajax Block UI] 제외 대상 URL, 카운트 감소 안함');
console.debug('[Ajax Block UI] 제외 대상 URL, 카운트 감소 안함');
return;
}
activeAjaxCount--;
console.log('[Ajax Block UI] 활성 Ajax 카운트 감소:', activeAjaxCount);
console.debug('[Ajax Block UI] 활성 Ajax 카운트 감소:', activeAjaxCount);
// 모든 Ajax 요청이 완료되었을 때만 Progress Block UI 숨김
if (activeAjaxCount <= 0) {
@ -193,7 +193,7 @@ $(document).ajaxComplete(function(event, jqXHR, ajaxOptions) {
var $overlay = $('#ajax-progress-overlay');
if ($overlay.length > 0) {
$overlay.fadeOut(200);
console.log('[Ajax Block UI] Block UI 숨김 완료');
console.debug('[Ajax Block UI] Block UI 숨김 완료');
} else {
console.warn('[Ajax Block UI] Block UI 요소를 찾을 수 없어 숨길 수 없음');
}

Loading…
Cancel
Save