mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +08:00 
			
		
		
		
	【代码优化】工作流:将 SimpleModelConstants 删除
【代码优化】工作流:将 BpmUserTaskApproveMethodEnum 增加 completionCondition
This commit is contained in:
		@@ -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();
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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";
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user