Commit 2a90038080f32e1c8e544109a27dcdd2a58b4ffb

Authored by 芋道源码
Committed by Gitee
2 parents f94435d5 2607f13a

!61 工作流的动态表单、流程模型、流程定义的提交

Merge pull request !61 from 芋道源码/feature/activiti
Showing 368 changed files with 19244 additions and 3313 deletions

Too many changes.

To preserve performance only 100 of 368 files are displayed.

sql/ruoyi-vue-pro.sql
@@ -11,13 +11,67 @@ @@ -11,13 +11,67 @@
11 Target Server Version : 80026 11 Target Server Version : 80026
12 File Encoding : 65001 12 File Encoding : 65001
13 13
14 - Date: 15/12/2021 13:07:09 14 + Date: 02/01/2022 19:25:42
15 */ 15 */
16 16
17 SET NAMES utf8mb4; 17 SET NAMES utf8mb4;
18 SET FOREIGN_KEY_CHECKS = 0; 18 SET FOREIGN_KEY_CHECKS = 0;
19 19
20 -- ---------------------------- 20 -- ----------------------------
  21 +-- Table structure for bpm_form
  22 +-- ----------------------------
  23 +DROP TABLE IF EXISTS `bpm_form`;
  24 +CREATE TABLE `bpm_form` (
  25 + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼–å·',
  26 + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表å•å',
  27 + `status` tinyint NOT NULL COMMENT 'å¼€å¯çжæ€',
  28 + `fields` varchar(5000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表å•项的数组',
  29 + `conf` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表å•çš„é…ç½®',
  30 + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  31 + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
  32 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  33 + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
  34 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
  35 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
  36 + PRIMARY KEY (`id`) USING BTREE
  37 +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='工作æµçš„表å•定义\n';
  38 +
  39 +-- ----------------------------
  40 +-- Records of bpm_form
  41 +-- ----------------------------
  42 +BEGIN;
  43 +INSERT INTO `bpm_form` VALUES (7, '啊1', 1, '[\"{\\\"label\\\":\\\"密ç \\\",\\\"tag\\\":\\\"el-input\\\",\\\"tagIcon\\\":\\\"password\\\",\\\"placeholder\\\":\\\"请输入密ç \\\",\\\"span\\\":24,\\\"show-password\\\":true,\\\"labelWidth\\\":null,\\\"style\\\":{\\\"width\\\":\\\"100%\\\"},\\\"clearable\\\":true,\\\"prepend\\\":\\\"\\\",\\\"append\\\":\\\"\\\",\\\"prefix-icon\\\":\\\"\\\",\\\"suffix-icon\\\":\\\"\\\",\\\"maxlength\\\":null,\\\"show-word-limit\\\":false,\\\"readonly\\\":false,\\\"disabled\\\":false,\\\"required\\\":true,\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/input\\\",\\\"formId\\\":102,\\\"renderKey\\\":1640930414772,\\\"layout\\\":\\\"colFormItem\\\",\\\"vModel\\\":\\\"field102\\\",\\\"defaultValue\\\":\\\"admin123\\\"}\",\"{\\\"label\\\":\\\"级è”选择\\\",\\\"tag\\\":\\\"el-cascader\\\",\\\"tagIcon\\\":\\\"cascader\\\",\\\"placeholder\\\":\\\"请选择级è”选择级è”选择级è”选择\\\",\\\"defaultValue\\\":[],\\\"span\\\":24,\\\"labelWidth\\\":null,\\\"style\\\":{\\\"width\\\":\\\"100%\\\"},\\\"props\\\":{\\\"props\\\":{\\\"multiple\\\":false}},\\\"show-all-levels\\\":true,\\\"disabled\\\":false,\\\"clearable\\\":true,\\\"filterable\\\":false,\\\"required\\\":true,\\\"options\\\":[{\\\"id\\\":1,\\\"value\\\":1,\\\"label\\\":\\\"选项1\\\",\\\"children\\\":[{\\\"id\\\":2,\\\"value\\\":2,\\\"label\\\":\\\"选项1-1\\\"}]}],\\\"dataType\\\":\\\"dynamic\\\",\\\"labelKey\\\":\\\"label\\\",\\\"valueKey\\\":\\\"value\\\",\\\"childrenKey\\\":\\\"children\\\",\\\"separator\\\":\\\"/\\\",\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/cascader\\\",\\\"formId\\\":101,\\\"renderKey\\\":1640960350991,\\\"layout\\\":\\\"colFormItem\\\",\\\"vModel\\\":\\\"field101\\\"}\",\"{\\\"label\\\":\\\"生活\\\",\\\"tag\\\":\\\"el-input\\\",\\\"tagIcon\\\":\\\"input\\\",\\\"placeholder\\\":\\\"请输入生活生活生活\\\",\\\"span\\\":24,\\\"labelWidth\\\":null,\\\"style\\\":{\\\"width\\\":\\\"100%\\\"},\\\"clearable\\\":true,\\\"prepend\\\":\\\"\\\",\\\"append\\\":\\\"\\\",\\\"prefix-icon\\\":\\\"\\\",\\\"suffix-icon\\\":\\\"\\\",\\\"maxlength\\\":null,\\\"show-word-limit\\\":false,\\\"readonly\\\":false,\\\"disabled\\\":false,\\\"required\\\":true,\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/input\\\",\\\"formId\\\":101,\\\"renderKey\\\":1640930388977,\\\"layout\\\":\\\"colFormItem\\\",\\\"vModel\\\":\\\"field101\\\",\\\"defaultValue\\\":\\\"admin\\\"}\"]', '{\"formRef\":\"elForm\",\"formModel\":\"formData\",\"size\":\"medium\",\"labelPosition\":\"right\",\"labelWidth\":100,\"formRules\":\"rules\",\"gutter\":15,\"disabled\":false,\"span\":24,\"formBtns\":true}', '哈哈哈哈biu', '1', '2021-12-31 10:10:13', '1', '2021-12-31 14:27:22', b'1');
  44 +INSERT INTO `bpm_form` VALUES (8, '啊哈哈', 0, '[]', '{\"formRef\":\"elForm\",\"formModel\":\"formData\",\"size\":\"medium\",\"labelPosition\":\"right\",\"labelWidth\":100,\"formRules\":\"rules\",\"gutter\":15,\"disabled\":false,\"span\":24,\"formBtns\":true}', '哈哈哈哈', '1', '2021-12-31 10:17:26', '1', '2021-12-31 14:27:20', b'1');
  45 +INSERT INTO `bpm_form` VALUES (9, '新增', 0, '[\"{\\\"label\\\":\\\"å•行文本\\\",\\\"tag\\\":\\\"el-input\\\",\\\"tagIcon\\\":\\\"input\\\",\\\"placeholder\\\":\\\"请输入å•行文本\\\",\\\"span\\\":24,\\\"labelWidth\\\":null,\\\"style\\\":{\\\"width\\\":\\\"100%\\\"},\\\"clearable\\\":true,\\\"prepend\\\":\\\"\\\",\\\"append\\\":\\\"\\\",\\\"prefix-icon\\\":\\\"\\\",\\\"suffix-icon\\\":\\\"\\\",\\\"maxlength\\\":null,\\\"show-word-limit\\\":false,\\\"readonly\\\":false,\\\"disabled\\\":false,\\\"required\\\":true,\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/input\\\",\\\"formId\\\":101,\\\"renderKey\\\":1640959561705,\\\"layout\\\":\\\"colFormItem\\\",\\\"vModel\\\":\\\"field101\\\"}\",\"{\\\"label\\\":\\\"å•选框组\\\",\\\"tag\\\":\\\"el-radio-group\\\",\\\"tagIcon\\\":\\\"radio\\\",\\\"span\\\":24,\\\"labelWidth\\\":null,\\\"style\\\":{},\\\"optionType\\\":\\\"default\\\",\\\"border\\\":false,\\\"size\\\":\\\"medium\\\",\\\"disabled\\\":false,\\\"required\\\":true,\\\"options\\\":[{\\\"label\\\":\\\"选项一\\\",\\\"value\\\":1},{\\\"label\\\":\\\"选项二\\\",\\\"value\\\":2}],\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/radio\\\",\\\"formId\\\":102,\\\"renderKey\\\":1640959563240,\\\"layout\\\":\\\"colFormItem\\\",\\\"vModel\\\":\\\"field102\\\"}\"]', '{\"formRef\":\"elForm\",\"formModel\":\"formData\",\"size\":\"medium\",\"labelPosition\":\"right\",\"labelWidth\":100,\"formRules\":\"rules\",\"gutter\":15,\"disabled\":false,\"span\":24,\"formBtns\":true}', '哈哈哈', '1', '2021-12-31 22:06:11', '1', '2021-12-31 14:27:19', b'1');
  46 +INSERT INTO `bpm_form` VALUES (10, '11333', 1, '[\"{\\\"label\\\":\\\"多行文本\\\",\\\"tag\\\":\\\"el-input\\\",\\\"tagIcon\\\":\\\"textarea\\\",\\\"type\\\":\\\"textarea\\\",\\\"placeholder\\\":\\\"请输入多行文本多行文本多行文本\\\",\\\"span\\\":24,\\\"labelWidth\\\":null,\\\"autosize\\\":{\\\"minRows\\\":4,\\\"maxRows\\\":4},\\\"style\\\":{\\\"width\\\":\\\"100%\\\"},\\\"maxlength\\\":null,\\\"show-word-limit\\\":false,\\\"readonly\\\":false,\\\"disabled\\\":false,\\\"required\\\":true,\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/input\\\",\\\"formId\\\":101,\\\"renderKey\\\":1640959720587,\\\"layout\\\":\\\"colFormItem\\\",\\\"vModel\\\":\\\"field101\\\",\\\"defaultValue\\\":\\\"1111\\\"}\",\"{\\\"label\\\":\\\"滑å—\\\",\\\"tag\\\":\\\"el-slider\\\",\\\"tagIcon\\\":\\\"slider\\\",\\\"defaultValue\\\":0,\\\"span\\\":24,\\\"labelWidth\\\":null,\\\"disabled\\\":false,\\\"required\\\":true,\\\"min\\\":0,\\\"max\\\":100,\\\"step\\\":1,\\\"show-stops\\\":false,\\\"range\\\":false,\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/slider\\\",\\\"formId\\\":101,\\\"renderKey\\\":1640959732257,\\\"layout\\\":\\\"colFormItem\\\",\\\"vModel\\\":\\\"field101\\\"}\"]', '{\"formRef\":\"elForm\",\"formModel\":\"formData\",\"size\":\"medium\",\"labelPosition\":\"left\",\"labelWidth\":100,\"formRules\":\"rules\",\"gutter\":15,\"disabled\":false,\"span\":24,\"formBtns\":true}', '222211', '1', '2021-12-31 22:08:45', '1', '2021-12-31 14:27:17', b'1');
  47 +INSERT INTO `bpm_form` VALUES (11, 'biubiu', 0, '[\"{\\\"__config__\\\":{\\\"label\\\":\\\"级è”选择\\\",\\\"url\\\":\\\"https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/cascaderList\\\",\\\"method\\\":\\\"get\\\",\\\"dataPath\\\":\\\"list\\\",\\\"dataConsumer\\\":\\\"options\\\",\\\"showLabel\\\":true,\\\"labelWidth\\\":null,\\\"tag\\\":\\\"el-cascader\\\",\\\"tagIcon\\\":\\\"cascader\\\",\\\"layout\\\":\\\"colFormItem\\\",\\\"defaultValue\\\":[1,2],\\\"dataType\\\":\\\"dynamic\\\",\\\"span\\\":24,\\\"required\\\":true,\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/cascader\\\",\\\"formId\\\":121,\\\"renderKey\\\":\\\"1211641097528784\\\"},\\\"options\\\":[{\\\"id\\\":1,\\\"value\\\":1,\\\"label\\\":\\\"动æ€é€‰é¡¹1\\\",\\\"children\\\":[{\\\"id\\\":2,\\\"value\\\":2,\\\"label\\\":\\\"动æ€é€‰é¡¹1-1\\\"}]}],\\\"placeholder\\\":\\\"请选择级è”选择\\\",\\\"style\\\":{\\\"width\\\":\\\"100%\\\"},\\\"props\\\":{\\\"props\\\":{\\\"multiple\\\":false,\\\"label\\\":\\\"label\\\",\\\"value\\\":\\\"value\\\",\\\"children\\\":\\\"children\\\"}},\\\"show-all-levels\\\":true,\\\"disabled\\\":false,\\\"clearable\\\":true,\\\"filterable\\\":false,\\\"separator\\\":\\\"/\\\",\\\"__vModel__\\\":\\\"field121\\\"}\",\"{\\\"__config__\\\":{\\\"label\\\":\\\"多选框组\\\",\\\"tag\\\":\\\"el-checkbox-group\\\",\\\"tagIcon\\\":\\\"checkbox\\\",\\\"defaultValue\\\":[],\\\"span\\\":24,\\\"showLabel\\\":true,\\\"labelWidth\\\":null,\\\"layout\\\":\\\"colFormItem\\\",\\\"optionType\\\":\\\"default\\\",\\\"required\\\":true,\\\"regList\\\":[],\\\"changeTag\\\":true,\\\"border\\\":false,\\\"document\\\":\\\"https://element.eleme.cn/#/zh-CN/component/checkbox\\\",\\\"formId\\\":122,\\\"renderKey\\\":\\\"1221641097529857\\\"},\\\"__slot__\\\":{\\\"options\\\":[{\\\"label\\\":\\\"选项一\\\",\\\"value\\\":1},{\\\"label\\\":\\\"选项二\\\",\\\"value\\\":2}]},\\\"style\\\":{},\\\"size\\\":\\\"medium\\\",\\\"disabled\\\":false,\\\"__vModel__\\\":\\\"field122\\\"}\"]', '{\"formRef\":\"elForm\",\"formModel\":\"formData\",\"size\":\"medium\",\"labelPosition\":\"right\",\"labelWidth\":100,\"formRules\":\"rules\",\"gutter\":15,\"disabled\":false,\"span\":24,\"formBtns\":true}', '嘿嘿', '1', '2022-01-02 12:25:55', '1', '2022-01-02 04:46:41', b'0');
  48 +COMMIT;
  49 +
  50 +-- ----------------------------
  51 +-- Table structure for bpm_process_definition
  52 +-- ----------------------------
  53 +DROP TABLE IF EXISTS `bpm_process_definition`;
  54 +CREATE TABLE `bpm_process_definition` (
  55 + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼–å·',
  56 + `process_definition_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'æµç¨‹å®šä¹‰çš„ç¼–å·',
  57 + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'æè¿°',
  58 + `form_id` bigint DEFAULT NULL COMMENT '表å•ç¼–å·',
  59 + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
  60 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  61 + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
  62 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
  63 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
  64 + PRIMARY KEY (`id`) USING BTREE
  65 +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Bpm æµç¨‹å®šä¹‰çš„æ‹“展表\n';
  66 +
  67 +-- ----------------------------
  68 +-- Records of bpm_process_definition
  69 +-- ----------------------------
  70 +BEGIN;
  71 +INSERT INTO `bpm_process_definition` VALUES (12, 'process1641042089407:5:6d9a655c-6b0b-11ec-bfb7-cacd34981f8e', '', 11, '1', '2022-01-01 22:02:17', '1', '2022-01-01 22:02:17', b'0');
  72 +COMMIT;
  73 +
  74 +-- ----------------------------
21 -- Table structure for inf_api_access_log 75 -- Table structure for inf_api_access_log
22 -- ---------------------------- 76 -- ----------------------------
23 DROP TABLE IF EXISTS `inf_api_access_log`; 77 DROP TABLE IF EXISTS `inf_api_access_log`;
@@ -44,7 +98,7 @@ CREATE TABLE `inf_api_access_log` ( @@ -44,7 +98,7 @@ CREATE TABLE `inf_api_access_log` (
44 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 98 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
45 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·', 99 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·',
46 PRIMARY KEY (`id`) USING BTREE 100 PRIMARY KEY (`id`) USING BTREE
47 -) ENGINE=InnoDB AUTO_INCREMENT=3282 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='API 访问日志表'; 101 +) ENGINE=InnoDB AUTO_INCREMENT=7244 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='API 访问日志表';
48 102
49 -- ---------------------------- 103 -- ----------------------------
50 -- Records of inf_api_access_log 104 -- Records of inf_api_access_log
@@ -86,7 +140,7 @@ CREATE TABLE `inf_api_error_log` ( @@ -86,7 +140,7 @@ CREATE TABLE `inf_api_error_log` (
86 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 140 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
87 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·', 141 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·',
88 PRIMARY KEY (`id`) USING BTREE 142 PRIMARY KEY (`id`) USING BTREE
89 -) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统异常日志'; 143 +) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统异常日志';
90 144
91 -- ---------------------------- 145 -- ----------------------------
92 -- Records of inf_api_error_log 146 -- Records of inf_api_error_log
@@ -119,7 +173,7 @@ CREATE TABLE `inf_config` ( @@ -119,7 +173,7 @@ CREATE TABLE `inf_config` (
119 -- Records of inf_config 173 -- Records of inf_config
120 -- ---------------------------- 174 -- ----------------------------
121 BEGIN; 175 BEGIN;
122 -INSERT INTO `inf_config` VALUES (1, 'ui', 1, '主框架页-默认皮肤样å¼åç§°', 'sys.index.skinName', 'skin-blue', b'0', 'è“色 skin-blueã€ç»¿è‰² skin-greenã€ç´«è‰² skin-purpleã€çº¢è‰² skin-redã€é»„色 skin-yellow', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); 176 +INSERT INTO `inf_config` VALUES (1, 'ui', 1, '主框架页-默认皮肤样å¼åç§°', 'sys.index.skinName', 'skin-blue', b'0', 'è“色 skin-blueã€ç»¿è‰² skin-greenã€ç´«è‰² skin-purpleã€çº¢è‰² skin-redã€é»„色 skin-yellow', 'admin', '2021-01-05 17:03:48', '1', '2021-12-16 07:42:36', b'0');
123 INSERT INTO `inf_config` VALUES (2, 'biz', 1, '用户管ç†-è´¦å·åˆå§‹å¯†ç ', 'sys.user.init-password', '123456', b'0', 'åˆå§‹åŒ–å¯†ç  123456', 'admin', '2021-01-05 17:03:48', '', '2021-04-13 03:48:02', b'0'); 177 INSERT INTO `inf_config` VALUES (2, 'biz', 1, '用户管ç†-è´¦å·åˆå§‹å¯†ç ', 'sys.user.init-password', '123456', b'0', 'åˆå§‹åŒ–å¯†ç  123456', 'admin', '2021-01-05 17:03:48', '', '2021-04-13 03:48:02', b'0');
124 INSERT INTO `inf_config` VALUES (3, 'ui', 1, '主框架页-ä¾§è¾¹æ ä¸»é¢˜', 'sys.index.sideTheme', 'theme-dark', b'0', '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', b'0'); 178 INSERT INTO `inf_config` VALUES (3, 'ui', 1, '主框架页-ä¾§è¾¹æ ä¸»é¢˜', 'sys.index.sideTheme', 'theme-dark', b'0', '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', b'0');
125 INSERT INTO `inf_config` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0'); 179 INSERT INTO `inf_config` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0');
@@ -715,6 +769,51 @@ INSERT INTO `pay_order_extension` VALUES (100, '20211027132205235959', 121, 9, ' @@ -715,6 +769,51 @@ INSERT INTO `pay_order_extension` VALUES (100, '20211027132205235959', 121, 9, '
715 COMMIT; 769 COMMIT;
716 770
717 -- ---------------------------- 771 -- ----------------------------
  772 +-- Table structure for pay_refund
  773 +-- ----------------------------
  774 +DROP TABLE IF EXISTS `pay_refund`;
  775 +CREATE TABLE `pay_refund` (
  776 + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '支付退款编å·',
  777 + `req_no` varchar(64) NOT NULL COMMENT '退款å•请求å·',
  778 + `merchant_id` bigint NOT NULL COMMENT '商户编å·',
  779 + `app_id` bigint NOT NULL COMMENT '应用编å·',
  780 + `channel_id` bigint NOT NULL COMMENT '渠é“ç¼–å·',
  781 + `channel_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '渠é“ç¼–ç ',
  782 + `order_id` bigint NOT NULL COMMENT '支付订å•ç¼–å· pay_order 表id',
  783 + `trade_no` varchar(64) NOT NULL COMMENT '交易订å•å· pay_extension 表no 字段',
  784 + `merchant_order_id` varchar(64) NOT NULL COMMENT '商户订å•ç¼–å·ï¼ˆå•†æˆ·ç³»ç»Ÿç”Ÿæˆï¼‰',
  785 + `merchant_refund_no` varchar(64) NOT NULL COMMENT '商户退款订å•å·ï¼ˆå•†æˆ·ç³»ç»Ÿç”Ÿæˆï¼‰',
  786 + `notify_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '异步通知商户地å€',
  787 + `notify_status` tinyint NOT NULL COMMENT '通知商户退款结果的回调状æ€',
  788 + `status` tinyint NOT NULL COMMENT '退款状æ€',
  789 + `type` tinyint NOT NULL COMMENT '退款类型(部分退款,全部退款)',
  790 + `pay_amount` bigint NOT NULL COMMENT '支付金é¢,å•ä½åˆ†',
  791 + `refund_amount` bigint NOT NULL COMMENT '退款金é¢,å•ä½åˆ†',
  792 + `reason` varchar(256) NOT NULL COMMENT '退款原因',
  793 + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '用户 IP',
  794 + `channel_order_no` varchar(64) NOT NULL COMMENT '渠é“订å•å·ï¼Œpay_order 中的channel_order_no 对应',
  795 + `channel_refund_no` varchar(64) DEFAULT NULL COMMENT '渠é“退款å•å·ï¼Œæ¸ é“返回',
  796 + `channel_error_code` varchar(128) DEFAULT NULL COMMENT '渠é“调用报错时,错误ç ',
  797 + `channel_error_msg` varchar(256) DEFAULT NULL COMMENT '渠é“调用报错时,错误信æ¯',
  798 + `channel_extras` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '支付渠é“çš„é¢å¤–傿•°',
  799 + `expire_time` datetime DEFAULT NULL COMMENT '退款失效时间',
  800 + `success_time` datetime DEFAULT NULL COMMENT '退款æˆåŠŸæ—¶é—´',
  801 + `notify_time` datetime DEFAULT NULL COMMENT '退款通知时间',
  802 + `creator` varchar(64) DEFAULT '' COMMENT '创建者',
  803 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  804 + `updater` varchar(64) DEFAULT '' COMMENT '更新者',
  805 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
  806 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
  807 + PRIMARY KEY (`id`) USING BTREE
  808 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='退款订å•';
  809 +
  810 +-- ----------------------------
  811 +-- Records of pay_refund
  812 +-- ----------------------------
  813 +BEGIN;
  814 +COMMIT;
  815 +
  816 +-- ----------------------------
718 -- Table structure for sys_dept 817 -- Table structure for sys_dept
719 -- ---------------------------- 818 -- ----------------------------
720 DROP TABLE IF EXISTS `sys_dept`; 819 DROP TABLE IF EXISTS `sys_dept`;
@@ -770,7 +869,7 @@ CREATE TABLE `sys_dict_data` ( @@ -770,7 +869,7 @@ CREATE TABLE `sys_dict_data` (
770 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 869 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
771 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 870 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
772 PRIMARY KEY (`id`) USING BTREE 871 PRIMARY KEY (`id`) USING BTREE
773 -) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典数æ®è¡¨'; 872 +) ENGINE=InnoDB AUTO_INCREMENT=1127 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典数æ®è¡¨';
774 873
775 -- ---------------------------- 874 -- ----------------------------
776 -- Records of sys_dict_data 875 -- Records of sys_dict_data
@@ -857,14 +956,39 @@ INSERT INTO `sys_dict_data` VALUES (88, 2, '婚å‡', '3', 'oa_leave_type', 0, NU @@ -857,14 +956,39 @@ INSERT INTO `sys_dict_data` VALUES (88, 2, '婚å‡', '3', 'oa_leave_type', 0, NU
857 INSERT INTO `sys_dict_data` VALUES (89, 0, '处ç†ä¸­', '1', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:46:46', '1', '2021-10-12 22:12:20', b'0'); 956 INSERT INTO `sys_dict_data` VALUES (89, 0, '处ç†ä¸­', '1', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:46:46', '1', '2021-10-12 22:12:20', b'0');
858 INSERT INTO `sys_dict_data` VALUES (90, 1, 'æµç¨‹ç»“æŸ', '2', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:47:03', '1', '2021-10-12 22:12:58', b'0'); 957 INSERT INTO `sys_dict_data` VALUES (90, 1, 'æµç¨‹ç»“æŸ', '2', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:47:03', '1', '2021-10-12 22:12:58', b'0');
859 INSERT INTO `sys_dict_data` VALUES (91, 2, '完æˆ', '3', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:47:25', '1', '2021-10-12 14:13:06', b'1'); 958 INSERT INTO `sys_dict_data` VALUES (91, 2, '完æˆ', '3', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:47:25', '1', '2021-10-12 14:13:06', b'1');
860 -INSERT INTO `sys_dict_data` VALUES (92, 1, 'å¯ç”¨', '0', 'pay_merchant_status', 0, '商户å¯ç”¨', '1', '2021-11-03 11:30:52', '1', '2021-11-03 11:31:15', b'0');  
861 -INSERT INTO `sys_dict_data` VALUES (93, 2, 'åœç”¨', '1', 'pay_merchant_status', 0, '商户åœç”¨', '1', '2021-11-03 11:31:05', '1', '2021-11-03 11:31:05', b'0');  
862 -INSERT INTO `sys_dict_data` VALUES (94, 1, 'å¼€å¯', '0', 'pay_app_status', 0, NULL, '1', '2021-11-06 19:42:10', '1', '2021-11-06 19:42:10', b'0');  
863 -INSERT INTO `sys_dict_data` VALUES (95, 2, '关闭', '1', 'pay_app_status', 0, NULL, '1', '2021-11-06 19:42:17', '1', '2021-11-06 19:42:17', b'0');  
864 -INSERT INTO `sys_dict_data` VALUES (96, 1, 'å¼€å¯', '0', 'pay_channel_status', 0, 'å¼€å¯', '1', '2021-11-08 16:47:45', '1', '2021-11-08 16:47:45', b'0');  
865 -INSERT INTO `sys_dict_data` VALUES (97, 2, '关闭', '1', 'pay_channel_status', 0, '关闭', '1', '2021-11-08 16:47:52', '1', '2021-11-08 16:47:52', b'0');  
866 INSERT INTO `sys_dict_data` VALUES (98, 1, 'v2', 'v2', 'pay_channel_wechat_version', 0, 'v2版本', '1', '2021-11-08 17:00:58', '1', '2021-11-08 17:00:58', b'0'); 959 INSERT INTO `sys_dict_data` VALUES (98, 1, 'v2', 'v2', 'pay_channel_wechat_version', 0, 'v2版本', '1', '2021-11-08 17:00:58', '1', '2021-11-08 17:00:58', b'0');
867 INSERT INTO `sys_dict_data` VALUES (99, 2, 'v3', 'v3', 'pay_channel_wechat_version', 0, 'v3版本', '1', '2021-11-08 17:01:07', '1', '2021-11-08 17:01:07', b'0'); 960 INSERT INTO `sys_dict_data` VALUES (99, 2, 'v3', 'v3', 'pay_channel_wechat_version', 0, 'v3版本', '1', '2021-11-08 17:01:07', '1', '2021-11-08 17:01:07', b'0');
  961 +INSERT INTO `sys_dict_data` VALUES (108, 1, 'RSA2', 'RSA2', 'pay_channel_alipay_sign_type', 0, 'RSA2', '1', '2021-11-18 15:39:29', '1', '2021-11-18 15:39:29', b'0');
  962 +INSERT INTO `sys_dict_data` VALUES (109, 1, '公钥模å¼', '1', 'pay_channel_alipay_mode', 0, '公钥模å¼ï¼šprivateKey + alipayPublicKey', '1', '2021-11-18 15:45:23', '1', '2021-11-18 15:45:23', b'0');
  963 +INSERT INTO `sys_dict_data` VALUES (110, 2, 'è¯ä¹¦æ¨¡å¼', '2', 'pay_channel_alipay_mode', 0, 'è¯ä¹¦æ¨¡å¼ï¼šappCertContent + alipayPublicCertContent + rootCertContent', '1', '2021-11-18 15:45:40', '1', '2021-11-18 15:45:40', b'0');
  964 +INSERT INTO `sys_dict_data` VALUES (111, 1, '线上', 'https://openapi.alipay.com/gateway.do', 'pay_channel_alipay_server_type', 0, 'ç½‘å…³åœ°å€ - 线上', '1', '2021-11-18 16:59:32', '1', '2021-11-21 17:37:29', b'0');
  965 +INSERT INTO `sys_dict_data` VALUES (112, 2, '沙箱', 'https://openapi.alipaydev.com/gateway.do', 'pay_channel_alipay_server_type', 0, 'ç½‘å…³åœ°å€ - 沙箱', '1', '2021-11-18 16:59:48', '1', '2021-11-21 17:37:39', b'0');
  966 +INSERT INTO `sys_dict_data` VALUES (113, 1, '微信 JSAPI 支付', 'wx_pub', 'pay_channel_code_type', 0, '微信 JSAPI(公众å·ï¼‰ 支付', '1', '2021-12-03 10:40:24', '1', '2021-12-04 16:41:00', b'0');
  967 +INSERT INTO `sys_dict_data` VALUES (114, 2, '微信å°ç¨‹åºæ”¯ä»˜', 'wx_lite', 'pay_channel_code_type', 0, '微信å°ç¨‹åºæ”¯ä»˜', '1', '2021-12-03 10:41:06', '1', '2021-12-03 10:41:06', b'0');
  968 +INSERT INTO `sys_dict_data` VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code_type', 0, '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2021-12-03 10:41:20', b'0');
  969 +INSERT INTO `sys_dict_data` VALUES (116, 4, 'æ”¯ä»˜å® PC 网站支付', 'alipay_pc', 'pay_channel_code_type', 0, 'æ”¯ä»˜å® PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2021-12-03 10:42:09', b'0');
  970 +INSERT INTO `sys_dict_data` VALUES (117, 5, 'æ”¯ä»˜å® Wap 网站支付', 'alipay_wap', 'pay_channel_code_type', 0, 'æ”¯ä»˜å® Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2021-12-03 10:42:26', b'0');
  971 +INSERT INTO `sys_dict_data` VALUES (118, 6, '支付å®App 支付', 'alipay_app', 'pay_channel_code_type', 0, '支付å®App 支付', '1', '2021-12-03 10:42:55', '1', '2021-12-03 10:42:55', b'0');
  972 +INSERT INTO `sys_dict_data` VALUES (119, 7, 'æ”¯ä»˜å®æ‰«ç æ”¯ä»˜', 'alipay_qr', 'pay_channel_code_type', 0, 'æ”¯ä»˜å®æ‰«ç æ”¯ä»˜', '1', '2021-12-03 10:43:10', '1', '2021-12-03 10:43:10', b'0');
  973 +INSERT INTO `sys_dict_data` VALUES (120, 1, '通知æˆåŠŸ', '10', 'pay_order_notify_status', 0, '通知æˆåŠŸ', '1', '2021-12-03 11:02:41', '1', '2021-12-03 11:02:41', b'0');
  974 +INSERT INTO `sys_dict_data` VALUES (121, 2, '通知失败', '20', 'pay_order_notify_status', 0, '通知失败', '1', '2021-12-03 11:02:59', '1', '2021-12-03 11:02:59', b'0');
  975 +INSERT INTO `sys_dict_data` VALUES (122, 3, '未通知', '0', 'pay_order_notify_status', 0, '未通知', '1', '2021-12-03 11:03:10', '1', '2021-12-03 11:03:10', b'0');
  976 +INSERT INTO `sys_dict_data` VALUES (123, 1, '支付æˆåŠŸ', '10', 'pay_order_status', 0, '支付æˆåŠŸ', '1', '2021-12-03 11:18:29', '1', '2021-12-03 11:28:32', b'0');
  977 +INSERT INTO `sys_dict_data` VALUES (124, 2, '支付关闭', '20', 'pay_order_status', 0, '支付关闭', '1', '2021-12-03 11:18:42', '1', '2021-12-03 11:28:34', b'0');
  978 +INSERT INTO `sys_dict_data` VALUES (125, 3, '未支付', '0', 'pay_order_status', 0, '未支付', '1', '2021-12-03 11:18:18', '1', '2021-12-03 11:28:36', b'0');
  979 +INSERT INTO `sys_dict_data` VALUES (126, 1, '未退款', '0', 'pay_order_refund_status', 0, '未退款', '1', '2021-12-03 11:30:35', '1', '2021-12-03 11:34:05', b'0');
  980 +INSERT INTO `sys_dict_data` VALUES (127, 2, '部分退款', '10', 'pay_order_refund_status', 0, '部分退款', '1', '2021-12-03 11:30:44', '1', '2021-12-03 11:34:10', b'0');
  981 +INSERT INTO `sys_dict_data` VALUES (128, 3, '全部退款', '20', 'pay_order_refund_status', 0, '全部退款', '1', '2021-12-03 11:30:52', '1', '2021-12-03 11:34:14', b'0');
  982 +INSERT INTO `sys_dict_data` VALUES (1117, 1, '退款订å•生æˆ', '0', 'pay_refund_order_status', 0, '退款订å•生æˆ', '1', '2021-12-10 16:44:44', '1', '2021-12-10 16:44:44', b'0');
  983 +INSERT INTO `sys_dict_data` VALUES (1118, 2, '退款æˆåŠŸ', '1', 'pay_refund_order_status', 0, '退款æˆåŠŸ', '1', '2021-12-10 16:44:59', '1', '2021-12-10 16:44:59', b'0');
  984 +INSERT INTO `sys_dict_data` VALUES (1119, 3, '退款失败', '2', 'pay_refund_order_status', 0, '退款失败', '1', '2021-12-10 16:45:10', '1', '2021-12-10 16:45:10', b'0');
  985 +INSERT INTO `sys_dict_data` VALUES (1120, 4, '退款中, 渠é“通知结果', '3', 'pay_refund_order_status', 0, '退款中, 渠é“通知结果', '1', '2021-12-10 16:45:32', '1', '2021-12-10 16:45:32', b'0');
  986 +INSERT INTO `sys_dict_data` VALUES (1121, 5, '退款中, 系统查询结果', '4', 'pay_refund_order_status', 0, '退款中, 系统查询结果', '1', '2021-12-10 16:45:48', '1', '2021-12-10 16:45:48', b'0');
  987 +INSERT INTO `sys_dict_data` VALUES (1122, 6, 'çŠ¶æ€æœªçŸ¥ï¼Œéœ€è¦é‡è¯•', '5', 'pay_refund_order_status', 0, 'çŠ¶æ€æœªçŸ¥ï¼Œéœ€è¦é‡è¯•', '1', '2021-12-10 16:46:03', '1', '2021-12-10 16:46:03', b'0');
  988 +INSERT INTO `sys_dict_data` VALUES (1123, 7, 'çŠ¶æ€æœªçŸ¥ï¼Œç³»ç»ŸæŸ¥è¯¢ç»“æžœ', '6', 'pay_refund_order_status', 0, 'çŠ¶æ€æœªçŸ¥ï¼Œç³»ç»ŸæŸ¥è¯¢ç»“æžœ', '1', '2021-12-10 16:46:13', '1', '2021-12-10 16:46:13', b'0');
  989 +INSERT INTO `sys_dict_data` VALUES (1124, 8, '退款关闭', '99', 'pay_refund_order_status', 0, '退款关闭', '1', '2021-12-10 16:46:26', '1', '2021-12-10 16:46:26', b'0');
  990 +INSERT INTO `sys_dict_data` VALUES (1125, 0, '默认', '1', 'bpm_model_category', 0, 'æµç¨‹åˆ†ç±» - 默认', '1', '2022-01-02 08:41:11', '1', '2022-01-02 08:41:11', b'0');
  991 +INSERT INTO `sys_dict_data` VALUES (1126, 0, 'OA', '2', 'bpm_model_category', 0, 'æµç¨‹åˆ†ç±» - OA', '1', '2022-01-02 08:41:22', '1', '2022-01-02 08:41:22', b'0');
868 COMMIT; 992 COMMIT;
869 993
870 -- ---------------------------- 994 -- ----------------------------
@@ -884,7 +1008,7 @@ CREATE TABLE `sys_dict_type` ( @@ -884,7 +1008,7 @@ CREATE TABLE `sys_dict_type` (
884 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1008 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
885 PRIMARY KEY (`id`) USING BTREE, 1009 PRIMARY KEY (`id`) USING BTREE,
886 UNIQUE KEY `dict_type` (`type`) 1010 UNIQUE KEY `dict_type` (`type`)
887 -) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典类型表'; 1011 +) ENGINE=InnoDB AUTO_INCREMENT=139 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典类型表';
888 1012
889 -- ---------------------------- 1013 -- ----------------------------
890 -- Records of sys_dict_type 1014 -- Records of sys_dict_type
@@ -915,10 +1039,18 @@ INSERT INTO `sys_dict_type` VALUES (115, '错误ç çš„类型', 'sys_error_code_t @@ -915,10 +1039,18 @@ INSERT INTO `sys_dict_type` VALUES (115, '错误ç çš„类型', 'sys_error_code_t
915 INSERT INTO `sys_dict_type` VALUES (116, '登陆日志的类型', 'sys_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2021-10-06 00:50:46', b'0'); 1039 INSERT INTO `sys_dict_type` VALUES (116, '登陆日志的类型', 'sys_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2021-10-06 00:50:46', b'0');
916 INSERT INTO `sys_dict_type` VALUES (117, '请å‡ç±»åž‹', 'oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2021-09-21 15:00:38', b'0'); 1040 INSERT INTO `sys_dict_type` VALUES (117, '请å‡ç±»åž‹', 'oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2021-09-21 15:00:38', b'0');
917 INSERT INTO `sys_dict_type` VALUES (118, 'è¯·å‡æµç¨‹çжæ€', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:46:04', '1', '2021-09-21 15:00:38', b'0'); 1041 INSERT INTO `sys_dict_type` VALUES (118, 'è¯·å‡æµç¨‹çжæ€', 'oa_leave_status', 0, NULL, '1', '2021-09-21 22:46:04', '1', '2021-09-21 15:00:38', b'0');
918 -INSERT INTO `sys_dict_type` VALUES (119, '商户状æ€', 'pay_merchant_status', 0, '商户的å¯ç”¨äºŽåœç”¨çжæ€', '1', '2021-11-03 11:29:04', '1', '2021-11-03 11:29:04', b'0');  
919 -INSERT INTO `sys_dict_type` VALUES (120, '支付应用状æ€', 'pay_app_status', 0, '支付应用的å¯åœçжæ€', '1', '2021-11-06 19:41:50', '1', '2021-11-06 19:41:50', b'0');  
920 -INSERT INTO `sys_dict_type` VALUES (121, '支付渠é“状æ€', 'pay_channel_status', 0, '支付渠é“çš„å¯åœçжæ€', '1', '2021-11-08 16:47:21', '1', '2021-11-08 16:47:21', b'0');  
921 INSERT INTO `sys_dict_type` VALUES (122, '支付渠é“微信版本', 'pay_channel_wechat_version', 0, '支付渠é“微信版本', '1', '2021-11-08 17:00:26', '1', '2021-11-08 17:00:26', b'0'); 1042 INSERT INTO `sys_dict_type` VALUES (122, '支付渠é“微信版本', 'pay_channel_wechat_version', 0, '支付渠é“微信版本', '1', '2021-11-08 17:00:26', '1', '2021-11-08 17:00:26', b'0');
  1043 +INSERT INTO `sys_dict_type` VALUES (127, 'æ”¯ä»˜æ¸ é“æ”¯ä»˜å®ç®—法类型', 'pay_channel_alipay_sign_type', 0, 'æ”¯ä»˜æ¸ é“æ”¯ä»˜å®ç®—法类型', '1', '2021-11-18 15:39:09', '1', '2021-11-18 15:39:09', b'0');
  1044 +INSERT INTO `sys_dict_type` VALUES (128, 'æ”¯ä»˜æ¸ é“æ”¯ä»˜å®å…¬é’¥ç±»åž‹', 'pay_channel_alipay_mode', 0, 'æ”¯ä»˜æ¸ é“æ”¯ä»˜å®å…¬é’¥ç±»åž‹', '1', '2021-11-18 15:44:28', '1', '2021-11-18 15:44:28', b'0');
  1045 +INSERT INTO `sys_dict_type` VALUES (129, '支付å®ç½‘关地å€', 'pay_channel_alipay_server_type', 0, '支付å®ç½‘关地å€', '1', '2021-11-18 16:58:55', '1', '2021-11-18 17:01:34', b'0');
  1046 +INSERT INTO `sys_dict_type` VALUES (130, '支付渠é“ç¼–ç ç±»åž‹', 'pay_channel_code_type', 0, '支付渠é“的编ç ', '1', '2021-12-03 10:35:08', '1', '2021-12-03 10:35:08', b'0');
  1047 +INSERT INTO `sys_dict_type` VALUES (131, '支付订å•回调状æ€', 'pay_order_notify_status', 0, '支付订å•回调状æ€', '1', '2021-12-03 10:53:29', '1', '2021-12-03 10:53:29', b'0');
  1048 +INSERT INTO `sys_dict_type` VALUES (132, '支付订å•状æ€', 'pay_order_status', 0, '支付订å•状æ€', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', b'0');
  1049 +INSERT INTO `sys_dict_type` VALUES (133, '支付订å•退款状æ€', 'pay_order_refund_status', 0, '支付订å•退款状æ€', '1', '2021-12-03 11:27:31', '1', '2021-12-03 11:27:31', b'0');
  1050 +INSERT INTO `sys_dict_type` VALUES (134, '退款订å•状æ€', 'pay_refund_order_status', 0, '退款订å•状æ€', '1', '2021-12-10 16:42:50', '1', '2021-12-10 16:42:50', b'0');
  1051 +INSERT INTO `sys_dict_type` VALUES (135, '退款订å•类别', 'pay_refund_order_type', 0, '退款订å•类别', '1', '2021-12-10 17:14:53', '1', '2021-12-10 17:14:53', b'0');
  1052 +INSERT INTO `sys_dict_type` VALUES (137, 'æµç¨‹åˆ†ç±»', 'æµç¨‹åˆ†ç±»', 0, 'æµç¨‹åˆ†ç±»', '1', '2022-01-02 08:40:17', '1', '2022-01-02 00:40:34', b'1');
  1053 +INSERT INTO `sys_dict_type` VALUES (138, 'æµç¨‹åˆ†ç±»', 'bpm_model_category', 0, 'æµç¨‹åˆ†ç±»', '1', '2022-01-02 08:40:45', '1', '2022-01-02 08:40:45', b'0');
922 COMMIT; 1054 COMMIT;
923 1055
924 -- ---------------------------- 1056 -- ----------------------------
@@ -938,93 +1070,12 @@ CREATE TABLE `sys_error_code` ( @@ -938,93 +1070,12 @@ CREATE TABLE `sys_error_code` (
938 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 1070 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
939 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1071 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
940 PRIMARY KEY (`id`) USING BTREE 1072 PRIMARY KEY (`id`) USING BTREE
941 -) ENGINE=InnoDB AUTO_INCREMENT=4020 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='错误ç è¡¨'; 1073 +) ENGINE=InnoDB AUTO_INCREMENT=4049 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='错误ç è¡¨';
942 1074
943 -- ---------------------------- 1075 -- ----------------------------
944 -- Records of sys_error_code 1076 -- Records of sys_error_code
945 -- ---------------------------- 1077 -- ----------------------------
946 BEGIN; 1078 BEGIN;
947 -INSERT INTO `sys_error_code` VALUES (3939, 2, 'dashboard', 1001000001, '傿•°é…ç½®ä¸å­˜åœ¨', 'ceshi', NULL, '2021-04-20 23:52:56', '1', '2021-04-21 23:44:15', b'0');  
948 -INSERT INTO `sys_error_code` VALUES (3940, 1, 'dashboard', 1001000002, '傿•°é…ç½® key é‡å¤', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');  
949 -INSERT INTO `sys_error_code` VALUES (3941, 1, 'dashboard', 1001000003, 'ä¸èƒ½åˆ é™¤ç±»åž‹ä¸ºç³»ç»Ÿå†…ç½®çš„å‚æ•°é…ç½®', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');  
950 -INSERT INTO `sys_error_code` VALUES (3942, 1, 'dashboard', 1001000004, 'ä¸å…è®¸èŽ·å–æ•感é…置到å‰ç«¯', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');  
951 -INSERT INTO `sys_error_code` VALUES (3943, 1, 'dashboard', 1001001000, '定时任务ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');  
952 -INSERT INTO `sys_error_code` VALUES (3944, 1, 'dashboard', 1001001001, '定时任务的处ç†å™¨å·²ç»å­˜åœ¨', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');  
953 -INSERT INTO `sys_error_code` VALUES (3945, 1, 'dashboard', 1001001002, 'åªå…è®¸ä¿®æ”¹ä¸ºå¼€å¯æˆ–者关闭状æ€', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');  
954 -INSERT INTO `sys_error_code` VALUES (3946, 1, 'dashboard', 1001001003, '定时任务已ç»å¤„于该状æ€ï¼Œæ— éœ€ä¿®æ”¹', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');  
955 -INSERT INTO `sys_error_code` VALUES (3947, 1, 'dashboard', 1001001004, 'åªæœ‰å¼€å¯çжæ€çš„任务,æ‰å¯ä»¥ä¿®æ”¹', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
956 -INSERT INTO `sys_error_code` VALUES (3948, 1, 'dashboard', 1001001005, 'CRON 表达å¼ä¸æ­£ç¡®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
957 -INSERT INTO `sys_error_code` VALUES (3949, 2, 'dashboard', 1001002000, 'API 错误日志ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', '1', '2021-04-13 21:55:55', b'1');  
958 -INSERT INTO `sys_error_code` VALUES (3950, 1, 'dashboard', 1001002001, 'API 错误日志已处ç†', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
959 -INSERT INTO `sys_error_code` VALUES (3951, 1, 'dashboard', 1001003000, '文件ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
960 -INSERT INTO `sys_error_code` VALUES (3952, 1, 'dashboard', 1002000000, '登录失败,账å·å¯†ç ä¸æ­£ç¡®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
961 -INSERT INTO `sys_error_code` VALUES (3953, 1, 'dashboard', 1002000001, '登录失败,账å·è¢«ç¦ç”¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
962 -INSERT INTO `sys_error_code` VALUES (3954, 1, 'dashboard', 1002000002, '登录失败', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
963 -INSERT INTO `sys_error_code` VALUES (3955, 1, 'dashboard', 1002000003, '验è¯ç ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
964 -INSERT INTO `sys_error_code` VALUES (3956, 1, 'dashboard', 1002000004, '验è¯ç ä¸æ­£ç¡®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
965 -INSERT INTO `sys_error_code` VALUES (3957, 1, 'dashboard', 1002001000, 'Token å·²ç»è¿‡æœŸ', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
966 -INSERT INTO `sys_error_code` VALUES (3958, 1, 'dashboard', 1002001001, 'Token è§£æžå¤±è´¥', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
967 -INSERT INTO `sys_error_code` VALUES (3959, 1, 'dashboard', 1002002000, 'å·²ç»å­˜åœ¨è¯¥åå­—çš„èœå•', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
968 -INSERT INTO `sys_error_code` VALUES (3960, 1, 'dashboard', 1002002001, '父èœå•ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
969 -INSERT INTO `sys_error_code` VALUES (3961, 1, 'dashboard', 1002002002, 'ä¸èƒ½è®¾ç½®è‡ªå·±ä¸ºçˆ¶èœå•', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
970 -INSERT INTO `sys_error_code` VALUES (3962, 1, 'dashboard', 1002002003, 'èœå•ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
971 -INSERT INTO `sys_error_code` VALUES (3963, 1, 'dashboard', 1002002004, '存在å­èœå•,无法删除', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
972 -INSERT INTO `sys_error_code` VALUES (3964, 1, 'dashboard', 1002002005, '父èœå•的类型必须是目录或者èœå•', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
973 -INSERT INTO `sys_error_code` VALUES (3965, 1, 'dashboard', 1002003000, '角色ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
974 -INSERT INTO `sys_error_code` VALUES (3966, 1, 'dashboard', 1002003001, 'å·²ç»å­˜åœ¨å为ã€{}】的角色', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
975 -INSERT INTO `sys_error_code` VALUES (3967, 1, 'dashboard', 1002003002, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的角色', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
976 -INSERT INTO `sys_error_code` VALUES (3968, 1, 'dashboard', 1002003004, 'ä¸èƒ½æ“作类型为系统内置的角色', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
977 -INSERT INTO `sys_error_code` VALUES (3969, 1, 'dashboard', 1002004000, '用户账å·å·²ç»å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
978 -INSERT INTO `sys_error_code` VALUES (3970, 1, 'dashboard', 1002004001, 'å·²ç»å­˜åœ¨è¯¥å字的部门', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
979 -INSERT INTO `sys_error_code` VALUES (3971, 1, 'dashboard', 1002004002, '父级部门ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
980 -INSERT INTO `sys_error_code` VALUES (3972, 1, 'dashboard', 1002004003, '用户ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
981 -INSERT INTO `sys_error_code` VALUES (3973, 1, 'dashboard', 1002004004, '存在å­éƒ¨é—¨ï¼Œæ— æ³•删除', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
982 -INSERT INTO `sys_error_code` VALUES (3974, 1, 'dashboard', 1002004005, 'ä¸èƒ½è®¾ç½®è‡ªå·±ä¸ºçˆ¶éƒ¨é—¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
983 -INSERT INTO `sys_error_code` VALUES (3975, 1, 'dashboard', 1002004001, 'å·²ç»å­˜åœ¨è¯¥å字的部门', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
984 -INSERT INTO `sys_error_code` VALUES (3976, 1, 'dashboard', 1002004002, '父级部门ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
985 -INSERT INTO `sys_error_code` VALUES (3977, 1, 'dashboard', 1002004003, '当å‰éƒ¨é—¨ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
986 -INSERT INTO `sys_error_code` VALUES (3978, 1, 'dashboard', 1002004004, '存在å­éƒ¨é—¨ï¼Œæ— æ³•删除', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
987 -INSERT INTO `sys_error_code` VALUES (3979, 1, 'dashboard', 1002004005, 'ä¸èƒ½è®¾ç½®è‡ªå·±ä¸ºçˆ¶éƒ¨é—¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
988 -INSERT INTO `sys_error_code` VALUES (3980, 1, 'dashboard', 1002004006, '部门中存在员工,无法删除', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
989 -INSERT INTO `sys_error_code` VALUES (3981, 1, 'dashboard', 1002004007, '部门ä¸å¤„于开å¯çжæ€ï¼Œä¸å…许选择', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
990 -INSERT INTO `sys_error_code` VALUES (3982, 1, 'dashboard', 1002004008, 'ä¸èƒ½è®¾ç½®è‡ªå·±çš„å­éƒ¨é—¨ä¸ºçˆ¶éƒ¨é—¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
991 -INSERT INTO `sys_error_code` VALUES (3983, 1, 'dashboard', 1002005001, 'å·²ç»å­˜åœ¨è¯¥æ ‡è¯†çš„å²—ä½', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
992 -INSERT INTO `sys_error_code` VALUES (3984, 1, 'dashboard', 1002005002, 'å²—ä½({}) ä¸å¤„于开å¯çжæ€ï¼Œä¸å…许选择', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
993 -INSERT INTO `sys_error_code` VALUES (3985, 1, 'dashboard', 1002005001, 'å·²ç»å­˜åœ¨è¯¥å字的岗ä½', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
994 -INSERT INTO `sys_error_code` VALUES (3986, 1, 'dashboard', 1002005001, 'å·²ç»å­˜åœ¨è¯¥æ ‡è¯†çš„å²—ä½', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
995 -INSERT INTO `sys_error_code` VALUES (3987, 1, 'dashboard', 1002006001, '当å‰å­—典类型ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
996 -INSERT INTO `sys_error_code` VALUES (3988, 1, 'dashboard', 1002006002, '字典类型ä¸å¤„于开å¯çжæ€ï¼Œä¸å…许选择', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
997 -INSERT INTO `sys_error_code` VALUES (3989, 1, 'dashboard', 1002006003, 'å·²ç»å­˜åœ¨è¯¥å字的字典类型', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
998 -INSERT INTO `sys_error_code` VALUES (3990, 1, 'dashboard', 1002006004, '无法删除,该字典类型还有字典数æ®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
999 -INSERT INTO `sys_error_code` VALUES (3991, 1, 'dashboard', 1002006004, '无法删除,该字典类型还有字典数æ®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1000 -INSERT INTO `sys_error_code` VALUES (3992, 1, 'dashboard', 1002007001, '当å‰å­—典数æ®ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1001 -INSERT INTO `sys_error_code` VALUES (3993, 1, 'dashboard', 1002007002, '字典数æ®ä¸å¤„于开å¯çжæ€ï¼Œä¸å…许选择', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1002 -INSERT INTO `sys_error_code` VALUES (3994, 1, 'dashboard', 1002007003, 'å·²ç»å­˜åœ¨è¯¥å€¼çš„字典数æ®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1003 -INSERT INTO `sys_error_code` VALUES (3995, 1, 'dashboard', 1002008001, '当å‰é€šçŸ¥å…¬å‘Šä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1004 -INSERT INTO `sys_error_code` VALUES (3996, 1, 'dashboard', 1002009001, '文件路径已ç»å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-21 00:03:20', b'0');  
1005 -INSERT INTO `sys_error_code` VALUES (3997, 1, 'dashboard', 1002009002, '文件上传失败', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1006 -INSERT INTO `sys_error_code` VALUES (3998, 1, 'dashboard', 1002009003, '文件为空', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1007 -INSERT INTO `sys_error_code` VALUES (3999, 1, 'dashboard', 1002011000, '短信模æ¿ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
1008 -INSERT INTO `sys_error_code` VALUES (4000, 1, 'dashboard', 1002011001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的短信模æ¿', '', NULL, '2021-04-20 23:52:57', NULL, '2021-05-02 23:18:32', b'0');  
1009 -INSERT INTO `sys_error_code` VALUES (4001, 2, 'dashboard', 1002011002, '无法删除,该短信渠é“还有短信模æ¿', '', NULL, '2021-04-20 23:52:57', '1', '2021-04-22 00:06:52', b'0');  
1010 -INSERT INTO `sys_error_code` VALUES (4002, 1, 'dashboard', 1002011000, '短信模æ¿ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1011 -INSERT INTO `sys_error_code` VALUES (4003, 1, 'dashboard', 1002011001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的短信模æ¿', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1012 -INSERT INTO `sys_error_code` VALUES (4004, 1, 'dashboard', 1002012000, '手机å·ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1013 -INSERT INTO `sys_error_code` VALUES (4005, 1, 'dashboard', 1002012001, '模æ¿å‚æ•°({})缺失', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1014 -INSERT INTO `sys_error_code` VALUES (4006, 1, 'dashboard', 1002009000, '错误ç ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1015 -INSERT INTO `sys_error_code` VALUES (4007, 1, 'dashboard', 1002009001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}}】的错误ç ', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1016 -INSERT INTO `sys_error_code` VALUES (4008, 1, 'dashboard', 1002004003, 'ä¸èƒ½ä¿®æ”¹ç±»åž‹ä¸ºç³»ç»Ÿå†…置的错误ç ', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');  
1017 -INSERT INTO `sys_error_code` VALUES (4009, 1, 'dashboard', 1001004000, '错误ç ä¸å­˜åœ¨', '', NULL, '2021-04-21 00:38:01', NULL, '2021-04-21 00:38:01', b'0');  
1018 -INSERT INTO `sys_error_code` VALUES (4010, 1, 'dashboard', 1001004001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的错误ç ', '', NULL, '2021-04-21 00:38:01', NULL, '2021-04-21 23:48:44', b'0');  
1019 -INSERT INTO `sys_error_code` VALUES (4011, 1, 'dashboard', 1001004002, 'ä¸èƒ½ä¿®æ”¹ç±»åž‹ä¸ºç³»ç»Ÿå†…置的错误ç ', '', NULL, '2021-04-21 00:38:01', NULL, '2021-04-21 00:38:01', b'0');  
1020 -INSERT INTO `sys_error_code` VALUES (4012, 2, 'dashboard', 1201002000, '啦啦啦啦', 'biubiub', '1', '2021-04-21 23:46:02', '1', '2021-04-21 23:46:02', b'0');  
1021 -INSERT INTO `sys_error_code` VALUES (4013, 1, 'dashboard', 1001002000, 'API 错误日志ä¸å­˜åœ¨', '', NULL, '2021-04-21 23:48:44', NULL, '2021-04-21 23:48:44', b'0');  
1022 -INSERT INTO `sys_error_code` VALUES (4014, 1, 'dashboard', 1002013000, '错误ç ä¸å­˜åœ¨', '', NULL, '2021-04-22 00:04:06', NULL, '2021-04-22 00:04:06', b'0');  
1023 -INSERT INTO `sys_error_code` VALUES (4015, 1, 'dashboard', 1002013001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的错误ç ', '', NULL, '2021-04-22 00:04:06', NULL, '2021-04-22 00:04:06', b'0');  
1024 -INSERT INTO `sys_error_code` VALUES (4016, 1, 'yudao-admin-server', 1002000005, '未绑定账å·ï¼Œéœ€è¦è¿›è¡Œç»‘定', '', NULL, '2021-10-02 22:14:57', NULL, '2021-10-02 22:14:57', b'0');  
1025 -INSERT INTO `sys_error_code` VALUES (4017, 1, 'yudao-admin-server', 1002000006, 'Token å·²ç»è¿‡æœŸ', '', NULL, '2021-10-02 22:14:57', NULL, '2021-10-10 22:47:27', b'0');  
1026 -INSERT INTO `sys_error_code` VALUES (4018, 1, 'yudao-admin-server', 1002014000, '社交授æƒå¤±è´¥ï¼ŒåŽŸå› æ˜¯ï¼š{}', '', NULL, '2021-10-05 23:23:10', NULL, '2021-10-05 23:23:10', b'0');  
1027 -INSERT INTO `sys_error_code` VALUES (4019, 1, 'yudao-admin-server', 1002014001, '社交解绑失败,éžå½“å‰ç”¨æˆ·ç»‘定', '', NULL, '2021-10-06 09:31:54', NULL, '2021-10-06 09:31:54', b'0');  
1028 COMMIT; 1079 COMMIT;
1029 1080
1030 -- ---------------------------- 1081 -- ----------------------------
@@ -1048,7 +1099,7 @@ CREATE TABLE `sys_login_log` ( @@ -1048,7 +1099,7 @@ CREATE TABLE `sys_login_log` (
1048 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1099 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1049 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·', 1100 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·',
1050 PRIMARY KEY (`id`) USING BTREE 1101 PRIMARY KEY (`id`) USING BTREE
1051 -) ENGINE=InnoDB AUTO_INCREMENT=474 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统访问记录'; 1102 +) ENGINE=InnoDB AUTO_INCREMENT=513 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统访问记录';
1052 1103
1053 -- ---------------------------- 1104 -- ----------------------------
1054 -- Records of sys_login_log 1105 -- Records of sys_login_log
@@ -1078,17 +1129,17 @@ CREATE TABLE `sys_menu` ( @@ -1078,17 +1129,17 @@ CREATE TABLE `sys_menu` (
1078 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1129 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1079 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·', 1130 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·',
1080 PRIMARY KEY (`id`) USING BTREE 1131 PRIMARY KEY (`id`) USING BTREE
1081 -) ENGINE=InnoDB AUTO_INCREMENT=1144 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='èœå•æƒé™è¡¨'; 1132 +) ENGINE=InnoDB AUTO_INCREMENT=1194 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='èœå•æƒé™è¡¨';
1082 1133
1083 -- ---------------------------- 1134 -- ----------------------------
1084 -- Records of sys_menu 1135 -- Records of sys_menu
1085 -- ---------------------------- 1136 -- ----------------------------
1086 BEGIN; 1137 BEGIN;
1087 -INSERT INTO `sys_menu` VALUES (1, '系统管ç†', '', 1, 1, 0, '/system', 'system', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-05 22:51:03', b'0', 0);  
1088 -INSERT INTO `sys_menu` VALUES (2, '基础设施', '', 1, 2, 0, '/infra', 'monitor', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:18:35', b'0', 0);  
1089 -INSERT INTO `sys_menu` VALUES (3, 'ç ”å‘工具', '', 1, 3, 0, '/tool', 'tool', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 12:44:42', b'0', 0); 1138 +INSERT INTO `sys_menu` VALUES (1, '系统管ç†', '', 1, 10, 0, '/system', 'system', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:08', b'0', 0);
  1139 +INSERT INTO `sys_menu` VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'monitor', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:18', b'0', 0);
  1140 +INSERT INTO `sys_menu` VALUES (3, 'ç ”å‘工具', '', 1, 30, 0, '/tool', 'tool', NULL, 0, 'admin', '2021-01-05 17:03:48', '1', '2021-12-25 16:43:13', b'0', 0);
1090 INSERT INTO `sys_menu` VALUES (4, 'è‹¥ä¾å®˜ç½‘', '', 1, 4, 0, 'http://ruoyi.vip', 'guide', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 21:54:28', b'1', 0); 1141 INSERT INTO `sys_menu` VALUES (4, 'è‹¥ä¾å®˜ç½‘', '', 1, 4, 0, 'http://ruoyi.vip', 'guide', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 21:54:28', b'1', 0);
1091 -INSERT INTO `sys_menu` VALUES (5, 'OA 办公', '', 1, 4, 0, '/oa', 'people', NULL, 0, 'admin', '2021-09-20 16:26:19', '1', '2021-09-20 13:55:54', b'0', 0); 1142 +INSERT INTO `sys_menu` VALUES (5, 'OA 办公', '', 1, 40, 0, '/oa', 'people', NULL, 0, 'admin', '2021-09-20 16:26:19', '1', '2021-12-25 16:43:22', b'0', 0);
1092 INSERT INTO `sys_menu` VALUES (100, '用户管ç†', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0', 0); 1143 INSERT INTO `sys_menu` VALUES (100, '用户管ç†', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0', 0);
1093 INSERT INTO `sys_menu` VALUES (101, '角色管ç†', '', 2, 2, 1, 'role', 'peoples', 'system/role/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:49', b'0', 0); 1144 INSERT INTO `sys_menu` VALUES (101, '角色管ç†', '', 2, 2, 1, 'role', 'peoples', 'system/role/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:49', b'0', 0);
1094 INSERT INTO `sys_menu` VALUES (102, 'èœå•管ç†', '', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:28', b'0', 0); 1145 INSERT INTO `sys_menu` VALUES (102, 'èœå•管ç†', '', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:28', b'0', 0);
@@ -1217,6 +1268,7 @@ INSERT INTO `sys_menu` VALUES (1113, 'é”™è¯¯ç æ›´æ–°', 'system:error-code:updat @@ -1217,6 +1268,7 @@ INSERT INTO `sys_menu` VALUES (1113, 'é”™è¯¯ç æ›´æ–°', 'system:error-code:updat
1217 INSERT INTO `sys_menu` VALUES (1114, '错误ç åˆ é™¤', 'system:error-code:delete', 3, 4, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:51', b'0', 0); 1268 INSERT INTO `sys_menu` VALUES (1114, '错误ç åˆ é™¤', 'system:error-code:delete', 3, 4, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:51', b'0', 0);
1218 INSERT INTO `sys_menu` VALUES (1115, '错误ç å¯¼å‡º', 'system:error-code:export', 3, 5, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:55', b'0', 0); 1269 INSERT INTO `sys_menu` VALUES (1115, '错误ç å¯¼å‡º', 'system:error-code:export', 3, 5, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:55', b'0', 0);
1219 INSERT INTO `sys_menu` VALUES (1116, '日志中心', '', 2, 8, 2, 'log-center', 'log', 'infra/skywalking/log', 0, '1', '2021-04-26 22:35:45', '1', '2021-04-26 22:37:25', b'0', 0); 1270 INSERT INTO `sys_menu` VALUES (1116, '日志中心', '', 2, 8, 2, 'log-center', 'log', 'infra/skywalking/log', 0, '1', '2021-04-26 22:35:45', '1', '2021-04-26 22:37:25', b'0', 0);
  1271 +INSERT INTO `sys_menu` VALUES (1117, '支付管ç†', '', 1, 11, 0, '/pay', 'money', NULL, 0, '1', '2021-12-25 16:43:41', '1', '2021-12-25 16:46:40', b'0', 0);
1220 INSERT INTO `sys_menu` VALUES (1118, 'è¯·å‡æŸ¥è¯¢', '', 2, 0, 5, 'oa/leave', 'user', 'oa/leave/index', 0, '', '2021-09-20 08:51:03', '1', '2021-10-12 22:19:02', b'0', 0); 1272 INSERT INTO `sys_menu` VALUES (1118, 'è¯·å‡æŸ¥è¯¢', '', 2, 0, 5, 'oa/leave', 'user', 'oa/leave/index', 0, '', '2021-09-20 08:51:03', '1', '2021-10-12 22:19:02', b'0', 0);
1221 INSERT INTO `sys_menu` VALUES (1119, '请å‡ç”³è¯·æŸ¥è¯¢', 'oa:leave:query', 3, 1, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0', 0); 1273 INSERT INTO `sys_menu` VALUES (1119, '请å‡ç”³è¯·æŸ¥è¯¢', 'oa:leave:query', 3, 1, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0', 0);
1222 INSERT INTO `sys_menu` VALUES (1120, '请å‡ç”³è¯·åˆ›å»º', 'oa:leave:create', 3, 2, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0', 0); 1274 INSERT INTO `sys_menu` VALUES (1120, '请å‡ç”³è¯·åˆ›å»º', 'oa:leave:create', 3, 2, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0', 0);
@@ -1225,7 +1277,7 @@ INSERT INTO `sys_menu` VALUES (1122, '请å‡ç”³è¯·åˆ é™¤', 'oa:leave:delete', 3, @@ -1225,7 +1277,7 @@ INSERT INTO `sys_menu` VALUES (1122, '请å‡ç”³è¯·åˆ é™¤', 'oa:leave:delete', 3,
1225 INSERT INTO `sys_menu` VALUES (1123, '请å‡ç”³è¯·å¯¼å‡º', 'oa:leave:export', 3, 5, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0', 0); 1277 INSERT INTO `sys_menu` VALUES (1123, '请å‡ç”³è¯·å¯¼å‡º', 'oa:leave:export', 3, 5, 1118, '', '', '', 0, '', '2021-09-20 08:51:03', '', '2021-09-20 08:51:03', b'0', 0);
1226 INSERT INTO `sys_menu` VALUES (1124, '待办任务', '', 2, 2, 5, 'todo', 'edit', 'oa/todo/index', 0, '1', '2021-09-20 22:10:09', '1', '2021-09-21 23:17:12', b'0', 0); 1278 INSERT INTO `sys_menu` VALUES (1124, '待办任务', '', 2, 2, 5, 'todo', 'edit', 'oa/todo/index', 0, '1', '2021-09-20 22:10:09', '1', '2021-09-21 23:17:12', b'0', 0);
1227 INSERT INTO `sys_menu` VALUES (1125, 'æµç¨‹ç”³è¯·', '', 2, 3, 5, 'flow', 'form', 'oa/flow/index', 0, '1', '2021-10-23 22:10:09', '1', '2021-10-23 23:17:12', b'0', 0); 1279 INSERT INTO `sys_menu` VALUES (1125, 'æµç¨‹ç”³è¯·', '', 2, 3, 5, 'flow', 'form', 'oa/flow/index', 0, '1', '2021-10-23 22:10:09', '1', '2021-10-23 23:17:12', b'0', 0);
1228 -INSERT INTO `sys_menu` VALUES (1126, '支付应用信æ¯ç®¡ç†', '', 2, 0, 1117, 'app', '', 'pay/app/index', 0, '', '2021-11-10 01:13:30', '', '2021-11-10 01:13:30', b'0', 0); 1280 +INSERT INTO `sys_menu` VALUES (1126, '应用信æ¯', '', 2, 1, 1117, 'app', 'table', 'pay/app/index', 0, '', '2021-11-10 01:13:30', '1', '2021-12-25 16:56:41', b'0', 0);
1229 INSERT INTO `sys_menu` VALUES (1127, 'æ”¯ä»˜åº”ç”¨ä¿¡æ¯æŸ¥è¯¢', 'pay:app:query', 3, 1, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); 1281 INSERT INTO `sys_menu` VALUES (1127, 'æ”¯ä»˜åº”ç”¨ä¿¡æ¯æŸ¥è¯¢', 'pay:app:query', 3, 1, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0);
1230 INSERT INTO `sys_menu` VALUES (1128, '支付应用信æ¯åˆ›å»º', 'pay:app:create', 3, 2, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); 1282 INSERT INTO `sys_menu` VALUES (1128, '支付应用信æ¯åˆ›å»º', 'pay:app:create', 3, 2, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0);
1231 INSERT INTO `sys_menu` VALUES (1129, 'æ”¯ä»˜åº”ç”¨ä¿¡æ¯æ›´æ–°', 'pay:app:update', 3, 3, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0); 1283 INSERT INTO `sys_menu` VALUES (1129, 'æ”¯ä»˜åº”ç”¨ä¿¡æ¯æ›´æ–°', 'pay:app:update', 3, 3, 1126, '', '', '', 0, '', '2021-11-10 01:13:31', '', '2021-11-10 01:13:31', b'0', 0);
@@ -1243,6 +1295,45 @@ INSERT INTO `sys_menu` VALUES (1140, '租户创建', 'system:tenant:create', 3, @@ -1243,6 +1295,45 @@ INSERT INTO `sys_menu` VALUES (1140, '租户创建', 'system:tenant:create', 3,
1243 INSERT INTO `sys_menu` VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); 1295 INSERT INTO `sys_menu` VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0);
1244 INSERT INTO `sys_menu` VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); 1296 INSERT INTO `sys_menu` VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0);
1245 INSERT INTO `sys_menu` VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0); 1297 INSERT INTO `sys_menu` VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', 0, '', '2021-12-14 12:31:44', '', '2021-12-14 12:31:44', b'0', 0);
  1298 +INSERT INTO `sys_menu` VALUES (1144, '支付应用信æ¯ç®¡ç†', '', 2, 0, 1117, 'app', '', 'pay/app/index', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:48:05', b'1', 0);
  1299 +INSERT INTO `sys_menu` VALUES (1145, 'æ”¯ä»˜åº”ç”¨ä¿¡æ¯æŸ¥è¯¢', 'pay:app:query', 3, 1, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:53', b'1', 0);
  1300 +INSERT INTO `sys_menu` VALUES (1146, '支付应用信æ¯åˆ›å»º', 'pay:app:create', 3, 2, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:51', b'1', 0);
  1301 +INSERT INTO `sys_menu` VALUES (1147, 'æ”¯ä»˜åº”ç”¨ä¿¡æ¯æ›´æ–°', 'pay:app:update', 3, 3, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:48', b'1', 0);
  1302 +INSERT INTO `sys_menu` VALUES (1148, '支付应用信æ¯åˆ é™¤', 'pay:app:delete', 3, 4, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:46', b'1', 0);
  1303 +INSERT INTO `sys_menu` VALUES (1149, '支付应用信æ¯å¯¼å‡º', 'pay:app:export', 3, 5, 1144, '', '', '', 0, '', '2021-12-25 08:26:31', '', '2021-12-25 08:47:43', b'1', 0);
  1304 +INSERT INTO `sys_menu` VALUES (1150, '秘钥解æž', 'pay:channel:parsing', 3, 6, 1129, '', '', '', 0, '1', '2021-11-08 15:15:47', '1', '2021-11-08 15:15:47', b'0', 0);
  1305 +INSERT INTO `sys_menu` VALUES (1156, 'æ”¯ä»˜è®¢å•æŸ¥è¯¢', 'pay:order:query', 3, 1, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0);
  1306 +INSERT INTO `sys_menu` VALUES (1157, '支付订å•创建', 'pay:order:create', 3, 2, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0);
  1307 +INSERT INTO `sys_menu` VALUES (1158, 'æ”¯ä»˜è®¢å•æ›´æ–°', 'pay:order:update', 3, 3, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0);
  1308 +INSERT INTO `sys_menu` VALUES (1159, '支付订å•删除', 'pay:order:delete', 3, 4, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0);
  1309 +INSERT INTO `sys_menu` VALUES (1160, '支付订å•导出', 'pay:order:export', 3, 5, 1155, '', '', '', 0, '', '2021-12-25 08:29:01', '', '2021-12-25 08:29:01', b'0', 0);
  1310 +INSERT INTO `sys_menu` VALUES (1161, '退款订å•', '', 2, 3, 1117, 'refund', 'order', 'pay/refund/index', 0, '', '2021-12-25 08:29:07', '1', '2021-12-25 19:30:22', b'0', 0);
  1311 +INSERT INTO `sys_menu` VALUES (1162, 'é€€æ¬¾è®¢å•æŸ¥è¯¢', 'pay:refund:query', 3, 1, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0);
  1312 +INSERT INTO `sys_menu` VALUES (1163, '退款订å•创建', 'pay:refund:create', 3, 2, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0);
  1313 +INSERT INTO `sys_menu` VALUES (1164, 'é€€æ¬¾è®¢å•æ›´æ–°', 'pay:refund:update', 3, 3, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0);
  1314 +INSERT INTO `sys_menu` VALUES (1165, '退款订å•删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0);
  1315 +INSERT INTO `sys_menu` VALUES (1166, '退款订å•导出', 'pay:refund:export', 3, 5, 1161, '', '', '', 0, '', '2021-12-25 08:29:07', '', '2021-12-25 08:29:07', b'0', 0);
  1316 +INSERT INTO `sys_menu` VALUES (1173, '支付订å•', '', 2, 2, 1117, 'order', 'pay', 'pay/order/index', 0, '', '2021-12-25 08:49:43', '1', '2021-12-25 19:29:54', b'0', 0);
  1317 +INSERT INTO `sys_menu` VALUES (1174, 'æ”¯ä»˜è®¢å•æŸ¥è¯¢', 'pay:order:query', 3, 1, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0);
  1318 +INSERT INTO `sys_menu` VALUES (1175, '支付订å•创建', 'pay:order:create', 3, 2, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0);
  1319 +INSERT INTO `sys_menu` VALUES (1176, 'æ”¯ä»˜è®¢å•æ›´æ–°', 'pay:order:update', 3, 3, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0);
  1320 +INSERT INTO `sys_menu` VALUES (1177, '支付订å•删除', 'pay:order:delete', 3, 4, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0);
  1321 +INSERT INTO `sys_menu` VALUES (1178, '支付订å•导出', 'pay:order:export', 3, 5, 1173, '', '', '', 0, '', '2021-12-25 08:49:43', '', '2021-12-25 08:49:43', b'0', 0);
  1322 +INSERT INTO `sys_menu` VALUES (1179, '商户信æ¯', '', 2, 0, 1117, 'merchant', 'merchant', 'pay/merchant/index', 0, '', '2021-12-25 09:01:44', '1', '2021-12-25 17:02:13', b'0', 0);
  1323 +INSERT INTO `sys_menu` VALUES (1180, 'æ”¯ä»˜å•†æˆ·ä¿¡æ¯æŸ¥è¯¢', 'pay:merchant:query', 3, 1, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0);
  1324 +INSERT INTO `sys_menu` VALUES (1181, '支付商户信æ¯åˆ›å»º', 'pay:merchant:create', 3, 2, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0);
  1325 +INSERT INTO `sys_menu` VALUES (1182, 'æ”¯ä»˜å•†æˆ·ä¿¡æ¯æ›´æ–°', 'pay:merchant:update', 3, 3, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0);
  1326 +INSERT INTO `sys_menu` VALUES (1183, '支付商户信æ¯åˆ é™¤', 'pay:merchant:delete', 3, 4, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0);
  1327 +INSERT INTO `sys_menu` VALUES (1184, '支付商户信æ¯å¯¼å‡º', 'pay:merchant:export', 3, 5, 1179, '', '', '', 0, '', '2021-12-25 09:01:44', '', '2021-12-25 09:01:44', b'0', 0);
  1328 +INSERT INTO `sys_menu` VALUES (1185, '工作æµ', '', 1, 50, 0, '/bpm', 'tool', NULL, 0, '1', '2021-12-30 20:26:36', '1', '2021-12-30 20:26:36', b'0', 0);
  1329 +INSERT INTO `sys_menu` VALUES (1186, 'æµç¨‹ç®¡ç†', '', 1, 10, 1185, 'manager', 'nested', NULL, 0, '1', '2021-12-30 20:28:30', '1', '2021-12-30 20:28:57', b'0', 0);
  1330 +INSERT INTO `sys_menu` VALUES (1187, 'æµç¨‹è¡¨å•', '', 2, 0, 1186, 'form', 'form', 'bpm/form/index', 0, '', '2021-12-30 12:38:22', '1', '2021-12-31 23:20:38', b'0', 0);
  1331 +INSERT INTO `sys_menu` VALUES (1188, 'æµç¨‹è¡¨å•的查询', 'bpm:form:query', 3, 1, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2021-12-30 20:38:56', b'0', 0);
  1332 +INSERT INTO `sys_menu` VALUES (1189, 'æµç¨‹è¡¨å•的创建', 'bpm:form:create', 3, 2, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2021-12-30 20:39:00', b'0', 0);
  1333 +INSERT INTO `sys_menu` VALUES (1190, 'æµç¨‹è¡¨å•的更新', 'bpm:form:update', 3, 3, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2021-12-30 20:39:04', b'0', 0);
  1334 +INSERT INTO `sys_menu` VALUES (1191, 'æµç¨‹è¡¨å•的删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2021-12-30 20:39:08', b'0', 0);
  1335 +INSERT INTO `sys_menu` VALUES (1192, 'æµç¨‹è¡¨å•的导出', 'bpm:form:export', 3, 5, 1187, '', '', '', 0, '', '2021-12-30 12:38:22', '1', '2021-12-30 20:39:13', b'0', 0);
  1336 +INSERT INTO `sys_menu` VALUES (1193, 'æµç¨‹å®šä¹‰', '', 2, 1, 1186, 'model', 'guide', 'bpm/model/index', 0, '1', '2021-12-31 23:24:58', '1', '2021-12-31 23:24:58', b'0', 0);
1246 COMMIT; 1337 COMMIT;
1247 1338
1248 -- ---------------------------- 1339 -- ----------------------------
@@ -1304,7 +1395,7 @@ CREATE TABLE `sys_operate_log` ( @@ -1304,7 +1395,7 @@ CREATE TABLE `sys_operate_log` (
1304 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1395 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1305 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·', 1396 `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编å·',
1306 PRIMARY KEY (`id`) USING BTREE 1397 PRIMARY KEY (`id`) USING BTREE
1307 -) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='æ“作日志记录'; 1398 +) ENGINE=InnoDB AUTO_INCREMENT=245 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='æ“作日志记录';
1308 1399
1309 -- ---------------------------- 1400 -- ----------------------------
1310 -- Records of sys_operate_log 1401 -- Records of sys_operate_log
@@ -1371,7 +1462,7 @@ CREATE TABLE `sys_role` ( @@ -1371,7 +1462,7 @@ CREATE TABLE `sys_role` (
1371 BEGIN; 1462 BEGIN;
1372 INSERT INTO `sys_role` VALUES (1, '超级管ç†å‘˜', 'admin', 1, 1, '', 0, 1, '超级管ç†å‘˜', 'admin', '2021-01-05 17:03:48', '', '2021-12-15 04:52:44', b'0'); 1463 INSERT INTO `sys_role` VALUES (1, '超级管ç†å‘˜', 'admin', 1, 1, '', 0, 1, '超级管ç†å‘˜', 'admin', '2021-01-05 17:03:48', '', '2021-12-15 04:52:44', b'0');
1373 INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 11:46:58', b'0'); 1464 INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 11:46:58', b'0');
1374 -INSERT INTO `sys_role` VALUES (101, '测试账å·', 'test', 0, 2, '[104]', 0, 2, '132', '', '2021-01-06 13:49:35', '1', '2021-03-14 22:17:20', b'0'); 1465 +INSERT INTO `sys_role` VALUES (101, '测试账å·', 'test', 0, 2, '[102,108,109]', 0, 2, '132', '', '2021-01-06 13:49:35', '1', '2021-12-16 09:27:01', b'0');
1375 COMMIT; 1466 COMMIT;
1376 1467
1377 -- ---------------------------- 1468 -- ----------------------------
@@ -1388,7 +1479,7 @@ CREATE TABLE `sys_role_menu` ( @@ -1388,7 +1479,7 @@ CREATE TABLE `sys_role_menu` (
1388 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 1479 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
1389 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1480 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1390 PRIMARY KEY (`id`) USING BTREE 1481 PRIMARY KEY (`id`) USING BTREE
1391 -) ENGINE=InnoDB AUTO_INCREMENT=239 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色和èœå•å…³è”表'; 1482 +) ENGINE=InnoDB AUTO_INCREMENT=253 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色和èœå•å…³è”表';
1392 1483
1393 -- ---------------------------- 1484 -- ----------------------------
1394 -- Records of sys_role_menu 1485 -- Records of sys_role_menu
@@ -1548,6 +1639,20 @@ INSERT INTO `sys_role_menu` VALUES (235, 101, 101, '', '2021-01-21 03:23:27', '' @@ -1548,6 +1639,20 @@ INSERT INTO `sys_role_menu` VALUES (235, 101, 101, '', '2021-01-21 03:23:27', ''
1548 INSERT INTO `sys_role_menu` VALUES (236, 101, 1063, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); 1639 INSERT INTO `sys_role_menu` VALUES (236, 101, 1063, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0');
1549 INSERT INTO `sys_role_menu` VALUES (237, 101, 1064, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); 1640 INSERT INTO `sys_role_menu` VALUES (237, 101, 1064, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0');
1550 INSERT INTO `sys_role_menu` VALUES (238, 101, 1065, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); 1641 INSERT INTO `sys_role_menu` VALUES (238, 101, 1065, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0');
  1642 +INSERT INTO `sys_role_menu` VALUES (239, 101, 100, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1643 +INSERT INTO `sys_role_menu` VALUES (240, 101, 1001, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1644 +INSERT INTO `sys_role_menu` VALUES (241, 101, 1002, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1645 +INSERT INTO `sys_role_menu` VALUES (242, 101, 1003, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1646 +INSERT INTO `sys_role_menu` VALUES (243, 101, 1004, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1647 +INSERT INTO `sys_role_menu` VALUES (244, 101, 1005, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1648 +INSERT INTO `sys_role_menu` VALUES (245, 101, 1006, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1649 +INSERT INTO `sys_role_menu` VALUES (246, 101, 1007, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1650 +INSERT INTO `sys_role_menu` VALUES (247, 101, 1138, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1651 +INSERT INTO `sys_role_menu` VALUES (248, 101, 1139, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1652 +INSERT INTO `sys_role_menu` VALUES (249, 101, 1140, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1653 +INSERT INTO `sys_role_menu` VALUES (250, 101, 1141, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1654 +INSERT INTO `sys_role_menu` VALUES (251, 101, 1142, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
  1655 +INSERT INTO `sys_role_menu` VALUES (252, 101, 1143, '1', '2021-12-15 22:47:51', '1', '2021-12-15 22:47:51', b'0');
1551 COMMIT; 1656 COMMIT;
1552 1657
1553 -- ---------------------------- 1658 -- ----------------------------
@@ -1798,13 +1903,13 @@ CREATE TABLE `sys_user` ( @@ -1798,13 +1903,13 @@ CREATE TABLE `sys_user` (
1798 -- Records of sys_user 1903 -- Records of sys_user
1799 -- ---------------------------- 1904 -- ----------------------------
1800 BEGIN; 1905 BEGIN;
1801 -INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', 'èŠ‹é“æºç ', '管ç†å‘˜', 103, '[1]', 'aoteman@126.com', '15612345678', 1, 'http://127.0.0.1:48080/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', 0, '127.0.0.1', '2021-12-15 12:33:21', 'admin', '2021-01-05 17:03:47', NULL, '2021-12-15 12:33:21', b'0', 1); 1906 +INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', 'èŠ‹é“æºç ', '管ç†å‘˜', 103, '[1]', 'aoteman@126.com', '15612345678', 1, 'http://127.0.0.1:48080/api/infra/file/get/7e7ed694-2242-46cf-9ac9-0709debcc22f', 0, '127.0.0.1', '2022-01-02 17:02:50', 'admin', '2021-01-05 17:03:47', NULL, '2022-01-02 17:02:50', b'0', 1);
1802 INSERT INTO `sys_user` VALUES (2, 'ry', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', 'è‹¥ä¾', '测试员', 103, '[2]', 'ry@qq.com', '15666666666', 1, '', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '', '2021-12-13 01:26:34', b'1', 1); 1907 INSERT INTO `sys_user` VALUES (2, 'ry', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', 'è‹¥ä¾', '测试员', 103, '[2]', 'ry@qq.com', '15666666666', 1, '', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '', '2021-12-13 01:26:34', b'1', 1);
1803 -INSERT INTO `sys_user` VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋é“', 'ä¸è¦å“我', 103, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '', NULL, '', '2021-01-07 09:07:17', '1', '2021-12-13 01:26:55', b'0', 1);  
1804 -INSERT INTO `sys_user` VALUES (103, 'yuanma', '', 'æºç ', NULL, 100, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '', NULL, '', '2021-01-13 23:50:35', '', '2021-12-05 02:22:01', b'0', 1);  
1805 -INSERT INTO `sys_user` VALUES (104, 'test', '$2a$10$.TOFpaIiI3PzEwkGrNq0Eu6Cc3rOqJMxTb1DqeSEM8StxaGPBRKoi', '测试å·', NULL, 100, '[]', '', '15601691200', 1, '', 0, '127.0.0.1', '2021-12-13 07:41:55', '', '2021-01-21 02:13:53', NULL, '2021-12-13 07:41:55', b'0', 1);  
1806 -INSERT INTO `sys_user` VALUES (105, 'hradmin', '$2a$10$JEhJOL25X1eMnFfR3PILo.MoAljf29YukpL2w6H9GvVGjmqOCuh.O', 'hr-mgr', 'hr 管ç†å‘˜', 100, '[3]', '', '', 1, '', 0, '127.0.0.1', '2021-10-30 21:19:36', '1', '2021-09-25 16:50:41', NULL, '2021-12-05 02:22:03', b'0', 1);  
1807 -INSERT INTO `sys_user` VALUES (106, 'zhijiantianya', '$2a$10$Y0hSfV2udA8quqMeWukhTuHEoKpQ5tDhclG8WUWSOH7o/MGw185Ti', 'èŠ‹é“æºç ', '', NULL, NULL, '', '', 3, 'https://portrait.gitee.com/uploads/avatars/user/0/176_zhijiantianya_1578913741.png', 0, '', NULL, NULL, '2021-09-28 09:40:59', NULL, '2021-12-05 02:22:04', b'0', 1); 1908 +INSERT INTO `sys_user` VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋é“', 'ä¸è¦å“我', 104, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '', NULL, '', '2021-01-07 09:07:17', '104', '2021-12-16 09:26:10', b'0', 1);
  1909 +INSERT INTO `sys_user` VALUES (103, 'yuanma', '', 'æºç ', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '', NULL, '', '2021-01-13 23:50:35', '104', '2021-12-16 09:26:05', b'0', 1);
  1910 +INSERT INTO `sys_user` VALUES (104, 'test', '$2a$10$CkyM2xvzUhSWsh.JqGcSju.KjlPsaX1A76wO8O/mYtkpQvcp2jWTW', '测试å·', NULL, 107, '[]', '', '15601691200', 1, '', 0, '127.0.0.1', '2021-12-16 09:27:08', '', '2021-01-21 02:13:53', NULL, '2021-12-16 09:27:08', b'0', 1);
  1911 +INSERT INTO `sys_user` VALUES (105, 'hradmin', '$2a$10$JEhJOL25X1eMnFfR3PILo.MoAljf29YukpL2w6H9GvVGjmqOCuh.O', 'hr-mgr', 'hr 管ç†å‘˜', 109, '[3]', '', '18818260000', 1, '', 0, '127.0.0.1', '2021-10-30 21:19:36', '1', '2021-09-25 16:50:41', '1', '2021-12-16 09:26:41', b'0', 1);
  1912 +INSERT INTO `sys_user` VALUES (106, 'zhijiantianya', '$2a$10$Y0hSfV2udA8quqMeWukhTuHEoKpQ5tDhclG8WUWSOH7o/MGw185Ti', 'èŠ‹é“æºç ', '', NULL, NULL, '', '', 3, 'https://portrait.gitee.com/uploads/avatars/user/0/176_zhijiantianya_1578913741.png', 0, '', NULL, NULL, '2021-09-28 09:40:59', NULL, '2021-12-15 14:44:47', b'1', 1);
1808 COMMIT; 1913 COMMIT;
1809 1914
1810 -- ---------------------------- 1915 -- ----------------------------
@@ -1835,7 +1940,7 @@ INSERT INTO `sys_user_role` VALUES (4, 100, 101, '', NULL, '', NULL, b'0', 0); @@ -1835,7 +1940,7 @@ INSERT INTO `sys_user_role` VALUES (4, 100, 101, '', NULL, '', NULL, b'0', 0);
1835 INSERT INTO `sys_user_role` VALUES (5, 100, 1, '', NULL, '', NULL, b'0', 0); 1940 INSERT INTO `sys_user_role` VALUES (5, 100, 1, '', NULL, '', NULL, b'0', 0);
1836 INSERT INTO `sys_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0', 0); 1941 INSERT INTO `sys_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0', 0);
1837 INSERT INTO `sys_user_role` VALUES (7, 104, 101, '', NULL, '', NULL, b'0', 0); 1942 INSERT INTO `sys_user_role` VALUES (7, 104, 101, '', NULL, '', NULL, b'0', 0);
1838 -INSERT INTO `sys_user_role` VALUES (8, 106, 1, NULL, '2021-09-28 09:40:59', NULL, '2021-09-28 09:40:59', b'0', 0); 1943 +INSERT INTO `sys_user_role` VALUES (8, 106, 1, NULL, '2021-09-28 09:40:59', NULL, '2021-09-28 09:40:59', b'1', 0);
1839 INSERT INTO `sys_user_role` VALUES (9, 105, 1, '1', '2021-10-30 13:40:48', '1', '2021-10-30 13:40:48', b'0', 0); 1944 INSERT INTO `sys_user_role` VALUES (9, 105, 1, '1', '2021-10-30 13:40:48', '1', '2021-10-30 13:40:48', b'0', 0);
1840 COMMIT; 1945 COMMIT;
1841 1946
@@ -1864,6 +1969,39 @@ CREATE TABLE `sys_user_session` ( @@ -1864,6 +1969,39 @@ CREATE TABLE `sys_user_session` (
1864 -- Records of sys_user_session 1969 -- Records of sys_user_session
1865 -- ---------------------------- 1970 -- ----------------------------
1866 BEGIN; 1971 BEGIN;
  1972 +INSERT INTO `sys_user_session` VALUES ('0180929bb4b244b891253885e86ad9d1', 1, 2, '2021-12-16 09:37:48', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:07:48', NULL, '2021-12-16 09:07:48', b'0', 1);
  1973 +INSERT INTO `sys_user_session` VALUES ('01b7469337864db7a9b65747f38fa928', 1, 2, '2021-12-31 14:29:42', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 13:49:05', NULL, '2021-12-31 13:59:42', b'0', 1);
  1974 +INSERT INTO `sys_user_session` VALUES ('09c26e452a6c44129a2d495478b40d27', 1, 2, '2022-01-02 13:25:15', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 12:06:51', NULL, '2022-01-02 12:55:15', b'0', 1);
  1975 +INSERT INTO `sys_user_session` VALUES ('0b8545465544481da4d162a3a74a552e', 1, 2, '2021-12-15 23:48:37', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:44:07', NULL, '2021-12-15 23:18:37', b'0', 1);
  1976 +INSERT INTO `sys_user_session` VALUES ('1995595036aa4652bb887c43cfd35ba8', 1, 2, '2022-01-01 00:18:24', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 22:57:57', NULL, '2021-12-31 23:48:24', b'0', 1);
  1977 +INSERT INTO `sys_user_session` VALUES ('1b6154299e1a470ebf80d2eaef72b0e2', 1, 2, '2022-01-02 11:59:52', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 09:30:29', NULL, '2022-01-02 11:29:52', b'0', 1);
  1978 +INSERT INTO `sys_user_session` VALUES ('1b848d99cde6448097dcedc83fda4c0a', 1, 2, '2021-12-31 10:45:09', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 08:35:36', NULL, '2021-12-31 10:15:09', b'0', 1);
  1979 +INSERT INTO `sys_user_session` VALUES ('1bc6ad0827fe48099bcbdb9a206818ac', 104, 2, '2021-12-15 23:48:59', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 23:18:59', NULL, '2021-12-15 23:18:59', b'0', 1);
  1980 +INSERT INTO `sys_user_session` VALUES ('28d90f7da308407296fface4ca68d732', 1, 2, '2022-01-01 21:54:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 21:01:18', NULL, '2022-01-01 21:24:30', b'0', 1);
  1981 +INSERT INTO `sys_user_session` VALUES ('2d920ad234a442cd98f5f517d50d6b60', 1, 2, '2022-01-02 16:47:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 14:34:30', NULL, '2022-01-02 16:17:41', b'0', 1);
  1982 +INSERT INTO `sys_user_session` VALUES ('2ec1ca2d0053415599fa18e6bddf710e', 104, 2, '2021-12-16 10:08:04', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:27:08', NULL, '2021-12-16 09:38:04', b'0', 1);
  1983 +INSERT INTO `sys_user_session` VALUES ('345ad9af8d0c46c8ad285b57cabfd060', 1, 2, '2021-12-25 19:57:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 19:15:06', NULL, '2021-12-25 19:27:51', b'0', 1);
  1984 +INSERT INTO `sys_user_session` VALUES ('47949a90a88d4c49823d70995d980ee9', 1, 2, '2021-12-16 10:04:30', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:20:41', NULL, '2021-12-16 09:34:30', b'0', 1);
  1985 +INSERT INTO `sys_user_session` VALUES ('495da339c78846609991d9bc66e17dcf', 1, 2, '2021-12-31 22:54:24', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-31 21:47:55', NULL, '2021-12-31 22:24:24', b'0', 1);
  1986 +INSERT INTO `sys_user_session` VALUES ('4e00d142b22e4826938de31c221b6b32', 104, 2, '2021-12-16 09:54:24', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 09:24:24', NULL, '2021-12-16 01:27:04', b'1', 1);
  1987 +INSERT INTO `sys_user_session` VALUES ('5921e2838860430b80d02c2dc5bc9b14', 1, 2, '2022-01-01 18:38:17', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 17:19:06', NULL, '2022-01-01 18:08:17', b'0', 1);
  1988 +INSERT INTO `sys_user_session` VALUES ('64f51e60527349d6b4a0a74f3d8eca97', 104, 2, '2021-12-16 07:37:54', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:07:54', NULL, '2021-12-16 07:07:54', b'0', 1);
  1989 +INSERT INTO `sys_user_session` VALUES ('79924bcc8d594452a8ee8406d312b2c2', 1, 2, '2022-01-01 23:37:34', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 22:02:06', NULL, '2022-01-01 23:07:34', b'0', 1);
  1990 +INSERT INTO `sys_user_session` VALUES ('9122b55409a94388a7b277ad808a127c', 1, 2, '2022-01-01 17:18:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 16:20:04', NULL, '2022-01-01 16:48:53', b'0', 1);
  1991 +INSERT INTO `sys_user_session` VALUES ('91b94971b7f044c8b68420e6ef7377af', 1, 2, '2022-01-02 17:32:50', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 17:02:50', NULL, '2022-01-02 17:02:50', b'0', 1);
  1992 +INSERT INTO `sys_user_session` VALUES ('945e4bb19f4d4c28ba7135218ee3abe3', 1, 2, '2021-12-16 08:28:54', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:42:25', NULL, '2021-12-16 07:58:54', b'0', 1);
  1993 +INSERT INTO `sys_user_session` VALUES ('9526809b303f489b8aab0c05e6b483dd', 1, 2, '2022-01-01 00:51:19', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 00:21:19', NULL, '2022-01-01 00:21:19', b'0', 1);
  1994 +INSERT INTO `sys_user_session` VALUES ('9ee1349d7d3043759cb742a0fa5a3163', 1, 2, '2021-12-25 19:08:33', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 18:38:33', NULL, '2021-12-25 18:38:33', b'0', 1);
  1995 +INSERT INTO `sys_user_session` VALUES ('a155e6dfe4b74fbaa69fcca239facc40', 1, 2, '2021-12-16 07:37:39', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-16 07:07:39', NULL, '2021-12-16 07:07:39', b'0', 1);
  1996 +INSERT INTO `sys_user_session` VALUES ('a55b31ff9e6a41fcb931d2244b4240a8', 1, 2, '2021-12-30 22:32:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-30 20:04:02', NULL, '2021-12-30 22:02:56', b'0', 1);
  1997 +INSERT INTO `sys_user_session` VALUES ('ab449ce8f2ea456591d23515c188c242', 1, 2, '2021-12-25 17:55:45', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-25 16:42:42', NULL, '2021-12-25 17:25:45', b'0', 1);
  1998 +INSERT INTO `sys_user_session` VALUES ('b12325b8930245c09b75aa100dc1124d', 1, 2, '2022-01-01 09:12:53', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 08:09:05', NULL, '2022-01-01 08:42:53', b'0', 1);
  1999 +INSERT INTO `sys_user_session` VALUES ('bd655254904748f79c0ad47dfb49d457', 1, 2, '2022-01-01 08:05:32', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 07:35:32', NULL, '2022-01-01 07:35:32', b'0', 1);
  2000 +INSERT INTO `sys_user_session` VALUES ('c09baa895d79468db63417f60c65573c', 1, 2, '2022-01-01 11:33:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 10:13:48', NULL, '2022-01-01 11:03:44', b'0', 1);
  2001 +INSERT INTO `sys_user_session` VALUES ('da04f99dc14a4f28a8a77178861cb3ed', 104, 2, '2021-12-15 23:37:58', 'test', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:47:31', NULL, '2021-12-15 15:11:55', b'1', 1);
  2002 +INSERT INTO `sys_user_session` VALUES ('e290aebda5f34c379d0cf3e013cbcc8b', 1, 2, '2022-01-02 09:27:23', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-02 08:32:23', NULL, '2022-01-02 08:57:23', b'0', 1);
  2003 +INSERT INTO `sys_user_session` VALUES ('fe82f6ecb17449b595c7d6bd4bc1d371', 1, 2, '2021-12-15 23:16:49', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2021-12-15 22:46:49', NULL, '2021-12-15 14:46:53', b'1', 1);
  2004 +INSERT INTO `sys_user_session` VALUES ('ffeae9ee4b8649b6b9ececaa502a934d', 1, 2, '2022-01-01 19:56:49', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', NULL, '2022-01-01 18:47:31', NULL, '2022-01-01 19:26:49', b'0', 1);
1867 COMMIT; 2005 COMMIT;
1868 2006
1869 -- ---------------------------- 2007 -- ----------------------------
@@ -1896,25 +2034,25 @@ CREATE TABLE `tool_codegen_column` ( @@ -1896,25 +2034,25 @@ CREATE TABLE `tool_codegen_column` (
1896 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 2034 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
1897 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 2035 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1898 PRIMARY KEY (`id`) USING BTREE 2036 PRIMARY KEY (`id`) USING BTREE
1899 -) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代ç ç”Ÿæˆè¡¨å­—段定义'; 2037 +) ENGINE=InnoDB AUTO_INCREMENT=489 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代ç ç”Ÿæˆè¡¨å­—段定义';
1900 2038
1901 -- ---------------------------- 2039 -- ----------------------------
1902 -- Records of tool_codegen_column 2040 -- Records of tool_codegen_column
1903 -- ---------------------------- 2041 -- ----------------------------
1904 BEGIN; 2042 BEGIN;
1905 -INSERT INTO `tool_codegen_column` VALUES (243, 21, 'id', 'int(5)', '傿•°ä¸»é”®', b'0', b'1', '1', 1, 'Integer', 'id', '', NULL, b'0', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0');  
1906 -INSERT INTO `tool_codegen_column` VALUES (244, 21, 'group', 'varchar(50)', '傿•°åˆ†ç»„', b'0', b'0', '0', 2, 'String', 'group', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-03-06 02:20:02', b'0');  
1907 -INSERT INTO `tool_codegen_column` VALUES (245, 21, 'type', 'tinyint(4)', '傿•°ç±»åž‹', b'0', b'0', '0', 3, 'Integer', 'type', '', NULL, b'1', b'1', b'1', '=', b'1', 'select', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0');  
1908 -INSERT INTO `tool_codegen_column` VALUES (246, 21, 'name', 'varchar(100)', '傿•°åç§°', b'0', b'0', '0', 4, 'String', 'name', '', NULL, b'1', b'1', b'1', 'LIKE', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0');  
1909 -INSERT INTO `tool_codegen_column` VALUES (247, 21, 'key', 'varchar(100)', '傿•°é”®å', b'0', b'0', '0', 5, 'String', 'key', '', NULL, b'1', b'1', b'1', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0');  
1910 -INSERT INTO `tool_codegen_column` VALUES (248, 21, 'value', 'varchar(500)', '傿•°é”®å€¼', b'0', b'0', '0', 6, 'String', 'value', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-03-06 02:20:02', b'0');  
1911 -INSERT INTO `tool_codegen_column` VALUES (249, 21, 'sensitive', 'bit(1)', 'æ˜¯å¦æ•感', b'0', b'0', '0', 7, 'Boolean', 'sensitive', '', NULL, b'1', b'1', b'0', '=', b'1', 'radio', '', '2021-02-06 19:51:35', '', '2021-03-06 02:20:02', b'0');  
1912 -INSERT INTO `tool_codegen_column` VALUES (250, 21, 'remark', 'varchar(500)', '备注', b'1', b'0', '0', 8, 'String', 'remark', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '', '2021-03-06 02:20:02', b'0');  
1913 -INSERT INTO `tool_codegen_column` VALUES (251, 21, 'creator', 'varchar(64)', '创建者', b'1', b'0', '0', 9, 'String', 'createBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0');  
1914 -INSERT INTO `tool_codegen_column` VALUES (252, 21, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 10, 'Date', 'createTime', '', NULL, b'0', b'0', b'1', 'BETWEEN', b'1', 'datetime', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0');  
1915 -INSERT INTO `tool_codegen_column` VALUES (253, 21, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 11, 'String', 'updateBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0');  
1916 -INSERT INTO `tool_codegen_column` VALUES (254, 21, 'update_time', 'datetime', 'æ›´æ–°æ—¶é—´', b'0', b'0', '0', 12, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0');  
1917 -INSERT INTO `tool_codegen_column` VALUES (255, 21, 'deleted', 'bit(1)', '是å¦åˆ é™¤', b'0', b'0', '0', 13, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); 2043 +INSERT INTO `tool_codegen_column` VALUES (243, 21, 'id', 'int(5)', '傿•°ä¸»é”®', b'0', b'1', '1', 1, 'Integer', 'id', '', NULL, b'0', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2044 +INSERT INTO `tool_codegen_column` VALUES (244, 21, 'group', 'varchar(50)', '傿•°åˆ†ç»„', b'0', b'0', '0', 2, 'String', 'group', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2045 +INSERT INTO `tool_codegen_column` VALUES (245, 21, 'type', 'tinyint(4)', '傿•°ç±»åž‹', b'0', b'0', '0', 3, 'Integer', 'type', '', NULL, b'1', b'1', b'1', '=', b'1', 'select', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2046 +INSERT INTO `tool_codegen_column` VALUES (246, 21, 'name', 'varchar(100)', '傿•°åç§°', b'0', b'0', '0', 4, 'String', 'name', '', NULL, b'1', b'1', b'1', 'LIKE', b'1', 'input', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2047 +INSERT INTO `tool_codegen_column` VALUES (247, 21, 'key', 'varchar(100)', '傿•°é”®å', b'0', b'0', '0', 5, 'String', 'key', '', NULL, b'1', b'1', b'1', '=', b'1', 'input', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2048 +INSERT INTO `tool_codegen_column` VALUES (248, 21, 'value', 'varchar(500)', '傿•°é”®å€¼', b'0', b'0', '0', 6, 'String', 'value', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2049 +INSERT INTO `tool_codegen_column` VALUES (249, 21, 'sensitive', 'bit(1)', 'æ˜¯å¦æ•感', b'0', b'0', '0', 7, 'Boolean', 'sensitive', '', NULL, b'1', b'1', b'0', '=', b'1', 'radio', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2050 +INSERT INTO `tool_codegen_column` VALUES (250, 21, 'remark', 'varchar(500)', '备注', b'1', b'0', '0', 8, 'String', 'remark', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2051 +INSERT INTO `tool_codegen_column` VALUES (251, 21, 'creator', 'varchar(64)', '创建者', b'1', b'0', '0', 9, 'String', 'createBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2052 +INSERT INTO `tool_codegen_column` VALUES (252, 21, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 10, 'Date', 'createTime', '', NULL, b'0', b'0', b'1', 'BETWEEN', b'1', 'datetime', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2053 +INSERT INTO `tool_codegen_column` VALUES (253, 21, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 11, 'String', 'updateBy', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2054 +INSERT INTO `tool_codegen_column` VALUES (254, 21, 'update_time', 'datetime', 'æ›´æ–°æ—¶é—´', b'0', b'0', '0', 12, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
  2055 +INSERT INTO `tool_codegen_column` VALUES (255, 21, 'deleted', 'bit(1)', '是å¦åˆ é™¤', b'0', b'0', '0', 13, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
1918 INSERT INTO `tool_codegen_column` VALUES (269, 24, 'id', 'bigint(20)', '任务编å·', b'0', b'1', '1', 1, 'Long', 'id', '', '1024', b'0', b'1', b'0', '=', b'1', 'input', '', '2021-02-07 06:39:34', '', '2021-02-07 06:44:19', b'0'); 2056 INSERT INTO `tool_codegen_column` VALUES (269, 24, 'id', 'bigint(20)', '任务编å·', b'0', b'1', '1', 1, 'Long', 'id', '', '1024', b'0', b'1', b'0', '=', b'1', 'input', '', '2021-02-07 06:39:34', '', '2021-02-07 06:44:19', b'0');
1919 INSERT INTO `tool_codegen_column` VALUES (270, 24, 'name', 'varchar(32)', '任务åç§°', b'0', b'0', '0', 2, 'String', 'name', '', '测试任务', b'1', b'1', b'1', 'LIKE', b'1', 'input', '', '2021-02-07 06:39:34', '', '2021-02-07 06:44:19', b'0'); 2057 INSERT INTO `tool_codegen_column` VALUES (270, 24, 'name', 'varchar(32)', '任务åç§°', b'0', b'0', '0', 2, 'String', 'name', '', '测试任务', b'1', b'1', b'1', 'LIKE', b'1', 'input', '', '2021-02-07 06:39:34', '', '2021-02-07 06:44:19', b'0');
1920 INSERT INTO `tool_codegen_column` VALUES (271, 24, 'status', 'tinyint(4)', '任务状æ€', b'0', b'0', '0', 3, 'Integer', 'status', 'inf_job_status', '1', b'0', b'0', b'1', '=', b'1', 'radio', '', '2021-02-07 06:39:34', '', '2021-02-07 07:55:17', b'0'); 2058 INSERT INTO `tool_codegen_column` VALUES (271, 24, 'status', 'tinyint(4)', '任务状æ€', b'0', b'0', '0', 3, 'Integer', 'status', 'inf_job_status', '1', b'0', b'0', b'1', '=', b'1', 'radio', '', '2021-02-07 06:39:34', '', '2021-02-07 07:55:17', b'0');
@@ -2114,6 +2252,16 @@ INSERT INTO `tool_codegen_column` VALUES (475, 39, 'create_time', 'datetime', 'å @@ -2114,6 +2252,16 @@ INSERT INTO `tool_codegen_column` VALUES (475, 39, 'create_time', 'datetime', 'å
2114 INSERT INTO `tool_codegen_column` VALUES (476, 39, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 8, 'String', 'updater', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-12-14 09:51:12', '1', '2021-12-14 10:02:12', b'0'); 2252 INSERT INTO `tool_codegen_column` VALUES (476, 39, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 8, 'String', 'updater', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-12-14 09:51:12', '1', '2021-12-14 10:02:12', b'0');
2115 INSERT INTO `tool_codegen_column` VALUES (477, 39, 'update_time', 'datetime', 'æ›´æ–°æ—¶é—´', b'0', b'0', '0', 9, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '1', '2021-12-14 09:51:12', '1', '2021-12-14 10:02:12', b'0'); 2253 INSERT INTO `tool_codegen_column` VALUES (477, 39, 'update_time', 'datetime', 'æ›´æ–°æ—¶é—´', b'0', b'0', '0', 9, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '1', '2021-12-14 09:51:12', '1', '2021-12-14 10:02:12', b'0');
2116 INSERT INTO `tool_codegen_column` VALUES (478, 39, 'deleted', 'bit(1)', '是å¦åˆ é™¤', b'0', b'0', '0', 10, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '1', '2021-12-14 09:51:12', '1', '2021-12-14 10:02:12', b'0'); 2254 INSERT INTO `tool_codegen_column` VALUES (478, 39, 'deleted', 'bit(1)', '是å¦åˆ é™¤', b'0', b'0', '0', 10, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '1', '2021-12-14 09:51:12', '1', '2021-12-14 10:02:12', b'0');
  2255 +INSERT INTO `tool_codegen_column` VALUES (479, 40, 'id', 'bigint', 'ç¼–å·', b'0', b'1', '1', 1, 'Long', 'id', '', NULL, b'0', b'1', b'0', '=', b'1', 'input', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2256 +INSERT INTO `tool_codegen_column` VALUES (480, 40, 'name', 'varchar(64)', '表å•å', b'0', b'0', '0', 2, 'String', 'name', '', NULL, b'1', b'1', b'1', 'LIKE', b'1', 'input', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2257 +INSERT INTO `tool_codegen_column` VALUES (481, 40, 'status', 'tinyint', 'å¼€å¯çжæ€', b'0', b'0', '0', 3, 'Integer', 'status', 'sys_common_status', NULL, b'1', b'1', b'0', '=', b'1', 'radio', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2258 +INSERT INTO `tool_codegen_column` VALUES (482, 40, 'fields', 'varchar(1024)', '表å•é…ç½®', b'0', b'0', '0', 4, 'String', 'fields', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2259 +INSERT INTO `tool_codegen_column` VALUES (483, 40, 'remark', 'varchar(255)', '备注', b'1', b'0', '0', 5, 'String', 'remark', '', NULL, b'1', b'1', b'0', '=', b'1', 'input', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2260 +INSERT INTO `tool_codegen_column` VALUES (484, 40, 'creator', 'varchar(64)', '创建者', b'1', b'0', '0', 6, 'String', 'creator', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2261 +INSERT INTO `tool_codegen_column` VALUES (485, 40, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 7, 'Date', 'createTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'1', 'datetime', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2262 +INSERT INTO `tool_codegen_column` VALUES (486, 40, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 8, 'String', 'updater', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2263 +INSERT INTO `tool_codegen_column` VALUES (487, 40, 'update_time', 'datetime', 'æ›´æ–°æ—¶é—´', b'0', b'0', '0', 9, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
  2264 +INSERT INTO `tool_codegen_column` VALUES (488, 40, 'deleted', 'bit(1)', '是å¦åˆ é™¤', b'0', b'0', '0', 10, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '1', '2021-12-30 20:33:27', '1', '2021-12-30 20:37:58', b'0');
2117 COMMIT; 2265 COMMIT;
2118 2266
2119 -- ---------------------------- 2267 -- ----------------------------
@@ -2139,13 +2287,13 @@ CREATE TABLE `tool_codegen_table` ( @@ -2139,13 +2287,13 @@ CREATE TABLE `tool_codegen_table` (
2139 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 2287 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
2140 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 2288 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
2141 PRIMARY KEY (`id`) USING BTREE 2289 PRIMARY KEY (`id`) USING BTREE
2142 -) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代ç ç”Ÿæˆè¡¨å®šä¹‰'; 2290 +) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代ç ç”Ÿæˆè¡¨å®šä¹‰';
2143 2291
2144 -- ---------------------------- 2292 -- ----------------------------
2145 -- Records of tool_codegen_table 2293 -- Records of tool_codegen_table
2146 -- ---------------------------- 2294 -- ----------------------------
2147 BEGIN; 2295 BEGIN;
2148 -INSERT INTO `tool_codegen_table` VALUES (21, 1, 'inf_config', '傿•°é…置表', NULL, 'infra', 'config', 'InfConfig', '傿•°é…ç½®', '芋艿', 1, NULL, '', '2021-02-06 19:51:35', '', '2021-02-06 19:51:35', b'0'); 2296 +INSERT INTO `tool_codegen_table` VALUES (21, 1, 'inf_config', '傿•°é…置表', NULL, 'infra', 'config', 'InfConfig', '傿•°é…ç½®', '芋艿', 1, NULL, '', '2021-02-06 19:51:35', '1', '2021-12-31 22:06:46', b'0');
2149 INSERT INTO `tool_codegen_table` VALUES (22, 2, 'sys_file', '文件表\n', NULL, 'system', 'file', 'SysFile', '文件', '芋艿', 1, NULL, '', '2021-02-06 20:28:34', '', '2021-02-06 20:28:34', b'0'); 2297 INSERT INTO `tool_codegen_table` VALUES (22, 2, 'sys_file', '文件表\n', NULL, 'system', 'file', 'SysFile', '文件', '芋艿', 1, NULL, '', '2021-02-06 20:28:34', '', '2021-02-06 20:28:34', b'0');
2150 INSERT INTO `tool_codegen_table` VALUES (24, 1, 'inf_job', '定时任务表', NULL, 'infra', 'job', 'InfJob', '定时任务', 'èŠ‹é“æºç ', 1, NULL, '', '2021-02-07 06:39:34', '', '2021-02-07 06:46:56', b'0'); 2298 INSERT INTO `tool_codegen_table` VALUES (24, 1, 'inf_job', '定时任务表', NULL, 'infra', 'job', 'InfJob', '定时任务', 'èŠ‹é“æºç ', 1, NULL, '', '2021-02-07 06:39:34', '', '2021-02-07 06:46:56', b'0');
2151 INSERT INTO `tool_codegen_table` VALUES (25, 1, 'inf_job_log', '定时任务日志表', NULL, 'infra', 'jobLog', 'InfJobLog', '定时任务', '芋艿', 1, NULL, '', '2021-02-08 04:58:41', '', '2021-02-08 10:09:52', b'0'); 2299 INSERT INTO `tool_codegen_table` VALUES (25, 1, 'inf_job_log', '定时任务日志表', NULL, 'infra', 'jobLog', 'InfJobLog', '定时任务', '芋艿', 1, NULL, '', '2021-02-08 04:58:41', '', '2021-02-08 10:09:52', b'0');
@@ -2160,6 +2308,7 @@ INSERT INTO `tool_codegen_table` VALUES (36, 1, 'sys_sms_log', '短信日志', N @@ -2160,6 +2308,7 @@ INSERT INTO `tool_codegen_table` VALUES (36, 1, 'sys_sms_log', '短信日志', N
2160 INSERT INTO `tool_codegen_table` VALUES (37, 1, 'inf_error_code', '错误ç è¡¨', NULL, 'infra', 'errorcode', 'InfErrorCode', '错误ç ', 'èŠ‹é“æºç ', 1, 2, '1', '2021-04-20 15:27:45', '1', '2021-04-21 00:55:37', b'0'); 2308 INSERT INTO `tool_codegen_table` VALUES (37, 1, 'inf_error_code', '错误ç è¡¨', NULL, 'infra', 'errorcode', 'InfErrorCode', '错误ç ', 'èŠ‹é“æºç ', 1, 2, '1', '2021-04-20 15:27:45', '1', '2021-04-21 00:55:37', b'0');
2161 INSERT INTO `tool_codegen_table` VALUES (38, 1, 'tool_test_demo', '字典类型表', NULL, 'tool', 'test', 'ToolTestDemo', '字典类型', '芋艿', 1, NULL, '1', '2021-04-26 12:25:51', '1', '2021-05-03 00:45:45', b'0'); 2309 INSERT INTO `tool_codegen_table` VALUES (38, 1, 'tool_test_demo', '字典类型表', NULL, 'tool', 'test', 'ToolTestDemo', '字典类型', '芋艿', 1, NULL, '1', '2021-04-26 12:25:51', '1', '2021-05-03 00:45:45', b'0');
2162 INSERT INTO `tool_codegen_table` VALUES (39, 1, 'sys_tenant', '租户表', NULL, 'system', 'tenant', 'SysTenant', '租户', 'èŠ‹é“æºç ', 1, 1, '1', '2021-12-05 01:04:21', '1', '2021-12-14 10:02:12', b'0'); 2310 INSERT INTO `tool_codegen_table` VALUES (39, 1, 'sys_tenant', '租户表', NULL, 'system', 'tenant', 'SysTenant', '租户', 'èŠ‹é“æºç ', 1, 1, '1', '2021-12-05 01:04:21', '1', '2021-12-14 10:02:12', b'0');
  2311 +INSERT INTO `tool_codegen_table` VALUES (40, 1, 'bpm_form', '工作æµçš„表å•定义', NULL, 'bpm', 'form', 'BpmForm', '工作æµçš„', 'èŠ‹é“æºç ', 1, 1186, '1', '2021-12-30 12:32:54', '1', '2021-12-30 20:37:58', b'0');
2163 COMMIT; 2312 COMMIT;
2164 2313
2165 -- ---------------------------- 2314 -- ----------------------------
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/form/vo/WfFormExcelVO.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;  
2 -  
3 -import lombok.*;  
4 -import java.util.*;  
5 -  
6 -import com.alibaba.excel.annotation.ExcelProperty;  
7 -  
8 -/**  
9 - * 动态表单 Excel VO  
10 - *  
11 - * @author 芋艿  
12 - */  
13 -@Data  
14 -public class WfFormExcelVO {  
15 -  
16 - @ExcelProperty("表单编号")  
17 - private Long id;  
18 -  
19 - @ExcelProperty("表单名称")  
20 - private String name;  
21 -  
22 - @ExcelProperty("商户状态")  
23 - private Integer status;  
24 -  
25 - @ExcelProperty("表单JSON")  
26 - private String formJson;  
27 -  
28 - @ExcelProperty("备注")  
29 - private String remark;  
30 -  
31 - @ExcelProperty("创建时间")  
32 - private Date createTime;  
33 -  
34 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/form/vo/WfFormExportReqVO.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;  
2 -  
3 -import lombok.*;  
4 -import java.util.*;  
5 -import io.swagger.annotations.*;  
6 -import org.springframework.format.annotation.DateTimeFormat;  
7 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
8 -  
9 -@ApiModel(value = "动态表单 Excel 导出 Request VO", description = "参数和 OsFormPageReqVO 是一致的")  
10 -@Data  
11 -public class WfFormExportReqVO {  
12 -  
13 - @ApiModelProperty(value = "表单名称")  
14 - private String name;  
15 -  
16 - @ApiModelProperty(value = "商户状态")  
17 - private Integer status;  
18 -  
19 - @ApiModelProperty(value = "表单JSON")  
20 - private String formJson;  
21 -  
22 - @ApiModelProperty(value = "备注")  
23 - private String remark;  
24 -  
25 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
26 - @ApiModelProperty(value = "开始创建时间")  
27 - private Date beginCreateTime;  
28 -  
29 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
30 - @ApiModelProperty(value = "结束创建时间")  
31 - private Date endCreateTime;  
32 -  
33 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/form/vo/WfFormPageReqVO.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;  
2 -  
3 -import lombok.*;  
4 -import java.util.*;  
5 -import io.swagger.annotations.*;  
6 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
7 -import org.springframework.format.annotation.DateTimeFormat;  
8 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
9 -  
10 -@ApiModel("动态表单分页 Request VO")  
11 -@Data  
12 -@EqualsAndHashCode(callSuper = true)  
13 -@ToString(callSuper = true)  
14 -public class WfFormPageReqVO extends PageParam {  
15 -  
16 - @ApiModelProperty(value = "表单名称")  
17 - private String name;  
18 -  
19 - @ApiModelProperty(value = "商户状态")  
20 - private Integer status;  
21 -  
22 - @ApiModelProperty(value = "表单JSON")  
23 - private String formJson;  
24 -  
25 - @ApiModelProperty(value = "备注")  
26 - private String remark;  
27 -  
28 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
29 - @ApiModelProperty(value = "开始创建时间")  
30 - private Date beginCreateTime;  
31 -  
32 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
33 - @ApiModelProperty(value = "结束创建时间")  
34 - private Date endCreateTime;  
35 -  
36 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/form/vo/WfFormRespVO.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;  
2 -  
3 -import lombok.*;  
4 -import java.util.*;  
5 -import io.swagger.annotations.*;  
6 -  
7 -@ApiModel("动态表单 Response VO")  
8 -@Data  
9 -@EqualsAndHashCode(callSuper = true)  
10 -@ToString(callSuper = true)  
11 -public class WfFormRespVO extends WfFormBaseVO {  
12 -  
13 - @ApiModelProperty(value = "表单编号", required = true)  
14 - private Long id;  
15 -  
16 - @ApiModelProperty(value = "创建时间", required = true)  
17 - private Date createTime;  
18 -  
19 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/ProcessDefinitionController.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.CommonResult;  
4 -import org.activiti.api.process.runtime.ProcessRuntime;  
5 -import org.activiti.engine.RepositoryService;  
6 -import org.springframework.web.bind.annotation.GetMapping;  
7 -import org.springframework.web.bind.annotation.RequestMapping;  
8 -import org.springframework.web.bind.annotation.RequestParam;  
9 -import org.springframework.web.bind.annotation.RestController;  
10 -  
11 -import javax.annotation.Resource;  
12 -  
13 -// TODO @json:swagger 和 validation 的注解,后续要补全下哈。可以等 workflow 基本写的差不多之后  
14 -@RestController  
15 -@RequestMapping("/workflow/process/definition")  
16 -public class ProcessDefinitionController {  
17 -  
18 - @Resource  
19 - private RepositoryService repositoryService;  
20 -  
21 - @Resource  
22 - private ProcessRuntime processRuntime;  
23 -  
24 -  
25 - @GetMapping(value = "/getStartForm")  
26 - public CommonResult<String> getStartForm(@RequestParam("processKey") String processKey){  
27 - //这样查似乎有问题??, 暂时写死  
28 -// final ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().  
29 -// processDefinitionKey(processKey).latestVersion().singleResult();  
30 -// processRuntime.processDefinition(processDefinition.getId()).getFormKey();  
31 - return CommonResult.success("/flow/leave/apply");  
32 - }  
33 -  
34 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/form/WfFormConvert.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.convert.form;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormCreateReqVO;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormExcelVO;  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormRespVO;  
6 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormUpdateReqVO;  
7 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;  
8 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
9 -import org.mapstruct.Mapper;  
10 -import org.mapstruct.factory.Mappers;  
11 -  
12 -import java.util.List;  
13 -  
14 -/**  
15 - * 动态表单 Convert  
16 - *  
17 - * @author 芋艿  
18 - */  
19 -@Mapper  
20 -public interface WfFormConvert {  
21 -  
22 - WfFormConvert INSTANCE = Mappers.getMapper(WfFormConvert.class);  
23 -  
24 - WfForm convert(WfFormCreateReqVO bean);  
25 -  
26 - WfForm convert(WfFormUpdateReqVO bean);  
27 -  
28 - WfFormRespVO convert(WfForm bean);  
29 -  
30 - List<WfFormRespVO> convertList(List<WfForm> list);  
31 -  
32 - PageResult<WfFormRespVO> convertPage(PageResult<WfForm> page);  
33 -  
34 - List<WfFormExcelVO> convertList02(List<WfForm> list);  
35 -  
36 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/oa/OaLeaveConvert.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.convert.oa;  
2 -  
3 -import java.util.*;  
4 -  
5 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
6 -  
7 -import org.mapstruct.Mapper;  
8 -import org.mapstruct.factory.Mappers;  
9 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;  
10 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;  
11 -  
12 -/**  
13 - * 请假申请 Convert  
14 - *  
15 - * @author 芋艿  
16 - */  
17 -@Mapper  
18 -public interface OaLeaveConvert {  
19 -  
20 - OaLeaveConvert INSTANCE = Mappers.getMapper(OaLeaveConvert.class);  
21 -  
22 - OaLeaveDO convert(OaLeaveCreateReqVO bean);  
23 -  
24 - OaLeaveDO convert(OaLeaveUpdateReqVO bean);  
25 -  
26 - OaLeaveRespVO convert(OaLeaveDO bean);  
27 -  
28 - List<OaLeaveRespVO> convertList(List<OaLeaveDO> list);  
29 -  
30 - PageResult<OaLeaveRespVO> convertPage(PageResult<OaLeaveDO> page);  
31 -  
32 - List<OaLeaveExcelVO> convertList02(List<OaLeaveDO> list);  
33 -  
34 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/workflow/TodoTaskConvert.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.convert.workflow;  
2 -  
3 -import org.mapstruct.Mapper;  
4 -import org.mapstruct.factory.Mappers;  
5 -  
6 -@Mapper  
7 -public interface TodoTaskConvert {  
8 - TodoTaskConvert INSTANCE = Mappers.getMapper(TodoTaskConvert.class);  
9 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/process/ProcessDefinitionDO.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.process;  
2 -  
3 -/**  
4 - * 流程模型实体类 映射 activiti ProcessDefinition接口  
5 - *  
6 - * @author ZJQ  
7 - * @date 2021/9/7 23:23  
8 - */  
9 -public class ProcessDefinitionDO {  
10 -  
11 - private String id;  
12 -  
13 - private String category;  
14 -  
15 - private String key;  
16 -  
17 - private String name;  
18 -  
19 - private String version;  
20 -  
21 - private String resourceName;  
22 -  
23 - private String deploymentId;  
24 -  
25 - private String diagramResourceName;  
26 -  
27 - private boolean suspended;  
28 -  
29 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/mysql/form/WfFormMapper.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.form;  
2 -  
3 -  
4 -  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormExportReqVO;  
6 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormPageReqVO;  
7 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;  
8 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
9 -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;  
10 -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;  
11 -import org.apache.ibatis.annotations.Mapper;  
12 -  
13 -import java.util.List;  
14 -  
15 -/**  
16 - * 动态表单 Mapper  
17 - *  
18 - * @author 风里雾里  
19 - */  
20 -@Mapper  
21 -public interface WfFormMapper extends BaseMapperX<WfForm> {  
22 -  
23 - default PageResult<WfForm> selectPage(WfFormPageReqVO reqVO) {  
24 - return selectPage(reqVO, new QueryWrapperX<WfForm>()  
25 - .likeIfPresent("name", reqVO.getName())  
26 - .eqIfPresent("status", reqVO.getStatus())  
27 - .eqIfPresent("form_json", reqVO.getFormJson())  
28 - .eqIfPresent("remark", reqVO.getRemark())  
29 - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())  
30 - .orderByDesc("id") );  
31 - }  
32 -  
33 - default List<WfForm> selectList(WfFormExportReqVO reqVO) {  
34 - return selectList(new QueryWrapperX<WfForm>()  
35 - .likeIfPresent("name", reqVO.getName())  
36 - .eqIfPresent("status", reqVO.getStatus())  
37 - .eqIfPresent("form_json", reqVO.getFormJson())  
38 - .eqIfPresent("remark", reqVO.getRemark())  
39 - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())  
40 - .orderByDesc("id") );  
41 - }  
42 -  
43 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/OaErrorCodeConstants.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.enums;  
2 -  
3 -import cn.iocoder.yudao.framework.common.exception.ErrorCode;  
4 -/**  
5 - * activiti 系统 错误码枚举类  
6 - *  
7 - * 003 activiti  
8 - * 001 oa  
9 - * activiti 系统,使用 1-003-000-000 段  
10 - */  
11 -public interface OaErrorCodeConstants {  
12 - ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在");  
13 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/form/WfFormErrorCodeConstants.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.enums.form;  
2 -  
3 -import cn.iocoder.yudao.framework.common.exception.ErrorCode;  
4 -  
5 -/**  
6 - * activiti 系统 错误码枚举类  
7 - *  
8 - * 003 activiti  
9 - * 001 oa  
10 - * activiti 系统,使用 1-003-000-000 段  
11 - */  
12 -public interface WfFormErrorCodeConstants {  
13 - ErrorCode FORM_NOT_EXISTS = new ErrorCode(1003001002, "动态表单不存在");  
14 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/package-info.java deleted
1 -// TODO @芋艿:思考下 activiti、oa 的定位,边界,模块的拆分  
2 -package cn.iocoder.yudao.adminserver.modules.activiti;  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/ReportBackEndProcessor.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.oa;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;  
5 -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;  
6 -import org.activiti.engine.delegate.DelegateExecution;  
7 -import org.activiti.engine.delegate.ExecutionListener;  
8 -import org.springframework.stereotype.Component;  
9 -import org.springframework.transaction.annotation.Transactional;  
10 -  
11 -import javax.annotation.Resource;  
12 -  
13 -@Component  
14 -public class ReportBackEndProcessor implements ExecutionListener {  
15 -  
16 - @Resource  
17 - private OaLeaveMapper leaveMapper;  
18 -  
19 -  
20 -// @Override  
21 -// @Transactional(rollbackFor = Exception.class)  
22 -// public void notify(DelegateTask delegateTask) {  
23 -// final String businessKey = delegateTask.getExecution().getProcessInstanceBusinessKey();  
24 -// UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();  
25 -// updateWrapper.eq("id", Long.valueOf(businessKey));  
26 -// OaLeaveDO updateDo = new OaLeaveDO();  
27 -// updateDo.setStatus(2);  
28 -// leaveMapper.update(updateDo, updateWrapper);  
29 -// }  
30 -  
31 - @Override  
32 - @Transactional(rollbackFor = Exception.class)  
33 - public void notify(DelegateExecution delegateExecution) {  
34 - final String businessKey = delegateExecution.getProcessInstanceBusinessKey();  
35 - // TODO @json:service 不要出现 dao 的元素,例如说 UpdateWrapper。这里,我们可以调用 updateById 方法  
36 - UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();  
37 - updateWrapper.eq("id", Long.valueOf(businessKey));  
38 - OaLeaveDO updateDo = new OaLeaveDO();  
39 - updateDo.setStatus(2); // TODO @json:status 要枚举起来,不要出现 magic number  
40 - leaveMapper.update(updateDo, updateWrapper);  
41 - }  
42 -  
43 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/ProcessService.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.process;  
2 -  
3 -import org.springframework.web.multipart.MultipartFile;  
4 -  
5 -/**  
6 - * 流程基础管理  
7 - *  
8 - * @author ZJQ  
9 - * @date 2021/9/5 21:00  
10 - */  
11 -public interface ProcessService {  
12 -  
13 - /**  
14 - * 上传流程文件,进行流程模型部署  
15 - * @param multipartFile 上传文件  
16 - */  
17 - void deployProcess(MultipartFile multipartFile);  
18 -  
19 -  
20 - /**  
21 - * 激活或者挂起流程模型实体  
22 - * @param processDefinitionId 流程模型实体id  
23 - * @param type 类型  
24 - * @return 状态  
25 - */  
26 - String setActivOrHang(String processDefinitionId,String type);  
27 -  
28 -  
29 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/process/impl/ProcessServiceImpl.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.process.impl;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.activiti.service.process.ProcessService;  
4 -import lombok.extern.slf4j.Slf4j;  
5 -import org.activiti.engine.RepositoryService;  
6 -import org.activiti.engine.repository.Deployment;  
7 -import org.activiti.engine.repository.ProcessDefinition;  
8 -import org.apache.commons.io.FilenameUtils;  
9 -import org.springframework.stereotype.Service;  
10 -import org.springframework.web.multipart.MultipartFile;  
11 -  
12 -import javax.annotation.Resource;  
13 -import java.io.IOException;  
14 -import java.io.InputStream;  
15 -import java.util.List;  
16 -import java.util.zip.ZipInputStream;  
17 -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_UPLOAD_FAILED;  
18 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
19 -  
20 -/**  
21 - * 流程基础管理  
22 - *  
23 - * @author ZJQ  
24 - * @date 2021/9/5 21:04  
25 - */  
26 -@Service  
27 -@Slf4j  
28 -public class ProcessServiceImpl implements ProcessService {  
29 -  
30 - private static final String BPMN20_XML = "bpmn20.xml";  
31 -  
32 - @Resource  
33 - private RepositoryService repositoryService;  
34 -  
35 - /**  
36 - * 上传流程文件,进行流程部署  
37 - * @param multipartFile 上传文件  
38 - */  
39 - @Override  
40 - public void deployProcess(MultipartFile multipartFile) {  
41 - String fileName = multipartFile.getOriginalFilename();  
42 - try (InputStream inputStream = multipartFile.getInputStream()){  
43 - Deployment deployment = getDeplymentByType(inputStream,fileName);  
44 - //获取部署成功的流程模型  
45 - List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).list();  
46 - processDefinitions.forEach((processDefinition)->{  
47 - //设置线上部署流程模型名字  
48 - String proDefId = processDefinition.getId();  
49 - repositoryService.setProcessDefinitionCategory(proDefId,fileName);  
50 - log.info("流程文件部署成功,流程ID="+proDefId);  
51 - });  
52 - } catch (IOException e) {  
53 - log.error("流程部署出现异常"+e);  
54 - }  
55 - }  
56 -  
57 - /**  
58 - * 激活或者挂起流程模型实体  
59 - * @param processDefinitionId 流程模型实体id  
60 - * @param type 类型  
61 - * @return 提示  
62 - */  
63 - @Override  
64 - public String setActivOrHang(String processDefinitionId, String type) {  
65 - String result = "无操作";  
66 - switch (type){  
67 - case "active":  
68 - repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);  
69 - result = "已激活ID为【"+processDefinitionId+"】的流程模型实例";  
70 - break;  
71 - case "suspend":  
72 - repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);  
73 - result = "已挂起ID为【"+processDefinitionId+"】的流程模型实例";  
74 - break;  
75 - default:  
76 - break;  
77 - }  
78 - return result;  
79 - }  
80 -  
81 -  
82 - /**  
83 - * 根据上传文件类型对应实现不同方式的流程部署  
84 - * @param inputStream 文件输入流  
85 - * @param fileName 文件名  
86 - * @return 文件部署流程  
87 - */  
88 - public Deployment getDeplymentByType(InputStream inputStream,String fileName){  
89 - Deployment deployment;  
90 - String type = FilenameUtils.getExtension(fileName);  
91 - switch (type){  
92 - case "bpmn":  
93 - String baseName = FilenameUtils.getBaseName(fileName);  
94 - deployment = repositoryService.createDeployment().addInputStream(baseName+"."+BPMN20_XML,inputStream).deploy();  
95 - break;  
96 - case "png":  
97 - deployment = repositoryService.createDeployment().addInputStream(fileName,inputStream).deploy();  
98 - break;  
99 - case "zip":  
100 - case "bar":  
101 - ZipInputStream zipInputStream = new ZipInputStream(inputStream);  
102 - deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();  
103 - break;  
104 - default:  
105 - throw exception(FILE_UPLOAD_FAILED);  
106 - }  
107 - return deployment;  
108 - }  
109 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/TaskService.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.workflow;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*;  
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 -  
6 -import java.util.List;  
7 -  
8 -// TODO @芋艿:前缀,注释  
9 -public interface TaskService {  
10 -  
11 - PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO);  
12 -  
13 - void claimTask(String taskId);  
14 -  
15 - void getTaskHistory(String taskId);  
16 -  
17 - void completeTask(TaskReqVO taskReq);  
18 -  
19 -// void flowImage(String taskId, HttpServletResponse response);  
20 - TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery);  
21 -  
22 - List<TaskStepVO> getHistorySteps(String processInstanceId);  
23 -  
24 - TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery);  
25 -  
26 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/impl/TaskServiceImpl.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.impl;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.TaskService;  
6 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
7 -import cn.iocoder.yudao.framework.security.core.LoginUser;  
8 -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;  
9 -import com.google.common.collect.ImmutableMap;  
10 -import org.activiti.api.runtime.shared.query.Page;  
11 -import org.activiti.api.runtime.shared.query.Pageable;  
12 -import org.activiti.api.task.model.Task;  
13 -import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder;  
14 -import org.activiti.api.task.model.builders.TaskPayloadBuilder;  
15 -import org.activiti.api.task.runtime.TaskRuntime;  
16 -import org.activiti.engine.HistoryService;  
17 -import org.activiti.engine.RepositoryService;  
18 -import org.activiti.engine.history.HistoricActivityInstance;  
19 -import org.activiti.engine.history.HistoricProcessInstance;  
20 -import org.activiti.engine.repository.ProcessDefinition;  
21 -import org.activiti.engine.task.Comment;  
22 -import org.springframework.stereotype.Service;  
23 -import org.springframework.transaction.annotation.Transactional;  
24 -  
25 -import javax.annotation.Resource;  
26 -import java.util.ArrayList;  
27 -import java.util.List;  
28 -import java.util.Map;  
29 -import java.util.Optional;  
30 -import java.util.stream.Collectors;  
31 -  
32 -@Service  
33 -public class TaskServiceImpl implements TaskService {  
34 -  
35 - @Resource  
36 - private TaskRuntime taskRuntime;  
37 -  
38 - @Resource  
39 - private org.activiti.engine.TaskService activitiTaskService;  
40 -  
41 - @Resource  
42 - private HistoryService historyService;  
43 -  
44 - @Resource  
45 - private RepositoryService repositoryService;  
46 -  
47 - @Resource  
48 - private OaLeaveMapper leaveMapper;  
49 -  
50 - private static Map<String,String> taskVariable = ImmutableMap.<String,String>builder()  
51 - .put("deptLeaderVerify","deptLeaderApproved")  
52 - .put("hrVerify","hrApproved")  
53 - .build();  
54 -  
55 - public TaskServiceImpl() {  
56 -  
57 - }  
58 -  
59 - @Override  
60 - public PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO) {  
61 - final LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();  
62 - // TODO @jason:封装一个方法,用于转换成 activiti 的分页对象  
63 - final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize());  
64 - Page<Task> pageTasks = taskRuntime.tasks(pageable);  
65 - // TODO @jason:convert 里转换  
66 - List<Task> tasks = pageTasks.getContent();  
67 - int totalItems = pageTasks.getTotalItems();  
68 - final List<TodoTaskRespVO> respVOList = tasks.stream().map(task -> {  
69 - TodoTaskRespVO respVO = new TodoTaskRespVO();  
70 - respVO.setId(task.getId());  
71 - final ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());  
72 - respVO.setProcessName(definition.getName());  
73 - respVO.setProcessKey(definition.getKey());  
74 - respVO.setBusinessKey(task.getBusinessKey());  
75 - respVO.setStatus(task.getAssignee() == null ? 1 : 2);  
76 - return respVO;  
77 - }).collect(Collectors.toList());  
78 - // TODO @jason:要注意泛型哈。  
79 - return new PageResult(respVOList, Long.valueOf(totalItems)); // TODO @jason:(long) 转换即可  
80 - }  
81 -  
82 -  
83 - @Override  
84 - public void claimTask(String taskId) {  
85 - taskRuntime.claim(new ClaimTaskPayloadBuilder()  
86 - .withTaskId(taskId)  
87 - .withAssignee(SecurityFrameworkUtils.getLoginUser().getUsername())  
88 - .build());  
89 - }  
90 -  
91 - @Override  
92 - public void getTaskHistory(String taskId) {  
93 - final List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().  
94 - processInstanceId("8e2801fc-1a38-11ec-98ce-74867a13730f").list();  
95 - }  
96 -  
97 - // TODO @jason:一个方法里,会有多个方法的调用,最好写下对应的注释。这样容易理解  
98 - @Override  
99 - @Transactional  
100 - public void completeTask(TaskReqVO taskReq) {  
101 - final Task task = taskRuntime.task(taskReq.getTaskId());  
102 -  
103 - final Map<String, Object> variables = taskReq.getVariables();  
104 -  
105 - activitiTaskService.addComment(taskReq.getTaskId(), task.getProcessInstanceId(), taskReq.getComment());  
106 -  
107 - taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskReq.getTaskId())  
108 - .withVariables(taskReq.getVariables())  
109 - .build());  
110 -  
111 -// if(variables.containsValue(Boolean.FALSE)){  
112 -// final String businessKey = task.getBusinessKey();  
113 -// UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();  
114 -// updateWrapper.eq("id", Long.valueOf(businessKey));  
115 -// OaLeaveDO updateDo = new OaLeaveDO();  
116 -// updateDo.setStatus(2);  
117 -// leaveMapper.update(updateDo, updateWrapper);  
118 -// }  
119 -  
120 - }  
121 -  
122 -// @Override  
123 -// public void flowImage(String taskId, HttpServletResponse response) {  
124 -//  
125 -// final Task task = taskRuntime.task(taskId);  
126 -// BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());  
127 -// final Process process = bpmnModel.getMainProcess();  
128 -// ProcessDefinitionEntity processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult();  
129 -// List<String> activeActivityIds = runtimeService.getActiveActivityIds(executionId);  
130 -// List<String> highLightedFlows = getHighLightedFlows(processDefinition, processInstance.getId());  
131 -// ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();  
132 -// InputStream imageStream =diagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds, highLightedFlows);  
133 -//  
134 -// // 输出资源内容到相应对象  
135 -// byte[] b = new byte[1024];  
136 -// int len;  
137 -// while ((len = imageStream.read(b, 0, 1024)) != -1) {  
138 -// response.getOutputStream().write(b, 0, len);  
139 -// }  
140 -// }  
141 -  
142 - @Override  
143 - public TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery) {  
144 - TaskHandleVO handleVO = new TaskHandleVO();  
145 -  
146 -// String processKey = taskQuery.getProcessKey();  
147 -// if ("leave".equals(processKey)) {  
148 -// String businessKey = taskQuery.getBusinessKey();  
149 -// final OaLeaveDO leave = leaveMapper.selectById(Long.valueOf(businessKey));  
150 -// handleVO.setFormObject( OaLeaveConvert.INSTANCE.convert(leave));  
151 -// }  
152 -  
153 -//  
154 -// final String taskDefKey = task.getTaskDefinitionKey();  
155 -// final String variableName = Optional.ofNullable(taskVariable.get(taskDefKey)).orElse("");  
156 -// handleVO.setTaskVariable(variableName);  
157 - final Task task = taskRuntime.task(taskQuery.getTaskId());  
158 -  
159 - List<TaskStepVO> steps = getTaskSteps(task.getProcessInstanceId());  
160 -  
161 - handleVO.setHistoryTask(steps);  
162 - return handleVO;  
163 - }  
164 -  
165 -  
166 - private List<TaskStepVO> getTaskSteps(String processInstanceId) {  
167 - // 获得已完成的活动  
168 - List<HistoricActivityInstance> finished = historyService.createHistoricActivityInstanceQuery()  
169 - .processInstanceId(processInstanceId)  
170 - .activityType("userTask")  
171 - .finished()  
172 - .orderByHistoricActivityInstanceStartTime().asc().list();  
173 - // 获得对应的步骤  
174 - List<TaskStepVO> steps = new ArrayList<>();  
175 - finished.forEach(instance -> {  
176 - // TODO @jason:放到 convert 里  
177 - TaskStepVO step = new TaskStepVO();  
178 - step.setStepName(instance.getActivityName());  
179 - step.setStartTime(instance.getStartTime());  
180 - step.setEndTime(instance.getEndTime());  
181 - step.setAssignee(instance.getAssignee());  
182 - step.setStatus(1);  
183 - // TODO @jason:一般判数组为空,使用 CollUtil.isEmpty 会好点哈。另外,null 时候,不用填写 "" 的哈  
184 - List<Comment> comments = activitiTaskService.getTaskComments(instance.getTaskId());  
185 - if (comments.size() > 0) {  
186 - step.setComment(comments.get(0).getFullMessage());  
187 - } else {  
188 - step.setComment("");  
189 - }  
190 - steps.add(step);  
191 - });  
192 -  
193 - // 获得未完成的活动  
194 - List<HistoricActivityInstance> unfinished = historyService  
195 - .createHistoricActivityInstanceQuery()  
196 - .processInstanceId(processInstanceId)  
197 - .activityType("userTask")  
198 - .unfinished().list();  
199 - // 获得对应的步骤  
200 - // TODO @json:其实已完成和未完成,它们的 convert 的逻辑,是一致的  
201 - for (HistoricActivityInstance instance : unfinished) {  
202 - TaskStepVO step = new TaskStepVO();  
203 - step.setStepName(instance.getActivityName());  
204 - step.setStartTime(instance.getStartTime());  
205 - step.setEndTime(instance.getEndTime());  
206 - step.setAssignee(Optional.ofNullable(instance.getAssignee()).orElse(""));  
207 - step.setComment("");  
208 - step.setStatus(0);  
209 - steps.add(step);  
210 - }  
211 - return steps;  
212 - }  
213 -  
214 -  
215 - @Override  
216 - public List<TaskStepVO> getHistorySteps(String processInstanceId) {  
217 - return getTaskSteps(processInstanceId);  
218 - }  
219 -  
220 - @Override  
221 - public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) {  
222 - final Task task = taskRuntime.task(taskQuery.getTaskId());  
223 - // 转换结果  
224 - TodoTaskRespVO respVO = new TodoTaskRespVO();  
225 - respVO.setFormKey(task.getFormKey());  
226 - respVO.setBusinessKey(task.getBusinessKey());  
227 - respVO.setId(task.getId());  
228 - return respVO;  
229 - }  
230 -  
231 -// private List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) {  
232 -//  
233 -// List<String> highLightedFlows = new ArrayList<String>();  
234 -// List<HistoricActivityInstance> historicActivityInstances = historyService  
235 -// .createHistoricActivityInstanceQuery()  
236 -// .processInstanceId(processInstanceId)  
237 -// .orderByHistoricActivityInstanceStartTime().asc().list();  
238 -//  
239 -// List<String> historicActivityInstanceList = new ArrayList<String>();  
240 -// for (HistoricActivityInstance hai : historicActivityInstances) {  
241 -// historicActivityInstanceList.add(hai.getActivityId());  
242 -// }  
243 -  
244 -// // add current activities to list  
245 -// List<String> highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId);  
246 -// historicActivityInstanceList.addAll(highLightedActivities);  
247 -  
248 - // activities and their sequence-flows  
249 -// for (ActivityImpl activity : processDefinition.getActivities()) {  
250 -// int index = historicActivityInstanceList.indexOf(activity.getId());  
251 -//  
252 -// if (index >= 0 && index + 1 < historicActivityInstanceList.size()) {  
253 -// List<PvmTransition> pvmTransitionList = activity  
254 -// .getOutgoingTransitions();  
255 -// for (PvmTransition pvmTransition : pvmTransitionList) {  
256 -// String destinationFlowId = pvmTransition.getDestination().getId();  
257 -// if (destinationFlowId.equals(historicActivityInstanceList.get(index + 1))) {  
258 -// highLightedFlows.add(pvmTransition.getId());  
259 -// }  
260 -// }  
261 -// }  
262 -// }  
263 -// return highLightedFlows;  
264 -// }  
265 -  
266 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmProcessDefinitionController.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
  6 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +import io.swagger.annotations.Api;
  9 +import io.swagger.annotations.ApiImplicitParam;
  10 +import io.swagger.annotations.ApiOperation;
  11 +import org.springframework.security.access.prepost.PreAuthorize;
  12 +import org.springframework.validation.annotation.Validated;
  13 +import org.springframework.web.bind.annotation.GetMapping;
  14 +import org.springframework.web.bind.annotation.RequestMapping;
  15 +import org.springframework.web.bind.annotation.RequestParam;
  16 +import org.springframework.web.bind.annotation.RestController;
  17 +
  18 +import javax.annotation.Resource;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  21 +
  22 +@Api(tags = "流程定义")
  23 +@RestController
  24 +@RequestMapping("/bpm/process-definition")
  25 +@Validated
  26 +public class BpmProcessDefinitionController {
  27 +
  28 + @Resource
  29 + private BpmProcessDefinitionService bpmDefinitionService;
  30 +
  31 + @GetMapping ("/page")
  32 + @ApiOperation(value = "获得流程定义分页")
  33 + @PreAuthorize("@ss.hasPermission('bpm:model:query')") // 暂时使用 model 的权限标识
  34 + public CommonResult<PageResult<BpmProcessDefinitionPageItemRespVO>> getProcessDefinitionPage(
  35 + BpmProcessDefinitionPageReqVO pageReqVO) {
  36 + return success(bpmDefinitionService.getProcessDefinitionPage(pageReqVO));
  37 + }
  38 +
  39 + // TODO 芋艿:需要重写该方法
  40 + @GetMapping(value = "/getStartForm")
  41 + public CommonResult<String> getStartForm(@RequestParam("processKey") String processKey){
  42 +// final ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
  43 +// processDefinitionKey(processKey).latestVersion().singleResult();
  44 +// processRuntime.processDefinition(processDefinition.getId()).getFormKey();
  45 + // TODO 这样查似乎有问题??, 暂时写死
  46 + return success("/flow/leave/apply");
  47 + }
  48 +
  49 + @GetMapping ("/get-bpmn-xml")
  50 + @ApiOperation(value = "获得流程定义的 BPMN XML")
  51 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = String.class)
  52 + @PreAuthorize("@ss.hasPermission('bpm:model:query')") // 暂时使用 model 的权限标识
  53 + public CommonResult<String> getProcessDefinitionBpmnXML(@RequestParam("id") String id) {
  54 + String bpmnXML = bpmDefinitionService.getProcessDefinitionBpmnXML(id);
  55 + return success(bpmnXML);
  56 + }
  57 +
  58 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/BpmProcessDefinitionPageItemRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import java.util.Date;
  10 +
  11 +@ApiModel("流程定义的分页的每一项 Response VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class BpmProcessDefinitionPageItemRespVO extends BpmProcessDefinitionRespVO {
  16 +
  17 + @ApiModelProperty(value = "表单名字", example = "请假表单")
  18 + private String formName;
  19 +
  20 + @ApiModelProperty(value = "部署时间", required = true)
  21 + private Date deploymentTime;
  22 +
  23 +
  24 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/BpmProcessDefinitionPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +
  10 +@Data
  11 +@ToString(callSuper = true)
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ApiModel("流程定义分页 Request VO")
  14 +public class BpmProcessDefinitionPageReqVO extends PageParam {
  15 +
  16 + @ApiModelProperty(value = "标识", example = "process1641042089407", notes = "精准匹配")
  17 + private String key;
  18 +
  19 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/BpmProcessDefinitionRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +import javax.validation.constraints.NotEmpty;
  8 +
  9 +@ApiModel("流程定义 Response VO")
  10 +@Data
  11 +public class BpmProcessDefinitionRespVO {
  12 +
  13 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  14 + private String id;
  15 +
  16 + @ApiModelProperty(value = "版本", required = true, example = "1")
  17 + private Integer version;
  18 +
  19 + @ApiModelProperty(value = "流程名称", required = true, example = "芋道")
  20 + @NotEmpty(message = "流程名称不能为空")
  21 + private String name;
  22 +
  23 + @ApiModelProperty(value = "流程描述", example = "我是描述")
  24 + private String description;
  25 +
  26 + @ApiModelProperty(value = "流程分类", notes = "参见 bpm_model_category 数据字典", example = "1")
  27 + @NotEmpty(message = "流程分类不能为空")
  28 + private String category;
  29 +
  30 + @ApiModelProperty(value = "表单编号", example = "1024")
  31 + private Long formId;
  32 +
  33 + @ApiModelProperty(value = "中断状态", required = true, example = "1", notes = "参见 SuspensionState 枚举")
  34 + private Integer suspensionState;
  35 +
  36 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/form/WlFormController.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/form/BpmFormController.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.form; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.form;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.*;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.convert.form.WfFormConvert;  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;  
6 -import cn.iocoder.yudao.adminserver.modules.activiti.service.form.WfFormService; 3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.*;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.form.BpmFormConvert;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.service.form.BpmFormService;
7 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 7 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;  
10 -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;  
11 import io.swagger.annotations.Api; 9 import io.swagger.annotations.Api;
12 import io.swagger.annotations.ApiImplicitParam; 10 import io.swagger.annotations.ApiImplicitParam;
13 import io.swagger.annotations.ApiOperation; 11 import io.swagger.annotations.ApiOperation;
@@ -16,36 +14,31 @@ import org.springframework.validation.annotation.Validated; @@ -16,36 +14,31 @@ import org.springframework.validation.annotation.Validated;
16 import org.springframework.web.bind.annotation.*; 14 import org.springframework.web.bind.annotation.*;
17 15
18 import javax.annotation.Resource; 16 import javax.annotation.Resource;
19 -import javax.servlet.http.HttpServletResponse;  
20 import javax.validation.Valid; 17 import javax.validation.Valid;
21 -import java.io.IOException;  
22 -import java.util.Collection;  
23 import java.util.List; 18 import java.util.List;
24 19
25 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
26 -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;  
27 21
28 -// TODO @风里雾里: Os=》Wf,/os 改成 /wl 开头。目前这个模块,咱先定位成给工作流用的  
29 @Api(tags = "动态表单") 22 @Api(tags = "动态表单")
30 @RestController 23 @RestController
31 -@RequestMapping("/wl/form") 24 +@RequestMapping("/bpm/form")
32 @Validated 25 @Validated
33 -public class WlFormController { 26 +public class BpmFormController {
34 27
35 @Resource 28 @Resource
36 - private WfFormService formService; 29 + private BpmFormService formService;
37 30
38 @PostMapping("/create") 31 @PostMapping("/create")
39 @ApiOperation("创建动态表单") 32 @ApiOperation("创建动态表单")
40 - @PreAuthorize("@ss.hasPermission('os:form:create')")  
41 - public CommonResult<Long> createForm(@Valid @RequestBody WfFormCreateReqVO createReqVO) { 33 + @PreAuthorize("@ss.hasPermission('bpm:form:create')")
  34 + public CommonResult<Long> createForm(@Valid @RequestBody BpmFormCreateReqVO createReqVO) {
42 return success(formService.createForm(createReqVO)); 35 return success(formService.createForm(createReqVO));
43 } 36 }
44 37
45 @PutMapping("/update") 38 @PutMapping("/update")
46 @ApiOperation("更新动态表单") 39 @ApiOperation("更新动态表单")
47 - @PreAuthorize("@ss.hasPermission('os:form:update')")  
48 - public CommonResult<Boolean> updateForm(@Valid @RequestBody WfFormUpdateReqVO updateReqVO) { 40 + @PreAuthorize("@ss.hasPermission('bpm:form:update')")
  41 + public CommonResult<Boolean> updateForm(@Valid @RequestBody BpmFormUpdateReqVO updateReqVO) {
49 formService.updateForm(updateReqVO); 42 formService.updateForm(updateReqVO);
50 return success(true); 43 return success(true);
51 } 44 }
@@ -53,7 +46,7 @@ public class WlFormController { @@ -53,7 +46,7 @@ public class WlFormController {
53 @DeleteMapping("/delete") 46 @DeleteMapping("/delete")
54 @ApiOperation("删除动态表单") 47 @ApiOperation("删除动态表单")
55 @ApiImplicitParam(name = "id", value = "编号", required = true) 48 @ApiImplicitParam(name = "id", value = "编号", required = true)
56 - @PreAuthorize("@ss.hasPermission('os:form:delete')") 49 + @PreAuthorize("@ss.hasPermission('bpm:form:delete')")
57 public CommonResult<Boolean> deleteForm(@RequestParam("id") Long id) { 50 public CommonResult<Boolean> deleteForm(@RequestParam("id") Long id) {
58 formService.deleteForm(id); 51 formService.deleteForm(id);
59 return success(true); 52 return success(true);
@@ -62,39 +55,25 @@ public class WlFormController { @@ -62,39 +55,25 @@ public class WlFormController {
62 @GetMapping("/get") 55 @GetMapping("/get")
63 @ApiOperation("获得动态表单") 56 @ApiOperation("获得动态表单")
64 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) 57 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
65 - @PreAuthorize("@ss.hasPermission('os:form:query')")  
66 - public CommonResult<WfFormRespVO> getForm(@RequestParam("id") Long id) {  
67 - WfForm form = formService.getForm(id);  
68 - return success(WfFormConvert.INSTANCE.convert(form)); 58 + @PreAuthorize("@ss.hasPermission('bpm:form:query')")
  59 + public CommonResult<BpmFormRespVO> getForm(@RequestParam("id") Long id) {
  60 + BpmFormDO form = formService.getForm(id);
  61 + return success(BpmFormConvert.INSTANCE.convert(form));
69 } 62 }
70 63
71 - @GetMapping("/list")  
72 - @ApiOperation("获得动态表单列表")  
73 - @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)  
74 - @PreAuthorize("@ss.hasPermission('os:form:query')")  
75 - public CommonResult<List<WfFormRespVO>> getFormList(@RequestParam("ids") Collection<Long> ids) {  
76 - List<WfForm> list = formService.getFormList(ids);  
77 - return success(WfFormConvert.INSTANCE.convertList(list)); 64 + @GetMapping("/list-all-simple")
  65 + @ApiOperation(value = "获得动态表单的精简列表", notes = "用于表单下拉框")
  66 + public CommonResult<List<BpmFormSimpleRespVO>> getSimpleForms() {
  67 + List<BpmFormDO> list = formService.getFormList();
  68 + return success(BpmFormConvert.INSTANCE.convertList2(list));
78 } 69 }
79 70
80 @GetMapping("/page") 71 @GetMapping("/page")
81 @ApiOperation("获得动态表单分页") 72 @ApiOperation("获得动态表单分页")
82 - @PreAuthorize("@ss.hasPermission('os:form:query')")  
83 - public CommonResult<PageResult<WfFormRespVO>> getFormPage(@Valid WfFormPageReqVO pageVO) {  
84 - PageResult<WfForm> pageResult = formService.getFormPage(pageVO);  
85 - return success(WfFormConvert.INSTANCE.convertPage(pageResult));  
86 - }  
87 -  
88 - @GetMapping("/export-excel")  
89 - @ApiOperation("导出动态表单 Excel")  
90 - @PreAuthorize("@ss.hasPermission('os:form:export')")  
91 - @OperateLog(type = EXPORT)  
92 - public void exportFormExcel(@Valid WfFormExportReqVO exportReqVO,  
93 - HttpServletResponse response) throws IOException {  
94 - List<WfForm> list = formService.getFormList(exportReqVO);  
95 - // 导出 Excel  
96 - List<WfFormExcelVO> datas = WfFormConvert.INSTANCE.convertList02(list);  
97 - ExcelUtils.write(response, "动态表单.xls", "数据", WfFormExcelVO.class, datas); 73 + @PreAuthorize("@ss.hasPermission('bpm:form:query')")
  74 + public CommonResult<PageResult<BpmFormRespVO>> getFormPage(@Valid BpmFormPageReqVO pageVO) {
  75 + PageResult<BpmFormDO> pageResult = formService.getFormPage(pageVO);
  76 + return success(BpmFormConvert.INSTANCE.convertPage(pageResult));
98 } 77 }
99 78
100 } 79 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/form/vo/WfFormBaseVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/form/vo/BpmFormBaseVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 import io.swagger.annotations.*; 4 import io.swagger.annotations.*;
@@ -9,20 +9,17 @@ import javax.validation.constraints.*; @@ -9,20 +9,17 @@ import javax.validation.constraints.*;
9 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 9 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
10 */ 10 */
11 @Data 11 @Data
12 -public class WfFormBaseVO { 12 +public class BpmFormBaseVO {
13 13
14 - @ApiModelProperty(value = "表单名称", required = true) 14 + @ApiModelProperty(value = "表单名称", required = true, example = "芋道")
15 @NotNull(message = "表单名称不能为空") 15 @NotNull(message = "表单名称不能为空")
16 private String name; 16 private String name;
17 17
18 - @ApiModelProperty(value = "商户状态", required = true)  
19 - @NotNull(message = "商户状态不能为空") 18 + @ApiModelProperty(value = "表单状态", required = true, notes = "参见 CommonStatusEnum 枚举", example = "1")
  19 + @NotNull(message = "表单状态不能为空")
20 private Integer status; 20 private Integer status;
21 21
22 - @ApiModelProperty(value = "表单JSON")  
23 - private String formJson;  
24 -  
25 - @ApiModelProperty(value = "备注") 22 + @ApiModelProperty(value = "备注", example = "我是备注")
26 private String remark; 23 private String remark;
27 24
28 } 25 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/form/vo/WfFormCreateReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/form/vo/BpmFormCreateReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 import io.swagger.annotations.*; 4 import io.swagger.annotations.*;
5 5
  6 +import javax.validation.constraints.NotNull;
  7 +import java.util.List;
  8 +
6 @ApiModel("动态表单创建 Request VO") 9 @ApiModel("动态表单创建 Request VO")
7 @Data 10 @Data
8 @EqualsAndHashCode(callSuper = true) 11 @EqualsAndHashCode(callSuper = true)
9 @ToString(callSuper = true) 12 @ToString(callSuper = true)
10 -public class WfFormCreateReqVO extends WfFormBaseVO { 13 +public class BpmFormCreateReqVO extends BpmFormBaseVO {
  14 +
  15 + @ApiModelProperty(value = "表单的配置", required = true, notes = "JSON 字符串")
  16 + @NotNull(message = "表单的配置不能为空")
  17 + private String conf;
  18 +
  19 + @ApiModelProperty(value = "表单项的数组", required = true, notes = "JSON 字符串的数组")
  20 + @NotNull(message = "表单项的数组不能为空")
  21 + private List<String> fields;
11 22
12 } 23 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/form/vo/BpmFormPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +
  10 +@ApiModel("动态表单分页 Request VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ToString(callSuper = true)
  14 +public class BpmFormPageReqVO extends PageParam {
  15 +
  16 + @ApiModelProperty(value = "表单名称", example = "芋道")
  17 + private String name;
  18 +
  19 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/form/vo/BpmFormRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import javax.validation.constraints.NotNull;
  10 +import java.util.Date;
  11 +import java.util.List;
  12 +
  13 +@ApiModel("动态表单 Response VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +public class BpmFormRespVO extends BpmFormBaseVO {
  18 +
  19 + @ApiModelProperty(value = "表单编号", required = true, example = "1024")
  20 + private Long id;
  21 + @ApiModelProperty(value = "表单的配置", required = true, notes = "JSON 字符串")
  22 + @NotNull(message = "表单的配置不能为空")
  23 + private String conf;
  24 +
  25 + @ApiModelProperty(value = "表单项的数组", required = true, notes = "JSON 字符串的数组")
  26 + @NotNull(message = "表单项的数组不能为空")
  27 + private List<String> fields;
  28 +
  29 + @ApiModelProperty(value = "创建时间", required = true)
  30 + private Date createTime;
  31 +
  32 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/form/vo/BpmFormSimpleRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +@ApiModel("流程表单精简 Response VO")
  8 +@Data
  9 +public class BpmFormSimpleRespVO {
  10 +
  11 + @ApiModelProperty(value = "表单编号", required = true, example = "1024")
  12 + private Long id;
  13 +
  14 + @ApiModelProperty(value = "表单名称", required = true, example = "芋道")
  15 + private String name;
  16 +
  17 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/form/vo/WfFormUpdateReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/form/vo/BpmFormUpdateReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 import io.swagger.annotations.*; 4 import io.swagger.annotations.*;
5 import javax.validation.constraints.*; 5 import javax.validation.constraints.*;
  6 +import java.util.List;
6 7
7 @ApiModel("动态表单更新 Request VO") 8 @ApiModel("动态表单更新 Request VO")
8 @Data 9 @Data
9 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
10 @ToString(callSuper = true) 11 @ToString(callSuper = true)
11 -public class WfFormUpdateReqVO extends WfFormBaseVO { 12 +public class BpmFormUpdateReqVO extends BpmFormBaseVO {
12 13
13 - @ApiModelProperty(value = "表单编号", required = true) 14 + @ApiModelProperty(value = "表单编号", required = true, example = "1024")
14 @NotNull(message = "表单编号不能为空") 15 @NotNull(message = "表单编号不能为空")
15 private Long id; 16 private Long id;
16 17
  18 + @ApiModelProperty(value = "表单的配置", required = true, notes = "JSON 字符串")
  19 + @NotNull(message = "表单的配置不能为空")
  20 + private String conf;
  21 +
  22 + @ApiModelProperty(value = "表单项的数组", required = true, notes = "JSON 字符串的数组")
  23 + @NotNull(message = "表单项的数组不能为空")
  24 + private List<String> fields;
  25 +
17 } 26 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/BpmModelController.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo.*;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.model.BpmModelConvert;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.model.BpmModelService;
  6 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +import cn.iocoder.yudao.framework.common.util.io.IoUtils;
  9 +import io.swagger.annotations.Api;
  10 +import io.swagger.annotations.ApiImplicitParam;
  11 +import io.swagger.annotations.ApiOperation;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
  13 +import org.springframework.validation.annotation.Validated;
  14 +import org.springframework.web.bind.annotation.*;
  15 +
  16 +import javax.annotation.Resource;
  17 +import javax.validation.Valid;
  18 +import java.io.IOException;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  21 +
  22 +@Api(tags = "流程模型")
  23 +@RestController
  24 +@RequestMapping("/bpm/model")
  25 +@Validated
  26 +public class BpmModelController {
  27 +
  28 + @Resource
  29 + private BpmModelService bpmModelService;
  30 +
  31 + @GetMapping("/page")
  32 + @ApiOperation(value = "获得模型分页")
  33 + public CommonResult<PageResult<BpmModelPageItemRespVO>> getModelPage(ModelPageReqVO pageVO) {
  34 + return success(bpmModelService.getModelPage(pageVO));
  35 + }
  36 +
  37 + @GetMapping("/get")
  38 + @ApiOperation("获得模型")
  39 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = String.class)
  40 + @PreAuthorize("@ss.hasPermission('bpm:model:query')")
  41 + public CommonResult<BpmModelRespVO> getModel(@RequestParam("id") String id) {
  42 + BpmModelRespVO model = bpmModelService.getModel(id);
  43 + return success(model);
  44 + }
  45 +
  46 + @PostMapping("/create")
  47 + @ApiOperation(value = "新建模型")
  48 + @PreAuthorize("@ss.hasPermission('bpm:model:create')")
  49 + public CommonResult<String> createModel(@Valid @RequestBody BpmModelCreateReqVO createRetVO) {
  50 + return success(bpmModelService.createModel(createRetVO));
  51 + }
  52 +
  53 + @PostMapping("/import")
  54 + @ApiOperation(value = "导入模型")
  55 + @PreAuthorize("@ss.hasPermission('bpm:model:import')")
  56 + public CommonResult<String> importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException {
  57 + BpmModelCreateReqVO createReqVO = BpmModelConvert.INSTANCE.convert(importReqVO);
  58 + // 读取文件
  59 + createReqVO.setBpmnXml(IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false));
  60 + return success(bpmModelService.createModel(createReqVO));
  61 + }
  62 +
  63 + @PutMapping("/update")
  64 + @ApiOperation(value = "修改模型")
  65 + @PreAuthorize("@ss.hasPermission('bpm:model:update')")
  66 + public CommonResult<Boolean> updateModel(@Valid @RequestBody BpmModelUpdateReqVO modelVO) {
  67 + bpmModelService.updateModel(modelVO);
  68 + return success(true);
  69 + }
  70 +
  71 + @DeleteMapping("/delete")
  72 + @ApiOperation("删除模型")
  73 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = String.class)
  74 + @PreAuthorize("@ss.hasPermission('bpm:model:delete')")
  75 + public CommonResult<Boolean> deleteModel(@RequestParam("id") String id) {
  76 + bpmModelService.deleteModel(id);
  77 + return success(true);
  78 + }
  79 +
  80 + @PostMapping("/deploy")
  81 + @ApiOperation(value = "部署模型")
  82 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = String.class)
  83 + @PreAuthorize("@ss.hasPermission('bpm:model:deploy')")
  84 + public CommonResult<Boolean> deployModel(@RequestParam("id") String id) {
  85 + bpmModelService.deployModel(id);
  86 + return success(true);
  87 + }
  88 +
  89 + @PutMapping("/update-state")
  90 + @ApiOperation(value = "修改模型的状态", notes = "实际更新的部署的流程定义的状态")
  91 + @PreAuthorize("@ss.hasPermission('bpm:model:update')")
  92 + public CommonResult<Boolean> updateModelState(@Valid @RequestBody BpmModelUpdateStateReqVO reqVO) {
  93 + bpmModelService.updateModelState(reqVO.getId(), reqVO.getState());
  94 + return success(true);
  95 + }
  96 +
  97 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModeImportReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.web.multipart.MultipartFile;
  9 +
  10 +import javax.validation.constraints.NotNull;
  11 +
  12 +@ApiModel("流程模型的导入 Request VO")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@ToString(callSuper = true)
  16 +public class BpmModeImportReqVO extends BpmModelBaseVO {
  17 +
  18 + @ApiModelProperty(value = "BPMN 文件", required = true)
  19 + @NotNull(message = "BPMN 文件不能为空")
  20 + private MultipartFile bpmnFile;
  21 +
  22 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotEmpty;
  7 +
  8 +/**
  9 +* 流程模型 Base VO,提供给添加、修改、详细的子 VO 使用
  10 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 +*/
  12 +@Data
  13 +public class BpmModelBaseVO {
  14 +
  15 + @ApiModelProperty(value = "流程标识", required = true, example = "process_yudao")
  16 + @NotEmpty(message = "流程标识不能为空")
  17 + private String key;
  18 +
  19 + @ApiModelProperty(value = "流程名称", required = true, example = "芋道")
  20 + @NotEmpty(message = "流程名称不能为空")
  21 + private String name;
  22 +
  23 + @ApiModelProperty(value = "流程描述", example = "我是描述")
  24 + private String description;
  25 +
  26 + @ApiModelProperty(value = "流程分类", notes = "参见 bpm_model_category 数据字典", example = "1")
  27 + @NotEmpty(message = "流程分类不能为空")
  28 + private String category;
  29 +
  30 + @ApiModelProperty(value = "表单编号", example = "1024")
  31 + private Long formId;
  32 +
  33 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import javax.validation.constraints.NotEmpty;
  10 +
  11 +@ApiModel("流程模型的创建 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class BpmModelCreateReqVO extends BpmModelBaseVO {
  16 +
  17 + @ApiModelProperty(value = "BPMN XML", required = true)
  18 + @NotEmpty(message = "BPMN XML 不能为空")
  19 + private String bpmnXml;
  20 +
  21 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelPageItemRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import java.util.Date;
  10 +
  11 +@ApiModel("流程模型的分页的每一项 Response VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class BpmModelPageItemRespVO extends BpmModelBaseVO {
  16 +
  17 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  18 + private String id;
  19 +
  20 + @ApiModelProperty(value = "表单名字", example = "请假表单")
  21 + private String formName;
  22 +
  23 + @ApiModelProperty(value = "创建时间", required = true)
  24 + private Date createTime;
  25 +
  26 + /**
  27 + * 最新部署的流程定义
  28 + */
  29 + private ProcessDefinition processDefinition;
  30 +
  31 + @ApiModel("流程定义")
  32 + @Data
  33 + public static class ProcessDefinition {
  34 +
  35 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  36 + private String id;
  37 +
  38 + @ApiModelProperty(value = "版本", required = true, example = "1")
  39 + private Integer version;
  40 +
  41 + @ApiModelProperty(value = "部署时间", required = true)
  42 + private Date deploymentTime;
  43 +
  44 + @ApiModelProperty(value = "中断状态", required = true, example = "1", notes = "参见 SuspensionState 枚举")
  45 + private Integer suspensionState;
  46 +
  47 + }
  48 +
  49 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import java.util.Date;
  10 +
  11 +@ApiModel("流程模型的创建 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class BpmModelRespVO extends BpmModelBaseVO {
  16 +
  17 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  18 + private String id;
  19 +
  20 + @ApiModelProperty(value = "BPMN XML", required = true)
  21 + private String bpmnXml;
  22 +
  23 + @ApiModelProperty(value = "创建时间", required = true)
  24 + private Date createTime;
  25 +
  26 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import javax.validation.constraints.NotEmpty;
  10 +
  11 +@ApiModel("流程模型的更新 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class BpmModelUpdateReqVO extends BpmModelBaseVO {
  16 +
  17 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  18 + @NotEmpty(message = "编号不能为空")
  19 + private String id;
  20 +
  21 + @ApiModelProperty(value = "BPMN XML", required = true)
  22 + @NotEmpty(message = "BPMN XML 不能为空")
  23 + private String bpmnXml;
  24 +
  25 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelUpdateStateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +
  9 +@ApiModel("流程模型更新状态 Request VO")
  10 +@Data
  11 +public class BpmModelUpdateStateReqVO {
  12 +
  13 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  14 + @NotNull(message = "编号不能为空")
  15 + private String id;
  16 +
  17 + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SuspensionState 枚举")
  18 + @NotNull(message = "状态不能为空")
  19 + private Integer state;
  20 +
  21 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/ModelPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +
  10 +
  11 +@ApiModel("流程模型分页 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class ModelPageReqVO extends PageParam {
  16 +
  17 + @ApiModelProperty(value = "标识", example = "process1641042089407", notes = "精准匹配")
  18 + private String key;
  19 +
  20 + @ApiModelProperty(value = "名字", example = "芋道", notes = "模糊匹配")
  21 + private String name;
  22 +
  23 + @ApiModelProperty(value = "流程分类", notes = "参见 bpm_model_category 数据字典", example = "1")
  24 + private String category;
  25 +
  26 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/OaLeaveController.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/OALeaveController.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.convert.oa.OaLeaveConvert;  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;  
6 -import cn.iocoder.yudao.adminserver.modules.activiti.service.oa.OaLeaveService; 3 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.OALeaveConvert;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*;
7 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 7 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 9 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
@@ -26,37 +26,35 @@ import java.util.List; @@ -26,37 +26,35 @@ import java.util.List;
26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
27 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; 27 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
28 28
29 -// TODO @jason:Oa=》OA 会不会好点,名词缩写哈 29 +
30 @Api(tags = "请假申请") 30 @Api(tags = "请假申请")
31 @RestController 31 @RestController
32 @RequestMapping("/oa/leave") 32 @RequestMapping("/oa/leave")
33 @Validated 33 @Validated
34 -public class OaLeaveController { 34 +public class OALeaveController {
35 35
36 @Resource 36 @Resource
37 - private OaLeaveService leaveService;  
38 -  
39 - @PostMapping("/create")  
40 - @ApiOperation("创建请假申请")  
41 - @PreAuthorize("@ss.hasPermission('oa:leave:create')")  
42 - public CommonResult<Long> createLeave(@Valid @RequestBody OaLeaveCreateReqVO createReqVO) {  
43 - // TODO @芋艿:processKey 自己去理解下。不过得把 leave 变成枚举  
44 - createReqVO.setProcessKey("leave");  
45 - return success(leaveService.createLeave(createReqVO));  
46 - } 37 + private OALeaveService leaveService;
  38 +
  39 +
47 40
48 @PostMapping("/form-key/create") 41 @PostMapping("/form-key/create")
49 @ApiOperation("创建外置请假申请") 42 @ApiOperation("创建外置请假申请")
50 - public CommonResult<Long> createFormKeyLeave(@Valid @RequestBody OaLeaveCreateReqVO createReqVO) {  
51 - // TODO @芋艿:processKey 自己去理解下。不过得把 formkey 变成枚举  
52 - createReqVO.setProcessKey("leave-formkey"); 43 + public CommonResult<Long> createFormKeyLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) {
  44 + // processKey 前台传入
53 return success(leaveService.createLeave(createReqVO)); 45 return success(leaveService.createLeave(createReqVO));
54 } 46 }
55 47
  48 + @GetMapping("/getLeaveApplyMembers")
  49 + @ApiOperation("获取本人请假申请流程中审批人员,可先检查这些人员是否存在")
  50 + public CommonResult<OALeaveApplyMembersVO> getLeaveApplyMembers() {
  51 + return success(leaveService.getLeaveApplyMembers());
  52 + }
  53 +
56 @PutMapping("/update") 54 @PutMapping("/update")
57 @ApiOperation("更新请假申请") 55 @ApiOperation("更新请假申请")
58 @PreAuthorize("@ss.hasPermission('oa:leave:update')") 56 @PreAuthorize("@ss.hasPermission('oa:leave:update')")
59 - public CommonResult<Boolean> updateLeave(@Valid @RequestBody OaLeaveUpdateReqVO updateReqVO) { 57 + public CommonResult<Boolean> updateLeave(@Valid @RequestBody OALeaveUpdateReqVO updateReqVO) {
60 leaveService.updateLeave(updateReqVO); 58 leaveService.updateLeave(updateReqVO);
61 return success(true); 59 return success(true);
62 } 60 }
@@ -74,41 +72,41 @@ public class OaLeaveController { @@ -74,41 +72,41 @@ public class OaLeaveController {
74 @ApiOperation("获得请假申请") 72 @ApiOperation("获得请假申请")
75 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) 73 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
76 @PreAuthorize("@ss.hasPermission('oa:leave:query')") 74 @PreAuthorize("@ss.hasPermission('oa:leave:query')")
77 - public CommonResult<OaLeaveRespVO> getLeave(@RequestParam("id") Long id) {  
78 - OaLeaveDO leave = leaveService.getLeave(id);  
79 - return success(OaLeaveConvert.INSTANCE.convert(leave)); 75 + public CommonResult<OALeaveRespVO> getLeave(@RequestParam("id") Long id) {
  76 + OALeaveDO leave = leaveService.getLeave(id);
  77 + return success(OALeaveConvert.INSTANCE.convert(leave));
80 } 78 }
81 79
82 @GetMapping("/list") 80 @GetMapping("/list")
83 @ApiOperation("获得请假申请列表") 81 @ApiOperation("获得请假申请列表")
84 @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) 82 @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
85 @PreAuthorize("@ss.hasPermission('oa:leave:query')") 83 @PreAuthorize("@ss.hasPermission('oa:leave:query')")
86 - public CommonResult<List<OaLeaveRespVO>> getLeaveList(@RequestParam("ids") Collection<Long> ids) {  
87 - List<OaLeaveDO> list = leaveService.getLeaveList(ids);  
88 - return success(OaLeaveConvert.INSTANCE.convertList(list)); 84 + public CommonResult<List<OALeaveRespVO>> getLeaveList(@RequestParam("ids") Collection<Long> ids) {
  85 + List<OALeaveDO> list = leaveService.getLeaveList(ids);
  86 + return success(OALeaveConvert.INSTANCE.convertList(list));
89 } 87 }
90 88
91 @GetMapping("/page") 89 @GetMapping("/page")
92 @ApiOperation("获得请假申请分页") 90 @ApiOperation("获得请假申请分页")
93 @PreAuthorize("@ss.hasPermission('oa:leave:query')") 91 @PreAuthorize("@ss.hasPermission('oa:leave:query')")
94 - public CommonResult<PageResult<OaLeaveRespVO>> getLeavePage(@Valid OaLeavePageReqVO pageVO) { 92 + public CommonResult<PageResult<OALeaveRespVO>> getLeavePage(@Valid OALeavePageReqVO pageVO) {
95 //值查询自己申请请假 93 //值查询自己申请请假
96 // TODO @芋艿:这里的传值,到底前端搞,还是后端搞。 94 // TODO @芋艿:这里的传值,到底前端搞,还是后端搞。
97 pageVO.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername()); 95 pageVO.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
98 - PageResult<OaLeaveDO> pageResult = leaveService.getLeavePage(pageVO);  
99 - return success(OaLeaveConvert.INSTANCE.convertPage(pageResult)); 96 + PageResult<OALeaveDO> pageResult = leaveService.getLeavePage(pageVO);
  97 + return success(OALeaveConvert.INSTANCE.convertPage(pageResult));
100 } 98 }
101 99
102 @GetMapping("/export-excel") 100 @GetMapping("/export-excel")
103 @ApiOperation("导出请假申请 Excel") 101 @ApiOperation("导出请假申请 Excel")
104 @PreAuthorize("@ss.hasPermission('oa:leave:export')") 102 @PreAuthorize("@ss.hasPermission('oa:leave:export')")
105 @OperateLog(type = EXPORT) 103 @OperateLog(type = EXPORT)
106 - public void exportLeaveExcel(@Valid OaLeaveExportReqVO exportReqVO, 104 + public void exportLeaveExcel(@Valid OALeaveExportReqVO exportReqVO,
107 HttpServletResponse response) throws IOException { 105 HttpServletResponse response) throws IOException {
108 - List<OaLeaveDO> list = leaveService.getLeaveList(exportReqVO); 106 + List<OALeaveDO> list = leaveService.getLeaveList(exportReqVO);
109 // 导出 Excel 107 // 导出 Excel
110 - List<OaLeaveExcelVO> datas = OaLeaveConvert.INSTANCE.convertList02(list);  
111 - ExcelUtils.write(response, "请假申请.xls", "数据", OaLeaveExcelVO.class, datas); 108 + List<OALeaveExcelVO> datas = OALeaveConvert.INSTANCE.convertList02(list);
  109 + ExcelUtils.write(response, "请假申请.xls", "数据", OALeaveExcelVO.class, datas);
112 } 110 }
113 111
114 } 112 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveApplyMembersVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Builder;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +
  10 +@ApiModel("请假申请审批人员 Response VO")
  11 +@Data
  12 +@Builder
  13 +@EqualsAndHashCode
  14 +@ToString
  15 +public class OALeaveApplyMembersVO {
  16 +
  17 + @ApiModelProperty(value = "部门的hr")
  18 + private String hr;
  19 +
  20 + @ApiModelProperty(value = "部门的项目经理")
  21 + private String pm;
  22 +
  23 + @ApiModelProperty(value = "部门的部门经理")
  24 + private String bm;
  25 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OaLeaveBaseVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveBaseVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 import java.util.*; 4 import java.util.*;
@@ -13,7 +13,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -13,7 +13,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
13 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 13 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
14 */ 14 */
15 @Data 15 @Data
16 -public class OaLeaveBaseVO { 16 +public class OALeaveBaseVO {
17 17
18 @ApiModelProperty(value = "流程id") 18 @ApiModelProperty(value = "流程id")
19 private String processInstanceId; 19 private String processInstanceId;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OaLeaveCreateReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveCreateReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 -import java.util.*;  
5 import io.swagger.annotations.*; 4 import io.swagger.annotations.*;
6 -import javax.validation.constraints.*; 5 +
  6 +import java.util.Map;
7 7
8 @ApiModel("请假申请创建 Request VO") 8 @ApiModel("请假申请创建 Request VO")
9 @Data 9 @Data
10 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
11 @ToString(callSuper = true) 11 @ToString(callSuper = true)
12 -public class OaLeaveCreateReqVO extends OaLeaveBaseVO { 12 +public class OALeaveCreateReqVO extends OALeaveBaseVO {
13 13
  14 + /**
  15 + * 对应 bpmn 文件 <process> 的 id
  16 + */
  17 + @ApiModelProperty(value = "流程key")
14 private String processKey; 18 private String processKey;
  19 +
  20 +
  21 + @ApiModelProperty(value = "流程用户任务的变量")
  22 + private Map<String,Object> taskVariables;
15 } 23 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OaLeaveExcelVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExcelVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 import java.util.*; 4 import java.util.*;
@@ -12,7 +12,7 @@ import com.alibaba.excel.annotation.ExcelProperty; @@ -12,7 +12,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
12 * @author 芋艿 12 * @author 芋艿
13 */ 13 */
14 @Data 14 @Data
15 -public class OaLeaveExcelVO { 15 +public class OALeaveExcelVO {
16 16
17 @ExcelProperty("请假表单主键") 17 @ExcelProperty("请假表单主键")
18 private Long id; 18 private Long id;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OaLeaveExportReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveExportReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 import java.util.*; 4 import java.util.*;
@@ -10,7 +10,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -10,7 +10,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
10 10
11 @ApiModel(value = "请假申请 Excel 导出 Request VO", description = "参数和 OaLeavePageReqVO 是一致的") 11 @ApiModel(value = "请假申请 Excel 导出 Request VO", description = "参数和 OaLeavePageReqVO 是一致的")
12 @Data 12 @Data
13 -public class OaLeaveExportReqVO { 13 +public class OALeaveExportReqVO {
14 14
15 @ApiModelProperty(value = "流程id") 15 @ApiModelProperty(value = "流程id")
16 private String processInstanceId; 16 private String processInstanceId;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OaLeavePageReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeavePageReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 import java.util.*; 4 import java.util.*;
@@ -12,7 +12,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -12,7 +12,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
12 @Data 12 @Data
13 @EqualsAndHashCode(callSuper = true) 13 @EqualsAndHashCode(callSuper = true)
14 @ToString(callSuper = true) 14 @ToString(callSuper = true)
15 -public class OaLeavePageReqVO extends PageParam { 15 +public class OALeavePageReqVO extends PageParam {
16 16
17 @ApiModelProperty(value = "流程id") 17 @ApiModelProperty(value = "流程id")
18 private String processInstanceId; 18 private String processInstanceId;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OaLeaveRespVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveRespVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
2 2
3 import lombok.*; 3 import lombok.*;
4 -import java.util.*;  
5 import io.swagger.annotations.*; 4 import io.swagger.annotations.*;
6 5
7 @ApiModel("请假申请 Response VO") 6 @ApiModel("请假申请 Response VO")
8 @Data 7 @Data
9 @EqualsAndHashCode(callSuper = true) 8 @EqualsAndHashCode(callSuper = true)
10 @ToString(callSuper = true) 9 @ToString(callSuper = true)
11 -public class OaLeaveRespVO extends OaLeaveBaseVO { 10 +public class OALeaveRespVO extends OALeaveBaseVO {
12 11
13 @ApiModelProperty(value = "请假表单主键", required = true) 12 @ApiModelProperty(value = "请假表单主键", required = true)
14 private Long id; 13 private Long id;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OaLeaveUpdateReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/OALeaveUpdateReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
@@ -13,7 +13,7 @@ import java.util.Map; @@ -13,7 +13,7 @@ import java.util.Map;
13 @Data 13 @Data
14 @EqualsAndHashCode(callSuper = true) 14 @EqualsAndHashCode(callSuper = true)
15 @ToString(callSuper = true) 15 @ToString(callSuper = true)
16 -public class OaLeaveUpdateReqVO extends OaLeaveBaseVO { 16 +public class OALeaveUpdateReqVO extends OALeaveBaseVO {
17 17
18 @ApiModelProperty(value = "请假表单主键", required = true) 18 @ApiModelProperty(value = "请假表单主键", required = true)
19 @NotNull(message = "请假表单主键不能为空") 19 @NotNull(message = "请假表单主键不能为空")
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http 0 → 100644
  1 +### 请求 /login 接口 => 成功
  2 +POST {{baseUrl}}/bpm/process-instance/create
  3 +Content-Type: application/json
  4 +tenant-id: 1
  5 +Authorization: Bearer {{token}}
  6 +
  7 +{
  8 + "processDefinitionId": "leave:7:20ada39c-6c95-11ec-88b1-cacd34981f8e",
  9 + "variables": {
  10 + "a": 1,
  11 + "b": "2"
  12 + }
  13 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.task;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
  5 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  6 +import io.swagger.annotations.Api;
  7 +import io.swagger.annotations.ApiOperation;
  8 +import org.springframework.validation.annotation.Validated;
  9 +import org.springframework.web.bind.annotation.PostMapping;
  10 +import org.springframework.web.bind.annotation.RequestBody;
  11 +import org.springframework.web.bind.annotation.RequestMapping;
  12 +import org.springframework.web.bind.annotation.RestController;
  13 +
  14 +import javax.annotation.Resource;
  15 +import javax.validation.Valid;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  18 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  19 +
  20 +@Api(tags = "流程实例") // 流程实例,通过流程定义创建的一次“申请”
  21 +@RestController
  22 +@RequestMapping("/bpm/process-instance")
  23 +@Validated
  24 +public class BpmProcessInstanceController {
  25 +
  26 + @Resource
  27 + private BpmProcessInstanceService processInstanceService;
  28 +
  29 + @PostMapping("/create")
  30 + @ApiOperation("新建流程实例")
  31 + public CommonResult<String> createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) {
  32 + return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO));
  33 + }
  34 +
  35 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +import javax.validation.constraints.NotEmpty;
  8 +import java.util.Map;
  9 +
  10 +@ApiModel("流程实例的创建 Request VO")
  11 +@Data
  12 +//@EqualsAndHashCode(callSuper = true)
  13 +//@ToString(callSuper = true)
  14 +public class BpmProcessInstanceCreateReqVO {
  15 +
  16 + @ApiModelProperty(value = "流程定义的编号", required = true, example = "1024")
  17 + @NotEmpty(message = "流程定义编号不能为空")
  18 + private String processDefinitionId;
  19 +
  20 + @ApiModelProperty(value = "变量实例")
  21 + private Map<String, Object> variables;
  22 +
  23 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +
  5 +public class BpmProcessInstanceMyPageReqVO extends PageParam {
  6 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/TaskController.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/TaskController.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.TaskService; 3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
5 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
7 import io.swagger.annotations.Api; 8 import io.swagger.annotations.Api;
8 import io.swagger.annotations.ApiOperation; 9 import io.swagger.annotations.ApiOperation;
9 import org.springframework.web.bind.annotation.*; 10 import org.springframework.web.bind.annotation.*;
10 11
11 import javax.annotation.Resource; 12 import javax.annotation.Resource;
  13 +import javax.servlet.http.HttpServletResponse;
12 import javax.validation.Valid; 14 import javax.validation.Valid;
  15 +import java.io.IOException;
13 import java.util.List; 16 import java.util.List;
14 17
15 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 18 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -21,40 +24,50 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -21,40 +24,50 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21 public class TaskController { 24 public class TaskController {
22 25
23 @Resource 26 @Resource
24 - private TaskService taskService; 27 + private BpmTaskService bpmTaskService;
25 28
26 @GetMapping("/todo/page") 29 @GetMapping("/todo/page")
27 @ApiOperation("获取待办任务分页") 30 @ApiOperation("获取待办任务分页")
28 public CommonResult<PageResult<TodoTaskRespVO>> getTodoTaskPage(@Valid TodoTaskPageReqVO pageVO) { 31 public CommonResult<PageResult<TodoTaskRespVO>> getTodoTaskPage(@Valid TodoTaskPageReqVO pageVO) {
29 - return success(taskService.getTodoTaskPage(pageVO)); 32 + return success(bpmTaskService.getTodoTaskPage(pageVO));
30 } 33 }
31 34
32 @GetMapping("/claim") 35 @GetMapping("/claim")
33 @ApiOperation("签收任务") 36 @ApiOperation("签收任务")
34 public CommonResult<Boolean> claimTask(@RequestParam("id") String taskId) { 37 public CommonResult<Boolean> claimTask(@RequestParam("id") String taskId) {
35 - taskService.claimTask(taskId); 38 + bpmTaskService.claimTask(taskId);
36 return success(true); 39 return success(true);
37 } 40 }
38 41
39 @PostMapping("/task-steps") 42 @PostMapping("/task-steps")
40 public CommonResult<TaskHandleVO> getTaskSteps(@RequestBody TaskQueryReqVO taskQuery) { 43 public CommonResult<TaskHandleVO> getTaskSteps(@RequestBody TaskQueryReqVO taskQuery) {
41 - return success(taskService.getTaskSteps(taskQuery)); 44 + return success(bpmTaskService.getTaskSteps(taskQuery));
42 } 45 }
43 46
44 @PostMapping("/formKey") 47 @PostMapping("/formKey")
45 public CommonResult<TodoTaskRespVO> getTaskFormKey(@RequestBody TaskQueryReqVO taskQuery) { 48 public CommonResult<TodoTaskRespVO> getTaskFormKey(@RequestBody TaskQueryReqVO taskQuery) {
46 - return success(taskService.getTaskFormKey(taskQuery)); 49 + return success(bpmTaskService.getTaskFormKey(taskQuery));
47 } 50 }
48 51
49 @PostMapping("/complete") 52 @PostMapping("/complete")
50 public CommonResult<Boolean> complete(@RequestBody TaskReqVO taskReq) { 53 public CommonResult<Boolean> complete(@RequestBody TaskReqVO taskReq) {
51 - taskService.completeTask(taskReq); 54 + bpmTaskService.completeTask(taskReq);
52 return success(true); 55 return success(true);
53 } 56 }
54 57
55 @GetMapping("/process/history-steps") 58 @GetMapping("/process/history-steps")
56 public CommonResult<List<TaskStepVO>> getHistorySteps(@RequestParam("id") String processInstanceId) { 59 public CommonResult<List<TaskStepVO>> getHistorySteps(@RequestParam("id") String processInstanceId) {
57 - return success(taskService.getHistorySteps(processInstanceId)); 60 + return success(bpmTaskService.getHistorySteps(processInstanceId));
  61 + }
  62 +
  63 + /**
  64 + * 返回高亮的流转图SVG
  65 + * @param processInstanceId 流程Id
  66 + */
  67 + @GetMapping("/process/highlight-img")
  68 + public void getHighlightImg(@RequestParam String processInstanceId, HttpServletResponse response) throws IOException {
  69 + FileResp fileResp = bpmTaskService.getHighlightImg(processInstanceId);
  70 + ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte());
58 } 71 }
59 72
60 } 73 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/FileResp.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +// TODO @Li:1)改成 HighlightImgRespVO 吧。2)swagger 注解要补充;3)fileByte => fileContent
  6 +/**
  7 + * 文件输出类
  8 + *
  9 + * @author yunlongn
  10 + */
  11 +@Data
  12 +public class FileResp {
  13 +
  14 + /**
  15 + * 文件名字
  16 + */
  17 + private String fileName;
  18 +
  19 + /**
  20 + * 文件输出流
  21 + */
  22 + private byte[] fileByte;
  23 +
  24 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskHandleVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskHandleVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 import lombok.ToString; 4 import lombok.ToString;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskQueryReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskQueryReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 import lombok.ToString; 4 import lombok.ToString;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 import lombok.ToString; 4 import lombok.ToString;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TaskStepVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TaskStepVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 import lombok.ToString; 4 import lombok.ToString;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskPageReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskPageReqVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.annotations.ApiModel; 4 import io.swagger.annotations.ApiModel;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/workflow/vo/TodoTaskRespVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/TodoTaskRespVO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import lombok.Data; 4 import lombok.Data;
5 -import lombok.EqualsAndHashCode;  
6 import lombok.ToString; 5 import lombok.ToString;
7 6
8 @ApiModel("待办任务 Response VO") 7 @ApiModel("待办任务 Response VO")
@@ -10,8 +9,13 @@ import lombok.ToString; @@ -10,8 +9,13 @@ import lombok.ToString;
10 @ToString 9 @ToString
11 public class TodoTaskRespVO { 10 public class TodoTaskRespVO {
12 11
  12 + // TODO @jason:swagger 注解。这样接口文档才完整哈
  13 +
13 private String id; 14 private String id;
14 15
  16 +
  17 + private String processInstanceId;
  18 +
15 /** 19 /**
16 * 1:未签收 20 * 1:未签收
17 * 2:已签收 21 * 2:已签收
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmDefinitionConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionDO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
  7 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  8 +import org.activiti.engine.impl.persistence.entity.SuspensionState;
  9 +import org.activiti.engine.repository.Deployment;
  10 +import org.activiti.engine.repository.ProcessDefinition;
  11 +import org.mapstruct.Mapper;
  12 +import org.mapstruct.factory.Mappers;
  13 +
  14 +import java.util.List;
  15 +import java.util.Map;
  16 +
  17 +/**
  18 + * Bpm 流程定义的 Convert
  19 + *
  20 + * @author yunlong.li
  21 + */
  22 +@Mapper
  23 +public interface BpmDefinitionConvert {
  24 +
  25 + BpmDefinitionConvert INSTANCE = Mappers.getMapper(BpmDefinitionConvert.class);
  26 +
  27 + default List<BpmProcessDefinitionPageItemRespVO> convertList(List<ProcessDefinition> list, Map<String, Deployment> deploymentMap,
  28 + Map<String, BpmProcessDefinitionDO> processDefinitionDOMap, Map<Long, BpmFormDO> formMap) {
  29 + return CollectionUtils.convertList(list, definition -> {
  30 + Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null;
  31 + BpmProcessDefinitionDO definitionDO = processDefinitionDOMap.get(definition.getId());
  32 + BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null;
  33 + return convert(definition, deployment, definitionDO, form);
  34 + });
  35 + }
  36 +
  37 + default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment,
  38 + BpmProcessDefinitionDO processDefinitionDO, BpmFormDO form) {
  39 + BpmProcessDefinitionPageItemRespVO respVO = convert(bean);
  40 + respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
  41 + if (deployment != null) {
  42 + respVO.setDeploymentTime(deployment.getDeploymentTime());
  43 + }
  44 + if (form != null) {
  45 + respVO.setFormId(form.getId());
  46 + respVO.setFormName(form.getName());
  47 + }
  48 + if (processDefinitionDO != null) {
  49 + respVO.setDescription(processDefinitionDO.getDescription());
  50 + }
  51 + return respVO;
  52 + }
  53 +
  54 + BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean);
  55 +
  56 + BpmProcessDefinitionDO convert2(BpmDefinitionCreateReqDTO bean);
  57 +
  58 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/form/BpmFormConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.form;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormCreateReqVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormRespVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormSimpleRespVO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormUpdateReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 动态表单 Convert
  16 + *
  17 + * @author 芋艿
  18 + */
  19 +@Mapper
  20 +public interface BpmFormConvert {
  21 +
  22 + BpmFormConvert INSTANCE = Mappers.getMapper(BpmFormConvert.class);
  23 +
  24 + BpmFormDO convert(BpmFormCreateReqVO bean);
  25 +
  26 + BpmFormDO convert(BpmFormUpdateReqVO bean);
  27 +
  28 + BpmFormRespVO convert(BpmFormDO bean);
  29 +
  30 + List<BpmFormSimpleRespVO> convertList2(List<BpmFormDO> list);
  31 +
  32 + PageResult<BpmFormRespVO> convertPage(PageResult<BpmFormDO> page);
  33 +
  34 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/model/BpmModelConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.model;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo.*;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.service.model.dto.BpmModelMetaInfoRespDTO;
  7 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  8 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  9 +import org.activiti.engine.impl.persistence.entity.SuspensionState;
  10 +import org.activiti.engine.repository.Deployment;
  11 +import org.activiti.engine.repository.Model;
  12 +import org.activiti.engine.repository.ProcessDefinition;
  13 +import org.mapstruct.Mapper;
  14 +import org.mapstruct.factory.Mappers;
  15 +
  16 +import java.util.List;
  17 +import java.util.Map;
  18 +
  19 +
  20 +/**
  21 + * 流程定义 Convert
  22 + *
  23 + * @author yunlongn
  24 + */
  25 +@Mapper
  26 +public interface BpmModelConvert {
  27 +
  28 + BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class);
  29 +
  30 + default List<BpmModelPageItemRespVO> convertList(List<Model> list, Map<Long, BpmFormDO> formMap,
  31 + Map<String, Deployment> deploymentMap,
  32 + Map<String, ProcessDefinition> processDefinitionMap) {
  33 + return CollectionUtils.convertList(list, model -> {
  34 + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
  35 + BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null;
  36 + Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null;
  37 + ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null;
  38 + return convert(model, form, deployment, processDefinition);
  39 + });
  40 + }
  41 +
  42 + default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, Deployment deployment, ProcessDefinition processDefinition) {
  43 + BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO();
  44 + modelRespVO.setId(model.getId());
  45 + modelRespVO.setName(model.getName());
  46 + modelRespVO.setKey(model.getKey());
  47 + modelRespVO.setCategory(model.getCategory());
  48 + modelRespVO.setCreateTime(model.getCreateTime());
  49 + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
  50 + if (metaInfo != null) {
  51 + modelRespVO.setDescription(metaInfo.getDescription());
  52 + }
  53 + if (form != null) {
  54 + modelRespVO.setFormId(form.getId());
  55 + modelRespVO.setFormName(form.getName());
  56 + }
  57 + modelRespVO.setProcessDefinition(this.convert(processDefinition));
  58 + if (modelRespVO.getProcessDefinition() != null) {
  59 + modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ?
  60 + SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
  61 + modelRespVO.getProcessDefinition().setDeploymentTime(deployment.getDeploymentTime());
  62 + }
  63 + return modelRespVO;
  64 + }
  65 +
  66 + default BpmModelRespVO convert(Model model) {
  67 + BpmModelRespVO modelRespVO = new BpmModelRespVO();
  68 + modelRespVO.setId(model.getId());
  69 + modelRespVO.setName(model.getName());
  70 + modelRespVO.setKey(model.getKey());
  71 + modelRespVO.setCategory(model.getCategory());
  72 + modelRespVO.setCreateTime(model.getCreateTime());
  73 + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
  74 + if (metaInfo != null) {
  75 + modelRespVO.setFormId(metaInfo.getFormId());
  76 + modelRespVO.setDescription(metaInfo.getDescription());
  77 + }
  78 + return modelRespVO;
  79 + }
  80 +
  81 + default BpmDefinitionCreateReqDTO convert2(Model model) {
  82 + BpmDefinitionCreateReqDTO createReqDTO = new BpmDefinitionCreateReqDTO();
  83 + createReqDTO.setName(model.getName());
  84 + createReqDTO.setKey(model.getKey());
  85 + createReqDTO.setCategory(model.getCategory());
  86 + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
  87 + if (metaInfo != null) {
  88 + createReqDTO.setDescription(metaInfo.getDescription());
  89 + createReqDTO.setFormId(metaInfo.getFormId());
  90 + }
  91 + return createReqDTO;
  92 + }
  93 +
  94 + default void copy(Model model, BpmModelCreateReqVO bean) {
  95 + model.setName(bean.getName());
  96 + model.setKey(bean.getKey());
  97 + model.setCategory(bean.getCategory());
  98 + model.setMetaInfo(JsonUtils.toJsonString(this.buildMetaInfo(bean.getDescription(), bean.getFormId())));
  99 + }
  100 +
  101 + default void copy(Model model, BpmModelUpdateReqVO bean) {
  102 + model.setName(bean.getName());
  103 + model.setCategory(bean.getCategory());
  104 + model.setMetaInfo(JsonUtils.toJsonString(this.buildMetaInfo(bean.getDescription(), bean.getFormId())));
  105 + }
  106 +
  107 + default BpmModelMetaInfoRespDTO buildMetaInfo(String description, Long formId) {
  108 + BpmModelMetaInfoRespDTO metaInfo = new BpmModelMetaInfoRespDTO();
  109 + metaInfo.setDescription(description);
  110 + metaInfo.setFormId(formId);
  111 + return metaInfo;
  112 + }
  113 +
  114 + BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean);
  115 +
  116 + BpmModelCreateReqVO convert(BpmModeImportReqVO bean);
  117 +
  118 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/oa/OALeaveConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.oa;
  2 +
  3 +import java.util.*;
  4 +
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveCreateReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveExcelVO;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveRespVO;
  9 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveUpdateReqVO;
  10 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  11 +
  12 +import org.mapstruct.Mapper;
  13 +import org.mapstruct.factory.Mappers;
  14 +
  15 +/**
  16 + * 请假申请 Convert
  17 + *
  18 + * @author 芋艿
  19 + */
  20 +@Mapper
  21 +public interface OALeaveConvert {
  22 +
  23 + OALeaveConvert INSTANCE = Mappers.getMapper(OALeaveConvert.class);
  24 +
  25 + OALeaveDO convert(OALeaveCreateReqVO bean);
  26 +
  27 + OALeaveDO convert(OALeaveUpdateReqVO bean);
  28 +
  29 + OALeaveRespVO convert(OALeaveDO bean);
  30 +
  31 + List<OALeaveRespVO> convertList(List<OALeaveDO> list);
  32 +
  33 + PageResult<OALeaveRespVO> convertPage(PageResult<OALeaveDO> page);
  34 +
  35 + List<OALeaveExcelVO> convertList02(List<OALeaveDO> list);
  36 +
  37 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/package-info.java 0 → 100644
  1 +/**
  2 + * 提供 POJO 类的实体转换
  3 + *
  4 + * 目前使用 MapStruct 框架
  5 + */
  6 +package cn.iocoder.yudao.adminserver.modules.bpm.convert;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/workflow/TaskConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TaskStepVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TodoTaskRespVO;
  5 +import org.activiti.api.task.model.Task;
  6 +import org.activiti.engine.history.HistoricActivityInstance;
  7 +import org.activiti.engine.repository.ProcessDefinition;
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.Mapping;
  10 +import org.mapstruct.Mappings;
  11 +import org.mapstruct.Named;
  12 +import org.mapstruct.factory.Mappers;
  13 +
  14 +@Mapper
  15 +public interface TaskConvert {
  16 + TaskConvert INSTANCE = Mappers.getMapper(TaskConvert.class);
  17 +
  18 + @Mappings(value = {
  19 + @Mapping(source = "task.id", target = "id"),
  20 + @Mapping(source = "task.businessKey", target = "businessKey"),
  21 + @Mapping(source = "task.assignee", target = "status",qualifiedByName = "convertAssigneeToStatus"),
  22 + @Mapping(source = "definition.name", target = "processName"),
  23 + @Mapping(source = "definition.key", target = "processKey"),
  24 + @Mapping(source = "definition.id", target = "processInstanceId")
  25 + })
  26 + TodoTaskRespVO convert(Task task, ProcessDefinition definition);
  27 +
  28 + @Mappings(value = {
  29 + @Mapping(source = "assignee", target = "status",qualifiedByName = "convertAssigneeToStatus")
  30 + })
  31 + TodoTaskRespVO convert(Task task);
  32 +
  33 + @Named("convertAssigneeToStatus")
  34 + default Integer convertAssigneeToStatus(String assignee) {
  35 + //TODO 不应该通过 assignee 定义状态 需要定义更多的状态
  36 + return assignee == null ? 1 : 2;
  37 + }
  38 +
  39 + @Mappings(value = {
  40 + @Mapping(source = "activityName", target = "stepName"),
  41 + @Mapping(source = "assignee", target = "assignee")
  42 + })
  43 + TaskStepVO convert(HistoricActivityInstance instance);
  44 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md 0 → 100644
  1 +<http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao>
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionDO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.*;
  8 +import org.activiti.engine.repository.ProcessDefinition;
  9 +
  10 +/**
  11 + * Bpm 流程定义的拓展表
  12 + * 主要解决 主要进行 Activiti {@link ProcessDefinition} 不支持拓展字段,所以新建拓展表
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +@TableName(value = "bpm_process_definition", autoResultMap = true)
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
  20 +@Builder
  21 +@NoArgsConstructor
  22 +@AllArgsConstructor
  23 +public class BpmProcessDefinitionDO extends BaseDO {
  24 +
  25 + /**
  26 + * 编号
  27 + */
  28 + @TableId
  29 + private Long id;
  30 + /**
  31 + * 流程定义的编号
  32 + *
  33 + * 关联 {@link ProcessDefinition#getId()}
  34 + */
  35 + private String processDefinitionId;
  36 + /**
  37 + * 描述
  38 + */
  39 + private String description;
  40 + /**
  41 + * 表单编号
  42 + *
  43 + * 关联 {@link BpmFormDO#getId()}
  44 + */
  45 + private Long formId;
  46 +
  47 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/form/WfForm.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/form/BpmFormDO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import com.baomidou.mybatisplus.annotation.TableField; 4 import com.baomidou.mybatisplus.annotation.TableField;
@@ -15,14 +15,14 @@ import java.util.List; @@ -15,14 +15,14 @@ import java.util.List;
15 * 15 *
16 * @author 芋道源码 16 * @author 芋道源码
17 */ 17 */
18 -@TableName(value = "wf_form", autoResultMap = true) 18 +@TableName(value = "bpm_form", autoResultMap = true)
19 @Data 19 @Data
20 @EqualsAndHashCode(callSuper = true) 20 @EqualsAndHashCode(callSuper = true)
21 @ToString(callSuper = true) 21 @ToString(callSuper = true)
22 @Builder 22 @Builder
23 @NoArgsConstructor 23 @NoArgsConstructor
24 @AllArgsConstructor 24 @AllArgsConstructor
25 -public class WfForm extends BaseDO { 25 +public class BpmFormDO extends BaseDO {
26 26
27 /** 27 /**
28 * 编号 28 * 编号
@@ -38,11 +38,11 @@ public class WfForm extends BaseDO { @@ -38,11 +38,11 @@ public class WfForm extends BaseDO {
38 */ 38 */
39 private Integer status; 39 private Integer status;
40 /** 40 /**
41 - * 表单JSON 41 + * 表单的配置
42 */ 42 */
43 - private String formJson; 43 + private String conf;
44 /** 44 /**
45 - * 表单配置 45 + * 表单项的数组
46 * 46 *
47 * 目前直接将 https://github.com/JakHuang/form-generator 生成的 JSON 串,直接保存 47 * 目前直接将 https://github.com/JakHuang/form-generator 生成的 JSON 串,直接保存
48 * 定义:https://github.com/JakHuang/form-generator/issues/46 48 * 定义:https://github.com/JakHuang/form-generator/issues/46
@@ -54,4 +54,4 @@ public class WfForm extends BaseDO { @@ -54,4 +54,4 @@ public class WfForm extends BaseDO {
54 */ 54 */
55 private String remark; 55 private String remark;
56 56
57 -}  
58 \ No newline at end of file 57 \ No newline at end of file
  58 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/form/WfFormData.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/form/BpmFormDataDO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import com.baomidou.mybatisplus.annotation.TableField; 4 import com.baomidou.mybatisplus.annotation.TableField;
@@ -15,14 +15,14 @@ import java.util.Map; @@ -15,14 +15,14 @@ import java.util.Map;
15 * 15 *
16 * @author 芋道源码 16 * @author 芋道源码
17 */ 17 */
18 -@TableName(value = "wf_form", autoResultMap = true) 18 +@TableName(value = "bpm_form_data", autoResultMap = true)
19 @Data 19 @Data
20 @EqualsAndHashCode(callSuper = true) 20 @EqualsAndHashCode(callSuper = true)
21 @ToString(callSuper = true) 21 @ToString(callSuper = true)
22 @Builder 22 @Builder
23 @NoArgsConstructor 23 @NoArgsConstructor
24 @AllArgsConstructor 24 @AllArgsConstructor
25 -public class WfFormData extends BaseDO { 25 +public class BpmFormDataDO extends BaseDO {
26 26
27 /** 27 /**
28 * 编号 28 * 编号
@@ -31,7 +31,7 @@ public class WfFormData extends BaseDO { @@ -31,7 +31,7 @@ public class WfFormData extends BaseDO {
31 /** 31 /**
32 * 表单编号 32 * 表单编号
33 * 33 *
34 - * 关联 {@link WfForm#getId()} 34 + * 关联 {@link BpmFormDO#getId()}
35 */ 35 */
36 private Long formId; 36 private Long formId;
37 /** 37 /**
@@ -41,7 +41,7 @@ public class WfFormData extends BaseDO { @@ -41,7 +41,7 @@ public class WfFormData extends BaseDO {
41 /** 41 /**
42 * 表单配置 42 * 表单配置
43 * 43 *
44 - * 冗余 {@link WfForm#getFields()} 44 + * 冗余 {@link BpmFormDO#getFields()}
45 * 主要考虑,表单是可以修改的 45 * 主要考虑,表单是可以修改的
46 */ 46 */
47 @TableField(typeHandler = JacksonTypeHandler.class) 47 @TableField(typeHandler = JacksonTypeHandler.class)
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/oa/OaLeaveDO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/OALeaveDO.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave;
2 2
3 import lombok.*; 3 import lombok.*;
4 import java.util.*; 4 import java.util.*;
@@ -17,7 +17,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -17,7 +17,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
17 @Builder 17 @Builder
18 @NoArgsConstructor 18 @NoArgsConstructor
19 @AllArgsConstructor 19 @AllArgsConstructor
20 -public class OaLeaveDO extends BaseDO { 20 +public class OALeaveDO extends BaseDO {
21 21
22 /** 22 /**
23 * 请假表单主键 23 * 请假表单主键
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/leave/package-info.java 0 → 100644
  1 +/**
  2 + * TODO 芋艿:实现请假流程,接入工作流
  3 + */
  4 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/package-info.java 0 → 100644
  1 +/**
  2 + * TODO 芋艿:工作流创建后的定义
  3 + */
  4 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionDO;
  4 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  6 +import org.apache.ibatis.annotations.Mapper;
  7 +
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +
  11 +@Mapper
  12 +public interface BpmProcessDefinitionMapper extends BaseMapper<BpmProcessDefinitionDO> {
  13 +
  14 + default List<BpmProcessDefinitionDO> selectListByProcessDefinitionIds(Collection<String> processDefinitionIds) {
  15 + return selectList(new QueryWrapper<BpmProcessDefinitionDO>().in("process_definition_id", processDefinitionIds));
  16 + }
  17 +
  18 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/form/BpmFormMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.form;
  2 +
  3 +
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormPageReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  8 +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +/**
  12 + * 动态表单 Mapper
  13 + *
  14 + * @author 风里雾里
  15 + */
  16 +@Mapper
  17 +public interface BpmFormMapper extends BaseMapperX<BpmFormDO> {
  18 +
  19 + default PageResult<BpmFormDO> selectPage(BpmFormPageReqVO reqVO) {
  20 + return selectPage(reqVO, new QueryWrapperX<BpmFormDO>()
  21 + .likeIfPresent("name", reqVO.getName())
  22 + .orderByDesc("id"));
  23 + }
  24 +
  25 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/mysql/oa/OaLeaveMapper.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/oa/OALeaveMapper.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa;
2 2
3 import java.util.*; 3 import java.util.*;
4 4
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveExportReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeavePageReqVO;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 9 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 10 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
8 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;  
9 import org.apache.ibatis.annotations.Mapper; 11 import org.apache.ibatis.annotations.Mapper;
10 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;  
11 12
12 /** 13 /**
13 * 请假申请 Mapper 14 * 请假申请 Mapper
@@ -15,10 +16,10 @@ import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*; @@ -15,10 +16,10 @@ import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
15 * @author 芋艿 16 * @author 芋艿
16 */ 17 */
17 @Mapper 18 @Mapper
18 -public interface OaLeaveMapper extends BaseMapperX<OaLeaveDO> { 19 +public interface OALeaveMapper extends BaseMapperX<OALeaveDO> {
19 20
20 - default PageResult<OaLeaveDO> selectPage(OaLeavePageReqVO reqVO) {  
21 - return selectPage(reqVO, new QueryWrapperX<OaLeaveDO>() 21 + default PageResult<OALeaveDO> selectPage(OALeavePageReqVO reqVO) {
  22 + return selectPage(reqVO, new QueryWrapperX<OALeaveDO>()
22 .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId()) 23 .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId())
23 .eqIfPresent("status", reqVO.getStatus()) 24 .eqIfPresent("status", reqVO.getStatus())
24 .eqIfPresent("user_id", reqVO.getUserId()) 25 .eqIfPresent("user_id", reqVO.getUserId())
@@ -30,8 +31,8 @@ public interface OaLeaveMapper extends BaseMapperX&lt;OaLeaveDO&gt; { @@ -30,8 +31,8 @@ public interface OaLeaveMapper extends BaseMapperX&lt;OaLeaveDO&gt; {
30 .orderByDesc("id") ); 31 .orderByDesc("id") );
31 } 32 }
32 33
33 - default List<OaLeaveDO> selectList(OaLeaveExportReqVO reqVO) {  
34 - return selectList(new QueryWrapperX<OaLeaveDO>() 34 + default List<OALeaveDO> selectList(OALeaveExportReqVO reqVO) {
  35 + return selectList(new QueryWrapperX<OALeaveDO>()
35 .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId()) 36 .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId())
36 .eqIfPresent("status", reqVO.getStatus()) 37 .eqIfPresent("status", reqVO.getStatus())
37 .eqIfPresent("user_id", reqVO.getUserId()) 38 .eqIfPresent("user_id", reqVO.getUserId())
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.enums;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  4 +
  5 +/**
  6 + * 工作流 错误码枚举类
  7 + *
  8 + * 工作流系统,使用 1-009-000-000 段
  9 + */
  10 +public interface BpmErrorCodeConstants {
  11 +
  12 + // ========== 通用流程处理 模块 1-009-000-000 ==========
  13 + ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1009000001, "流程实例不存在");
  14 + ErrorCode HIGHLIGHT_IMG_ERROR = new ErrorCode(1009000002, "获取高亮流程图异常");
  15 +
  16 + // ========== OA 流程模块 1-009-001-000 ==========
  17 + ErrorCode OA_LEAVE_NOT_EXISTS = new ErrorCode(1009001001, "请假申请不存在");
  18 + ErrorCode OA_PM_POST_NOT_EXISTS = new ErrorCode(1009001002, "项目经理岗位未设置");
  19 + ErrorCode OA_DEPART_PM_POST_NOT_EXISTS = new ErrorCode(1009001009, "部门的项目经理不存在");
  20 + ErrorCode OA_BM_POST_NOT_EXISTS = new ErrorCode(1009001004, "部门经理岗位未设置");
  21 + ErrorCode OA_DEPART_BM_POST_NOT_EXISTS = new ErrorCode(1009001005, "部门的部门经理不存在");
  22 + ErrorCode OA_HR_POST_NOT_EXISTS = new ErrorCode(1009001006, "HR岗位未设置");
  23 + ErrorCode OA_DAY_LEAVE_ERROR = new ErrorCode(1009001007, "请假天数必须>=1");
  24 +
  25 + // ========== 流程模型 1-009-002-000 ==========
  26 + ErrorCode MODEL_KEY_EXISTS = new ErrorCode(1009002000, "已经存在流程标识为【{}】的流程");
  27 + ErrorCode MODEL_NOT_EXISTS = new ErrorCode(1009002001, "流程模型不存在");
  28 + ErrorCode MODEL_KEY_VALID = new ErrorCode(1009002002, "流程标识格式不正确,需要以字母或下划线开头,后接任意字母、数字、中划线、下划线、句点!");
  29 +
  30 + // ========== 流程定义 1-009-003-000 ==========
  31 + ErrorCode PROCESS_DEFINITION_KEY_NOT_MATCH = new ErrorCode(1009003000, "流程定义的标识期望是({}),当前是({}),请修改 BPMN 流程图");
  32 + ErrorCode PROCESS_DEFINITION_NAME_NOT_MATCH = new ErrorCode(1009003001, "流程定义的名字期望是({}),当前是({}),请修改 BPMN 流程图");
  33 + ErrorCode PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1009003002, "流程定义不存在");
  34 + ErrorCode PROCESS_DEFINITION_IS_SUSPENDED = new ErrorCode(1009003002, "流程定义处于挂起状态");
  35 +
  36 + // ========== 流程实例 1-009-004-000 ==========
  37 +
  38 +
  39 + // ========== 动态表单模块 1-009-010-000 ==========
  40 + ErrorCode FORM_NOT_EXISTS = new ErrorCode(1009010000, "动态表单不存在");
  41 + ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1009010000, "表单项({}) 和 ({}) 使用了相同的字段名({})");
  42 +
  43 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/FlowStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.enums;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 流程状态
  8 + */
  9 +@Getter
  10 +@AllArgsConstructor
  11 +public enum FlowStatusEnum {
  12 +
  13 + HANDLE(1, "处理中"),
  14 +
  15 + PASS(2, "审批通过"),
  16 +
  17 + REJECTED(3, "审批不通过");
  18 +
  19 + /**
  20 + * 状态
  21 + */
  22 + private final Integer status;
  23 +
  24 +
  25 + /**
  26 + * 描述
  27 + */
  28 + private final String desc;
  29 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/package-info.java 0 → 100644
  1 +/**
  2 + * bpm 包下,业务流程管理(Business Process Management),我们放工作流的功能,基于 activiti 7 版本实现。
  3 + * 例如说:流程定义、表单配置、审核中心(我的申请、我的待办、我的已办)等等
  4 + *
  5 + * bpm 解释:https://baike.baidu.com/item/BPM/1933
  6 + *
  7 + * 缩写:bpm
  8 + */
  9 +package cn.iocoder.yudao.adminserver.modules.bpm;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupManagerService.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupManagerService.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.config; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.config;
2 2
3 3
4 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; 4 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/config/UserGroupsProvider.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/config/UserGroupsProvider.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.config; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.config;
2 2
3 import cn.iocoder.yudao.framework.security.core.LoginUser; 3 import cn.iocoder.yudao.framework.security.core.LoginUser;
4 import org.activiti.api.runtime.shared.security.PrincipalGroupsProvider; 4 import org.activiti.api.runtime.shared.security.PrincipalGroupsProvider;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmProcessDefinitionService.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  8 +import org.activiti.bpmn.model.BpmnModel;
  9 +import org.activiti.engine.repository.Deployment;
  10 +import org.activiti.engine.repository.ProcessDefinition;
  11 +
  12 +import javax.validation.Valid;
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +import java.util.Set;
  16 +
  17 +/**
  18 + * 流程定义接口
  19 + *
  20 + * @author yunlong.li
  21 + * @author ZJQ
  22 + */
  23 +public interface BpmProcessDefinitionService {
  24 +
  25 + /**
  26 + * 获得流程定义分页
  27 + *
  28 + * @param pageReqVO 分页入参
  29 + * @return 流程定义 Page
  30 + */
  31 + PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO);
  32 +
  33 + /**
  34 + * 获得流程定义对应的 BPMN XML
  35 + *
  36 + * @param id 流程定义编号
  37 + * @return BPMN XML
  38 + */
  39 + String getProcessDefinitionBpmnXML(String id);
  40 +
  41 + /**
  42 + * 获得 Bpmn 模型
  43 + *
  44 + * @param processDefinitionId 流程定义的编号
  45 + * @return Bpmn 模型
  46 + */
  47 + BpmnModel getBpmnModel(String processDefinitionId);
  48 +
  49 + /**
  50 + * 获得编号对应的 ProcessDefinition
  51 + *
  52 + * @param id 编号
  53 + * @return 流程定义
  54 + */
  55 + ProcessDefinition getProcessDefinition(String id);
  56 +
  57 + /**
  58 + * 获得 id 对应的 Deployment
  59 + *
  60 + * @param id 部署编号
  61 + * @return 流程部署
  62 + */
  63 + Deployment getDeployment(String id);
  64 +
  65 + /**
  66 + * 获得 ids 对应的 Deployment 数组
  67 + *
  68 + * @param ids 部署编号的数组
  69 + * @return 流程部署的数组
  70 + */
  71 + List<Deployment> getDeployments(Set<String> ids);
  72 +
  73 + /**
  74 + * 获得 ids 对应的 Deployment Map
  75 + *
  76 + * @param ids 部署编号的数组
  77 + * @return 流程部署 Map
  78 + */
  79 + default Map<String, Deployment> getDeploymentMap(Set<String> ids) {
  80 + return CollectionUtils.convertMap(getDeployments(ids), Deployment::getId);
  81 + }
  82 +
  83 + /**
  84 + * 获得 deploymentId 对应的 ProcessDefinition
  85 + *
  86 + * @param deploymentId 部署编号
  87 + * @return 流程定义
  88 + */
  89 + ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId);
  90 +
  91 + /**
  92 + * 获得 deploymentIds 对应的 ProcessDefinition 数组
  93 + *
  94 + * @param deploymentIds 部署编号的数组
  95 + * @return 流程定义的数组
  96 + */
  97 + List<ProcessDefinition> getProcessDefinitionListByDeploymentIds(Set<String> deploymentIds);
  98 +
  99 + /**
  100 + * 创建流程定义
  101 + *
  102 + * @param createReqDTO 创建信息
  103 + * @return 流程编号
  104 + */
  105 + String createProcessDefinition(@Valid BpmDefinitionCreateReqDTO createReqDTO);
  106 +
  107 + /**
  108 + * 更新流程定义的挂起状态
  109 + *
  110 + * @param id 流程定义的编号
  111 + * @param state 挂起状态 {@link org.activiti.engine.impl.persistence.entity.SuspensionState}
  112 + */
  113 + void updateProcessDefinitionState(String id, Integer state);
  114 +
  115 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmDefinitionCreateReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import javax.validation.constraints.NotEmpty;
  6 +
  7 +/**
  8 + * 流程定义创建 Request DTO
  9 + */
  10 +@Data
  11 +public class BpmDefinitionCreateReqDTO {
  12 +
  13 + /**
  14 + * 流程标识
  15 + */
  16 + @NotEmpty(message = "流程标识不能为空")
  17 + private String key;
  18 + /**
  19 + * 流程名称
  20 + */
  21 + @NotEmpty(message = "流程名称不能为空")
  22 + private String name;
  23 + /**
  24 + * 流程描述
  25 + */
  26 + private String description;
  27 + /**
  28 + * 流程分类
  29 + * 参见 bpm_model_category 数据字典
  30 + */
  31 + @NotEmpty(message = "流程分类不能为空")
  32 + private String category;
  33 + /**
  34 + * BPMN XML
  35 + */
  36 + @NotEmpty(message = "BPMN XML 不能为空")
  37 + private String bpmnXml;
  38 + /**
  39 + * 动态表单编号,允许空
  40 + */
  41 + private Long formId;
  42 +
  43 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmDefinitionConvert;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionDO;
  9 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  10 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessDefinitionMapper;
  11 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
  12 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
  13 +import cn.iocoder.yudao.adminserver.modules.bpm.service.form.BpmFormService;
  14 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  15 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  16 +import cn.iocoder.yudao.framework.common.util.object.PageUtils;
  17 +import lombok.extern.slf4j.Slf4j;
  18 +import org.activiti.bpmn.converter.BpmnXMLConverter;
  19 +import org.activiti.bpmn.model.BpmnModel;
  20 +import org.activiti.engine.RepositoryService;
  21 +import org.activiti.engine.impl.persistence.entity.SuspensionState;
  22 +import org.activiti.engine.repository.Deployment;
  23 +import org.activiti.engine.repository.ProcessDefinition;
  24 +import org.activiti.engine.repository.ProcessDefinitionQuery;
  25 +import org.springframework.stereotype.Service;
  26 +import org.springframework.transaction.annotation.Transactional;
  27 +import org.springframework.validation.annotation.Validated;
  28 +
  29 +import javax.annotation.Resource;
  30 +import java.util.*;
  31 +
  32 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH;
  33 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH;
  34 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  35 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  36 +
  37 +/**
  38 + * 流程定义实现
  39 + * 主要进行 Activiti {@link ProcessDefinition} 和 {@link Deployment} 的维护
  40 + *
  41 + * @author yunlongn
  42 + * @author ZJQ
  43 + */
  44 +@Service
  45 +@Validated
  46 +@Slf4j
  47 +public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionService {
  48 +
  49 + private static final String BPMN_FILE_SUFFIX = ".bpmn";
  50 +
  51 + private static final BpmnXMLConverter BPMN_XML_CONVERTER = new BpmnXMLConverter();
  52 +
  53 + @Resource
  54 + private RepositoryService repositoryService;
  55 + @Resource
  56 + private BpmFormService bpmFormService;
  57 +
  58 + @Resource
  59 + private BpmProcessDefinitionMapper processDefinitionMapper;
  60 +
  61 + @Override
  62 + public PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) {
  63 + ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
  64 + if (StrUtil.isNotBlank(pageVO.getKey())) {
  65 + definitionQuery.processDefinitionKey(pageVO.getKey());
  66 + }
  67 + // 执行查询
  68 + List<ProcessDefinition> processDefinitions = definitionQuery.orderByProcessDefinitionId().desc()
  69 + .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
  70 + if (CollUtil.isEmpty(processDefinitions)) {
  71 + return new PageResult<>(Collections.emptyList(), definitionQuery.count());
  72 + }
  73 +
  74 + // 获得 Deployment Map
  75 + Set<String> deploymentIds = new HashSet<>();
  76 + processDefinitions.forEach(definition -> CollectionUtils.addIfNotNull(deploymentIds, definition.getDeploymentId()));
  77 + Map<String, Deployment> deploymentMap = getDeploymentMap(deploymentIds);
  78 +
  79 + // 获得 BpmProcessDefinitionDO Map
  80 + List<BpmProcessDefinitionDO> processDefinitionDOs = Collections.emptyList();
  81 + processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds(
  82 + convertList(processDefinitions, ProcessDefinition::getId));
  83 + Map<String, BpmProcessDefinitionDO> processDefinitionDOMap = CollectionUtils.convertMap(processDefinitionDOs,
  84 + BpmProcessDefinitionDO::getProcessDefinitionId);
  85 +
  86 + // 获得 Form Map
  87 + Set<Long> formIds = CollectionUtils.convertSet(processDefinitionDOs, BpmProcessDefinitionDO::getFormId);
  88 + Map<Long, BpmFormDO> formMap = bpmFormService.getFormMap(formIds);
  89 +
  90 + // 拼接结果
  91 + long definitionCount = definitionQuery.count();
  92 + return new PageResult<>(BpmDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap,
  93 + processDefinitionDOMap, formMap), definitionCount);
  94 + }
  95 +
  96 + @Override
  97 + public String getProcessDefinitionBpmnXML(String id) {
  98 + BpmnModel bpmnModel = repositoryService.getBpmnModel(id);
  99 + if (bpmnModel == null) {
  100 + return null;
  101 + }
  102 + byte[] bpmnBytes = BPMN_XML_CONVERTER.convertToXML(bpmnModel);
  103 + return StrUtil.utf8Str(bpmnBytes);
  104 + }
  105 +
  106 + @Override
  107 + public BpmnModel getBpmnModel(String processDefinitionId) {
  108 + return repositoryService.getBpmnModel(processDefinitionId);
  109 + }
  110 +
  111 + @Override
  112 + public ProcessDefinition getProcessDefinition(String id) {
  113 + return repositoryService.getProcessDefinition(id);
  114 + }
  115 +
  116 + @Override
  117 + public Deployment getDeployment(String id) {
  118 + if (StrUtil.isEmpty(id)) {
  119 + return null;
  120 + }
  121 + return repositoryService.createDeploymentQuery().deploymentId(id).singleResult();
  122 + }
  123 +
  124 + @Override
  125 + public List<Deployment> getDeployments(Set<String> ids) {
  126 + if (CollUtil.isEmpty(ids)) {
  127 + return Collections.emptyList();
  128 + }
  129 + List<Deployment> list = new ArrayList<>(ids.size());
  130 + for (String id : ids) {
  131 + CollectionUtils.addIfNotNull(list, getDeployment(id));
  132 + }
  133 + return list;
  134 + }
  135 +
  136 + @Override
  137 + public ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId) {
  138 + return repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
  139 + }
  140 +
  141 + @Override
  142 + public List<ProcessDefinition> getProcessDefinitionListByDeploymentIds(Set<String> deploymentIds) {
  143 + if (CollUtil.isEmpty(deploymentIds)) {
  144 + return Collections.emptyList();
  145 + }
  146 + return repositoryService.createProcessDefinitionQuery().deploymentIds(deploymentIds).list();
  147 + }
  148 +
  149 + @Override
  150 + @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti 操作,所以开启事务
  151 + public String createProcessDefinition(BpmDefinitionCreateReqDTO createReqDTO) {
  152 + // 创建 Deployment 部署
  153 + Deployment deploy = repositoryService.createDeployment()
  154 + .key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory())
  155 + .addString(createReqDTO.getName() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnXml())
  156 + .deploy();
  157 +
  158 + // 设置 ProcessDefinition 的 category 分类
  159 + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
  160 + repositoryService.setProcessDefinitionCategory(definition.getId(), createReqDTO.getCategory());
  161 + // 注意 1,ProcessDefinition 的 key 和 name 是通过 BPMN 中的 <bpmn2:process /> 的 id 和 name 决定
  162 + // 注意 2,目前该项目的设计上,需要保证 Model、Deployment、ProcessDefinition 使用相同的 key,保证关联性。
  163 + // 否则,会导致 ProcessDefinition 的分页无法查询到。
  164 + if (!Objects.equals(definition.getKey(), createReqDTO.getKey())) {
  165 + throw exception(PROCESS_DEFINITION_KEY_NOT_MATCH, createReqDTO.getKey(), definition.getKey());
  166 + }
  167 + if (!Objects.equals(definition.getName(), createReqDTO.getName())) {
  168 + throw exception(PROCESS_DEFINITION_NAME_NOT_MATCH, createReqDTO.getName(), definition.getName());
  169 + }
  170 +
  171 + // 插入拓展表
  172 + BpmProcessDefinitionDO definitionDO = BpmDefinitionConvert.INSTANCE.convert2(createReqDTO)
  173 + .setProcessDefinitionId(definition.getId());
  174 + processDefinitionMapper.insert(definitionDO);
  175 + return definition.getId();
  176 + }
  177 +
  178 + @Override
  179 + public void updateProcessDefinitionState(String id, Integer state) {
  180 + // 激活
  181 + if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), state)) {
  182 + repositoryService.activateProcessDefinitionById(id, true, null);
  183 + return;
  184 + }
  185 + // 挂起
  186 + if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), state)) {
  187 + repositoryService.suspendProcessDefinitionById(id, true, null);
  188 + return;
  189 + }
  190 + log.error("[updateProcessDefinitionState][流程定义({}) 修改未知状态({})]", id, state);
  191 + }
  192 +
  193 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/form/WfFormService.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/form/BpmFormService.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.form; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.form;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormCreateReqVO;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormExportReqVO;  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormPageReqVO;  
6 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormUpdateReqVO;  
7 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm; 3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormCreateReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormPageReqVO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormUpdateReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  9 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  10 +import org.activiti.engine.repository.Model;
9 11
10 -import java.util.*;  
11 -import javax.validation.*; 12 +import javax.validation.Valid;
  13 +import java.util.Collection;
  14 +import java.util.Collections;
  15 +import java.util.List;
  16 +import java.util.Map;
12 17
13 18
14 /** 19 /**
15 * 动态表单 Service 接口 20 * 动态表单 Service 接口
16 * 21 *
17 - * TODO @风里雾里 22 + * @author @风里雾里
18 */ 23 */
19 -public interface WfFormService { 24 +public interface BpmFormService {
20 25
21 /** 26 /**
22 * 创建动态表单 27 * 创建动态表单
@@ -24,14 +29,14 @@ public interface WfFormService { @@ -24,14 +29,14 @@ public interface WfFormService {
24 * @param createReqVO 创建信息 29 * @param createReqVO 创建信息
25 * @return 编号 30 * @return 编号
26 */ 31 */
27 - Long createForm(@Valid WfFormCreateReqVO createReqVO); 32 + Long createForm(@Valid BpmFormCreateReqVO createReqVO);
28 33
29 /** 34 /**
30 * 更新动态表单 35 * 更新动态表单
31 * 36 *
32 * @param updateReqVO 更新信息 37 * @param updateReqVO 更新信息
33 */ 38 */
34 - void updateForm(@Valid WfFormUpdateReqVO updateReqVO); 39 + void updateForm(@Valid BpmFormUpdateReqVO updateReqVO);
35 40
36 /** 41 /**
37 * 删除动态表单 42 * 删除动态表单
@@ -46,7 +51,14 @@ public interface WfFormService { @@ -46,7 +51,14 @@ public interface WfFormService {
46 * @param id 编号 51 * @param id 编号
47 * @return 动态表单 52 * @return 动态表单
48 */ 53 */
49 - WfForm getForm(Long id); 54 + BpmFormDO getForm(Long id);
  55 +
  56 + /**
  57 + * 获得动态表单列表
  58 + *
  59 + * @return 动态表单列表
  60 + */
  61 + List<BpmFormDO> getFormList();
50 62
51 /** 63 /**
52 * 获得动态表单列表 64 * 获得动态表单列表
@@ -54,22 +66,27 @@ public interface WfFormService { @@ -54,22 +66,27 @@ public interface WfFormService {
54 * @param ids 编号 66 * @param ids 编号
55 * @return 动态表单列表 67 * @return 动态表单列表
56 */ 68 */
57 - List<WfForm> getFormList(Collection<Long> ids); 69 + List<BpmFormDO> getFormList(Collection<Long> ids);
58 70
59 /** 71 /**
60 - * 获得动态表单分页 72 + * 获得动态表单 Map
61 * 73 *
62 - * @param pageReqVO 分页查询  
63 - * @return 动态表单分页 74 + * @param ids 编号
  75 + * @return 动态表单 Map
64 */ 76 */
65 - PageResult<WfForm> getFormPage(WfFormPageReqVO pageReqVO); 77 + default Map<Long, BpmFormDO> getFormMap(Collection<Long> ids) {
  78 + if (CollUtil.isEmpty(ids)) {
  79 + return Collections.emptyMap();
  80 + }
  81 + return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDO::getId);
  82 + }
66 83
67 /** 84 /**
68 - * 获得动态表单列表, 用于 Excel 导出 85 + * 获得动态表单分页
69 * 86 *
70 - * @param exportReqVO 查询条件  
71 - * @return 动态表单列表 87 + * @param pageReqVO 分页查询
  88 + * @return 动态表单分页
72 */ 89 */
73 - List<WfForm> getFormList(WfFormExportReqVO exportReqVO); 90 + PageResult<BpmFormDO> getFormPage(BpmFormPageReqVO pageReqVO);
74 91
75 } 92 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/form/dto/BpmFormFieldRespDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.form.dto;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonProperty;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + * Bpm 表单的 Field 表单项 Response DTO
  8 + * 字段的定义,可见 https://github.com/JakHuang/form-generator/issues/46 文档
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Data
  13 +public class BpmFormFieldRespDTO {
  14 +
  15 + /**
  16 + * 表单标题
  17 + */
  18 + private String label;
  19 + /**
  20 + * 表单字段的属性名,可自定义
  21 + */
  22 + @JsonProperty(value = "vModel")
  23 + private String vModel;
  24 +
  25 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/form/impl/WfFormServiceImpl.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/form/impl/BpmFormServiceImpl.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.form.impl; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.form.impl;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormCreateReqVO;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormExportReqVO;  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormPageReqVO;  
6 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormUpdateReqVO;  
7 -import cn.iocoder.yudao.adminserver.modules.activiti.convert.form.WfFormConvert;  
8 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;  
9 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.form.WfFormMapper;  
10 -import cn.iocoder.yudao.adminserver.modules.activiti.service.form.WfFormService; 3 +import cn.hutool.core.lang.Assert;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormCreateReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormPageReqVO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.form.vo.BpmFormUpdateReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.form.BpmFormConvert;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  9 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.form.BpmFormMapper;
  10 +import cn.iocoder.yudao.adminserver.modules.bpm.service.form.BpmFormService;
  11 +import cn.iocoder.yudao.adminserver.modules.bpm.service.form.dto.BpmFormFieldRespDTO;
11 import cn.iocoder.yudao.framework.common.pojo.PageResult; 12 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  13 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
12 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
13 import org.springframework.validation.annotation.Validated; 15 import org.springframework.validation.annotation.Validated;
14 16
15 import javax.annotation.Resource; 17 import javax.annotation.Resource;
16 import java.util.Collection; 18 import java.util.Collection;
  19 +import java.util.HashMap;
17 import java.util.List; 20 import java.util.List;
  21 +import java.util.Map;
18 22
19 -import static cn.iocoder.yudao.adminserver.modules.activiti.enums.form.WfFormErrorCodeConstants.FORM_NOT_EXISTS; 23 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_FIELD_REPEAT;
  24 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_NOT_EXISTS;
20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21 26
22 /** 27 /**
23 * 动态表单 Service 实现类 28 * 动态表单 Service 实现类
24 * 29 *
25 - * TODO @风里雾里 30 + * @author 风里雾里
26 */ 31 */
27 @Service 32 @Service
28 @Validated 33 @Validated
29 -public class WfFormServiceImpl implements WfFormService { 34 +public class BpmFormServiceImpl implements BpmFormService {
30 35
31 @Resource 36 @Resource
32 - private WfFormMapper formMapper; 37 + private BpmFormMapper formMapper;
33 38
34 @Override 39 @Override
35 - public Long createForm(WfFormCreateReqVO createReqVO) { 40 + public Long createForm(BpmFormCreateReqVO createReqVO) {
  41 + this.checkFields(createReqVO.getFields());
36 // 插入 42 // 插入
37 - WfForm form = WfFormConvert.INSTANCE.convert(createReqVO); 43 + BpmFormDO form = BpmFormConvert.INSTANCE.convert(createReqVO);
38 formMapper.insert(form); 44 formMapper.insert(form);
39 // 返回 45 // 返回
40 return form.getId(); 46 return form.getId();
41 } 47 }
42 48
43 @Override 49 @Override
44 - public void updateForm(WfFormUpdateReqVO updateReqVO) { 50 + public void updateForm(BpmFormUpdateReqVO updateReqVO) {
  51 + this.checkFields(updateReqVO.getFields());
45 // 校验存在 52 // 校验存在
46 this.validateFormExists(updateReqVO.getId()); 53 this.validateFormExists(updateReqVO.getId());
47 // 更新 54 // 更新
48 - WfForm updateObj = WfFormConvert.INSTANCE.convert(updateReqVO); 55 + BpmFormDO updateObj = BpmFormConvert.INSTANCE.convert(updateReqVO);
49 formMapper.updateById(updateObj); 56 formMapper.updateById(updateObj);
50 } 57 }
51 58
@@ -64,23 +71,43 @@ public class WfFormServiceImpl implements WfFormService { @@ -64,23 +71,43 @@ public class WfFormServiceImpl implements WfFormService {
64 } 71 }
65 72
66 @Override 73 @Override
67 - public WfForm getForm(Long id) { 74 + public BpmFormDO getForm(Long id) {
68 return formMapper.selectById(id); 75 return formMapper.selectById(id);
69 } 76 }
70 77
71 @Override 78 @Override
72 - public List<WfForm> getFormList(Collection<Long> ids) { 79 + public List<BpmFormDO> getFormList() {
  80 + return formMapper.selectList();
  81 + }
  82 +
  83 + @Override
  84 + public List<BpmFormDO> getFormList(Collection<Long> ids) {
73 return formMapper.selectBatchIds(ids); 85 return formMapper.selectBatchIds(ids);
74 } 86 }
75 87
76 @Override 88 @Override
77 - public PageResult<WfForm> getFormPage(WfFormPageReqVO pageReqVO) { 89 + public PageResult<BpmFormDO> getFormPage(BpmFormPageReqVO pageReqVO) {
78 return formMapper.selectPage(pageReqVO); 90 return formMapper.selectPage(pageReqVO);
79 } 91 }
80 92
81 - @Override  
82 - public List<WfForm> getFormList(WfFormExportReqVO exportReqVO) {  
83 - return formMapper.selectList(exportReqVO); 93 + /**
  94 + * 校验 Field,避免 field 重复
  95 + *
  96 + * @param fields field 数组
  97 + */
  98 + private void checkFields(List<String> fields) {
  99 + Map<String, String> fieldMap = new HashMap<>(); // key 是 vModel,value 是 label
  100 + for (String field : fields) {
  101 + BpmFormFieldRespDTO fieldDTO = JsonUtils.parseObject(field, BpmFormFieldRespDTO.class);
  102 + Assert.notNull(fieldDTO);
  103 + String oldLabel = fieldMap.put(fieldDTO.getVModel(), fieldDTO.getLabel());
  104 + // 如果不存在,则直接返回
  105 + if (oldLabel == null) {
  106 + continue;
  107 + }
  108 + // 如果存在,则报错
  109 + throw exception(FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel());
  110 + }
84 } 111 }
85 112
86 } 113 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/model/BpmModelService.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.model;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo.*;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +
  6 +import javax.validation.Valid;
  7 +
  8 +/**
  9 + * 流程模型接口
  10 + *
  11 + * @author yunlongn
  12 + */
  13 +public interface BpmModelService {
  14 +
  15 + /**
  16 + * 获得流程模型分页
  17 + *
  18 + * @param pageVO 分页查询
  19 + * @return 流程模型分页
  20 + */
  21 + PageResult<BpmModelPageItemRespVO> getModelPage(ModelPageReqVO pageVO);
  22 +
  23 + /**
  24 + * 获得流程模块
  25 + *
  26 + * @param id 编号
  27 + * @return 流程模型
  28 + */
  29 + BpmModelRespVO getModel(String id);
  30 +
  31 + /**
  32 + * 创建流程模型
  33 + *
  34 + * @param modelVO 创建信息
  35 + * @return 创建的流程模型的编号
  36 + */
  37 + String createModel(@Valid BpmModelCreateReqVO modelVO);
  38 +
  39 + /**
  40 + * 修改流程模型
  41 + *
  42 + * @param updateReqVO 更新信息
  43 + */
  44 + void updateModel(@Valid BpmModelUpdateReqVO updateReqVO);
  45 +
  46 + /**
  47 + * 将流程模型,部署成一个流程定义
  48 + *
  49 + * @param id 编号
  50 + */
  51 + void deployModel(String id);
  52 +
  53 + /**
  54 + * 删除模型
  55 + *
  56 + * @param id 编号
  57 + */
  58 + void deleteModel(String id);
  59 +
  60 + /**
  61 + * 修改模型的状态,实际更新的部署的流程定义的状态
  62 + *
  63 + * @param id 编号
  64 + * @param state 状态 {@link org.activiti.engine.impl.persistence.entity.SuspensionState}
  65 + */
  66 + void updateModelState(String id, Integer state);
  67 +
  68 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/model/dto/BpmModelMetaInfoRespDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.model.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +/**
  6 + * BPM 流程 MetaInfo Response DTO
  7 + * 主要用于 {@link org.activiti.engine.repository.Model#setMetaInfo(String)} 的存储
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +@Data
  12 +public class BpmModelMetaInfoRespDTO {
  13 +
  14 + /**
  15 + * 流程描述
  16 + */
  17 + private String description;
  18 + /**
  19 + * 表单编号
  20 + */
  21 + private Long formId;
  22 +
  23 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/model/impl/BpmModelServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.model.impl;
  2 +
  3 +import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.model.vo.*;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.model.BpmModelConvert;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
  9 +import cn.iocoder.yudao.adminserver.modules.bpm.service.form.BpmFormService;
  10 +import cn.iocoder.yudao.adminserver.modules.bpm.service.model.BpmModelService;
  11 +import cn.iocoder.yudao.adminserver.modules.bpm.service.model.dto.BpmModelMetaInfoRespDTO;
  12 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  13 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  14 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  15 +import cn.iocoder.yudao.framework.common.util.object.PageUtils;
  16 +import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
  17 +import lombok.extern.slf4j.Slf4j;
  18 +import org.activiti.engine.RepositoryService;
  19 +import org.activiti.engine.impl.persistence.entity.SuspensionState;
  20 +import org.activiti.engine.repository.Deployment;
  21 +import org.activiti.engine.repository.Model;
  22 +import org.activiti.engine.repository.ModelQuery;
  23 +import org.activiti.engine.repository.ProcessDefinition;
  24 +import org.springframework.stereotype.Service;
  25 +import org.springframework.transaction.annotation.Transactional;
  26 +import org.springframework.util.ObjectUtils;
  27 +import org.springframework.validation.annotation.Validated;
  28 +
  29 +import javax.annotation.Resource;
  30 +import java.util.HashSet;
  31 +import java.util.List;
  32 +import java.util.Map;
  33 +import java.util.Set;
  34 +
  35 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*;
  36 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  37 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  38 +
  39 +/**
  40 + * 流程定义实现
  41 + * 主要进行 Activiti {@link Model} 的维护
  42 + *
  43 + * @author yunlongn
  44 + */
  45 +@Service
  46 +@Validated
  47 +@Slf4j
  48 +public class BpmModelServiceImpl implements BpmModelService {
  49 +
  50 + @Resource
  51 + private RepositoryService repositoryService;
  52 + @Resource
  53 + private BpmFormService bpmFormService;
  54 + @Resource
  55 + private BpmProcessDefinitionService bpmProcessDefinitionService;
  56 +
  57 + @Override
  58 + public PageResult<BpmModelPageItemRespVO> getModelPage(ModelPageReqVO pageVO) {
  59 + ModelQuery modelQuery = repositoryService.createModelQuery();
  60 + if (StrUtil.isNotBlank(pageVO.getKey())) {
  61 + modelQuery.modelKey(pageVO.getKey());
  62 + }
  63 + if (StrUtil.isNotBlank(pageVO.getName())) {
  64 + modelQuery.modelNameLike("%" + pageVO.getName() + "%"); // 模糊匹配
  65 + }
  66 + if (StrUtil.isNotBlank(pageVO.getCategory())) {
  67 + modelQuery.modelCategory(pageVO.getCategory());
  68 + }
  69 + // 执行查询
  70 + List<Model> models = modelQuery.orderByCreateTime().desc()
  71 + .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
  72 +
  73 + // 获得 Form Map
  74 + Set<Long> formIds = CollectionUtils.convertSet(models, model -> {
  75 + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
  76 + return metaInfo != null ? metaInfo.getFormId() : null;
  77 + });
  78 + Map<Long, BpmFormDO> formMap = bpmFormService.getFormMap(formIds);
  79 +
  80 + // 获得 Deployment Map
  81 + Set<String> deploymentIds = new HashSet<>();
  82 + models.forEach(model -> CollectionUtils.addIfNotNull(deploymentIds, model.getDeploymentId()));
  83 + Map<String, Deployment> deploymentMap = bpmProcessDefinitionService.getDeploymentMap(deploymentIds);
  84 + // 获得 ProcessDefinition Map
  85 + List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionListByDeploymentIds(deploymentIds);
  86 + Map<String, ProcessDefinition> processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId);
  87 +
  88 + // 拼接结果
  89 + long modelCount = modelQuery.count();
  90 + return new PageResult<>(BpmModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount);
  91 + }
  92 +
  93 + @Override
  94 + public BpmModelRespVO getModel(String id) {
  95 + Model model = repositoryService.getModel(id);
  96 + if (model == null) {
  97 + return null;
  98 + }
  99 + BpmModelRespVO modelRespVO = BpmModelConvert.INSTANCE.convert(model);
  100 + // 拼接 bpmn XML
  101 + byte[] bpmnBytes = repositoryService.getModelEditorSource(id);
  102 + modelRespVO.setBpmnXml(StrUtil.utf8Str(bpmnBytes));
  103 + return modelRespVO;
  104 + }
  105 +
  106 + @Override
  107 + @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti 操作,所以开启事务
  108 + public String createModel(BpmModelCreateReqVO createReqVO) {
  109 + checkKeyNCName(createReqVO.getKey());
  110 + // 校验流程标识已经存在
  111 + Model keyModel = this.getModelByKey(createReqVO.getKey());
  112 + if (keyModel != null) {
  113 + throw exception(MODEL_KEY_EXISTS, createReqVO.getKey());
  114 + }
  115 +
  116 + // 创建流程定义
  117 + Model model = repositoryService.newModel();
  118 + BpmModelConvert.INSTANCE.copy(model, createReqVO);
  119 + // 保存流程定义
  120 + repositoryService.saveModel(model);
  121 + // 添加 BPMN XML
  122 + repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(createReqVO.getBpmnXml()));
  123 + return model.getId();
  124 + }
  125 +
  126 + @Override
  127 + @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti 操作,所以开启事务
  128 + public void updateModel(BpmModelUpdateReqVO updateReqVO) {
  129 + checkKeyNCName(updateReqVO.getKey());
  130 + // 校验流程模型存在
  131 + Model model = repositoryService.getModel(updateReqVO.getId());
  132 + if (model == null) {
  133 + throw exception(MODEL_NOT_EXISTS);
  134 + }
  135 +
  136 + // 修改流程定义
  137 + BpmModelConvert.INSTANCE.copy(model, updateReqVO);
  138 + // 更新模型
  139 + repositoryService.saveModel(model);
  140 + // 更新 BPMN XML
  141 + repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(updateReqVO.getBpmnXml()));
  142 + }
  143 +
  144 + @Override
  145 + @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti 操作,所以开启事务
  146 + public void deployModel(String id) {
  147 + // 校验流程模型存在
  148 + Model model = repositoryService.getModel(id);
  149 + if (ObjectUtils.isEmpty(model)) {
  150 + throw exception(MODEL_NOT_EXISTS);
  151 + }
  152 + byte[] bpmnBytes = repositoryService.getModelEditorSource(model.getId());
  153 + if (bpmnBytes == null) {
  154 + throw exception(MODEL_NOT_EXISTS);
  155 + }
  156 +
  157 + // 创建流程定义
  158 + BpmDefinitionCreateReqDTO definitionCreateReqDTO = BpmModelConvert.INSTANCE.convert2(model)
  159 + .setBpmnXml(StrUtil.utf8Str(bpmnBytes));
  160 + String definitionId = bpmProcessDefinitionService.createProcessDefinition(definitionCreateReqDTO);
  161 +
  162 + // 将老的流程定义进行挂起。也就是说,只有最新部署的流程定义,才可以发起任务。
  163 + if (StrUtil.isNotEmpty(model.getDeploymentId())) {
  164 + ProcessDefinition oldDefinition = bpmProcessDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
  165 + if (oldDefinition != null) {
  166 + bpmProcessDefinitionService.updateProcessDefinitionState(oldDefinition.getId(), SuspensionState.SUSPENDED.getStateCode());
  167 + }
  168 + }
  169 +
  170 + // 更新 model 的 deploymentId,进行关联
  171 + ProcessDefinition definition = bpmProcessDefinitionService.getProcessDefinition(definitionId);
  172 + model.setDeploymentId(definition.getDeploymentId());
  173 + repositoryService.saveModel(model);
  174 + }
  175 +
  176 + @Override
  177 + public void deleteModel(String id) {
  178 + // 校验流程模型存在
  179 + Model model = repositoryService.getModel(id);
  180 + if (model == null) {
  181 + throw exception(MODEL_NOT_EXISTS);
  182 + }
  183 + // 执行删除
  184 + repositoryService.deleteModel(id);
  185 + }
  186 +
  187 + @Override
  188 + public void updateModelState(String id, Integer state) {
  189 + // 校验流程模型存在
  190 + Model model = repositoryService.getModel(id);
  191 + if (model == null) {
  192 + throw exception(MODEL_NOT_EXISTS);
  193 + }
  194 + // 校验流程定义存在
  195 + ProcessDefinition definition = bpmProcessDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
  196 + if (definition == null) {
  197 + throw exception(PROCESS_DEFINITION_NOT_EXISTS);
  198 + }
  199 +
  200 + // 更新状态
  201 + bpmProcessDefinitionService.updateProcessDefinitionState(definition.getId(), state);
  202 + }
  203 +
  204 + private Model getModelByKey(String key) {
  205 + return repositoryService.createModelQuery().modelKey(key).singleResult();
  206 + }
  207 +
  208 + private void checkKeyNCName(String key) {
  209 + if (!ValidationUtils.isXmlNCName(key)) {
  210 + throw exception(MODEL_KEY_VALID);
  211 + }
  212 + }
  213 +
  214 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/LeaveApplyEndProcessor.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.FlowStatusEnum;
  6 +import org.activiti.engine.delegate.DelegateExecution;
  7 +import org.activiti.engine.delegate.ExecutionListener;
  8 +import org.springframework.stereotype.Component;
  9 +import org.springframework.transaction.annotation.Transactional;
  10 +
  11 +import javax.annotation.Resource;
  12 +import java.util.Objects;
  13 +
  14 +
  15 +/**
  16 + * 请假流程结束流程监听处理服务, 根据请假申请审批通过,还是未通过, 更新请假表单
  17 + */
  18 +@Component
  19 +public class LeaveApplyEndProcessor implements ExecutionListener {
  20 +
  21 + @Resource
  22 + private OALeaveMapper leaveMapper;
  23 +
  24 + @Override
  25 + @Transactional(rollbackFor = Exception.class)
  26 + public void notify(DelegateExecution delegateExecution) {
  27 + final String businessKey = delegateExecution.getProcessInstanceBusinessKey();
  28 + final Object approved = delegateExecution.getVariable("approved");
  29 + OALeaveDO updateDo = new OALeaveDO();
  30 + updateDo.setId(Long.valueOf(businessKey));
  31 + if (Objects.equals(approved, true)) {
  32 + updateDo.setStatus(FlowStatusEnum.PASS.getStatus());
  33 + } else {
  34 + updateDo.setStatus(FlowStatusEnum.REJECTED.getStatus());
  35 + }
  36 +
  37 + leaveMapper.updateById(updateDo);
  38 + }
  39 +
  40 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/OaLeaveService.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/OALeaveService.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.oa; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa;
2 2
3 3
4 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveCreateReqVO;  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveExportReqVO;  
6 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeavePageReqVO;  
7 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveUpdateReqVO;  
8 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO; 4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
9 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 7
11 import javax.validation.Valid; 8 import javax.validation.Valid;
@@ -17,7 +14,7 @@ import java.util.List; @@ -17,7 +14,7 @@ import java.util.List;
17 * 14 *
18 * @author 芋艿 15 * @author 芋艿
19 */ 16 */
20 -public interface OaLeaveService { 17 +public interface OALeaveService {
21 18
22 /** 19 /**
23 * 创建请假申请 20 * 创建请假申请
@@ -25,14 +22,14 @@ public interface OaLeaveService { @@ -25,14 +22,14 @@ public interface OaLeaveService {
25 * @param createReqVO 创建信息 22 * @param createReqVO 创建信息
26 * @return 编号 23 * @return 编号
27 */ 24 */
28 - Long createLeave(@Valid OaLeaveCreateReqVO createReqVO); 25 + Long createLeave(@Valid OALeaveCreateReqVO createReqVO);
29 26
30 /** 27 /**
31 * 更新请假申请 28 * 更新请假申请
32 * 29 *
33 * @param updateReqVO 更新信息 30 * @param updateReqVO 更新信息
34 */ 31 */
35 - void updateLeave(@Valid OaLeaveUpdateReqVO updateReqVO); 32 + void updateLeave(@Valid OALeaveUpdateReqVO updateReqVO);
36 33
37 /** 34 /**
38 * 删除请假申请 35 * 删除请假申请
@@ -47,7 +44,7 @@ public interface OaLeaveService { @@ -47,7 +44,7 @@ public interface OaLeaveService {
47 * @param id 编号 44 * @param id 编号
48 * @return 请假申请 45 * @return 请假申请
49 */ 46 */
50 - OaLeaveDO getLeave(Long id); 47 + OALeaveDO getLeave(Long id);
51 48
52 /** 49 /**
53 * 获得请假申请列表 50 * 获得请假申请列表
@@ -55,7 +52,7 @@ public interface OaLeaveService { @@ -55,7 +52,7 @@ public interface OaLeaveService {
55 * @param ids 编号 52 * @param ids 编号
56 * @return 请假申请列表 53 * @return 请假申请列表
57 */ 54 */
58 - List<OaLeaveDO> getLeaveList(Collection<Long> ids); 55 + List<OALeaveDO> getLeaveList(Collection<Long> ids);
59 56
60 /** 57 /**
61 * 获得请假申请分页 58 * 获得请假申请分页
@@ -63,7 +60,7 @@ public interface OaLeaveService { @@ -63,7 +60,7 @@ public interface OaLeaveService {
63 * @param pageReqVO 分页查询 60 * @param pageReqVO 分页查询
64 * @return 请假申请分页 61 * @return 请假申请分页
65 */ 62 */
66 - PageResult<OaLeaveDO> getLeavePage(OaLeavePageReqVO pageReqVO); 63 + PageResult<OALeaveDO> getLeavePage(OALeavePageReqVO pageReqVO);
67 64
68 /** 65 /**
69 * 获得请假申请列表, 用于 Excel 导出 66 * 获得请假申请列表, 用于 Excel 导出
@@ -71,6 +68,13 @@ public interface OaLeaveService { @@ -71,6 +68,13 @@ public interface OaLeaveService {
71 * @param exportReqVO 查询条件 68 * @param exportReqVO 查询条件
72 * @return 请假申请列表 69 * @return 请假申请列表
73 */ 70 */
74 - List<OaLeaveDO> getLeaveList(OaLeaveExportReqVO exportReqVO); 71 + List<OALeaveDO> getLeaveList(OALeaveExportReqVO exportReqVO);
75 72
  73 +
  74 +
  75 + /**
  76 + * 获取本人请假申请流程中审批人员
  77 + * @return 包括,本人部门的项目经理, 部门经理, HR
  78 + */
  79 + OALeaveApplyMembersVO getLeaveApplyMembers();
76 } 80 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/impl/OaLeaveServiceImpl.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java
1 -package cn.iocoder.yudao.adminserver.modules.activiti.service.oa.impl;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveCreateReqVO;  
4 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveExportReqVO;  
5 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeavePageReqVO;  
6 -import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveUpdateReqVO;  
7 -import cn.iocoder.yudao.adminserver.modules.activiti.convert.oa.OaLeaveConvert;  
8 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;  
9 -import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;  
10 -import cn.iocoder.yudao.adminserver.modules.activiti.service.oa.OaLeaveService; 1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.impl;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.date.DateUtil;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.OALeaveConvert;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper;
  9 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.FlowStatusEnum;
  10 +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService;
  11 +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
  12 +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper;
  13 +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;
  14 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  15 +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
11 import cn.iocoder.yudao.framework.common.pojo.PageResult; 16 import cn.iocoder.yudao.framework.common.pojo.PageResult;
12 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 17 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
13 -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;  
14 import org.activiti.api.task.model.Task; 18 import org.activiti.api.task.model.Task;
15 import org.activiti.api.task.model.builders.TaskPayloadBuilder; 19 import org.activiti.api.task.model.builders.TaskPayloadBuilder;
16 import org.activiti.api.task.runtime.TaskRuntime; 20 import org.activiti.api.task.runtime.TaskRuntime;
@@ -21,12 +25,9 @@ import org.springframework.transaction.annotation.Transactional; @@ -21,12 +25,9 @@ import org.springframework.transaction.annotation.Transactional;
21 import org.springframework.validation.annotation.Validated; 25 import org.springframework.validation.annotation.Validated;
22 26
23 import javax.annotation.Resource; 27 import javax.annotation.Resource;
24 -import java.util.Collection;  
25 -import java.util.HashMap;  
26 -import java.util.List;  
27 -import java.util.Map; 28 +import java.util.*;
28 29
29 -import static cn.iocoder.yudao.adminserver.modules.activiti.enums.OaErrorCodeConstants.LEAVE_NOT_EXISTS; 30 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*;
30 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 31 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
31 32
32 /** 33 /**
@@ -36,10 +37,10 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @@ -36,10 +37,10 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
36 */ 37 */
37 @Service 38 @Service
38 @Validated 39 @Validated
39 -public class OaLeaveServiceImpl implements OaLeaveService { 40 +public class OALeaveServiceImpl implements OALeaveService {
40 41
41 @Resource 42 @Resource
42 - private OaLeaveMapper leaveMapper; 43 + private OALeaveMapper leaveMapper;
43 44
44 @Resource 45 @Resource
45 private RuntimeService runtimeService; 46 private RuntimeService runtimeService;
@@ -50,37 +51,46 @@ public class OaLeaveServiceImpl implements OaLeaveService { @@ -50,37 +51,46 @@ public class OaLeaveServiceImpl implements OaLeaveService {
50 @Resource 51 @Resource
51 private TaskRuntime taskRuntime; 52 private TaskRuntime taskRuntime;
52 53
  54 + @Resource
  55 + private SysPostMapper sysPostMapper;
  56 +
  57 + @Resource
  58 + private SysUserMapper sysUserMapper;
  59 +
53 @Override 60 @Override
54 @Transactional(rollbackFor = Exception.class) 61 @Transactional(rollbackFor = Exception.class)
55 - public Long createLeave(OaLeaveCreateReqVO createReqVO) { 62 + public Long createLeave(OALeaveCreateReqVO createReqVO) {
56 // 插入 OA 请假单 63 // 插入 OA 请假单
57 - OaLeaveDO leave = OaLeaveConvert.INSTANCE.convert(createReqVO);  
58 - leave.setStatus(1); 64 + OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO);
  65 + leave.setStatus(FlowStatusEnum.HANDLE.getStatus());
  66 + // TODO @jason:应该是存储 userId??
59 leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername()); 67 leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
60 leaveMapper.insert(leave); 68 leaveMapper.insert(leave);
61 - 69 + Date startTime = createReqVO.getStartTime();
  70 + Date endTime = createReqVO.getEndTime();
  71 + long day = DateUtil.betweenDay(startTime, endTime, false);
  72 + if (day <= 0) {
  73 + throw ServiceExceptionUtil.exception(OA_DAY_LEAVE_ERROR);
  74 + }
  75 + Map<String, Object> taskVariables = createReqVO.getTaskVariables();
  76 + taskVariables.put("day", day);
62 // 创建工作流 77 // 创建工作流
63 - Map<String, Object> variables = new HashMap<>();  
64 - // 如何得到部门领导人,暂时写死  
65 - variables.put("deptLeader", "admin"); // TODO @芋艿:需要部门的负责人  
66 Long id = leave.getId(); 78 Long id = leave.getId();
67 String businessKey = String.valueOf(id); 79 String businessKey = String.valueOf(id);
68 - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, variables); 80 + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, taskVariables);
69 String processInstanceId = processInstance.getProcessInstanceId(); 81 String processInstanceId = processInstance.getProcessInstanceId();
70 82
71 - // TODO @json:service 不要出现 dao 的元素,例如说 UpdateWrapper。这里,我们可以调用 updateById 方法  
72 // 将工作流的编号,更新到 OA 请假单中 83 // 将工作流的编号,更新到 OA 请假单中
73 - UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();  
74 - updateWrapper.eq("id", id);  
75 - OaLeaveDO updateDo = new OaLeaveDO(); 84 + OALeaveDO updateDo = new OALeaveDO();
76 updateDo.setProcessInstanceId(processInstanceId); 85 updateDo.setProcessInstanceId(processInstanceId);
77 - leaveMapper.update(updateDo, updateWrapper); 86 + updateDo.setId(id);
  87 + leaveMapper.updateById(updateDo);
78 return id; 88 return id;
79 } 89 }
80 90
81 @Override 91 @Override
82 @Transactional(rollbackFor = Exception.class) 92 @Transactional(rollbackFor = Exception.class)
83 - public void updateLeave(OaLeaveUpdateReqVO updateReqVO) { 93 + public void updateLeave(OALeaveUpdateReqVO updateReqVO) {
84 // 校验存在 94 // 校验存在
85 this.validateLeaveExists(updateReqVO.getId()); 95 this.validateLeaveExists(updateReqVO.getId());
86 96
@@ -93,49 +103,93 @@ public class OaLeaveServiceImpl implements OaLeaveService { @@ -93,49 +103,93 @@ public class OaLeaveServiceImpl implements OaLeaveService {
93 taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()) 103 taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId())
94 .withVariables(variables) 104 .withVariables(variables)
95 .build()); 105 .build());
96 - // TODO @jason:不需要加 final 哈。虽然是不变,但是代码比较少这么去写  
97 - final Object reApply = variables.get("reApply");  
98 - // TODO @jason:直接使用 Objects.equals(reApply, true) 就可以  
99 - if((reApply instanceof Boolean) && (Boolean)reApply){ 106 +
  107 + // TOTO @芋道源码 貌似 IDEA 会自动加上final(不需要加 final 哈。虽然是不变,但是代码比较少这么去写)
  108 + Object reApply = variables.get("reApply");
  109 + if(Objects.equals(reApply, true)){
100 // 更新 表单 110 // 更新 表单
101 - OaLeaveDO updateObj = OaLeaveConvert.INSTANCE.convert(updateReqVO); 111 + OALeaveDO updateObj = OALeaveConvert.INSTANCE.convert(updateReqVO);
102 leaveMapper.updateById(updateObj); 112 leaveMapper.updateById(updateObj);
103 } 113 }
104 } 114 }
105 115
  116 + // TODO @jason:要不,请假不支持删除,只支持取消?
106 @Override 117 @Override
107 public void deleteLeave(Long id) { 118 public void deleteLeave(Long id) {
108 // 校验存在 119 // 校验存在
109 this.validateLeaveExists(id); 120 this.validateLeaveExists(id);
110 // 删除 121 // 删除
111 leaveMapper.deleteById(id); 122 leaveMapper.deleteById(id);
112 - // TODO @jason:需要调用 runtimeService 的 delete 方法,删除???  
113 } 123 }
114 124
115 private void validateLeaveExists(Long id) { 125 private void validateLeaveExists(Long id) {
116 if (leaveMapper.selectById(id) == null) { 126 if (leaveMapper.selectById(id) == null) {
117 - throw exception(LEAVE_NOT_EXISTS); 127 + throw exception(OA_LEAVE_NOT_EXISTS);
118 } 128 }
119 } 129 }
120 130
121 @Override 131 @Override
122 - public OaLeaveDO getLeave(Long id) { 132 + public OALeaveDO getLeave(Long id) {
123 return leaveMapper.selectById(id); 133 return leaveMapper.selectById(id);
124 } 134 }
125 135
126 @Override 136 @Override
127 - public List<OaLeaveDO> getLeaveList(Collection<Long> ids) { 137 + public List<OALeaveDO> getLeaveList(Collection<Long> ids) {
128 return leaveMapper.selectBatchIds(ids); 138 return leaveMapper.selectBatchIds(ids);
129 } 139 }
130 140
131 @Override 141 @Override
132 - public PageResult<OaLeaveDO> getLeavePage(OaLeavePageReqVO pageReqVO) { 142 + public PageResult<OALeaveDO> getLeavePage(OALeavePageReqVO pageReqVO) {
133 return leaveMapper.selectPage(pageReqVO); 143 return leaveMapper.selectPage(pageReqVO);
134 } 144 }
135 145
136 @Override 146 @Override
137 - public List<OaLeaveDO> getLeaveList(OaLeaveExportReqVO exportReqVO) { 147 + public List<OALeaveDO> getLeaveList(OALeaveExportReqVO exportReqVO) {
138 return leaveMapper.selectList(exportReqVO); 148 return leaveMapper.selectList(exportReqVO);
139 } 149 }
140 150
  151 +
  152 + /**
  153 + * 获取本人请假申请流程中审批人员
  154 + * @return 包括,本人部门的项目经理, 部门经理, hr
  155 + */
  156 + @Override
  157 + public OALeaveApplyMembersVO getLeaveApplyMembers() {
  158 + final Long id = SecurityFrameworkUtils.getLoginUser().getId();
  159 + //项目经理
  160 + //TODO jason 定义enum
  161 + SysPostDO pmPostDO = sysPostMapper.selectByCode("pm");
  162 + if (Objects.isNull(pmPostDO)) {
  163 + throw ServiceExceptionUtil.exception(OA_PM_POST_NOT_EXISTS);
  164 + }
  165 + SysUserDO userDO = sysUserMapper.selectById(id);
  166 + final List<SysUserDO> pmUsers = sysUserMapper.selectListByDepartIdAndPostId(userDO.getDeptId(), pmPostDO.getId());
  167 + if (CollUtil.isEmpty(pmUsers)) {
  168 + throw ServiceExceptionUtil.exception(OA_DEPART_PM_POST_NOT_EXISTS);
  169 + }
  170 +
  171 + //部门经理
  172 + SysPostDO bmPostDO = sysPostMapper.selectByCode("bm");
  173 + if (Objects.isNull(bmPostDO)) {
  174 + throw ServiceExceptionUtil.exception(OA_BM_POST_NOT_EXISTS);
  175 + }
  176 +
  177 + final List<SysUserDO> bmUsers = sysUserMapper.selectListByDepartIdAndPostId(userDO.getDeptId(), bmPostDO.getId());
  178 + if (CollUtil.isEmpty(bmUsers)) {
  179 + throw ServiceExceptionUtil.exception(OA_DEPART_BM_POST_NOT_EXISTS);
  180 + }
  181 + //人事
  182 + SysPostDO hrPostDO = sysPostMapper.selectByCode("hr");
  183 + if (Objects.isNull(hrPostDO)) {
  184 + throw ServiceExceptionUtil.exception(OA_HR_POST_NOT_EXISTS);
  185 + }
  186 + final List<SysUserDO> hrUsers = sysUserMapper.selectListByDepartIdAndPostId(userDO.getDeptId(), hrPostDO.getId());
  187 + if (CollUtil.isEmpty(hrUsers)) {
  188 + throw ServiceExceptionUtil.exception(OA_DEPART_BM_POST_NOT_EXISTS);
  189 + }
  190 + return OALeaveApplyMembersVO.builder().pm(pmUsers.get(0).getUsername())
  191 + .bm(bmUsers.get(0).getUsername())
  192 + .hr(hrUsers.get(0).getUsername()).build();
  193 + }
  194 +
141 } 195 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.task;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
  4 +
  5 +import javax.validation.Valid;
  6 +
  7 +/**
  8 + * 流程实例 Service 接口
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +public interface BpmProcessInstanceService {
  13 +
  14 + /**
  15 + * 创建流程实例
  16 + *
  17 + * @param userId 用户编号
  18 + * @param createReqVO 创建信息
  19 + * @return 实例的编号
  20 + */
  21 + String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO);
  22 +
  23 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.task;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * 工作流用户任务服务接口
  10 + */
  11 +public interface BpmTaskService {
  12 +
  13 +
  14 + /**
  15 + * 获取当前用户的待办任务, 分页
  16 + */
  17 + PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO);
  18 +
  19 + /**
  20 + * 签收任务
  21 + * @param taskId 用户任务id
  22 + */
  23 + void claimTask(String taskId);
  24 +
  25 + /**
  26 + * 工作流,完成 userTask, 完成用户任务 一般传入参数 1。是否同意(variables). 2. 评论(comment)
  27 + * variables 变量名 和 评论 由前台传入
  28 + * @param taskReq 任务参数
  29 + */
  30 + void completeTask(TaskReqVO taskReq);
  31 +
  32 + /**
  33 + * 根据任务id, 查询已经完成的用户任务,未完成的用户任务
  34 + * @param taskQuery 查询参数 一般 taskId
  35 + */
  36 + TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery);
  37 +
  38 + /**
  39 + * 根据流程实例id, 查询历史用户任务,包括已完成,未完成
  40 + * @param processInstanceId 流程实例id
  41 + */
  42 + List<TaskStepVO> getHistorySteps(String processInstanceId);
  43 +
  44 + /**
  45 + * 获取用户任务的 formKey, 对应外置表单, 需要根据formKey 对应业务表单
  46 + * @param taskQuery 查询参数 ,一般taskId
  47 + */
  48 + TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery);
  49 +
  50 +
  51 + /**
  52 + * 返回高亮的流转进程
  53 + * @param processInstanceId 实例Id
  54 + * @return {@link FileResp} 返回文件
  55 + */
  56 + FileResp getHighlightImg(String processInstanceId);
  57 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
  7 +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  8 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  9 +import lombok.extern.slf4j.Slf4j;
  10 +import org.activiti.engine.HistoryService;
  11 +import org.activiti.engine.RepositoryService;
  12 +import org.activiti.engine.RuntimeService;
  13 +import org.activiti.engine.TaskService;
  14 +import org.activiti.engine.history.HistoricProcessInstanceQuery;
  15 +import org.activiti.engine.impl.identity.Authentication;
  16 +import org.activiti.engine.repository.ProcessDefinition;
  17 +import org.activiti.engine.runtime.ProcessInstance;
  18 +import org.activiti.engine.task.Task;
  19 +import org.springframework.stereotype.Service;
  20 +import org.springframework.validation.annotation.Validated;
  21 +
  22 +import javax.annotation.Resource;
  23 +import java.util.Map;
  24 +
  25 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED;
  26 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS;
  27 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  28 +
  29 +/**
  30 + * 流程实例 Service 实现类
  31 + *
  32 + * ProcessDefinition & ProcessInstance & Execution & Task 的关系:
  33 + * 1. https://blog.csdn.net/bobozai86/article/details/105210414
  34 + *
  35 + * HistoricProcessInstance & ProcessInstance 的关系:
  36 + * 1.https://my.oschina.net/843294669/blog/719024
  37 + * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例
  38 + *
  39 + * @author 芋道源码
  40 + */
  41 +@Service
  42 +@Validated
  43 +@Slf4j
  44 +public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService {
  45 +
  46 + @Resource
  47 + private RepositoryService repositoryService;
  48 + @Resource
  49 + private RuntimeService runtimeService;
  50 + @Resource
  51 + private TaskService taskService;
  52 + @Resource
  53 + private HistoryService historyService;
  54 +
  55 + @Resource
  56 + private SysUserService userService;
  57 + @Resource
  58 + private BpmProcessDefinitionService processDefinitionService;
  59 +
  60 + @Override
  61 + public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqVO createReqVO) {
  62 + // 校验流程定义
  63 + ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId());
  64 + if (definition == null) {
  65 + throw exception(PROCESS_DEFINITION_NOT_EXISTS);
  66 + }
  67 + if (definition.isSuspended()) {
  68 + throw exception(PROCESS_DEFINITION_IS_SUSPENDED);
  69 + }
  70 +
  71 + // 设置流程发起人
  72 + Authentication.setAuthenticatedUserId(String.valueOf(userId));
  73 +
  74 + // 创建流程实例
  75 + Map<String, Object> variables = createReqVO.getVariables();
  76 + variables.put("INITIATOR", userId); // TODO 芋艿:初始化人员
  77 + ProcessInstance instance = runtimeService.startProcessInstanceById(createReqVO.getProcessDefinitionId(), variables);
  78 +
  79 + // 添加初始的评论 TODO 芋艿:在思考下
  80 + Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
  81 + if (task != null) {
  82 + SysUserDO user = userService.getUser(userId);
  83 + Assert.notNull(user, "用户({})不存在", userId);
  84 + String type = "normal";
  85 + taskService.addComment(task.getId(), instance.getProcessInstanceId(), type,
  86 + String.format("%s 发起流程申请", user.getNickname()));
  87 + // TODO 芋艿:应该不用下面两个步骤
  88 +// taskService.setAssignee(task.getId(), String.valueOf(userId));
  89 +// taskService.complete(task.getId(), variables);
  90 + }
  91 + return instance.getId();
  92 + }
  93 +
  94 + public void getMyProcessInstancePage(Long userId) {
  95 + HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()
  96 + .startedBy(String.valueOf(userId)) // 发起人是自己
  97 + .orderByProcessInstanceStartTime().desc(); // 按照发起时间倒序
  98 + }
  99 +
  100 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.io.IoUtil;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow.TaskConvert;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  9 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  10 +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
  11 +import lombok.extern.slf4j.Slf4j;
  12 +import org.activiti.api.runtime.shared.query.Page;
  13 +import org.activiti.api.runtime.shared.query.Pageable;
  14 +import org.activiti.api.task.model.Task;
  15 +import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder;
  16 +import org.activiti.api.task.model.builders.TaskPayloadBuilder;
  17 +import org.activiti.api.task.runtime.TaskRuntime;
  18 +import org.activiti.bpmn.constants.BpmnXMLConstants;
  19 +import org.activiti.bpmn.model.BpmnModel;
  20 +import org.activiti.bpmn.model.FlowNode;
  21 +import org.activiti.bpmn.model.SequenceFlow;
  22 +import org.activiti.engine.HistoryService;
  23 +import org.activiti.engine.RepositoryService;
  24 +import org.activiti.engine.RuntimeService;
  25 +import org.activiti.engine.history.HistoricActivityInstance;
  26 +import org.activiti.engine.history.HistoricProcessInstance;
  27 +import org.activiti.engine.repository.ProcessDefinition;
  28 +import org.activiti.engine.runtime.ProcessInstance;
  29 +import org.activiti.engine.task.Comment;
  30 +import org.activiti.image.ProcessDiagramGenerator;
  31 +import org.springframework.stereotype.Service;
  32 +import org.springframework.transaction.annotation.Transactional;
  33 +import org.springframework.util.ObjectUtils;
  34 +
  35 +import javax.annotation.Resource;
  36 +import java.io.IOException;
  37 +import java.io.InputStream;
  38 +import java.util.ArrayList;
  39 +import java.util.List;
  40 +import java.util.Map;
  41 +import java.util.Optional;
  42 +import java.util.stream.Collectors;
  43 +
  44 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.HIGHLIGHT_IMG_ERROR;
  45 +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS;
  46 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  47 +
  48 +@Slf4j
  49 +@Service
  50 +public class BpmTaskServiceImpl implements BpmTaskService {
  51 +
  52 + @Resource
  53 + private TaskRuntime taskRuntime;
  54 +
  55 + @Resource
  56 + private org.activiti.engine.TaskService activitiTaskService;
  57 +
  58 + @Resource
  59 + private HistoryService historyService;
  60 +
  61 + @Resource
  62 + private RepositoryService repositoryService;
  63 +
  64 + @Resource
  65 + private RuntimeService runtimeService;
  66 +
  67 + @Resource
  68 + private ProcessDiagramGenerator processDiagramGenerator;
  69 +
  70 + @Override
  71 + public PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO) {
  72 + // TODO @jason:封装一个方法,用于转换成 activiti 的分页对象
  73 + final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize());
  74 + Page<Task> pageTasks = taskRuntime.tasks(pageable);
  75 + int totalItems = pageTasks.getTotalItems();
  76 + List<Task> tasks = pageTasks.getContent();
  77 + final List<TodoTaskRespVO> respVOList = tasks.stream().map(task -> {
  78 + ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());
  79 + return TaskConvert.INSTANCE.convert(task, definition);
  80 + }).collect(Collectors.toList());
  81 + return new PageResult<>(respVOList, (long)totalItems);
  82 + }
  83 +
  84 +
  85 + @Override
  86 + public void claimTask(String taskId) {
  87 + taskRuntime.claim(new ClaimTaskPayloadBuilder()
  88 + .withTaskId(taskId)
  89 + .withAssignee(SecurityFrameworkUtils.getLoginUser().getUsername())
  90 + .build());
  91 + }
  92 +
  93 +
  94 +
  95 + @Override
  96 + @Transactional
  97 + public void completeTask(TaskReqVO taskReq) {
  98 + final Task task = taskRuntime.task(taskReq.getTaskId());
  99 +
  100 + activitiTaskService.addComment(taskReq.getTaskId(), task.getProcessInstanceId(), taskReq.getComment());
  101 +
  102 + taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskReq.getTaskId())
  103 + .withVariables(taskReq.getVariables())
  104 + .build());
  105 + }
  106 +
  107 +
  108 +
  109 + @Override
  110 + public TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery) {
  111 + TaskHandleVO handleVO = new TaskHandleVO();
  112 + final Task task = taskRuntime.task(taskQuery.getTaskId());
  113 + List<TaskStepVO> steps = getTaskSteps(task.getProcessInstanceId());
  114 + handleVO.setHistoryTask(steps);
  115 + return handleVO;
  116 + }
  117 +
  118 +
  119 + private List<TaskStepVO> getTaskSteps(String processInstanceId) {
  120 + // 获得已完成的活动
  121 + List<HistoricActivityInstance> finished = historyService.createHistoricActivityInstanceQuery()
  122 + .processInstanceId(processInstanceId)
  123 + .activityType("userTask")
  124 + .finished()
  125 + .orderByHistoricActivityInstanceStartTime().asc().list();
  126 + // 获得对应的步骤
  127 + List<TaskStepVO> steps = new ArrayList<>();
  128 + finished.forEach(instance -> {
  129 + TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance);
  130 + stepVO.setStatus(1); // TODO @jason:1 这个 magic number 要枚举起来。
  131 + // TODO @jason:可以考虑把 comments 读取后,在统一调用 convert 拼接。另外 Comment 是废弃的类,有没其它可以使用的哈?
  132 + List<Comment> comments = activitiTaskService.getTaskComments(instance.getTaskId());
  133 + if (!CollUtil.isEmpty(comments)) {
  134 + stepVO.setComment(Optional.ofNullable(comments.get(0)).map(Comment::getFullMessage).orElse(""));
  135 + }
  136 + steps.add(stepVO);
  137 + });
  138 +
  139 + // 获得未完成的活动
  140 + List<HistoricActivityInstance> unfinished = historyService
  141 + .createHistoricActivityInstanceQuery()
  142 + .processInstanceId(processInstanceId)
  143 + .activityType("userTask")
  144 + .unfinished().list();
  145 + // 获得对应的步骤
  146 + for (HistoricActivityInstance instance : unfinished) {
  147 + TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance);
  148 + stepVO.setComment("");
  149 + stepVO.setStatus(0);
  150 + steps.add(stepVO);
  151 + }
  152 + return steps;
  153 + }
  154 +
  155 +
  156 + @Override
  157 + public List<TaskStepVO> getHistorySteps(String processInstanceId) {
  158 + return getTaskSteps(processInstanceId);
  159 + }
  160 +
  161 + @Override
  162 + public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) {
  163 + final Task task = taskRuntime.task(taskQuery.getTaskId());
  164 + return TaskConvert.INSTANCE.convert(task);
  165 + }
  166 +
  167 + @Override
  168 + public FileResp getHighlightImg(String processInstanceId) {
  169 + // 查询历史
  170 + //TODO 云扬四海 貌似流程结束后,点击审批进度会报错
  171 + // TODO @Li:一些 historyService 的查询,貌似比较通用,是不是抽一些小方法出来
  172 + HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
  173 + // 如果不存在实例。 说明数据异常
  174 + if (hpi == null) {
  175 + throw exception(PROCESS_INSTANCE_NOT_EXISTS);
  176 + }
  177 + // 如果有结束时间 返回model的流程图
  178 + if (!ObjectUtils.isEmpty(hpi.getEndTime())) {
  179 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(hpi.getProcessDefinitionId()).singleResult();
  180 + String resourceName = Optional.ofNullable(pd.getDiagramResourceName()).orElse(pd.getResourceName());
  181 + BpmnModel bpmnModel = repositoryService.getBpmnModel(pd.getId());
  182 + InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, new ArrayList<>(1), new ArrayList<>(1),
  183 + "宋体", "宋体", "宋体");
  184 + FileResp fileResp = new FileResp();
  185 + fileResp.setFileName( resourceName + ".svg");
  186 + fileResp.setFileByte(IoUtil.readBytes(inputStream));
  187 + return fileResp;
  188 + }
  189 + // 没有结束时间。说明流程在执行过程中
  190 + // TODO @Li:一些 runtimeService 的查询,貌似比较通用,是不是抽一些小方法出来
  191 + ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
  192 +
  193 + List<String> highLightedActivities = new ArrayList<>();
  194 + // 获取所有活动节点
  195 + List<HistoricActivityInstance> finishedInstances = historyService.createHistoricActivityInstanceQuery()
  196 + .processInstanceId(processInstanceId).finished().list();
  197 + finishedInstances.stream().map(HistoricActivityInstance::getActivityId)
  198 + .forEach(highLightedActivities::add);
  199 + // 已完成的节点+当前节点
  200 + highLightedActivities.addAll(runtimeService.getActiveActivityIds(processInstanceId));
  201 +
  202 + BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
  203 + // 经过的流
  204 + List<String> highLightedFlowIds = getHighLightedFlows(bpmnModel, processInstanceId);
  205 +
  206 + //设置"宋体"
  207 + try (InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, highLightedActivities, highLightedFlowIds,
  208 + "宋体", "宋体", "宋体")){
  209 + FileResp fileResp = new FileResp();
  210 + fileResp.setFileName( hpi.getProcessDefinitionName() + ".svg");
  211 + fileResp.setFileByte(IoUtil.readBytes(inputStream));
  212 + return fileResp;
  213 + } catch (IOException e) {
  214 + log.error("[getHighlightImg][流程({}) 生成图表失败]", processInstanceId, e);
  215 + throw exception(HIGHLIGHT_IMG_ERROR);
  216 + }
  217 + }
  218 +
  219 + // TODO @Li:这个方法的可读性还有一定的优化空间,可以思考下哈。
  220 + /**
  221 + * 获取指定 processInstanceId 已经高亮的Flows
  222 + * 获取已经流转的线 参考: https://blog.csdn.net/qiuxinfa123/article/details/119579863
  223 + * @param bpmnModel model
  224 + * @param processInstanceId 流程实例Id
  225 + * @return 获取已经流转的列表
  226 + */
  227 + private List<String> getHighLightedFlows(BpmnModel bpmnModel, String processInstanceId) {
  228 + // 获取所有的线条
  229 + List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId)
  230 + .orderByHistoricActivityInstanceId().asc().list();
  231 + // 高亮流程已发生流转的线id集合
  232 + List<String> highLightedFlowIds = new ArrayList<>();
  233 + // 全部活动节点
  234 + List<FlowNode> historicActivityNodes = new ArrayList<>();
  235 + // 已完成的历史活动节点
  236 + List<HistoricActivityInstance> finishedActivityInstances = new ArrayList<>();
  237 +
  238 + for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
  239 + FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true);
  240 + historicActivityNodes.add(flowNode);
  241 + // 结束时间不为空,则是已完成节点
  242 + if (historicActivityInstance.getEndTime() != null) {
  243 + finishedActivityInstances.add(historicActivityInstance);
  244 + }
  245 + }
  246 + // 提取活动id 是唯一的。塞入Map
  247 + Map<String, HistoricActivityInstance> historicActivityInstanceMap = CollectionUtils.convertMap(historicActivityInstances, HistoricActivityInstance::getActivityId);
  248 + // 遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的
  249 + for (HistoricActivityInstance currentActivityInstance : finishedActivityInstances) {
  250 + // 获得当前活动对应的节点信息及outgoingFlows信息
  251 + FlowNode currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);
  252 + List<SequenceFlow> sequenceFlows = currentFlowNode.getOutgoingFlows();
  253 +
  254 + // 遍历outgoingFlows并找到已流转的 满足如下条件认为已已流转:
  255 + // 1.当前节点是并行网关或兼容网关,则通过outgoingFlows能够在历史活动中找到的全部节点均为已流转
  256 + // 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最早的流转节点视为有效流转
  257 + if (BpmnXMLConstants.ELEMENT_GATEWAY_PARALLEL.equals(currentActivityInstance.getActivityType())
  258 + || BpmnXMLConstants.ELEMENT_GATEWAY_INCLUSIVE.equals(currentActivityInstance.getActivityType())) {
  259 + // 遍历历史活动节点,找到匹配流程目标节点的
  260 + for (SequenceFlow sequenceFlow : sequenceFlows) {
  261 + FlowNode targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true);
  262 + if (historicActivityNodes.contains(targetFlowNode)) {
  263 + highLightedFlowIds.add(targetFlowNode.getId());
  264 + }
  265 + }
  266 + } else {
  267 + long earliestStamp = 0L;
  268 + String highLightedFlowId = null;
  269 + // 循环流出的流
  270 + for (SequenceFlow sequenceFlow : sequenceFlows) {
  271 + HistoricActivityInstance historicActivityInstance = historicActivityInstanceMap.get(sequenceFlow.getTargetRef());
  272 + if (historicActivityInstance == null) {
  273 + continue;
  274 + }
  275 + final long startTime = historicActivityInstance.getStartTime().getTime();
  276 + // 遍历匹配的集合,取得开始时间最早的一个
  277 + if (earliestStamp == 0 || earliestStamp >= startTime) {
  278 + highLightedFlowId = sequenceFlow.getId();
  279 + earliestStamp = startTime;
  280 + }
  281 + }
  282 + highLightedFlowIds.add(highLightedFlowId);
  283 + }
  284 +
  285 + }
  286 + return highLightedFlowIds;
  287 + }
  288 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java
1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user; 1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user;
2 2
  3 +import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO;
3 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; 6 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  7 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 9 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 10 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
7 -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO;  
8 -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO;  
9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 11 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 import org.apache.ibatis.annotations.Mapper; 12 import org.apache.ibatis.annotations.Mapper;
11 13
12 import java.util.Collection; 14 import java.util.Collection;
13 import java.util.List; 15 import java.util.List;
  16 +import java.util.Optional;
14 17
15 @Mapper 18 @Mapper
16 public interface SysUserMapper extends BaseMapperX<SysUserDO> { 19 public interface SysUserMapper extends BaseMapperX<SysUserDO> {
@@ -52,5 +55,14 @@ public interface SysUserMapper extends BaseMapperX&lt;SysUserDO&gt; { @@ -52,5 +55,14 @@ public interface SysUserMapper extends BaseMapperX&lt;SysUserDO&gt; {
52 return selectList(new QueryWrapperX<SysUserDO>().like("username", username)); 55 return selectList(new QueryWrapperX<SysUserDO>().like("username", username));
53 } 56 }
54 57
  58 +
  59 + default List<SysUserDO> selectListByDepartIdAndPostId(Long departId, Long postId) {
  60 + return selectList(new QueryWrapperX<SysUserDO>()
  61 + .eq("status", CommonStatusEnum.ENABLE.getStatus())
  62 + .eq("dept_id", departId)
  63 + // TODO @jason: 封装一个 StringUtils .toString 。如果空的时候,设置为 null。会更简洁
  64 + .likeIfPresent("post_ids", Optional.ofNullable(postId).map(t -> String.valueOf(postId)).orElse("")));
  65 + }
  66 +
55 } 67 }
56 68
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java
@@ -108,6 +108,14 @@ public interface SysUserService { @@ -108,6 +108,14 @@ public interface SysUserService {
108 PageResult<SysUserDO> getUserPage(SysUserPageReqVO reqVO); 108 PageResult<SysUserDO> getUserPage(SysUserPageReqVO reqVO);
109 109
110 /** 110 /**
  111 + * 获得用户
  112 + *
  113 + * @param id 用户编号
  114 + * @return 用户
  115 + */
  116 + SysUserDO getUser(Long id);
  117 +
  118 + /**
111 * 获得用户列表 119 * 获得用户列表
112 * 120 *
113 * @param reqVO 列表请求 121 * @param reqVO 列表请求
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java
@@ -165,6 +165,11 @@ public class SysUserServiceImpl implements SysUserService { @@ -165,6 +165,11 @@ public class SysUserServiceImpl implements SysUserService {
165 } 165 }
166 166
167 @Override 167 @Override
  168 + public SysUserDO getUser(Long id) {
  169 + return userMapper.selectById(id);
  170 + }
  171 +
  172 + @Override
168 public List<SysUserDO> getUsers(SysUserExportReqVO reqVO) { 173 public List<SysUserDO> getUsers(SysUserExportReqVO reqVO) {
169 return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); 174 return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId()));
170 } 175 }