= Knox 결재 상태 동기화

== 결재 Batch 설정

Knox 결재 문서는 10분마다 배치가 실행되어 동기화 되고 있다.

* config.properties : 동기화 배치 실행 주기 설정

[source,properties]
----
## Knox Approval Sync
knox.approval.sync.cron=0 0/10 * * * ?
----

* QuartzConfig.java: Scheduler 등록
* KnoxSyncBatchConfig.java: 배치 Job, Trigger 등록
* KnoxSyncBatchExecutor.java: 서비스 호출

== 결재 동기화 로직

배치에서 실행되는 동기화 로직을 구현한 서비스는 knoxApprovalSyncServiceImpl.java 파일의 synchronizeKnox() 메소드 이며 동기화 로직은 간략하게 아래와 같다.

. SDL 결재 테이블에서 결재 진행중인 문서 목록 대상 조회.
. 대상 목록의 결재ID로 Knox REST를 조회하여 Revision이 변경되었는지 확인.
. Revision 변경된 대상에 대해서 결재 정보 동기화 처리.
. 동기화 완료 후 결재 후처리 진행.

결재 동기화 시 오류가 발생한 결재 문건은 결재정보 테이블(TN_CF_APPROVAL)에 결재 동기화 상태값(APPROVAL_FAULT)이 false로 Update되며 다음 배치 실행시 대상으로 선정되지 않는다. +
이런 경우 이벤트 로그 테이블(TN_CF_APPROVAL_EVENT)의 로그를 확인하여 다시 동기화 해야 한다면 결재 관리 상세화면에서 개별 동기화가 가능하다.

image::approvalSync_01.png[]

== 결재 전후처리

결재 동기화 처리전 또는 처리후 결재 문서 상태에 대한 비지니스를 처리할 수 있도록 인터페이스를 제공하고 있다.

ApprovalInterceptor 를 결재 문서별로 상속 받는 구현 클래스를 만들면 된다.

* 구현 예시(KnoxApprovalSampleInterceptor.java)

[source,java]
----
@Log4j2
@ApprovalDocumentType(names = {"knoxSample"})
public class KnoxApprovalSampleInterceptor implements ApprovalInterceptor {

    @Autowired
    KnoxApprovalSampleService knoxApprovalSampleService;

    @Override
    public void afterSubmit(Approval approval, List<ApprovalStep> approvalStepList, Map<String, Object> attribute) {
        log.debug("execute ApprovalSampleInterceptor afterSubmit");
        //Knox 상신 후 문서 상태 업데이트
        knoxApprovalSampleService.updateSampleApprovalDocument(approval.getDbDocId(), ApprovalDocStatus.INPROCESS);
    }
    -- 생략 --
----