diff --git a/src/main/java/com/worker/domain/entity/CpCancel.java b/src/main/java/com/worker/domain/entity/CpCancel.java new file mode 100644 index 0000000..c87e998 --- /dev/null +++ b/src/main/java/com/worker/domain/entity/CpCancel.java @@ -0,0 +1,45 @@ +package com.worker.domain.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "cp_cancel", indexes = { + @Index(name = "CP_CANCEL_IDX1", columnList = "CC_MMCODE"), + @Index(name = "CP_CANCEL_IDX2", columnList = "CC_SGGCODE, CC_DATE") +}) +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CpCancel { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "CC_CODE") + private Long ccCode; + + @Column(name = "CC_SGGCODE", length = 5) + private String ccSggcode; + + @Column(name = "CC_MMCODE", length = 16) + private String ccMmcode; + + @Column(name = "CC_DATE", length = 8) + private String ccDate; + + @Column(name = "CC_CAUSE", length = 3) + private String ccCause; + + @Column(name = "CC_ETC", length = 1000) + private String ccEtc; + + @Column(name = "CC_INDT", length = 14) + private String ccIndt; + + @Column(name = "CC_INUSER") + private Integer ccInuser; +} diff --git a/src/main/java/com/worker/domain/entity/CpUser.java b/src/main/java/com/worker/domain/entity/CpUser.java new file mode 100644 index 0000000..7919b5f --- /dev/null +++ b/src/main/java/com/worker/domain/entity/CpUser.java @@ -0,0 +1,77 @@ +package com.worker.domain.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "cp_user", indexes = { + @Index(name = "CP_USER_IDX1", columnList = "UM_SGGCODE") +}) +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CpUser { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "UM_CODE") + private Integer umCode; + + @Column(name = "UM_SGGCODE", length = 5) + private String umSggcode; + + @Column(name = "UM_LEVELCD", length = 1) + private String umLevelcd; + + @Column(name = "UM_LEVEL", length = 50) + private String umLevel; + + @Column(name = "UM_NAME", length = 50) + private String umName; + + @Column(name = "UM_TELNO", length = 50) + private String umTelno; + + @Column(name = "UM_EMAIL", length = 50) + private String umEmail; + + @Column(name = "UM_HWPDIRC", length = 100) + private String umHwpdirc; + + @Column(name = "UM_PASS", length = 100) + private String umPass; + + @Column(name = "UM_PERMISION", length = 100) + private String umPermision; + + @Column(name = "UM_SEALL_USER", length = 100) + private String umSeallUser; + + @Column(name = "UM_TAXE_USER", length = 100) + private String umTaxeUser; + + @Column(name = "UM_INDT", length = 14) + private String umIndt; + + @Column(name = "UM_ENABLE", length = 1) + private String umEnable; + + @Column(name = "UM_JOB_GROUP", length = 3) + private String umJobGroup; + + @Column(name = "UM_DELDT", length = 14) + private String umDeldt; + + @Column(name = "UM_IP", length = 30) + private String umIp; + + @Column(name = "UM_PASS_UPDT", length = 14) + private String umPassUpdt; + + @Column(name = "um_car_user", length = 100) + private String umCarUser; +} \ No newline at end of file diff --git a/src/main/java/com/worker/domain/repo/cp/CpAnswerRepository.java b/src/main/java/com/worker/domain/repo/cp/CpAnswerRepository.java index 4c3d4e2..b630a4e 100644 --- a/src/main/java/com/worker/domain/repo/cp/CpAnswerRepository.java +++ b/src/main/java/com/worker/domain/repo/cp/CpAnswerRepository.java @@ -1,7 +1,11 @@ package com.worker.domain.repo.cp; import com.worker.domain.entity.CpAnswer; +import com.worker.dto.SinmungoDto; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface CpAnswerRepository extends JpaRepository { + List findAllByAsState(String number); } diff --git a/src/main/java/com/worker/domain/repo/cp/CpCancelRepository.java b/src/main/java/com/worker/domain/repo/cp/CpCancelRepository.java new file mode 100644 index 0000000..1430ab7 --- /dev/null +++ b/src/main/java/com/worker/domain/repo/cp/CpCancelRepository.java @@ -0,0 +1,7 @@ +package com.worker.domain.repo.cp; + +import com.worker.domain.entity.CpCancel; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CpCancelRepository extends JpaRepository { +} diff --git a/src/main/java/com/worker/domain/repo/cp/CpUserRepository.java b/src/main/java/com/worker/domain/repo/cp/CpUserRepository.java new file mode 100644 index 0000000..872a9d9 --- /dev/null +++ b/src/main/java/com/worker/domain/repo/cp/CpUserRepository.java @@ -0,0 +1,7 @@ +package com.worker.domain.repo.cp; + +import com.worker.domain.entity.CpUser; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CpUserRepository extends JpaRepository { +} diff --git a/src/main/java/com/worker/domain/repo/ep/EpAnserRepository.java b/src/main/java/com/worker/domain/repo/ep/EpAnserRepository.java new file mode 100644 index 0000000..a4e5d4f --- /dev/null +++ b/src/main/java/com/worker/domain/repo/ep/EpAnserRepository.java @@ -0,0 +1,7 @@ +package com.worker.domain.repo.ep; + +import com.worker.domain.entity.CpCancel; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EpAnserRepository extends JpaRepository { +} diff --git a/src/main/java/com/worker/domain/repo/ep/EpUserRepository.java b/src/main/java/com/worker/domain/repo/ep/EpUserRepository.java new file mode 100644 index 0000000..1123c8a --- /dev/null +++ b/src/main/java/com/worker/domain/repo/ep/EpUserRepository.java @@ -0,0 +1,7 @@ +package com.worker.domain.repo.ep; + +import com.worker.domain.entity.CpUser; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EpUserRepository extends JpaRepository { +} diff --git a/src/main/java/com/worker/dto/SinmungoDto.java b/src/main/java/com/worker/dto/SinmungoDto.java index 166e33a..75a8d6b 100644 --- a/src/main/java/com/worker/dto/SinmungoDto.java +++ b/src/main/java/com/worker/dto/SinmungoDto.java @@ -1,5 +1,6 @@ package com.worker.dto; +import com.worker.domain.entity.CpAnswer; import com.worker.domain.entity.CpBdong; import com.worker.domain.entity.CpMain; import com.worker.domain.entity.CpSetinfo; @@ -26,6 +27,7 @@ public class SinmungoDto { private List epBdongList; } + @Data @Builder public static class SinmungoXml { @@ -87,6 +89,13 @@ public class SinmungoDto { } + @Data + @Builder + public static class Answer{ + private CpAnswer cpAnswer; + + } + diff --git a/src/main/java/com/worker/scheduler/smg/sechdule/SinmungoInOutScheduler.java b/src/main/java/com/worker/scheduler/smg/sechdule/SinmungoInOutScheduler.java index b579f4c..a804b05 100644 --- a/src/main/java/com/worker/scheduler/smg/sechdule/SinmungoInOutScheduler.java +++ b/src/main/java/com/worker/scheduler/smg/sechdule/SinmungoInOutScheduler.java @@ -2,8 +2,11 @@ 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.util.common.commEnum.StateEnum; import com.worker.util.fileReader.XmlParserInterface; import com.worker.util.fileReader.XmlReader; import com.worker.util.fileReader.impl.SinmungoXmlParser; @@ -28,6 +31,9 @@ public class SinmungoInOutScheduler { private final DbPolling dbPolling; + private final CpAnswerRepository cpAnswerRepository; + private final EpAnswerRepository epAnswerRepository; + // esb에이전트 xml파일 읽기 @Scheduled(fixedRate = 10 * 60 * 1000) // 10분 public void sinmungoInOutScheduler() throws IOException { @@ -74,30 +80,33 @@ public class SinmungoInOutScheduler { .collect(Collectors.toList()); dbPolling.saveEP(epList, setInfo); - - /** 디비 폴링 트랜젝션 내부에서 동작하도록 이동 */ - // 파일백업으로 이동 - // xml은 HP_ROOT/PROGRAM/BATCH/sinmungo 로 백업? - // xml안에 있던 이미지 바이너리는 HP_ROOT/DATA/IMAGE/${담당자번호?}/2025 로 백업? - // esb에이전트 xml 파일 백업 -// xmlReader.xmlFileBackup(esbRcvPath, localXmlPath); -// List imgParsers = parseResult.stream() -// .flatMap(result -> result.getImgParsers().stream()) -// .collect(Collectors.toList()); -// xmlReader.imgLocalSave(localImgPath, imgParsers); - } // 90일이 초과한 백업 파일들 삭제 - public void sinmungoInOutFileRemoveScheduler() { - + @Scheduled(cron = "0 0 1 * * *") // 매일 새벽 1시에 실행 + public void sinmungoOver90DaysXmlFileRemoveScheduler() { + //setinfo 테이블에서 esb에이전트 정보 조회 + SinmungoDto.SetInfo setInfo = dbPolling.findSetInfo(); + xmlReader.xmlFileRemove(Paths.get(setInfo.getCpSetinfo().getStrValue4())); + xmlReader.xmlFileRemove(Paths.get(setInfo.getEpSetinfo().getStrValue4())); } // esb 에이전트 답변 보내기 + @Scheduled(fixedRate = 10 * 60 * 1000) // 10분 public void sinmungoAnswerSendScheduler() { + //setinfo 테이블에서 esb에이전트 정보 조회 + SinmungoDto.SetInfo setInfo = dbPolling.findSetInfo(); + + // 디비 읽기 > 특정 상태값인 자료들 xml로 생성 + + // 디비에서 as_state 1번인것 찾기 + List cpAnswer = cpAnswerRepository.findAllByAsState(StateEnum.ANSWER_STATE_ANSWER_WAIT.getCode()); + List epAnswer = cpAnswerRepository.findAllByAsState(StateEnum.ANSWER_STATE_ANSWER_WAIT.getCode()); + + // temp xml이 이미 존재?? > xml읽기 } diff --git a/src/main/java/com/worker/scheduler/smg/service/DbPolling.java b/src/main/java/com/worker/scheduler/smg/service/DbPolling.java index 1229a0d..5e3fb96 100644 --- a/src/main/java/com/worker/scheduler/smg/service/DbPolling.java +++ b/src/main/java/com/worker/scheduler/smg/service/DbPolling.java @@ -144,11 +144,12 @@ public class DbPolling { log.info(cpAnswerList.toString()); - + // 디비 인서트 cpMainRepository.saveAll(cpMainList); cpAnswerRepository.saveAll(cpAnswerList); cpMainEtc1Repository.saveAll(cpMainEtc1List); + // 파일 백업 fileBackup(setInfo.getCpSetinfo(), cpList); } @Transactional @@ -219,11 +220,12 @@ public class DbPolling { log.info(cpAnswerList.toString()); - + // 디비 인서트 epMainRepository.saveAll(cpMainList); epAnswerRepository.saveAll(cpAnswerList); epMainEtc1Repository.saveAll(cpMainEtc1List); + // 파일백업 fileBackup(setInfo.getEpSetinfo(), epList); } @@ -242,7 +244,7 @@ public class DbPolling { /** * mm_code는 시군구코드 (sgg_code + 올해연도 + 0000000) 으로 이루어짐 - * MMCode 조회후 MAX값 + 1 리턴 + * MMCode 조회후 MAX값 리턴 * 없다면 0000000 으로 리턴 * */ private long getMaxMmCode(SinmungoDto.SetInfo setInfo, String db) { @@ -303,7 +305,6 @@ public class DbPolling { .filter(line -> line.contains("위도") && line.contains("경도")) .map(String::trim) .map(line -> { - // 예: "발생지역 위도:37.38497 경도:127.12325" for (String word : line.split("\\s+")) { if (word.startsWith(param + ":")) { return word.substring((param + ":").length()); diff --git a/src/main/java/com/worker/util/common/commEnum/LawGBEnum.java b/src/main/java/com/worker/util/common/commEnum/LawGBEnum.java index 2ef8318..7a5afc8 100644 --- a/src/main/java/com/worker/util/common/commEnum/LawGBEnum.java +++ b/src/main/java/com/worker/util/common/commEnum/LawGBEnum.java @@ -8,7 +8,6 @@ import lombok.Getter; * */ @Getter @AllArgsConstructor - public enum LawGBEnum { PARKING("1", "주차",80000, 100000), diff --git a/src/main/java/com/worker/util/common/commEnum/StateEnum.java b/src/main/java/com/worker/util/common/commEnum/StateEnum.java new file mode 100644 index 0000000..7fc95df --- /dev/null +++ b/src/main/java/com/worker/util/common/commEnum/StateEnum.java @@ -0,0 +1,32 @@ +package com.worker.util.common.commEnum; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum StateEnum { + // + JOB_GB_HDC_JUCHA("1"), // 장애 주차위반 + JOB_GB_EC_JUCHA("2"), //20220114 UIJIN 전기차 주차위반 .. + + + // 신문고 답변 + ANSWER_STATE_FIRST("0"), // 접수, 초기상태 + ANSWER_STATE_ANSWER_WAIT("1"), // 답변대기 사용자가 1로 변경해놓고 GPKI가 설치된 시스템에서 1인 자료가 있으면 답변등록한다. + ANSWER_STATE_ANSWER_FOR_POST("2"), // 답변대상(부과) + ANSWER_STATE_ANSWER_FOR_INSTRUCT("3"), // 답변대상(계도) + ANSWER_STATE_ANSWER_FOR_CANCEL("4"), // 답변대상(서손) + ANSWER_STATE_ANSWER_FAIL("5"), // 답변처리 실패 + ANSWER_STATE_OK_POST("6"), // 처리완료(부과) + ANSWER_STATE_OK_INSTRUCT("7"), // 처리완료(계도) + ANSWER_STATE_OK_CANCEL("8"), // 처리완료(서손) + ANSWER_STATE_OK_ETC ("9"), // 처리완료(수기) + ANSWER_STATE_CANCEL_COPY("A"), // 답변 미대상 변환등록, 수기등록, 복사등록, 재등록 + ANSWER_STATE_CANCEL_IGNORE("B") // 서손사유가 답변 미대상 + + + ; + + private String code; +} diff --git a/src/main/java/com/worker/util/fileMaker/XmlMacker.java b/src/main/java/com/worker/util/fileMaker/XmlMacker.java new file mode 100644 index 0000000..98c5686 --- /dev/null +++ b/src/main/java/com/worker/util/fileMaker/XmlMacker.java @@ -0,0 +1,65 @@ +package com.worker.util.fileMaker; + +import com.worker.dto.SinmungoDto; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; + +@Component +@Slf4j +public class XmlMacker { + + + // 답변처리 xml + public void writeEsbAnswerXml(SinmungoDto.SinmungoXml xmlDto, Path sendDir) throws IOException { +// String xml = +// "\n" + +// "\n" + +// " " + xmlDto.getInterface_seq_n() + "\n" + +// " " + xmlDto.getSys_gubun_c() + "\n" + +// " " + xmlDto.getAnc_code_v() + "\n" + +// " " + "180" + "\n" + +// " " + xmlDto.getPeti_anc_code_v() + "\n" + +// " " + xmlDto.getPeti_no_c() + "\n" + +// " " + xmlDto.getCivil_no_c() + "\n" + +// " " + xmlDto.getCivil_gist_v() + "\n" + +// " " + xmlDto.getCivil_abstract_l() + "\n" + +// " " + xmlDto.getPcd_dept_v() + "\n" + +// " " + xmlDto.getPcd_dept_nm_v() + "\n" + +// " " + xmlDto.getDuty_id_v() + "\n" + +// " " + xmlDto.getPcd_email_v() + "\n" + +// " " + xmlDto.getPcd_tel_v() + "\n" + +// " " + xmlDto.getPcd_rst_cont_l() + "\n" + +// " " + xmlDto.getDo_reg_d() + "\n" + +// " " + "N" + "\n" + +// " " + xmlDto.getPcd_anc_code_v() + "\n" + +// " " + xmlDto.getReg_d() + "\n" + +// " " + "2" + "\n" + +// " " + xmlDto.getSend_d() + "\n" + +// " " + xmlDto.getApply_d() + "\n" + +// " " + "Y" + "\n" + +// " " + "" + "\n" + +// " " + "" + "\n" + +// " " + "" + "\n" + +// " " + "" + "\n" + +// " " + xmlDto.getSrcorgcd() + "\n" + +// " " + "" + "\n" + +// "\n"; +// +// String fileName = "EPOUGB$" + xmlDto.interface_seq_n() + ".xml"; +// Path filePath = sendDir.resolve(fileName); +// +// // 저장 (EUCKR 인코딩) +// Files.write(filePath, xml.getBytes(Charset.forName("EUC-KR"))); + } + + // 회수처리 xml (cp 상에선 서손처리) + public void returnSinmungoXml() { + + } + +} diff --git a/src/main/java/com/worker/util/fileReader/XmlReader.java b/src/main/java/com/worker/util/fileReader/XmlReader.java index 5ee96a2..c3a653d 100644 --- a/src/main/java/com/worker/util/fileReader/XmlReader.java +++ b/src/main/java/com/worker/util/fileReader/XmlReader.java @@ -9,6 +9,10 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -84,4 +88,26 @@ public class XmlReader { } } + public void xmlFileRemove(Path localXmlPath) { + try (Stream files = Files.list(localXmlPath)) { + //오늘날짜에서 90일 빼고 + String todayMinus90 = LocalDate.now().minusDays(90).format(DateTimeFormatter.ofPattern("yyyyMMdd")); + + for (Path file : files.toList()) { + String fileName = file.getFileName().toString(); + + if (!Files.isRegularFile(file) || !fileName.endsWith(".xml") || fileName.length() < 8) continue; + + String datePart = fileName.substring(0, 8); + //파일명날짜가 90뺀 날짜보다 적으면 + if (datePart.compareTo(todayMinus90) < 0) { + Files.delete(file); + log.info("파일 삭제됨 (90일 초과): {}", fileName); + } + } + } catch (IOException e) { + log.error("Failed to remove xml", e); + } + } + }