feat : send xml 생성 쿼리dsl 조인 한방조회로 수정

master
Kurt92 6 months ago
parent ca814fe480
commit f91b1c021e

@ -3,6 +3,9 @@ package com.worker.domain.entity;
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Entity
@Table(name = "cp_answer")
@Getter
@ -77,4 +80,15 @@ public class CpAnswer {
@Column(name = "AS_PETI_NO_C", length = 30)
private String asPetiNoC;
public void changeState(String newState) {
this.asState = newState;
}
public void changePostDtNow() {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
this.asPostDt = LocalDateTime.now().format(dtf);
}
}

@ -118,8 +118,8 @@ public class SinmungoDto {
@Data
@Builder
public static class Answers{
private List<CpAnswer> cpAnswer;
private List<CpAnswer> epAnswer;
private List<SendTarget> cpAnswer;
private List<SendTarget> epAnswer;
}
@ -131,6 +131,29 @@ public class SinmungoDto {
}
@Data
@Builder
public static class SendTarget {
private Integer mmCode;
private String asSysGubunC;
private String asState;
private String asPetiAncCodeV;
private String asJsno;
private String asJsnoM;
private String asText;
private String mmState;
private String umName;
private String umTelno;
private String umEmail;
private String sgDepCode;
private String ccDate;
private String civil_gist_v; //위반 종류
private String im_civil_abstract_l; //처리상태 내용
}
}

@ -1,5 +1,6 @@
package com.worker.conf;
package com.worker.framework.JPAConf;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManagerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
@ -52,4 +53,10 @@ public class CpDbConf {
@Qualifier("cpEntityManagerFactory") EntityManagerFactory cpEntityManagerFactory) {
return new JpaTransactionManager(cpEntityManagerFactory);
}
@Bean
@Primary
public JPAQueryFactory cpQueryFactory(@Qualifier("cpEntityManagerFactory") EntityManagerFactory emf) {
return new JPAQueryFactory(emf.createEntityManager());
}
}

@ -1,5 +1,6 @@
package com.worker.conf;
package com.worker.framework.JPAConf;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManagerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
@ -7,7 +8,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@ -48,4 +48,9 @@ public class EpDbConf {
@Qualifier("epEntityManagerFactory") EntityManagerFactory epEntityManagerFactory) {
return new JpaTransactionManager(epEntityManagerFactory);
}
@Bean
public JPAQueryFactory epQueryFactory(@Qualifier("epEntityManagerFactory") EntityManagerFactory emf) {
return new JPAQueryFactory(emf.createEntityManager());
}
}

@ -1,19 +1,19 @@
package com.worker.framework.JPAConf;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JPAConfig {
@PersistenceContext
private EntityManager em;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(em);
}
}
//package com.worker.framework.JPAConf;
//
//import com.querydsl.jpa.impl.JPAQueryFactory;
//import jakarta.persistence.EntityManager;
//import jakarta.persistence.PersistenceContext;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//@Configuration
//public class JPAConfig {
//
// @PersistenceContext
// private EntityManager em;
//
// @Bean
// public JPAQueryFactory jpaQueryFactory() {
// return new JPAQueryFactory(em);
// }
//}

@ -0,0 +1,55 @@
package com.worker.scheduler.smg.repository;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.worker.dto.SinmungoDto;
import com.worker.dto.UserInfoDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import static com.worker.domain.entity.QCpAnswer.cpAnswer;
import static com.worker.domain.entity.QCpCancel.cpCancel;
import static com.worker.domain.entity.QCpMain.cpMain;
import static com.worker.domain.entity.QCpSgg.cpSgg;
import static com.worker.domain.entity.QCpUser.cpUser;
@Repository
@RequiredArgsConstructor
public class XmlSendQueryDslRepository {
public List<SinmungoDto.Send.SendTarget> findAllByAsState(JPAQueryFactory queryFactory, String state) {
return queryFactory
.select(
Projections.fields(
SinmungoDto.Send.SendTarget.class,
cpAnswer.asSysGubunC,
cpAnswer.asState,
cpAnswer.asPetiAncCodeV,
cpAnswer.asJsno,
cpAnswer.asJsnoM,
cpAnswer.asText,
cpMain.mmCode,
cpMain.mmState,
cpUser.umName,
cpUser.umTelno,
cpUser.umEmail,
cpSgg.sgDepCode,
cpCancel.ccDate
)
)
.from(cpAnswer)
.innerJoin(cpMain).on(cpAnswer.asMmcode.eq(cpMain.mmCode))
.innerJoin(cpUser).on(cpAnswer.asReuser.eq(cpUser.umCode))
.innerJoin(cpSgg).on(cpUser.umSggcode.eq(cpSgg.sgSggCode))
.leftJoin(cpCancel).on(cpAnswer.asMmcode.eq(cpCancel.ccMmcode))
.where(cpAnswer.asState.eq(state))
.fetch();
}
}

@ -2,8 +2,6 @@ package com.worker.scheduler.smg.sechdule;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.worker.domain.repo.cp.CpAnswerRepository;
import com.worker.domain.repo.ep.EpAnswerRepository;
import com.worker.dto.SinmungoDto;
import com.worker.scheduler.smg.service.DbPolling;
import com.worker.scheduler.smg.service.XmlSend;
@ -17,7 +15,6 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
@ -35,6 +32,7 @@ public class SinmungoInOutScheduler {
// esb에이전트 xml파일 읽기
@Scheduled(fixedRate = 10 * 60 * 1000) // 10분
public void sinmungoInOutScheduler() throws IOException {
@ -105,6 +103,10 @@ public class SinmungoInOutScheduler {
xmlSend.send(setInfo, answers);
}

@ -1,5 +1,6 @@
package com.worker.scheduler.smg.service;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.worker.domain.entity.CpAnswer;
import com.worker.domain.entity.CpUser;
import com.worker.domain.repo.cp.CpAnswerRepository;
@ -8,6 +9,7 @@ import com.worker.domain.repo.ep.EpAnswerRepository;
import com.worker.domain.repo.ep.EpUserRepository;
import com.worker.dto.SinmungoDto;
import com.worker.dto.UserInfoDto;
import com.worker.scheduler.smg.repository.XmlSendQueryDslRepository;
import com.worker.util.common.commEnum.StateEnum;
import com.worker.util.fileMaker.XmlMacker;
import lombok.RequiredArgsConstructor;
@ -30,111 +32,150 @@ public class XmlSend {
private final XmlMacker xmlMacker;
private final CpAnswerRepository cpAnswerRepository;
private final EpAnswerRepository epAnswerRepository;
private final JPAQueryFactory cpQueryFactory;
private final JPAQueryFactory epQueryFactory;
private final CpUserRepository cpUserRepository;
private final EpUserRepository epUserRepository;
private final XmlSendQueryDslRepository xmlSendQueryDslRepository;
private final CpAnswerRepository cpAnswerRepository;
private final EpAnswerRepository epAnswerRepository;
// 실행 대상 답변 찾기
public SinmungoDto.Send.Answers findAnswersByStatus(String status) {
// 디비에서 as_state 1번인것 찾기
//todo: 이거 쿼리dsl로 main이랑 같이 조인하자 (메인이랑 답변이랑 mmcode가 pk이고 1대1 관계임)
//todo: xml만들때 main의 상태값에 따라 처리하는 부분 있는데 괜히 조회하지말고 한번 조회할때 같이 가져오자
// 아 병싄이냐, 이거 쿼리한방에 해결되겠구만/ reuser랑 상태값으로 전부 조인해서 조회하면 되잖아;;
return SinmungoDto.Send.Answers.builder()
.cpAnswer(cpAnswerRepository.findAllByAsState(status))
.epAnswer(epAnswerRepository.findAllByAsState(status))
.cpAnswer(xmlSendQueryDslRepository.findAllByAsState(cpQueryFactory, status))
.epAnswer(xmlSendQueryDslRepository.findAllByAsState(epQueryFactory, status))
.build();
}
//send 디렉토리에 xml 생성
public void send(SinmungoDto.SetInfo setInfo, SinmungoDto.Send.Answers answers) {
//
// List<Integer> reuser = Stream.concat(
// Optional.ofNullable(answers.getCpAnswer()).orElse(List.of()).stream(),
// Optional.ofNullable(answers.getEpAnswer()).orElse(List.of()).stream()
// )
// .map(CpAnswer::getAsReuser)
// .filter(Objects::nonNull)
// .collect(Collectors.toList());
// 대상 답변의 reuser를 순회하며 userInfo를 조회
// List<Optional<CpUser>> CpUserInfos = answers.getCpAnswer().stream()
// .map(user -> cpUserRepository.findById(Long.valueOf(user.getAsReuser())))
// .collect(Collectors.toList());
// List<Optional<CpUser>> EpUserInfos = answers.getEpAnswer().stream()
// .map(user -> epUserRepository.findById(Long.valueOf(user.getAsReuser())))
// .collect(Collectors.toList());
// 유저 정보
SinmungoDto.Send.UserInfos userInfos = findUserInfos(answers);
//
// SinmungoDto.Send.UserInfos userInfos = findUserInfos(answers);
// 두번째 파라미터에 다 있음.
log.info(userInfos.toString());
log.info(userInfos.toString());
answers.getCpAnswer().forEach(target -> {
try {
xmlMacker.writeEsbAnswerXml(target);
//여기서 바로 만들어
// main테이블 조회
//그리고 만들어진놈 mmcode로 상태 업데이트해
cpAnswerRepository.findById(target.getMmCode())
.ifPresent(entity -> {
entity.changeState("");
entity.changePostDtNow();
cpAnswerRepository.save(entity);
});
} catch (IOException e) {
throw new RuntimeException(e);
}
});
answers.getEpAnswer().forEach(target -> {
try {
xmlMacker.writeEsbAnswerXml(target);
// mmcode로 찾아서 cp_answer state 업데이트
epAnswerRepository.findById(target.getMmCode())
.ifPresent(entity -> {
entity.changeState(stateCodeByTarget(target));
entity.changePostDtNow();
cpAnswerRepository.save(entity);
});
// mm_state 별로 im_civil_abstract_l 값 업데이트
} catch (IOException e) {
throw new RuntimeException(e);
}
});
//awsers 만큼
// 위에서 조회한 정보들 조합해서 xml 생성
//String 으로 xml 만들고 그거 파라미터로 파일생성하는 매서드로 가져가
answers.getCpAnswer().forEach(cpAnswer ->
userInfos.getCpUsers().stream()
.filter(user -> Objects.equals(user.getUmCode(), cpAnswer.getAsReuser()))
.findFirst()
.ifPresent(user -> {
try {
xmlMacker.writeEsbAnswerXml(cpAnswer, user);
} catch (IOException e) {
throw new RuntimeException(e);
}
})
);
answers.getEpAnswer().forEach(epAnswer ->
userInfos.getEpUsers().stream()
.findFirst()
.filter(user -> Objects.equals(user.getUmCode(), epAnswer.getAsReuser()))
.ifPresent(user -> {
try {
xmlMacker.writeEsbAnswerXml(epAnswer, user);
} catch (IOException e) {
throw new RuntimeException(e);
}
})
);
// answers.getCpAnswer().forEach(cpAnswer ->
// userInfos.getCpUsers().stream()
// .filter(user -> Objects.equals(user.getUmCode(), cpAnswer.getAsReuser()))
// .findFirst()
// .ifPresent(user -> {
// try {
// xmlMacker.writeEsbAnswerXml(cpAnswer, user);
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// })
// );
// answers.getEpAnswer().forEach(epAnswer ->
// userInfos.getEpUsers().stream()
// .findFirst()
// .filter(user -> Objects.equals(user.getUmCode(), epAnswer.getAsReuser()))
// .ifPresent(user -> {
// try {
// xmlMacker.writeEsbAnswerXml(epAnswer, user);
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// })
// );
}
// answers 리스트에서 reuser를 통해 유저정보를 추출한다.
private SinmungoDto.Send.UserInfos findUserInfos(SinmungoDto.Send.Answers answers) {
return SinmungoDto.Send.UserInfos.builder()
.cpUsers(
answers.getCpAnswer().stream()
.map(user -> cpUserRepository.findById(Long.valueOf(user.getAsReuser())))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.collectingAndThen(
Collectors.toMap(CpUser::getUmCode, Function.identity(), (a, b) -> a),
m -> new ArrayList<>(m.values())
))
)
.epUsers(
answers.getEpAnswer().stream()
.map(user -> epUserRepository.findById(Long.valueOf(user.getAsReuser())))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.collectingAndThen(
Collectors.toMap(CpUser::getUmCode, Function.identity(), (a, b) -> a),
m -> new ArrayList<>(m.values())
))
)
.build();
// private SinmungoDto.Send.UserInfos findUserInfos(SinmungoDto.Send.Answers answers) {
//
// return SinmungoDto.Send.UserInfos.builder()
// .cpUsers(
// answers.getCpAnswer().stream()
// .map(user -> cpUserRepository.findById(Long.valueOf(user.getAsReuser())))
// .filter(Optional::isPresent)
// .map(Optional::get)
// .collect(Collectors.collectingAndThen(
// Collectors.toMap(CpUser::getUmCode, Function.identity(), (a, b) -> a),
// m -> new ArrayList<>(m.values())
// ))
// )
// .epUsers(
// answers.getEpAnswer().stream()
// .map(user -> epUserRepository.findById(Long.valueOf(user.getAsReuser())))
// .filter(Optional::isPresent)
// .map(Optional::get)
// .collect(Collectors.collectingAndThen(
// Collectors.toMap(CpUser::getUmCode, Function.identity(), (a, b) -> a),
// m -> new ArrayList<>(m.values())
// ))
// )
// .build();
//
// }
private String stateCodeByTarget(SinmungoDto.Send.SendTarget target) {
//ccDate가 빈값이면 상태값 확인
if(target.getCcDate().isEmpty()) {
//상태값이 83이나 84면
if(target.getMmState().equals(StateEnum.STATE_CD_INSTRCTION.getCode()) ||
target.getMmState().equals(StateEnum.STATE_CD_INSTRCTION_OK.getCode())) {
return StateEnum.ANSWER_STATE_OK_INSTRUCT.getCode();
} else {
return StateEnum.ANSWER_STATE_OK_POST.getCode();
}
} else {
return StateEnum.ANSWER_STATE_OK_CANCEL.getCode();
}
}

@ -11,7 +11,7 @@ public enum StateEnum {
JOB_GB_EC_JUCHA("2"), //20220114 UIJIN 전기차 주차위반 ..
// 신문고 답변
// ANSWER
ANSWER_STATE_FIRST("0"), // 접수, 초기상태
ANSWER_STATE_ANSWER_WAIT("1"), // 답변대기 사용자가 1로 변경해놓고 GPKI가 설치된 시스템에서 1인 자료가 있으면 답변등록한다.
ANSWER_STATE_ANSWER_FOR_POST("2"), // 답변대상(부과)
@ -23,7 +23,53 @@ public enum StateEnum {
ANSWER_STATE_OK_CANCEL("8"), // 처리완료(서손)
ANSWER_STATE_OK_ETC ("9"), // 처리완료(수기)
ANSWER_STATE_CANCEL_COPY("A"), // 답변 미대상 변환등록, 수기등록, 복사등록, 재등록
ANSWER_STATE_CANCEL_IGNORE("B") // 서손사유가 답변 미대상
ANSWER_STATE_CANCEL_IGNORE("B"), // 서손사유가 답변 미대상
//초기 0, 대기 1, 대상(부과) 2, 대상(계도) 3, 대상(서손) 4, 실패 5
// 완료(부과) 6, 완료(계도) 7, 완료(서손) 8, 완료(수기) 9, 미대상 A, 미대상(서손) B
// MAIN
STATE_CD_WAIT("00"), // 보류자료
STATE_CD_FIRST("01"), // 초기상태
STATE_CD_IN_ETC("02"), // 초기상태 스마트폰 단속
STATE_CD_WAIT_OWNER("11"), // 렌트카-임차인조회대상
STATE_CD_OWNER_OK("21"), // 차적조회완료
STATE_CD_RECALL_ING("31"), // 의견진술중
//STATE_CD_VTBAKNO_OK = '41'; // 가상계좌 발췌완료
STATE_CD_POST_ING("42"), // 사전통보중
STATE_CD_POST_OK("51"), // 사전통보 완료 = 부과 --부과 대기
STATE_CD_CHENAP("52"), // 독촉
STATE_CD_SEIZR_PRE("53"), // 압류예고
STATE_CD_SEIZR_FOR("54"), // 압류대상
STATE_CD_SEIZR("55"), // 압류
//STATE_CD_RECALL_NO = '61'; // 의견진술 미수용 --부과 대기
//STATE_CD_RECALL_CANCEL = '62'; // 의견진술 자진취하 --부과 대기
//STATE_CD_SUNAP_NOT = '59'; // 일부수납 --부과 대기
//STATE_CD_TO_UPSYSTEM = '61'; // 부과
//STATE_CD_TO_UPSYSTEM5 = '65'; // 압류
STATE_CD_SUNAP_OK1("71"), // 사전통보수납
STATE_CD_SUNAP_OK2("72"), // 부과수납
STATE_CD_SUNAP_OK3("73"), // 독촉수납
STATE_CD_SUNAP_OK4("74"), // 압류예정수납
STATE_CD_SUNAP_OK5("75"), // 압류수납
STATE_CD_LOSS_1("76"), // 시효결손
STATE_CD_BCANCEL("80"), // 부과취소
STATE_CD_CANCEL("81"), // 서손처리
STATE_CD_RECALL_OK("82"), // 의견진술수용
STATE_CD_INSTRCTION("83"), // 계도 2017.03.08 추가
STATE_CD_INSTRCTION_OK("84"), // 계도처리 후 계도장 출력까지 완료 2017.03.08 추가
STATE_CD_TRANSMIT("85"), // 타기관 이첩 2017.08.25 추가
STATE_CD_SUSPENSION("86"), // 운행정지처분(10일) - 화물자동차 밤샘주차에만
STATE_CD_CANCEL_DEL("91"), // 서손처리 삭제 히스토리에서만 보임
STATE_CD_RECALL_DEL("92"), // 의견진술 삭제 히스토리에서만 보임
STATE_CD_DELETE("99"); // 삭제자료
;

@ -3,6 +3,7 @@ package com.worker.util.fileMaker;
import com.worker.domain.entity.CpAnswer;
import com.worker.domain.entity.CpUser;
import com.worker.dto.SinmungoDto;
import com.worker.util.common.commEnum.StateEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -17,25 +18,25 @@ public class XmlMacker {
// 답변처리 xml
public String writeEsbAnswerXml(CpAnswer answers, CpUser userInfo) throws IOException {
public String writeEsbAnswerXml(SinmungoDto.Send.SendTarget target) throws IOException {
String xml =
"<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n" +
"<dmndinfo>\n" +
" <interface_seq_n>" + "랜덤으로 시퀀스 만드는데 랜덤으로 만들어도 됨?????" + "</interface_seq_n>\n" +
" <sys_gubun_c>" + answers.getAsSysGubunC() + "</sys_gubun_c>\n" +
" <anc_code_v>" + answers.getAsState() + "</anc_code_v>\n" +
" <sys_gubun_c>" + target.getAsSysGubunC() + "</sys_gubun_c>\n" +
" <anc_code_v>" + target.getAsState() + "</anc_code_v>\n" +
" <peti_gubun_c>" + "180" + "</peti_gubun_c>\n" +
" <peti_anc_code_v>" + answers.getAsPetiAncCodeV() + "</peti_anc_code_v>\n" +
" <peti_no_c>" + answers.getAsJsno() + "</peti_no_c>\n" +
" <civil_no_c>" + answers.getAsJsnoM() + "</civil_no_c>\n" +
" <peti_anc_code_v>" + target.getAsPetiAncCodeV() + "</peti_anc_code_v>\n" +
" <peti_no_c>" + target.getAsJsno() + "</peti_no_c>\n" +
" <civil_no_c>" + target.getAsJsnoM() + "</civil_no_c>\n" +
" <civil_gist_v>" + "이거 무슨 위반인지 로직" + "</civil_gist_v>\n" +
" <civil_abstract_l>" + "mm_state 과태료 상태" + "</civil_abstract_l>\n" +
" <civil_abstract_l>" + stateCtgyByTarget(target) + "</civil_abstract_l>\n" +
" <pcd_dept_v>" + "SG_DEPCODE??" + "</pcd_dept_v>\n" +
" <pcd_dept_nm_v>" + "SG_SGGNAME" + "</pcd_dept_nm_v>\n" +
" <duty_id_v>" + userInfo.getUmName() + "</duty_id_v>\n" +
" <pcd_email_v>" + userInfo.getUmEmail() + "</pcd_email_v>\n" +
" <pcd_tel_v>" + userInfo.getUmTelno() + "</pcd_tel_v>\n" +
" <pcd_rst_cont_l>" + answers.getAsText() + "</pcd_rst_cont_l>\n" +
" <duty_id_v>" + target.getUmName() + "</duty_id_v>\n" +
" <pcd_email_v>" + target.getUmEmail() + "</pcd_email_v>\n" +
" <pcd_tel_v>" + target.getUmTelno() + "</pcd_tel_v>\n" +
" <pcd_rst_cont_l>" + target.getAsText() + "</pcd_rst_cont_l>\n" +
" <do_reg_d>" + "현재시간 yyyymmddhhmmss" + "</do_reg_d>\n" +
" <pcd_rst_cont_attach_yn_c>" + "N" + "</pcd_rst_cont_attach_yn_c>\n" +
" <pcd_anc_code_v>" + "SG_DEPCODE??" + "</pcd_anc_code_v>\n" +
@ -70,4 +71,25 @@ public class XmlMacker {
// send 디렉토리로 파일저장
// 답변 상태의 카테고리를 리턴한다.
// date의 유무 상태값등등의 조건이 있다.
private String stateCtgyByTarget(SinmungoDto.Send.SendTarget target) {
//ccDate가 빈값이면 상태값 확인
if(target.getCcDate().isEmpty()) {
//상태값이 83이나 84면
if(target.getMmState().equals(StateEnum.STATE_CD_INSTRCTION.getCode()) ||
target.getMmState().equals(StateEnum.STATE_CD_INSTRCTION_OK.getCode())) {
return "과태료 계도";
} else {
return "과태료 부과";
}
} else {
return "과태료 미부과";
}
}
}

Loading…
Cancel
Save