::warm-flow-solon-plugin [国产]
<dependency>
<groupId>io.github.minliuhua</groupId>
<artifactId>warm-flow-solon-plugin</artifactId>
<version>最新版本</version>
</dependency>
仓库地址:
https://gitee.com/warm_4/warm-flow
-
介绍
此项目是极其简单的工作流,没有太多设计,代码量少,并且只有6张表,个把小时就可以看完整个设计。使用起来方便
- 支持简单的流程流转,比如跳转、回退、审批
- 支持角色、部门和用户等权限配置
- 官方提供简单流程封装demo项目,很实用
- 支持多租户
- 支持代办任务和已办任务,通过权限标识过滤数据
- 支持互斥网关,并行网关(会签、或签)
- 可退回任意节点
- 支持条件表达式,可扩展
- 同时支持spring和solon
- 兼容java8和java17,理论11也可以
- 支持不同orm框架和数据库扩展
- 支持增加监听器,参数传递
demo项目:
springboot:hh-vue |演示地址
solon:warm-sun |演示地址快速开始
在开始之前,我们假定您已经:
- 熟悉 Java 环境配置及其开发
- 熟悉 关系型 数据库,比如 MySQL
- 熟悉 Spring Boot或者Solon 及相关框架
- 熟悉 Java 构建工具,比如 Maven
导入sql,按需求执行增量脚本
如果第一次导入,请先创建数据库,并导入:https://gitee.com/warm_4/warm-flow/blob/master/sql/warm-flow.sql
如果需要增量更细,请按需导入:https://gitee.com/warm_4/warm-flow/blob/master/sql/warm-flow_xxx.sql表结构
https://gitee.com/warm_4/warm-flow/wikis/%E8%A1%A8%E7%BB%93%E6%9E%84?sort_id=9330548
maven依赖
springboot项目
<dependency> <groupId>io.github.minliuhua</groupId> <artifactId>warm-flow-mybatis-sb-starter</artifactId> <version>最新版本</version> </dependency>
solon项目
<dependency> <groupId>io.github.minliuhua</groupId> <artifactId>warm-flow-mybatis-solon-plugin</artifactId> <version>最新版本</version> </dependency>
支持数据库类型
- mysql
- oracle
- sqlserver
- ......
支持orm框架类型
- mybatis及其增强组件
- jpa
- easy-query
- wood
- sqltoy
- beetlsql
- ......
有想扩展其他orm框架和数据库的可加qq群联系群主
代码示例
以下测试代码请详见hh-vue项目中的hh-vue/hh-admin/src/test/java/com/hh/test/service/impl/FlowTest.java
部署流程
public void deployFlow() throws Exception { String path = "/Users/minliuhua/Desktop/mdata/file/IdeaProjects/min/hh-vue/hh-admin/src/main/resources/leaveFlow-serial.xml"; System.out.println("已部署流程的id:" + defService.importXml(new FileInputStream(path)).getId()); }
发布流程
public void publish() throws Exception { defService.publish(1212437969554771968L); }
开启流程
public void startFlow() { System.out.println("已开启的流程实例id:" + insService.start("1", getUser()).getId()); }
流程流转
public void skipFlow() throws Exception {
// 通过实例id流转
Instance instance = insService.skipByInsId(1219286332141080576L, getUser().skipType(SkipType.PASS.getKey())
.permissionFlag(Arrays.asList("role:1", "role:2")));
System.out.println("流转后流程实例:" + instance.toString());
// // 通过任务id流转
// Instance instance = insService.skip(1219286332145274880L, getUser().skipType(SkipType.PASS.getKey())
// .permissionFlag(Arrays.asList("role:1", "role:2")));
// System.out.println("流转后流程实例:" + instance.toString());
}
public void skipAnyNode() throws Exception {
// 跳转到指定节点
Instance instance = insService.skip(1219286332145274880L, getUser().skipType(SkipType.PASS.getKey())
.permissionFlag(Arrays.asList("role:1", "role:2")).nodeCode("4"));
System.out.println("流转后流程实例:" + instance.toString());
}
监听器
实现Listener接口,然后在设计器中配置好监听器
public class FinishListener implements Listener {
@Resource
private TestLeaveMapper testLeaveMapper;
private static final Logger log = LoggerFactory.getLogger(StartListener.class);
@Override
public void notify(ListenerVariable variable) {
log.info("完成监听器:{}", variable);
Instance instance = variable.getInstance();
Map<String, Object> testLeaveMap = variable.getVariable();
TestLeave testLeave = (TestLeave) testLeaveMap.get("testLeave");
/** 如果{@link com.ruoyi.system.service.impl.TestLeaveServiceImpl}中更新了,这里就不用更新了*/
// testLeave.setNodeCode(instance.getNodeCode());
// testLeave.setNodeName(instance.getNodeName());
// testLeave.setFlowStatus(instance.getFlowStatus());
// testLeave.setUpdateTime(DateUtils.getNowDate());
// testLeaveMapper.updateTestLeave(testLeave);
log.info("完成监听器结束;{}", "任务完成");
}
}