부과예고 수정, 삭제

이행강제금 처리 로직 추가 (IMPLT_CPSR_AMT)
dev
박성영 3 months ago
parent eace8a444e
commit caac5ee566

1
.gitignore vendored

@ -36,3 +36,4 @@ replay_pid*
/src/main/webapp/ubi4/logs/ubiserver.log.2025-09-04
/src/main/UbiService/results/
/.vscode/settings.json
/CLAUDE.md

@ -5,6 +5,7 @@ import go.kr.project.crdn.crndRegistAndView.main.model.CrdnCmpttnRt2VO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnLevyInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.model.LevyPrvntcActInfoVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -54,4 +55,39 @@ public interface CrdnLevyPrvntcMapper {
int deleteLevyInfo(CrdnLevyInfoVO vo);
/**
* ()
* @param crdnYr
* @param crdnNo
* @return
*/
int updateImpltCpsrAmt(@Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo, @Param("impltTaskSeCd") String impltTaskSeCd);
/**
* null ()
* @param crdnYr
* @param crdnNo
* @param impltTaskSeCd
* @return
*/
int updateImpltCpsrAmtToNull(@Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo, @Param("impltTaskSeCd") String impltTaskSeCd);
/**
*
* @param crdnYr
* @param crdnNo
* @return
*/
List<String> selectActInfoKeys(@Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo);
/**
*
* @param crdnYr
* @param crdnNo
* @param actInfoId ID
* @param impltTaskSeCd
* @return
*/
int countLevyInfoByActInfoId(@Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo, @Param("actInfoId") String actInfoId, @Param("impltTaskSeCd") String impltTaskSeCd);
}

@ -55,4 +55,40 @@ public interface CrdnLevyPrvntcService {
int deleteLevyInfo(CrdnLevyInfoVO vo);
/**
* ()
* @param crdnYr
* @param crdnNo
* @param impltTaskSeCd
* @return
*/
int updateImpltCpsrAmt(String crdnYr, String crdnNo, String impltTaskSeCd);
/**
* null ()
* @param crdnYr
* @param crdnNo
* @param impltTaskSeCd
* @return
*/
int updateImpltCpsrAmtToNull(String crdnYr, String crdnNo, String impltTaskSeCd);
/**
*
* @param crdnYr
* @param crdnNo
* @return
*/
List<String> selectActInfoKeys(String crdnYr, String crdnNo);
/**
*
* @param crdnYr
* @param crdnNo
* @param actInfoId ID
* @param impltTaskSeCd
* @return
*/
int countLevyInfoByActInfoId(String crdnYr, String crdnNo, String actInfoId, String impltTaskSeCd);
}

@ -83,14 +83,52 @@ public class CrdnLevyPrvntcServiceImpl extends EgovAbstractServiceImpl implement
vo.setMdfr(SessionUtil.getUserId());
vo.setLevyInfoId(crdnLevyPrvntcMapper.selectNextLevyInfoId());
return crdnLevyPrvntcMapper.insertLevyInfo(vo);
int result = crdnLevyPrvntcMapper.insertLevyInfo(vo);
// 중요로직: 부과정보 저장 후 모든 행위정보에 대한 데이터가 완료되면 부과총액을 자동 업데이트
if (result > 0) {
if (isAllLevyInfoCompleted(vo.getCrdnYr(), vo.getCrdnNo(), vo.getImpltTaskSeCd())) {
updateImpltCpsrAmt(vo.getCrdnYr(), vo.getCrdnNo(), vo.getImpltTaskSeCd());
log.debug("부과정보 등록 후 부과총액 자동 업데이트 완료 - 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
} else {
log.debug("아직 모든 행위정보에 대한 부과정보가 완료되지 않음 - 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
}
}
return result;
}
@Override
public int updateLevyInfo(CrdnLevyInfoVO vo) {
log.debug("부과정보 수정 서비스 호출: {}", vo);
vo.setMdfr(SessionUtil.getUserId());
return crdnLevyPrvntcMapper.updateLevyInfo(vo);
int result = crdnLevyPrvntcMapper.updateLevyInfo(vo);
// 중요로직: 부과정보 수정 후 모든 행위정보에 대한 데이터가 완료되면 부과총액을 자동 업데이트
if (result > 0) {
if (isAllLevyInfoCompleted(vo.getCrdnYr(), vo.getCrdnNo(), vo.getImpltTaskSeCd())) {
updateImpltCpsrAmt(vo.getCrdnYr(), vo.getCrdnNo(), vo.getImpltTaskSeCd());
log.debug("부과정보 수정 후 부과총액 자동 업데이트 완료 - 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
} else {
log.debug("아직 모든 행위정보에 대한 부과정보가 완료되지 않음 - 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
}
}
return result;
}
@Override
public int deleteLevyInfo(CrdnLevyInfoVO vo) {
log.debug("부과정보 삭제 서비스 호출: {}", vo);
int result = crdnLevyPrvntcMapper.deleteLevyInfo(vo);
// 중요로직: 부과정보 삭제 후 해당 단속의 이행강제금액을 null로 처리
if (result > 0) {
updateImpltCpsrAmtToNull(vo.getCrdnYr(), vo.getCrdnNo(), vo.getImpltTaskSeCd());
log.debug("부과정보 삭제 후 이행강제금액 null 처리 완료 - 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
}
return result;
}
@Override
@ -100,8 +138,55 @@ public class CrdnLevyPrvntcServiceImpl extends EgovAbstractServiceImpl implement
}
@Override
public int deleteLevyInfo(CrdnLevyInfoVO vo) {
return crdnLevyPrvntcMapper.deleteLevyInfo(vo);
public int updateImpltCpsrAmt(String crdnYr, String crdnNo, String impltTaskSeCd) {
log.debug("부과총액 업데이트 서비스 호출 - 단속연도: {}, 단속번호: {}", crdnYr, crdnNo);
// 중요로직: 해당 단속의 모든 부과정보의 부과총액을 합산하여 이행강제금액으로 업데이트
return crdnLevyPrvntcMapper.updateImpltCpsrAmt(crdnYr, crdnNo, impltTaskSeCd);
}
@Override
public int updateImpltCpsrAmtToNull(String crdnYr, String crdnNo, String impltTaskSeCd) {
log.debug("부과총액 null 처리 서비스 호출 - 단속연도: {}, 단속번호: {}", crdnYr, crdnNo);
// 중요로직: 해당 단속의 모든 부과정보의 이행강제금액을 null로 처리
return crdnLevyPrvntcMapper.updateImpltCpsrAmtToNull(crdnYr, crdnNo, impltTaskSeCd);
}
@Override
public List<String> selectActInfoKeys(String crdnYr, String crdnNo) {
return crdnLevyPrvntcMapper.selectActInfoKeys(crdnYr, crdnNo);
}
@Override
public int countLevyInfoByActInfoId(String crdnYr, String crdnNo, String actInfoId, String impltTaskSeCd) {
return crdnLevyPrvntcMapper.countLevyInfoByActInfoId(crdnYr, crdnNo, actInfoId, impltTaskSeCd);
}
/**
*
* @param crdnYr
* @param crdnNo
* @return
*/
private boolean isAllLevyInfoCompleted(String crdnYr, String crdnNo, String impltTaskSeCd) {
// 중요로직: 해당 단속의 모든 행위정보에 대해 부과정보가 존재하는지 확인
List<String> actInfoKeys = selectActInfoKeys(crdnYr, crdnNo);
if (actInfoKeys.isEmpty()) {
log.debug("행위정보가 없습니다 - 단속연도: {}, 단속번호: {}", crdnYr, crdnNo);
return false;
}
for (String actInfoId : actInfoKeys) {
int count = countLevyInfoByActInfoId(crdnYr, crdnNo, actInfoId, impltTaskSeCd);
if (count == 0) {
log.debug("부과정보가 없는 행위정보 발견 - 행위정보ID: {}", actInfoId);
return false;
}
}
log.debug("모든 행위정보에 대한 부과정보가 완료됨 - 단속연도: {}, 단속번호: {}, 행위정보 개수: {}",
crdnYr, crdnNo, actInfoKeys.size());
return true;
}
}

@ -325,4 +325,54 @@
DELETE FROM tb_levy_info WHERE LEVY_INFO_ID = #{levyInfoId}
</delete>
<!-- 부과총액 업데이트 (이행강제금액) -->
<update id="updateImpltCpsrAmt">
UPDATE tb_levy_info
SET IMPLT_CPSR_AMT = (
SELECT COALESCE(SUM(LEVY_WHOL_AMT), 0)
FROM tb_levy_info sub
WHERE sub.CRDN_YR = #{crdnYr}
AND sub.CRDN_NO = #{crdnNo}
AND sub.IMPLT_TASK_SE_CD = #{impltTaskSeCd}
AND sub.DEL_YN = 'N'
),
MDFCN_DT = NOW()
WHERE CRDN_YR = #{crdnYr}
AND CRDN_NO = #{crdnNo}
AND IMPLT_TASK_SE_CD = #{impltTaskSeCd}
AND DEL_YN = 'N'
</update>
<!-- 부과총액 null 처리 (이행강제금액) -->
<update id="updateImpltCpsrAmtToNull">
UPDATE tb_levy_info
SET IMPLT_CPSR_AMT = NULL,
MDFCN_DT = NOW()
WHERE CRDN_YR = #{crdnYr}
AND CRDN_NO = #{crdnNo}
AND IMPLT_TASK_SE_CD = #{impltTaskSeCd}
AND DEL_YN = 'N'
</update>
<!-- 해당 단속의 행위정보 키 목록 조회 -->
<select id="selectActInfoKeys" resultType="string">
SELECT t3.ACT_INFO_ID
FROM tb_crdn t1
INNER JOIN tb_pstn_info t2 ON t1.CRDN_YR = t2.CRDN_YR AND t1.CRDN_NO = t2.CRDN_NO AND t2.DEL_YN = 'N'
INNER JOIN tb_act_info t3 ON t2.CRDN_YR = t3.CRDN_YR AND t2.CRDN_NO = t3.CRDN_NO AND t2.PSTN_INFO_ID = t3.PSTN_INFO_ID AND t3.DEL_YN = 'N'
WHERE t1.CRDN_YR = #{crdnYr}
AND t1.CRDN_NO = #{crdnNo}
</select>
<!-- 특정 행위정보에 대한 부과정보 존재 여부 확인 -->
<select id="countLevyInfoByActInfoId" resultType="int">
SELECT COUNT(*) AS cnt
FROM tb_levy_info
WHERE CRDN_YR = #{crdnYr}
AND CRDN_NO = #{crdnNo}
AND IMPLT_TASK_SE_CD = #{impltTaskSeCd}
AND ACT_INFO_ID = #{actInfoId}
AND DEL_YN = 'N'
</select>
</mapper>

@ -268,6 +268,7 @@
impltTaskSeCd: '${impltTaskSeCd}',
impltTaskSeCdNm: '${impltTaskSeCdNm}',
levyInfoIdSelect: null,
actInfoIdSelect: null,
/**
* 그리드 관련 객체
@ -419,7 +420,35 @@
// 렌더링완료 후 check box
this.instance.on('onGridUpdated', function() {
const firstVisibleColumn = self.instance.getColumns().find(column => !column.hidden);
var allRows = self.instance.getData();
var rowKey = null;
allRows.forEach(function(row) {
if( LevyPrvntcPopup.actInfoIdSelect === null ){
rowKey = allRows[0].rowKey;
LevyPrvntcPopup.actInfoIdSelect = row.actInfoId;
}else if (LevyPrvntcPopup.actInfoIdSelect === row.actInfoId) {
rowKey = row.rowKey
}
// 2. 행 전체 선택 (파란색 배경)
self.instance.setSelectionRange({
start: [rowKey, 0],
end: [rowKey, self.instance.getColumns().length - 1]
});
// 2. 첫 번째 보이는 컬럼으로 포커스 이동 및 스크롤
self.instance.focus(rowKey, firstVisibleColumn.name, true);
});
});
this.instance.on('focusChange', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
LevyPrvntcPopup.actInfoIdSelect = rowData.actInfoId;
handleRowSelection(rowData);
}
});
/**
@ -618,12 +647,7 @@
calculateLevyAmount();
};
this.instance.on('focusChange', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
handleRowSelection(rowData);
}
});
},
@ -791,7 +815,7 @@
success: function(response) {
if (response && response.success) {
alert(response.message || '부과예고 [이행강제금 산출조사서 정보]가 성공적으로 저장되었습니다.');
LevyPrvntcPopup.grid.instance.readData();
} else {
alert(response.message || '부과예고 [이행강제금 산출조사서 정보] 저장 중 오류가 발생했습니다.');
}
@ -889,11 +913,17 @@
$.ajax({
url: url,
type: 'POST',
data: {"levyInfoId":LevyPrvntcPopup.levyInfoIdSelect},
data: {
levyInfoId:LevyPrvntcPopup.levyInfoIdSelect,
crdnYr: $('#crdnYr').val(),
crdnNo: $('#crdnNo').val(),
impltInfoId: $('#impltInfoId').val(),
impltTaskSeCd: LevyPrvntcPopup.impltTaskSeCd,
},
success: function(response) {
if (response && response.success) {
alert(response.message || '부과예고 [이행강제금 산출조사서 정보]가 성공적으로 삭제되었습니다.');
LevyPrvntcPopup.grid.instance.readData();
} else {
alert(response.message || '삭제 중 오류가 발생했습니다.');
}

Loading…
Cancel
Save