로직 오류 수정 및 보완

main
박성영 6 days ago
parent 45041c36de
commit fb120ed4a5

@ -7,7 +7,7 @@ DROP SEQUENCE IF EXISTS seq_car_ffnlg_trgt_incmp_id;
-- 시퀀스 생성
CREATE SEQUENCE seq_car_ffnlg_trgt_incmp_id
START WITH 1
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 99999999999999999999;
MAXVALUE 99999999999999999;

@ -104,10 +104,10 @@ existingData.setCarRegFrmbkChgYmd(targetRecord.getChgYmd());
← 없으면 return null
3. Step4 소유자명 확인
- "상품용" 포함 → 상품용(02)
- "상품용" 미포함 → 상품용(02)
- "상품용" 포함 → 접수(01)
- "상품용" 미포함 → 접수(01)
→ 모든 조건 충족: 상품용(02) 처리
→ 모든 조건 충족: 접수(01) 처리
```
#### 결과 분기
@ -147,13 +147,13 @@ existingData.setCarRegFrmbkChgYmd(targetRecord.getChgYmd());
1. Step1 소유자명.contains("상품용") → return null (1번에서 처리됨)
!Step1 소유자명.contains("상품용") → 계속 진행
2. Step1 소유자회원번호 == Step2 소유자회원번호
동일하면 return null
2. Step1 소유자회원번호 != Step2 소유자회원번호
불일치면 return null
3. Step1 소유자회원번호 == Step3 소유자회원번호
동일하면 return null
3. Step1 소유자회원번호 != Step3 소유자회원번호
불일치면 return null
4. 법정동코드 앞 4자리 != 사용자 조직코드 앞 4자리
4. 법정동코드 앞 4자리 == 사용자 조직코드 앞 4자리
← 일치하면 return null
→ 불일치: 이첩(03) 처리
@ -205,8 +205,8 @@ existingData.setCarBscMttrInqSggNm(sggNm);
┌──────────────────────────────────────────────┐
│ 3. 이첩 (TransferOmChecker) │
│ 조건: 소유자명에 상품용 미포함 │
│ + 1단계/2단계 소유자 다름
│ + 1단계/3단계 소유자 다름
│ + 1단계/2단계 소유자 같음
│ + 1단계/3단계 소유자 같음
│ + 법정동코드 앞4자리 != 조직코드 앞4자리│
│ → 조건 충족: 이첩(03) │
└──────────────────────────────────────────────┘
@ -221,11 +221,11 @@ existingData.setCarBscMttrInqSggNm(sggNm);
### 처리상태코드 매핑
| 코드 | 상태명 | 처리 로직 | 클래스 |
|------|--------|----------|--------|
| 코드 | 상태명 | 처리 로직 | 클래스 |
|------|--------|--------------------------|--------|
| 02 | 상품용 | 부과일자 소유자가 상품용 + 명의이전(11) | `ProductUseOmChecker` |
| 02 | 상품용 | 검사유효기간종료일 이후 명의이전 존재 | `OwnerTransferOmChecker` |
| 03 | 이첩 | 소유자 변동 + 법정동코드 불일치 | `TransferOmChecker` |
| 02 | 상품용 | 검사유효기간종료일 이후 명의이전 존재 | `OwnerTransferOmChecker` |
| 03 | 이첩 | 소유자 일치 + 법정동코드 불일치 | `TransferOmChecker` |
### 미필 vs 지연 비교

@ -229,21 +229,39 @@ public class DateUtil {
}
/**
* (YYYYMMDD -> YY.M.D)
* (YYYYMMDD YYYY-MM-DD -> YY.M.D)
* : 20250903 -> 25.9.3
* : 2025-09-03 -> 25.9.3
*
* @param dateStr (yyyyMMdd )
* @param dateStr (yyyyMMdd yyyy-MM-dd )
* @return YY.M.D ,
*/
public static String formatToShortDate(String dateStr) {
if (dateStr == null || dateStr.length() != 8) {
if (dateStr == null) {
return dateStr;
}
try {
String year = dateStr.substring(2, 4); // YY
int month = Integer.parseInt(dateStr.substring(4, 6)); // M (앞의 0 제거)
int day = Integer.parseInt(dateStr.substring(6, 8)); // D (앞의 0 제거)
String trimmed = dateStr.trim();
String year, monthStr, dayStr;
if (trimmed.length() == 8) {
// YYYYMMDD 형식
year = trimmed.substring(2, 4); // YY
monthStr = trimmed.substring(4, 6); // MM
dayStr = trimmed.substring(6, 8); // DD
} else if (trimmed.length() == 10) {
// YYYY-MM-DD 형식
year = trimmed.substring(2, 4); // YY
monthStr = trimmed.substring(5, 7); // MM
dayStr = trimmed.substring(8, 10); // DD
} else {
// 그 외 형식은 원본 반환
return dateStr;
}
int month = Integer.parseInt(monthStr); // M (앞의 0 제거)
int day = Integer.parseInt(dayStr); // D (앞의 0 제거)
return year + "." + month + "." + day;
} catch (Exception e) {

@ -78,6 +78,16 @@ public class CarFfnlgTrgtIncmpController {
.build();
model.addAttribute("ffnlgTrgtSeCdList", commonCodeService.selectCodeDetailList(ffnlgTrgtSeCdSearchVO));
// 부과 기준일자 코드 조회 (공통코드)
CmmnCodeSearchVO omDayCdSearchVO = CmmnCodeSearchVO.builder()
.searchCdGroupId("OM_DAY_CD")
.searchCdId("D")
.searchUseYn("Y")
.sortColumn("SORT_ORDR")
.sortAscending(true)
.build();
model.addAttribute("omDayCdVO", commonCodeService.selectCodeDetailList(omDayCdSearchVO).get(0));
return "carInspectionPenalty/registrationOm/list" + TilesConstants.BASE;
}

@ -152,8 +152,8 @@ public class ComparisonOmRemarkBuilder {
// 여섯째 줄: 상품용 일자 (명의이전 일자와 동일)
sb.append(" - 상품용: ").append(DateUtil.formatDateString(ledgerRecord.getChgYmd())).append("\n");
// 일곱째 줄: 일수차이
sb.append("일수차이: ").append(daysBetween).append("일");
// 일곱째 줄: 일수차이, 미필은 일수차이 제외
//sb.append("일수차이: ").append(daysBetween).append("일");
return sb.toString();
}
@ -210,8 +210,8 @@ public class ComparisonOmRemarkBuilder {
// 다섯째 줄: 명의이전 일자
sb.append(" - 명의이전: ").append(DateUtil.formatDateString(ledgerRecord.getChgYmd())).append("\n");
// 일곱째 줄: 일수차이
sb.append("일수차이: ").append(daysBetween).append("일");
// 일곱째 줄: 일수차이, 미필은 일수차이 제외
// sb.append("일수차이: ").append(daysBetween).append("일");
return sb.toString();
}

@ -37,8 +37,8 @@ import java.util.List;
*
* CHG_TASK_SE_CD == "11" ()
* - 3: 4 API
* "상품용" (05), : ()
* "상품용" (04), : ()
* "상품용" : ()
* "상품용" : ()
*/
@Slf4j
@Component
@ -63,7 +63,15 @@ public class OwnerTransferOmChecker extends AbstractComparisonOmChecker {
if (inspVldPrd != null && inspVldPrd.contains("~")) {
String[] dates = inspVldPrd.split("~");
inspVldPrdStart = dates[0].trim().replace("-", "");
inspVldPrdEnd = dates.length > 1 ? dates[1].trim().replace("-", "") : null;
// 종료일 + 31일 계산
if (dates.length > 1) {
String endDateStr = dates[1].trim().replace("-", "");
LocalDate endDate = DateUtil.parseDate(endDateStr);
if (endDate != null) {
inspVldPrdEnd = DateUtil.formatLocalDate(endDate.plusDays(31), "yyyyMMdd");
}
}
}
if (inspVldPrdEnd == null) {

@ -48,7 +48,15 @@ public class ProductUseOmChecker extends AbstractComparisonOmChecker {
if (inspVldPrd != null && inspVldPrd.contains("~")) {
String[] dates = inspVldPrd.split("~");
inspVldPrdStart = dates[0].trim().replace("-", "");
inspVldPrdEnd = dates.length > 1 ? dates[1].trim().replace("-", "") : null;
// 종료일 + 31일 계산
if (dates.length > 1) {
String endDateStr = dates[1].trim().replace("-", "");
LocalDate endDate = DateUtil.parseDate(endDateStr);
if (endDate != null) {
inspVldPrdEnd = DateUtil.formatLocalDate(endDate.plusDays(31), "yyyyMMdd");
}
}
}
try {

@ -114,7 +114,7 @@ public class TransferOmChecker extends AbstractComparisonOmChecker {
log.info("[이첩-미필] 2단계 - 소유자명: {}", step2RprsOwnrNm);
// 2단계 비교: 1단계 소유자 = 2단계 소유자 동일 체크
if (step1RprsvOwnrIdecno != null && step1RprsvOwnrIdecno.equals(step2RprsvOwnrIdecno)) {
if (step1RprsvOwnrIdecno != null && !step1RprsvOwnrIdecno.equals(step2RprsvOwnrIdecno)) {
log.debug("[이첩-미필] 1단계와 2단계 소유자 동일 - 차량번호: {}, 소유자: {}", vhclno, step1RprsOwnrNm);
return null;
}
@ -139,7 +139,7 @@ public class TransferOmChecker extends AbstractComparisonOmChecker {
log.info("[이첩-미필] 3단계 - 소유자명: {}", step3RprsOwnrNm);
// 3단계 비교: 1단계 소유자 = 3단계 소유자 동일 체크
if (step1RprsvOwnrIdecno != null && step1RprsvOwnrIdecno.equals(step3RprsvOwnrIdecno)) {
if (step1RprsvOwnrIdecno != null && !step1RprsvOwnrIdecno.equals(step3RprsvOwnrIdecno)) {
log.debug("[이첩-미필] 1단계와 3단계 소유자 동일 - 차량번호: {}, 소유자: {}", vhclno, step1RprsOwnrNm);
return null;
}

@ -832,7 +832,7 @@
return;
}
if (!confirm(checkedRows.length + "건의 데이터에 대해 API를 호출하고 비교하시겠습니까?\n(미필: 부과일자 = 검사유효기간 종료일 + 145일)")) {
if (!confirm(checkedRows.length + "건의 데이터에 대해 API를 호출하고 비교하시겠습니까?\n(미필: 부과일자 = 검사유효기간 종료일 + ${omDayCdVO.cdNm})")) {
return;
}
@ -887,7 +887,7 @@
return;
}
if (!confirm("현재 검색조건의 전체 데이터에 대해 API를 호출하고 비교하시겠습니까?\n(미필: 부과일자 = 검사유효기간 종료일 + 145일)")) {
if (!confirm("현재 검색조건의 전체 데이터에 대해 API를 호출하고 비교하시겠습니까?\n(미필: 부과일자 = 검사유효기간 종료일 + ${omDayCdVO.cdNm})")) {
return;
}

Loading…
Cancel
Save