비교로직 재정의 진행중...

internalApi
박성영 4 weeks ago
parent 0004196d85
commit 8a469c1d1b

@ -0,0 +1,152 @@
# 자동차 과태료 비교 로직 정리
## 개요
### 중요 사항
- ⚠️ **순서가 중요합니다!**
- 조건에 걸리는 순간 다음 차량번호 비교를 진행합니다.
### 로직 변경 사항
#### 변경 전
- 하나의 API를 호출해서 비교 로직 진행
#### 변경 후
1. **기본 호출**: `TB_CAR_FFNLG_TRGT.검사일` 기준으로 API 호출 (기본정보 + 갑부정보)
2. **추가 호출**: 각 비교 로직마다 필요한 API 추가 호출
- 차량기본정보
- 갑부정보
- 기본정보 + 갑부정보
**예시**: 이첩-2의 경우, `(TB_CAR_FFNLG_TRGT.검사종료일자 + 115일)` 기준으로 차량기본정보 API 추가 호출
---
## 비교 로직 상세
### 1. 상품용 검증 [차량기본정보 필요]
#### 조건
1. `TB_CAR_FFNLG_TRGT.검사일` 기준 API 호출
2. `api.MBER_NM like '%상품용%'`
3. 갑부 상세(LedgerRecord) 리스트에서 다음 조건 확인:
```
(List.CHG_YMD between TB_CAR_FFNLG_TRGT.유효기간만료일 and TB_CAR_FFNLG_TRGT.검사종료일자)
AND
(List.CHANGE_JOB_SE_CODE = '11') -- 명의이전 코드
```
#### 처리 결과
- **TB_CAR_FFNLG_TRGT.비고**: `"[상품용] 갑부정보"`
---
### 2. 이첩-1 [차량등록원부(갑) 필요]
#### 조건
1. `TB_CAR_FFNLG_TRGT.검사일` 기준 API 호출
2. 법정동코드 불일치 검증
#### 검증 로직 (Java)
```java
/**
* 이첩 조건1: 법정동코드 불일치
* 사용본거지법정동코드 앞 4자리 != 사용자 조직코드 앞 4자리
*/
private boolean checkTransferCondition1_LegalDongMismatch(
BasicResponse.Record basicInfo,
String userId,
String vhclno
) {
String useStrnghldLegaldongCode = basicInfo.getUseStrnghldLegaldongCode();
// 법정동코드 유효성 검사
if (useStrnghldLegaldongCode == null || useStrnghldLegaldongCode.length() < 4) {
log.debug("[이첩][조건1] 법정동코드 없음. 차량번호: {}", vhclno);
return false;
}
// 사용자 정보 조회
SystemUserVO userInfo = userMapper.selectUser(userId);
if (userInfo == null || userInfo.getOrgCd() == null) {
log.debug("[이첩][조건1] 사용자 정보 없음. 사용자ID: {}", userId);
return false;
}
// 법정동코드 앞 4자리 vs 사용자 조직코드 앞 4자리 비교
String legalDong4 = useStrnghldLegaldongCode.substring(0, 4);
String userOrgCd = userInfo.getOrgCd();
String userOrg4 = userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : userOrgCd;
if (legalDong4.equals(userOrg4)) {
log.debug("[이첩][조건1] 법정동코드 일치. 차량번호: {}, 법정동: {}, 조직: {}",
vhclno, legalDong4, userOrg4);
return false;
}
log.info("[이첩][조건1] 법정동코드 불일치! 차량번호: {}, 법정동: {}, 조직: {}",
vhclno, legalDong4, userOrg4);
return true;
}
```
#### 처리 결과
- **TB_CAR_FFNLG_TRGT.비고**: `"서울시 용산구 / 이경호, 검사일사용본거지, [검사대상, 사용자 조직코드 앞 4자리 및 법정동명]"`
---
### 3. 이첩-2 [차량기본정보 필요]
#### 조건
1. `TB_CAR_FFNLG_TRGT.DAYCNT` (textFile 일수) > 115
2. **검사일 기준** API 호출
3. **(검사종료일자 + 115일) 기준** API 호출 (추가)
4. 2번 API와 3번 API의 자동차기본정보 비교
- **사용본거지법정동코드 앞 4자리**가 다를 경우
#### 처리 결과
- **TB_CAR_FFNLG_TRGT.비고**: `"전라남도 순천시 / 김정대, 115일 도래지, [2개의 API 법정동코드 및 법정동명]"`
---
## 데이터 흐름도
```
TB_CAR_FFNLG_TRGT (과태료 대상)
검사일 기준 API 호출 (기본정보 + 갑부정보)
┌─────────────┬─────────────┬─────────────┐
│ 상품용 │ 이첩-1 │ 이첩-2 │
│ 검증 로직 │ 검증 로직 │ 검증 로직 │
└─────────────┴─────────────┴─────────────┘
↓ ↓ ↓
조건 만족 시 비고 업데이트 → 다음 차량번호 처리
```
---
## 핵심 필드 매핑
| 테이블 | 필드명 | 설명 |
|--------|--------|------|
| TB_CAR_FFNLG_TRGT | 검사일 | API 호출 기준일 (기본) |
| TB_CAR_FFNLG_TRGT | 검사종료일자 | 이첩-2에서 +115일 계산에 사용 |
| TB_CAR_FFNLG_TRGT | 유효기간만료일 | 상품용 검증 기간 시작일 |
| TB_CAR_FFNLG_TRGT | DAYCNT | 일수 (이첩-2 조건) |
| TB_CAR_FFNLG_TRGT | 비고 | 검증 결과 저장 |
| API 기본정보 | MBER_NM | 회원명 (상품용 검증) |
| API 기본정보 | useStrnghldLegaldongCode | 사용본거지법정동코드 (이첩 검증) |
| API 갑부 상세 | CHG_YMD | 변경일자 (상품용 기간 검증) |
| API 갑부 상세 | CHANGE_JOB_SE_CODE | 변경작업구분코드 (명의이전: 11) |
| 사용자 정보 | OrgCd | 조직코드 (이첩-1 검증) |
---
## 주의사항
1. **순차 처리**: 각 차량번호는 조건에 걸리는 즉시 다음 차량번호로 넘어갑니다.
2. **API 호출 최적화**: 기본적으로 검사일 기준 API를 호출하고, 필요시에만 추가 호출합니다.
3. **로그 기록**: 각 검증 단계마다 상세 로그를 남겨 추적 가능하도록 합니다.
4. **에러 처리**: API 호출 실패 또는 데이터 부재 시 적절한 에러 처리가 필요합니다.

@ -0,0 +1,65 @@
* 순서 중요!!
* 조건에 걸리는 순간 다음 차량번호 비교 진행
* 현재는 하나의 api 를 호출해서 비교로직 진행 ->
수정후에는 기본적으로 TB_CAR_FFNLG_TRGT.검사일 기준 api 기본정보+갑부정보 호출
그 이후 비교 로직당 필요한 api 추가 [차량기본정보 or 갑부정보 or 기본정보+갑부정보 각각 호출]하는 형태로 변경
예)이첩-2 번은 추가로 (TB_CAR_FFNLG_TRGT.검사종료일자 + 115일) 기준 차량기본정보 api 추가 호출
-- 상품용 [차량기본정보 필요]
1. TB_CAR_FFNLG_TRGT.검사일 기준 api 호출
2. api.MBER_NM like %상품용%
3. (갑부 상세(LedgerRecord) List.CHG_YMD between TB_CAR_FFNLG_TRGT.유효기간만료일 and TB_CAR_FFNLG_TRGT.검사종료일자) and (갑부 상세 List.CHANGE_JOB_SE_CODE = '11' --명의이전 코드)
4. TB_CAR_FFNLG_TRGT 비고 : 조건에 걸린 - "[상품용] 갑부정보"
-- 이첩-1 [차량등록원부(갑) 필요]
1. TB_CAR_FFNLG_TRGT.검사일 기준 api 호출
2. 아래 로직 참조
/**
* 이첩 조건1: 법정동코드 불일치
* 사용본거지법정동코드 앞 4자리 != 사용자 조직코드 앞 4자리
*/
private boolean checkTransferCondition1_LegalDongMismatch(BasicResponse.Record basicInfo, String userId, String vhclno) {
String useStrnghldLegaldongCode = basicInfo.getUseStrnghldLegaldongCode();
// 법정동코드 유효성 검사
if (useStrnghldLegaldongCode == null || useStrnghldLegaldongCode.length() < 4) {
log.debug("[이첩][조건1] 법정동코드 없음. 차량번호: {}", vhclno);
return false;
}
// 사용자 정보 조회
SystemUserVO userInfo = userMapper.selectUser(userId);
if (userInfo == null || userInfo.getOrgCd() == null) {
log.debug("[이첩][조건1] 사용자 정보 없음. 사용자ID: {}", userId);
return false;
}
// 법정동코드 앞 4자리 vs 사용자 조직코드 앞 4자리 비교
String legalDong4 = useStrnghldLegaldongCode.substring(0, 4);
String userOrgCd = userInfo.getOrgCd();
String userOrg4 = userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : userOrgCd;
if (legalDong4.equals(userOrg4)) {
log.debug("[이첩][조건1] 법정동코드 일치. 차량번호: {}, 법정동: {}, 조직: {}",
vhclno, legalDong4, userOrg4);
return false;
}
log.info("[이첩][조건1] 법정동코드 불일치! 차량번호: {}, 법정동: {}, 조직: {}",
vhclno, legalDong4, userOrg4);
return true;
}
3. table 비고 : 조건에 걸린 - "서울시 용산구/ 이경호, 검사일사용본거지, [검사대상, 사용자 조직코드 앞 4자리 및 법정동명]"
-- 이첩-2 [차량기본정보 필요]
1. TB_CAR_FFNLG_TRGT.DAYCNT(textFile 일수) > 115
2. 검사일 기준 api 호출
3. (TB_CAR_FFNLG_TRGT.검사종료일자 + 115일) 기준 api 호출
4. 2 api<->3 api 자동차기본정보 : 사용본거지법정동코드 앞 4자리 다를경우
5. TB_CAR_FFNLG_TRGT 비고 : 조건에 걸린 - "전라남도 순천시 / 김정대, 115일 도래지, [2개의 api 법정동코드 및 법정동명]"

@ -950,9 +950,9 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
// 2. API 호출 (통합 조회)
BasicRequest apiRequest = new BasicRequest();
apiRequest.setVhrno(vhclno);
// TODO : 검사일자는 임시 주석 후, 현재일자로 변경한다.
//apiRequest.setLevyStdde(inspYmd != null ? inspYmd.replace("-", "") : "");
apiRequest.setLevyStdde(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
// TODO : 기본적으로 검사일 기준으로 api 호출
apiRequest.setLevyStdde(inspYmd != null ? inspYmd.replace("-", "") : "");
//apiRequest.setLevyStdde(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
VehicleApiResponseVO apiResponse = vehicleInfoService.getVehicleInfo(apiRequest);

Loading…
Cancel
Save