【代码评审】BPM:Simple 设计器 - 路由分支

This commit is contained in:
YunaiV 2025-01-07 22:27:06 +08:00
parent 34c8f4cae1
commit ae3c63eb29
2 changed files with 18 additions and 11 deletions

View File

@ -39,6 +39,7 @@ public class BpmSimpleModelNodeVO {
@Schema(description = "条件节点") @Schema(description = "条件节点")
private List<BpmSimpleModelNodeVO> conditionNodes; // 补充说明有且仅有条件并行包容等分支会使用 private List<BpmSimpleModelNodeVO> conditionNodes; // 补充说明有且仅有条件并行包容等分支会使用
// TODO @jasonconditionTypeconditionExpressiondefaultFlowconditionGroups 搞成一个 condition 属性会好点么
@Schema(description = "条件类型", example = "1") @Schema(description = "条件类型", example = "1")
@InEnum(BpmSimpleModeConditionType.class) @InEnum(BpmSimpleModeConditionType.class)
private Integer conditionType; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE private Integer conditionType; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE
@ -251,6 +252,7 @@ public class BpmSimpleModelNodeVO {
@Schema(description = "运算符右边的值", example = "1") @Schema(description = "运算符右边的值", example = "1")
@NotEmpty(message = "运算符右边的值不能为空") @NotEmpty(message = "运算符右边的值不能为空")
private String rightSide; private String rightSide;
} }
@Schema(description = "延迟器设置", example = "{}") @Schema(description = "延迟器设置", example = "{}")
@ -269,8 +271,10 @@ public class BpmSimpleModelNodeVO {
@Schema(description = "延迟时间表达式", example = "PT1H,2025-01-01T00:00:00") @Schema(description = "延迟时间表达式", example = "PT1H,2025-01-01T00:00:00")
@NotEmpty(message = "延迟时间表达式不能为空") @NotEmpty(message = "延迟时间表达式不能为空")
private String delayTime; private String delayTime;
} }
// TODO @lesanrouteGroups
@Schema(description = "路由分支组", example = "[]") @Schema(description = "路由分支组", example = "[]")
private List<RouteCondition> routeGroup; private List<RouteCondition> routeGroup;
@ -282,10 +286,11 @@ public class BpmSimpleModelNodeVO {
@Valid @Valid
public static class RouteCondition { public static class RouteCondition {
@Schema(description = "节点Id", example = "Activity_xxx") @Schema(description = "节点 Id", example = "Activity_xxx")
@NotEmpty(message = "节点Id不能为空") @NotEmpty(message = "节点 Id 不能为空")
private String nodeId; private String nodeId;
// TODO @lesantypeexpressiongroups可以晚点改在和 conditionTypeconditionExpressiondefaultFlowconditionGroups 讨论
@Schema(description = "条件类型", example = "1") @Schema(description = "条件类型", example = "1")
@InEnum(BpmSimpleModeConditionType.class) @InEnum(BpmSimpleModeConditionType.class)
@NotNull(message = "条件类型不能为空") @NotNull(message = "条件类型不能为空")
@ -296,6 +301,7 @@ public class BpmSimpleModelNodeVO {
@Schema(description = "条件组", example = "{}") @Schema(description = "条件组", example = "{}")
private ConditionGroups conditionGroups; private ConditionGroups conditionGroups;
} }
} }

View File

@ -42,8 +42,7 @@ public class SimpleModelUtils {
List<NodeConvert> converts = asList(new StartNodeConvert(), new EndNodeConvert(), List<NodeConvert> converts = asList(new StartNodeConvert(), new EndNodeConvert(),
new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(),
new DelayTimerNodeConvert(), new DelayTimerNodeConvert(),
new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new RouteBranchNodeConvert());
new RouteBranchNodeConvert());
converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert));
} }
@ -185,7 +184,7 @@ public class SimpleModelUtils {
BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType()); BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType());
BpmSimpleModelNodeVO childNode = node.getChildNode(); BpmSimpleModelNodeVO childNode = node.getChildNode();
List<BpmSimpleModelNodeVO> conditionNodes = node.getConditionNodes(); List<BpmSimpleModelNodeVO> conditionNodes = node.getConditionNodes();
// TODO @芋艿 路由分支没有conditionNodes 这里注释会影响吗 // TODO @芋艿 路由分支没有conditionNodes 这里注释会影响吗@jason一起帮忙瞅瞅
// Assert.notEmpty(conditionNodes, "分支节点的条件节点不能为空"); // Assert.notEmpty(conditionNodes, "分支节点的条件节点不能为空");
// 分支终点节点 ID // 分支终点节点 ID
String branchEndNodeId = null; String branchEndNodeId = null;
@ -204,8 +203,8 @@ public class SimpleModelUtils {
if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) {
// 路由分支遍历 // 路由分支遍历
for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouteGroup()) { for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouteGroup()) {
SequenceFlow sFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), route); SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), route);
process.addFlowElement(sFlow); process.addFlowElement(sequenceFlow);
} }
} else { } else {
// 下面的注释以如下情况举例子分支 1A->B->C->D->E分支 2A->D->E其中A 为分支节点, D A 孩子节点 // 下面的注释以如下情况举例子分支 1A->B->C->D->E分支 2A->D->E其中A 为分支节点, D A 孩子节点
@ -228,15 +227,14 @@ public class SimpleModelUtils {
} }
} }
// 4. 各分支节点所需特殊处理 // 4.1 如果是并行分支包容分支由于是程序创建的聚合网关需要手工创建聚合网关和下一个节点的连线
if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE
|| nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE ) { || nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE) {
// 如果是并行分支包容分支由于是程序创建的聚合网关需要手工创建聚合网关和下一个节点的连线
String nextNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; String nextNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId;
SequenceFlow sequenceFlow = buildBpmnSequenceFlow(branchEndNodeId, nextNodeId); SequenceFlow sequenceFlow = buildBpmnSequenceFlow(branchEndNodeId, nextNodeId);
process.addFlowElement(sequenceFlow); process.addFlowElement(sequenceFlow);
// 4.2 如果是路由分支需要连接后续节点为默认路由
} else if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { } else if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) {
// 如果是路由分支需要连接后续节点为默认路由
SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getDefaultFlowId(), SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getDefaultFlowId(),
null, null); null, null);
process.addFlowElement(sequenceFlow); process.addFlowElement(sequenceFlow);
@ -617,10 +615,12 @@ public class SimpleModelUtils {
return buildConditionExpression(node.getConditionType(), node.getConditionExpression(), return buildConditionExpression(node.getConditionType(), node.getConditionExpression(),
node.getConditionGroups()); node.getConditionGroups());
} }
public static String buildConditionExpression(BpmSimpleModelNodeVO.RouteCondition route) { public static String buildConditionExpression(BpmSimpleModelNodeVO.RouteCondition route) {
return buildConditionExpression(route.getConditionType(), route.getConditionExpression(), return buildConditionExpression(route.getConditionType(), route.getConditionExpression(),
route.getConditionGroups()); route.getConditionGroups());
} }
public static String buildConditionExpression(Integer conditionType, String conditionExpression, public static String buildConditionExpression(Integer conditionType, String conditionExpression,
ConditionGroups conditionGroups) { ConditionGroups conditionGroups) {
BpmSimpleModeConditionType conditionTypeEnum = BpmSimpleModeConditionType.valueOf(conditionType); BpmSimpleModeConditionType conditionTypeEnum = BpmSimpleModeConditionType.valueOf(conditionType);
@ -711,6 +711,7 @@ public class SimpleModelUtils {
String conditionExpression = ConditionNodeConvert.buildConditionExpression(route); String conditionExpression = ConditionNodeConvert.buildConditionExpression(route);
return buildBpmnSequenceFlow(nodeId, route.getNodeId(), null, null, conditionExpression); return buildBpmnSequenceFlow(nodeId, route.getNodeId(), null, null, conditionExpression);
} }
} }
private static String buildGatewayJoinId(String id) { private static String buildGatewayJoinId(String id) {