From dfdf78268c9f6a36d1272939d1adc7e265e37151 Mon Sep 17 00:00:00 2001 From: Kurt92 Date: Mon, 30 Jun 2025 18:02:33 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20queryDsl=20=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?=EC=8B=A0=EB=AC=B8=EA=B3=A0=20Send=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 26 ++++++++ .../domain/repo/cp/CpAnswerRepository.java | 3 +- .../domain/repo/ep/EpAnswerRepository.java | 3 + src/main/java/com/worker/dto/SinmungoDto.java | 60 ++++++++++++++----- src/main/java/com/worker/dto/UserInfoDto.java | 41 +++++++++++++ .../worker/framework/JPAConf/JPAConfig.java | 19 ++++++ .../DbPollingQueryDslRepository.java | 33 ++++++++++ .../smg/sechdule/SinmungoInOutScheduler.java | 17 +++--- .../scheduler/smg/service/DbPolling.java | 10 +++- .../worker/scheduler/smg/service/XmlSend.java | 51 ++++++++++++++++ 10 files changed, 233 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/worker/dto/UserInfoDto.java create mode 100644 src/main/java/com/worker/framework/JPAConf/JPAConfig.java create mode 100644 src/main/java/com/worker/scheduler/smg/service/XmlSend.java diff --git a/build.gradle b/build.gradle index d1bfb11..de4c1c2 100644 --- a/build.gradle +++ b/build.gradle @@ -37,6 +37,32 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + + + + // === QueryDsl start === + + // == 스프링 부트 3.0 이상 == + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + runtimeOnly 'com.mysql:mysql-connector-j' + + // == 스프링 부트 3.0 미만 == +// implementation 'com.querydsl:querydsl-jpa' +// annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" +// +// annotationProcessor "jakarta.annotation:jakarta.annotation-api" +// annotationProcessor "jakarta.persistence:jakarta.persistence-api" + + // === QueryDsl end === + + } tasks.named('test') { 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 b630a4e..5753e26 100644 --- a/src/main/java/com/worker/domain/repo/cp/CpAnswerRepository.java +++ b/src/main/java/com/worker/domain/repo/cp/CpAnswerRepository.java @@ -1,11 +1,10 @@ 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); + List findAllByAsState(String number); } diff --git a/src/main/java/com/worker/domain/repo/ep/EpAnswerRepository.java b/src/main/java/com/worker/domain/repo/ep/EpAnswerRepository.java index 1bb9717..7dd33fc 100644 --- a/src/main/java/com/worker/domain/repo/ep/EpAnswerRepository.java +++ b/src/main/java/com/worker/domain/repo/ep/EpAnswerRepository.java @@ -3,5 +3,8 @@ package com.worker.domain.repo.ep; import com.worker.domain.entity.CpAnswer; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface EpAnswerRepository extends JpaRepository { + List findAllByAsState(String number); } diff --git a/src/main/java/com/worker/dto/SinmungoDto.java b/src/main/java/com/worker/dto/SinmungoDto.java index 75a8d6b..28817cf 100644 --- a/src/main/java/com/worker/dto/SinmungoDto.java +++ b/src/main/java/com/worker/dto/SinmungoDto.java @@ -1,9 +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; +import com.worker.domain.entity.*; import jakarta.persistence.Lob; import lombok.*; @@ -11,12 +8,7 @@ import java.util.List; public class SinmungoDto { - @Data - @Builder - public static class ParseResult { - private CpMain cpMain; - private List imgParsers; - } + @Getter @Builder @@ -27,7 +19,6 @@ public class SinmungoDto { private List epBdongList; } - @Data @Builder public static class SinmungoXml { @@ -77,6 +68,12 @@ public class SinmungoDto { } + @Data + @Builder + public static class ParseResult { + private CpMain cpMain; + private List imgParsers; + } @Data @Builder @@ -89,14 +86,47 @@ public class SinmungoDto { } - @Data - @Builder - public static class Answer{ - private CpAnswer cpAnswer; + + public static class Send { + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class SendAnswer { + private String im_interface_seq_n; + + private String im_s_userid; + private String im_s_username; + private String im_telno; + private String im_email; + private String im_dep_code; + private String im_dep_name; + private String im_civil_abstract_l; + private String im_sys_gubun_c; + private String im_anc_code_v; + private String im_peti_anc_code_v; + private String im_peti_no_c; + private String im_civil_no_c; + private String im_answer_text; + private String im_datetime; + + } + + + + @Data + @Builder + public static class Answers{ + private List cpAnswer; + private List epAnswer; + + } } + } diff --git a/src/main/java/com/worker/dto/UserInfoDto.java b/src/main/java/com/worker/dto/UserInfoDto.java new file mode 100644 index 0000000..db49c58 --- /dev/null +++ b/src/main/java/com/worker/dto/UserInfoDto.java @@ -0,0 +1,41 @@ +package com.worker.dto; + +import jakarta.persistence.Column; +import jakarta.persistence.Id; +import lombok.Builder; +import lombok.Getter; + + +public class UserInfoDto { + + @Getter + @Builder + public static class UserInfo { + + private Integer umCode; + private String umSggcode; + private String umLevelcd; + private String umLevel; + private String umName; + private String umTelno; + private String umEmail; + private String umHwpdirc; + private String umPass; + private String umPermision; + private String umSeallUser; + private String umTaxeUser; + private String umIndt; + private String umEnable; + private String umJobGroup; + private String umDeldt; + private String umIp; + private String umPassUpdt; + private String umCarUser; + + private String sgSggCode; + private String sgSggName; + private String sgEnable; + private String sgDepCode; + + } +} diff --git a/src/main/java/com/worker/framework/JPAConf/JPAConfig.java b/src/main/java/com/worker/framework/JPAConf/JPAConfig.java new file mode 100644 index 0000000..0197f5a --- /dev/null +++ b/src/main/java/com/worker/framework/JPAConf/JPAConfig.java @@ -0,0 +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); + } +} diff --git a/src/main/java/com/worker/scheduler/smg/repository/DbPollingQueryDslRepository.java b/src/main/java/com/worker/scheduler/smg/repository/DbPollingQueryDslRepository.java index aa1c630..47ec337 100644 --- a/src/main/java/com/worker/scheduler/smg/repository/DbPollingQueryDslRepository.java +++ b/src/main/java/com/worker/scheduler/smg/repository/DbPollingQueryDslRepository.java @@ -1,7 +1,40 @@ package com.worker.scheduler.smg.repository; +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.worker.dto.UserInfoDto; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.List; + +import static com.worker.domain.entity.QCpSgg.cpSgg; +import static com.worker.domain.entity.QCpUser.cpUser; + @Repository +@RequiredArgsConstructor public class DbPollingQueryDslRepository { + + private final JPAQueryFactory queryFactory; + + public List findCpUser(int umCode) { + + return queryFactory + .select( + Projections.fields( + UserInfoDto.UserInfo.class, + cpUser.umCode, + cpUser.umName, + cpUser.umTelno, + cpUser.umEmail, + cpSgg.sgDepCode + ) + ) + .from(cpUser) + .leftJoin(cpSgg).on(cpSgg.sgSggCode.eq(cpUser.umSggcode)) + .where(cpUser.umCode.eq(umCode)) + .fetch(); + + } + } 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 a804b05..41ae777 100644 --- a/src/main/java/com/worker/scheduler/smg/sechdule/SinmungoInOutScheduler.java +++ b/src/main/java/com/worker/scheduler/smg/sechdule/SinmungoInOutScheduler.java @@ -6,6 +6,7 @@ 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; import com.worker.util.common.commEnum.StateEnum; import com.worker.util.fileReader.XmlParserInterface; import com.worker.util.fileReader.XmlReader; @@ -28,11 +29,11 @@ import java.util.stream.Collectors; public class SinmungoInOutScheduler { private final XmlReader xmlReader; + private final XmlSend xmlSend; private final DbPolling dbPolling; - private final CpAnswerRepository cpAnswerRepository; - private final EpAnswerRepository epAnswerRepository; + // esb에이전트 xml파일 읽기 @Scheduled(fixedRate = 10 * 60 * 1000) // 10분 @@ -97,16 +98,12 @@ public class SinmungoInOutScheduler { public void sinmungoAnswerSendScheduler() { //setinfo 테이블에서 esb에이전트 정보 조회 SinmungoDto.SetInfo setInfo = dbPolling.findSetInfo(); + //대상 답변 조회 + SinmungoDto.Send.Answers answers = xmlSend.findAnswersByStatus(StateEnum.ANSWER_STATE_ANSWER_WAIT.getCode()); - // 디비 읽기 > 특정 상태값인 자료들 xml로 생성 - - // 디비에서 as_state 1번인것 찾기 - List cpAnswer = cpAnswerRepository.findAllByAsState(StateEnum.ANSWER_STATE_ANSWER_WAIT.getCode()); - List epAnswer = cpAnswerRepository.findAllByAsState(StateEnum.ANSWER_STATE_ANSWER_WAIT.getCode()); - - + //send 프로세스 실행 + xmlSend.send(setInfo, answers); - // 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 5e3fb96..398c55c 100644 --- a/src/main/java/com/worker/scheduler/smg/service/DbPolling.java +++ b/src/main/java/com/worker/scheduler/smg/service/DbPolling.java @@ -44,13 +44,13 @@ public class DbPolling { private final EpAnswerRepository epAnswerRepository; private final CpMainEtc1Repository cpMainEtc1Repository; private final EpMainEtc1Repository epMainEtc1Repository; + private final CpUserRepository cpUserRepository; public SinmungoDto.SetInfo findSetInfo() { - // setInfo는 폴링 작업에 필요한 모든정보를 여기서 전부 조회하고 객체로 리턴하자\ - - + // setInfo는 폴링 작업에 필요한 모든정보를 여기서 전부 조회하고 객체로 리턴 +// CpUser cpUser = cpUserRepository.; CpSetinfo cpSetinfo = cpSetinfoRepository.findById( CpSetinfoId.builder() .codeName(env.getProperty("esb.info.cp.codeName")) @@ -66,6 +66,7 @@ public class DbPolling { .detailCode(env.getProperty("esb.info.ep.detailCode")) .build() ).orElse(null); + List cpBdongList = cpBdongRepository.findAllByBdCodeStartingWith(cpSetinfo.getIntValue1().toString()); @@ -84,6 +85,7 @@ public class DbPolling { List cpMainList = new ArrayList<>(); List cpAnswerList = new ArrayList<>(); List cpMainEtc1List = new ArrayList<>(); + List insertCompleteFileNm = new ArrayList<>(); //mm_code 맥스값 가져오기 long maxMmCode = getMaxMmCode(setInfo, "CP"); @@ -139,6 +141,8 @@ public class DbPolling { .mmKey(xml.getInterface_seq_n()) .mmText(CommonUtils.truncate(xml.getPeti_reason_l(), 4000)) .build()); + + insertCompleteFileNm.add(cpList.get(i).getFileName()); } diff --git a/src/main/java/com/worker/scheduler/smg/service/XmlSend.java b/src/main/java/com/worker/scheduler/smg/service/XmlSend.java new file mode 100644 index 0000000..b8c2def --- /dev/null +++ b/src/main/java/com/worker/scheduler/smg/service/XmlSend.java @@ -0,0 +1,51 @@ +package com.worker.scheduler.smg.service; + +import com.worker.domain.repo.cp.CpAnswerRepository; +import com.worker.domain.repo.ep.EpAnswerRepository; +import com.worker.dto.SinmungoDto; +import com.worker.util.common.commEnum.StateEnum; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class XmlSend { + + private final CpAnswerRepository cpAnswerRepository; + private final EpAnswerRepository epAnswerRepository; + + // 실행 대상 답변 찾기 + public SinmungoDto.Send.Answers findAnswersByStatus(String status) { + + // 디비에서 as_state 1번인것 찾기 + return SinmungoDto.Send.Answers.builder() + .cpAnswer(cpAnswerRepository.findAllByAsState(status)) + .epAnswer(epAnswerRepository.findAllByAsState(status)) + .build(); + } + + //send 디렉토리에 xml 생성 + public void send(SinmungoDto.SetInfo setInfo, SinmungoDto.Send.Answers answers) { + // answers 에서 as_reuser 추출 + List reuser; + + // 추출한 reuser에서 user정보 조회 + + + // main테이블 조회 + + + // mm_state 별로 im_civil_abstract_l 값 업데이트 + + + //awsers 만큼 + // 위에서 조회한 정보들 조합해서 xml 생성 + + + } + + +}