package cn.axzo.workflow.starter.handler;

import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;
import org.springframework.core.Ordered;

/**
 * 流程实例相关事件
 *
 * @author wangli
 * @since 2024/5/27 16:20
 */
public interface ProcessInstanceEventHandler extends Ordered {

    /**
     * 流程实例创建成功后回调
     *
     * @param processInstanceDTO
     */
    void onCreated(ProcessInstanceDTO instanceDTO);

    /**
     * 流程实例开始运行后回调
     *
     * @param processInstanceDTO
     */
    void onStarted(ProcessInstanceDTO instanceDTO);

    /**
     * 流程实例运行完成(通过)后回调
     * <p>
     * 注意: 该接口表明流程已经走完正向逻辑，正向逻辑比如：通过、同意等
     *
     * @param instanceDTO
     */
    void onCompleted(ProcessInstanceDTO instanceDTO);

    /**
     * 流程实例被“撤回”后回调
     * <p>
     * 撤回只有发起人能触发
     *
     * @param instanceDTO
     */
    void onCancelled(ProcessInstanceDTO instanceDTO);

    /**
     * 流程实例被“驳回”后回调
     * <p>
     * 审批过程中，有一个审批人或者有节点配置的是“自动驳回”，都能触发该事件。
     *
     * @param instanceDTO
     */
    void onRejected(ProcessInstanceDTO instanceDTO);

    /**
     * 流程实例被中止后回调
     * <p>
     * 一般由接入方主动触发，比如调用了 {@link ProcessInstanceApi#abortProcessInstance(BpmnProcessInstanceAbortDTO)} 方法等
     *
     * @param instanceDTO
     */
    void onAborted(ProcessInstanceDTO instanceDTO);
}
