Compare commits

...

61 Commits

Author SHA1 Message Date
疯狂的狮子Li 0498ba2e41 fix 修复 防止tenantId出现sql注入问题 2026-08-17 18:04:58 +08:00
疯狂的狮子Li c3a83c11d5 update 优化 兼容企业微信 大小写返回不一致的奇葩问题 2026-07-22 19:12:43 +08:00
疯狂的狮子Li c29ecbd847 update 优化 删除流程实例同时删除抄送内容 2026-07-20 11:48:08 +08:00
疯狂的狮子Li e49f02f89e update 优化 异常处理 2026-06-23 11:37:58 +08:00
疯狂的狮子Li 89f4b7007a update 优化 基于流程变量优化退回选择问题 2026-06-22 16:47:13 +08:00
疯狂的狮子Li 88d03d970d update 优化 工作流管理页接口增加权限标识符 避免越权 2026-06-22 16:26:14 +08:00
疯狂的狮子Li 8136a0191a !860 发布 5.6.2 版本 依赖升级
* 🦁🦁🦁发布 5.6.2 版本 依赖升级
* update springboot 3.5.14 => 3.5.15(springboot 3.X最后一个版本)
* update 优化 防止工作流保存被xss过滤
* update README.md
* add 新增 赞助商
* fix 修复 多次驳回无法锁定审批人问题
* update 优化 findInSet 方法 增加参数校验防止注入
* fix 修复 前端输入性CVE漏洞 禁止使用代码生成到本地路径
* !848 fix: 用户管理导入用户时校验账号最小长度
2026-06-17 05:00:28 +00:00
疯狂的狮子Li 6bfdcae06e !847 发布 5.6.1 版本 依赖升级漏洞修复
Merge pull request !847 from 疯狂的狮子Li/dev
2026-04-24 01:47:21 +00:00
疯狂的狮子Li ba70f9bb2d 🦁🦁🦁发布 5.6.1 版本 依赖升级漏洞修复 2026-04-24 09:44:18 +08:00
疯狂的狮子Li b48fc54151 fix 修复 springboot 升级后 依赖缺失 2026-04-24 09:39:53 +08:00
疯狂的狮子Li 2779c02953 update springboot 3.5.12 => 3.5.14
update springdoc 2.8.15 => 2.8.17
update satoken 1.44.0 => 1.45.0
update springboot-admin 3.5.6 => 3.5.8
update lombok 1.18.42 => 1.18.44
update warmflow 1.8.4 => 1.8.5
update anyline 20251210 => 20260319
2026-04-24 09:21:25 +08:00
疯狂的狮子Li 3965e47d8a update ip2region 3.3.4 => 3.3.7 2026-04-24 09:19:44 +08:00
疯狂的狮子Li 91f7fab613 update snailjob 1.9.0 => 1.10.0 2026-04-24 09:19:20 +08:00
疯狂的狮子Li d259cac6a0 fix 修复 netty 对虚拟线程适配有问题 导致长时间使用 redisson 卡死问题 2026-04-21 10:59:46 +08:00
疯狂的狮子Li cf006a47da fix 修复 AUTO_PASS 变量取值错误 2026-04-10 17:49:59 +08:00
疯狂的狮子Li 14df8e0d9a fix 修复 代码生成 主库生成其他不同数据源sql模板错误问题 2026-04-10 14:50:31 +08:00
疯狂的狮子Li ddff4ae38d update 优化 全局异常拦截器 不返回具体的异常内容到前端页面 避免信息泄漏问题 2026-04-09 14:21:46 +08:00
疯狂的狮子Li a2be9bd3dc update 优化 截断token 避免日志输出具体token内容 防止盗用隐患 2026-04-09 10:58:25 +08:00
疯狂的狮子Li 3904d80329 update 优化 RepeatSubmitAspect.KEY_CACHE 清理不彻底 2026-04-09 10:55:54 +08:00
疯狂的狮子Li acab0637bf fix 修复 ExcelBigNumberConvert 导入没法转换数据问题 2026-04-08 16:27:38 +08:00
疯狂的狮子Li ac374b36b2 fix 修复 部门vo子部门属性使用错误 2026-04-07 09:16:44 +08:00
疯狂的狮子Li 631b6be33c fix 修复 下拉数据字符大于255报错问题 2026-04-03 11:29:50 +08:00
疯狂的狮子Li fe637c4479 update 优化 已办任务列表去除抄送任务 2026-04-02 11:29:16 +08:00
RealXin cb301e214b !840 update 更新gitignore文件
* update 更新gitignore文件
2026-03-30 12:07:31 +00:00
疯狂的狮子Li 6afb100ba3 !842 fix 修复 更新sql字段内容错误
Merge pull request !842 from 疯狂的狮子Li/dev
2026-03-27 09:35:36 +00:00
疯狂的狮子Li 5d1aaa62d6 fix 修复 更新sql字段内容错误 2026-03-24 13:45:58 +08:00
疯狂的狮子Li b629c82d0f !839 发布 5.6.0 版本 新年第一版
Merge pull request !839 from 疯狂的狮子Li/dev
2026-03-24 03:48:49 +00:00
疯狂的狮子Li c601164ba3 🦁🦁🦁发布 5.6.0 版本 新年第一版 2026-03-24 11:38:49 +08:00
疯狂的狮子Li 867a5d084d update bcpkix-jdk18on 1.80 => 1.83 2026-03-24 11:17:54 +08:00
疯狂的狮子Li 78aab8f8cd update springboot 3.5.11 => 3.5.12 2026-03-24 10:20:49 +08:00
疯狂的狮子Li c919572eb2 update 增加更新sql 2026-03-24 10:15:48 +08:00
疯狂的狮子Li ab6409ea28 !827 fix 修复 springboot升级到3.5.10之后大文件上传请求无响应问题(不清楚原因等spring修复)
Merge pull request !827 from 疯狂的狮子Li/dev
2026-01-27 08:13:42 +00:00
疯狂的狮子Li 91ba3869e7 !826 发布 5.5.3 版本 提前祝大家新年快乐
Merge pull request !826 from 疯狂的狮子Li/dev
2026-01-23 06:04:22 +00:00
疯狂的狮子Li 88f871002c !816 fix 修复 判断条件写反问题
Merge pull request !816 from 疯狂的狮子Li/dev
2025-12-24 05:27:11 +00:00
疯狂的狮子Li b6eacfa5a8 !813 紧急修复Ip2Region InputStream读取函数导致的OOM问题
Merge pull request !813 from 疯狂的狮子Li/dev
2025-12-23 06:44:24 +00:00
疯狂的狮子Li da4dffcfce !812 发布 5.5.2 版本 2025年最后一版
Merge pull request !812 from 疯狂的狮子Li/dev
2025-12-23 01:38:19 +00:00
疯狂的狮子Li b58085fde1 !779 发布 5.5.1 正式版 日常依赖升级bug修复
Merge pull request !779 from 疯狂的狮子Li/dev
2025-10-28 03:21:27 +00:00
疯狂的狮子Li b30ffa952f !766 发布 5.5.0 喜迎国庆
Merge pull request !766 from 疯狂的狮子Li/dev
2025-09-22 03:17:27 +00:00
疯狂的狮子Li fd5d028e95 fix 修复 有某些无聊人士 对一个demo案例提漏洞 CVE-2025-6925
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2025-07-04 01:10:49 +00:00
疯狂的狮子Li 64100cf1ff !712 发布 5.4.1 小步迭代修复问题
Merge pull request !712 from 疯狂的狮子Li/dev
2025-07-01 01:12:39 +00:00
疯狂的狮子Li 7e7d857ba5 Merge remote-tracking branch 'origin/dev' into 5.X 2025-05-29 18:18:20 +08:00
疯狂的狮子Li d22b2a10df update 优化 PermissionService 无实现类也可以启动服务 2025-05-29 16:28:56 +08:00
疯狂的狮子Li 957a4d1fcd fix 修复 监听器 flowParams 为null报错问题 2025-05-29 16:28:56 +08:00
疯狂的狮子Li 49ef8378fe !691 发布 5.4.0 正式版
Merge pull request !691 from 疯狂的狮子Li/dev
2025-05-29 03:14:59 +00:00
疯狂的狮子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 159e30c982 !661 发布 5.3.1-BETA2 公测版本
Merge pull request !661 from 疯狂的狮子Li/dev
2025-03-21 07:25:25 +00:00
疯狂的狮子Li 7334d91d6b !652 发布 5.3.1-BETA 公测版本
Merge pull request !652 from 疯狂的狮子Li/dev
2025-03-13 05:27:36 +00:00
疯狂的狮子Li 95c01301f6 !644 同步修复一些问题
Merge pull request !644 from 疯狂的狮子Li/dev
2025-02-07 06:19:28 +00:00
疯狂的狮子Li 296466fa13 !640 发布 5.3.0 新春版 祝大家新年快乐
Merge pull request !640 from 疯狂的狮子Li/dev
2025-01-24 05:08:28 +00:00
疯狂的狮子Li 3c8d864b5f !639 发布 5.3.0-BETA 公测版本
Merge pull request !639 from 疯狂的狮子Li/dev
2025-01-20 03:35:45 +00:00
疯狂的狮子Li ea50a57602 update 优化 xss包装器 Parameter 处理 兼容某些容器不允许改参数的情况 2024-11-21 10:17:34 +08:00
疯狂的狮子Li 7e14b98676 reset 回滚错误修改
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2024-10-28 09:46:28 +00:00
疯狂的狮子Li 015b406001 !591 发布 5.2.3 正式版
Merge pull request !591 from 疯狂的狮子Li/dev
2024-10-25 03:09:23 +00:00
疯狂的狮子Li 098d3347a0 !577 发布 5.2.2 正式版 安全性提升
Merge pull request !577 from 疯狂的狮子Li/dev
2024-08-26 03:43:59 +00:00
疯狂的狮子Li 08d4493994 update 优化 bug 模板 2024-07-15 15:19:22 +08:00
疯狂的狮子Li 367d739e2d Merge remote-tracking branch 'origin/5.X' into 5.X 2024-07-09 16:38:43 +08:00
疯狂的狮子Li d6688a367d !562 ♥️发布 5.2.1 正式版本
Merge pull request !562 from 疯狂的狮子Li/dev
2024-07-09 02:42:40 +00:00
疯狂的狮子Li 0b331796e2 !551 ♥️发布 5.2.0 正式版本
Merge pull request !551 from 疯狂的狮子Li/dev
2024-06-20 02:10:15 +00:00
疯狂的狮子Li 456620b638 !549 ♥️发布 5.2.0-BETA2 公测版本
Merge pull request !549 from 疯狂的狮子Li/dev
2024-06-06 03:13:46 +00:00
46 changed files with 461 additions and 169 deletions
+3
View File
@@ -25,6 +25,9 @@ target/
*.iml *.iml
*.ipr *.ipr
### VS CODE ###
.vscode
### JRebel ### ### JRebel ###
rebel.xml rebel.xml
+1 -1
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> <configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.5.3" /> <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.6.2" />
<option name="buildOnly" value="true" /> <option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" /> <option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" />
</settings> </settings>
+1 -1
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> <configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="ruoyi/ruoyi-server:5.5.3" /> <option name="imageTag" value="ruoyi/ruoyi-server:5.6.2" />
<option name="buildOnly" value="true" /> <option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-admin/Dockerfile" /> <option name="sourceFilePath" value="ruoyi-admin/Dockerfile" />
</settings> </settings>
+1 -1
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="ruoyi-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> <configuration default="false" name="ruoyi-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.5.3" /> <option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.6.2" />
<option name="buildOnly" value="true" /> <option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" /> <option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" />
</settings> </settings>
+3 -3
View File
@@ -5,11 +5,11 @@
## 平台简介 ## 平台简介
[![码云Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/dromara/RuoYi-Vue-Plus) [![码云Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/dromara/RuoYi-Vue-Plus)
[![GitHub](https://img.shields.io/github/stars/dromara/RuoYi-Vue-Plus.svg?label=Github%20Stars)](https://github.com/dromara/RuoYi-Vue-Plus) [![GitHub](https://img.shields.io/github/stars/dromara/RuoYi-Vue-Plus?style=social&label=Github%20Stars)](https://github.com/dromara/RuoYi-Vue-Plus)
[![Star](https://gitcode.com/dromara/RuoYi-Vue-Plus/star/badge.svg)](https://gitcode.com/dromara/RuoYi-Vue-Plus) [![Star](https://gitcode.com/dromara/RuoYi-Vue-Plus/star/badge.svg)](https://gitcode.com/dromara/RuoYi-Vue-Plus)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE)
<br> <br>
[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.5.3-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) [![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.6.2-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5-blue.svg)]() [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5-blue.svg)]()
[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]() [![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
[![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]() [![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]()
@@ -33,11 +33,11 @@
MaxKey 业界领先单点登录产品 - https://gitee.com/dromara/MaxKey <br> MaxKey 业界领先单点登录产品 - https://gitee.com/dromara/MaxKey <br>
CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow <br> CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow <br>
数舵科技 软件定制开发APP小程序等 - https://www.shuduokeji.com/ <br> 数舵科技 软件定制开发APP小程序等 - https://www.shuduokeji.com/ <br>
引迈信息 软件开发平台 - https://www.jnpfsoft.com/index.html?from=plus-doc <br>
Mall4J 高质量Java商城系统 - https://www.mall4j.com/cn/?statId=11 <br> Mall4J 高质量Java商城系统 - https://www.mall4j.com/cn/?statId=11 <br>
aizuda flowlong 工作流 - https://gitee.com/aizuda/flowlong <br> aizuda flowlong 工作流 - https://gitee.com/aizuda/flowlong <br>
Ruoyi-Plus-Uniapp - https://ruoyi.plus <br> Ruoyi-Plus-Uniapp - https://ruoyi.plus <br>
Topiam IAM/IDaaS身份管理平台 - https://www.topiam.cn/ <br> Topiam IAM/IDaaS身份管理平台 - https://www.topiam.cn/ <br>
稳定低价的大模型中转站 - https://aicodelink.top/register?aff=pHeG <br>
[如何成为赞助商 加群联系作者详谈 每日PV2500-3000 IP1700-2500](https://plus-doc.dromara.org/#/common/add_group) [如何成为赞助商 加群联系作者详谈 每日PV2500-3000 IP1700-2500](https://plus-doc.dromara.org/#/common/add_group)
+12 -12
View File
@@ -13,32 +13,32 @@
<description>Dromara RuoYi-Vue-Plus多租户管理系统</description> <description>Dromara RuoYi-Vue-Plus多租户管理系统</description>
<properties> <properties>
<revision>5.5.3</revision> <revision>5.6.2</revision>
<spring-boot.version>3.5.11</spring-boot.version> <spring-boot.version>3.5.15</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version> <java.version>17</java.version>
<mybatis.version>3.5.19</mybatis.version> <mybatis.version>3.5.19</mybatis.version>
<springdoc.version>2.8.15</springdoc.version> <springdoc.version>2.8.17</springdoc.version>
<therapi-javadoc.version>0.15.0</therapi-javadoc.version> <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
<fastexcel.version>1.3.0</fastexcel.version> <fastexcel.version>1.3.0</fastexcel.version>
<velocity.version>2.3</velocity.version> <velocity.version>2.3</velocity.version>
<satoken.version>1.44.0</satoken.version> <satoken.version>1.45.0</satoken.version>
<mybatis-plus.version>3.5.16</mybatis-plus.version> <mybatis-plus.version>3.5.16</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version> <p6spy.version>3.9.1</p6spy.version>
<hutool.version>5.8.43</hutool.version> <hutool.version>5.8.43</hutool.version>
<spring-boot-admin.version>3.5.6</spring-boot-admin.version> <spring-boot-admin.version>3.5.8</spring-boot-admin.version>
<redisson.version>3.52.0</redisson.version> <redisson.version>3.52.0</redisson.version>
<lock4j.version>2.2.7</lock4j.version> <lock4j.version>2.2.7</lock4j.version>
<dynamic-ds.version>4.3.1</dynamic-ds.version> <dynamic-ds.version>4.3.1</dynamic-ds.version>
<snailjob.version>1.9.0</snailjob.version> <snailjob.version>1.10.0</snailjob.version>
<mapstruct-plus.version>1.5.0</mapstruct-plus.version> <mapstruct-plus.version>1.5.0</mapstruct-plus.version>
<mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version> <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
<lombok.version>1.18.42</lombok.version> <lombok.version>1.18.44</lombok.version>
<bouncycastle.version>1.80</bouncycastle.version> <bouncycastle.version>1.83</bouncycastle.version>
<justauth.version>1.16.7</justauth.version> <justauth.version>1.16.7</justauth.version>
<!-- 离线IP地址定位库 --> <!-- 离线IP地址定位库 -->
<ip2region.version>3.3.4</ip2region.version> <ip2region.version>3.3.7</ip2region.version>
<!-- OSS 配置 --> <!-- OSS 配置 -->
<aws.sdk.version>2.28.22</aws.sdk.version> <aws.sdk.version>2.28.22</aws.sdk.version>
<!-- SMS 配置 --> <!-- SMS 配置 -->
@@ -46,9 +46,9 @@
<!-- 限制框架中的fastjson版本 --> <!-- 限制框架中的fastjson版本 -->
<fastjson.version>1.2.83</fastjson.version> <fastjson.version>1.2.83</fastjson.version>
<!-- 面向运行时的D-ORM依赖 --> <!-- 面向运行时的D-ORM依赖 -->
<anyline.version>8.7.3-20251210</anyline.version> <anyline.version>8.7.3-20260319</anyline.version>
<!-- 工作流配置 --> <!-- 工作流配置 -->
<warm-flow.version>1.8.4</warm-flow.version> <warm-flow.version>1.8.5</warm-flow.version>
<!-- 插件版本 --> <!-- 插件版本 -->
<maven-jar-plugin.version>3.4.2</maven-jar-plugin.version> <maven-jar-plugin.version>3.4.2</maven-jar-plugin.version>
@@ -284,7 +284,7 @@
<!-- 加密包引入 --> <!-- 加密包引入 -->
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId> <artifactId>bcpkix-jdk18on</artifactId>
<version>${bouncycastle.version}</version> <version>${bouncycastle.version}</version>
</dependency> </dependency>
@@ -14,6 +14,7 @@ import org.dromara.common.core.domain.dto.UserOnlineDTO;
import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.MessageUtils;
import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.ServletUtils;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ip.AddressUtils; import org.dromara.common.core.utils.ip.AddressUtils;
import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.log.event.LogininforEvent;
import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.redis.utils.RedisUtils;
@@ -73,7 +74,7 @@ public class UserActionListener implements SaTokenListener {
SpringUtils.context().publishEvent(logininforEvent); SpringUtils.context().publishEvent(logininforEvent);
// 更新登录信息 // 更新登录信息
loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip); loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip);
log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); log.info("user doLogin, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8));
} }
/** /**
@@ -85,7 +86,7 @@ public class UserActionListener implements SaTokenListener {
TenantHelper.dynamic(tenantId, () -> { TenantHelper.dynamic(tenantId, () -> {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
}); });
log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); log.info("user doLogout, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8));
} }
/** /**
@@ -97,7 +98,7 @@ public class UserActionListener implements SaTokenListener {
TenantHelper.dynamic(tenantId, () -> { TenantHelper.dynamic(tenantId, () -> {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
}); });
log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); log.info("user doKickout, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8));
} }
/** /**
@@ -109,7 +110,7 @@ public class UserActionListener implements SaTokenListener {
TenantHelper.dynamic(tenantId, () -> { TenantHelper.dynamic(tenantId, () -> {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
}); });
log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); log.info("user doReplaced, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8));
} }
/** /**
@@ -215,6 +215,7 @@ xss:
# 排除链接 # 排除链接
excludeUrls: excludeUrls:
- /system/notice - /system/notice
- /warm-flow/save-json
--- # 分布式锁 lock4j 全局配置 --- # 分布式锁 lock4j 全局配置
lock4j: lock4j:
Binary file not shown.
+1 -1
View File
@@ -14,7 +14,7 @@
</description> </description>
<properties> <properties>
<revision>5.5.3</revision> <revision>5.6.2</revision>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
@@ -1,5 +1,6 @@
package org.dromara.common.core.utils.sql; package org.dromara.common.core.utils.sql;
import cn.hutool.core.exceptions.UtilException;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
@@ -7,7 +8,7 @@ import org.dromara.common.core.utils.StringUtils;
/** /**
* sql操作工具类 * sql操作工具类
* *
* @author ruoyi * @author Lion Li
*/ */
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SqlUtil { public class SqlUtil {
@@ -15,7 +16,7 @@ public class SqlUtil {
/** /**
* 定义常用的 sql关键字 * 定义常用的 sql关键字
*/ */
public static String SQL_REGEX = "\u000B|and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; public static final String SQL_REGEX = "\u000B|%0A|and |extractvalue|updatexml|sleep|information_schema|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
/** /**
* 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
@@ -46,11 +47,21 @@ public class SqlUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
return; return;
} }
// ==================== 核心增强:自动转义单引号 ====================
// 不抛异常、不破坏业务、不改变原方法行为、自动防注入
if (value.contains("'")) {
throw new UtilException("请求参数包含非法字符【'】,已禁止执行");
}
// ==================== 原有逻辑不变 ====================
String normalizedValue = value.replaceAll("\\p{Z}|\\s", "");
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords) { for (String sqlKeyword : sqlKeywords) {
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { if (StringUtils.indexOf(normalizedValue, sqlKeyword) > -1) {
throw new IllegalArgumentException("参数存在SQL注入风险"); throw new UtilException("请求参数包含敏感关键词'" + sqlKeyword + "',可能存在安全风险");
} }
} }
} }
} }
+1 -1
View File
@@ -24,7 +24,7 @@
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId> <artifactId>bcpkix-jdk18on</artifactId>
</dependency> </dependency>
<dependency> <dependency>
@@ -33,7 +33,7 @@ public class ExcelBigNumberConvert implements Converter<Long> {
@Override @Override
public Long convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { public Long convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
return Convert.toLong(cellData.getData()); return Convert.toLong(cellData.getStringValue());
} }
@Override @Override
@@ -130,8 +130,9 @@ public class ExcelDownHandler implements SheetWriteHandler {
} }
if (ObjectUtil.isNotEmpty(options)) { if (ObjectUtil.isNotEmpty(options)) {
// 仅当下拉可选项不为空时执行 // 仅当下拉可选项不为空时执行
if (options.size() > 20) { int totalCharacter = options.stream().mapToInt(String::length).sum() + options.size();
// 这里限制如果可选项大于20,则使用额外表形式 if (options.size() > 20 || totalCharacter > 255) {
// 这里限制如果可选项大于20 或 总字符数超过255,则使用额外表形式
dropDownWithSheet(helper, workbook, sheet, index, options); dropDownWithSheet(helper, workbook, sheet, index, options);
} else { } else {
// 否则使用固定值形式 // 否则使用固定值形式
@@ -12,6 +12,7 @@ import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Before;
import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.MessageUtils;
@@ -76,16 +77,16 @@ public class RepeatSubmitAspect {
*/ */
@AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult") @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) { public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) {
if (jsonResult instanceof R<?> r) { try {
try { if (jsonResult instanceof R<?> r) {
// 成功则不删除redis数据 保证在有效时间内无法重复提交 // 成功则不删除redis数据 保证在有效时间内无法重复提交
if (r.getCode() == R.SUCCESS) { if (r.getCode() == HttpStatus.SUCCESS) {
return; return;
} }
RedisUtils.deleteObject(KEY_CACHE.get()); RedisUtils.deleteObject(KEY_CACHE.get());
} finally {
KEY_CACHE.remove();
} }
} finally {
KEY_CACHE.remove();
} }
} }
@@ -2,10 +2,12 @@ package org.dromara.common.mybatis.helper;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.sql.SqlUtil;
import org.dromara.common.mybatis.enums.DataBaseType; import org.dromara.common.mybatis.enums.DataBaseType;
import javax.sql.DataSource; import javax.sql.DataSource;
@@ -14,6 +16,8 @@ import java.sql.DatabaseMetaData;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* 数据库助手 * 数据库助手
@@ -24,6 +28,7 @@ import java.util.List;
public class DataBaseHelper { public class DataBaseHelper {
private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class); private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class);
private static final Map<String, DataBaseType> DB_TYPE_CACHE = new ConcurrentHashMap<>();
/** /**
* 获取当前数据源对应的数据库类型 * 获取当前数据源对应的数据库类型
@@ -37,13 +42,37 @@ public class DataBaseHelper {
*/ */
public static DataBaseType getDataBaseType() { public static DataBaseType getDataBaseType() {
DataSource dataSource = DS.determineDataSource(); DataSource dataSource = DS.determineDataSource();
try (Connection conn = dataSource.getConnection()) { String dsKey = DynamicDataSourceContextHolder.peek();
DatabaseMetaData metaData = conn.getMetaData(); final String key = dsKey != null ? dsKey : "primary";
String databaseProductName = metaData.getDatabaseProductName(); return DB_TYPE_CACHE.computeIfAbsent(key, k -> {
return DataBaseType.find(databaseProductName); try (Connection conn = dataSource.getConnection()) {
} catch (SQLException e) { DatabaseMetaData metaData = conn.getMetaData();
throw new RuntimeException("获取数据库类型失败", e); String databaseProductName = metaData.getDatabaseProductName();
} return DataBaseType.find(databaseProductName);
} catch (SQLException e) {
throw new RuntimeException("获取数据库类型失败", e);
}
});
}
/**
* 获取指定数据源对应的数据库类型
*
* @param dsName 数据源名称
* @return 指定数据库对应的 DataBaseType 枚举,找不到时默认返回 MY_SQL
* @throws ServiceException 当获取数据库连接或元数据出现异常时抛出业务异常
*/
public static DataBaseType getDataBaseType(String dsName) {
DataSource dataSource = DS.getDataSource(dsName);
return DB_TYPE_CACHE.computeIfAbsent(dsName, k -> {
try (Connection conn = dataSource.getConnection()) {
DatabaseMetaData metaData = conn.getMetaData();
String databaseProductName = metaData.getDatabaseProductName();
return DataBaseType.find(databaseProductName);
} catch (SQLException e) {
throw new RuntimeException("获取数据库类型失败", e);
}
});
} }
/** /**
@@ -61,6 +90,8 @@ public class DataBaseHelper {
*/ */
public static String findInSet(Object var1, String var2) { public static String findInSet(Object var1, String var2) {
String var = Convert.toStr(var1); String var = Convert.toStr(var1);
SqlUtil.filterKeyword(var);
SqlUtil.filterKeyword(var2);
return switch (getDataBaseType()) { return switch (getDataBaseType()) {
// instr(',0,100,101,' , ',100,') <> 0 // instr(',0,100,101,' , ',100,') <> 0
case ORACLE -> "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var); case ORACLE -> "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var);
@@ -74,7 +105,9 @@ public class DataBaseHelper {
} }
/** /**
* 获取当前加载的数据库名 * 获取当前注册的数据源名称列表。
*
* @return 数据源名称列表
*/ */
public static List<String> getDataSourceNameList() { public static List<String> getDataSourceNameList() {
return new ArrayList<>(DS.getDataSources().keySet()); return new ArrayList<>(DS.getDataSources().keySet());
@@ -9,7 +9,6 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.redis.config.properties.RedissonProperties; import org.dromara.common.redis.config.properties.RedissonProperties;
import org.dromara.common.redis.handler.KeyPrefixHandler; import org.dromara.common.redis.handler.KeyPrefixHandler;
import org.dromara.common.redis.handler.RedisExceptionHandler; import org.dromara.common.redis.handler.RedisExceptionHandler;
@@ -21,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.core.task.VirtualThreadTaskExecutor;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@@ -65,9 +63,10 @@ public class RedisConfig {
// 缓存 Lua 脚本 减少网络传输(redisson 大部分的功能都是基于 Lua 脚本实现) // 缓存 Lua 脚本 减少网络传输(redisson 大部分的功能都是基于 Lua 脚本实现)
.setUseScriptCache(true) .setUseScriptCache(true)
.setCodec(codec); .setCodec(codec);
if (SpringUtils.isVirtual()) { // netty 对虚拟线程适配有问题 暂时禁止使用
config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-")); //if (SpringUtils.isVirtual()) {
} // config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-"));
//}
RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig(); RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig();
if (ObjectUtil.isNotNull(singleServerConfig)) { if (ObjectUtil.isNotNull(singleServerConfig)) {
// 使用单机模式 // 使用单机模式
@@ -41,6 +41,11 @@
<artifactId>caffeine</artifactId> <artifactId>caffeine</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>
@@ -53,10 +53,15 @@ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultReq
// 返回 OpenId 或其他,均代表非当前企业用户,不支持 // 返回 OpenId 或其他,均代表非当前企业用户,不支持
// https://github.com/justauth/JustAuth/issues/227 修复bug // https://github.com/justauth/JustAuth/issues/227 修复bug
if (!object.containsKey("userid")) { String userId = null;
if (object.containsKey("userid")) {
userId = object.getString("userid");
} else if (object.containsKey("UserId")) {
userId = object.getString("UserId");
}
if (userId == null) {
throw new AuthException(AuthResponseStatus.UNIDENTIFIED_PLATFORM, source); throw new AuthException(AuthResponseStatus.UNIDENTIFIED_PLATFORM, source);
} }
String userId = object.getString("userid");
String userTicket = object.getString("user_ticket"); String userTicket = object.getString("user_ticket");
JSONObject userDetail = getUserDetail(authToken.getAccessToken(), userId, userTicket); JSONObject userDetail = getUserDetail(authToken.getAccessToken(), userId, userTicket);
@@ -8,6 +8,7 @@ import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.NullValue; import net.sf.jsqlparser.expression.NullValue;
import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.StringValue;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.sql.SqlUtil;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.tenant.properties.TenantProperties; import org.dromara.common.tenant.properties.TenantProperties;
@@ -32,7 +33,7 @@ public class PlusTenantLineHandler implements TenantLineHandler {
return new NullValue(); return new NullValue();
} }
// 返回固定租户 // 返回固定租户
return new StringValue(tenantId); return new StringValue(SqlUtil.escapeOrderBySql(tenantId));
} }
@Override @Override
@@ -2,7 +2,6 @@ package org.dromara.common.web.handler;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus; import cn.hutool.http.HttpStatus;
import com.fasterxml.jackson.core.JsonParseException;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolation;
@@ -14,6 +13,7 @@ import org.dromara.common.core.exception.SseException;
import org.dromara.common.core.exception.base.BaseException; import org.dromara.common.core.exception.base.BaseException;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
import org.springframework.boot.json.JsonParseException;
import org.springframework.context.MessageSourceResolvable; import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.expression.ExpressionException; import org.springframework.expression.ExpressionException;
@@ -80,7 +80,7 @@ public class GlobalExceptionHandler {
public R<Void> handleServletException(ServletException e, HttpServletRequest request) { public R<Void> handleServletException(ServletException e, HttpServletRequest request) {
String requestURI = request.getRequestURI(); String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生未知异常.", requestURI, e); log.error("请求地址'{}',发生未知异常.", requestURI, e);
return R.fail(e.getMessage()); return R.fail("发生未知异常,请联系管理员");
} }
/** /**
@@ -119,7 +119,7 @@ public class GlobalExceptionHandler {
public R<Void> handleNoHandlerFoundException(NoHandlerFoundException e, HttpServletRequest request) { public R<Void> handleNoHandlerFoundException(NoHandlerFoundException e, HttpServletRequest request) {
String requestURI = request.getRequestURI(); String requestURI = request.getRequestURI();
log.error("请求地址'{}'不存在.", requestURI); log.error("请求地址'{}'不存在.", requestURI);
return R.fail(HttpStatus.HTTP_NOT_FOUND, e.getMessage()); return R.fail(HttpStatus.HTTP_NOT_FOUND, "请求地址不存在");
} }
/** /**
@@ -150,7 +150,7 @@ public class GlobalExceptionHandler {
public R<Void> handleRuntimeException(RuntimeException e, HttpServletRequest request) { public R<Void> handleRuntimeException(RuntimeException e, HttpServletRequest request) {
String requestURI = request.getRequestURI(); String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生未知异常.", requestURI, e); log.error("请求地址'{}',发生未知异常.", requestURI, e);
return R.fail(e.getMessage()); return R.fail("发生未知异常,请联系管理员");
} }
/** /**
@@ -160,7 +160,7 @@ public class GlobalExceptionHandler {
public R<Void> handleException(Exception e, HttpServletRequest request) { public R<Void> handleException(Exception e, HttpServletRequest request) {
String requestURI = request.getRequestURI(); String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生系统异常.", requestURI, e); log.error("请求地址'{}',发生系统异常.", requestURI, e);
return R.fail(e.getMessage()); return R.fail("发生系统异常,请联系管理员");
} }
/** /**
@@ -157,19 +157,6 @@ public class GenController extends BaseController {
genCode(response, data); genCode(response, data);
} }
/**
* 生成代码自定义路径
*
* @param tableId 表ID
*/
@SaCheckPermission("tool:gen:code")
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
@GetMapping("/genCode/{tableId}")
public R<Void> genCode(@PathVariable("tableId") Long tableId) {
genTableService.generatorCode(tableId);
return R.ok();
}
/** /**
* 同步数据库 * 同步数据库
* *
@@ -101,12 +101,12 @@ public class GenTable extends BaseEntity {
private String functionAuthor; private String functionAuthor;
/** /**
* 生成代码方式0zip压缩包 1自定义路径 * 生成代码方式固定为0zip压缩包
*/ */
private String genType; private String genType;
/** /**
* 生成路径不填默认项目路径 * 生成路径兼容历史字段
*/ */
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY) @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String genPath; private String genPath;
@@ -23,7 +23,6 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.file.FileUtils;
import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -40,7 +39,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@@ -222,6 +220,8 @@ public class GenTableServiceImpl implements IGenTableService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public void updateGenTable(GenTable genTable) { public void updateGenTable(GenTable genTable) {
genTable.setGenType("0");
genTable.setGenPath("/");
String options = JsonUtils.toJsonString(genTable.getParams()); String options = JsonUtils.toJsonString(genTable.getParams());
genTable.setOptions(options); genTable.setOptions(options);
int row = baseMapper.updateById(genTable); int row = baseMapper.updateById(genTable);
@@ -331,7 +331,7 @@ public class GenTableServiceImpl implements IGenTableService {
VelocityContext context = VelocityUtils.prepareContext(table); VelocityContext context = VelocityUtils.prepareContext(table);
// 获取模板列表 // 获取模板列表
List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory()); List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDataName());
for (String template : templates) { for (String template : templates) {
// 渲染模板 // 渲染模板
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
@@ -357,40 +357,6 @@ public class GenTableServiceImpl implements IGenTableService {
return outputStream.toByteArray(); return outputStream.toByteArray();
} }
/**
* 生成代码自定义路径
*
* @param tableId 表名称
*/
@Override
public void generatorCode(Long tableId) {
// 查询表信息
GenTable table = baseMapper.selectGenTableById(tableId);
// 设置主键列信息
setPkColumn(table);
VelocityInitializer.initVelocity();
VelocityContext context = VelocityUtils.prepareContext(table);
// 获取模板列表
List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
for (String template : templates) {
if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) {
// 渲染模板
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate(template, Constants.UTF8);
tpl.merge(context, sw);
try {
String path = getGenPath(table, template);
FileUtils.writeUtf8String(sw.toString(), path);
} catch (Exception e) {
throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
}
}
}
}
/** /**
* 同步数据库 * 同步数据库
* *
@@ -478,7 +444,7 @@ public class GenTableServiceImpl implements IGenTableService {
VelocityContext context = VelocityUtils.prepareContext(table); VelocityContext context = VelocityUtils.prepareContext(table);
// 获取模板列表 // 获取模板列表
List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory()); List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDataName());
for (String template : templates) { for (String template : templates) {
// 渲染模板 // 渲染模板
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
@@ -560,19 +526,5 @@ public class GenTableServiceImpl implements IGenTableService {
} }
} }
/**
* 获取代码生成地址
*
* @param table 业务表信息
* @param template 模板文件路径
* @return 生成地址
*/
public static String getGenPath(GenTable table, String template) {
String genPath = table.getGenPath();
if (StringUtils.equals(genPath, "/")) {
return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table);
}
return genPath + File.separator + VelocityUtils.getFileName(template, table);
}
} }
@@ -110,13 +110,6 @@ public interface IGenTableService {
*/ */
byte[] downloadCode(Long tableId); byte[] downloadCode(Long tableId);
/**
* 生成代码自定义路径
*
* @param tableId 表名称
*/
void generatorCode(Long tableId);
/** /**
* 同步数据库 * 同步数据库
* *
@@ -109,7 +109,7 @@ public class VelocityUtils {
* *
* @return 模板列表 * @return 模板列表
*/ */
public static List<String> getTemplateList(String tplCategory) { public static List<String> getTemplateList(String tplCategory, String dsName) {
List<String> templates = new ArrayList<>(); List<String> templates = new ArrayList<>();
templates.add("vm/java/domain.java.vm"); templates.add("vm/java/domain.java.vm");
templates.add("vm/java/vo.java.vm"); templates.add("vm/java/vo.java.vm");
@@ -119,7 +119,7 @@ public class VelocityUtils {
templates.add("vm/java/serviceImpl.java.vm"); templates.add("vm/java/serviceImpl.java.vm");
templates.add("vm/java/controller.java.vm"); templates.add("vm/java/controller.java.vm");
templates.add("vm/xml/mapper.xml.vm"); templates.add("vm/xml/mapper.xml.vm");
DataBaseType dataBaseType = DataBaseHelper.getDataBaseType(); DataBaseType dataBaseType = DataBaseHelper.getDataBaseType(dsName);
if (dataBaseType.isOracle()) { if (dataBaseType.isOracle()) {
templates.add("vm/sql/oracle/sql.vm"); templates.add("vm/sql/oracle/sql.vm");
} else if (dataBaseType.isPostgreSql()) { } else if (dataBaseType.isPostgreSql()) {
@@ -39,7 +39,7 @@ public class SysUserBo extends BaseEntity {
*/ */
@Xss(message = "用户账号不能包含脚本字符") @Xss(message = "用户账号不能包含脚本字符")
@NotBlank(message = "用户账号不能为空") @NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") @Size(min = 2, max = 30, message = "用户账号长度必须在{min}到{max}个字符之间")
private String userName; private String userName;
/** /**
@@ -104,6 +104,6 @@ public class SysDeptVo implements Serializable {
/** /**
* 子部门 * 子部门
*/ */
private List<SysDept> children = new ArrayList<>(); private List<SysDeptVo> children = new ArrayList<>();
} }
@@ -1,5 +1,6 @@
package org.dromara.workflow.controller; package org.dromara.workflow.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.StartProcessReturnDTO; import org.dromara.common.core.domain.dto.StartProcessReturnDTO;
@@ -91,6 +92,7 @@ public class FlwTaskController extends BaseController {
* @param flowTaskBo 参数 * @param flowTaskBo 参数
* @param pageQuery 分页 * @param pageQuery 分页
*/ */
@SaCheckPermission("workflow:task:list")
@GetMapping("/pageByAllTaskWait") @GetMapping("/pageByAllTaskWait")
public TableDataInfo<FlowTaskVo> pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { public TableDataInfo<FlowTaskVo> pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
return flwTaskService.pageByAllTaskWait(flowTaskBo, pageQuery); return flwTaskService.pageByAllTaskWait(flowTaskBo, pageQuery);
@@ -102,6 +104,7 @@ public class FlwTaskController extends BaseController {
* @param flowTaskBo 参数 * @param flowTaskBo 参数
* @param pageQuery 分页 * @param pageQuery 分页
*/ */
@SaCheckPermission("workflow:task:list")
@GetMapping("/pageByAllTaskFinish") @GetMapping("/pageByAllTaskFinish")
public TableDataInfo<FlowHisTaskVo> pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { public TableDataInfo<FlowHisTaskVo> pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
return flwTaskService.pageByAllTaskFinish(flowTaskBo, pageQuery); return flwTaskService.pageByAllTaskFinish(flowTaskBo, pageQuery);
@@ -171,6 +174,7 @@ public class FlwTaskController extends BaseController {
*/ */
@Log(title = "任务管理", businessType = BusinessType.UPDATE) @Log(title = "任务管理", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@SaCheckPermission("workflow:task:edit")
@PutMapping("/updateAssignee/{userId}") @PutMapping("/updateAssignee/{userId}")
public R<Void> updateAssignee(@RequestBody List<Long> taskIdList, @PathVariable String userId) { public R<Void> updateAssignee(@RequestBody List<Long> taskIdList, @PathVariable String userId) {
return toAjax(flwTaskService.updateAssignee(taskIdList, userId)); return toAjax(flwTaskService.updateAssignee(taskIdList, userId));
@@ -217,6 +221,7 @@ public class FlwTaskController extends BaseController {
*/ */
@PostMapping("/urgeTask") @PostMapping("/urgeTask")
@Log(title = "任务管理", businessType = BusinessType.INSERT) @Log(title = "任务管理", businessType = BusinessType.INSERT)
@SaCheckPermission("workflow:task:edit")
public R<Void> urgeTask(@RequestBody FlowUrgeTaskBo bo) { public R<Void> urgeTask(@RequestBody FlowUrgeTaskBo bo) {
return toAjax(flwTaskService.urgeTask(bo)); return toAjax(flwTaskService.urgeTask(bo));
} }
@@ -159,9 +159,11 @@ public class WorkflowGlobalListener implements GlobalListener {
String[] userIdArray = userIds.split(StringUtils.SEPARATOR); String[] userIdArray = userIds.split(StringUtils.SEPARATOR);
if (userIdArray.length > 0) { if (userIdArray.length > 0) {
flowTask.setPermissionList(List.of(userIdArray)); flowTask.setPermissionList(List.of(userIdArray));
// 移除已处理的状态变量 if (TaskStatusEnum.PASS.getStatus().equals(taskStatus)) {
variable.remove(nodeKey); // 办理指定人变量只消费一次驳回指定人变量需要保留给后续重复驳回
FlowEngine.insService().removeVariables(flowTask.getInstanceId(), nodeKey); variable.remove(nodeKey);
FlowEngine.insService().removeVariables(flowTask.getInstanceId(), nodeKey);
}
} }
} }
@@ -195,7 +195,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
} }
// 发送事件 // 发送事件
processDeleteHandler(flowInstances); processDeleteHandler(flowInstances);
return insService.remove(StreamUtils.toList(flowInstances, FlowInstance::getId)); List<Long> instanceIds = StreamUtils.toList(flowInstances, FlowInstance::getId);
// 删除抄送任务关联的用户记录
deleteCopyTaskUsers(instanceIds);
return insService.remove(instanceIds);
} }
/** /**
@@ -214,8 +217,11 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
} }
// 发送事件 // 发送事件
processDeleteHandler(flowInstances); processDeleteHandler(flowInstances);
List<Long> validInstanceIds = StreamUtils.toList(flowInstances, FlowInstance::getId);
// 删除抄送任务关联的用户记录
deleteCopyTaskUsers(validInstanceIds);
// 删除实例 // 删除实例
return insService.remove(instanceIds); return insService.remove(validInstanceIds);
} }
/** /**
@@ -234,16 +240,56 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
} }
// 发送事件 // 发送事件
processDeleteHandler(flowInstances); processDeleteHandler(flowInstances);
List<FlowTask> flowTaskList = flwTaskService.selectByInstIds(instanceIds); List<Long> validInstanceIds = StreamUtils.toList(flowInstances, FlowInstance::getId);
if (CollUtil.isNotEmpty(flowTaskList)) { List<FlowTask> flowTaskList = flwTaskService.selectByInstIds(validInstanceIds);
FlowEngine.userService().deleteByTaskIds(StreamUtils.toList(flowTaskList, FlowTask::getId)); List<Long> taskIds = new ArrayList<>(StreamUtils.toList(flowTaskList, FlowTask::getId));
} taskIds.addAll(selectCopyTaskIds(validInstanceIds));
FlowEngine.taskService().deleteByInsIds(instanceIds); deleteTaskUsers(taskIds);
FlowEngine.hisTaskService().deleteByInsIds(instanceIds); FlowEngine.taskService().deleteByInsIds(validInstanceIds);
FlowEngine.insService().removeByIds(instanceIds); FlowEngine.hisTaskService().deleteByInsIds(validInstanceIds);
FlowEngine.insService().removeByIds(validInstanceIds);
return true; return true;
} }
/**
* 查询流程实例下的抄送任务id
*
* @param instanceIds 流程实例id
* @return 抄送任务id
*/
private List<Long> selectCopyTaskIds(List<Long> instanceIds) {
if (CollUtil.isEmpty(instanceIds)) {
return Collections.emptyList();
}
List<FlowHisTask> copyTaskList = flowHisTaskMapper.selectList(
new LambdaQueryWrapper<>(FlowHisTask.class)
.select(FlowHisTask::getTaskId)
.eq(FlowHisTask::getFlowStatus, TaskStatusEnum.COPY.getStatus())
.in(FlowHisTask::getInstanceId, instanceIds)
);
return StreamUtils.toList(copyTaskList, FlowHisTask::getTaskId);
}
/**
* 删除抄送任务关联的用户记录
*
* @param instanceIds 流程实例id
*/
private void deleteCopyTaskUsers(List<Long> instanceIds) {
deleteTaskUsers(selectCopyTaskIds(instanceIds));
}
/**
* 删除任务关联的用户记录
*
* @param taskIds 任务id
*/
private void deleteTaskUsers(List<Long> taskIds) {
if (CollUtil.isNotEmpty(taskIds)) {
FlowEngine.userService().deleteByTaskIds(taskIds);
}
}
private void processDeleteHandler(List<FlowInstance> flowInstances) { private void processDeleteHandler(List<FlowInstance> flowInstances) {
@@ -29,12 +29,15 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.utils.IdGeneratorUtil; import org.dromara.common.mybatis.utils.IdGeneratorUtil;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.constant.ExceptionCons;
import org.dromara.warm.flow.core.dto.FlowCombine;
import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.entity.*;
import org.dromara.warm.flow.core.enums.CooperateType; import org.dromara.warm.flow.core.enums.CooperateType;
import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.NodeType;
import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.enums.UserType; import org.dromara.warm.flow.core.enums.UserType;
import org.dromara.warm.flow.core.exception.FlowException;
import org.dromara.warm.flow.core.service.*; import org.dromara.warm.flow.core.service.*;
import org.dromara.warm.flow.core.utils.ExpressionUtil; import org.dromara.warm.flow.core.utils.ExpressionUtil;
import org.dromara.warm.flow.core.utils.MapUtil; import org.dromara.warm.flow.core.utils.MapUtil;
@@ -232,8 +235,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) {
variables.put(SUBMIT, true); variables.put(SUBMIT, true);
} }
Map<String, Object> insVariableMap = ins.getVariableMap();
// 设置弹窗处理人 // 设置弹窗处理人
Map<String, Object> assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap()); Map<String, Object> assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), insVariableMap);
if (CollUtil.isNotEmpty(assigneeMap)) { if (CollUtil.isNotEmpty(assigneeMap)) {
variables.putAll(assigneeMap); variables.putAll(assigneeMap);
} }
@@ -249,7 +253,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
.flowStatus(BusinessStatusEnum.WAITING.getStatus()) .flowStatus(BusinessStatusEnum.WAITING.getStatus())
.hisStatus(TaskStatusEnum.PASS.getStatus()) .hisStatus(TaskStatusEnum.PASS.getStatus())
.hisTaskExt(completeTaskBo.getFileId()); .hisTaskExt(completeTaskBo.getFileId());
Boolean autoPass = Convert.toBool(variables.getOrDefault(AUTO_PASS, false)); Boolean autoPass = Convert.toBool(insVariableMap.getOrDefault(AUTO_PASS, false));
skipTask(taskId, flowParams, flowTask.getInstanceId(), autoPass); skipTask(taskId, flowParams, flowTask.getInstanceId(), autoPass);
return true; return true;
} }
@@ -543,16 +547,30 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
return nodeService.getByNodeCodes(Collections.singletonList(node.getAnyNodeSkip()), task.getDefinitionId()); return nodeService.getByNodeCodes(Collections.singletonList(node.getAnyNodeSkip()), task.getDefinitionId());
} }
//获取可驳回的前置节点 //获取可驳回的前置节点
List<Node> nodes = nodeService.previousNodeList(task.getDefinitionId(), nowNodeCode); Long definitionId = task.getDefinitionId();
FlowCombine flowCombine = defService.getFlowCombineNoDef(definitionId);
Map<String, Node> nodeMap = getPreviousNodeMap(nowNodeCode, flowCombine);
List<HisTask> hisTaskList = hisTaskService.getByInsId(task.getInstanceId()); List<HisTask> hisTaskList = hisTaskService.getByInsId(task.getInstanceId());
Map<String, Node> nodeMap = StreamUtils.toIdentityMap(nodes, Node::getNodeCode); Set<String> reachableNodeCodes = new HashSet<>();
if (CollUtil.isNotEmpty(hisTaskList)) {
Instance instance = insService.getById(task.getInstanceId());
if (ObjectUtil.isNull(instance)) {
throw new ServiceException("流程实例不存在");
}
collectReachableNodeCodes(reachableNodeCodes, instance, flowCombine);
if (!reachableNodeCodes.contains(nowNodeCode)) {
reachableNodeCodes.clear();
}
}
Set<String> added = new HashSet<>(); Set<String> added = new HashSet<>();
List<Node> backNodeList = new ArrayList<>(); List<Node> backNodeList = new ArrayList<>();
for (HisTask hisTask : hisTaskList) { for (HisTask hisTask : hisTaskList) {
Node nodeValue = nodeMap.get(hisTask.getNodeCode()); Node nodeValue = nodeMap.get(hisTask.getNodeCode());
if (nodeValue != null if (nodeValue != null
&& NodeType.BETWEEN.getKey().equals(nodeValue.getNodeType()) && NodeType.BETWEEN.getKey().equals(nodeValue.getNodeType())
&& (CollUtil.isEmpty(reachableNodeCodes) || reachableNodeCodes.contains(nodeValue.getNodeCode()))
&& added.add(nodeValue.getNodeCode())) { && added.add(nodeValue.getNodeCode())) {
backNodeList.add(nodeValue); backNodeList.add(nodeValue);
} }
@@ -561,7 +579,78 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Collections.reverse(backNodeList); Collections.reverse(backNodeList);
return backNodeList; return backNodeList;
} }
return nodes; if (CollUtil.isNotEmpty(hisTaskList)) {
return Collections.emptyList();
}
return StreamUtils.filter(nodeMap.values(), e -> NodeType.BETWEEN.getKey().equals(e.getNodeType()));
}
private Map<String, Node> getPreviousNodeMap(String nodeCode, FlowCombine flowCombine) {
if (ObjectUtil.isNull(flowCombine) || CollUtil.isEmpty(flowCombine.getAllNodes()) || CollUtil.isEmpty(flowCombine.getAllSkips())) {
return Collections.emptyMap();
}
Map<String, Node> allNodeMap = StreamUtils.toIdentityMap(flowCombine.getAllNodes(), Node::getNodeCode);
Map<String, List<Skip>> previousSkipMap = new HashMap<>();
for (Skip skip : flowCombine.getAllSkips()) {
previousSkipMap.computeIfAbsent(skip.getNextNodeCode(), k -> new ArrayList<>()).add(skip);
}
Map<String, Node> previousNodeMap = new LinkedHashMap<>();
Set<String> visitedNodeCodes = new HashSet<>();
Deque<String> nodeQueue = new ArrayDeque<>();
visitedNodeCodes.add(nodeCode);
nodeQueue.add(nodeCode);
while (CollUtil.isNotEmpty(nodeQueue)) {
String currentNodeCode = nodeQueue.poll();
List<Skip> previousSkips = previousSkipMap.get(currentNodeCode);
if (CollUtil.isEmpty(previousSkips)) {
continue;
}
for (Skip previousSkip : previousSkips) {
String previousNodeCode = previousSkip.getNowNodeCode();
if (!visitedNodeCodes.add(previousNodeCode)) {
continue;
}
Node previousNode = allNodeMap.get(previousNodeCode);
if (ObjectUtil.isNull(previousNode)) {
continue;
}
previousNodeMap.put(previousNodeCode, previousNode);
nodeQueue.add(previousNodeCode);
}
}
return previousNodeMap;
}
private void collectReachableNodeCodes(Set<String> nodeCodes, Instance instance, FlowCombine flowCombine) {
if (ObjectUtil.isNull(flowCombine) || CollUtil.isEmpty(flowCombine.getAllNodes())) {
return;
}
Deque<Node> nodeQueue = new ArrayDeque<>();
flowCombine.getAllNodes().stream()
.filter(e -> NodeType.START.getKey().equals(e.getNodeType()))
.findFirst()
.ifPresent(nodeQueue::add);
while (CollUtil.isNotEmpty(nodeQueue)) {
Node currentNode = nodeQueue.poll();
if (ObjectUtil.isNull(currentNode) || !nodeCodes.add(currentNode.getNodeCode())) {
continue;
}
try {
List<Node> nextNodes = nodeService.getNextNodeList(currentNode, null, SkipType.PASS.getKey(),
instance.getVariableMap(), null, flowCombine);
if (CollUtil.isNotEmpty(nextNodes)) {
nodeQueue.addAll(nextNodes);
}
} catch (FlowException e) {
// 条件变量缺失时跳过当前分支其他引擎异常继续抛出
if (!StringUtils.containsAny(e.getMessage(), ExceptionCons.NULL_CONDITION_VALUE, ExceptionCons.NULL_SKIP_TYPE)) {
throw e;
}
}
}
} }
/** /**
@@ -88,6 +88,7 @@
and b.del_flag = '0' and b.del_flag = '0'
and c.del_flag = '0' and c.del_flag = '0'
and a.node_type in ('1','3','4') and a.node_type in ('1','3','4')
and a.flow_status <![CDATA[ <> ]]> 'copy'
) t ) t
${ew.getCustomSqlSegment} ${ew.getCustomSqlSegment}
</select> </select>
+4 -4
View File
@@ -99,7 +99,7 @@ services:
network_mode: "host" network_mode: "host"
ruoyi-server1: ruoyi-server1:
image: ruoyi/ruoyi-server:5.5.3 image: ruoyi/ruoyi-server:5.6.2
container_name: ruoyi-server1 container_name: ruoyi-server1
environment: environment:
# 时区上海 # 时区上海
@@ -115,7 +115,7 @@ services:
network_mode: "host" network_mode: "host"
ruoyi-server2: ruoyi-server2:
image: ruoyi/ruoyi-server:5.5.3 image: ruoyi/ruoyi-server:5.6.2
container_name: ruoyi-server2 container_name: ruoyi-server2
environment: environment:
# 时区上海 # 时区上海
@@ -131,7 +131,7 @@ services:
network_mode: "host" network_mode: "host"
ruoyi-monitor-admin: ruoyi-monitor-admin:
image: ruoyi/ruoyi-monitor-admin:5.5.3 image: ruoyi/ruoyi-monitor-admin:5.6.2
container_name: ruoyi-monitor-admin container_name: ruoyi-monitor-admin
environment: environment:
# 时区上海 # 时区上海
@@ -143,7 +143,7 @@ services:
network_mode: "host" network_mode: "host"
ruoyi-snailjob-server: ruoyi-snailjob-server:
image: ruoyi/ruoyi-snailjob-server:5.5.3 image: ruoyi/ruoyi-snailjob-server:5.6.2
container_name: ruoyi-snailjob-server container_name: ruoyi-snailjob-server
environment: environment:
# 时区上海 # 时区上海
+8 -2
View File
@@ -484,6 +484,7 @@ CREATE TABLE sj_job
( (
id number GENERATED ALWAYS AS IDENTITY, id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
biz_id varchar2(64) NOT NULL,
group_name varchar2(64) NULL, group_name varchar2(64) NULL,
job_name varchar2(64) NULL, job_name varchar2(64) NULL,
args_str clob DEFAULT NULL NULL, args_str clob DEFAULT NULL NULL,
@@ -519,9 +520,11 @@ ALTER TABLE sj_job
CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name); CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name);
CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index); CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index);
CREATE INDEX idx_sj_job_03 ON sj_job (create_dt); CREATE INDEX idx_sj_job_03 ON sj_job (create_dt);
CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id);
COMMENT ON COLUMN sj_job.id IS '主键'; COMMENT ON COLUMN sj_job.id IS '主键';
COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id'; COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_job.biz_id IS '业务ID';
COMMENT ON COLUMN sj_job.group_name IS '组名称'; COMMENT ON COLUMN sj_job.group_name IS '组名称';
COMMENT ON COLUMN sj_job.job_name IS '名称'; COMMENT ON COLUMN sj_job.job_name IS '名称';
COMMENT ON COLUMN sj_job.args_str IS '执行方法参数'; COMMENT ON COLUMN sj_job.args_str IS '执行方法参数';
@@ -551,7 +554,7 @@ COMMENT ON COLUMN sj_job.create_dt IS '创建时间';
COMMENT ON COLUMN sj_job.update_dt IS '修改时间'; COMMENT ON COLUMN sj_job.update_dt IS '修改时间';
COMMENT ON TABLE sj_job IS '任务信息'; COMMENT ON TABLE sj_job IS '任务信息';
INSERT INTO sj_job(namespace_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES ('dev', 'ruoyi_group', 'demo-job', NULL, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0, sysdate, sysdate); INSERT INTO sj_job(namespace_id, biz_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES ('dev', 'demo-job', 'ruoyi_group', 'demo-job', NULL, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0, sysdate, sysdate);
-- sj_job_log_message -- sj_job_log_message
CREATE TABLE sj_job_log_message CREATE TABLE sj_job_log_message
@@ -738,7 +741,7 @@ CREATE TABLE sj_retry_summary
id number GENERATED ALWAYS AS IDENTITY, id number GENERATED ALWAYS AS IDENTITY,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
group_name varchar2(64) DEFAULT '' NULL, group_name varchar2(64) DEFAULT '' NULL,
scene_name varchar2(64) DEFAULT '' NULL, scene_name varchar2(50) DEFAULT '' NULL,
trigger_at date DEFAULT CURRENT_TIMESTAMP NOT NULL, trigger_at date DEFAULT CURRENT_TIMESTAMP NOT NULL,
running_num number DEFAULT 0 NOT NULL, running_num number DEFAULT 0 NOT NULL,
finish_num number DEFAULT 0 NOT NULL, finish_num number DEFAULT 0 NOT NULL,
@@ -774,6 +777,7 @@ CREATE TABLE sj_workflow
id number GENERATED ALWAYS AS IDENTITY, id number GENERATED ALWAYS AS IDENTITY,
workflow_name varchar2(64) NULL, workflow_name varchar2(64) NULL,
namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
biz_id varchar2(64) NOT NULL,
group_name varchar2(64) NULL, group_name varchar2(64) NULL,
workflow_status smallint DEFAULT 1 NOT NULL, workflow_status smallint DEFAULT 1 NOT NULL,
trigger_type smallint NOT NULL, trigger_type smallint NOT NULL,
@@ -799,10 +803,12 @@ ALTER TABLE sj_workflow
CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt); CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt);
CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name); CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name);
CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id);
COMMENT ON COLUMN sj_workflow.id IS '主键'; COMMENT ON COLUMN sj_workflow.id IS '主键';
COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称'; COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称';
COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id'; COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_workflow.biz_id IS '业务ID';
COMMENT ON COLUMN sj_workflow.group_name IS '组名称'; COMMENT ON COLUMN sj_workflow.group_name IS '组名称';
COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启'; COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启';
COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间'; COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
+2 -1
View File
@@ -478,7 +478,8 @@ INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInst
INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', 'workflow:instance:currentList', 'guide', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', 'workflow:instance:currentList', 'guide', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'processMonitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'processMonitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', 'workflow:task:list', 'waiting', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11660', '待办任务修改', '11631', '1', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:task:edit', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, '/workflow/processDefinition'); INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, '/workflow/processDefinition');
INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, '');
+8 -2
View File
@@ -445,6 +445,7 @@ CREATE TABLE sj_job
( (
id bigserial PRIMARY KEY, id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
biz_id varchar(64) NOT NULL,
group_name varchar(64) NOT NULL, group_name varchar(64) NOT NULL,
job_name varchar(64) NOT NULL, job_name varchar(64) NOT NULL,
args_str text NULL DEFAULT NULL, args_str text NULL DEFAULT NULL,
@@ -477,9 +478,11 @@ CREATE TABLE sj_job
CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name); CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name);
CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index); CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index);
CREATE INDEX idx_sj_job_03 ON sj_job (create_dt); CREATE INDEX idx_sj_job_03 ON sj_job (create_dt);
CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id);
COMMENT ON COLUMN sj_job.id IS '主键'; COMMENT ON COLUMN sj_job.id IS '主键';
COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id'; COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_job.biz_id IS '业务ID';
COMMENT ON COLUMN sj_job.group_name IS '组名称'; COMMENT ON COLUMN sj_job.group_name IS '组名称';
COMMENT ON COLUMN sj_job.job_name IS '名称'; COMMENT ON COLUMN sj_job.job_name IS '名称';
COMMENT ON COLUMN sj_job.args_str IS '执行方法参数'; COMMENT ON COLUMN sj_job.args_str IS '执行方法参数';
@@ -509,7 +512,7 @@ COMMENT ON COLUMN sj_job.create_dt IS '创建时间';
COMMENT ON COLUMN sj_job.update_dt IS '修改时间'; COMMENT ON COLUMN sj_job.update_dt IS '修改时间';
COMMENT ON TABLE sj_job IS '任务信息'; COMMENT ON TABLE sj_job IS '任务信息';
INSERT INTO sj_job VALUES (1, 'dev', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '', '', '', 0, now(), now()); INSERT INTO sj_job VALUES (1, 'dev', 'demo-job', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '', '', '', 0, now(), now());
-- sj_job_log_message -- sj_job_log_message
CREATE TABLE sj_job_log_message CREATE TABLE sj_job_log_message
@@ -684,7 +687,7 @@ CREATE TABLE sj_retry_summary
id bigserial PRIMARY KEY, id bigserial PRIMARY KEY,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
group_name varchar(64) NOT NULL DEFAULT '', group_name varchar(64) NOT NULL DEFAULT '',
scene_name varchar(64) NOT NULL DEFAULT '', scene_name varchar(50) NOT NULL DEFAULT '',
trigger_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, trigger_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
running_num int NOT NULL DEFAULT 0, running_num int NOT NULL DEFAULT 0,
finish_num int NOT NULL DEFAULT 0, finish_num int NOT NULL DEFAULT 0,
@@ -717,6 +720,7 @@ CREATE TABLE sj_workflow
id bigserial PRIMARY KEY, id bigserial PRIMARY KEY,
workflow_name varchar(64) NOT NULL, workflow_name varchar(64) NOT NULL,
namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
biz_id varchar(64) NOT NULL,
group_name varchar(64) NOT NULL, group_name varchar(64) NOT NULL,
workflow_status smallint NOT NULL DEFAULT 1, workflow_status smallint NOT NULL DEFAULT 1,
trigger_type smallint NOT NULL, trigger_type smallint NOT NULL,
@@ -739,10 +743,12 @@ CREATE TABLE sj_workflow
CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt); CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt);
CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name); CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name);
CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id);
COMMENT ON COLUMN sj_workflow.id IS '主键'; COMMENT ON COLUMN sj_workflow.id IS '主键';
COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称'; COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称';
COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id'; COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id';
COMMENT ON COLUMN sj_workflow.biz_id IS '业务ID';
COMMENT ON COLUMN sj_workflow.group_name IS '组名称'; COMMENT ON COLUMN sj_workflow.group_name IS '组名称';
COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启'; COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启';
COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间'; COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
+2 -1
View File
@@ -456,7 +456,8 @@ INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInst
INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', 'workflow:instance:currentList', 'guide', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', 'workflow:instance:currentList', 'guide', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'processMonitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'processMonitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', 'workflow:task:list', 'waiting', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11660', '待办任务修改', '11631', '1', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:task:edit', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, '/workflow/processDefinition'); INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, '/workflow/processDefinition');
INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, '');
+7 -3
View File
@@ -280,6 +280,7 @@ CREATE TABLE `sj_job`
( (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`biz_id` varchar(64) NOT NULL COMMENT '业务ID',
`group_name` varchar(64) NOT NULL COMMENT '组名称', `group_name` varchar(64) NOT NULL COMMENT '组名称',
`job_name` varchar(64) NOT NULL COMMENT '名称', `job_name` varchar(64) NOT NULL COMMENT '名称',
`args_str` text DEFAULT NULL COMMENT '执行方法参数', `args_str` text DEFAULT NULL COMMENT '执行方法参数',
@@ -310,12 +311,13 @@ CREATE TABLE `sj_job`
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`), KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`),
KEY `idx_job_status_bucket_index` (`job_status`, `bucket_index`), KEY `idx_job_status_bucket_index` (`job_status`, `bucket_index`),
KEY `idx_create_dt` (`create_dt`) KEY `idx_create_dt` (`create_dt`),
UNIQUE KEY `uk_sj_job_01` (`namespace_id`, `biz_id`)
) ENGINE = InnoDB ) ENGINE = InnoDB
AUTO_INCREMENT = 0 AUTO_INCREMENT = 0
DEFAULT CHARSET = utf8mb4 COMMENT ='任务信息'; DEFAULT CHARSET = utf8mb4 COMMENT ='任务信息';
INSERT INTO `sj_job` VALUES (1, 'dev', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0 , now(), now()); INSERT INTO `sj_job` VALUES (1, 'dev', 'demo-job', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0 , now(), now());
CREATE TABLE `sj_job_log_message` CREATE TABLE `sj_job_log_message`
( (
@@ -443,6 +445,7 @@ CREATE TABLE `sj_workflow`
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`workflow_name` varchar(64) NOT NULL COMMENT '工作流名称', `workflow_name` varchar(64) NOT NULL COMMENT '工作流名称',
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
`biz_id` varchar(64) NOT NULL COMMENT '业务ID',
`group_name` varchar(64) NOT NULL COMMENT '组名称', `group_name` varchar(64) NOT NULL COMMENT '组名称',
`workflow_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '工作流状态 0、关闭、1、开启', `workflow_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '工作流状态 0、关闭、1、开启',
`trigger_type` tinyint(4) NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间', `trigger_type` tinyint(4) NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
@@ -463,7 +466,8 @@ CREATE TABLE `sj_workflow`
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `idx_create_dt` (`create_dt`), KEY `idx_create_dt` (`create_dt`),
KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`) KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`),
UNIQUE KEY `uk_sj_workflow_01` (`namespace_id`, `biz_id`)
) ENGINE = InnoDB ) ENGINE = InnoDB
AUTO_INCREMENT = 0 AUTO_INCREMENT = 0
DEFAULT CHARSET = utf8mb4 COMMENT ='工作流'; DEFAULT CHARSET = utf8mb4 COMMENT ='工作流';
+2 -1
View File
@@ -269,7 +269,8 @@ insert into sys_menu values ('11622', '流程分类', '11616', '1', 'category',
INSERT INTO sys_menu VALUES ('11801', '流程表达式', '11616', '2', 'spel', 'workflow/spel/index', '', 1, 0, 'C', '0', '0', 'workflow:spel:list', 'input', 103, 1, sysdate(), 1, sysdate(), '流程达式定义菜单'); INSERT INTO sys_menu VALUES ('11801', '流程表达式', '11616', '2', 'spel', 'workflow/spel/index', '', 1, 0, 'C', '0', '0', 'workflow:spel:list', 'input', 103, 1, sysdate(), 1, sysdate(), '流程达式定义菜单');
insert into sys_menu values ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', 'workflow:instance:currentList', 'guide', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', 'workflow:instance:currentList', 'guide', 103, 1, sysdate(), NULL, NULL, '');
insert into sys_menu values ('11630', '流程监控', '11616', '4', 'processMonitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values ('11630', '流程监控', '11616', '4', 'processMonitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), NULL, NULL, '');
insert into sys_menu values ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', 'workflow:task:list', 'waiting', 103, 1, sysdate(), NULL, NULL, '');
insert into sys_menu values ('11660', '待办任务修改', '11631', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:task:edit', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, '/workflow/processDefinition'); insert into sys_menu values ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, '/workflow/processDefinition');
insert into sys_menu values ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, '');
-- 流程分类管理相关按钮 -- 流程分类管理相关按钮
+22 -2
View File
@@ -1428,6 +1428,7 @@ CREATE TABLE sj_job
( (
id bigint NOT NULL PRIMARY KEY IDENTITY, id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
biz_id nvarchar(64) NOT NULL,
group_name nvarchar(64) NOT NULL, group_name nvarchar(64) NOT NULL,
job_name nvarchar(64) NOT NULL, job_name nvarchar(64) NOT NULL,
args_str nvarchar(max) NULL DEFAULT NULL, args_str nvarchar(max) NULL DEFAULT NULL,
@@ -1464,6 +1465,8 @@ CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index)
GO GO
CREATE INDEX idx_sj_job_03 ON sj_job (create_dt) CREATE INDEX idx_sj_job_03 ON sj_job (create_dt)
GO GO
CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id)
GO
EXEC sp_addextendedproperty EXEC sp_addextendedproperty
'MS_Description', N'主键', 'MS_Description', N'主键',
@@ -1479,6 +1482,13 @@ EXEC sp_addextendedproperty
'COLUMN', N'namespace_id' 'COLUMN', N'namespace_id'
GO GO
EXEC sp_addextendedproperty
'MS_Description', N'业务ID',
'SCHEMA', N'dbo',
'TABLE', N'sj_job',
'COLUMN', N'biz_id'
GO
EXEC sp_addextendedproperty EXEC sp_addextendedproperty
'MS_Description', N'组名称', 'MS_Description', N'组名称',
'SCHEMA', N'dbo', 'SCHEMA', N'dbo',
@@ -1674,7 +1684,7 @@ EXEC sp_addextendedproperty
'TABLE', N'sj_job' 'TABLE', N'sj_job'
GO GO
INSERT INTO sj_job (namespace_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES (N'dev', N'ruoyi_group', N'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, N'testJobExecutor', 2, N'60', 1, 60, 3, 1, 1, 116, 0, N'', 1, N'', N'', N'', 0, getdate(), getdate()) INSERT INTO sj_job (namespace_id, biz_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES (N'dev', N'demo-job', N'ruoyi_group', N'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, N'testJobExecutor', 2, N'60', 1, 60, 3, 1, 1, 116, 0, N'', 1, N'', N'', N'', 0, getdate(), getdate())
GO GO
-- sj_job_log_message -- sj_job_log_message
@@ -2248,7 +2258,7 @@ CREATE TABLE sj_retry_summary
id bigint NOT NULL PRIMARY KEY IDENTITY, id bigint NOT NULL PRIMARY KEY IDENTITY,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
group_name nvarchar(64) NOT NULL DEFAULT '', group_name nvarchar(64) NOT NULL DEFAULT '',
scene_name nvarchar(64) NOT NULL DEFAULT '', scene_name nvarchar(50) NOT NULL DEFAULT '',
trigger_at datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP, trigger_at datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
running_num int NOT NULL DEFAULT 0, running_num int NOT NULL DEFAULT 0,
finish_num int NOT NULL DEFAULT 0, finish_num int NOT NULL DEFAULT 0,
@@ -2354,6 +2364,7 @@ CREATE TABLE sj_workflow
id bigint NOT NULL PRIMARY KEY IDENTITY, id bigint NOT NULL PRIMARY KEY IDENTITY,
workflow_name nvarchar(64) NOT NULL, workflow_name nvarchar(64) NOT NULL,
namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
biz_id nvarchar(64) NOT NULL,
group_name nvarchar(64) NOT NULL, group_name nvarchar(64) NOT NULL,
workflow_status tinyint NOT NULL DEFAULT 1, workflow_status tinyint NOT NULL DEFAULT 1,
trigger_type tinyint NOT NULL, trigger_type tinyint NOT NULL,
@@ -2379,6 +2390,8 @@ CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt)
GO GO
CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name) CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name)
GO GO
CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id)
GO
EXEC sp_addextendedproperty EXEC sp_addextendedproperty
'MS_Description', N'主键', 'MS_Description', N'主键',
@@ -2401,6 +2414,13 @@ EXEC sp_addextendedproperty
'COLUMN', N'namespace_id' 'COLUMN', N'namespace_id'
GO GO
EXEC sp_addextendedproperty
'MS_Description', N'业务ID',
'SCHEMA', N'dbo',
'TABLE', N'sj_workflow',
'COLUMN', N'biz_id'
GO
EXEC sp_addextendedproperty EXEC sp_addextendedproperty
'MS_Description', N'组名称', 'MS_Description', N'组名称',
'SCHEMA', N'dbo', 'SCHEMA', N'dbo',
@@ -1581,7 +1581,9 @@ INSERT sys_menu VALUES (11629, N'我发起的', 11618, 1, N'myDocument', N'workf
GO GO
INSERT sys_menu VALUES (11630, N'流程监控', 11616, 4, N'processMonitor', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'monitor', 103, 1, GETDATE(), NULL, NULL, N''); INSERT sys_menu VALUES (11630, N'流程监控', 11616, 4, N'processMonitor', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'monitor', 103, 1, GETDATE(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (11631, N'待办任务', 11630, 2, N'allTaskWaiting', N'workflow/task/allTaskWaiting', N'', 1, 1, N'C', N'0', N'0', N'', N'waiting', 103, 1, GETDATE(), NULL, NULL, N''); INSERT sys_menu VALUES (11631, N'待办任务', 11630, 2, N'allTaskWaiting', N'workflow/task/allTaskWaiting', N'', 1, 1, N'C', N'0', N'0', N'workflow:task:list', N'waiting', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11660, N'待办任务修改', 11631, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:task:edit', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (11700, N'流程设计', 11616, 5, N'design/index', N'workflow/processDefinition/design', N'', 1, 1, N'C', N'1', N'0', N'workflow:leave:edit', N'#', 103, 1, GETDATE(), NULL, NULL, N'/workflow/processDefinition'); INSERT sys_menu VALUES (11700, N'流程设计', 11616, 5, N'design/index', N'workflow/processDefinition/design', N'', 1, 1, N'C', N'1', N'0', N'workflow:leave:edit', N'#', 103, 1, GETDATE(), NULL, NULL, N'/workflow/processDefinition');
GO GO
@@ -0,0 +1,24 @@
-- 修正已有菜单权限标识
update sys_menu set perms = 'workflow:definition:list' where menu_id = '11620';
update sys_menu set perms = 'workflow:instance:list' where menu_id = '11621';
update sys_menu set perms = 'workflow:instance:currentList' where menu_id = '11629';
-- 流程定义管理相关按钮
INSERT INTO sys_menu VALUES ('11644', '流程定义查询', '11620', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:query', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11645', '流程定义新增', '11620', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:add', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11646', '流程定义修改', '11620', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:edit', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11647', '流程定义删除', '11620', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:remove', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11648', '流程定义导出', '11620', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:export', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11649', '流程定义导入', '11620', '6', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:import', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11650', '流程定义发布/取消发布', '11620', '7', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:publish', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11651', '流程定义复制', '11620', '8', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:copy', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11652', '流程定义激活/挂起', '11620', '9', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:active', '#', 103, 1, SYSDATE, NULL, NULL, '');
-- 流程实例管理相关按钮
INSERT INTO sys_menu VALUES ('11653', '流程实例查询', '11621', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:query', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11654', '流程变量查询', '11621', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:variableQuery', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11655', '流程变量修改', '11621', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:variable', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11656', '流程实例激活/挂起', '11621', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:active', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11657', '流程实例删除', '11621', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:remove', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11658', '流程实例作废', '11621', '6', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:invalid', '#', 103, 1, SYSDATE, NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11659', '流程实例撤销', '11621', '7', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:cancel', '#', 103, 1, SYSDATE, NULL, NULL, '');
@@ -0,0 +1,24 @@
-- 修正已有菜单权限标识
update sys_menu set perms = 'workflow:definition:list' where menu_id = '11620';
update sys_menu set perms = 'workflow:instance:list' where menu_id = '11621';
update sys_menu set perms = 'workflow:instance:currentList' where menu_id = '11629';
-- 流程定义管理相关按钮
INSERT INTO sys_menu VALUES ('11644', '流程定义查询', '11620', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:query', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11645', '流程定义新增', '11620', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:add', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11646', '流程定义修改', '11620', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:edit', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11647', '流程定义删除', '11620', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:remove', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11648', '流程定义导出', '11620', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:export', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11649', '流程定义导入', '11620', '6', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:import', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11650', '流程定义发布/取消发布', '11620', '7', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:publish', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11651', '流程定义复制', '11620', '8', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:copy', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11652', '流程定义激活/挂起', '11620', '9', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:active', '#', 103, 1, now(), NULL, NULL, '');
-- 流程实例管理相关按钮
INSERT INTO sys_menu VALUES ('11653', '流程实例查询', '11621', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:query', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11654', '流程变量查询', '11621', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:variableQuery', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11655', '流程变量修改', '11621', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:variable', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11656', '流程实例激活/挂起', '11621', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:active', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11657', '流程实例删除', '11621', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:remove', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11658', '流程实例作废', '11621', '6', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:invalid', '#', 103, 1, now(), NULL, NULL, '');
INSERT INTO sys_menu VALUES ('11659', '流程实例撤销', '11621', '7', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:cancel', '#', 103, 1, now(), NULL, NULL, '');
@@ -0,0 +1,43 @@
-- 修正已有菜单权限标识
update sys_menu set perms = N'workflow:definition:list' where menu_id = 11620;
GO
update sys_menu set perms = N'workflow:instance:list' where menu_id = 11621;
GO
update sys_menu set perms = N'workflow:instance:currentList' where menu_id = 11629;
GO
-- 流程定义管理相关按钮
INSERT sys_menu VALUES (11644, N'流程定义查询', N'11620', 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:query', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11645, N'流程定义新增', N'11620', 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:add', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11646, N'流程定义修改', N'11620', 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:edit', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11647, N'流程定义删除', N'11620', 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:remove', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11648, N'流程定义导出', N'11620', 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:export', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11649, N'流程定义导入', N'11620', 6, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:import', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11650, N'流程定义发布/取消发布', N'11620', 7, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:publish', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11651, N'流程定义复制', N'11620', 8, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:copy', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11652, N'流程定义激活/挂起', N'11620', 9, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:definition:active', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
-- 流程实例管理相关按钮
INSERT sys_menu VALUES (11653, N'流程实例查询', N'11621', 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:instance:query', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11654, N'流程变量查询', N'11621', 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:instance:variableQuery', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11655, N'流程变量修改', N'11621', 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:instance:variable', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11656, N'流程实例激活/挂起', N'11621', 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:instance:active', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11657, N'流程实例删除', N'11621', 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:instance:remove', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11658, N'流程实例作废', N'11621', 6, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:instance:invalid', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
INSERT sys_menu VALUES (11659, N'流程实例撤销', N'11621', 7, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:instance:cancel', N'#', 103, 1, GETDATE(), NULL, NULL, N'');
GO
+24
View File
@@ -0,0 +1,24 @@
-- 修正已有菜单权限标识
update sys_menu set perms = 'workflow:definition:list' where menu_id = '11620';
update sys_menu set perms = 'workflow:instance:list' where menu_id = '11621';
update sys_menu set perms = 'workflow:instance:currentList' where menu_id = '11629';
-- 流程定义管理相关按钮
INSERT INTO sys_menu VALUES ('11644', '流程定义查询', '11620', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:query', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11645', '流程定义新增', '11620', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:add', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11646', '流程定义修改', '11620', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:edit', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11647', '流程定义删除', '11620', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:remove', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11648', '流程定义导出', '11620', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:export', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11649', '流程定义导入', '11620', '6', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:import', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11650', '流程定义发布/取消发布', '11620', '7', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:publish', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11651', '流程定义复制', '11620', '8', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:copy', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11652', '流程定义激活/挂起', '11620', '9', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:active', '#', 103, 1, sysdate(), null, null, '');
-- 流程实例管理相关按钮
INSERT INTO sys_menu VALUES ('11653', '流程实例查询', '11621', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:query', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11654', '流程变量查询', '11621', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:variableQuery', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11655', '流程变量修改', '11621', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:variable', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11656', '流程实例激活/挂起', '11621', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:active', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11657', '流程实例删除', '11621', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:remove', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11658', '流程实例作废', '11621', '6', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:invalid', '#', 103, 1, sysdate(), null, null, '');
INSERT INTO sys_menu VALUES ('11659', '流程实例撤销', '11621', '7', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:instance:cancel', '#', 103, 1, sysdate(), null, null, '');