package cokr.xit.fims.chongno; import java.util.List; import java.util.Map; import javax.annotation.Resource; import cokr.xit.base.code.CommonCode; import cokr.xit.base.code.dao.CodeMapper; import cokr.xit.fims.Vhrno; import cokr.xit.fims.crdn.Crdn; import cokr.xit.fims.crdn.CrdnQuery; import cokr.xit.fims.excl.LevyExcl; import cokr.xit.fims.levy.LevyQuery; import cokr.xit.fims.levy.dao.LevyMapper; import cokr.xit.fims.mngt.service.bean.TaskProcessor; import cokr.xit.foundation.data.DataObject; public class ChongnoTaskProcessor extends TaskProcessor { private static final String TASK_SE_CD = "RVS"; public ChongnoTaskProcessor() { vltnCdGrps.set(TASK_SE_CD, "FIM090"); } @Resource(name = "levyMapper") private LevyMapper levyMapper; @Resource(name = "codeMapper") private CodeMapper codeMapper; @Override public String[] getExtraCdGrps(String taskSeCd) { if (TASK_SE_CD.equals(taskSeCd)) return new String[] {"FIM002"}; return super.getExtraCdGrps(taskSeCd); } @Override public boolean isPreImposable(String taskSeCd) { return TASK_SE_CD.equals(taskSeCd) || super.isPreImposable(taskSeCd); } @Override public int[] getBasicAmt(Crdn crdn) { String taskSeCd = crdn.getTaskSeCd(); if (TASK_SE_CD.equals(taskSeCd)) { String crdnYmd = crdn.getCrdnYmd(); String sggCd = crdn.getSggCd(); List levies = levyMapper.selectPrevLevyList( new LevyQuery() .setSchVhrno(crdn.getVhrno()) .setSchVltnCd(ifEmpty(crdn.getVltnId(), "0000002012")) .setRtpyrId(crdn.getRtpyrId()) .setDate(crdnYmd) .setSggCd(sggCd) .setTaskSeCd(taskSeCd) ); String vcount = "0" + Math.min(levies.size() + 1, 3); // 위반횟수 CrdnQuery query = new CrdnQuery() .setAplcnYmd(crdnYmd) .setAmtDcsnCdGroupId("FIM090") .setAmtDcsnCd("01") .setDtlAmtDcsnGroupId("FIM091") .setDtlAmtDcsnCd(vcount) .setTaskSeCd(taskSeCd) .setSggCd(sggCd); int amt = toInt(crdnStngMapper.selectBasicAmt(query)); DataObject taskInfo = getTaskInfo(sggCd, taskSeCd); return new int[] {amt, amt * (100 - toInt(taskInfo.get("ADVNTCE_RDCRT"))) / 100}; } return super.getBasicAmt(crdn); } @Override public String getSealCd3(String taskSeCd, String sndngSeCd) { if (TASK_SE_CD.equals(taskSeCd)) { if ("11".equals(sndngSeCd)) return "E"; } return super.getSealCd3(taskSeCd, sndngSeCd); } @Override public String getNtrisInterface(String taskSeCd) { return switch (taskSeCd) { case TASK_SE_CD -> "sntris"; default -> super.getNtrisInterface(taskSeCd); }; } @Override public String getNoticeDelivery(String taskSeCd) { if (TASK_SE_CD.equals(taskSeCd)) return "postplus"; else return super.getNoticeDelivery(taskSeCd); } private int capacity = -1; @Override public Map getExcluded(List crdns) { Map excluded = super.getExcluded(crdns); Crdn first = crdns.get(0); if (!TASK_SE_CD.equals(first.getTaskSeCd())) return excluded; if (capacity < 0) { CommonCode code = codeMapper.getCode("FIM022", "114"); capacity = toInt(notEmpty(code, "capacity").getEtc1()); } if (capacity == 0) return excluded; Vhrno vhrno = new Vhrno(); for (Crdn crdn: crdns) { if (excluded.containsKey(crdn)) continue; int vhclCpct = crdn.getVhclCpct(); if (vhclCpct == 0) { // 정원미확인 -> 초기상태 } else if (vhclCpct < capacity) // 정원미만 excluded.put(crdn, newLevyExcl(crdn, "1", "114")); else if (vhclCpct >= capacity) { boolean enforce = isTarget(vhrno, crdn); if (enforce) { excluded.put(crdn, newLevyExcl(crdn, "2", "206")); // 정원초과 -> 계도(시범운영) } else excluded.put(crdn, newLevyExcl(crdn, "1", "103")); // 부과제외(일반차량) } } return excluded; } /**차량이 승합차거나 일반 운수사업용인지 반환한다. * @param vhrno Vhrno * @param crdn 단속정보 * @return 차량이 승합차거나 일반 운수사업용인지 여부 */ private boolean isTarget(Vhrno vhrno, Crdn crdn) { return true; /* vhrno.setFullNumber(crdn.getVhrno()); return Vhrno.VAN.equals(vhrno.getVehicleType()) || vhrno.isCommercial(); */ } @Override public LevyExcl getLevyExcl(Crdn crdn) { LevyExcl excl = super.getLevyExcl(crdn); if (!TASK_SE_CD.equals(crdn.getTaskSeCd())) return excl; if (excl != null) return excl; if (capacity < 0) { CommonCode code = codeMapper.getCode("FIM022", "114"); capacity = toInt(notEmpty(code, "capacity").getEtc1()); } if (capacity == 0) return null; int vhclCpct = crdn.getVhclCpct(); if (vhclCpct == 0) // 정원미확인 -> 초기상태 return null; //newLevyExcl(crdn, "1", "115"); if (vhclCpct < capacity) // 정원미만 return newLevyExcl(crdn, "1", "114"); boolean enforce = vhclCpct >= capacity && isTarget(new Vhrno(), crdn); if (enforce) // 정원초과, 승합차, 운수사업 일반 -> 단속대상: 계도(시범운영) return newLevyExcl(crdn, "2", "206"); else return newLevyExcl(crdn, "1", "103"); // 부과제외(일반차량) } }