From 2cc5ad06a0cc186bad09c64cc4db0de633c1a8a0 Mon Sep 17 00:00:00 2001 From: Kurt92 Date: Tue, 9 Sep 2025 10:03:12 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EC=9A=B4=EC=98=81(=ED=99=94?= =?UTF-8?q?=EC=84=B1)=20=ED=99=98=EA=B2=BD=20=EC=84=B1=EC=A0=88=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=A4=91.=20md=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=ED=99=94=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 61 ++++++++++ cc-worker-start.bat | 4 + cc-worker-stop.bat | 10 ++ .../com/worker/domain/entity/CpGojit.java | 109 ++++++++++++++++++ .../worker/domain/entity/EpostSenderReg.java | 10 ++ .../domain/repo/ep/EpSggRepository.java | 2 +- .../worker/scheduler/epost/dto/EPostDto.java | 13 +++ .../repository/EPostQueryDslRepository.java | 42 +++++-- .../scheduler/epost/service/EPostService.java | 24 +++- .../scheduler/smg/service/DbPolling.java | 2 +- .../tax/schedule/TaxSunapScheduler.java | 2 +- src/main/resources/application-prod.yml | 51 +++++--- 12 files changed, 298 insertions(+), 32 deletions(-) create mode 100644 cc-worker-start.bat create mode 100644 cc-worker-stop.bat create mode 100644 src/main/java/com/worker/domain/entity/CpGojit.java diff --git a/README.md b/README.md index 6c746cb..a68b0c3 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,64 @@ start "" "C:\Program Files\Eclipse Adoptium\jdk-17.0.15.6-hotspot\bin\java.exe" - 해당 실행은 스크립트를 통해 만들 예정이며, 이후 스크립트 더블클릭으로 재실행 할수 있도록 한다. - start를 붙이면 백그라운드로 실행 가능하다 (윈도우) - 대신 로그를 볼려면 실행로그파일을 따로 지정해줘야 된다. + +
+ +- 수동실행을 위한 뷰페이지 localhost:8011로 접속하면됨. +- 로그보기를 누르면 실시간 로그도 볼수 있음. +- 프로그램 실행유무는 로컬호스트 8011을 접속 가능 여부로 판단하면됨. +- 25/9/8일 화성 테스트중 Eclipse Adoptium jdk 의존성 문제 발견. 원인은 서버 2012 너무 예전버전이라 그럼. +- 그래서 zulu17 버전으로 변경 +- c:/program files 안에 zip버전 자바 압축을 풀고 폴더명을 zulu17로 변경. +- 해당경로를 명시적으로 작성하여 자바 프로젝트를 실행시킨다. + +``` +@echo off +start "" "C:\Program Files\zulu17\bin\javaw.exe" ^ + -jar "C:\Users\Administrator\Desktop\cc-worker\clean-parking-worker-0.0.1-SNAPSHOT.jar" --spring.profiles.active=prod +exit +``` + +``` +@echo off +echo [INFO] 8011 포트 사용 중인 프로세스 종료 시도... + +for /f "tokens=5" %%i in ('netstat -ano ^| findstr :8011 ^| findstr LISTENING') do ( + echo [INFO] PID=%%i 종료 + taskkill /PID %%i /F +) + +echo [OK] 완료. +exit /b 0 + +``` + + + +### 배포 및 필수값 세팅
+ +[JAVA] JDK 17버전 세팅
+ + +[실행 스크립트 bat파일]
+- 기타 여러 프로그램으로 cmd콘솔이 너무 많음. +- 하여 해당 워커는 백그라운드로 돌리고 실행유무 판단은 뷰페이지를 통하여 함. +- 실행과 중지는 bat파일을 통해 하도록 한다. + +[CpSgg] 필수 값 세팅 1
+- 하위 sgg코드들 다 있어야함. + +[SetInfo] 필수 값 세팅 2
+ +- setinfo는 멀티 프라이머리키임. CODE_NAME, GROUP_CODE, DETAIL_CODE +- CODE_NANE(PK) : WORKER +- GROUP_CODE(PK) : INFO +- DETAIL_CODE(PK) : PROD +- INT_VALUE1 : 메인 시군구 코드 +- INT_VALUE2 : 메인 시군구 부서코드 +- STR_VALUE1 : 시군구 명 (유성구) +- STR_VALUE2 : ESB RCV 경로 +- STR_VALUE3 : ESB SEND 경로 +- STR_VALUE4 : 신문고 xml 백업 경로 +- STR_VALUE5 : 신문고 이미지 파일 백업경로 +- STR_VALUE6 : 하위 모든 시군구 + 부서코드 제이슨 형태 ex) {"수정구":[41131, 3790009], "중원구":[41133, 3800009], "분당구": [41135, 3810070]} \ No newline at end of file diff --git a/cc-worker-start.bat b/cc-worker-start.bat new file mode 100644 index 0000000..75c0d42 --- /dev/null +++ b/cc-worker-start.bat @@ -0,0 +1,4 @@ +@echo off +start "" "C:\Program Files\zulu17\bin\javaw.exe" ^ + -jar "C:\Users\Administrator\Desktop\cc-worker\clean-parking-worker-0.0.1-SNAPSHOT.jar" --spring.profiles.active=prod +exit diff --git a/cc-worker-stop.bat b/cc-worker-stop.bat new file mode 100644 index 0000000..3976fc3 --- /dev/null +++ b/cc-worker-stop.bat @@ -0,0 +1,10 @@ +@echo off +echo [INFO] 8011 포트 사용 중인 프로세스 종료 시도... + +for /f "tokens=5" %%i in ('netstat -ano ^| findstr :8011 ^| findstr LISTENING') do ( + echo [INFO] PID=%%i 종료 + taskkill /PID %%i /F +) + +echo [OK] 완료. +exit /b 0 diff --git a/src/main/java/com/worker/domain/entity/CpGojit.java b/src/main/java/com/worker/domain/entity/CpGojit.java new file mode 100644 index 0000000..abaf653 --- /dev/null +++ b/src/main/java/com/worker/domain/entity/CpGojit.java @@ -0,0 +1,109 @@ +package com.worker.domain.entity; + +import jakarta.persistence.*; +import lombok.*; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@EqualsAndHashCode(of = "tgCode") +@Entity +@Table( + name = "cp_gojit", + indexes = { + @Index(name = "CP_GOJIT_IDX1", columnList = "TG_SGGCODE,TG_GB,TG_SDATE"), + @Index(name = "CP_GOJIT_IDX2", columnList = "TG_INDT"), + @Index(name = "CP_GOJIT_IDX3", columnList = "TG_NOTICE_KEY") + } +) +public class CpGojit { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "TG_CODE", nullable = false, updatable = false) + private Long tgCode; + + @Column(name = "TG_SGGCODE", length = 5) + private String tgSggCode; + + @Column(name = "TG_LAWGB", length = 2) + private String tgLawGb; + + @Column(name = "TG_GB", length = 1) + private String tgGb; + + @Column(name = "TG_DLGB", length = 1) + private String tgDlgb; + + @Column(name = "TG_SRC_SDATE", length = 8) + private String tgSrcSdate; + + @Column(name = "TG_SRC_EDATE", length = 8) + private String tgSrcEdate; + + @Column(name = "TG_SDATE", length = 8) + private String tgSdate; + + @Column(name = "TG_EDATE", length = 8) + private String tgEdate; + + @Column(name = "TG_TITLE", length = 100) + private String tgTitle; + + @Column(name = "TG_DOCNO", length = 40) + private String tgDocno; + + @Column(name = "TG_ETC", length = 100) + private String tgEtc; + + @Column(name = "TG_TOTCOUNT") + private Integer tgTotcount; + + @Column(name = "TG_TOTKEUM") + private Long tgTotkeum; + + @Column(name = "TG_INDT", length = 14) + private String tgIndt; + + @Column(name = "TG_INUSER") + private Integer tgInuser; + + @Column(name = "TG_CON_KEY", length = 40) + private String tgConKey; + + @Column(name = "TG_POST_SE_CD", length = 3) + private String tgPostSeCd; + + @Column(name = "TG_IS_RESEND", length = 1) + private String tgIsResend; + + @Column(name = "TG_NOTICE_KEY", length = 13) + private String tgNoticeKey; + + @Column(name = "TG_POST_PROC_STT", length = 2) + private String tgPostProcStt; + + @Column(name = "TG_UNITY_SNDNG_MASTR_ID", length = 20) + private String tgUnitySndngMastrId; + + @Column(name = "TG_DELETE", length = 2) + private String tgDelete; + + @Column(name = "TG_POST_YN", length = 2) + private String tgPostYn; + + @Column(name = "TG_ELPOST_YN", length = 2) + private String tgElpostYn; + + + + public void changeTgPostProcStt(String tgPostProcStt) { + this.tgPostProcStt = tgPostProcStt; + } + + public void changeTgCode(Long tgCode) { + this.tgCode = tgCode; + } + +} diff --git a/src/main/java/com/worker/domain/entity/EpostSenderReg.java b/src/main/java/com/worker/domain/entity/EpostSenderReg.java index 592a0a8..d8c9055 100644 --- a/src/main/java/com/worker/domain/entity/EpostSenderReg.java +++ b/src/main/java/com/worker/domain/entity/EpostSenderReg.java @@ -146,4 +146,14 @@ public class EpostSenderReg { @Column(name = "TG_CODE", length = 10) private String tgCode; + + + public void changePostProcStt(String postProcStt) { + this.postProcStt = postProcStt; + } + + public void changeRceptYmd(String rceptYmd) { + this.rceptYmd = rceptYmd; + } + } \ No newline at end of file diff --git a/src/main/java/com/worker/domain/repo/ep/EpSggRepository.java b/src/main/java/com/worker/domain/repo/ep/EpSggRepository.java index cb869ce..92df47b 100644 --- a/src/main/java/com/worker/domain/repo/ep/EpSggRepository.java +++ b/src/main/java/com/worker/domain/repo/ep/EpSggRepository.java @@ -4,5 +4,5 @@ import com.worker.domain.entity.CpSgg; import org.springframework.data.jpa.repository.JpaRepository; public interface EpSggRepository extends JpaRepository { - CpSgg findBySgDepCode(String pcdDeptV); + CpSgg findBySgDepCode(String sgDepCode); } diff --git a/src/main/java/com/worker/scheduler/epost/dto/EPostDto.java b/src/main/java/com/worker/scheduler/epost/dto/EPostDto.java index e251c81..4d9d26a 100644 --- a/src/main/java/com/worker/scheduler/epost/dto/EPostDto.java +++ b/src/main/java/com/worker/scheduler/epost/dto/EPostDto.java @@ -63,7 +63,20 @@ public class EPostDto { private String gpState; private Long gpTtcode; private String postProcSt; + private String conKey; + + } + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class SearchRecvTarget { + private String conKey; + private String jobCd; + private String tgCode; + private String postProcStt; } @Getter diff --git a/src/main/java/com/worker/scheduler/epost/repository/EPostQueryDslRepository.java b/src/main/java/com/worker/scheduler/epost/repository/EPostQueryDslRepository.java index 05e3b9c..5b7bc9e 100644 --- a/src/main/java/com/worker/scheduler/epost/repository/EPostQueryDslRepository.java +++ b/src/main/java/com/worker/scheduler/epost/repository/EPostQueryDslRepository.java @@ -2,21 +2,14 @@ package com.worker.scheduler.epost.repository; import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; -import com.worker.domain.entity.CpSetinfo; import com.worker.scheduler.epost.dto.EPostDto; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; -import javax.sql.DataSource; import java.util.List; import java.util.Set; import static com.worker.domain.entity.QCpGojiPrt.cpGojiPrt; -import static com.worker.domain.entity.QEpostDelivResult.epostDelivResult; -import static com.worker.domain.entity.QEpostRceptResult.epostRceptResult; import static com.worker.domain.entity.QEpostSenderDetail.epostSenderDetail; import static com.worker.domain.entity.QEpostSenderReg.epostSenderReg; @@ -28,7 +21,7 @@ public class EPostQueryDslRepository { // @Transactional(readOnly = true, transactionManager = "cpTransactionManager") - public List findDelivResult(JPAQueryFactory queryFactory ,List dtos, Set cpDeptCode) { + public List findDelivResult(JPAQueryFactory queryFactory, List dtos, Set cpDeptCode) { // List conKeys = dtos.stream() @@ -63,6 +56,7 @@ public class EPostQueryDslRepository { cpGojiPrt.gpRecvRelt, cpGojiPrt.gpState, cpGojiPrt.gpTtcode, + epostSenderDetail.conKey, epostSenderReg.postProcStt ) ) @@ -81,13 +75,39 @@ public class EPostQueryDslRepository { - public List findMakeResult(List dtos) { + public List findMakeResult(JPAQueryFactory queryFactory, List dtos, Set cpDeptCode) { return null; } - public List findRceptResult(List dtos) { + public List findRceptResult(JPAQueryFactory queryFactory, List dtos, Set cpDeptCode) { - return null; + List conKeys = dtos.stream() + .map(EPostDto.Deliv::getConKey) + .filter(java.util.Objects::nonNull) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .filter(k -> { + String[] parts = k.split("-", 3); + return parts.length == 3 && cpDeptCode.stream().anyMatch(parts[1]::startsWith); + }) + .distinct() + .toList(); + + return queryFactory + .select( + Projections.fields( + EPostDto.SearchRecvTarget.class, + epostSenderReg.conKey, + epostSenderReg.jobCd, + epostSenderReg.tgCode, + epostSenderReg.postProcStt + ) + ) + .from(epostSenderReg) + .where( + epostSenderReg.conKey.in(conKeys) + ) + .fetch(); } public void updateDelivResult(EPostDto.Deliv dto) { diff --git a/src/main/java/com/worker/scheduler/epost/service/EPostService.java b/src/main/java/com/worker/scheduler/epost/service/EPostService.java index b01fa65..9b2c575 100644 --- a/src/main/java/com/worker/scheduler/epost/service/EPostService.java +++ b/src/main/java/com/worker/scheduler/epost/service/EPostService.java @@ -3,6 +3,7 @@ package com.worker.scheduler.epost.service; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.querydsl.jpa.impl.JPAQueryFactory; +import com.worker.domain.entity.CpGojit; import com.worker.domain.entity.CpSetinfo; import com.worker.domain.entity.CpSetinfoId; import com.worker.domain.entity.EpostDelivResult; @@ -72,6 +73,7 @@ public class EPostService { List cpRecvs = new ArrayList<>(); List epRecvs = new ArrayList<>(); + // target 체킹 parseResult.forEach(e -> { switch(e.getKind()) { case "deliv" -> { @@ -81,11 +83,17 @@ public class EPostService { epDelivs.addAll(ePostQueryDslRepository.findDelivResult(epQueryFactory, e.getResult(), epDeptCode)); } case "rcept" -> { - - } - case "make" -> { - + if(setInfo.getCpSetinfo() != null) + cpRecvs.addAll(ePostQueryDslRepository.findRceptResult(cpQueryFactory, e.getResult(), cpDeptCode)); + if(setInfo.getEpSetinfo() != null) + epRecvs.addAll(ePostQueryDslRepository.findRceptResult(epQueryFactory, e.getResult(), cpDeptCode)); } +// case "make" -> { +// if(setInfo.getCpSetinfo() != null) +// cpPrts.addAll(); +// if(setInfo.getEpSetinfo() != null) +// epPrts.addAll(); +// } } @@ -105,8 +113,16 @@ public class EPostService { } + private void insertReceiveResults(List recvs) { + //고지 업데이트 + + //reg 업데이트 + + + } + private void insertDelivResults(List delivs) { List entities = delivs.stream() .map(item -> EpostDelivResult.builder() 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 8d3982d..fd9cc8f 100644 --- a/src/main/java/com/worker/scheduler/smg/service/DbPolling.java +++ b/src/main/java/com/worker/scheduler/smg/service/DbPolling.java @@ -454,7 +454,7 @@ public class DbPolling { // 부과코드로 시군구 코드를 조회한다. private String findSggCodeByDepCode(SinmungoDto.SinmungoXml xml, String dbType) { String sggCode = null; - if(dbType.equals("CP")) sggCode = cpSggRepository.findBySgDepCode(xml.getPcd_dept_v()).getSgSggcode(); + if(dbType.equals("cp")) sggCode = cpSggRepository.findBySgDepCode(xml.getPcd_dept_v()).getSgSggcode(); else sggCode = epSggRepository.findBySgDepCode(xml.getPcd_dept_v()).getSgSggcode(); return sggCode; } diff --git a/src/main/java/com/worker/scheduler/tax/schedule/TaxSunapScheduler.java b/src/main/java/com/worker/scheduler/tax/schedule/TaxSunapScheduler.java index a865370..0b52cd0 100644 --- a/src/main/java/com/worker/scheduler/tax/schedule/TaxSunapScheduler.java +++ b/src/main/java/com/worker/scheduler/tax/schedule/TaxSunapScheduler.java @@ -29,7 +29,7 @@ public class TaxSunapScheduler { private final TaxSunapService taxSunapService; - @Scheduled(fixedRate = 60 * 60 * 1000) +// @Scheduled(fixedRate = 60 * 60 * 1000) public void taxSunapScheduler() { //인포 세팅 diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 9850c8b..2f7b592 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -3,11 +3,32 @@ server: spring: datasource: - url: jdbc:mariadb://211.119.124.122:53306/cleanparking2?useUnicode=true&characterEncoding=utf8 - username: root - password: xit5811807 - driver-class-name: org.mariadb.jdbc.Driver + cp: + url: jdbc:mariadb://105.24.1.226:53306/cptest?useUnicode=true&characterEncoding=utf8 + username: root + password: xit5811807 + driver-class-name: org.mariadb.jdbc.Driver + hikari: + initialization-fail-timeout: -1 # DB 없어도 부팅 계속 + validation-timeout: 2000 # ms + connection-timeout: 3000 # ms + maximum-pool-size: 5 + ep: + url: jdbc:mariadb://105.24.1.226:53306/eptest?useUnicode=true&characterEncoding=utf8 + username: root + password: xit5811807 + driver-class-name: org.mariadb.jdbc.Driver + hikari: + initialization-fail-timeout: -1 # DB 없어도 부팅 계속 + validation-timeout: 2000 # ms + connection-timeout: 3000 # ms + maximum-pool-size: 5 + + # 이미 운영되고있는 서버들 많고 디비 구성 변경시 영향도 파악 어려움. + # ddl은 무조건 수동으로 해줄것. + # jpa는 순수 개발편의를 위한 사용. + # 연관관계 지정하지말고 그대로 쓸것. jpa: show-sql: false hibernate: @@ -15,28 +36,30 @@ spring: properties: hibernate: format_sql: true + # 부팅 시 DB 메타데이터 조회 방지 + 방언 명시 (매우 중요) + temp.use_jdbc_metadata_defaults: false dialect: org.hibernate.dialect.MySQLDialect scheduler: smg: enabled: true epost: - enabled: false + enabled: true tax-sunap: - enabled: false + enabled: true update: enabled: false esb: info: - xmlDir: - codeName: 국민신문고 - groupCode: 정보 - detailCode: 1 - backupDir: - codeName: SERVER_INFO - groupCode: DIRECTORY - detailCode: IMAGE + cp: + codeName: WORKER + groupCode: INFO + detailCode: PROD + ep: + codeName: WORKER + groupCode: INFO + detailCode: PROD tax-else: protocol: https://