### feat: 명의이전 날짜 비교와 비고 생성 로직 개선

- **명의이전 날짜 비교 조건 추가**
  - `ProductLevyOver31Checker`, `ProductCloseWithin31Checker` 로직 수정:
    - `유효기간만료일 - 90일 <= 변경일자 <= 검사종료일자` 조건으로 비교 강화.
    - 기존 검사 종료일자와의 비교 조건을 대체.
    - 날짜 비교 로직 내 `vldPrdExpryDate`, `vldPrdExpryDateMinus90`, `inspEndDate` 변수를 추가하여 명확한 기준 설정.

- **비고 상세 생성 개선**
  - `ComparisonRemarkBuilder` 로직 확장:
    - `유효기간만료일`, `검사종료일자` 등을 비고 상세 정보로 추가.
    - 검색 조건, 날짜
main
박성영 3 days ago
parent 045c6ec816
commit bccccf3966

@ -159,11 +159,14 @@ public class ComparisonRemarkBuilder {
* @param targetChgYmd
* @param step4OwnerNm Step4 ( )
* @param daysBetween
* @param vldPrdExpryYmd
* @param inspEndYmd
* @return
*/
public static String buildProductCloseLevyRemarkDetail(String vhclno, String inspYmd,
String step1OwnerNm, String targetChgYmd,
String step4OwnerNm, long daysBetween) {
String step4OwnerNm, long daysBetween,
String vldPrdExpryYmd, String inspEndYmd) {
StringBuilder sb = new StringBuilder();
sb.append("[내사종결 - 명의이전 이전소유자 상품용 판정 - 지연]\n\n");
@ -188,7 +191,15 @@ public class ComparisonRemarkBuilder {
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) ≤ 검사일자\n");
sb.append(" · 유효기간만료일-90일 <= CHG_YMD <= 검사종료일자\n");
sb.append(" - 유효기간만료일: ").append(DateUtil.formatDateString(vldPrdExpryYmd)).append("\n");
sb.append(" - 유효기간만료일-90일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(vldPrdExpryYmd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n");
sb.append(" - 검사종료일자: ").append(DateUtil.formatDateString(inspEndYmd)).append("\n");
sb.append(" - 검색 범위: ").append(DateUtil.formatDateString(
DateUtil.parseDate(vldPrdExpryYmd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(" ~ ").append(DateUtil.formatDateString(inspEndYmd)).append("\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
@ -287,11 +298,14 @@ public class ComparisonRemarkBuilder {
* @param targetChgYmd
* @param step4OwnerNm Step4 ( )
* @param daysBetween
* @param vldPrdExpryYmd
* @param inspEndYmd
* @return
*/
public static String buildProductLevyOver31RemarkDetail(String vhclno, String inspYmd,
String step1OwnerNm, String targetChgYmd,
String step4OwnerNm, long daysBetween) {
String step4OwnerNm, long daysBetween,
String vldPrdExpryYmd, String inspEndYmd) {
StringBuilder sb = new StringBuilder();
sb.append("[날짜수정후부과 - 명의이전 이전소유자 상품용 판정 - 지연]\n\n");
@ -316,7 +330,15 @@ public class ComparisonRemarkBuilder {
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) ≤ 검사일자\n");
sb.append(" · 유효기간만료일-90일 <= CHG_YMD <= 검사종료일자\n");
sb.append(" - 유효기간만료일: ").append(DateUtil.formatDateString(vldPrdExpryYmd)).append("\n");
sb.append(" - 유효기간만료일-90일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(vldPrdExpryYmd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n");
sb.append(" - 검사종료일자: ").append(DateUtil.formatDateString(inspEndYmd)).append("\n");
sb.append(" - 검색 범위: ").append(DateUtil.formatDateString(
DateUtil.parseDate(vldPrdExpryYmd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(" ~ ").append(DateUtil.formatDateString(inspEndYmd)).append("\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");

@ -68,27 +68,27 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
return productUseChangeResult;
}
// ========== 3. 이첩 체크 ==========
String transferResult = transferCase115DayChecker.check(existingData, userOrgCd);
if (transferResult != null) {
log.info("========== 비교 로직 종료 (이첩): {} ==========", vhclno);
return transferResult;
}
// ========== 4. 내사종결 체크 - 명의이전 이전소유자 상품용, 31일 이내 ==========
// ========== 3. 내사종결 체크 - 명의이전 이전소유자 상품용, 31일 이내 ==========
String investigationClosedByProductResult = productCloseWithin31Checker.check(existingData, userOrgCd);
if (investigationClosedByProductResult != null) {
log.info("========== 비교 로직 종료 (내사종결 - 명의이전 이전소유자 상품용, 31일 이내): {} ==========", vhclno);
return investigationClosedByProductResult;
}
// ========== 5. 내사종결 체크 - 명의이전, 31일 이내 ==========
// ========== 4. 내사종결 체크 - 명의이전, 31일 이내 ==========
String investigationClosedByOwnerChangeResult = ownerCloseWithin31Checker.check(existingData, userOrgCd);
if (investigationClosedByOwnerChangeResult != null) {
log.info("========== 비교 로직 종료 (내사종결 - 명의이전, 31일 이내): {} ==========", vhclno);
return investigationClosedByOwnerChangeResult;
}
// ========== 5. 이첩 체크 ==========
String transferResult = transferCase115DayChecker.check(existingData, userOrgCd);
if (transferResult != null) {
log.info("========== 비교 로직 종료 (이첩): {} ==========", vhclno);
return transferResult;
}
// ========== 6. 날짜 수정 후 부과 체크 - 명의이전 이전소유자 상품용, 31일 초과 ==========
String dateModifiedLevyByProductResult = productLevyOver31Checker.check(existingData, userOrgCd);
if (dateModifiedLevyByProductResult != null) {

@ -129,6 +129,9 @@ public class ProductCloseWithin31Checker extends AbstractComparisonChecker {
NewLedgerResponse.Record targetRecord = null;
LocalDate latestChgDate = null;
LocalDate vldPrdExpryDate = DateUtil.parseDate(vldPrdExpryYmd);
LocalDate vldPrdExpryDateMinus90 = vldPrdExpryDate.minusDays(90);
LocalDate inspEndDate = DateUtil.parseDate(inspEndYmd);
LocalDate inspDate = DateUtil.parseDate(inspYmd);
for (NewLedgerResponse.Record record : ledgerRecords) {
@ -145,18 +148,16 @@ public class ProductCloseWithin31Checker extends AbstractComparisonChecker {
continue;
}
// 조건: CHG_YMD <= 검사일자
LocalDate inspEndDate = DateUtil.parseDate(inspYmd);
if (chgDate.isAfter(inspEndDate)) {
log.debug("[내사종결-명의이전 상품용] CHG_YMD > 검사종료일자 - 변경일자: {}, 검사종료일자: {}", chgYmd, inspEndYmd);
continue;
}
// 조건: 유효기간만료일-90일 <= CHG_YMD <= 검사종료일자
if ((chgDate.isEqual(vldPrdExpryDateMinus90) || chgDate.isAfter(vldPrdExpryDateMinus90)) &&
(chgDate.isEqual(inspEndDate) || chgDate.isBefore(inspEndDate))) {
// 가장 마지막 일자 찾기
if (latestChgDate == null || chgDate.isAfter(latestChgDate)) {
latestChgDate = chgDate;
targetRecord = record;
log.debug("[내사종결-명의이전 상품용] 조건 충족 레코드 발견 - 변경일자: {}, 변경업무: {}", chgYmd, chgTaskSeCd);
// 가장 최근 일자 선택
if (latestChgDate == null || chgDate.isAfter(latestChgDate)) {
targetRecord = record;
latestChgDate = chgDate;
log.debug("[내사종결-명의이전 상품용] 조건 충족 레코드 발견 - 변경일자: {}, 변경업무: {}", chgYmd, chgTaskSeCd);
}
}
}
@ -167,7 +168,6 @@ public class ProductCloseWithin31Checker extends AbstractComparisonChecker {
// 명의이전일자 < 검사종료일
long daysBetween = 0;
LocalDate inspEndDate = DateUtil.parseDate(inspEndYmd);
if (latestChgDate.isBefore(inspEndDate)) {
// 검사일 - 검사종료일
daysBetween = java.time.temporal.ChronoUnit.DAYS.between(inspEndDate, inspDate);
@ -227,7 +227,8 @@ public class ProductCloseWithin31Checker extends AbstractComparisonChecker {
// ========== 비고 생성 ==========
String rmrk = ComparisonRemarkBuilder.buildProductCloseRemark(targetRecord);
String rmrkDtl = ComparisonRemarkBuilder.buildProductCloseLevyRemarkDetail(
vhclno, inspYmd, step1OwnerName, targetChgYmd, step4OwnerName, daysBetween);
vhclno, inspYmd, step1OwnerName, targetChgYmd, step4OwnerName, daysBetween,
vldPrdExpryYmd, inspEndYmd);
// ========== DB 업데이트 ==========
existingData.setCarBassMatterInqireId(step1Response.getGeneratedId());

@ -129,6 +129,9 @@ public class ProductLevyOver31Checker extends AbstractComparisonChecker {
NewLedgerResponse.Record targetRecord = null;
LocalDate latestChgDate = null;
LocalDate vldPrdExpryDate = DateUtil.parseDate(vldPrdExpryYmd);
LocalDate vldPrdExpryDateMinus90 = vldPrdExpryDate.minusDays(90);
LocalDate inspEndDate = DateUtil.parseDate(inspEndYmd);
LocalDate inspDate = DateUtil.parseDate(inspYmd);
for (NewLedgerResponse.Record record : ledgerRecords) {
@ -145,18 +148,16 @@ public class ProductLevyOver31Checker extends AbstractComparisonChecker {
continue;
}
// 조건: CHG_YMD <= 검사일자
LocalDate inspEndDate = DateUtil.parseDate(inspYmd);
if (chgDate.isAfter(inspEndDate)) {
log.debug("[날짜수정후부과-명의이전 상품용] CHG_YMD > 검사종료일자 - 변경일자: {}, 검사종료일자: {}", chgYmd, inspEndYmd);
continue;
}
// 조건: 유효기간만료일-90일 <= CHG_YMD <= 검사종료일자
if ((chgDate.isEqual(vldPrdExpryDateMinus90) || chgDate.isAfter(vldPrdExpryDateMinus90)) &&
(chgDate.isEqual(inspEndDate) || chgDate.isBefore(inspEndDate))) {
// 가장 마지막 일자 찾기
if (latestChgDate == null || chgDate.isAfter(latestChgDate)) {
latestChgDate = chgDate;
targetRecord = record;
log.debug("[날짜수정후부과-명의이전 상품용] 조건 충족 레코드 발견 - 변경일자: {}, 변경업무: {}", chgYmd, chgTaskSeCd);
// 가장 최근 일자 선택
if (latestChgDate == null || chgDate.isAfter(latestChgDate)) {
targetRecord = record;
latestChgDate = chgDate;
log.debug("[날짜수정후부과-명의이전 상품용] 조건 충족 레코드 발견 - 변경일자: {}, 변경업무: {}", chgYmd, chgTaskSeCd);
}
}
}
@ -167,7 +168,6 @@ public class ProductLevyOver31Checker extends AbstractComparisonChecker {
// 명의이전일자 < 검사종료일
long daysBetween = 0;
LocalDate inspEndDate = DateUtil.parseDate(inspEndYmd);
if (latestChgDate.isBefore(inspEndDate)) {
// 검사일 - 검사종료일
daysBetween = java.time.temporal.ChronoUnit.DAYS.between(inspEndDate, inspDate);
@ -229,7 +229,8 @@ public class ProductLevyOver31Checker extends AbstractComparisonChecker {
// ========== 비고 생성 ==========
String rmrk = ComparisonRemarkBuilder.buildProductLevyRemark(targetRecord, sggNm, ownerNm);
String rmrkDtl = ComparisonRemarkBuilder.buildProductLevyOver31RemarkDetail(
vhclno, inspYmd, step1OwnerName, targetChgYmd, step4OwnerName, daysBetween);
vhclno, inspYmd, step1OwnerName, targetChgYmd, step4OwnerName, daysBetween,
vldPrdExpryYmd, inspEndYmd);
// ========== DB 업데이트 ==========
existingData.setCarBassMatterInqireId(step1Response.getGeneratedId());

Loading…
Cancel
Save