package com.opencloud.bpm.server.service.impl;

import com.opencloud.bpm.client.constants.BpmConstants;
import com.opencloud.bpm.client.model.TaskOperate;
import com.opencloud.bpm.server.service.ProcessService;
import com.opencloud.common.exception.OpenAlertException;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.task.Task;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;

/**
 * 自定义流程接口
 *
 * @author: liuyadu
 * @date: 2019/4/4 14:00
 * @description:
 */
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class ProcessServiceImpl extends ProcessEngineService implements ProcessService {

    /**
     * 执行任务
     *
     * @param taskOperate
     */
    @Override
    public void complete(TaskOperate taskOperate) {
        String taskId = taskOperate.getTaskId();
        String user = taskOperate.getUser();
        // 放入流程变量
        Map<String, Object> variables = Maps.newHashMap();
        // 设置任务变量_OPT
        variables.put(BpmConstants.TASK_OPERATE_KEY, taskOperate);
        // 使用任务id,获取任务对象,获取流程实例id
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
            throw new OpenAlertException("任务不存在");
        }
        //利用任务对象,获取流程实例id
        String processInstancesId = task.getProcessInstanceId();
        //由于流程用户上下文对象是线程独立的,所以要在需要的位置设置,要保证设置和获取操作在同一个线程中
        //批注人的名称  一定要写,不然查看的时候不知道人物信息
        Authentication.setAuthenticatedUserId(user);
        taskService.addComment(taskId, processInstancesId, taskOperate.getOperateType().name(), taskOperate.getComment());
        //执行任务
        completeTask(taskOperate.getTaskId(), variables);
    }
}