후행 처리 서비스 개발
후행 처리 서비스는 Bxm Service 를 개발하여야 하며, 서비스의 입출력을 bxm.deferred.data.io.DeferredExecIO 을 사용하여야 한다.
후행 처리 서비스 로직은 업무 내용에 맞게 작성하면 된다.
아래의 그림은 후행 처리 서비스 입출력을 나타낸다.
아래 표는 DTO 의 컬럼 명에 대해 설명한 것이다.
컬럼(물리 명) | 컬럼(논리 명) | 타입 |
---|---|---|
domainId |
도메인ID |
String |
deferredId |
후행처리ID |
String |
bizDt |
영업일자 |
String |
nodeNo |
노드 번호 |
Integer |
deferredProcCd |
후행실행처리코드 |
String |
parllProcSeq |
병렬처리일련번호 |
Integer |
targetTableNm |
대상테이블 명 |
String |
targetTableColumn |
대상테이블컬럼 명 |
String |
startSeq |
시작일련번호 |
Long |
endSeq |
종료일련번호 |
Long |
procSeq |
현재일련번호 |
Long |
아래의 예는 후행 처리 서비스 개발 샘플이다.
@BxmServiceOperation("transferDef")
public DeferredExecIO transferDef(DeferredExecIO in) throws DefaultApplicationException
{
DeferredExecIO out = new DeferredExecIO();
/**
* 영업일자 체크
*/
if ( !isValidBizDt(in.getBizDt()))
{
logger.error("Not valid bizDt : [{}]", in.getBizDt());
throw new IllegalArgumentException("Not valid bizDt");
}
/**
* 업무 로그 데이터 가져오기.
*/
BxmLogTrx01IO logTrx01IO = getLogTrx(in);
/**
* 입력항목 체크
*/
if ( !inputValidation(logTrx01IO))
{
logger.error("InputValidation is failed.");
return null;
}
/**
* 총계정 원장 조회
*/
PocAccMst02IO pocAccMstIO = getOpBrchInfo(Integer.parseInt(logTrx01IO.getOpenBranchNo()));
/**
* 계좌개설점 체크
*/
if (pocAccMstIO == null)
{
// 해당계좌개설점이 존재하지 않습니다.
logger.error("해당계좌개설점이 존재하지 않습니다.");
throw new DefaultApplicationException("CMFWE0023", new Object [] {});
}
/**
* 입력거래 유형체크 후 처리금액계산
*/
checkTrxType(logTrx01IO);
return out;
}
@BxmCategory(logicalName = "입력항목검증", description = "입력항목검증")
private boolean inputValidation(BxmLogTrx01IO in) throws DefaultApplicationException
{
/**
* 입력값 null 체크
*/
if (in == null)
{
/**
* 입력값 null
*/
logger.error("in is null.");
return false;
}
/**
* 거래 유형 체크
*/
if (in.getTrxTypeCd() == null || StringUtils.isEmpty(in.getTrxTypeCd()))
{
/**
* 거래 유형 항목 누락
*/
logger.error("in.getTrxTypeCd() is null.");
return false;
}
/**
* 금액 체크
*/
if (in.getTrxAmt() == null || in.getTrxAmt().compareTo(BigDecimal.ZERO) <= 0)
{
/**
* 금액이 비었거나 0보다 작거나 같음
*/
logger.error("in.getTrxAmt() is null");
return false;
}
if (in.getOpenBranchNo() == null || StringUtils.isEmpty(in.getOpenBranchNo()))
{
logger.error("in.getOpenBranchNo is null");
return false;
}
return true;
}
@BxmCategory(logicalName = "총계정정보조회", description = "총계정정보조회")
private PocAccMst02IO getOpBrchInfo(int opBrch) throws DefaultApplicationException
{
if (pocAccMstDBIO == null)
pocAccMstDBIO = LApplicationContext.getBean(PocAccMstDBIO.class);
PocAccMst02IO pocAccMstIO = pocAccMstDBIO.selectAccMst01(opBrch);
return pocAccMstIO;
}
@BxmCategory(logicalName = "거래유형별처리금액계산", description = "거래유형에 따라 금액을 가감한다")
private void checkTrxType(BxmLogTrx01IO in) throws DefaultApplicationException
{
PocAccMst02IO pocAccMstIO = new PocAccMst02IO();
pocAccMstIO.setOpBrch(Integer.parseInt(in.getOpenBranchNo()));
pocAccMstIO.setAmt(in.getTrxAmt());
// 입금 1, 출금 2
/**
* 입금인 경우 (처리금액 = 잔액 + 거래금액)
* 출금인 경우 (처리금액 = 잔액 - 거래금액)
*/
// if (CommonCodeConstants.TRX_TYPE_DEP == in.getTrxType()) {
if (CommonCodeConstants.TRX_TYPE_DEP.equals(in.getTrxTypeCd()))
{
pocAccMstDBIO.updateAccMst01(pocAccMstIO);
}
else if (CommonCodeConstants.TRX_TYPE_PAY.equals(in.getTrxTypeCd()))
{
pocAccMstDBIO.updateAccMst02(pocAccMstIO);
}
}
private BxmLogTrx01IO getLogTrx(DeferredExecIO in)
{
if (bxmLogTrxDBIO == null)
bxmLogTrxDBIO = LApplicationContext.getBean(BxmLogTrxDBIO.class);
BxmLogTrx01IO bxmLogTrx01IO = new BxmLogTrx01IO();
bxmLogTrx01IO.setBizDt(in.getBizDt());
bxmLogTrx01IO.setNodeNo(in.getNodeNo());
bxmLogTrx01IO.setLogSeq(in.getProcSeq());
bxmLogTrx01IO.setDay(NumberingUtil.getBizDay(in.getBizDt()));
BxmLogTrx01IO logTrxOut = bxmLogTrxDBIO.selectListLogTrx02(bxmLogTrx01IO);
return logTrxOut;
}
private boolean isValidBizDt(String bizDt)
{
return !(StringUtils.isEmpty(bizDt)) && (bizDt.length() == 8);
}