feat : jpa레파지토리 정의하지 않은 필드 null로 들어감. -> queryDsl 업데이트로 수정. epost로직 커져서 send / recv 클래스 분리

master
Kurt92 3 months ago
parent f4da3c50ea
commit 3015edc4c3

@ -32,126 +32,11 @@ import static com.worker.domain.entity.QTbCntcSndngResult.tbCntcSndngResult;
@RequiredArgsConstructor
public class EPostQueryDslRepository {
public List<EPostDto.SendTarget.Key> findSendTargetKeys(JPAQueryFactory queryFactory) {
List<EPostDto.SendTarget.Key> result = queryFactory
.select(
Projections.fields(
EPostDto.SendTarget.Key.class,
epostSenderReg.tgCode,
epostSenderReg.conKey,
epostSenderReg.postProcStt,
epostSenderReg.regYmd,
cpGojit.tgGb,
Expressions.as(Expressions.nullExpression(String.class), "tgPostYn"),
Expressions.as(Expressions.nullExpression(String.class), "tgUnitySndngMastrId")
)
)
.from(epostSenderReg)
.leftJoin(cpGojit).on(epostSenderReg.tgCode.eq(cpGojit.tgCode.stringValue()))
.where(epostSenderReg.postProcStt.eq("01"))
.fetch();
return result;
}
// 일반 발송
public List<EPostDto.SendTarget.Target> findSendTargets(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Key> keys) {
List<String> tgCode = keys.stream().map(EPostDto.SendTarget.Key::getTgCode).collect(Collectors.toList());
List<String> conKey = keys.stream().map(EPostDto.SendTarget.Key::getConKey).collect(Collectors.toList());
List<EPostDto.SendTarget.Target> result = queryFactory
.select(
Projections.fields(
EPostDto.SendTarget.Target.class,
epostSenderReg.tgCode,
epostSenderReg.conKey,
epostSenderDetail.rgstNmbr,
epostSenderDetail.recevSeq,
epostSenderReg.rceptId,
epostSenderReg.dataCd,
epostSenderReg.divKb,
epostSenderReg.dfpayyn,
epostSenderReg.rcptKb,
epostSenderReg.sealCd,
epostSenderReg.wordKb,
epostSenderReg.mailCnt,
epostSenderReg.envCd,
epostSenderReg.colorYn,
epostSenderReg.mmYn,
epostSenderReg.flexCd,
epostSenderReg.dmCnt,
epostSenderReg.sbFg,
epostSenderReg.apvlNb,
epostSenderReg.sendDate,
epostSenderReg.sendTime,
epostSenderReg.relorsectCd
)
)
.from(epostSenderReg)
.innerJoin(epostSenderDetail).on(epostSenderReg.conKey.eq(epostSenderDetail.conKey))
.leftJoin(cpInstruct).on(epostSenderDetail.recevSeq.eq(cpInstruct.itMmcode))
.leftJoin(cpInstructAnswer).on(
cpInstruct.itSggcode.eq(cpInstructAnswer.id.iaSggcode),
cpInstruct.itCause.eq(cpInstructAnswer.id.iaCode)
)
.where(
epostSenderReg.postProcStt.eq("01"),
epostSenderReg.tgCode.in(tgCode),
epostSenderReg.conKey.in(conKey)
)
.fetch();
return result;
}
// 전자고지를 쓰는 서버 발송
// 전자고지 테이블 조인함.
public List<EPostDto.SendTarget.Target> findSendEgojiTargets(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Key> keys) {
List<String> tgCode = keys.stream().map(EPostDto.SendTarget.Key::getTgCode).collect(Collectors.toList());
List<String> conKey = keys.stream().map(EPostDto.SendTarget.Key::getConKey).collect(Collectors.toList());
List<String> unitySndngMastrId = keys.stream().map(EPostDto.SendTarget.Key::getTgUnitySndngMastrId).collect(Collectors.toList());
List<EPostDto.SendTarget.Target> result = queryFactory
.select(
Projections.fields(
EPostDto.SendTarget.Target.class,
epostSenderReg.tgCode,
epostSenderReg.conKey,
epostSenderDetail.rgstNmbr,
epostSenderDetail.recevSeq,
tbCntcSndngResult.sndngResultSttus
)
)
.from(epostSenderReg)
.innerJoin(epostSenderDetail).on(epostSenderReg.conKey.eq(epostSenderDetail.conKey))
.leftJoin(cpInstruct).on(epostSenderDetail.recevSeq.eq(cpInstruct.itMmcode))
.leftJoin(cpInstructAnswer).on(
cpInstruct.itSggcode.eq(cpInstructAnswer.id.iaSggcode),
cpInstruct.itCause.eq(cpInstructAnswer.id.iaCode)
)
.leftJoin(tbCntcSndngDetail).on(epostSenderDetail.recevSeq.eq(tbCntcSndngDetail.mainCode))
.leftJoin(tbCntcSndngResult).on(tbCntcSndngDetail.unitySndngDetailId.eq(tbCntcSndngResult.unitySndngDetailId))
.where(
epostSenderReg.postProcStt.eq("01"),
epostSenderReg.tgCode.in(tgCode),
epostSenderReg.conKey.in(conKey),
tbCntcSndngDetail.unitySndngMastrId.in(unitySndngMastrId),
tbCntcSndngResult.sndngResultSttus.ne("READ")
.and(tbCntcSndngResult.sndngResultSttus.isNull()
)
)
.fetch();
return result;
}
// @Transactional(readOnly = true, transactionManager = "cpTransactionManager")
/**
*
* */
public List<EPostDto.SearchDelivTarget> findDelivResult(JPAQueryFactory queryFactory, List<EPostDto.Deliv> dtos, Set<String> cpDeptCode) {
@ -209,7 +94,9 @@ public class EPostQueryDslRepository {
}
/**
*
* */
public List<EPostDto.SearchPrtTarget> findMakeResult(JPAQueryFactory queryFactory, List<EPostDto.Prt> dtos, Set<String> cpDeptCode) {
List<String> conKeys = dtos.stream()
.map(EPostDto.Prt::getConKey)
@ -241,6 +128,9 @@ public class EPostQueryDslRepository {
}
/**
*
* */
public List<EPostDto.SearchRecvTarget> findRecvResult(JPAQueryFactory queryFactory, List<EPostDto.Recv> dtos, Set<String> cpDeptCode) {
List<String> conKeys = dtos.stream()
@ -277,6 +167,9 @@ public class EPostQueryDslRepository {
return results;
}
/**
*
* */
public void updateRecvResult(JPAQueryFactory queryFactory, List<EPostDto.Recv> dtos, List<EPostDto.SearchRecvTarget> results) {
//gojit tg_post_proc_stt 가 05 미만이면 '05' 로 업데이트
@ -345,34 +238,11 @@ public class EPostQueryDslRepository {
public void updateMakeResult(List<EPostDto.Prt> dtos, List<EPostDto.EPostFileRead> parseResult) {
}
public void updateSenderRegPostStt(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Target> cpSendTargets) {
List<String> conKeys = cpSendTargets.stream()
.map(post -> post.getConKey())
.collect(Collectors.toUnmodifiableList());
queryFactory.update(epostSenderReg)
.set(epostSenderReg.postProcStt, "03")
.where(epostSenderReg.conKey.in(conKeys))
.execute();
}
public void updateGojitPostYn(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Target> cpSendEgojiTargets) {
List<String> conKeys = cpSendEgojiTargets.stream()
.map(post -> post.getConKey())
.collect(Collectors.toUnmodifiableList());
queryFactory.update(cpGojit)
.set(cpGojit.tgPostYn, "Y")
.where(cpGojit.tgConKey.in(conKeys))
.execute();
}
/**
*
* */
public Long findEpostDelivResultMaxKey(JPAQueryFactory queryFactory, String conKey) {
return queryFactory
.select(epostDelivResult.seqKey.max())
@ -381,6 +251,9 @@ public class EPostQueryDslRepository {
.fetchOne();
}
/**
*
* */
public String findGojiHistMAxKey(JPAQueryFactory queryFactory, String key) {
return queryFactory
.select(cpGojiSendHist.ghCode.max())
@ -390,28 +263,8 @@ public class EPostQueryDslRepository {
}
public void updateOldPostToCancel(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Key> oldPosts) {
List<String> conKeys = oldPosts.stream()
.map(post -> post.getConKey())
.collect(Collectors.toUnmodifiableList());
queryFactory.update(epostSenderReg)
.set(epostSenderReg.postProcStt, "02")
.where(epostSenderReg.conKey.in(conKeys))
.execute();
}
public void updateTrgstNmbr(JPAQueryFactory queryFactory, EpostRgstNmbr trgstNmbr){
queryFactory.update(epostRgstNmbr)
.set(epostRgstNmbr.pcursor, "0")
.where(epostRgstNmbr.rgstNmbr.eq(trgstNmbr.getRgstNmbr()))
.execute();
queryFactory.update(epostRgstNmbr)
.set(epostRgstNmbr.pcursor, "1")
.where(epostRgstNmbr.rgstNmbr.eq(trgstNmbr.getRgstNmbrNext()))
.execute();
}
}

@ -0,0 +1,245 @@
package com.worker.scheduler.epost.repository;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.worker.domain.entity.EpostRgstNmbr;
import com.worker.domain.entity.EpostSenderDetail;
import com.worker.scheduler.epost.dto.EPostDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.stream.Collectors;
import static com.worker.domain.entity.QCpGojiPrt.cpGojiPrt;
import static com.worker.domain.entity.QCpGojit.cpGojit;
import static com.worker.domain.entity.QCpInstruct.cpInstruct;
import static com.worker.domain.entity.QCpInstructAnswer.cpInstructAnswer;
import static com.worker.domain.entity.QEpostRgstNmbr.epostRgstNmbr;
import static com.worker.domain.entity.QEpostSenderDetail.epostSenderDetail;
import static com.worker.domain.entity.QEpostSenderReg.epostSenderReg;
import static com.worker.domain.entity.QTbCntcSndngDetail.tbCntcSndngDetail;
import static com.worker.domain.entity.QTbCntcSndngResult.tbCntcSndngResult;
@Repository
@RequiredArgsConstructor
@Slf4j
public class EPostSendQueryDslRepository {
/**
*
* */
public List<EPostDto.SendTarget.Key> findSendTargetKeys(JPAQueryFactory queryFactory) {
List<EPostDto.SendTarget.Key> result = queryFactory
.select(
Projections.fields(
EPostDto.SendTarget.Key.class,
epostSenderReg.tgCode,
epostSenderReg.conKey,
epostSenderReg.postProcStt,
epostSenderReg.regYmd,
cpGojit.tgGb,
Expressions.as(Expressions.nullExpression(String.class), "tgPostYn"),
Expressions.as(Expressions.nullExpression(String.class), "tgUnitySndngMastrId")
)
)
.from(epostSenderReg)
.leftJoin(cpGojit).on(epostSenderReg.tgCode.eq(cpGojit.tgCode.stringValue()))
.where(epostSenderReg.postProcStt.eq("01"))
.fetch();
return result;
}
/**
*
* */
public List<EPostDto.SendTarget.Target> findSendTargets(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Key> keys) {
List<String> tgCode = keys.stream().map(EPostDto.SendTarget.Key::getTgCode).collect(Collectors.toList());
List<String> conKey = keys.stream().map(EPostDto.SendTarget.Key::getConKey).collect(Collectors.toList());
List<EPostDto.SendTarget.Target> result = queryFactory
.select(
Projections.fields(
EPostDto.SendTarget.Target.class,
epostSenderReg.tgCode,
epostSenderReg.conKey,
epostSenderDetail.rgstNmbr,
epostSenderDetail.recevSeq,
epostSenderReg.rceptId,
epostSenderReg.dataCd,
epostSenderReg.divKb,
epostSenderReg.dfpayyn,
epostSenderReg.rcptKb,
epostSenderReg.sealCd,
epostSenderReg.wordKb,
epostSenderReg.mailCnt,
epostSenderReg.envCd,
epostSenderReg.colorYn,
epostSenderReg.mmYn,
epostSenderReg.flexCd,
epostSenderReg.dmCnt,
epostSenderReg.sbFg,
epostSenderReg.apvlNb,
epostSenderReg.sendDate,
epostSenderReg.sendTime,
epostSenderReg.relorsectCd
)
)
.from(epostSenderReg)
.innerJoin(epostSenderDetail).on(epostSenderReg.conKey.eq(epostSenderDetail.conKey))
.leftJoin(cpInstruct).on(epostSenderDetail.recevSeq.eq(cpInstruct.itMmcode))
.leftJoin(cpInstructAnswer).on(
cpInstruct.itSggcode.eq(cpInstructAnswer.id.iaSggcode),
cpInstruct.itCause.eq(cpInstructAnswer.id.iaCode)
)
.where(
epostSenderReg.postProcStt.eq("01"),
epostSenderReg.tgCode.in(tgCode),
epostSenderReg.conKey.in(conKey)
)
.fetch();
return result;
}
/**
*
* .
* */
public List<EPostDto.SendTarget.Target> findSendEgojiTargets(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Key> keys) {
List<String> tgCode = keys.stream().map(EPostDto.SendTarget.Key::getTgCode).collect(Collectors.toList());
List<String> conKey = keys.stream().map(EPostDto.SendTarget.Key::getConKey).collect(Collectors.toList());
List<String> unitySndngMastrId = keys.stream().map(EPostDto.SendTarget.Key::getTgUnitySndngMastrId).collect(Collectors.toList());
List<EPostDto.SendTarget.Target> result = queryFactory
.select(
Projections.fields(
EPostDto.SendTarget.Target.class,
epostSenderReg.tgCode,
epostSenderReg.conKey,
epostSenderDetail.rgstNmbr,
epostSenderDetail.recevSeq,
tbCntcSndngResult.sndngResultSttus
)
)
.from(epostSenderReg)
.innerJoin(epostSenderDetail).on(epostSenderReg.conKey.eq(epostSenderDetail.conKey))
.leftJoin(cpInstruct).on(epostSenderDetail.recevSeq.eq(cpInstruct.itMmcode))
.leftJoin(cpInstructAnswer).on(
cpInstruct.itSggcode.eq(cpInstructAnswer.id.iaSggcode),
cpInstruct.itCause.eq(cpInstructAnswer.id.iaCode)
)
.leftJoin(tbCntcSndngDetail).on(epostSenderDetail.recevSeq.eq(tbCntcSndngDetail.mainCode))
.leftJoin(tbCntcSndngResult).on(tbCntcSndngDetail.unitySndngDetailId.eq(tbCntcSndngResult.unitySndngDetailId))
.where(
epostSenderReg.postProcStt.eq("01"),
epostSenderReg.tgCode.in(tgCode),
epostSenderReg.conKey.in(conKey),
tbCntcSndngDetail.unitySndngMastrId.in(unitySndngMastrId),
tbCntcSndngResult.sndngResultSttus.ne("READ")
.and(tbCntcSndngResult.sndngResultSttus.isNull()
)
)
.fetch();
return result;
}
/**
* RegYmd 30
* */
public void updateOldPostToCancel(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Key> oldPosts) {
List<String> conKeys = oldPosts.stream()
.map(post -> post.getConKey())
.collect(Collectors.toUnmodifiableList());
queryFactory.update(epostSenderReg)
.set(epostSenderReg.postProcStt, "02")
.where(epostSenderReg.conKey.in(conKeys))
.execute();
}
/**
*
* */
public void updateTrgstNmbrPoint(JPAQueryFactory queryFactory, EpostRgstNmbr trgstNmbr){
queryFactory.update(epostRgstNmbr)
.set(epostRgstNmbr.pcursor, "0")
.where(epostRgstNmbr.rgstNmbr.eq(trgstNmbr.getRgstNmbr()))
.execute();
queryFactory.update(epostRgstNmbr)
.set(epostRgstNmbr.pcursor, "1")
.where(epostRgstNmbr.rgstNmbr.eq(trgstNmbr.getRgstNmbrNext()))
.execute();
}
/**
*
* */
public void updateSenderRegPostStt(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Target> cpSendTargets) {
List<String> conKeys = cpSendTargets.stream()
.map(post -> post.getConKey())
.collect(Collectors.toUnmodifiableList());
queryFactory.update(epostSenderReg)
.set(epostSenderReg.postProcStt, "03")
.where(epostSenderReg.conKey.in(conKeys))
.execute();
}
/**
*
* */
public void updateGojitPostYn(JPAQueryFactory queryFactory, List<EPostDto.SendTarget.Target> cpSendEgojiTargets) {
List<String> conKeys = cpSendEgojiTargets.stream()
.map(post -> post.getConKey())
.collect(Collectors.toUnmodifiableList());
queryFactory.update(cpGojit)
.set(cpGojit.tgPostYn, "Y")
.where(cpGojit.tgConKey.in(conKeys))
.execute();
}
public void updateTrgstNmbr(JPAQueryFactory queryFactory, EPostDto.SendTarget.Target target, String trgstNmbr) {
queryFactory.update(epostSenderDetail)
.set(epostSenderDetail.rgstNmbr, trgstNmbr)
.where(
epostSenderDetail.conKey.eq(target.getConKey()),
epostSenderDetail.recevSeq.eq(target.getRecevSeq())
)
.execute();
queryFactory.update(cpGojiPrt)
.set(cpGojiPrt.gpRegistNo, trgstNmbr)
.where(
cpGojiPrt.gpConKey.eq(target.getConKey()),
cpGojiPrt.gpMmcode.eq(target.getRecevSeq())
)
.execute();
}
public void updatePostSendState(JPAQueryFactory queryFactory, EPostDto.SendTarget.Target target) {
queryFactory.update(epostSenderDetail)
.set(epostSenderDetail.postSendState, "1")
.where(
epostSenderDetail.conKey.eq(target.getConKey()),
epostSenderDetail.recevSeq.eq(target.getRecevSeq())
)
.execute();
}
}

@ -2,6 +2,7 @@ package com.worker.scheduler.epost.schedule;
import com.worker.scheduler.epost.dto.EPostDto;
import com.worker.scheduler.epost.repository.EPostQueryDslRepository;
import com.worker.scheduler.epost.service.EPostSendService;
import com.worker.scheduler.epost.service.EPostService;
import com.worker.scheduler.epost.service.EpostSetinfoService;
import com.worker.scheduler.smg.dto.SinmungoDto;
@ -25,6 +26,7 @@ public class EPostScheduler {
private final EpostSetinfoService epostSetinfoService;
private final EPostService ePostService;
private final EPostSendService ePostSendService;
private final FileReader fileReader;
@ -39,7 +41,7 @@ public class EPostScheduler {
EPostDto.SetInfo setInfo = epostSetinfoService.findSetInfo();
// 발송타겟 조회
ePostService.findEPostSendTarget(setInfo);
ePostSendService.findEPostSendTarget(setInfo);
}

@ -0,0 +1,267 @@
package com.worker.scheduler.epost.service;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.worker.domain.entity.CpGojiPrt;
import com.worker.domain.entity.EpostRgstNmbr;
import com.worker.domain.entity.EpostSenderDetail;
import com.worker.domain.repo.cp.CpEPostRgstNmbr;
import com.worker.domain.repo.ep.EpEPostRgstNmbr;
import com.worker.scheduler.epost.dto.EPostDto;
import com.worker.scheduler.epost.repository.EPostQueryDslRepository;
import com.worker.scheduler.epost.repository.EPostSendQueryDslRepository;
import com.worker.util.common.CommonUtils;
import com.worker.util.textFileMacker.TextMaker;
import com.worker.util.zipFileMaker.ZipMaker;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@Slf4j
public class EPostSendService {
private final Environment env;
private final CommonUtils utils;
private final ZipMaker zipMaker;
private final TextMaker textMaker;
private final CpEPostRgstNmbr cpEPostRgstNmbr;
private final EpEPostRgstNmbr epEPostRgstNmbr;
private final EPostSendQueryDslRepository ePostSendQueryDslRepository;
@Autowired
@Qualifier("cpQueryFactory")
private JPAQueryFactory cpQueryFactory;
@Autowired
@Qualifier("epQueryFactory")
private JPAQueryFactory epQueryFactory;
@Transactional
public void findEPostSendTarget(EPostDto.SetInfo setInfo) {
List<EPostDto.SendTarget.Key> cpSendTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> epSendTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> cpSendEpostTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> epSendEpostTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> cpSendEgojiTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> epSendEgojiTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Target> cpSendEpostTargets = new ArrayList<>();
List<EPostDto.SendTarget.Target> epSendEpostTargets = new ArrayList<>();
List<EPostDto.SendTarget.Target> cpSendEgojiTargets = new ArrayList<>();
List<EPostDto.SendTarget.Target> epSendEgojiTargets = new ArrayList<>();
// 타겟의 키,code 조회
// getTgPostYn 이 전자고지를 안쓰는 경우 컬럼자체가 존재하지 않음.
// 해서 queryDsl에서는 익스프래셔으로 널처리
//Gojit
if(setInfo.getCpEPostInfo() != null) cpSendTargetKeys = ePostSendQueryDslRepository.findSendTargetKeys(cpQueryFactory);
if(setInfo.getEpEPostInfo() != null) epSendTargetKeys = ePostSendQueryDslRepository.findSendTargetKeys(epQueryFactory);
//대상 없으면 매서드 종료
if(cpSendTargetKeys.isEmpty() && epSendTargetKeys.isEmpty()) {
return;
}
// REG_YMD 오늘기준 30일 이전 자료들 취소(POST_PROC_STT = '02') 로 변경
List<EPostDto.SendTarget.Key> cancelled = new ArrayList<>();
try {
cancelled = cancelOldPost(cpSendTargetKeys, epSendTargetKeys);
} catch (Exception e) {
log.error("30일 이전 자료들 취소 실패: cpKeys={}, epKeys={}", cpSendTargetKeys == null ? 0 : cpSendTargetKeys.size(), epSendTargetKeys == null ? 0 : epSendTargetKeys.size(), e);
throw e;
}
// 30일 초과 자료들 콘키 추출
Set<String> cancelledKeys = cancelled.stream()
.map(EPostDto.SendTarget.Key::getConKey)
.collect(Collectors.toSet());
// 전자고지/일반 대상 분리
// getTgPostYn 널처리
// 스트림에서는 오브젝트 이퀄로 널처리 (null 이면 걸러짐)
// 30일 초과 자료들 제외
cpSendEgojiTargetKeys = cpSendTargetKeys.stream()
.filter(target -> Objects.equals(target.getTgPostYn(), "E"))
.filter(target -> !cancelledKeys.contains(target.getConKey()))
.toList();
epSendEgojiTargetKeys = epSendTargetKeys.stream()
.filter(target -> Objects.equals(target.getTgPostYn(), "E"))
.filter(target -> !cancelledKeys.contains(target.getConKey()))
.toList();
cpSendEpostTargetKeys = cpSendTargetKeys.stream()
.filter(target -> target.getTgPostYn() == null || target.getTgPostYn().equals("N"))
.filter(target -> !cancelledKeys.contains(target.getConKey()))
.toList();
epSendEpostTargetKeys = epSendTargetKeys.stream()
.filter(target -> target.getTgPostYn() == null || target.getTgPostYn().equals("N"))
.filter(target -> !cancelledKeys.contains(target.getConKey()))
.toList();
// 조회한 키로 cpSendTargets 의 상세내용 조회
// qryFor
// 일반
if(!cpSendEpostTargetKeys.isEmpty()) cpSendEpostTargets = ePostSendQueryDslRepository.findSendTargets(cpQueryFactory, cpSendTargetKeys);
if(!epSendEpostTargetKeys.isEmpty()) epSendEpostTargets = ePostSendQueryDslRepository.findSendTargets(epQueryFactory, epSendTargetKeys);
if(setInfo.getCpIsEns() || setInfo.getEpIsEns()) {
// 전자고지 대상 조회
// qryEgoji
if (setInfo.getCpIsEns())
cpSendEgojiTargets = ePostSendQueryDslRepository.findSendEgojiTargets(cpQueryFactory, cpSendEgojiTargetKeys);
if (setInfo.getEpIsEns())
epSendEgojiTargets = ePostSendQueryDslRepository.findSendEgojiTargets(epQueryFactory, epSendEgojiTargetKeys);
}
//notice(안내문구 인거같음)
//goit notice 조인
// notice 안씀. 관련 로직 폐기해도 됨.
// 사전통보 or 계도 대상에서 mmcode만 추출 (prt_gubun = '0'사전통보 || prt_gubun = 'A' 계도)
// 사전 & 계도는 사진 같이 나감.
final List<EPostDto.SendTarget.Target> cpTargets = Optional.ofNullable(cpSendEpostTargets).orElseGet(List::of);
List<String> targetCpMmCodes = cpSendTargetKeys.stream()
.filter(o -> "0".equals(o.getTgGb()) || "A".equals(o.getTgGb()))
.flatMap(o -> cpTargets.stream()
.filter(t -> Objects.equals(o.getConKey(), t.getConKey()))
.map(EPostDto.SendTarget.Target::getRecevSeq))
.filter(Objects::nonNull)
.toList();
final List<EPostDto.SendTarget.Target> epTargets = Optional.ofNullable(epSendEpostTargets).orElseGet(List::of);
List<String> targetEpMmCodes = epSendTargetKeys.stream()
.filter(o -> "0".equals(o.getTgGb()) || "A".equals(o.getTgGb()))
.flatMap(o -> epTargets.stream()
.filter(t -> Objects.equals(o.getConKey(), t.getConKey()))
.map(EPostDto.SendTarget.Target::getRecevSeq))
.filter(Objects::nonNull)
.toList();
// mmcode로 이미지 파일 찾아서 zip생성
try {
zipMaker.generateZipFile(targetCpMmCodes, targetEpMmCodes, setInfo);
} catch (Exception e) {
log.error("ZIP 파일 생성 실패 : " + e.getMessage());
}
// SendTargets 돌면서 전자고지인지 체크
// 거기서 대기상태("E") 인 얘들의 등기번호를 업데이트
// cpSendEgojiTargetKeys 등기번호 업데이트 하면 될듯
egojiNonReadTargetsUpdateTrgstNmbr(cpSendEgojiTargets, epSendEgojiTargets);
// POST_SEND_STATE 업데이트 to "1"
updateSendState(cpSendEpostTargets, epSendEpostTargets, cpSendEgojiTargets, epSendEgojiTargets);
//qryRegSet POST_PROC_STT = 03, TG_POST_YN = "Y" 으로 업데이트
if(!cpSendEpostTargets.isEmpty()) ePostSendQueryDslRepository.updateSenderRegPostStt(cpQueryFactory, cpSendEpostTargets);
if(!cpSendEgojiTargets.isEmpty()) ePostSendQueryDslRepository.updateGojitPostYn(epQueryFactory, epSendEgojiTargets);
if(!epSendEpostTargets.isEmpty()) ePostSendQueryDslRepository.updateSenderRegPostStt(cpQueryFactory, cpSendEpostTargets);
if(!epSendEgojiTargets.isEmpty()) ePostSendQueryDslRepository.updateGojitPostYn(epQueryFactory, epSendEgojiTargets);
// 택스트파일 생성
textMaker.generateTextFile(cpSendEpostTargets);
}
private List<EPostDto.SendTarget.Key> cancelOldPost(List<EPostDto.SendTarget.Key> cpSendTargetKeys, List<EPostDto.SendTarget.Key> epSendTargetKeys) {
String before30DaysFromNow = LocalDateTime.now().minusDays(30).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
List<EPostDto.SendTarget.Key> returnSuccessPosts = new ArrayList<>();
List<EPostDto.SendTarget.Key> oldCpPosts = cpSendTargetKeys.stream()
.filter(post -> post.getRegYmd().compareTo(before30DaysFromNow) < 0)
.toList();
List<EPostDto.SendTarget.Key> oldEpPosts = epSendTargetKeys.stream()
.filter(post -> post.getRegYmd().compareTo(before30DaysFromNow) < 0)
.toList();
if(!oldCpPosts.isEmpty()) ePostSendQueryDslRepository.updateOldPostToCancel(cpQueryFactory, oldCpPosts);
if(!oldEpPosts.isEmpty()) ePostSendQueryDslRepository.updateOldPostToCancel(epQueryFactory, oldEpPosts);
// 30일 초과한 발송 리턴
returnSuccessPosts.addAll(oldCpPosts);
returnSuccessPosts.addAll(oldEpPosts);
return returnSuccessPosts;
}
private void egojiNonReadTargetsUpdateTrgstNmbr(List<EPostDto.SendTarget.Target> cpSendEgojiTargets, List<EPostDto.SendTarget.Target> epSendEgojiTargets) {
if(!cpSendEgojiTargets.isEmpty())
cpSendEgojiTargets.forEach(cpEpostSenderDetail -> {
ePostSendQueryDslRepository.updateTrgstNmbr(cpQueryFactory, cpEpostSenderDetail, generateTrgstNmbr("cp"));
});
if(!epSendEgojiTargets.isEmpty())
epSendEgojiTargets.forEach(epEpostSenderDetail -> {
ePostSendQueryDslRepository.updateTrgstNmbr(cpQueryFactory, epEpostSenderDetail, generateTrgstNmbr("ep"));
});
}
private void updateSendState(
List<EPostDto.SendTarget.Target> cpSendEpostTargets, List<EPostDto.SendTarget.Target> epSendEpostTargets,
List<EPostDto.SendTarget.Target> cpSendEgojiTargets, List<EPostDto.SendTarget.Target> epSendEgojiTargets) {
if(!cpSendEpostTargets.isEmpty())
cpSendEpostTargets.forEach(cpSendTarget -> {
ePostSendQueryDslRepository.updatePostSendState(cpQueryFactory, cpSendTarget);
});
if(!epSendEpostTargets.isEmpty())
epSendEpostTargets.forEach(epSendTarget -> {
ePostSendQueryDslRepository.updatePostSendState(epQueryFactory, epSendTarget);
});
if(!cpSendEgojiTargets.isEmpty())
cpSendEgojiTargets.forEach(cpSendEgojiTarget -> {
ePostSendQueryDslRepository.updatePostSendState(cpQueryFactory, cpSendEgojiTarget);
});
if(!epSendEgojiTargets.isEmpty())
epSendEgojiTargets.forEach(epSendEgojiTarget -> {
ePostSendQueryDslRepository.updatePostSendState(epQueryFactory, epSendEgojiTarget);
});
}
private String generateTrgstNmbr(String dbKind) {
// select * from EPOST_RGST_NMBR where pcursor= '1' ;
String regiNo = null;
EpostRgstNmbr cpTrgstNmbr = cpEPostRgstNmbr.findByPcursor("1");
EpostRgstNmbr epTrgstNmbr = epEPostRgstNmbr.findByPcursor("1");
if(dbKind.equals("cp")) {
regiNo = cpTrgstNmbr.getRgstNmbr();
ePostSendQueryDslRepository.updateTrgstNmbrPoint(cpQueryFactory, cpTrgstNmbr);
}
if(dbKind.equals("ep")) {
regiNo = epTrgstNmbr.getRgstNmbr();
ePostSendQueryDslRepository.updateTrgstNmbrPoint(epQueryFactory, epTrgstNmbr);
}
return regiNo;
}
}

@ -29,10 +29,7 @@ import java.util.stream.Collectors;
@Slf4j
public class EPostService {
private final Environment env;
private final CommonUtils utils;
private final ZipMaker zipMaker;
private final TextMaker textMaker;
private final ObjectMapper objectMapper;
private final CpSetinfoRepository cpSetinfoRepository;
@ -51,8 +48,10 @@ public class EPostService {
private final EpEPostSenderDetailRepository epEPostSenderDetailRepository;
private final CpEPostSenderRegRepository cpEPostSenderRegRepository;
private final EpEPostSenderRegRepository epEPostSenderRegRepository;
private final CpEPostRgstNmbr cpEPostRgstNmbr;
private final EpEPostRgstNmbr epEPostRgstNmbr;
private final CpGojiPrtRepository cpGojiPrtRepository;
private final EpGojiPrtRepository epGojiPrtRepository;
private final EPostQueryDslRepository ePostQueryDslRepository;
@ -65,133 +64,8 @@ public class EPostService {
@Autowired
@Qualifier("epQueryFactory")
private JPAQueryFactory epQueryFactory;
@Autowired
private CpGojiPrtRepository cpGojiPrtRepository;
@Autowired
private EpGojiPrtRepository epGojiPrtRepository;
@Transactional
public void findEPostSendTarget(EPostDto.SetInfo setInfo) {
List<EPostDto.SendTarget.Key> cpSendTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> epSendTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> cpSendEpostTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> epSendEpostTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> cpSendEgojiTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Key> epSendEgojiTargetKeys = new ArrayList<>();
List<EPostDto.SendTarget.Target> cpSendTargets = new ArrayList<>();
List<EPostDto.SendTarget.Target> epSendTargets = new ArrayList<>();
List<EPostDto.SendTarget.Target> cpSendEgojiTargets = new ArrayList<>();
List<EPostDto.SendTarget.Target> epSendEgojiTargets = new ArrayList<>();
// 타겟의 키,code 조회
// getTgPostYn 이 전자고지를 안쓰는 경우 컬럼자체가 존재하지 않음.
// 해서 queryDsl에서는 익스프래셔으로 널처리
//Gojit
if(setInfo.getCpEPostInfo() != null) cpSendTargetKeys = ePostQueryDslRepository.findSendTargetKeys(cpQueryFactory);
if(setInfo.getEpEPostInfo() != null) epSendTargetKeys = ePostQueryDslRepository.findSendTargetKeys(epQueryFactory);
// 전자고지/일반 대상 분리
// getTgPostYn 널처리
// 스트림에서는 오브젝트 이퀄로 널처리 (null 이면 걸러짐)
cpSendEgojiTargetKeys = cpSendTargetKeys.stream()
.filter(target -> Objects.equals(target.getTgPostYn(), "E"))
.toList();
epSendEgojiTargetKeys = epSendTargetKeys.stream()
.filter(target -> Objects.equals(target.getTgPostYn(), "E"))
.toList();
cpSendEpostTargetKeys = cpSendTargetKeys.stream()
.filter(target -> target.getTgPostYn() == null || target.getTgPostYn().equals("N"))
.toList();
epSendEpostTargetKeys = epSendTargetKeys.stream()
.filter(target -> target.getTgPostYn() == null || target.getTgPostYn().equals("N"))
.toList();
// 조회한 키로 cpSendTargets 의 상세내용 조회
// qryFor
// 일반
if(!cpSendEpostTargetKeys.isEmpty()) cpSendTargets = ePostQueryDslRepository.findSendTargets(cpQueryFactory, cpSendTargetKeys);
if(!epSendEpostTargetKeys.isEmpty()) epSendTargets = ePostQueryDslRepository.findSendTargets(epQueryFactory, epSendTargetKeys);
if(setInfo.getCpIsEns() || setInfo.getEpIsEns()) {
// 전자고지 대상 조회
// qryEgoji
if (setInfo.getCpIsEns())
cpSendEgojiTargets = ePostQueryDslRepository.findSendEgojiTargets(cpQueryFactory, cpSendEgojiTargetKeys);
if (setInfo.getEpIsEns())
epSendEgojiTargets = ePostQueryDslRepository.findSendEgojiTargets(epQueryFactory, epSendEgojiTargetKeys);
}
// REG_YMD 오늘기준 30일 이전 자료들 취소(POST_PROC_STT = '02') 로 변경
try {
cancelOldPost(cpSendTargetKeys, epSendTargetKeys);
} catch (Exception e) {
log.error("30일 이전 자료들 취소 실패: cpKeys={}, epKeys={}", cpSendTargetKeys == null ? 0 : cpSendTargetKeys.size(), epSendTargetKeys == null ? 0 : epSendTargetKeys.size(), e);
throw e;
}
//notice(안내문구 인거같음)
//goit notice 조인
// notice 안씀. 관련 로직 폐기해도 됨.
// 사전통보 or 계도 대상에서 mmcode만 추출 (prt_gubun = '0'사전통보 || prt_gubun = 'A' 계도)
// 사전 & 계도는 사진 같이 나감.
final List<EPostDto.SendTarget.Target> cpTargets = Optional.ofNullable(cpSendTargets).orElseGet(List::of);
List<String> targetCpMmCodes = cpSendTargetKeys.stream()
.filter(o -> "0".equals(o.getTgGb()) || "A".equals(o.getTgGb()))
.flatMap(o -> cpTargets.stream()
.filter(t -> Objects.equals(o.getConKey(), t.getConKey()))
.map(EPostDto.SendTarget.Target::getRecevSeq))
.filter(Objects::nonNull)
// .distinct()
.toList();
final List<EPostDto.SendTarget.Target> epTargets = Optional.ofNullable(epSendTargets).orElseGet(List::of);
List<String> targetEpMmCodes = epSendTargetKeys.stream()
.filter(o -> "0".equals(o.getTgGb()) || "A".equals(o.getTgGb()))
.flatMap(o -> epTargets.stream()
.filter(t -> Objects.equals(o.getConKey(), t.getConKey()))
.map(EPostDto.SendTarget.Target::getRecevSeq))
.filter(Objects::nonNull)
// .distinct()
.toList();
// mmcode로 이미지 파일 찾아서 zip생성
try {
zipMaker.generateZipFile(targetCpMmCodes, targetEpMmCodes, setInfo);
} catch (Exception e) {
log.error("ZIP 파일 생성 실패 : " + e.getMessage());
}
// SendTargets 돌면서 전자고지인지 체크
// 거기서 대기상태("E") 인 얘들의 등기번호를 업데이트
// cpSendEgojiTargetKeys 등기번호 업데이트 하면 될듯
egojiNonReadTargetsUpdateTrgstNmbr(cpSendEgojiTargets, epSendEgojiTargets);
// POST_SEND_STATE 업데이트 to "1"
updateSendState(cpSendTargets, epSendTargets, cpSendEgojiTargets, epSendEgojiTargets);
//qryRegSet POST_PROC_STT = 03, TG_POST_YN = "Y" 으로 업데이트
if(!cpSendTargets.isEmpty()) ePostQueryDslRepository.updateSenderRegPostStt(cpQueryFactory, cpSendTargets);
if(!epSendEgojiTargets.isEmpty()) ePostQueryDslRepository.updateGojitPostYn(epQueryFactory, cpSendEgojiTargets);
if(!cpSendTargets.isEmpty()) ePostQueryDslRepository.updateSenderRegPostStt(cpQueryFactory, epSendTargets);
if(!epSendEgojiTargets.isEmpty()) ePostQueryDslRepository.updateGojitPostYn(epQueryFactory, epSendEgojiTargets);
// 택스트파일 생성
textMaker.generateTextFile(cpSendTargets);
}
public void saveEpostResult(List<EPostDto.EPostFileRead> parseResult, EPostDto.SetInfo setInfo) {
@ -487,131 +361,9 @@ public class EPostService {
private void cancelOldPost(List<EPostDto.SendTarget.Key> cpSendTargetKeys, List<EPostDto.SendTarget.Key> epSendTargetKeys) {
String before30DaysFromNow = LocalDateTime.now().minusDays(30).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
List<EPostDto.SendTarget.Key> oldCpPosts = cpSendTargetKeys.stream()
.filter(post -> post.getRegYmd().compareTo(before30DaysFromNow) < 0)
.toList();
List<EPostDto.SendTarget.Key> oldEpPosts = epSendTargetKeys.stream()
.filter(post -> post.getRegYmd().compareTo(before30DaysFromNow) < 0)
.toList();
if(!oldCpPosts.isEmpty()) ePostQueryDslRepository.updateOldPostToCancel(cpQueryFactory, oldCpPosts);
if(!oldEpPosts.isEmpty()) ePostQueryDslRepository.updateOldPostToCancel(epQueryFactory, oldEpPosts);
}
private void egojiNonReadTargetsUpdateTrgstNmbr(List<EPostDto.SendTarget.Target> cpSendEgojiTargets, List<EPostDto.SendTarget.Target> epSendEgojiTargets) {
List<EpostSenderDetail> cpEpostSenderDetails = new ArrayList<>();
List<EpostSenderDetail> epEpostSenderDetails = new ArrayList<>();
List<CpGojiPrt> cpGojiPrts = new ArrayList<>();
List<CpGojiPrt> epGojiPrts = new ArrayList<>();
cpSendEgojiTargets.forEach(sendTarget -> {
EpostSenderDetail epostSenderDetail = EpostSenderDetail.builder()
.rgstNmbr(generateTrgstNmbr("cp"))
.conKey(sendTarget.getConKey())
.recevSeq(sendTarget.getRecevSeq()) // mmcode
.build();
cpEpostSenderDetails.add(epostSenderDetail);
CpGojiPrt cpGojiPrt = CpGojiPrt.builder()
.gpRegistNo(generateTrgstNmbr("cp"))
.gpConKey(sendTarget.getConKey())
.gpMmcode(sendTarget.getRecevSeq()) // mmcode
.build();
cpGojiPrts.add(cpGojiPrt);
});
epSendEgojiTargets.forEach(sendTarget -> {
EpostSenderDetail epostSenderDetail = EpostSenderDetail.builder()
.rgstNmbr(generateTrgstNmbr("cp"))
.conKey(sendTarget.getConKey())
.recevSeq(sendTarget.getRecevSeq()) // mmcode
.build();
epEpostSenderDetails.add(epostSenderDetail);
CpGojiPrt cpGojiPrt = CpGojiPrt.builder()
.gpRegistNo(generateTrgstNmbr("cp"))
.gpConKey(sendTarget.getConKey())
.gpMmcode(sendTarget.getRecevSeq()) // mmcode
.build();
epGojiPrts.add(cpGojiPrt);
});
if(!cpEpostSenderDetails.isEmpty()) cpEPostSenderDetailRepository.saveAll(cpEpostSenderDetails);
if(!epEpostSenderDetails.isEmpty()) epEPostSenderDetailRepository.saveAll(epEpostSenderDetails);
if(!cpGojiPrts.isEmpty()) cpGojiPrtRepository.saveAll(cpGojiPrts);
if(!epGojiPrts.isEmpty()) epGojiPrtRepository.saveAll(epGojiPrts);
}
private void updateSendState(
List<EPostDto.SendTarget.Target> cpSendTargets, List<EPostDto.SendTarget.Target> epSendTargets,
List<EPostDto.SendTarget.Target> cpSendEpostTargets, List<EPostDto.SendTarget.Target> epSendEpostTargets) {
List<EpostSenderDetail> cpEpostSenderDetails = new ArrayList<>();
List<EpostSenderDetail> epEpostSenderDetails = new ArrayList<>();
// POST_SEND_STATE = '1'
cpSendTargets.forEach(target -> {
EpostSenderDetail epostSenderDetail = EpostSenderDetail.builder()
.postSendState("1")
.conKey(target.getConKey())
.recevSeq(target.getRecevSeq()) // mmcode
.build();
cpEpostSenderDetails.add(epostSenderDetail);
});
epSendTargets.forEach(target -> {
EpostSenderDetail epostSenderDetail = EpostSenderDetail.builder()
.postSendState("1")
.conKey(target.getConKey())
.recevSeq(target.getRecevSeq()) // mmcode
.build();
epEpostSenderDetails.add(epostSenderDetail);
});
cpSendEpostTargets.forEach(target -> {
EpostSenderDetail epostSenderDetail = EpostSenderDetail.builder()
.postSendState("1")
.conKey(target.getConKey())
.recevSeq(target.getRecevSeq()) // mmcode
.build();
cpEpostSenderDetails.add(epostSenderDetail);
});
epSendEpostTargets.forEach(target -> {
EpostSenderDetail epostSenderDetail = EpostSenderDetail.builder()
.postSendState("1")
.conKey(target.getConKey())
.recevSeq(target.getRecevSeq()) // mmcode
.build();
epEpostSenderDetails.add(epostSenderDetail);
});
if(!cpEpostSenderDetails.isEmpty()) cpEPostSenderDetailRepository.saveAll(cpEpostSenderDetails);
if(!epEpostSenderDetails.isEmpty()) epEPostSenderDetailRepository.saveAll(epEpostSenderDetails);
}
private String generateTrgstNmbr(String dbKind) {
// select * from EPOST_RGST_NMBR where pcursor= '1' ;
String regiNo = null;
EpostRgstNmbr cpTrgstNmbr = cpEPostRgstNmbr.findByPcursor("1");
EpostRgstNmbr epTrgstNmbr = epEPostRgstNmbr.findByPcursor("1");
if(dbKind.equals("cp")) {
regiNo = cpTrgstNmbr.getRgstNmbr();
ePostQueryDslRepository.updateTrgstNmbr(cpQueryFactory, cpTrgstNmbr);
}
if(dbKind.equals("ep")) {
regiNo = epTrgstNmbr.getRgstNmbr();
ePostQueryDslRepository.updateTrgstNmbr(epQueryFactory, epTrgstNmbr);
}
return regiNo;
}
}

@ -16,7 +16,7 @@ public class TextMaker {
public void generateTextFile(List<EPostDto.SendTarget.Target> cpSendTargets) {
// cpSendTargets
// cpSendTargets을
}

Loading…
Cancel
Save