package com.ruoyi.workflow.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.workflow.common.constant.FlowConstant;
import com.ruoyi.workflow.common.enums.BusinessStatusEnum;
import com.ruoyi.workflow.common.enums.TaskStatusEnum;
import com.ruoyi.workflow.domain.ActBusinessStatus;
import com.ruoyi.workflow.domain.ActNodeAssignee;
import com.ruoyi.workflow.domain.ActTaskNode;
import com.ruoyi.workflow.domain.bo.*;
import com.ruoyi.workflow.domain.vo.*;
import com.ruoyi.workflow.flowable.cmd.*;
import com.ruoyi.workflow.listener.AbstractExecuteProcessHandler;
import com.ruoyi.workflow.listener.AbstractExecuteTaskHandler;
import com.ruoyi.workflow.mapper.ActTaskMapper;
import com.ruoyi.workflow.service.*;
import com.ruoyi.workflow.utils.CompleteTaskUtils;
import com.ruoyi.workflow.utils.WorkflowUtils;
import lombok.RequiredArgsConstructor;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.*;
import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.task.Attachment;
import org.flowable.identitylink.api.history.HistoricIdentityLink;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.flowable.variable.api.persistence.entity.VariableInstance;
import org.springframework.beans.BeanUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
import static com.ruoyi.common.helper.LoginHelper.getUserId;
/**
* @description: 任务业务层
* @author: gssong
* @date: 2021/10/17 14:57
*/
@Service
@RequiredArgsConstructor
public class ActTaskServiceImpl implements IActTaskService {
private final IWorkflowUserService iWorkflowUserService;
private final IActBusinessStatusService iActBusinessStatusService;
private final IActTaskNodeService iActTaskNodeService;
private final IActNodeAssigneeService iActNodeAssigneeService;
private final IActBusinessRuleService iActBusinessRuleService;
private final ManagementService managementService;
private final ActTaskMapper actTaskMapper;
private final IActProcessDefSettingService iActProcessDefSettingService;
private final IActProcessInstanceService iActProcessInstanceService;
private final TaskService taskService;
private final RuntimeService runtimeService;
private final RepositoryService repositoryService;
private final HistoryService historyService;
/**
* @description: 办理任务
* @param: taskCompleteBo
* @return: boolean
* @author: gssong
* @date: 2021/10/21
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean completeTask(TaskCompleteBo taskCompleteBo) {
// 1.查询任务
Task task = taskService.createTaskQuery().taskId(taskCompleteBo.getTaskId()).taskAssignee(String.valueOf(LoginHelper.getUserId())).singleResult();
if (ObjectUtil.isEmpty(task)) {
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
}
if (task.isSuspended()) {
throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED);
}
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
try {
//办理委托任务
if (ObjectUtil.isNotEmpty(task.getDelegationState()) && FlowConstant.PENDING.equals(task.getDelegationState().name())) {
taskService.resolveTask(taskCompleteBo.getTaskId());
TaskEntity newTask = WorkflowUtils.createNewTask(task, true);
taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), taskCompleteBo.getMessage());
taskService.complete(newTask.getId());
return true;
}
//附件上传
AttachmentCmd attachmentCmd = new AttachmentCmd(taskCompleteBo.getFileId(), task.getId(), task.getProcessInstanceId());
managementService.executeCommand(attachmentCmd);
//流程定义设置
ActProcessDefSettingVo setting = iActProcessDefSettingService.getProcessDefSettingByDefId(task.getProcessDefinitionId());
if (setting != null && !setting.getDefaultProcess()) {
return CompleteTaskUtils.execute(taskCompleteBo);
}
// 2. 判断下一节点是否是会签 如果是会签 将选择的人员放到会签变量
List<ActNodeAssignee> actNodeAssignees = iActNodeAssigneeService.getInfoByProcessDefinitionId(task.getProcessDefinitionId());
for (ActNodeAssignee actNodeAssignee : actNodeAssignees) {
String column = actNodeAssignee.getMultipleColumn();
String assigneeId = actNodeAssignee.getAssigneeId();
if (actNodeAssignee.getMultiple() && actNodeAssignee.getIsShow()) {
List<Long> userIdList = taskCompleteBo.getAssignees(actNodeAssignee.getMultipleColumn());
if (CollectionUtil.isNotEmpty(userIdList)) {
taskService.setVariable(task.getId(), column, userIdList);
}
}
//判断是否有会签并且不需要弹窗选人的节点
if (Boolean.TRUE.equals(actNodeAssignee.getMultiple() && Boolean.FALSE.equals(actNodeAssignee.getIsShow())) && (StringUtils.isBlank(column) || StringUtils.isBlank(assigneeId))) {
throw new ServiceException("请检查【" + processInstance.getProcessDefinitionKey() + "】配置 ");
}
if (Boolean.TRUE.equals(actNodeAssignee.getMultiple()) && Boolean.FALSE.equals(actNodeAssignee.getIsShow())) {
WorkflowUtils.settingAssignee(task, actNodeAssignee, actNodeAssignee.getMultiple());
}
}
// 3. 指定任务审批意见
taskService.addComment(taskCompleteBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), taskCompleteBo.getMessage());
// 设置变量
if (CollectionUtil.isNotEmpty(taskCompleteBo.getVariables())) {
taskService.setVariables(taskCompleteBo.getTaskId(), taskCompleteBo.getVariables());
}
ActNodeAssignee actNodeAssignee = actNodeAssignees.stream().filter(e -> e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().orElse(null);
if (ObjectUtil.isNull(actNodeAssignee)) {
throw new ServiceException("请检查【" + task.getName() + "】节点配置");
}
//办理任务
new AbstractExecuteTaskHandler()
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
lsx202406
- 粉丝: 3214
- 资源: 6198
最新资源
- 【JCR一区级】秃鹰算法BES-Transformer-GRU负荷数据回归预测【含Matlab源码 6347期】.zip
- 【独家首发】开普勒算法KOA优化Transformer-BiLSTM负荷数据回归预测【含Matlab源码 6560期】.zip
- 【JCR一区级】雾凇算法RIME-Transformer-GRU负荷数据回归预测【含Matlab源码 6348期】.zip
- 【JCR1区】雪融算法SAO-CNN-SVM故障诊断分类预测【含Matlab源码 5823期】.zip
- 【JCR1区】蚁狮算法ALO-CNN-SVM故障诊断分类预测【含Matlab源码 5825期】.zip
- 【JCR一区级】鹈鹕算法POA-Transformer-GRU负荷数据回归预测【含Matlab源码 6345期】.zip
- 【JCR一区级】金豺算法GJO-Transformer-GRU负荷数据回归预测【含Matlab源码 6326期】.zip
- 【JCR一区级】天鹰算法AO-Transformer-GRU负荷数据回归预测【含Matlab源码 6346期】.zip
- 【LSTM时序预测】鲸鱼算法优化卷积长短期记忆神经网络WOA-CNN-LSTM股价序列预测【含Matlab源码 3008期】.zip
- 【独家首发】粒子群算法PSO优化Transformer-LSTM负荷数据回归预测【含Matlab源码 6388期】.zip
- 【JCR1区】遗传算法GA-CNN-SVM故障诊断分类预测【含Matlab源码 5824期】.zip
- 【JCR1区】飞蛾扑火算法MFO-CNN-SVM故障诊断分类预测【含Matlab源码 5784期】.zip
- 【JCR1区】引力搜索算法GSA-CNN-SVM故障诊断分类预测【含Matlab源码 5826期】.zip
- 【JCR一区级】金枪鱼算法TSO-Transformer-GRU负荷数据回归预测【含Matlab源码 6327期】.zip
- 【JCR一区级】鲸鱼算法WOA-Transformer-GRU负荷数据回归预测【含Matlab源码 6328期】.zip
- 【JCR一区级】淘金算法GRO-Transformer-GRU负荷数据回归预测【含Matlab源码 6344期】.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)