Commit b2f5900abcca4d599d6c9bb4477b648f8f22c502

Authored by YunaiV
2 parents d00a88a7 62dc600c

Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/visual

Showing 625 changed files with 43335 additions and 11051 deletions

Too many changes.

To preserve performance only 100 of 625 files are displayed.

.gitignore
... ... @@ -47,3 +47,5 @@ nbdist/
47 47 rebel.xml
48 48  
49 49 application-my.yaml
  50 +
  51 +/yudao-ui-app/unpackage/
... ...
README.md
... ... @@ -9,6 +9,12 @@
9 9  
10 10 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
11 11  
  12 +## 🐶 新手必读
  13 +
  14 +* 演示地址:<http://dashboard.yudao.iocoder.cn>
  15 +* 启动文档:<https://doc.iocoder.cn/quick-start/>
  16 +* 视频教程:<https://doc.iocoder.cn/video/>
  17 +
12 18 ## 🐯 平台简介
13 19  
14 20 **芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。
... ... @@ -17,7 +23,8 @@
17 23 >
18 24 > 😜 给项目点点 Star 吧,这对我们真的很重要!
19 25  
20   -* 前端采用 [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) ,正在支持 Vue 3 + ElementUI Plus 最新方案。
  26 +* 前端 Vue2 版本采用 [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
  27 +* 前端 Vue3 版本采用 [vue-element-plus-admin](https://gitee.com/kailong110120130/vue-element-plus-admin)
21 28 * 后端采用 Spring Boot、MySQL + MyBatis Plus、Redis + Redisson。
22 29 * 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、MariaDB、国产达梦 DM、TiDB 等
23 30 * 权限认证使用 Spring Security & Token & Redis,支持多终端、多种用户的认证系统。
... ... @@ -34,15 +41,6 @@
34 41 | `yudao-cloud` | Spring Cloud 微服务 | **[Gitee](https://gitee.com/zhijiantianya/yudao-cloud)** &nbsp;&nbsp;&nbsp; [Github](https://github.com/YunaiV/yudao-cloud) |
35 42 | `Spring-Boot-Labs` | Spring Boot & Cloud 入门 | **[Gitee](https://gitee.com/zhijiantianya/SpringBoot-Labs)** &nbsp;&nbsp;&nbsp; [Github](https://github.com/YunaiV/SpringBoot-Labs) |
36 43  
37   -## 🐶 在线体验
38   -
39   -演示地址:<http://dashboard.yudao.iocoder.cn>
40   -* 账号密码:admin/admin123
41   -
42   -文档地址:<http://www.iocoder.cn/categories/Yudao/>
43   -* [《如何搭建环境》](http://www.iocoder.cn/categories/Yudao/?yudao)
44   -
45   -视频教程:<https://doc.iocoder.cn/video/>
46 44  
47 45 ## 🐼 内置功能
48 46  
... ... @@ -102,17 +100,6 @@
102 100  
103 101 ps:核心功能已经实现,正在对接微信小程序中...
104 102  
105   -### 商城系统
106   -
107   -正在开发中,大体计划如下:
108   -* 2022 Q2 => 完成对 <https://github.com/YunaiV/onemall> 的迁移,作为 onemall 的 Spring Boot 单体版本。
109   -* 2022 Q4 => 完成对 <https://github.com/YunaiV/onemall>> 的重构,作为 onemall 的 Spring Cloud 微服务版本。
110   -
111   -### 会员中心
112   -
113   -正在开发中,大体计划如下:
114   -* 2021 Q1 =》完成对 <https://github.com/YunaiV/onemall> 的迁移
115   -
116 103 ### 基础设施
117 104  
118 105 | | 功能 | 描述 |
... ... @@ -137,6 +124,20 @@ ps:核心功能已经实现,正在对接微信小程序中...
137 124 | 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 |
138 125 | 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 |
139 126  
  127 +### 商城系统
  128 +
  129 +建设中...
  130 +
  131 +![功能图](http://static.iocoder.cn/mall%20%E5%8A%9F%E8%83%BD%E5%9B%BE-min.png)
  132 +
  133 +![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-admin-min.gif)
  134 +
  135 +![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-h5-min.gif)
  136 +
  137 +### 会员中心
  138 +
  139 +和「商城系统」一起开发
  140 +
140 141 ## 🐨 技术栈
141 142  
142 143 | 项目 | 说明 |
... ... @@ -155,37 +156,50 @@ ps:核心功能已经实现,正在对接微信小程序中...
155 156  
156 157 ### 后端
157 158  
158   -| 框架 | 说明 | 版本 | 学习指南 |
159   -|---------------------------------------------------------------------------------------------|------------------|----------|----------------------------------------------------------------|
160   -| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.6.8 | [文档](https://github.com/YunaiV/SpringBoot-Labs) |
161   -| [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 | |
162   -| [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.8 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
163   -| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.2 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) |
164   -| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.5.0 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
165   -| [Redis](https://redis.io/) | key-value 数据库 | 5.0 | |
166   -| [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.17.3 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) |
167   -| [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.20 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) |
168   -| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.6.5 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) |
169   -| [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.3 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) |
170   -| [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.7.0 | [文档](https://doc.iocoder.cn/bpm/) |
171   -| [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) |
172   -| [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.3 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) |
173   -| [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) |
  159 +| 框架 | 说明 | 版本 | 学习指南 |
  160 +|---------------------------------------------------------------------------------------------|-----------------------|-----------|----------------------------------------------------------------|
  161 +| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.6.9 | [文档](https://github.com/YunaiV/SpringBoot-Labs) |
  162 +| [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 | |
  163 +| [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.11 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
  164 +| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.2 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) |
  165 +| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.5.0 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
  166 +| [Redis](https://redis.io/) | key-value 数据库 | 5.0 | |
  167 +| [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.17.4 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) |
  168 +| [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.20 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) |
  169 +| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.6.5 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) |
  170 +| [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.3 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) |
  171 +| [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.7.0 | [文档](https://doc.iocoder.cn/bpm/) |
  172 +| [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) |
  173 +| [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.3 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) |
  174 +| [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) |
174 175 | [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.5.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao) |
175   -| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.6.7 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) |
176   -| [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | |
177   -| [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.4.1 | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) |
178   -| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.16.14 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) |
179   -| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.8.2 | - |
180   -| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 4.0.0 | - |
  176 +| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.6.7 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) |
  177 +| [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | |
  178 +| [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.4.1 | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) |
  179 +| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.16.14 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) |
  180 +| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.8.2 | - |
  181 +| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 4.0.0 | - |
181 182  
182   -### 前端
  183 +### Vue2 前端
183 184  
184 185 | 框架 | 说明 | 版本 |
185 186 |------------------------------------------------------------------------------|---------------|--------|
186 187 | [Vue](https://cn.vuejs.org/index.html) | JavaScript 框架 | 2.6.12 |
187 188 | [Vue Element Admin](https://panjiachen.github.io/vue-element-admin-site/zh/) | 后台前端解决方案 | - |
188 189  
  190 +### Vue3 前端
  191 +
  192 +| 框架 | 说明 | 版本 |
  193 +|----------------------------------------------------------------------|------------------|--------|
  194 +| [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.2.37 |
  195 +| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 3.0.3 |
  196 +| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.9 |
  197 +| [TypeScript](https://www.typescriptlang.org/docs/) | TypeScript | 4.7.4 |
  198 +| [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.0.17 |
  199 +| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.1.10 |
  200 +| [windicss](https://cn.windicss.org/) | 下一代工具优先的 CSS 框架 | 3.5.6 |
  201 +| [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 2.2.1 |
  202 +
189 203 ## 🐷 演示图
190 204  
191 205 ### 系统功能
... ...
sql/mysql/ruoyi-vue-pro.sql
... ... @@ -431,7 +431,6 @@ CREATE TABLE `bpm_task_ext` (
431 431 `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
432 432 `assignee_user_id` bigint NULL DEFAULT NULL COMMENT '任务的审批人',
433 433 `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '任务的名字',
434   - `task_def_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '流程任务key',
435 434 `task_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务的编号',
436 435 `result` tinyint NOT NULL COMMENT '任务的结果',
437 436 `reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '审批建议',
... ...
sql/mysql/vue3-menu.sql 0 → 100644
  1 +-- ----------------------------
  2 +-- Table structure for system_menu
  3 +-- icon 不兼容
  4 +-- ----------------------------
  5 +DROP TABLE IF EXISTS `system_menu`;
  6 +CREATE TABLE `system_menu` (
  7 + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
  8 + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单名称',
  9 + `permission` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限标识',
  10 + `type` tinyint NOT NULL COMMENT '菜单类型',
  11 + `sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序',
  12 + `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父菜单ID',
  13 + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '路由地址',
  14 + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '#' COMMENT '菜单图标',
  15 + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '组件路径',
  16 + `status` tinyint NOT NULL DEFAULT 0 COMMENT '菜单状态',
  17 + `visible` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否可见',
  18 + `keep_alive` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否缓存',
  19 + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
  20 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  21 + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
  22 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  23 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  24 + PRIMARY KEY (`id`) USING BTREE
  25 +) ENGINE = InnoDB AUTO_INCREMENT = 1268 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
  26 +
  27 +-- ----------------------------
  28 +-- Records of system_menu
  29 +-- ----------------------------
  30 +INSERT INTO `system_menu` VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 13:10:54', b'0');
  31 +INSERT INTO `system_menu` VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'ep:brush-filled', NULL, 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 13:11:55', b'0');
  32 +INSERT INTO `system_menu` VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'ep:guide', NULL, 0, b'1', b'1', 'admin', '2021-09-20 16:26:19', '1', '2022-07-20 14:51:03', b'0');
  33 +INSERT INTO `system_menu` VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'ep:avatar', 'system/user/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 13:13:17', b'0');
  34 +INSERT INTO `system_menu` VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'ep:user-filled', 'system/role/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 13:13:41', b'0');
  35 +INSERT INTO `system_menu` VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'ep:grid', 'system/menu/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 13:13:54', b'0');
  36 +INSERT INTO `system_menu` VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'ep:office-building', 'system/dept/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:51:31', b'0');
  37 +INSERT INTO `system_menu` VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'ep:briefcase', 'system/post/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:41:47', b'0');
  38 +INSERT INTO `system_menu` VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'ep:list', 'system/dict/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:42:18', b'0');
  39 +INSERT INTO `system_menu` VALUES (106, '配置管理', '', 2, 6, 2, 'config', 'ep:edit', 'infra/config/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:48:29', b'0');
  40 +INSERT INTO `system_menu` VALUES (107, '通知公告', '', 2, 8, 1, 'notice', 'ep:bell-filled', 'system/notice/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:42:30', b'0');
  41 +INSERT INTO `system_menu` VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'ep:document-checked', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:42:52', b'0');
  42 +INSERT INTO `system_menu` VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'online', 'system/oauth2/token/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-11 23:31:42', b'0');
  43 +INSERT INTO `system_menu` VALUES (110, '定时任务', '', 2, 12, 2, 'job', 'ep:alarm-clock', 'infra/job/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:49:09', b'0');
  44 +INSERT INTO `system_menu` VALUES (111, 'MySQL 监控', '', 2, 9, 2, 'druid', 'ep:wind-power', 'infra/druid/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:50:06', b'0');
  45 +INSERT INTO `system_menu` VALUES (112, 'Java 监控', '', 2, 11, 2, 'admin-server', 'ep:opportunity', 'infra/server/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:49:42', b'0');
  46 +INSERT INTO `system_menu` VALUES (113, 'Redis 监控', '', 2, 10, 2, 'redis', 'ep:set-up', 'infra/redis/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:49:52', b'0');
  47 +INSERT INTO `system_menu` VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'ep:calendar', 'infra/build/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:47:29', b'0');
  48 +INSERT INTO `system_menu` VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'ep:connection', 'infra/codegen/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:46:41', b'0');
  49 +INSERT INTO `system_menu` VALUES (116, '系统接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'ep:operation', 'infra/swagger/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-07-20 14:47:41', b'0');
  50 +INSERT INTO `system_menu` VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'form', 'system/operatelog/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  51 +INSERT INTO `system_menu` VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'logininfor', 'system/loginlog/index', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  52 +INSERT INTO `system_menu` VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  53 +INSERT INTO `system_menu` VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  54 +INSERT INTO `system_menu` VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  55 +INSERT INTO `system_menu` VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  56 +INSERT INTO `system_menu` VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  57 +INSERT INTO `system_menu` VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  58 +INSERT INTO `system_menu` VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  59 +INSERT INTO `system_menu` VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  60 +INSERT INTO `system_menu` VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  61 +INSERT INTO `system_menu` VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  62 +INSERT INTO `system_menu` VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  63 +INSERT INTO `system_menu` VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  64 +INSERT INTO `system_menu` VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  65 +INSERT INTO `system_menu` VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  66 +INSERT INTO `system_menu` VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  67 +INSERT INTO `system_menu` VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  68 +INSERT INTO `system_menu` VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  69 +INSERT INTO `system_menu` VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  70 +INSERT INTO `system_menu` VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  71 +INSERT INTO `system_menu` VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  72 +INSERT INTO `system_menu` VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  73 +INSERT INTO `system_menu` VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  74 +INSERT INTO `system_menu` VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  75 +INSERT INTO `system_menu` VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  76 +INSERT INTO `system_menu` VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  77 +INSERT INTO `system_menu` VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  78 +INSERT INTO `system_menu` VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  79 +INSERT INTO `system_menu` VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  80 +INSERT INTO `system_menu` VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  81 +INSERT INTO `system_menu` VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  82 +INSERT INTO `system_menu` VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  83 +INSERT INTO `system_menu` VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  84 +INSERT INTO `system_menu` VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  85 +INSERT INTO `system_menu` VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  86 +INSERT INTO `system_menu` VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  87 +INSERT INTO `system_menu` VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  88 +INSERT INTO `system_menu` VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  89 +INSERT INTO `system_menu` VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  90 +INSERT INTO `system_menu` VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  91 +INSERT INTO `system_menu` VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  92 +INSERT INTO `system_menu` VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  93 +INSERT INTO `system_menu` VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  94 +INSERT INTO `system_menu` VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  95 +INSERT INTO `system_menu` VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', b'0');
  96 +INSERT INTO `system_menu` VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', b'0');
  97 +INSERT INTO `system_menu` VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  98 +INSERT INTO `system_menu` VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  99 +INSERT INTO `system_menu` VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  100 +INSERT INTO `system_menu` VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  101 +INSERT INTO `system_menu` VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
  102 +INSERT INTO `system_menu` VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  103 +INSERT INTO `system_menu` VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  104 +INSERT INTO `system_menu` VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  105 +INSERT INTO `system_menu` VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  106 +INSERT INTO `system_menu` VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', 0, b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
  107 +INSERT INTO `system_menu` VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', 0, b'1', b'1', '', '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', b'0');
  108 +INSERT INTO `system_menu` VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', 0, b'1', b'1', '', '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', b'0');
  109 +INSERT INTO `system_menu` VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', 0, b'1', b'1', '', '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', b'0');
  110 +INSERT INTO `system_menu` VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', 0, b'1', b'1', '', '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', b'0');
  111 +INSERT INTO `system_menu` VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', 0, b'1', b'1', '', '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', b'0');
  112 +INSERT INTO `system_menu` VALUES (1070, '代码生成示例', 'infra:test-demo:query', 2, 1, 2, 'test-demo', 'ep:baseball', 'infra/testDemo/index', 0, b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-07-20 14:46:53', b'0');
  113 +INSERT INTO `system_menu` VALUES (1071, '测试示例表创建', 'infra:test-demo:create', 3, 1, 1070, '', '', '', 0, b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0');
  114 +INSERT INTO `system_menu` VALUES (1072, '测试示例表更新', 'infra:test-demo:update', 3, 2, 1070, '', '', '', 0, b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0');
  115 +INSERT INTO `system_menu` VALUES (1073, '测试示例表删除', 'infra:test-demo:delete', 3, 3, 1070, '', '', '', 0, b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0');
  116 +INSERT INTO `system_menu` VALUES (1074, '测试示例表导出', 'infra:test-demo:export', 3, 4, 1070, '', '', '', 0, b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0');
  117 +INSERT INTO `system_menu` VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', 0, b'1', b'1', '', '2021-02-07 13:03:10', '', '2022-04-20 17:03:10', b'0');
  118 +INSERT INTO `system_menu` VALUES (1076, '数据库文档', '', 2, 4, 2, 'db-doc', 'ep:grid', 'infra/dbDoc/index', 0, b'1', b'1', '', '2021-02-08 01:41:47', '1', '2022-07-20 14:47:56', b'0');
  119 +INSERT INTO `system_menu` VALUES (1077, '监控平台', '', 2, 13, 2, 'skywalking', 'ep:aim', 'infra/skywalking/index', 0, b'1', b'1', '', '2021-02-08 20:41:31', '1', '2022-07-20 14:49:15', b'0');
  120 +INSERT INTO `system_menu` VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'log', 'infra/apiAccessLog/index', 0, b'1', b'1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', b'0');
  121 +INSERT INTO `system_menu` VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', 0, b'1', b'1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', b'0');
  122 +INSERT INTO `system_menu` VALUES (1083, 'API 日志', '', 2, 8, 2, 'log', 'ep:bell', NULL, 0, b'1', b'1', '', '2021-02-26 02:18:24', '1', '2022-07-20 14:48:36', b'0');
  123 +INSERT INTO `system_menu` VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'log', 'infra/apiErrorLog/index', 0, b'1', b'1', '', '2021-02-26 07:53:20', '', '2022-04-20 17:03:10', b'0');
  124 +INSERT INTO `system_menu` VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', 0, b'1', b'1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', b'0');
  125 +INSERT INTO `system_menu` VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', 0, b'1', b'1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', b'0');
  126 +INSERT INTO `system_menu` VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', 0, b'1', b'1', '1', '2021-03-10 01:26:19', '1', '2022-04-20 17:03:10', b'0');
  127 +INSERT INTO `system_menu` VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', 0, b'1', b'1', '1', '2021-03-10 01:28:04', '1', '2022-04-20 17:03:10', b'0');
  128 +INSERT INTO `system_menu` VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', 0, b'1', b'1', '1', '2021-03-10 01:29:09', '1', '2022-04-20 17:03:10', b'0');
  129 +INSERT INTO `system_menu` VALUES (1090, '文件列表', '', 2, 5, 1243, 'file-list', 'upload', 'infra/fileList/index', 0, b'1', b'1', '', '2021-03-12 20:16:20', '1', '2022-07-20 12:10:47', b'0');
  130 +INSERT INTO `system_menu` VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', 0, b'1', b'1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', b'0');
  131 +INSERT INTO `system_menu` VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', 0, b'1', b'1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', b'0');
  132 +INSERT INTO `system_menu` VALUES (1093, '短信管理', '', 1, 11, 1, 'sms', 'ep:chat-dot-square', NULL, 0, b'1', b'1', '1', '2021-04-05 01:10:16', '1', '2022-07-20 14:43:32', b'0');
  133 +INSERT INTO `system_menu` VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'phone', 'system/sms/smsChannel', 0, b'1', b'1', '', '2021-04-01 11:07:15', '1', '2022-04-20 17:03:10', b'0');
  134 +INSERT INTO `system_menu` VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', 0, b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0');
  135 +INSERT INTO `system_menu` VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', 0, b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0');
  136 +INSERT INTO `system_menu` VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', 0, b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0');
  137 +INSERT INTO `system_menu` VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', 0, b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0');
  138 +INSERT INTO `system_menu` VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'phone', 'system/sms/smsTemplate', 0, b'1', b'1', '', '2021-04-01 17:35:17', '1', '2022-04-20 17:03:10', b'0');
  139 +INSERT INTO `system_menu` VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', 0, b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0');
  140 +INSERT INTO `system_menu` VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', 0, b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0');
  141 +INSERT INTO `system_menu` VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', 0, b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0');
  142 +INSERT INTO `system_menu` VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', 0, b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0');
  143 +INSERT INTO `system_menu` VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', 0, b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0');
  144 +INSERT INTO `system_menu` VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', 0, b'1', b'1', '1', '2021-04-11 00:26:40', '1', '2022-04-20 17:03:10', b'0');
  145 +INSERT INTO `system_menu` VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'phone', 'system/sms/smsLog', 0, b'1', b'1', '', '2021-04-11 08:37:05', '1', '2022-04-20 17:03:10', b'0');
  146 +INSERT INTO `system_menu` VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', 0, b'1', b'1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', b'0');
  147 +INSERT INTO `system_menu` VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', 0, b'1', b'1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', b'0');
  148 +INSERT INTO `system_menu` VALUES (1110, '错误码管理', '', 2, 12, 1, 'error-code', 'ep:document-delete', 'system/errorCode/index', 0, b'1', b'1', '', '2021-04-13 21:46:42', '1', '2022-07-20 14:43:42', b'0');
  149 +INSERT INTO `system_menu` VALUES (1111, '错误码查询', 'system:error-code:query', 3, 1, 1110, '', '', '', 0, b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0');
  150 +INSERT INTO `system_menu` VALUES (1112, '错误码创建', 'system:error-code:create', 3, 2, 1110, '', '', '', 0, b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0');
  151 +INSERT INTO `system_menu` VALUES (1113, '错误码更新', 'system:error-code:update', 3, 3, 1110, '', '', '', 0, b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0');
  152 +INSERT INTO `system_menu` VALUES (1114, '错误码删除', 'system:error-code:delete', 3, 4, 1110, '', '', '', 0, b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0');
  153 +INSERT INTO `system_menu` VALUES (1115, '错误码导出', 'system:error-code:export', 3, 5, 1110, '', '', '', 0, b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0');
  154 +INSERT INTO `system_menu` VALUES (1117, '支付管理', '', 1, 11, 0, '/pay', 'ep:goods-filled', NULL, 0, b'1', b'1', '1', '2021-12-25 16:43:41', '1', '2022-07-20 13:11:45', b'0');
  155 +INSERT INTO `system_menu` VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'user', 'bpm/oa/leave/index', 0, b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0');
  156 +INSERT INTO `system_menu` VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', 0, b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0');
  157 +INSERT INTO `system_menu` VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', 0, b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0');
  158 +INSERT INTO `system_menu` VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'ep:cellphone', 'pay/app/index', 0, b'1', b'1', '', '2021-11-10 01:13:30', '1', '2022-07-20 14:44:17', b'0');
  159 +INSERT INTO `system_menu` VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');
  160 +INSERT INTO `system_menu` VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');
  161 +INSERT INTO `system_menu` VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');
  162 +INSERT INTO `system_menu` VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');
  163 +INSERT INTO `system_menu` VALUES (1131, '支付应用信息导出', 'pay:app:export', 3, 5, 1126, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');
  164 +INSERT INTO `system_menu` VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', 0, b'1', b'1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', b'0');
  165 +INSERT INTO `system_menu` VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0');
  166 +INSERT INTO `system_menu` VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0');
  167 +INSERT INTO `system_menu` VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0');
  168 +INSERT INTO `system_menu` VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0');
  169 +INSERT INTO `system_menu` VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', 0, b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0');
  170 +INSERT INTO `system_menu` VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'peoples', 'system/tenant/index', 0, b'1', b'1', '', '2021-12-14 12:31:43', '1', '2022-04-20 17:03:10', b'0');
  171 +INSERT INTO `system_menu` VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', 0, b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0');
  172 +INSERT INTO `system_menu` VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', 0, b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0');
  173 +INSERT INTO `system_menu` VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', 0, b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0');
  174 +INSERT INTO `system_menu` VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', 0, b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0');
  175 +INSERT INTO `system_menu` VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', 0, b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0');
  176 +INSERT INTO `system_menu` VALUES (1150, '秘钥解析', '', 3, 6, 1129, '', '', '', 0, b'1', b'1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', b'0');
  177 +INSERT INTO `system_menu` VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'ep:message-box', 'pay/refund/index', 0, b'1', b'1', '', '2021-12-25 08:29:07', '1', '2022-07-20 14:45:23', b'0');
  178 +INSERT INTO `system_menu` VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0');
  179 +INSERT INTO `system_menu` VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0');
  180 +INSERT INTO `system_menu` VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0');
  181 +INSERT INTO `system_menu` VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0');
  182 +INSERT INTO `system_menu` VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0');
  183 +INSERT INTO `system_menu` VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'ep:histogram', 'pay/order/index', 0, b'1', b'1', '', '2021-12-25 08:49:43', '1', '2022-07-20 14:44:36', b'0');
  184 +INSERT INTO `system_menu` VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0');
  185 +INSERT INTO `system_menu` VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0');
  186 +INSERT INTO `system_menu` VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0');
  187 +INSERT INTO `system_menu` VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0');
  188 +INSERT INTO `system_menu` VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', 0, b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0');
  189 +INSERT INTO `system_menu` VALUES (1179, '商户信息', '', 2, 0, 1117, 'merchant', 'ep:goods', 'pay/merchant/index', 0, b'1', b'1', '', '2021-12-25 09:01:44', '1', '2022-07-20 14:44:58', b'0');
  190 +INSERT INTO `system_menu` VALUES (1180, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1179, '', '', '', 0, b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');
  191 +INSERT INTO `system_menu` VALUES (1181, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1179, '', '', '', 0, b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');
  192 +INSERT INTO `system_menu` VALUES (1182, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1179, '', '', '', 0, b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');
  193 +INSERT INTO `system_menu` VALUES (1183, '支付商户信息删除', '', 3, 4, 1179, '', '', '', 0, b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');
  194 +INSERT INTO `system_menu` VALUES (1184, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1179, '', '', '', 0, b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');
  195 +INSERT INTO `system_menu` VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'ep:checked', NULL, 0, b'1', b'1', '1', '2021-12-30 20:26:36', '1', '2022-07-20 13:12:35', b'0');
  196 +INSERT INTO `system_menu` VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'ep:collection-tag', NULL, 0, b'1', b'1', '1', '2021-12-30 20:28:30', '1', '2022-07-20 14:50:31', b'0');
  197 +INSERT INTO `system_menu` VALUES (1187, '流程表单', '', 2, 0, 1186, 'form', 'form', 'bpm/form/index', 0, b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
  198 +INSERT INTO `system_menu` VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', 0, b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
  199 +INSERT INTO `system_menu` VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', 0, b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
  200 +INSERT INTO `system_menu` VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', 0, b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
  201 +INSERT INTO `system_menu` VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', 0, b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
  202 +INSERT INTO `system_menu` VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', 0, b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
  203 +INSERT INTO `system_menu` VALUES (1193, '流程模型', '', 2, 5, 1186, 'model', 'guide', 'bpm/model/index', 0, b'1', b'1', '1', '2021-12-31 23:24:58', '103', '2022-04-20 17:03:10', b'0');
  204 +INSERT INTO `system_menu` VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', b'0');
  205 +INSERT INTO `system_menu` VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', b'0');
  206 +INSERT INTO `system_menu` VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-03 19:01:35', '1', '2022-04-20 17:03:10', b'0');
  207 +INSERT INTO `system_menu` VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', b'0');
  208 +INSERT INTO `system_menu` VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', b'0');
  209 +INSERT INTO `system_menu` VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', b'0');
  210 +INSERT INTO `system_menu` VALUES (1200, '任务管理', '', 1, 20, 1185, 'task', 'ep:calendar', NULL, 0, b'1', b'1', '1', '2022-01-07 23:51:48', '1', '2022-07-20 14:50:40', b'0');
  211 +INSERT INTO `system_menu` VALUES (1201, '我的流程', '', 2, 0, 1200, 'my', 'people', 'bpm/processInstance/index', 0, b'1', b'1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', b'0');
  212 +INSERT INTO `system_menu` VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', 0, b'1', b'1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', b'0');
  213 +INSERT INTO `system_menu` VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'eye-open', 'bpm/task/todo', 0, b'1', b'1', '1', '2022-01-08 10:33:37', '1', '2022-04-20 17:03:10', b'0');
  214 +INSERT INTO `system_menu` VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'eye', 'bpm/task/done', 0, b'1', b'1', '1', '2022-01-08 10:34:13', '1', '2022-04-20 17:03:10', b'0');
  215 +INSERT INTO `system_menu` VALUES (1209, '用户分组', '', 2, 2, 1186, 'user-group', 'people', 'bpm/group/index', 0, b'1', b'1', '', '2022-01-14 02:14:20', '103', '2022-04-20 17:03:10', b'0');
  216 +INSERT INTO `system_menu` VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', 0, b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0');
  217 +INSERT INTO `system_menu` VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', 0, b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0');
  218 +INSERT INTO `system_menu` VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', 0, b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0');
  219 +INSERT INTO `system_menu` VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', 0, b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0');
  220 +INSERT INTO `system_menu` VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', b'0');
  221 +INSERT INTO `system_menu` VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', b'0');
  222 +INSERT INTO `system_menu` VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', b'0');
  223 +INSERT INTO `system_menu` VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', 0, b'1', b'1', '1', '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', b'0');
  224 +INSERT INTO `system_menu` VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', 0, b'1', b'1', '1', '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', b'0');
  225 +INSERT INTO `system_menu` VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', 0, b'1', b'1', '1', '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', b'0');
  226 +INSERT INTO `system_menu` VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', 0, b'1', b'1', '1', '2022-01-23 00:38:52', '1', '2022-04-20 17:03:10', b'0');
  227 +INSERT INTO `system_menu` VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', 0, b'1', b'1', '1', '2022-01-23 00:39:24', '1', '2022-04-20 17:03:10', b'0');
  228 +INSERT INTO `system_menu` VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'ep:cherry', NULL, 0, b'1', b'1', '1', '2022-02-20 01:41:13', '1', '2022-07-20 14:51:46', b'0');
  229 +INSERT INTO `system_menu` VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'eye', 'system/tenantPackage/index', 0, b'1', b'1', '', '2022-02-19 17:44:06', '1', '2022-04-21 01:21:25', b'0');
  230 +INSERT INTO `system_menu` VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', 0, b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0');
  231 +INSERT INTO `system_menu` VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', 0, b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0');
  232 +INSERT INTO `system_menu` VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', 0, b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0');
  233 +INSERT INTO `system_menu` VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', 0, b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0');
  234 +INSERT INTO `system_menu` VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'config', 'infra/fileConfig/index', 0, b'1', b'1', '', '2022-03-15 14:35:28', '1', '2022-04-20 17:03:10', b'0');
  235 +INSERT INTO `system_menu` VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', 0, b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
  236 +INSERT INTO `system_menu` VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', 0, b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
  237 +INSERT INTO `system_menu` VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', 0, b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
  238 +INSERT INTO `system_menu` VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', 0, b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
  239 +INSERT INTO `system_menu` VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', 0, b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
  240 +INSERT INTO `system_menu` VALUES (1243, '文件管理', '', 2, 5, 2, 'file', 'ep:folder-opened', NULL, 0, b'1', b'1', '1', '2022-03-16 23:47:40', '1', '2022-07-20 14:48:19', b'0');
  241 +INSERT INTO `system_menu` VALUES (1247, '敏感词管理', '', 2, 13, 1, 'sensitive-word', 'ep:document-copy', 'system/sensitiveWord/index', 0, b'1', b'1', '', '2022-04-07 16:55:03', '1', '2022-07-20 14:43:53', b'0');
  242 +INSERT INTO `system_menu` VALUES (1248, '敏感词查询', 'system:sensitive-word:query', 3, 1, 1247, '', '', '', 0, b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0');
  243 +INSERT INTO `system_menu` VALUES (1249, '敏感词创建', 'system:sensitive-word:create', 3, 2, 1247, '', '', '', 0, b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0');
  244 +INSERT INTO `system_menu` VALUES (1250, '敏感词更新', 'system:sensitive-word:update', 3, 3, 1247, '', '', '', 0, b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0');
  245 +INSERT INTO `system_menu` VALUES (1251, '敏感词删除', 'system:sensitive-word:delete', 3, 4, 1247, '', '', '', 0, b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0');
  246 +INSERT INTO `system_menu` VALUES (1252, '敏感词导出', 'system:sensitive-word:export', 3, 5, 1247, '', '', '', 0, b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0');
  247 +INSERT INTO `system_menu` VALUES (1254, '作者动态', '', 1, 0, 0, 'https://www.iocoder.cn', 'ep:bell-filled', NULL, 0, b'1', b'1', '1', '2022-04-23 01:03:15', '1', '2022-07-20 13:12:43', b'0');
  248 +INSERT INTO `system_menu` VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'ep:coin', 'infra/dataSourceConfig/index', 0, b'1', b'1', '', '2022-04-27 14:37:32', '1', '2022-07-20 14:49:01', b'0');
  249 +INSERT INTO `system_menu` VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', 0, b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0');
  250 +INSERT INTO `system_menu` VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', 0, b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0');
  251 +INSERT INTO `system_menu` VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', 0, b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0');
  252 +INSERT INTO `system_menu` VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', 0, b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0');
  253 +INSERT INTO `system_menu` VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', 0, b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0');
  254 +INSERT INTO `system_menu` VALUES (1261, '授权管理', '', 1, 10, 1, 'oauth2', 'ep:connection', NULL, 0, b'1', b'1', '1', '2022-05-09 23:38:17', '1', '2022-07-20 14:43:23', b'0');
  255 +INSERT INTO `system_menu` VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'tool', 'system/oauth2/client/index', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 23:31:36', b'0');
  256 +INSERT INTO `system_menu` VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', b'0');
  257 +INSERT INTO `system_menu` VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', b'0');
  258 +INSERT INTO `system_menu` VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', b'0');
  259 +INSERT INTO `system_menu` VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0');
  260 +
  261 +SET FOREIGN_KEY_CHECKS = 1;
... ...
yudao-dependencies/pom.xml
... ... @@ -16,20 +16,19 @@
16 16 <properties>
17 17 <revision>1.6.2-snapshot</revision>
18 18 <!-- 统一依赖管理 -->
19   - <spring.boot.version>2.6.8</spring.boot.version>
  19 + <spring.boot.version>2.6.10</spring.boot.version>
20 20 <!-- Web 相关 -->
21 21 <knife4j.version>3.0.3</knife4j.version>
22 22 <swagger-annotations.version>1.6.6</swagger-annotations.version>
23 23 <servlet.versoin>2.5</servlet.versoin>
24 24 <!-- DB 相关 -->
25   - <druid.version>1.2.8</druid.version>
  25 + <druid.version>1.2.11</druid.version>
26 26 <mybatis-plus.version>3.5.2</mybatis-plus.version>
27 27 <mybatis-plus-generator.version>3.5.2</mybatis-plus-generator.version>
28 28 <dynamic-datasource.version>3.5.0</dynamic-datasource.version>
29   - <redisson.version>3.17.3</redisson.version>
  29 + <redisson.version>3.17.4</redisson.version>
30 30 <!-- Config 配置中心相关 -->
31 31 <apollo.version>1.9.2</apollo.version>
32   - <!-- Job 定时任务相关 -->
33 32 <!-- 服务保障相关 -->
34 33 <lock4j.version>2.2.0</lock4j.version>
35 34 <resilience4j.version>1.7.1</resilience4j.version>
... ... @@ -48,8 +47,8 @@
48 47 <jasypt-spring-boot-starter.version>3.0.4</jasypt-spring-boot-starter.version>
49 48 <lombok.version>1.18.20</lombok.version>
50 49 <mapstruct.version>1.4.1.Final</mapstruct.version>
51   - <hutool.version>5.6.1</hutool.version>
52   - <easyexcel.verion>2.2.7</easyexcel.verion>
  50 + <hutool.version>5.7.22</hutool.version>
  51 + <easyexcel.verion>3.1.1</easyexcel.verion>
53 52 <velocity.version>2.2</velocity.version>
54 53 <screw.version>1.0.5</screw.version>
55 54 <fastjson.version>2.0.5</fastjson.version>
... ... @@ -419,7 +418,7 @@
419 418 </dependency>
420 419 <dependency>
421 420 <groupId>org.flowable</groupId>
422   - <artifactId>flowable-spring-boot-starter-basic</artifactId>
  421 + <artifactId>flowable-spring-boot-starter-process</artifactId>
423 422 <version>${flowable.version}</version>
424 423 </dependency>
425 424 <dependency>
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/ArrayUtils.java
... ... @@ -2,14 +2,8 @@ package cn.iocoder.yudao.framework.common.util.collection;
2 2  
3 3 import cn.hutool.core.collection.CollectionUtil;
4 4 import cn.hutool.core.util.ArrayUtil;
5   -import cn.hutool.core.util.TypeUtil;
6   -import org.springframework.cglib.core.TypeUtils;
7 5  
8   -import java.lang.reflect.Array;
9   -import java.lang.reflect.ParameterizedType;
10   -import java.lang.reflect.Type;
11 6 import java.util.Collection;
12   -import java.util.List;
13 7 import java.util.function.Consumer;
14 8 import java.util.function.Function;
15 9  
... ... @@ -53,4 +47,11 @@ public class ArrayUtils {
53 47 return ArrayUtil.toArray(from, (Class<T>) CollectionUtil.getElementType(from.iterator()));
54 48 }
55 49  
  50 + public static <T> T get(T[] array, int index) {
  51 + if (null == array || index >= array.length) {
  52 + return null;
  53 + }
  54 + return array[index];
  55 + }
  56 +
56 57 }
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java
... ... @@ -51,6 +51,10 @@ public class JsonUtils {
51 51 return objectMapper.writeValueAsBytes(object);
52 52 }
53 53  
  54 + @SneakyThrows
  55 + public static String toJsonPrettyString(Object object) {
  56 + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
  57 + }
54 58  
55 59 public static <T> T parseObject(String text, Class<T> clazz) {
56 60 if (StrUtil.isEmpty(text)) {
... ... @@ -132,7 +136,7 @@ public class JsonUtils {
132 136 }
133 137  
134 138 public static boolean isJson(String text) {
135   - return JSONUtil.isJson(text);
  139 + return JSONUtil.isTypeJSON(text);
136 140 }
137 141  
138 142 }
... ...
yudao-framework/yudao-spring-boot-starter-biz-social/pom.xml
... ... @@ -38,6 +38,12 @@
38 38 <dependency>
39 39 <groupId>com.xkcoding.justauth</groupId>
40 40 <artifactId>justauth-spring-boot-starter</artifactId>
  41 + <exclusions>
  42 + <exclusion>
  43 + <groupId>cn.hutool</groupId>
  44 + <artifactId>hutool-core</artifactId>
  45 + </exclusion>
  46 + </exclusions>
41 47 </dependency>
42 48 <dependency>
43 49 <groupId>cn.iocoder.boot</groupId>
... ...
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/TenantProperties.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.tenant.config;
3 3 import lombok.Data;
4 4 import org.springframework.boot.context.properties.ConfigurationProperties;
5 5  
  6 +import java.util.Collections;
6 7 import java.util.Set;
7 8  
8 9 /**
... ... @@ -29,13 +30,13 @@ public class TenantProperties {
29 30 *
30 31 * 默认情况下,每个请求需要带上 tenant-id 的请求头。但是,部分请求是无需带上的,例如说短信回调、支付回调等 Open API!
31 32 */
32   - private Set<String> ignoreUrls;
  33 + private Set<String> ignoreUrls = Collections.emptySet();
33 34  
34 35 /**
35 36 * 需要忽略多租户的表
36 37 *
37 38 * 即默认所有表都开启多租户的功能,所以记得添加对应的 tenant_id 字段哟
38 39 */
39   - private Set<String> ignoreTables;
  40 + private Set<String> ignoreTables = Collections.emptySet();
40 41  
41 42 }
... ...
yudao-framework/yudao-spring-boot-starter-biz-weixin/pom.xml
... ... @@ -14,6 +14,7 @@
14 14 <name>${project.artifactId}</name>
15 15 <description>微信拓展
16 16 1. 基于 weixin-java-mp 库,对接微信公众号平台。目前主要解决微信公众号的支付场景。
  17 + 2. 基于 weixin-java-miniapp 库,对接微信小程序。目前主要解决微信小程序的一键登录场景。
17 18 </description>
18 19 <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
19 20  
... ...
yudao-framework/yudao-spring-boot-starter-config/src/main/java/cn/iocoder/yudao/framework/apollo/internals/DefaultXInjector.java
... ... @@ -8,7 +8,7 @@ import com.ctrip.framework.apollo.tracer.Tracer;
8 8 import com.ctrip.framework.apollo.util.ConfigUtil;
9 9 import com.ctrip.framework.apollo.util.factory.DefaultPropertiesFactory;
10 10 import com.ctrip.framework.apollo.util.factory.PropertiesFactory;
11   -import com.ctrip.framework.apollo.util.http.HttpUtil;
  11 +import com.ctrip.framework.apollo.util.http.DefaultHttpClient;
12 12 import com.ctrip.framework.apollo.util.yaml.YamlParser;
13 13 import com.google.inject.AbstractModule;
14 14 import com.google.inject.Guice;
... ... @@ -63,7 +63,7 @@ public class DefaultXInjector implements Injector {
63 63 bind(ConfigFactory.class).to(DBConfigFactory.class).in(Singleton.class);
64 64  
65 65 bind(ConfigUtil.class).in(Singleton.class);
66   - bind(HttpUtil.class).in(Singleton.class);
  66 + bind(DefaultHttpClient.class).in(Singleton.class);
67 67 bind(ConfigServiceLocator.class).in(Singleton.class);
68 68 bind(RemoteConfigLongPollService.class).in(Singleton.class);
69 69 bind(YamlParser.class).in(Singleton.class);
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/DictConvert.java
... ... @@ -5,8 +5,9 @@ import cn.iocoder.yudao.framework.dict.core.util.DictFrameworkUtils;
5 5 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
6 6 import com.alibaba.excel.converters.Converter;
7 7 import com.alibaba.excel.enums.CellDataTypeEnum;
8   -import com.alibaba.excel.metadata.CellData;
9 8 import com.alibaba.excel.metadata.GlobalConfiguration;
  9 +import com.alibaba.excel.metadata.data.ReadCellData;
  10 +import com.alibaba.excel.metadata.data.WriteCellData;
10 11 import com.alibaba.excel.metadata.property.ExcelContentProperty;
11 12 import lombok.extern.slf4j.Slf4j;
12 13  
... ... @@ -29,11 +30,11 @@ public class DictConvert implements Converter&lt;Object&gt; {
29 30 }
30 31  
31 32 @Override
32   - public Object convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
  33 + public Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty,
33 34 GlobalConfiguration globalConfiguration) {
34 35 // 使用字典解析
35 36 String type = getType(contentProperty);
36   - String label = cellData.getStringValue();
  37 + String label = readCellData.getStringValue();
37 38 String value = DictFrameworkUtils.parseDictDataValue(type, label);
38 39 if (value == null) {
39 40 log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label);
... ... @@ -45,11 +46,11 @@ public class DictConvert implements Converter&lt;Object&gt; {
45 46 }
46 47  
47 48 @Override
48   - public CellData<String> convertToExcelData(Object object, ExcelContentProperty contentProperty,
49   - GlobalConfiguration globalConfiguration) {
  49 + public WriteCellData<String> convertToExcelData(Object object, ExcelContentProperty contentProperty,
  50 + GlobalConfiguration globalConfiguration) {
50 51 // 空时,返回空
51 52 if (object == null) {
52   - return new CellData<>("");
  53 + return new WriteCellData<>("");
53 54 }
54 55  
55 56 // 使用字典格式化
... ... @@ -58,10 +59,10 @@ public class DictConvert implements Converter&lt;Object&gt; {
58 59 String label = DictFrameworkUtils.getDictDataLabel(type, value);
59 60 if (label == null) {
60 61 log.error("[convertToExcelData][type({}) 转换不了 label({})]", type, value);
61   - return new CellData<>("");
  62 + return new WriteCellData<>("");
62 63 }
63 64 // 生成 Excel 小表格
64   - return new CellData<>(label);
  65 + return new WriteCellData<>(label);
65 66 }
66 67  
67 68 private static String getType(ExcelContentProperty contentProperty) {
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/JsonConvert.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.framework.excel.core.convert;
3 3 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
4 4 import com.alibaba.excel.converters.Converter;
5 5 import com.alibaba.excel.enums.CellDataTypeEnum;
6   -import com.alibaba.excel.metadata.CellData;
7 6 import com.alibaba.excel.metadata.GlobalConfiguration;
  7 +import com.alibaba.excel.metadata.data.WriteCellData;
8 8 import com.alibaba.excel.metadata.property.ExcelContentProperty;
9 9  
10 10 /**
... ... @@ -25,15 +25,10 @@ public class JsonConvert implements Converter&lt;Object&gt; {
25 25 }
26 26  
27 27 @Override
28   - public Object convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
29   - throw new UnsupportedOperationException("暂不支持,也不需要");
30   - }
31   -
32   - @Override
33   - public CellData<String> convertToExcelData(Object value, ExcelContentProperty contentProperty,
34   - GlobalConfiguration globalConfiguration) {
  28 + public WriteCellData<String> convertToExcelData(Object value, ExcelContentProperty contentProperty,
  29 + GlobalConfiguration globalConfiguration) {
35 30 // 生成 Excel 小表格
36   - return new CellData<>(JsonUtils.toJsonString(value));
  31 + return new WriteCellData<>(JsonUtils.toJsonString(value));
37 32 }
38 33  
39 34 }
... ...
yudao-framework/yudao-spring-boot-starter-flowable/pom.xml
... ... @@ -26,7 +26,7 @@
26 26 <!-- flowable 工作流相关 -->
27 27 <dependency>
28 28 <groupId>org.flowable</groupId>
29   - <artifactId>flowable-spring-boot-starter-basic</artifactId>
  29 + <artifactId>flowable-spring-boot-starter-process</artifactId>
30 30 </dependency>
31 31 <dependency>
32 32 <groupId>org.flowable</groupId>
... ...
yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/aop/BizTraceAspect.java
... ... @@ -38,7 +38,7 @@ public class BizTraceAspect {
38 38 String operationName = getOperationName(joinPoint, trace);
39 39 Span span = tracer.buildSpan(operationName)
40 40 .withTag(Tags.COMPONENT.getKey(), "biz")
41   - .startManual();
  41 + .start();
42 42 try {
43 43 // 执行原有方法
44 44 return joinPoint.proceed();
... ...
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/query/LambdaQueryWrapperX.java
1 1 package cn.iocoder.yudao.framework.mybatis.core.query;
2 2  
  3 +import cn.hutool.core.util.ArrayUtil;
  4 +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
3 5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4   -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5   -import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
6 6 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
7 7 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
8 8 import org.springframework.util.StringUtils;
... ... @@ -33,7 +33,7 @@ public class LambdaQueryWrapperX&lt;T&gt; extends LambdaQueryWrapper&lt;T&gt; {
33 33 }
34 34  
35 35 public LambdaQueryWrapperX<T> inIfPresent(SFunction<T, ?> column, Object... values) {
36   - if (!ArrayUtils.isEmpty(values)) {
  36 + if (!ArrayUtil.isEmpty(values)) {
37 37 return (LambdaQueryWrapperX<T>) super.in(column, values);
38 38 }
39 39 return this;
... ... @@ -94,6 +94,12 @@ public class LambdaQueryWrapperX&lt;T&gt; extends LambdaQueryWrapper&lt;T&gt; {
94 94 return this;
95 95 }
96 96  
  97 + public LambdaQueryWrapperX<T> betweenIfPresent(SFunction<T, ?> column, Object[] values) {
  98 + Object val1 = ArrayUtils.get(values, 0);
  99 + Object val2 = ArrayUtils.get(values, 1);
  100 + return betweenIfPresent(column, val1, val2);
  101 + }
  102 +
97 103 // ========== 重写父类方法,方便链式调用 ==========
98 104  
99 105 @Override
... ...
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/query/QueryWrapperX.java
... ... @@ -94,6 +94,19 @@ public class QueryWrapperX&lt;T&gt; extends QueryWrapper&lt;T&gt; {
94 94 return this;
95 95 }
96 96  
  97 + public QueryWrapperX<T> betweenIfPresent(String column, Object[] values) {
  98 + if (values!= null && values.length != 0 && values[0] != null && values[1] != null) {
  99 + return (QueryWrapperX<T>) super.between(column, values[0], values[1]);
  100 + }
  101 + if (values!= null && values.length != 0 && values[0] != null) {
  102 + return (QueryWrapperX<T>) ge(column, values[0]);
  103 + }
  104 + if (values!= null && values.length != 0 && values[1] != null) {
  105 + return (QueryWrapperX<T>) le(column, values[1]);
  106 + }
  107 + return this;
  108 + }
  109 +
97 110 // ========== 重写父类方法,方便链式调用 ==========
98 111  
99 112 @Override
... ...
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java
... ... @@ -118,16 +118,16 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap
118 118 httpSecurity
119 119 // ①:全局共享规则
120 120 .authorizeRequests()
121   - // 静态资源,可匿名访问
  121 + // 1.1 静态资源,可匿名访问
122 122 .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll()
123   - // 设置 @PermitAll 无需认证
  123 + // 1.2 设置 @PermitAll 无需认证
124 124 .antMatchers(HttpMethod.GET, permitAllUrls.get(HttpMethod.GET).toArray(new String[0])).permitAll()
125 125 .antMatchers(HttpMethod.POST, permitAllUrls.get(HttpMethod.POST).toArray(new String[0])).permitAll()
126 126 .antMatchers(HttpMethod.PUT, permitAllUrls.get(HttpMethod.PUT).toArray(new String[0])).permitAll()
127 127 .antMatchers(HttpMethod.DELETE, permitAllUrls.get(HttpMethod.DELETE).toArray(new String[0])).permitAll()
128   - // 基于 yudao.security.permit-all-urls 无需认证
  128 + // 1.3 基于 yudao.security.permit-all-urls 无需认证
129 129 .antMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll()
130   - // 设置 App API 无需认证
  130 + // 1.4 设置 App API 无需认证
131 131 .antMatchers(buildAppApi("/**")).permitAll()
132 132 // ②:每个项目的自定义规则
133 133 .and().authorizeRequests(registry -> // 下面,循环设置自定义规则
... ... @@ -137,7 +137,7 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap
137 137 .anyRequest().authenticated()
138 138 ;
139 139  
140   - // 添加 JWT Filter
  140 + // 添加 Token Filter
141 141 httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
142 142 }
143 143  
... ...
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java
... ... @@ -40,7 +40,7 @@ public class RandomUtils {
40 40 // Integer
41 41 PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Integer.class, (dataProviderStrategy, attributeMetadata, map) -> {
42 42 // 如果是 status 的字段,返回 0 或 1
43   - if (attributeMetadata.getAttributeName().equals("status")) {
  43 + if ("status".equals(attributeMetadata.getAttributeName())) {
44 44 return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus();
45 45 }
46 46 // 如果是 type、status 结尾的字段,返回 tinyint 范围
... ... @@ -53,7 +53,7 @@ public class RandomUtils {
53 53 // Boolean
54 54 PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Boolean.class, (dataProviderStrategy, attributeMetadata, map) -> {
55 55 // 如果是 deleted 的字段,返回非删除
56   - if (attributeMetadata.getAttributeName().equals("deleted")) {
  56 + if ("deleted".equals(attributeMetadata.getAttributeName())) {
57 57 return false;
58 58 }
59 59 return RandomUtil.randomBoolean();
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java
... ... @@ -95,7 +95,7 @@ public class YudaoSwaggerAutoConfiguration {
95 95 return Collections.singletonList(SecurityContext.builder()
96 96 .securityReferences(securityReferences())
97 97 // 通过 PathSelectors.regex("^(?!auth).*$"),排除包含 "auth" 的接口不需要使用securitySchemes
98   - .forPaths(PathSelectors.regex("^(?!auth).*$"))
  98 + .operationSelector(o -> o.requestMappingPattern().matches("^(?!auth).*$"))
99 99 .build());
100 100 }
101 101  
... ...
yudao-module-bpm/yudao-module-bpm-biz/pom.xml
... ... @@ -26,11 +26,6 @@
26 26 <artifactId>yudao-module-system-api</artifactId>
27 27 <version>${revision}</version>
28 28 </dependency>
29   - <dependency>
30   - <groupId>cn.iocoder.boot</groupId>
31   - <artifactId>yudao-module-system-biz</artifactId>
32   - <version>${revision}</version>
33   - </dependency>
34 29  
35 30 <!-- 业务组件 -->
36 31 <dependency>
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java
... ... @@ -24,11 +24,7 @@ public class BpmUserGroupPageReqVO extends PageParam {
24 24 private Integer status;
25 25  
26 26 @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - @ApiModelProperty(value = "开始创建时间")
28   - private Date beginCreateTime;
29   -
30   - @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
31   - @ApiModelProperty(value = "结束创建时间")
32   - private Date endCreateTime;
  27 + @ApiModelProperty(value = "创建时间")
  28 + private Date[] createTime;
33 29  
34 30 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java
... ... @@ -24,11 +24,7 @@ public class BpmOALeavePageReqVO extends PageParam {
24 24 private String reason;
25 25  
26 26 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - @ApiModelProperty(value = "开始申请时间")
28   - private Date beginCreateTime;
29   -
30   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
31   - @ApiModelProperty(value = "结束申请时间")
32   - private Date endCreateTime;
  27 + @ApiModelProperty(value = "申请时间")
  28 + private Date[] createTime;
33 29  
34 30 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
... ... @@ -22,6 +22,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
22 22 @RequestMapping("/bpm/process-instance")
23 23 @Validated
24 24 public class BpmProcessInstanceController {
  25 +
25 26 @Resource
26 27 private BpmProcessInstanceService processInstanceService;
27 28  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java
... ... @@ -33,12 +33,8 @@ public class BpmProcessInstanceMyPageReqVO extends PageParam {
33 33 @ApiModelProperty(value = "流程分类", notes = "参见 bpm_model_category 数据字典", example = "1")
34 34 private String category;
35 35  
36   - @ApiModelProperty(value = "开始的创建时间")
  36 + @ApiModelProperty(value = "创建时间")
37 37 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
38   - private Date beginCreateTime;
39   -
40   - @ApiModelProperty(value = "结束的创建时间")
41   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
42   - private Date endCreateTime;
  38 + private Date[] createTime;
43 39  
44 40 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java
... ... @@ -12,7 +12,7 @@ import java.util.Date;
12 12  
13 13 /**
14 14 * Bpm 流程任务的拓展表
15   - * 主要解决 Activiti Task 和 HistoricTaskInstance 不支持拓展字段,所以新建拓展表
  15 + * 主要解决 Flowable Task 和 HistoricTaskInstance 不支持拓展字段,所以新建拓展表
16 16 *
17 17 * @author 芋道源码
18 18 */
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java
... ... @@ -21,7 +21,7 @@ public interface BpmUserGroupMapper extends BaseMapperX&lt;BpmUserGroupDO&gt; {
21 21 return selectPage(reqVO, new LambdaQueryWrapperX<BpmUserGroupDO>()
22 22 .likeIfPresent(BpmUserGroupDO::getName, reqVO.getName())
23 23 .eqIfPresent(BpmUserGroupDO::getStatus, reqVO.getStatus())
24   - .betweenIfPresent(BpmUserGroupDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  24 + .betweenIfPresent(BpmUserGroupDO::getCreateTime, reqVO.getCreateTime())
25 25 .orderByDesc(BpmUserGroupDO::getId));
26 26 }
27 27  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java
... ... @@ -22,7 +22,7 @@ public interface BpmOALeaveMapper extends BaseMapperX&lt;BpmOALeaveDO&gt; {
22 22 .eqIfPresent(BpmOALeaveDO::getResult, reqVO.getResult())
23 23 .eqIfPresent(BpmOALeaveDO::getType, reqVO.getType())
24 24 .likeIfPresent(BpmOALeaveDO::getReason, reqVO.getReason())
25   - .betweenIfPresent(BpmOALeaveDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  25 + .betweenIfPresent(BpmOALeaveDO::getCreateTime, reqVO.getCreateTime())
26 26 .orderByDesc(BpmOALeaveDO::getId));
27 27 }
28 28  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java
1 1 package cn.iocoder.yudao.module.bpm.dal.mysql.task;
2 2  
3   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
4   -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
5 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7   -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
8   -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
  7 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
9 8 import org.apache.ibatis.annotations.Mapper;
10 9  
11 10 @Mapper
12 11 public interface BpmProcessInstanceExtMapper extends BaseMapperX<BpmProcessInstanceExtDO> {
13 12  
14 13 default PageResult<BpmProcessInstanceExtDO> selectPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) {
15   - return selectPage(reqVO, new QueryWrapperX<BpmProcessInstanceExtDO>()
16   - .eqIfPresent("start_user_id", userId)
17   - .likeIfPresent("name", reqVO.getName())
18   - .eqIfPresent("process_definition_id", reqVO.getProcessDefinitionId())
19   - .eqIfPresent("category", reqVO.getCategory())
20   - .eqIfPresent("status", reqVO.getStatus())
21   - .eqIfPresent("result", reqVO.getResult())
22   - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
23   - .orderByDesc("id"));
  14 + return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceExtDO>()
  15 + .eqIfPresent(BpmProcessInstanceExtDO::getStartUserId, userId)
  16 + .likeIfPresent(BpmProcessInstanceExtDO::getName, reqVO.getName())
  17 + .eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId())
  18 + .eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory())
  19 + .eqIfPresent(BpmProcessInstanceExtDO::getStatus, reqVO.getStatus())
  20 + .eqIfPresent(BpmProcessInstanceExtDO::getResult, reqVO.getResult())
  21 + .betweenIfPresent(BpmProcessInstanceExtDO::getCreateTime, reqVO.getCreateTime())
  22 + .orderByDesc(BpmProcessInstanceExtDO::getId));
24 23 }
25 24  
26   - default BpmProcessInstanceExtDO selectByProcessInstanceId(String processDefinitionId) {
27   - return selectOne("process_instance_id", processDefinitionId);
  25 + default BpmProcessInstanceExtDO selectByProcessInstanceId(String processInstanceId) {
  26 + return selectOne(BpmProcessInstanceExtDO::getProcessInstanceId, processInstanceId);
28 27 }
29 28  
30 29 default void updateByProcessInstanceId(BpmProcessInstanceExtDO updateObj) {
31   - update(updateObj, new QueryWrapper<BpmProcessInstanceExtDO>()
32   - .eq("process_instance_id", updateObj.getProcessInstanceId()));
  30 + update(updateObj, new LambdaQueryWrapperX<BpmProcessInstanceExtDO>()
  31 + .eq(BpmProcessInstanceExtDO::getProcessInstanceId, updateObj.getProcessInstanceId()));
33 32 }
34 33  
35 34 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java
... ... @@ -7,13 +7,13 @@ import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
7 7 import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
8 8 import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener;
9 9 import org.flowable.engine.delegate.event.FlowableCancelledEvent;
10   -import org.flowable.engine.delegate.event.FlowableProcessStartedEvent;
11 10 import org.flowable.engine.runtime.ProcessInstance;
12 11 import org.springframework.context.annotation.Lazy;
13 12 import org.springframework.stereotype.Component;
14 13  
15 14 import javax.annotation.Resource;
16 15 import java.util.Set;
  16 +
17 17 /**
18 18 * 监听 {@link ProcessInstance} 的开始与完成,创建与更新对应的 {@link BpmProcessInstanceExtDO} 记录
19 19 *
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java
1 1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.listener;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.hutool.core.util.StrUtil;
4 5 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
5 6 import cn.iocoder.yudao.module.bpm.service.task.BpmActivityService;
... ... @@ -16,6 +17,7 @@ import org.springframework.context.annotation.Lazy;
16 17 import org.springframework.stereotype.Component;
17 18  
18 19 import javax.annotation.Resource;
  20 +import java.util.List;
19 21 import java.util.Set;
20 22  
21 23 /**
... ... @@ -63,15 +65,18 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
63 65  
64 66 @Override
65 67 protected void activityCancelled(FlowableActivityCancelledEvent event) {
66   - HistoricActivityInstance activity = activityService.getHistoricActivityByExecutionId(event.getExecutionId());
67   - if (activity == null) {
  68 + List<HistoricActivityInstance> activityList = activityService.getHistoricActivityListByExecutionId(event.getExecutionId());
  69 + if (CollUtil.isEmpty(activityList)) {
68 70 log.error("[activityCancelled][使用 executionId({}) 查找不到对应的活动实例]", event.getExecutionId());
69 71 return;
70 72 }
71   - if (StrUtil.isEmpty(activity.getTaskId())) {
72   - return;
73   - }
74   - taskService.updateTaskExtCancel(activity.getTaskId());
  73 + // 遍历处理
  74 + activityList.forEach(activity -> {
  75 + if (StrUtil.isEmpty(activity.getTaskId())) {
  76 + return;
  77 + }
  78 + taskService.updateTaskExtCancel(activity.getTaskId());
  79 + });
75 80 }
76 81  
77 82 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java
1 1 package cn.iocoder.yudao.module.bpm.service.definition;
2 2  
3 3 import cn.hutool.core.lang.Assert;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
4 6 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
5 7 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO;
6 8 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO;
... ... @@ -11,9 +13,6 @@ import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper;
11 13 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
12 14 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
13 15 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO;
14   -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
15   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
16   -import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
17 16 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
18 17 import org.springframework.stereotype.Service;
19 18 import org.springframework.validation.annotation.Validated;
... ... @@ -66,7 +65,7 @@ public class BpmFormServiceImpl implements BpmFormService {
66 65  
67 66 private void validateFormExists(Long id) {
68 67 if (formMapper.selectById(id) == null) {
69   - throw ServiceExceptionUtil.exception(ErrorCodeConstants.FORM_NOT_EXISTS);
  68 + throw exception(ErrorCodeConstants.FORM_NOT_EXISTS);
70 69 }
71 70 }
72 71  
... ... @@ -129,7 +128,7 @@ public class BpmFormServiceImpl implements BpmFormService {
129 128 continue;
130 129 }
131 130 // 如果存在,则报错
132   - throw ServiceExceptionUtil.exception(ErrorCodeConstants.FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel());
  131 + throw exception(ErrorCodeConstants.FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel());
133 132 }
134 133 }
135 134  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
... ... @@ -99,7 +99,7 @@ public class BpmModelServiceImpl implements BpmModelService {
99 99 public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) {
100 100 checkKeyNCName(createReqVO.getKey());
101 101 // 校验流程标识已经存在
102   - Model keyModel = this.getModelByKey(createReqVO.getKey());
  102 + Model keyModel = getModelByKey(createReqVO.getKey());
103 103 if (keyModel != null) {
104 104 throw exception(MODEL_KEY_EXISTS, createReqVO.getKey());
105 105 }
... ... @@ -151,42 +151,43 @@ public class BpmModelServiceImpl implements BpmModelService {
151 151 @Override
152 152 @Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务
153 153 public void deployModel(String id) {
154   - // 校验流程模型存在
  154 + // 1.1 校验流程模型存在
155 155 Model model = repositoryService.getModel(id);
156 156 if (ObjectUtils.isEmpty(model)) {
157 157 throw exception(MODEL_NOT_EXISTS);
158 158 }
159   - // 校验流程图
  159 + // 1.2 校验流程图
  160 + // TODO 芋艿:校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素;
160 161 byte[] bpmnBytes = repositoryService.getModelEditorSource(model.getId());
161 162 if (bpmnBytes == null) {
162 163 throw exception(MODEL_NOT_EXISTS);
163 164 }
164   - // TODO 芋艿:校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素;
165   - // 校验表单已配
  165 + // 1.3 校验表单已配
166 166 BpmFormDO form = checkFormConfig(model.getMetaInfo());
167   - //校验任务分配规则已配置
  167 + // 1.4 校验任务分配规则已配置
168 168 taskAssignRuleService.checkTaskAssignRuleAllConfig(id);
169 169  
  170 + // 1.5 校验模型是否发生修改。如果未修改,则不允许创建
170 171 BpmProcessDefinitionCreateReqDTO definitionCreateReqDTO = BpmModelConvert.INSTANCE.convert2(model, form).setBpmnBytes(bpmnBytes);
171   - //校验模型是否发生修改。如果未修改,则不允许创建
172 172 if (processDefinitionService.isProcessDefinitionEquals(definitionCreateReqDTO)) { // 流程定义的信息相等
173   - ProcessDefinition oldProcessInstance = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
174   - if (oldProcessInstance != null && taskAssignRuleService.isTaskAssignRulesEquals(model.getId(), oldProcessInstance.getId())) {
  173 + ProcessDefinition oldProcessDefinition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
  174 + if (oldProcessDefinition != null && taskAssignRuleService.isTaskAssignRulesEquals(model.getId(), oldProcessDefinition.getId())) {
175 175 throw exception(MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS);
176 176 }
177 177 }
178   - // 创建流程定义
  178 +
  179 + // 2.1 创建流程定义
179 180 String definitionId = processDefinitionService.createProcessDefinition(definitionCreateReqDTO);
180 181  
181   - // 将老的流程定义进行挂起。也就是说,只有最新部署的流程定义,才可以发起任务。
  182 + // 2.2 将老的流程定义进行挂起。也就是说,只有最新部署的流程定义,才可以发起任务。
182 183 updateProcessDefinitionSuspended(model.getDeploymentId());
183 184  
184   - // 更新 model 的 deploymentId,进行关联
  185 + // 2.3 更新 model 的 deploymentId,进行关联
185 186 ProcessDefinition definition = processDefinitionService.getProcessDefinition(definitionId);
186 187 model.setDeploymentId(definition.getDeploymentId());
187 188 repositoryService.saveModel(model);
188 189  
189   - //复制任务分配规则
  190 + // 2.4 复制任务分配规则
190 191 taskAssignRuleService.copyTaskAssignRules(id, definition.getId());
191 192 }
192 193  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
... ... @@ -127,7 +127,8 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
127 127 .deploy();
128 128  
129 129 // 设置 ProcessDefinition 的 category 分类
130   - ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
  130 + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery()
  131 + .deploymentId(deploy.getId()).singleResult();
131 132 repositoryService.setProcessDefinitionCategory(definition.getId(), createReqDTO.getCategory());
132 133 // 注意 1,ProcessDefinition 的 key 和 name 是通过 BPMN 中的 <bpmn2:process /> 的 id 和 name 决定
133 134 // 注意 2,目前该项目的设计上,需要保证 Model、Deployment、ProcessDefinition 使用相同的 key,保证关联性。
... ... @@ -198,7 +199,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
198 199 // 校验 BPMN XML 信息
199 200 BpmnModel newModel = buildBpmnModel(createReqDTO.getBpmnBytes());
200 201 BpmnModel oldModel = getBpmnModel(oldProcessDefinition.getId());
201   - //TODO 貌似 flowable 不修改这个也不同。需要看看。 sourceSystemId 不同
  202 + // TODO 貌似 flowable 不修改这个也不同。需要看看。 sourceSystemId 不同
202 203 if (FlowableUtils.equals(oldModel, newModel)) {
203 204 return false;
204 205 }
... ... @@ -218,8 +219,6 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
218 219 return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true);
219 220 }
220 221  
221   -
222   -
223 222 @Override
224 223 public BpmProcessDefinitionExtDO getProcessDefinitionExt(String id) {
225 224 return processDefinitionMapper.selectByProcessDefinitionId(id);
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java
... ... @@ -26,6 +26,6 @@ public interface BpmActivityService {
26 26 * @param executionId 执行编号
27 27 * @return 活动实例
28 28 */
29   - HistoricActivityInstance getHistoricActivityByExecutionId(String executionId);
  29 + List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId);
30 30  
31 31 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.service.task;
2 2  
3 3 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO;
4 4 import cn.iocoder.yudao.module.bpm.convert.task.BpmActivityConvert;
5   -import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmActivityMapper;
6 5 import lombok.extern.slf4j.Slf4j;
7 6 import org.flowable.engine.HistoryService;
8 7 import org.flowable.engine.history.HistoricActivityInstance;
... ... @@ -25,8 +24,6 @@ public class BpmActivityServiceImpl implements BpmActivityService {
25 24  
26 25 @Resource
27 26 private HistoryService historyService;
28   - @Resource
29   - private BpmActivityMapper bpmActivityMapper;
30 27  
31 28 @Override
32 29 public List<BpmActivityRespVO> getActivityListByProcessInstanceId(String processInstanceId) {
... ... @@ -36,8 +33,8 @@ public class BpmActivityServiceImpl implements BpmActivityService {
36 33 }
37 34  
38 35 @Override
39   - public HistoricActivityInstance getHistoricActivityByExecutionId(String executionId) {
40   - return historyService.createHistoricActivityInstanceQuery().executionId(executionId).singleResult();
  36 + public List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId) {
  37 + return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list();
41 38 }
42 39  
43 40 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
... ... @@ -144,5 +144,4 @@ public interface BpmProcessInstanceService {
144 144 */
145 145 void updateProcessInstanceExtReject(String id, String reason);
146 146  
147   -
148 147 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
1   -package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.delegate.event.FlowableCancelledEvent; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import javax.validation.Valid; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程实例 Service 实现类 * * ProcessDefinition & ProcessInstance & Execution & Task 的关系: * 1. <a href="https://blog.csdn.net/bobozai86/article/details/105210414" /> * * HistoricProcessInstance & ProcessInstance 的关系: * 1. <a href=" https://my.oschina.net/843294669/blog/71902" /> * * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例 * * @author 芋道源码 */ @Service @Validated @Slf4j public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { @Resource private RuntimeService runtimeService; @Resource private BpmProcessInstanceExtMapper processInstanceExtMapper; @Resource @Lazy // 解决循环依赖 private BpmTaskService taskService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource private HistoryService historyService; @Resource private AdminUserApi adminUserApi; @Resource private DeptApi deptApi; @Resource private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; @Resource private BpmMessageService messageService; @Override public ProcessInstance getProcessInstance(String id) { return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List<ProcessInstance> getProcessInstances(Set<String> ids) { return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult<BpmProcessInstanceExtDO> pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List<String> processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map<String, List<Task>> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap); } @Override @Transactional(rollbackFor = Exception.class) public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); // 发起流程 return createProcessInstance0(userId, definition, createReqVO.getVariables(), null); } @Override public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); // 发起流程 return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey()); } @Override public BpmProcessInstanceRespVO getProcessInstanceVO(String id) { // 获得流程实例 HistoricProcessInstance processInstance = getHistoricProcessInstance(id); if (processInstance == null) { return null; } BpmProcessInstanceExtDO processInstanceExt = processInstanceExtMapper.selectByProcessInstanceId(id); Assert.notNull(processInstanceExt, "流程实例拓展({}) 不存在", id); // 获得流程定义 ProcessDefinition processDefinition = processDefinitionService .getProcessDefinition(processInstance.getProcessDefinitionId()); Assert.notNull(processDefinition, "流程定义({}) 不存在", processInstance.getProcessDefinitionId()); BpmProcessDefinitionExtDO processDefinitionExt = processDefinitionService.getProcessDefinitionExt( processInstance.getProcessDefinitionId()); Assert.notNull(processDefinitionExt, "流程定义拓展({}) 不存在", id); String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); // 获得 User AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); DeptRespDTO dept = null; if (startUser != null) { dept = deptApi.getDept(startUser.getDeptId()); } // 拼接结果 return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processInstanceExt, processDefinition, processDefinitionExt, bpmnXml, startUser, dept); } @Override public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { // 校验流程实例存在 ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); if (instance == null) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); } // 只能取消自己的 if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } // 通过删除流程实例,实现流程实例的取消, // 删除流程实例,正则执行任务 ACT_RU_TASK. 任务会被删除。通过历史表查询 deleteProcessInstance(cancelReqVO.getId(), BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); } /** * 获得历史的流程实例 * * @param id 流程实例的编号 * @return 历史的流程实例 */ @Override public HistoricProcessInstance getHistoricProcessInstance(String id) { return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List<HistoricProcessInstance> getHistoricProcessInstances(Set<String> ids) { return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public void createProcessInstanceExt(ProcessInstance instance) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition2(instance.getProcessDefinitionId()); // 插入 BpmProcessInstanceExtDO 对象 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getId()) .setProcessDefinitionId(definition.getId()) .setName(instance.getProcessDefinitionName()) .setStartUserId(Long.valueOf(instance.getStartUserId())) .setCategory(definition.getCategory()) .setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus()) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); processInstanceExtMapper.insert(instanceExtDO); } @Override public void updateProcessInstanceExtCancel(FlowableCancelledEvent event) { // 判断是否为 Reject 不通过。如果是,则不进行更新. // 因为,updateProcessInstanceExtReject 方法,已经进行更新了 if (BpmProcessInstanceDeleteReasonEnum.isRejectReason((String)event.getCause())) { return; } // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(event.getProcessInstanceId()) .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Override public void updateProcessInstanceExtComplete(ProcessInstance instance) { // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getProcessInstanceId()) .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被通过的消息 messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Transactional(rollbackFor = Exception.class) public void updateProcessInstanceExtReject(String id, String reason) { // 需要主动查询,因为 instance 只有 id 属性 ProcessInstance processInstance = getProcessInstance(id); // 删除流程实例,以实现驳回任务时,取消整个审批流程 deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(reason))); // 更新 status + result // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法, // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id) .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被不通过的消息 messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert2RejectReq(processInstance, reason)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } private void deleteProcessInstance(String id, String reason) { runtimeService.deleteProcessInstance(id, reason); } private String createProcessInstance0(Long userId, ProcessDefinition definition, Map<String, Object> variables, String businessKey) { // 校验流程定义 if (definition == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); } if (definition.isSuspended()) { throw exception(PROCESS_DEFINITION_IS_SUSPENDED); } // 创建流程实例 ProcessInstance instance = runtimeService.startProcessInstanceById(definition.getId(), businessKey, variables); // 设置流程名字 runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); // 补全流程实例的拓展表 processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()) .setFormVariables(variables)); return instance.getId(); } }
2 1 \ No newline at end of file
  2 +package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.delegate.event.FlowableCancelledEvent; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import javax.validation.Valid; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程实例 Service 实现类 * * ProcessDefinition & ProcessInstance & Execution & Task 的关系: * 1. <a href="https://blog.csdn.net/bobozai86/article/details/105210414" /> * * HistoricProcessInstance & ProcessInstance 的关系: * 1. <a href=" https://my.oschina.net/843294669/blog/71902" /> * * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例 * * @author 芋道源码 */ @Service @Validated @Slf4j public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { @Resource private RuntimeService runtimeService; @Resource private BpmProcessInstanceExtMapper processInstanceExtMapper; @Resource @Lazy // 解决循环依赖 private BpmTaskService taskService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource private HistoryService historyService; @Resource private AdminUserApi adminUserApi; @Resource private DeptApi deptApi; @Resource private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; @Resource private BpmMessageService messageService; @Override public ProcessInstance getProcessInstance(String id) { return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List<ProcessInstance> getProcessInstances(Set<String> ids) { return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult<BpmProcessInstanceExtDO> pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List<String> processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map<String, List<Task>> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap); } @Override @Transactional(rollbackFor = Exception.class) public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); // 发起流程 return createProcessInstance0(userId, definition, createReqVO.getVariables(), null); } @Override public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); // 发起流程 return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey()); } @Override public BpmProcessInstanceRespVO getProcessInstanceVO(String id) { // 获得流程实例 HistoricProcessInstance processInstance = getHistoricProcessInstance(id); if (processInstance == null) { return null; } BpmProcessInstanceExtDO processInstanceExt = processInstanceExtMapper.selectByProcessInstanceId(id); Assert.notNull(processInstanceExt, "流程实例拓展({}) 不存在", id); // 获得流程定义 ProcessDefinition processDefinition = processDefinitionService .getProcessDefinition(processInstance.getProcessDefinitionId()); Assert.notNull(processDefinition, "流程定义({}) 不存在", processInstance.getProcessDefinitionId()); BpmProcessDefinitionExtDO processDefinitionExt = processDefinitionService.getProcessDefinitionExt( processInstance.getProcessDefinitionId()); Assert.notNull(processDefinitionExt, "流程定义拓展({}) 不存在", id); String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); // 获得 User AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); DeptRespDTO dept = null; if (startUser != null) { dept = deptApi.getDept(startUser.getDeptId()); } // 拼接结果 return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processInstanceExt, processDefinition, processDefinitionExt, bpmnXml, startUser, dept); } @Override public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { // 校验流程实例存在 ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); if (instance == null) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); } // 只能取消自己的 if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } // 通过删除流程实例,实现流程实例的取消, // 删除流程实例,正则执行任务 ACT_RU_TASK. 任务会被删除。通过历史表查询 deleteProcessInstance(cancelReqVO.getId(), BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); } /** * 获得历史的流程实例 * * @param id 流程实例的编号 * @return 历史的流程实例 */ @Override public HistoricProcessInstance getHistoricProcessInstance(String id) { return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List<HistoricProcessInstance> getHistoricProcessInstances(Set<String> ids) { return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public void createProcessInstanceExt(ProcessInstance instance) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition2(instance.getProcessDefinitionId()); // 插入 BpmProcessInstanceExtDO 对象 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getId()) .setProcessDefinitionId(definition.getId()) .setName(instance.getProcessDefinitionName()) .setStartUserId(Long.valueOf(instance.getStartUserId())) .setCategory(definition.getCategory()) .setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus()) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); processInstanceExtMapper.insert(instanceExtDO); } @Override public void updateProcessInstanceExtCancel(FlowableCancelledEvent event) { // 判断是否为 Reject 不通过。如果是,则不进行更新. // 因为,updateProcessInstanceExtReject 方法,已经进行更新了 if (BpmProcessInstanceDeleteReasonEnum.isRejectReason((String)event.getCause())) { return; } // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(event.getProcessInstanceId()) .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Override public void updateProcessInstanceExtComplete(ProcessInstance instance) { // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getProcessInstanceId()) .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被通过的消息 messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Transactional(rollbackFor = Exception.class) public void updateProcessInstanceExtReject(String id, String reason) { // 需要主动查询,因为 instance 只有 id 属性 ProcessInstance processInstance = getProcessInstance(id); // 删除流程实例,以实现驳回任务时,取消整个审批流程 deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(reason))); // 更新 status + result // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法, // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id) .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被不通过的消息 messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert2RejectReq(processInstance, reason)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } private void deleteProcessInstance(String id, String reason) { runtimeService.deleteProcessInstance(id, reason); } private String createProcessInstance0(Long userId, ProcessDefinition definition, Map<String, Object> variables, String businessKey) { // 校验流程定义 if (definition == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); } if (definition.isSuspended()) { throw exception(PROCESS_DEFINITION_IS_SUSPENDED); } // 创建流程实例 ProcessInstance instance = runtimeService.startProcessInstanceById(definition.getId(), businessKey, variables); // 设置流程名字 runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); // 补全流程实例的拓展表 processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()) .setFormVariables(variables)); return instance.getId(); } }
3 3 \ No newline at end of file
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
... ... @@ -7,10 +7,7 @@ import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 7 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
8 8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
9 9 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
10   -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
11 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
12   -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper;
13   -import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmActivityMapper;
14 11 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper;
15 12 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;
16 13 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
... ... @@ -67,10 +64,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
67 64 private BpmTaskExtMapper taskExtMapper;
68 65 @Resource
69 66 private BpmMessageService messageService;
70   - @Resource
71   - private BpmTaskAssignRuleMapper taskAssignRuleMapper;
72   - @Resource
73   - private BpmActivityMapper bpmActivityMapper;
74 67  
75 68 @Override
76 69 public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
... ... @@ -194,10 +187,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
194 187 taskExtMapper.updateByTaskId(
195 188 new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult())
196 189 .setReason(reqVO.getReason()));
197   - // 判断任务是否为或签,或签时删除其余不用审批的任务
198   - List<BpmTaskAssignRuleDO> bpmTaskAssignRuleList =
199   - taskAssignRuleMapper.selectListByProcessDefinitionId(task.getProcessDefinitionId(),
200   - task.getTaskDefinitionKey());
201 190 }
202 191  
203 192 @Override
... ... @@ -216,7 +205,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
216 205 // 更新任务拓展表为不通过
217 206 taskExtMapper.updateByTaskId(
218 207 new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.REJECT.getResult())
219   - .setReason(reqVO.getReason()));
  208 + .setEndTime(new Date()).setReason(reqVO.getReason()));
220 209 }
221 210  
222 211 @Override
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java
... ... @@ -17,6 +17,9 @@ import org.springframework.context.annotation.Import;
17 17  
18 18 import javax.annotation.Resource;
19 19  
  20 +import java.util.Date;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
20 23 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
21 24 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS;
22 25  
... ... @@ -116,8 +119,7 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest {
116 119 BpmUserGroupPageReqVO reqVO = new BpmUserGroupPageReqVO();
117 120 reqVO.setName("源码");
118 121 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
119   - reqVO.setBeginCreateTime(DateUtils.buildTime(2021, 11, 10));
120   - reqVO.setEndCreateTime(DateUtils.buildTime(2021, 11, 12));
  122 + reqVO.setCreateTime((new Date[]{buildTime(2021, 11, 10),buildTime(2021, 11, 12)}));
121 123  
122 124 // 调用
123 125 PageResult<BpmUserGroupDO> pageResult = userGroupService.getUserGroupPage(reqVO);
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java
... ... @@ -24,12 +24,8 @@ public class CodegenTablePageReqVO extends PageParam {
24 24 @ApiModelProperty(value = "表描述", example = "芋道", notes = "模糊匹配")
25 25 private String tableComment;
26 26  
27   - @ApiModelProperty(value = "开始创建时间", example = "2020-10-24 00:00:00")
  27 + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
28 28 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
29   - private Date beginCreateTime;
30   -
31   - @ApiModelProperty(value = "结束创建时间", example = "2020-10-24 23:59:59")
32   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
33   - private Date endCreateTime;
  29 + private Date[] createTime;
34 30  
35 31 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigExportReqVO.java
... ... @@ -22,12 +22,8 @@ public class ConfigExportReqVO {
22 22 @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举")
23 23 private Integer type;
24 24  
25   - @ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00")
  25 + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
26 26 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - private Date beginTime;
28   -
29   - @ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59")
30   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
31   - private Date endTime;
  27 + private Date[] createTime;
32 28  
33 29 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java
... ... @@ -27,12 +27,8 @@ public class ConfigPageReqVO extends PageParam {
27 27 @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举")
28 28 private Integer type;
29 29  
30   - @ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00")
  30 + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
31 31 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
32   - private Date beginTime;
33   -
34   - @ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59")
35   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
36   - private Date endTime;
  32 + private Date[] createTime;
37 33  
38 34 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.java
... ... @@ -25,11 +25,7 @@ public class FileConfigPageReqVO extends PageParam {
25 25 private Integer storage;
26 26  
27 27 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
28   - @ApiModelProperty(value = "开始创建时间")
29   - private Date beginCreateTime;
30   -
31   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
32   - @ApiModelProperty(value = "结束创建时间")
33   - private Date endCreateTime;
  28 + @ApiModelProperty(value = "创建时间")
  29 + private Date[] createTime;
34 30  
35 31 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FilePageReqVO.java
... ... @@ -25,11 +25,7 @@ public class FilePageReqVO extends PageParam {
25 25 private String type;
26 26  
27 27 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
28   - @ApiModelProperty(value = "开始创建时间")
29   - private Date beginCreateTime;
30   -
31   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
32   - @ApiModelProperty(value = "结束创建时间")
33   - private Date endCreateTime;
  28 + @ApiModelProperty(value = "创建时间")
  29 + private Date[] createTime;
34 30  
35 31 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java
... ... @@ -26,12 +26,8 @@ public class ApiAccessLogExportReqVO {
26 26 private String requestUrl;
27 27  
28 28 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
29   - @ApiModelProperty(value = "开始开始请求时间")
30   - private Date beginBeginTime;
31   -
32   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
33   - @ApiModelProperty(value = "结束开始请求时间")
34   - private Date endBeginTime;
  29 + @ApiModelProperty(value = "开始请求时间")
  30 + private Date[] beginTime;
35 31  
36 32 @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒")
37 33 private Integer duration;
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java
... ... @@ -31,12 +31,8 @@ public class ApiAccessLogPageReqVO extends PageParam {
31 31 private String requestUrl;
32 32  
33 33 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
34   - @ApiModelProperty(value = "开始开始请求时间")
35   - private Date beginBeginTime;
36   -
37   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
38   - @ApiModelProperty(value = "结束开始请求时间")
39   - private Date endBeginTime;
  34 + @ApiModelProperty(value = "开始请求时间")
  35 + private Date[] beginTime;
40 36  
41 37 @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒")
42 38 private Integer duration;
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java
... ... @@ -26,12 +26,8 @@ public class ApiErrorLogExportReqVO {
26 26 private String requestUrl;
27 27  
28 28 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
29   - @ApiModelProperty(value = "开始异常发生时间")
30   - private Date beginExceptionTime;
31   -
32   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
33   - @ApiModelProperty(value = "结束异常发生时间")
34   - private Date endExceptionTime;
  29 + @ApiModelProperty(value = "异常发生时间")
  30 + private Date[] exceptionTime;
35 31  
36 32 @ApiModelProperty(value = "处理状态", example = "0")
37 33 private Integer processStatus;
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java
... ... @@ -31,12 +31,8 @@ public class ApiErrorLogPageReqVO extends PageParam {
31 31 private String requestUrl;
32 32  
33 33 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
34   - @ApiModelProperty(value = "开始异常发生时间")
35   - private Date beginExceptionTime;
36   -
37   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
38   - @ApiModelProperty(value = "结束异常发生时间")
39   - private Date endExceptionTime;
  34 + @ApiModelProperty(value = "异常发生时间")
  35 + private Date[] exceptionTime;
40 36  
41 37 @ApiModelProperty(value = "处理状态", example = "0")
42 38 private Integer processStatus;
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/test/vo/TestDemoExportReqVO.java
... ... @@ -28,11 +28,7 @@ public class TestDemoExportReqVO {
28 28 private String remark;
29 29  
30 30 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
31   - @ApiModelProperty(value = "开始创建时间")
32   - private Date beginCreateTime;
33   -
34   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
35   - @ApiModelProperty(value = "结束创建时间")
36   - private Date endCreateTime;
  31 + @ApiModelProperty(value = "创建时间")
  32 + private Date[] createTime;
37 33  
38 34 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/test/vo/TestDemoPageReqVO.java
... ... @@ -30,11 +30,7 @@ public class TestDemoPageReqVO extends PageParam {
30 30 private String remark;
31 31  
32 32 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
33   - @ApiModelProperty(value = "开始创建时间")
34   - private Date beginCreateTime;
35   -
36   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
37   - @ApiModelProperty(value = "结束创建时间")
38   - private Date endCreateTime;
  33 + @ApiModelProperty(value = "创建时间")
  34 + private Date[] createTime;
39 35  
40 36 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenTableMapper.java
... ... @@ -21,7 +21,7 @@ public interface CodegenTableMapper extends BaseMapperX&lt;CodegenTableDO&gt; {
21 21 return selectPage(pageReqVO, new LambdaQueryWrapperX<CodegenTableDO>()
22 22 .likeIfPresent(CodegenTableDO::getTableName, pageReqVO.getTableName())
23 23 .likeIfPresent(CodegenTableDO::getTableComment, pageReqVO.getTableComment())
24   - .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getBeginCreateTime(), pageReqVO.getEndCreateTime()));
  24 + .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime()));
25 25 }
26 26  
27 27 default List<CodegenTableDO> selectListByDataSourceConfigId(Long dataSourceConfigId) {
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/config/ConfigMapper.java
... ... @@ -22,7 +22,7 @@ public interface ConfigMapper extends BaseMapperX&lt;ConfigDO&gt; {
22 22 .likeIfPresent(ConfigDO::getName, reqVO.getName())
23 23 .likeIfPresent(ConfigDO::getConfigKey, reqVO.getKey())
24 24 .eqIfPresent(ConfigDO::getType, reqVO.getType())
25   - .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()));
  25 + .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getCreateTime()));
26 26 }
27 27  
28 28 default List<ConfigDO> selectList(ConfigExportReqVO reqVO) {
... ... @@ -30,7 +30,7 @@ public interface ConfigMapper extends BaseMapperX&lt;ConfigDO&gt; {
30 30 .likeIfPresent(ConfigDO::getName, reqVO.getName())
31 31 .likeIfPresent(ConfigDO::getConfigKey, reqVO.getKey())
32 32 .eqIfPresent(ConfigDO::getType, reqVO.getType())
33   - .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()));
  33 + .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getCreateTime()));
34 34 }
35 35  
36 36 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileConfigMapper.java
... ... @@ -22,7 +22,7 @@ public interface FileConfigMapper extends BaseMapperX&lt;FileConfigDO&gt; {
22 22 return selectPage(reqVO, new LambdaQueryWrapperX<FileConfigDO>()
23 23 .likeIfPresent(FileConfigDO::getName, reqVO.getName())
24 24 .eqIfPresent(FileConfigDO::getStorage, reqVO.getStorage())
25   - .betweenIfPresent(FileConfigDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  25 + .betweenIfPresent(FileConfigDO::getCreateTime, reqVO.getCreateTime())
26 26 .orderByDesc(FileConfigDO::getId));
27 27 }
28 28  
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileMapper.java
... ... @@ -19,7 +19,7 @@ public interface FileMapper extends BaseMapperX&lt;FileDO&gt; {
19 19 return selectPage(reqVO, new LambdaQueryWrapperX<FileDO>()
20 20 .likeIfPresent(FileDO::getPath, reqVO.getPath())
21 21 .likeIfPresent(FileDO::getType, reqVO.getType())
22   - .betweenIfPresent(FileDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  22 + .betweenIfPresent(FileDO::getCreateTime, reqVO.getCreateTime())
23 23 .orderByDesc(FileDO::getId));
24 24 }
25 25  
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java
1 1 package cn.iocoder.yudao.module.infra.dal.mysql.logger;
2 2  
3   -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO;
4   -import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
5 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7   -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO;
  7 +import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
8 8 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO;
9 9 import org.apache.ibatis.annotations.Mapper;
10 10  
... ... @@ -19,28 +19,28 @@ import java.util.List;
19 19 public interface ApiAccessLogMapper extends BaseMapperX<ApiAccessLogDO> {
20 20  
21 21 default PageResult<ApiAccessLogDO> selectPage(ApiAccessLogPageReqVO reqVO) {
22   - return selectPage(reqVO, new QueryWrapperX<ApiAccessLogDO>()
23   - .eqIfPresent("user_id", reqVO.getUserId())
24   - .eqIfPresent("user_type", reqVO.getUserType())
25   - .eqIfPresent("application_name", reqVO.getApplicationName())
26   - .likeIfPresent("request_url", reqVO.getRequestUrl())
27   - .betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime())
28   - .geIfPresent("duration", reqVO.getDuration())
29   - .eqIfPresent("result_code", reqVO.getResultCode())
30   - .orderByDesc("id")
  22 + return selectPage(reqVO, new LambdaQueryWrapperX<ApiAccessLogDO>()
  23 + .eqIfPresent(ApiAccessLogDO::getUserId, reqVO.getUserId())
  24 + .eqIfPresent(ApiAccessLogDO::getUserType, reqVO.getUserType())
  25 + .eqIfPresent(ApiAccessLogDO::getApplicationName, reqVO.getApplicationName())
  26 + .likeIfPresent(ApiAccessLogDO::getRequestUrl, reqVO.getRequestUrl())
  27 + .betweenIfPresent(ApiAccessLogDO::getBeginTime, reqVO.getBeginTime())
  28 + .geIfPresent(ApiAccessLogDO::getDuration, reqVO.getDuration())
  29 + .eqIfPresent(ApiAccessLogDO::getResultCode, reqVO.getResultCode())
  30 + .orderByDesc(ApiAccessLogDO::getId)
31 31 );
32 32 }
33 33  
34 34 default List<ApiAccessLogDO> selectList(ApiAccessLogExportReqVO reqVO) {
35   - return selectList(new QueryWrapperX<ApiAccessLogDO>()
36   - .eqIfPresent("user_id", reqVO.getUserId())
37   - .eqIfPresent("user_type", reqVO.getUserType())
38   - .eqIfPresent("application_name", reqVO.getApplicationName())
39   - .likeIfPresent("request_url", reqVO.getRequestUrl())
40   - .betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime())
41   - .geIfPresent("duration", reqVO.getDuration())
42   - .eqIfPresent("result_code", reqVO.getResultCode())
43   - .orderByDesc("id")
  35 + return selectList(new LambdaQueryWrapperX<ApiAccessLogDO>()
  36 + .eqIfPresent(ApiAccessLogDO::getUserId, reqVO.getUserId())
  37 + .eqIfPresent(ApiAccessLogDO::getUserType, reqVO.getUserType())
  38 + .eqIfPresent(ApiAccessLogDO::getApplicationName, reqVO.getApplicationName())
  39 + .likeIfPresent(ApiAccessLogDO::getRequestUrl, reqVO.getRequestUrl())
  40 + .betweenIfPresent(ApiAccessLogDO::getBeginTime, reqVO.getBeginTime())
  41 + .geIfPresent(ApiAccessLogDO::getDuration, reqVO.getDuration())
  42 + .eqIfPresent(ApiAccessLogDO::getResultCode, reqVO.getResultCode())
  43 + .orderByDesc(ApiAccessLogDO::getId)
44 44 );
45 45 }
46 46  
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.dal.mysql.logger;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5   -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 6 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO;
7 7 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO;
8 8 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO;
... ... @@ -19,26 +19,26 @@ import java.util.List;
19 19 public interface ApiErrorLogMapper extends BaseMapperX<ApiErrorLogDO> {
20 20  
21 21 default PageResult<ApiErrorLogDO> selectPage(ApiErrorLogPageReqVO reqVO) {
22   - return selectPage(reqVO, new QueryWrapperX<ApiErrorLogDO>()
23   - .eqIfPresent("user_id", reqVO.getUserId())
24   - .eqIfPresent("user_type", reqVO.getUserType())
25   - .eqIfPresent("application_name", reqVO.getApplicationName())
26   - .likeIfPresent("request_url", reqVO.getRequestUrl())
27   - .betweenIfPresent("exception_time", reqVO.getBeginExceptionTime(), reqVO.getEndExceptionTime())
28   - .eqIfPresent("process_status", reqVO.getProcessStatus())
29   - .orderByDesc("id")
  22 + return selectPage(reqVO, new LambdaQueryWrapperX<ApiErrorLogDO>()
  23 + .eqIfPresent(ApiErrorLogDO::getUserId, reqVO.getUserId())
  24 + .eqIfPresent(ApiErrorLogDO::getUserType, reqVO.getUserType())
  25 + .eqIfPresent(ApiErrorLogDO::getApplicationName, reqVO.getApplicationName())
  26 + .likeIfPresent(ApiErrorLogDO::getRequestUrl, reqVO.getRequestUrl())
  27 + .betweenIfPresent(ApiErrorLogDO::getExceptionTime, reqVO.getExceptionTime())
  28 + .eqIfPresent(ApiErrorLogDO::getProcessStatus, reqVO.getProcessStatus())
  29 + .orderByDesc(ApiErrorLogDO::getId)
30 30 );
31 31 }
32 32  
33 33 default List<ApiErrorLogDO> selectList(ApiErrorLogExportReqVO reqVO) {
34   - return selectList(new QueryWrapperX<ApiErrorLogDO>()
35   - .eqIfPresent("user_id", reqVO.getUserId())
36   - .eqIfPresent("user_type", reqVO.getUserType())
37   - .eqIfPresent("application_name", reqVO.getApplicationName())
38   - .likeIfPresent("request_url", reqVO.getRequestUrl())
39   - .betweenIfPresent("exception_time", reqVO.getBeginExceptionTime(), reqVO.getEndExceptionTime())
40   - .eqIfPresent("process_status", reqVO.getProcessStatus())
41   - .orderByDesc("id")
  34 + return selectList(new LambdaQueryWrapperX<ApiErrorLogDO>()
  35 + .eqIfPresent(ApiErrorLogDO::getUserId, reqVO.getUserId())
  36 + .eqIfPresent(ApiErrorLogDO::getUserType, reqVO.getUserType())
  37 + .eqIfPresent(ApiErrorLogDO::getApplicationName, reqVO.getApplicationName())
  38 + .likeIfPresent(ApiErrorLogDO::getRequestUrl, reqVO.getRequestUrl())
  39 + .betweenIfPresent(ApiErrorLogDO::getExceptionTime, reqVO.getExceptionTime())
  40 + .eqIfPresent(ApiErrorLogDO::getProcessStatus, reqVO.getProcessStatus())
  41 + .orderByDesc(ApiErrorLogDO::getId)
42 42 );
43 43 }
44 44  
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/test/TestDemoMapper.java
... ... @@ -25,7 +25,7 @@ public interface TestDemoMapper extends BaseMapperX&lt;TestDemoDO&gt; {
25 25 .eqIfPresent(TestDemoDO::getType, reqVO.getType())
26 26 .eqIfPresent(TestDemoDO::getCategory, reqVO.getCategory())
27 27 .eqIfPresent(TestDemoDO::getRemark, reqVO.getRemark())
28   - .betweenIfPresent(TestDemoDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  28 + .betweenIfPresent(TestDemoDO::getCreateTime, reqVO.getCreateTime())
29 29 .orderByDesc(TestDemoDO::getId));
30 30 }
31 31  
... ... @@ -36,7 +36,7 @@ public interface TestDemoMapper extends BaseMapperX&lt;TestDemoDO&gt; {
36 36 .eqIfPresent(TestDemoDO::getType, reqVO.getType())
37 37 .eqIfPresent(TestDemoDO::getCategory, reqVO.getCategory())
38 38 .eqIfPresent(TestDemoDO::getRemark, reqVO.getRemark())
39   - .betweenIfPresent(TestDemoDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  39 + .betweenIfPresent(TestDemoDO::getCreateTime, reqVO.getCreateTime())
40 40 .orderByDesc(TestDemoDO::getId));
41 41 }
42 42  
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
... ... @@ -79,11 +79,20 @@ public class CodegenEngine {
79 79 javaModuleImplTestFilePath("service/${table.businessName}/${table.className}ServiceImplTest"))
80 80 // Java module-api Main
81 81 .put(javaTemplatePath("enums/errorcode"), javaModuleApiMainFilePath("enums/ErrorCodeConstants_手动操作"))
82   - // Vue
  82 + // Vue2
83 83 .put(vueTemplatePath("views/index.vue"),
84 84 vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue"))
85 85 .put(vueTemplatePath("api/api.js"),
86 86 vueFilePath("api/${table.moduleName}/${classNameVar}.js"))
  87 + // Vue3
  88 + .put(vue3TemplatePath("views/index.vue"),
  89 + vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue"))
  90 + .put(vue3TemplatePath("views/data.ts"),
  91 + vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts"))
  92 + .put(vue3TemplatePath("api/api.ts"),
  93 + vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts"))
  94 + .put(vue3TemplatePath("api/types.ts"),
  95 + vue3FilePath("api/${table.moduleName}/${classNameVar}/types.ts"))
87 96 // SQL
88 97 .put("codegen/sql/sql.vm", "sql/sql.sql")
89 98 .put("codegen/sql/h2.vm", "sql/h2.sql")
... ... @@ -228,5 +237,12 @@ public class CodegenEngine {
228 237 return "yudao-ui-${sceneEnum.basePackage}/" + // 顶级目录
229 238 "src/" + path;
230 239 }
  240 + private static String vue3TemplatePath(String path) {
  241 + return "codegen/vue3/" + path + ".vm";
  242 + }
231 243  
  244 + private static String vue3FilePath(String path) {
  245 + return "yudao-ui-${sceneEnum.basePackage}-vue3/" + // 顶级目录
  246 + "src/" + path;
  247 + }
232 248 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/vo/exportReqVO.vm
... ... @@ -15,9 +15,6 @@ import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
15 15 #end
16 16 ## 字段模板
17 17 #macro(columnTpl $prefix $prefixStr)
18   -#if (${column.javaType} == "Date")## 时间类型
19   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
20   -#end
21 18 @ApiModelProperty(value = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end)
22 19 private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end;
23 20 #end
... ... @@ -27,12 +24,11 @@ import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
27 24 public class ${sceneEnum.prefixClass}${table.className}ExportReqVO {
28 25  
29 26 #foreach ($column in $columns)
30   -#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写
31 27 #if (${column.listOperation})##查询操作
32 28 #if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候
33   - #columnTpl('begin', '开始')
34   -
35   - #columnTpl('end', '结束')
  29 + @ApiModelProperty(value = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end)
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + private ${column.javaType}[] ${column.javaField};
36 32 #else##情况二,非 Between 的时间
37 33 #columnTpl('', '')
38 34 #end
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm
... ... @@ -15,9 +15,6 @@ import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
15 15 #end
16 16 ## 字段模板
17 17 #macro(columnTpl $prefix $prefixStr)
18   -#if (${column.javaType} == "Date")## 时间类型
19   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
20   -#end
21 18 @ApiModelProperty(value = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end)
22 19 private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end;
23 20 #end
... ... @@ -29,12 +26,11 @@ import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
29 26 public class ${sceneEnum.prefixClass}${table.className}PageReqVO extends PageParam {
30 27  
31 28 #foreach ($column in $columns)
32   -#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写
33 29 #if (${column.listOperation})##查询操作
34 30 #if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候
35   - #columnTpl('begin', '开始')
36   -
37   - #columnTpl('end', '结束')
  31 + @ApiModelProperty(value = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end)
  32 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  33 + private ${column.javaType}[] ${column.javaField};
38 34 #else##情况二,非 Between 的时间
39 35 #columnTpl('', '')
40 36 #end
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm
... ... @@ -36,7 +36,7 @@ import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePack
36 36 .likeIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
37 37 #end
38 38 #if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候
39   - .betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.getBegin${JavaField}(), reqVO.getEnd${JavaField}())
  39 + .betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
40 40 #end
41 41 #end
42 42 #end
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm
... ... @@ -51,8 +51,7 @@ import static org.mockito.Mockito.*;
51 51 #if (${column.listOperation})
52 52 #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写
53 53 #if (${column.listOperationCondition} == "BETWEEN")## BETWEEN 的情况
54   - reqVO.setBegin${JavaField}(null);
55   - reqVO.setEnd${JavaField}(null);
  54 + reqVO.set${JavaField}((new Date[]{}));
56 55 #else
57 56 reqVO.set$JavaField(null);
58 57 #end
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm
... ... @@ -30,9 +30,9 @@
30 30 <el-date-picker clearable v-model="queryParams.${javaField}" type="date" value-format="yyyy-MM-dd" placeholder="选择${comment}" />
31 31 </el-form-item>
32 32 #else## 范围
33   - <el-form-item label="${comment}">
34   - <el-date-picker v-model="dateRange${AttrName}" style="width: 240px" value-format="yyyy-MM-dd"
35   - type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
  33 + <el-form-item label="${comment}" prop="${javaField}">
  34 + <el-date-picker v-model="queryParams.${javaField}" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
  35 + range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
36 36 </el-form-item>
37 37 #end
38 38 #end
... ... @@ -219,22 +219,19 @@ export default {
219 219 title: "",
220 220 // 是否显示弹出层
221 221 open: false,
222   - #foreach ($column in $columns)## 时间范围
223   - #if ($column.listOperation)
224   - #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
225   - #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
226   - dateRange${AttrName}: [],
227   - #end
228   - #end
229   - #end
230 222 // 查询参数
231 223 queryParams: {
232 224 pageNo: 1,
233 225 pageSize: 10,
234 226 #foreach ($column in $columns)
235   - #if ($column.listOperation && $column.listOperationCondition != 'BETWEEN')
  227 + #if ($column.listOperation)
  228 + #if ($column.listOperationCondition != 'BETWEEN')
236 229 $column.javaField: null,
237 230 #end
  231 + #if ($column.htmlType == "datetime" || $column.listOperationCondition == "BETWEEN")
  232 + $column.javaField: [],
  233 + #end
  234 + #end
238 235 #end
239 236 },
240 237 // 表单参数
... ... @@ -257,18 +254,8 @@ export default {
257 254 /** 查询列表 */
258 255 getList() {
259 256 this.loading = true;
260   - // 处理查询参数
261   - let params = {...this.queryParams};
262   - #foreach ($column in $columns)
263   - #if ($column.listOperation)
264   - #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
265   - #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
266   - this.addBeginAndEndTime(params, this.dateRange${AttrName}, '${column.javaField}');
267   - #end
268   - #end
269   - #end
270 257 // 执行查询
271   - get${simpleClassName}Page(params).then(response => {
  258 + get${simpleClassName}Page(this.queryParams).then(response => {
272 259 this.list = response.data.list;
273 260 this.total = response.data.total;
274 261 this.loading = false;
... ... @@ -301,14 +288,6 @@ export default {
301 288 },
302 289 /** 重置按钮操作 */
303 290 resetQuery() {
304   - #foreach ($column in $columns)
305   - #if ($column.listOperation)
306   - #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
307   - #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
308   - this.dateRange${AttrName} = [];
309   - #end
310   - #end
311   - #end
312 291 this.resetForm("queryForm");
313 292 this.handleQuery();
314 293 },
... ... @@ -377,15 +356,6 @@ export default {
377 356 let params = {...this.queryParams};
378 357 params.pageNo = undefined;
379 358 params.pageSize = undefined;
380   - #foreach ($column in $columns)
381   - #if ($column.listOperation)
382   - #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
383   - #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
384   - this.addBeginAndEndTime(params, this.dateRange${AttrName}, '${column.javaField}');
385   - #end
386   - #end
387   - #end
388   - // 执行导出
389 359 this.#[[$modal]]#.confirm('是否确认导出所有${table.classComment}数据项?').then(() => {
390 360 this.exportLoading = true;
391 361 return export${simpleClassName}Excel(params);
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm 0 → 100644
  1 +import { useAxios } from '@/hooks/web/useAxios'
  2 +import { ${simpleClassName}VO,${simpleClassName}PageReqVO,${simpleClassName}ExcelReqVO } from './types'
  3 +
  4 +const request = useAxios()
  5 +
  6 +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}")
  7 +// 查询${table.classComment}列表
  8 +export const getPostPageApi = async (params: ${simpleClassName}PageReqVO) => {
  9 + return await request.get({ url: '${baseURL}/page', params })
  10 +}
  11 +
  12 +// 查询${table.classComment}详情
  13 +export const getPostApi = async (id: number) => {
  14 + return await request.get({ url: '${baseURL}/get?id=' + id })
  15 +}
  16 +
  17 +// 新增${table.classComment}
  18 +export const createPostApi = async (data: ${simpleClassName}VO) => {
  19 + return await request.post({ url: '${baseURL}/create', data })
  20 +}
  21 +
  22 +// 修改${table.classComment}
  23 +export const updatePostApi = async (data: ${simpleClassName}VO) => {
  24 + return await request.put({ url: '${baseURL}/update', data })
  25 +}
  26 +
  27 +// 删除${table.classComment}
  28 +export const deletePostApi = async (id: number) => {
  29 + return await request.delete({ url: '${baseURL}/delete?id=' + id })
  30 +}
  31 +
  32 +// 导出${table.classComment} Excel
  33 +export const exportPostApi = async (params: ${simpleClassName}ExcelReqVO) => {
  34 + return await request.download({ url: '${baseURL}/export-excel', params })
  35 +}
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/api/types.ts.vm 0 → 100644
  1 +export type ${simpleClassName}VO = {
  2 +#foreach ($column in $columns)
  3 +#if ($column.createOperation || $column.updateOperation)
  4 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
  5 + ${column.javaField}: number
  6 +#else
  7 + ${column.javaField}: ${column.javaType.toLowerCase()}
  8 +#end
  9 +#end
  10 +#end
  11 +}
  12 +
  13 +export type ${simpleClassName}PageReqVO = {
  14 +#foreach ($column in $columns)
  15 +#if (${column.listOperation})##查询操作
  16 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
  17 + ${column.javaField}: number
  18 +#else
  19 + ${column.javaField}: ${column.javaType.toLowerCase()}
  20 +#end
  21 +#end
  22 +#end
  23 +}
  24 +
  25 +export type ${simpleClassName}ExcelReqVO = {
  26 +#foreach ($column in $columns)
  27 +#if (${column.listOperation})##查询操作
  28 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
  29 + ${column.javaField}: number
  30 +#else
  31 + ${column.javaField}: ${column.javaType.toLowerCase()}
  32 +#end
  33 +#end
  34 +#end
  35 +}
0 36 \ No newline at end of file
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm 0 → 100644
  1 +import { reactive } from 'vue'
  2 +import { useI18n } from '@/hooks/web/useI18n'
  3 +import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
  4 +import { DICT_TYPE } from '@/utils/dict'
  5 +const { t } = useI18n() // 国际化
  6 +// 表单校验
  7 +export const rules = reactive({
  8 +#foreach ($column in $columns)
  9 +#if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
  10 +#set($comment=$column.columnComment)
  11 + $column.javaField: [{ required: true, message: "${comment}不能为空", trigger: #if($column.htmlType == "select")"change"#else"blur"#end }],
  12 +#end
  13 +#end
  14 +})
  15 +// CrudSchema
  16 +const crudSchemas = reactive<CrudSchema[]>([
  17 +#foreach($column in $columns)
  18 + #if ($column.listOperation || $column.listOperationResult || $column.createOperation || $column.updateOperation)
  19 + #set ($dictType = $column.dictType)
  20 + {
  21 + label: '${column.columnComment}',
  22 + field: '${column.javaField}',
  23 + #if ("" != $dictType)## 有数据字典
  24 + dictType: DICT_TYPE.$dictType.toUpperCase(),
  25 + #end
  26 + #if($column.primaryKey)
  27 + type: 'index',
  28 + form: {
  29 + show: false
  30 + },
  31 + detail: {
  32 + show: false
  33 + }
  34 + #else
  35 + #if (!$column.createOperation && !$column.updateOperation)
  36 + form: {
  37 + false
  38 + },
  39 + #elseif(!("" != $column.dictType))
  40 + form: {
  41 + show: true,
  42 + #if ($column.htmlType == "datetime")## 时间框
  43 + component: 'DatePicker',
  44 + componentProps: {
  45 + type: 'datetime',
  46 + valueFormat: 'YYYY-MM-DD HH:mm:ss'
  47 + }
  48 + #elseif($column.htmlType == "editor")## 文本编辑器
  49 + component: 'Editor',
  50 + colProps: {
  51 + span: 24
  52 + },
  53 + componentProps: {
  54 + valueHtml: ''
  55 + }
  56 + #elseif($column.htmlType == "textarea")## 文本框
  57 + component: 'Input',
  58 + componentProps: {
  59 + type: 'textarea',
  60 + rows: 4
  61 + },
  62 + colProps: {
  63 + span: 24
  64 + }
  65 + #end
  66 + },
  67 + #end
  68 + #if ($column.listOperationResult)
  69 + search: {
  70 + #if($column.htmlType == "input")
  71 + show: true
  72 + #else
  73 + #if($column.htmlType == "datetime")
  74 + show: true,
  75 + component: 'DatePicker',
  76 + componentProps: {
  77 + type: 'datetimerange',
  78 + valueFormat: 'YYYY-MM-DD HH:mm:ss'
  79 + }
  80 + #elseif($column.htmlType == "select" || $column.htmlType == "radio")
  81 + #if ("" == $dictType)## 没有数据字典
  82 + show: true,
  83 + component: 'Select',
  84 + componentProps: {
  85 + option: [{'','请选择字典生成'}]
  86 + }
  87 + #else
  88 + show: true
  89 + #end
  90 + #end
  91 + #end
  92 + }
  93 + #end
  94 + #end
  95 + },
  96 + #end
  97 +#end
  98 + {
  99 + label: t('table.action'),
  100 + field: 'action',
  101 + width: '240px',
  102 + form: {
  103 + show: false
  104 + },
  105 + detail: {
  106 + show: false
  107 + }
  108 + }
  109 +])
  110 +
  111 +export const { allSchemas } = useCrudSchemas(crudSchemas)
0 112 \ No newline at end of file
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm 0 → 100644
  1 +<script setup lang="ts">
  2 + import { ref, unref } from 'vue'
  3 + import dayjs from 'dayjs'
  4 + import { ElMessage } from 'element-plus'
  5 + import { DICT_TYPE } from '@/utils/dict'
  6 + import { useTable } from '@/hooks/web/useTable'
  7 + import { useI18n } from '@/hooks/web/useI18n'
  8 + import { FormExpose } from '@/components/Form'
  9 + import type { ${simpleClassName}VO } from '@/api/system/post/types'
  10 + import { rules, allSchemas } from './post.data'
  11 + import * as ${simpleClassName}Api from '@/api/system/post'
  12 + const { t } = useI18n() // 国际化
  13 +
  14 + // ========== 列表相关 ==========
  15 + const { register, tableObject, methods } = useTable<${simpleClassName}VO>({
  16 + getListApi: ${simpleClassName}Api.get${simpleClassName}PageApi,
  17 + delListApi: ${simpleClassName}Api.delete${simpleClassName}Api,
  18 + exportListApi: ${simpleClassName}Api.export${simpleClassName}Api
  19 + })
  20 + const { getList, setSearchParams, delList, exportList } = methods
  21 +
  22 + // 导出操作
  23 + const handleExport = async () => {
  24 + await exportList('数据.xls')
  25 + }
  26 +
  27 + // ========== CRUD 相关 ==========
  28 + const actionLoading = ref(false) // 遮罩层
  29 + const actionType = ref('') // 操作按钮的类型
  30 + const dialogVisible = ref(false) // 是否显示弹出层
  31 + const dialogTitle = ref('edit') // 弹出层标题
  32 + const formRef = ref<FormExpose>() // 表单 Ref
  33 +
  34 + // 设置标题
  35 + const setDialogTile = (type: string) => {
  36 + dialogTitle.value = t('action.' + type)
  37 + actionType.value = type
  38 + dialogVisible.value = true
  39 + }
  40 +
  41 + // 新增操作
  42 + const handleCreate = () => {
  43 + setDialogTile('create')
  44 + // 重置表单
  45 + unref(formRef)?.getElFormRef()?.resetFields()
  46 + }
  47 +
  48 + // 修改操作
  49 + const handleUpdate = async (row: ${simpleClassName}VO) => {
  50 + setDialogTile('update')
  51 + // 设置数据
  52 + const res = await ${simpleClassName}Api.get${simpleClassName}Api(row.id)
  53 + unref(formRef)?.setValues(res)
  54 + }
  55 +
  56 + // 提交按钮
  57 + const submitForm = async () => {
  58 + actionLoading.value = true
  59 + // 提交请求
  60 + try {
  61 + const data = unref(formRef)?.formModel as ${simpleClassName}VO
  62 + if (actionType.value === 'create') {
  63 + await ${simpleClassName}Api.create${simpleClassName}Api(data)
  64 + ElMessage.success(t('common.createSuccess'))
  65 + } else {
  66 + await ${simpleClassName}Api.update${simpleClassName}Api(data)
  67 + ElMessage.success(t('common.updateSuccess'))
  68 + }
  69 + // 操作成功,重新加载列表
  70 + dialogVisible.value = false
  71 + await getList()
  72 + } finally {
  73 + actionLoading.value = false
  74 + }
  75 + }
  76 +
  77 + // 删除操作
  78 + const handleDelete = (row: ${simpleClassName}VO) => {
  79 + delList(row.id, false)
  80 + }
  81 +
  82 + // ========== 详情相关 ==========
  83 + const detailRef = ref() // 详情 Ref
  84 +
  85 + // 详情操作
  86 + const handleDetail = async (row: ${simpleClassName}VO) => {
  87 + // 设置数据
  88 + detailRef.value = row
  89 + setDialogTile('detail')
  90 + }
  91 +
  92 + // ========== 初始化 ==========
  93 + getList()
  94 +</script>
  95 +
  96 +<template>
  97 + <!-- 搜索工作区 -->
  98 + <ContentWrap>
  99 + <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
  100 + </ContentWrap>
  101 + <ContentWrap>
  102 + <!-- 操作工具栏 -->
  103 + <div class="mb-10px">
  104 + <el-button type="primary" v-hasPermi="['${permissionPrefix}:create']" @click="handleCreate">
  105 + <Icon icon="ep:zoom-in" class="mr-5px" /> {{ t('action.add') }}
  106 + </el-button>
  107 + <el-button
  108 + type="warning"
  109 + v-hasPermi="['${permissionPrefix}:export']"
  110 + :loading="tableObject.exportLoading"
  111 + @click="handleExport"
  112 + >
  113 + <Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
  114 + </el-button>
  115 + </div>
  116 + <!-- 列表 -->
  117 + <Table
  118 + :columns="allSchemas.tableColumns"
  119 + :selection="false"
  120 + :data="tableObject.tableList"
  121 + :loading="tableObject.loading"
  122 + :pagination="{
  123 + total: tableObject.total
  124 + }"
  125 + v-model:pageSize="tableObject.pageSize"
  126 + v-model:currentPage="tableObject.currentPage"
  127 + @register="register"
  128 + >
  129 +#foreach($column in $columns)
  130 +#if ($column.listOperationResult)
  131 + #set ($dictType=$column.dictType)
  132 + #if ($column.javaType == "Date")## 时间类型
  133 + <template #${column.javaField}="{ row }">
  134 + <span>{{ dayjs(row.${column.javaField}).format('YYYY-MM-DD HH:mm:ss') }}</span>
  135 + </template>
  136 + #elseif("" != $column.dictType)## 数据字典
  137 + <template #${column.javaField}="{ row }">
  138 + <DictTag :type="DICT_TYPE.$dictType.toUpperCase()" :value="row.${column.javaField}" />
  139 + </template>
  140 + #end
  141 +#end
  142 +#end
  143 + <template #action="{ row }">
  144 + <el-button
  145 + link
  146 + type="primary"
  147 + v-hasPermi="['${permissionPrefix}:update']"
  148 + @click="handleUpdate(row)"
  149 + >
  150 + <Icon icon="ep:edit" class="mr-1px" /> {{ t('action.edit') }}
  151 + </el-button>
  152 + <el-button
  153 + link
  154 + type="primary"
  155 + v-hasPermi="['${permissionPrefix}:update']"
  156 + @click="handleDetail(row)"
  157 + >
  158 + <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }}
  159 + </el-button>
  160 + <el-button
  161 + link
  162 + type="primary"
  163 + v-hasPermi="['${permissionPrefix}:delete']"
  164 + @click="handleDelete(row)"
  165 + >
  166 + <Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }}
  167 + </el-button>
  168 + </template>
  169 + </Table>
  170 + </ContentWrap>
  171 +
  172 + <Dialog v-model="dialogVisible" :title="dialogTitle">
  173 + <!-- 对话框(添加 / 修改) -->
  174 + <Form
  175 + v-if="['create', 'update'].includes(actionType)"
  176 + :schema="allSchemas.formSchema"
  177 + :rules="rules"
  178 + ref="formRef"
  179 + />
  180 + <!-- 对话框(详情) -->
  181 + <Descriptions
  182 + v-if="actionType === 'detail'"
  183 + :schema="allSchemas.detailSchema"
  184 + :data="detailRef"
  185 + >
  186 +#foreach($column in $columns)
  187 + #if ($column.listOperationResult)
  188 + #set ($dictType=$column.dictType)
  189 + #if ($column.javaType == "Date")## 时间类型
  190 + <template #${column.javaField}="{ row }">
  191 + <span>{{ dayjs(row.${column.javaField}).format('YYYY-MM-DD HH:mm:ss') }}</span>
  192 + </template>
  193 + #elseif("" != $column.dictType)## 数据字典
  194 + <template #${column.javaField}="{ row }">
  195 + <DictTag :type="DICT_TYPE.$dictType.toUpperCase()" :value="row.${column.javaField}" />
  196 + </template>
  197 + #end
  198 + #end
  199 +#end
  200 + </Descriptions>
  201 + <!-- 操作按钮 -->
  202 + <template #footer>
  203 + <el-button
  204 + v-if="['create', 'update'].includes(actionType)"
  205 + type="primary"
  206 + :loading="actionLoading"
  207 + @click="submitForm"
  208 + >
  209 + {{ t('action.save') }}
  210 + </el-button>
  211 + <el-button @click="dialogVisible = false">{{ t('dialog.close') }}</el-button>
  212 + </template>
  213 + </Dialog>
  214 +</template>
... ...
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceTest.java
... ... @@ -19,6 +19,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
19 19 import org.springframework.context.annotation.Import;
20 20  
21 21 import javax.annotation.Resource;
  22 +import java.util.Date;
22 23 import java.util.List;
23 24 import java.util.function.Consumer;
24 25  
... ... @@ -180,8 +181,7 @@ public class ConfigServiceTest extends BaseDbUnitTest {
180 181 reqVO.setName("艿");
181 182 reqVO.setKey("nai");
182 183 reqVO.setType(ConfigTypeEnum.SYSTEM.getType());
183   - reqVO.setBeginTime(buildTime(2021, 1, 15));
184   - reqVO.setEndTime(buildTime(2021, 2, 15));
  184 + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 15),buildTime(2021, 2, 15)}));
185 185  
186 186 // 调用
187 187 PageResult<ConfigDO> pageResult = configService.getConfigPage(reqVO);
... ... @@ -214,8 +214,7 @@ public class ConfigServiceTest extends BaseDbUnitTest {
214 214 reqVO.setName("艿");
215 215 reqVO.setKey("nai");
216 216 reqVO.setType(ConfigTypeEnum.SYSTEM.getType());
217   - reqVO.setBeginTime(buildTime(2021, 1, 15));
218   - reqVO.setEndTime(buildTime(2021, 2, 15));
  217 + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 15),buildTime(2021, 2, 15)}));
219 218  
220 219 // 调用
221 220 List<ConfigDO> list = configService.getConfigList(reqVO);
... ...
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImplTest.java
... ... @@ -22,6 +22,7 @@ import org.springframework.context.annotation.Import;
22 22 import javax.annotation.Resource;
23 23 import javax.validation.Validator;
24 24 import java.io.Serializable;
  25 +import java.util.Date;
25 26 import java.util.Map;
26 27  
27 28 import static cn.hutool.core.util.RandomUtil.randomEle;
... ... @@ -216,8 +217,7 @@ public class FileConfigServiceImplTest extends BaseDbUnitTest {
216 217 FileConfigPageReqVO reqVO = new FileConfigPageReqVO();
217 218 reqVO.setName("芋道");
218 219 reqVO.setStorage(FileStorageEnum.LOCAL.getStorage());
219   - reqVO.setBeginCreateTime(buildTime(2022, 11, 10));
220   - reqVO.setEndCreateTime(buildTime(2022, 11, 12));
  220 + reqVO.setCreateTime((new Date[]{buildTime(2022, 11, 10),buildTime(2022, 11, 12)}));
221 221  
222 222 // 调用
223 223 PageResult<FileConfigDO> pageResult = fileConfigService.getFileConfigPage(reqVO);
... ...
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceTest.java
... ... @@ -15,6 +15,8 @@ import org.springframework.context.annotation.Import;
15 15  
16 16 import javax.annotation.Resource;
17 17  
  18 +import java.util.Date;
  19 +
18 20 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
19 21 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
20 22 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
... ... @@ -58,8 +60,7 @@ public class FileServiceTest extends BaseDbUnitTest {
58 60 FilePageReqVO reqVO = new FilePageReqVO();
59 61 reqVO.setPath("yunai");
60 62 reqVO.setType("jp");
61   - reqVO.setBeginCreateTime(buildTime(2021, 1, 10));
62   - reqVO.setEndCreateTime(buildTime(2021, 1, 20));
  63 + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 10), buildTime(2021, 1, 20)}));
63 64  
64 65 // 调用
65 66 PageResult<FileDO> pageResult = fileService.getFilePage(reqVO);
... ...
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImplTest.java
... ... @@ -77,8 +77,7 @@ public class ApiAccessLogServiceImplTest extends BaseDbUnitTest {
77 77 reqVO.setUserType(userType);
78 78 reqVO.setApplicationName(applicationName);
79 79 reqVO.setRequestUrl(requestUrl);
80   - reqVO.setBeginBeginTime(buildTime(2021, 3, 12));
81   - reqVO.setEndBeginTime(buildTime(2021, 3, 14));
  80 + reqVO.setBeginTime((new Date[]{buildTime(2021, 3, 12),buildTime(2021, 3, 14)}));
82 81 reqVO.setDuration(duration);
83 82 reqVO.setResultCode(resultCode);
84 83  
... ... @@ -135,8 +134,7 @@ public class ApiAccessLogServiceImplTest extends BaseDbUnitTest {
135 134 reqVO.setUserType(userType);
136 135 reqVO.setApplicationName(applicationName);
137 136 reqVO.setRequestUrl(requestUrl);
138   - reqVO.setBeginBeginTime(buildTime(2021, 3, 12));
139   - reqVO.setEndBeginTime(buildTime(2021, 3, 14));
  137 + reqVO.setBeginTime((new Date[]{buildTime(2021, 3, 12),buildTime(2021, 3, 14)}));
140 138 reqVO.setDuration(duration);
141 139 reqVO.setResultCode(resultCode);
142 140  
... ...
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImplTest.java
... ... @@ -77,8 +77,7 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest {
77 77 reqVO.setUserType(userType);
78 78 reqVO.setApplicationName(applicationName);
79 79 reqVO.setRequestUrl(requestUrl);
80   - reqVO.setBeginExceptionTime(buildTime(2021, 3, 12));
81   - reqVO.setEndExceptionTime(buildTime(2021, 3, 14));
  80 + reqVO.setExceptionTime((new Date[]{buildTime(2021, 3, 12),buildTime(2021, 3, 14)}));
82 81 reqVO.setProcessStatus(progressStatus);
83 82  
84 83 // 调用service方法
... ... @@ -130,8 +129,7 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest {
130 129 reqVO.setUserType(userType);
131 130 reqVO.setApplicationName(applicationName);
132 131 reqVO.setRequestUrl(requestUrl);
133   - reqVO.setBeginExceptionTime(buildTime(2021, 3, 12));
134   - reqVO.setEndExceptionTime(buildTime(2021, 3, 14));
  132 + reqVO.setExceptionTime((new Date[]{buildTime(2021, 3, 12),buildTime(2021, 3, 14)}));
135 133 reqVO.setProcessStatus(progressStatus);
136 134  
137 135 // 调用service方法
... ...
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/test/TestDemoServiceImplTest.java
... ... @@ -14,8 +14,10 @@ import org.junit.jupiter.api.Test;
14 14 import org.springframework.context.annotation.Import;
15 15  
16 16 import javax.annotation.Resource;
  17 +import java.util.Date;
17 18 import java.util.List;
18 19  
  20 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
19 21 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
20 22 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
21 23 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
... ... @@ -132,8 +134,7 @@ public class TestDemoServiceImplTest extends BaseDbUnitTest {
132 134 reqVO.setType(1);
133 135 reqVO.setCategory(2);
134 136 reqVO.setRemark("哈哈哈");
135   - reqVO.setBeginCreateTime(DateUtils.buildTime(2021, 11, 10));
136   - reqVO.setEndCreateTime(DateUtils.buildTime(2021, 11, 12));
  137 + reqVO.setCreateTime((new Date[]{buildTime(2021, 11, 10),buildTime(2021, 11, 12)}));
137 138  
138 139 // 调用
139 140 PageResult<TestDemoDO> pageResult = testDemoService.getTestDemoPage(reqVO);
... ... @@ -174,8 +175,7 @@ public class TestDemoServiceImplTest extends BaseDbUnitTest {
174 175 reqVO.setType(1);
175 176 reqVO.setCategory(2);
176 177 reqVO.setRemark("哈哈哈");
177   - reqVO.setBeginCreateTime(DateUtils.buildTime(2021, 11, 10));
178   - reqVO.setEndCreateTime(DateUtils.buildTime(2021, 11, 12));
  178 + reqVO.setCreateTime((new Date[]{buildTime(2021, 11, 10),buildTime(2021, 11, 12)}));
179 179  
180 180 // 调用
181 181 List<TestDemoDO> list = testDemoService.getTestDemoList(reqVO);
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/activity/vo/ActivityPageReqVO.java
... ... @@ -29,36 +29,20 @@ public class ActivityPageReqVO extends PageParam {
29 29 private Integer status;
30 30  
31 31 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
32   - @ApiModelProperty(value = "开始开始时间")
33   - private Date beginStartTime;
  32 + @ApiModelProperty(value = "开始时间")
  33 + private Date[] startTime;
34 34  
35 35 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
36   - @ApiModelProperty(value = "结束开始时间")
37   - private Date endStartTime;
  36 + @ApiModelProperty(value = "结束时间")
  37 + private Date[] endTime;
38 38  
39 39 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
40   - @ApiModelProperty(value = "开始结束时间")
41   - private Date beginEndTime;
  40 + @ApiModelProperty(value = "失效时间")
  41 + private Date[] invalidTime;
42 42  
43 43 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
44   - @ApiModelProperty(value = "结束结束时间")
45   - private Date endEndTime;
46   -
47   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
48   - @ApiModelProperty(value = "开始失效时间")
49   - private Date beginInvalidTime;
50   -
51   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
52   - @ApiModelProperty(value = "结束失效时间")
53   - private Date endInvalidTime;
54   -
55   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
56   - @ApiModelProperty(value = "开始删除时间")
57   - private Date beginDeleteTime;
58   -
59   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
60   - @ApiModelProperty(value = "结束删除时间")
61   - private Date endDeleteTime;
  44 + @ApiModelProperty(value = "删除时间")
  45 + private Date[] deleteTime;
62 46  
63 47 @ApiModelProperty(value = "限制折扣字符串,使用 JSON 序列化成字符串存储")
64 48 private String timeLimitedDiscount;
... ... @@ -67,11 +51,7 @@ public class ActivityPageReqVO extends PageParam {
67 51 private String fullPrivilege;
68 52  
69 53 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
70   - @ApiModelProperty(value = "开始创建时间")
71   - private Date beginCreateTime;
72   -
73   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
74   - @ApiModelProperty(value = "结束创建时间")
75   - private Date endCreateTime;
  54 + @ApiModelProperty(value = "创建时间")
  55 + private Date[] createTime;
76 56  
77 57 }
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/banner/vo/BannerPageReqVO.java
... ... @@ -32,11 +32,7 @@ public class BannerPageReqVO extends PageParam {
32 32 private Integer status;
33 33  
34 34 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
35   - @ApiModelProperty(value = "开始创建时间")
36   - private Date beginCreateTime;
37   -
38   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
39   - @ApiModelProperty(value = "结束创建时间")
40   - private Date endCreateTime;
  35 + @ApiModelProperty(value = "创建时间")
  36 + private Date[] createTime;
41 37  
42 38 }
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/dal/mysql/activity/ActivityMapper.java
... ... @@ -22,13 +22,13 @@ public interface ActivityMapper extends BaseMapperX&lt;ActivityDO&gt; {
22 22 .eqIfPresent(ActivityDO::getTitle, reqVO.getTitle())
23 23 .eqIfPresent(ActivityDO::getActivityType, reqVO.getActivityType())
24 24 .eqIfPresent(ActivityDO::getStatus, reqVO.getStatus())
25   - .betweenIfPresent(ActivityDO::getStartTime, reqVO.getBeginStartTime(), reqVO.getEndStartTime())
26   - .betweenIfPresent(ActivityDO::getEndTime, reqVO.getBeginEndTime(), reqVO.getEndEndTime())
27   - .betweenIfPresent(ActivityDO::getInvalidTime, reqVO.getBeginInvalidTime(), reqVO.getEndInvalidTime())
28   - .betweenIfPresent(ActivityDO::getDeleteTime, reqVO.getBeginDeleteTime(), reqVO.getEndDeleteTime())
  25 + .betweenIfPresent(ActivityDO::getStartTime, reqVO.getStartTime())
  26 + .betweenIfPresent(ActivityDO::getEndTime, reqVO.getEndTime())
  27 + .betweenIfPresent(ActivityDO::getInvalidTime, reqVO.getInvalidTime())
  28 + .betweenIfPresent(ActivityDO::getDeleteTime, reqVO.getDeleteTime())
29 29 .eqIfPresent(ActivityDO::getTimeLimitedDiscount, reqVO.getTimeLimitedDiscount())
30 30 .eqIfPresent(ActivityDO::getFullPrivilege, reqVO.getFullPrivilege())
31   - .betweenIfPresent(ActivityDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  31 + .betweenIfPresent(ActivityDO::getCreateTime, reqVO.getCreateTime())
32 32 .orderByDesc(ActivityDO::getId));
33 33 }
34 34  
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/dal/mysql/banner/BannerMapper.java
... ... @@ -19,8 +19,7 @@ public interface BannerMapper extends BaseMapperX&lt;BannerDO&gt; {
19 19 return selectPage(reqVO, new LambdaQueryWrapperX<BannerDO>()
20 20 .likeIfPresent(BannerDO::getTitle, reqVO.getTitle())
21 21 .eqIfPresent(BannerDO::getStatus, reqVO.getStatus())
22   - .betweenIfPresent(BannerDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
23   - .betweenIfPresent(BannerDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  22 + .betweenIfPresent(BannerDO::getCreateTime, reqVO.getCreateTime())
24 23 .orderByDesc(BannerDO::getSort));
25 24 }
26 25  
... ...
yudao-module-mall/yudao-module-market-biz/src/test/java/cn/iocoder/yudao/module/market/service/activity/ActivityServiceImplTest.java
... ... @@ -139,18 +139,13 @@ public class ActivityServiceImplTest extends BaseDbUnitTest {
139 139 reqVO.setTitle(null);
140 140 reqVO.setActivityType(null);
141 141 reqVO.setStatus(null);
142   - reqVO.setBeginStartTime(null);
143   - reqVO.setEndStartTime(null);
144   - reqVO.setBeginEndTime(null);
145   - reqVO.setEndEndTime(null);
146   - reqVO.setBeginInvalidTime(null);
147   - reqVO.setEndInvalidTime(null);
148   - reqVO.setBeginDeleteTime(null);
149   - reqVO.setEndDeleteTime(null);
  142 + reqVO.setStartTime(null);
  143 + reqVO.setEndTime(null);
  144 + reqVO.setInvalidTime(null);
  145 + reqVO.setDeleteTime(null);
150 146 reqVO.setTimeLimitedDiscount(null);
151 147 reqVO.setFullPrivilege(null);
152   - reqVO.setBeginCreateTime(null);
153   - reqVO.setEndCreateTime(null);
  148 + reqVO.setCreateTime(null);
154 149  
155 150 // 调用
156 151 PageResult<ActivityDO> pageResult = activityService.getActivityPage(reqVO);
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/vo/BrandExportReqVO.java
... ... @@ -22,11 +22,7 @@ public class BrandExportReqVO {
22 22 private Integer status;
23 23  
24 24 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
25   - @ApiModelProperty(value = "开始创建时间")
26   - private Date beginCreateTime;
27   -
28   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
29   - @ApiModelProperty(value = "结束创建时间")
30   - private Date endCreateTime;
  25 + @ApiModelProperty(value = "创建时间")
  26 + private Date[] createTime;
31 27  
32 28 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/vo/BrandPageReqVO.java
... ... @@ -24,11 +24,7 @@ public class BrandPageReqVO extends PageParam {
24 24 private Integer status;
25 25  
26 26 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - @ApiModelProperty(value = "开始创建时间")
28   - private Date beginCreateTime;
29   -
30   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
31   - @ApiModelProperty(value = "结束创建时间")
32   - private Date endCreateTime;
  27 + @ApiModelProperty(value = "创建时间")
  28 + private Date[] createTime;
33 29  
34 30 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/category/vo/CategoryExportReqVO.java
... ... @@ -20,11 +20,7 @@ public class CategoryExportReqVO {
20 20 private Integer status;
21 21  
22 22 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
23   - @ApiModelProperty(value = "开始创建时间")
24   - private Date beginCreateTime;
25   -
26   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - @ApiModelProperty(value = "结束创建时间")
28   - private Date endCreateTime;
  23 + @ApiModelProperty(value = "创建时间")
  24 + private Date[] createTime;
29 25  
30 26 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/category/vo/CategoryPageReqVO.java
... ... @@ -25,11 +25,7 @@ public class CategoryPageReqVO extends PageParam {
25 25 private Integer status;
26 26  
27 27 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
28   - @ApiModelProperty(value = "开始创建时间")
29   - private Date beginCreateTime;
30   -
31   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
32   - @ApiModelProperty(value = "结束创建时间")
33   - private Date endCreateTime;
  28 + @ApiModelProperty(value = "创建时间")
  29 + private Date[] createTime;
34 30  
35 31 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/category/vo/CategoryTreeListReqVO.java
... ... @@ -20,10 +20,6 @@ public class CategoryTreeListReqVO extends CategoryExportReqVO {
20 20 private Integer status;
21 21  
22 22 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
23   - @ApiModelProperty(value = "开始创建时间")
24   - private Date beginCreateTime;
25   -
26   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - @ApiModelProperty(value = "结束创建时间")
28   - private Date endCreateTime;
  23 + @ApiModelProperty(value = "创建时间")
  24 + private Date[] createTime;
29 25 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/ProductPropertyExportReqVO.java
... ... @@ -19,11 +19,7 @@ public class ProductPropertyExportReqVO {
19 19 private Integer status;
20 20  
21 21 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
22   - @ApiModelProperty(value = "开始创建时间")
23   - private Date beginCreateTime;
24   -
25   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
26   - @ApiModelProperty(value = "结束创建时间")
27   - private Date endCreateTime;
  22 + @ApiModelProperty(value = "创建时间")
  23 + private Date[] createTime;
28 24  
29 25 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/ProductPropertyPageReqVO.java
... ... @@ -21,11 +21,7 @@ public class ProductPropertyPageReqVO extends PageParam {
21 21 private Integer status;
22 22  
23 23 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
24   - @ApiModelProperty(value = "开始创建时间")
25   - private Date beginCreateTime;
26   -
27   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
28   - @ApiModelProperty(value = "结束创建时间")
29   - private Date endCreateTime;
  24 + @ApiModelProperty(value = "创建时间")
  25 + private Date[] createTime;
30 26  
31 27 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuExportReqVO.java
... ... @@ -37,11 +37,7 @@ public class ProductSkuExportReqVO {
37 37 private Integer status;
38 38  
39 39 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
40   - @ApiModelProperty(value = "开始创建时间")
41   - private Date beginCreateTime;
42   -
43   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
44   - @ApiModelProperty(value = "结束创建时间")
45   - private Date endCreateTime;
  40 + @ApiModelProperty(value = "创建时间")
  41 + private Date[] createTime;
46 42  
47 43 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuPageReqVO.java
... ... @@ -39,11 +39,7 @@ public class ProductSkuPageReqVO extends PageParam {
39 39 private Integer status;
40 40  
41 41 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
42   - @ApiModelProperty(value = "开始创建时间")
43   - private Date beginCreateTime;
44   -
45   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
46   - @ApiModelProperty(value = "结束创建时间")
47   - private Date endCreateTime;
  42 + @ApiModelProperty(value = "创建时间")
  43 + private Date[] createTime;
48 44  
49 45 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/SpuExportReqVO.java
... ... @@ -43,11 +43,7 @@ public class SpuExportReqVO {
43 43 private Boolean status;
44 44  
45 45 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
46   - @ApiModelProperty(value = "开始创建时间")
47   - private Date beginCreateTime;
48   -
49   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
50   - @ApiModelProperty(value = "结束创建时间")
51   - private Date endCreateTime;
  46 + @ApiModelProperty(value = "创建时间")
  47 + private Date[] createTime;
52 48  
53 49 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/SpuPageReqVO.java
... ... @@ -45,11 +45,7 @@ public class SpuPageReqVO extends PageParam {
45 45 private Boolean status;
46 46  
47 47 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
48   - @ApiModelProperty(value = "开始创建时间")
49   - private Date beginCreateTime;
50   -
51   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
52   - @ApiModelProperty(value = "结束创建时间")
53   - private Date endCreateTime;
  48 + @ApiModelProperty(value = "创建时间")
  49 + private Date[] createTime;
54 50  
55 51 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/brand/BrandMapper.java
... ... @@ -22,7 +22,7 @@ public interface BrandMapper extends BaseMapperX&lt;BrandDO&gt; {
22 22 .eqIfPresent(BrandDO::getCategoryId, reqVO.getCategoryId())
23 23 .likeIfPresent(BrandDO::getName, reqVO.getName())
24 24 .eqIfPresent(BrandDO::getStatus, reqVO.getStatus())
25   - .betweenIfPresent(BrandDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  25 + .betweenIfPresent(BrandDO::getCreateTime, reqVO.getCreateTime())
26 26 .orderByDesc(BrandDO::getId));
27 27 }
28 28  
... ... @@ -31,7 +31,7 @@ public interface BrandMapper extends BaseMapperX&lt;BrandDO&gt; {
31 31 .eqIfPresent(BrandDO::getCategoryId, reqVO.getCategoryId())
32 32 .likeIfPresent(BrandDO::getName, reqVO.getName())
33 33 .eqIfPresent(BrandDO::getStatus, reqVO.getStatus())
34   - .betweenIfPresent(BrandDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  34 + .betweenIfPresent(BrandDO::getCreateTime, reqVO.getCreateTime())
35 35 .orderByDesc(BrandDO::getId));
36 36 }
37 37  
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/category/CategoryMapper.java
... ... @@ -22,7 +22,7 @@ public interface CategoryMapper extends BaseMapperX&lt;CategoryDO&gt; {
22 22 return selectPage(reqVO, new LambdaQueryWrapperX<CategoryDO>()
23 23 .likeIfPresent(CategoryDO::getName, reqVO.getName())
24 24 .eqIfPresent(CategoryDO::getStatus, reqVO.getStatus())
25   - .betweenIfPresent(CategoryDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  25 + .betweenIfPresent(CategoryDO::getCreateTime, reqVO.getCreateTime())
26 26 .orderByDesc(CategoryDO::getId));
27 27 }
28 28  
... ... @@ -30,7 +30,7 @@ public interface CategoryMapper extends BaseMapperX&lt;CategoryDO&gt; {
30 30 return selectList(new LambdaQueryWrapperX<CategoryDO>()
31 31 .likeIfPresent(CategoryDO::getName, reqVO.getName())
32 32 .eqIfPresent(CategoryDO::getStatus, reqVO.getStatus())
33   - .betweenIfPresent(CategoryDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  33 + .betweenIfPresent(CategoryDO::getCreateTime, reqVO.getCreateTime())
34 34 .orderByDesc(CategoryDO::getId));
35 35 }
36 36  
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/property/ProductPropertyMapper.java
... ... @@ -21,7 +21,7 @@ public interface ProductPropertyMapper extends BaseMapperX&lt;ProductPropertyDO&gt; {
21 21 return selectPage(reqVO, new LambdaQueryWrapperX<ProductPropertyDO>()
22 22 .likeIfPresent(ProductPropertyDO::getName, reqVO.getName())
23 23 .eqIfPresent(ProductPropertyDO::getStatus, reqVO.getStatus())
24   - .betweenIfPresent(ProductPropertyDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  24 + .betweenIfPresent(ProductPropertyDO::getCreateTime, reqVO.getCreateTime())
25 25 .orderByDesc(ProductPropertyDO::getId));
26 26 }
27 27  
... ... @@ -29,7 +29,7 @@ public interface ProductPropertyMapper extends BaseMapperX&lt;ProductPropertyDO&gt; {
29 29 return selectList(new LambdaQueryWrapperX<ProductPropertyDO>()
30 30 .likeIfPresent(ProductPropertyDO::getName, reqVO.getName())
31 31 .eqIfPresent(ProductPropertyDO::getStatus, reqVO.getStatus())
32   - .betweenIfPresent(ProductPropertyDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  32 + .betweenIfPresent(ProductPropertyDO::getCreateTime, reqVO.getCreateTime())
33 33 .orderByDesc(ProductPropertyDO::getId));
34 34 }
35 35  
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java
... ... @@ -28,7 +28,7 @@ public interface ProductSkuMapper extends BaseMapperX&lt;ProductSkuDO&gt; {
28 28 .eqIfPresent(ProductSkuDO::getBarCode, reqVO.getBarCode())
29 29 .eqIfPresent(ProductSkuDO::getPicUrl, reqVO.getPicUrl())
30 30 .eqIfPresent(ProductSkuDO::getStatus, reqVO.getStatus())
31   - .betweenIfPresent(ProductSkuDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  31 + .betweenIfPresent(ProductSkuDO::getCreateTime, reqVO.getCreateTime())
32 32 .orderByDesc(ProductSkuDO::getId));
33 33 }
34 34  
... ... @@ -42,7 +42,7 @@ public interface ProductSkuMapper extends BaseMapperX&lt;ProductSkuDO&gt; {
42 42 .eqIfPresent(ProductSkuDO::getBarCode, reqVO.getBarCode())
43 43 .eqIfPresent(ProductSkuDO::getPicUrl, reqVO.getPicUrl())
44 44 .eqIfPresent(ProductSkuDO::getStatus, reqVO.getStatus())
45   - .betweenIfPresent(ProductSkuDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  45 + .betweenIfPresent(ProductSkuDO::getCreateTime, reqVO.getCreateTime())
46 46 .orderByDesc(ProductSkuDO::getId));
47 47 }
48 48  
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/spu/ProductSpuMapper.java
... ... @@ -29,7 +29,7 @@ public interface ProductSpuMapper extends BaseMapperX&lt;ProductSpuDO&gt; {
29 29 .eqIfPresent(ProductSpuDO::getPrice, reqVO.getPrice())
30 30 .eqIfPresent(ProductSpuDO::getQuantity, reqVO.getQuantity())
31 31 .eqIfPresent(ProductSpuDO::getStatus, reqVO.getStatus())
32   - .betweenIfPresent(ProductSpuDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  32 + .betweenIfPresent(ProductSpuDO::getCreateTime, reqVO.getCreateTime())
33 33 .orderByDesc(ProductSpuDO::getId));
34 34 }
35 35  
... ... @@ -45,7 +45,7 @@ public interface ProductSpuMapper extends BaseMapperX&lt;ProductSpuDO&gt; {
45 45 .eqIfPresent(ProductSpuDO::getPrice, reqVO.getPrice())
46 46 .eqIfPresent(ProductSpuDO::getQuantity, reqVO.getQuantity())
47 47 .eqIfPresent(ProductSpuDO::getStatus, reqVO.getStatus())
48   - .betweenIfPresent(ProductSpuDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  48 + .betweenIfPresent(ProductSpuDO::getCreateTime, reqVO.getCreateTime())
49 49 .orderByDesc(ProductSpuDO::getId));
50 50 }
51 51  
... ...
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/brand/BrandServiceImplTest.java
... ... @@ -127,8 +127,7 @@ public class BrandServiceImplTest extends BaseDbUnitTest {
127 127 reqVO.setCategoryId(null);
128 128 reqVO.setName(null);
129 129 reqVO.setStatus(null);
130   - reqVO.setBeginCreateTime(null);
131   - reqVO.setEndCreateTime(null);
  130 + reqVO.setCreateTime((new Date[]{}));
132 131  
133 132 // 调用
134 133 PageResult<BrandDO> pageResult = brandService.getBrandPage(reqVO);
... ... @@ -162,8 +161,7 @@ public class BrandServiceImplTest extends BaseDbUnitTest {
162 161 reqVO.setCategoryId(null);
163 162 reqVO.setName(null);
164 163 reqVO.setStatus(null);
165   - reqVO.setBeginCreateTime(null);
166   - reqVO.setEndCreateTime(null);
  164 + reqVO.setCreateTime((new Date[]{}));
167 165  
168 166 // 调用
169 167 List<BrandDO> list = brandService.getBrandList(reqVO);
... ...
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/category/CategoryServiceImplTest.java
... ... @@ -135,8 +135,7 @@ public class CategoryServiceImplTest extends BaseDbUnitTest {
135 135 CategoryPageReqVO reqVO = new CategoryPageReqVO();
136 136 reqVO.setName(null);
137 137 reqVO.setStatus(null);
138   - reqVO.setBeginCreateTime(null);
139   - reqVO.setEndCreateTime(null);
  138 + reqVO.setCreateTime(null);
140 139  
141 140 // 调用
142 141 PageResult<CategoryDO> pageResult = categoryService.getCategoryPage(reqVO);
... ... @@ -181,8 +180,7 @@ public class CategoryServiceImplTest extends BaseDbUnitTest {
181 180 CategoryExportReqVO reqVO = new CategoryExportReqVO();
182 181 reqVO.setName(null);
183 182 reqVO.setStatus(null);
184   - reqVO.setBeginCreateTime(null);
185   - reqVO.setEndCreateTime(null);
  183 + reqVO.setCreateTime(null);
186 184  
187 185 // 调用
188 186 List<CategoryDO> list = categoryService.getCategoryList(reqVO);
... ...
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/SkuServiceImplTest.java
... ... @@ -147,8 +147,7 @@ public class SkuServiceImplTest extends BaseDbUnitTest {
147 147 reqVO.setBarCode(null);
148 148 reqVO.setPicUrl(null);
149 149 reqVO.setStatus(null);
150   - reqVO.setBeginCreateTime(null);
151   - reqVO.setEndCreateTime(null);
  150 + reqVO.setCreateTime(null);
152 151  
153 152 // 调用
154 153 PageResult<ProductSkuDO> pageResult = ProductSkuService.getSkuPage(reqVO);
... ... @@ -202,8 +201,7 @@ public class SkuServiceImplTest extends BaseDbUnitTest {
202 201 reqVO.setBarCode(null);
203 202 reqVO.setPicUrl(null);
204 203 reqVO.setStatus(null);
205   - reqVO.setBeginCreateTime(null);
206   - reqVO.setEndCreateTime(null);
  204 + reqVO.setCreateTime(null);
207 205  
208 206 // 调用
209 207 List<ProductSkuDO> list = ProductSkuService.getSkuList(reqVO);
... ...
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java
... ... @@ -155,8 +155,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
155 155 reqVO.setPrice(null);
156 156 reqVO.setQuantity(null);
157 157 reqVO.setStatus(null);
158   - reqVO.setBeginCreateTime(null);
159   - reqVO.setEndCreateTime(null);
  158 + reqVO.setCreateTime(null);
160 159  
161 160 // 调用
162 161 PageResult<SpuRespVO> pageResult = spuService.getSpuPage(reqVO);
... ... @@ -218,8 +217,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
218 217 reqVO.setPrice(null);
219 218 reqVO.setQuantity(null);
220 219 reqVO.setStatus(null);
221   - reqVO.setBeginCreateTime(null);
222   - reqVO.setEndCreateTime(null);
  220 + reqVO.setCreateTime(null);
223 221  
224 222 // 调用
225 223 List<ProductSpuDO> list = spuService.getSpuList(reqVO);
... ...
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.java
... ... @@ -31,11 +31,7 @@ public class PayAppExportReqVO {
31 31 private String merchantName;
32 32  
33 33 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
34   - @ApiModelProperty(value = "开始创建时间")
35   - private Date beginCreateTime;
36   -
37   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
38   - @ApiModelProperty(value = "结束创建时间")
39   - private Date endCreateTime;
  34 + @ApiModelProperty(value = "创建时间")
  35 + private Date[] createTime;
40 36  
41 37 }
... ...