diff --git a/SGG.json b/SGG.json new file mode 100644 index 0000000..e69de29 diff --git a/build.gradle b/build.gradle index 0a7a111..69ddcce 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-quartz' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'org.springframework.session:spring-session-core' + compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.mysql:mysql-connector-j' diff --git a/src/main/java/com/manual/controller/RunController.java b/src/main/java/com/manual/controller/RunController.java index ab0d5bb..69c6d32 100644 --- a/src/main/java/com/manual/controller/RunController.java +++ b/src/main/java/com/manual/controller/RunController.java @@ -49,6 +49,12 @@ public class RunController { // 클린파킹 수동 실행 + return ResponseEntity.ok("Success"); + } + + @PostMapping("/menual/tax-sunap") + public ResponseEntity taxSunap() throws IOException { + return ResponseEntity.ok("Success"); } } diff --git a/src/main/java/com/worker/framework/WebClient/WebClientConf.java b/src/main/java/com/worker/framework/WebClient/WebClientConf.java new file mode 100644 index 0000000..0fe68b3 --- /dev/null +++ b/src/main/java/com/worker/framework/WebClient/WebClientConf.java @@ -0,0 +1,38 @@ +package com.worker.framework.WebClient; + +import io.netty.channel.ChannelOption; +import io.netty.handler.timeout.ReadTimeoutHandler; +import io.netty.handler.timeout.WriteTimeoutHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.netty.http.client.HttpClient; + +import java.time.Duration; +import java.util.concurrent.TimeUnit; + +@Component +public class WebClientConf { + + @Bean + public WebClient webClient() { + HttpClient httpClient = HttpClient.create() + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) + .responseTimeout(Duration.ofSeconds(10)) + .doOnConnected(conn -> conn + .addHandlerLast(new ReadTimeoutHandler(10, TimeUnit.SECONDS)) + .addHandlerLast(new WriteTimeoutHandler(10, TimeUnit.SECONDS))); + + return WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .exchangeStrategies( + ExchangeStrategies.builder() + .codecs(c -> c.defaultCodecs().maxInMemorySize(4 * 1024 * 1024)) + .build() + ) + .build(); + } + +} diff --git a/src/main/java/com/worker/dto/SinmungoDto.java b/src/main/java/com/worker/scheduler/smg/dto/SinmungoDto.java similarity index 99% rename from src/main/java/com/worker/dto/SinmungoDto.java rename to src/main/java/com/worker/scheduler/smg/dto/SinmungoDto.java index fad9b8f..b64deca 100644 --- a/src/main/java/com/worker/dto/SinmungoDto.java +++ b/src/main/java/com/worker/scheduler/smg/dto/SinmungoDto.java @@ -1,4 +1,4 @@ -package com.worker.dto; +package com.worker.scheduler.smg.dto; import com.worker.domain.entity.*; import jakarta.persistence.Lob; diff --git a/src/main/java/com/worker/scheduler/smg/repository/XmlSendQueryDslRepository.java b/src/main/java/com/worker/scheduler/smg/repository/XmlSendQueryDslRepository.java index 689417a..895a828 100644 --- a/src/main/java/com/worker/scheduler/smg/repository/XmlSendQueryDslRepository.java +++ b/src/main/java/com/worker/scheduler/smg/repository/XmlSendQueryDslRepository.java @@ -2,8 +2,7 @@ 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 com.worker.scheduler.smg.dto.SinmungoDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/worker/scheduler/smg/schedule/SinmungoInOutScheduler.java b/src/main/java/com/worker/scheduler/smg/schedule/SinmungoInOutScheduler.java index 6661f81..eafc0e7 100644 --- a/src/main/java/com/worker/scheduler/smg/schedule/SinmungoInOutScheduler.java +++ b/src/main/java/com/worker/scheduler/smg/schedule/SinmungoInOutScheduler.java @@ -2,7 +2,7 @@ package com.worker.scheduler.smg.schedule; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.worker.dto.SinmungoDto; +import com.worker.scheduler.smg.dto.SinmungoDto; import com.worker.scheduler.smg.service.DbPolling; import com.worker.scheduler.smg.service.XmlSend; import com.worker.util.common.commEnum.StateEnum; 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 f4ad68d..16bb5ed 100644 --- a/src/main/java/com/worker/scheduler/smg/service/DbPolling.java +++ b/src/main/java/com/worker/scheduler/smg/service/DbPolling.java @@ -3,7 +3,7 @@ package com.worker.scheduler.smg.service; import com.worker.domain.entity.*; import com.worker.domain.repo.cp.*; import com.worker.domain.repo.ep.*; -import com.worker.dto.SinmungoDto; +import com.worker.scheduler.smg.dto.SinmungoDto; import com.worker.util.common.CommonUtils; import com.worker.util.common.commEnum.DateTimePatternEnum; import com.worker.util.common.commEnum.FileKind; diff --git a/src/main/java/com/worker/scheduler/smg/service/XmlSend.java b/src/main/java/com/worker/scheduler/smg/service/XmlSend.java index 35f43e5..37fcfe2 100644 --- a/src/main/java/com/worker/scheduler/smg/service/XmlSend.java +++ b/src/main/java/com/worker/scheduler/smg/service/XmlSend.java @@ -1,14 +1,11 @@ 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; import com.worker.domain.repo.cp.CpUserRepository; 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.dto.SinmungoDto; import com.worker.scheduler.smg.repository.XmlSendQueryDslRepository; import com.worker.util.common.commEnum.StateEnum; import com.worker.util.fileMaker.XmlMacker; @@ -18,13 +15,8 @@ import org.springframework.stereotype.Service; import java.io.IOException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.ThreadLocalRandom; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; @Service @RequiredArgsConstructor diff --git a/src/main/java/com/worker/scheduler/tax/dto/TaxSunapDto.java b/src/main/java/com/worker/scheduler/tax/dto/TaxSunapDto.java new file mode 100644 index 0000000..34e986c --- /dev/null +++ b/src/main/java/com/worker/scheduler/tax/dto/TaxSunapDto.java @@ -0,0 +1,82 @@ +package com.worker.scheduler.tax.dto; + +import com.worker.domain.entity.CpSetinfo; +import lombok.*; + +public class TaxSunapDto { + + + public static class Request { + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class SetInfo { + private CpSetinfo cpSetinfo; + private CpSetinfo epSetinfo; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class SendReq { + private Header header; + private Body body; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class Header { + private String ifDate; + private String ifMsgKEy; + private String ifId; + private String source; + private String target; + private String ifType; + private String ifFormat; + private String retName; + private String retCode; + } + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class Body { + private String dmndSeCd; + private String sgbCd; + private String pyrSeCd; + private String pyrNo; + private String dptCd; + private String spacBizCd; + private String fyr; + private String actSeCd; + private String rprsTxmCd; + private String lvyNo; + private String itmSn; + } + + + } + + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class Response { + + private String state; // Success/Fail + private int code; // 200/500 ... + private String data; // 상세 메시지 + + } +} diff --git a/src/main/java/com/worker/scheduler/tax/schedule/TaxSunapScheduler.java b/src/main/java/com/worker/scheduler/tax/schedule/TaxSunapScheduler.java new file mode 100644 index 0000000..0aad7e8 --- /dev/null +++ b/src/main/java/com/worker/scheduler/tax/schedule/TaxSunapScheduler.java @@ -0,0 +1,59 @@ +package com.worker.scheduler.tax.schedule; + +import com.worker.domain.entity.CpSetinfo; +import com.worker.domain.repo.cp.CpSetinfoRepository; +import com.worker.scheduler.tax.dto.TaxSunapDto; +import com.worker.scheduler.tax.service.TaxSunapService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Component +@RequiredArgsConstructor +@Slf4j +public class TaxSunapScheduler { + + + private final WebClient webClient; + + private final TaxSunapService taxSunapService; + + private final CpSetinfoRepository cpSetinfoRepository; + + @Scheduled(fixedRate = 60 * 60 * 1000) + public void TaxSunapScheduler() { + + // setinfo 조회 + + +// private String PORT = ""; +// private String DIR = "/mediate/ltis"; + + + Mono taxSunapDtoMono = webClient.post() + .uri("") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .bodyValue(taxSunapService.taxSunapFindReqInfo()) + .retrieve() + .bodyToMono(TaxSunapDto.Response.class); + TaxSunapDto.Response res = taxSunapDtoMono.block(); + + log.info("[TAX] response: retCode={}, retName={}, retMsg={}", + res != null ? res.getState() : null, + res != null ? res.getCode() : null, + res != null ? res.getData() : null); + + taxSunapService.taxSunapUpdate(res); + + } + +} diff --git a/src/main/java/com/worker/scheduler/tax/service/TaxSunapService.java b/src/main/java/com/worker/scheduler/tax/service/TaxSunapService.java new file mode 100644 index 0000000..cc5eb9a --- /dev/null +++ b/src/main/java/com/worker/scheduler/tax/service/TaxSunapService.java @@ -0,0 +1,113 @@ +package com.worker.scheduler.tax.service; + +import com.worker.domain.entity.CpSetinfo; +import com.worker.domain.entity.CpSetinfoId; +import com.worker.domain.repo.cp.CpSetinfoRepository; +import com.worker.domain.repo.ep.EpSetinfoRepository; +import com.worker.scheduler.tax.dto.TaxSunapDto; +import lombok.RequiredArgsConstructor; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class TaxSunapService { + + private final Environment env; + + private final CpSetinfoRepository cpSetinfoRepository; + private final EpSetinfoRepository epSetinfoRepository; + + + public TaxSunapDto.Request.SendReq taxSunapFindReqInfo() { + + TaxSunapDto.Request.SetInfo setInfo = findSetinfo(); + + TaxSunapDto.Request.SendReq sendReq = TaxSunapDto.Request.SendReq.builder() + .header( + TaxSunapDto.Request.Header.builder() + .ifDate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))) + .ifMsgKEy(createIfMsgKey()) + .ifId("ERR_Z000012LGS_1741000NIS_0002") + .source(createIfSource(setInfo)) // 시군구 코드 + + .target("1741000NIS") + .ifType("S") + .ifFormat("J") + .retName("") + .retCode("") + .build()) + .body( + TaxSunapDto.Request.Body.builder() + .dmndSeCd("2") + .sgbCd("") + .pyrSeCd("") + .pyrNo("") + .dptCd("") + .spacBizCd("") + .fyr("") + .actSeCd("") + .rprsTxmCd("") + .lvyNo("") + .itmSn("00") + .build()) + .build(); + + return sendReq; + } + + public void taxSunapUpdate(TaxSunapDto.Response result) { + + + } + + + private String createIfMsgKey() { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); + String datePart = LocalDateTime.now().format(formatter); // 15자리 + String guidPart = UUID.randomUUID().toString().replace("-", ""); // 32자리 + + String ifMsgKey = "Z" + datePart + "-" + guidPart; + + return ifMsgKey; + } + + private String createIfSource(TaxSunapDto.Request.SetInfo setInfo) { + + if(setInfo.getCpSetinfo() != null) return setInfo.getCpSetinfo().getIntValue2().toString() + "DPV"; + else return setInfo.getEpSetinfo().getIntValue2().toString() + "ECA"; + + } + + private TaxSunapDto.Request.SetInfo findSetinfo() { + + String result = null; + + CpSetinfo cpSetinfo = cpSetinfoRepository.findById( + CpSetinfoId.builder() + .codeName(env.getProperty("esb.info.cp.codeName")) + .groupCode(env.getProperty("esb.info.cp.groupCode")) + .detailCode(env.getProperty("esb.info.cp.detailCode")) + .build() + ).orElse(null); + + CpSetinfo epSetInfo = epSetinfoRepository.findById( + CpSetinfoId.builder() + .codeName(env.getProperty("esb.info.ep.codeName")) + .groupCode(env.getProperty("esb.info.ep.groupCode")) + .detailCode(env.getProperty("esb.info.ep.detailCode")) + .build() + ).orElse(null); + + return TaxSunapDto.Request.SetInfo.builder() + .cpSetinfo(cpSetinfo) + .epSetinfo(epSetInfo) + .build(); + + } + +} diff --git a/src/main/java/com/worker/util/fileMaker/XmlMacker.java b/src/main/java/com/worker/util/fileMaker/XmlMacker.java index 1af39c3..9365310 100644 --- a/src/main/java/com/worker/util/fileMaker/XmlMacker.java +++ b/src/main/java/com/worker/util/fileMaker/XmlMacker.java @@ -1,9 +1,7 @@ package com.worker.util.fileMaker; -import com.worker.domain.entity.CpAnswer; import com.worker.domain.entity.CpSetinfo; -import com.worker.domain.entity.CpUser; -import com.worker.dto.SinmungoDto; +import com.worker.scheduler.smg.dto.SinmungoDto; import com.worker.util.common.commEnum.StateEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -16,7 +14,6 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.concurrent.ThreadLocalRandom; @Component @Slf4j diff --git a/src/main/java/com/worker/util/fileReader/XmlReader.java b/src/main/java/com/worker/util/fileReader/XmlReader.java index a6cdf67..556a034 100644 --- a/src/main/java/com/worker/util/fileReader/XmlReader.java +++ b/src/main/java/com/worker/util/fileReader/XmlReader.java @@ -1,6 +1,6 @@ package com.worker.util.fileReader; -import com.worker.dto.SinmungoDto; +import com.worker.scheduler.smg.dto.SinmungoDto; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -11,8 +11,6 @@ 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; diff --git a/src/main/java/com/worker/util/fileReader/impl/SinmungoXmlParser.java b/src/main/java/com/worker/util/fileReader/impl/SinmungoXmlParser.java index 92268c1..ebc7a23 100644 --- a/src/main/java/com/worker/util/fileReader/impl/SinmungoXmlParser.java +++ b/src/main/java/com/worker/util/fileReader/impl/SinmungoXmlParser.java @@ -1,6 +1,6 @@ package com.worker.util.fileReader.impl; -import com.worker.dto.SinmungoDto; +import com.worker.scheduler.smg.dto.SinmungoDto; import com.worker.util.common.commEnum.FileKind; import com.worker.util.fileReader.XmlParserInterface; import org.springframework.stereotype.Component;