@ -8,6 +8,8 @@ import com.worker.domain.repo.cp.*;
import com.worker.domain.repo.ep.* ;
import com.worker.scheduler.epost.dto.EPostDto ;
import com.worker.scheduler.epost.repository.EPostQueryDslRepository ;
import com.worker.util.common.CommonUtils ;
import com.worker.util.zipFileMaker.ZipMaker ;
import lombok.RequiredArgsConstructor ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.beans.factory.annotation.Autowired ;
@ -26,6 +28,8 @@ import java.util.stream.Collectors;
public class EPostService {
private final Environment env ;
private final CommonUtils utils ;
private final ZipMaker zipMaker ;
private final ObjectMapper objectMapper ;
private final CpSetinfoRepository cpSetinfoRepository ;
@ -44,6 +48,8 @@ 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 EPostQueryDslRepository ePostQueryDslRepository ;
@ -66,56 +72,120 @@ public class EPostService {
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 조회
//cGojit
// 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 ( ) ) cpSendTargets = ePostQueryDslRepository . findSendEgojiTargets ( cpQueryFactory , cpSendTargetKeys ) ;
if ( setInfo . getEpIsEns ( ) ) epSendTargets = ePostQueryDslRepository . findSendEgojiTargets ( epQueryFactory , epSendTargetKeys ) ;
} else {
// 조회한 키로 cpSendTargets 의 상세내용 조회
// qryFor
cpSendTargets = ePostQueryDslRepository . findSendTargets ( cpQueryFactory , cpSendTargetKeys ) ;
epSendTargets = ePostQueryDslRepository . findSendTargets ( epQueryFactory , epSendTargetKeys ) ;
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 notifce 조인
//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 돌면서 전자고지인지 체크후 후처리
// 이거 필요 없을듯. 전자고지인지 체크후 그냥 빼버리면됨.
// 아래 스트림에서 전자고지 아닌것만 으로 스트림 돌리면됨.
// SendTargets 돌면서 전자고지인지 체크
// 거기서 대기상태("E") 인 얘들의 등기번호를 업데이트
// cpSendEgojiTargetKeys 등기번호 업데이트 하면 될듯
egojiNonReadTargetsUpdateTrgstNmbr ( cpSendEgojiTargets , epSendEgojiTargets ) ;
// SendTargets 돌면서 전자고지 아닌거 후처리 하는데
// 이거 그냥 리스트를 나눠서 따로따로 진행하는게 더 깔끔함
// steam 으로 전송대상(전자고지 아닌것) 만 추출하셈
// 전송대상은 tg_post_yn 이 'E' 이거나 'Y' 인것만임.
// E는 대기상태로 전자고지를 안읽었으면 추후 예약발송 한다는거임.
// POST_SEND_STATE 업데이트 to "1"
updateSendState ( cpSendTargets , epSendTargets , cpSendEgojiTargets , epSendEgojiTargets ) ;
// 전송대상 등기번호 조회
// 전자고지 아니면 textMakcer
// zipMaker
//qryRegSet stt = 03 으로 업데이트
//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 ) ;
// 서울시는 통합 우편서버를 사용중임.
// 거기다가 ftp 로 텍스트 쏴줘야함.
// 그리고 파일 읽는것도 마찬가지
}
@ -182,11 +252,7 @@ public class EPostService {
if ( epPrts ! = null & & ! epPrts . isEmpty ( ) ) {
insertPrtResults ( epPrts , parseResult , "ep" ) ;
}
// if (delivs != null && !delivs.isEmpty()) insertDelivResults(delivs);
// if (prts != null && !prts.isEmpty()) insertPrtResults(prts);
// if (recvs != null && !recvs.isEmpty()) insertRecvResults(recvs);
// recv는 조회후 바로 업데이트해서 따로 구조변경이 없음, 때문에 queryDsl안에서 조회후 바로 업데이트 함.
}
@ -227,9 +293,9 @@ public class EPostService {
}
//EPOST_MAKE_RESULT 의 콘키와 등기번호로 조회한 결과가 없으면
EpostMakeResult epostMakeResult = null ;
if ( dbKind . equals ( "cp" ) ) epostMakeResult = cpEPostMakeResultRepository . findByCon keyAndRgstNmbr( ) ;
else epostMakeResult = cpEPostMakeResultRepository. findByConkeyAndRgstNmbr ( ) ;
Optional< EpostMakeResult> epostMakeResult = null ;
if ( dbKind . equals ( "cp" ) ) epostMakeResult = cpEPostMakeResultRepository . findByCon KeyAndRgstNmbr( fileResult . getConKey ( ) , fileResult . getRestNmbr ( ) ) ;
else epostMakeResult = epEPostMakeResultRepository. findByConKeyAndRgstNmbr ( fileResult . getConKey ( ) , fileResult . getRestNmbr ( ) ) ;
//EPOST_MAKE_RESULT 인서트
if ( epostMakeResult = = null ) {
@ -246,10 +312,6 @@ public class EPostService {
}
}
} ) ;
}
@ -366,31 +428,10 @@ public class EPostService {
epGojiSendHistRepository . saveAll ( cpGojiSendHists ) ;
epEpostDelivResultRepository . saveAll ( epostDelivResults ) ;
}
}
private void insertReceiveResults ( List < EPostDto . Recv > recvs ) {
//고지 업데이트
//reg 업데이트
}
private Set < String > parseDeptCode ( EPostDto . SetInfo setInfo , String kind ) {
String json = null ;
if ( kind . equals ( "cp" ) & & setInfo . getCpSetinfo ( ) ! = null )
@ -440,12 +481,132 @@ public class EPostService {
return maxKey ;
}
private String takeRgstNmbr ( ) {
String regNo = null ;
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 ) ;
return regNo ;
}
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 ;
}
}