【代码优化】工作流:将 SimpleModelConstants 删除

【代码优化】工作流:将 BpmUserTaskApproveMethodEnum 增加 completionCondition
This commit is contained in:
YunaiV 2024-10-17 22:49:31 +08:00
parent 6700267ae9
commit 7b57c7d056
4 changed files with 32 additions and 87 deletions

View File

@ -28,11 +28,9 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable {
// 50 ~ 条件分支
CONDITION_NODE(50, "sequenceFlow", "条件节点"), // 用于构建流转条件的表达式
CONDITION_BRANCH_NODE(51, "parallelGateway", "条件分支节点"), // TODO @jason是不是改成叫 条件分支
PARALLEL_BRANCH_NODE(52, "exclusiveGateway", "并行分支节点"), // TODO @jason是不是一个 并行分支 就可以啦 后面是否去掉并行网关只用包容网关
CONDITION_BRANCH_NODE(51, "parallelGateway", "条件分支节点"),
PARALLEL_BRANCH_NODE(52, "exclusiveGateway", "并行分支节点"),
INCLUSIVE_BRANCH_NODE(53, "inclusiveGateway", "包容分支节点"),
// TODO @jason建议整合 join最终只有 条件分支并行分支包容分支三种~
// TODO @芋艿 感觉还是分开好理解一点,也好处理一点前端结构中把聚合节点显示并传过来
;
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray();

View File

@ -16,20 +16,23 @@ import java.util.Arrays;
@AllArgsConstructor
public enum BpmUserTaskApproveMethodEnum implements IntArrayValuable {
RANDOM(1, "随机挑选一人审批"),
RATIO(2, "多人会签(按通过比例)"), // 会签按通过比例
ANY(3, "多人或签(一人通过或拒绝)"), // 或签通过只需一人拒绝只需一人
SEQUENTIAL(4, "依次审批"); // 依次审批
RANDOM(1, "随机挑选一人审批", null),
RATIO(2, "多人会签(按通过比例)", "${ nrOfCompletedInstances >= nrOfInstances }"), // 会签按通过比例
ANY(3, "多人或签(一人通过或拒绝)", "${ nrOfCompletedInstances > 0 }"), // 或签通过只需一人拒绝只需一人
SEQUENTIAL(4, "依次审批", "${ nrOfCompletedInstances/nrOfInstances >= %s}"); // 依次审批
/**
* 审批方式
*/
private final Integer method;
/**
* 名字
*/
private final String name;
/**
* 完成表达式
*/
private final String completionCondition;
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskApproveMethodEnum::getMethod).toArray();

View File

@ -1,33 +0,0 @@
package cn.iocoder.yudao.module.bpm.framework.flowable.core.enums;
// TODO @jason要不合并到 BpmnModelConstants
/**
* 仿钉钉快搭 JSON 常量信息
*
* @author jason
*/
public interface SimpleModelConstants {
// TODO @芋艿条件表达式的字段名
/**
* 网关节点默认序列流属性
*/
String DEFAULT_FLOW_ATTRIBUTE = "defaultFlow";
/**
* 条件节点的条件类型属性
*/
String CONDITION_TYPE_ATTRIBUTE = "conditionType";
/**
* 条件节点条件表达式属性
*/
String CONDITION_EXPRESSION_ATTRIBUTE = "conditionExpression";
/**
* 条件规则的条件组属性
*/
String CONDITION_GROUPS_ATTRIBUTE = "conditionGroups";
}

View File

@ -35,7 +35,7 @@ import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnMode
import static org.flowable.bpmn.constants.BpmnXMLConstants.*;
/**
* 仿钉钉快搭模型相关的工具方法
* 仿钉钉/飞书的模型相关的工具方法
*
* @author jason
*/
@ -47,24 +47,7 @@ public class SimpleModelUtils {
public static final String JOIN_GATE_WAY_NODE_ID_SUFFIX = "_join";
/**
* 所有审批人同意的表达式
*/
public static final String ALL_APPROVE_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances >= nrOfInstances }";
/**
* 任一一名审批人同意的表达式
*/
public static final String ANY_OF_APPROVE_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances > 0 }";
/**
* 按通过比例完成表达式
*/
public static final String APPROVE_BY_RATIO_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances/nrOfInstances >= %s}";
// TODO @yunai注释需要完善下
/**
* 仿钉钉流程设计模型数据结构(json) 转换成 Bpmn Model (待完善
* 仿钉钉流程设计模型数据结构(json) 转换成 Bpmn Model
*
* @param processId 流程标识
* @param processName 流程名称
@ -72,20 +55,19 @@ public class SimpleModelUtils {
* @return Bpmn Model
*/
public static BpmnModel buildBpmnModel(String processId, String processName, BpmSimpleModelNodeVO simpleModelNode) {
// 1. 创建 BpmnModel
BpmnModel bpmnModel = new BpmnModel();
// 不加这个 解析 Message 会报 NPE 异常 .
bpmnModel.setTargetNamespace(BPMN2_NAMESPACE); // TODO @jason待定是不是搞个自定义的 namespace
// TODO 芋艿后续在 review
bpmnModel.setTargetNamespace(BPMN2_NAMESPACE); // 设置命名空间不加这个解析 Message 会报 NPE 异常
// 创建 Process 对象
Process process = new Process();
process.setId(processId);
process.setName(processName);
process.setExecutable(Boolean.TRUE); // TODO @jason这个是必须设置的么
process.setExecutable(Boolean.TRUE);
bpmnModel.addProcess(process);
// TODO 芋艿这里可能纠结下到底前端传递还是后端创建出来
// 目前前端的第一个节点是发起人节点这里构建一个 StartNode用于创建 Bpmn StartEvent 节点
BpmSimpleModelNodeVO startNode = buildStartSimpleModelNode();
// 2.1 创建 StartNode 节点
// 原因是目前前端的第一个节点是发起人节点所以这里构建一个 StartNode用于创建 Bpmn StartEvent 节点
BpmSimpleModelNodeVO startNode = buildStartNode();
startNode.setChildNode(simpleModelNode);
// 前端模型数据结构 SimpleModel 构建 FlowNode 并添加到 Main Process
traverseNodeToBuildFlowNode(startNode, process);
@ -99,12 +81,8 @@ public class SimpleModelUtils {
return bpmnModel;
}
private static BpmSimpleModelNodeVO buildStartSimpleModelNode() {
BpmSimpleModelNodeVO startNode = new BpmSimpleModelNodeVO();
startNode.setId(START_EVENT_NODE_ID);
startNode.setName(START_EVENT_NODE_NAME);
startNode.setType(START_NODE.getType());
return startNode;
private static BpmSimpleModelNodeVO buildStartNode() {
return new BpmSimpleModelNodeVO().setId(START_EVENT_NODE_ID).setName(START_EVENT_NODE_NAME).setType(START_NODE.getType());
}
// TODO @芋艿在优化下这个注释
@ -329,7 +307,6 @@ public class SimpleModelUtils {
list.addAll(parallelGateways);
break;
}
case INCLUSIVE_BRANCH_NODE: {
// TODO jason 待实现
break;
@ -512,29 +489,29 @@ public class SimpleModelUtils {
private static void processMultiInstanceLoopCharacteristics(Integer approveMethod, Integer approveRatio, UserTask userTask) {
BpmUserTaskApproveMethodEnum approveMethodEnum = BpmUserTaskApproveMethodEnum.valueOf(approveMethod);
// TODO @jason这种枚举最终不要去掉哈 BpmUserTaskApproveMethodEnum因为容易不经意重叠
if (approveMethodEnum == null || approveMethodEnum == RANDOM) {
Assert.notNull(approveMethodEnum, "审批方式({})不能为空", approveMethodEnum);
// 添加审批方式的扩展属性
addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_METHOD, approveMethod.toString());
if (approveMethodEnum == RANDOM) {
// 随机审批不需要设置多实例属性
return;
}
// 添加审批方式的扩展属性
addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_METHOD,
approveMethod == null ? null : approveMethod.toString());
// 处理多实例审批方式
MultiInstanceLoopCharacteristics multiInstanceCharacteristics = new MultiInstanceLoopCharacteristics();
// 设置 collectionVariable本系统用不到仅仅为了 Flowable 校验不报错
// 设置 collectionVariable本系统用不到仅仅为了 Flowable 校验不报错
multiInstanceCharacteristics.setInputDataItem("${coll_userList}");
if (approveMethodEnum == BpmUserTaskApproveMethodEnum.ANY) {
multiInstanceCharacteristics.setCompletionCondition(ANY_OF_APPROVE_COMPLETE_EXPRESSION);
multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition());
multiInstanceCharacteristics.setSequential(false);
userTask.setLoopCharacteristics(multiInstanceCharacteristics);
} else if (approveMethodEnum == SEQUENTIAL) {
multiInstanceCharacteristics.setCompletionCondition(ALL_APPROVE_COMPLETE_EXPRESSION);
multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition());
multiInstanceCharacteristics.setSequential(true);
multiInstanceCharacteristics.setLoopCardinality("1");
userTask.setLoopCharacteristics(multiInstanceCharacteristics);
} else if (approveMethodEnum == RATIO) {
Assert.notNull(approveRatio, "通过比例不能为空");
multiInstanceCharacteristics.setCompletionCondition(
String.format(APPROVE_BY_RATIO_COMPLETE_EXPRESSION, String.format("%.2f", approveRatio / (double) 100)));
String.format(approveMethodEnum.getCompletionCondition(), String.format("%.2f", approveRatio / 100D)));
multiInstanceCharacteristics.setSequential(false);
}
userTask.setLoopCharacteristics(multiInstanceCharacteristics);