### feat: 날짜 형식 처리 로직 수정 및 검증 로직 제거

- **날짜 형식 처리 방식 변경**
  - 기존 YYYYMMDD → YYYY-MM-DD 변환 로직 제거:
    - JSP 화면, Excel 다운로드, DB 쿼리에서 날짜 변환 없이 원본 날짜 값을 그대로 사용하도록 수정.
    - `formatYmd` 및 관련 변환 메서드 제거.

- **날짜 형식 검증 로직 비활성화**
  - 입력 데이터에서 '*' 포함된 특수 형식이 있는 경우를 고려하여 날짜 검증 로직 삭제:
    - `isValidDate` 호출 제거 및 주석 처리.
    - 검사일자, 검사종료일자, 유효기간만료일자 등에 대한 검증 로직 비활성화.

- **DB 스키마 변경**
  - `tb_car_ffnlg_trgt`, `tb_car_ffnlg_trgt_incmp` 테이블:
    - `RMRK_DTL` 컬럼 타입 `MODIFY COLUMN`으로 변경.

- **MyBatis 매퍼 수정**
  - `CarFfnlgTrgtMapper_maria.xml`:
    - SELECT 구문에서 DATE_FORMAT 제거, 원본 날짜 필드 그대로 반환하도록 수정.

- **서비스 로직 개선**
  - `CarFfnlgTrgtServiceImpl`:
    - `DateTimeFormatter` 추가 및 사용하지 않는 변수를 명확히 삭제.
    - `padRightBytes`, `padLeftBytes` 호출부에서 날짜 형식 그대로 처리.

- **기타**
  - `application.yml`에서 주석 정리 및 일관성 유지.
  - 코멘트 추가 및 불필요한 변환 관련 로직 제거.
main
박성영 4 days ago
parent cadf5af5a3
commit 545832040b

@ -42,4 +42,4 @@ create table tb_car_ffnlg_trgt
ALTER TABLE tb_car_ffnlg_trgt
ADD COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세';
MODIFY COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세';

@ -38,4 +38,4 @@ create table tb_car_ffnlg_trgt_incmp
ALTER TABLE tb_car_ffnlg_trgt_incmp
ADD COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세';
MODIFY COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세';

@ -50,7 +50,8 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
// 날짜 형식 (YYYYMMDD)
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
private static final DateTimeFormatter DATE_FORMATTER_DASH = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public int selectListTotalCount(CarFfnlgTrgtVO vo) {
return mapper.selectListTotalCount(vo);
@ -200,8 +201,8 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
// 업무 처리 상태 및 등록자 설정
vo.setTaskPrcsSttsCd(TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_01_RCPT); // 01=접수
vo.setTaskPrcsYmd(LocalDate.now().format(DATE_FORMATTER));
vo.setRcptYmd(LocalDate.now().format(DATE_FORMATTER)); // 접수일자는 현재 날짜
vo.setTaskPrcsYmd(LocalDate.now().format(DATE_FORMATTER_DASH));
vo.setRcptYmd(LocalDate.now().format(DATE_FORMATTER_DASH)); // 접수일자는 현재 날짜
vo.setRgtr(rgtr);
// DB 저장
@ -282,14 +283,14 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
// 첫째줄: 고정폭 필드들 연결
String firstLine =
padRightBytes(nvl(row.getInspstnCd()), parseConfig.getFirstLineLength("inspstn-cd"), encoding) +
padRightBytes(formatYmd(row.getInspYmd(), true), parseConfig.getFirstLineLength("insp-ymd"), encoding) +
padRightBytes(row.getInspYmd(), parseConfig.getFirstLineLength("insp-ymd"), encoding) +
padRightBytes(nvl(row.getVhclno()), parseConfig.getFirstLineLength("vhclno"), encoding) +
padRightBytes(nvl(row.getOwnrNm()), parseConfig.getFirstLineLength("ownr-nm"), encoding) +
padRightBytes(nvl(row.getRrno()), parseConfig.getFirstLineLength("rrno"), encoding) +
padRightBytes(nvl(row.getCarNm()), parseConfig.getFirstLineLength("car-nm"), encoding) +
padRightBytes(nvl(row.getCarKnd()), parseConfig.getFirstLineLength("car-knd"), encoding) +
padRightBytes(nvl(row.getCarUsg()), parseConfig.getFirstLineLength("car-usg"), encoding) +
padRightBytes(formatYmd(row.getInspEndYmd(), true), parseConfig.getFirstLineLength("insp-end-ymd"), encoding) +
padRightBytes(row.getInspEndYmd(), parseConfig.getFirstLineLength("insp-end-ymd"), encoding) +
padLeftBytes(nvl(row.getDaycnt()), parseConfig.getFirstLineLength("daycnt"), encoding) +
padLeftBytes(formatAmtToManWon(row.getFfnlgAmt()), parseConfig.getFirstLineLength("ffnlg-amt"), encoding);
@ -298,9 +299,9 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
// 둘째줄: skip + 나머지 필드
String secondLine =
padRightBytes("", parseConfig.getSecondLineLength("skip"), encoding) +
padRightBytes(formatYmd(row.getLastRegYmd(), true), parseConfig.getSecondLineLength("last-reg-ymd"), encoding) +
padRightBytes(row.getLastRegYmd(), parseConfig.getSecondLineLength("last-reg-ymd"), encoding) +
padRightBytes(nvl(row.getAddr()), parseConfig.getSecondLineLength("addr"), encoding) +
padRightBytes(formatYmd(row.getVldPrdExpryYmd(), true), parseConfig.getSecondLineLength("vld-prd-expry-ymd"), encoding) +
padRightBytes(row.getVldPrdExpryYmd(), parseConfig.getSecondLineLength("vld-prd-expry-ymd"), encoding) +
padRightBytes(nvl(row.getTrdGds()), parseConfig.getSecondLineLength("trd-gds"), encoding);
sb.append(secondLine).append("\r\n");
@ -554,11 +555,12 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
String trdGds = extractByteLength(secondBytes, pos, len, encoding).trim();
log.info("[DEBUG_LOG] 매매상품(trdGds) [{}바이트, 위치 {}~끝] = [{}]", len, pos, trdGds);
// 날짜 형식 변환 (YYYY-MM-DD -> YYYYMMDD)
inspYmd = convertDateFormat(inspYmd);
inspEndYmd = convertDateFormat(inspEndYmd);
lastRegYmd = convertDateFormat(lastRegYmd);
vldPrdExpryYmd = convertDateFormat(vldPrdExpryYmd);
// 날짜에 '*' 특수문자가 붙는 경우때문에
// 날짜 형식 변환 하지않고 원본 그대로 저장 (YYYY-MM-DD -> YYYYMMDD)
//inspYmd = convertDateFormat(inspYmd);
//inspEndYmd = convertDateFormat(inspEndYmd);
//lastRegYmd = convertDateFormat(lastRegYmd);
//vldPrdExpryYmd = convertDateFormat(vldPrdExpryYmd);
log.info("[DEBUG_LOG] 날짜 변환 후 - inspYmd: [{}], inspEndYmd: [{}], lastRegYmd: [{}], vldPrdExpryYmd: [{}]",
inspYmd, inspEndYmd, lastRegYmd, vldPrdExpryYmd);
@ -693,10 +695,11 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
// 2. 검사일자 검증
if (vo.getInspYmd() == null || vo.getInspYmd().isEmpty()) {
errors.add(String.format("[데이터 %d] 검사일자가 누락되었습니다. 차량번호: %s", dataLineNumber, vhclno));
} else if (!isValidDate(vo.getInspYmd())) {
errors.add(String.format("[데이터 %d] 검사일자 형식이 올바르지 않습니다. 검사일자: %s (YYYYMMDD 형식이어야 함), 차량번호: %s",
dataLineNumber, vo.getInspYmd(), vhclno));
}
/*else if (!isValidDate(vo.getInspYmd())) {
errors.add(String.format("[데이터 %d] 검사일자 형식이 올바르지 않습니다. 검사일자: %s (YYYY-MM-DD 형식이어야 함), 차량번호: %s",
dataLineNumber, vo.getInspYmd(), vhclno));
}*/
// 3. 차량번호 검증
if (vo.getVhclno() == null || vo.getVhclno().isEmpty()) {
@ -760,21 +763,21 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
dataLineNumber, vo.getAddr().length(), vhclno));
}
// 8. 선택 필드 날짜 검증 (값이 있는 경우에만)
if (vo.getInspEndYmd() != null && !vo.getInspEndYmd().isEmpty() && !isValidDate(vo.getInspEndYmd())) {
errors.add(String.format("[데이터 %d] 검사종료일자 형식이 올바르지 않습니다. 검사종료일자: %s (YYYYMMDD 형식), 차량번호: %s",
dataLineNumber, vo.getInspEndYmd(), vhclno));
}
if (vo.getLastRegYmd() != null && !vo.getLastRegYmd().isEmpty() && !isValidDate(vo.getLastRegYmd())) {
errors.add(String.format("[데이터 %d] 최종등록일자 형식이 올바르지 않습니다. 최종등록일자: %s (YYYYMMDD 형식), 차량번호: %s",
dataLineNumber, vo.getLastRegYmd(), vhclno));
}
if (vo.getVldPrdExpryYmd() != null && !vo.getVldPrdExpryYmd().isEmpty() && !isValidDate(vo.getVldPrdExpryYmd())) {
errors.add(String.format("[데이터 %d] 유효기간만료일자 형식이 올바르지 않습니다. 유효기간만료일자: %s (YYYYMMDD 형식), 차량번호: %s",
dataLineNumber, vo.getVldPrdExpryYmd(), vhclno));
}
// 8. 선택 필드 날짜 검증 (값이 있는 경우에만), '*' 특수문자 들어간 경우때문에 일자형식 틀어짐, 제거
//if (vo.getInspEndYmd() != null && !vo.getInspEndYmd().isEmpty() && !isValidDate(vo.getInspEndYmd())) {
// errors.add(String.format("[데이터 %d] 검사종료일자 형식이 올바르지 않습니다. 검사종료일자: %s (YYYYMMDD 형식), 차량번호: %s",
// dataLineNumber, vo.getInspEndYmd(), vhclno));
//}
//
//if (vo.getLastRegYmd() != null && !vo.getLastRegYmd().isEmpty() && !isValidDate(vo.getLastRegYmd())) {
// errors.add(String.format("[데이터 %d] 최종등록일자 형식이 올바르지 않습니다. 최종등록일자: %s (YYYYMMDD 형식), 차량번호: %s",
// dataLineNumber, vo.getLastRegYmd(), vhclno));
//}
//
//if (vo.getVldPrdExpryYmd() != null && !vo.getVldPrdExpryYmd().isEmpty() && !isValidDate(vo.getVldPrdExpryYmd())) {
// errors.add(String.format("[데이터 %d] 유효기간만료일자 형식이 올바르지 않습니다. 유효기간만료일자: %s (YYYYMMDD 형식), 차량번호: %s",
// dataLineNumber, vo.getVldPrdExpryYmd(), vhclno));
//}
// 9. 일수 검증 (값이 있는 경우에만)
// 일수에 '*' 특수문자가 포함될 수 있음 (재검여부 표시용)

@ -118,7 +118,7 @@ car-ffnlg-txt-parse:
insp-end-ymd: 12 # 검사종료일자
daycnt: 4 # 일수
ffnlg-amt: 10 # 과태료금액
second-line: # 둘째줄 필드별 바이트 길이 (2바이트 기준)
second-line: # 둘째줄 필드별 바이트 길이 (2바이트 기준)
skip: 8 # 공백 (스킵)
last-reg-ymd: 12 # 최종등록일자
addr: 86 # 주소

@ -159,30 +159,30 @@
<!-- 과태료 대상 목록 엑셀 다운로드용 조회 -->
<select id="selectListForExcel" parameterType="CarFfnlgTrgtVO" resultType="CarFfnlgTrgtExcelVO">
SELECT
DATE_FORMAT(STR_TO_DATE(t.RCPT_YMD, '%Y%m%d'), '%Y-%m-%d') AS rcptYmd,
t.RCPT_YMD AS rcptYmd,
t.INSPSTN_CD AS inspstnCd,
DATE_FORMAT(STR_TO_DATE(t.INSP_YMD, '%Y%m%d'), '%Y-%m-%d') AS inspYmd,
t.INSP_YMD AS inspYmd,
t.VHCLNO AS vhclno,
t.OWNR_NM AS ownrNm,
ECL_DECRYPT(t.RRNO) AS rrno,
t.CAR_NM AS carNm,
t.CAR_KND AS carKnd,
t.CAR_USG AS carUsg,
DATE_FORMAT(STR_TO_DATE(t.INSP_END_YMD, '%Y%m%d'), '%Y-%m-%d') AS inspEndYmd,
t.INSP_END_YMD AS inspEndYmd,
t.DAYCNT AS daycnt,
t.FFNLG_AMT AS ffnlgAmt,
DATE_FORMAT(STR_TO_DATE(t.LAST_REG_YMD, '%Y%m%d'), '%Y-%m-%d') AS lastRegYmd,
t.LAST_REG_YMD AS lastRegYmd,
t.ADDR AS addr,
DATE_FORMAT(STR_TO_DATE(t.VLD_PRD_EXPRY_YMD, '%Y%m%d'), '%Y-%m-%d') AS vldPrdExpryYmd,
t.VLD_PRD_EXPRY_YMD AS vldPrdExpryYmd,
t.TRD_GDS AS trdGds,
cd.CD_NM AS taskPrcsSttsCdNm,
DATE_FORMAT(STR_TO_DATE(t.TASK_PRCS_YMD, '%Y%m%d'), '%Y-%m-%d') AS taskPrcsYmd,
t.TASK_PRCS_YMD AS taskPrcsYmd,
t.RMRK AS rmrk,
t.RMRK_DTL AS rmrkDtl,
t.CAR_BSC_MTTR_INQ_FLNM AS carBscMttrInqFlnm,
t.CAR_BSC_MTTR_INQ_SGG_NM AS carBscMttrInqSggNm,
t.CAR_REG_FRMBK_CHG_TASK_SE_NM AS carRegFrmbkChgTaskSeNm,
DATE_FORMAT(STR_TO_DATE(t.CAR_REG_FRMBK_CHG_YMD, '%Y%m%d'), '%Y-%m-%d') AS carRegFrmbkChgYmd,
t.CAR_REG_FRMBK_CHG_YMD AS carRegFrmbkChgYmd,
t.CAR_REG_FRMBK_DTL AS carRegFrmbkDtl,
DATE_FORMAT(t.REG_DT, '%Y-%m-%d %H:%i:%s') AS regDt,
u.USER_NM AS rgtrNm

@ -135,10 +135,10 @@
schTaskPrcsSttsCd.push($(this).val());
});
SEARCH_COND.schRcptYmdStart = schRcptYmdStart.replace(/-/g, '');
SEARCH_COND.schRcptYmdEnd = schRcptYmdEnd.replace(/-/g, '');
SEARCH_COND.schInspYmdStart = schInspYmdStart.replace(/-/g, '');
SEARCH_COND.schInspYmdEnd = schInspYmdEnd.replace(/-/g, '');
SEARCH_COND.schRcptYmdStart = schRcptYmdStart;
SEARCH_COND.schRcptYmdEnd = schRcptYmdEnd;
SEARCH_COND.schInspYmdStart = schInspYmdStart;
SEARCH_COND.schInspYmdEnd = schInspYmdEnd;
SEARCH_COND.schVhclno = schVhclno;
SEARCH_COND.schOwnrNm = schOwnrNm;
SEARCH_COND.schTaskPrcsSttsCd = schTaskPrcsSttsCd;
@ -359,13 +359,15 @@
},
{ header: '접수일자', name: 'rcptYmd', align: 'center', width: 100,
formatter: function(e) {
return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
//return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
return e.value;
}
},
{ header: '검사소코드', name: 'inspstnCd', align: 'center', width: 100 },
{ header: '검사일자', name: 'inspYmd', align: 'center', width: 100,
formatter: function(e) {
return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
//return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
return e.value;
}
},
{ header: '차량번호', name: 'vhclno', align: 'center', width: 100 },
@ -376,7 +378,8 @@
{ header: '자동차용도', name: 'carUsg', align: 'center', width: 100 },
{ header: '검사종료일자', name: 'inspEndYmd', align: 'center', width: 100,
formatter: function(e) {
return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
//return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
return e.value;
}
},
{ header: '일수', name: 'daycnt', align: 'right', width: 60 },
@ -387,19 +390,22 @@
},
{ header: '최종등록일자', name: 'lastRegYmd', align: 'center', width: 100,
formatter: function(e) {
return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
//return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
return e.value;
}
},
{ header: '주소', name: 'addr', align: 'left', width: 250 },
{ header: '유효기간만료일자', name: 'vldPrdExpryYmd', align: 'center', width: 120,
formatter: function(e) {
return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
//return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
return e.value;
}
},
{ header: '매매상품', name: 'trdGds', align: 'center', width: 100 },
{ header: '처리일자', name: 'taskPrcsYmd', align: 'center', width: 100,
formatter: function(e) {
return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
//return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
return e.value;
}
},
{

Loading…
Cancel
Save