mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-04 08:06:12 +08:00 
			
		
		
		
	bpm:code review 钉钉流程设计器
This commit is contained in:
		@ -18,14 +18,19 @@ import java.util.Objects;
 | 
				
			|||||||
public enum BpmSimpleModelNodeType implements IntArrayValuable {
 | 
					public enum BpmSimpleModelNodeType implements IntArrayValuable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO @jaosn:-1、0、1、4、-2 是前端已经定义好的么?感觉未来可以考虑搞成和 BPMN 尽量一致的单词哈;类似 usertask 用户审批;
 | 
					    // TODO @jaosn:-1、0、1、4、-2 是前端已经定义好的么?感觉未来可以考虑搞成和 BPMN 尽量一致的单词哈;类似 usertask 用户审批;
 | 
				
			||||||
 | 
					    // TODO @jason:_NODE 都删除掉哈;
 | 
				
			||||||
    START_EVENT_NODE(0, "开始节点"),
 | 
					    START_EVENT_NODE(0, "开始节点"),
 | 
				
			||||||
    APPROVE_USER_NODE(1, "审批人节点"),
 | 
					    END_EVENT_NODE(-2, "结束节点"), // TODO @jaosn:挪到 START_EVENT_NODE 后;
 | 
				
			||||||
    // 抄送人节点、对应 BPMN 的 ScriptTask. 使用ScriptTask 原因。好像 ServiceTask 自定义属性不能写入 XML
 | 
					
 | 
				
			||||||
    SCRIPT_TASK_NODE(2, "抄送人节点"),
 | 
					    APPROVE_USER_NODE(1, "审批人节点"), // TODO @jaosn:是不是这里从 10 开始好点;相当于说,0-9 给开始和结束;10-19 给各种节点;20-29 给各种条件;TODO @jason:改成 USER_TASK 是不是好点呀
 | 
				
			||||||
    EXCLUSIVE_GATEWAY_NODE(4, "排他网关"),
 | 
					    // 抄送人节点、对应 BPMN 的 ScriptTask. 使用ScriptTask 原因。好像 ServiceTask 自定义属性不能写入 XML;
 | 
				
			||||||
    PARALLEL_GATEWAY_FORK_NODE(5, "并行网关分叉节点"),
 | 
					    // TODO @jason:ServiceTask 自定义 xml,有没啥报错信息;
 | 
				
			||||||
 | 
					    SCRIPT_TASK_NODE(2, "抄送人节点"), // TODO @jason:是不是改成 COPY_TASK 好一点哈;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXCLUSIVE_GATEWAY_NODE(4, "排他网关"), // TODO @jason:是不是改成叫 条件分支?
 | 
				
			||||||
 | 
					    PARALLEL_GATEWAY_FORK_NODE(5, "并行网关分叉节点"), // TODO @jason:是不是一个 并行分支 ?就可以啦?
 | 
				
			||||||
    PARALLEL_GATEWAY_JOIN_NODE(6, "并行网关聚合节点"),
 | 
					    PARALLEL_GATEWAY_JOIN_NODE(6, "并行网关聚合节点"),
 | 
				
			||||||
    END_EVENT_NODE(-2, "结束节点");
 | 
					    ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray();
 | 
					    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -340,7 +340,7 @@ public class BpmnModelUtils {
 | 
				
			|||||||
        return userTaskList;
 | 
					        return userTaskList;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ========== TODO 芋艿:这里得捉摸下; ==========
 | 
					    // ========== TODO @jason:单独出一个 SimpleModelUtils;定位上,它是 BPMN 的精简模式 ==========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 仿钉钉流程设计模型数据结构(json) 转换成 Bpmn Model (待完善)
 | 
					     * 仿钉钉流程设计模型数据结构(json) 转换成 Bpmn Model (待完善)
 | 
				
			||||||
@ -382,6 +382,7 @@ public class BpmnModelUtils {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType());
 | 
					        BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType());
 | 
				
			||||||
        Assert.notNull(nodeType, "模型节点类型不支持");
 | 
					        Assert.notNull(nodeType, "模型节点类型不支持");
 | 
				
			||||||
 | 
					        // TODO @jason:建议是,addXXX 都改成 buildXXX,构建出一个什么;然后返回之后,让这个方法添加到自己的结果里;
 | 
				
			||||||
        switch (nodeType) {
 | 
					        switch (nodeType) {
 | 
				
			||||||
            case START_EVENT_NODE:
 | 
					            case START_EVENT_NODE:
 | 
				
			||||||
            case APPROVE_USER_NODE:
 | 
					            case APPROVE_USER_NODE:
 | 
				
			||||||
@ -488,9 +489,11 @@ public class BpmnModelUtils {
 | 
				
			|||||||
        ScriptTask scriptTask = new ScriptTask();
 | 
					        ScriptTask scriptTask = new ScriptTask();
 | 
				
			||||||
        scriptTask.setId(node.getId());
 | 
					        scriptTask.setId(node.getId());
 | 
				
			||||||
        scriptTask.setName(node.getName());
 | 
					        scriptTask.setName(node.getName());
 | 
				
			||||||
 | 
					        // TODO @jason:建议使用 ServiceTask,通过 executionListeners 实现;
 | 
				
			||||||
        scriptTask.setScriptFormat(ScriptingEngines.DEFAULT_SCRIPTING_LANGUAGE);
 | 
					        scriptTask.setScriptFormat(ScriptingEngines.DEFAULT_SCRIPTING_LANGUAGE);
 | 
				
			||||||
        scriptTask.setScript(BPMN_SIMPLE_COPY_EXECUTION_SCRIPT);
 | 
					        scriptTask.setScript(BPMN_SIMPLE_COPY_EXECUTION_SCRIPT);
 | 
				
			||||||
        // 添加自定义属性
 | 
					        // 添加自定义属性
 | 
				
			||||||
 | 
					        // TODO @jason:可以使用 ServiceTask 搞 ExtensionAttribute 么?
 | 
				
			||||||
        addExtensionAttributes(node, scriptTask);
 | 
					        addExtensionAttributes(node, scriptTask);
 | 
				
			||||||
        mainProcess.addFlowElement(scriptTask);
 | 
					        mainProcess.addFlowElement(scriptTask);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -53,7 +53,7 @@ public interface BpmModelService {
 | 
				
			|||||||
     * @param id 编号
 | 
					     * @param id 编号
 | 
				
			||||||
     * @param xmlBytes BPMN XML bytes
 | 
					     * @param xmlBytes BPMN XML bytes
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    // TODO @芋艿:可能要关注下;
 | 
					    // TODO @芋艿:感觉可以不修改这个方法,而是额外加一个方法;传入 id,bpmn,json;
 | 
				
			||||||
    void saveModelBpmnXml(String id, byte[] xmlBytes);
 | 
					    void saveModelBpmnXml(String id, byte[] xmlBytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,7 @@ import static cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeTyp
 | 
				
			|||||||
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.USER_TASK_CANDIDATE_PARAM;
 | 
					import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.USER_TASK_CANDIDATE_PARAM;
 | 
				
			||||||
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY;
 | 
					import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO @jason:这块可以讨论下,是不是合并成一个 BpmnModelServiceImpl
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 仿钉钉流程设计 Service 实现类
 | 
					 * 仿钉钉流程设计 Service 实现类
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
				
			|||||||
@ -44,9 +44,10 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
 | 
				
			|||||||
    @Lazy // 延迟加载,避免循环依赖
 | 
					    @Lazy // 延迟加载,避免循环依赖
 | 
				
			||||||
    private BpmProcessDefinitionService processDefinitionService;
 | 
					    private BpmProcessDefinitionService processDefinitionService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO @芋艿:这里多加了一个 name;
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void createProcessInstanceCopy(Collection<Long> userIds, String processInstanceId, String taskId, String taskName) {
 | 
					    public void createProcessInstanceCopy(Collection<Long> userIds, String processInstanceId, String taskId, String taskName) {
 | 
				
			||||||
        // 1.1 校验任务存在 暂时去掉这个校验. 因为任务可能仿钉钉快搭的抄送节点(ScriptTask)
 | 
					        // 1.1 校验任务存在 暂时去掉这个校验. 因为任务可能仿钉钉快搭的抄送节点(ScriptTask) TODO jason:抄送节点,会没有来源的 taskId 么?
 | 
				
			||||||
//        Task task = taskService.getTask(taskId);
 | 
					//        Task task = taskService.getTask(taskId);
 | 
				
			||||||
//        if (ObjectUtil.isNull(task)) {
 | 
					//        if (ObjectUtil.isNull(task)) {
 | 
				
			||||||
//            throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
 | 
					//            throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ import org.springframework.stereotype.Service;
 | 
				
			|||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 仿钉钉快搭各个节点 Service
 | 
					 * 仿钉钉快搭各个节点 Service TODO @jason:注释要有空行哈;
 | 
				
			||||||
 * @author jason
 | 
					 * @author jason
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@Service
 | 
					@Service
 | 
				
			||||||
@ -21,14 +21,16 @@ public class BpmSimpleNodeService {
 | 
				
			|||||||
    private BpmProcessInstanceCopyService processInstanceCopyService;
 | 
					    private BpmProcessInstanceCopyService processInstanceCopyService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 仿钉钉快搭抄送
 | 
					     * 仿钉钉快搭抄送 TODO @jason:注释要有空行哈;
 | 
				
			||||||
     * @param execution 执行的任务(ScriptTask)
 | 
					     * @param execution 执行的任务(ScriptTask)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public Boolean copy(DelegateExecution execution) {
 | 
					    public Boolean copy(DelegateExecution execution) {
 | 
				
			||||||
 | 
					        // TODO @芋艿:可能要考虑,系统抄送,没有 taskId 的情况。
 | 
				
			||||||
        Set<Long> userIds = taskCandidateInvoker.calculateUsers(execution);
 | 
					        Set<Long> userIds = taskCandidateInvoker.calculateUsers(execution);
 | 
				
			||||||
        FlowElement currentFlowElement = execution.getCurrentFlowElement();
 | 
					        FlowElement currentFlowElement = execution.getCurrentFlowElement();
 | 
				
			||||||
        processInstanceCopyService.createProcessInstanceCopy(userIds, execution.getProcessInstanceId(),
 | 
					        processInstanceCopyService.createProcessInstanceCopy(userIds, execution.getProcessInstanceId(),
 | 
				
			||||||
                currentFlowElement.getId(), currentFlowElement.getName());
 | 
					                currentFlowElement.getId(), currentFlowElement.getName());
 | 
				
			||||||
        return Boolean.TRUE;
 | 
					        return Boolean.TRUE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user