feat : 90일 초과 xml 삭제 스케쥴러 추가, 답변내용 send 스케쥴러 작업중

master
Kurt92 6 months ago
parent c2a95e7c7f
commit d54096b1b4

@ -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;
}

@ -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;
}

@ -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<CpAnswer,Integer> {
List<SinmungoDto.Answer> findAllByAsState(String number);
}

@ -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<CpCancel,Integer> {
}

@ -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<CpUser, Long> {
}

@ -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<CpCancel, Integer> {
}

@ -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<CpUser, Long> {
}

@ -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<CpBdong> epBdongList;
}
@Data
@Builder
public static class SinmungoXml {
@ -87,6 +89,13 @@ public class SinmungoDto {
}
@Data
@Builder
public static class Answer{
private CpAnswer cpAnswer;
}

@ -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<SinmungoDto.ImgParser> 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<SinmungoDto.Answer> cpAnswer = cpAnswerRepository.findAllByAsState(StateEnum.ANSWER_STATE_ANSWER_WAIT.getCode());
List<SinmungoDto.Answer> epAnswer = cpAnswerRepository.findAllByAsState(StateEnum.ANSWER_STATE_ANSWER_WAIT.getCode());
// temp xml이 이미 존재?? > xml읽기
}

@ -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());

@ -8,7 +8,6 @@ import lombok.Getter;
* */
@Getter
@AllArgsConstructor
public enum LawGBEnum {
PARKING("1", "주차",80000, 100000),

@ -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;
}

@ -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 =
// "<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n" +
// "<dmndinfo>\n" +
// " <interface_seq_n>" + xmlDto.getInterface_seq_n() + "</interface_seq_n>\n" +
// " <sys_gubun_c>" + xmlDto.getSys_gubun_c() + "</sys_gubun_c>\n" +
// " <anc_code_v>" + xmlDto.getAnc_code_v() + "</anc_code_v>\n" +
// " <peti_gubun_c>" + "180" + "</peti_gubun_c>\n" +
// " <peti_anc_code_v>" + xmlDto.getPeti_anc_code_v() + "</peti_anc_code_v>\n" +
// " <peti_no_c>" + xmlDto.getPeti_no_c() + "</peti_no_c>\n" +
// " <civil_no_c>" + xmlDto.getCivil_no_c() + "</civil_no_c>\n" +
// " <civil_gist_v>" + xmlDto.getCivil_gist_v() + "</civil_gist_v>\n" +
// " <civil_abstract_l>" + xmlDto.getCivil_abstract_l() + "</civil_abstract_l>\n" +
// " <pcd_dept_v>" + xmlDto.getPcd_dept_v() + "</pcd_dept_v>\n" +
// " <pcd_dept_nm_v>" + xmlDto.getPcd_dept_nm_v() + "</pcd_dept_nm_v>\n" +
// " <duty_id_v>" + xmlDto.getDuty_id_v() + "</duty_id_v>\n" +
// " <pcd_email_v>" + xmlDto.getPcd_email_v() + "</pcd_email_v>\n" +
// " <pcd_tel_v>" + xmlDto.getPcd_tel_v() + "</pcd_tel_v>\n" +
// " <pcd_rst_cont_l>" + xmlDto.getPcd_rst_cont_l() + "</pcd_rst_cont_l>\n" +
// " <do_reg_d>" + xmlDto.getDo_reg_d() + "</do_reg_d>\n" +
// " <pcd_rst_cont_attach_yn_c>" + "N" + "</pcd_rst_cont_attach_yn_c>\n" +
// " <pcd_anc_code_v>" + xmlDto.getPcd_anc_code_v() + "</pcd_anc_code_v>\n" +
// " <reg_d>" + xmlDto.getReg_d() + "</reg_d>\n" +
// " <send_yn_c>" + "2" + "</send_yn_c>\n" +
// " <send_d>" + xmlDto.getSend_d() + "</send_d>\n" +
// " <apply_d>" + xmlDto.getApply_d() + "</apply_d>\n" +
// " <apply_gubun_c>" + "Y" + "</apply_gubun_c>\n" +
// " <pcd_gubun_v>" + "" + "</pcd_gubun_v>\n" +
// " <pcd_gubun2_v>" + "" + "</pcd_gubun2_v>\n" +
// " <pcd_gubun3_v>" + "" + "</pcd_gubun3_v>\n" +
// " <ifid>" + "" + "</ifid>\n" +
// " <srcorgcd>" + xmlDto.getSrcorgcd() + "</srcorgcd>\n" +
// " <tgtorgcd>" + "" + "</tgtorgcd>\n" +
// "</dmndinfo>\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() {
}
}

@ -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<Path> 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);
}
}
}

Loading…
Cancel
Save