【代码评审】BPM:review simple 字段、seq 连线

This commit is contained in:
YunaiV 2024-05-28 20:04:21 +08:00
parent 4bd399cd32
commit d9ca52a478
4 changed files with 33 additions and 7 deletions

View File

@ -30,6 +30,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable {
PARALLEL_BRANCH_JOIN_NODE(6, "并行分支聚合节点"),
INCLUSIVE_BRANCH_FORK_NODE(7, "包容网关分叉节点"),
INCLUSIVE_BRANCH_JOIN_NODE(8, "包容网关聚合节点"),
// TODO @jason建议整合 join最终只有 条件分支并行分支包容分支三种~
;
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray();
@ -43,7 +44,8 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable {
* @param type 节点类型
*/
public static boolean isBranchNode(Integer type) {
return Objects.equals(CONDITION_BRANCH_NODE.getType(), type) || Objects.equals(PARALLEL_BRANCH_FORK_NODE.getType(), type)
return Objects.equals(CONDITION_BRANCH_NODE.getType(), type)
|| Objects.equals(PARALLEL_BRANCH_FORK_NODE.getType(), type)
|| Objects.equals(INCLUSIVE_BRANCH_FORK_NODE.getType(), type) ;
}

View File

@ -28,16 +28,25 @@ public class BpmSimpleModelNodeVO {
@Schema(description = "模型节点名称", example = "领导审批")
private String name;
// TODO @jason要不改成 placeholder 和一般 Element-Plus 组件一致占位符用于展示
@Schema(description = "节点展示内容", example = "指定成员: 芋道源码")
private String showText;
@Schema(description = "子节点")
private BpmSimpleModelNodeVO childNode;
@Schema(description = "子节点")
private BpmSimpleModelNodeVO childNode; // 补充说明在该模型下子节点有且仅有一个不会有多个
@Schema(description = "网关节点的条件节点")
private List<BpmSimpleModelNodeVO> conditionNodes;
@Schema(description = "条件节点")
private List<BpmSimpleModelNodeVO> conditionNodes; // 补充说明有且仅有条件并行包容等分支会使用
@Schema(description = "节点的属性")
private Map<String, Object> attributes;
private Map<String, Object> attributes; // TODO @jason建议是字段分拆下类似说
// Map<String, Integer> formPermissions; 表单权限仅发起审批抄送节点会使用
// Integer approveMethod; 审批方式仅审批节点会使用
// TODO @芋艿审批人的选择
// TODO @芋艿没有人的策略
// TODO @芋艿审批拒绝的策略
// TODO @芋艿配置的可操作列表
// TODO @芋艿超时配置要支持指定时间点指定时间间隔
// TODO @芋艿条件建议可以固化的一些选项然后有个表达式兜底要支持
}

View File

@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
// TODO @jason需要考虑如果某个节点的配置不正确需要有提示具体怎么实现可以讨论下
@Schema(description = "管理后台 - 仿钉钉流程设计模型的新增/修改 Request VO")
@Data
public class BpmSimpleModelUpdateReqVO {
@ -14,6 +15,7 @@ public class BpmSimpleModelUpdateReqVO {
@NotEmpty(message = "流程模型编号不能为空")
private String modelId; // 对应 Flowable act_re_model ID_ 字段
// TODO @jasonsimpleModel 要不
@Schema(description = "仿钉钉流程设计模型对象", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "仿钉钉流程设计模型对象不能为空")
@Valid

View File

@ -92,11 +92,13 @@ public class SimpleModelUtils {
private static void buildAndAddBpmnSequenceFlow(Process mainProcess, BpmSimpleModelNodeVO node, String targetId) {
// 节点为 null 或者 为END_EVENT 退出
// TODO @jasonisValidNode然后把 END_NODE 是不是拿到 switch (nodeType) { return 这样出口更统一一点
if (node == null || node.getId() == null || END_NODE.getType().equals(node.getType())) {
return;
}
BpmSimpleModelNodeVO childNode = node.getChildNode();
// 如果是网关分支节点. 后续节点可能为 null但不是 END_EVENT 节点
// TODO @芋艿这个要不要挪到 START_NODE - INCLUSIVE_BRANCH_JOIN_NODE 待定感觉 switch 那最终是分三个情况branch子节点结束了每种情况的注释需要写的更完整
if (!BpmSimpleModelNodeType.isBranchNode(node.getType()) && (childNode == null || childNode.getId() == null)) {
SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), targetId, null, null, null);
mainProcess.addFlowElement(sequenceFlow);
@ -104,6 +106,7 @@ public class SimpleModelUtils {
}
BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType());
Assert.notNull(nodeType, "模型节点类型不支持");
// TODO @jason下面的 PARALLEL_BRANCH_FORK_NODECONDITION_BRANCH_NODEINCLUSIVE_BRANCH_FORK_NODE 是不是就是 isBranchNode如果是的话貌似不用 swtich而是 if else 分类处理呢
switch (nodeType) {
case START_NODE:
case APPROVE_NODE:
@ -119,17 +122,24 @@ public class SimpleModelUtils {
case PARALLEL_BRANCH_FORK_NODE:
case CONDITION_BRANCH_NODE:
case INCLUSIVE_BRANCH_FORK_NODE: {
// TODO @jason这里 sequenceFlowTargetId 不建议做这样的 default万一可能有 bug 直接弄到对应的 136- 146 会更安全一点
String sequenceFlowTargetId = (childNode == null || childNode.getId() == null) ? targetId : childNode.getId();
List<BpmSimpleModelNodeVO> conditionNodes = node.getConditionNodes();
Assert.notEmpty(conditionNodes, "网关节点的条件节点不能为空");
for (BpmSimpleModelNodeVO item : conditionNodes) {
// 构建表达式
// TODO @jason条件分支的情况下需要分 item 搞的条件 conditionNodes 搞的条件
String conditionExpression = buildConditionExpression(item);
BpmSimpleModelNodeVO nextNodeOnCondition = item.getChildNode();
// TODO @jasonisValidNode
if (nextNodeOnCondition != null && nextNodeOnCondition.getId() != null) {
// TODO @jason会存在 item.name 未空的情况么这个时候要不要兜底处理拼接
SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), nextNodeOnCondition.getId(),
item.getId(), item.getName(), conditionExpression);
mainProcess.addFlowElement(sequenceFlow);
// 递归调用后续节点
// TODO @jason最好也有个例子嘿嘿S4
buildAndAddBpmnSequenceFlow(mainProcess, nextNodeOnCondition, sequenceFlowTargetId);
} else {
SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), sequenceFlowTargetId,
@ -137,7 +147,7 @@ public class SimpleModelUtils {
mainProcess.addFlowElement(sequenceFlow);
}
}
// 递归调用后续节点
// 递归调用后续节点 TODO @jason最好有个例子哈
buildAndAddBpmnSequenceFlow(mainProcess, childNode, targetId);
break;
}
@ -188,6 +198,9 @@ public class SimpleModelUtils {
}
private static SequenceFlow buildBpmnSequenceFlow(String sourceId, String targetId, String seqFlowId, String seqName, String conditionExpression) {
// TODO @jason最好断言下sourceIdtargetId 必须存在
// TODO @jason如果 seqFlowId 不存在的时候是不是要生成一个默认的 seqFlowId
// TODO @jason如果 name 不存在的时候是不是要生成一个默认的 name
SequenceFlow sequenceFlow = new SequenceFlow(sourceId, targetId);
if (StrUtil.isNotEmpty(conditionExpression)) {
sequenceFlow.setConditionExpression(conditionExpression);