package com.cxygzl.core.utils;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.cxygzl.common.constants.NodeTypeEnum;
import com.cxygzl.common.constants.ProcessInstanceConstant;
import com.cxygzl.common.dto.flow.ExpireSetting;
import com.cxygzl.common.dto.flow.Node;
import com.cxygzl.common.utils.NodeUtil;
import com.cxygzl.core.expression.condition.NodeExpressionStrategyFactory;
import com.cxygzl.core.listeners.ApprovalCreateListener;
import com.cxygzl.core.listeners.FlowProcessEventListener;
import com.cxygzl.core.node.INodeDataStoreHandler;
import com.cxygzl.core.node.NodeDataStoreFactory;
import com.cxygzl.core.servicetask.ApproveServiceTask;
import com.cxygzl.core.servicetask.CopyServiceTask;
import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.*;
import java.util.ArrayList;
import java.util.List;
/**
* 模型工具类 处理模型构建相关的
*/
@Slf4j
public class ModelUtil {
/**
* 构建模型
*
* @param nodeDto 前端传输节点
* @return
*/
public static BpmnModel buildBpmnModel(Node nodeDto, String processName, String flowId) {
BpmnModel bpmnModel = new BpmnModel();
bpmnModel.setTargetNamespace("cxygzl");
Process process = new Process();
process.setId(flowId);
process.setName(processName);
//流程监听器
ArrayList<EventListener> eventListeners = new ArrayList<>();
{
//流程实例监听器
EventListener eventListener = new EventListener();
eventListener.setImplementationType("class");
eventListener.setImplementation(FlowProcessEventListener.class.getCanonicalName());
eventListeners.add(eventListener);
}
process.setEventListeners(eventListeners);
NodeUtil.addEndNode(nodeDto);
//创建所有的节点
buildAllNode(process, nodeDto, flowId);
//创建所有的内部节点连接线
buildAllNodeInnerSequence(process, nodeDto, flowId);
//创建节点间连线
buildAllNodeOuterSequence(process, nodeDto, null);
//处理分支和下级连线
bpmnModel.addProcess(process);
return bpmnModel;
}
/**
* 先创建所有的节点
*
* @param process
* @param nodeDto
* @param flowId
*/
public static void buildAllNode(Process process, Node nodeDto, String flowId) {
if (!NodeUtil.isNode(nodeDto)) {
return;
}
List<FlowElement> flowElementList = buildNode(nodeDto, flowId);
for (FlowElement flowElement : flowElementList) {
if (process.getFlowElement(flowElement.getId()) == null) {
process.addFlowElement(flowElement);
}
}
//子节点
Node children = nodeDto.getChildNode();
if (NodeTypeEnum.getByValue(nodeDto.getType()).getBranch()) {
//条件分支
List<Node> branchs = nodeDto.getConditionNodes();
for (Node branch : branchs) {
buildAllNode(process, branch.getChildNode(),
flowId);
}
if (NodeUtil.isNode(children)) {
buildAllNode(process, children, flowId);
}
} else {
if (NodeUtil.isNode(children)) {
buildAllNode(process, children, flowId);
}
}
}
/**
* 先创建所有的内部节点连接线
*
* @param process
* @param nodeDto
* @param flowId
*/
public static void buildAllNodeInnerSequence(Process process, Node nodeDto, String flowId) {
if (!NodeUtil.isNode(nodeDto)) {
return;
}
//画内部线
List<SequenceFlow> flowList = buildInnerSequenceFlow(nodeDto, flowId);
for (SequenceFlow sequenceFlow : flowList) {
process.addFlowElement(sequenceFlow);
}
//子节点
Node children = nodeDto.getChildNode();
if (NodeTypeEnum.getByValue(nodeDto.getType()).getBranch() ) {
//条件分支
List<Node> branchs = nodeDto.getConditionNodes();
for (Node branch : branchs) {
buildAllNodeInnerSequence(process, branch.getChildNode(),
flowId);
}
if (NodeUtil.isNode(children)) {
buildAllNodeInnerSequence(process, children, flowId);
}
} else {
if (NodeUtil.isNode(children)) {
buildAllNodeInnerSequence(process, children, flowId);
}
}
}
/**
* 递归创建节点间连线
*
* @param process 流程
* @param nodeDto 节点对象
* @param nextId
*/
public static void buildAllNodeOuterSequence(Process process, Node nodeDto, String nextId) {
if (!NodeUtil.isNode(nodeDto)) {
return;
}
//子节点
Node children = nodeDto.getChildNode();
if (NodeTypeEnum.getByValue(nodeDto.getType()).getBranch() ) {
// children = children.getChildren();
//条件分支
List<Node> branchs = nodeDto.getConditionNodes();
int ord = 1;
int size = branchs.size();
for (Node branch : branchs) {
buildAllNodeOuterSequence(process, branch.getChildNode(), nodeDto.getTailId());
String expression = null;
if (nodeDto.getType() == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue() ) {
if (ord == size) {
expression = NodeExpressionStrategyFactory.handleDefaultBranch(branchs, ord - 1);
} else if (nodeDto.getType() == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue() && ord > 1) {
expression = NodeExpressionStrategyFactory.handleDefaultBranch(branchs, ord - 1);
} else {
expression = NodeExpressionStrategyFactory.handle(branch);
}
}
//添加连线
if (!NodeUtil.isNode(branch.getChildNode())) {
//当前分支 没有其他节点了 所有就是网关和网关后面节点直接连线
SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeDto.getId(), nodeDto.getTailId(),
expression,
StrUtil.format("{}->{}", nodeDto.getNodeName(), nodeDto.getNodeName())
);
process.addFlowElement(sequenceFlow);
} else {
SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeDto.getId(), branch.getChildNode().getHeadId(),
expression,
StrUtil.format("{}->{}", nodeDto.getNodeName(), branch.getChildNode().getNodeName())
);
process.addFlowElement(sequenceFlow);
}
ord++;
}
//分支结尾的合并分支节点-》下一个节点
if (children != null && StrUtil.isNotBlank(children.getHeadId()) && StrUtil.isNotBlank(nodeDto.getTailId())) {
SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeDto.getTailId(), children.getHeadId(),
"",
StrUtil.format("{}->{}", nodeDto.getNodeName(), children.getNodeName())
);
process.addFlowElement(sequenceFlow);
} else if (StrUtil.isAllNotBlank(nodeDto.getTailId(), nextId)) {
SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeDto.getTailId(), nextId,
"",
StrUtil.format("{}->{}", nodeDto.getNodeName(), nextId)
);
没有合适的资源?快使用搜索试试~ 我知道了~
基于Flowable的低代码开源工作流引擎设计源码
共662个文件
java:261个
js:229个
css:70个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 117 浏览量
2024-04-15
02:04:54
上传
评论
收藏 6.36MB ZIP 举报
温馨提示
基于Flowable的低代码开源工作流引擎设计源码,该项目包含662个文件,主要文件类型有261个java源文件,229个javascript文件,以及70个css样式文件。此外,还包括59个svg图像文件,8个xml配置文件,以及8个sql数据库文件。该项目是一个基于Flowable的开箱即用的低代码开源专业工作流引擎,可能涉及用户界面设计、应用逻辑实现、数据存储等多个方面。
资源推荐
资源详情
资源评论
收起资源包目录
基于Flowable的低代码开源工作流引擎设计源码 (662个子文件)
index-7ceaa33f.css 63KB
el-row-18c8e13f.css 33KB
addNode-82269853.css 31KB
nodeWrap-8798d817.css 29KB
approval-18790b86.css 29KB
errorDialog-47ffc4ed.css 29KB
step3-d5ef26d9.css 29KB
el-date-picker-979cdddd.css 24KB
index-6efdf898.css 19KB
el-tab-pane-eecd8b5a.css 18KB
el-table-column-c73cf0eb.css 17KB
wang-editor-012b18d7.css 15KB
el-time-picker-3c0005cc.css 14KB
el-progress-f7905b11.css 13KB
el-select-0b32213c.css 10KB
taginput-d2427dee.css 9KB
index-fcde02f4.css 7KB
all-aba4e88f.css 7KB
index-a8daf605.css 6KB
el-checkbox-f06e07bc.css 6KB
el-tag-2fca7a82.css 6KB
el-tree-4b996a7d.css 5KB
el-radio-d45c78e7.css 4KB
el-dialog-e409f358.css 4KB
el-switch-4d96cdcc.css 4KB
el-input-number-e34b49f4.css 4KB
el-form-7d5af5e1.css 4KB
selectBox-450c4e85.css 4KB
el-link-abec4f6c.css 3KB
404-b50bdf49.css 3KB
el-alert-5d45f733.css 3KB
FlowNodeFormatData-04ab8ff1.css 3KB
el-popper-b17b6765.css 2KB
el-drawer-f97e7830.css 2KB
el-loading-d0f2d079.css 2KB
employeesDialog-d99a9a4f.css 2KB
employeesRoleDialog-6a0d1354.css 2KB
index-267ab01d.css 2KB
step2-4a7b9b6a.css 1KB
el-popover-9f471fc1.css 1KB
formPerm-40fb7d3d.css 1KB
el-scrollbar-df5aa9a0.css 1KB
Money-557ef0ff.css 961B
401-4c35088a.css 928B
el-avatar-55e4ee6e.css 854B
selectResult-2339555f.css 791B
index-6126a1e4.css 791B
index-169de46f.css 757B
el-card-208b2445.css 756B
group-129e2720.css 723B
el-divider-f4d3946e.css 706B
el-icon-b1770749.css 653B
signature-d5d715a0.css 584B
MultiUpload-a3bc134b.css 576B
el-tree-select-409abcbc.css 539B
SingleUpload-a5d79d00.css 536B
list-91d1ca13.css 514B
SingleSelect-431fc1e6.css 292B
MultiSelect-b222f8a7.css 292B
api-doc-d7f82127.css 277B
index-a901a61c.css 139B
DateTime-bd0c2f01.css 100B
condition-63d5cddf.css 100B
Time-58c79621.css 100B
Date-16ec343b.css 100B
Date-27bb2870.css 100B
Time-4a2ff280.css 100B
DateTime-1b121c16.css 100B
step1-a5e12012.css 93B
conditionDrawer-98dbad2a.css 93B
401-a61ddb94.gif 160KB
.gitignore 491B
.gitignore 491B
.gitignore 490B
index.html 548B
favicon.ico 4KB
ModelUtil.java 22KB
ProcessInstanceServiceImpl.java 17KB
NodeFormatUtil.java 14KB
FlowController.java 14KB
OrgServiceImpl.java 12KB
MenuServiceImpl.java 12KB
ExpressionHandler.java 11KB
RemoteServiceImpl.java 10KB
TaskServiceImpl.java 10KB
UserServiceImpl.java 9KB
RoleServiceImpl.java 8KB
ProcessServiceImpl.java 7KB
TimeFiredEventListener.java 6KB
TestNetController.java 6KB
BizHttpUtil.java 6KB
CombinationGroupServiceImpl.java 6KB
CoreHttpUtil.java 5KB
RemoteController.java 5KB
TaskController.java 5KB
LocalApi.java 5KB
InjectMultiInstanceUserTaskCmd.java 5KB
MultiInstanceHandler.java 4KB
ProcessInstanceAssignUserRecordServiceImpl.java 4KB
ProcessInstanceCopyServiceImpl.java 4KB
共 662 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7
资源评论
沐知全栈开发
- 粉丝: 4743
- 资源: 3374
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 筷手引流工具.apk
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功