这是我参与更文挑战的第1天,活动详情查看: 更文挑战
Activiti7 M4 会签,网关驳回流程(一)博客讲解是基础环境搭建和页面流程图拖拽
Activiti7 M4 会签,网关驳回流程(二)主要是从后端Java代码去展示
ActivitiBaseController
- 作用 :上传流定义xml文件,部署流程定义文件
具体实现
- ActivitiBaseServiceImpl
@Resource
private RepositoryService repositoryService;
// 上传文件Service实现接口
@Override
public String uploadBpmFile(MultipartFile multipartFile) {
Assert.notNull(multipartFile, "上传流程部署文件不能为空!");
String fileName = multipartFile.getOriginalFilename();
String suffixName = fileName.substring(fileName.lastIndexOf("."));
/* 上传后的路径 */
String filePath = ConstantUtils.BPMN_PathMapping;
/* 本地路径格式转上传路径格式 */
filePath = filePath.replace("\\", "/");
filePath = filePath.replace("file:", "");
/* 新文件名 */
fileName = UUID.randomUUID() + suffixName;
File file = new File(filePath + fileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
multipartFile.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
log.error(e.getMessage());
throw new IllegalArgumentException("上传部署文件异常!");
}
return fileName;
}
// 部署文件实现方法
@Override
public String transationDeploymentByString(String stringBPMN) {
Deployment deployment = repositoryService.createDeployment()
.addString("CreateWithBPMNJS.bpmn", stringBPMN)
.name("自定义流程")
.deploy();
return deployment.getId();
}
复制代码
ActivitiProcessInstanceController
- 作用:获取启动流程实例,获取流程定义
具体实现
- ActivitiProcessInstanceImpl
@Resource
private RuntimeService runtimeService;
@Resource
private RepositoryService repositoryService;
@Resource
private ActReProcdefMapper actReProcdefMapper;
// 获取启动流程实例
@Override
public ProcessInstanceVo initProcessInstance(String processDeploymentId, String instanceName, String instanceVariable) {
LambdaQueryWrapper<ActReProcdef> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ActReProcdef::getDeploymentId, processDeploymentId).select(ActReProcdef::getId);
ActReProcdef actReProcdef = actReProcdefMapper.selectOne(lambdaQueryWrapper);
Assert.notNull(actReProcdef, "该部署文件下没有对应流程实例文件!");
ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
.processDefinitionId(actReProcdef.getId())
.variable("instanceVariable", instanceVariable)
.name(instanceName).start();
ProcessInstanceVo processInstanceVo = new ProcessInstanceVo();
BeanUtils.copyProperties(processInstance, processInstanceVo);
return processInstanceVo;
}
// 获取流程定义
@Override
public List<HashMap<String, Object>> listProcessDefinitions(int page, int pageSize) {
List<ProcessDefinition> listDeployments = repositoryService.createProcessDefinitionQuery().listPage(page, pageSize);
List<HashMap<String, Object>> listMap = new ArrayList<HashMap<String, Object>>();
listDeployments.sort((y, x) -> x.getVersion() - y.getVersion());
for (ProcessDefinition pd : listDeployments) {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("processDefinitionID", pd.getId());
hashMap.put("name", pd.getName());
hashMap.put("key", pd.getKey());
hashMap.put("resourceName", pd.getResourceName());
hashMap.put("deploymentID", pd.getDeploymentId());
hashMap.put("version", pd.getVersion());
listMap.add(hashMap);
}
return listMap;
}
}
复制代码
ActivitiTaskController
- 作用:根据用户名获取待办任务,根据用户名完成待办任务
具体实现
- ActivitiTaskServiceImpl
package com.bci.internal.engine.bcibpmengine.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.bci.internal.engine.bcibpmengine.instances.entity.ActHiTaskinst;
import com.bci.internal.engine.bcibpmengine.instances.entity.ActReProcdef;
import com.bci.internal.engine.bcibpmengine.instances.entity.ActRuTask;
import com.bci.internal.engine.bcibpmengine.instances.entity.ActRuVariable;
import com.bci.internal.engine.bcibpmengine.instances.mapper.ActReProcdefMapper;
import com.bci.internal.engine.bcibpmengine.instances.mapper.ActRuTaskMapper;
import com.bci.internal.engine.bcibpmengine.instances.service.ActHiTaskinstService;
import com.bci.internal.engine.bcibpmengine.instances.service.ActRuVariableService;
import com.bci.internal.engine.bcibpmengine.service.ActivitiTaskService;
import com.bci.internal.engine.bcibpmengine.utils.ConstantUtils;
import com.bci.internal.engine.bcibpmengine.vo.CompleteTaskVo;
import com.bci.internal.engine.bcibpmengine.vo.TaskVo;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author
* @since 2021/4/5 0005
*/
@Slf4j
@Service
public class ActivitiTaskServiceImpl implements ActivitiTaskService {
@Resource
private TaskService taskService;
@Resource
private RuntimeService runtimeService;
@Resource
private ActHiTaskinstService actHiTaskinstService;
@Resource
private ActRuVariableService actRuVariableService;
@Resource
private ActReProcdefMapper actReProcdefMapper;
@Resource
private ActRuTaskMapper actRuTaskMapper;
@Override
public List<TaskVo> listTasks(String assignee, int page, int pageSize) {
List<Task> taskList = taskService.createTaskQuery().taskAssignee(assignee).listPage(page, pageSize);
// TODO 下面这段循环调库要用SQL重构
return taskList.stream().map(task -> {
LambdaQueryWrapper<ActReProcdef> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ActReProcdef::getId, task.getProcessDefinitionId()).select(ActReProcdef::getName,
ActReProcdef::getDeploymentId, ActReProcdef::getResourceName);
ActReProcdef actReProcdef = actReProcdefMapper.selectOne(queryWrapper);
LambdaQueryWrapper<ActRuTask> actRuTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
actRuTaskLambdaQueryWrapper.eq(ActRuTask::getExecutionId, task.getExecutionId()).select(ActRuTask::getAssignee);
ActRuTask actRuTask = actRuTaskMapper.selectOne(actRuTaskLambdaQueryWrapper);
TaskVo taskVo = new TaskVo();
taskVo.setInstanceName(!StringUtils.isEmpty(actReProcdef) ? actReProcdef.getName() : "");
taskVo.setStatus(!StringUtils.isEmpty(actRuTask) && Objects.equals(assignee, actRuTask.getAssignee()) ? "ASSIGNED" : "");
taskVo.setDeploymentId(actReProcdef.getDeploymentId());
taskVo.setResourceName(actReProcdef.getResourceName());
taskVo.setNodeName(task.getName());
BeanUtils.copyProperties(task, taskVo);
return taskVo;
}).sorted(Comparator.comparing(TaskVo::getCreateTime).reversed()).collect(Collectors.toList());
}
@Override
public String completeTask(CompleteTaskVo completeTaskVo) {
Assert.notNull(completeTaskVo, "流程传入完成任务参数不能为空");
String taskId = completeTaskVo.getTaskID();
String assignee = completeTaskVo.getAssignee();
int pass;
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (StringUtils.isEmpty(assignee)) {
taskService.claim(task.getId(), completeTaskVo.getAssignee());
}
switch (completeTaskVo.getNodeName()) {
/* 自评节点处理方式 */
case ConstantUtils.SELF_COMMENT:
Map<String, Object> hmVari = new HashMap<>();
/* 获取总监处理人 */
List<String> assigneeDirectorList = Arrays.asList(completeTaskVo.getNextNodeAssignee().split(","));
hmVari.put(ConstantUtils.ASSIGNEE_DIRECTOR_LIST, assigneeDirectorList);
hmVari.put(ConstantUtils.NUMBER, assigneeDirectorList.size());
hmVari.put(ConstantUtils.NODE_NAME, completeTaskVo.getNodeName());
taskService.complete(taskId, hmVari, true);
break;
/* 总监节点处理方式 */
case ConstantUtils.DIRTOR:
pass = completeTaskVo.getPass();
HashMap<String, Object> mapDirectorVra = new HashMap<>();
mapDirectorVra.put(ConstantUtils.PASS, pass);
updateDirtorActRuVarable(completeTaskVo, mapDirectorVra); // 更新总监网关变量值
taskService.complete(taskId, mapDirectorVra);
break;
/* 总经理节点处理方式 */
case ConstantUtils.MANAGER:
Assert.notNull(completeTaskVo.getPass(), "总经理网关传递参数不能为空");
pass = completeTaskVo.getPass();
HashMap<String, Object> mapManagerVra = new HashMap<>();
updateManagerActRuVarable(completeTaskVo, mapManagerVra); // 更新总经理网关变量值
taskService.complete(taskId, mapManagerVra);
break;
default:
break;
}
return assignee;
}
private void updateManagerActRuVarable(CompleteTaskVo completeTaskVo, HashMap<String, Object> mapManagerVra) {
@NotBlank(message = "传入任务id不能为空") String taskId = completeTaskVo.getTaskID();
Integer pass = completeTaskVo.getPass();
/* 查询当前是否有网关总经理managerPass变量 */
LambdaQueryWrapper<ActRuVariable> actRuVariableLambdaQueryWrapper = new QueryWrapper<ActRuVariable>().lambda()
.eq(ActRuVariable::getName, ConstantUtils.MANAGER_PASS)
.eq(ActRuVariable::getTaskId, taskId);
/* 在变量表中获取当前处理 */
LambdaUpdateWrapper<ActRuVariable> variableLambdaUpdateWrapper = new UpdateWrapper<ActRuVariable>().lambda()
.eq(ActRuVariable::getName, ConstantUtils.MANAGER_PASS)
.eq(ActRuVariable::getTaskId, taskId);
int countManagerPass = actRuVariableService.count(actRuVariableLambdaQueryWrapper);
/* 更新历史任务的assignee */
actHiTaskinstService.update(new UpdateWrapper<ActHiTaskinst>().lambda().eq(ActHiTaskinst::getId, taskId)
.set(ActHiTaskinst::getAssignee, completeTaskVo.getAssignee()));
/* pass==0 表示通过 pass==1表示不通过 */
switch (pass) {
case 0:
if (countManagerPass == 0) {
mapManagerVra.put(ConstantUtils.MANAGER_PASS, 1);
} else if (countManagerPass > 0) {
/* 更新【总经理】managerPass 的值 */
actRuVariableService.update(variableLambdaUpdateWrapper.set(ActRuVariable::getText, 1)
.set(ActRuVariable::getLongType, 1));
}
break;
case 1:
if (countManagerPass == 0) {
mapManagerVra.put(ConstantUtils.MANAGER_PASS, 2);
} else if (countManagerPass > 0) {
/* 更新【总经理】managerPass 的值 */
actRuVariableService.update(variableLambdaUpdateWrapper.set(ActRuVariable::getText, 2)
.set(ActRuVariable::getLongType, 1));
}
break;
default:
break;
}
}
private void updateDirtorActRuVarable(CompleteTaskVo completeTaskVo, HashMap<String, Object> mapDirectorVra) {
@NotBlank(message = "传入任务id不能为空") String taskId = completeTaskVo.getTaskID();
Integer pass = completeTaskVo.getPass();
String executionId = completeTaskVo.getExecutionId();
/* 查询当前是否有网关总监result变量 */
LambdaQueryWrapper<ActRuVariable> actRuVariableLambdaQueryWrapper = new QueryWrapper<ActRuVariable>().lambda()
.eq(ActRuVariable::getName, ConstantUtils.RESULT)
.eq(ActRuVariable::getTaskId, taskId);
/* 在变量表中获取当前处理 */
LambdaUpdateWrapper<ActRuVariable> variableLambdaUpdateWrapper = new UpdateWrapper<ActRuVariable>().lambda()
.eq(ActRuVariable::getName, ConstantUtils.RESULT)
.eq(ActRuVariable::getTaskId, taskId);
int countResult = actRuVariableService.count(actRuVariableLambdaQueryWrapper);
mapDirectorVra.put(ConstantUtils.COUNT_RESULT, countResult);
/* pass ==1 是代表驳回 pass==0 表示同意 */
if (Objects.equals(pass, 1) && (countResult > 0)) {
actRuVariableService.update(variableLambdaUpdateWrapper.set(ActRuVariable::getText, "N"));
/* 当会签中有一个驳回就要强制将会签任务结束 */
Integer all = (Integer) runtimeService.getVariable(executionId, "nrOfInstances");
runtimeService.setVariable(executionId, "nrOfCompletedInstances", all);
} else if (Objects.equals(pass, 0) && (countResult > 0)) {
mapDirectorVra.put("assigneeManger", "salaboy");
mapDirectorVra.put("assignee", "salaboy");
actRuVariableService.update(variableLambdaUpdateWrapper.set(ActRuVariable::getText, "Y"));
}
}
}
复制代码
代码gitee地址:gitee.com/flag_yiyi/b…
近期评论