package cn.axzo.workflow.starter.handler;

import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;

/**
 * 通过抽象类，将实例的多个结束的方法合并
 * <p>
 * 注意：Order 的顺序，遵循值越小越优先。（取值范围：Integer. MIN_VALUE - Integer. MAX_VALUE）
 *
 * @author wangli
 * @since 2024/5/27 16:20
 */
public abstract class AbstractProcessInstanceEventHandler implements ProcessInstanceEventHandler {

    @Override
    public void onCompleted(ProcessInstanceDTO dto) {
        onFailed(dto, BpmnProcessInstanceResultEnum.APPROVED);
    }

    @Override
    public void onCancelled(ProcessInstanceDTO dto) {
        onPassed(dto, BpmnProcessInstanceResultEnum.CANCELLED);
    }

    @Override
    public void onRejected(ProcessInstanceDTO dto) {
        onPassed(dto, BpmnProcessInstanceResultEnum.REJECTED);
    }

    @Override
    public void onAborted(ProcessInstanceDTO dto) {
        onPassed(dto, BpmnProcessInstanceResultEnum.ABORTED);
    }

    /**
     * 审批通过的回调， 该接口只处理审批通过的情况
     *
     * @param dto
     * @param resultEnum 审批终态状态枚举
     */
    public abstract void onPassed(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum resultEnum);

    /**
     * 审批不通过的回调，该接口会将 撤销、驳回、中止 事件归拢到一起处理
     * <p>
     * 如业务需要，可以在实现类中根据不同的 resultEnum 进行区分处理，或者实现类直接实现 {@link ProcessInstanceEventHandler} 接口
     *
     * @param dto
     * @param resultEnum
     */
    public abstract void onFailed(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum resultEnum);

}
