From 578aa2fb5a2898aef41fe482da638c242571c673 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Fri, 1 Nov 2024 22:19:40 +0800
Subject: [PATCH 01/16] =?UTF-8?q?[update]=20=E6=9B=B4=E6=96=B0=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/update.md | 4 +-
src/master/guide/api.md | 63 ++--
src/master/guide/config.md | 4 +-
src/master/guide/designerIntroduced.md | 317 ++++++++----------
src/master/guide/jsonlib.md | 2 +-
src/master/guide/ormusagetips.md | 14 +-
src/master/guide/started.md | 88 +++--
src/master/guide/tenant.md | 2 +-
...34\346\265\201\345\274\225\346\223\216.md" | 33 +-
9 files changed, 259 insertions(+), 268 deletions(-)
diff --git a/src/common/update.md b/src/common/update.md
index b5baf65..916bc76 100644
--- a/src/common/update.md
+++ b/src/common/update.md
@@ -38,8 +38,10 @@
## 更新日志
-### v1.3.1 2024-10-31
+### v1.3.1 2024-11-01
- 【升级指南】
+ - 依赖的groupId:io.github.minliuhua,改为org.dromara
+ - 包名:com.warm, 改为org.dromara.warm
- 节点详情进入改为双击
- 终止操作的流程状态改为更合理的终止状态,如需还想按照原本的自动完成,请使用自定义流程状态
- FlowParams对象删除setXxx(yyy)方法,改为xxx(yyy)方法赋值
diff --git a/src/master/guide/api.md b/src/master/guide/api.md
index 1735eae..6a1054c 100644
--- a/src/master/guide/api.md
+++ b/src/master/guide/api.md
@@ -2,24 +2,27 @@
## 1、DefService流程定义接口
-### 1.1、导入流程定义
-`importXml(is)`:导入流程定义xml的输入流is,保存流程定义数据,返回流程定义对象
+### 1.1、新增流程定义表数据,新增后需要通过saveXml接口保存流程节点和流程跳转数据
+`checkAndSave(definition)`:校验后新增
-### 1.2、保存流程定义
-`saveXml(def)`: 传入流程定义id、流程定义xml字符串,保存流程定义数据。def包含如下字段:
+### 1.1、新增流程定义、流程节点和流程跳转数据
+`importXml(is)`:导入流程定义xml的输入流
+
+### 1.2、保存流程节点和流程跳转数据
+`saveXml(def)`: 传入流程定义id、流程定义xml字符串
- id: 流程定义id [必传]
- xmlString: 流程定义xml字符串 [必传]
-### 1.3、保存流程定义
-`saveXml(id, xmlString)`: 传入流程定义id、流程定义xml字符串,保存流程定义数据
+### 1.3、保存流程节点和流程跳转数据
+`saveXml(id, xmlString)`: 传入流程定义id、流程定义xml字符串
- id: 流程定义id
- xmlString: 流程定义xml字符串
### 1.4、导出流程定义
-`exportXml(id)`: 导出流程定义xml的Document对象
+`exportXml(id)`: 导出流程定义(流程定义、流程节点和流程跳转数据)xml的Document对象
### 1.5、获取流程定义
-`xmlString(id)`: 获取流程定义xml的字符串
+`xmlString(id)`: 获取流程定义xml(流程定义、流程节点和流程跳转数据)的字符串
### 1.6、删除
`removeDef(ids)`: 删除流程定义相关数据
@@ -61,6 +64,7 @@
- handler: 办理人唯一标识 [建议传]
- variable: 流程变量 [按需传输]
- flowStatus: 流程状态,自定义流程状态 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
### 2.3、终止流程
`termination(instanceId, flowParams)`:传入流程实例id,终止流程。flowParams包含如下字段:
@@ -68,6 +72,7 @@
- message: 审批意见 [按需传输]
- flowStatus: 流程状态,自定义流程状态 [按需传输]
- permissionFlag: 办理人权限标识,比如用户,角色,部门等,不传不校验权限 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
### 2.4、删除流程实例
`remove(instanceIds)`:根据实例ids,删除流程
@@ -89,6 +94,7 @@
- handler: 办理人唯一标识 [建议传]
- variable: 流程变量 [按需传输]
- flowStatus: 流程状态,自定义流程状态 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
### 3.2、终止流程
`termination(taskId, flowParams)`:传入流程任务id,终止流程。flowParams包含如下字段:
@@ -96,48 +102,49 @@
- handler: 办理人唯一标识 [建议传]
- flowStatus: 流程状态,自定义流程状态 [按需传输]
- permissionFlag: 办理人权限标识,比如用户,角色,部门等,不传不校验权限 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
### 3.3、转办
-`transfer(taskId, curUser, permissionFlag, addHandlers, message)`:转办, 默认删除当然办理用户权限,转办后,当前办理不可办理
-- taskId: 修改的任务id [必传]
-- curUser: 当前办理人唯一标识 [必传]
+`transfer(taskId, flowParams)`:转办, 默认删除当然办理用户权限,转办后,当前办理不可办理。flowParams包含如下字段:
+- handler: 当前办理人唯一标识 [必传]
- permissionFlag: 用户权限标识集合 [必传]
-- addHandlers: 增加办理人:加签,转办,委托 [必传]
+- addHandlers: 转办对象 [必传]
- message: 审批意见 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
### 3.4、委派
-`depute(taskId, curUser, permissionFlag, addHandlers, message)`:委派, 默认删除当然办理用户权限,转办后,当前办理不可办理
-- taskId: 修改的任务id [必传]
-- curUser: 当前办理人唯一标识 [必传]
+`depute(taskId, flowParams)`:委派, 默认删除当然办理用户权限,委派后,当前办理不可办理。flowParams包含如下字段:
+- handler: 当前办理人唯一标识 [必传]
- permissionFlag: 用户权限标识集合 [必传]
-- addHandlers: 增加办理人:加签,转办,委托 [必传]
+- addHandlers: 委托对象 [必传]
- message: 审批意见 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
### 3.5、加签
-`addSignature(taskId, curUser, permissionFlag, addHandlers, message)`:加签,增加办理人
-- taskId: 修改的任务id [必传]
-- curUser: 当前办理人唯一标识 [必传]
+`addSignature(taskId, flowParams)`:加签,增加办理人。flowParams包含如下字段:
+- handler: 当前办理人唯一标识 [必传]
- permissionFlag: 用户权限标识集合 [必传]
-- addHandlers: 增加办理人:加签,转办,委托 [必传]
+- addHandlers: 加签对象 [必传]
- message: 审批意见 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
### 3.6、减签
-`reductionSignature(taskId, curUser, permissionFlag, addHandlers, message)`:减签,减少办理人
-- taskId: 修改的任务id [必传]
-- curUser: 当前办理人唯一标识 [必传]
+`reductionSignature(taskId, flowParams)`:减签,减少办理人。flowParams包含如下字段:
+- handler: 当前办理人唯一标识 [必传]
- permissionFlag: 用户权限标识集合 [必传]
-- addHandlers: 增加办理人:加签,转办,委托 [必传]
+- reductionHandlers: 减少办理人 [必传]
- message: 审批意见 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
### 3.7、修改办理人
-`updateHandler(modifyHandler)`:修改办理人
-- curUser: 办理人唯一标识 [按需传输]
-- ignore: 转办忽略权限校验(true:忽略,false:不忽略)[按需传输]
+`updateHandler(taskId, flowParams)`:传入流程任务id,修改办理人
+- handler: 办理人唯一标识 [按需传输]
- permissionFlag: 用户所拥有的权限标识 [按需传输,ignore为false,则必传]
- addHandlers: 增加办理人:加签,转办,委托 [按需传输]
- reductionHandlers: 减少办理人:减签,委托 [按需传输]
- message: 审批意见 [按需传输]
-- cooperateType: 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)[按需传输]
+- cooperateType: 协作方式(2转办 3委派 6加签 7减签)[按需传输]
+- ignore: 转办忽略权限校验(true:忽略,false:不忽略)[按需传输]
## 4、NodeService节点接口
### 4.1、获取下一个节点列表
diff --git a/src/master/guide/config.md b/src/master/guide/config.md
index c29bbf9..e3c1d40 100644
--- a/src/master/guide/config.md
+++ b/src/master/guide/config.md
@@ -74,9 +74,9 @@ warm-flow:
# 是否显示banner图,默认是
banner: true
# # 填充器,内部有默认实现,如果不满足实际业务,可通过此配置自定义实现
- # data-fill-handler-path: com.warm.flow.core.test.handle.CustomDataFillHandler
+ # data-fill-handler-path: org.dromara.warm.flow.core.test.handle.CustomDataFillHandler
# 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
- # tenant_handler_path: com.warm.flow.core.test.handle.CustomTenantHandler
+ # tenant_handler_path: org.dromara.warm.flow.core.test.handle.CustomTenantHandler
# 是否开启逻辑删除(orm框架本身不支持逻辑删除,可通过这种方式开启,比如jpa)
logic_delete: false
# 逻辑删除字段值(开启后默认为2)
diff --git a/src/master/guide/designerIntroduced.md b/src/master/guide/designerIntroduced.md
index 91da6dc..69b4d67 100644
--- a/src/master/guide/designerIntroduced.md
+++ b/src/master/guide/designerIntroduced.md
@@ -8,16 +8,16 @@
```xml
- io.github.minliuhua
- warm-flow-plugin-ui-sb-web
- 版本号
+ org.dromara
+ warm-flow-plugin-ui-sb-web
+ 版本号
```
## 2. 后端放行部分路径
-> 这两个路径需要放行,否则无法访问,`/warm-flow-ui/**`, `/warm-flow/**`
+> 这个路径需要放行,否则无法访问,`/warm-flow-ui/**`
-### 2.1 spring-security 放行配置
+### 2.1 spring-security 放行配置
```java
@@ -29,7 +29,7 @@ protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exce
// 注解标记允许匿名访问的url
.authorizeHttpRequests((requests) -> {
// 后端请求,静态资源,可匿名访问
- requests.antMatchers("/warm-flow-ui/**", "/warm-flow/**").permitAll()
+ requests.antMatchers("/warm-flow-ui/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})
@@ -56,7 +56,6 @@ public class ShiroConfig {
// 后端请求,静态资源,可匿名访问
LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/warm-flow-ui/**", "anon");
- filterChainDefinitionMap.put("/warm-flow/**", "anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
@@ -76,48 +75,19 @@ public class SaTokenConfigure implements WebMvcConfigurer {
registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
.addPathPatterns("/**")
// 以上是sa-token案例,下面才是需要排除的地址
- .excludePathPatterns("/warm-flow-ui/**", "/warm-flow/**");
+ .excludePathPatterns("/warm-flow-ui/**");
}
}
```
## 3. 前端加载设计器
-> 1、设计器页面入口地址为:`/warm-flow-ui/${definitionId}?disabled=${disabled}`
-> 2、总体思路就是把前端接口(比如80)代理成后端接口(8080),去访问该地址,其他不变
-> 3、或者直接通过后端接口访问该地址,可能需要处理跨域问题
-
-### 3.1 nginx 代理配置
-
-```
-server {
- listen 80;
- server_name localhost;
-
- location /warm-flow-ui/ {
- proxy_pass http://localhost:8080/warm-flow-ui/;
- }
-}
-```
+> 1、设计器页面入口是访问后端地址(前后端不分离):`ip:port/warm-flow-ui/index?id=${definitionId}?disabled=${disabled}`
### 3.2 vue2 引入
-- 代理到后端需要vue.config.js配置代码
-
-```javascript
-"/warm-flow-ui": {
- target: `http://localhost:8080/warm-flow-ui`,
- changeOrigin: true,
- pathRewrite: {
- '/warm-flow-ui': '/'
- }
-},
-
-```
-
-
- 首先传入设计器需要的流程定义definitionId和是否可编辑disabled参数
- 本实例采用iframe方式嵌入设计器
-
+
```vue
@@ -137,9 +107,10 @@ server {
};
},
mounted() {
- // definitionId为需要查询的流程定义id,
- // disabled为是否可编辑, 例如:查看的时候不可编辑,不可保存
- this.url = `/warm-flow-ui/${definitionId}?disabled=${disabled}`;
+ // process.env.VUE_APP_BASE_API: 前端地址的前缀如dev-api
+ // definitionId: 为需要查询的流程定义id
+ // disabled: 为是否可编辑, 例如:查看的时候不可编辑,不可保存
+ this.url = process.env.VUE_APP_BASE_API + `/warm-flow-ui/index.html?id=${definitionId}&disabled=${disabled}`;
this.iframeLoaded();
},
methods: {
@@ -165,18 +136,6 @@ server {
### 3.3 vue3 引入
-- vue3项目引入过程同上vue2
-
-```javascript
-"/warm-flow-ui": {
- target: `http://localhost:8080`,
- changeOrigin: true,
- pathRewrite: {
- '/warm-flow-ui': '/'
- }
-},
-```
-
```vue
@@ -189,9 +148,10 @@ server {
const { proxy } = getCurrentInstance();
import { onMounted } from 'vue';
-// definitionId为需要查询的流程定义id,
-// disabled为是否可编辑, 例如:查看的时候不可编辑,不可保存
-const iframeUrl = ref(`/warm-flow-ui/${definitionId}?disabled=${disabled}`);
+// import.meta.env.VITE_APP_BASE_API: 前端地址的前缀如dev-api
+// definitionId: 为需要查询的流程定义id
+// disabled: 为是否可编辑, 例如:查看的时候不可编辑,不可保存
+const iframeUrl = ref(import.meta.env.VITE_APP_BASE_API + `/warm-flow-ui/index.html?id=${definitionId}?disabled=${disabled}`);
const iframeLoaded = () => {
// iframe监听组件内设计器保存事件
@@ -228,10 +188,9 @@ onMounted(() => {
> 待完善
### 3.5 前后端不分离版本
-- 前后端不分离项目,前后端端口一致,不需要代理(以下代码再ruoyi不分离版中测试)
-
-- 可以直接访问后端接口加载页面,如:`/warm-flow/1839683148936663047?disabled=false`
-
+- 可以直接访问后端接口加载页面,如:`ip:port/warm-flow-ui/index?id=${definitionId}?disabled=${disabled}`
+
+-
```java
@Controller
@RequestMapping("/warm-flow")
@@ -240,19 +199,19 @@ public class WarmFlowController
@GetMapping()
public String index(String definitionId, Boolean disabled)
{
- return redirect("/warm-flow-ui/" + definitionId + "?disabled=" + disabled);
+ return redirect("/warm-flow-ui/index.html?id=" + definitionId + "&disabled=" + disabled);
}
}
```
-- 或者前端直接访问后端接口,如:`/warm-flow/1839683148936663047?disabled=false`
-
+- 或者前端直接访问后端接口,如:`/warm-flow-ui/index.html?id=1839683148936663047&disabled=false`
+
```javascript
/*打开新的页签,加载设计器*/
function detail(dictId) {
- var url = prefix + '/detail/' + dictId;
- $.modal.openTab("字典数据", "/warm-flow-ui/1839683148936663047?disabled=false&pageNum=1");
+ var url = prefix + '/detail/' + dictId;
+ $.modal.openTab("字典数据", "/warm-flow-ui/index.html?id=1839683148936663047&disabled=false");
}
```
@@ -278,18 +237,18 @@ function detail(dictId) {
*/
public interface HandlerSelectService {
- /**
- * 获取办理人权限设置列表tabs页签, 如:用户、角色和部门等
- * @return tabs页签
- */
- List getHandlerType();
-
- /**
- * 获取办理人权限设置列表结果,如:用户列表、角色列表、部门列表等
- * @param query 查询参数
- * @return 结果
- */
- List getHandlerSelect(HandlerQuery query);
+ /**
+ * 获取办理人权限设置列表tabs页签, 如:用户、角色和部门等
+ * @return tabs页签
+ */
+ List getHandlerType();
+
+ /**
+ * 获取办理人权限设置列表结果,如:用户列表、角色列表、部门列表等
+ * @param query 查询参数
+ * @return 结果
+ */
+ List getHandlerSelect(HandlerQuery query);
}
```
@@ -305,121 +264,121 @@ public interface HandlerSelectService {
*/
@Component
public class HandlerSelectServiceImpl implements HandlerSelectService {
- @Autowired
- private SysUserMapper userMapper;
-
- @Autowired
- private SysRoleMapper roleMapper;
+ @Autowired
+ private SysUserMapper userMapper;
+
+ @Autowired
+ private SysRoleMapper roleMapper;
+
+ @Autowired
+ private SysDeptMapper deptMapper;
+
+ /**
+ * 获取办理人权限设置列表tabs页签,如:用户、角色和部门等,可以返回其中一种或者多种,按业务需求决定
+ * @return tabs页签
+ */
+ @Override
+ public List getHandlerType() {
+ return Arrays.asList("用户", "角色", "部门");
+ }
- @Autowired
- private SysDeptMapper deptMapper;
+ /**
+ * 获取用户列表、角色列表、部门列表等,可以返回其中一种或者多种,按业务需求决定
+ * @param query 查询参数
+ * @return 结果
+ */
+ @Override
+ public HandlerSelectVo getHandlerSelect(HandlerQuery query) {
- /**
- * 获取办理人权限设置列表tabs页签,如:用户、角色和部门等,可以返回其中一种或者多种,按业务需求决定
- * @return tabs页签
- */
- @Override
- public List getHandlerType() {
- return Arrays.asList("用户", "角色", "部门");
+ if ("角色".equals(query.getHandlerType())) {
+ return getRole(query);
}
- /**
- * 获取用户列表、角色列表、部门列表等,可以返回其中一种或者多种,按业务需求决定
- * @param query 查询参数
- * @return 结果
- */
- @Override
- public HandlerSelectVo getHandlerSelect(HandlerQuery query) {
-
- if ("角色".equals(query.getHandlerType())) {
- return getRole(query);
- }
-
- if ("部门".equals(query.getHandlerType())) {
- return getDept(query);
- }
-
- if ("用户".equals(query.getHandlerType())) {
- return getUser(query);
- }
+ if ("部门".equals(query.getHandlerType())) {
+ return getDept(query);
+ }
- return new HandlerSelectVo();
+ if ("用户".equals(query.getHandlerType())) {
+ return getUser(query);
}
- /**
- * 获取角色列表
- *
- * @param query 查询条件
- * @return HandlerSelectVo
- */
- private HandlerSelectVo getRole(HandlerQuery query) {
+ return new HandlerSelectVo();
+ }
+
+ /**
+ * 获取角色列表
+ *
+ * @param query 查询条件
+ * @return HandlerSelectVo
+ */
+ private HandlerSelectVo getRole(HandlerQuery query) {
......
- // 查询角色列表
- List roleList = roleMapper.selectRoleList(sysRole);
- long total = new PageInfo<>(roleList).getTotal();
-
- // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
- HandlerFunDto handlerFunDto = new HandlerFunDto<>(roleList, total)
- // 以下设置获取内置变量的Function
- .setStorageId(role -> "role:" + role.getRoleId()) // 前面拼接role: 是为了防止用户、角色的主键重复
- .setHandlerCode(SysRole::getRoleKey) // 权限编码
- .setHandlerName(SysRole::getRoleName) // 权限名称
- .setCreateTime(role -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, role.getCreateTime()));
-
- return getHandlerSelectVo(handlerFunDto);
- }
+ // 查询角色列表
+ List roleList = roleMapper.selectRoleList(sysRole);
+ long total = new PageInfo<>(roleList).getTotal();
+
+ // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
+ HandlerFunDto handlerFunDto = new HandlerFunDto<>(roleList, total)
+ // 以下设置获取内置变量的Function
+ .setStorageId(role -> "role:" + role.getRoleId()) // 前面拼接role: 是为了防止用户、角色的主键重复
+ .setHandlerCode(SysRole::getRoleKey) // 权限编码
+ .setHandlerName(SysRole::getRoleName) // 权限名称
+ .setCreateTime(role -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, role.getCreateTime()));
+
+ return getHandlerSelectVo(handlerFunDto);
+ }
- /**
- * 获取用户列表
- *
- * @param query 查询条件
- * @return HandlerSelectVo
- */
- private HandlerSelectVo getDept(HandlerQuery query) {
+ /**
+ * 获取用户列表
+ *
+ * @param query 查询条件
+ * @return HandlerSelectVo
+ */
+ private HandlerSelectVo getDept(HandlerQuery query) {
......
- // 查询部门列表
- List deptList = deptMapper.selectDeptList(sysDept);
- long total = new PageInfo<>(deptList).getTotal();
+ // 查询部门列表
+ List deptList = deptMapper.selectDeptList(sysDept);
+ long total = new PageInfo<>(deptList).getTotal();
- // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
- HandlerFunDto handlerFunDto = new HandlerFunDto<>(deptList, total)
- .setStorageId(dept -> "dept:" + dept.getDeptId()) // 前面拼接dept: 是为了防止用户、部门的主键重复
- .setHandlerName(SysDept::getDeptName) // 权限名称
- .setCreateTime(dept -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, dept.getCreateTime()));
+ // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
+ HandlerFunDto handlerFunDto = new HandlerFunDto<>(deptList, total)
+ .setStorageId(dept -> "dept:" + dept.getDeptId()) // 前面拼接dept: 是为了防止用户、部门的主键重复
+ .setHandlerName(SysDept::getDeptName) // 权限名称
+ .setCreateTime(dept -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, dept.getCreateTime()));
- return getHandlerSelectVo(handlerFunDto);
+ return getHandlerSelectVo(handlerFunDto);
- }
+ }
- /**
- * 获取用户列表, 同时构建左侧部门树状结构
- *
- * @param query 查询条件
- * @return HandlerSelectVo
- */
- private HandlerSelectVo getUser(HandlerQuery query) {
+ /**
+ * 获取用户列表, 同时构建左侧部门树状结构
+ *
+ * @param query 查询条件
+ * @return HandlerSelectVo
+ */
+ private HandlerSelectVo getUser(HandlerQuery query) {
......
- // 查询用户列表
- List userList = userMapper.selectUserList(sysUser);
- long total = new PageInfo<>(userList).getTotal();
- // 查询部门列表,构建树状结构
- List deptList = deptMapper.selectDeptList(new SysDept());
-
- // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
- HandlerFunDto handlerFunDto = new HandlerFunDto<>(userList, total)
- .setStorageId(user -> user.getUserId().toString())
- .setHandlerCode(SysUser::getUserName) // 权限编码
- .setHandlerName(SysUser::getNickName) // 权限名称
- .setCreateTime(user -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, user.getCreateTime()))
- .setGroupName(user -> user.getDept() != null ? user.getDept().getDeptName() : "");
-
- // 业务系统机构,转成组件内部左侧树列表能够显示的数据
- TreeFunDto treeFunDto = new TreeFunDto<>(deptList)
- .setId(dept -> dept.getDeptId().toString()) // 左侧树ID
- .setName(SysDept::getDeptName) // 左侧树名称
- .setParentId(dept -> dept.getParentId().toString()); // 左侧树父级ID
-
- return getHandlerSelectVo(handlerFunDto, treeFunDto);
- }
+ // 查询用户列表
+ List userList = userMapper.selectUserList(sysUser);
+ long total = new PageInfo<>(userList).getTotal();
+ // 查询部门列表,构建树状结构
+ List deptList = deptMapper.selectDeptList(new SysDept());
+
+ // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
+ HandlerFunDto handlerFunDto = new HandlerFunDto<>(userList, total)
+ .setStorageId(user -> user.getUserId().toString())
+ .setHandlerCode(SysUser::getUserName) // 权限编码
+ .setHandlerName(SysUser::getNickName) // 权限名称
+ .setCreateTime(user -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, user.getCreateTime()))
+ .setGroupName(user -> user.getDept() != null ? user.getDept().getDeptName() : "");
+
+ // 业务系统机构,转成组件内部左侧树列表能够显示的数据
+ TreeFunDto treeFunDto = new TreeFunDto<>(deptList)
+ .setId(dept -> dept.getDeptId().toString()) // 左侧树ID
+ .setName(SysDept::getDeptName) // 左侧树名称
+ .setParentId(dept -> dept.getParentId().toString()); // 左侧树父级ID
+
+ return getHandlerSelectVo(handlerFunDto, treeFunDto);
+ }
}
```
diff --git a/src/master/guide/jsonlib.md b/src/master/guide/jsonlib.md
index ca7228d..72ad9d0 100644
--- a/src/master/guide/jsonlib.md
+++ b/src/master/guide/jsonlib.md
@@ -6,7 +6,7 @@
## json库扩展
- 扩展json库需要实现`JsonConvert`接口,并实现`strToMap`和`mapToStr`方法
- 并通过spi机制加载,可参照`warm-flow-plugin-json`模块
-- 在resource目录下新建`META-INF\services`文件夹,并在该文件夹下新建文件`com.warm.flow.core.json.JsonConvert`, 配置实现类的全限定名,如`com.warm.plugin.json.JsonConvertJackson`
+- 在resource目录下新建`META-INF\services`文件夹,并在该文件夹下新建文件`org.dromara.warm.flow.core.json.JsonConvert`, 配置实现类的全限定名,如`org.dromara.warm.plugin.json.JsonConvertJackson`
```java
public class JsonConvertJackson implements JsonConvert {
diff --git a/src/master/guide/ormusagetips.md b/src/master/guide/ormusagetips.md
index 03844a8..8cd23c7 100644
--- a/src/master/guide/ormusagetips.md
+++ b/src/master/guide/ormusagetips.md
@@ -34,13 +34,13 @@ protected EntityManager entityManager;
**通过上述注解获取工作流组件内各Entity访问能力**
```xml
- com.warm.flow.orm.entity.FlowDefinition
- com.warm.flow.orm.entity.FlowHisTask
- com.warm.flow.orm.entity.FlowInstance
- com.warm.flow.orm.entity.FlowNode
- com.warm.flow.orm.entity.FlowSkip
- com.warm.flow.orm.entity.FlowTask
- com.warm.flow.orm.entity.FlowUser
+ org.dromara.warm.flow.orm.entity.FlowDefinition
+ org.dromara.warm.flow.orm.entity.FlowHisTask
+ org.dromara.warm.flow.orm.entity.FlowInstance
+ org.dromara.warm.flow.orm.entity.FlowNode
+ org.dromara.warm.flow.orm.entity.FlowSkip
+ org.dromara.warm.flow.orm.entity.FlowTask
+ org.dromara.warm.flow.orm.entity.FlowUser
```
**以下为主要接口示例,更多接口请参考 EntityManager 接口**
diff --git a/src/master/guide/started.md b/src/master/guide/started.md
index 0acc15f..6ced021 100644
--- a/src/master/guide/started.md
+++ b/src/master/guide/started.md
@@ -27,13 +27,23 @@
## 3、maven依赖
### 3.1、mybatis
-springboot项目
+springboot2项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-mybatis-sb-starter
- 1.3.0
+ 1.3.1
+
+```
+
+springboot3项目
+
+```maven
+
+ org.dromara
+ warm-flow-mybatis-sb3-starter
+ 1.3.1
```
@@ -41,20 +51,30 @@ solon项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-mybatis-solon-plugin
- 1.3.0
+ 1.3.1
```
### 3.2、mybatis-plus
-springboot项目
+springboot2项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-mybatis-plus-sb-starter
- 1.3.0
+ 1.3.1
+
+```
+
+springboot3项目
+
+```maven
+
+ org.dromara
+ warm-flow-mybatis-plus-sb3-starter
+ 1.3.1
```
@@ -62,9 +82,9 @@ solon项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-mybatis-plus-solon-plugin
- 1.3.0
+ 1.3.1
```
@@ -77,13 +97,23 @@ warm-flow:
jpa_persistence_provider: org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider
```
-springboot项目
+springboot2项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-jpa-sb-starter
- 1.3.0
+ 1.3.1
+
+```
+
+springboot3项目
+
+```maven
+
+ org.dromara
+ warm-flow-jpa-sb3-starter
+ 1.3.1
```
@@ -91,20 +121,30 @@ solon项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-mybatis-plus-solon-plugin
- 1.3.0
+ 1.3.1
```
### 3.4、mybatis-flex
-springboot项目
+springboot2项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-mybatis-flex-sb-starter
- 1.3.0
+ 1.3.1
+
+```
+
+springboot3项目
+
+```maven
+
+ org.dromara
+ warm-flow-mybatis-flex-sb3-starter
+ 1.3.1
```
@@ -112,9 +152,9 @@ solon项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-mybatis-flex-solon-plugin
- 1.3.0
+ 1.3.1
```
@@ -123,9 +163,9 @@ springboot项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-easy-query-sb-starter
- 1.3.0
+ 1.3.1
```
@@ -133,7 +173,7 @@ solon项目
```maven
- io.github.minliuhua
+ org.dromara
warm-flow-easy-query-solon-plugin
@@ -145,7 +185,7 @@ solon项目
solon.logging
- 1.3.0
+ 1.3.1
```
diff --git a/src/master/guide/tenant.md b/src/master/guide/tenant.md
index e94e2d3..c6b7988 100644
--- a/src/master/guide/tenant.md
+++ b/src/master/guide/tenant.md
@@ -157,7 +157,7 @@ public class WarmFlowConfig {
# warm-flow工作流配置
warm-flow:
# 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
- tenant_handler_path: com.warm.flow.core.test.handle.CustomTenantHandler
+ tenant_handler_path: org.dromara.warm.flow.core.test.handle.CustomTenantHandler
```
### 2.2、bean配置方式
```java
diff --git "a/src/master/guide/update/\344\270\200\344\270\252\350\207\252\345\270\246\346\265\201\347\250\213\350\256\276\350\256\241\345\231\250\347\232\204\345\267\245\344\275\234\346\265\201\345\274\225\346\223\216.md" "b/src/master/guide/update/\344\270\200\344\270\252\350\207\252\345\270\246\346\265\201\347\250\213\350\256\276\350\256\241\345\231\250\347\232\204\345\267\245\344\275\234\346\265\201\345\274\225\346\223\216.md"
index 0835f6d..cfeade0 100644
--- "a/src/master/guide/update/\344\270\200\344\270\252\350\207\252\345\270\246\346\265\201\347\250\213\350\256\276\350\256\241\345\231\250\347\232\204\345\267\245\344\275\234\346\265\201\345\274\225\346\223\216.md"
+++ "b/src/master/guide/update/\344\270\200\344\270\252\350\207\252\345\270\246\346\265\201\347\250\213\350\256\276\350\256\241\345\231\250\347\232\204\345\267\245\344\275\234\346\265\201\345\274\225\346\223\216.md"
@@ -1,24 +1,21 @@
# 一个自带流程设计器的工作流引擎
+> 终于迎来了这个激动人心的版本1.3.1,不需要在为引入设计器而烦恼了。按照以下四点,可以快速集成。
+> 另外一直被吐槽的流程图不够清晰,也在此版本得到解决。
-
-
-**终于迎来了这个激动人心的版本1.3.0,不需要在为引入设计器而烦恼了,按照以下前四点,可以快速接入业务系统,下面介绍如何使用设计器**
-
-
-
+> 详细更新说明:[更新日志](http://www.warm-flow.cn/common/update.html#v1-3-1-2024-11-01)
## 1. 引入依赖
```xml
- io.github.minliuhua
+ org.dromara
warm-flow-plugin-ui-sb-web
- 1.3.0
+ 1.3.1
```
## 2. 后端放行部分路径
-> 1、这两个路径需要放行,否则无法访问,`/warm-flow-ui/**`, `/warm-flow/**`
+> 1、这个路径需要放行,否则无法访问,`/warm-flow-ui/**`
> 2、以下是spring-security放行配置示例
@@ -31,7 +28,7 @@ protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exce
// 注解标记允许匿名访问的url
.authorizeHttpRequests((requests) -> {
// 后端请求,静态资源,可匿名访问
- requests.antMatchers("/warm-flow-ui/**", "/warm-flow/**").permitAll()
+ requests.antMatchers("/warm-flow-ui/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})
@@ -41,21 +38,7 @@ protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exce
```
## 3. 前端加载设计器
-> 1、设计器页面入口地址为:`/warm-flow-ui/${definitionId}?disabled=${disabled}`
-> 2、总体思路就是把前端接口(比如80)代理成后端接口(8080),去访问该地址,其他不变
-> 3、或者直接通过后端接口访问该地址,可能需要处理跨域问题
-> 4、以下是nginx代理示例:
-
-```
-server {
- listen 80;
- server_name localhost;
-
- location /warm-flow-ui/ {
- proxy_pass http://localhost:8080/warm-flow-ui/;
- }
-}
-```
+> 1、设计器页面入口是访问后端地址(前后端不分离):`ip:port/warm-flow-ui/index?id=${definitionId}?disabled=${disabled}`
## 4. 设计器办理人权限数据接入
--
Gitee
From da11d48acb1fee6b75063c39591c1f09d9e7a514 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Sat, 2 Nov 2024 09:37:51 +0800
Subject: [PATCH 02/16] =?UTF-8?q?[update]=20=E4=BF=AE=E6=94=B9=E6=8F=8F?=
=?UTF-8?q?=E8=BF=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/paidservice.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/common/paidservice.md b/src/common/paidservice.md
index 7f5bc1d..f102b5c 100644
--- a/src/common/paidservice.md
+++ b/src/common/paidservice.md
@@ -26,7 +26,7 @@
## 私人服务
-- 作者提供作者私人服务,提供关于Warm-Flow工作流相关问题解答,如流程引擎集成与使用,技术咨询等,包括但不限于
+- 作者提供作者私人服务,关于Warm-Flow工作流私人培训,如流程引擎集成与使用,技术咨询等,包括但不限于
--
Gitee
From ae5dfa543737fc22831960c4baedba9722a70928 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Mon, 4 Nov 2024 16:24:29 +0800
Subject: [PATCH 03/16] =?UTF-8?q?[update]=20=E6=96=B0=E5=A2=9Edocker?=
=?UTF-8?q?=E7=8E=AF=E5=A2=83=EF=BC=8C=E6=B5=81=E7=A8=8B=E5=9B=BE=E4=B8=AD?=
=?UTF-8?q?=E6=96=87=E4=B9=B1=E7=A0=81=E8=A7=A3=E5=86=B3=E6=96=B9=E6=A1=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/troubleshooting.md | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/common/troubleshooting.md b/src/common/troubleshooting.md
index f4132d3..b69ea53 100644
--- a/src/common/troubleshooting.md
+++ b/src/common/troubleshooting.md
@@ -101,7 +101,7 @@ warm-flow:
[Warm-Flow工作流引擎数据库主键自增策略实现](https://juejin.cn/post/7402110528298074152)
## 2、流程图片中文乱码
-
+### linux环境:安装中文字体
生成的流程图中文乱码或者报错InternalError; java.lang.reflect,InvocationTargetException
由于服务器上缺少中文字体,通过检查fc-list :lang=zh是否包含中文字符集(以下是存在的示例)
@@ -121,9 +121,15 @@ warm-flow:
drwxr-xr-x 2 root root 4096 5月 17 00:20 dejavu
drwxr-xr-x 2 root root 4096 5月 17 11:40 zhFonts
```
-
重启服务
+### docker环境:安装中文字体
+以ruoyi-vue-plus-4.x中dockerfile为例,添加中文字体即可 (感谢【格调@main】提供的方案)
+
+
+
+
+
## 3、FlowAutoConfig.initFlow()未加载
spring开启懒加载后,导致FlowAutoConfig.initFlow()未加载。(由社区【^星^ Q】提供)
@@ -135,7 +141,7 @@ spring:
allow-bean-definition-overriding: true
lazy-initialization: true
web-application-type: servlet
-```
+```
## 4、监听器未执行或者类型转换异常
@@ -232,4 +238,4 @@ public class MybatisPlusConfig {
### 6.1、可尝试切换maven版本 (感谢【一拳打爆常大宝】)
-如maven3.9.6切换为低版本3.8.2
\ No newline at end of file
+如maven3.9.6切换为低版本3.8.2
--
Gitee
From 4bbc94c8b59f775f7c20ff73fdacfd26d06804a4 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Tue, 5 Nov 2024 15:56:21 +0800
Subject: [PATCH 04/16] =?UTF-8?q?[update]=20=E5=BF=AB=E9=80=9F=E5=BC=80?=
=?UTF-8?q?=E5=A7=8B=E6=96=B0=E5=A2=9E=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=BC=95?=
=?UTF-8?q?=E5=85=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/master/guide/started.md | 82 ++++++++++++++++++------------------
src/v1.2.10/guide/started.md | 20 ++++-----
src/v1.2.3/guide/started.md | 16 +++----
src/v1.2.4/guide/started.md | 20 ++++-----
src/v1.2.6/guide/started.md | 20 ++++-----
src/v1.2.7/guide/started.md | 20 ++++-----
src/v1.2.8/guide/started.md | 20 ++++-----
src/v1.3.0/guide/started.md | 20 ++++-----
src/v1.3.1/guide/started.md | 82 ++++++++++++++++++------------------
9 files changed, 152 insertions(+), 148 deletions(-)
diff --git a/src/master/guide/started.md b/src/master/guide/started.md
index 6ced021..ebd3ce4 100644
--- a/src/master/guide/started.md
+++ b/src/master/guide/started.md
@@ -27,9 +27,9 @@
## 3、maven依赖
### 3.1、mybatis
-springboot2项目
+**springboot2项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-sb-starter
@@ -37,9 +37,9 @@ springboot2项目
```
-springboot3项目
+**springboot3项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-sb3-starter
@@ -47,9 +47,9 @@ springboot3项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-solon-plugin
@@ -58,9 +58,9 @@ solon项目
```
### 3.2、mybatis-plus
-springboot2项目
+**springboot2项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-plus-sb-starter
@@ -68,9 +68,9 @@ springboot2项目
```
-springboot3项目
+**springboot3项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-plus-sb3-starter
@@ -78,9 +78,9 @@ springboot3项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-plus-solon-plugin
@@ -89,7 +89,7 @@ solon项目
```
### 3.3、jpa
-warm-flow工作流配置
+**warm-flow工作流配置**
```yml
# warm-flow工作流配置
warm-flow:
@@ -97,9 +97,9 @@ warm-flow:
jpa_persistence_provider: org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider
```
-springboot2项目
+**springboot2项目**
-```maven
+```xml
org.dromara
warm-flow-jpa-sb-starter
@@ -107,9 +107,9 @@ springboot2项目
```
-springboot3项目
+**springboot3项目**
-```maven
+```xml
org.dromara
warm-flow-jpa-sb3-starter
@@ -117,9 +117,9 @@ springboot3项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-plus-solon-plugin
@@ -128,9 +128,9 @@ solon项目
```
### 3.4、mybatis-flex
-springboot2项目
+**springboot2项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-flex-sb-starter
@@ -138,9 +138,9 @@ springboot2项目
```
-springboot3项目
+**springboot3项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-flex-sb3-starter
@@ -148,9 +148,9 @@ springboot3项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-flex-solon-plugin
@@ -159,9 +159,9 @@ solon项目
```
### 3.5、easy-query
-springboot项目
+**springboot项目**
-```maven
+```xml
org.dromara
warm-flow-easy-query-sb-starter
@@ -169,9 +169,9 @@ springboot项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-easy-query-solon-plugin
@@ -210,16 +210,18 @@ solon项目
* [x] mybatis-flex
* [ ] ......
-
-
> **有想扩展其他orm框架和数据库的可加qq群联系群主**
-## 6、代码示例
+## 6、设计器引入
+> 通过jar包引入:[文档地址](./designerIntroduced.md)
+
+## 7、代码示例
-> 测试代码[warm-flow-test](https://gitee.com/dromara/warm-flow-test)项目中,warm-flow-xxx-test模块的测类
+> 详细案例测试代码[warm-flow-test](https://gitee.com/dromara/warm-flow-test)项目中,warm-flow-xxx-test模块的测类
+**以下为简短案例:**
-## 7、部署流程
+### 7.1、部署流程
```java
public void deployFlow() throws Exception {
@@ -228,7 +230,7 @@ public void deployFlow() throws Exception {
}
```
-## 8、发布流程
+### 7.2、发布流程
```java
public void publish() throws Exception {
@@ -236,7 +238,7 @@ public void publish() throws Exception {
}
```
-## 9、开启流程
+### 7.3、开启流程
```java
public void startFlow() {
@@ -244,7 +246,7 @@ public void startFlow() {
}
```
-## 10、流程流转
+### 7.4、流程流转
```java
public void skipFlow() throws Exception {
@@ -267,10 +269,10 @@ public void skipFlow() throws Exception {
}
```
-## 11、初学者推荐学习路线
+## 8、初学者推荐学习路线
-### 11.1、推荐集成案例hh-vue
+### 8.1、推荐集成案例hh-vue
[项目地址](../../common/projectexample.md)
-### 11.2、推荐学习视频
+### 8.2、推荐学习视频
[新手教学视频,社区同学录制](https://www.bilibili.com/video/BV1Ci42117pK/)
diff --git a/src/v1.2.10/guide/started.md b/src/v1.2.10/guide/started.md
index add85f0..744e19b 100644
--- a/src/v1.2.10/guide/started.md
+++ b/src/v1.2.10/guide/started.md
@@ -29,7 +29,7 @@
### 3.1、mybatis
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-sb-starter
@@ -39,7 +39,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-solon-plugin
@@ -50,7 +50,7 @@ solon项目
### 3.2、mybatis-plus
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-sb-starter
@@ -60,7 +60,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -79,7 +79,7 @@ warm-flow:
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-jpa-sb-starter
@@ -89,7 +89,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -100,7 +100,7 @@ solon项目
### 3.4、mybatis-flex
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-sb-starter
@@ -110,7 +110,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-solon-plugin
@@ -121,7 +121,7 @@ solon项目
### 3.5、easy-query
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-sb-starter
@@ -131,7 +131,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-solon-plugin
diff --git a/src/v1.2.3/guide/started.md b/src/v1.2.3/guide/started.md
index c03791e..2d1d2cb 100644
--- a/src/v1.2.3/guide/started.md
+++ b/src/v1.2.3/guide/started.md
@@ -23,7 +23,7 @@
### 1、mybatis
**springboot项目**
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-sb-starter
@@ -33,7 +33,7 @@
**solon项目**
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-solon-plugin
@@ -44,7 +44,7 @@
### 2、mybatis-plus
**springboot项目**
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-sb-starter
@@ -54,7 +54,7 @@
**solon项目**
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -65,7 +65,7 @@
### 3、jpa
**springboot项目**
-```maven
+```xml
io.github.minliuhua
warm-flow-jpa-sb-starter
@@ -75,14 +75,14 @@
**solon项目**
-```maven
+```xml
支持中...
```
### 4、mybatis-flex
**springboot项目**
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-sb-starter
@@ -92,7 +92,7 @@
**solon项目**
-```maven
+```xml
支持中...
```
diff --git a/src/v1.2.4/guide/started.md b/src/v1.2.4/guide/started.md
index 58871eb..26b6730 100644
--- a/src/v1.2.4/guide/started.md
+++ b/src/v1.2.4/guide/started.md
@@ -23,7 +23,7 @@
### 3.1、mybatis
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-sb-starter
@@ -33,7 +33,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-solon-plugin
@@ -44,7 +44,7 @@ solon项目
### 3.2、mybatis-plus
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-sb-starter
@@ -54,7 +54,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -73,7 +73,7 @@ warm-flow:
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-jpa-sb-starter
@@ -83,7 +83,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -94,7 +94,7 @@ solon项目
### 3.4、mybatis-flex
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-sb-starter
@@ -104,7 +104,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-solon-plugin
@@ -115,7 +115,7 @@ solon项目
### 3.5、easy-query
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-sb-starter
@@ -125,7 +125,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-solon-plugin
diff --git a/src/v1.2.6/guide/started.md b/src/v1.2.6/guide/started.md
index 17970cf..b8186cb 100644
--- a/src/v1.2.6/guide/started.md
+++ b/src/v1.2.6/guide/started.md
@@ -29,7 +29,7 @@
### 3.1、mybatis
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-sb-starter
@@ -39,7 +39,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-solon-plugin
@@ -50,7 +50,7 @@ solon项目
### 3.2、mybatis-plus
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-sb-starter
@@ -60,7 +60,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -79,7 +79,7 @@ warm-flow:
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-jpa-sb-starter
@@ -89,7 +89,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -100,7 +100,7 @@ solon项目
### 3.4、mybatis-flex
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-sb-starter
@@ -110,7 +110,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-solon-plugin
@@ -121,7 +121,7 @@ solon项目
### 3.5、easy-query
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-sb-starter
@@ -131,7 +131,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-solon-plugin
diff --git a/src/v1.2.7/guide/started.md b/src/v1.2.7/guide/started.md
index 1a12c51..5db6910 100644
--- a/src/v1.2.7/guide/started.md
+++ b/src/v1.2.7/guide/started.md
@@ -29,7 +29,7 @@
### 3.1、mybatis
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-sb-starter
@@ -39,7 +39,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-solon-plugin
@@ -50,7 +50,7 @@ solon项目
### 3.2、mybatis-plus
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-sb-starter
@@ -60,7 +60,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -79,7 +79,7 @@ warm-flow:
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-jpa-sb-starter
@@ -89,7 +89,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -100,7 +100,7 @@ solon项目
### 3.4、mybatis-flex
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-sb-starter
@@ -110,7 +110,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-solon-plugin
@@ -121,7 +121,7 @@ solon项目
### 3.5、easy-query
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-sb-starter
@@ -131,7 +131,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-solon-plugin
diff --git a/src/v1.2.8/guide/started.md b/src/v1.2.8/guide/started.md
index 10db8b2..dd8e67e 100644
--- a/src/v1.2.8/guide/started.md
+++ b/src/v1.2.8/guide/started.md
@@ -29,7 +29,7 @@
### 3.1、mybatis
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-sb-starter
@@ -39,7 +39,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-solon-plugin
@@ -50,7 +50,7 @@ solon项目
### 3.2、mybatis-plus
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-sb-starter
@@ -60,7 +60,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -79,7 +79,7 @@ warm-flow:
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-jpa-sb-starter
@@ -89,7 +89,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -100,7 +100,7 @@ solon项目
### 3.4、mybatis-flex
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-sb-starter
@@ -110,7 +110,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-solon-plugin
@@ -121,7 +121,7 @@ solon项目
### 3.5、easy-query
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-sb-starter
@@ -131,7 +131,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-solon-plugin
diff --git a/src/v1.3.0/guide/started.md b/src/v1.3.0/guide/started.md
index 0acc15f..a515e19 100644
--- a/src/v1.3.0/guide/started.md
+++ b/src/v1.3.0/guide/started.md
@@ -29,7 +29,7 @@
### 3.1、mybatis
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-sb-starter
@@ -39,7 +39,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-solon-plugin
@@ -50,7 +50,7 @@ solon项目
### 3.2、mybatis-plus
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-sb-starter
@@ -60,7 +60,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -79,7 +79,7 @@ warm-flow:
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-jpa-sb-starter
@@ -89,7 +89,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-plus-solon-plugin
@@ -100,7 +100,7 @@ solon项目
### 3.4、mybatis-flex
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-sb-starter
@@ -110,7 +110,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-mybatis-flex-solon-plugin
@@ -121,7 +121,7 @@ solon项目
### 3.5、easy-query
springboot项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-sb-starter
@@ -131,7 +131,7 @@ springboot项目
solon项目
-```maven
+```xml
io.github.minliuhua
warm-flow-easy-query-solon-plugin
diff --git a/src/v1.3.1/guide/started.md b/src/v1.3.1/guide/started.md
index 6ced021..ebd3ce4 100644
--- a/src/v1.3.1/guide/started.md
+++ b/src/v1.3.1/guide/started.md
@@ -27,9 +27,9 @@
## 3、maven依赖
### 3.1、mybatis
-springboot2项目
+**springboot2项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-sb-starter
@@ -37,9 +37,9 @@ springboot2项目
```
-springboot3项目
+**springboot3项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-sb3-starter
@@ -47,9 +47,9 @@ springboot3项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-solon-plugin
@@ -58,9 +58,9 @@ solon项目
```
### 3.2、mybatis-plus
-springboot2项目
+**springboot2项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-plus-sb-starter
@@ -68,9 +68,9 @@ springboot2项目
```
-springboot3项目
+**springboot3项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-plus-sb3-starter
@@ -78,9 +78,9 @@ springboot3项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-plus-solon-plugin
@@ -89,7 +89,7 @@ solon项目
```
### 3.3、jpa
-warm-flow工作流配置
+**warm-flow工作流配置**
```yml
# warm-flow工作流配置
warm-flow:
@@ -97,9 +97,9 @@ warm-flow:
jpa_persistence_provider: org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider
```
-springboot2项目
+**springboot2项目**
-```maven
+```xml
org.dromara
warm-flow-jpa-sb-starter
@@ -107,9 +107,9 @@ springboot2项目
```
-springboot3项目
+**springboot3项目**
-```maven
+```xml
org.dromara
warm-flow-jpa-sb3-starter
@@ -117,9 +117,9 @@ springboot3项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-plus-solon-plugin
@@ -128,9 +128,9 @@ solon项目
```
### 3.4、mybatis-flex
-springboot2项目
+**springboot2项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-flex-sb-starter
@@ -138,9 +138,9 @@ springboot2项目
```
-springboot3项目
+**springboot3项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-flex-sb3-starter
@@ -148,9 +148,9 @@ springboot3项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-mybatis-flex-solon-plugin
@@ -159,9 +159,9 @@ solon项目
```
### 3.5、easy-query
-springboot项目
+**springboot项目**
-```maven
+```xml
org.dromara
warm-flow-easy-query-sb-starter
@@ -169,9 +169,9 @@ springboot项目
```
-solon项目
+**solon项目**
-```maven
+```xml
org.dromara
warm-flow-easy-query-solon-plugin
@@ -210,16 +210,18 @@ solon项目
* [x] mybatis-flex
* [ ] ......
-
-
> **有想扩展其他orm框架和数据库的可加qq群联系群主**
-## 6、代码示例
+## 6、设计器引入
+> 通过jar包引入:[文档地址](./designerIntroduced.md)
+
+## 7、代码示例
-> 测试代码[warm-flow-test](https://gitee.com/dromara/warm-flow-test)项目中,warm-flow-xxx-test模块的测类
+> 详细案例测试代码[warm-flow-test](https://gitee.com/dromara/warm-flow-test)项目中,warm-flow-xxx-test模块的测类
+**以下为简短案例:**
-## 7、部署流程
+### 7.1、部署流程
```java
public void deployFlow() throws Exception {
@@ -228,7 +230,7 @@ public void deployFlow() throws Exception {
}
```
-## 8、发布流程
+### 7.2、发布流程
```java
public void publish() throws Exception {
@@ -236,7 +238,7 @@ public void publish() throws Exception {
}
```
-## 9、开启流程
+### 7.3、开启流程
```java
public void startFlow() {
@@ -244,7 +246,7 @@ public void startFlow() {
}
```
-## 10、流程流转
+### 7.4、流程流转
```java
public void skipFlow() throws Exception {
@@ -267,10 +269,10 @@ public void skipFlow() throws Exception {
}
```
-## 11、初学者推荐学习路线
+## 8、初学者推荐学习路线
-### 11.1、推荐集成案例hh-vue
+### 8.1、推荐集成案例hh-vue
[项目地址](../../common/projectexample.md)
-### 11.2、推荐学习视频
+### 8.2、推荐学习视频
[新手教学视频,社区同学录制](https://www.bilibili.com/video/BV1Ci42117pK/)
--
Gitee
From 9bd79a0ff08f1a3db5d2c838e926bc0b9cf87df7 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Tue, 5 Nov 2024 22:55:32 +0800
Subject: [PATCH 05/16] =?UTF-8?q?[update]=20=E5=88=A0=E9=99=A4jpa=20boot3?=
=?UTF-8?q?=E6=8F=8F=E8=BF=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/master/guide/started.md | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/src/master/guide/started.md b/src/master/guide/started.md
index ebd3ce4..51202e0 100644
--- a/src/master/guide/started.md
+++ b/src/master/guide/started.md
@@ -107,16 +107,6 @@ warm-flow:
```
-**springboot3项目**
-
-```xml
-
- org.dromara
- warm-flow-jpa-sb3-starter
- 1.3.1
-
-```
-
**solon项目**
```xml
--
Gitee
From 5f1828dabe4cac77fb01886ef589cf88e9c0ff35 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Wed, 6 Nov 2024 00:49:56 +0800
Subject: [PATCH 06/16] =?UTF-8?q?[update]=20=E6=9B=B4=E6=96=B0=E8=AE=BE?=
=?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=BA=8C=E5=BC=80=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/submitpr.md | 12 ++++++++
src/master/guide/designerIntroduced.md | 39 ++++++++++++++++++++++++--
2 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/src/common/submitpr.md b/src/common/submitpr.md
index 89253f3..ffe70f4 100644
--- a/src/common/submitpr.md
+++ b/src/common/submitpr.md
@@ -21,6 +21,18 @@
![输入图片说明](https://foruda.gitee.com/images/1673427519150795591/d88c2bc9_1766278.png "屏幕截图")
+**git提交规范**
+```
+[init] 初始化
+[feat] 增加新功能
+[fix] 修复问题/BUG
+[perf] 优化/性能提升
+[refactor] 重构
+[revert] 撤销修改
+[style] 代码风格相关无影响运行结果的
+[update] 其他修改
+```
+
### 步骤六 创建PR申请(此操作在自己仓库或者要PR的仓库都可以)
![输入图片说明](https://foruda.gitee.com/images/1724138590322968397/15f2443d_2218307.png "屏幕截图")
diff --git a/src/master/guide/designerIntroduced.md b/src/master/guide/designerIntroduced.md
index 69b4d67..0852e0a 100644
--- a/src/master/guide/designerIntroduced.md
+++ b/src/master/guide/designerIntroduced.md
@@ -1,7 +1,7 @@
# 设计器引入
> [!IMPORTANT]
-> 1、为了方便业务系统快速引入设计器,不需要搬运并且适配等工作
-> 2、可以按照本文中介绍的,使用设计器,并快速接入业务系统
+> 1、为了方便业务系统快速引入设计器,不需要搬运并且适配等工作
+> 2、可以按照本文中介绍的,使用设计器,并快速接入业务系统
> 3、设计原理采取不分离的方式,把设计器打包的jar包中,以接口和静态资源的方式引入
## 1. 引入依赖
@@ -382,3 +382,38 @@ public class HandlerSelectServiceImpl implements HandlerSelectService {
}
}
```
+
+## 5. 设计器二开
+### 5.1 下载设计器源码,改造
+
+
+
+### 5.2 源码调试
+- 设计器需要配置业务系统的代理地址,否则无法访问业务系统
+- 独立启动该设计器
+- 业务系统配置该设计的访问地址:http://localhost:81/warm-flow-ui/index.html?id=xxx&disabled=false
+
+
+
+
+### 5.3 部署
+#### 5.3.1 先排除原依赖的前端代码
+```xml
+
+ org.dromara
+ warm-flow-plugin-ui-sb-web
+
+
+ warm-flow-plugin-vue3-ui
+ org.dromara
+
+
+
+```
+
+#### 5.3.2 不分离部署(部署方案一)
+- 打包项目,把打包后的文件`dist`复制到业务系统`src/main/META-INF/resources`目录下,改名为warm-flow-ui
+
+
+#### 5.3.2 前端独立部署/分离部署(部署方案二)
+待更新......
--
Gitee
From b32d8a6d102542cc9e58c9e18d1c3e97e18e906f Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Wed, 6 Nov 2024 15:27:57 +0800
Subject: [PATCH 07/16] =?UTF-8?q?[update]=20=E6=9B=B4=E6=96=B0=E8=AE=BE?=
=?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=BA=8C=E5=BC=80=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/troubleshooting.md | 4 ++++
src/common/update.md | 1 +
src/master/guide/designerIntroduced.md | 4 ++--
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/common/troubleshooting.md b/src/common/troubleshooting.md
index b69ea53..6ae3144 100644
--- a/src/common/troubleshooting.md
+++ b/src/common/troubleshooting.md
@@ -239,3 +239,7 @@ public class MybatisPlusConfig {
### 6.1、可尝试切换maven版本 (感谢【一拳打爆常大宝】)
如maven3.9.6切换为低版本3.8.2
+
+## 7、 StackOverflowError 错误
+查看跳转线退回的,是否设置为退回类型,后续有时间再做校验
+
diff --git a/src/common/update.md b/src/common/update.md
index 916bc76..3fd2d1f 100644
--- a/src/common/update.md
+++ b/src/common/update.md
@@ -35,6 +35,7 @@
- 新增流程图元数据 @晓华
- 流程定义数据保存支持json格式 @xiarigang
- 接入仿钉钉设计器 @晓华
+ - 流程变量表达式支持替换集合 @晓华
## 更新日志
diff --git a/src/master/guide/designerIntroduced.md b/src/master/guide/designerIntroduced.md
index 0852e0a..a87637a 100644
--- a/src/master/guide/designerIntroduced.md
+++ b/src/master/guide/designerIntroduced.md
@@ -411,9 +411,9 @@ public class HandlerSelectServiceImpl implements HandlerSelectService {
```
-#### 5.3.2 不分离部署(部署方案一)
+#### 5.3.2 设计器不分离部署(部署方案一)
- 打包项目,把打包后的文件`dist`复制到业务系统`src/main/META-INF/resources`目录下,改名为warm-flow-ui
-#### 5.3.2 前端独立部署/分离部署(部署方案二)
+#### 5.3.2 设计器独立部署/分离部署(部署方案二)
待更新......
--
Gitee
From c2e28e6975c279297ea1cb0ff3b3ec6b2a1768e3 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Thu, 7 Nov 2024 10:12:26 +0800
Subject: [PATCH 08/16] =?UTF-8?q?[style]=20=E8=B0=83=E6=95=B4=E4=B8=8D?=
=?UTF-8?q?=E6=AD=A3=E7=A1=AE=E7=9A=84=E6=B3=A8=E9=87=8A=E6=A0=BC=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/submitpr.md | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/common/submitpr.md b/src/common/submitpr.md
index ffe70f4..2a863ef 100644
--- a/src/common/submitpr.md
+++ b/src/common/submitpr.md
@@ -17,7 +17,12 @@
![输入图片说明](https://foruda.gitee.com/images/1673427394686229310/c479a5a5_1766278.png "屏幕截图")
-### 步骤五 将编写好的代码 提交到自己的远程仓库
+### 步骤五 设置创建类的模板
+新创建的类使用这个模板生成注释,使用方式在类上面写上 `/c`,然后按回车会自动生成
+
+
+
+### 步骤六 将编写好的代码 提交到自己的远程仓库
![输入图片说明](https://foruda.gitee.com/images/1673427519150795591/d88c2bc9_1766278.png "屏幕截图")
@@ -33,11 +38,11 @@
[update] 其他修改
```
-### 步骤六 创建PR申请(此操作在自己仓库或者要PR的仓库都可以)
+### 步骤七 创建PR申请(此操作在自己仓库或者要PR的仓库都可以)
![输入图片说明](https://foruda.gitee.com/images/1724138590322968397/15f2443d_2218307.png "屏幕截图")
-### 步骤七 等待作者评审 按要求更改 直到没有问题后被作者合并
+### 步骤八 等待作者评审 按要求更改 直到没有问题后被作者合并
![输入图片说明](https://foruda.gitee.com/images/1724138716251455897/10caacb3_2218307.png "屏幕截图")
--
Gitee
From f0ebcb7db82099001a0c50549e928150320c4371 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Thu, 7 Nov 2024 13:54:54 +0800
Subject: [PATCH 09/16] =?UTF-8?q?[update]=20=E5=AE=8C=E5=96=84=E8=AE=BE?=
=?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=BA=8C=E5=BC=80=E6=96=B9=E6=A1=88=E5=92=8C?=
=?UTF-8?q?=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/master/guide/designerIntroduced.md | 38 ++++++++++++++++++++++++--
1 file changed, 36 insertions(+), 2 deletions(-)
diff --git a/src/master/guide/designerIntroduced.md b/src/master/guide/designerIntroduced.md
index a87637a..930e108 100644
--- a/src/master/guide/designerIntroduced.md
+++ b/src/master/guide/designerIntroduced.md
@@ -386,18 +386,21 @@ public class HandlerSelectServiceImpl implements HandlerSelectService {
## 5. 设计器二开
### 5.1 下载设计器源码,改造
+- 如果内置的接口不满足或者不够支持实际业务开发,可在业务系统中增加接口,设计器配置该接口地址
+
+
### 5.2 源码调试
- 设计器需要配置业务系统的代理地址,否则无法访问业务系统
- 独立启动该设计器
-- 业务系统配置该设计的访问地址:http://localhost:81/warm-flow-ui/index.html?id=xxx&disabled=false
### 5.3 部署
#### 5.3.1 先排除原依赖的前端代码
+
```xml
org.dromara
@@ -413,7 +416,38 @@ public class HandlerSelectServiceImpl implements HandlerSelectService {
#### 5.3.2 设计器不分离部署(部署方案一)
- 打包项目,把打包后的文件`dist`复制到业务系统`src/main/META-INF/resources`目录下,改名为warm-flow-ui
+- 独立服务
+
#### 5.3.2 设计器独立部署/分离部署(部署方案二)
-待更新......
+- 打包项目,把打包后的文件`dist`复制到nginx的html目录下,改名为warm-flow-ui
+- 访问地址改为(请注意地址少了`/warm-flow-ui`):http://localhost:81/index.html?id=xxx&disabled=false
+
+**nginx配置示例**
+
+```config
+server {
+ listen 82;
+ server_name localhost;
+
+ location / {
+ root D:/software/nginx-1.16.1/html/warm-flow-ui;
+ try_files $uri $uri/ /index.html;
+ index index.html index.htm;
+ }
+
+ location /warm-flow-ui/ {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header REMOTE-HOST $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_pass http://localhost:8080/warm-flow-ui/;
+ }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root html;
+ }
+}
+```
--
Gitee
From c44a0b86d35e1c1357379512a474600f79abbfe4 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Fri, 8 Nov 2024 13:40:11 +0800
Subject: [PATCH 10/16] =?UTF-8?q?[update]=20=E4=BF=AE=E6=94=B9=E6=96=87?=
=?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/master/guide/api.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/master/guide/api.md b/src/master/guide/api.md
index 6a1054c..58964f1 100644
--- a/src/master/guide/api.md
+++ b/src/master/guide/api.md
@@ -5,7 +5,7 @@
### 1.1、新增流程定义表数据,新增后需要通过saveXml接口保存流程节点和流程跳转数据
`checkAndSave(definition)`:校验后新增
-### 1.1、新增流程定义、流程节点和流程跳转数据
+### 1.1、导入流程定义、流程节点和流程跳转数据
`importXml(is)`:导入流程定义xml的输入流
### 1.2、保存流程节点和流程跳转数据
@@ -59,7 +59,7 @@
`skipByInsId(instanceId, flowParams)`:传入流程实例id,流程跳转。flowParams包含如下字段:
- skipType: 跳转类型(PASS审批通过 REJECT退回) [必传]
- nodeCode: 节点编码,如果指定节点,可任意跳转到对应节点 [按需传输]
-- permissionFlag: 办理人权限标识,比如用户,角色,部门等 [只有未设置办理人时可不传]
+- permissionFlag: 办理人权限标识,比如用户,角色,部门等,未设置办理人或者ignore为true可不传 [按需传输]
- message: 审批意见 [按需传输]
- handler: 办理人唯一标识 [建议传]
- variable: 流程变量 [按需传输]
@@ -89,7 +89,7 @@
`skip(taskId, flowParams)`:传入流程任务id,流程跳转。flowParams包含如下字段:
- skipType: 跳转类型(PASS审批通过 REJECT退回) [必传]
- nodeCode: 节点编码,如果指定节点,可任意跳转到对应节点 [按需传输]
-- permissionFlag: 办理人权限标识,比如用户,角色,部门等 [只有未设置办理人时可不传]
+- permissionFlag: 办理人权限标识,比如用户,角色,部门等,未设置办理人或者ignore为true可不传 [按需传输]
- message: 审批意见 [按需传输]
- handler: 办理人唯一标识 [建议传]
- variable: 流程变量 [按需传输]
--
Gitee
From cd33ebaa7650781ca4268444cac70ff79575dc53 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Sun, 10 Nov 2024 22:43:03 +0800
Subject: [PATCH 11/16] =?UTF-8?q?[update]=20=E4=BF=AE=E6=94=B9=E6=96=87?=
=?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/master/guide/processterm.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/master/guide/processterm.md b/src/master/guide/processterm.md
index 04aec64..0b1dd56 100644
--- a/src/master/guide/processterm.md
+++ b/src/master/guide/processterm.md
@@ -3,10 +3,10 @@
|------|------|-------------------------------------------------------------------|
| 1 | 审批 | 当前节点处理人,对当前流程节点进行审核操作,完成后进入下一节点 |
| 2 | 回退 | 当前节点处理人,将流程驳回至之前已经处理过的任务节点,要求重新处理 |
+| 2 | 任意跳转 | 任意跳转(通过或者退回)指定节点 |
| 3 | 委派 | 当前节点处理人,将自己的主办或者经办权限转移委派至别的用户代为处理,处理完后回到当前处理人手中,并由当前处理人处理完后进入下一节点 |
| 4 | 转办 | 当前节点处理人,将操作权限转给别人处理,处理完后进入下一节点(自己不再处理) |
| 5 | 催办 | 对于时效要求高的流程,发起人可催办提醒当前节点处理人,一般以消息通知方式提醒处理人 |
-| 6 | 撤销 | 工作流中的某个节点上,允许返回到上一个节点进行修改,属于退回中的一种 |
| 7 | 取回 | 将工作流中的某个任务退回给之前的执行者,以便进行修改或重新处理 |
| 8 | 终止 | 当前节点处理人,终止当前流程 |
| 9 | 抄送 | 当前节点处理人,处理完成之后将处理结果抄送给其他人 |
--
Gitee
From decbea475ee6c0f4e07d97eb4e076ac0c881ac93 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Mon, 11 Nov 2024 00:34:44 +0800
Subject: [PATCH 12/16] =?UTF-8?q?[fix]=20=E7=BB=9F=E4=B8=80=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8D=E5=88=86=E9=A1=B5bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/update.md | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/common/update.md b/src/common/update.md
index 3fd2d1f..e3b1a99 100644
--- a/src/common/update.md
+++ b/src/common/update.md
@@ -24,18 +24,17 @@
- 更新日志
- 动态表单支持 @vanlin
- 流程定义数据保存支持json格式 @晓华
- -
+ - 取回 @xiarigang
### v1.3.2 2024-11-18
- 【升级指南】
- 无
- 更新日志
- - 撤销 @xiarigang
- - 取回 @xiarigang
- 新增流程图元数据 @晓华
- 流程定义数据保存支持json格式 @xiarigang
- 接入仿钉钉设计器 @晓华
- 流程变量表达式支持替换集合 @晓华
+ - [fix] 统一修复分页bug
## 更新日志
--
Gitee
From 78b46a3a224912c0513850825758f2473c383e0c Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Mon, 11 Nov 2024 17:26:52 +0800
Subject: [PATCH 13/16] =?UTF-8?q?[fix]=20=E7=BB=9F=E4=B8=80=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8D=E5=88=86=E9=A1=B5bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/update.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/common/update.md b/src/common/update.md
index e3b1a99..1d88021 100644
--- a/src/common/update.md
+++ b/src/common/update.md
@@ -34,6 +34,7 @@
- 流程定义数据保存支持json格式 @xiarigang
- 接入仿钉钉设计器 @晓华
- 流程变量表达式支持替换集合 @晓华
+ - 流程设计器支持接入外部token @晓华
- [fix] 统一修复分页bug
--
Gitee
From 052ce2e2456f690681a583192628caf3491bd514 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Tue, 12 Nov 2024 11:46:13 +0800
Subject: [PATCH 14/16] =?UTF-8?q?[feat]=20=E6=96=B0=E5=A2=9E=E6=94=AF?=
=?UTF-8?q?=E6=8C=81=E6=8E=A5=E5=85=A5=E4=B8=9A=E5=8A=A1=E7=B3=BB=E7=BB=9F?=
=?UTF-8?q?token?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/projectexample.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/common/projectexample.md b/src/common/projectexample.md
index e45dadf..31f7215 100644
--- a/src/common/projectexample.md
+++ b/src/common/projectexample.md
@@ -1,8 +1,8 @@
# 集成项目示例
-| 版本 | 作者 |项目名称 | 源码地址 |
-|--------------|----------|------ |----------------------------------------------------------------------------------------|
-| springboot2+vue2 | 晓华 |hh-vue| https://gitee.com/min290/hh-vue |
-| springboot3+React | quick |quick-boot | https://github.com/csx-bill/quick-boot |
-| vue3 | 晓华/Zhen |ruoyi-vue3 | https://gitee.com/min290/RuoYi-Vue3.git |
-| spring-cloud(nacos)+vue3 | 梁小梁/Zhen |Ruoyi-Cloud&Ruoyi-Cloud-Vue3 | https://gitee.com/liangliyun/RuoYi-Cloud https://gitee.com/liangliyun/RuoYi-Cloud-Vue3 |
\ No newline at end of file
+| 版本 | 作者 | 项目名称 | 源码地址 |
+|--------------------------|----------|------------------------------|----------------------------------------------------------------------------------------|
+| springboot2+vue2 | 晓华 | hh-vue(基于ruoyi-vue) | https://gitee.com/min290/hh-vue |
+| springboot3+React | quick | quick-boot | https://github.com/csx-bill/quick-boot |
+| vue3 | 晓华/Zhen | ruoyi-vue3(基于ruoyi-ui-vue3) | https://gitee.com/min290/RuoYi-Vue3.git |
+| spring-cloud(nacos)+vue3 | 梁小梁/Zhen | Ruoyi-Cloud&Ruoyi-Cloud-Vue3 | https://gitee.com/liangliyun/RuoYi-Cloud https://gitee.com/liangliyun/RuoYi-Cloud-Vue3 |
--
Gitee
From 2da4b564f70bfadac2077b06ea4ff4fdf65beaf2 Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Tue, 12 Nov 2024 12:01:57 +0800
Subject: [PATCH 15/16] =?UTF-8?q?[feat]=20=E6=96=B0=E5=A2=9E=E6=94=AF?=
=?UTF-8?q?=E6=8C=81=E6=8E=A5=E5=85=A5=E4=B8=9A=E5=8A=A1=E7=B3=BB=E7=BB=9F?=
=?UTF-8?q?token?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 3 +
src/.vuepress/navbar.ts | 1 +
src/.vuepress/sidebar.ts | 35 ++
src/common/update.md | 7 +-
src/v1.3.2/guide/api.md | 245 ++++++++++
src/v1.3.2/guide/config.md | 125 +++++
src/v1.3.2/guide/customstatus.md | 46 ++
src/v1.3.2/guide/datafillhandler.md | 61 +++
src/v1.3.2/guide/designerIntroduced.md | 459 ++++++++++++++++++
src/v1.3.2/guide/expression.md | 68 +++
src/v1.3.2/guide/flowchart.md | 7 +
src/v1.3.2/guide/form.md | 3 +
src/v1.3.2/guide/jsonlib.md | 56 +++
src/v1.3.2/guide/listener.md | 216 +++++++++
src/v1.3.2/guide/logicdelete.md | 41 ++
src/v1.3.2/guide/ormusagetips.md | 83 ++++
src/v1.3.2/guide/processdemo.md | 94 ++++
src/v1.3.2/guide/processrule.md | 56 +++
src/v1.3.2/guide/processterm.md | 18 +
src/v1.3.2/guide/started.md | 268 ++++++++++
src/v1.3.2/guide/table.md | 178 +++++++
src/v1.3.2/guide/tenant.md | 194 ++++++++
...34\346\265\201\345\274\225\346\223\216.md" | 105 ++++
src/v1.3.2/guide/variable.md | 39 ++
src/v1.3.2/guide/variableStategy.md | 134 +++++
25 files changed, 2539 insertions(+), 3 deletions(-)
create mode 100644 src/v1.3.2/guide/api.md
create mode 100644 src/v1.3.2/guide/config.md
create mode 100644 src/v1.3.2/guide/customstatus.md
create mode 100644 src/v1.3.2/guide/datafillhandler.md
create mode 100644 src/v1.3.2/guide/designerIntroduced.md
create mode 100644 src/v1.3.2/guide/expression.md
create mode 100644 src/v1.3.2/guide/flowchart.md
create mode 100644 src/v1.3.2/guide/form.md
create mode 100644 src/v1.3.2/guide/jsonlib.md
create mode 100644 src/v1.3.2/guide/listener.md
create mode 100644 src/v1.3.2/guide/logicdelete.md
create mode 100644 src/v1.3.2/guide/ormusagetips.md
create mode 100644 src/v1.3.2/guide/processdemo.md
create mode 100644 src/v1.3.2/guide/processrule.md
create mode 100644 src/v1.3.2/guide/processterm.md
create mode 100644 src/v1.3.2/guide/started.md
create mode 100644 src/v1.3.2/guide/table.md
create mode 100644 src/v1.3.2/guide/tenant.md
create mode 100644 "src/v1.3.2/guide/update/\344\270\200\344\270\252\350\207\252\345\270\246\346\265\201\347\250\213\350\256\276\350\256\241\345\231\250\347\232\204\345\267\245\344\275\234\346\265\201\345\274\225\346\223\216.md"
create mode 100644 src/v1.3.2/guide/variable.md
create mode 100644 src/v1.3.2/guide/variableStategy.md
diff --git a/README.md b/README.md
index dfc8191..70d47ce 100644
--- a/README.md
+++ b/README.md
@@ -36,3 +36,6 @@
- 在**项目根目录**运行 `npm run docs:dev` 命令
- 站点会默认运行在 `http://localhost:8080`
+
+### 打包
+- `npm run docs:build` 命令
diff --git a/src/.vuepress/navbar.ts b/src/.vuepress/navbar.ts
index 4431fab..f1da438 100644
--- a/src/.vuepress/navbar.ts
+++ b/src/.vuepress/navbar.ts
@@ -26,6 +26,7 @@ export default navbar([
text: '历史版本',
icon: '/icons/version.svg',
children: [
+ { text: 'v1.3.2', link: '/v1.3.2/guide/started.md' },
{ text: 'v1.3.1', link: '/v1.3.1/guide/started.md' },
{ text: 'v1.3.0', link: '/v1.3.0/guide/started.md' },
{ text: 'v1.2.10', link: '/v1.2.10/guide/started.md' },
diff --git a/src/.vuepress/sidebar.ts b/src/.vuepress/sidebar.ts
index 9ecc21b..a221a38 100644
--- a/src/.vuepress/sidebar.ts
+++ b/src/.vuepress/sidebar.ts
@@ -88,6 +88,41 @@ export default sidebar({
link: '/common/support.md',
},
],
+ "/v1.3.2/guide/": [
+ {
+ text: "基础部分",
+ icon: "bulb",
+ collapsible: false,
+ children: [
+ '/v1.3.2/guide/started.md',
+ '/v1.3.2/guide/processterm.md',
+ '/v1.3.2/guide/processrule.md',
+ '/v1.3.2/guide/processdemo.md',
+ '/v1.3.2/guide/table.md',
+ '/v1.3.2/guide/config.md',
+ '/v1.3.2/guide/api.md',
+ '/v1.3.2/guide/datafillhandler.md',
+ '/v1.3.2/guide/variable.md',
+ '/v1.3.2/guide/variableStategy.md',
+ '/v1.3.2/guide/ormusagetips.md',
+ '/v1.3.2/guide/designerIntroduced.md',
+ ],
+ },
+ {
+ text: "进阶部分",
+ icon: "/icons/advanced.svg",
+ collapsible: false,
+ children: [
+ '/v1.3.2/guide/listener.md',
+ '/v1.3.2/guide/logicdelete.md',
+ '/v1.3.2/guide/tenant.md',
+ '/v1.3.2/guide/form.md',
+ '/v1.3.2/guide/customstatus.md',
+ '/v1.3.2/guide/expression.md',
+ '/v1.3.2/guide/jsonlib.md',
+ ],
+ }
+ ],
"/v1.3.1/guide/": [
{
text: "基础部分",
diff --git a/src/common/update.md b/src/common/update.md
index 1d88021..053a4e9 100644
--- a/src/common/update.md
+++ b/src/common/update.md
@@ -17,7 +17,7 @@
## 开发中计划
-### v1.3.3 2024-11-18
+### v1.3.3
- 【升级指南】
- 无
@@ -25,9 +25,9 @@
- 动态表单支持 @vanlin
- 流程定义数据保存支持json格式 @晓华
- 取回 @xiarigang
-### v1.3.2 2024-11-18
+### v1.3.2
- 【升级指南】
- - 无
+ - 独立设计器放行路径增加`/warm-flow`,如果想要共享后端权限(比如token),可不增加,并且按照官网流程设计器引入进行设置
- 更新日志
- 新增流程图元数据 @晓华
@@ -35,6 +35,7 @@
- 接入仿钉钉设计器 @晓华
- 流程变量表达式支持替换集合 @晓华
- 流程设计器支持接入外部token @晓华
+ - [feat] 新增支持接入业务系统token
- [fix] 统一修复分页bug
diff --git a/src/v1.3.2/guide/api.md b/src/v1.3.2/guide/api.md
new file mode 100644
index 0000000..58964f1
--- /dev/null
+++ b/src/v1.3.2/guide/api.md
@@ -0,0 +1,245 @@
+# 核心api
+
+## 1、DefService流程定义接口
+
+### 1.1、新增流程定义表数据,新增后需要通过saveXml接口保存流程节点和流程跳转数据
+`checkAndSave(definition)`:校验后新增
+
+### 1.1、导入流程定义、流程节点和流程跳转数据
+`importXml(is)`:导入流程定义xml的输入流
+
+### 1.2、保存流程节点和流程跳转数据
+`saveXml(def)`: 传入流程定义id、流程定义xml字符串
+- id: 流程定义id [必传]
+- xmlString: 流程定义xml字符串 [必传]
+
+### 1.3、保存流程节点和流程跳转数据
+`saveXml(id, xmlString)`: 传入流程定义id、流程定义xml字符串
+- id: 流程定义id
+- xmlString: 流程定义xml字符串
+
+### 1.4、导出流程定义
+`exportXml(id)`: 导出流程定义(流程定义、流程节点和流程跳转数据)xml的Document对象
+
+### 1.5、获取流程定义
+`xmlString(id)`: 获取流程定义xml(流程定义、流程节点和流程跳转数据)的字符串
+
+### 1.6、删除
+`removeDef(ids)`: 删除流程定义相关数据
+
+### 1.7、发布
+`publish(id)`: 发布流程定义
+
+### 1.8、取消发布
+`unPublish(id)`: 取消发布流程定义
+
+### 1.9、复制流程
+`copyDef(id)`: 复制流程定义
+
+### 1.10、获取流程图
+`flowChart(instanceId)`: 获取流程图的图片流
+
+### 1.11、激活流程
+`active(Long id)`: 激活流程
+
+### 1.12、挂起流程
+`unActive(Long id)`: 挂起流程:流程定义挂起后,相关的流程实例都无法继续流转
+
+## 2、InsService流程实例接口
+
+### 2.1、开启流程
+`start(businessId, flowParams)`:传入业务id,开启流程实例。flowParams包含如下字段:
+- flowCode: 流程编码 [必传]
+- handler: 办理人唯一标识 [建议传]
+- variable: 流程变量 [按需传输]
+- ext: 扩展字段,预留给业务系统使用 [按需传输]
+- flowStatus: 流程状态,自定义流程状态[按需传输]
+
+### 2.2、流程跳转
+`skipByInsId(instanceId, flowParams)`:传入流程实例id,流程跳转。flowParams包含如下字段:
+- skipType: 跳转类型(PASS审批通过 REJECT退回) [必传]
+- nodeCode: 节点编码,如果指定节点,可任意跳转到对应节点 [按需传输]
+- permissionFlag: 办理人权限标识,比如用户,角色,部门等,未设置办理人或者ignore为true可不传 [按需传输]
+- message: 审批意见 [按需传输]
+- handler: 办理人唯一标识 [建议传]
+- variable: 流程变量 [按需传输]
+- flowStatus: 流程状态,自定义流程状态 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
+
+### 2.3、终止流程
+`termination(instanceId, flowParams)`:传入流程实例id,终止流程。flowParams包含如下字段:
+- handler: 办理人唯一标识 [建议传]
+- message: 审批意见 [按需传输]
+- flowStatus: 流程状态,自定义流程状态 [按需传输]
+- permissionFlag: 办理人权限标识,比如用户,角色,部门等,不传不校验权限 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
+
+### 2.4、删除流程实例
+`remove(instanceIds)`:根据实例ids,删除流程
+
+### 2.5、激活实例
+`active(Long id)`: 激活实例
+
+### 2.6、挂起实例
+`unActive(Long id)`: 挂起实例,流程实例挂起后,该流程实例无法继续流转
+
+## 3、TaskService待办任务接口
+
+### 3.1、流程跳转
+`skip(taskId, flowParams)`:传入流程任务id,流程跳转。flowParams包含如下字段:
+- skipType: 跳转类型(PASS审批通过 REJECT退回) [必传]
+- nodeCode: 节点编码,如果指定节点,可任意跳转到对应节点 [按需传输]
+- permissionFlag: 办理人权限标识,比如用户,角色,部门等,未设置办理人或者ignore为true可不传 [按需传输]
+- message: 审批意见 [按需传输]
+- handler: 办理人唯一标识 [建议传]
+- variable: 流程变量 [按需传输]
+- flowStatus: 流程状态,自定义流程状态 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
+
+### 3.2、终止流程
+`termination(taskId, flowParams)`:传入流程任务id,终止流程。flowParams包含如下字段:
+- message: 审批意见 [按需传输]
+- handler: 办理人唯一标识 [建议传]
+- flowStatus: 流程状态,自定义流程状态 [按需传输]
+- permissionFlag: 办理人权限标识,比如用户,角色,部门等,不传不校验权限 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
+
+### 3.3、转办
+`transfer(taskId, flowParams)`:转办, 默认删除当然办理用户权限,转办后,当前办理不可办理。flowParams包含如下字段:
+- handler: 当前办理人唯一标识 [必传]
+- permissionFlag: 用户权限标识集合 [必传]
+- addHandlers: 转办对象 [必传]
+- message: 审批意见 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
+
+### 3.4、委派
+`depute(taskId, flowParams)`:委派, 默认删除当然办理用户权限,委派后,当前办理不可办理。flowParams包含如下字段:
+- handler: 当前办理人唯一标识 [必传]
+- permissionFlag: 用户权限标识集合 [必传]
+- addHandlers: 委托对象 [必传]
+- message: 审批意见 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
+
+### 3.5、加签
+`addSignature(taskId, flowParams)`:加签,增加办理人。flowParams包含如下字段:
+- handler: 当前办理人唯一标识 [必传]
+- permissionFlag: 用户权限标识集合 [必传]
+- addHandlers: 加签对象 [必传]
+- message: 审批意见 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
+
+### 3.6、减签
+`reductionSignature(taskId, flowParams)`:减签,减少办理人。flowParams包含如下字段:
+- handler: 当前办理人唯一标识 [必传]
+- permissionFlag: 用户权限标识集合 [必传]
+- reductionHandlers: 减少办理人 [必传]
+- message: 审批意见 [按需传输]
+- ignore: 转办忽略权限校验,默认不忽略(true:忽略,false:不忽略)[按需传输]
+
+### 3.7、修改办理人
+`updateHandler(taskId, flowParams)`:传入流程任务id,修改办理人
+- handler: 办理人唯一标识 [按需传输]
+- permissionFlag: 用户所拥有的权限标识 [按需传输,ignore为false,则必传]
+- addHandlers: 增加办理人:加签,转办,委托 [按需传输]
+- reductionHandlers: 减少办理人:减签,委托 [按需传输]
+- message: 审批意见 [按需传输]
+- cooperateType: 协作方式(2转办 3委派 6加签 7减签)[按需传输]
+- ignore: 转办忽略权限校验(true:忽略,false:不忽略)[按需传输]
+
+## 4、NodeService节点接口
+### 4.1、获取下一个节点列表
+`getNextNodeList(definitionId, nowNodeCode, anyNodeCode, skipType, variable)`:根据流程定义和当前节点code获取下一节点,如是网关跳过取下一节点,并行网关返回多个节点
+- definitionId: 流程定义id [必传]
+- nowNodeCode: 当前节点code [必传]
+- skipType: 跳转类型(PASS审批通过 REJECT退回) [必传]
+- anyNodeCode: anyNodeCode不为空,则可跳转anyNodeCode节点(优先级最高) [按需传输]
+- variable: 流程变量,下一个节点是网关需要判断跳转条件,并行网关返回多个节点 [按需传输]
+
+## 5、公共api接口
+### 5.1、根据id查询
+`getById(id)`:根据id查询
+- id: 主键
+
+### 5.2、根据ids主键集合查询
+`getByIds(ids)`:根据ids主键集合查询
+- ids: 主键集合
+
+### 5.3、分页查询
+`getById(entity, page)`:分页查询
+- entity: 查询实体
+- page: 分页对象,支持设置排序字段
+
+### 5.4、查询列表
+`list(entity)`:查询列表
+- entity: 查询实体
+
+### 5.5、查询列表,可排序
+`list(entity, query)`:查询列表,可排序
+- entity: 查询实体
+- query: 查询代理层处理,支持设置排序字段
+
+### 5.6、查询一条记录
+`getOne(entity)`:查询一条记录
+- entity 查询实体
+
+### 5.7、获取总数量
+`selectCount(entity)`:获取总数量
+- entity: 查询实体
+
+### 5.8、判断是否存在
+`exists(entity)`:判断是否存在
+- entity: 查询实体
+
+### 5.8、新增
+`save(entity)`:新增
+- entity: 实体
+
+### 5.9、根据id修改
+`updateById(entity)`:根据id修改
+- entity: 实体
+
+### 5.10、根据id删除
+`removeById(id)`:根据id删除
+- id: 实体
+
+### 5.11、根据entity删除
+`remove(entity)`:根据entity删除
+- entity: 实体
+
+### 5.12、根据ids批量删除
+`removeByIds(ids)`:根据ids批量删除
+- ids: 实体
+
+### 5.13、批量新增
+`saveBatch(list)`:批量新增
+- list: 实体集合
+
+### 5.14、批量新增
+`saveBatch(list, batchSize)`:批量新增
+- list: 需要插入的集合数据
+- batchSize: 插入大小
+
+### 5.15、批量更新
+`updateBatch(list)`:批量更新
+- list: 集合数据
+
+### 5.16、id设置正序排列
+`orderById()`:id设置正序排列
+
+### 5.17、创建时间设置正序排列
+`orderByCreateTime()`:创建时间设置正序排列
+
+### 5.18、更新时间设置正序排列
+`orderByUpdateTime()`:更新时间设置正序排列
+
+### 5.19、设置正序排列
+`orderByAsc(orderByField)`:设置正序排列
+- orderByField: 排序字段
+
+### 5.20、设置倒序排列
+`orderByDesc(orderByField)`:设置倒序排列
+- orderByField: 排序字段
+
+### 5.21、用户自定义排序方案
+`orderBy(orderByField)`:用户自定义排序方案
+- orderByField: 排序字段
diff --git a/src/v1.3.2/guide/config.md b/src/v1.3.2/guide/config.md
new file mode 100644
index 0000000..e3c1d40
--- /dev/null
+++ b/src/v1.3.2/guide/config.md
@@ -0,0 +1,125 @@
+# 配置文件
+## 1、spring
+### 1.1、yaml配置方式
+```yml
+# warm-flow工作流配置
+warm-flow:
+ # 是否开启工作流,默认true
+ enabled: true
+ # 是否显示banner图,默认是
+ banner: true
+ # 是否开启设计器ui,默认true
+ ui: true
+ # id生成器类型, 不填默认为orm扩展自带生成器或者warm-flow内置的19位雪花算法, SnowId14:14位,SnowId15:15位, SnowFlake19:19位
+ key_type: SnowId19
+ # 填充器,内部有默认实现,如果不满足实际业务,可通过此配置自定义实现
+ data-fill-handler-path: com.ruoyi.system.handle.CustomDataFillHandler
+ # 全局租户处理器,有多租户需要,可以配置自定义实现
+ tenant_handler_path: com.ruoyi.system.handle.CustomTenantHandler
+ # 是否开启逻辑删除(orm框架本身不支持逻辑删除,可通过这种方式开启)
+ logic_delete: true
+ # 逻辑删除字段值(开启后默认为2)
+ logic_delete_value: 2
+ # 逻辑未删除字段(开启后默认为0)
+ logic_not_delete_value: 0
+ # 当使用JPA时指定JpaPersistenceProvider
+ jpa_persistence_provider: org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider
+ # 内部已实现自动获取,失效时使用此配置(在使用mybatis扩展包时, 由于各数据库sql语句存在差异, 通过此配置兼容,默认为mysql)
+ data_source_type: mysql
+```
+
+### 1.2、bean配置方式
+```java
+@Configuration
+public class WarmFlowConfig {
+
+ /**
+ * 自定义填充 (可配置文件注入,也可用@Bean/@Component方式)
+ */
+ @Bean
+ public DataFillHandler dataFillHandler() {
+ return new CustomDataFillHandler();
+ }
+
+ /**
+ * 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
+ */
+ @Bean
+ public TenantHandler tenantHandler() {
+ return new CustomTenantHandler();
+ }
+}
+
+/**
+ * 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
+ *
+ * @author warm
+ */
+public class CustomTenantHandler implements TenantHandler {
+
+
+ @Override
+ public String getTenantId() {
+ return "000000";
+ }
+}
+
+```
+
+## 2、solon
+### 2.1、yaml配置方式
+```yaml
+# warm-flow工作流配置
+warm-flow:
+ # 是否显示banner图,默认是
+ banner: true
+ # # 填充器,内部有默认实现,如果不满足实际业务,可通过此配置自定义实现
+ # data-fill-handler-path: org.dromara.warm.flow.core.test.handle.CustomDataFillHandler
+ # 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
+ # tenant_handler_path: org.dromara.warm.flow.core.test.handle.CustomTenantHandler
+ # 是否开启逻辑删除(orm框架本身不支持逻辑删除,可通过这种方式开启,比如jpa)
+ logic_delete: false
+ # 逻辑删除字段值(开启后默认为2)
+ logic_delete_value: 2
+ # 逻辑未删除字段(开启后默认为0)
+ logic_not_delete_value: 0
+
+# warm-flow-jpa 的hibernate jpa配置 此处属于固定配置
+warm-flow-jpa:
+# jpa 与 数据源绑定,此处填写数据源名称
+ datasource: db1
+# hibernate 配置配置
+ properties:
+ hibernate:
+ hbm2ddl:
+ auto: none
+ show_sql: true
+ format_sql: true
+ dialect: org.hibernate.dialect.MySQL8Dialect
+ connection:
+ isolaction: 4 # 事务隔离级别 4 可重复度
+
+```
+
+### 2.1、bean配置方式
+```java
+@Configuration
+public class WarmFlowConfig {
+
+ /**
+ * 自定义填充 (可配置文件注入,也可用@Bean/@Component方式)
+ */
+ @Bean
+ public DataFillHandler dataFillHandler() {
+ return new CustomDataFillHandler();
+ }
+
+ /**
+ * 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
+ */
+ @Bean
+ public TenantHandler tenantHandler() {
+ return new CustomTenantHandler();
+ }
+}
+```
diff --git a/src/v1.3.2/guide/customstatus.md b/src/v1.3.2/guide/customstatus.md
new file mode 100644
index 0000000..a0b1f5b
--- /dev/null
+++ b/src/v1.3.2/guide/customstatus.md
@@ -0,0 +1,46 @@
+# 自定义流程状态
+
+> [!IMPORTANT]
+> 1、flowStatus:流程实例表状态,当前流程状态
+> 2、hisStatus:历史任务表状态,过程状态记录,按照自身业务要求,可以语流程实例状态不同
+
+
+## 1、开启流程
+
+```java
+ public void insertTestLeave(TestLeave testLeave, Integer flowStatus)
+ {
+ String id = IdUtils.nextIdStr();
+ testLeave.setId(id);
+ LoginUser user = SecurityUtils.getLoginUser();
+ FlowParams flowParams = FlowParams.build().flowCode(getFlowType(testLeave))
+ .handler(user.getUser().getUserId().toString());
+
+ // 自定义流程状态扩展,flowStatus与hisStatus可以不同
+ if (Objects.nonNull(flowStatus)) {
+ flowParams.flowStatus(flowStatus).hisStatus(flowStatus);
+ }
+
+ Instance instance = insService.start(id, flowParams);
+ }
+```
+
+## 2、流程跳转
+
+```java
+ // 自定义流程状态扩展,flowStatus与hisStatus可以不同
+ if (Objects.nonNull(flowStatus)) {
+ flowParams.flowStatus(flowStatus).hisStatus(flowStatus);
+ }
+ Instance instance = insService.skipByInsId(testLeave.getInstanceId(), flowParams);
+```
+
+```java
+ // 自定义流程状态扩展,flowStatus与hisStatus可以不同
+ if (Objects.nonNull(flowStatus)) {
+ flowParams.flowStatus(flowStatus).hisStatus(flowStatus);
+ }
+ Instance instance = taskService.skip(taskId, flowParams);
+```
+
+## 3、其他请查阅核心api
diff --git a/src/v1.3.2/guide/datafillhandler.md b/src/v1.3.2/guide/datafillhandler.md
new file mode 100644
index 0000000..c01decc
--- /dev/null
+++ b/src/v1.3.2/guide/datafillhandler.md
@@ -0,0 +1,61 @@
+# 填充器
+> [!IMPORTANT]
+> 1、如果觉得内置的id、创建时间和更新时间自动生成规则,不符合业务要求,可通过填充器覆盖
+
+## 1、自定义填充器,并继承DataFillHandler
+```java
+public class CustomDataFillHandler implements DataFillHandler {
+
+ @Override
+ public void idFill(Object object) {
+ RootEntity entity = (RootEntity) object;
+ if (ObjectUtil.isNotNull(entity)) {
+ if (Objects.isNull(entity.getId())) {
+ entity.setId(IdUtils.nextId());
+ }
+ }
+ }
+
+ @Override
+ public void insertFill(Object object) {
+ RootEntity entity = (RootEntity) object;
+ if (ObjectUtil.isNotNull(entity)) {
+ Date date = ObjectUtil.isNotNull(entity.getCreateTime())? entity.getCreateTime() : new Date();
+ entity.setCreateTime(date);
+ entity.setUpdateTime(date);
+ }
+ }
+
+ @Override
+ public void updateFill(Object object) {
+ RootEntity entity = (RootEntity) object;
+ if (ObjectUtil.isNotNull(entity)) {
+ entity.setUpdateTime(ObjectUtil.isNotNull(entity.getUpdateTime()) ? entity.getCreateTime() : new Date());
+ }
+ }
+}
+
+```
+
+## 2、注入bean
+### 2.1、通过@Component方式注入
+
+### 2.2、yaml配置方式
+```yml
+# warm-flow工作流配置
+warm-flow:
+ # 填充器,内部有默认实现,如果不满足实际业务,可通过此配置自定义实现
+ data-fill-handler-path: com.ruoyi.system.handle.CustomDataFillHandler
+```
+
+### 2.3、@Configuration+@Bean配置方式
+```java
+@Configuration
+public class WarmFlowConfig {
+
+ @Bean
+ public DataFillHandler dataFillHandler() {
+ return new CustomDataFillHandler();
+ }
+}
+```
diff --git a/src/v1.3.2/guide/designerIntroduced.md b/src/v1.3.2/guide/designerIntroduced.md
new file mode 100644
index 0000000..e3af64d
--- /dev/null
+++ b/src/v1.3.2/guide/designerIntroduced.md
@@ -0,0 +1,459 @@
+# 设计器引入
+> [!IMPORTANT]
+> 1、为了方便业务系统快速引入设计器,不需要搬运并且适配等工作
+> 2、可以按照本文中介绍的,使用设计器,并快速接入业务系统
+> 3、设计原理采取不分离的方式,把设计器打包的jar包中,以接口和静态资源的方式引入
+
+## 1. 引入依赖
+
+```xml
+
+ org.dromara
+ warm-flow-plugin-ui-sb-web
+ 版本号
+
+```
+
+## 2. 后端放行部分路径
+> 这个路径需要放行,否则无法访问,`/warm-flow-ui/**`
+
+### 2.1 spring-security 放行配置
+
+
+```java
+@Bean
+protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception
+{
+ return httpSecurity
+ .......
+ // 注解标记允许匿名访问的url
+ .authorizeHttpRequests((requests) -> {
+ // 后端请求,静态资源,可匿名访问
+ requests.antMatchers("/warm-flow-ui/**", "/warm-flow/**").permitAll()
+ // 除上面外的所有请求全部需要鉴权认证
+ .anyRequest().authenticated();
+ })
+ ......
+ .build();
+}
+```
+
+
+### 2.2 shiro 放行配置
+
+
+```java
+@Configuration
+public class ShiroConfig {
+
+ /**
+ * Shiro过滤器配置
+ */
+ @Bean
+ public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
+ CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean();
+ ......
+ // 后端请求,静态资源,可匿名访问
+ LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>();
+ filterChainDefinitionMap.put("/warm-flow-ui/**", "anon");
+ filterChainDefinitionMap.put("/warm-flow/**", "anon");
+
+ shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+ return shiroFilterFactoryBean;
+ }
+}
+```
+
+
+### 2.3 sa-token 放行配置
+
+```java
+@Configuration
+public class SaTokenConfigure implements WebMvcConfigurer {
+ // 注册拦截器
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
+ .addPathPatterns("/**")
+ // 以上是sa-token案例,下面才是需要排除的地址
+ .excludePathPatterns("/warm-flow-ui/**", "/warm-flow/**");
+ }
+}
+```
+
+## 3. 前端加载设计器
+> 1、设计器页面入口是访问后端地址(前后端不分离):`ip:port/warm-flow-ui/index?id=${definitionId}?disabled=${disabled}`
+
+### 3.2 vue2 引入
+
+- 首先传入设计器需要的流程定义definitionId和是否可编辑disabled参数
+- 本实例采用iframe方式嵌入设计器
+
+
+```vue
+
+
+
+
+
+
+
+```
+
+
+### 3.3 vue3 引入
+
+```vue
+
+
+
+
+
+
+
+
+
+
+```
+
+### 3.4 React版本 引入
+> 待完善
+
+### 3.5 前后端不分离版本
+- 可以直接访问后端接口加载页面,如:`ip:port/warm-flow-ui/index?id=${definitionId}?disabled=${disabled}`
+
+-
+```java
+@Controller
+@RequestMapping("/warm-flow")
+public class WarmFlowController
+{
+ @GetMapping()
+ public String index(String definitionId, Boolean disabled)
+ {
+ return redirect("/warm-flow-ui/index.html?id=" + definitionId + "&disabled=" + disabled);
+ }
+}
+```
+
+
+- 或者前端直接访问后端接口,如:`/warm-flow-ui/index.html?id=1839683148936663047&disabled=false`
+
+```javascript
+/*打开新的页签,加载设计器*/
+function detail(dictId) {
+ var url = prefix + '/detail/' + dictId;
+ $.modal.openTab("字典数据", "/warm-flow-ui/index.html?id=1839683148936663047&disabled=false");
+}
+
+```
+
+
+
+## 4. 设计器办理人权限数据接入
+> 给任务节点设置哪些权限的人可以办理,实现接口提供给设计器
+
+### 4.1 办理人权限选择弹框页面
+
+
+
+
+### 4.2 实现接口获取以上页面办理人权限数据
+
+#### 4.2.1 HandlerSelectService接口
+```java
+/**
+ * 流程设计器-获取办理人权限设置列表接口
+ *
+ * @author warm
+ */
+public interface HandlerSelectService {
+
+ /**
+ * 获取办理人权限设置列表tabs页签, 如:用户、角色和部门等
+ * @return tabs页签
+ */
+ List getHandlerType();
+
+ /**
+ * 获取办理人权限设置列表结果,如:用户列表、角色列表、部门列表等
+ * @param query 查询参数
+ * @return 结果
+ */
+ List getHandlerSelect(HandlerQuery query);
+}
+
+```
+
+
+#### 4.2.2 HandlerSelectServiceImpl实现类
+
+```java
+/**
+ * 流程设计器-获取办理人权限设置列表接口实现类
+ *
+ * @author warm
+ */
+@Component
+public class HandlerSelectServiceImpl implements HandlerSelectService {
+ @Autowired
+ private SysUserMapper userMapper;
+
+ @Autowired
+ private SysRoleMapper roleMapper;
+
+ @Autowired
+ private SysDeptMapper deptMapper;
+
+ /**
+ * 获取办理人权限设置列表tabs页签,如:用户、角色和部门等,可以返回其中一种或者多种,按业务需求决定
+ * @return tabs页签
+ */
+ @Override
+ public List getHandlerType() {
+ return Arrays.asList("用户", "角色", "部门");
+ }
+
+ /**
+ * 获取用户列表、角色列表、部门列表等,可以返回其中一种或者多种,按业务需求决定
+ * @param query 查询参数
+ * @return 结果
+ */
+ @Override
+ public HandlerSelectVo getHandlerSelect(HandlerQuery query) {
+
+ if ("角色".equals(query.getHandlerType())) {
+ return getRole(query);
+ }
+
+ if ("部门".equals(query.getHandlerType())) {
+ return getDept(query);
+ }
+
+ if ("用户".equals(query.getHandlerType())) {
+ return getUser(query);
+ }
+
+ return new HandlerSelectVo();
+ }
+
+ /**
+ * 获取角色列表
+ *
+ * @param query 查询条件
+ * @return HandlerSelectVo
+ */
+ private HandlerSelectVo getRole(HandlerQuery query) {
+ ......
+ // 查询角色列表
+ List roleList = roleMapper.selectRoleList(sysRole);
+ long total = new PageInfo<>(roleList).getTotal();
+
+ // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
+ HandlerFunDto handlerFunDto = new HandlerFunDto<>(roleList, total)
+ // 以下设置获取内置变量的Function
+ .setStorageId(role -> "role:" + role.getRoleId()) // 前面拼接role: 是为了防止用户、角色的主键重复
+ .setHandlerCode(SysRole::getRoleKey) // 权限编码
+ .setHandlerName(SysRole::getRoleName) // 权限名称
+ .setCreateTime(role -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, role.getCreateTime()));
+
+ return getHandlerSelectVo(handlerFunDto);
+ }
+
+ /**
+ * 获取用户列表
+ *
+ * @param query 查询条件
+ * @return HandlerSelectVo
+ */
+ private HandlerSelectVo getDept(HandlerQuery query) {
+ ......
+ // 查询部门列表
+ List deptList = deptMapper.selectDeptList(sysDept);
+ long total = new PageInfo<>(deptList).getTotal();
+
+ // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
+ HandlerFunDto handlerFunDto = new HandlerFunDto<>(deptList, total)
+ .setStorageId(dept -> "dept:" + dept.getDeptId()) // 前面拼接dept: 是为了防止用户、部门的主键重复
+ .setHandlerName(SysDept::getDeptName) // 权限名称
+ .setCreateTime(dept -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, dept.getCreateTime()));
+
+ return getHandlerSelectVo(handlerFunDto);
+
+ }
+
+ /**
+ * 获取用户列表, 同时构建左侧部门树状结构
+ *
+ * @param query 查询条件
+ * @return HandlerSelectVo
+ */
+ private HandlerSelectVo getUser(HandlerQuery query) {
+ ......
+ // 查询用户列表
+ List userList = userMapper.selectUserList(sysUser);
+ long total = new PageInfo<>(userList).getTotal();
+ // 查询部门列表,构建树状结构
+ List deptList = deptMapper.selectDeptList(new SysDept());
+
+ // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示
+ HandlerFunDto handlerFunDto = new HandlerFunDto<>(userList, total)
+ .setStorageId(user -> user.getUserId().toString())
+ .setHandlerCode(SysUser::getUserName) // 权限编码
+ .setHandlerName(SysUser::getNickName) // 权限名称
+ .setCreateTime(user -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, user.getCreateTime()))
+ .setGroupName(user -> user.getDept() != null ? user.getDept().getDeptName() : "");
+
+ // 业务系统机构,转成组件内部左侧树列表能够显示的数据
+ TreeFunDto treeFunDto = new TreeFunDto<>(deptList)
+ .setId(dept -> dept.getDeptId().toString()) // 左侧树ID
+ .setName(SysDept::getDeptName) // 左侧树名称
+ .setParentId(dept -> dept.getParentId().toString()); // 左侧树父级ID
+
+ return getHandlerSelectVo(handlerFunDto, treeFunDto);
+ }
+}
+```
+
+## 5. 共享后端权限(如token)
+- 后端放行路径`/warm-flow-ui/**,/warm-flow/**`,改为只放行一个`/warm-flow-ui/**`
+- 加载设计器页面路径`/warm-flow-ui/index.html?id=${definitionId}&disabled=${disabled}`,在后面追加&token=${token},token是业务系统的token
+
+
+## 6. 设计器二开
+### 6.1 下载设计器源码,改造
+
+- 如果内置的接口不满足或者不够支持实际业务开发,可在业务系统中增加接口,设计器配置该接口地址
+
+
+
+
+### 6.2 源码调试
+- 设计器需要配置业务系统的代理地址,否则无法访问业务系统
+- 独立启动该设计器
+
+
+
+
+### 6.3 部署
+#### 6.3.1 先排除原依赖的前端代码
+
+```xml
+
+ org.dromara
+ warm-flow-plugin-ui-sb-web
+
+
+ warm-flow-plugin-vue3-ui
+ org.dromara
+
+
+
+```
+
+#### 6.3.2 设计器不分离部署(部署方案一)
+- 打包项目,把打包后的文件`dist`复制到业务系统`src/main/META-INF/resources`目录下,改名为warm-flow-ui
+- 独立服务
+
+
+
+#### 6.3.2 设计器独立部署/分离部署(部署方案二)
+- 打包项目,把打包后的文件`dist`复制到nginx的html目录下,改名为warm-flow-ui
+- 访问地址改为(请注意地址少了`/warm-flow-ui`):http://localhost:81/index.html?id=xxx&disabled=false
+
+**nginx配置示例**
+
+```config
+server {
+ listen 82;
+ server_name localhost;
+
+ location / {
+ root D:/software/nginx-1.16.1/html/warm-flow-ui;
+ try_files $uri $uri/ /index.html;
+ index index.html index.htm;
+ }
+
+ location /warm-flow-ui/ {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header REMOTE-HOST $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_pass http://localhost:8080/warm-flow-ui/;
+ }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root html;
+ }
+}
+```
diff --git a/src/v1.3.2/guide/expression.md b/src/v1.3.2/guide/expression.md
new file mode 100644
index 0000000..c3ec31d
--- /dev/null
+++ b/src/v1.3.2/guide/expression.md
@@ -0,0 +1,68 @@
+# 条件表达式
+
+## 1、内置表达式
+- 1、大于
+- 2、大于等于
+- 3、等于
+- 4、不等于
+- 5、小于
+- 6、小于等于
+- 7、包含
+- 8、不包含
+- 9、SpEL
+- 10、自定义表达式
+
+
+## 2、Spring Expression Language(SpEL)
+- 前端配置如`#{@user.eval(#flag)}`表达式,入库前要拼接前缀,方便区分表达式类型,最终为`@@spel@@|#{@user.eval(#flag)}`
+- `#flag`为变量和以下方法入参命名一致,可不设置入参
+
+
+
+```java
+@Component("user")
+public class User {
+
+ /**
+ * spel条件表达:判断大于等4
+ * @param flag 待判断的字符串
+ * @return boolean
+ */
+ public boolean eval(String flag) {
+ BigDecimal a = new BigDecimal(flag);
+ BigDecimal b = new BigDecimal("4");
+ return a.compareTo(b) > 0;
+ }
+}
+
+/**
+ * 新增OA 请假申请
+ *
+ * @param testLeave OA 请假申请
+ * @return 结果
+ */
+@Override
+public int insertTestLeave(TestLeave testLeave, String flowStatus)
+{
+ FlowParams flowParams = FlowParams.build().flowCode(getFlowType(testLeave));
+ // 流程变量
+ Map variable = new HashMap<>();
+ variable.put("flag", String.valueOf(testLeave.getDay()));
+ flowParams.variable(variable);
+
+ Instance instance = insService.start(id, flowParams);
+ return instance != null? 1 : 0;
+}
+```
+
+## 3、自定义表达式
+
+**1、扩展需要实现`ExpressionStrategy`接口或者继承`ExpressionStrategyAbstract`抽象类**
+**2、并且通过这个方法进行注册ExpressionUtil.setExpression**
+
+
+
+ |
+ |
+
+
diff --git a/src/v1.3.2/guide/flowchart.md b/src/v1.3.2/guide/flowchart.md
new file mode 100644
index 0000000..baa51b3
--- /dev/null
+++ b/src/v1.3.2/guide/flowchart.md
@@ -0,0 +1,7 @@
+# 流程图
+
+流程图根据前端返回的节点坐标,通过后端Graphics2D进行绘制,最终返回图片给前端展示
+
+![输入图片说明](https://foruda.gitee.com/images/1703669461653266881/c3ddafb1_2218307.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1703669506555479009/bd1b51cf_2218307.png "屏幕截图")
\ No newline at end of file
diff --git a/src/v1.3.2/guide/form.md b/src/v1.3.2/guide/form.md
new file mode 100644
index 0000000..cbb860f
--- /dev/null
+++ b/src/v1.3.2/guide/form.md
@@ -0,0 +1,3 @@
+# 表单管理
+
+
diff --git a/src/v1.3.2/guide/jsonlib.md b/src/v1.3.2/guide/jsonlib.md
new file mode 100644
index 0000000..72ad9d0
--- /dev/null
+++ b/src/v1.3.2/guide/jsonlib.md
@@ -0,0 +1,56 @@
+# json库扩展
+
+> [!IMPORTANT]
+> 1、目前支持Snack3、Jackson、fastjson和Gson四种json库
+
+## json库扩展
+- 扩展json库需要实现`JsonConvert`接口,并实现`strToMap`和`mapToStr`方法
+- 并通过spi机制加载,可参照`warm-flow-plugin-json`模块
+- 在resource目录下新建`META-INF\services`文件夹,并在该文件夹下新建文件`org.dromara.warm.flow.core.json.JsonConvert`, 配置实现类的全限定名,如`org.dromara.warm.plugin.json.JsonConvertJackson`
+
+```java
+public class JsonConvertJackson implements JsonConvert {
+
+ private static final Logger log = LoggerFactory.getLogger(JsonConvertJackson.class);
+
+ /**
+ * 将字符串转为map
+ * @param jsonStr json字符串
+ * @return map
+ */
+ @Override
+ public Map strToMap(String jsonStr) {
+ if (StringUtils.isNotEmpty(jsonStr)) {
+ ObjectMapper objectMapper = new ObjectMapper();
+ try {
+ return objectMapper.readValue(jsonStr, TypeFactory.defaultInstance().constructMapType(Map.class, String.class, Object.class));
+ } catch (IOException e) {
+ log.error("json转换异常", e);
+ throw new FlowException("json转换异常");
+ }
+ }
+ return new HashMap<>();
+ }
+
+ /**
+ * 将map转为字符串
+ * @param variable map
+ * @return json字符串
+ */
+ @Override
+ public String mapToStr(Map variable) {
+ if (MapUtil.isNotEmpty(variable)) {
+ // 创建 ObjectMapper 实例
+ ObjectMapper objectMapper = new ObjectMapper();
+ try {
+ return objectMapper.writeValueAsString(variable);
+ } catch (Exception e) {
+ log.error("Map转换异常", e);
+ throw new FlowException("Map转换异常");
+ }
+ }
+ return null;
+ }
+
+}
+```
diff --git a/src/v1.3.2/guide/listener.md b/src/v1.3.2/guide/listener.md
new file mode 100644
index 0000000..9fc3f03
--- /dev/null
+++ b/src/v1.3.2/guide/listener.md
@@ -0,0 +1,216 @@
+# 监听器
+> [!IMPORTANT]
+> 1、在办理流程过程中,通过监听器,监听办理过程的不同环节,进行业务处理,功能增强。
+
+## 1、监听器类型
+> [!IMPORTANT]
+> create:创建监听器,任务创建时执行
+> start:开始监听器,任务开始办理时执行
+> permission:权限监听器,办理任务动态设置权限(后续不建议用)
+> assignment: 分派办理人监听器,动态修改代办任务信息
+> finish:结束监听器,当前任务完成后执行
+
+## 2、全局监听器和局部监听器
+> [!IMPORTANT]
+> 全局监听器和某个流程定义有关,局部监听器和某个节点有关
+> 执行顺序:优先执行局部监听器,然后执行全局监听器
+> 全局监听器:在流程定义中配置,所有节点任务都会执行
+> 局部监听器:在流程节点中配置,只有指定节点任务才会执行
+
+
+
+## 2、监听器生命周期图
+
+
+## 3、监听器使用
+### 3.1、实现以下接口
+```java
+/**
+ * 监听器接口
+ */
+public interface Listener extends Serializable {
+
+ /** 创建监听器,任务创建时执行 */
+ String LISTENER_CREATE = "create";
+
+ /** 开始监听器,任务开始办理时执行 */
+ String LISTENER_START = "start";
+
+ /**
+ * 结束监听器,当前任务完成后执行
+ */
+ String LISTENER_END = "finish";
+
+ /** 分派监听器,动态修改代办任务信息 */
+ String LISTENER_ASSIGNMENT = "assignment";
+
+ /** 权限监听器,办理任务动态设置权限(1.2.4版本后建议使用分派监听器修改办理人) */
+ String LISTENER_PERMISSION = "permission";
+
+ void notify(ListenerVariable variable);
+}
+
+```
+
+### 3.2、开始监听器实现类例子
+通过@Component或者@Bean注解注入到容器
+```java
+@Component
+public class GlobalStartListener implements Listener {
+
+
+ private static final Logger log = LoggerFactory.getLogger(GlobalStartListener.class);
+
+ /**
+ * 设置办理人id、所拥有的权限等操作,也可以放到业务代码中办理前设置,或者局部监听器
+ * @param listenerVariable 监听器变量
+ */
+ @Override
+ public void notify(ListenerVariable listenerVariable) {
+ log.info("全局开始监听器");
+
+ FlowParams flowParams = listenerVariable.getFlowParams();
+ LoginUser user = SecurityUtils.getLoginUser();
+ // 设置当前办理人id
+ flowParams.setHandler(user.getUser().getUserId().toString());
+
+ // 设置办理人所拥有的权限,比如角色、部门、用户等
+ List permissionList = flowParams.getPermissionFlag();
+ if (StringUtils.isEmpty(permissionList)) {
+ permissionList = new ArrayList<>();
+ }
+
+ List roles = user.getUser().getRoles();
+ if (Objects.nonNull(roles)) {
+ permissionList.addAll(roles.stream().map(role -> "role:" + role.getRoleId()).collect(Collectors.toList()));
+ }
+ permissionList.add("dept:" + SecurityUtils.getLoginUser().getUser().getDeptId());
+ permissionList.add(user.getUser().getUserId().toString());
+ flowParams.setPermissionFlag(permissionList);
+
+ log.info("全局开始监听器结束;{}", "开启流程完成");
+ }
+}
+```
+
+### 3.3、完成监听器实现类例子
+```java
+@Component
+public class GlobalFinishListener implements Listener {
+
+
+ private static final Logger log = LoggerFactory.getLogger(GlobalFinishListener.class);
+
+ @Resource
+ private TestLeaveMapper testLeaveMapper;
+
+ /**
+ * 业务表新增或者更新操作,也可以放到业务代码中办理完成后,或者局部监听器
+ * @param listenerVariable 监听器变量
+ */
+ @Override
+ public void notify(ListenerVariable listenerVariable) {
+ log.info("全局完成监听器");
+ Instance instance = listenerVariable.getInstance();
+ Map variable = listenerVariable.getVariable();
+ Object o = variable.get("businessData");
+
+ // 更新业务数据
+ if (ObjectUtil.isNotNull(o)) {
+ // 可以统一使用一个全局监听器,不同实体类,不同的操作
+ if (o instanceof TestLeave) {
+ TestLeave testLeave = (TestLeave) o;
+ testLeave.setNodeCode(instance.getNodeCode());
+ testLeave.setNodeName(instance.getNodeName());
+ testLeave.setNodeType(instance.getNodeType());
+ testLeave.setFlowStatus(instance.getFlowStatus());
+ // 如果没有实例id,说明是新增
+ if (ObjectUtil.isNull(testLeave.getInstanceId())) {
+ testLeave.setInstanceId(instance.getId());
+ testLeaveMapper.insertTestLeave(testLeave);
+ testLeave.setCreateTime(DateUtils.getNowDate());
+ // 新增抄送人方法,也可发送通知
+ if (StringUtils.isNotNull(testLeave.getAdditionalHandler())) {
+ List users = FlowFactory.userService().structureUser(instance.getId()
+ , testLeave.getAdditionalHandler(), "4");
+ FlowFactory.userService().saveBatch(users);
+ }
+ } else {
+ testLeave.setUpdateTime(DateUtils.getNowDate());
+ testLeaveMapper.updateTestLeave(testLeave);
+ }
+ }
+ }
+
+ log.info("全局完成监听器结束;{}", "任务完成");
+ }
+}
+```
+
+### 3.4、分派监听器实现类例子
+如下图中示例可以很容易实现
+
+
+
+- 注意:
+ - 上个节点分派监听器修改:执行时修改【下个节点配置权限策略】
+ - 下个节点配置权限策略:可设置自定义权限策略,比如发起人审批,部门领导审批等
+```java
+@Component
+public class AssignmentListener implements Listener {
+
+ private static final Logger log = LoggerFactory.getLogger(AssignmentListener.class);
+
+ @Override
+ public void notify(ListenerVariable variable) {
+ log.info("分派监听器开始执行......");
+ List tasks = variable.getNextTasks();
+ Instance instance = variable.getInstance();
+ for (Task task : tasks) {
+ List permissionList = task.getPermissionList();
+ // 如果设置了发起人审批,则需要动态替换权限标识
+ for (int i = 0; i < permissionList.size(); i++) {
+ String permission = permissionList.get(i);
+ if (StringUtils.isNotEmpty(permission) && permission.contains(FlowCons.WARMFLOWINITIATOR)) {
+ permissionList.set(i, permission.replace(FlowCons.WARMFLOWINITIATOR, instance.getCreateBy()));
+ }
+ }
+ }
+ log.info("分派监听器执行结束......");
+ }
+}
+```
+
+### 3.5、创建监听器
+就是在下一个任务生成前执行,比如创建任务前需要初始化信息或者校验数据是否合法
+
+### 3.6、页面配置全局或局部监听器
+#### 3.6.1、局部监听器(流程节点配置)
+
+传递后台通过`@@`分割不同监听器,监听器类型和监听器路径,上下一一对应
+
+
+
+#### 3.6.1、全局监听器(流程定义配置)
+
+
+
+## 4、监听器参数使用
+
+页面配置监听器时加上类路径
+
+
+
+```java
+ public void notify(ListenerVariable variable) {
+ Instance instance = variable.getInstance();
+ Map variableMap = variable.getVariable();
+ // 拿到json后使用序列化可以拿到配置信息
+ Map variableMap = variable.getVariable();
+ if (MapUtil.isNotEmpty(variableMap)) {
+ Object o = variableMap.get(FlowCons.WARM_LISTENER_PARAM);
+ HashMap hashMap = JSONObject.parseObject(JSONObject.toJSONString(o), HashMap.class);
+ }
+ log.info("创建监听器结束");
+ }
+```
diff --git a/src/v1.3.2/guide/logicdelete.md b/src/v1.3.2/guide/logicdelete.md
new file mode 100644
index 0000000..3220add
--- /dev/null
+++ b/src/v1.3.2/guide/logicdelete.md
@@ -0,0 +1,41 @@
+# 逻辑删除
+
+## 1、Mybatis-plus
+> [!IMPORTANT]
+> 1、Mybatis-plus只支持自身的逻辑删除方式, 默认开启,目前不支持关闭
+> 2、默认逻辑未删除值:0,逻辑已删除值:1
+> 3、如需修改默认值,请参考如下配置文件中进行修改
+
+### 1.1、spring
+```yml
+# mybatis-plus配置
+mybatis-plus:
+ global-config:
+ db-config:
+ logic-delete-value: 2 # 逻辑已删除值
+ logic-not-delete-value: 0 # 逻辑未删除值
+```
+
+### 1.2、solon
+
+```yaml
+# 配置数据源对应的 mybatis 信息(要与 DataSource bean 的名字对上)
+mybatis.db1:
+ globalConfig: #全局配置(要与 GlobalConfig 类的属性一一对应)
+ banner: false
+ logicDeleteValue: 2 # 逻辑已删除值
+ logicNotDeleteValue: 0 # 逻辑未删除值
+```
+
+## 2、通用逻辑删除
+
+```yaml
+# warm-flow工作流配置
+warm-flow:
+ # 是否开启逻辑删除(orm框架本身不支持逻辑删除,可通过这种方式开启,比如jpa)
+ logic_delete: true
+ # 逻辑删除字段值(开启后默认为2)
+ logic_delete_value: 2
+ # 逻辑未删除字段(开启后默认为0)
+ logic_not_delete_value: 0
+```
diff --git a/src/v1.3.2/guide/ormusagetips.md b/src/v1.3.2/guide/ormusagetips.md
new file mode 100644
index 0000000..8cd23c7
--- /dev/null
+++ b/src/v1.3.2/guide/ormusagetips.md
@@ -0,0 +1,83 @@
+# orm扩展包使用技巧
+- **常规增删改查可以通过注入方式,或者工具类获取service**
+```java
+// 第一种
+@Resource
+private DefService defService;
+
+// 第二种
+FlowFactory.defService()
+```
+- **但是由于不同orm框架的数据库操作的,接口使用方式不一致,所以可以通过以下方式获取对应的使用入口。**
+
+## 1、mybatis-plus
+
+**获取组件中的mapper,使用mybaits-plus的自带方法**
+```java
+
+// 第一种方式
+@Resource
+private FlowTaskMapper taskMapper;
+
+// 第二种方式
+FlowTaskMapper taskMapper = FrameInvoker.getBean(FlowTaskMapper.class);
+```
+
+## 2、JPA
+
+**注入 unitName=warm-flow-jpa EntityManager entityManager 对象**
+
+```java
+@PersistenceContext(unitName = "warm-flow-jpa")
+protected EntityManager entityManager;
+```
+**通过上述注解获取工作流组件内各Entity访问能力**
+```xml
+
+ org.dromara.warm.flow.orm.entity.FlowDefinition
+ org.dromara.warm.flow.orm.entity.FlowHisTask
+ org.dromara.warm.flow.orm.entity.FlowInstance
+ org.dromara.warm.flow.orm.entity.FlowNode
+ org.dromara.warm.flow.orm.entity.FlowSkip
+ org.dromara.warm.flow.orm.entity.FlowTask
+ org.dromara.warm.flow.orm.entity.FlowUser
+
+```
+**以下为主要接口示例,更多接口请参考 EntityManager 接口**
+```java
+@PersistenceContext(unitName = "warm-flow-jpa")
+protected EntityManager entityManager;
+
+FlowDefinition entity = dao.newEntity();
+// entity 字段填充
+// 持久化保存数据
+entityManager.persist(entity);
+
+// 通过主键查找数据
+FlowDefinition existEntity = entityManager.find(FlowDefinition.class, 1l);
+
+// 复杂查询语句通过 CriteriaQuery criteriaQuery
+CriteriaQuery criteriaQuery = ...
+// select语句获取结果
+entityManager.createQuery(criteriaQuery).getResultList();
+
+// 更新操作使用 CriteriaUpdate criteriaUpdate
+CriteriaUpdate criteriaUpdate = ...
+entityManager.createQuery(criteriaUpdate).executeUpdate()
+```
+**JPA注意事项** JPA涉及持久化操作必须开启事务 @Transactional(spring) @Tran(solon)
+
+
+## 3、mybatis-flex
+
+**获取组件中的mapper,使用mybaits-flex的自带方法**
+```java
+
+// 第一种方式
+@Resource
+private FlowTaskMapper taskMapper;
+
+// 第二种方式
+FlowDefinitionMapper definitionMapper = FrameInvoker.getBean(FlowDefinitionMapper.class);
+
+```
diff --git a/src/v1.3.2/guide/processdemo.md b/src/v1.3.2/guide/processdemo.md
new file mode 100644
index 0000000..d482850
--- /dev/null
+++ b/src/v1.3.2/guide/processdemo.md
@@ -0,0 +1,94 @@
+# 功能演示
+**以下演示基于项目示例hh-vue**
+> [!IMPORTANT]
+> 以下演示基于项目示例hh-vue
+
+## 演示图
+
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+
+
+## 1、新增定义
+
+流程编码和流程版本:确定唯一
+
+审批表单路径:记录待办任务需要显示的待办信息页面,点击待办时候获取这个路径,动态加载这个页面
+
+![输入图片说明](https://foruda.gitee.com/images/1703667450784737720/940b2bab_2218307.png "屏幕截图")
+
+## 2、流程设计
+### 2、1节点设置
+配置节点名称,协作方式(会签、票签和或签),节点权限,是否任意调整,监听器等
+
+![](../../.vuepress/public/defNode.png)
+
+### 2、2跳转线设置
+配置跳转名称,跳转类型(通过还是退回),**退回不能选择通过类型**,调整条件
+
+![](../../.vuepress/public/defSkip.png)
+![](https://foruda.gitee.com/images/1726905626290177483/195615fc_2218307.png)
+## 3、开启流程实例
+
+hh-vue项目已经准备了七套流程,以及开启流程代码,开启流程会直接执行到开始节点后一个节点
+
+![](../../.vuepress/public/addIns.png)
+
+
+## 4、提交流程
+
+提交流程后,流程流转到代表任务,由流程设计中的对应权限人去办理
+
+![输入图片说明](https://foruda.gitee.com/images/1703668493778770778/d77716b5_2218307.png "屏幕截图")
+
+
+## 5、办理流程
+
+如果是互斥网关则会判断是否满足条件
+
+![输入图片说明](https://foruda.gitee.com/images/1703668882786849328/0b9554ec_2218307.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1703668896500858952/c9dc78e1_2218307.png "屏幕截图")
+
+## 6、驳回流程
+
+![输入图片说明](https://foruda.gitee.com/images/1703669345903195445/4ba131bc_2218307.png "屏幕截图")
diff --git a/src/v1.3.2/guide/processrule.md b/src/v1.3.2/guide/processrule.md
new file mode 100644
index 0000000..a23d4ee
--- /dev/null
+++ b/src/v1.3.2/guide/processrule.md
@@ -0,0 +1,56 @@
+# 流程规则
+
+## 1、术语
+1. 跳转类型:PASS-审批通过,REJECT-驳回。
+1. 跳转条件:根据跳转条件,判断要执行哪个分支,比如“请假天数小于4”。
+1. 节点类型:0-开始节点,1-中间节点,2-结束节点。
+1. 权限标识:权限类型:权限标识,可以多个,如“role:3” , “1,role:3,role:1”或者“1,role:3,dept:1”。
+1. 所属并行网关节点编码:离上次最近的并行网关节点编码,可传递,遇新网关重置。
+1. 协作类型:
+
+```
+APPROVAL-无:无其他协作方式
+TRANSFER-转办:任务转给其他人办理
+DEPUTE-委派:求助其他人审批,然后参照他的意见决定是否审批通过
+COUNTERSIGN-会签:和其他人一起审批通过,才算通过
+VOTE-票签:和部分人一起审批,达到一定通过率,才算通过
+ADD_SIGNATURE-加签:办理中途,希望其他人一起参与办理
+REDUCTION_SIGNATURE-减签:办理中途,希望某些人不参与办理
+
+```
+
+
+
+## 2、通用规则
+1. 开始节点和结束节点必须有。
+1. 开始节点必须有且只有一个跳转条件(跳转节点),中间和网关节点必须有跳转条件,结束节点不需要。
+1. 网关节点可不需要跳转类型,互斥网关按照跳转条件流转。
+1. 开启流程是传入租户id,就可以后续就可以根据租户id过来任务。
+1. 角色权限控制,非必填,流程定义时通过逗号隔开多个权限,流转是传入“1,role:3” , “1,role:3,role:1”或者“1,role:3,dept:1”,进行控制。
+1. 当流程有多个结束节点,有一个完成,流程实例就算完成
+1. 网关节点不可直连。
+1. 一票否决(谨慎使用),如果驳回,驳回指向节点后还存在其他正在执行的待办任务,转历史任务,状态都为失效,重走流程。
+1. 中间节点不可通过或者驳回到多个中间节点,必须先流转到网关节点
+1. 流程变量是全局都能获取,任务变量就当前任务触发的监听器时可以获取。
+
+## 3、流程状态
+1. 待提交:开启流程后的状态
+1. 审批中:提交审批后的状态
+1. 驳回:就是点击驳回后的状态
+1. 失效:是针对并行流程,流程完成后,还存在待办任务,把它转历史记录,历史记录状态无效
+1. 审批通过:是任务完成后,待办任务转为历史记录,历史记录状态为审批通过
+1. 已完成:流程结束的状态
+
+## 4、串行网关规则
+1. 以串行网关开头,只会执行后面的一条任务路线,以串行网关结尾,只需前面的一条路线完成即可往下执行(最主要限制)。
+1. 串行网关需要根据传入跳转条件去判断执行哪个任务路线。
+
+
+## 5、并行网关规则
+1. 以并行网关开头,只会必须执行后面的所有任务路线,以并行网关结尾,前面的任务路线必须都完成即可往下执行(最主要限制)。
+1. 当流程完成,并行网关范围内还存在待办任务未完成,转历史任务,状态完成。
+
+## 6、流程协作规则
+1. 或签:待办任务有一个"**审批**"/"**回退**"操作即完成当前任务,或签待办权限支持个人、部门、角色及用户自定义类型
+1. 会签:待办任务所有待办人都进行"**审批**"当前任务执行"**审批**"通过逻辑,会签中任意一待办人进行"**回退**"则整个任务执行"**回退**"逻辑,会签所有待办权限只支持个人类型
+1. 票签:此时根据"**审批**"**/**"**回退**"操作自动计算"**审批通过率(已审批人数/任务总人数)**"与"**回退驳回率(已回退人数/任务总人数)**","**审批通过率**"**大于等于**流程设计时指定的"**票签通过率**"执行"**审批**"通过逻辑,"**回退驳回率**"大于"**1-票签通过率**"执行"**回退**"逻辑,票签所有待办权限只支持个人
diff --git a/src/v1.3.2/guide/processterm.md b/src/v1.3.2/guide/processterm.md
new file mode 100644
index 0000000..0b1dd56
--- /dev/null
+++ b/src/v1.3.2/guide/processterm.md
@@ -0,0 +1,18 @@
+# 流程术语
+| 序 号 | 术语 | 术语解释 |
+|------|------|-------------------------------------------------------------------|
+| 1 | 审批 | 当前节点处理人,对当前流程节点进行审核操作,完成后进入下一节点 |
+| 2 | 回退 | 当前节点处理人,将流程驳回至之前已经处理过的任务节点,要求重新处理 |
+| 2 | 任意跳转 | 任意跳转(通过或者退回)指定节点 |
+| 3 | 委派 | 当前节点处理人,将自己的主办或者经办权限转移委派至别的用户代为处理,处理完后回到当前处理人手中,并由当前处理人处理完后进入下一节点 |
+| 4 | 转办 | 当前节点处理人,将操作权限转给别人处理,处理完后进入下一节点(自己不再处理) |
+| 5 | 催办 | 对于时效要求高的流程,发起人可催办提醒当前节点处理人,一般以消息通知方式提醒处理人 |
+| 7 | 取回 | 将工作流中的某个任务退回给之前的执行者,以便进行修改或重新处理 |
+| 8 | 终止 | 当前节点处理人,终止当前流程 |
+| 9 | 抄送 | 当前节点处理人,处理完成之后将处理结果抄送给其他人 |
+| 10 | 加签 | 当前节点处理人,需要增加他人参与审批 |
+| 11 | 减签 | 当前节点处理人,需要减少他人参与审批 |
+| 12 | 会签 | 会签就是指在流程管理中发起人可以同时对多个人发起会签,多个人可以同时处理,只有所有负责人审批通过,审批节点才会通过。 |
+| 13 | 或签 | 一名负责人通过即可通过审批节点 |
+| 14 | 暂存 | 复杂表单,一次性填写不完,需要保存草稿功能,开始节点的暂存 |
+
diff --git a/src/v1.3.2/guide/started.md b/src/v1.3.2/guide/started.md
new file mode 100644
index 0000000..6699c34
--- /dev/null
+++ b/src/v1.3.2/guide/started.md
@@ -0,0 +1,268 @@
+# 快速开始
+
+> [!IMPORTANT]
+> **在开始之前,我们假定您已经:**
+>
+> 1、熟悉 Java 环境配置及其开发
+> 2、熟悉 关系型 数据库,比如 MySQL
+> 3、熟悉 Spring Boot或者Solon 及相关框架
+> 4、熟悉 Java 构建工具,比如 Maven
+
+## 1、导入sql,按需求执行
+
+- 首次导入,先创建数据库,找到对应数据库的全量脚本[warm-flow-all.sql](https://gitee.com/dromara/warm-flow/tree/master/sql/mysql),执行
+- 如果版本更新,找到对应数据库的更新版本,比如xx-upgrade,[warm-flow_x.x.x.sql](https://gitee.com/dromara/warm-flow/tree/master/sql/mysql/v1-upgrade),执行
+
+
+
+ |
+ |
+
+
+
+## 2、官网流程定义案例xml
+
+[官网流程定义案例xml](https://gitee.com/dromara/warm-flow-test/tree/master/warm-flow-core-test/src/main/resources)
+
+
+## 3、maven依赖
+### 3.1、mybatis
+**springboot2项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-sb-starter
+ 1.3.2
+
+```
+
+**springboot3项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-sb3-starter
+ 1.3.2
+
+```
+
+**solon项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-solon-plugin
+ 1.3.2
+
+```
+
+### 3.2、mybatis-plus
+**springboot2项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-plus-sb-starter
+ 1.3.2
+
+```
+
+**springboot3项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-plus-sb3-starter
+ 1.3.2
+
+```
+
+**solon项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-plus-solon-plugin
+ 1.3.2
+
+```
+
+### 3.3、jpa
+**warm-flow工作流配置**
+```yml
+# warm-flow工作流配置
+warm-flow:
+ # 当使用JPA时指定JpaPersistenceProvider
+ jpa_persistence_provider: org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider
+```
+
+**springboot2项目**
+
+```xml
+
+ org.dromara
+ warm-flow-jpa-sb-starter
+ 1.3.2
+
+```
+
+**solon项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-plus-solon-plugin
+ 1.3.2
+
+```
+
+### 3.4、mybatis-flex
+**springboot2项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-flex-sb-starter
+ 1.3.2
+
+```
+
+**springboot3项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-flex-sb3-starter
+ 1.3.2
+
+```
+
+**solon项目**
+
+```xml
+
+ org.dromara
+ warm-flow-mybatis-flex-solon-plugin
+ 1.3.2
+
+```
+
+### 3.5、easy-query
+**springboot项目**
+
+```xml
+
+ org.dromara
+ warm-flow-easy-query-sb-starter
+ 1.3.2
+
+```
+
+**solon项目**
+
+```xml
+
+ org.dromara
+ warm-flow-easy-query-solon-plugin
+
+
+ org.noear
+ solon.data
+
+
+ org.noear
+ solon.logging
+
+
+ 1.3.2
+
+```
+
+## 4、支持数据库类型
+
+* [x] mysql
+* [x] oracle
+* [x] postgresql
+* [ ] 达梦
+* [ ] 人大金仓
+* [ ] GaussDB
+* [ ] oceanbase
+* [ ] sqlserver
+* [ ] ......
+
+
+## 5、支持orm框架类型
+* [x] mybatis
+* [x] mybatis-plus
+* [x] jpa
+* [x] easy-query
+* [x] mybatis-flex
+* [ ] ......
+
+> **有想扩展其他orm框架和数据库的可加qq群联系群主**
+
+## 6、设计器引入
+> 通过jar包引入:[文档地址](./designerIntroduced.md)
+
+## 7、代码示例
+
+> 详细案例测试代码[warm-flow-test](https://gitee.com/dromara/warm-flow-test)项目中,warm-flow-xxx-test模块的测类
+
+**以下为简短案例:**
+
+### 7.1、部署流程
+
+```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());
+ }
+```
+
+### 7.2、发布流程
+
+```java
+public void publish() throws Exception {
+ defService.publish(1212437969554771968L);
+ }
+```
+
+### 7.3、开启流程
+
+```java
+public void startFlow() {
+ System.out.println("已开启的流程实例id:" + insService.start("1", getUser()).getId());
+ }
+```
+
+### 7.4、流程流转
+
+```java
+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());
+ }
+```
+
+## 8、初学者推荐学习路线
+
+### 8.1、推荐集成案例hh-vue
+[项目地址](../../common/projectexample.md)
+
+### 8.2、推荐学习视频
+[新手教学视频,社区同学录制](https://www.bilibili.com/video/BV1Ci42117pK/)
diff --git a/src/v1.3.2/guide/table.md b/src/v1.3.2/guide/table.md
new file mode 100644
index 0000000..8e4d8ad
--- /dev/null
+++ b/src/v1.3.2/guide/table.md
@@ -0,0 +1,178 @@
+# 表结构
+
+> [!IMPORTANT]
+>
+> 表描述
+>
+> 流程定义的相关的三张表
+> 1、集团军要对某个区域进行长期的军事演练(流程定义表)
+> 2、军事演练,有多个演练环节,需要制定任务计划 (流程节点表)
+> 3、任务的需要有先后顺序,确保演练按计划推进 (流程跳转表)
+>
+> 流程实例三张表
+> 4、今天要进行一次军事演练(流程实例表)
+> 5、首先,按照任务计划,解放军执行第一个任务(待办任务表)
+> 6、后续会根据不同情况,进行不同的军事演练任务(待办任务表)
+> 7、演练要记录过程 (历史任务表)
+> 8、任务的需要分配执行人 (流程用户表)
+> 9、最终军事演练完成,流程完成
+
+
+
+## 表清单
+
+| **#** | **数据表** | **名称** | **备注说明** |
+| ----- | --------------- | -------------- | ------------ |
+| 1 | flow_definition | 流程定义表 | |
+| 2 | flow_his_task | 历史任务记录表 | |
+| 3 | flow_instance | 流程实例表 | |
+| 4 | flow_node | 流程结点表 | |
+| 5 | flow_skip | 结点跳转关联表 | |
+| 6 | flow_task | 待办任务表 | |
+| 7 | flow_user | 流程用户表 | |
+
+
+
+## 表字段明细
+
+### **flow_definition [**流程定义表**]**
+
+| **#** | **字段** | **名称** | **数据类型** | **主键** | **非空** | **默认值** | **备注说明** |
+| ----- | --------------- | --------------------------------- | --------------- | -------- | -------- | ---------- | ------------ |
+| 1 | id | 主键id | BIGINT UNSIGNED | √ | √ | | |
+| 2 | flow_code | 流程编码 | VARCHAR(40) | | √ | | |
+| 3 | flow_name | 流程名称 | VARCHAR(100) | | √ | | |
+| 4 | version | 流程版本 | VARCHAR(20) | | √ | | |
+| 5 | is_publish | 是否发布(0未发布 1已发布 9失效) | BIT(1) | | √ | 0 | |
+| 6 | form_custom | 审批表单是否自定义(Y是 N否) | CHAR(1) | | | 'N' | |
+| 7 | form_path | 审批表单路径 | VARCHAR(100) | | | | |
+| 8 | activity_status | 流程激活状态(0挂起 1激活) | BIT(1) | | √ | 1 | |
+| 9 | listener_type | 监听器类型 | VARCHAR(100) | | | | |
+| 10 | listener_path | 监听器路径 | VARCHAR(400) | | | | |
+| 11 | ext | 业务详情 存业务表对象json字符串 | VARCHAR(500) | | | | |
+| 12 | create_time | 创建时间 | DATETIME | | | | |
+| 13 | update_time | 更新时间 | DATETIME | | | | |
+| 14 | del_flag | 删除标志 | CHAR(1) | | | '0' | |
+| 15 | tenant_id | 租户id | VARCHAR(40) | | | | |
+
+### **flow_his_task [**历史任务记录表**]**
+
+| **#** | **字段** | **名称** | **数据类型** | **主键** | **非空** | **默认值** | **备注说明** |
+| ----- | ---------------- | ------------------------------------------------------------ | --------------- | -------- | -------- | ---------- | ------------ |
+| 1 | id | 主键id | BIGINT UNSIGNED | √ | √ | | |
+| 2 | definition_id | 对应flow_definition表的id | BIGINT | | √ | | |
+| 3 | instance_id | 对应flow_instance表的id | BIGINT | | √ | | |
+| 4 | task_id | 对应flow_task表的id | BIGINT | | √ | | |
+| 5 | node_code | 开始节点编码 | VARCHAR(100) | | | | |
+| 6 | node_name | 开始节点名称 | VARCHAR(100) | | | | |
+| 7 | node_type | 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) | BIT(1) | | | | |
+| 8 | target_node_code | 目标节点编码 | VARCHAR(100) | | | | |
+| 9 | target_node_name | 结束节点名称 | VARCHAR(100) | | | | |
+| 10 | approver | 审批者 | VARCHAR(40) | | | | |
+| 11 | cooperate_type | 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) | BIT(1) | | √ | 0 | |
+| 12 | collaborator | 协作人 | VARCHAR(40) | | | | |
+| 13 | skip_type | 流转类型(PASS通过 REJECT退回 NONE无动作) | VARCHAR(10) | | √ | | |
+| 14 | flow_status | 流程状态(1审批中 2 审批通过 9已退回 10失效) | VARCHAR(20) | | √ | | |
+| 15 | form_custom | 审批表单是否自定义(Y是 N否) | CHAR(1) | | | 'N' | |
+| 16 | form_path | 审批表单路径 | VARCHAR(100) | | | | |
+| 17 | message | 审批意见 | VARCHAR(500) | | | | |
+| 18 | ext | 业务详情 存业务表对象json字符串 | VARCHAR(500) | | | | |
+| 19 | create_time | 开始时间 | DATETIME | | | | |
+| 20 | update_time | 完成时间 | DATETIME | | | | |
+| 21 | del_flag | 删除标志 | CHAR(1) | | | '0' | |
+| 22 | tenant_id | 租户id | VARCHAR(40) | | | | |
+
+### **flow_instance [**流程实例表**]**
+
+| **#** | **字段** | **名称** | **数据类型** | **主键** | **非空** | **默认值** | **备注说明** |
+| ----- | --------------- | ------------------------------------------------------------ | ------------ | -------- | -------- | ---------- | ------------ |
+| 1 | id | 主键id | BIGINT | √ | √ | | |
+| 2 | definition_id | 对应flow_definition表的id | BIGINT | | √ | | |
+| 3 | business_id | 业务id | VARCHAR(40) | | √ | | |
+| 4 | node_type | 结点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) | BIT(1) | | √ | | |
+| 5 | node_code | 流程节点编码 | VARCHAR(40) | | √ | | |
+| 6 | node_name | 流程节点名称 | VARCHAR(100) | | | | |
+| 7 | variable | 任务变量 | TEXT | | | | |
+| 8 | flow_status | 流程状态(0待提交 1审批中 2 审批通过 3自动通过 8已完成 9已退回 10失效) | VARCHAR(20) | | √ | | |
+| 9 | activity_status | 流程激活状态(0挂起 1激活) | BIT(1) | | √ | 1 | |
+| 10 | create_by | 创建者 | VARCHAR(64) | | | | |
+| 11 | create_time | 创建时间 | DATETIME | | | | |
+| 12 | update_time | 更新时间 | DATETIME | | | | |
+| 13 | ext | 扩展字段,预留给业务系统使用 | VARCHAR(500) | | | | |
+| 14 | del_flag | 删除标志 | CHAR(1) | | | '0' | |
+| 15 | tenant_id | 租户id | VARCHAR(40) | | | | |
+
+### **flow_node [**流程结点表**]**
+
+| **#** | **字段** | **名称** | **数据类型** | **主键** | **非空** | **默认值** | **备注说明** |
+| ----- | --------------- | ------------------------------------------------------------ | --------------- | -------- | -------- | ---------- | ------------ |
+| 1 | id | 主键id | BIGINT UNSIGNED | √ | √ | | |
+| 2 | node_type | 节点类型(0开始节点 1中间节点 2结束结点 3互斥网关 4并行网关) | BIT(1) | | √ | | |
+| 3 | definition_id | 流程定义id | BIGINT | | √ | | |
+| 4 | node_code | 流程节点编码 | VARCHAR(100) | | √ | | |
+| 5 | node_name | 流程节点名称 | VARCHAR(100) | | | | |
+| 6 | permission_flag | 权限标识(权限类型:权限标识,可以多个,用逗号隔开) | VARCHAR(200) | | | | |
+| 7 | node_ratio | 流程签署比例值 | DECIMAL(6,3) | | | | |
+| 8 | coordinate | 坐标 | VARCHAR(100) | | | | |
+| 9 | skip_any_node | 是否可以退回任意节点(Y是 N否) | VARCHAR(100) | | | 'N' | |
+| 10 | listener_type | 监听器类型 | VARCHAR(100) | | | | |
+| 11 | listener_path | 监听器路径 | VARCHAR(400) | | | | |
+| 12 | handler_type | 处理器类型 | VARCHAR(100) | | | | |
+| 13 | handler_path | 处理器路径 | VARCHAR(400) | | | | |
+| 14 | form_custom | 审批表单是否自定义(Y是 N否) | CHAR(1) | | | 'N' | |
+| 15 | form_path | 审批表单路径 | VARCHAR(100) | | | | |
+| 16 | version | 版本 | VARCHAR(20) | | √ | | |
+| 17 | create_time | 创建时间 | DATETIME | | | | |
+| 18 | update_time | 更新时间 | DATETIME | | | | |
+| 19 | del_flag | 删除标志 | CHAR(1) | | | '0' | |
+| 20 | tenant_id | 租户id | VARCHAR(40) | | | | |
+
+### **flow_skip [**结点跳转关联表**]**
+
+| **#** | **字段** | **名称** | **数据类型** | **主键** | **非空** | **默认值** | **备注说明** |
+| ----- | -------------- | ------------------------------------------------------------ | --------------- | -------- | -------- | ---------- | ------------ |
+| 1 | id | 主键id | BIGINT UNSIGNED | √ | √ | | |
+| 2 | definition_id | 流程定义id | BIGINT | | √ | | |
+| 3 | now_node_code | 当前流程节点的编码 | VARCHAR(100) | | √ | | |
+| 4 | now_node_type | 当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) | BIT(1) | | | | |
+| 5 | next_node_code | 下一个流程节点的编码 | VARCHAR(100) | | √ | | |
+| 6 | next_node_type | 下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) | BIT(1) | | | | |
+| 7 | skip_name | 跳转名称 | VARCHAR(100) | | | | |
+| 8 | skip_type | 跳转类型(PASS审批通过 REJECT退回) | VARCHAR(40) | | | | |
+| 9 | skip_condition | 跳转条件 | VARCHAR(200) | | | | |
+| 10 | coordinate | 坐标 | VARCHAR(100) | | | | |
+| 11 | create_time | 创建时间 | DATETIME | | | | |
+| 12 | update_time | 更新时间 | DATETIME | | | | |
+| 13 | del_flag | 删除标志 | CHAR(1) | | | '0' | |
+| 14 | tenant_id | 租户id | VARCHAR(40) | | | | |
+
+### **flow_task [**待办任务表**]**
+
+| **#** | **字段** | **名称** | **数据类型** | **主键** | **非空** | **默认值** | **备注说明** |
+| ----- | ------------- | ------------------------------------------------------------ | ------------ | -------- | -------- | ---------- | ------------ |
+| 1 | id | 主键id | BIGINT | √ | √ | | |
+| 2 | definition_id | 对应flow_definition表的id | BIGINT | | √ | | |
+| 3 | instance_id | 对应flow_instance表的id | BIGINT | | √ | | |
+| 4 | node_code | 节点编码 | VARCHAR(100) | | √ | | |
+| 5 | node_name | 节点名称 | VARCHAR(100) | | | | |
+| 6 | node_type | 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) | BIT(1) | | √ | | |
+| 7 | form_custom | 审批表单是否自定义(Y是 N否) | CHAR(1) | | | 'N' | |
+| 8 | form_path | 审批表单路径 | VARCHAR(100) | | | | |
+| 9 | create_time | 创建时间 | DATETIME | | | | |
+| 10 | update_time | 更新时间 | DATETIME | | | | |
+| 11 | del_flag | 删除标志 | CHAR(1) | | | '0' | |
+| 12 | tenant_id | 租户id | VARCHAR(40) | | | | |
+
+### **flow_user [**流程用户表**]**
+
+| **#** | **字段** | **名称** | **数据类型** | **主键** | **非空** | **默认值** | **备注说明** |
+| ----- | ------------ | ------------------------------------------------------------ | --------------- | -------- | -------- | ---------- | ------------ |
+| 1 | id | 主键id | BIGINT UNSIGNED | √ | √ | | |
+| 2 | type | 人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限) | CHAR(1) | | √ | | |
+| 3 | processed_by | 权限人 | VARCHAR(80) | | | | |
+| 4 | associated | 任务表id | BIGINT | | √ | | |
+| 5 | create_time | 创建时间 | DATETIME | | | | |
+| 6 | create_by | 创建人 | VARCHAR(80) | | | | |
+| 7 | update_time | 更新时间 | DATETIME | | | | |
+| 8 | del_flag | 删除标志 | CHAR(1) | | | '0' | |
+| 9 | tenant_id | 租户id | VARCHAR(40) | | | | |
\ No newline at end of file
diff --git a/src/v1.3.2/guide/tenant.md b/src/v1.3.2/guide/tenant.md
new file mode 100644
index 0000000..c6b7988
--- /dev/null
+++ b/src/v1.3.2/guide/tenant.md
@@ -0,0 +1,194 @@
+# 多租户
+
+## 1、Mybatis-plus
+> [!IMPORTANT]
+> 1、Mybatis-plus只支持自身的多租户方式
+
+### 1.1、spring
+```java
+@Component
+public class MpTenantHandler implements TenantLineHandler {
+
+ ThreadLocal threadLocal = new ThreadLocal<>();
+
+ @Override
+ public Expression getTenantId() {
+ // 返回租户ID的表达式,LongValue 是 JSQLParser 中表示 bigint 类型的 class
+ return new LongValue(2);
+ }
+
+ @Override
+ public String getTenantIdColumn() {
+ return threadLocal.get();
+ }
+
+
+ /**
+ * 指定租户字段
+ * @param tableName 表名
+ * @return
+ */
+ @Override
+ public boolean ignoreTable(String tableName) {
+ TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName);
+ List fieldList = tableInfo.getFieldList();
+ fieldList.forEach(field -> {
+ // 如果业务和工作流引擎中的租户字段不一致,可以通过这种方式动态切换
+ if (field.getColumn().equals("tenant_id") || field.getColumn().equals("tenant_code")) {
+ threadLocal.set(field.getColumn());
+ }
+ });
+ // 获取表字段
+ return false;
+ }
+
+ /**
+ * 如果业务系统不开启租户,使用下面方法,指定流程表才开启
+ * @param tableName 表名
+ * @return
+ */
+ @Override
+ public boolean ignoreTable(String tableName) {
+ // 流程表
+ List flowTableName = Arrays.asList("flow_definition", "flow_his_task", "flow_instance", "flow_node"
+ ,"flow_skip", "flow_task", "flow_user");
+ TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName);
+ AtomicBoolean flag = new AtomicBoolean(true);
+ if (flowTableName.contains(tableInfo.getTableName())) {
+ flag.set(false);
+ }
+ List fieldList = tableInfo.getFieldList();
+ fieldList.forEach(field -> {
+ // 如果业务和工作流引擎中的租户字段不一致,可以通过这种方式动态切换
+ if (field.getColumn().equals("tenant_id")) {
+ threadLocal.set(field.getColumn());
+ }
+ });
+ // 获取表字段
+ return flag.get();
+ }
+
+}
+
+@Configuration
+public class MybatisPlusConfig {
+
+ @Resource
+ private MpTenantHandler mpTenantHandler;
+
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor();
+ tenantInterceptor.setTenantLineHandler(mpTenantHandler);
+ interceptor.addInnerInterceptor(tenantInterceptor);
+ return interceptor;
+ }
+}
+```
+
+### 1.2、solon
+```java
+public class MpTenantHandler implements TenantLineHandler {
+
+ ThreadLocal threadLocal = new ThreadLocal<>();
+
+ @Override
+ public Expression getTenantId() {
+ // 返回租户ID的表达式,LongValue 是 JSQLParser 中表示 bigint 类型的 class
+ return new LongValue(2);
+ }
+
+ @Override
+ public String getTenantIdColumn() {
+ return threadLocal.get();
+ }
+
+ @Override
+ public boolean ignoreTable(String tableName) {
+ TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName);
+ List fieldList = tableInfo.getFieldList();
+ fieldList.forEach(field -> {
+ // 如果业务和工作流引擎中的租户字段不一致,可以通过这种方式动态切换
+ if (field.getColumn().equals("tenant_id") || field.getColumn().equals("tenant_code")) {
+ threadLocal.set(field.getColumn());
+ }
+ });
+ // 获取表字段
+ return false;
+ }
+}
+
+@Configuration
+public class WarmFlowConfig {
+ @Bean(value = "db1", typed = true)
+ public DataSource db1(@Inject("${demo.db1}") HikariDataSource ds) {
+ return ds;
+ }
+
+ /**
+ * MybatisPlus全局配置
+ *
+ * @param globalConfig 数据源
+ */
+ @Bean
+ public void db1_cfg(@Db("db1") MybatisConfiguration cfg,
+ @Db("db1") GlobalConfig globalConfig) {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ // 多租户插件 必须放到第一位
+ interceptor.addInnerInterceptor(tenantLineInnerInterceptor());
+ cfg.addInterceptor(interceptor);
+ }
+
+ /**
+ * 多租户插件
+ */
+ public TenantLineInnerInterceptor tenantLineInnerInterceptor() {
+ return new TenantLineInnerInterceptor(new MpTenantHandler());
+ }
+}
+```
+
+
+## 2、通用多租户
+### 2.1、yaml配置方式
+
+```yaml
+# warm-flow工作流配置
+warm-flow:
+ # 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
+ tenant_handler_path: org.dromara.warm.flow.core.test.handle.CustomTenantHandler
+```
+### 2.2、bean配置方式
+```java
+@Configuration
+public class WarmFlowConfig {
+ /**
+ * 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
+ */
+ @Bean
+ public TenantHandler tenantHandler() {
+ return new CustomTenantHandler();
+ }
+}
+
+```
+
+### 2.3、@Component配置方式
+```java
+/**
+ * 全局租户处理器(可通过配置文件注入,也可用@Bean/@Component方式
+ *
+ * @author warm
+ */
+public class CustomTenantHandler implements TenantHandler {
+
+
+ @Override
+ public String getTenantId() {
+ // 这里返回系统中的当前办理人的租户ID,一般会有工具类获取
+ return "000000";
+ }
+}
+```
+
diff --git "a/src/v1.3.2/guide/update/\344\270\200\344\270\252\350\207\252\345\270\246\346\265\201\347\250\213\350\256\276\350\256\241\345\231\250\347\232\204\345\267\245\344\275\234\346\265\201\345\274\225\346\223\216.md" "b/src/v1.3.2/guide/update/\344\270\200\344\270\252\350\207\252\345\270\246\346\265\201\347\250\213\350\256\276\350\256\241\345\231\250\347\232\204\345\267\245\344\275\234\346\265\201\345\274\225\346\223\216.md"
new file mode 100644
index 0000000..cfeade0
--- /dev/null
+++ "b/src/v1.3.2/guide/update/\344\270\200\344\270\252\350\207\252\345\270\246\346\265\201\347\250\213\350\256\276\350\256\241\345\231\250\347\232\204\345\267\245\344\275\234\346\265\201\345\274\225\346\223\216.md"
@@ -0,0 +1,105 @@
+# 一个自带流程设计器的工作流引擎
+> 终于迎来了这个激动人心的版本1.3.1,不需要在为引入设计器而烦恼了。按照以下四点,可以快速集成。
+> 另外一直被吐槽的流程图不够清晰,也在此版本得到解决。
+
+> 详细更新说明:[更新日志](http://www.warm-flow.cn/common/update.html#v1-3-1-2024-11-01)
+
+## 1. 引入依赖
+
+```xml
+
+ org.dromara
+ warm-flow-plugin-ui-sb-web
+ 1.3.1
+
+```
+
+## 2. 后端放行部分路径
+> 1、这个路径需要放行,否则无法访问,`/warm-flow-ui/**`
+> 2、以下是spring-security放行配置示例
+
+
+```java
+@Bean
+protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception
+{
+ return httpSecurity
+ .......
+ // 注解标记允许匿名访问的url
+ .authorizeHttpRequests((requests) -> {
+ // 后端请求,静态资源,可匿名访问
+ requests.antMatchers("/warm-flow-ui/**").permitAll()
+ // 除上面外的所有请求全部需要鉴权认证
+ .anyRequest().authenticated();
+ })
+ ......
+ .build();
+}
+```
+
+## 3. 前端加载设计器
+> 1、设计器页面入口是访问后端地址(前后端不分离):`ip:port/warm-flow-ui/index?id=${definitionId}?disabled=${disabled}`
+
+
+## 4. 设计器办理人权限数据接入
+> 给任务节点设置哪些权限的人可以办理,实现接口提供给设计器
+
+### 4.1 办理人权限选择弹框页面
+
+
+
+
+### 4.2 实现接口获取以上页面办理人权限数据
+
+#### 4.2.1 HandlerSelectService接口
+```java
+/**
+ * 流程设计器-获取办理人权限设置列表接口
+ *
+ * @author warm
+ */
+public interface HandlerSelectService {
+
+ /**
+ * 获取办理人权限设置列表tabs页签, 如:用户、角色和部门等
+ * @return tabs页签
+ */
+ List getHandlerType();
+
+ /**
+ * 获取办理人权限设置列表结果,如:用户列表、角色列表、部门列表等
+ * @param query 查询参数
+ * @return 结果
+ */
+ List getHandlerSelect(HandlerQuery query);
+}
+```
+
+
+## 5、项目介绍
+> Warm-Flow国产工作流引擎🎉,其特点简洁轻量,五脏俱全,可扩展,是一个可通过jar引入设计器的工作流。
+
+1. 简洁易用:只有7张表,代码量少,可快速上手和集成
+2. 审批功能:支持通过、退回、任意跳转、转办、终止、会签、票签、委派和加减签、互斥和并行网关
+3. 监听器与流程变量:支持四种监听器,可应对不同场景,灵活可扩展,参数传递,动态权限
+4. 流程图:流程引擎自带流程图,可在不集成流程设计器情况下使用
+5. 流程设计器:可通过jar包形式快速集成到项目,减少繁琐代码搬运和适配
+6. 条件表达式:内置常见的和spel条件表达式,并且支持自定义扩展
+7. 办理人变量表达式:内置${handler}和spel格式的表达式,可满足不同场景,灵活可扩展
+8. orm框架扩展:目前支持MyBatis、Mybatis-Plus、Mybatis-Flex和Jpa,后续会由社区提供其他支持,扩展方便
+9. 数据库支持:目前支持MySQL 、Oracle 和PostgreSQL,后续会继续支持其他数据库或者国产数据库
+10. 多租户与软删除:流程引擎自身维护多租户和软删除实现,也可使用对应orm框架的实现方式
+11. 同时支持spring和solon
+12. 兼容java8和java17,理论11也可以
+13. 官方提供基于ruoyi-vue封装实战项目,很实用
+
+## 6、演示地址
+
+- admin/admin123
+
+演示地址:http://www.hhzai.top
+
+
+## 7、官网
+
+[http://warm-flow.cn](http://www.warm-flow.cn/)
diff --git a/src/v1.3.2/guide/variable.md b/src/v1.3.2/guide/variable.md
new file mode 100644
index 0000000..04b5354
--- /dev/null
+++ b/src/v1.3.2/guide/variable.md
@@ -0,0 +1,39 @@
+# 流程变量
+
+> [!IMPORTANT]
+> 1、流程变量,map类型,用于流程执行中的数据转递
+> 2、在执行流程时,可以设置流程变量
+> 3、在监听器中,可以获取流程变量
+
+```java
+ public void insertTestLeave(TestLeave testLeave, Integer flowStatus)
+ {
+ String id = IdUtils.nextIdStr();
+ testLeave.setId(id);
+ LoginUser user = SecurityUtils.getLoginUser();
+ FlowParams flowParams = FlowParams.build().flowCode(getFlowType(testLeave))
+ .handler(user.getUser().getUserId().toString());
+ // 流程变量
+ Map variable = new HashMap<>();
+ variable.put("testLeave", testLeave);
+ variable.put("flag", String.valueOf(testLeave.getDay()));
+ flowParams.variable(variable);
+
+ Instance instance = insService.start(id, flowParams);
+ }
+```
+
+```java
+@Component
+public class FinishListener implements Listener {
+ private static final Logger log = LoggerFactory.getLogger(StartListener.class);
+
+ @Override
+ public void notify(ListenerVariable variable) {
+ log.info("完成监听器:{}", variable);
+ Instance instance = variable.getInstance();
+ Map testLeaveMap = variable.getVariable();
+ log.info("完成监听器结束;{}", "任务完成");
+ }
+}
+```
diff --git a/src/v1.3.2/guide/variableStategy.md b/src/v1.3.2/guide/variableStategy.md
new file mode 100644
index 0000000..995e5d9
--- /dev/null
+++ b/src/v1.3.2/guide/variableStategy.md
@@ -0,0 +1,134 @@
+# 办理人变量设置
+
+## 1、内置表达式
+- 1、默认办理人变量策略: `@@default@@|${handler1}`
+- 2、spel办理人变量策略: `@@spel@@|#{@user.evalVar(#handler2)}`
+- 3、@@xxx@@: 标识不同策略的前缀
+
+## 2、变量替换时机
+- 1、上一个节点任务办理时,传入变量
+- 2、下一个节点任务生成时即可获取替换
+
+> 比如B-->C, C任务设置办理人变量为`@@default@@|${handler1}`,B任务办理时传入变量`handler1=100`,则C节点办理人变量为100
+
+
+## 3、默认办理人变量策略
+
+### 前端页面设置变量
+- 比如:`@@default@@|${handler1}`
+- `@@default@@|${handler1}`中@@default@@表示默认办理人变量策略,handler1是需要被流程变量中替换的标识
+
+
+
+
+
+
+### 后端代码设置变量
+```java
+
+// 流程变量
+Map variable = new HashMap<>();
+variable.put("handler1", "100");
+flowParams.variable(variable);
+
+Instance instance = insService.skipByInsId(testLeave.getInstanceId(), flowParams);
+```
+
+## 4、spel办理人变量策略
+
+### 前端页面设置变量
+- 比如:`@@spel@@|#{@user.evalVar(#handler2)}`
+- `#{@user.evalVar(#handler2)}`是spel表达式,`#handler2`是方法入参变量,可以不设置
+
+
+
+
+
+
+
+### 后端代码设置变量
+```java
+/**
+ * 用户类
+ */
+@Component("user")
+public class User {
+
+ /**
+ * spel办理人变量表达式
+ * @param handler2 办理人
+ * @return String
+ */
+ public String evalVar(String handler2) {
+ return handler2;
+ }
+}
+
+// 流程变量
+Map variable = new HashMap<>();
+variable.put("handler2", "101");
+flowParams.variable(variable);
+
+Instance instance = insService.skipByInsId(testLeave.getInstanceId(), flowParams);
+```
+
+## 5、扩展
+
+- 扩展需要实现`VariableStrategy`接口, 实现`getType和eval`方法
+- 并且通过这个方法进行注册VariableUtil.setVariable
+
+```java
+/**
+ * 变量替换策略
+ *
+ * @author warm
+ */
+public interface VariableStrategy {
+
+ /**
+ * 获取变量替换类型
+ * @return 变量替换类型
+ */
+ String getType();
+
+ /**
+ * 执行表达式
+ * @param expression 表达式
+ * @param variable 流程变量
+ * @return 执行结果
+ */
+ String eval(String expression, Map variable);
+}
+
+
+
+/**
+ * 默认变量替换策略: @@default@@|${flag}
+ *
+ * @author warm
+ */
+public class DefaultVariableStrategy implements VariableStrategy {
+
+ @Override
+ public String getType() {
+ return FlowCons.splitAt + "default" + FlowCons.splitAt;
+ }
+
+ @Override
+ public String eval(String expression, Map variable) {
+ if (StringUtils.isEmpty(expression) || MapUtil.isEmpty(variable)) {
+ return null;
+ }
+ String result = expression.replace("${", "").replace("}", "");
+ Object o = variable.get(result);
+ if (ObjectUtil.isNotNull(o)) {
+ String variableStr = (String) o;
+ if (StringUtils.isEmpty(variableStr)) {
+ return null;
+ }
+ return variableStr;
+ }
+ return null;
+ }
+}
+```
--
Gitee
From ffdddff59b1215bfcaa4c413b5e171edd9e5bd4a Mon Sep 17 00:00:00 2001
From: warm <290631660@qq.com>
Date: Tue, 12 Nov 2024 12:27:54 +0800
Subject: [PATCH 16/16] [upgrade] 1.3.1 --> 1.3.2
---
src/common/submitpr.md | 1 +
src/common/update.md | 22 +++++++++++++---------
src/master/guide/designerIntroduced.md | 24 +++++++++++++++---------
src/master/guide/started.md | 26 +++++++++++++-------------
4 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/src/common/submitpr.md b/src/common/submitpr.md
index 2a863ef..1ad0757 100644
--- a/src/common/submitpr.md
+++ b/src/common/submitpr.md
@@ -36,6 +36,7 @@
[revert] 撤销修改
[style] 代码风格相关无影响运行结果的
[update] 其他修改
+[upgrade] 升级版本
```
### 步骤七 创建PR申请(此操作在自己仓库或者要PR的仓库都可以)
diff --git a/src/common/update.md b/src/common/update.md
index 053a4e9..bf69dfe 100644
--- a/src/common/update.md
+++ b/src/common/update.md
@@ -23,23 +23,27 @@
- 更新日志
- 动态表单支持 @vanlin
- - 流程定义数据保存支持json格式 @晓华
- 取回 @xiarigang
-### v1.3.2
-- 【升级指南】
- - 独立设计器放行路径增加`/warm-flow`,如果想要共享后端权限(比如token),可不增加,并且按照官网流程设计器引入进行设置
-
-- 更新日志
- 新增流程图元数据 @晓华
- 流程定义数据保存支持json格式 @xiarigang
- 接入仿钉钉设计器 @晓华
- 流程变量表达式支持替换集合 @晓华
- - 流程设计器支持接入外部token @晓华
+
+
+## 更新日志
+### v1.3.2 2024-11-12
+- 【升级指南】
+ - 独立设计器放行路径增加`/warm-flow`,如果想要共享后端权限(比如token),可不增加,并且按照官网流程设计器引入进行设置
+
+- 更新日志
- [feat] 新增支持接入业务系统token
+ - [update] 办理人选择tabs切换
+ - [update] 没有左侧树状选择数据时,左侧隐藏
+ - [fix] 统一修复分页bug
+ - [fix] 修复删除流程实例信息,未删除办理人信息 @xiarigang
+ - [fix] 修改【Bug】 会签节点委派 @vanlin
- [fix] 统一修复分页bug
-
-## 更新日志
### v1.3.1 2024-11-01
- 【升级指南】
- 依赖的groupId:io.github.minliuhua,改为org.dromara
diff --git a/src/master/guide/designerIntroduced.md b/src/master/guide/designerIntroduced.md
index 930e108..e3af64d 100644
--- a/src/master/guide/designerIntroduced.md
+++ b/src/master/guide/designerIntroduced.md
@@ -29,7 +29,7 @@ protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exce
// 注解标记允许匿名访问的url
.authorizeHttpRequests((requests) -> {
// 后端请求,静态资源,可匿名访问
- requests.antMatchers("/warm-flow-ui/**").permitAll()
+ requests.antMatchers("/warm-flow-ui/**", "/warm-flow/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})
@@ -56,6 +56,7 @@ public class ShiroConfig {
// 后端请求,静态资源,可匿名访问
LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/warm-flow-ui/**", "anon");
+ filterChainDefinitionMap.put("/warm-flow/**", "anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
@@ -75,7 +76,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
.addPathPatterns("/**")
// 以上是sa-token案例,下面才是需要排除的地址
- .excludePathPatterns("/warm-flow-ui/**");
+ .excludePathPatterns("/warm-flow-ui/**", "/warm-flow/**");
}
}
```
@@ -383,23 +384,28 @@ public class HandlerSelectServiceImpl implements HandlerSelectService {
}
```
-## 5. 设计器二开
-### 5.1 下载设计器源码,改造
+## 5. 共享后端权限(如token)
+- 后端放行路径`/warm-flow-ui/**,/warm-flow/**`,改为只放行一个`/warm-flow-ui/**`
+- 加载设计器页面路径`/warm-flow-ui/index.html?id=${definitionId}&disabled=${disabled}`,在后面追加&token=${token},token是业务系统的token
+
+
+## 6. 设计器二开
+### 6.1 下载设计器源码,改造
- 如果内置的接口不满足或者不够支持实际业务开发,可在业务系统中增加接口,设计器配置该接口地址
-### 5.2 源码调试
+### 6.2 源码调试
- 设计器需要配置业务系统的代理地址,否则无法访问业务系统
- 独立启动该设计器
-### 5.3 部署
-#### 5.3.1 先排除原依赖的前端代码
+### 6.3 部署
+#### 6.3.1 先排除原依赖的前端代码
```xml
@@ -414,13 +420,13 @@ public class HandlerSelectServiceImpl implements HandlerSelectService {
```
-#### 5.3.2 设计器不分离部署(部署方案一)
+#### 6.3.2 设计器不分离部署(部署方案一)
- 打包项目,把打包后的文件`dist`复制到业务系统`src/main/META-INF/resources`目录下,改名为warm-flow-ui
- 独立服务
-#### 5.3.2 设计器独立部署/分离部署(部署方案二)
+#### 6.3.2 设计器独立部署/分离部署(部署方案二)
- 打包项目,把打包后的文件`dist`复制到nginx的html目录下,改名为warm-flow-ui
- 访问地址改为(请注意地址少了`/warm-flow-ui`):http://localhost:81/index.html?id=xxx&disabled=false
diff --git a/src/master/guide/started.md b/src/master/guide/started.md
index 51202e0..6699c34 100644
--- a/src/master/guide/started.md
+++ b/src/master/guide/started.md
@@ -33,7 +33,7 @@
org.dromara
warm-flow-mybatis-sb-starter
- 1.3.1
+ 1.3.2
```
@@ -43,7 +43,7 @@
org.dromara
warm-flow-mybatis-sb3-starter
- 1.3.1
+ 1.3.2
```
@@ -53,7 +53,7 @@
org.dromara
warm-flow-mybatis-solon-plugin
- 1.3.1
+ 1.3.2
```
@@ -64,7 +64,7 @@
org.dromara
warm-flow-mybatis-plus-sb-starter
- 1.3.1
+ 1.3.2
```
@@ -74,7 +74,7 @@
org.dromara
warm-flow-mybatis-plus-sb3-starter
- 1.3.1
+ 1.3.2
```
@@ -84,7 +84,7 @@
org.dromara
warm-flow-mybatis-plus-solon-plugin
- 1.3.1
+ 1.3.2
```
@@ -103,7 +103,7 @@ warm-flow:
org.dromara
warm-flow-jpa-sb-starter
- 1.3.1
+ 1.3.2
```
@@ -113,7 +113,7 @@ warm-flow:
org.dromara
warm-flow-mybatis-plus-solon-plugin
- 1.3.1
+ 1.3.2
```
@@ -124,7 +124,7 @@ warm-flow:
org.dromara
warm-flow-mybatis-flex-sb-starter
- 1.3.1
+ 1.3.2
```
@@ -134,7 +134,7 @@ warm-flow:
org.dromara
warm-flow-mybatis-flex-sb3-starter
- 1.3.1
+ 1.3.2
```
@@ -144,7 +144,7 @@ warm-flow:
org.dromara
warm-flow-mybatis-flex-solon-plugin
- 1.3.1
+ 1.3.2
```
@@ -155,7 +155,7 @@ warm-flow:
org.dromara
warm-flow-easy-query-sb-starter
- 1.3.1
+ 1.3.2
```
@@ -175,7 +175,7 @@ warm-flow:
solon.logging
- 1.3.1
+ 1.3.2
```
--
Gitee