更多功能看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://122.227.135.243:9888
因为看很多朋友需要这种同意拒绝的排它网关流程,所以这次先支持这种操作,但这个还不支持的第一个发起人后面的这种排它网关操作。
1、增加下面一个接口,以便控制拒绝按钮是否可用
@ApiOperation(value = "获取下一节点的通用同意拒绝排它网关")
@PostMapping(value = "/nextApprovedEG")
public Result nextApprovedEG(@RequestParam(name="taskId",required=true) String taskId) {
return Result.OK(flowTaskService.getNextApprovedExclusiveGateway(taskId));
}
2、FlowTaskVo增加下面的一个参数
@ApiModelProperty("下一个网关是否是同意拒绝通用网关")
private boolean approved; //网关条件是${approved}或${!approved}
3、IFlowTaskService增加下面方法
/**
* 获取下个节点信息,对排它网关的通用同意拒绝做特殊处理
* add by nbacheng
*
* @param FlowTaskVo taskVo
*
* @return
*/
boolean getNextApprovedExclusiveGateway(String taskId);
4、FlowTaskServiceImpl增加下面方法
/**
* 获取下个节点信息,目前只对排它网关的${approved}做特殊处理
* add by nbacheng
*
* @param FlowTaskVo taskVo
*
* @return
*/
@Override
public boolean getNextApprovedExclusiveGateway(String taskId) {
//当前节点
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
String key = task.getTaskDefinitionKey();
FlowElement flowElement = bpmnModel.getFlowElement(key);
//获取Task的出线信息--可以拥有多个
List<SequenceFlow> outGoingFlows = null;
if (flowElement instanceof UserTask) {
outGoingFlows = ((UserTask) flowElement).getOutgoingFlows();
}
//遍历返回下一个节点信息,只考虑后面排它网关是${approved}参数
for (SequenceFlow outgoingFlow : outGoingFlows) {
//类型自己判断(获取下个节点是网关还是节点)
FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement();
//下个是节点
if(targetFlowElement instanceof ExclusiveGateway){//
boolean existApproved = GetExclusiveGatewayExpression(targetFlowElement);//对表达式里有${approved}做特殊处理,就是对同意或拒绝(类似通过或不通过)
if(existApproved) {
return true;
}
break;
}
}
return false;
}
/**
* 获取排他网关分支名称、分支表达式是否存在${approved}
* @param flowElement
* @param
* add by nbacheng
*/
private boolean GetExclusiveGatewayExpression(FlowElement flowElement) {
// 获取所有网关分支
List<SequenceFlow> targetFlows=((ExclusiveGateway)flowElement).getOutgoingFlows();
// 循环每个网关分支
for(SequenceFlow sequenceFlow : targetFlows){
// 获取下一个网关和节点数据
FlowElement targetFlowElement=sequenceFlow.getTargetFlowElement();
// 网关数据不为空
if (StringUtils.isNotBlank(sequenceFlow.getConditionExpression())) {
// 获取网关判断条件
String expression = sequenceFlow.getConditionExpression();
if(expression.contains("${approved}")) {
return true;
}
}
}
return false;
}
5、taskFormComplete修改如下:
/**
* 任务节点有表单的操作
*
* @param taskVo
*/
private void taskFormComplete(FlowTaskVo taskVo) {
Map<String , Object> approved = new HashMap<String , Object>();
boolean existApprovedEG = getNextApprovedExclusiveGateway(taskVo.getTaskId());//检测下个否是是判断同意拒绝网关,是要做特殊处理
if(taskVo.getValues() !=null && taskVo.getValues().containsKey("taskformvalues")) {//有任务节点表单
@SuppressWarnings("unchecked")
Map<String , Object> taskformvalues = (Map<String, Object>) taskVo.getValues().get("taskformvalues");
taskService.setVariableLocal(taskVo.getTaskId(), "taskformvalues", taskformvalues);
taskService.complete(taskVo.getTaskId(),taskformvalues);//保存taskformvalues到变量表里
}
else if (existApprovedEG) {//是${approved}拒绝同意网关
if (taskVo.isApproved()) {
approved.put("approved", true);
}
else {
approved.put("approved", false);
}
taskService.complete(taskVo.getTaskId(),approved);//保存approved到变量表里
}
else {
taskService.complete(taskVo.getTaskId());
}
}
6、增加一个拒绝按钮
<el-button type="primary" @click="taskComplete">确 定</el-button>
7、增加一个按钮判断方法
//获取下一个通用拒绝同意排它网关
getNextApprovedEG(taskId) {
nextApprovedEG({taskId: taskId}).then(res => {
if(res.success) {
const data = res.result;
console.log("getNextApprovedEG",data)
this.bapproved = data;
}
});
},
8、taskComplete(approved)增加一个变量,以区分是同意还是拒绝。
9、演示图片如下: