91 Commits

Author SHA1 Message Date
疯狂的狮子Li
57dd6831d3 !664 发布 5.3.1 正式版
Merge pull request !664 from 疯狂的狮子Li/dev
2025-03-27 02:54:00 +00:00
疯狂的狮子Li
8aa60abb1f !663 回退 'Pull Request !662 : 发布 5.3.1 正式版'
* 回退 'Pull Request !662 : 发布 5.3.1 正式版'
2025-03-27 02:53:23 +00:00
疯狂的狮子Li
7a9f51fc7a !662 发布 5.3.1 正式版
* 🐳发布 5.3.1 正式版
* update 优化 删除无用配置
* fix 修复 excel模板导出数据被覆盖的问题
* update 优化 统一用户密码校验长度
* update mybatis-plus 3.5.10.1 => 3.5.11
* fix 修复 跨域未设置请求头问题(cloud版本不需要 vue版本需要)
2025-03-27 02:51:57 +00:00
疯狂的狮子Li
3761473967 🐳发布 5.3.1 正式版 2025-03-27 10:45:00 +08:00
疯狂的狮子Li
34031cae8d update 优化 删除无用配置 2025-03-27 10:38:48 +08:00
疯狂的狮子Li
26abb98747 fix 修复 excel模板导出数据被覆盖的问题 2025-03-27 10:03:16 +08:00
疯狂的狮子Li
c2f67b4a77 update 优化 统一用户密码校验长度 2025-03-27 09:32:16 +08:00
疯狂的狮子Li
4d925a4d62 update mybatis-plus 3.5.10.1 => 3.5.11
update snailjob 1.4.0-beta2 => 1.4.0 正式版
2025-03-26 15:18:39 +08:00
疯狂的狮子Li
4e62054bd1 fix 修复 跨域未设置请求头问题(cloud版本不需要 vue版本需要) 2025-03-26 14:30:25 +08:00
疯狂的狮子Li
159e30c982 !661 发布 5.3.1-BETA2 公测版本
Merge pull request !661 from 疯狂的狮子Li/dev
2025-03-21 07:25:25 +00:00
疯狂的狮子Li
fe40d7db32 发布 5.3.1-BETA2 公测版本 2025-03-21 15:17:31 +08:00
疯狂的狮子Li
c0eeafb5cd update 优化 excel导出 下拉框支持顺序 2025-03-21 15:14:54 +08:00
疯狂的狮子Li
5626b97a19 update 优化 兼容老版本数据权限用户写法 2025-03-21 14:42:58 +08:00
疯狂的狮子Li
0f95e9393d update springboot 3.4.3 => 3.4.4 2025-03-21 13:55:38 +08:00
疯狂的狮子Li
5de1ffff90 update 优化 excel导出 下拉框支持顺序 2025-03-21 13:53:23 +08:00
疯狂的狮子Li
33698ee448 fix 修复 转换id 参数为null报错问题 2025-03-20 16:53:15 +08:00
guo83551218
5e5d478cf2 !660 fix 修复 pg强类型校验问题
* fix 修复 pg强类型校验问题
2025-03-19 06:50:24 +00:00
guo83551218
778096d100 !658 fix 修复pg数据库 强类型转换报错
* fix 修复pg数据库 强类型转换报错
2025-03-19 05:23:34 +00:00
疯狂的狮子Li
bba163f7b4 update warm-flow 1.6.7 => 1.6.8 2025-03-19 11:34:53 +08:00
疯狂的狮子Li
d4f792810e update 优化 简化 SysTaskAssigneeServiceImpl 代码实现 2025-03-19 10:09:32 +08:00
疯狂的狮子Li
d14ee59912 update springboot-admin 3.4.2 => 3.4.5
update redisson 3.44.0 => 3.45.1
update sms4j 3.3.3 => 3.3.4
2025-03-18 17:25:01 +08:00
疯狂的狮子Li
be5d69d5a5 update snailjob 1.3.0 => 1.4.0-beta2 2025-03-18 17:18:50 +08:00
疯狂的狮子Li
97c36674e4 update 优化 打包默认跳过测试 减少心智难度 2025-03-18 13:44:35 +08:00
疯狂的狮子Li
1f1564fad9 update 优化 修改oss枚举包名与其他模块统一 2025-03-17 09:32:53 +08:00
gssong
c79e053bea update 调整流程定义,修复使用leave6提交错误问题 2025-03-15 22:53:31 +08:00
疯狂的狮子Li
92e9ed771b update 优化 代码书写格式 2025-03-13 17:47:32 +08:00
AprilWind
800c6c8ff3 update 优化工作流办理人标识符解析 2025-03-13 17:26:05 +08:00
AprilWind
865627fdad update 优化获取节点扩展属性,简化节点编码 2025-03-13 16:20:48 +08:00
洛小风
192537672e !654 update 优化函数注释以准确描述SSE会话
* update 优化函数注释以准确描述SSE会话
2025-03-13 07:37:22 +00:00
疯狂的狮子Li
384f9528e7 fix 修复 实体类书写错误 2025-03-13 13:39:36 +08:00
疯狂的狮子Li
7334d91d6b !652 发布 5.3.1-BETA 公测版本
Merge pull request !652 from 疯狂的狮子Li/dev
2025-03-13 05:27:36 +00:00
疯狂的狮子Li
5fc76b6426 发布 5.3.1-BETA 公测版本 2025-03-13 13:26:46 +08:00
疯狂的狮子Li
4d8a45204c fix 修复 部门树对应前端新树结构缺少字段问题 2025-03-13 12:51:42 +08:00
疯狂的狮子Li
2de9397db8 remove 删除无用代码 2025-03-13 11:36:49 +08:00
疯狂的狮子Li
bfc73ed214 update 优化 将crt客户端替换为Netty客户端 节约17M打包大小 2025-03-13 11:34:26 +08:00
疯狂的狮子Li
8bf741fd5b fix 修复 关闭验证码后 限流注解仍然生效问题 2025-03-12 17:29:48 +08:00
疯狂的狮子Li
460545a75e update 优化 字典方法命名 2025-03-11 17:56:02 +08:00
疯狂的狮子Li
a93b30ec91 update warm-flow 1.6.7 升级正式版 2025-03-11 14:15:20 +08:00
AprilWind
34bac1add9 update 优化权限标识符增加通配符* 2025-03-10 11:12:39 +08:00
gssong
f028cb76fc add 增加示例 2025-03-08 00:36:44 +08:00
gssong
5a4be5fba1 add 增加条件表达式示例
fix 修复提交修改变量参数没有覆盖变量问题
2025-03-08 00:35:57 +08:00
gssong
23245b78ca fix 修复获取下一环节排他网关出现条件错误
add 增加示例
2025-03-08 00:09:08 +08:00
疯狂的狮子Li
13ac302525 update 优化 getLoginUser 方法 支持返回多种类型登陆实体 2025-03-07 15:09:44 +08:00
疯狂的狮子Li
96a62a3564 update 回滚错误修改 2025-03-07 15:06:36 +08:00
疯狂的狮子Li
7adf702283 update 优化 getLoginUser 方法 支持返回多种类型登陆实体 2025-03-07 15:05:14 +08:00
gssong
279c8e014a update 补充注释 2025-03-06 22:23:48 +08:00
疯狂的狮子Li
b7517cbbd4 update 优化 重构将 WorkflowUtils 工具类改为 FlwCommonService 更通用的业务处理 2025-03-06 17:36:47 +08:00
疯狂的狮子Li
45eac02f4f update 优化 将工作流消息发送从工具类迁移到业务内 便于扩展 2025-03-06 16:46:39 +08:00
疯狂的狮子Li
a6b7c3afe6 fix 修复 前端树处理优化后 后端缺字段问题 2025-03-06 16:08:15 +08:00
gssong
e99e4f6c58 update 调整获取下一节点 2025-03-05 22:32:18 +08:00
gssong
bcb97bc406 add 添加设置下一审批人 2025-03-05 22:26:31 +08:00
疯狂的狮子Li
ad01406fc1 update 优化 text 设置默认值某些版本可能有问题 改为默认null 2025-03-05 15:33:11 +08:00
gssong
15eb08c065 update 调整获取下一节点,增加用户分页查询参数 2025-03-04 21:51:16 +08:00
疯狂的狮子Li
2340556091 update 优化 调整字段长度 2025-03-04 10:03:13 +08:00
疯狂的狮子Li
65c54184e8 update 优化 sys_oss 表增加扩展字段 ext1 2025-03-04 09:51:46 +08:00
疯狂的狮子Li
9dcb7c6a12 update 优化 增加5.3.0-5.3.1升级sql 2025-03-04 09:44:11 +08:00
疯狂的狮子Li
0c6faa751a update 删除无用sql 2025-03-04 09:34:17 +08:00
gssong
b465cb34de Merge branch 'dev' of https://gitee.com/dromara/RuoYi-Vue-Plus into dev 2025-03-03 21:02:13 +08:00
gssong
21c12a791a add 添加获取节点接口 2025-03-03 21:02:03 +08:00
疯狂的狮子Li
723a0b6d9c update mybatis-plus 3.5.10 => 3.5.10.1 修复个bug 2025-03-03 13:49:58 +08:00
gssong
c4ef053958 add 增加节点查询 2025-03-02 00:09:18 +08:00
gssong
055d1f3bb2 update 调整流程图颜色 2025-03-01 23:55:48 +08:00
gssong
fe27d8920a add 增加按钮权限 2025-03-01 23:46:20 +08:00
AprilWind
df65670d3d update 优化校验框架配置类加载顺序,确保优先于默认的验证配置 2025-02-28 16:06:16 +08:00
AprilWind
2623d0b343 update 调整注释错误,补充注释 2025-02-28 14:46:59 +08:00
AprilWind
c0e0b41d13 update 更新warm-flow版本到1.6.7-M2,权限按钮改为枚举类 2025-02-28 12:05:35 +08:00
AprilWind
8763bfa3d3 update 优化删除无用排除 2025-02-27 17:31:08 +08:00
AprilWind
71180584da update 优化根据字典类型查询信息增加一级缓存 2025-02-26 09:54:20 +08:00
疯狂的狮子Li
319a89e320 fix 修复 oracle 同步字典报错问题 2025-02-25 23:39:02 +08:00
AprilWind
0673cf8849 update 优化流程设计器-节点扩展属性注释 2025-02-25 22:56:27 +08:00
AprilWind
b537899e62 update 更新warm-flow版本到1.6.7-M1 2025-02-25 22:18:58 +08:00
AprilWind
7b679e60e0 update 优化工作流设计器获取任务执行人查询正常状态 2025-02-25 17:55:54 +08:00
疯狂的狮子Li
bb475a6088 update 优化 删除无用配置类 2025-02-21 20:31:58 +08:00
疯狂的狮子Li
a217c495d1 update 优化 租户表企业名与部门表长度保持一致 防止长度不一致报错 2025-02-21 15:40:31 +08:00
疯狂的狮子Li
bdb86e2b3a update springboot 3.4.2 => 3.4.3
update springdoc 2.8.4 => 2.8.5
2025-02-21 10:10:09 +08:00
疯狂的狮子Li
e8700ac44b update 优化 删除多余响应头设置 2025-02-21 09:37:24 +08:00
疯狂的狮子Li
d80f6ab695 fix 修复 oracle 新建租户报错问题 2025-02-20 17:46:04 +08:00
疯狂的狮子Li
381be5a1a1 fix 修复 oracle 表别名不能写as关键字 2025-02-19 13:27:46 +08:00
疯狂的狮子Li
214cbac9a6 update 优化 ProcessTaskEvent 改名为 ProcessCreateTaskEvent 避免错误理解 2025-02-19 09:43:17 +08:00
AprilWind
906a031172 update 优化部门下岗位名称重复 2025-02-19 09:07:46 +08:00
疯狂的狮子Li
236dd6e054 update 删除无用文件 2025-02-17 15:22:47 +08:00
QianRj
eb17eb6559 !646 fix 修复Caffeine缓存未清空导致的部门创建显示延迟问题
* fix 修复Caffeine缓存未清空导致的部门创建显示延迟问题
2025-02-15 04:58:37 +00:00
秋辞未寒
2746af21f0 update 优化 根部门祖级列表常量和备注,以避免歧义 2025-02-13 17:39:30 +08:00
疯狂的狮子Li
78abb617ce update 优化 nginx开启静态资源压缩 增加静态文件传输效率 2025-02-11 16:03:14 +08:00
疯狂的狮子Li
3c57c0e7f9 update springboot-admin 3.4.1 => 3.4.2 修复重新登录404问题 2025-02-11 09:51:31 +08:00
疯狂的狮子Li
95c01301f6 !644 同步修复一些问题
Merge pull request !644 from 疯狂的狮子Li/dev
2025-02-07 06:19:28 +00:00
疯狂的狮子Li
934bbe8bd7 update springboot 3.4.1 => 3.4.2
update springdoc 2.8.3 => 2.8.4
update satoken 1.39.0 => 1.40.0
update redisson 3.43.0 => 3.44.0
2025-02-07 14:15:54 +08:00
疯狂的狮子Li
718a010c0f Revert "fix 修复 monitor 设置 context-path 导致退出重新登录404问题"
This reverts commit d194b39e57.
2025-02-07 13:07:53 +08:00
疯狂的狮子Li
a87071b834 fix 修复 结束监听器 flowParam 可能为null问题 2025-02-06 16:16:14 +08:00
疯狂的狮子Li
2c598f93ab fix 修复 splitTo 转换后的list包含null问题 2025-02-06 16:15:19 +08:00
疯狂的狮子Li
0937093851 fix 修复 sse关闭 用户id或token为空报错问题 2025-02-06 16:14:51 +08:00
104 changed files with 2162 additions and 946 deletions

View File

@@ -2,7 +2,7 @@
<configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.3.0" />
<option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.3.1" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" />
</settings>

View File

@@ -2,7 +2,7 @@
<configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-server:5.3.0" />
<option name="imageTag" value="ruoyi/ruoyi-server:5.3.1" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-admin/Dockerfile" />
</settings>

View File

@@ -2,7 +2,7 @@
<configuration default="false" name="ruoyi-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.3.0" />
<option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.3.1" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" />
</settings>

35
pom.xml
View File

@@ -13,25 +13,25 @@
<description>Dromara RuoYi-Vue-Plus多租户管理系统</description>
<properties>
<revision>5.3.0</revision>
<spring-boot.version>3.4.1</spring-boot.version>
<revision>5.3.1</revision>
<spring-boot.version>3.4.4</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version>
<mybatis.version>3.5.16</mybatis.version>
<springdoc.version>2.8.3</springdoc.version>
<springdoc.version>2.8.5</springdoc.version>
<therapi-javadoc.version>0.15.0</therapi-javadoc.version>
<easyexcel.version>4.0.3</easyexcel.version>
<velocity.version>2.3</velocity.version>
<satoken.version>1.39.0</satoken.version>
<mybatis-plus.version>3.5.10</mybatis-plus.version>
<satoken.version>1.40.0</satoken.version>
<mybatis-plus.version>3.5.11</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version>
<hutool.version>5.8.35</hutool.version>
<spring-boot-admin.version>3.4.1</spring-boot-admin.version>
<redisson.version>3.43.0</redisson.version>
<spring-boot-admin.version>3.4.5</spring-boot-admin.version>
<redisson.version>3.45.1</redisson.version>
<lock4j.version>2.2.7</lock4j.version>
<dynamic-ds.version>4.3.1</dynamic-ds.version>
<snailjob.version>1.3.0</snailjob.version>
<snailjob.version>1.4.0</snailjob.version>
<mapstruct-plus.version>1.4.6</mapstruct-plus.version>
<mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
<lombok.version>1.18.36</lombok.version>
@@ -42,15 +42,14 @@
<!-- OSS 配置 -->
<aws.sdk.version>2.28.22</aws.sdk.version>
<aws.crt.version>0.31.3</aws.crt.version>
<!-- SMS 配置 -->
<sms4j.version>3.3.3</sms4j.version>
<sms4j.version>3.3.4</sms4j.version>
<!-- 限制框架中的fastjson版本 -->
<fastjson.version>1.2.83</fastjson.version>
<!-- 面向运行时的D-ORM依赖 -->
<anyline.version>8.7.2-20250101</anyline.version>
<!--工作流配置-->
<warm-flow.version>1.6.6</warm-flow.version>
<warm-flow.version>1.6.8</warm-flow.version>
<!-- 插件版本 -->
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
@@ -58,6 +57,8 @@
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
<!-- 打包默认跳过测试 -->
<skipTests>true</skipTests>
</properties>
<profiles>
@@ -245,18 +246,18 @@
<artifactId>s3</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<!-- 使用AWS基于 CRT 的 S3 客户端 -->
<dependency>
<groupId>software.amazon.awssdk.crt</groupId>
<artifactId>aws-crt</artifactId>
<version>${aws.crt.version}</version>
</dependency>
<!-- 基于 AWS CRT 的 S3 客户端的性能增强的 S3 传输管理器 -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<!-- 将基于 Netty 的 HTTP 客户端从类路径中移除 -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<!--短信sms4j-->
<dependency>
<groupId>org.dromara.sms4j</groupId>

View File

@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.reflect.ReflectUtils;
@@ -79,12 +80,21 @@ public class CaptchaController {
*
* @param email 邮箱
*/
@RateLimiter(key = "#email", time = 60, count = 1)
@GetMapping("/resource/email/code")
public R<Void> emailCode(@NotBlank(message = "{user.email.not.blank}") String email) {
if (!mailProperties.getEnabled()) {
return R.fail("当前系统没有开启邮箱功能!");
}
SpringUtils.getAopProxy(this).emailCodeImpl(email);
return R.ok();
}
/**
* 邮箱验证码
* 独立方法避免验证码关闭之后仍然走限流
*/
@RateLimiter(key = "#email", time = 60, count = 1)
public void emailCodeImpl(String email) {
String key = GlobalConstants.CAPTCHA_CODE_KEY + email;
String code = RandomUtil.randomNumbers(4);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
@@ -92,23 +102,30 @@ public class CaptchaController {
MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。");
} catch (Exception e) {
log.error("验证码短信发送异常 => {}", e.getMessage());
return R.fail(e.getMessage());
throw new ServiceException(e.getMessage());
}
return R.ok();
}
/**
* 生成验证码
*/
@RateLimiter(time = 60, count = 10, limitType = LimitType.IP)
@GetMapping("/auth/code")
public R<CaptchaVo> getCode() {
CaptchaVo captchaVo = new CaptchaVo();
boolean captchaEnabled = captchaProperties.getEnable();
if (!captchaEnabled) {
CaptchaVo captchaVo = new CaptchaVo();
captchaVo.setCaptchaEnabled(false);
return R.ok(captchaVo);
}
return R.ok(SpringUtils.getAopProxy(this).getCodeImpl());
}
/**
* 生成验证码
* 独立方法避免验证码关闭之后仍然走限流
*/
@RateLimiter(time = 60, count = 10, limitType = LimitType.IP)
public CaptchaVo getCodeImpl() {
// 保存验证码信息
String uuid = IdUtil.simpleUUID();
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
@@ -128,9 +145,10 @@ public class CaptchaController {
code = exp.getValue(String.class);
}
RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
CaptchaVo captchaVo = new CaptchaVo();
captchaVo.setUuid(uuid);
captchaVo.setImg(captcha.getImageBase64());
return R.ok(captchaVo);
return captchaVo;
}
}

View File

@@ -1,9 +1,9 @@
package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import org.dromara.common.core.config.RuoYiConfig;
import org.dromara.common.core.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -17,16 +17,12 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
/**
* 系统基础配置
*/
private final RuoYiConfig ruoyiConfig;
/**
* 访问首页,提示语
*/
@GetMapping("/")
public String index() {
return StringUtils.format("欢迎使用{}后台管理框架,当前版本v{}请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
return StringUtils.format("欢迎使用{}后台管理框架,请通过前端地址访问。", SpringUtils.getApplicationName());
}
}

View File

@@ -2,7 +2,7 @@
spring.boot.admin.client:
# 增加客户端开关
enabled: true
url: http://localhost:9090
url: http://localhost:9090/admin
instance:
service-host-type: IP
metadata:
@@ -120,8 +120,8 @@ redisson:
nettyThreads: 8
# 单节点配置
singleServerConfig:
# 客户端名称
clientName: ${ruoyi.name}
# 客户端名称 不能用中文
clientName: RuoYi-Vue-Plus
# 最小空闲连接数
connectionMinimumIdleSize: 8
# 连接池大小

View File

@@ -5,7 +5,7 @@ spring.servlet.multipart.location: /ruoyi/server/temp
spring.boot.admin.client:
# 增加客户端开关
enabled: true
url: http://localhost:9090
url: http://localhost:9090/admin
instance:
service-host-type: IP
metadata:
@@ -123,8 +123,8 @@ redisson:
nettyThreads: 32
# 单节点配置
singleServerConfig:
# 客户端名称
clientName: ${ruoyi.name}
# 客户端名称 不能用中文
clientName: RuoYi-Vue-Plus
# 最小空闲连接数
connectionMinimumIdleSize: 32
# 连接池大小

View File

@@ -1,24 +1,3 @@
# 项目相关配置
ruoyi:
# 名称
name: RuoYi-Vue-Plus
# 版本
version: ${revision}
# 版权年份
copyrightYear: 2024
captcha:
enable: true
# 页面 <参数设置> 可开启关闭 验证码校验
# 验证码类型 math 数组计算 char 字符验证
type: MATH
# line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
category: CIRCLE
# 数字验证码位数
numberLength: 1
# 字符验证码长度
charLength: 4
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
@@ -41,6 +20,18 @@ server:
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
worker: 256
captcha:
enable: true
# 页面 <参数设置> 可开启关闭 验证码校验
# 验证码类型 math 数组计算 char 字符验证
type: MATH
# line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
category: CIRCLE
# 数字验证码位数
numberLength: 1
# 字符验证码长度
charLength: 4
# 日志配置
logging:
level:
@@ -61,7 +52,7 @@ user:
# Spring配置
spring:
application:
name: ${ruoyi.name}
name: RuoYi-Vue-Plus
threads:
# 开启虚拟线程 仅jdk21可用
virtual:
@@ -191,7 +182,7 @@ springdoc:
# persistAuthorization: true
info:
# 标题
title: '标题:${ruoyi.name}多租户管理系统_接口文档'
title: '标题:RuoYi-Vue-Plus多租户管理系统_接口文档'
# 描述
description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
# 版本
@@ -228,7 +219,6 @@ xss:
# 排除链接(多个用逗号分隔)
excludeUrls:
- /system/notice
- /warm-flow/save-xml
# 全局线程池相关配置
# 如使用JDK21请直接使用虚拟线程 不要开启此配置
@@ -281,3 +271,11 @@ warm-flow:
ui: true
# 默认Authorization如果有多个token用逗号分隔
token-name: ${sa-token.token-name},clientid
# 流程状态对应的三元色
chart-status-color:
## 未办理
- 62,62,62
## 待办理
- 255,205,23
## 已办理
- 157,255,0

View File

@@ -1,6 +1,6 @@
package org.dromara.test;
import org.dromara.common.core.config.RuoYiConfig;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -17,19 +17,19 @@ import java.util.concurrent.TimeUnit;
public class DemoUnitTest {
@Autowired
private RuoYiConfig ruoYiConfig;
private CaptchaProperties captchaProperties;
@DisplayName("测试 @SpringBootTest @Test @DisplayName 注解")
@Test
public void testTest() {
System.out.println(ruoYiConfig);
System.out.println(captchaProperties);
}
@Disabled
@DisplayName("测试 @Disabled 注解")
@Test
public void testDisabled() {
System.out.println(ruoYiConfig);
System.out.println(captchaProperties);
}
@Timeout(value = 2L, unit = TimeUnit.SECONDS)
@@ -37,7 +37,7 @@ public class DemoUnitTest {
@Test
public void testTimeout() throws InterruptedException {
Thread.sleep(3000);
System.out.println(ruoYiConfig);
System.out.println(captchaProperties);
}

View File

@@ -14,7 +14,7 @@
</description>
<properties>
<revision>5.3.0</revision>
<revision>5.3.1</revision>
</properties>
<dependencyManagement>

View File

@@ -1,33 +0,0 @@
package org.dromara.common.core.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 读取项目相关配置
*
* @author Lion Li
*/
@Data
@Component
@ConfigurationProperties(prefix = "ruoyi")
public class RuoYiConfig {
/**
* 项目名称
*/
private String name;
/**
* 版本
*/
private String version;
/**
* 版权年份
*/
private String copyrightYear;
}

View File

@@ -3,6 +3,7 @@ package org.dromara.common.core.config;
import jakarta.validation.Validator;
import org.hibernate.validator.HibernateValidator;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@@ -14,11 +15,11 @@ import java.util.Properties;
*
* @author Lion Li
*/
@AutoConfiguration
@AutoConfiguration(before = ValidationAutoConfiguration.class)
public class ValidatorConfig {
/**
* 配置校验框架 快速返回模式
* 配置校验框架 快速失败模式
*/
@Bean
public Validator validator(MessageSource messageSource) {
@@ -28,7 +29,7 @@ public class ValidatorConfig {
// 设置使用 HibernateValidator 校验器
factoryBean.setProviderClass(HibernateValidator.class);
Properties properties = new Properties();
// 设置 快速异常返回
// 设置快速失败模式fail-fast即校验过程中一旦遇到失败立即停止并返回错误
properties.setProperty("hibernate.validator.fail_fast", "true");
factoryBean.setValidationProperties(properties);
// 加载配置

View File

@@ -30,6 +30,11 @@ public interface CacheNames {
*/
String SYS_DICT = "sys_dict";
/**
* 数据字典类型
*/
String SYS_DICT_TYPE = "sys_dict_type";
/**
* 租户
*/

View File

@@ -17,9 +17,14 @@ public interface RegexConstants extends RegexPool {
String DICTIONARY_TYPE = "^[a-z][a-z0-9_]*$";
/**
* 权限标识必须符合 tool:build:list 格式,或者空字符串
* 权限标识必须符合以下格式:
* 1. 标准格式xxx:yyy:zzz
* - 第一部分xxx只能包含字母、数字和下划线_不能使用 `*`
* - 第二部分yyy可以包含字母、数字、下划线_和 `*`
* - 第三部分zzz可以包含字母、数字、下划线_和 `*`
* 2. 允许空字符串(""),表示没有权限标识
*/
String PERMISSION_STRING = "^(|^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+:[a-zA-Z0-9_]+)$";
String PERMISSION_STRING = "^$|^[a-zA-Z0-9_]+:[a-zA-Z0-9_*]+:[a-zA-Z0-9_*]+$";
/**
* 身份证号码后6位

View File

@@ -72,4 +72,9 @@ public interface SystemConstants {
*/
Long SUPER_ADMIN_ID = 1L;
/**
* 根部门祖级列表
*/
String ROOT_DEPT_ANCESTORS = "0";
}

View File

@@ -11,7 +11,6 @@ import java.io.Serializable;
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class DeptDTO implements Serializable {

View File

@@ -0,0 +1,41 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 字典数据DTO
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class DictDataDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 字典标签
*/
private String dictLabel;
/**
* 字典键值
*/
private String dictValue;
/**
* 是否默认Y是 N否
*/
private String isDefault;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,41 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 字典类型DTO
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class DictTypeDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 字典主键
*/
private Long dictId;
/**
* 字典名称
*/
private String dictName;
/**
* 字典类型
*/
private String dictType;
/**
* 备注
*/
private String remark;
}

View File

@@ -35,7 +35,7 @@ public class RoleDTO implements Serializable {
private String roleKey;
/**
* 数据范围1所有数据权限2自定数据权限3本部门数据权限4本部门及以下数据权限5仅本人数据权限
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限
*/
private String dataScope;

View File

@@ -6,12 +6,12 @@ import java.io.Serial;
import java.io.Serializable;
/**
* 流程办理监听
* 流程创建任务监听
*
* @author may
*/
@Data
public class ProcessTaskEvent implements Serializable {
public class ProcessCreateTaskEvent implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

View File

@@ -18,14 +18,14 @@ public class PasswordLoginBody extends LoginBody {
* 用户名
*/
@NotBlank(message = "{user.username.not.blank}")
@Length(min = 2, max = 20, message = "{user.username.length.valid}")
@Length(min = 2, max = 30, message = "{user.username.length.valid}")
private String username;
/**
* 用户密码
*/
@NotBlank(message = "{user.password.not.blank}")
@Length(min = 5, max = 20, message = "{user.password.length.valid}")
@Length(min = 5, max = 30, message = "{user.password.length.valid}")
private String password;
}

View File

@@ -1,5 +1,9 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.DictDataDTO;
import org.dromara.common.core.domain.dto.DictTypeDTO;
import java.util.List;
import java.util.Map;
/**
@@ -64,4 +68,20 @@ public interface DictService {
*/
Map<String, String> getAllDictByDictType(String dictType);
/**
* 根据字典类型查询详细信息
*
* @param dictType 字典类型
* @return 字典类型详细信息
*/
DictTypeDTO getDictType(String dictType);
/**
* 根据字典类型查询字典数据列表
*
* @param dictType 字典类型
* @return 字典数据列表
*/
List<DictDataDTO> getDictData(String dictType);
}

View File

@@ -318,6 +318,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
.stream()
.filter(Objects::nonNull)
.map(mapper)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}

View File

@@ -1,6 +1,5 @@
org.dromara.common.core.config.ApplicationConfig
org.dromara.common.core.config.AsyncConfig
org.dromara.common.core.config.RuoYiConfig
org.dromara.common.core.config.ThreadPoolConfig
org.dromara.common.core.config.ValidatorConfig
org.dromara.common.core.utils.SpringUtils

View File

@@ -76,12 +76,14 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
String encryptPassword = EncryptUtils.encryptByRsa(encryptAes, publicKey);
// 设置响应头
// vue版本需要设置
servletResponse.addHeader("Access-Control-Expose-Headers", headerFlag);
servletResponse.setHeader(headerFlag, encryptPassword);
servletResponse.setHeader("Access-Control-Allow-Origin", "*");
servletResponse.setHeader("Access-Control-Allow-Methods", "*");
servletResponse.setHeader(headerFlag, encryptPassword);
servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString());
// 获取原始内容
String originalBody = this.getContent();
// 对内容进行加密

View File

@@ -245,9 +245,10 @@ public class ExcelUtil {
.registerWriteHandler(new DataWriteHandler(data.get(0).getClass()))
.build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 单表多数据导出 模板格式为 {.属性}
for (T d : data) {
excelWriter.fill(d, writeSheet);
excelWriter.fill(d, fillConfig, writeSheet);
}
excelWriter.finish();
}
@@ -320,7 +321,7 @@ public class ExcelUtil {
// 多表导出必须使用 FillWrapper
excelWriter.fill(new FillWrapper(map.getKey(), (Collection<?>) map.getValue()), fillConfig, writeSheet);
} else {
excelWriter.fill(map.getValue(), writeSheet);
excelWriter.fill(map.getValue(), fillConfig, writeSheet);
}
}
excelWriter.finish();

View File

@@ -35,6 +35,7 @@ import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.util.ClassUtils;
import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
@@ -229,10 +230,7 @@ public class PlusDataPermissionHandler {
// 获取资源对应的类对象
Class<?> clazz = Resources.classForName(classMetadata.getClassName());
// 查找类中的特定注解
if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) {
DataPermission dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class);
dataPermissionCacheMap.put(clazz.getName(), dataPermission);
}
findAnnotation(clazz);
}
}
} catch (Exception e) {
@@ -240,6 +238,29 @@ public class PlusDataPermissionHandler {
}
}
/**
* 在指定的类中查找特定的注解 DataPermission并将带有这个注解的方法或类存储到 dataPermissionCacheMap 中
*
* @param clazz 要查找的类
*/
private void findAnnotation(Class<?> clazz) {
DataPermission dataPermission;
for (Method method : clazz.getMethods()) {
if (method.isDefault() || method.isVarArgs()) {
continue;
}
String mappedStatementId = clazz.getName() + "." + method.getName();
if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) {
dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class);
dataPermissionCacheMap.put(mappedStatementId, dataPermission);
}
}
if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) {
dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class);
dataPermissionCacheMap.put(clazz.getName(), dataPermission);
}
}
/**
* 根据映射语句 ID 或类名获取对应的 DataPermission 注解对象
*
@@ -251,6 +272,10 @@ public class PlusDataPermissionHandler {
if (DataPermissionHelper.getPermission() != null) {
return DataPermissionHelper.getPermission();
}
// 检查缓存中是否包含映射语句 ID 对应的 DataPermission 注解对象
if (dataPermissionCacheMap.containsKey(mapperId)) {
return dataPermissionCacheMap.get(mapperId);
}
// 如果缓存中不包含映射语句 ID 对应的 DataPermission 注解对象,则尝试使用类名作为键查找
String clazzName = mapperId.substring(0, mapperId.lastIndexOf("."));
if (dataPermissionCacheMap.containsKey(clazzName)) {

View File

@@ -31,11 +31,6 @@
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<exclusions>
<!-- 将基于 Netty 的 HTTP 客户端从类路径中移除 -->
<exclusion>
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
</exclusion>
<!-- 将基于 CRT 的 HTTP 客户端从类路径中移除 -->
<exclusion>
<groupId>software.amazon.awssdk</groupId>
@@ -54,10 +49,10 @@
</exclusions>
</dependency>
<!-- 使用AWS基于 CRT 的 S3 客户端 -->
<!-- 将基于 Netty 的 HTTP 客户端从类路径中移除 -->
<dependency>
<groupId>software.amazon.awssdk.crt</groupId>
<artifactId>aws-crt</artifactId>
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
</dependency>
<!-- 基于 AWS CRT 的 S3 客户端的性能增强的 S3 传输管理器 -->

View File

@@ -8,7 +8,7 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.file.FileUtils;
import org.dromara.common.oss.constant.OssConstant;
import org.dromara.common.oss.entity.UploadResult;
import org.dromara.common.oss.enumd.AccessPolicyType;
import org.dromara.common.oss.enums.AccessPolicyType;
import org.dromara.common.oss.exception.OssException;
import org.dromara.common.oss.properties.OssProperties;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
@@ -16,10 +16,10 @@ import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.ResponseInputStream;
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
import software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody;
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.S3Configuration;
import software.amazon.awssdk.services.s3.crt.S3CrtHttpConfiguration;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
@@ -84,18 +84,14 @@ public class OssClient {
// MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问
boolean isStyle = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE);
// 创建AWS基于 CRT 的 S3 客户端
this.client = S3AsyncClient.crtBuilder()
// 创建AWS基于 Netty 的 S3 客户端
this.client = S3AsyncClient.builder()
.credentialsProvider(credentialsProvider)
.endpointOverride(URI.create(getEndpoint()))
.region(of())
.targetThroughputInGbps(20.0)
.minimumPartSizeInBytes(10 * 1025 * 1024L)
.checksumValidationEnabled(false)
.forcePathStyle(isStyle)
.httpConfiguration(S3CrtHttpConfiguration.builder()
.connectionTimeout(Duration.ofSeconds(60)) // 设置连接超时
.build())
.httpClient(NettyNioAsyncHttpClient.builder()
.connectionTimeout(Duration.ofSeconds(60)).build())
.build();
//AWS基于 CRT 的 S3 AsyncClient 实例用作 S3 传输管理器的底层客户端

View File

@@ -1,4 +1,4 @@
package org.dromara.common.oss.enumd;
package org.dromara.common.oss.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;

View File

@@ -78,6 +78,7 @@ public class CaffeineCacheDecorator implements Cache {
@Override
public void clear() {
CAFFEINE.invalidateAll();
cache.clear();
}

View File

@@ -63,23 +63,25 @@ public class LoginHelper {
/**
* 获取用户(多级缓存)
*/
public static LoginUser getLoginUser() {
@SuppressWarnings("unchecked cast")
public static <T extends LoginUser> T getLoginUser() {
SaSession session = StpUtil.getTokenSession();
if (ObjectUtil.isNull(session)) {
return null;
}
return (LoginUser) session.get(LOGIN_USER_KEY);
return (T) session.get(LOGIN_USER_KEY);
}
/**
* 获取用户基于token
*/
public static LoginUser getLoginUser(String token) {
@SuppressWarnings("unchecked cast")
public static <T extends LoginUser> T getLoginUser(String token) {
SaSession session = StpUtil.getTokenSessionByToken(token);
if (ObjectUtil.isNull(session)) {
return null;
}
return (LoginUser) session.get(LOGIN_USER_KEY);
return (T) session.get(LOGIN_USER_KEY);
}
/**
@@ -191,7 +193,11 @@ public class LoginHelper {
* @return 结果
*/
public static boolean isTenantAdmin() {
return Convert.toBool(isTenantAdmin(getLoginUser().getRolePermission()));
LoginUser loginUser = getLoginUser();
if (loginUser == null) {
return false;
}
return Convert.toBool(isTenantAdmin(loginUser.getRolePermission()));
}
/**

View File

@@ -65,6 +65,9 @@ public class SseEmitterManager {
* @param token 用户的唯一令牌,用于识别具体的连接
*/
public void disconnect(Long userId, String token) {
if (userId == null || token == null) {
return;
}
Map<String, SseEmitter> emitters = USER_TOKEN_EMITTERS.get(userId);
if (MapUtil.isNotEmpty(emitters)) {
try {

View File

@@ -26,7 +26,7 @@ public class SseMessageUtils {
}
/**
* 向指定的WebSocket会话发送消息
* 向指定的SSE会话发送消息
*
* @param userId 要发送消息的用户id
* @param message 要发送的消息内容

View File

@@ -59,9 +59,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<!-- <fork>true</fork> &lt;!&ndash; 如果没有该配置devtools不会生效 &ndash;&gt;-->
</configuration>
<executions>
<execution>
<goals>

View File

@@ -19,6 +19,7 @@ spring:
admin:
ui:
title: RuoYi-Vue-Plus服务监控中心
context-path: /admin
--- # Actuator 监控端点的配置项
management:
@@ -37,7 +38,7 @@ spring.boot.admin.client:
# 增加客户端开关
enabled: true
# 设置 Spring Boot Admin Server 地址
url: http://localhost:9090
url: http://localhost:9090/admin
instance:
service-host-type: IP
metadata:

View File

@@ -22,28 +22,15 @@ snail-job:
job-pull-page-size: 1000
# 服务器端口
server-port: 17888
# 一个客户端每秒最多接收的重试数量指令
limiter: 1000
# 号段模式下步长配置
step: 100
# 日志保存时间(单位: day)
log-storage: 90
# 回调配置
callback:
#回调最大执行次数
max-count: 288
#间隔时间
trigger-interval: 900
# 重试每次拉取的次数
retry-max-pull-count: 10
# RPC通讯类型: netty,grpc
log-storage: 7
rpc-type: grpc
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
enabled: true
url: http://localhost:9090
url: http://localhost:9090/admin
instance:
service-host-type: IP
metadata:

View File

@@ -22,28 +22,15 @@ snail-job:
job-pull-page-size: 1000
# 服务器端口
server-port: 17888
# 一个客户端每秒最多接收的重试数量指令
limiter: 1000
# 号段模式下步长配置
step: 100
# 日志保存时间(单位: day)
log-storage: 90
# 回调配置
callback:
#回调最大执行次数
max-count: 288
#间隔时间
trigger-interval: 900
# 重试每次拉取的次数
retry-max-pull-count: 10
# RPC通讯类型: netty,grpc
log-storage: 7
rpc-type: grpc
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
enabled: true
url: http://localhost:9090
url: http://localhost:9090/admin
instance:
service-host-type: IP
metadata:

View File

@@ -1,5 +1,6 @@
package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -8,6 +9,8 @@ import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
/**
* 部门表 sys_dept
@@ -80,4 +83,10 @@ public class SysDept extends TenantEntity {
*/
private String ancestors;
/**
* 子部门
*/
@TableField(exist = false)
private List<SysDept> children = new ArrayList<>();
}

View File

@@ -42,6 +42,11 @@ public class SysOss extends TenantEntity {
*/
private String url;
/**
* 扩展字段
*/
private String ext1;
/**
* 服务商
*/

View File

@@ -42,7 +42,7 @@ public class SysRole extends TenantEntity {
private Integer roleSort;
/**
* 数据范围1所有数据权限2自定数据权限3本部门数据权限4本部门及以下数据权限5仅本人数据权限
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限
*/
private String dataScope;

View File

@@ -73,4 +73,9 @@ public class SysDeptBo extends BaseEntity {
*/
private String status;
/**
* 归属部门id部门树
*/
private Long belongDeptId;
}

View File

@@ -41,6 +41,11 @@ public class SysOssBo extends BaseEntity {
*/
private String url;
/**
* 扩展字段
*/
private String ext1;
/**
* 服务商
*/

View File

@@ -49,7 +49,7 @@ public class SysRoleBo extends BaseEntity {
private Integer roleSort;
/**
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限
*/
private String dataScope;

View File

@@ -103,6 +103,11 @@ public class SysUserBo extends BaseEntity {
*/
private Long roleId;
/**
* 用户ID
*/
private String userIds;
/**
* 排除不查询的用户(工作流用)
*/

View File

@@ -2,15 +2,17 @@ package org.dromara.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.system.domain.SysDept;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 部门视图对象 sys_dept
@@ -99,4 +101,9 @@ public class SysDeptVo implements Serializable {
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
* 子部门
*/
private List<SysDept> children = new ArrayList<>();
}

View File

@@ -47,6 +47,11 @@ public class SysOssVo implements Serializable {
*/
private String url;
/**
* 扩展字段
*/
private String ext1;
/**
* 创建时间
*/

View File

@@ -51,10 +51,10 @@ public class SysRoleVo implements Serializable {
private Integer roleSort;
/**
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限
*/
@ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
@ExcelDictFormat(readConverterExp = "1=全部数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限,6=部门及以下或本人数据权限")
private String dataScope;
/**

View File

@@ -1,6 +1,8 @@
package org.dromara.system.service;
import cn.hutool.core.lang.tree.Tree;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.vo.SysDeptVo;
@@ -12,6 +14,16 @@ import java.util.List;
* @author Lion Li
*/
public interface ISysDeptService {
/**
* 分页查询部门管理数据
*
* @param dept 部门信息
* @param pageQuery 分页对象
* @return 部门信息集合
*/
TableDataInfo<SysDeptVo> selectPageDeptList(SysDeptBo dept, PageQuery pageQuery);
/**
* 查询部门管理数据
*

View File

@@ -16,10 +16,17 @@ import java.util.List;
public interface ISysUserService {
/**
* 根据条件分页查询用户列表
*
* @param user 用户信息
* @param pageQuery 发呢也
* @return 用户信息
*/
TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery);
/**
* 根据条件分页查询用户列表
* 导出用户列表
*
* @param user 用户信息
* @return 用户信息集合信息
@@ -29,7 +36,8 @@ public interface ISysUserService {
/**
* 根据条件分页查询已分配用户角色列表
*
* @param user 用户信息
* @param user 用户信息
* @param pageQuery 分页
* @return 用户信息集合信息
*/
TableDataInfo<SysUserVo> selectAllocatedList(SysUserBo user, PageQuery pageQuery);
@@ -37,7 +45,8 @@ public interface ISysUserService {
/**
* 根据条件分页查询未分配用户角色列表
*
* @param user 用户信息
* @param user 用户信息
* @param pageQuery 分页
* @return 用户信息集合信息
*/
TableDataInfo<SysUserVo> selectUnallocatedList(SysUserBo user, PageQuery pageQuery);

View File

@@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.SystemConstants;
@@ -15,6 +16,8 @@ import org.dromara.common.core.domain.dto.DeptDTO;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.DeptService;
import org.dromara.common.core.utils.*;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.helper.DataBaseHelper;
import org.dromara.common.redis.utils.CacheUtils;
import org.dromara.common.satoken.utils.LoginHelper;
@@ -50,6 +53,19 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
private final SysRoleMapper roleMapper;
private final SysUserMapper userMapper;
/**
* 分页查询部门管理数据
*
* @param dept 部门信息
* @param pageQuery 分页对象
* @return 部门信息集合
*/
@Override
public TableDataInfo<SysDeptVo> selectPageDeptList(SysDeptBo dept, PageQuery pageQuery) {
Page<SysDeptVo> page = baseMapper.selectPageDeptList(pageQuery.build(), buildQueryWrapper(dept));
return TableDataInfo.build(page);
}
/**
* 查询部门管理数据
*
@@ -87,6 +103,16 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
lqw.orderByAsc(SysDept::getParentId);
lqw.orderByAsc(SysDept::getOrderNum);
lqw.orderByAsc(SysDept::getDeptId);
if (ObjectUtil.isNotNull(bo.getBelongDeptId())) {
//部门树搜索
lqw.and(x -> {
Long parentId = bo.getBelongDeptId();
List<SysDept> deptList = baseMapper.selectListByParentId(parentId);
List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
deptIds.add(parentId);
x.in(SysDept::getDeptId, deptIds);
});
}
return lqw;
}
@@ -323,8 +349,10 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
dept.setAncestors(oldDept.getAncestors());
}
int result = baseMapper.updateById(dept);
if (SystemConstants.NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
&& !StringUtils.equals(SystemConstants.NORMAL, dept.getAncestors())) {
// 如果部门状态为启用,且部门祖级列表不为空,且部门祖级列表不等于根部门祖级列表(如果部门祖级列表不等于根部门祖级列表,则说明存在上级部门)
if (SystemConstants.NORMAL.equals(dept.getStatus())
&& StringUtils.isNotEmpty(dept.getAncestors())
&& !StringUtils.equals(SystemConstants.ROOT_DEPT_ANCESTORS, dept.getAncestors())) {
// 如果该部门是启用状态,则启用该部门的所有上级部门
updateParentDeptStatusNormal(dept);
}

View File

@@ -1,5 +1,6 @@
package org.dromara.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -8,6 +9,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.domain.dto.DictDataDTO;
import org.dromara.common.core.domain.dto.DictTypeDTO;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.DictService;
import org.dromara.common.core.utils.MapstructUtils;
@@ -30,10 +33,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -121,6 +121,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
* @param dictType 字典类型
* @return 字典类型
*/
@Cacheable(cacheNames = CacheNames.SYS_DICT_TYPE, key = "#dictType")
@Override
public SysDictTypeVo selectDictTypeByType(String dictType) {
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getDictType, dictType));
@@ -140,6 +141,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName()));
}
CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType());
CacheUtils.evict(CacheNames.SYS_DICT_TYPE, dictType.getDictType());
}
baseMapper.deleteByIds(Arrays.asList(dictIds));
}
@@ -150,6 +152,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
@Override
public void resetDictCache() {
CacheUtils.clear(CacheNames.SYS_DICT);
CacheUtils.clear(CacheNames.SYS_DICT_TYPE);
}
/**
@@ -188,6 +191,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
int row = baseMapper.updateById(dict);
if (row > 0) {
CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType());
CacheUtils.evict(CacheNames.SYS_DICT_TYPE, oldDict.getDictType());
return dictDataMapper.selectDictDataByType(dict.getDictType());
}
throw new ServiceException("操作失败");
@@ -249,10 +253,45 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
}
}
/**
* 获取字典下所有的字典值与标签
*
* @param dictType 字典类型
* @return dictValue为keydictLabel为值组成的Map
*/
@Override
public Map<String, String> getAllDictByDictType(String dictType) {
List<SysDictDataVo> list = selectDictDataByType(dictType);
return StreamUtils.toMap(list, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel);
List<SysDictDataVo> list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
// 保证顺序
LinkedHashMap<String, String> map = new LinkedHashMap<>();
for (SysDictDataVo vo : list) {
map.put(vo.getDictValue(), vo.getDictLabel());
}
return map;
}
/**
* 根据字典类型查询详细信息
*
* @param dictType 字典类型
* @return 字典类型详细信息
*/
@Override
public DictTypeDTO getDictType(String dictType) {
SysDictTypeVo vo = SpringUtils.getAopProxy(this).selectDictTypeByType(dictType);
return BeanUtil.toBean(vo, DictTypeDTO.class);
}
/**
* 根据字典类型查询字典数据列表
*
* @param dictType 字典类型
* @return 字典数据列表
*/
@Override
public List<DictDataDTO> getDictData(String dictType) {
List<SysDictDataVo> list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
return BeanUtil.copyToList(list, DictDataDTO.class);
}
}

View File

@@ -21,7 +21,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.entity.UploadResult;
import org.dromara.common.oss.enumd.AccessPolicyType;
import org.dromara.common.oss.enums.AccessPolicyType;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.system.domain.SysOss;
import org.dromara.system.domain.bo.SysOssBo;

View File

@@ -154,6 +154,7 @@ public class SysPostServiceImpl implements ISysPostService, PostService {
public boolean checkPostNameUnique(SysPostBo post) {
boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysPost>()
.eq(SysPost::getPostName, post.getPostName())
.eq(SysPost::getDeptId, post.getDeptId())
.ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId()));
return !exist;
}

View File

@@ -1,32 +1,28 @@
package org.dromara.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import cn.hutool.core.convert.Convert;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
import org.dromara.common.core.domain.model.TaskAssigneeBody;
import org.dromara.common.core.service.TaskAssigneeService;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.SysPost;
import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysUser;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.bo.SysPostBo;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.domain.vo.SysPostVo;
import org.dromara.system.domain.vo.SysRoleVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysDeptMapper;
import org.dromara.system.mapper.SysPostMapper;
import org.dromara.system.mapper.SysRoleMapper;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysDeptService;
import org.dromara.system.service.ISysPostService;
import org.dromara.system.service.ISysRoleService;
import org.dromara.system.service.ISysUserService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 工作流设计器获取任务执行人
@@ -37,10 +33,11 @@ import java.util.List;
@Service
public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
private final SysPostMapper postMapper;
private final SysDeptMapper deptMapper;
private final SysUserMapper userMapper;
private final SysRoleMapper roleMapper;
// 上级Service注入下级Service 其他Service永远不可能注入当前类 避免循环注入
private final ISysPostService postService;
private final ISysDeptService deptService;
private final ISysUserService userService;
private final ISysRoleService roleService;
/**
* 查询角色并返回任务指派的列表,支持分页
@@ -51,16 +48,15 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
@Override
public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) {
PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
QueryWrapper<SysRole> wrapper = Wrappers.query();
wrapper.eq("r.del_flag", SystemConstants.NORMAL)
.like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), "r.role_name", taskQuery.getHandlerCode())
.like(StringUtils.isNotBlank(taskQuery.getHandlerName()), "r.role_key", taskQuery.getHandlerName())
.between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()),
"r.create_time", taskQuery.getBeginTime(), taskQuery.getEndTime())
.orderByAsc("r.role_sort").orderByAsc("r.create_time");
Page<SysRoleVo> page = roleMapper.selectPageRoleList(pageQuery.build(), wrapper);
SysRoleBo bo = new SysRoleBo();
bo.setRoleName(taskQuery.getHandlerCode());
bo.setRoleKey(taskQuery.getHandlerName());
Map<String, Object> params = bo.getParams();
params.put("beginTime", taskQuery.getBeginTime());
params.put("endTime", taskQuery.getEndTime());
TableDataInfo<SysRoleVo> page = roleService.selectPageRoleList(bo, pageQuery);
// 使用封装的字段映射方法进行转换
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime);
return new TaskAssigneeDTO(page.getTotal(), handlers);
}
@@ -74,23 +70,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
@Override
public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) {
PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
LambdaQueryWrapper<SysPost> wrapper = Wrappers.<SysPost>lambdaQuery()
.like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysPost::getPostCategory, taskQuery.getHandlerCode())
.like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysPost::getPostName, taskQuery.getHandlerName())
.between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()),
SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime());
if (StringUtils.isNotBlank(taskQuery.getGroupId())) {
Long belongDeptId = Long.valueOf(taskQuery.getGroupId());
wrapper.and(x -> {
List<SysDept> deptList = deptMapper.selectListByParentId(belongDeptId);
List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
deptIds.add(belongDeptId);
x.in(SysPost::getDeptId, deptIds);
});
}
Page<SysPostVo> page = postMapper.selectPagePostList(pageQuery.build(), wrapper);
SysPostBo bo = new SysPostBo();
bo.setPostCategory(taskQuery.getHandlerCode());
bo.setPostName(taskQuery.getHandlerName());
Map<String, Object> params = bo.getParams();
params.put("beginTime", taskQuery.getBeginTime());
params.put("endTime", taskQuery.getEndTime());
bo.setBelongDeptId(Convert.toLong(taskQuery.getGroupId()));
TableDataInfo<SysPostVo> page = postService.selectPagePostList(bo, pageQuery);
// 使用封装的字段映射方法进行转换
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptId, SysPostVo::getCreateTime);
return new TaskAssigneeDTO(page.getTotal(), handlers);
}
@@ -104,29 +93,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
@Override
public TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery) {
PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
LambdaQueryWrapper<SysDept> wrapper = Wrappers.<SysDept>lambdaQuery()
.eq(SysDept::getDelFlag, SystemConstants.NORMAL)
.like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode())
.like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName())
.between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()),
SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime())
.orderByAsc(SysDept::getAncestors)
.orderByAsc(SysDept::getParentId)
.orderByAsc(SysDept::getOrderNum)
.orderByAsc(SysDept::getDeptId);
if (StringUtils.isNotBlank(taskQuery.getGroupId())) {
//部门树搜索
wrapper.and(x -> {
Long parentId = Long.valueOf(taskQuery.getGroupId());
List<SysDept> deptList = deptMapper.selectListByParentId(parentId);
List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
deptIds.add(parentId);
x.in(SysDept::getDeptId, deptIds);
});
}
Page<SysDeptVo> page = deptMapper.selectPageDeptList(pageQuery.build(), wrapper);
SysDeptBo bo = new SysDeptBo();
bo.setDeptCategory(taskQuery.getHandlerCode());
bo.setDeptName(taskQuery.getHandlerName());
Map<String, Object> params = bo.getParams();
params.put("beginTime", taskQuery.getBeginTime());
params.put("endTime", taskQuery.getEndTime());
bo.setBelongDeptId(Convert.toLong(taskQuery.getGroupId()));
TableDataInfo<SysDeptVo> page = deptService.selectPageDeptList(bo, pageQuery);
// 使用封装的字段映射方法进行转换
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentId, SysDeptVo::getCreateTime);
return new TaskAssigneeDTO(page.getTotal(), handlers);
}
@@ -141,26 +117,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
@Override
public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) {
PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
QueryWrapper<SysUser> wrapper = Wrappers.query();
wrapper.eq("u.del_flag", SystemConstants.NORMAL)
.like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), "u.user_name", taskQuery.getHandlerCode())
.like(StringUtils.isNotBlank(taskQuery.getHandlerName()), "u.nick_name", taskQuery.getHandlerName())
.between(taskQuery.getBeginTime() != null && taskQuery.getEndTime() != null,
"u.create_time", taskQuery.getBeginTime(), taskQuery.getEndTime())
.orderByAsc("u.user_id");
if (StringUtils.isNotBlank(taskQuery.getGroupId())) {
//部门树搜索
wrapper.and(x -> {
Long parentId = Long.valueOf(taskQuery.getGroupId());
List<SysDept> deptList = deptMapper.selectListByParentId(parentId);
List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
deptIds.add(parentId);
x.in("u.dept_id", deptIds);
});
}
Page<SysUserVo> page = userMapper.selectPageUserList(pageQuery.build(), wrapper);
SysUserBo bo = new SysUserBo();
bo.setUserName(taskQuery.getHandlerCode());
bo.setNickName(taskQuery.getHandlerName());
Map<String, Object> params = bo.getParams();
params.put("beginTime", taskQuery.getBeginTime());
params.put("endTime", taskQuery.getEndTime());
bo.setDeptId(Convert.toLong(taskQuery.getGroupId()));
TableDataInfo<SysUserVo> page = userService.selectPageUserList(bo, pageQuery);
// 使用封装的字段映射方法进行转换
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptId, SysUserVo::getCreateTime);
return new TaskAssigneeDTO(page.getTotal(), handlers);
}

View File

@@ -179,10 +179,20 @@ public class SysTenantServiceImpl implements ISysTenantService {
for (SysDictType dictType : dictTypeList) {
dictType.setDictId(null);
dictType.setTenantId(tenantId);
dictType.setCreateDept(null);
dictType.setCreateBy(null);
dictType.setCreateTime(null);
dictType.setUpdateBy(null);
dictType.setUpdateTime(null);
}
for (SysDictData dictData : dictDataList) {
dictData.setDictCode(null);
dictData.setTenantId(tenantId);
dictData.setCreateDept(null);
dictData.setCreateBy(null);
dictData.setCreateTime(null);
dictData.setUpdateBy(null);
dictData.setUpdateTime(null);
}
dictTypeMapper.insertBatch(dictTypeList);
dictDataMapper.insertBatch(dictDataList);
@@ -192,6 +202,11 @@ public class SysTenantServiceImpl implements ISysTenantService {
for (SysConfig config : sysConfigList) {
config.setConfigId(null);
config.setTenantId(tenantId);
config.setCreateDept(null);
config.setCreateBy(null);
config.setCreateTime(null);
config.setUpdateBy(null);
config.setUpdateTime(null);
}
configMapper.insertBatch(sysConfigList);
@@ -433,6 +448,9 @@ public class SysTenantServiceImpl implements ISysTenantService {
data.setTenantId(tenantId);
data.setCreateTime(null);
data.setUpdateTime(null);
data.setCreateDept(null);
data.setCreateBy(null);
data.setUpdateBy(null);
set.add(tenantId);
saveDataList.add(data);
}
@@ -454,6 +472,9 @@ public class SysTenantServiceImpl implements ISysTenantService {
data.setTenantId(tenantId);
data.setCreateTime(null);
data.setUpdateTime(null);
data.setCreateDept(null);
data.setCreateBy(null);
data.setUpdateBy(null);
set.add(tenantId);
saveDataList.add(data);
}

View File

@@ -79,6 +79,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
QueryWrapper<SysUser> wrapper = Wrappers.query();
wrapper.eq("u.del_flag", SystemConstants.NORMAL)
.eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId())
.in(StringUtils.isNotBlank(user.getUserIds()), "u.user_id", StringUtils.splitTo(user.getUserIds(), Convert::toLong))
.like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
.eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())

View File

@@ -1,3 +0,0 @@
# 工作流说明
工作流目前在未成熟阶段 后续仍会经历重构 甚至重写(生产使用前请慎重考虑后续是否要更新维护)

View File

@@ -0,0 +1,60 @@
package org.dromara.workflow.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 按钮权限枚举
*
* @author AprilWind
*/
@Getter
@AllArgsConstructor
public enum ButtonPermissionEnum implements NodeExtEnum {
/**
* 是否弹窗选人
*/
POP("是否弹窗选人", "pop", false),
/**
* 是否能委托
*/
TRUST("是否能委托", "trust", false),
/**
* 是否能转办
*/
TRANSFER("是否能转办", "transfer", false),
/**
* 是否能抄送
*/
COPY("是否能抄送", "copy", false),
/**
* 是否显示退回
*/
BACK("是否显示退回", "back", true),
/**
* 是否能加签
*/
ADD_SIGN("是否能加签", "addSign", false),
/**
* 是否能减签
*/
SUB_SIGN("是否能减签", "subSign", false),
/**
* 是否能终止
*/
TERMINATION("是否能终止", "termination", true);
private final String label;
private final String value;
private final boolean selected;
}

View File

@@ -0,0 +1,32 @@
package org.dromara.workflow.common.enums;
/**
* 节点扩展属性枚举
*
* @author AprilWind
*/
public interface NodeExtEnum {
/**
* 选项label
*
* @return 选项label
*/
String getLabel();
/**
* 选项值
*
* @return 选项值
*/
String getValue();
/**
* 是否默认选中
*
* @return 是否默认选中
*/
boolean isSelected();
}

View File

@@ -12,6 +12,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.domain.bo.*;
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
@@ -127,6 +128,16 @@ public class FlwTaskController extends BaseController {
return R.ok(flwTaskService.selectById(taskId));
}
/**
* 获取下一节点信息
*
* @param bo 参数
*/
@PostMapping("/getNextNodeList")
public R<List<FlowNode>> getNextNodeList(@RequestBody FlowNextNodeBo bo) {
return R.ok(flwTaskService.getNextNodeList(bo));
}
/**
* 终止任务
*

View File

@@ -1,5 +1,6 @@
package org.dromara.workflow.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -8,6 +9,8 @@ import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
/**
* 流程分类对象 wf_category
@@ -55,4 +58,10 @@ public class FlowCategory extends TenantEntity {
@TableLogic
private String delFlag;
/**
* 子菜单
*/
@TableField(exist = false)
private List<FlowCategory> children = new ArrayList<>();
}

View File

@@ -58,9 +58,13 @@ public class CompleteTaskBo implements Serializable {
*/
private Map<String, Object> variables;
/**
* 弹窗选择的办理人
*/
private Map<String, Object> assigneeMap;
/**
* 扩展变量(此处为逗号分隔的ossId)
* @return
*/
private String ext;

View File

@@ -0,0 +1,38 @@
package org.dromara.workflow.domain.bo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* 下一节点信息
*
* @author may
*/
@Data
public class FlowNextNodeBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 任务id
*/
private Long taskId;
/**
* 流程变量
*/
private Map<String, Object> variables;
public Map<String, Object> getVariables() {
if (variables == null) {
return new HashMap<>(16);
}
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
return variables;
}
}

View File

@@ -0,0 +1,34 @@
package org.dromara.workflow.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 按钮权限
*
* @author may
* @date 2025-02-28
*/
@Data
public class ButtonPermission implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 枚举路径
*/
private String code;
/**
* 按钮编码
*/
private String value;
/**
* 是否显示
*/
private boolean show;
}

View File

@@ -8,7 +8,9 @@ import org.dromara.workflow.domain.FlowCategory;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@@ -64,4 +66,9 @@ public class FlowCategoryVo implements Serializable {
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
* 子菜单
*/
private List<FlowCategoryVo> children = new ArrayList<>();
}

View File

@@ -1,16 +1,20 @@
package org.dromara.workflow.domain.vo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.warm.flow.core.entity.User;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.common.enums.ButtonPermissionEnum;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
* 任务视图
@@ -173,4 +177,39 @@ public class FlowTaskVo implements Serializable {
*/
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
private String createByName;
/**
* 是否为申请人节点
*/
private boolean applyNode;
/**
* 按钮权限
*/
private List<ButtonPermission> buttonList;
public List<ButtonPermission> getButtonList(String ext) {
List<ButtonPermission> buttonPermissions = Arrays.stream(ButtonPermissionEnum.values())
.map(value -> {
ButtonPermission buttonPermission = new ButtonPermission();
buttonPermission.setCode(value.getValue());
buttonPermission.setShow(false);
return buttonPermission;
})
.collect(Collectors.toList());
if (StringUtils.isNotBlank(ext)) {
List<ButtonPermission> buttonCodeList = JSONUtil.toList(JSONUtil.parseArray(ext), ButtonPermission.class);
if (CollUtil.isNotEmpty(buttonCodeList)) {
Optional<ButtonPermission> firstPermission = buttonCodeList.stream().findFirst();
firstPermission.ifPresent(permission -> {
Set<String> codeSet = Arrays.stream(permission.getValue().split(","))
.map(String::trim)
.filter(code -> !code.isEmpty())
.collect(Collectors.toSet());
buttonPermissions.forEach(bp -> bp.setShow(codeSet.contains(bp.getCode())));
});
}
}
return buttonPermissions;
}
}

View File

@@ -1,9 +1,9 @@
package org.dromara.workflow.handler;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.event.ProcessCreateTaskEvent;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.workflow.common.ConditionalOnEnable;
@@ -23,7 +23,7 @@ import java.util.Map;
public class FlowProcessEventHandler {
/**
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等)
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
*
* @param flowCode 流程定义编码
* @param businessId 业务id
@@ -44,23 +44,23 @@ public class FlowProcessEventHandler {
}
/**
* 执行办理任务监听
* 执行创建任务监听
*
* @param flowCode 流程定义编码
* @param nodeCode 审批节点编码
* @param taskId 任务id
* @param businessId 业务id
*/
public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId) {
public void processCreateTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId) {
String tenantId = TenantHelper.getTenantId();
log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 节点编码: {}, 任务ID: {}, 业务ID: {}", tenantId, flowCode, nodeCode, taskId, businessId);
ProcessTaskEvent processTaskEvent = new ProcessTaskEvent();
processTaskEvent.setTenantId(tenantId);
processTaskEvent.setFlowCode(flowCode);
processTaskEvent.setNodeCode(nodeCode);
processTaskEvent.setTaskId(taskId);
processTaskEvent.setBusinessId(businessId);
SpringUtils.context().publishEvent(processTaskEvent);
ProcessCreateTaskEvent processCreateTaskEvent = new ProcessCreateTaskEvent();
processCreateTaskEvent.setTenantId(tenantId);
processCreateTaskEvent.setFlowCode(flowCode);
processCreateTaskEvent.setNodeCode(nodeCode);
processCreateTaskEvent.setTaskId(taskId);
processCreateTaskEvent.setBusinessId(businessId);
SpringUtils.context().publishEvent(processCreateTaskEvent);
}
/**

View File

@@ -1,10 +1,12 @@
package org.dromara.workflow.listener;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Task;
@@ -50,7 +52,7 @@ public class WorkflowGlobalListener implements GlobalListener {
Task task = listenerVariable.getTask();
if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(flowStatus)) {
// 判断流程状态(发布审批中事件)
flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), task.getNodeCode(), task.getId(), businessId);
flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), task.getNodeCode(), task.getId(), businessId);
}
}
@@ -84,12 +86,15 @@ public class WorkflowGlobalListener implements GlobalListener {
String businessId = instance.getBusinessId();
String flowStatus = instance.getFlowStatus();
Map<String, Object> params = new HashMap<>();
// 历史任务扩展(通常为附件)
params.put("hisTaskExt", listenerVariable.getFlowParams().getHisTaskExt());
// 办理人
params.put("handler", listenerVariable.getFlowParams().getHandler());
// 办理意见
params.put("message", listenerVariable.getFlowParams().getMessage());
FlowParams flowParams = listenerVariable.getFlowParams();
if (ObjectUtil.isNotNull(flowParams)) {
// 历史任务扩展(通常为附件)
params.put("hisTaskExt", flowParams.getHisTaskExt());
// 办理
params.put("handler", flowParams.getHandler());
// 办理意见
params.put("message", flowParams.getMessage());
}
// 判断流程状态(发布:撤销,退回,作废,终止,已完成事件)
String status = determineFlowStatus(instance, flowStatus);
if (StringUtils.isNotBlank(status)) {

View File

@@ -0,0 +1,76 @@
package org.dromara.workflow.service;
import org.dromara.warm.flow.core.entity.User;
import org.dromara.warm.flow.core.service.UserService;
import java.util.List;
import java.util.Set;
/**
* 通用 工作流服务
*
* @author LionLi
*/
public interface IFlwCommonService {
/**
* 获取工作流用户service
*
* @return 工作流用户service
*/
UserService getFlowUserService();
/**
* 构建工作流用户
*
* @param userList 办理用户
* @param taskId 任务ID
* @return 用户
*/
Set<User> buildUser(List<User> userList, Long taskId);
/**
* 构建工作流用户
*
* @param userIdList 办理用户
* @param taskId 任务ID
* @return 用户
*/
Set<User> buildFlowUser(List<String> userIdList, Long taskId);
/**
* 发送消息
*
* @param flowName 流程定义名称
* @param instId 实例id
* @param messageType 消息类型
* @param message 消息内容,为空则发送默认配置的消息内容
*/
void sendMessage(String flowName, Long instId, List<String> messageType, String message);
/**
* 驳回
*
* @param message 审批意见
* @param instanceId 流程实例id
* @param targetNodeCode 目标节点
* @param flowStatus 流程状态
* @param flowHisStatus 节点操作状态
*/
void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus);
/**
* 申请人节点编码
*
* @param definitionId 流程定义id
* @return 申请人节点编码
*/
String applyNodeCode(Long definitionId);
/**
* 删除运行中的任务
*
* @param taskIds 任务id
*/
void deleteRunTask(List<Long> taskIds);
}

View File

@@ -6,6 +6,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.domain.bo.*;
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
@@ -132,6 +133,14 @@ public interface IFlwTaskService {
*/
FlowTaskVo selectById(Long taskId);
/**
* 获取下一节点信息
*
* @param bo 参数
* @return 结果
*/
List<FlowNode> getNextNodeList(FlowNextNodeBo bo);
/**
* 按照任务id查询任务
*
@@ -188,4 +197,13 @@ public interface IFlwTaskService {
* @return 结果
*/
List<UserDTO> currentTaskAllUser(Long taskId);
/**
* 按照节点编码查询节点
*
* @param nodeCode 节点编码
* @param definitionId 流程定义id
* @return 节点
*/
FlowNode getByNodeCode(String nodeCode, Long definitionId);
}

View File

@@ -1,10 +1,10 @@
package org.dromara.workflow.utils;
package org.dromara.workflow.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
@@ -28,9 +28,13 @@ import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.warm.flow.orm.entity.FlowUser;
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.MessageTypeEnum;
import org.dromara.workflow.common.enums.TaskAssigneeType;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashSet;
@@ -42,24 +46,26 @@ import java.util.stream.Collectors;
/**
* 工作流工具
*
* @author may
* @author LionLi
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class WorkflowUtils {
@ConditionalOnEnable
@Slf4j
@RequiredArgsConstructor
@Service
public class FlwCommonServiceImpl implements IFlwCommonService {
private static final IFlwTaskAssigneeService TASK_ASSIGNEE_SERVICE = SpringUtils.getBean(IFlwTaskAssigneeService.class);
private static final IFlwTaskService FLW_TASK_SERVICE = SpringUtils.getBean(IFlwTaskService.class);
private static final FlowNodeMapper FLOW_NODE_MAPPER = SpringUtils.getBean(FlowNodeMapper.class);
private static final FlowTaskMapper FLOW_TASK_MAPPER = SpringUtils.getBean(FlowTaskMapper.class);
private static final UserService USER_SERVICE = SpringUtils.getBean(UserService.class);
private static final TaskService TASK_SERVICE = SpringUtils.getBean(TaskService.class);
private static final NodeService NODE_SERVICE = SpringUtils.getBean(NodeService.class);
private final FlowNodeMapper flowNodeMapper;
private final FlowTaskMapper flowTaskMapper;
private final UserService userService;
private final TaskService taskService;
private final NodeService nodeService;
/**
* 获取工作流用户service
*/
public static UserService getFlowUserService() {
return USER_SERVICE;
@Override
public UserService getFlowUserService() {
return userService;
}
/**
@@ -69,15 +75,17 @@ public class WorkflowUtils {
* @param taskId 任务ID
* @return 用户
*/
public static Set<User> buildUser(List<User> userList, Long taskId) {
@Override
public Set<User> buildUser(List<User> userList, Long taskId) {
if (CollUtil.isEmpty(userList)) {
return Set.of();
}
Set<User> list = new HashSet<>();
Set<String> processedBySet = new HashSet<>();
IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class);
for (User user : userList) {
// 根据 processedBy 前缀判断处理人类型分别获取用户列表
List<UserDTO> users = TASK_ASSIGNEE_SERVICE.fetchUsersByStorageId(user.getProcessedBy());
List<UserDTO> users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy());
// 转换为 FlowUser 并添加到结果集合
if (CollUtil.isNotEmpty(users)) {
users.forEach(dto -> {
@@ -96,6 +104,33 @@ public class WorkflowUtils {
return list;
}
/**
* 构建工作流用户
*
* @param userIdList 办理用户
* @param taskId 任务ID
* @return 用户
*/
@Override
public Set<User> buildFlowUser(List<String> userIdList, Long taskId) {
if (CollUtil.isEmpty(userIdList)) {
return Set.of();
}
Set<User> list = new HashSet<>();
Set<String> processedBySet = new HashSet<>();
for (String userId : userIdList) {
if (!processedBySet.contains(userId)) {
FlowUser flowUser = new FlowUser();
flowUser.setType(TaskAssigneeType.APPROVER.getCode());
flowUser.setProcessedBy(String.valueOf(userId));
flowUser.setAssociated(taskId);
list.add(flowUser);
processedBySet.add(String.valueOf(userId));
}
}
return list;
}
/**
* 发送消息
*
@@ -103,14 +138,16 @@ public class WorkflowUtils {
* @param messageType 消息类型
* @param message 消息内容为空则发送默认配置的消息内容
*/
public static void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
@Override
public void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
List<UserDTO> userList = new ArrayList<>();
List<FlowTask> list = FLW_TASK_SERVICE.selectByInstId(instId);
List<FlowTask> list = flwTaskService.selectByInstId(instId);
if (StringUtils.isBlank(message)) {
message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
}
for (Task task : list) {
List<UserDTO> users = FLW_TASK_SERVICE.currentTaskAllUser(task.getId());
List<UserDTO> users = flwTaskService.currentTaskAllUser(task.getId());
if (CollUtil.isNotEmpty(users)) {
userList.addAll(users);
}
@@ -149,8 +186,10 @@ public class WorkflowUtils {
* @param flowStatus 流程状态
* @param flowHisStatus 节点操作状态
*/
public static void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
List<FlowTask> list = FLW_TASK_SERVICE.selectByInstId(instanceId);
@Override
public void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
List<FlowTask> list = flwTaskService.selectByInstId(instanceId);
if (CollUtil.isNotEmpty(list)) {
List<FlowTask> tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode));
if (list.size() == tasks.size()) {
@@ -158,7 +197,7 @@ public class WorkflowUtils {
}
}
for (FlowTask task : list) {
List<UserDTO> userList = FLW_TASK_SERVICE.currentTaskAllUser(task.getId());
List<UserDTO> userList = flwTaskService.currentTaskAllUser(task.getId());
FlowParams flowParams = FlowParams.build();
flowParams.nodeCode(targetNodeCode);
flowParams.message(message);
@@ -169,7 +208,7 @@ public class WorkflowUtils {
if (CollUtil.isNotEmpty(userList)) {
flowParams.handler(userList.get(0).getUserId().toString());
}
TASK_SERVICE.skip(task.getId(), flowParams);
taskService.skip(task.getId(), flowParams);
}
//解决会签多人审批问题
backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus);
@@ -181,13 +220,14 @@ public class WorkflowUtils {
* @param definitionId 流程定义id
* @return 申请人节点编码
*/
public static String applyNodeCode(Long definitionId) {
@Override
public String applyNodeCode(Long definitionId) {
//获取已发布的流程节点
List<FlowNode> flowNodes = FLOW_NODE_MAPPER.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definitionId));
List<FlowNode> flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definitionId));
AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE);
Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null);
AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE);
Node nextNode = NODE_SERVICE.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
return nextNode.getNodeCode();
}
@@ -196,11 +236,12 @@ public class WorkflowUtils {
*
* @param taskIds 任务id
*/
public static void deleteRunTask(List<Long> taskIds) {
@Override
public void deleteRunTask(List<Long> taskIds) {
if (CollUtil.isEmpty(taskIds)) {
return;
}
USER_SERVICE.deleteByTaskIds(taskIds);
FLOW_TASK_MAPPER.deleteByIds(taskIds);
userService.deleteByTaskIds(taskIds);
flowTaskMapper.deleteByIds(taskIds);
}
}

View File

@@ -33,8 +33,8 @@ import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.FlowCategory;
import org.dromara.workflow.domain.vo.FlowDefinitionVo;
import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwDefinitionService;
import org.dromara.workflow.utils.WorkflowUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -64,6 +64,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
private final FlowNodeMapper flowNodeMapper;
private final FlowSkipMapper flowSkipMapper;
private final FlwCategoryMapper flwCategoryMapper;
private final IFlwCommonService flwCommonService;
/**
* 查询流程定义列表
@@ -125,7 +126,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
List<String> errorMsg = new ArrayList<>();
if (CollUtil.isNotEmpty(flowNodes)) {
for (FlowNode flowNode : flowNodes) {
String applyNodeCode = WorkflowUtils.applyNodeCode(id);
String applyNodeCode = flwCommonService.applyNodeCode(id);
if (StringUtils.isBlank(flowNode.getPermissionFlag()) && !applyNodeCode.equals(flowNode.getNodeCode()) && NodeType.BETWEEN.getKey().equals(flowNode.getNodeType())) {
errorMsg.add(flowNode.getNodeName());
}
@@ -219,6 +220,11 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
.eq(FlowCategory::getTenantId, DEFAULT_TENANT_ID).eq(FlowCategory::getCategoryId, FlowConstant.FLOW_CATEGORY_ID));
flowCategory.setCategoryId(null);
flowCategory.setTenantId(tenantId);
flowCategory.setCreateDept(null);
flowCategory.setCreateBy(null);
flowCategory.setCreateTime(null);
flowCategory.setUpdateBy(null);
flowCategory.setUpdateTime(null);
flwCategoryMapper.insert(flowCategory);
List<Long> defIds = StreamUtils.toList(flowDefinitions, FlowDefinition::getId);
List<FlowNode> flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper<FlowNode>().in(FlowNode::getDefinitionId, defIds));

View File

@@ -46,9 +46,9 @@ import org.dromara.workflow.domain.vo.FlowVariableVo;
import org.dromara.workflow.handler.FlowProcessEventHandler;
import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.mapper.FlwInstanceMapper;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwInstanceService;
import org.dromara.workflow.service.IFlwTaskService;
import org.dromara.workflow.utils.WorkflowUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -76,6 +76,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
private final IFlwTaskService flwTaskService;
private final FlwInstanceMapper flwInstanceMapper;
private final FlwCategoryMapper flwCategoryMapper;
private final IFlwCommonService flwCommonService;
/**
* 分页查询正在运行的流程实例
@@ -185,7 +186,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
@Override
@Transactional(rollbackFor = Exception.class)
public boolean deleteByBusinessIds(List<Long> businessIds) {
List<FlowInstance> flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper<FlowInstance>().in(FlowInstance::getBusinessId, businessIds));
List<FlowInstance> flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper<FlowInstance>().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds,Convert::toStr)));
if (CollUtil.isEmpty(flowInstances)) {
log.warn("未找到对应的流程实例信息,无法执行删除操作。");
return false;
@@ -245,15 +246,15 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
}
String message = bo.getMessage();
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
String applyNodeCode = WorkflowUtils.applyNodeCode(definition.getId());
String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
//撤销
WorkflowUtils.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
flwCommonService.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
//判断或签节点是否有多个,只保留一个
List<Task> currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId()));
if (CollUtil.isNotEmpty(currentTaskList)) {
if (currentTaskList.size() > 1) {
currentTaskList.remove(0);
WorkflowUtils.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
flwCommonService.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
}
}
@@ -373,6 +374,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
Instance instance = insService.getById(instanceId);
if (instance != null) {
taskService.mergeVariable(instance, variable);
insService.updateById(instance);
}
}

View File

@@ -0,0 +1,175 @@
package org.dromara.workflow.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.DictTypeDTO;
import org.dromara.common.core.service.DictService;
import org.dromara.warm.flow.ui.service.NodeExtService;
import org.dromara.warm.flow.ui.vo.NodeExt;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.ButtonPermissionEnum;
import org.dromara.workflow.common.enums.NodeExtEnum;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 流程设计器-节点扩展属性
*
* @author AprilWind
*/
@ConditionalOnEnable
@Slf4j
@RequiredArgsConstructor
@Service
public class FlwNodeExtServiceImpl implements NodeExtService {
/**
* 权限页code
*/
private static final String PERMISSION_TAB = "wf_button_tab";
/**
* 权限页名称
*/
private static final String PERMISSION_TAB_NAME = "权限";
/**
* 基础设置
*/
private static final int TYPE_BASE_SETTING = 1;
/**
* 新页签
*/
private static final int TYPE_NEW_TAB = 2;
/**
* 存储不同 dictType 对应的配置信息
*/
private static final Map<String, Map<String, Object>> CHILD_NODE_MAP = new HashMap<>();
static {
CHILD_NODE_MAP.put(ButtonPermissionEnum.class.getSimpleName(),
Map.of("label", "权限按钮", "type", 4, "must", false, "multiple", true));
}
private final DictService dictService;
/**
* 获取节点扩展属性
*
* @return 节点扩展属性列表
*/
@Override
public List<NodeExt> getNodeExt() {
List<NodeExt> nodeExtList = new ArrayList<>();
// 构建按钮权限页面
nodeExtList.add(buildNodeExt(PERMISSION_TAB, PERMISSION_TAB_NAME, TYPE_NEW_TAB,
List.of(ButtonPermissionEnum.class)));
return nodeExtList;
}
/**
* 构建一个 `NodeExt` 对象
*
* @param code 唯一编码
* @param name 名称(新页签时,作为页签名称)
* @param type 节点类型1: 基础设置2: 新页签)
* @param sources 数据来源(枚举类或字典类型)
* @return 构建的 `NodeExt` 对象
*/
@SuppressWarnings("unchecked cast")
private NodeExt buildNodeExt(String code, String name, int type, List<Object> sources) {
NodeExt nodeExt = new NodeExt();
nodeExt.setCode(code);
nodeExt.setType(type);
nodeExt.setName(name);
nodeExt.setChilds(sources.stream()
.map(source -> {
if (source instanceof Class<?> clazz && NodeExtEnum.class.isAssignableFrom(clazz)) {
return buildChildNode((Class<? extends NodeExtEnum>) clazz);
} else if (source instanceof String dictType) {
return buildChildNode(dictType);
}
return null;
})
.filter(ObjectUtil::isNotNull)
.toList()
);
return nodeExt;
}
/**
* 根据枚举类型构建一个 `ChildNode` 对象
*
* @param enumClass 枚举类,必须实现 `NodeExtEnum` 接口
* @return 构建的 `ChildNode` 对象
*/
private NodeExt.ChildNode buildChildNode(Class<? extends NodeExtEnum> enumClass) {
if (!enumClass.isEnum()) {
return null;
}
String simpleName = enumClass.getSimpleName();
NodeExt.ChildNode childNode = buildChildNodeMap(simpleName);
// 编码此json中唯
childNode.setCode(simpleName);
// 字典,下拉框和复选框时用到
childNode.setDict(Arrays.stream(enumClass.getEnumConstants())
.map(NodeExtEnum.class::cast)
.map(x ->
new NodeExt.DictItem(x.getLabel(), x.getValue(), x.isSelected())
).toList());
return childNode;
}
/**
* 根据字典类型构建 `ChildNode` 对象
*
* @param dictType 字典类型
* @return 构建的 `ChildNode` 对象
*/
private NodeExt.ChildNode buildChildNode(String dictType) {
DictTypeDTO dictTypeDTO = dictService.getDictType(dictType);
if (ObjectUtil.isNull(dictTypeDTO)) {
return null;
}
NodeExt.ChildNode childNode = buildChildNodeMap(dictType);
// 编码此json中唯一
childNode.setCode(dictType);
// label名称
childNode.setLabel(dictTypeDTO.getDictName());
// 描述
childNode.setDesc(dictTypeDTO.getRemark());
// 字典,下拉框和复选框时用到
childNode.setDict(dictService.getDictData(dictType)
.stream().map(x ->
new NodeExt.DictItem(x.getDictLabel(), x.getDictValue(), Convert.toBool(x.getIsDefault(), false))
).toList());
return childNode;
}
/**
* 根据 CHILD_NODE_MAP 中的配置信息,构建一个基本的 ChildNode 对象
* 该方法用于设置 ChildNode 的常规属性,例如 label、type、是否必填、是否多选等
*
* @param key CHILD_NODE_MAP 的 key
* @return 返回构建好的 ChildNode 对象
*/
private NodeExt.ChildNode buildChildNodeMap(String key) {
NodeExt.ChildNode childNode = new NodeExt.ChildNode();
Map<String, Object> map = CHILD_NODE_MAP.get(key);
// label名称
childNode.setLabel((String) map.get("label"));
// 1输入框 2输入框 3下拉框 4选择框
childNode.setType(Convert.toInt(map.get("type"), 1));
// 是否必填
childNode.setMust(Convert.toBool(map.get("must"), false));
// 是否多选
childNode.setMultiple(Convert.toBool(map.get("multiple"), true));
return childNode;
}
}

View File

@@ -1,6 +1,7 @@
package org.dromara.workflow.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -25,9 +26,7 @@ import org.dromara.workflow.common.enums.TaskAssigneeEnum;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.*;
/**
* 流程设计器-获取办理人权限设置列表
@@ -132,15 +131,26 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
@Override
public List<UserDTO> fetchUsersByStorageId(String storageId) {
List<UserDTO> list = new ArrayList<>();
Map<TaskAssigneeEnum, List<Long>> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class);
for (String str : storageId.split(StrUtil.COMMA)) {
String[] parts = str.split(StrUtil.COLON, 2);
TaskAssigneeEnum type;
Long id;
if (parts.length < 2) {
list.addAll(getUsersByType(TaskAssigneeEnum.USER, List.of(Long.valueOf(parts[0]))));
// 无前缀时默认是用户类型
type = TaskAssigneeEnum.USER;
id = Long.valueOf(parts[0]);
} else {
list.addAll(getUsersByType(TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON), List.of(Long.valueOf(parts[1]))));
// 根据前缀解析类型(如 "role:123" -> ROLE 类型)
type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON);
id = Long.valueOf(parts[1]);
}
typeIdMap.computeIfAbsent(type, k -> new ArrayList<>()).add(id);
}
return list;
typeIdMap.entrySet().stream()
.filter(entry -> CollUtil.isNotEmpty(entry.getValue()))
.forEach(entry -> list.addAll(getUsersByType(entry.getKey(), entry.getValue())));
return list.stream().distinct().toList();
}
/**

View File

@@ -30,9 +30,12 @@ import org.dromara.warm.flow.core.entity.*;
import org.dromara.warm.flow.core.enums.NodeType;
import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.service.*;
import org.dromara.warm.flow.core.utils.ExpressionUtil;
import org.dromara.warm.flow.core.utils.MapUtil;
import org.dromara.warm.flow.orm.entity.*;
import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper;
import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper;
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.TaskAssigneeType;
@@ -44,8 +47,9 @@ import org.dromara.workflow.handler.FlowProcessEventHandler;
import org.dromara.workflow.handler.WorkflowPermissionHandler;
import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.mapper.FlwTaskMapper;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService;
import org.dromara.workflow.utils.WorkflowUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -79,6 +83,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
private final UserService userService;
private final FlwTaskMapper flwTaskMapper;
private final FlwCategoryMapper flwCategoryMapper;
private final FlowNodeMapper flowNodeMapper;
private final IFlwTaskAssigneeService flwTaskAssigneeService;
private final IFlwCommonService flwCommonService;
/**
* 启动任务
@@ -103,6 +110,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (ObjectUtil.isNotNull(flowInstance)) {
BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus());
List<Task> taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId()));
taskService.mergeVariable(flowInstance, variables);
insService.updateById(flowInstance);
StartProcessReturnDTO dto = new StartProcessReturnDTO();
dto.setProcessInstanceId(taskList.get(0).getInstanceId());
dto.setTaskId(taskList.get(0).getId());
@@ -155,6 +164,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) {
flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), null, true);
}
// 设置弹窗处理人
Map<String, Object> assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap());
if (CollUtil.isNotEmpty(assigneeMap)) {
completeTaskBo.getVariables().putAll(assigneeMap);
}
// 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息
FlowParams flowParams = new FlowParams();
flowParams.variable(completeTaskBo.getVariables());
@@ -167,7 +181,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Instance instance = taskService.skip(taskId, flowParams);
this.setHandler(instance, flowTask, flowCopyList);
// 消息通知
WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
flwCommonService.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
//设置下一环节处理人
setNextHandler(ins.getId());
return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
@@ -175,6 +191,60 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
}
/**
* 设置下一环节处理人
*
* @param instanceId 实例ID
*/
private void setNextHandler(Long instanceId) {
Instance inst = insService.getById(instanceId);
List<FlowTask> flowTaskList = selectByInstId(instanceId);
Map<String, Object> variableMap = inst.getVariableMap();
for (FlowTask task : flowTaskList) {
if (variableMap != null && variableMap.containsKey(task.getNodeCode())) {
String userIds = variableMap.get(task.getNodeCode()).toString();
// 批量删除现有任务的办理人记录
flwCommonService.getFlowUserService().deleteByTaskIds(List.of(task.getId()));
// 批量新增任务办理人记录
Set<User> users = flwCommonService.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId());
flwCommonService.getFlowUserService().saveBatch(new ArrayList<>(users));
variableMap.remove(task.getNodeCode());
}
}
taskService.mergeVariable(inst, variableMap);
}
/**
* 设置弹窗处理人
*
* @param assigneeMap 处理人
* @param variablesMap 变量
*/
private Map<String, Object> setPopAssigneeMap(Map<String, Object> assigneeMap, Map<String, Object> variablesMap) {
Map<String, Object> map = new HashMap<>();
if (CollUtil.isEmpty(assigneeMap)) {
return map;
}
for (Map.Entry<String, Object> entry : assigneeMap.entrySet()) {
if (variablesMap.containsKey(entry.getKey())) {
String userIds = variablesMap.get(entry.getKey()).toString();
if (StringUtils.isNotBlank(userIds)) {
Set<String> hashSet = new HashSet<>();
//弹窗传入的选人
List<String> popUserIds = Arrays.asList(entry.getValue().toString().split(StringUtils.SEPARATOR));
//已有的选人
List<String> variableUserIds = Arrays.asList(userIds.split(StringUtils.SEPARATOR));
hashSet.addAll(popUserIds);
hashSet.addAll(variableUserIds);
map.put(entry.getKey(), String.join(StringUtils.SEPARATOR, hashSet));
}
} else {
map.put(entry.getKey(), entry.getValue());
}
}
return map;
}
/**
* 设置办理人
*
@@ -195,7 +265,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
List<Long> taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId);
// 获取与当前任务关联的用户列表
List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList);
List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
if (CollUtil.isEmpty(associatedUsers)) {
return;
}
@@ -204,16 +274,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
for (FlowTask flowTask : flowTasks) {
List<User> users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId()));
if (CollUtil.isNotEmpty(users)) {
userList.addAll(WorkflowUtils.buildUser(users, flowTask.getId()));
userList.addAll(flwCommonService.buildUser(users, flowTask.getId()));
}
}
// 批量删除现有任务的办理人记录
WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIdList);
flwCommonService.getFlowUserService().deleteByTaskIds(taskIdList);
// 确保要保存的 userList 不为空
if (CollUtil.isEmpty(userList)) {
return;
}
WorkflowUtils.getFlowUserService().saveBatch(userList);
flwCommonService.getFlowUserService().saveBatch(userList);
}
/**
@@ -253,7 +323,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
return flowUser;
}).collect(Collectors.toList());
// 批量保存抄送人员
WorkflowUtils.getFlowUserService().saveBatch(userList);
flwCommonService.getFlowUserService().saveBatch(userList);
}
/**
@@ -381,7 +451,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
BusinessStatusEnum.checkBackStatus(inst.getFlowStatus());
Long definitionId = task.getDefinitionId();
Definition definition = defService.getById(definitionId);
String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId);
String applyNodeCode = flwCommonService.applyNodeCode(definitionId);
FlowParams flowParams = FlowParams.build();
flowParams.nodeCode(bo.getNodeCode());
flowParams.message(message);
@@ -394,7 +464,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Instance instance = insService.getById(inst.getId());
this.setHandler(instance, task, null);
// 消息通知
WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
@@ -487,14 +557,52 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
flowTaskVo.setFlowCode(definition.getFlowCode());
flowTaskVo.setFlowName(definition.getFlowName());
flowTaskVo.setBusinessId(instance.getBusinessId());
List<Node> nodeList = nodeService.getByNodeCodes(Collections.singletonList(flowTaskVo.getNodeCode()), instance.getDefinitionId());
if (CollUtil.isNotEmpty(nodeList)) {
Node node = nodeList.get(0);
flowTaskVo.setNodeRatio(node.getNodeRatio());
//设置按钮权限
FlowNode flowNode = getByNodeCode(flowTaskVo.getNodeCode(), instance.getDefinitionId());
if (ObjectUtil.isNull(flowNode)) {
throw new NullPointerException("当前【" + flowTaskVo.getNodeCode() + "】节点编码不存在");
}
flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt()));
flowTaskVo.setNodeRatio(flowNode.getNodeRatio());
flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(flwCommonService.applyNodeCode(task.getDefinitionId())));
return flowTaskVo;
}
/**
* 获取下一节点信息
*
* @param bo 参数
*/
@Override
public List<FlowNode> getNextNodeList(FlowNextNodeBo bo) {
Long taskId = bo.getTaskId();
Map<String, Object> variables = bo.getVariables();
Task task = taskService.getById(taskId);
Instance instance = insService.getById(task.getInstanceId());
Definition definition = defService.getById(task.getDefinitionId());
Map<String, Object> mergeVariable = MapUtil.mergeAll(instance.getVariableMap(), variables);
//获取下一节点列表
List<Node> nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), mergeVariable);
List<FlowNode> nextFlowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class);
if (CollUtil.isNotEmpty(nextNodeList)) {
//构建以下节点数据
List<Task> buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null));
//办理人变量替换
ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable);
for (FlowNode flowNode : nextFlowNodes) {
buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> {
if (CollUtil.isNotEmpty(t.getPermissionList())) {
List<UserDTO> users = flwTaskAssigneeService.fetchUsersByStorageId(String.join(StringUtils.SEPARATOR, t.getPermissionList()));
if (CollUtil.isNotEmpty(users)) {
flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId())));
}
}
});
}
}
return nextFlowNodes;
}
/**
* 按照任务id查询任务
*
@@ -577,10 +685,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
Long taskId = bo.getTaskId();
FlowTaskVo flowTaskVo = selectById(taskId);
Task task = taskService.getById(taskId);
FlowNode flowNode = getByNodeCode(task.getNodeCode(), task.getDefinitionId());
if ("addSignature".equals(taskOperation) || "reductionSignature".equals(taskOperation)) {
if (flowTaskVo.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
throw new ServiceException(flowTaskVo.getNodeName() + "不是会签节点!");
if (flowNode.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
throw new ServiceException(task.getNodeName() + "不是会签节点!");
}
}
// 设置任务状态并执行对应的任务操作
@@ -628,7 +737,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
List<FlowTask> flowTasks = this.selectByIdList(taskIdList);
// 批量删除现有任务的办理人记录
if (CollUtil.isNotEmpty(flowTasks)) {
WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
flwCommonService.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
List<User> userList = flowTasks.stream()
.map(flowTask -> {
FlowUser flowUser = new FlowUser();
@@ -639,7 +748,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
})
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(userList)) {
WorkflowUtils.getFlowUserService().saveBatch(userList);
flwCommonService.getFlowUserService().saveBatch(userList);
}
}
} catch (Exception e) {
@@ -658,7 +767,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
public Map<Long, List<UserDTO>> currentTaskAllUser(List<Long> taskIdList) {
Map<Long, List<UserDTO>> map = new HashMap<>();
// 获取与当前任务关联的用户列表
List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList);
List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
Map<Long, List<User>> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
for (Map.Entry<Long, List<User>> entry : listMap.entrySet()) {
List<User> value = entry.getValue();
@@ -678,10 +787,24 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
@Override
public List<UserDTO> currentTaskAllUser(Long taskId) {
// 获取与当前任务关联的用户列表
List<User> userList = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
List<User> userList = flwCommonService.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
if (CollUtil.isEmpty(userList)) {
return Collections.emptyList();
}
return userService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy())));
}
/**
* 按照节点编码查询节点
*
* @param nodeCode 节点编码
* @param definitionId 流程定义id
*/
@Override
public FlowNode getByNodeCode(String nodeCode, Long definitionId) {
return flowNodeMapper.selectOne(new LambdaQueryWrapper<FlowNode>()
.eq(FlowNode::getNodeCode, nodeCode)
.eq(FlowNode::getDefinitionId, definitionId));
}
}

View File

@@ -9,9 +9,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.event.ProcessCreateTaskEvent;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.service.WorkflowService;
import org.dromara.common.core.utils.MapstructUtils;
@@ -47,6 +47,19 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
private final TestLeaveMapper baseMapper;
private final WorkflowService workflowService;
/**
* spel条件表达判断小于2
*
* @param leaveDays 待判断的变量可不传自行返回true或false
* @return boolean
*/
public boolean eval(Integer leaveDays) {
if (leaveDays <= 2) {
return true;
}
return false;
}
/**
* 查询请假
*/
@@ -123,7 +136,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
}
/**
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等)
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
* 正常使用只需#processEvent.flowCode=='leave1'
* 示例为了方便则使用startsWith匹配了全部示例key
*
@@ -151,19 +164,19 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
}
/**
* 执行办理任务监听
* 示例:也可通过 @EventListener(condition = "#processTaskEvent.flowCode=='leave1'")进行判断
* 执行任务创建监听
* 示例:也可通过 @EventListener(condition = "#processCreateTaskEvent.flowCode=='leave1'")进行判断
* 在方法中判断流程节点key
* if ("xxx".equals(processTaskEvent.getNodeCode())) {
* if ("xxx".equals(processCreateTaskEvent.getNodeCode())) {
* //执行业务逻辑
* }
*
* @param processTaskEvent 参数
* @param processCreateTaskEvent 参数
*/
@EventListener(condition = "#processTaskEvent.flowCode.startsWith('leave')")
public void processTaskHandler(ProcessTaskEvent processTaskEvent) {
log.info("当前任务执行了{}", processTaskEvent.toString());
TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessId()));
@EventListener(condition = "#processCreateTaskEvent.flowCode.startsWith('leave')")
public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) {
log.info("当前任务创建了{}", processCreateTaskEvent.toString());
TestLeave testLeave = baseMapper.selectById(Long.valueOf(processCreateTaskEvent.getBusinessId()));
testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus());
baseMapper.updateById(testLeave);
}

View File

@@ -31,7 +31,7 @@
d.version,
uu.processed_by,
uu.type
from flow_task as t
from flow_task t
left join flow_user uu on uu.associated = t.id
left join flow_definition d on t.definition_id = d.id
left join flow_instance i on t.instance_id = i.id

View File

@@ -98,7 +98,7 @@ services:
network_mode: "host"
ruoyi-server1:
image: ruoyi/ruoyi-server:5.3.0
image: ruoyi/ruoyi-server:5.3.1
container_name: ruoyi-server1
environment:
# 时区上海
@@ -113,7 +113,7 @@ services:
network_mode: "host"
ruoyi-server2:
image: ruoyi/ruoyi-server:5.3.0
image: ruoyi/ruoyi-server:5.3.1
container_name: ruoyi-server2
environment:
# 时区上海
@@ -128,7 +128,7 @@ services:
network_mode: "host"
ruoyi-monitor-admin:
image: ruoyi/ruoyi-monitor-admin:5.3.0
image: ruoyi/ruoyi-monitor-admin:5.3.1
container_name: ruoyi-monitor-admin
environment:
# 时区上海
@@ -140,7 +140,7 @@ services:
network_mode: "host"
ruoyi-snailjob-server:
image: ruoyi/ruoyi-snailjob-server:5.3.0
image: ruoyi/ruoyi-snailjob-server:5.3.1
container_name: ruoyi-snailjob-server
environment:
# 时区上海

View File

@@ -14,6 +14,8 @@ http {
keepalive_timeout 65;
# 限制body大小
client_max_body_size 100m;
# 开启静态资源压缩
gzip_static on;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
@@ -96,7 +98,7 @@ http {
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://monitor-admin/;
proxy_pass http://monitor-admin/admin/;
}
location /snail-job/ {

View File

@@ -1,7 +1,7 @@
{
"flowCode" : "leave1",
"flowName" : "请假申请-普通",
"category" : "1",
"category" : "100",
"version" : "1",
"formCustom" : "N",
"formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
"nodeName" : "开始",
"nodeRatio" : 0.000,
"coordinate" : "200,200|200,200",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
"nextNodeCode" : "dd515cdd-59f6-446f-94ca-25ca062afb42",
@@ -25,8 +25,8 @@
"nodeName" : "申请人",
"nodeRatio" : 0.000,
"coordinate" : "360,200|360,200",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "dd515cdd-59f6-446f-94ca-25ca062afb42",
"nextNodeCode" : "78fa8e5b-e809-44ed-978a-41092409ebcf",
@@ -40,8 +40,8 @@
"permissionFlag" : "role:1",
"nodeRatio" : 0.000,
"coordinate" : "540,200|540,200",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "78fa8e5b-e809-44ed-978a-41092409ebcf",
"nextNodeCode" : "a8abf15f-b83e-428a-86cc-033555ea9bbe",
@@ -55,8 +55,8 @@
"permissionFlag" : "role:3,role:4",
"nodeRatio" : 0.000,
"coordinate" : "720,200|720,200",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "a8abf15f-b83e-428a-86cc-033555ea9bbe",
"nextNodeCode" : "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
@@ -69,7 +69,7 @@
"nodeName" : "结束",
"nodeRatio" : 0.000,
"coordinate" : "900,200|900,200",
"skipAnyNode" : "N",
"formCustom" : "N"
"formCustom" : "N",
"ext" : "[]"
} ]
}

View File

@@ -1,7 +1,7 @@
{
"flowCode" : "leave2",
"flowName" : "请假申请-排他网关",
"category" : "1",
"category" : "100",
"version" : "1",
"formCustom" : "N",
"formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
"nodeName" : "开始",
"nodeRatio" : 0.000,
"coordinate" : "300,240|300,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
"nextNodeCode" : "fdcae93b-b69c-498a-b231-09255e74bcbd",
@@ -25,8 +25,8 @@
"nodeName" : "申请人",
"nodeRatio" : 0.000,
"coordinate" : "440,240|440,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "fdcae93b-b69c-498a-b231-09255e74bcbd",
"nextNodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
@@ -38,8 +38,8 @@
"nodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
"nodeRatio" : 0.000,
"coordinate" : "560,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
"nextNodeCode" : "b3528155-dcb7-4445-bbdf-3d00e3499e86",
@@ -61,8 +61,8 @@
"permissionFlag" : "3,4",
"nodeRatio" : 0.000,
"coordinate" : "720,320|720,320",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "b3528155-dcb7-4445-bbdf-3d00e3499e86",
"nextNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
@@ -76,8 +76,8 @@
"permissionFlag" : "role:1",
"nodeRatio" : 0.000,
"coordinate" : "860,240|860,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
"nextNodeCode" : "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
@@ -90,8 +90,8 @@
"nodeName" : "结束",
"nodeRatio" : 0.000,
"coordinate" : "1000,240|1000,240",
"skipAnyNode" : "N",
"formCustom" : "N"
"formCustom" : "N",
"ext" : "[]"
}, {
"nodeType" : 1,
"nodeCode" : "5ed2362b-fc0c-4d52-831f-95208b830605",
@@ -99,8 +99,8 @@
"permissionFlag" : "role:1",
"nodeRatio" : 0.000,
"coordinate" : "720,160|720,160",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "5ed2362b-fc0c-4d52-831f-95208b830605",
"nextNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
@@ -108,4 +108,4 @@
"coordinate" : "770,160;860,160;860,200"
} ]
} ]
}
}

View File

@@ -1,7 +1,7 @@
{
"flowCode" : "leave3",
"flowName" : "请假申请-并行网关",
"category" : "1",
"category" : "100",
"version" : "1",
"formCustom" : "N",
"formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
"nodeName" : "开始",
"nodeRatio" : 0.000,
"coordinate" : "380,220|380,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
"nextNodeCode" : "b7bbb571-06de-455c-8083-f83c07bf0b99",
@@ -25,8 +25,8 @@
"nodeName" : "申请人",
"nodeRatio" : 0.000,
"coordinate" : "520,220|520,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "b7bbb571-06de-455c-8083-f83c07bf0b99",
"nextNodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
@@ -38,8 +38,8 @@
"nodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
"nodeRatio" : 0.000,
"coordinate" : "680,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
"nextNodeCode" : "4b7743cd-940c-431b-926f-e7b614fbf1fe",
@@ -58,8 +58,8 @@
"permissionFlag" : "role:1",
"nodeRatio" : 0.000,
"coordinate" : "800,140|800,140",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "4b7743cd-940c-431b-926f-e7b614fbf1fe",
"nextNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
@@ -71,8 +71,8 @@
"nodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
"nodeRatio" : 0.000,
"coordinate" : "920,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
"nextNodeCode" : "23e7429e-2b47-4431-b93e-40db7c431ce6",
@@ -86,8 +86,8 @@
"permissionFlag" : "1",
"nodeRatio" : 0.000,
"coordinate" : "1040,220|1040,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "23e7429e-2b47-4431-b93e-40db7c431ce6",
"nextNodeCode" : "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
@@ -100,8 +100,8 @@
"nodeName" : "结束",
"nodeRatio" : 0.000,
"coordinate" : "1160,220|1160,220",
"skipAnyNode" : "N",
"formCustom" : "N"
"formCustom" : "N",
"ext" : "[]"
}, {
"nodeType" : 1,
"nodeCode" : "762cb975-37d8-4276-b6db-79a4c3606394",
@@ -109,8 +109,8 @@
"permissionFlag" : "role:3,role:4",
"nodeRatio" : 0.000,
"coordinate" : "800,300|800,300",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "762cb975-37d8-4276-b6db-79a4c3606394",
"nextNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",

View File

@@ -1,7 +1,7 @@
{
"flowCode" : "leave4",
"flowName" : "请假申请-会签",
"category" : "1",
"category" : "100",
"version" : "1",
"formCustom" : "N",
"formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
"nodeName" : "开始",
"nodeRatio" : 0.000,
"coordinate" : "320,240|320,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
"nextNodeCode" : "e90b98ef-35b4-410c-a663-bae8b7624b9f",
@@ -25,8 +25,8 @@
"nodeName" : "申请人",
"nodeRatio" : 0.000,
"coordinate" : "460,240|460,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "e90b98ef-35b4-410c-a663-bae8b7624b9f",
"nextNodeCode" : "768b5b1a-6726-4d67-8853-4cc70d5b1045",
@@ -40,8 +40,8 @@
"permissionFlag" : "${userList}",
"nodeRatio" : 60.000,
"coordinate" : "640,240|640,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "768b5b1a-6726-4d67-8853-4cc70d5b1045",
"nextNodeCode" : "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
@@ -55,8 +55,8 @@
"permissionFlag" : "role:1,role:3",
"nodeRatio" : 100.000,
"coordinate" : "820,240|820,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
"nextNodeCode" : "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
@@ -70,8 +70,8 @@
"permissionFlag" : "1",
"nodeRatio" : 0.000,
"coordinate" : "1000,240|1000,240",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
"nextNodeCode" : "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
@@ -84,7 +84,7 @@
"nodeName" : "结束",
"nodeRatio" : 0.000,
"coordinate" : "1120,240|1120,240",
"skipAnyNode" : "N",
"formCustom" : "N"
"formCustom" : "N",
"ext" : "[]"
} ]
}

View File

@@ -1,7 +1,7 @@
{
"flowCode" : "leave5",
"flowName" : "请假申请-并行会签网关",
"category" : "1",
"category" : "100",
"version" : "1",
"formCustom" : "N",
"formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
"nodeName" : "开始",
"nodeRatio" : 0.000,
"coordinate" : "300,220|300,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
"nextNodeCode" : "e1b04e96-dc81-4858-a309-2fe945d2f374",
@@ -25,8 +25,8 @@
"nodeName" : "申请人",
"nodeRatio" : 0.000,
"coordinate" : "420,220|420,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "e1b04e96-dc81-4858-a309-2fe945d2f374",
"nextNodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
@@ -38,8 +38,8 @@
"nodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
"nodeRatio" : 0.000,
"coordinate" : "560,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
"nextNodeCode" : "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
@@ -58,8 +58,8 @@
"permissionFlag" : "role:1,role:3",
"nodeRatio" : 100.000,
"coordinate" : "700,320|700,320",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
"nextNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
@@ -71,8 +71,8 @@
"nodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
"nodeRatio" : 0.000,
"coordinate" : "860,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
"nextNodeCode" : "7a8f0473-e409-442e-a843-5c2b813d00e9",
@@ -86,8 +86,8 @@
"permissionFlag" : "1",
"nodeRatio" : 0.000,
"coordinate" : "1000,220|1000,220",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "7a8f0473-e409-442e-a843-5c2b813d00e9",
"nextNodeCode" : "03c4d2bc-58b5-4408-a2e4-65afb046f169",
@@ -100,8 +100,8 @@
"nodeName" : "结束",
"nodeRatio" : 0.000,
"coordinate" : "1140,220|1140,220",
"skipAnyNode" : "N",
"formCustom" : "N"
"formCustom" : "N",
"ext" : "[]"
}, {
"nodeType" : 1,
"nodeCode" : "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
@@ -109,8 +109,8 @@
"permissionFlag" : "${userList}",
"nodeRatio" : 60.000,
"coordinate" : "700,120|700,120",
"skipAnyNode" : "N",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
"nextNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",

215
script/leave/leave6.json Normal file
View File

@@ -0,0 +1,215 @@
{
"flowCode" : "leave6",
"flowName" : "请假申请-排他并行会签",
"category" : "100",
"version" : "1",
"formCustom" : "N",
"formPath" : "/workflow/leaveEdit/index",
"nodeList" : [ {
"nodeType" : 0,
"nodeCode" : "122b89a5-7c6f-40a3-aa09-7a263f902054",
"nodeName" : "开始",
"nodeRatio" : 0.000,
"coordinate" : "240,300|240,300",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "122b89a5-7c6f-40a3-aa09-7a263f902054",
"nextNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
"skipType" : "PASS",
"coordinate" : "260,300;350,300"
} ]
}, {
"nodeType" : 1,
"nodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
"nodeName" : "申请人",
"nodeRatio" : 0.000,
"coordinate" : "400,300|400,300",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
"nextNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742",
"skipType" : "PASS",
"coordinate" : "450,300;510,300"
} ]
}, {
"nodeType" : 1,
"nodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
"nodeName" : "副经理",
"permissionFlag" : "role:1@@role:3@@role:4",
"nodeRatio" : 0.000,
"coordinate" : "860,200|860,200",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
"nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32",
"skipType" : "PASS",
"coordinate" : "910,200;1000,200;1000,275"
} ]
}, {
"nodeType" : 1,
"nodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
"nodeName" : "组长",
"permissionFlag" : "1",
"nodeRatio" : 0.000,
"coordinate" : "860,400|860,400",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
"nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32",
"skipType" : "PASS",
"coordinate" : "910,400;1000,400;1000,325"
} ]
}, {
"nodeType" : 1,
"nodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742",
"nodeName" : "副组长",
"permissionFlag" : "1",
"nodeRatio" : 0.000,
"coordinate" : "560,300|560,300",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,transfer,copy,pop\"}]",
"skipList" : [ {
"nowNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742",
"nextNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13",
"skipType" : "PASS",
"coordinate" : "610,300;675,300"
} ]
}, {
"nodeType" : 3,
"nodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13",
"nodeRatio" : 0.000,
"coordinate" : "700,300",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13",
"nextNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
"skipName" : "大于两天",
"skipType" : "PASS",
"skipCondition" : "default@@${leaveDays > 2}",
"coordinate" : "700,275;700,200;810,200|700,237"
}, {
"nowNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13",
"nextNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
"skipType" : "PASS",
"skipCondition" : "spel@@#{@testLeaveServiceImpl.eval(#leaveDays)}",
"coordinate" : "700,325;700,400;810,400"
} ]
}, {
"nodeType" : 3,
"nodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32",
"nodeRatio" : 0.000,
"coordinate" : "1000,300",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32",
"nextNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496",
"skipType" : "PASS",
"coordinate" : "1025,300;1130,300"
} ]
}, {
"nodeType" : 1,
"nodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496",
"nodeName" : "经理会签",
"permissionFlag" : "1@@3",
"nodeRatio" : 100.000,
"coordinate" : "1180,300|1180,300",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,pop,addSign,subSign\"}]",
"skipList" : [ {
"nowNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496",
"nextNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992",
"skipType" : "PASS",
"coordinate" : "1230,300;1315,300"
} ]
}, {
"nodeType" : 4,
"nodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992",
"nodeRatio" : 0.000,
"coordinate" : "1340,300",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992",
"nextNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
"skipType" : "PASS",
"coordinate" : "1340,325;1340,400;1430,400"
}, {
"nowNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992",
"nextNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4",
"skipType" : "PASS",
"coordinate" : "1340,275;1340,200;1430,200"
} ]
}, {
"nodeType" : 1,
"nodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4",
"nodeName" : "总经理",
"permissionFlag" : "3@@1",
"nodeRatio" : 0.000,
"coordinate" : "1480,200|1480,200",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4",
"nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519",
"skipType" : "PASS",
"coordinate" : "1530,200;1640,200;1640,275"
} ]
}, {
"nodeType" : 1,
"nodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
"nodeName" : "副总经理",
"permissionFlag" : "1@@3",
"nodeRatio" : 0.000,
"coordinate" : "1480,400|1480,400",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
"nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519",
"skipType" : "PASS",
"coordinate" : "1530,400;1640,400;1640,325"
} ]
}, {
"nodeType" : 4,
"nodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519",
"nodeRatio" : 0.000,
"coordinate" : "1640,300",
"formCustom" : "N",
"ext" : "[]",
"skipList" : [ {
"nowNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519",
"nextNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828",
"skipType" : "PASS",
"coordinate" : "1665,300;1770,300"
} ]
}, {
"nodeType" : 1,
"nodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828",
"nodeName" : "董事",
"permissionFlag" : "1",
"nodeRatio" : 0.000,
"coordinate" : "1820,300|1820,300",
"formCustom" : "N",
"ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
"skipList" : [ {
"nowNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828",
"nextNodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31",
"skipType" : "PASS",
"coordinate" : "1870,300;1960,300"
} ]
}, {
"nodeType" : 2,
"nodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31",
"nodeName" : "结束",
"nodeRatio" : 0.000,
"coordinate" : "1980,300|1980,300",
"formCustom" : "N",
"ext" : "[]"
} ]
}

View File

@@ -1,8 +1,9 @@
/*
SnailJob Database Transfer Tool
Source Server Type : MySQL
Target Server Type : Oracle
Date: 2024-12-27 22:22:15
Date: 2025-02-25 22:16:28
*/
@@ -48,7 +49,6 @@ CREATE TABLE sj_group_config
group_partition number NOT NULL,
id_generator_mode smallint DEFAULT 1 NOT NULL,
init_scene smallint DEFAULT 0 NOT NULL,
bucket_index number DEFAULT 0 NOT NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL,
update_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
);
@@ -68,13 +68,12 @@ COMMENT ON COLUMN sj_group_config.version IS '版本号';
COMMENT ON COLUMN sj_group_config.group_partition IS '分区';
COMMENT ON COLUMN sj_group_config.id_generator_mode IS '唯一id生成模式 默认号段模式';
COMMENT ON COLUMN sj_group_config.init_scene IS '是否初始化场景 0:否 1:是';
COMMENT ON COLUMN sj_group_config.bucket_index IS 'bucket';
COMMENT ON COLUMN sj_group_config.create_dt IS '创建时间';
COMMENT ON COLUMN sj_group_config.update_dt IS '修改时间';
COMMENT ON TABLE sj_group_config IS '组配置';
INSERT INTO sj_group_config (namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt) VALUES ('dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, sysdate, sysdate);
INSERT INTO sj_group_config (namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt) VALUES ('prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, sysdate, sysdate);
INSERT INTO sj_group_config (namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) VALUES ('dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, sysdate, sysdate);
INSERT INTO sj_group_config (namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) VALUES ('prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, sysdate, sysdate);
-- sj_notify_config
CREATE TABLE sj_notify_config
@@ -144,12 +143,11 @@ COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间';
COMMENT ON COLUMN sj_notify_recipient.update_dt IS '修改时间';
COMMENT ON TABLE sj_notify_recipient IS '告警通知接收人';
-- sj_retry_dead_letter_0
CREATE TABLE sj_retry_dead_letter_0
-- sj_retry_dead_letter
CREATE TABLE sj_retry_dead_letter
(
id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
unique_id varchar2(64) NULL,
group_name varchar2(64) NULL,
scene_name varchar2(64) NULL,
idempotent_id varchar2(64) NULL,
@@ -157,40 +155,34 @@ CREATE TABLE sj_retry_dead_letter_0
executor_name varchar2(512) DEFAULT '' NULL,
args_str clob NULL,
ext_attrs clob NULL,
task_type smallint DEFAULT 1 NOT NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
);
ALTER TABLE sj_retry_dead_letter_0
ADD CONSTRAINT pk_sj_retry_dead_letter_0 PRIMARY KEY (id);
ALTER TABLE sj_retry_dead_letter
ADD CONSTRAINT pk_sj_retry_dead_letter PRIMARY KEY (id);
CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id);
CREATE INDEX idx_sj_retry_dead_letter_01 ON sj_retry_dead_letter (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_dead_letter_02 ON sj_retry_dead_letter (idempotent_id);
CREATE INDEX idx_sj_retry_dead_letter_03 ON sj_retry_dead_letter (biz_no);
CREATE INDEX idx_sj_retry_dead_letter_04 ON sj_retry_dead_letter (create_dt);
CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id);
CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no);
CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt);
COMMENT ON COLUMN sj_retry_dead_letter.id IS '主键';
COMMENT ON COLUMN sj_retry_dead_letter.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_dead_letter.group_name IS '组名称';
COMMENT ON COLUMN sj_retry_dead_letter.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_dead_letter.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry_dead_letter.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry_dead_letter.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry_dead_letter.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry_dead_letter.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_dead_letter.create_dt IS '创建时间';
COMMENT ON TABLE sj_retry_dead_letter IS '死信队列表';
COMMENT ON COLUMN sj_retry_dead_letter_0.id IS '主键';
COMMENT ON COLUMN sj_retry_dead_letter_0.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_dead_letter_0.unique_id IS '同组下id唯一';
COMMENT ON COLUMN sj_retry_dead_letter_0.group_name IS '组名称';
COMMENT ON COLUMN sj_retry_dead_letter_0.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_dead_letter_0.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry_dead_letter_0.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry_dead_letter_0.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry_dead_letter_0.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry_dead_letter_0.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_dead_letter_0.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry_dead_letter_0.create_dt IS '创建时间';
COMMENT ON TABLE sj_retry_dead_letter_0 IS '死信队列表';
-- sj_retry_task_0
CREATE TABLE sj_retry_task_0
-- sj_retry
CREATE TABLE sj_retry
(
id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
unique_id varchar2(64) NULL,
group_name varchar2(64) NULL,
scene_name varchar2(64) NULL,
idempotent_id varchar2(64) NULL,
@@ -198,112 +190,113 @@ CREATE TABLE sj_retry_task_0
executor_name varchar2(512) DEFAULT '' NULL,
args_str clob NULL,
ext_attrs clob NULL,
next_trigger_at date NOT NULL,
next_trigger_at number NOT NULL,
retry_count number DEFAULT 0 NOT NULL,
retry_status smallint DEFAULT 0 NOT NULL,
task_type smallint DEFAULT 1 NOT NULL,
bucket_index number DEFAULT 0 NOT NULL,
parent_id number DEFAULT 0 NOT NULL,
deleted number DEFAULT 0 NOT NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL,
update_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
);
ALTER TABLE sj_retry_task_0
ADD CONSTRAINT pk_sj_retry_task_0 PRIMARY KEY (id);
ALTER TABLE sj_retry
ADD CONSTRAINT pk_sj_retry PRIMARY KEY (id);
CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id);
CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted);
CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type);
CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status);
CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id);
CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no);
CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt);
CREATE INDEX idx_sj_retry_01 ON sj_retry (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_02 ON sj_retry (namespace_id, group_name, retry_status);
CREATE INDEX idx_sj_retry_03 ON sj_retry (idempotent_id);
CREATE INDEX idx_sj_retry_04 ON sj_retry (biz_no);
CREATE INDEX idx_sj_retry_05 ON sj_retry (parent_id);
CREATE INDEX idx_sj_retry_06 ON sj_retry (create_dt);
COMMENT ON COLUMN sj_retry_task_0.id IS '主键';
COMMENT ON COLUMN sj_retry_task_0.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_task_0.unique_id IS '同组下id唯一';
COMMENT ON COLUMN sj_retry_task_0.group_name IS '名称';
COMMENT ON COLUMN sj_retry_task_0.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_task_0.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry_task_0.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry_task_0.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry_task_0.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry_task_0.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_task_0.next_trigger_at IS '下次触发时间';
COMMENT ON COLUMN sj_retry_task_0.retry_count IS '重试次数';
COMMENT ON COLUMN sj_retry_task_0.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
COMMENT ON COLUMN sj_retry_task_0.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry_task_0.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry_task_0.update_dt IS '修改时间';
COMMENT ON TABLE sj_retry_task_0 IS '任务表';
COMMENT ON COLUMN sj_retry.id IS '主键';
COMMENT ON COLUMN sj_retry.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry.group_name IS '组名称';
COMMENT ON COLUMN sj_retry.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry.next_trigger_at IS '下次触发时间';
COMMENT ON COLUMN sj_retry.retry_count IS '重试次数';
COMMENT ON COLUMN sj_retry.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
COMMENT ON COLUMN sj_retry.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry.bucket_index IS 'bucket';
COMMENT ON COLUMN sj_retry.parent_id IS '父节点id';
COMMENT ON COLUMN sj_retry.deleted IS '逻辑删除';
COMMENT ON COLUMN sj_retry.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry.update_dt IS '修改时间';
COMMENT ON TABLE sj_retry IS '重试信息表';
-- sj_retry_task_log
CREATE TABLE sj_retry_task_log
-- sj_retry_task
CREATE TABLE sj_retry_task
(
id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
unique_id varchar2(64) NULL,
group_name varchar2(64) NULL,
scene_name varchar2(64) NULL,
idempotent_id varchar2(64) NULL,
biz_no varchar2(64) DEFAULT '' NULL,
executor_name varchar2(512) DEFAULT '' NULL,
args_str clob NULL,
ext_attrs clob NULL,
retry_status smallint DEFAULT 0 NOT NULL,
task_type smallint DEFAULT 1 NOT NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL,
update_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
group_name varchar2(64) NULL,
scene_name varchar2(64) NULL,
retry_id number NOT NULL,
ext_attrs clob NULL,
task_status smallint DEFAULT 1 NOT NULL,
task_type smallint DEFAULT 1 NOT NULL,
operation_reason smallint DEFAULT 0 NOT NULL,
client_info varchar2(128) DEFAULT NULL NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL,
update_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
);
ALTER TABLE sj_retry_task_log
ADD CONSTRAINT pk_sj_retry_task_log PRIMARY KEY (id);
ALTER TABLE sj_retry_task
ADD CONSTRAINT pk_sj_retry_task PRIMARY KEY (id);
CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status);
CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id);
CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id);
CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no);
CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt);
CREATE INDEX idx_sj_retry_task_01 ON sj_retry_task (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_task_02 ON sj_retry_task (task_status);
CREATE INDEX idx_sj_retry_task_03 ON sj_retry_task (create_dt);
CREATE INDEX idx_sj_retry_task_04 ON sj_retry_task (retry_id);
COMMENT ON COLUMN sj_retry_task_log.id IS '主键';
COMMENT ON COLUMN sj_retry_task_log.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_task_log.unique_id IS '同组下id唯一';
COMMENT ON COLUMN sj_retry_task_log.group_name IS '名称';
COMMENT ON COLUMN sj_retry_task_log.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_task_log.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry_task_log.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry_task_log.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry_task_log.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry_task_log.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_task_log.retry_status IS '重试状态 0、重试中 1、成功 2、最大次数';
COMMENT ON COLUMN sj_retry_task_log.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry_task_log.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry_task_log.update_dt IS '修改时间';
COMMENT ON TABLE sj_retry_task_log IS '任务日志基础信息表';
COMMENT ON COLUMN sj_retry_task.id IS '主键';
COMMENT ON COLUMN sj_retry_task.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_task.group_name IS '组名称';
COMMENT ON COLUMN sj_retry_task.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_task.retry_id IS '重试信息Id';
COMMENT ON COLUMN sj_retry_task.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_task.task_status IS '重试状态';
COMMENT ON COLUMN sj_retry_task.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry_task.operation_reason IS '操作原因';
COMMENT ON COLUMN sj_retry_task.client_info IS '客户端地址 clientId#ip:port';
COMMENT ON COLUMN sj_retry_task.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry_task.update_dt IS '修改时间';
COMMENT ON TABLE sj_retry_task IS '重试任务表';
-- sj_retry_task_log_message
CREATE TABLE sj_retry_task_log_message
(
id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
group_name varchar2(64) NULL,
unique_id varchar2(64) NULL,
message clob NULL,
log_num number DEFAULT 1 NOT NULL,
real_time number DEFAULT 0 NOT NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
group_name varchar2(64) NULL,
retry_id number NOT NULL,
retry_task_id number NOT NULL,
message clob NULL,
log_num number DEFAULT 1 NOT NULL,
real_time number DEFAULT 0 NOT NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
);
ALTER TABLE sj_retry_task_log_message
ADD CONSTRAINT pk_sj_retry_task_log_message PRIMARY KEY (id);
CREATE INDEX idx_sj_rt_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id);
CREATE INDEX idx_sj_rt_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, retry_task_id);
CREATE INDEX idx_sj_rt_log_message_02 ON sj_retry_task_log_message (create_dt);
COMMENT ON COLUMN sj_retry_task_log_message.id IS '主键';
COMMENT ON COLUMN sj_retry_task_log_message.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_task_log_message.group_name IS '组名称';
COMMENT ON COLUMN sj_retry_task_log_message.unique_id IS '同组下id唯一';
COMMENT ON COLUMN sj_retry_task_log_message.retry_id IS '重试信息Id';
COMMENT ON COLUMN sj_retry_task_log_message.retry_task_id IS '重试任务Id';
COMMENT ON COLUMN sj_retry_task_log_message.message IS '异常信息';
COMMENT ON COLUMN sj_retry_task_log_message.log_num IS '日志数量';
COMMENT ON COLUMN sj_retry_task_log_message.real_time IS '上报时间';
@@ -313,21 +306,26 @@ COMMENT ON TABLE sj_retry_task_log_message IS '任务调度日志信息记录表
-- sj_retry_scene_config
CREATE TABLE sj_retry_scene_config
(
id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
scene_name varchar2(64) NULL,
group_name varchar2(64) NULL,
scene_status smallint DEFAULT 0 NOT NULL,
max_retry_count number DEFAULT 5 NOT NULL,
back_off smallint DEFAULT 1 NOT NULL,
trigger_interval varchar2(16) DEFAULT '' NULL,
notify_ids varchar2(128) DEFAULT '' NULL,
deadline_request number DEFAULT 60000 NOT NULL,
executor_timeout number DEFAULT 5 NOT NULL,
route_key smallint DEFAULT 4 NOT NULL,
description varchar2(256) DEFAULT '' NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL,
update_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
scene_name varchar2(64) NULL,
group_name varchar2(64) NULL,
scene_status smallint DEFAULT 0 NOT NULL,
max_retry_count number DEFAULT 5 NOT NULL,
back_off smallint DEFAULT 1 NOT NULL,
trigger_interval varchar2(16) DEFAULT '' NULL,
notify_ids varchar2(128) DEFAULT '' NULL,
deadline_request number DEFAULT 60000 NOT NULL,
executor_timeout number DEFAULT 5 NOT NULL,
route_key smallint DEFAULT 4 NOT NULL,
block_strategy smallint DEFAULT 1 NOT NULL,
cb_status smallint DEFAULT 0 NOT NULL,
cb_trigger_type smallint DEFAULT 1 NOT NULL,
cb_max_count number DEFAULT 16 NOT NULL,
cb_trigger_interval varchar2(16) DEFAULT '' NULL,
description varchar2(256) DEFAULT '' NULL,
create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL,
update_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL
);
ALTER TABLE sj_retry_scene_config
@@ -347,6 +345,11 @@ COMMENT ON COLUMN sj_retry_scene_config.notify_ids IS '通知告警场景配置i
COMMENT ON COLUMN sj_retry_scene_config.deadline_request IS 'Deadline Request 调用链超时 单位毫秒';
COMMENT ON COLUMN sj_retry_scene_config.executor_timeout IS '任务执行超时时间,单位秒';
COMMENT ON COLUMN sj_retry_scene_config.route_key IS '路由策略';
COMMENT ON COLUMN sj_retry_scene_config.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
COMMENT ON COLUMN sj_retry_scene_config.cb_status IS '回调状态 0、不开启 1、开启';
COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_type IS '1、默认等级 2、固定间隔时间 3、CRON 表达式';
COMMENT ON COLUMN sj_retry_scene_config.cb_max_count IS '回调的最大执行次数';
COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_interval IS '回调的最大执行次数';
COMMENT ON COLUMN sj_retry_scene_config.description IS '描述';
COMMENT ON COLUMN sj_retry_scene_config.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry_scene_config.update_dt IS '修改时间';
@@ -538,11 +541,11 @@ COMMENT ON COLUMN sj_job.executor_type IS '执行器类型';
COMMENT ON COLUMN sj_job.executor_info IS '执行器名称';
COMMENT ON COLUMN sj_job.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
COMMENT ON COLUMN sj_job.trigger_interval IS '间隔时长';
COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行 4、恢复';
COMMENT ON COLUMN sj_job.executor_timeout IS '任务执行超时时间,单位秒';
COMMENT ON COLUMN sj_job.max_retry_times IS '最大重试次数';
COMMENT ON COLUMN sj_job.parallel_num IS '并行数';
COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s ) ';
COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s)';
COMMENT ON COLUMN sj_job.bucket_index IS 'bucket';
COMMENT ON COLUMN sj_job.resident IS '是否是常驻任务';
COMMENT ON COLUMN sj_job.notify_ids IS '通知告警场景配置id列表';
@@ -721,7 +724,7 @@ CREATE INDEX idx_sj_job_summary_01 ON sj_job_summary (namespace_id, group_name,
COMMENT ON COLUMN sj_job_summary.id IS '主键';
COMMENT ON COLUMN sj_job_summary.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_job_summary.group_name IS '组名称';
COMMENT ON COLUMN sj_job_summary.business_id IS '业务id ( job_id或workflow_id ) ';
COMMENT ON COLUMN sj_job_summary.business_id IS '业务id ( job_id或workflow_id)';
COMMENT ON COLUMN sj_job_summary.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务';
COMMENT ON COLUMN sj_job_summary.trigger_at IS '统计时间';
COMMENT ON COLUMN sj_job_summary.success_num IS '执行成功-日志数量';

View File

@@ -75,7 +75,7 @@ create table sys_tenant (
tenant_id varchar2(20) not null,
contact_user_name varchar2(20) default '',
contact_phone varchar2(20) default '',
company_name varchar2(50) default '',
company_name varchar2(30) default '',
license_number varchar2(30) default '',
address varchar2(200) default '',
intro varchar2(200) default '',
@@ -352,7 +352,7 @@ comment on column sys_role.tenant_id is '租户编号';
comment on column sys_role.role_name is '角色名称';
comment on column sys_role.role_key is '角色权限字符串';
comment on column sys_role.role_sort is '显示顺序';
comment on column sys_role.data_scope is '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限';
comment on column sys_role.data_scope is '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限';
comment on column sys_role.menu_check_strictly is '菜单树选择项是否关联显示';
comment on column sys_role.dept_check_strictly is '部门树选择项是否关联显示';
comment on column sys_role.status is '角色状态0正常 1停用';
@@ -1159,6 +1159,7 @@ create table sys_oss (
file_suffix varchar2(10) not null,
url varchar2(500) not null,
service varchar2(20) default 'minio' not null,
ext1 varchar2(500) default '',
create_dept number(20) default null,
create_by number(20) default null,
create_time date,
@@ -1176,6 +1177,7 @@ comment on column sys_oss.original_name is '原名';
comment on column sys_oss.file_suffix is '文件后缀名';
comment on column sys_oss.url is 'URL地址';
comment on column sys_oss.service is '服务商';
comment on column sys_oss.ext1 is '扩展字段';
comment on column sys_oss.create_dept is '创建部门';
comment on column sys_oss.create_time is '创建时间';
comment on column sys_oss.create_by is '上传者';

View File

@@ -47,7 +47,6 @@ create table FLOW_NODE
NODE_NAME VARCHAR2(100),
NODE_RATIO NUMBER(6, 3),
COORDINATE VARCHAR2(100),
SKIP_ANY_NODE VARCHAR2(100) default 'N',
ANY_NODE_SKIP VARCHAR2(100),
LISTENER_TYPE VARCHAR2(100),
LISTENER_PATH VARCHAR2(500),
@@ -58,6 +57,7 @@ create table FLOW_NODE
VERSION VARCHAR2(20),
CREATE_TIME DATE,
UPDATE_TIME DATE,
EXT VARCHAR2(500),
DEL_FLAG VARCHAR2(1) default '0',
TENANT_ID VARCHAR2(40),
PERMISSION_FLAG VARCHAR2(200)
@@ -73,7 +73,6 @@ comment on column FLOW_NODE.NODE_CODE is '流程节点编码';
comment on column FLOW_NODE.NODE_NAME is '流程节点名称';
comment on column FLOW_NODE.NODE_RATIO is '流程签署比例值';
comment on column FLOW_NODE.COORDINATE is '坐标';
comment on column FLOW_NODE.SKIP_ANY_NODE is '是否可以退回任意节点Y是 N否即将删除';
comment on column FLOW_NODE.ANY_NODE_SKIP is '任意结点跳转';
comment on column FLOW_NODE.LISTENER_TYPE is '监听器类型';
comment on column FLOW_NODE.LISTENER_PATH is '监听器路径';
@@ -84,6 +83,7 @@ comment on column FLOW_NODE.FORM_PATH is '审批表单路径';
comment on column FLOW_NODE.VERSION is '版本';
comment on column FLOW_NODE.CREATE_TIME is '创建时间';
comment on column FLOW_NODE.UPDATE_TIME is '更新时间';
comment on column FLOW_NODE.EXT is '扩展属性';
comment on column FLOW_NODE.DEL_FLAG is '删除标志';
comment on column FLOW_NODE.TENANT_ID is '租户id';
comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用逗号隔开)';
@@ -278,6 +278,7 @@ comment on column FLOW_USER.DEL_FLAG is '删除标志';
comment on column FLOW_USER.TENANT_ID is '租户id';
create index USER_PROCESSED_TYPE on FLOW_USER (PROCESSED_BY, TYPE);
create index USER_ASSOCIATED_IDX on FLOW_USER (ASSOCIATED);
-- ----------------------------
-- 流程分类表

View File

@@ -2,7 +2,7 @@
SnailJob Database Transfer Tool
Source Server Type : MySQL
Target Server Type : PostgreSQL
Date: 2024-12-27 22:13:49
Date: 2025-02-25 22:15:32
*/
@@ -45,7 +45,6 @@ CREATE TABLE sj_group_config
group_partition int NOT NULL,
id_generator_mode smallint NOT NULL DEFAULT 1,
init_scene smallint NOT NULL DEFAULT 0,
bucket_index int NOT NULL DEFAULT 0,
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
@@ -62,13 +61,12 @@ COMMENT ON COLUMN sj_group_config.version IS '版本号';
COMMENT ON COLUMN sj_group_config.group_partition IS '分区';
COMMENT ON COLUMN sj_group_config.id_generator_mode IS '唯一id生成模式 默认号段模式';
COMMENT ON COLUMN sj_group_config.init_scene IS '是否初始化场景 0:否 1:是';
COMMENT ON COLUMN sj_group_config.bucket_index IS 'bucket';
COMMENT ON COLUMN sj_group_config.create_dt IS '创建时间';
COMMENT ON COLUMN sj_group_config.update_dt IS '修改时间';
COMMENT ON TABLE sj_group_config IS '组配置';
INSERT INTO sj_group_config VALUES (1, 'dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, now(), now());
INSERT INTO sj_group_config VALUES (2, 'prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, now(), now());
INSERT INTO sj_group_config VALUES (1, 'dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, now(), now());
INSERT INTO sj_group_config VALUES (2, 'prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, now(), now());
-- sj_notify_config
CREATE TABLE sj_notify_config
@@ -132,12 +130,11 @@ COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间';
COMMENT ON COLUMN sj_notify_recipient.update_dt IS '修改时间';
COMMENT ON TABLE sj_notify_recipient IS '告警通知接收人';
-- sj_retry_dead_letter_0
CREATE TABLE sj_retry_dead_letter_0
-- sj_retry_dead_letter
CREATE TABLE sj_retry_dead_letter
(
id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
unique_id varchar(64) NOT NULL,
group_name varchar(64) NOT NULL,
scene_name varchar(64) NOT NULL,
idempotent_id varchar(64) NOT NULL,
@@ -145,37 +142,31 @@ CREATE TABLE sj_retry_dead_letter_0
executor_name varchar(512) NOT NULL DEFAULT '',
args_str text NOT NULL,
ext_attrs text NOT NULL,
task_type smallint NOT NULL DEFAULT 1,
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id);
CREATE INDEX idx_sj_retry_dead_letter_01 ON sj_retry_dead_letter (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_dead_letter_02 ON sj_retry_dead_letter (idempotent_id);
CREATE INDEX idx_sj_retry_dead_letter_03 ON sj_retry_dead_letter (biz_no);
CREATE INDEX idx_sj_retry_dead_letter_04 ON sj_retry_dead_letter (create_dt);
CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id);
CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no);
CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt);
COMMENT ON COLUMN sj_retry_dead_letter.id IS '主键';
COMMENT ON COLUMN sj_retry_dead_letter.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_dead_letter.group_name IS '组名称';
COMMENT ON COLUMN sj_retry_dead_letter.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_dead_letter.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry_dead_letter.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry_dead_letter.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry_dead_letter.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry_dead_letter.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_dead_letter.create_dt IS '创建时间';
COMMENT ON TABLE sj_retry_dead_letter IS '死信队列表';
COMMENT ON COLUMN sj_retry_dead_letter_0.id IS '主键';
COMMENT ON COLUMN sj_retry_dead_letter_0.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_dead_letter_0.unique_id IS '同组下id唯一';
COMMENT ON COLUMN sj_retry_dead_letter_0.group_name IS '组名称';
COMMENT ON COLUMN sj_retry_dead_letter_0.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_dead_letter_0.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry_dead_letter_0.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry_dead_letter_0.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry_dead_letter_0.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry_dead_letter_0.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_dead_letter_0.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry_dead_letter_0.create_dt IS '创建时间';
COMMENT ON TABLE sj_retry_dead_letter_0 IS '死信队列表';
-- sj_retry_task_0
CREATE TABLE sj_retry_task_0
-- sj_retry
CREATE TABLE sj_retry
(
id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
unique_id varchar(64) NOT NULL,
group_name varchar(64) NOT NULL,
scene_name varchar(64) NOT NULL,
idempotent_id varchar(64) NOT NULL,
@@ -183,103 +174,104 @@ CREATE TABLE sj_retry_task_0
executor_name varchar(512) NOT NULL DEFAULT '',
args_str text NOT NULL,
ext_attrs text NOT NULL,
next_trigger_at timestamp NOT NULL,
next_trigger_at bigint NOT NULL,
retry_count int NOT NULL DEFAULT 0,
retry_status smallint NOT NULL DEFAULT 0,
task_type smallint NOT NULL DEFAULT 1,
bucket_index int NOT NULL DEFAULT 0,
parent_id bigint NOT NULL DEFAULT 0,
deleted bigint NOT NULL DEFAULT 0,
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id);
CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted);
CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type);
CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status);
CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id);
CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no);
CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt);
CREATE INDEX idx_sj_retry_01 ON sj_retry (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_02 ON sj_retry (namespace_id, group_name, retry_status);
CREATE INDEX idx_sj_retry_03 ON sj_retry (idempotent_id);
CREATE INDEX idx_sj_retry_04 ON sj_retry (biz_no);
CREATE INDEX idx_sj_retry_05 ON sj_retry (parent_id);
CREATE INDEX idx_sj_retry_06 ON sj_retry (create_dt);
COMMENT ON COLUMN sj_retry_task_0.id IS '主键';
COMMENT ON COLUMN sj_retry_task_0.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_task_0.unique_id IS '同组下id唯一';
COMMENT ON COLUMN sj_retry_task_0.group_name IS '名称';
COMMENT ON COLUMN sj_retry_task_0.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_task_0.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry_task_0.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry_task_0.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry_task_0.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry_task_0.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_task_0.next_trigger_at IS '下次触发时间';
COMMENT ON COLUMN sj_retry_task_0.retry_count IS '重试次数';
COMMENT ON COLUMN sj_retry_task_0.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
COMMENT ON COLUMN sj_retry_task_0.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry_task_0.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry_task_0.update_dt IS '修改时间';
COMMENT ON TABLE sj_retry_task_0 IS '任务表';
COMMENT ON COLUMN sj_retry.id IS '主键';
COMMENT ON COLUMN sj_retry.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry.group_name IS '组名称';
COMMENT ON COLUMN sj_retry.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry.next_trigger_at IS '下次触发时间';
COMMENT ON COLUMN sj_retry.retry_count IS '重试次数';
COMMENT ON COLUMN sj_retry.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
COMMENT ON COLUMN sj_retry.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry.bucket_index IS 'bucket';
COMMENT ON COLUMN sj_retry.parent_id IS '父节点id';
COMMENT ON COLUMN sj_retry.deleted IS '逻辑删除';
COMMENT ON COLUMN sj_retry.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry.update_dt IS '修改时间';
COMMENT ON TABLE sj_retry IS '重试信息表';
-- sj_retry_task_log
CREATE TABLE sj_retry_task_log
-- sj_retry_task
CREATE TABLE sj_retry_task
(
id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
unique_id varchar(64) NOT NULL,
group_name varchar(64) NOT NULL,
scene_name varchar(64) NOT NULL,
idempotent_id varchar(64) NOT NULL,
biz_no varchar(64) NOT NULL DEFAULT '',
executor_name varchar(512) NOT NULL DEFAULT '',
args_str text NOT NULL,
ext_attrs text NOT NULL,
retry_status smallint NOT NULL DEFAULT 0,
task_type smallint NOT NULL DEFAULT 1,
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
group_name varchar(64) NOT NULL,
scene_name varchar(64) NOT NULL,
retry_id bigint NOT NULL,
ext_attrs text NOT NULL,
task_status smallint NOT NULL DEFAULT 1,
task_type smallint NOT NULL DEFAULT 1,
operation_reason smallint NOT NULL DEFAULT 0,
client_info varchar(128) NULL DEFAULT NULL,
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status);
CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id);
CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id);
CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no);
CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt);
CREATE INDEX idx_sj_retry_task_01 ON sj_retry_task (namespace_id, group_name, scene_name);
CREATE INDEX idx_sj_retry_task_02 ON sj_retry_task (task_status);
CREATE INDEX idx_sj_retry_task_03 ON sj_retry_task (create_dt);
CREATE INDEX idx_sj_retry_task_04 ON sj_retry_task (retry_id);
COMMENT ON COLUMN sj_retry_task_log.id IS '主键';
COMMENT ON COLUMN sj_retry_task_log.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_task_log.unique_id IS '同组下id唯一';
COMMENT ON COLUMN sj_retry_task_log.group_name IS '名称';
COMMENT ON COLUMN sj_retry_task_log.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_task_log.idempotent_id IS '幂等id';
COMMENT ON COLUMN sj_retry_task_log.biz_no IS '业务编号';
COMMENT ON COLUMN sj_retry_task_log.executor_name IS '执行器名称';
COMMENT ON COLUMN sj_retry_task_log.args_str IS '执行方法参数';
COMMENT ON COLUMN sj_retry_task_log.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_task_log.retry_status IS '重试状态 0、重试中 1、成功 2、最大次数';
COMMENT ON COLUMN sj_retry_task_log.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry_task_log.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry_task_log.update_dt IS '修改时间';
COMMENT ON TABLE sj_retry_task_log IS '任务日志基础信息表';
COMMENT ON COLUMN sj_retry_task.id IS '主键';
COMMENT ON COLUMN sj_retry_task.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_task.group_name IS '组名称';
COMMENT ON COLUMN sj_retry_task.scene_name IS '场景名称';
COMMENT ON COLUMN sj_retry_task.retry_id IS '重试信息Id';
COMMENT ON COLUMN sj_retry_task.ext_attrs IS '扩展字段';
COMMENT ON COLUMN sj_retry_task.task_status IS '重试状态';
COMMENT ON COLUMN sj_retry_task.task_type IS '任务类型 1、重试数据 2、回调数据';
COMMENT ON COLUMN sj_retry_task.operation_reason IS '操作原因';
COMMENT ON COLUMN sj_retry_task.client_info IS '客户端地址 clientId#ip:port';
COMMENT ON COLUMN sj_retry_task.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry_task.update_dt IS '修改时间';
COMMENT ON TABLE sj_retry_task IS '重试任务表';
-- sj_retry_task_log_message
CREATE TABLE sj_retry_task_log_message
(
id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
group_name varchar(64) NOT NULL,
unique_id varchar(64) NOT NULL,
message text NOT NULL,
log_num int NOT NULL DEFAULT 1,
real_time bigint NOT NULL DEFAULT 0,
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
group_name varchar(64) NOT NULL,
retry_id bigint NOT NULL,
retry_task_id bigint NOT NULL,
message text NOT NULL,
log_num int NOT NULL DEFAULT 1,
real_time bigint NOT NULL DEFAULT 0,
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id);
CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, retry_task_id);
CREATE INDEX idx_sj_retry_task_log_message_02 ON sj_retry_task_log_message (create_dt);
COMMENT ON COLUMN sj_retry_task_log_message.id IS '主键';
COMMENT ON COLUMN sj_retry_task_log_message.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_retry_task_log_message.group_name IS '组名称';
COMMENT ON COLUMN sj_retry_task_log_message.unique_id IS '同组下id唯一';
COMMENT ON COLUMN sj_retry_task_log_message.retry_id IS '重试信息Id';
COMMENT ON COLUMN sj_retry_task_log_message.retry_task_id IS '重试任务Id';
COMMENT ON COLUMN sj_retry_task_log_message.message IS '异常信息';
COMMENT ON COLUMN sj_retry_task_log_message.log_num IS '日志数量';
COMMENT ON COLUMN sj_retry_task_log_message.real_time IS '上报时间';
@@ -289,21 +281,26 @@ COMMENT ON TABLE sj_retry_task_log_message IS '任务调度日志信息记录表
-- sj_retry_scene_config
CREATE TABLE sj_retry_scene_config
(
id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
scene_name varchar(64) NOT NULL,
group_name varchar(64) NOT NULL,
scene_status smallint NOT NULL DEFAULT 0,
max_retry_count int NOT NULL DEFAULT 5,
back_off smallint NOT NULL DEFAULT 1,
trigger_interval varchar(16) NOT NULL DEFAULT '',
notify_ids varchar(128) NOT NULL DEFAULT '',
deadline_request bigint NOT NULL DEFAULT 60000,
executor_timeout int NOT NULL DEFAULT 5,
route_key smallint NOT NULL DEFAULT 4,
description varchar(256) NOT NULL DEFAULT '',
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
scene_name varchar(64) NOT NULL,
group_name varchar(64) NOT NULL,
scene_status smallint NOT NULL DEFAULT 0,
max_retry_count int NOT NULL DEFAULT 5,
back_off smallint NOT NULL DEFAULT 1,
trigger_interval varchar(16) NOT NULL DEFAULT '',
notify_ids varchar(128) NOT NULL DEFAULT '',
deadline_request bigint NOT NULL DEFAULT 60000,
executor_timeout int NOT NULL DEFAULT 5,
route_key smallint NOT NULL DEFAULT 4,
block_strategy smallint NOT NULL DEFAULT 1,
cb_status smallint NOT NULL DEFAULT 0,
cb_trigger_type smallint NOT NULL DEFAULT 1,
cb_max_count int NOT NULL DEFAULT 16,
cb_trigger_interval varchar(16) NOT NULL DEFAULT '',
description varchar(256) NOT NULL DEFAULT '',
create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE UNIQUE INDEX uk_sj_retry_scene_config_01 ON sj_retry_scene_config (namespace_id, group_name, scene_name);
@@ -320,6 +317,11 @@ COMMENT ON COLUMN sj_retry_scene_config.notify_ids IS '通知告警场景配置i
COMMENT ON COLUMN sj_retry_scene_config.deadline_request IS 'Deadline Request 调用链超时 单位毫秒';
COMMENT ON COLUMN sj_retry_scene_config.executor_timeout IS '任务执行超时时间,单位秒';
COMMENT ON COLUMN sj_retry_scene_config.route_key IS '路由策略';
COMMENT ON COLUMN sj_retry_scene_config.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
COMMENT ON COLUMN sj_retry_scene_config.cb_status IS '回调状态 0、不开启 1、开启';
COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_type IS '1、默认等级 2、固定间隔时间 3、CRON 表达式';
COMMENT ON COLUMN sj_retry_scene_config.cb_max_count IS '回调的最大执行次数';
COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_interval IS '回调的最大执行次数';
COMMENT ON COLUMN sj_retry_scene_config.description IS '描述';
COMMENT ON COLUMN sj_retry_scene_config.create_dt IS '创建时间';
COMMENT ON COLUMN sj_retry_scene_config.update_dt IS '修改时间';
@@ -362,7 +364,7 @@ COMMENT ON TABLE sj_server_node IS '服务器节点';
-- sj_distributed_lock
CREATE TABLE sj_distributed_lock
(
name varchar(64) PRIMARY KEY,
name varchar(64) NOT NULL,
lock_until timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
locked_at timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
locked_by varchar(255) NOT NULL,
@@ -493,11 +495,11 @@ COMMENT ON COLUMN sj_job.executor_type IS '执行器类型';
COMMENT ON COLUMN sj_job.executor_info IS '执行器名称';
COMMENT ON COLUMN sj_job.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
COMMENT ON COLUMN sj_job.trigger_interval IS '间隔时长';
COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行 4、恢复';
COMMENT ON COLUMN sj_job.executor_timeout IS '任务执行超时时间,单位秒';
COMMENT ON COLUMN sj_job.max_retry_times IS '最大重试次数';
COMMENT ON COLUMN sj_job.parallel_num IS '并行数';
COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s ) ';
COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s)';
COMMENT ON COLUMN sj_job.bucket_index IS 'bucket';
COMMENT ON COLUMN sj_job.resident IS '是否是常驻任务';
COMMENT ON COLUMN sj_job.notify_ids IS '通知告警场景配置id列表';
@@ -664,7 +666,7 @@ CREATE INDEX idx_sj_job_summary_01 ON sj_job_summary (namespace_id, group_name,
COMMENT ON COLUMN sj_job_summary.id IS '主键';
COMMENT ON COLUMN sj_job_summary.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_job_summary.group_name IS '组名称';
COMMENT ON COLUMN sj_job_summary.business_id IS '业务id ( job_id或workflow_id ) ';
COMMENT ON COLUMN sj_job_summary.business_id IS '业务id ( job_id或workflow_id)';
COMMENT ON COLUMN sj_job_summary.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务';
COMMENT ON COLUMN sj_job_summary.trigger_at IS '统计时间';
COMMENT ON COLUMN sj_job_summary.success_num IS '执行成功-日志数量';

View File

@@ -75,7 +75,7 @@ create table if not exists sys_tenant
tenant_id varchar(20) not null,
contact_user_name varchar(20) default null::varchar,
contact_phone varchar(20) default null::varchar,
company_name varchar(50) default null::varchar,
company_name varchar(30) default null::varchar,
license_number varchar(30) default null::varchar,
address varchar(200) default null::varchar,
intro varchar(200) default null::varchar,
@@ -353,7 +353,7 @@ comment on column sys_role.tenant_id is '租户编号';
comment on column sys_role.role_name is '角色名称';
comment on column sys_role.role_key is '角色权限字符串';
comment on column sys_role.role_sort is '显示顺序';
comment on column sys_role.data_scope is '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限';
comment on column sys_role.data_scope is '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限';
comment on column sys_role.menu_check_strictly is '菜单树选择项是否关联显示';
comment on column sys_role.dept_check_strictly is '部门树选择项是否关联显示';
comment on column sys_role.status is '角色状态0正常 1停用';
@@ -1160,6 +1160,7 @@ create table if not exists sys_oss
original_name varchar(255) default ''::varchar not null,
file_suffix varchar(10) default ''::varchar not null,
url varchar(500) default ''::varchar not null,
ext1 varchar(500) default ''::varchar,
create_dept int8,
create_by int8,
create_time timestamp,
@@ -1176,6 +1177,7 @@ comment on column sys_oss.file_name is '文件名';
comment on column sys_oss.original_name is '原名';
comment on column sys_oss.file_suffix is '文件后缀名';
comment on column sys_oss.url is 'URL地址';
comment on column sys_oss.ext1 is '扩展字段';
comment on column sys_oss.create_by is '上传人';
comment on column sys_oss.create_dept is '创建部门';
comment on column sys_oss.create_time is '创建时间';

View File

@@ -50,7 +50,6 @@ CREATE TABLE flow_node
permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用逗号隔开)
node_ratio numeric(6, 3) NULL, -- 流程签署比例值
coordinate varchar(100) NULL, -- 坐标
skip_any_node varchar(100) NULL DEFAULT 'N':: character varying, -- 是否可以退回任意节点Y是 N否即将删除
any_node_skip varchar(100) NULL, -- 任意结点跳转
listener_type varchar(100) NULL, -- 监听器类型
listener_path varchar(400) NULL, -- 监听器路径
@@ -61,6 +60,7 @@ CREATE TABLE flow_node
"version" varchar(20) NOT NULL, -- 版本
create_time timestamp NULL, -- 创建时间
update_time timestamp NULL, -- 更新时间
ext varchar(500) NULL, -- 扩展属性
del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志
tenant_id varchar(40) NULL, -- 租户id
CONSTRAINT flow_node_pkey PRIMARY KEY (id)
@@ -75,7 +75,6 @@ COMMENT ON COLUMN flow_node.node_name IS '流程节点名称';
COMMENT ON COLUMN flow_node.permission_flag IS '权限标识(权限类型:权限标识,可以多个,用逗号隔开)';
COMMENT ON COLUMN flow_node.node_ratio IS '流程签署比例值';
COMMENT ON COLUMN flow_node.coordinate IS '坐标';
COMMENT ON COLUMN flow_node.skip_any_node IS '是否可以退回任意节点Y是 N否即将删除';
COMMENT ON COLUMN flow_node.any_node_skip IS '任意结点跳转';
COMMENT ON COLUMN flow_node.listener_type IS '监听器类型';
COMMENT ON COLUMN flow_node.listener_path IS '监听器路径';
@@ -86,6 +85,7 @@ COMMENT ON COLUMN flow_node.form_path IS '审批表单路径';
COMMENT ON COLUMN flow_node."version" IS '版本';
COMMENT ON COLUMN flow_node.create_time IS '创建时间';
COMMENT ON COLUMN flow_node.update_time IS '更新时间';
COMMENT ON COLUMN flow_node.ext IS '扩展属性';
COMMENT ON COLUMN flow_node.del_flag IS '删除标志';
COMMENT ON COLUMN flow_node.tenant_id IS '租户id';
@@ -262,6 +262,8 @@ CREATE TABLE flow_user
CONSTRAINT flow_user_pk PRIMARY KEY (id)
);
CREATE INDEX user_processed_type ON flow_user USING btree (processed_by, type);
CREATE INDEX user_associated_idx ON FLOW_USER USING btree (associated);
COMMENT ON TABLE flow_user IS '流程用户表';
COMMENT ON COLUMN flow_user.id IS '主键id';

View File

@@ -30,7 +30,6 @@ CREATE TABLE `sj_group_config`
`group_partition` int(11) NOT NULL COMMENT '分区',
`id_generator_mode` tinyint(4) NOT NULL DEFAULT 1 COMMENT '唯一id生成模式 默认号段模式',
`init_scene` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否初始化场景 0:否 1:是',
`bucket_index` int(11) NOT NULL DEFAULT 0 COMMENT 'bucket',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
@@ -39,8 +38,8 @@ CREATE TABLE `sj_group_config`
AUTO_INCREMENT = 0
DEFAULT CHARSET = utf8mb4 COMMENT ='组配置';
INSERT INTO `sj_group_config` VALUES (1, 'dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, now(), now());
INSERT INTO `sj_group_config` VALUES (2, 'prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, now(), now());
INSERT INTO `sj_group_config` VALUES (1, 'dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, now(), now());
INSERT INTO `sj_group_config` VALUES (2, 'prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, now(), now());
CREATE TABLE `sj_notify_config`
(
@@ -80,11 +79,10 @@ CREATE TABLE `sj_notify_recipient`
AUTO_INCREMENT = 0
DEFAULT CHARSET = utf8mb4 COMMENT ='告警通知接收人';
CREATE TABLE `sj_retry_dead_letter_0`
CREATE TABLE `sj_retry_dead_letter`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一',
`group_name` varchar(64) NOT NULL COMMENT '组名称',
`scene_name` varchar(64) NOT NULL COMMENT '场景名称',
`idempotent_id` varchar(64) NOT NULL COMMENT '幂等id',
@@ -92,23 +90,20 @@ CREATE TABLE `sj_retry_dead_letter_0`
`executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称',
`args_str` text NOT NULL COMMENT '执行方法参数',
`ext_attrs` text NOT NULL COMMENT '扩展字段',
`task_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
KEY `idx_idempotent_id` (`idempotent_id`),
KEY `idx_biz_no` (`biz_no`),
KEY `idx_create_dt` (`create_dt`),
UNIQUE KEY `uk_namespace_id_group_name_unique_id` (`namespace_id`, `group_name`, `unique_id`)
KEY `idx_create_dt` (`create_dt`)
) ENGINE = InnoDB
AUTO_INCREMENT = 0
DEFAULT CHARSET = utf8mb4 COMMENT ='死信队列表';
CREATE TABLE `sj_retry_task_0`
CREATE TABLE `sj_retry`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一',
`group_name` varchar(64) NOT NULL COMMENT '组名称',
`scene_name` varchar(64) NOT NULL COMMENT '场景名称',
`idempotent_id` varchar(64) NOT NULL COMMENT '幂等id',
@@ -116,63 +111,63 @@ CREATE TABLE `sj_retry_task_0`
`executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称',
`args_str` text NOT NULL COMMENT '执行方法参数',
`ext_attrs` text NOT NULL COMMENT '扩展字段',
`next_trigger_at` datetime NOT NULL COMMENT '下次触发时间',
`next_trigger_at` bigint(13) NOT NULL COMMENT '下次触发时间',
`retry_count` int(11) NOT NULL DEFAULT 0 COMMENT '重试次数',
`retry_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '重试状态 0、重试中 1、成功 2、最大重试次数',
`task_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
`bucket_index` int(11) NOT NULL DEFAULT 0 COMMENT 'bucket',
`parent_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '父节点id',
`deleted` bigint(20) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
KEY `idx_namespace_id_group_name_task_type` (`namespace_id`, `group_name`, `task_type`),
KEY `idx_namespace_id_group_name_retry_status` (`namespace_id`, `group_name`, `retry_status`),
KEY `idx_idempotent_id` (`idempotent_id`),
KEY `idx_biz_no` (`biz_no`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_create_dt` (`create_dt`),
UNIQUE KEY `uk_name_unique_id` (`namespace_id`, `group_name`, `unique_id`)
UNIQUE KEY `uk_name_task_type_idempotent_id_deleted` (`namespace_id`, `group_name`, `task_type`, `idempotent_id`, `deleted`)
) ENGINE = InnoDB
AUTO_INCREMENT = 0
DEFAULT CHARSET = utf8mb4 COMMENT ='任务';
DEFAULT CHARSET = utf8mb4 COMMENT ='重试信息';
CREATE TABLE `sj_retry_task_log`
CREATE TABLE `sj_retry_task`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一',
`group_name` varchar(64) NOT NULL COMMENT '名称',
`scene_name` varchar(64) NOT NULL COMMENT '场景名称',
`idempotent_id` varchar(64) NOT NULL COMMENT '幂等id',
`biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号',
`executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称',
`args_str` text NOT NULL COMMENT '执行方法参数',
`ext_attrs` text NOT NULL COMMENT '扩展字段',
`retry_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '重试状态 0、重试中 1、成功 2、最大次数',
`task_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`group_name` varchar(64) NOT NULL COMMENT '组名称',
`scene_name` varchar(64) NOT NULL COMMENT '场景名称',
`retry_id` bigint(20) NOT NULL COMMENT '重试信息Id',
`ext_attrs` text NOT NULL COMMENT '扩展字段',
`task_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '重试状态',
`task_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
`operation_reason` tinyint(4) NOT NULL DEFAULT 0 COMMENT '操作原因',
`client_info` varchar(128) DEFAULT NULL COMMENT '客户端地址 clientId#ip:port',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `idx_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
KEY `idx_retry_status` (`retry_status`),
KEY `idx_idempotent_id` (`idempotent_id`),
KEY `idx_unique_id` (`unique_id`),
KEY `idx_biz_no` (`biz_no`),
KEY `idx_create_dt` (`create_dt`)
KEY `task_status` (`task_status`),
KEY `idx_create_dt` (`create_dt`),
KEY `idx_retry_id` (`retry_id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 0
DEFAULT CHARSET = utf8mb4 COMMENT ='任务日志基础信息';
DEFAULT CHARSET = utf8mb4 COMMENT ='重试任务表';
CREATE TABLE `sj_retry_task_log_message`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`group_name` varchar(64) NOT NULL COMMENT '组名称',
`unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一',
`message` longtext NOT NULL COMMENT '异常信息',
`log_num` int(11) NOT NULL DEFAULT 1 COMMENT '日志数量',
`real_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '上报时间',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`group_name` varchar(64) NOT NULL COMMENT '组名称',
`retry_id` bigint(20) NOT NULL COMMENT '重试信息Id',
`retry_task_id` bigint(20) NOT NULL COMMENT '重试任务Id',
`message` longtext NOT NULL COMMENT '异常信息',
`log_num` int(11) NOT NULL DEFAULT 1 COMMENT '日志数量',
`real_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '上报时间',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `unique_id`),
KEY `idx_namespace_id_group_name_retry_task_id` (`namespace_id`, `group_name`, `retry_task_id`),
KEY `idx_create_dt` (`create_dt`)
) ENGINE = InnoDB
AUTO_INCREMENT = 0
@@ -180,21 +175,26 @@ CREATE TABLE `sj_retry_task_log_message`
CREATE TABLE `sj_retry_scene_config`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`scene_name` varchar(64) NOT NULL COMMENT '场景名称',
`group_name` varchar(64) NOT NULL COMMENT '组名称',
`scene_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '组状态 0、未启用 1、启用',
`max_retry_count` int(11) NOT NULL DEFAULT 5 COMMENT '最大重试次数',
`back_off` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式',
`trigger_interval` varchar(16) NOT NULL DEFAULT '' COMMENT '间隔时长',
`notify_ids` varchar(128) NOT NULL DEFAULT '' COMMENT '通知告警场景配置id列表',
`deadline_request` bigint(20) unsigned NOT NULL DEFAULT 60000 COMMENT 'Deadline Request 调用链超时 单位毫秒',
`executor_timeout` int(11) unsigned NOT NULL DEFAULT 5 COMMENT '任务执行超时时间,单位秒',
`route_key` tinyint(4) NOT NULL DEFAULT 4 COMMENT '路由策略',
`description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`scene_name` varchar(64) NOT NULL COMMENT '场景名称',
`group_name` varchar(64) NOT NULL COMMENT '组名称',
`scene_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '组状态 0、未启用 1、启用',
`max_retry_count` int(11) NOT NULL DEFAULT 5 COMMENT '最大重试次数',
`back_off` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式',
`trigger_interval` varchar(16) NOT NULL DEFAULT '' COMMENT '间隔时长',
`notify_ids` varchar(128) NOT NULL DEFAULT '' COMMENT '通知告警场景配置id列表',
`deadline_request` bigint(20) unsigned NOT NULL DEFAULT 60000 COMMENT 'Deadline Request 调用链超时 单位毫秒',
`executor_timeout` int(11) unsigned NOT NULL DEFAULT 5 COMMENT '任务执行超时时间,单位秒',
`route_key` tinyint(4) NOT NULL DEFAULT 4 COMMENT '路由策略',
`block_strategy` tinyint(4) NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
`cb_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '回调状态 0、不开启 1、开启',
`cb_trigger_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式',
`cb_max_count` int(11) NOT NULL DEFAULT 16 COMMENT '回调的最大执行次数',
`cb_trigger_interval` varchar(16) NOT NULL DEFAULT '' COMMENT '回调的最大执行次数',
`description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`)
) ENGINE = InnoDB
@@ -249,7 +249,8 @@ CREATE TABLE `sj_system_user`
DEFAULT CHARSET = utf8mb4 COMMENT ='系统用户表';
-- pwd: admin
INSERT INTO `sj_system_user` VALUES (1, 'admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2, now(), now());
INSERT INTO `sj_system_user` (username, password, role)
VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2);
CREATE TABLE `sj_system_user_permission`
(
@@ -294,7 +295,7 @@ CREATE TABLE `sj_job`
`executor_info` varchar(255) DEFAULT NULL COMMENT '执行器名称',
`trigger_type` tinyint(4) NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
`trigger_interval` varchar(255) NOT NULL COMMENT '间隔时长',
`block_strategy` tinyint(4) NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
`block_strategy` tinyint(4) NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行 4、恢复',
`executor_timeout` int(11) NOT NULL DEFAULT 0 COMMENT '任务执行超时时间,单位秒',
`max_retry_times` int(11) NOT NULL DEFAULT 0 COMMENT '最大重试次数',
`parallel_num` int(11) NOT NULL DEFAULT 1 COMMENT '并行数',
@@ -448,7 +449,7 @@ CREATE TABLE `sj_workflow`
`workflow_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '工作流状态 0、关闭、1、开启',
`trigger_type` tinyint(4) NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
`trigger_interval` varchar(255) NOT NULL COMMENT '间隔时长',
`next_trigger_at` bigint(13) NOT NULL COMMENT '下次触发时间',
`next_trigger_at` bigint NOT NULL COMMENT '下次触发时间',
`block_strategy` tinyint(4) NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
`executor_timeout` int(11) NOT NULL DEFAULT 0 COMMENT '任务执行超时时间,单位秒',
`description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述',

View File

@@ -45,7 +45,7 @@ create table sys_tenant
tenant_id varchar(20) not null comment '租户编号',
contact_user_name varchar(20) comment '联系人',
contact_phone varchar(20) comment '联系电话',
company_name varchar(50) comment '企业名称',
company_name varchar(30) comment '企业名称',
license_number varchar(30) comment '统一社会信用代码',
address varchar(200) comment '地址',
intro varchar(200) comment '企业简介',
@@ -208,7 +208,7 @@ create table sys_role (
role_name varchar(30) not null comment '角色名称',
role_key varchar(100) not null comment '角色权限字符串',
role_sort int(4) not null comment '显示顺序',
data_scope char(1) default '1' comment '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限',
data_scope char(1) default '1' comment '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限',
menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示',
status char(1) not null comment '角色状态0正常 1停用',
@@ -828,6 +828,7 @@ create table sys_oss (
original_name varchar(255) not null default '' comment '原名',
file_suffix varchar(10) not null default '' comment '文件后缀名',
url varchar(500) not null comment 'URL地址',
ext1 text default null comment '扩展字段',
create_dept bigint(20) default null comment '创建部门',
create_time datetime default null comment '创建时间',
create_by bigint(20) default null comment '上传人',

View File

@@ -24,7 +24,7 @@ CREATE TABLE `flow_definition`
CREATE TABLE `flow_node`
(
`id` bigint unsigned NOT NULL COMMENT '主键id',
`id` bigint NOT NULL COMMENT '主键id',
`node_type` tinyint(1) NOT NULL COMMENT '节点类型0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关',
`definition_id` bigint NOT NULL COMMENT '流程定义id',
`node_code` varchar(100) NOT NULL COMMENT '流程节点编码',
@@ -32,7 +32,6 @@ CREATE TABLE `flow_node`
`permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用逗号隔开)',
`node_ratio` decimal(6, 3) DEFAULT NULL COMMENT '流程签署比例值',
`coordinate` varchar(100) DEFAULT NULL COMMENT '坐标',
`skip_any_node` varchar(100) DEFAULT 'N' COMMENT '是否可以退回任意节点Y是 N否即将删除',
`any_node_skip` varchar(100) DEFAULT NULL COMMENT '任意结点跳转',
`listener_type` varchar(100) DEFAULT NULL COMMENT '监听器类型',
`listener_path` varchar(400) DEFAULT NULL COMMENT '监听器路径',
@@ -43,6 +42,7 @@ CREATE TABLE `flow_node`
`version` varchar(20) NOT NULL COMMENT '版本',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`ext` text COMMENT '扩展属性',
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
`tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id',
PRIMARY KEY (`id`) USING BTREE
@@ -146,7 +146,8 @@ CREATE TABLE `flow_user`
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
`tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id',
PRIMARY KEY (`id`) USING BTREE,
KEY `user_processed_type` (`processed_by`, `type`)
KEY `user_processed_type` (`processed_by`, `type`),
KEY `user_associated` (`associated`) USING BTREE
) ENGINE = InnoDB COMMENT ='流程用户表';
-- ----------------------------

View File

@@ -2,7 +2,7 @@
SnailJob Database Transfer Tool
Source Server Type : MySQL
Target Server Type : Microsoft SQL Server
Date: 2024-12-27 22:24:37
Date: 2025-02-25 22:16:48
*/
@@ -95,7 +95,6 @@ CREATE TABLE sj_group_config
group_partition int NOT NULL,
id_generator_mode tinyint NOT NULL DEFAULT 1,
init_scene tinyint NOT NULL DEFAULT 0,
bucket_index int NOT NULL DEFAULT 0,
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
)
@@ -174,13 +173,6 @@ EXEC sp_addextendedproperty
'COLUMN', N'init_scene'
GO
EXEC sp_addextendedproperty
'MS_Description', N'bucket',
'SCHEMA', N'dbo',
'TABLE', N'sj_group_config',
'COLUMN', N'bucket_index'
GO
EXEC sp_addextendedproperty
'MS_Description', N'创建时间',
'SCHEMA', N'dbo',
@@ -201,9 +193,9 @@ EXEC sp_addextendedproperty
'TABLE', N'sj_group_config'
GO
INSERT INTO sj_group_config(namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt) VALUES (N'dev', N'ruoyi_group', N'', N'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', N'1', N'1', N'0', N'1', N'1', N'4', getdate(), getdate())
INSERT INTO sj_group_config(namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) VALUES (N'dev', N'ruoyi_group', N'', N'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', N'1', N'1', N'0', N'1', N'1', getdate(), getdate())
GO
INSERT INTO sj_group_config(namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt) VALUES (N'prod', N'ruoyi_group', N'', N'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', N'1', N'1', N'0', N'1', N'1', N'4', getdate(), getdate())
INSERT INTO sj_group_config(namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) VALUES (N'prod', N'ruoyi_group', N'', N'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', N'1', N'1', N'0', N'1', N'1', getdate(), getdate())
GO
-- sj_notify_config
@@ -412,12 +404,11 @@ EXEC sp_addextendedproperty
'TABLE', N'sj_notify_recipient'
GO
-- sj_retry_dead_letter_0
CREATE TABLE sj_retry_dead_letter_0
-- sj_retry_dead_letter
CREATE TABLE sj_retry_dead_letter
(
id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
unique_id nvarchar(64) NOT NULL,
group_name nvarchar(64) NOT NULL,
scene_name nvarchar(64) NOT NULL,
idempotent_id nvarchar(64) NOT NULL,
@@ -425,119 +416,100 @@ CREATE TABLE sj_retry_dead_letter_0
executor_name nvarchar(512) NOT NULL DEFAULT '',
args_str nvarchar(max) NOT NULL,
ext_attrs nvarchar(max) NOT NULL,
task_type tinyint NOT NULL DEFAULT 1,
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
)
GO
CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id)
CREATE INDEX idx_sj_retry_dead_letter_01 ON sj_retry_dead_letter (namespace_id, group_name, scene_name)
GO
CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name)
CREATE INDEX idx_sj_retry_dead_letter_02 ON sj_retry_dead_letter (idempotent_id)
GO
CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id)
CREATE INDEX idx_sj_retry_dead_letter_03 ON sj_retry_dead_letter (biz_no)
GO
CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no)
GO
CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt)
CREATE INDEX idx_sj_retry_dead_letter_04 ON sj_retry_dead_letter (create_dt)
GO
EXEC sp_addextendedproperty
'MS_Description', N'主键',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'命名空间id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'namespace_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'同组下id唯一',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'COLUMN', N'unique_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'组名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'group_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'场景名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'scene_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'幂等id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'idempotent_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'业务编号',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'biz_no'
GO
EXEC sp_addextendedproperty
'MS_Description', N'执行器名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'executor_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'执行方法参数',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'args_str'
GO
EXEC sp_addextendedproperty
'MS_Description', N'扩展字段',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'ext_attrs'
GO
EXEC sp_addextendedproperty
'MS_Description', N'任务类型 1、重试数据 2、回调数据',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'COLUMN', N'task_type'
GO
EXEC sp_addextendedproperty
'MS_Description', N'创建时间',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0',
'TABLE', N'sj_retry_dead_letter',
'COLUMN', N'create_dt'
GO
EXEC sp_addextendedproperty
'MS_Description', N'死信队列表',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_dead_letter_0'
'TABLE', N'sj_retry_dead_letter'
GO
-- sj_retry_task_0
CREATE TABLE sj_retry_task_0
-- sj_retry
CREATE TABLE sj_retry
(
id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
unique_id nvarchar(64) NOT NULL,
group_name nvarchar(64) NOT NULL,
scene_name nvarchar(64) NOT NULL,
idempotent_id nvarchar(64) NOT NULL,
@@ -545,301 +517,299 @@ CREATE TABLE sj_retry_task_0
executor_name nvarchar(512) NOT NULL DEFAULT '',
args_str nvarchar(max) NOT NULL,
ext_attrs nvarchar(max) NOT NULL,
next_trigger_at datetime2 NOT NULL,
next_trigger_at bigint NOT NULL,
retry_count int NOT NULL DEFAULT 0,
retry_status tinyint NOT NULL DEFAULT 0,
task_type tinyint NOT NULL DEFAULT 1,
bucket_index int NOT NULL DEFAULT 0,
parent_id bigint NOT NULL DEFAULT 0,
deleted bigint NOT NULL DEFAULT 0,
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
)
GO
CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id)
CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted)
GO
CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name)
CREATE INDEX idx_sj_retry_01 ON sj_retry (namespace_id, group_name, scene_name)
GO
CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type)
CREATE INDEX idx_sj_retry_02 ON sj_retry (namespace_id, group_name, retry_status)
GO
CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status)
CREATE INDEX idx_sj_retry_03 ON sj_retry (idempotent_id)
GO
CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id)
CREATE INDEX idx_sj_retry_04 ON sj_retry (biz_no)
GO
CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no)
CREATE INDEX idx_sj_retry_05 ON sj_retry (parent_id)
GO
CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt)
CREATE INDEX idx_sj_retry_06 ON sj_retry (create_dt)
GO
EXEC sp_addextendedproperty
'MS_Description', N'主键',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'命名空间id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'namespace_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'同组下id唯一',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'COLUMN', N'unique_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'组名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'group_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'场景名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'scene_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'幂等id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'idempotent_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'业务编号',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'biz_no'
GO
EXEC sp_addextendedproperty
'MS_Description', N'执行器名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'executor_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'执行方法参数',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'args_str'
GO
EXEC sp_addextendedproperty
'MS_Description', N'扩展字段',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'ext_attrs'
GO
EXEC sp_addextendedproperty
'MS_Description', N'下次触发时间',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'next_trigger_at'
GO
EXEC sp_addextendedproperty
'MS_Description', N'重试次数',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'retry_count'
GO
EXEC sp_addextendedproperty
'MS_Description', N'重试状态 0、重试中 1、成功 2、最大重试次数',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'retry_status'
GO
EXEC sp_addextendedproperty
'MS_Description', N'任务类型 1、重试数据 2、回调数据',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'task_type'
GO
EXEC sp_addextendedproperty
'MS_Description', N'bucket',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry',
'COLUMN', N'bucket_index'
GO
EXEC sp_addextendedproperty
'MS_Description', N'父节点id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry',
'COLUMN', N'parent_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'逻辑删除',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry',
'COLUMN', N'deleted'
GO
EXEC sp_addextendedproperty
'MS_Description', N'创建时间',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'create_dt'
GO
EXEC sp_addextendedproperty
'MS_Description', N'修改时间',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0',
'TABLE', N'sj_retry',
'COLUMN', N'update_dt'
GO
EXEC sp_addextendedproperty
'MS_Description', N'任务',
'MS_Description', N'重试信息',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_0'
'TABLE', N'sj_retry'
GO
-- sj_retry_task_log
CREATE TABLE sj_retry_task_log
-- sj_retry_task
CREATE TABLE sj_retry_task
(
id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
unique_id nvarchar(64) NOT NULL,
group_name nvarchar(64) NOT NULL,
scene_name nvarchar(64) NOT NULL,
idempotent_id nvarchar(64) NOT NULL,
biz_no nvarchar(64) NOT NULL DEFAULT '',
executor_name nvarchar(512) NOT NULL DEFAULT '',
args_str nvarchar(max) NOT NULL,
ext_attrs nvarchar(max) NOT NULL,
retry_status tinyint NOT NULL DEFAULT 0,
task_type tinyint NOT NULL DEFAULT 1,
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
group_name nvarchar(64) NOT NULL,
scene_name nvarchar(64) NOT NULL,
retry_id bigint NOT NULL,
ext_attrs nvarchar(max) NOT NULL,
task_status tinyint NOT NULL DEFAULT 1,
task_type tinyint NOT NULL DEFAULT 1,
operation_reason tinyint NOT NULL DEFAULT 0,
client_info nvarchar(128) NULL DEFAULT NULL,
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
)
GO
CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name)
CREATE INDEX idx_sj_retry_task_01 ON sj_retry_task (namespace_id, group_name, scene_name)
GO
CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status)
CREATE INDEX idx_sj_retry_task_02 ON sj_retry_task (task_status)
GO
CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id)
CREATE INDEX idx_sj_retry_task_03 ON sj_retry_task (create_dt)
GO
CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id)
GO
CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no)
GO
CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt)
CREATE INDEX idx_sj_retry_task_04 ON sj_retry_task (retry_id)
GO
EXEC sp_addextendedproperty
'MS_Description', N'主键',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'TABLE', N'sj_retry_task',
'COLUMN', N'id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'命名空间id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'TABLE', N'sj_retry_task',
'COLUMN', N'namespace_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'同组下id唯一',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'COLUMN', N'unique_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'组名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'TABLE', N'sj_retry_task',
'COLUMN', N'group_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'场景名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'TABLE', N'sj_retry_task',
'COLUMN', N'scene_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'幂等id',
'MS_Description', N'重试信息Id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'COLUMN', N'idempotent_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'业务编号',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'COLUMN', N'biz_no'
GO
EXEC sp_addextendedproperty
'MS_Description', N'执行器名称',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'COLUMN', N'executor_name'
GO
EXEC sp_addextendedproperty
'MS_Description', N'执行方法参数',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'COLUMN', N'args_str'
'TABLE', N'sj_retry_task',
'COLUMN', N'retry_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'扩展字段',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'TABLE', N'sj_retry_task',
'COLUMN', N'ext_attrs'
GO
EXEC sp_addextendedproperty
'MS_Description', N'重试状态 0、重试中 1、成功 2、最大次数',
'MS_Description', N'重试状态',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'COLUMN', N'retry_status'
'TABLE', N'sj_retry_task',
'COLUMN', N'task_status'
GO
EXEC sp_addextendedproperty
'MS_Description', N'任务类型 1、重试数据 2、回调数据',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'TABLE', N'sj_retry_task',
'COLUMN', N'task_type'
GO
EXEC sp_addextendedproperty
'MS_Description', N'操作原因',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task',
'COLUMN', N'operation_reason'
GO
EXEC sp_addextendedproperty
'MS_Description', N'客户端地址 clientId#ip:port',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task',
'COLUMN', N'client_info'
GO
EXEC sp_addextendedproperty
'MS_Description', N'创建时间',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'TABLE', N'sj_retry_task',
'COLUMN', N'create_dt'
GO
EXEC sp_addextendedproperty
'MS_Description', N'修改时间',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log',
'TABLE', N'sj_retry_task',
'COLUMN', N'update_dt'
GO
EXEC sp_addextendedproperty
'MS_Description', N'任务日志基础信息',
'MS_Description', N'重试任务表',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log'
'TABLE', N'sj_retry_task'
GO
-- sj_retry_task_log_message
CREATE TABLE sj_retry_task_log_message
(
id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
group_name nvarchar(64) NOT NULL,
unique_id nvarchar(64) NOT NULL,
message nvarchar(max) NOT NULL,
log_num int NOT NULL DEFAULT 1,
real_time bigint NOT NULL DEFAULT 0,
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
group_name nvarchar(64) NOT NULL,
retry_id bigint NOT NULL,
retry_task_id bigint NOT NULL,
message nvarchar(max) NOT NULL,
log_num int NOT NULL DEFAULT 1,
real_time bigint NOT NULL DEFAULT 0,
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
)
GO
CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id)
CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, retry_task_id)
GO
CREATE INDEX idx_sj_retry_task_log_message_02 ON sj_retry_task_log_message (create_dt)
GO
@@ -866,10 +836,17 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
'MS_Description', N'同组下id唯一',
'MS_Description', N'重试信息Id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log_message',
'COLUMN', N'unique_id'
'COLUMN', N'retry_id'
GO
EXEC sp_addextendedproperty
'MS_Description', N'重试任务Id',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_task_log_message',
'COLUMN', N'retry_task_id'
GO
EXEC sp_addextendedproperty
@@ -909,21 +886,26 @@ GO
-- sj_retry_scene_config
CREATE TABLE sj_retry_scene_config
(
id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
scene_name nvarchar(64) NOT NULL,
group_name nvarchar(64) NOT NULL,
scene_status tinyint NOT NULL DEFAULT 0,
max_retry_count int NOT NULL DEFAULT 5,
back_off tinyint NOT NULL DEFAULT 1,
trigger_interval nvarchar(16) NOT NULL DEFAULT '',
notify_ids nvarchar(128) NOT NULL DEFAULT '',
deadline_request bigint NOT NULL DEFAULT 60000,
executor_timeout int NOT NULL DEFAULT 5,
route_key tinyint NOT NULL DEFAULT 4,
description nvarchar(256) NOT NULL DEFAULT '',
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
scene_name nvarchar(64) NOT NULL,
group_name nvarchar(64) NOT NULL,
scene_status tinyint NOT NULL DEFAULT 0,
max_retry_count int NOT NULL DEFAULT 5,
back_off tinyint NOT NULL DEFAULT 1,
trigger_interval nvarchar(16) NOT NULL DEFAULT '',
notify_ids nvarchar(128) NOT NULL DEFAULT '',
deadline_request bigint NOT NULL DEFAULT 60000,
executor_timeout int NOT NULL DEFAULT 5,
route_key tinyint NOT NULL DEFAULT 4,
block_strategy tinyint NOT NULL DEFAULT 1,
cb_status tinyint NOT NULL DEFAULT 0,
cb_trigger_type tinyint NOT NULL DEFAULT 1,
cb_max_count int NOT NULL DEFAULT 16,
cb_trigger_interval nvarchar(16) NOT NULL DEFAULT '',
description nvarchar(256) NOT NULL DEFAULT '',
create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP
)
GO
@@ -1014,6 +996,41 @@ EXEC sp_addextendedproperty
'COLUMN', N'route_key'
GO
EXEC sp_addextendedproperty
'MS_Description', N'阻塞策略 1、丢弃 2、覆盖 3、并行',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_scene_config',
'COLUMN', N'block_strategy'
GO
EXEC sp_addextendedproperty
'MS_Description', N'回调状态 0、不开启 1、开启',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_scene_config',
'COLUMN', N'cb_status'
GO
EXEC sp_addextendedproperty
'MS_Description', N'1、默认等级 2、固定间隔时间 3、CRON 表达式',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_scene_config',
'COLUMN', N'cb_trigger_type'
GO
EXEC sp_addextendedproperty
'MS_Description', N'回调的最大执行次数',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_scene_config',
'COLUMN', N'cb_max_count'
GO
EXEC sp_addextendedproperty
'MS_Description', N'回调的最大执行次数',
'SCHEMA', N'dbo',
'TABLE', N'sj_retry_scene_config',
'COLUMN', N'cb_trigger_interval'
GO
EXEC sp_addextendedproperty
'MS_Description', N'描述',
'SCHEMA', N'dbo',
@@ -1152,7 +1169,7 @@ GO
-- sj_distributed_lock
CREATE TABLE sj_distributed_lock
(
name nvarchar(64) NOT NULL PRIMARY KEY,
name nvarchar(64) NOT NULL,
lock_until datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
locked_at datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
locked_by nvarchar(255) NOT NULL,
@@ -1539,7 +1556,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
'MS_Description', N'阻塞策略 1、丢弃 2、覆盖 3、并行',
'MS_Description', N'阻塞策略 1、丢弃 2、覆盖 3、并行 4、恢复',
'SCHEMA', N'dbo',
'TABLE', N'sj_job',
'COLUMN', N'block_strategy'
@@ -1567,7 +1584,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
'MS_Description', N'重试间隔 ( s ) ',
'MS_Description', N'重试间隔 ( s)',
'SCHEMA', N'dbo',
'TABLE', N'sj_job',
'COLUMN', N'retry_interval'
@@ -2121,7 +2138,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
'MS_Description', N'业务id ( job_id或workflow_id ) ',
'MS_Description', N'业务id ( job_id或workflow_id)',
'SCHEMA', N'dbo',
'TABLE', N'sj_job_summary',
'COLUMN', N'business_id'

View File

@@ -222,7 +222,7 @@ CREATE TABLE sys_tenant
tenant_id nvarchar(20) NOT NULL,
contact_user_name nvarchar(20) NULL,
contact_phone nvarchar(20) NULL,
company_name nvarchar(50) NULL,
company_name nvarchar(30) NULL,
license_number nvarchar(30) NULL,
address nvarchar(200) NULL,
intro nvarchar(200) NULL,
@@ -2318,7 +2318,7 @@ EXEC sys.sp_addextendedproperty
'COLUMN', N'role_sort'
GO
EXEC sys.sp_addextendedproperty
'MS_Description', N'数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限' ,
'MS_Description', N'数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限' ,
'SCHEMA', N'dbo',
'TABLE', N'sys_role',
'COLUMN', N'data_scope'
@@ -2923,6 +2923,7 @@ CREATE TABLE sys_oss
original_name nvarchar(255) DEFAULT '' NOT NULL,
file_suffix nvarchar(10) DEFAULT '' NOT NULL,
url nvarchar(500) NOT NULL,
ext1 nvarchar(500) DEFAULT '' NULL,
create_dept bigint NULL,
create_time datetime2(7) NULL,
create_by bigint NULL,
@@ -2972,6 +2973,12 @@ EXEC sp_addextendedproperty
'TABLE', N'sys_oss',
'COLUMN', N'url'
GO
EXEC sp_addextendedproperty
'MS_Description', N'扩展字段',
'SCHEMA', N'dbo',
'TABLE', N'sys_oss',
'COLUMN', N'ext1'
GO
EXEC sys.sp_addextendedproperty
'MS_Description', N'创建部门' ,
'SCHEMA', N'dbo',

View File

@@ -149,7 +149,6 @@ CREATE TABLE flow_node (
permission_flag nvarchar(200) NULL,
node_ratio decimal(6,3) NULL,
coordinate nvarchar(100) NULL,
skip_any_node nvarchar(100) DEFAULT('N') NULL,
any_node_skip nvarchar(100) NULL,
listener_type nvarchar(100) NULL,
listener_path nvarchar(400) NULL,
@@ -160,6 +159,7 @@ CREATE TABLE flow_node (
version nvarchar(20) NOT NULL,
create_time datetime2(7) NULL,
update_time datetime2(7) NULL,
ext nvarchar(500) NULL,
del_flag nchar(1) DEFAULT('0') NULL,
tenant_id nvarchar(40) NULL,
CONSTRAINT PK__flow_nod__3213E83F372470DE PRIMARY KEY CLUSTERED (id)
@@ -225,13 +225,6 @@ EXEC sp_addextendedproperty
'COLUMN', N'coordinate'
GO
EXEC sp_addextendedproperty
'MS_Description', N'是否可以退回任意节点Y是 N否即将删除',
'SCHEMA', N'dbo',
'TABLE', N'flow_node',
'COLUMN', N'skip_any_node'
GO
EXEC sp_addextendedproperty
'MS_Description', N'任意结点跳转',
'SCHEMA', N'dbo',
@@ -302,6 +295,13 @@ EXEC sp_addextendedproperty
'COLUMN', N'update_time'
GO
EXEC sp_addextendedproperty
'MS_Description', N'扩展属性',
'SCHEMA', N'dbo',
'TABLE', N'flow_node',
'COLUMN', N'ext'
GO
EXEC sp_addextendedproperty
'MS_Description', N'删除标志',
'SCHEMA', N'dbo',
@@ -918,6 +918,8 @@ GO
CREATE NONCLUSTERED INDEX user_processed_type ON flow_user (processed_by ASC, type ASC)
GO
CREATE NONCLUSTERED INDEX user_associated_idx ON flow_user (associated ASC)
GO
EXEC sp_addextendedproperty
'MS_Description', N'主键id',

Some files were not shown because too many files have changed in this diff Show More