From f1f8497b4bb9994ea39938a78b14b1e071a27871 Mon Sep 17 00:00:00 2001 From: mjkhan21 Date: Tue, 15 Jul 2025 14:25:31 +0900 Subject: [PATCH] =?UTF-8?q?Vhrno=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cokr/xit/fims/Vhrno.java | 204 ++++++++++++++++++ .../fims/excl/service/bean/LevyExclBean.java | 27 +-- 2 files changed, 218 insertions(+), 13 deletions(-) create mode 100644 src/main/java/cokr/xit/fims/Vhrno.java diff --git a/src/main/java/cokr/xit/fims/Vhrno.java b/src/main/java/cokr/xit/fims/Vhrno.java new file mode 100644 index 00000000..51b872dc --- /dev/null +++ b/src/main/java/cokr/xit/fims/Vhrno.java @@ -0,0 +1,204 @@ +package cokr.xit.fims; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import cokr.xit.foundation.AbstractObject; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/**자동차 등록번호 유틸리티 + * @author mjkhan + */ +@Getter +@Setter +@Accessors(chain = true) +public class Vhrno extends AbstractObject { + public static final String PASSENGER = "passenger"; + public static final String VAN = "van"; + public static final String TRUCK = "truck"; + public static final String SPECIALTY = "specialty"; + public static final String EMERGENCY = "emergency"; + public static final String UNKNOWN = "unknown"; + + private static final Pattern + newPrivate = Pattern.compile("^(\\d{2,3})([가-힣])(\\d{4})$"), + commercial = Pattern.compile("^([가-힣]{2,3})([가-힣])(\\d{4})$"), + etc = Pattern.compile("^([가-힣]{2,3})(\\d{2,3})([가-힣])(\\d{4})$"); + private static final List diplomatic = List.of("외교", "영사", "준외", "준영", "국기", "협정", "대표"); + + private String + region, + type, + usage, + number, + fullNumber; + + /**전체 등록번호를 설정하고, 지역, 차종, 용도, 번호로 구분하여 초기화한다. + * @param fullNumber 전체 등록번호 + * @return 현재 Vhrno + */ + public Vhrno setFullNumber(String fullNumber) { + region = type = usage = number = null; + this.fullNumber = fullNumber; + + Matcher matcher = newPrivate.matcher(fullNumber); + if (matcher.matches()) + return setType(matcher.group(1)).setUsage(matcher.group(2)).setNumber(matcher.group(3)); + matcher = commercial.matcher(fullNumber); + if (matcher.matches()) + return setRegion(matcher.group(1)).setUsage(matcher.group(2)).setNumber(matcher.group(3)); + matcher = etc.matcher(fullNumber); + if (matcher.matches()) + return setRegion(matcher.group(1)).setType(matcher.group(2)).setUsage(matcher.group(3)).setNumber(matcher.group(4)); + + for (String str: diplomatic) { + if (fullNumber.contains(str)) { + setUsage(str); + setNumber(fullNumber.replace(str, "").trim()); + return this; + } + } + + return this; + } + + /**차종을 반환한다. + * @return 차종 + * + */ + public String getVehicleType() { + int num = toInt(type); + if ((num >= 1 && num <= 69) || (num >= 100 && num <= 699)) + return PASSENGER; + if ((num >= 70 && num <= 79) || (num >= 700 && num <= 799)) + return VAN; + if ((num >= 80 && num <= 97) || (num >= 800 && num <= 979)) + return TRUCK; + if ((num >= 98 && num <= 99) || (num >= 980 && num <= 997)) + return SPECIALTY; + if (num >= 998 && num <= 999) + return EMERGENCY; + return UNKNOWN; + } + + /**주어진 차종의 대여사업용 차량인지 반환한다. + * @param vehicleType 차종 + * + * @return 주어진 차종의 대여사업용 차량 여부 + */ + public boolean isRental(String vehicleType) { + if (!equals(getVehicleType(), vehicleType)) return false; + + int num = toInt(type); + return switch (vehicleType) { + case PASSENGER -> num >= 100 && num <= 699; + case VAN -> num >= 700 && num <= 799; + case TRUCK -> num >= 800 && num <= 979; + case SPECIALTY -> num >= 980 && num <= 997; + default-> false; + }; + } + + /**주어진 차종의 비사업용 차량인지 반환한다. + * @param vehicleType 차종 + * + * @return 주어진 차종의 비사업용 차량 여부 + */ + public boolean isNonCommercial(String vehicleType) { + return isRental(vehicleType); + } + + /**주어진 차종의 일반사업용 차량인지 반환한다. + * @param vehicleType 차종 + * + * @return 주어진 차종의 일반사업용 차량 여부 + */ + public boolean isCommercial(String vehicleType) { + if (!equals(getVehicleType(), vehicleType)) return false; + + int num = toInt(type); + return switch (vehicleType) { + case PASSENGER -> num >= 1 && num <= 69; + case VAN -> num >= 70 && num <= 79; + case TRUCK -> num >= 80 && num <= 97; + case SPECIALTY -> num >= 98 && num <= 99; + default-> false; + }; + } + + /**용도가 비사업용인지 반환한다. + * @return 용도의 비사업용 여부 + */ + public boolean isNonCommercial() { + return !isRental() + && !isCommercial() + && !isDiplomatic(); + } + + /**용도가 대여사업용인지 반환한다. + * @return 용도의 대여사업용 여부 + */ + public boolean isRental() { + return "허하호".contains(usage); + } + + /**용도가 일반사업용인지(대여사업용 제외) 반환한다. + * @return 용도의 일반사업용 여부 + */ + public boolean isCommercial() { + return "바사아자배".contains(usage); + } + + /**외교차량 여부를 반환한다. + * @return 외교차량 여부 + */ + public boolean isDiplomatic() { + return diplomatic.contains(usage); + } + + public String describe() { + return String.format("%s => region: %s, type: %s, usage: %s, number: %s", fullNumber, region, type, usage, number); + } + + @Override + public String toString() { + return fullNumber; + } + + public static void main(String[] args) { + Vhrno vhrno = new Vhrno(); + String str = "25오1778"; + System.out.println(vhrno.setFullNumber(str).describe()); + System.out.println(vhrno.setFullNumber(str = "123가4567").describe()); + System.out.println(vhrno.setFullNumber(str = "서울바9867").describe()); + System.out.println(vhrno.setFullNumber(str = "경기32더5678").describe()); + System.out.println(vhrno.setFullNumber(str = "외교001-001").describe()); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/fims/excl/service/bean/LevyExclBean.java b/src/main/java/cokr/xit/fims/excl/service/bean/LevyExclBean.java index 60b28739..3c7d1b2d 100644 --- a/src/main/java/cokr/xit/fims/excl/service/bean/LevyExclBean.java +++ b/src/main/java/cokr/xit/fims/excl/service/bean/LevyExclBean.java @@ -214,24 +214,25 @@ public class LevyExclBean extends AbstractBean { // 삭제 대상 자료 검증 if (levyExclInfo == null) return "[F] 부과제외 자료가 조회되지 않습니다."; - if (levyExclInfo.string("LEVY_EXCL_SE_CD").equals("1") && !levyExclInfo.string("CRDN_STTS_CD").equals("81")) { // 부과제외(서손) - return "[F] 작업 중 오류가 발생하였습니다." - + "
단속 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다."; - } else if (levyExclInfo.string("LEVY_EXCL_SE_CD").equals("2") && !("83").contains(levyExclInfo.string("CRDN_STTS_CD"))) { // 계고 - return "[F] 작업 중 오류가 발생하였습니다." - + "
단속 자료의 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다."; - } else if (levyExclInfo.string("LEVY_EXCL_SE_CD").equals("3") && !levyExclInfo.string("CRDN_STTS_CD").equals("80")) { // 부과취소 - return "[F] 작업 중 오류가 발생하였습니다." - + "
단속 자료의 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다."; + + String levyExclSeCd = levyExclInfo.string("LEVY_EXCL_SE_CD"); + String crdnSttsCd = levyExclInfo.string("CRDN_STTS_CD"); + if (levyExclSeCd.equals("1") && !crdnSttsCd.equals("81")) { // 부과제외(서손) + return "[F] 단속 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다."; + } else if (levyExclSeCd.equals("2") && !("83").contains(crdnSttsCd)) { // 계고 + return "[F] 단속 자료의 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다."; + } else if (levyExclSeCd.equals("3") && !crdnSttsCd.equals("80")) { // 부과취소 + return "[F] 단속 자료의 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다."; } int rtnNocs = -1; // 처리 결과 건수 // 부과제외 구분이 부과제외(서손)일 경우 - if ("1".equals(levyExclInfo.get("LEVY_EXCL_SE_CD"))) { + String crdnId = levyExclInfo.string("CRDN_ID"); + if ("1".equals(levyExclSeCd)) { // 표지정보 확인여부가 조회미대상이면 -> 미확인 으로 if ("9".equals(levyExclInfo.get("PRK_PSBLTY_RSLT_CD"))) { // 주차 가능 결과 코드 - 9 조회 미대상 Crdn crdn = new Crdn(); - crdn.setCrdnId(levyExclInfo.string("CRDN_ID")); // 단속 ID + crdn.setCrdnId(crdnId); // 단속 ID crdn.setPrkPsbltyRsltCd("0"); // 주차 가능 결과 코드 - 0 미확인 rtnNocs = levyExclMapper.updatePrkPsbltyRsltCd(crdn); @@ -247,8 +248,8 @@ public class LevyExclBean extends AbstractBean { // 단속 상태 이력(TB_CRDN_STTS_HSTRY) 대장의 사용 여부를 "N"으로 처리하고, 단속(TB_CRDN) 대장의 단속 상태 코드를 수정한다. CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry(); - crdnSttsHstry.setCrdnId(levyExclInfo.string("CRDN_ID")); // 단속 ID - crdnSttsHstry.setCrdnSttsCd(levyExclInfo.string("CRDN_STTS_CD")); // 단속 상태 코드 + crdnSttsHstry.setCrdnId(crdnId); // 단속 ID + crdnSttsHstry.setCrdnSttsCd(crdnSttsCd); // 단속 상태 코드 crdnSttsHstry.setEtcCn(levyExcl.getDelRsn()); // 기타 내용 - 삭제 사유 crdnSttsHstry.setUseYn("N"); // 사용 여부