package com.casic.missiles.service.listeners.flowable;

import com.casic.missiles.redis.RedisUtil;
import com.casic.missiles.redis.key.CacheKeys;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.Objects;


/**
 * @Description: 流程监听器，作用：动态设置任务办理人（支持发起人自选等）
 * TaskListener触发时机（在代码相应位置设置该监听器）:
 *      create：在任务创建且所有任务属性设置完成之后才触发。
 *      assignment：在任务被分配给某个办理人之后触发，它是在create事件触发前被触发。
 *      complete：在配置了监听器的任务完成时触发，也就是说运行期任务删除之前触发。
 *      delete：任务删除触发
 * @Author: wangpeng
 * @Date: 2022/12/27 9:54
 */
@Slf4j
@Component
public class TaskCreatedListener implements TaskListener {
    @Resource
    private TaskService taskService;
    @Resource
    private RuntimeService runtimeService;
    @Resource
    private HistoryService historyService;
    @Resource
    private RedisUtil redisUtil;

    //每个任务创建完成后就会执行，在userTask和根节点设置该监听器，保证根节点任务（发起人）和用户空任务完成
    @Override
    public void notify(DelegateTask delegateTask) {
        //审批人为空，任务自动通过/自动驳回执行
        //任务定义唯一标识，通过id("userTask")方法生成，即代码中设置的userTask.setId(id);
        String taskProcessInstanceId = delegateTask.getProcessInstanceId();
        String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
        if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) {
            taskService.complete(delegateTask.getId());
            //保证流程驳回到发起人后不自动审批通过
            redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId);
        } else {
            if ("100000".equals(delegateTask.getAssignee())) {
                Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量
                if (null == autoRefuse) {
                    taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过");
                    taskService.complete(delegateTask.getId());
                } else {
                    taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回");
                    //获取发起人任务节点
                    HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
                            .processInstanceId(delegateTask.getProcessInstanceId())
                            .orderByHistoricTaskInstanceStartTime()
                            .asc().list().get(0);
                    //驳回至发起人
                    runtimeService.createChangeActivityStateBuilder()
                            .processInstanceId(delegateTask.getProcessInstanceId())
                            .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey())
                            .changeState();
//                    runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回");
                }
            }
        }
    }

}
