Sfoglia il codice sorgente

Update 代码优化0709

Yue 10 mesi fa
parent
commit
9152873db0
100 ha cambiato i file con 2167 aggiunte e 1616 eliminazioni
  1. 87 73
      SERVER/VberAdminPlusV3/.script/leave/leave1.json
  2. 130 109
      SERVER/VberAdminPlusV3/.script/leave/leave2.json
  3. 143 119
      SERVER/VberAdminPlusV3/.script/leave/leave3.json
  4. 105 88
      SERVER/VberAdminPlusV3/.script/leave/leave4.json
  5. 143 119
      SERVER/VberAdminPlusV3/.script/leave/leave5.json
  6. 256 213
      SERVER/VberAdminPlusV3/.script/leave/leave6.json
  7. 2 1
      SERVER/VberAdminPlusV3/.script/run/DF_VberServer.run.xml
  8. 9 8
      SERVER/VberAdminPlusV3/.script/run/VberServerApp.run.xml
  9. 350 193
      SERVER/VberAdminPlusV3/.script/sql/admin.sql
  10. 217 118
      SERVER/VberAdminPlusV3/.script/sql/flow.sql
  11. 25 16
      SERVER/VberAdminPlusV3/.script/sql/job.sql
  12. 10 5
      SERVER/VberAdminPlusV3/.script/sql/sharding-test.sql
  13. 9 10
      SERVER/VberAdminPlusV3/pom.xml
  14. 9 9
      SERVER/VberAdminPlusV3/vber-admin/src/main/java/com/vber/web/listener/UserActionListener.java
  15. 11 13
      SERVER/VberAdminPlusV3/vber-admin/src/main/java/com/vber/web/service/SysLoginService.java
  16. 4 9
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml
  17. 1 0
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages.properties
  18. 3 2
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages_en_US.properties
  19. 1 0
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages_zh_CN.properties
  20. 4 8
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/config/VbConfig.java
  21. 13 13
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/TaskAssigneeDTO.java
  22. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/UserDTO.java
  23. 7 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/event/ProcessTaskEvent.java
  24. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/model/LoginUser.java
  25. 1 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/model/PasswordLoginBody.java
  26. 5 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/model/RegisterBody.java
  27. 2 4
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/enums/BusinessStatusEnum.java
  28. 0 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/enums/FormatsType.java
  29. 1 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/DictService.java
  30. 9 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/OrgService.java
  31. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/PermissionService.java
  32. 11 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/PostService.java
  33. 10 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/RoleService.java
  34. 0 22
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/UserService.java
  35. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/NetUtils.java
  36. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/ObjectUtils.java
  37. 1 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/StringUtils.java
  38. 5 3
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/ip/AddressUtils.java
  39. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/ip/RegionUtils.java
  40. 4 4
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/sql/SqlUtil.java
  41. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/validate/dicts/DictPatternValidator.java
  42. 4 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/sensitive/annotation/Sensitive.java
  43. 9 8
      SERVER/VberAdminPlusV3/vber-common/vber-common-doc/src/main/java/com/vber/common/doc/config/SpringDocConfig.java
  44. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/config/ApiDecryptAutoConfiguration.java
  45. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/core/EncryptContext.java
  46. 0 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/core/EncryptorManager.java
  47. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/enumd/AlgorithmType.java
  48. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/filter/DecryptRequestBodyWrapper.java
  49. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/properties/EncryptorProperties.java
  50. 2 5
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/annotation/ExcelNotation.java
  51. 2 5
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/annotation/ExcelRequired.java
  52. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/convert/ExcelDictConvert.java
  53. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/convert/ExcelEnumConvert.java
  54. 5 5
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/core/CellMergeStrategy.java
  55. 4 4
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/core/DefaultExcelListener.java
  56. 9 9
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/core/DropDownOptions.java
  57. 26 27
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/core/ExcelDownHandler.java
  58. 50 62
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/handler/DataWriteHandler.java
  59. 5 5
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/utils/ExcelUtil.java
  60. 0 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-mail/src/main/java/com/vber/common/mail/config/properties/MailProperties.java
  61. 4 4
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/annotation/DataColumn.java
  62. 12 19
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/core/page/PageQuery.java
  63. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/InjectionMetaObjectHandler.java
  64. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/MybatisExceptionHandler.java
  65. 8 8
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/PlusDataPermissionHandler.java
  66. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/PlusPostInitTableInfoHandler.java
  67. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/helper/DataPermissionHelper.java
  68. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-oss/pom.xml
  69. 16 25
      SERVER/VberAdminPlusV3/vber-common/vber-common-oss/src/main/java/com/vber/common/oss/core/OssClient.java
  70. 14 15
      SERVER/VberAdminPlusV3/vber-common/vber-common-oss/src/main/java/com/vber/common/oss/file/VbFile.java
  71. 21 25
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/manager/PlusSpringCacheManager.java
  72. 2 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/QueueUtils.java
  73. 10 9
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/RedisUtils.java
  74. 215 45
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/SequenceUtils.java
  75. 17 13
      SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/src/main/java/com/vber/common/satoken/core/dao/PlusSaTokenDao.java
  76. 0 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/src/main/java/com/vber/common/satoken/core/service/SaPermissionImpl.java
  77. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/src/main/java/com/vber/common/satoken/utils/LoginHelper.java
  78. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-security/src/main/java/com/vber/common/security/handler/AllUrlHandler.java
  79. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-sms/pom.xml
  80. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/config/SocialAutoConfiguration.java
  81. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/gitea/AuthGiteaRequest.java
  82. 4 4
      SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/maxkey/AuthMaxKeyRequest.java
  83. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/utils/AuthRedisStateCache.java
  84. 4 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/utils/SocialUtils.java
  85. 27 28
      SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java
  86. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-sse/pom.xml
  87. 3 28
      SERVER/VberAdminPlusV3/vber-common/vber-common-sse/src/main/java/com/vber/common/sse/controller/SseController.java
  88. 3 3
      SERVER/VberAdminPlusV3/vber-common/vber-common-sse/src/main/java/com/vber/common/sse/core/SseEmitterManager.java
  89. 13 14
      SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/config/TenantConfig.java
  90. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/core/TenantEntity.java
  91. 1 3
      SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/helper/TenantHelper.java
  92. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/handler/TranslationHandler.java
  93. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/impl/DictTypeTranslationImpl.java
  94. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/impl/OssUrlTranslationImpl.java
  95. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/impl/UserNameTranslationImpl.java
  96. 16 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/config/ResourcesConfig.java
  97. 5 5
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/handler/GlobalExceptionHandler.java
  98. 2 2
      SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/pom.xml
  99. 25 25
      SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/src/main/java/com/vber/job/admin/controller/JobInfoController.java
  100. 2 3
      SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/src/main/java/com/vber/job/admin/controller/JobLogController.java

+ 87 - 73
SERVER/VberAdminPlusV3/.script/leave/leave1.json

@@ -1,75 +1,89 @@
 {
-  "flowCode" : "leave1",
-  "flowName" : "请假申请-普通",
-  "category" : "100",
-  "version" : "1",
-  "formCustom" : "N",
-  "formPath" : "/workflow/leaveEdit/index",
-  "nodeList" : [ {
-    "nodeType" : 0,
-    "nodeCode" : "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
-    "nodeName" : "开始",
-    "nodeRatio" : 0.000,
-    "coordinate" : "200,200|200,200",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
-      "nextNodeCode" : "dd515cdd-59f6-446f-94ca-25ca062afb42",
-      "skipType" : "PASS",
-      "coordinate" : "220,200;310,200"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "dd515cdd-59f6-446f-94ca-25ca062afb42",
-    "nodeName" : "申请人",
-    "nodeRatio" : 0.000,
-    "coordinate" : "360,200|360,200",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "dd515cdd-59f6-446f-94ca-25ca062afb42",
-      "nextNodeCode" : "78fa8e5b-e809-44ed-978a-41092409ebcf",
-      "skipType" : "PASS",
-      "coordinate" : "410,200;490,200"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "78fa8e5b-e809-44ed-978a-41092409ebcf",
-    "nodeName" : "组长",
-    "permissionFlag" : "role:1",
-    "nodeRatio" : 0.000,
-    "coordinate" : "540,200|540,200",
-    "formCustom" : "N",
-    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
-    "skipList" : [ {
-      "nowNodeCode" : "78fa8e5b-e809-44ed-978a-41092409ebcf",
-      "nextNodeCode" : "a8abf15f-b83e-428a-86cc-033555ea9bbe",
-      "skipType" : "PASS",
-      "coordinate" : "590,200;670,200"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "a8abf15f-b83e-428a-86cc-033555ea9bbe",
-    "nodeName" : "部门主管",
-    "permissionFlag" : "role:3@@role:4",
-    "nodeRatio" : 0.000,
-    "coordinate" : "720,200|720,200",
-    "formCustom" : "N",
-    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
-    "skipList" : [ {
-      "nowNodeCode" : "a8abf15f-b83e-428a-86cc-033555ea9bbe",
-      "nextNodeCode" : "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
-      "skipType" : "PASS",
-      "coordinate" : "770,200;880,200"
-    } ]
-  }, {
-    "nodeType" : 2,
-    "nodeCode" : "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
-    "nodeName" : "结束",
-    "nodeRatio" : 0.000,
-    "coordinate" : "900,200|900,200",
-    "formCustom" : "N",
-    "ext" : "[]"
-  } ]
+  "flowCode": "leave1",
+  "flowName": "请假申请-普通",
+  "category": "100",
+  "version": "1",
+  "formCustom": "N",
+  "formPath": "/workflow/leaveEdit/index",
+  "nodeList": [
+    {
+      "nodeType": 0,
+      "nodeCode": "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
+      "nodeName": "开始",
+      "nodeRatio": 0.000,
+      "coordinate": "200,200|200,200",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
+          "nextNodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
+          "skipType": "PASS",
+          "coordinate": "220,200;310,200"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
+      "nodeName": "申请人",
+      "nodeRatio": 0.000,
+      "coordinate": "360,200|360,200",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
+          "nextNodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
+          "skipType": "PASS",
+          "coordinate": "410,200;490,200"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
+      "nodeName": "组长",
+      "permissionFlag": "role:1",
+      "nodeRatio": 0.000,
+      "coordinate": "540,200|540,200",
+      "formCustom": "N",
+      "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+      "skipList": [
+        {
+          "nowNodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
+          "nextNodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
+          "skipType": "PASS",
+          "coordinate": "590,200;670,200"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
+      "nodeName": "组织机构主管",
+      "permissionFlag": "role:3@@role:4",
+      "nodeRatio": 0.000,
+      "coordinate": "720,200|720,200",
+      "formCustom": "N",
+      "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+      "skipList": [
+        {
+          "nowNodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
+          "nextNodeCode": "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
+          "skipType": "PASS",
+          "coordinate": "770,200;880,200"
+        }
+      ]
+    },
+    {
+      "nodeType": 2,
+      "nodeCode": "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
+      "nodeName": "结束",
+      "nodeRatio": 0.000,
+      "coordinate": "900,200|900,200",
+      "formCustom": "N",
+      "ext": "[]"
+    }
+  ]
 }

+ 130 - 109
SERVER/VberAdminPlusV3/.script/leave/leave2.json

@@ -1,111 +1,132 @@
 {
-  "flowCode" : "leave2",
-  "flowName" : "请假申请-排他网关",
-  "category" : "100",
-  "version" : "1",
-  "formCustom" : "N",
-  "formPath" : "/workflow/leaveEdit/index",
-  "nodeList" : [ {
-    "nodeType" : 0,
-    "nodeCode" : "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
-    "nodeName" : "开始",
-    "nodeRatio" : 0.000,
-    "coordinate" : "300,240|300,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
-      "nextNodeCode" : "fdcae93b-b69c-498a-b231-09255e74bcbd",
-      "skipType" : "PASS",
-      "coordinate" : "320,240;390,240"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "fdcae93b-b69c-498a-b231-09255e74bcbd",
-    "nodeName" : "申请人",
-    "nodeRatio" : 0.000,
-    "coordinate" : "440,240|440,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "fdcae93b-b69c-498a-b231-09255e74bcbd",
-      "nextNodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
-      "skipType" : "PASS",
-      "coordinate" : "490,240;535,240"
-    } ]
-  }, {
-    "nodeType" : 3,
-    "nodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
-    "nodeRatio" : 0.000,
-    "coordinate" : "560,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
-      "nextNodeCode" : "b3528155-dcb7-4445-bbdf-3d00e3499e86",
-      "skipType" : "PASS",
-      "skipCondition" : "le@@leaveDays|2",
-      "coordinate" : "560,265;560,320;670,320"
-    }, {
-      "nowNodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
-      "nextNodeCode" : "5ed2362b-fc0c-4d52-831f-95208b830605",
-      "skipName" : "大于两天",
-      "skipType" : "PASS",
-      "skipCondition" : "gt@@leaveDays|2",
-      "coordinate" : "560,215;560,160;670,160|560,187"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "b3528155-dcb7-4445-bbdf-3d00e3499e86",
-    "nodeName" : "组长",
-    "permissionFlag" : "3@@4",
-    "nodeRatio" : 0.000,
-    "coordinate" : "720,320|720,320",
-    "formCustom" : "N",
-    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
-    "skipList" : [ {
-      "nowNodeCode" : "b3528155-dcb7-4445-bbdf-3d00e3499e86",
-      "nextNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
-      "skipType" : "PASS",
-      "coordinate" : "770,320;860,320;860,280"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
-    "nodeName" : "总经理",
-    "permissionFlag" : "role:1",
-    "nodeRatio" : 0.000,
-    "coordinate" : "860,240|860,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
-      "nextNodeCode" : "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
-      "skipType" : "PASS",
-      "coordinate" : "910,240;980,240"
-    } ]
-  }, {
-    "nodeType" : 2,
-    "nodeCode" : "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
-    "nodeName" : "结束",
-    "nodeRatio" : 0.000,
-    "coordinate" : "1000,240|1000,240",
-    "formCustom" : "N",
-    "ext" : "[]"
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "5ed2362b-fc0c-4d52-831f-95208b830605",
-    "nodeName" : "部门领导",
-    "permissionFlag" : "role:1",
-    "nodeRatio" : 0.000,
-    "coordinate" : "720,160|720,160",
-    "formCustom" : "N",
-    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
-    "skipList" : [ {
-      "nowNodeCode" : "5ed2362b-fc0c-4d52-831f-95208b830605",
-      "nextNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
-      "skipType" : "PASS",
-      "coordinate" : "770,160;860,160;860,200"
-    } ]
-  } ]
+  "flowCode": "leave2",
+  "flowName": "请假申请-排他网关",
+  "category": "100",
+  "version": "1",
+  "formCustom": "N",
+  "formPath": "/workflow/leaveEdit/index",
+  "nodeList": [
+    {
+      "nodeType": 0,
+      "nodeCode": "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
+      "nodeName": "开始",
+      "nodeRatio": 0.000,
+      "coordinate": "300,240|300,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
+          "nextNodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
+          "skipType": "PASS",
+          "coordinate": "320,240;390,240"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
+      "nodeName": "申请人",
+      "nodeRatio": 0.000,
+      "coordinate": "440,240|440,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
+          "nextNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
+          "skipType": "PASS",
+          "coordinate": "490,240;535,240"
+        }
+      ]
+    },
+    {
+      "nodeType": 3,
+      "nodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
+      "nodeRatio": 0.000,
+      "coordinate": "560,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
+          "nextNodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
+          "skipType": "PASS",
+          "skipCondition": "le@@leaveDays|2",
+          "coordinate": "560,265;560,320;670,320"
+        },
+        {
+          "nowNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
+          "nextNodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
+          "skipName": "大于两天",
+          "skipType": "PASS",
+          "skipCondition": "gt@@leaveDays|2",
+          "coordinate": "560,215;560,160;670,160|560,187"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
+      "nodeName": "组长",
+      "permissionFlag": "3@@4",
+      "nodeRatio": 0.000,
+      "coordinate": "720,320|720,320",
+      "formCustom": "N",
+      "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+      "skipList": [
+        {
+          "nowNodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
+          "nextNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
+          "skipType": "PASS",
+          "coordinate": "770,320;860,320;860,280"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
+      "nodeName": "总经理",
+      "permissionFlag": "role:1",
+      "nodeRatio": 0.000,
+      "coordinate": "860,240|860,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
+          "nextNodeCode": "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
+          "skipType": "PASS",
+          "coordinate": "910,240;980,240"
+        }
+      ]
+    },
+    {
+      "nodeType": 2,
+      "nodeCode": "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
+      "nodeName": "结束",
+      "nodeRatio": 0.000,
+      "coordinate": "1000,240|1000,240",
+      "formCustom": "N",
+      "ext": "[]"
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
+      "nodeName": "组织机构领导",
+      "permissionFlag": "role:1",
+      "nodeRatio": 0.000,
+      "coordinate": "720,160|720,160",
+      "formCustom": "N",
+      "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+      "skipList": [
+        {
+          "nowNodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
+          "nextNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
+          "skipType": "PASS",
+          "coordinate": "770,160;860,160;860,200"
+        }
+      ]
+    }
+  ]
 }

+ 143 - 119
SERVER/VberAdminPlusV3/.script/leave/leave3.json

@@ -1,121 +1,145 @@
 {
-  "flowCode" : "leave3",
-  "flowName" : "请假申请-并行网关",
-  "category" : "100",
-  "version" : "1",
-  "formCustom" : "N",
-  "formPath" : "/workflow/leaveEdit/index",
-  "nodeList" : [ {
-    "nodeType" : 0,
-    "nodeCode" : "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
-    "nodeName" : "开始",
-    "nodeRatio" : 0.000,
-    "coordinate" : "380,220|380,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
-      "nextNodeCode" : "b7bbb571-06de-455c-8083-f83c07bf0b99",
-      "skipType" : "PASS",
-      "coordinate" : "400,220;470,220"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "b7bbb571-06de-455c-8083-f83c07bf0b99",
-    "nodeName" : "申请人",
-    "nodeRatio" : 0.000,
-    "coordinate" : "520,220|520,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "b7bbb571-06de-455c-8083-f83c07bf0b99",
-      "nextNodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
-      "skipType" : "PASS",
-      "coordinate" : "570,220;655,220"
-    } ]
-  }, {
-    "nodeType" : 4,
-    "nodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
-    "nodeRatio" : 0.000,
-    "coordinate" : "680,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
-      "nextNodeCode" : "4b7743cd-940c-431b-926f-e7b614fbf1fe",
-      "skipType" : "PASS",
-      "coordinate" : "680,195;680,140;750,140"
-    }, {
-      "nowNodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
-      "nextNodeCode" : "762cb975-37d8-4276-b6db-79a4c3606394",
-      "skipType" : "PASS",
-      "coordinate" : "680,245;680,300;750,300"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "4b7743cd-940c-431b-926f-e7b614fbf1fe",
-    "nodeName" : "市场部",
-    "permissionFlag" : "role:1",
-    "nodeRatio" : 0.000,
-    "coordinate" : "800,140|800,140",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "4b7743cd-940c-431b-926f-e7b614fbf1fe",
-      "nextNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
-      "skipType" : "PASS",
-      "coordinate" : "850,140;920,140;920,195"
-    } ]
-  }, {
-    "nodeType" : 4,
-    "nodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
-    "nodeRatio" : 0.000,
-    "coordinate" : "920,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
-      "nextNodeCode" : "23e7429e-2b47-4431-b93e-40db7c431ce6",
-      "skipType" : "PASS",
-      "coordinate" : "945,220;975,220;975,220;960,220;960,220;990,220"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "23e7429e-2b47-4431-b93e-40db7c431ce6",
-    "nodeName" : "CEO",
-    "permissionFlag" : "1",
-    "nodeRatio" : 0.000,
-    "coordinate" : "1040,220|1040,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "23e7429e-2b47-4431-b93e-40db7c431ce6",
-      "nextNodeCode" : "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
-      "skipType" : "PASS",
-      "coordinate" : "1090,220;1140,220"
-    } ]
-  }, {
-    "nodeType" : 2,
-    "nodeCode" : "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
-    "nodeName" : "结束",
-    "nodeRatio" : 0.000,
-    "coordinate" : "1160,220|1160,220",
-    "formCustom" : "N",
-    "ext" : "[]"
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "762cb975-37d8-4276-b6db-79a4c3606394",
-    "nodeName" : "综合部",
-    "permissionFlag" : "role:3@@role:4",
-    "nodeRatio" : 0.000,
-    "coordinate" : "800,300|800,300",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "762cb975-37d8-4276-b6db-79a4c3606394",
-      "nextNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
-      "skipType" : "PASS",
-      "coordinate" : "850,300;920,300;920,245"
-    } ]
-  } ]
+  "flowCode": "leave3",
+  "flowName": "请假申请-并行网关",
+  "category": "100",
+  "version": "1",
+  "formCustom": "N",
+  "formPath": "/workflow/leaveEdit/index",
+  "nodeList": [
+    {
+      "nodeType": 0,
+      "nodeCode": "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
+      "nodeName": "开始",
+      "nodeRatio": 0.000,
+      "coordinate": "380,220|380,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
+          "nextNodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
+          "skipType": "PASS",
+          "coordinate": "400,220;470,220"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
+      "nodeName": "申请人",
+      "nodeRatio": 0.000,
+      "coordinate": "520,220|520,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
+          "nextNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
+          "skipType": "PASS",
+          "coordinate": "570,220;655,220"
+        }
+      ]
+    },
+    {
+      "nodeType": 4,
+      "nodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
+      "nodeRatio": 0.000,
+      "coordinate": "680,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
+          "nextNodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
+          "skipType": "PASS",
+          "coordinate": "680,195;680,140;750,140"
+        },
+        {
+          "nowNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
+          "nextNodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
+          "skipType": "PASS",
+          "coordinate": "680,245;680,300;750,300"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
+      "nodeName": "市场部",
+      "permissionFlag": "role:1",
+      "nodeRatio": 0.000,
+      "coordinate": "800,140|800,140",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
+          "nextNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
+          "skipType": "PASS",
+          "coordinate": "850,140;920,140;920,195"
+        }
+      ]
+    },
+    {
+      "nodeType": 4,
+      "nodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
+      "nodeRatio": 0.000,
+      "coordinate": "920,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
+          "nextNodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
+          "skipType": "PASS",
+          "coordinate": "945,220;975,220;975,220;960,220;960,220;990,220"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
+      "nodeName": "CEO",
+      "permissionFlag": "1",
+      "nodeRatio": 0.000,
+      "coordinate": "1040,220|1040,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
+          "nextNodeCode": "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
+          "skipType": "PASS",
+          "coordinate": "1090,220;1140,220"
+        }
+      ]
+    },
+    {
+      "nodeType": 2,
+      "nodeCode": "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
+      "nodeName": "结束",
+      "nodeRatio": 0.000,
+      "coordinate": "1160,220|1160,220",
+      "formCustom": "N",
+      "ext": "[]"
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
+      "nodeName": "综合部",
+      "permissionFlag": "role:3@@role:4",
+      "nodeRatio": 0.000,
+      "coordinate": "800,300|800,300",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
+          "nextNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
+          "skipType": "PASS",
+          "coordinate": "850,300;920,300;920,245"
+        }
+      ]
+    }
+  ]
 }

+ 105 - 88
SERVER/VberAdminPlusV3/.script/leave/leave4.json

@@ -1,90 +1,107 @@
 {
-  "flowCode" : "leave4",
-  "flowName" : "请假申请-会签",
-  "category" : "100",
-  "version" : "1",
-  "formCustom" : "N",
-  "formPath" : "/workflow/leaveEdit/index",
-  "nodeList" : [ {
-    "nodeType" : 0,
-    "nodeCode" : "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
-    "nodeName" : "开始",
-    "nodeRatio" : 0.000,
-    "coordinate" : "320,240|320,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
-      "nextNodeCode" : "e90b98ef-35b4-410c-a663-bae8b7624b9f",
-      "skipType" : "PASS",
-      "coordinate" : "340,240;410,240"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "e90b98ef-35b4-410c-a663-bae8b7624b9f",
-    "nodeName" : "申请人",
-    "nodeRatio" : 0.000,
-    "coordinate" : "460,240|460,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "e90b98ef-35b4-410c-a663-bae8b7624b9f",
-      "nextNodeCode" : "768b5b1a-6726-4d67-8853-4cc70d5b1045",
-      "skipType" : "PASS",
-      "coordinate" : "510,240;590,240"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "768b5b1a-6726-4d67-8853-4cc70d5b1045",
-    "nodeName" : "百分之60通过",
-    "permissionFlag" : "${userList}",
-    "nodeRatio" : 60.000,
-    "coordinate" : "640,240|640,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "768b5b1a-6726-4d67-8853-4cc70d5b1045",
-      "nextNodeCode" : "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
-      "skipType" : "PASS",
-      "coordinate" : "690,240;770,240"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
-    "nodeName" : "全部审批通过",
-    "permissionFlag" : "role:1@@role:3",
-    "nodeRatio" : 100.000,
-    "coordinate" : "820,240|820,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
-      "nextNodeCode" : "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
-      "skipType" : "PASS",
-      "coordinate" : "870,240;950,240"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
-    "nodeName" : "CEO",
-    "permissionFlag" : "1",
-    "nodeRatio" : 0.000,
-    "coordinate" : "1000,240|1000,240",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
-      "nextNodeCode" : "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
-      "skipType" : "PASS",
-      "coordinate" : "1050,240;1080,240;1080,240;1070,240;1070,240;1100,240"
-    } ]
-  }, {
-    "nodeType" : 2,
-    "nodeCode" : "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
-    "nodeName" : "结束",
-    "nodeRatio" : 0.000,
-    "coordinate" : "1120,240|1120,240",
-    "formCustom" : "N",
-    "ext" : "[]"
-  } ]
+  "flowCode": "leave4",
+  "flowName": "请假申请-会签",
+  "category": "100",
+  "version": "1",
+  "formCustom": "N",
+  "formPath": "/workflow/leaveEdit/index",
+  "nodeList": [
+    {
+      "nodeType": 0,
+      "nodeCode": "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
+      "nodeName": "开始",
+      "nodeRatio": 0.000,
+      "coordinate": "320,240|320,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
+          "nextNodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
+          "skipType": "PASS",
+          "coordinate": "340,240;410,240"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
+      "nodeName": "申请人",
+      "nodeRatio": 0.000,
+      "coordinate": "460,240|460,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
+          "nextNodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
+          "skipType": "PASS",
+          "coordinate": "510,240;590,240"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
+      "nodeName": "百分之60通过",
+      "permissionFlag": "${userList}",
+      "nodeRatio": 60.000,
+      "coordinate": "640,240|640,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
+          "nextNodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
+          "skipType": "PASS",
+          "coordinate": "690,240;770,240"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
+      "nodeName": "全部审批通过",
+      "permissionFlag": "role:1@@role:3",
+      "nodeRatio": 100.000,
+      "coordinate": "820,240|820,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
+          "nextNodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
+          "skipType": "PASS",
+          "coordinate": "870,240;950,240"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
+      "nodeName": "CEO",
+      "permissionFlag": "1",
+      "nodeRatio": 0.000,
+      "coordinate": "1000,240|1000,240",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
+          "nextNodeCode": "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
+          "skipType": "PASS",
+          "coordinate": "1050,240;1080,240;1080,240;1070,240;1070,240;1100,240"
+        }
+      ]
+    },
+    {
+      "nodeType": 2,
+      "nodeCode": "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
+      "nodeName": "结束",
+      "nodeRatio": 0.000,
+      "coordinate": "1120,240|1120,240",
+      "formCustom": "N",
+      "ext": "[]"
+    }
+  ]
 }

+ 143 - 119
SERVER/VberAdminPlusV3/.script/leave/leave5.json

@@ -1,121 +1,145 @@
 {
-  "flowCode" : "leave5",
-  "flowName" : "请假申请-并行会签网关",
-  "category" : "100",
-  "version" : "1",
-  "formCustom" : "N",
-  "formPath" : "/workflow/leaveEdit/index",
-  "nodeList" : [ {
-    "nodeType" : 0,
-    "nodeCode" : "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
-    "nodeName" : "开始",
-    "nodeRatio" : 0.000,
-    "coordinate" : "300,220|300,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
-      "nextNodeCode" : "e1b04e96-dc81-4858-a309-2fe945d2f374",
-      "skipType" : "PASS",
-      "coordinate" : "320,220;350,220;350,220;340,220;340,220;370,220"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "e1b04e96-dc81-4858-a309-2fe945d2f374",
-    "nodeName" : "申请人",
-    "nodeRatio" : 0.000,
-    "coordinate" : "420,220|420,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "e1b04e96-dc81-4858-a309-2fe945d2f374",
-      "nextNodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
-      "skipType" : "PASS",
-      "coordinate" : "470,220;535,220"
-    } ]
-  }, {
-    "nodeType" : 4,
-    "nodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
-    "nodeRatio" : 0.000,
-    "coordinate" : "560,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
-      "nextNodeCode" : "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
-      "skipType" : "PASS",
-      "coordinate" : "560,245;560,320;650,320"
-    }, {
-      "nowNodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
-      "nextNodeCode" : "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
-      "skipType" : "PASS",
-      "coordinate" : "560,195;560,120;650,120"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
-    "nodeName" : "会签",
-    "permissionFlag" : "role:1@@role:3",
-    "nodeRatio" : 100.000,
-    "coordinate" : "700,320|700,320",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
-      "nextNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
-      "skipType" : "PASS",
-      "coordinate" : "750,320;860,320;860,245"
-    } ]
-  }, {
-    "nodeType" : 4,
-    "nodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
-    "nodeRatio" : 0.000,
-    "coordinate" : "860,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
-      "nextNodeCode" : "7a8f0473-e409-442e-a843-5c2b813d00e9",
-      "skipType" : "PASS",
-      "coordinate" : "885,220;950,220"
-    } ]
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "7a8f0473-e409-442e-a843-5c2b813d00e9",
-    "nodeName" : "CEO",
-    "permissionFlag" : "1",
-    "nodeRatio" : 0.000,
-    "coordinate" : "1000,220|1000,220",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "7a8f0473-e409-442e-a843-5c2b813d00e9",
-      "nextNodeCode" : "03c4d2bc-58b5-4408-a2e4-65afb046f169",
-      "skipType" : "PASS",
-      "coordinate" : "1050,220;1120,220"
-    } ]
-  }, {
-    "nodeType" : 2,
-    "nodeCode" : "03c4d2bc-58b5-4408-a2e4-65afb046f169",
-    "nodeName" : "结束",
-    "nodeRatio" : 0.000,
-    "coordinate" : "1140,220|1140,220",
-    "formCustom" : "N",
-    "ext" : "[]"
-  }, {
-    "nodeType" : 1,
-    "nodeCode" : "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
-    "nodeName" : "百分之60票签",
-    "permissionFlag" : "${userList}",
-    "nodeRatio" : 60.000,
-    "coordinate" : "700,120|700,120",
-    "formCustom" : "N",
-    "ext" : "[]",
-    "skipList" : [ {
-      "nowNodeCode" : "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
-      "nextNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
-      "skipType" : "PASS",
-      "coordinate" : "750,120;860,120;860,195"
-    } ]
-  } ]
+  "flowCode": "leave5",
+  "flowName": "请假申请-并行会签网关",
+  "category": "100",
+  "version": "1",
+  "formCustom": "N",
+  "formPath": "/workflow/leaveEdit/index",
+  "nodeList": [
+    {
+      "nodeType": 0,
+      "nodeCode": "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
+      "nodeName": "开始",
+      "nodeRatio": 0.000,
+      "coordinate": "300,220|300,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
+          "nextNodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
+          "skipType": "PASS",
+          "coordinate": "320,220;350,220;350,220;340,220;340,220;370,220"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
+      "nodeName": "申请人",
+      "nodeRatio": 0.000,
+      "coordinate": "420,220|420,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
+          "nextNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
+          "skipType": "PASS",
+          "coordinate": "470,220;535,220"
+        }
+      ]
+    },
+    {
+      "nodeType": 4,
+      "nodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
+      "nodeRatio": 0.000,
+      "coordinate": "560,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
+          "nextNodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
+          "skipType": "PASS",
+          "coordinate": "560,245;560,320;650,320"
+        },
+        {
+          "nowNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
+          "nextNodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
+          "skipType": "PASS",
+          "coordinate": "560,195;560,120;650,120"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
+      "nodeName": "会签",
+      "permissionFlag": "role:1@@role:3",
+      "nodeRatio": 100.000,
+      "coordinate": "700,320|700,320",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
+          "nextNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
+          "skipType": "PASS",
+          "coordinate": "750,320;860,320;860,245"
+        }
+      ]
+    },
+    {
+      "nodeType": 4,
+      "nodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
+      "nodeRatio": 0.000,
+      "coordinate": "860,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
+          "nextNodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
+          "skipType": "PASS",
+          "coordinate": "885,220;950,220"
+        }
+      ]
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
+      "nodeName": "CEO",
+      "permissionFlag": "1",
+      "nodeRatio": 0.000,
+      "coordinate": "1000,220|1000,220",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
+          "nextNodeCode": "03c4d2bc-58b5-4408-a2e4-65afb046f169",
+          "skipType": "PASS",
+          "coordinate": "1050,220;1120,220"
+        }
+      ]
+    },
+    {
+      "nodeType": 2,
+      "nodeCode": "03c4d2bc-58b5-4408-a2e4-65afb046f169",
+      "nodeName": "结束",
+      "nodeRatio": 0.000,
+      "coordinate": "1140,220|1140,220",
+      "formCustom": "N",
+      "ext": "[]"
+    },
+    {
+      "nodeType": 1,
+      "nodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
+      "nodeName": "百分之60票签",
+      "permissionFlag": "${userList}",
+      "nodeRatio": 60.000,
+      "coordinate": "700,120|700,120",
+      "formCustom": "N",
+      "ext": "[]",
+      "skipList": [
+        {
+          "nowNodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
+          "nextNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
+          "skipType": "PASS",
+          "coordinate": "750,120;860,120;860,195"
+        }
+      ]
+    }
+  ]
 }

+ 256 - 213
SERVER/VberAdminPlusV3/.script/leave/leave6.json

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

+ 2 - 1
SERVER/VberAdminPlusV3/.script/run/DF_VberServer.run.xml

@@ -1,5 +1,6 @@
 <component name="ProjectRunConfigurationManager">
-    <configuration default="false" name="DF_VberServer" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
+    <configuration default="false" name="DF_VberServer" type="docker-deploy" factoryName="dockerfile"
+                   server-name="Docker">
         <deployment type="dockerfile">
             <settings>
                 <option name="imageTag" value="vber/vber-server:3.0.0"/>

+ 9 - 8
SERVER/VberAdminPlusV3/.script/run/VberServerApp.run.xml

@@ -1,10 +1,11 @@
 <component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="VberServerApp" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-    <module name="vber-admin" />
-    <option name="SHORTEN_COMMAND_LINE" value="ARGS_FILE" />
-    <option name="SPRING_BOOT_MAIN_CLASS" value="com.vber.VberWebApplication" />
-    <method v="2">
-      <option name="Make" enabled="true" />
-    </method>
-  </configuration>
+    <configuration default="false" name="VberServerApp" type="SpringBootApplicationConfigurationType"
+                   factoryName="Spring Boot">
+        <module name="vber-admin"/>
+        <option name="SHORTEN_COMMAND_LINE" value="ARGS_FILE"/>
+        <option name="SPRING_BOOT_MAIN_CLASS" value="com.vber.VberWebApplication"/>
+        <method v="2">
+            <option name="Make" enabled="true"/>
+        </method>
+    </configuration>
 </component>

+ 350 - 193
SERVER/VberAdminPlusV3/.script/sql/admin.sql

@@ -1,5 +1,6 @@
 -- 建库
-CREATE DATABASE /*!32312 IF NOT EXISTS */ `VberAdminPlusV3` /*!40100 DEFAULT CHARACTER SET utf8 */;
+CREATE
+DATABASE /*!32312 IF NOT EXISTS */ `VberAdminPlusV3` /*!40100 DEFAULT CHARACTER SET utf8 */;
 
 -- ----------------------------
 -- 1、组织机构表
@@ -211,9 +212,9 @@ CREATE TABLE sys_oper_log
     oper_time      DATETIME COMMENT '操作时间',
     cost_time      BIGINT(20)    DEFAULT 0 COMMENT '消耗时间',
     PRIMARY KEY (oper_id),
-    KEY idx_sys_oper_log_bt (business_type),
-    KEY idx_sys_oper_log_s (status),
-    KEY idx_sys_oper_log_ot (oper_time)
+    KEY            idx_sys_oper_log_bt (business_type),
+    KEY            idx_sys_oper_log_s (status),
+    KEY            idx_sys_oper_log_ot (oper_time)
 ) ENGINE = innodb COMMENT = '操作日志记录'
   AUTO_INCREMENT = 1000;
 
@@ -307,8 +308,8 @@ CREATE TABLE sys_login_log
     msg            VARCHAR(255) DEFAULT '' COMMENT '提示消息',
     login_time     DATETIME COMMENT '访问时间',
     PRIMARY KEY (info_id),
-    KEY idx_sys_loginLog_s (status),
-    KEY idx_sys_loginLog_lt (login_time)
+    KEY            idx_sys_loginLog_s (status),
+    KEY            idx_sys_loginLog_lt (login_time)
 ) ENGINE = innodb COMMENT = '系统访问记录'
   AUTO_INCREMENT = 1000;
 
@@ -421,35 +422,35 @@ CREATE TABLE sys_client
 DROP TABLE IF EXISTS sys_social;
 CREATE TABLE sys_social
 (
-    id                 BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键',
-    user_id            BIGINT       NOT NULL COMMENT '用户ID',
-    tenant_id          VARCHAR(20)  DEFAULT "000000" COMMENT '租户id',
-    auth_id            VARCHAR(255) NOT NULL COMMENT '平台+平台唯一id',
-    source             VARCHAR(255) NOT NULL COMMENT '用户来源',
-    open_id            VARCHAR(255) DEFAULT NULL COMMENT '平台编号唯一id',
-    user_name          VARCHAR(30)  NOT NULL COMMENT '登录账号',
-    nick_name          VARCHAR(30)  DEFAULT '' COMMENT '用户昵称',
-    email              VARCHAR(255) DEFAULT '' COMMENT '用户邮箱',
-    avatar             VARCHAR(500) DEFAULT '' COMMENT '头像地址',
+    id                 BIGINT        NOT NULL AUTO_INCREMENT COMMENT '主键',
+    user_id            BIGINT        NOT NULL COMMENT '用户ID',
+    tenant_id          VARCHAR(20)   DEFAULT "000000" COMMENT '租户id',
+    auth_id            VARCHAR(255)  NOT NULL COMMENT '平台+平台唯一id',
+    source             VARCHAR(255)  NOT NULL COMMENT '用户来源',
+    open_id            VARCHAR(255)  DEFAULT NULL COMMENT '平台编号唯一id',
+    user_name          VARCHAR(30)   NOT NULL COMMENT '登录账号',
+    nick_name          VARCHAR(30)   DEFAULT '' COMMENT '用户昵称',
+    email              VARCHAR(255)  DEFAULT '' COMMENT '用户邮箱',
+    avatar             VARCHAR(500)  DEFAULT '' COMMENT '头像地址',
     access_token       VARCHAR(2000) NOT NULL COMMENT '用户的授权令牌',
-    expire_in          INT          DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
+    expire_in          INT           DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
     refresh_token      VARCHAR(2000) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有',
-    access_code        VARCHAR(255) DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
-    union_id           VARCHAR(255) DEFAULT NULL COMMENT '用户的 unionid',
-    scope              VARCHAR(255) DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
-    token_type         VARCHAR(255) DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
-    id_token           VARCHAR(255) DEFAULT NULL COMMENT 'id token,部分平台可能没有',
-    mac_algorithm      VARCHAR(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
-    mac_key            VARCHAR(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
-    code               VARCHAR(255) DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
-    oauth_token        VARCHAR(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
-    oauth_token_secret VARCHAR(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+    access_code        VARCHAR(255)  DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
+    union_id           VARCHAR(255)  DEFAULT NULL COMMENT '用户的 unionid',
+    scope              VARCHAR(255)  DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
+    token_type         VARCHAR(255)  DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
+    id_token           VARCHAR(255)  DEFAULT NULL COMMENT 'id token,部分平台可能没有',
+    mac_algorithm      VARCHAR(255)  DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+    mac_key            VARCHAR(255)  DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+    code               VARCHAR(255)  DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
+    oauth_token        VARCHAR(255)  DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+    oauth_token_secret VARCHAR(255)  DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
     create_org         BIGINT(20) COMMENT '创建组织机构',
     create_by          BIGINT(20) COMMENT '创建者',
     create_time        DATETIME COMMENT '创建时间',
     update_by          BIGINT(20) COMMENT '更新者',
     update_time        DATETIME COMMENT '更新时间',
-    del_flag           CHAR(1)      DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+    del_flag           CHAR(1)       DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
     PRIMARY KEY (id)
 ) ENGINE = innodb COMMENT = '社会化关系表'
   AUTO_INCREMENT = 1000;
@@ -561,8 +562,8 @@ CREATE TABLE sys_tenant_package
     menu_ids            VARCHAR(3000) COMMENT '关联菜单id',
     remark              VARCHAR(200) COMMENT '备注',
     menu_check_strictly TINYINT(1) DEFAULT 1 COMMENT '菜单树选择项是否关联显示',
-    status              CHAR(1)    DEFAULT '0' COMMENT '状态(0正常 1停用)',
-    del_flag            CHAR(1)    DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+    status              CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+    del_flag            CHAR(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
     create_org          BIGINT(20) COMMENT '创建组织机构',
     create_by           BIGINT(20) COMMENT '创建者',
     create_time         DATETIME COMMENT '创建时间',
@@ -592,169 +593,293 @@ CREATE TABLE sys_notice_status
 -- ----------------------------
 -- 初始化-组织机构表数据
 -- ----------------------------
-INSERT INTO sys_org (org_id, tenant_id, parent_id, ancestors, org_name, org_category, order_num, leader, phone, email, status, del_flag, create_org, create_by, create_time, update_by, update_time)
-VALUES (100, '000000', 0, '0', '科技有限公司', NULL, 0, 1, '15888888888', 'vber@iwbnet.com', '0', '0', 100, 1, SYSDATE(), NULL, NULL),
-       (101, '000000', 100, '0,100', '001公司', NULL, 1, 3, '15888888888', 'xxx@qq.com', '0', '0', 100, 1, SYSDATE(), NULL, NULL),
-       (102, '000000', 100, '0,100', '002公司', NULL, 2, 4, '15888888888', 'xxx@qq.com', '0', '0', 100, 1, SYSDATE(), NULL, NULL);
+INSERT INTO sys_org (org_id, tenant_id, parent_id, ancestors, org_name, org_category, order_num, leader, phone, email,
+                     status, del_flag, create_org, create_by, create_time, update_by, update_time)
+VALUES (100, '000000', 0, '0', '科技有限公司', NULL, 0, 1, '15888888888', 'vber@iwbnet.com', '0', '0', 100, 1,
+        SYSDATE(), NULL, NULL),
+       (101, '000000', 100, '0,100', '001公司', NULL, 1, 3, '15888888888', 'xxx@qq.com', '0', '0', 100, 1, SYSDATE(),
+        NULL, NULL),
+       (102, '000000', 100, '0,100', '002公司', NULL, 2, 4, '15888888888', 'xxx@qq.com', '0', '0', 100, 1, SYSDATE(),
+        NULL, NULL);
 
 -- ----------------------------
 -- 初始化-岗位信息表数据
 -- ----------------------------
-INSERT INTO sys_post (post_id, tenant_id, org_id, post_code, post_category, post_name, post_sort, status, create_org, create_by, create_time, update_by, update_time, remark)
+INSERT INTO sys_post (post_id, tenant_id, org_id, post_code, post_category, post_name, post_sort, status, create_org,
+                      create_by, create_time, update_by, update_time, remark)
 VALUES (1, '000000', 100, 'default', NULL, '默认岗位', 1, '0', 100, 1, SYSDATE(), NULL, NULL, '');
 
 -- ----------------------------
 -- 初始化-角色信息表数据
 -- ----------------------------
-INSERT INTO sys_role (role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, org_check_strictly, is_static, status, del_flag, create_org, create_by, create_time, update_by, update_time, remark)
+INSERT INTO sys_role (role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly,
+                      org_check_strictly, is_static, status, del_flag, create_org, create_by, create_time, update_by,
+                      update_time, remark)
 VALUES (1, '000000', '超级管理员', 'super_admin', 1, 1, 1, 1, 1, '0', '0', 100, 1, SYSDATE(), NULL, NULL, '超级管理员'),
        (2, '000000', '默认角色', 'default', 2, 3, 1, 1, 1, '0', '0', 100, 1, SYSDATE(), NULL, NULL, '默认角色');
 
 -- ----------------------------
 -- 初始化-用户信息表数据
 -- ----------------------------
-INSERT INTO sys_user (user_id, tenant_id, org_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_org, create_by, create_time, update_by, update_time, remark)
-VALUES (1, '000000', 100, 'admin', 'Admin', 'sys_user', 'admin@iwbnet.com', '13812340010', '1', NULL, '$2a$10$2M15Bggh98qOy7aWrGUc2OHL4yvvNij/NtbnLfkASmCN/Xwco3rq.', '0', '0', '127.0.0.1', SYSDATE(), 100, 1, SYSDATE(), NULL, NULL, '超级管理员'),
-       (2, '000000', 100, 'system', 'System', 'sys_user', 'system@iwbnet.com', '13812340011', '1', NULL, '$2a$10$rCiWvcYYyEIb.PTM940FweoU.qKwErcJFmFyQdopQ1ZT37q6UcaOm', '0', '0', '127.0.0.1', SYSDATE(), 100, 1, SYSDATE(), NULL, NULL, '系统管理员'),
-       (3, '000000', 101, 'demo01', 'Demo01', 'sys_user', 'demo01@iwbnet.com', '13812340021', '1', NULL, '$2a$10$T2u3eqjhLe04ZUTGCPcYrONPpLEt03eDbdJdCD5JW.2PQhT/LixcO', '0', '0', '127.0.0.1', SYSDATE(), 100, 1, SYSDATE(), NULL, NULL, '系统管理员'),
-       (4, '000000', 102, 'demo02', 'Demo02', 'sys_user', 'demo02@iwbnet.com', '13812340022', '1', NULL, '$2a$10$YpB6Bww0qTHZu31uDAlmg.MhDYTNKuOzN3KhaBEPM.PDVrJxHHuhW', '0', '0', '127.0.0.1', SYSDATE(), 100, 1, SYSDATE(), NULL, NULL, '系统管理员');
+INSERT INTO sys_user (user_id, tenant_id, org_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar,
+                      password, status, del_flag, login_ip, login_date, create_org, create_by, create_time, update_by,
+                      update_time, remark)
+VALUES (1, '000000', 100, 'admin', 'Admin', 'sys_user', 'admin@iwbnet.com', '13812340010', '1', NULL,
+        '$2a$10$2M15Bggh98qOy7aWrGUc2OHL4yvvNij/NtbnLfkASmCN/Xwco3rq.', '0', '0', '127.0.0.1', SYSDATE(), 100, 1,
+        SYSDATE(), NULL, NULL, '超级管理员'),
+       (2, '000000', 100, 'system', 'System', 'sys_user', 'system@iwbnet.com', '13812340011', '1', NULL,
+        '$2a$10$rCiWvcYYyEIb.PTM940FweoU.qKwErcJFmFyQdopQ1ZT37q6UcaOm', '0', '0', '127.0.0.1', SYSDATE(), 100, 1,
+        SYSDATE(), NULL, NULL, '系统管理员'),
+       (3, '000000', 101, 'demo01', 'Demo01', 'sys_user', 'demo01@iwbnet.com', '13812340021', '1', NULL,
+        '$2a$10$T2u3eqjhLe04ZUTGCPcYrONPpLEt03eDbdJdCD5JW.2PQhT/LixcO', '0', '0', '127.0.0.1', SYSDATE(), 100, 1,
+        SYSDATE(), NULL, NULL, '系统管理员'),
+       (4, '000000', 102, 'demo02', 'Demo02', 'sys_user', 'demo02@iwbnet.com', '13812340022', '1', NULL,
+        '$2a$10$YpB6Bww0qTHZu31uDAlmg.MhDYTNKuOzN3KhaBEPM.PDVrJxHHuhW', '0', '0', '127.0.0.1', SYSDATE(), 100, 1,
+        SYSDATE(), NULL, NULL, '系统管理员');
 
 -- ----------------------------
 -- 初始化-菜单信息表数据
 -- ----------------------------
-INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, btn_class, btn_script, create_org, create_by, create_time, update_by, update_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache,
+                      menu_type, visible, status, perms, icon, btn_class, btn_script, create_org, create_by,
+                      create_time, update_by, update_time, remark)
 VALUES
     -- 系统信息
-    (1, '系统信息维护', 0, 1, 'system', NULL, '', 1, 0, 'M', '0', '0', '', 'terminal', '', '', 100, 1, SYSDATE(), NULL, NULL, '系统管理目录'),
-
-    (100, '用户管理', 1, 1, 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user', 'person-circle', '', '', 100, 1, SYSDATE(), NULL, NULL, '用户管理菜单'),
-    (1001, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1002, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1003, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1004, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1005, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1006, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', 'cloud-upload', 'btn btn-light-warning', 'handleImport', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1007, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', 'file-lock2', 'btn btn-light-danger', 'handleResetPwd@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (101, '角色管理', 1, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role', 'person-gear', '', '', 100, 1, SYSDATE(), NULL, NULL, '角色管理菜单'),
-    (1008, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1009, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1010, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1011, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1012, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu', 'list', '', '', 100, 1, SYSDATE(), NULL, NULL, '菜单管理菜单'),
-    (1013, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1014, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1015, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1016, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (103, '组织机构管理', 1, 4, 'org', 'system/org/index', '', 1, 0, 'C', '0', '0', 'system:org', 'card-list', '', '', 100, 1, SYSDATE(), NULL, NULL, '组织机构管理菜单'),
-    (1017, '组织机构查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:org:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1018, '组织机构新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:org:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1019, '组织机构修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:org:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1020, '组织机构删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:org:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post', 'file-person', '', '', 100, 1, SYSDATE(), NULL, NULL, '岗位管理菜单'),
-    (1021, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1022, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1023, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1024, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1025, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict', 'file-earmark-medical', '', '', 100, 1, SYSDATE(), NULL, NULL, '字典管理菜单'),
-    (1026, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1027, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1028, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1029, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1030, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (106, '参数设置', 1, 7, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config', 'gear', '', '', 100, 1, SYSDATE(), NULL, NULL, '参数设置菜单'),
-    (1031, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1032, '参数新增', 106, 2, '#', '', '', 1, 1, 'F', '0', '0', 'system:config:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1033, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1034, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1035, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (107, '通知公告', 1, 8, 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice', 'bell', '', '', 100, 1, SYSDATE(), NULL, NULL, '通知公告菜单'),
-    (1036, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1037, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1038, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1039, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'file-earmark-medical', '', '', 100, 1, SYSDATE(), NULL, NULL, '日志管理菜单'),
-    (109, '操作日志', 108, 1, 'operLog', 'system/log/operLog', '', 1, 0, 'C', '0', '0', 'system:operLog', 'file-earmark-easel', '', '', 100, 1, SYSDATE(), NULL, NULL, '操作日志菜单'),
-    (1040, '操作查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:operLog:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1041, '操作删除', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:operLog:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1042, '日志导出', 109, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:operLog:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (110, '登录日志', 108, 2, 'loginLog', 'system/log/loginLog', '', 1, 0, 'C', '0', '0', 'system:loginLog', 'file-earmark-person', '', '', 100, 1, SYSDATE(), NULL, NULL, '登录日志菜单'),
-    (1043, '登录查询', 110, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:loginLog:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1044, '账户解锁', 110, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:loginLog:unlock', 'unlock-fill', 'btn btn-light-primary', 'handleUnlock@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1045, '删除日志', 110, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:loginLog:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1046, '日志导出', 110, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:loginLog:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (111, '文件管理', 1, 10, 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss', 'file-earmark-post', '', '', 100, 1, SYSDATE(), NULL, NULL, '文件管理菜单'),
-    (1061, '文件查询', 111, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1062, '文件上传', 111, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', 'cloud-upload', 'btn btn-light-info', 'handleUpload', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1063, '文件下载', 111, 3, '#', '', '', 1, 0, 'F', '1', '0', 'system:oss:download', 'cloud-download', 'btn btn-light-info', 'handleDownload', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1064, '文件删除', 111, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1065, '文件服务器配置', 111, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig', 'gear-wide-connected', 'btn btn-light-success', 'handleConfig', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1066, '配置查询', 1065, 1, '#', '', '', 1, 0, 'F', '1', '0', 'system:ossConfig:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1067, '配置添加', 1065, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1068, '配置编辑', 1065, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1069, '配置删除', 1065, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (112, '客户端管理', 1, 11, 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client', 'file-earmark-medical', '', '', 100, 1, SYSDATE(), NULL, NULL, '客户端管理菜单'),
-    (1071, '客户端查询', 112, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1072, '客户端新增', 112, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1073, '客户端修改', 112, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1074, '客户端删除', 112, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1075, '客户端导出', 112, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1, '系统信息维护', 0, 1, 'system', NULL, '', 1, 0, 'M', '0', '0', '', 'terminal', '', '', 100, 1, SYSDATE(), NULL,
+     NULL, '系统管理目录'),
+
+    (100, '用户管理', 1, 1, 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user', 'person-circle', '',
+     '', 100, 1, SYSDATE(), NULL, NULL, '用户管理菜单'),
+    (1001, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', 'eye', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, ''),
+    (1002, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1003, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1004, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1005, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1006, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', 'cloud-upload',
+     'btn btn-light-warning', 'handleImport', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1007, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', 'file-lock2',
+     'btn btn-light-danger', 'handleResetPwd@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (101, '角色管理', 1, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role', 'person-gear', '', '',
+     100, 1, SYSDATE(), NULL, NULL, '角色管理菜单'),
+    (1008, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', 'eye', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, ''),
+    (1009, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1010, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1011, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1012, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu', 'list', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, '菜单管理菜单'),
+    (1013, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', 'eye', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, ''),
+    (1014, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1015, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1016, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (103, '组织机构管理', 1, 4, 'org', 'system/org/index', '', 1, 0, 'C', '0', '0', 'system:org', 'card-list', '', '',
+     100, 1, SYSDATE(), NULL, NULL, '组织机构管理菜单'),
+    (1017, '组织机构查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:org:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1018, '组织机构新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:org:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1019, '组织机构修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:org:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1020, '组织机构删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:org:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post', 'file-person', '', '',
+     100, 1, SYSDATE(), NULL, NULL, '岗位管理菜单'),
+    (1021, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', 'eye', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, ''),
+    (1022, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1023, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1024, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1025, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict', 'file-earmark-medical',
+     '', '', 100, 1, SYSDATE(), NULL, NULL, '字典管理菜单'),
+    (1026, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', 'eye', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, ''),
+    (1027, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1028, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1029, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1030, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (106, '参数设置', 1, 7, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config', 'gear', '', '',
+     100, 1, SYSDATE(), NULL, NULL, '参数设置菜单'),
+    (1031, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1032, '参数新增', 106, 2, '#', '', '', 1, 1, 'F', '0', '0', 'system:config:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1033, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1034, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1035, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (107, '通知公告', 1, 8, 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice', 'bell', '', '',
+     100, 1, SYSDATE(), NULL, NULL, '通知公告菜单'),
+    (1036, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1037, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1038, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1039, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'file-earmark-medical', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, '日志管理菜单'),
+    (109, '操作日志', 108, 1, 'operLog', 'system/log/operLog', '', 1, 0, 'C', '0', '0', 'system:operLog',
+     'file-earmark-easel', '', '', 100, 1, SYSDATE(), NULL, NULL, '操作日志菜单'),
+    (1040, '操作查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:operLog:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1041, '操作删除', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:operLog:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1042, '日志导出', 109, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:operLog:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (110, '登录日志', 108, 2, 'loginLog', 'system/log/loginLog', '', 1, 0, 'C', '0', '0', 'system:loginLog',
+     'file-earmark-person', '', '', 100, 1, SYSDATE(), NULL, NULL, '登录日志菜单'),
+    (1043, '登录查询', 110, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:loginLog:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1044, '账户解锁', 110, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:loginLog:unlock', 'unlock-fill',
+     'btn btn-light-primary', 'handleUnlock@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1045, '删除日志', 110, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:loginLog:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1046, '日志导出', 110, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:loginLog:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (111, '文件管理', 1, 10, 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss', 'file-earmark-post', '',
+     '', 100, 1, SYSDATE(), NULL, NULL, '文件管理菜单'),
+    (1061, '文件查询', 111, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', 'eye', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, ''),
+    (1062, '文件上传', 111, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', 'cloud-upload',
+     'btn btn-light-info', 'handleUpload', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1063, '文件下载', 111, 3, '#', '', '', 1, 0, 'F', '1', '0', 'system:oss:download', 'cloud-download',
+     'btn btn-light-info', 'handleDownload', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1064, '文件删除', 111, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1065, '文件服务器配置', 111, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig', 'gear-wide-connected',
+     'btn btn-light-success', 'handleConfig', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1066, '配置查询', 1065, 1, '#', '', '', 1, 0, 'F', '1', '0', 'system:ossConfig:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1067, '配置添加', 1065, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1068, '配置编辑', 1065, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1069, '配置删除', 1065, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (112, '客户端管理', 1, 11, 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client',
+     'file-earmark-medical', '', '', 100, 1, SYSDATE(), NULL, NULL, '客户端管理菜单'),
+    (1071, '客户端查询', 112, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1072, '客户端新增', 112, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1073, '客户端修改', 112, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1074, '客户端删除', 112, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1075, '客户端导出', 112, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
 
     -- 租户
-    (2, '租户信息维护', 0, 2, 'tenant', NULL, '', 1, 0, 'M', '0', '0', '', 'house-gear', '', '', 100, 1, SYSDATE(), NULL, NULL, '租户管理目录'),
-    (121, '租户管理', 2, 1, 'tenantMg', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant', 'houses-fill', '', '', 100, 1, SYSDATE(), NULL, NULL, '租户管理菜单'),
-    (1081, '租户查询', 121, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1082, '租户新增', 121, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1083, '租户修改', 121, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1084, '租户删除', 121, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1085, '租户导出', 121, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (122, '租户套餐管理', 2, 2, 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage', 'houses', '', '', 100, 1, SYSDATE(), NULL, NULL, '租户套餐管理菜单'),
-    (1086, '租户套餐查询', 122, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1087, '租户套餐新增', 122, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1088, '租户套餐修改', 122, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1089, '租户套餐删除', 122, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1090, '租户套餐导出', 122, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (2, '租户信息维护', 0, 2, 'tenant', NULL, '', 1, 0, 'M', '0', '0', '', 'house-gear', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, '租户管理目录'),
+    (121, '租户管理', 2, 1, 'tenantMg', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant', 'houses-fill',
+     '', '', 100, 1, SYSDATE(), NULL, NULL, '租户管理菜单'),
+    (1081, '租户查询', 121, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1082, '租户新增', 121, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1083, '租户修改', 121, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1084, '租户删除', 121, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1085, '租户导出', 121, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (122, '租户套餐管理', 2, 2, 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0',
+     'system:tenantPackage', 'houses', '', '', 100, 1, SYSDATE(), NULL, NULL, '租户套餐管理菜单'),
+    (1086, '租户套餐查询', 122, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', 'eye', '', '', 100,
+     1, SYSDATE(), NULL, NULL, ''),
+    (1087, '租户套餐新增', 122, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', 'plus-square',
+     'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1088, '租户套餐修改', 122, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1089, '租户套餐删除', 122, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1090, '租户套餐导出', 122, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', 'cloud-download',
+     'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
 
     -- 监控
-    (3, '系统运行监控', 0, 3, 'monitor', NULL, '', 1, 0, 'M', '0', '0', '', 'display', '', '', 100, 1, SYSDATE(), NULL, NULL, '系统监控目录'),
-    (131, '在线用户', 3, 1, 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online', 'graph-up', '', '', 100, 1, SYSDATE(), NULL, NULL, '在线用户菜单'),
-    (1091, '在线查询', 131, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1092, '批量强退', 131, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', 'box-arrow-right', 'btn btn-light-danger', 'handleBatchLogout', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1093, '单条强退', 131, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', 'arrow-bar-right', 'btn btn-light-danger', 'handleForceLogout', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (132, '缓存监控', 3, 2, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache', 'file-slides', '', '', 100, 1, SYSDATE(), NULL, NULL, '缓存监控菜单'),
+    (3, '系统运行监控', 0, 3, 'monitor', NULL, '', 1, 0, 'M', '0', '0', '', 'display', '', '', 100, 1, SYSDATE(), NULL,
+     NULL, '系统监控目录'),
+    (131, '在线用户', 3, 1, 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online', 'graph-up', '',
+     '', 100, 1, SYSDATE(), NULL, NULL, '在线用户菜单'),
+    (1091, '在线查询', 131, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', 'eye', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+    (1092, '批量强退', 131, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', 'box-arrow-right',
+     'btn btn-light-danger', 'handleBatchLogout', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1093, '单条强退', 131, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', 'arrow-bar-right',
+     'btn btn-light-danger', 'handleForceLogout', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+    (132, '缓存监控', 3, 2, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache', 'file-slides', '',
+     '', 100, 1, SYSDATE(), NULL, NULL, '缓存监控菜单'),
 
     -- 系统工具
-    (90, '系统工具', '0', 90, 'tool', NULL, '', 1, 0, 'M', '0', '0', '', 'code-slash', '', '', 100, 1, SYSDATE(), NULL, NULL, '系统工具目录'),
-    # (140, '表单构建', 90, '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build', 'file-code',         '', '', 100, 1, sysdate(), null, null, '表单构建菜单'),
-    (141, '代码生成', 90, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen', 'code-square', '', '', 100, 1, SYSDATE(), NULL, NULL, '代码生成菜单'),
-    (1101, '生成查询', 141, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1102, '导入代码', 141, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', 'cloud-upload', 'btn btn-light-primary', 'handleImport', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1103, '生成修改', 141, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1104, '生成删除', 141, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1105, '预览代码', 141, 5, '#', '', '', 1, 0, 'F', '1', '0', 'tool:gen:preview', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-    (1106, '生成代码', 141, 6, '#', '', '', 1, 0, 'F', '1', '0', 'tool:gen:code', 'code-slash', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-
-    (91, '演示示例', 0, 91, 'demo', NULL, '', 1, 0, 'M', '0', '0', '', 'emoji-smile-fill', '', '', 100, 1, SYSDATE(), NULL, NULL, '系统工具目录');
+    (90, '系统工具', '0', 90, 'tool', NULL, '', 1, 0, 'M', '0', '0', '', 'code-slash', '', '', 100, 1, SYSDATE(), NULL,
+     NULL, '系统工具目录'), #(140, '表单构建', 90, '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0',
+                              'tool:build', 'file-code', '', '', 100, 1, sysdate(), null, null, '表单构建菜单'),
+    (141, '代码生成', 90, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen', 'code-square', '', '', 100,
+     1, SYSDATE(), NULL, NULL, '代码生成菜单'),
+    (1101, '生成查询', 141, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', 'eye', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, ''),
+    (1102, '导入代码', 141, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', 'cloud-upload',
+     'btn btn-light-primary', 'handleImport', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1103, '生成修改', 141, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', 'pencil-square',
+     'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1104, '生成删除', 141, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', 'dash-square',
+     'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+    (1105, '预览代码', 141, 5, '#', '', '', 1, 0, 'F', '1', '0', 'tool:gen:preview', 'eye', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, ''),
+    (1106, '生成代码', 141, 6, '#', '', '', 1, 0, 'F', '1', '0', 'tool:gen:code', 'code-slash', '', '', 100, 1,
+     SYSDATE(), NULL, NULL, ''),
+
+    (91, '演示示例', 0, 91, 'demo', NULL, '', 1, 0, 'M', '0', '0', '', 'emoji-smile-fill', '', '', 100, 1, SYSDATE(),
+     NULL, NULL, '系统工具目录');
 
 -- ----------------------------
 -- 初始化-租户表数据
 -- ----------------------------
-INSERT INTO sys_tenant (id, tenant_id, contact_user_name, contact_phone, company_name, license_number, address, intro, domain, remark, package_id, expire_time, account_count, status, del_flag, create_org, create_by, create_time, update_by, update_time)
-VALUES (1, '000000', '管理组', '15888888888', 'XXX有限公司', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL, NULL, -1, '0', '0', 100, 1, SYSDATE(), NULL, NULL);
+INSERT INTO sys_tenant (id, tenant_id, contact_user_name, contact_phone, company_name, license_number, address, intro,
+                        domain, remark, package_id, expire_time, account_count, status, del_flag, create_org, create_by,
+                        create_time, update_by, update_time)
+VALUES (1, '000000', '管理组', '15888888888', 'XXX有限公司', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL,
+        NULL, -1, '0', '0', 100, 1, SYSDATE(), NULL, NULL);
 
 -- ----------------------------
 -- 初始化-用户和角色关联表数据
@@ -786,7 +911,8 @@ VALUES (1, 1),
        (2, 1);
 
 
-INSERT INTO sys_dict_type (dict_id, tenant_id, dict_name, dict_type, create_org, create_by, create_time, update_by, update_time, remark)
+INSERT INTO sys_dict_type (dict_id, tenant_id, dict_name, dict_type, create_org, create_by, create_time, update_by,
+                           update_time, remark)
 VALUES (1, '000000', '用户性别', 'sys_user_sex', 100, 1, SYSDATE(), NULL, NULL, '用户性别列表'),
        (2, '000000', '隐藏状态', 'sys_show_hide', 100, 1, SYSDATE(), NULL, NULL, '菜单隐藏状态列表(1隐藏0显示)'),
        (3, '000000', '启用状态', 'sys_normal_disable', 100, 1, SYSDATE(), NULL, NULL, '系统启用状态列表'),
@@ -799,20 +925,25 @@ VALUES (1, '000000', '用户性别', 'sys_user_sex', 100, 1, SYSDATE(), NULL, NU
        (12, '000000', '设备类型', 'sys_device_type', 100, 1, SYSDATE(), NULL, NULL, '客户端设备类型');
 
 
-INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_org, create_by, create_time, update_by, update_time, remark)
+INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,
+                          is_default, create_org, create_by, create_time, update_by, update_time, remark)
 VALUES (1, '000000', 1, '男', '0', 'sys_user_sex', '', 'primary', 'Y', 100, 1, SYSDATE(), NULL, NULL, '性别男'),
        (2, '000000', 2, '女', '1', 'sys_user_sex', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '性别女'),
        (3, '000000', 3, '未知', '2', 'sys_user_sex', '', 'warning', 'N', 100, 1, SYSDATE(), NULL, NULL, '性别未知'),
        (4, '000000', 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', 100, 1, SYSDATE(), NULL, NULL, '显示菜单'),
        (5, '000000', 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '隐藏菜单'),
-       (6, '000000', 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', 100, 1, SYSDATE(), NULL, NULL, '正常状态'),
-       (7, '000000', 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '停用状态'),
+       (6, '000000', 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', 100, 1, SYSDATE(), NULL, NULL,
+        '正常状态'),
+       (7, '000000', 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '停用状态'),
        (12, '000000', 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', 100, 1, SYSDATE(), NULL, NULL, '系统默认是'),
        (13, '000000', 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '系统默认否'),
        (14, '000000', 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', 100, 1, SYSDATE(), NULL, NULL, '通知'),
        (15, '000000', 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', 100, 1, SYSDATE(), NULL, NULL, '公告'),
-       (16, '000000', 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', 100, 1, SYSDATE(), NULL, NULL, '正常状态'),
-       (17, '000000', 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '关闭状态'),
+       (16, '000000', 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', 100, 1, SYSDATE(), NULL, NULL,
+        '正常状态'),
+       (17, '000000', 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '关闭状态'),
        (29, '000000', 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', 100, 1, SYSDATE(), NULL, NULL, '其他操作'),
        (18, '000000', 1, '新增', '1', 'sys_oper_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '新增操作'),
        (19, '000000', 2, '修改', '2', 'sys_oper_type', '', 'success', 'N', 100, 1, SYSDATE(), NULL, NULL, '修改操作'),
@@ -821,50 +952,76 @@ VALUES (1, '000000', 1, '男', '0', 'sys_user_sex', '', 'primary', 'Y', 100, 1,
        (22, '000000', 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', 100, 1, SYSDATE(), NULL, NULL, '导出操作'),
        (23, '000000', 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', 100, 1, SYSDATE(), NULL, NULL, '导入操作'),
        (24, '000000', 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '强退操作'),
-       (25, '000000', 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', 100, 1, SYSDATE(), NULL, NULL, '生成操作'),
-       (26, '000000', 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '清空操作'),
-       (27, '000000', 1, '成功', '0', 'sys_common_status', '', 'success', 'N', 100, 1, SYSDATE(), NULL, NULL, '正常状态'),
-       (28, '000000', 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '停用状态'),
-       (30, '000000', 0, '密码认证', 'password', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '密码认证'),
-       (31, '000000', 0, '短信认证', 'sms', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '短信认证'),
-       (32, '000000', 0, '邮件认证', 'email', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '邮件认证'),
-       (33, '000000', 0, '小程序认证', 'xcx', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '小程序认证'),
-       (34, '000000', 0, '三方登录认证', 'social', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '三方登录认证'),
+       (25, '000000', 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '生成操作'),
+       (26, '000000', 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '清空操作'),
+       (27, '000000', 1, '成功', '0', 'sys_common_status', '', 'success', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '正常状态'),
+       (28, '000000', 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '停用状态'),
+       (30, '000000', 0, '密码认证', 'password', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '密码认证'),
+       (31, '000000', 0, '短信认证', 'sms', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '短信认证'),
+       (32, '000000', 0, '邮件认证', 'email', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '邮件认证'),
+       (33, '000000', 0, '小程序认证', 'xcx', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '小程序认证'),
+       (34, '000000', 0, '三方登录认证', 'social', 'sys_grant_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '三方登录认证'),
        (35, '000000', 0, 'PC', 'pc', 'sys_device_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, 'PC'),
-       (36, '000000', 0, '安卓', 'android', 'sys_device_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '安卓'),
+       (36, '000000', 0, '安卓', 'android', 'sys_device_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '安卓'),
        (37, '000000', 0, 'iOS', 'ios', 'sys_device_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, 'iOS'),
-       (38, '000000', 0, '小程序', 'xcx', 'sys_device_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '小程序');
+       (38, '000000', 0, '小程序', 'xcx', 'sys_device_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '小程序');
 
 
 -- ----------------------------
 -- 初始化-参数配置表数据
 -- ----------------------------
-INSERT INTO sys_config (config_id, tenant_id, config_name, config_key, config_value, config_type, create_org, create_by, create_time, update_by, update_time, remark)
-VALUES (1, '000000', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 100, 1, SYSDATE(), NULL, NULL, '初始化密码 123456'),
-       (2, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 100, 1, SYSDATE(), NULL, NULL, '是否开启注册用户功能(true开启,false关闭)'),
-       (3, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 100, 1, SYSDATE(), NULL, NULL, 'true:开启, false:关闭');
+INSERT INTO sys_config (config_id, tenant_id, config_name, config_key, config_value, config_type, create_org, create_by,
+                        create_time, update_by, update_time, remark)
+VALUES (1, '000000', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 100, 1, SYSDATE(), NULL, NULL,
+        '初始化密码 123456'),
+       (2, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 100, 1, SYSDATE(), NULL,
+        NULL, '是否开启注册用户功能(true开启,false关闭)'),
+       (3, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 100, 1, SYSDATE(), NULL, NULL,
+        'true:开启, false:关闭');
 
 
 -- ----------------------------
 -- 初始化-公告信息表数据
 -- ----------------------------
-# INSERT INTO sys_notice (notice_id, tenant_id, notice_title, notice_type, notice_content, status, create_org, create_by, create_time, update_by, update_time, remark)
+#
+INSERT INTO sys_notice (notice_id, tenant_id, notice_title, notice_type, notice_content, status, create_org, create_by, create_time, update_by, update_time, remark)
 # VALUES ('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', 2, '新版本内容', '0', 100, 1, SYSDATE(), NULL, NULL, '管理员'),
 #        (2, '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容', '0', 100, 1, SYSDATE(), NULL, NULL, '管理员');
 
 -- ----------------------------
 -- 初始化-文件服务配置表数据
 -- ----------------------------
-INSERT INTO sys_oss_config (oss_config_id, tenant_id, config_key, access_key, secret_key, bucket_name, prefix, endpoint, domain, is_https, region, access_policy, status, ext1, create_org, create_by, create_time, update_by, update_time, remark)
-VALUES (1, '000000', 'local', '', '', '/preview/', '', '', '', 'N', '', '1', '0', '', 100, 1, SYSDATE(), 1, SYSDATE(), NULL),
-       (2, '000000', 'qiniu', 'x', 'x', 'vber', '', 's3-cn-north-1.qiniucs.com', '', 'N', '', '1', '1', '', 100, 1, SYSDATE(), 1, SYSDATE(), NULL),
-       (3, '000000', 'aliyun', 'x', 'x', 'vber', '', 'oss-cn-beijing.aliyuncs.com', '', 'N', '', '1', '1', '', 100, 1, SYSDATE(), 1, SYSDATE(), NULL),
-       (4, '000000', 'qcloud', 'x', 'x', 'vber-1250000000', '', 'cos.ap-beijing.myqcloud.com', '', 'N', 'ap-beijing', '1', '1', '', 100, 1, SYSDATE(), 1, SYSDATE(), NULL),
-       (5, '000000', 'minio', 'vber', 'vber123', 'vber', 'image', '127.0.0.1:9000', '', 'N', '', '1', '1', '', 100, 1, SYSDATE(), 1, SYSDATE(), NULL);
+INSERT INTO sys_oss_config (oss_config_id, tenant_id, config_key, access_key, secret_key, bucket_name, prefix, endpoint,
+                            domain, is_https, region, access_policy, status, ext1, create_org, create_by, create_time,
+                            update_by, update_time, remark)
+VALUES (1, '000000', 'local', '', '', '/preview/', '', '', '', 'N', '', '1', '0', '', 100, 1, SYSDATE(), 1, SYSDATE(),
+        NULL),
+       (2, '000000', 'qiniu', 'x', 'x', 'vber', '', 's3-cn-north-1.qiniucs.com', '', 'N', '', '1', '1', '', 100, 1,
+        SYSDATE(), 1, SYSDATE(), NULL),
+       (3, '000000', 'aliyun', 'x', 'x', 'vber', '', 'oss-cn-beijing.aliyuncs.com', '', 'N', '', '1', '1', '', 100, 1,
+        SYSDATE(), 1, SYSDATE(), NULL),
+       (4, '000000', 'qcloud', 'x', 'x', 'vber-1250000000', '', 'cos.ap-beijing.myqcloud.com', '', 'N', 'ap-beijing',
+        '1', '1', '', 100, 1, SYSDATE(), 1, SYSDATE(), NULL),
+       (5, '000000', 'minio', 'vber', 'vber123', 'vber', 'image', '127.0.0.1:9000', '', 'N', '', '1', '1', '', 100, 1,
+        SYSDATE(), 1, SYSDATE(), NULL);
 
 -- ----------------------------
 -- 初始化-客户端表数据
 -- ----------------------------
-INSERT INTO sys_client (id, client_id, client_key, client_secret, grant_type, device_type, active_timeout, timeout, status, del_flag, create_org, create_by, create_time, update_by, update_time)
-VALUES (1, '9579f8780cf24ae2959d03d11482b18a', 'pc', 'iwb123', 'password,social', 'pc', 1800, 604800, 0, 0, 100, 1, SYSDATE(), 1, SYSDATE()),
-       (2, '35aee70ae7224eb9a48bc527955ddedc', 'app', 'iwb123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 100, 1, SYSDATE(), 1, SYSDATE());
+INSERT INTO sys_client (id, client_id, client_key, client_secret, grant_type, device_type, active_timeout, timeout,
+                        status, del_flag, create_org, create_by, create_time, update_by, update_time)
+VALUES (1, '9579f8780cf24ae2959d03d11482b18a', 'pc', 'iwb123', 'password,social', 'pc', 1800, 604800, 0, 0, 100, 1,
+        SYSDATE(), 1, SYSDATE()),
+       (2, '35aee70ae7224eb9a48bc527955ddedc', 'app', 'iwb123', 'password,sms,social', 'android', 1800, 604800, 0, 0,
+        100, 1, SYSDATE(), 1, SYSDATE());

+ 217 - 118
SERVER/VberAdminPlusV3/.script/sql/flow.sql

@@ -1,34 +1,35 @@
-USE `VberAdminPlusV3`;
+USE
+`VberAdminPlusV3`;
 -- ----------------------------
 -- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/mysql/warm-flow-all.sql
 -- ----------------------------
 CREATE TABLE `flow_definition`
 (
-    `id`              bigint          NOT NULL AUTO_INCREMENT COMMENT '主键id',
-    `flow_code`       varchar(40)     NOT NULL COMMENT '流程编码',
-    `flow_name`       varchar(100)    NOT NULL COMMENT '流程名称',
-    `category`        varchar(100)             DEFAULT NULL COMMENT '流程类别',
-    `version`         varchar(20)     NOT NULL COMMENT '流程版本',
+    `id`              bigint       NOT NULL AUTO_INCREMENT COMMENT '主键id',
+    `flow_code`       varchar(40)  NOT NULL COMMENT '流程编码',
+    `flow_name`       varchar(100) NOT NULL COMMENT '流程名称',
+    `category`        varchar(100) DEFAULT NULL COMMENT '流程类别',
+    `version`         varchar(20)  NOT NULL COMMENT '流程版本',
     `is_publish`      tinyint(1)      NOT NULL DEFAULT '0' COMMENT '是否发布(0未发布 1已发布 9失效)',
-    `form_custom`     char(1)                  DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
-    `form_path`       varchar(100)             DEFAULT NULL COMMENT '审批表单路径',
+    `form_custom`     char(1)      DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
+    `form_path`       varchar(100) DEFAULT NULL COMMENT '审批表单路径',
     `activity_status` tinyint(1)      NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)',
-    `listener_type`   varchar(100)             DEFAULT NULL COMMENT '监听器类型',
-    `listener_path`   varchar(400)             DEFAULT NULL COMMENT '监听器路径',
-    `ext`             varchar(500)             DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串',
-    `create_time`     datetime                 DEFAULT NULL COMMENT '创建时间',
-    `update_time`     datetime                 DEFAULT NULL COMMENT '更新时间',
-    `del_flag`        char(1)                  DEFAULT '0' COMMENT '删除标志',
-    `tenant_id`       varchar(40)              DEFAULT NULL COMMENT '租户id',
+    `listener_type`   varchar(100) DEFAULT NULL COMMENT '监听器类型',
+    `listener_path`   varchar(400) DEFAULT NULL COMMENT '监听器路径',
+    `ext`             varchar(500) DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串',
+    `create_time`     datetime     DEFAULT NULL COMMENT '创建时间',
+    `update_time`     datetime     DEFAULT NULL COMMENT '更新时间',
+    `del_flag`        char(1)      DEFAULT '0' COMMENT '删除标志',
+    `tenant_id`       varchar(40)  DEFAULT NULL COMMENT '租户id',
     PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB COMMENT ='流程定义表';
 
 CREATE TABLE `flow_node`
 (
-    `id`              bigint        NOT NULL AUTO_INCREMENT COMMENT '主键id',
+    `id`              bigint       NOT NULL AUTO_INCREMENT COMMENT '主键id',
     `node_type`       tinyint(1)      NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
-    `definition_id`   bigint          NOT NULL COMMENT '流程定义id',
-    `node_code`       varchar(100)    NOT NULL COMMENT '流程节点编码',
+    `definition_id`   bigint       NOT NULL COMMENT '流程定义id',
+    `node_code`       varchar(100) NOT NULL COMMENT '流程节点编码',
     `node_name`       varchar(100)  DEFAULT NULL COMMENT '流程节点名称',
     `permission_flag` varchar(200)  DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用@@隔开)',
     `node_ratio`      decimal(6, 3) DEFAULT NULL COMMENT '流程签署比例值',
@@ -40,10 +41,10 @@ CREATE TABLE `flow_node`
     `handler_path`    varchar(400)  DEFAULT NULL COMMENT '处理器路径',
     `form_custom`     char(1)       DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
     `form_path`       varchar(100)  DEFAULT NULL COMMENT '审批表单路径',
-    `version`         varchar(20)     NOT NULL COMMENT '版本',
+    `version`         varchar(20)  NOT NULL COMMENT '版本',
     `create_time`     datetime      DEFAULT NULL COMMENT '创建时间',
     `update_time`     datetime      DEFAULT NULL COMMENT '更新时间',
-    `ext`             text          COMMENT '扩展属性',
+    `ext`             text COMMENT '扩展属性',
     `del_flag`        char(1)       DEFAULT '0' COMMENT '删除标志',
     `tenant_id`       varchar(40)   DEFAULT NULL COMMENT '租户id',
     PRIMARY KEY (`id`) USING BTREE
@@ -52,10 +53,10 @@ CREATE TABLE `flow_node`
 CREATE TABLE `flow_skip`
 (
     `id`             bigint       NOT NULL AUTO_INCREMENT COMMENT '主键id',
-    `definition_id`  bigint          NOT NULL COMMENT '流程定义id',
-    `now_node_code`  varchar(100)    NOT NULL COMMENT '当前流程节点的编码',
+    `definition_id`  bigint       NOT NULL COMMENT '流程定义id',
+    `now_node_code`  varchar(100) NOT NULL COMMENT '当前流程节点的编码',
     `now_node_type`  tinyint(1)   DEFAULT NULL COMMENT '当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
-    `next_node_code` varchar(100)    NOT NULL COMMENT '下一个流程节点的编码',
+    `next_node_code` varchar(100) NOT NULL COMMENT '下一个流程节点的编码',
     `next_node_type` tinyint(1)   DEFAULT NULL COMMENT '下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
     `skip_name`      varchar(100) DEFAULT NULL COMMENT '跳转名称',
     `skip_type`      varchar(40)  DEFAULT NULL COMMENT '跳转类型(PASS审批通过 REJECT退回)',
@@ -75,17 +76,17 @@ CREATE TABLE `flow_instance`
     `business_id`     varchar(40) NOT NULL COMMENT '业务id',
     `node_type`       tinyint(1)  NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
     `node_code`       varchar(40) NOT NULL COMMENT '流程节点编码',
-    `node_name`       varchar(100)         DEFAULT NULL COMMENT '流程节点名称',
+    `node_name`       varchar(100) DEFAULT NULL COMMENT '流程节点名称',
     `variable`        text COMMENT '任务变量',
     `flow_status`     varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
     `activity_status` tinyint(1)  NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)',
     `def_json`        text COMMENT '流程定义json',
-    `create_by`       varchar(64)          DEFAULT '' COMMENT '创建者',
-    `create_time`     datetime             DEFAULT NULL COMMENT '创建时间',
-    `update_time`     datetime             DEFAULT NULL COMMENT '更新时间',
-    `ext`             TEXT                 DEFAULT NULL COMMENT '扩展字段,预留给业务系统使用',
-    `del_flag`        char(1)              DEFAULT '0' COMMENT '删除标志',
-    `tenant_id`       varchar(40)          DEFAULT NULL COMMENT '租户id',
+    `create_by`       varchar(64)  DEFAULT '' COMMENT '创建者',
+    `create_time`     datetime     DEFAULT NULL COMMENT '创建时间',
+    `update_time`     datetime     DEFAULT NULL COMMENT '更新时间',
+    `ext`             TEXT         DEFAULT NULL COMMENT '扩展字段,预留给业务系统使用',
+    `del_flag`        char(1)      DEFAULT '0' COMMENT '删除标志',
+    `tenant_id`       varchar(40)  DEFAULT NULL COMMENT '租户id',
     PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB COMMENT ='流程实例表';
 
@@ -113,43 +114,68 @@ CREATE TABLE `flow_his_task`
     `definition_id`    bigint(20)          NOT NULL COMMENT '对应flow_definition表的id',
     `instance_id`      bigint(20)          NOT NULL COMMENT '对应flow_instance表的id',
     `task_id`          bigint(20)          NOT NULL COMMENT '对应flow_task表的id',
-    `node_code`        varchar(100)                 DEFAULT NULL COMMENT '开始节点编码',
-    `node_name`        varchar(100)                 DEFAULT NULL COMMENT '开始节点名称',
+    `node_code`        varchar(100) DEFAULT NULL COMMENT '开始节点编码',
+    `node_name`        varchar(100) DEFAULT NULL COMMENT '开始节点名称',
     `node_type`        tinyint(1)                   DEFAULT NULL COMMENT '开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
-    `target_node_code` varchar(200)                 DEFAULT NULL COMMENT '目标节点编码',
-    `target_node_name` varchar(200)                 DEFAULT NULL COMMENT '结束节点名称',
-    `approver`         varchar(40)                  DEFAULT NULL COMMENT '审批者',
+    `target_node_code` varchar(200) DEFAULT NULL COMMENT '目标节点编码',
+    `target_node_name` varchar(200) DEFAULT NULL COMMENT '结束节点名称',
+    `approver`         varchar(40)  DEFAULT NULL COMMENT '审批者',
     `cooperate_type`   tinyint(1)          NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)',
-    `collaborator`     varchar(40)                  DEFAULT NULL COMMENT '协作人',
-    `skip_type`        varchar(10)         NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)',
-    `flow_status`      varchar(20)         NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
-    `form_custom`      char(1)                      DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
-    `form_path`        varchar(100)                 DEFAULT NULL COMMENT '审批表单路径',
-    `message`          varchar(500)                 DEFAULT NULL COMMENT '审批意见',
-    `variable`         TEXT                         DEFAULT NULL COMMENT '任务变量',
-    `ext`              TEXT                         DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串',
-    `create_time`      datetime                     DEFAULT NULL COMMENT '任务开始时间',
-    `update_time`      datetime                     DEFAULT NULL COMMENT '审批完成时间',
-    `del_flag`         char(1)                      DEFAULT '0' COMMENT '删除标志',
-    `tenant_id`        varchar(40)                  DEFAULT NULL COMMENT '租户id',
+    `collaborator`     varchar(40)  DEFAULT NULL COMMENT '协作人',
+    `skip_type`        varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)',
+    `flow_status`      varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
+    `form_custom`      char(1)      DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
+    `form_path`        varchar(100) DEFAULT NULL COMMENT '审批表单路径',
+    `message`          varchar(500) DEFAULT NULL COMMENT '审批意见',
+    `variable`         TEXT         DEFAULT NULL COMMENT '任务变量',
+    `ext`              TEXT         DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串',
+    `create_time`      datetime     DEFAULT NULL COMMENT '任务开始时间',
+    `update_time`      datetime     DEFAULT NULL COMMENT '审批完成时间',
+    `del_flag`         char(1)      DEFAULT '0' COMMENT '删除标志',
+    `tenant_id`        varchar(40)  DEFAULT NULL COMMENT '租户id',
     PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB COMMENT ='历史任务记录表';
 
+CREATE TABLE `flow_spel`
+(
+    `id`             bigint(20) NOT NULL COMMENT '主键id',
+    `component_name` varchar(255) DEFAULT NULL COMMENT '组件名称',
+    `method_name`    varchar(255) DEFAULT NULL COMMENT '方法名',
+    `method_params`  varchar(255) DEFAULT NULL COMMENT '参数',
+    `view_spel`      varchar(255) DEFAULT NULL COMMENT '预览spel表达式',
+    `remark`         varchar(255) DEFAULT NULL COMMENT '备注',
+    `status`         char(1)      DEFAULT '0' COMMENT '状态(0正常 1停用)',
+    `del_flag`       char(1)      DEFAULT '0' COMMENT '删除标志',
+    `create_org`     bigint(20) DEFAULT NULL COMMENT '创建组织机构',
+    `create_by`      bigint(20) DEFAULT NULL COMMENT '创建者',
+    `create_time`    datetime     DEFAULT NULL COMMENT '创建时间',
+    `update_by`      bigint(20) DEFAULT NULL COMMENT '更新者',
+    `update_time`    datetime     DEFAULT NULL COMMENT '更新时间',
+    PRIMARY KEY (`id`)
+) ENGINE = InnoDB COMMENT='流程spel表达式定义表';
+
+
+INSERT INTO `flow_spel` (`id`, `component_name`, `method_name`, `method_params`, `view_spel`, `remark`, `status`,
+                         `del_flag`, `create_org`, `create_by`, `create_time`, `update_by`, `update_time`)
+VALUES (1, 'spelRuleComponent', 'selectOrgLeaderById', 'initiatorOrgId',
+        '#{@spelRuleComponent.selectOrgLeaderById(#initiatorOrgId)}', '根据组织机构id获取组织机构负责人', '0', '0', 100,
+        1, sysdate(), 1, sysdate()),
+       (2, NULL, NULL, 'initiator', '${initiator}', '流程发起人', '0', '0', 103, 1, sysdate(), 1, sysdate());
 
 CREATE TABLE `flow_user`
 (
-    `id`           bigint      NOT NULL AUTO_INCREMENT COMMENT '主键id',
-    `type`         char(1)         NOT NULL COMMENT '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)',
+    `id`           bigint  NOT NULL AUTO_INCREMENT COMMENT '主键id',
+    `type`         char(1) NOT NULL COMMENT '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)',
     `processed_by` varchar(80) DEFAULT NULL COMMENT '权限人',
-    `associated`   bigint          NOT NULL COMMENT '任务表id',
+    `associated`   bigint  NOT NULL COMMENT '任务表id',
     `create_time`  datetime    DEFAULT NULL COMMENT '创建时间',
     `create_by`    varchar(80) DEFAULT NULL COMMENT '创建人',
     `update_time`  datetime    DEFAULT NULL COMMENT '更新时间',
     `del_flag`     char(1)     DEFAULT '0' COMMENT '删除标志',
     `tenant_id`    varchar(40) DEFAULT NULL COMMENT '租户id',
     PRIMARY KEY (`id`) USING BTREE,
-    KEY `user_processed_type` (`processed_by`, `type`),
-    KEY `user_associated` (`associated`) USING BTREE
+    KEY            `user_processed_type` (`processed_by`, `type`),
+    KEY            `user_associated` (`associated`) USING BTREE
 ) ENGINE = InnoDB COMMENT ='流程用户表';
 
 -- ----------------------------
@@ -164,25 +190,36 @@ create table flow_category
     category_name varchar(30) not null comment '流程分类名称',
     order_num     int(4)       default 0 comment '显示顺序',
     del_flag      char(1)      default '0' comment '删除标志(0代表存在 1代表删除)',
-    create_org   bigint(20)  null comment '创建组织机构',
+    create_org    bigint(20)  null comment '创建组织机构',
     create_by     bigint(20)  null comment '创建者',
-    create_time   datetime    null comment '创建时间',
+    create_time   datetime null comment '创建时间',
     update_by     bigint(20)  null comment '更新者',
-    update_time   datetime    null comment '更新时间',
+    update_time   datetime null comment '更新时间',
     primary key (category_id)
 ) engine = innodb comment = '流程分类';
 
-INSERT INTO flow_category values (0, '000000', NULL, '', '根目录', 0, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (100, '000000', 0, '0', 'OA审批', 0, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (101, '000000', 100, '0,100', '假勤管理', 0, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (102, '000000', 100, '0,100', '人事管理', 1, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (103, '000000', 101, '0,100,101', '请假', 0, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (104, '000000', 101, '0,100,101', '出差', 1, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (105, '000000', 101, '0,100,101', '加班', 2, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (106, '000000', 101, '0,100,101', '换班', 3, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (107, '000000', 101, '0,100,101', '外出', 4, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (108, '000000', 102, '0,100,102', '转正', 1, '0', 100, 1, sysdate(), null, null);
-INSERT INTO flow_category values (109, '000000', 102, '0,100,102', '离职', 2, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (0, '000000', NULL, '', '根目录', 0, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (100, '000000', 0, '0', 'OA审批', 0, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (101, '000000', 100, '0,100', '假勤管理', 0, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (102, '000000', 100, '0,100', '人事管理', 1, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (103, '000000', 101, '0,100,101', '请假', 0, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (104, '000000', 101, '0,100,101', '出差', 1, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (105, '000000', 101, '0,100,101', '加班', 2, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (106, '000000', 101, '0,100,101', '换班', 3, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (107, '000000', 101, '0,100,101', '外出', 4, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (108, '000000', 102, '0,100,102', '转正', 1, '0', 100, 1, sysdate(), null, null);
+INSERT INTO flow_category
+values (109, '000000', 102, '0,100,102', '离职', 2, '0', 100, 1, sysdate(), null, null);
 
 -- ----------------------------
 -- 请假单信息
@@ -197,78 +234,140 @@ create table test_leave
     leave_days  int(10)      not null comment '请假天数',
     remark      varchar(255) null comment '请假原因',
     status      varchar(255) null comment '状态',
-    create_org bigint       null comment '创建组织机构',
-    create_by   bigint       null comment '创建者',
-    create_time datetime     null comment '创建时间',
-    update_by   bigint       null comment '更新者',
-    update_time datetime     null comment '更新时间',
+    create_org  bigint null comment '创建组织机构',
+    create_by   bigint null comment '创建者',
+    create_time datetime null comment '创建时间',
+    update_by   bigint null comment '更新者',
+    update_time datetime null comment '更新时间',
     PRIMARY KEY (id) USING BTREE
 ) ENGINE = InnoDB COMMENT = '请假申请表';
 
 -- 工作流菜单
-INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, btn_class, btn_script, create_org, create_by, create_time, update_by, update_time, remark)
-VALUES (4, '工作流', 0, 4, 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'table', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (151, '流程分类', 4, 1, 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category', 'bookmark-fill', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1121, '分类查询', 151, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1122, '分类新增', 151, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1123, '分类修改', 151, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1124, '分类删除', 151, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1125, '分类导出', 151, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache,
+                      menu_type, visible, status, perms, icon, btn_class, btn_script, create_org, create_by,
+                      create_time, update_by, update_time, remark)
+VALUES (4, '工作流', 0, 4, 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'table', '', '', 100, 1, SYSDATE(), NULL,
+        NULL, ''),
+       (151, '流程分类', 4, 1, 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category',
+        'bookmark-fill', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1121, '分类查询', 151, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', 'eye', '', '', 100, 1,
+        SYSDATE(), NULL, NULL, ''),
+       (1122, '分类新增', 151, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', 'plus-square',
+        'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1123, '分类修改', 151, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', 'pencil-square',
+        'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1124, '分类删除', 151, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', 'dash-square',
+        'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1125, '分类导出', 151, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', 'cloud-download',
+        'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+
+       (153, '流程定义', 4, 3, 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0',
+        'workflow:definition', 'aspect-ratio-fill', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1131, '流程查询', 153, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:query', 'eye', '', '', 100, 1,
+        SYSDATE(), NULL, NULL, ''),
+       (1132, '流程新增', 153, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:add', 'plus-square',
+        'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1133, '流程修改', 153, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:edit', 'pencil-square',
+        'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1134, '流程删除', 153, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:remove', 'dash-square',
+        'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1135, '部署流程', 153, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:upload', 'cloud-upload',
+        'btn btn-light-success', 'handleUpload', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1136, '导出流程', 153, 6, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:export', 'cloud-download',
+        'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1137, '复制流程', 153, 7, '#', '', '', 1, 0, 'F', '1', '0', 'workflow:definition:copy', 'cloud-download',
+        'btn btn-light-info', 'handleCopy', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1138, '发布流程', 153, 8, '#', '', '', 1, 0, 'F', '1', '0', 'workflow:definition:publish', 'cloud-download',
+        'btn btn-light-info', 'handlePublish', 100, 1, SYSDATE(), NULL, NULL, ''),
 
-       (153, '流程定义', 4, 3, 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', 'workflow:definition', 'aspect-ratio-fill', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1131, '流程查询', 153, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1132, '流程新增', 153, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1133, '流程修改', 153, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1134, '流程删除', 153, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1135, '部署流程', 153, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:upload', 'cloud-upload', 'btn btn-light-success', 'handleUpload', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1136, '导出流程', 153, 6, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1137, '复制流程', 153, 7, '#', '', '', 1, 0, 'F', '1', '0', 'workflow:definition:copy', 'cloud-download', 'btn btn-light-info', 'handleCopy', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1138, '发布流程', 153, 8, '#', '', '', 1, 0, 'F', '1', '0', 'workflow:definition:publish', 'cloud-download', 'btn btn-light-info', 'handlePublish', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (154, '流程监控', 4, 4, 'wf_monitor', '', '', '1', '0', 'M', '0', '0', 'workflow:monitor', 'display', '', '',
+        100, 1, SYSDATE(), NULL, NULL, ''),
+       (155, '流程实例', 154, 1, 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0',
+        'workflow:monitor:instance', 'database', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (156, '待办任务', 154, 2, 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0',
+        'workflow:monitor:task', 'list-task', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
 
-       (154, '流程监控', 4, 4, 'wf_monitor', '', '', '1', '0', 'M', '0', '0', 'workflow:monitor', 'display', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (155, '流程实例', 154, 1, 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', 'workflow:monitor:instance', 'database', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (156, '待办任务', 154, 2, 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', 'workflow:monitor:task', 'list-task', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (157, '流程spel表达式', 4, 5, 'spel', 'workflow/spel/index', '', 1, 0, 'C', '0', '0', 'workflow:spel', 'input',
+        '', '', 100, 1, sysdate(), 1, sysdate(), '流程spel达式定义菜单'),
+       (1141, '流程spel达式查询', 157, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:spel:query', 'eye', '', '', 100,
+        1, sysdate(), NULL, NULL, ''),
+       (1142, '流程spel达式新增', 157, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:spel:add', 'plus-square',
+        'btn btn-light-primary', 'handleCreate', 100, 1, sysdate(), NULL, NULL, ''),
+       (1143, '流程spel达式修改', 157, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:spel:edit', 'pencil-square',
+        'btn btn-light-success', 'handleUpdate@1', 100, 1, sysdate(), NULL, NULL, ''),
+       (1144, '流程spel达式删除', 157, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:spel:remove', 'dash-square',
+        'btn btn-light-danger', 'handleDelete@0', 100, 1, sysdate(), NULL, NULL, ''),
+       (1145, '流程spel达式导出', 157, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:spel:export', 'cloud-download',
+        'btn btn-light-info', 'handleExport', 100, 1, sysdate(), NULL, NULL, ''),
 
-       (5, '我的任务', 0, 5, 'task', '', '', '1', '0', 'M', '1', '0', 'workflow:task', 'award', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (161, '我发起的', 5, 1, 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '1', '0', 'workflow:task:my', 'file-person', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (162, '我的待办', 5, 2, 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '1', '0', 'workflow:task:wait', 'person-fill-exclamation', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (163, '我的已办', 5, 3, 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '1', '0', 'workflow:task:finish', 'person-fill-check', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (164, '我的抄送', 5, 4, 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '1', '0', 'workflow:task:copy', 'person-fill-up', '', '', 100, 1, SYSDATE(), NULL, NULL, '');
+       (5, '我的任务', 0, 5, 'task', '', '', '1', '0', 'M', '1', '0', 'workflow:task', 'award', '', '', 100, 1,
+        SYSDATE(), NULL, NULL, ''),
+       (161, '我发起的', 5, 1, 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '1', '0',
+        'workflow:task:my', 'file-person', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (162, '我的待办', 5, 2, 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '1', '0',
+        'workflow:task:wait', 'person-fill-exclamation', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (163, '我的已办', 5, 3, 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '1', '0',
+        'workflow:task:finish', 'person-fill-check', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (164, '我的抄送', 5, 4, 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '1', '0',
+        'workflow:task:copy', 'person-fill-up', '', '', 100, 1, SYSDATE(), NULL, NULL, '');
 
 -- 请假申请菜单
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, btn_class, btn_script, create_org, create_by, create_time, update_by, update_time, remark)
-VALUES (171, '请假申请', 91, 1, 'leaveApply', 'demo/leave/index', 1, 0, 'C', '0', '0', 'demo:leave', '#', '', '', 100, 1, SYSDATE(), NULL, NULL, '请假申请菜单'),
-       (1201, '申请查询', 171, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1202, '申请新增', 171, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1203, '申请修改', 171, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1204, '申请删除', 171, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1205, '申请导出', 171, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
+                     status, perms, icon, btn_class, btn_script, create_org, create_by, create_time, update_by,
+                     update_time, remark)
+VALUES (171, '请假申请', 91, 1, 'leaveApply', 'demo/leave/index', 1, 0, 'C', '0', '0', 'demo:leave', '#', '', '', 100,
+        1, SYSDATE(), NULL, NULL, '请假申请菜单'),
+       (1201, '申请查询', 171, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', 'eye', '', '', 100, 1, SYSDATE(),
+        NULL, NULL, ''),
+       (1202, '申请新增', 171, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', 'plus-square',
+        'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1203, '申请修改', 171, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', 'pencil-square',
+        'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1204, '申请删除', 171, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', 'dash-square',
+        'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
+       (1205, '申请导出', 171, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', 'cloud-download',
+        'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, '');
 
 -- 业务状态字典
-INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_org, create_by, create_time, update_by, update_time, remark)
+INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_org, create_by, create_time, update_by,
+                          update_time, remark)
 VALUES (21, '000000', '业务状态', 'wf_business_status', 100, 1, SYSDATE(), NULL, NULL, '业务状态列表'),
        (22, '000000', '表单类型', 'wf_form_type', 100, 1, SYSDATE(), NULL, NULL, '表单类型列表'),
        (15, '000000', '任务状态', 'wf_task_status', 100, 1, sysdate(), NULL, NULL, '任务状态');
 
-INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_org, create_by, create_time, update_by, update_time, remark)
-VALUES (51, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '已撤销'),
+INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,
+                          is_default, create_org, create_by, create_time, update_by, update_time, remark)
+VALUES (51, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '已撤销'),
        (52, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 100, 1, SYSDATE(), NULL, NULL, '草稿'),
-       (53, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '待审核'),
-       (54, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 100, 1, SYSDATE(), NULL, NULL, '已完成'),
-       (55, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '已作废'),
-       (56, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '已退回'),
-       (57, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL, '已终止'),
-       (61, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 100, 1, SYSDATE(), NULL, NULL, '自定义表单'),
-       (62, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL, '动态表单'),
+       (53, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '待审核'),
+       (54, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '已完成'),
+       (55, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '已作废'),
+       (56, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '已退回'),
+       (57, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 100, 1, SYSDATE(), NULL,
+        NULL, '已终止'),
+       (61, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '自定义表单'),
+       (62, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 100, 1, SYSDATE(), NULL, NULL,
+        '动态表单'),
        (71, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL, '撤销'),
        (72, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 100, 1, sysdate(), NULL, NULL, '通过'),
-       (73, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 100, 1, sysdate(), NULL, NULL, '待审核'),
+       (73, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 100, 1, sysdate(), NULL, NULL,
+        '待审核'),
        (74, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL, '作废'),
        (75, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL, '退回'),
-       (76, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL, '终止'),
-       (77, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 100, 1, sysdate(), NULL, NULL, '转办'),
+       (76, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL,
+        '终止'),
+       (77, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 100, 1, sysdate(), NULL, NULL,
+        '转办'),
        (78, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 100, 1, sysdate(), NULL, NULL, '委托'),
        (79, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 100, 1, sysdate(), NULL, NULL, '抄送'),
        (80, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 100, 1, sysdate(), NULL, NULL, '加签'),
-       (81, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL, '减签'),
-       (82, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL, '超时');
+       (81, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL,
+        '减签'),
+       (82, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 100, 1, sysdate(), NULL, NULL,
+        '超时');

+ 25 - 16
SERVER/VberAdminPlusV3/.script/sql/job.sql

@@ -43,21 +43,21 @@ CREATE TABLE `xxl_job_log`
     `id`                        BIGINT(20) NOT NULL AUTO_INCREMENT,
     `job_group`                 INT(11)    NOT NULL COMMENT '执行器主键ID',
     `job_id`                    INT(11)    NOT NULL COMMENT '任务,主键ID',
-    `executor_address`          VARCHAR(255)        DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
-    `executor_handler`          VARCHAR(255)        DEFAULT NULL COMMENT '执行器任务handler',
-    `executor_param`            VARCHAR(512)        DEFAULT NULL COMMENT '执行器任务参数',
-    `executor_sharding_param`   VARCHAR(20)         DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
+    `executor_address`          VARCHAR(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
+    `executor_handler`          VARCHAR(255) DEFAULT NULL COMMENT '执行器任务handler',
+    `executor_param`            VARCHAR(512) DEFAULT NULL COMMENT '执行器任务参数',
+    `executor_sharding_param`   VARCHAR(20)  DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
     `executor_fail_retry_count` INT(11)    NOT NULL DEFAULT '0' COMMENT '失败重试次数',
-    `trigger_time`              DATETIME            DEFAULT NULL COMMENT '调度-时间',
+    `trigger_time`              DATETIME     DEFAULT NULL COMMENT '调度-时间',
     `trigger_code`              INT(11)    NOT NULL COMMENT '调度-结果',
     `trigger_msg`               TEXT COMMENT '调度-日志',
-    `handle_time`               DATETIME            DEFAULT NULL COMMENT '执行-时间',
+    `handle_time`               DATETIME     DEFAULT NULL COMMENT '执行-时间',
     `handle_code`               INT(11)    NOT NULL COMMENT '执行-状态',
     `handle_msg`                TEXT COMMENT '执行-日志',
     `alarm_status`              TINYINT(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
     PRIMARY KEY (`id`),
-    KEY `I_trigger_time` (`trigger_time`),
-    KEY `I_handle_code` (`handle_code`)
+    KEY                         `I_trigger_time` (`trigger_time`),
+    KEY                         `I_handle_code` (`handle_code`)
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4;
 
@@ -65,11 +65,11 @@ DROP TABLE IF EXISTS `xxl_job_log_report`;
 CREATE TABLE `xxl_job_log_report`
 (
     `id`            INT(11) NOT NULL AUTO_INCREMENT,
-    `trigger_day`   DATETIME         DEFAULT NULL COMMENT '调度-时间',
+    `trigger_day`   DATETIME DEFAULT NULL COMMENT '调度-时间',
     `running_count` INT(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
     `suc_count`     INT(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
     `fail_count`    INT(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
-    `update_time`   DATETIME         DEFAULT NULL,
+    `update_time`   DATETIME DEFAULT NULL,
     PRIMARY KEY (`id`),
     UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
 ) ENGINE = InnoDB
@@ -98,7 +98,7 @@ CREATE TABLE `xxl_job_registry`
     `registry_value` VARCHAR(255) NOT NULL,
     `update_time`    DATETIME DEFAULT NULL,
     PRIMARY KEY (`id`),
-    KEY `i_g_k_v` (`registry_group`, `registry_key`, `registry_value`)
+    KEY              `i_g_k_v` (`registry_group`, `registry_key`, `registry_value`)
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4;
 
@@ -110,7 +110,7 @@ CREATE TABLE `xxl_job_group`
     `title`        VARCHAR(12) NOT NULL COMMENT '执行器名称',
     `address_type` TINYINT(4)  NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
     `address_list` TEXT COMMENT '执行器地址列表,多地址逗号分隔',
-    `update_time`  DATETIME             DEFAULT NULL,
+    `update_time`  DATETIME DEFAULT NULL,
     PRIMARY KEY (`id`)
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4;
@@ -139,13 +139,22 @@ CREATE TABLE `xxl_job_lock`
 INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`)
 VALUES (1, 'vber-job-executor', 'vber执行器', 0, NULL, SYSDATE());
 
-INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`)
-VALUES (1, 1, '演示任务01', SYSDATE(), SYSDATE(), 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', SYSDATE(), '');
+INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`,
+                           `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`,
+                           `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`,
+                           `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`,
+                           `child_jobid`)
+VALUES (1, 1, '演示任务01', SYSDATE(), SYSDATE(), 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST',
+        'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', SYSDATE(), '');
 
-# 密码:123iwb
+#
+密码
+:123iwb
 INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`)
 VALUES (1, 'admin', '17c5381f3f2036518b1d464ca1237fe9', 1, NULL);
-# 密码:123456
+#
+密码
+:123456
 INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`)
 VALUES (2, 'system', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
 

+ 10 - 5
SERVER/VberAdminPlusV3/.script/sql/sharding-test.sql

@@ -1,6 +1,8 @@
-# sharding-test.sql
+#
+sharding-test.sql
 SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
+SET
+FOREIGN_KEY_CHECKS = 0;
 
 DROP TABLE IF EXISTS `t_user_01`;
 CREATE TABLE `t_user_01`
@@ -146,12 +148,14 @@ CREATE TABLE `t_user_12`
   COLLATE = utf8_general_ci
   ROW_FORMAT = DYNAMIC;
 
-SET FOREIGN_KEY_CHECKS = 1;
+SET
+FOREIGN_KEY_CHECKS = 1;
 
 
 #ORDER
 SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
+SET
+FOREIGN_KEY_CHECKS = 0;
 
 DROP TABLE IF EXISTS `sys_order_1`;
 CREATE TABLE `sys_order_1`
@@ -176,4 +180,5 @@ CREATE TABLE `sys_order_2`
   ROW_FORMAT = DYNAMIC;
 
 
-SET FOREIGN_KEY_CHECKS = 1;
+SET
+FOREIGN_KEY_CHECKS = 1;

+ 9 - 10
SERVER/VberAdminPlusV3/pom.xml

@@ -22,7 +22,7 @@
         <java.version>17</java.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <spring-boot.version>3.4.6</spring-boot.version>
+        <spring-boot.version>3.4.7</spring-boot.version>
         <spring-boot-admin.version>3.4.7</spring-boot-admin.version>
         <springdoc.version>2.8.8</springdoc.version>
         <mybatis.version>3.5.16</mybatis.version>
@@ -30,14 +30,14 @@
         <dynamic-ds.version>4.3.1</dynamic-ds.version>
         <shardingsphere.version>5.5.0</shardingsphere.version>
         <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
-        <redisson.version>3.45.1</redisson.version>
+        <redisson.version>3.50.0</redisson.version>
         <xxl-job.version>2.4.1</xxl-job.version>
         <poi.version>5.2.3</poi.version>
         <fastexcel.version>1.2.0</fastexcel.version>
         <velocity.version>2.3</velocity.version>
-        <satoken.version>1.40.0</satoken.version>
+        <satoken.version>1.44.0</satoken.version>
         <p6spy.version>3.9.1</p6spy.version>
-        <hutool.version>5.8.35</hutool.version>
+        <hutool.version>5.8.38</hutool.version>
         <lock4j.version>2.2.7</lock4j.version>
         <mapstruct-plus.version>1.4.8</mapstruct-plus.version>
         <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
@@ -54,16 +54,16 @@
         <!-- 限制框架中的fastjson版本 -->
         <fastjson.version>1.2.83</fastjson.version>
         <!-- 面向运行时的D-ORM依赖 -->
-        <anyline.version>8.7.2-20250101</anyline.version>
+        <anyline.version>8.7.2-20250603</anyline.version>
 
         <!-- 工作流配置 -->
         <warm-flow.version>1.7.4</warm-flow.version>
 
         <!-- 插件版本 -->
-        <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
-        <maven-war-plugin.version>3.2.2</maven-war-plugin.version>
-        <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
-        <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
+        <maven-jar-plugin.version>3.4.2</maven-jar-plugin.version>
+        <maven-war-plugin.version>3.4.0</maven-war-plugin.version>
+        <maven-compiler-plugin.version>3.14.0</maven-compiler-plugin.version>
+        <maven-surefire-plugin.version>3.5.3</maven-surefire-plugin.version>
         <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
 
         <!-- 打包默认跳过测试 -->
@@ -301,7 +301,6 @@
             </dependency>
 
 
-
             <!--redisson-->
             <dependency>
                 <groupId>org.redisson</groupId>

+ 9 - 9
SERVER/VberAdminPlusV3/vber-admin/src/main/java/com/vber/web/listener/UserActionListener.java

@@ -2,7 +2,7 @@ package com.vber.web.listener;
 
 import cn.dev33.satoken.config.SaTokenConfig;
 import cn.dev33.satoken.listener.SaTokenListener;
-import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.parameter.SaLoginParameter;
 import cn.hutool.http.useragent.UserAgent;
 import cn.hutool.http.useragent.UserAgentUtil;
 import com.vber.common.core.constant.CacheConstants;
@@ -40,7 +40,7 @@ public class UserActionListener implements SaTokenListener {
      * 每次登录时触发
      */
     @Override
-    public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) {
+    public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
         UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
         String ip = ServletUtils.getClientIP();
         UserOnlineDTO dto = new UserOnlineDTO();
@@ -51,12 +51,12 @@ public class UserActionListener implements SaTokenListener {
         dto.setLoginTime(System.currentTimeMillis());
         dto.setTokenId(tokenValue);
 
-        String username = (String) loginModel.getExtra(LoginHelper.USER_NAME_KEY);
-        String tenantId = (String) loginModel.getExtra(LoginHelper.TENANT_KEY);
+        String username = (String) loginParameter.getExtra(LoginHelper.USER_NAME_KEY);
+        String tenantId = (String) loginParameter.getExtra(LoginHelper.TENANT_KEY);
         dto.setUserName(username);
-        dto.setClientKey((String) loginModel.getExtra(LoginHelper.CLIENT_KEY));
-        dto.setDeviceType(loginModel.getDevice());
-        dto.setOrgName((String) loginModel.getExtra(LoginHelper.ORG_NAME_KEY));
+        dto.setClientKey((String) loginParameter.getExtra(LoginHelper.CLIENT_KEY));
+        dto.setDeviceType(loginParameter.getDeviceType());
+        dto.setOrgName((String) loginParameter.getExtra(LoginHelper.ORG_NAME_KEY));
         TenantHelper.dynamic(tenantId, () -> {
             if (tokenConfig.getTimeout() == -1) {
                 RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
@@ -73,7 +73,7 @@ public class UserActionListener implements SaTokenListener {
         logininforEvent.setRequest(ServletUtils.getRequest());
         SpringUtils.context().publishEvent(logininforEvent);
         // 更新登录信息
-        loginService.recordLoginInfo((Long) loginModel.getExtra(LoginHelper.USER_KEY), ip);
+        loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip);
         log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue);
     }
 
@@ -150,6 +150,6 @@ public class UserActionListener implements SaTokenListener {
      * 每次Token续期时触发
      */
     @Override
-    public void doRenewTimeout(String tokenValue, Object loginId, long timeout) {
+    public void doRenewTimeout(String loginType, Object loginId, String tokenValue, long timeout) {
     }
 }

+ 11 - 13
SERVER/VberAdminPlusV3/vber-admin/src/main/java/com/vber/web/service/SysLoginService.java

@@ -62,6 +62,16 @@ public class SysLoginService {
     @Value("${user.password.lockTime}")
     private Integer lockTime;
 
+    static void buildLoginEvent(String tenantId, String username, String status, String message) {
+        LogininforEvent logininforEvent = new LogininforEvent();
+        logininforEvent.setTenantId(tenantId);
+        logininforEvent.setUsername(username);
+        logininforEvent.setStatus(status);
+        logininforEvent.setMessage(message);
+        logininforEvent.setRequest(ServletUtils.getRequest());
+        SpringUtils.context().publishEvent(logininforEvent);
+    }
+
     /**
      * 绑定第三方用户
      *
@@ -100,13 +110,12 @@ public class SysLoginService {
         }
     }
 
-
     /**
      * 退出登录
      */
     public void logout() {
         try {
-            LoginUser  loginUser = LoginHelper.getLoginUser();
+            LoginUser loginUser = LoginHelper.getLoginUser();
             if (ObjectUtil.isNull(loginUser)) {
                 return;
             }
@@ -136,7 +145,6 @@ public class SysLoginService {
         buildLoginEvent(tenantId, username, status, message);
     }
 
-
     /**
      * 构建登录用户
      */
@@ -248,14 +256,4 @@ public class SysLoginService {
         }
     }
 
-    static void buildLoginEvent(String tenantId, String username, String status, String message) {
-        LogininforEvent logininforEvent = new LogininforEvent();
-        logininforEvent.setTenantId(tenantId);
-        logininforEvent.setUsername(username);
-        logininforEvent.setStatus(status);
-        logininforEvent.setMessage(message);
-        logininforEvent.setRequest(ServletUtils.getRequest());
-        SpringUtils.context().publishEvent(logininforEvent);
-    }
-
 }

+ 4 - 9
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml

@@ -144,6 +144,7 @@ tenant:
     - sys_user_role
     - sys_client
     - sys_oss_config
+    - flow_spel
 
 # MyBatisPlus配置
 # https://baomidou.com/config/
@@ -206,17 +207,11 @@ springdoc:
       name: IwbY
       email: crazylionli@163.com
       url: https://gitee.com/VberAdminPlus
-  components:
-    # 鉴权方式配置
-    security-schemes:
-      apiKey:
-        type: APIKEY
-        in: HEADER
-        name: ${sa-token.token-name}
+
   #这里定义了两个分组,可定义多个,也可以不定义
   group-configs:
-#    - group: 1.演示模块
-#      packages-to-scan: com.vber.demo
+    #    - group: 1.演示模块
+    #      packages-to-scan: com.vber.demo
     - group: 1.通用模块
       packages-to-scan: com.vber.web
     - group: 2.系统模块

+ 1 - 0
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages.properties

@@ -17,6 +17,7 @@ user.username.length.valid=账户长度必须在{min}到{max}个字符之间
 user.password.not.blank=用户密码不能为空
 user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间
 user.password.not.valid=* 5-50个字符
+user.password.format.valid=密码必须包含大写字母、小写字母、数字和特殊字符
 user.email.not.valid=邮箱格式错误
 user.email.not.blank=邮箱不能为空
 user.phonenumber.not.blank=用户手机号不能为空

+ 3 - 2
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages_en_US.properties

@@ -17,6 +17,7 @@ user.username.length.valid=Account length must be between {min} and {max} charac
 user.password.not.blank=Password cannot be empty
 user.password.length.valid=Password length must be between {min} and {max} characters
 user.password.not.valid=* 5-50 characters
+user.password.format.valid=Password must contain uppercase, lowercase, digit, and special character
 user.email.not.valid=Mailbox format error
 user.email.not.blank=Mailbox cannot be blank
 user.phonenumber.not.blank=Phone number cannot be blank
@@ -56,7 +57,7 @@ social.source.not.blank=Social login platform [source] cannot be blank
 social.code.not.blank=Social login platform [code] cannot be blank
 social.state.not.blank=Social login platform [state] cannot be blank
 ##租户
-tenant.number.not.blank=Tenant number cannot be blank
-tenant.not.exists=Sorry, your tenant does not exist. Please contact the administrator
+tenant.number.not.blank=Tenant number cannot be blank.
+tenant.not.exists=Sorry, your tenant does not exist. Please contact the administrator.
 tenant.blocked=Sorry, your tenant is disabled. Please contact the administrator
 tenant.expired=Sorry, your tenant has expired. Please contact the administrator.

+ 1 - 0
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages_zh_CN.properties

@@ -17,6 +17,7 @@ user.username.length.valid=账户长度必须在{min}到{max}个字符之间
 user.password.not.blank=用户密码不能为空
 user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间
 user.password.not.valid=* 5-50个字符
+user.password.format.valid=密码必须包含大写字母、小写字母、数字和特殊字符
 user.email.not.valid=邮箱格式错误
 user.email.not.blank=邮箱不能为空
 user.phonenumber.not.blank=用户手机号不能为空

+ 4 - 8
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/config/VbConfig.java

@@ -15,21 +15,22 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties(prefix = "vb")
 public class VbConfig {
 
+    /**
+     * 上传路径
+     */
+    private static String profile;
     /**
      * 项目名称
      */
     private String name;
-
     /**
      * 模式
      */
     private String mode;
-
     /**
      * 版本
      */
     private String version;
-
     /**
      * 版权年份
      */
@@ -47,11 +48,6 @@ public class VbConfig {
      */
     private Boolean workflowEnabled;
 
-    /**
-     * 上传路径
-     */
-    private static String profile;
-
     public static String getProfile() {
         if (VbConfig.profile == null || VbConfig.profile.isEmpty()) {
             return "./vber/profile/";

+ 13 - 13
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/TaskAssigneeDTO.java

@@ -51,20 +51,20 @@ public class TaskAssigneeDTO implements Serializable {
      * @return 转换后的 TaskHandler 列表
      */
     public static <T> List<TaskHandler> convertToHandlerList(
-        List<T> sourceList,
-        Function<T, Long> storageId,
-        Function<T, String> handlerCode,
-        Function<T, String> handlerName,
-        Function<T, Long> groupName,
-        Function<T, Date> createTimeMapper) {
+            List<T> sourceList,
+            Function<T, String> storageId,
+            Function<T, String> handlerCode,
+            Function<T, String> handlerName,
+            Function<T, Long> groupName,
+            Function<T, Date> createTimeMapper) {
         return sourceList.stream()
-            .map(item -> new TaskHandler(
-                String.valueOf(storageId.apply(item)),
-                handlerCode.apply(item),
-                handlerName.apply(item),
-                groupName != null ? String.valueOf(groupName.apply(item)) : null,
-                createTimeMapper.apply(item)
-            )).collect(Collectors.toList());
+                .map(item -> new TaskHandler(
+                        storageId.apply(item),
+                        handlerCode.apply(item),
+                        handlerName.apply(item),
+                        groupName != null ? String.valueOf(groupName.apply(item)) : null,
+                        createTimeMapper.apply(item)
+                )).collect(Collectors.toList());
     }
 
     @Data

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/UserDTO.java

@@ -11,7 +11,7 @@ import java.util.Date;
 /**
  * 用户
  *
- * @author Michelle.Chung
+ * @author Iwb
  */
 @Data
 @NoArgsConstructor

+ 7 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/event/ProcessTaskEvent.java

@@ -4,6 +4,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.Map;
 
 /**
  * 流程任务监听
@@ -56,4 +57,10 @@ public class ProcessTaskEvent implements Serializable {
      */
     private String status;
 
+
+    /**
+     * 办理参数
+     */
+    private Map<String, Object> params;
+
 }

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/model/LoginUser.java

@@ -1,7 +1,7 @@
 package com.vber.common.core.domain.model;
 
-import com.vber.common.core.domain.dto.RoleDTO;
 import com.vber.common.core.domain.dto.PostDTO;
+import com.vber.common.core.domain.dto.RoleDTO;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 

+ 1 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/model/PasswordLoginBody.java

@@ -27,6 +27,7 @@ public class PasswordLoginBody extends LoginBody {
      */
     @NotBlank(message = "{user.password.not.blank}")
     @Length(min = 5, max = 30, message = "{user.password.length.valid}")
+    //    @Pattern(regexp = RegexConstants.PASSWORD, message = "{user.password.format.valid}")
     private String password;
 
 }

+ 5 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/model/RegisterBody.java

@@ -27,8 +27,13 @@ public class RegisterBody extends LoginBody {
      */
     @NotBlank(message = "{user.password.not.blank}")
     @Length(min = 5, max = 30, message = "{user.password.length.valid}")
+//    @Pattern(regexp = RegexConstants.PASSWORD, message = "{user.password.format.valid}")
     private String password;
 
+
+    /**
+     * 用户类型
+     */
     private String userType;
 
 }

+ 2 - 4
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/enums/BusinessStatusEnum.java

@@ -56,19 +56,17 @@ public enum BusinessStatusEnum {
      */
     TERMINATION("termination", "已终止");
 
+    private static final Map<String, BusinessStatusEnum> STATUS_MAP = Arrays.stream(BusinessStatusEnum.values())
+            .collect(Collectors.toConcurrentMap(BusinessStatusEnum::getStatus, Function.identity()));
     /**
      * 状态
      */
     private final String status;
-
     /**
      * 描述
      */
     private final String desc;
 
-    private static final Map<String, BusinessStatusEnum> STATUS_MAP = Arrays.stream(BusinessStatusEnum.values())
-            .collect(Collectors.toConcurrentMap(BusinessStatusEnum::getStatus, Function.identity()));
-
     /**
      * 根据状态获取对应的 BusinessStatusEnum 枚举
      *

+ 0 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/enums/FormatsType.java

@@ -1,7 +1,6 @@
 package com.vber.common.core.enums;
 
 
-
 import com.vber.common.core.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 1 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/DictService.java

@@ -78,6 +78,7 @@ public interface DictService {
 
     /**
      * 根据字典类型查询字典数据列表
+     *
      * @param dictType 字典类型
      * @return 字典数据列表
      */

+ 9 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/OrgService.java

@@ -3,6 +3,7 @@ package com.vber.common.core.service;
 import com.vber.common.core.domain.dto.OrgDTO;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 通用 组织机构服务
@@ -33,4 +34,12 @@ public interface OrgService {
      * @return 组织机构列表
      */
     List<OrgDTO> selectOrgsByList();
+
+    /**
+     * 根据组织机构 ID 列表查询组织机构名称映射关系
+     *
+     * @param orgIds 组织机构 ID 列表
+     * @return Map,其中 key 为组织机构 ID,value 为对应的组织机构名称
+     */
+    Map<Long, String> selectOrgNamesByIds(List<Long> orgIds);
 }

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/PermissionService.java

@@ -12,7 +12,7 @@ public interface PermissionService {
     /**
      * 获取角色数据权限
      *
-     * @param userId  用户id
+     * @param userId 用户id
      * @return 角色权限信息
      */
     Set<String> getRolePermission(Long userId);
@@ -20,7 +20,7 @@ public interface PermissionService {
     /**
      * 获取菜单数据权限
      *
-     * @param userId  用户id
+     * @param userId 用户id
      * @return 菜单权限信息
      */
     Set<String> getMenuPermission(Long userId);

+ 11 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/PostService.java

@@ -1,10 +1,19 @@
 package com.vber.common.core.service;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 通用 岗位服务
  *
  * @author Iwb
  */
-public interface PostService  {
-
+public interface PostService {
+    /**
+     * 根据岗位 ID 列表查询岗位名称映射关系
+     *
+     * @param postIds 岗位 ID 列表
+     * @return Map,其中 key 为岗位 ID,value 为对应的岗位名称
+     */
+    Map<Long, String> selectPostNamesByIds(List<Long> postIds);
 }

+ 10 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/RoleService.java

@@ -1,4 +1,14 @@
 package com.vber.common.core.service;
 
+import java.util.List;
+import java.util.Map;
+
 public interface RoleService {
+    /**
+     * 根据角色 ID 列表查询角色名称映射关系
+     *
+     * @param roleIds 角色 ID 列表
+     * @return Map,其中 key 为角色 ID,value 为对应的角色名称
+     */
+    Map<Long, String> selectRoleNamesByIds(List<Long> roleIds);
 }

+ 0 - 22
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/UserService.java

@@ -85,27 +85,5 @@ public interface UserService {
      */
     Map<Long, String> selectUserNamesByIds(List<Long> userIds);
 
-    /**
-     * 根据角色 ID 列表查询角色名称映射关系
-     *
-     * @param roleIds 角色 ID 列表
-     * @return Map,其中 key 为角色 ID,value 为对应的角色名称
-     */
-    Map<Long, String> selectRoleNamesByIds(List<Long> roleIds);
-
-    /**
-     * 根据组织机构 ID 列表查询组织机构名称映射关系
-     *
-     * @param deptIds 组织机构 ID 列表
-     * @return Map,其中 key 为组织机构 ID,value 为对应的组织机构名称
-     */
-    Map<Long, String> selectOrgNamesByIds(List<Long> deptIds);
 
-    /**
-     * 根据岗位 ID 列表查询岗位名称映射关系
-     *
-     * @param postIds 岗位 ID 列表
-     * @return Map,其中 key 为岗位 ID,value 为对应的岗位名称
-     */
-    Map<Long, String> selectPostNamesByIds(List<Long> postIds);
 }

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/NetUtils.java

@@ -3,10 +3,10 @@ package com.vber.common.core.utils;
 
 import cn.hutool.core.lang.PatternPool;
 import cn.hutool.core.net.NetUtil;
+import com.vber.common.core.utils.regex.RegexUtils;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import com.vber.common.core.utils.regex.RegexUtils;
 
 import java.net.Inet6Address;
 import java.net.InetAddress;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/ObjectUtils.java

@@ -17,7 +17,7 @@ public class ObjectUtils extends ObjectUtil {
     /**
      * 如果对象不为空,则获取对象中的某个字段 ObjectUtils.notNullGetter(user, User::getName);
      *
-     * @param obj 对象
+     * @param obj  对象
      * @param func 获取方法
      * @return 对象字段
      */

+ 1 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/StringUtils.java

@@ -25,6 +25,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
     @Deprecated
     private StringUtils() {
     }
+
     /**
      * 获取参数不为空值
      *

+ 5 - 3
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/ip/AddressUtils.java

@@ -25,7 +25,7 @@ public class AddressUtils {
 
     public static String getRealAddressByIP(String ip) {
         // 处理空串并过滤HTML标签
-        ip = HtmlUtil.cleanHtmlTag(StringUtils.blankToDefault(ip,""));
+        ip = HtmlUtil.cleanHtmlTag(StringUtils.blankToDefault(ip, ""));
         // 判断是否为IPv4
         if (NetUtils.isIPv4(ip)) {
             return resolverIPv4Region(ip);
@@ -40,10 +40,11 @@ public class AddressUtils {
 
     /**
      * 根据IPv4地址查询IP归属行政区域
+     *
      * @param ip ipv4地址
      * @return 归属行政区域
      */
-    private static String resolverIPv4Region(String ip){
+    private static String resolverIPv4Region(String ip) {
         // 内网不查询
         if (NetUtils.isInnerIP(ip)) {
             return LOCAL_ADDRESS;
@@ -53,10 +54,11 @@ public class AddressUtils {
 
     /**
      * 根据IPv6地址查询IP归属行政区域
+     *
      * @param ip ipv6地址
      * @return 归属行政区域
      */
-    private static String resolverIPv6Region(String ip){
+    private static String resolverIPv6Region(String ip) {
         // 内网不查询
         if (NetUtils.isInnerIPv6(ip)) {
             return LOCAL_ADDRESS;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/ip/RegionUtils.java

@@ -2,9 +2,9 @@ package com.vber.common.core.utils.ip;
 
 import cn.hutool.core.io.resource.NoResourceException;
 import cn.hutool.core.io.resource.ResourceUtil;
-import lombok.extern.slf4j.Slf4j;
 import com.vber.common.core.exception.ServiceException;
 import com.vber.common.core.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.lionsoul.ip2region.xdb.Searcher;
 
 /**

+ 4 - 4
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/sql/SqlUtil.java

@@ -12,14 +12,14 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class SqlUtil {
 
-    /**
-     * 定义常用的 sql关键字
-     */
-    public static String SQL_REGEX = "\u000B|and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
     /**
      * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
      */
     public static final String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
+    /**
+     * 定义常用的 sql关键字
+     */
+    public static String SQL_REGEX = "\u000B|and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
 
     /**
      * 检查字符,防止注入绕过

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/validate/dicts/DictPatternValidator.java

@@ -1,10 +1,10 @@
 package com.vber.common.core.validate.dicts;
 
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
 import com.vber.common.core.service.DictService;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
 
 /**
  * 自定义字典值校验器

+ 4 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/sensitive/annotation/Sensitive.java

@@ -21,12 +21,14 @@ import java.lang.annotation.Target;
 @JsonSerialize(using = SensitiveHandler.class)
 public @interface Sensitive {
     SensitiveStrategy strategy();
+
     /**
      * 角色标识符 多个角色满足一个即可
      */
-    String[] roleKey()default {};
+    String[] roleKey() default {};
+
     /**
      * 权限标识符 多个权限满足一个即可
      */
-    String[] perms()default {};
+    String[] perms() default {};
 }

+ 9 - 8
SERVER/VberAdminPlusV3/vber-common/vber-common-doc/src/main/java/com/vber/common/doc/config/SpringDocConfig.java

@@ -54,14 +54,15 @@ public class SpringDocConfig {
         openApi.externalDocs(properties.getExternalDocs());
         openApi.tags(properties.getTags());
         openApi.paths(properties.getPaths());
-        openApi.components(properties.getComponents());
-        Set<String> keySet = properties.getComponents().getSecuritySchemes().keySet();
-        List<SecurityRequirement> list = new ArrayList<>();
-        SecurityRequirement securityRequirement = new SecurityRequirement();
-        keySet.forEach(securityRequirement::addList);
-        list.add(securityRequirement);
-        openApi.security(list);
-
+        if (properties.getComponents() != null) {
+            openApi.components(properties.getComponents());
+            Set<String> keySet = properties.getComponents().getSecuritySchemes().keySet();
+            List<SecurityRequirement> list = new ArrayList<>();
+            SecurityRequirement securityRequirement = new SecurityRequirement();
+            keySet.forEach(securityRequirement::addList);
+            list.add(securityRequirement);
+            openApi.security(list);
+        }
         return openApi;
     }
 

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/config/ApiDecryptAutoConfiguration.java

@@ -1,8 +1,8 @@
 package com.vber.common.encrypt.config;
 
-import jakarta.servlet.DispatcherType;
 import com.vber.common.encrypt.filter.CryptoFilter;
 import com.vber.common.encrypt.properties.ApiDecryptProperties;
+import jakarta.servlet.DispatcherType;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/core/EncryptContext.java

@@ -1,8 +1,8 @@
 package com.vber.common.encrypt.core;
 
-import lombok.Data;
 import com.vber.common.encrypt.enumd.AlgorithmType;
 import com.vber.common.encrypt.enumd.EncodeType;
+import lombok.Data;
 
 /**
  * 加密上下文 用于encryptor传递必要的参数。

+ 0 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/core/EncryptorManager.java

@@ -1,7 +1,6 @@
 package com.vber.common.encrypt.core;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ReflectUtil;
 import com.vber.common.core.utils.ObjectUtils;
 import com.vber.common.core.utils.StringUtils;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/enumd/AlgorithmType.java

@@ -1,8 +1,8 @@
 package com.vber.common.encrypt.enumd;
 
+import com.vber.common.encrypt.core.encryptor.*;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
-import com.vber.common.encrypt.core.encryptor.*;
 
 /**
  * 算法名称

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/filter/DecryptRequestBodyWrapper.java

@@ -1,12 +1,12 @@
 package com.vber.common.encrypt.filter;
 
 import cn.hutool.core.io.IoUtil;
+import com.vber.common.core.constant.Constants;
+import com.vber.common.encrypt.utils.EncryptUtils;
 import jakarta.servlet.ReadListener;
 import jakarta.servlet.ServletInputStream;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletRequestWrapper;
-import com.vber.common.core.constant.Constants;
-import com.vber.common.encrypt.utils.EncryptUtils;
 import org.springframework.http.MediaType;
 
 import java.io.BufferedReader;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/properties/EncryptorProperties.java

@@ -1,8 +1,8 @@
 package com.vber.common.encrypt.properties;
 
-import lombok.Data;
 import com.vber.common.encrypt.enumd.AlgorithmType;
 import com.vber.common.encrypt.enumd.EncodeType;
+import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
 /**

+ 2 - 5
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/annotation/ExcelNotation.java

@@ -6,17 +6,14 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * 批注
+ * 批注 此注解仅用于单表头 不支持多层级表头
+ *
  * @author Iwb
  */
 @Target({ElementType.FIELD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ExcelNotation {
 
-    /**
-     * col index
-     */
-    int index() default -1;
     /**
      * 批注内容
      */

+ 2 - 5
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/annotation/ExcelRequired.java

@@ -9,17 +9,14 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * 是否必填
+ * 是否必填 此注解仅用于单表头 不支持多层级表头
+ *
  * @author Iwb
  */
 @Target({ElementType.FIELD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ExcelRequired {
 
-    /**
-     * col index
-     */
-    int index() default -1;
     /**
      * 字体颜色
      */

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/convert/ExcelDictConvert.java

@@ -9,12 +9,12 @@ import cn.idev.excel.metadata.GlobalConfiguration;
 import cn.idev.excel.metadata.data.ReadCellData;
 import cn.idev.excel.metadata.data.WriteCellData;
 import cn.idev.excel.metadata.property.ExcelContentProperty;
-import lombok.extern.slf4j.Slf4j;
 import com.vber.common.core.service.DictService;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.excel.annotation.ExcelDictFormat;
 import com.vber.common.excel.utils.ExcelUtil;
+import lombok.extern.slf4j.Slf4j;
 
 import java.lang.reflect.Field;
 

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/convert/ExcelEnumConvert.java

@@ -9,9 +9,9 @@ import cn.idev.excel.metadata.GlobalConfiguration;
 import cn.idev.excel.metadata.data.ReadCellData;
 import cn.idev.excel.metadata.data.WriteCellData;
 import cn.idev.excel.metadata.property.ExcelContentProperty;
-import lombok.extern.slf4j.Slf4j;
 import com.vber.common.core.utils.reflect.ReflectUtils;
 import com.vber.common.excel.annotation.ExcelEnumFormat;
+import lombok.extern.slf4j.Slf4j;
 
 import java.lang.reflect.Field;
 import java.util.HashMap;

+ 5 - 5
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/core/CellMergeStrategy.java

@@ -8,6 +8,8 @@ import cn.idev.excel.metadata.Head;
 import cn.idev.excel.write.handler.WorkbookWriteHandler;
 import cn.idev.excel.write.handler.context.WorkbookWriteHandlerContext;
 import cn.idev.excel.write.merge.AbstractMergeStrategy;
+import com.vber.common.core.utils.reflect.ReflectUtils;
+import com.vber.common.excel.annotation.CellMerge;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.SneakyThrows;
@@ -15,8 +17,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.util.CellRangeAddress;
-import com.vber.common.core.utils.reflect.ReflectUtils;
-import com.vber.common.excel.annotation.CellMerge;
 
 import java.lang.reflect.Field;
 import java.util.*;
@@ -44,10 +44,10 @@ public class CellMergeStrategy extends AbstractMergeStrategy implements Workbook
     protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
         //单元格写入了,遍历合并区域,如果该Cell在区域内,但非首行,则清空
         final int rowIndex = cell.getRowIndex();
-        if (CollUtil.isNotEmpty(cellList)){
+        if (CollUtil.isNotEmpty(cellList)) {
             for (CellRangeAddress cellAddresses : cellList) {
                 final int firstRow = cellAddresses.getFirstRow();
-                if (cellAddresses.isInRange(cell) && rowIndex != firstRow){
+                if (cellAddresses.isInRange(cell) && rowIndex != firstRow) {
                     cell.setBlank();
                 }
             }
@@ -57,7 +57,7 @@ public class CellMergeStrategy extends AbstractMergeStrategy implements Workbook
     @Override
     public void afterWorkbookDispose(final WorkbookWriteHandlerContext context) {
         //当前表格写完后,统一写入
-        if (CollUtil.isNotEmpty(cellList)){
+        if (CollUtil.isNotEmpty(cellList)) {
             for (CellRangeAddress item : cellList) {
                 context.getWriteContext().writeSheetHolder().getSheet().addMergedRegion(item);
             }

+ 4 - 4
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/core/DefaultExcelListener.java

@@ -5,13 +5,13 @@ import cn.idev.excel.context.AnalysisContext;
 import cn.idev.excel.event.AnalysisEventListener;
 import cn.idev.excel.exception.ExcelAnalysisException;
 import cn.idev.excel.exception.ExcelDataConvertException;
+import com.vber.common.core.utils.StreamUtils;
+import com.vber.common.core.utils.ValidatorUtils;
+import com.vber.common.json.utils.JsonUtils;
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ConstraintViolationException;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import com.vber.common.core.utils.StreamUtils;
-import com.vber.common.core.utils.ValidatorUtils;
-import com.vber.common.json.utils.JsonUtils;
 
 import java.util.Map;
 import java.util.Set;
@@ -59,7 +59,7 @@ public class DefaultExcelListener<T> extends AnalysisEventListener<T> implements
             Integer rowIndex = excelDataConvertException.getRowIndex();
             Integer columnIndex = excelDataConvertException.getColumnIndex();
             errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常<br/>",
-                rowIndex + 1, columnIndex + 1, headMap.get(columnIndex));
+                    rowIndex + 1, columnIndex + 1, headMap.get(columnIndex));
             if (log.isDebugEnabled()) {
                 log.error(errMsg);
             }

+ 9 - 9
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/core/DropDownOptions.java

@@ -1,10 +1,10 @@
 package com.vber.common.excel.core;
 
 import cn.hutool.core.util.StrUtil;
+import com.vber.common.core.exception.ServiceException;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import com.vber.common.core.exception.ServiceException;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -24,6 +24,10 @@ import java.util.stream.Collectors;
 @NoArgsConstructor
 @SuppressWarnings("unused")
 public class DropDownOptions {
+    /**
+     * 分隔符
+     */
+    private static final String DELIMITER = "_";
     /**
      * 一级下拉所在列index,从0开始算
      */
@@ -41,10 +45,6 @@ public class DropDownOptions {
      * <p>以每一个一级选项值为Key,每个一级选项对应的二级数据为Value</p>
      */
     private Map<String, List<String>> nextOptions = new HashMap<>();
-    /**
-     * 分隔符
-     */
-    private static final String DELIMITER = "_";
 
     /**
      * 创建只有一级的下拉选
@@ -114,15 +114,15 @@ public class DropDownOptions {
         // 先创建父类的下拉
         parentLinkSonOptions.setIndex(parentIndex);
         parentLinkSonOptions.setOptions(
-            parentList.stream()
-                .map(howToBuildEveryOption)
-                .collect(Collectors.toList())
+                parentList.stream()
+                        .map(howToBuildEveryOption)
+                        .collect(Collectors.toList())
         );
         // 提取父-子级联下拉
         Map<String, List<String>> sonOptions = new HashMap<>();
         // 父级依据自己的ID分组
         Map<Number, List<T>> parentGroupByIdMap =
-            parentList.stream().collect(Collectors.groupingBy(parentHowToGetIdFunction));
+                parentList.stream().collect(Collectors.groupingBy(parentHowToGetIdFunction));
         // 遍历每个子集,提取到Map中
         sonList.forEach(everySon -> {
             if (parentGroupByIdMap.containsKey(sonHowToGetParentIdFunction.apply(everySon))) {

+ 26 - 27
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/core/ExcelDownHandler.java

@@ -11,12 +11,6 @@ import cn.idev.excel.util.ClassUtils;
 import cn.idev.excel.write.handler.SheetWriteHandler;
 import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
 import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder;
-import com.vber.common.core.domain.dto.DictDataDTO;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.poi.ss.usermodel.*;
-import org.apache.poi.ss.util.CellRangeAddressList;
-import org.apache.poi.ss.util.WorkbookUtil;
-import org.apache.poi.xssf.usermodel.XSSFDataValidation;
 import com.vber.common.core.exception.ServiceException;
 import com.vber.common.core.service.DictService;
 import com.vber.common.core.utils.SpringUtils;
@@ -24,6 +18,11 @@ import com.vber.common.core.utils.StreamUtils;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.excel.annotation.ExcelDictFormat;
 import com.vber.common.excel.annotation.ExcelEnumFormat;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+import org.apache.poi.ss.util.WorkbookUtil;
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
 
 import java.lang.reflect.Field;
 import java.util.*;
@@ -105,7 +104,7 @@ public class ExcelDownHandler implements SheetWriteHandler {
                     // 如果传递了字典名,则依据字典建立下拉
                     Collection<String> values = Optional.ofNullable(dictService.getAllDictByDictType(dictType))
                             .orElseThrow(() -> new ServiceException(String.format("字典 %s 不存在", dictType)))
-                        .values();
+                            .values();
                     options = new ArrayList<>(values);
                 } else if (StringUtils.isNotBlank(converterExp)) {
                     // 如果指定了确切的值,则直接解析确切的值
@@ -186,7 +185,7 @@ public class ExcelDownHandler implements SheetWriteHandler {
         for (int columnIndex = 0; columnIndex < firstOptions.size(); columnIndex++) {
             String columnName = firstOptions.get(columnIndex);
             firstRow.createCell(columnIndex)
-                .setCellValue(columnName);
+                    .setCellValue(columnName);
             columnNames.add(columnName);
         }
 
@@ -196,9 +195,9 @@ public class ExcelDownHandler implements SheetWriteHandler {
         name.setNameName(linkedOptionsSheetName);
         // 以横向第一行创建一级下拉拼接引用位置
         String firstOptionsFunction = String.format("%s!$%s$1:$%s$1",
-            linkedOptionsSheetName,
-            getExcelColumnName(0),
-            getExcelColumnName(firstOptions.size())
+                linkedOptionsSheetName,
+                getExcelColumnName(0),
+                getExcelColumnName(firstOptions.size())
         );
         // 设置名称管理器的引用位置
         name.setRefersToFormula(firstOptionsFunction);
@@ -218,12 +217,12 @@ public class ExcelDownHandler implements SheetWriteHandler {
             sonName.setNameName(thisFirstOptionsValue);
             // 以第二行该列数据拼接引用位置
             String sonFunction = String.format("%s!$%s$2:$%s$%d",
-                linkedOptionsSheetName,
-                firstOptionsColumnName,
-                firstOptionsColumnName,
-                // 二级选项存在则设置为(选项个数+1)行,否则设置为2行
-                Math.max(Optional.ofNullable(secoundOptionsMap.get(thisFirstOptionsValue))
-                    .orElseGet(ArrayList::new).size(), 1) + 1
+                    linkedOptionsSheetName,
+                    firstOptionsColumnName,
+                    firstOptionsColumnName,
+                    // 二级选项存在则设置为(选项个数+1)行,否则设置为2行
+                    Math.max(Optional.ofNullable(secoundOptionsMap.get(thisFirstOptionsValue))
+                            .orElseGet(ArrayList::new).size(), 1) + 1
             );
             // 设置名称管理器的引用位置
             sonName.setRefersToFormula(sonFunction);
@@ -276,7 +275,7 @@ public class ExcelDownHandler implements SheetWriteHandler {
                 // 填充位置的部分不渲染
                 if (StrUtil.isNotBlank(rowValue)) {
                     row.createCell(columnIndex)
-                        .setCellValue(rowValue);
+                            .setCellValue(rowValue);
                 }
             }
         });
@@ -296,7 +295,7 @@ public class ExcelDownHandler implements SheetWriteHandler {
         String tmpOptionsSheetName = OPTIONS_SHEET_NAME + "_" + currentOptionsColumnIndex;
         // 创建下拉数据表
         Sheet simpleDataSheet = Optional.ofNullable(workbook.getSheet(WorkbookUtil.createSafeSheetName(tmpOptionsSheetName)))
-            .orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(tmpOptionsSheetName)));
+                .orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(tmpOptionsSheetName)));
         // 将下拉表隐藏
         workbook.setSheetHidden(workbook.getSheetIndex(simpleDataSheet), true);
         // 完善纵向的一级选项数据表
@@ -304,10 +303,10 @@ public class ExcelDownHandler implements SheetWriteHandler {
             int finalI = i;
             // 获取每一选项行,如果没有则创建
             Row row = Optional.ofNullable(simpleDataSheet.getRow(i))
-                .orElseGet(() -> simpleDataSheet.createRow(finalI));
+                    .orElseGet(() -> simpleDataSheet.createRow(finalI));
             // 获取本级选项对应的选项列,如果没有则创建。上述采用多个sheet,默认索引为1列
             Cell cell = Optional.ofNullable(row.getCell(0))
-                .orElseGet(() -> row.createCell(0));
+                    .orElseGet(() -> row.createCell(0));
             // 设置值
             cell.setCellValue(value.get(i));
         }
@@ -319,10 +318,10 @@ public class ExcelDownHandler implements SheetWriteHandler {
         name.setNameName(nameName);
         // 以纵向第一列创建一级下拉拼接引用位置
         String function = String.format("%s!$%s$1:$%s$%d",
-            tmpOptionsSheetName,
-            getExcelColumnName(0),
-            getExcelColumnName(0),
-            value.size());
+                tmpOptionsSheetName,
+                getExcelColumnName(0),
+                getExcelColumnName(0),
+                value.size());
         // 设置名称管理器的引用位置
         name.setRefersToFormula(function);
         // 设置数据校验为序列模式,引用的是名称管理器中的别名
@@ -392,8 +391,8 @@ public class ExcelDownHandler implements SheetWriteHandler {
         int thisCircleColumnIndex = columnIndex % 26;
         // 26一循环的次数大于0,则视为栏名至少两位
         String columnPrefix = columnCircleCount == 0
-            ? StrUtil.EMPTY
-            : StrUtil.subWithLength(EXCEL_COLUMN_NAME, columnCircleCount - 1, 1);
+                ? StrUtil.EMPTY
+                : StrUtil.subWithLength(EXCEL_COLUMN_NAME, columnCircleCount - 1, 1);
         // 从26一循环内取对应的栏位名
         String columnNext = StrUtil.subWithLength(EXCEL_COLUMN_NAME, thisCircleColumnIndex, 1);
         // 将二者拼接即为最终的栏位名

+ 50 - 62
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/handler/DataWriteHandler.java

@@ -1,6 +1,7 @@
 package com.vber.common.excel.handler;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.idev.excel.annotation.ExcelProperty;
 import cn.idev.excel.metadata.data.DataFormatData;
 import cn.idev.excel.metadata.data.WriteCellData;
 import cn.idev.excel.util.StyleUtil;
@@ -10,12 +11,11 @@ import cn.idev.excel.write.handler.context.CellWriteHandlerContext;
 import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
 import cn.idev.excel.write.metadata.style.WriteCellStyle;
 import cn.idev.excel.write.metadata.style.WriteFont;
+import com.vber.common.excel.annotation.ExcelNotation;
+import com.vber.common.excel.annotation.ExcelRequired;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
-import com.vber.common.core.utils.reflect.ReflectUtils;
-import com.vber.common.excel.annotation.ExcelNotation;
-import com.vber.common.excel.annotation.ExcelRequired;
 
 import java.lang.reflect.Field;
 import java.util.HashMap;
@@ -24,19 +24,19 @@ import java.util.Map;
 /**
  * 批注、必填
  *
- * @author Iwb
+ * @author guzhouyanyu
  */
 public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler {
 
     /**
      * 批注
      */
-    private final Map<Integer, String> notationMap;
+    private final Map<String, String> notationMap;
 
     /**
      * 头列字体颜色
      */
-    private final Map<Integer, Short> headColumnMap;
+    private final Map<String, Short> headColumnMap;
 
 
     public DataWriteHandler(Class<?> clazz) {
@@ -44,20 +44,55 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler {
         headColumnMap = getRequiredMap(clazz);
     }
 
+    /**
+     * 获取必填列
+     */
+    private static Map<String, Short> getRequiredMap(Class<?> clazz) {
+        Map<String, Short> requiredMap = new HashMap<>();
+        Field[] fields = clazz.getDeclaredFields();
+        for (Field field : fields) {
+            if (!field.isAnnotationPresent(ExcelRequired.class)) {
+                continue;
+            }
+            ExcelRequired excelRequired = field.getAnnotation(ExcelRequired.class);
+            ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
+            requiredMap.put(excelProperty.value()[0], excelRequired.fontColor().getIndex());
+        }
+        return requiredMap;
+    }
+
+    /**
+     * 获取批注
+     */
+    private static Map<String, String> getNotationMap(Class<?> clazz) {
+        Map<String, String> notationMap = new HashMap<>();
+        Field[] fields = clazz.getDeclaredFields();
+        for (Field field : fields) {
+            if (!field.isAnnotationPresent(ExcelNotation.class)) {
+                continue;
+            }
+            ExcelNotation excelNotation = field.getAnnotation(ExcelNotation.class);
+            ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
+            notationMap.put(excelProperty.value()[0], excelNotation.value());
+        }
+        return notationMap;
+    }
+
     @Override
     public void afterCellDispose(CellWriteHandlerContext context) {
         if (CollUtil.isEmpty(notationMap) && CollUtil.isEmpty(headColumnMap)) {
             return;
         }
+        // 第一行
         WriteCellData<?> cellData = context.getFirstCellData();
+        // 第一个格子
         WriteCellStyle writeCellStyle = cellData.getOrCreateStyle();
 
-        DataFormatData dataFormatData = new DataFormatData();
-        // 单元格设置为文本格式
-        dataFormatData.setIndex((short) 49);
-        writeCellStyle.setDataFormatData(dataFormatData);
-
         if (context.getHead()) {
+            DataFormatData dataFormatData = new DataFormatData();
+            // 单元格设置为文本格式
+            dataFormatData.setIndex((short) 49);
+            writeCellStyle.setDataFormatData(dataFormatData);
             Cell cell = context.getCell();
             WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder();
             Sheet sheet = writeSheetHolder.getSheet();
@@ -67,17 +102,17 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler {
             WriteFont headWriteFont = new WriteFont();
             // 加粗
             headWriteFont.setBold(true);
-            if (CollUtil.isNotEmpty(headColumnMap) && headColumnMap.containsKey(cell.getColumnIndex())) {
+            if (CollUtil.isNotEmpty(headColumnMap) && headColumnMap.containsKey(cell.getStringCellValue())) {
                 // 设置字体颜色
-                headWriteFont.setColor(headColumnMap.get(cell.getColumnIndex()));
+                headWriteFont.setColor(headColumnMap.get(cell.getStringCellValue()));
             }
             writeCellStyle.setWriteFont(headWriteFont);
             CellStyle cellStyle = StyleUtil.buildCellStyle(workbook, null, writeCellStyle);
             cell.setCellStyle(cellStyle);
 
-            if (CollUtil.isNotEmpty(notationMap) && notationMap.containsKey(cell.getColumnIndex())) {
+            if (CollUtil.isNotEmpty(notationMap) && notationMap.containsKey(cell.getStringCellValue())) {
                 // 批注内容
-                String notationContext = notationMap.get(cell.getColumnIndex());
+                String notationContext = notationMap.get(cell.getStringCellValue());
                 // 创建绘图对象
                 Comment comment = drawing.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), 0, (short) 5, 5));
                 comment.setString(new XSSFRichTextString(notationContext));
@@ -85,51 +120,4 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler {
             }
         }
     }
-
-    /**
-     * 获取必填列
-     */
-    private static Map<Integer, Short> getRequiredMap(Class<?> clazz) {
-        Map<Integer, Short> requiredMap = new HashMap<>();
-        Field[] fields = clazz.getDeclaredFields();
-        // 检查 fields 数组是否为空
-        if (fields.length == 0) {
-            return requiredMap;
-        }
-        Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName()));
-
-        for (int i = 0; i < filteredFields.length; i++) {
-            Field field = filteredFields[i];
-            if (!field.isAnnotationPresent(ExcelRequired.class)) {
-                continue;
-            }
-            ExcelRequired excelRequired = field.getAnnotation(ExcelRequired.class);
-            int columnIndex =  excelRequired.index() == -1 ? i : excelRequired.index();
-            requiredMap.put(columnIndex, excelRequired.fontColor().getIndex());
-        }
-        return requiredMap;
-    }
-
-    /**
-     * 获取批注
-     */
-    private static Map<Integer, String> getNotationMap(Class<?> clazz) {
-        Map<Integer, String> notationMap = new HashMap<>();
-        Field[] fields = clazz.getDeclaredFields();
-        // 检查 fields 数组是否为空
-        if (fields.length == 0) {
-            return notationMap;
-        }
-        Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName()));
-        for (int i = 0; i < filteredFields.length; i++) {
-            Field field = filteredFields[i];
-            if (!field.isAnnotationPresent(ExcelNotation.class)) {
-                continue;
-            }
-            ExcelNotation excelNotation = field.getAnnotation(ExcelNotation.class);
-            int columnIndex =  excelNotation.index() == -1 ? i : excelNotation.index();
-            notationMap.put(columnIndex, excelNotation.value());
-        }
-        return notationMap;
-    }
 }

+ 5 - 5
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/src/main/java/com/vber/common/excel/utils/ExcelUtil.java

@@ -3,22 +3,22 @@ package com.vber.common.excel.utils;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.resource.ClassPathResource;
 import cn.hutool.core.util.IdUtil;
-import cn.idev.excel.FastExcel;
 import cn.idev.excel.ExcelWriter;
+import cn.idev.excel.FastExcel;
 import cn.idev.excel.write.builder.ExcelWriterSheetBuilder;
 import cn.idev.excel.write.metadata.WriteSheet;
 import cn.idev.excel.write.metadata.fill.FillConfig;
 import cn.idev.excel.write.metadata.fill.FillWrapper;
 import cn.idev.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
-import jakarta.servlet.ServletOutputStream;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.core.utils.file.FileUtils;
 import com.vber.common.excel.convert.ExcelBigNumberConvert;
 import com.vber.common.excel.core.*;
 import com.vber.common.excel.handler.DataWriteHandler;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 
 import java.io.IOException;
 import java.io.InputStream;

+ 0 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-mail/src/main/java/com/vber/common/mail/config/properties/MailProperties.java

@@ -50,7 +50,6 @@ public class MailProperties {
      * 1. user@xxx.xx
      * 2. name &lt;user@xxx.xx&gt;
      * </pre>
-
      */
     private String from;
 

+ 4 - 4
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/annotation/DataColumn.java

@@ -15,18 +15,18 @@ public @interface DataColumn {
 
 
     /**
-     * 数据权限模板的占位符关键字,默认为 "deptName"
+     * 数据权限模板的占位符关键字,默认为 "orgName"
      *
      * @return 占位符关键字数组
      */
-    String[] key() default "deptName";
+    String[] key() default "orgName";
 
     /**
-     * 数据权限模板的占位符替换值,默认为 "dept_id"
+     * 数据权限模板的占位符替换值,默认为 "org_id"
      *
      * @return 占位符替换值数组
      */
-    String[] value() default "dept_id";
+    String[] value() default "org_id";
 
     /**
      * 权限标识符 用于通过菜单权限标识符来获取数据权限

+ 12 - 19
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/core/page/PageQuery.java

@@ -24,38 +24,37 @@ import java.util.List;
 @Data
 public class PageQuery implements Serializable {
 
+    /**
+     * 当前记录起始索引 默认值
+     */
+    public static final int DEFAULT_PAGE_NUM = 1;
+    /**
+     * 每页显示记录数 默认值 默认查全部
+     */
+    public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;
     @Serial
     private static final long serialVersionUID = 1L;
-
     /**
      * 分页大小
      */
     private Integer pageSize;
-
     /**
      * 当前页数
      */
     private Integer pageNum;
-
     /**
      * 排序列
      */
     private String orderByColumn;
-
     /**
      * 排序的方向desc或者asc
      */
     private String isAsc;
 
-    /**
-     * 当前记录起始索引 默认值
-     */
-    public static final int DEFAULT_PAGE_NUM = 1;
-
-    /**
-     * 每页显示记录数 默认值 默认查全部
-     */
-    public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;
+    public PageQuery(Integer pageSize, Integer pageNum) {
+        this.pageSize = pageSize;
+        this.pageNum = pageNum;
+    }
 
     /**
      * 构建分页对象
@@ -115,14 +114,8 @@ public class PageQuery implements Serializable {
         return list;
     }
 
-
     @JsonIgnore
     public Integer getFirstNum() {
         return (pageNum - 1) * pageSize;
     }
-
-    public PageQuery(Integer pageSize, Integer pageNum) {
-        this.pageSize = pageSize;
-        this.pageNum = pageNum;
-    }
 }

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/InjectionMetaObjectHandler.java

@@ -45,12 +45,12 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler {
                     LoginUser loginUser = getLoginUser();
                     if (ObjectUtil.isNotNull(loginUser)) {
                         Long userId = loginUser.getUserId();
-                        // 填充创建人、更新人和创建部门信息
+                        // 填充创建人、更新人和创建组织机构信息
                         baseEntity.setCreateBy(userId);
                         baseEntity.setUpdateBy(userId);
                         baseEntity.setCreateOrg(ObjectUtils.notNull(baseEntity.getCreateOrg(), loginUser.getOrgId()));
                     } else {
-                        // 填充创建人、更新人和创建部门信息
+                        // 填充创建人、更新人和创建组织机构信息
                         baseEntity.setCreateBy(DEFAULT_USER_ID);
                         baseEntity.setUpdateBy(DEFAULT_USER_ID);
                         baseEntity.setCreateOrg(ObjectUtils.notNull(baseEntity.getCreateOrg(), DEFAULT_USER_ID));

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/MybatisExceptionHandler.java

@@ -26,7 +26,7 @@ public class MybatisExceptionHandler {
     public R<Void> handleDuplicateKeyException(DuplicateKeyException e, HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求地址'{}',数据库中已存在记录'{}'", requestURI, e.getMessage());
-        return R.fail(HttpStatus.HTTP_CONFLICT,"数据库中已存在该记录,请联系管理员确认");
+        return R.fail(HttpStatus.HTTP_CONFLICT, "数据库中已存在该记录,请联系管理员确认");
     }
 
     /**
@@ -36,7 +36,7 @@ public class MybatisExceptionHandler {
     public R<Void> handleCannotFindDataSourceException(MyBatisSystemException e, HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         String message = e.getMessage();
-        if (StringUtils.contains(message,"CannotFindDataSourceException")) {
+        if (StringUtils.contains(message, "CannotFindDataSourceException")) {
             log.error("请求地址'{}', 未找到数据源", requestURI);
             return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, "未找到数据源,请联系管理员确认");
         }

+ 8 - 8
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/PlusDataPermissionHandler.java

@@ -3,14 +3,6 @@ package com.vber.common.mybatis.handler;
 import cn.hutool.core.annotation.AnnotationUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import net.sf.jsqlparser.JSQLParserException;
-import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
-import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
-import net.sf.jsqlparser.parser.CCJSqlParserUtil;
-import org.apache.ibatis.io.Resources;
 import com.vber.common.core.domain.dto.RoleDTO;
 import com.vber.common.core.domain.model.LoginUser;
 import com.vber.common.core.exception.ServiceException;
@@ -22,6 +14,14 @@ import com.vber.common.mybatis.annotation.DataPermission;
 import com.vber.common.mybatis.enums.DataScopeType;
 import com.vber.common.mybatis.helper.DataPermissionHelper;
 import com.vber.common.satoken.utils.LoginHelper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
+import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import org.apache.ibatis.io.Resources;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.expression.BeanFactoryResolver;
 import org.springframework.core.io.Resource;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/PlusPostInitTableInfoHandler.java

@@ -4,9 +4,9 @@ package com.vber.common.mybatis.handler;
 import cn.hutool.core.convert.Convert;
 import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import org.apache.ibatis.session.Configuration;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.reflect.ReflectUtils;
+import org.apache.ibatis.session.Configuration;
 
 /**
  * 修改表信息初始化方式

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/helper/DataPermissionHelper.java

@@ -43,7 +43,7 @@ public class DataPermissionHelper {
     /**
      * 设置当前执行mapper权限注解
      *
-     * @param dataPermission   数据权限注解
+     * @param dataPermission 数据权限注解
      */
     public static void setPermission(DataPermission dataPermission) {
         PERMISSION_CACHE.set(dataPermission);

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-oss/pom.xml

@@ -28,7 +28,7 @@
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-crypto</artifactId>
         </dependency>
-        
+
         <!--  AWS SDK for Java 2.x  -->
         <dependency>
             <groupId>software.amazon.awssdk</groupId>

+ 16 - 25
SERVER/VberAdminPlusV3/vber-common/vber-common-oss/src/main/java/com/vber/common/oss/core/OssClient.java

@@ -21,10 +21,10 @@ import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
 import software.amazon.awssdk.core.ResponseInputStream;
 import software.amazon.awssdk.core.async.AsyncResponseTransformer;
 import software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody;
+import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
 import software.amazon.awssdk.regions.Region;
 import software.amazon.awssdk.services.s3.S3AsyncClient;
 import software.amazon.awssdk.services.s3.S3Configuration;
-import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
 import software.amazon.awssdk.services.s3.model.GetObjectResponse;
 import software.amazon.awssdk.services.s3.presigner.S3Presigner;
 import software.amazon.awssdk.transfer.s3.S3TransferManager;
@@ -50,28 +50,24 @@ import java.util.Random;
 @Slf4j
 public class OssClient {
 
+    public static final String LOCAL_ACCESS_KEY = "local";
+    public static final String LOCAL_URL_SPLIT = "@";
     @Getter
     private final String configKey;
-
     private final OssProperties properties;
     /**
      * Amazon S3 异步客户端
      */
     private final S3AsyncClient client;
-
     /**
      * 用于管理 S3 数据传输的高级工具
      */
     private final S3TransferManager transferManager;
-
     /**
      * AWS S3 预签名 URL 的生成器
      */
     private final S3Presigner presigner;
 
-    public static final String LOCAL_ACCESS_KEY = "local";
-    public static final String LOCAL_URL_SPLIT = "@";
-
     public OssClient(String configKey, OssProperties ossProperties) {
         this.configKey = configKey;
         this.properties = ossProperties;
@@ -124,6 +120,17 @@ public class OssClient {
         this.presigner = presigner;
     }
 
+    /**
+     * 获取合并了日期时间和ID的字符串,用于构造唯一文件名。
+     * 这是一个示例方法,具体实现根据实际需求。
+     *
+     * @return 合并了日期时间和ID的字符串
+     */
+    private static String getUnionDateTimeId() {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmssSSS");
+        return sdf.format(new Date()) + (new Random().nextInt(9000) + 10000);
+    }
+
     /**
      * 上传文件到 Amazon S3,并返回上传结果
      *
@@ -302,7 +309,6 @@ public class OssClient {
         return UploadResult.builder().url(url).filename(path).objectId(objectId).build();
     }
 
-
     /**
      * 上传 byte[] 数据到 Amazon S3,使用指定的后缀构造对象键。
      *
@@ -344,7 +350,6 @@ public class OssClient {
         return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Convert.toLong(data.length), contentType);
     }
 
-
     /**
      * 下载文件从 Amazon S3 到临时目录
      *
@@ -400,7 +405,6 @@ public class OssClient {
         }
     }
 
-
     public void delete(String path) {
         try {
             if (LOCAL_ACCESS_KEY.equals(configKey)) {
@@ -491,18 +495,6 @@ public class OssClient {
         return StringUtils.isNotEmpty(region) ? Region.of(region) : Region.US_EAST_1;
     }
 
-
-    /**
-     * 获取合并了日期时间和ID的字符串,用于构造唯一文件名。
-     * 这是一个示例方法,具体实现根据实际需求。
-     *
-     * @return 合并了日期时间和ID的字符串
-     */
-    private static String getUnionDateTimeId() {
-        SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmssSSS");
-        return sdf.format(new Date()) + (new Random().nextInt(9000) + 10000);
-    }
-
     private String buildLocalFilePath(String path) {
         if (!StringUtils.isNotBlank(path)) {
             path = VbConfig.getUploadPath();
@@ -637,13 +629,13 @@ public class OssClient {
     /**
      * 获取私有URL链接
      *
-     * @param objectKey 对象KEY
+     * @param objectKey   对象KEY
      * @param expiredTime 链接授权到期时间
      */
     public String getPrivateUrl(String objectKey, Duration expiredTime) {
         // 使用 AWS S3 预签名 URL 的生成器 获取对象的预签名 URL
         URL url = presigner.presignGetObject(
-                      x -> x.signatureDuration(expiredTime)
+                        x -> x.signatureDuration(expiredTime)
                                 .getObjectRequest(
                                         y -> y.bucket(properties.getBucketName())
                                                 .key(objectKey)
@@ -670,7 +662,6 @@ public class OssClient {
     }
 
 
-
     public boolean isLocal() {
         return LOCAL_ACCESS_KEY.equals(configKey);
     }

+ 14 - 15
SERVER/VberAdminPlusV3/vber-common/vber-common-oss/src/main/java/com/vber/common/oss/file/VbFile.java

@@ -34,6 +34,20 @@ public class VbFile extends File {
         isVbFile = isVbFile();
     }
 
+    /**
+     * 获取文件目录
+     *
+     * @param root     根目录
+     * @param fileCode 文件编码
+     * @return 文件目录
+     */
+
+    public static String getDirectory(String root, String fileCode) {
+        String path = String.format("%s/%s/", root, fileCode.replaceAll("(.{4})", "$1/"));
+        path = path.replaceAll("//", "/");
+        return path;
+    }
+
     @Override
     public VbFile[] listFiles() {
         String[] fList = list();
@@ -117,21 +131,6 @@ public class VbFile extends File {
         return directory;
     }
 
-    /**
-     * 获取文件目录
-     *
-     * @param root     根目录
-     * @param fileCode 文件编码
-     * @return 文件目录
-     */
-
-    public static String getDirectory(String root, String fileCode) {
-        String path = String.format("%s/%s/", root, fileCode.replaceAll("(.{4})", "$1/"));
-        path = path.replaceAll("//", "/");
-        return path;
-    }
-
-
     public boolean isRead() {
         ObjectInputStream in = null;
         try {

+ 21 - 25
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/manager/PlusSpringCacheManager.java

@@ -25,20 +25,16 @@ import java.util.concurrent.ConcurrentMap;
  * 重写 cacheName 处理方法 支持多参数
  *
  * @author Iwb
- *
  */
 @SuppressWarnings("unchecked")
 public class PlusSpringCacheManager implements CacheManager {
 
+    Map<String, CacheConfig> configMap = new ConcurrentHashMap<>();
+    ConcurrentMap<String, Cache> instanceMap = new ConcurrentHashMap<>();
     private boolean dynamic = true;
-
     private boolean allowNullValues = true;
-
     private boolean transactionAware = true;
 
-    Map<String, CacheConfig> configMap = new ConcurrentHashMap<>();
-    ConcurrentMap<String, Cache> instanceMap = new ConcurrentHashMap<>();
-
     /**
      * Creates CacheManager supplied by Redisson instance
      */
@@ -69,25 +65,6 @@ public class PlusSpringCacheManager implements CacheManager {
         this.transactionAware = transactionAware;
     }
 
-    /**
-     * Defines 'fixed' cache names.
-     * A new cache instance will not be created in dynamic for non-defined names.
-     * <p>
-     * `null` parameter setups dynamic mode
-     *
-     * @param names of caches
-     */
-    public void setCacheNames(Collection<String> names) {
-        if (names != null) {
-            for (String name : names) {
-                getCache(name);
-            }
-            dynamic = false;
-        } else {
-            dynamic = true;
-        }
-    }
-
     /**
      * Set cache config mapped by cache name
      *
@@ -183,5 +160,24 @@ public class PlusSpringCacheManager implements CacheManager {
         return Collections.unmodifiableSet(configMap.keySet());
     }
 
+    /**
+     * Defines 'fixed' cache names.
+     * A new cache instance will not be created in dynamic for non-defined names.
+     * <p>
+     * `null` parameter setups dynamic mode
+     *
+     * @param names of caches
+     */
+    public void setCacheNames(Collection<String> names) {
+        if (names != null) {
+            for (String name : names) {
+                getCache(name);
+            }
+            dynamic = false;
+        } else {
+            dynamic = true;
+        }
+    }
+
 
 }

+ 2 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/QueueUtils.java

@@ -16,7 +16,9 @@ import java.util.function.Function;
  *
  * @author Iwb
  * @version 3.6.0 新增
+ * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用
  */
+@Deprecated
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class QueueUtils {
 

+ 10 - 9
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/RedisUtils.java

@@ -534,30 +534,31 @@ public class RedisUtils {
     /**
      * 获得缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id)
      *
-     * <P>
+     * <p>
      * limit-设置扫描的限制数量(默认为0,查询全部)
      * pattern-设置键的匹配模式(默认为null)
      * chunkSize-设置每次扫描的块大小(默认为0,本方法设置为1000)
      * type-设置键的类型(默认为null,查询全部类型)
      * </P>
-     *  @see KeysScanOptions
      *
      * @param pattern 字符串前缀
      * @return 对象列表
+     * @see KeysScanOptions
      */
     public static Collection<String> keys(final String pattern) {
-        return  keys(KeysScanOptions.defaults().pattern(pattern).chunkSize(1000));
+        return keys(KeysScanOptions.defaults().pattern(pattern).chunkSize(1000));
     }
 
     /**
      * 通过扫描参数获取缓存的基本对象列表
+     *
      * @param keysScanOptions 扫描参数
-     * <P>
-     * limit-设置扫描的限制数量(默认为0,查询全部)
-     * pattern-设置键的匹配模式(默认为null)
-     * chunkSize-设置每次扫描的块大小(默认为0)
-     * type-设置键的类型(默认为null,查询全部类型)
-     * </P>
+     *                        <p>
+     *                        limit-设置扫描的限制数量(默认为0,查询全部)
+     *                        pattern-设置键的匹配模式(默认为null)
+     *                        chunkSize-设置每次扫描的块大小(默认为0)
+     *                        type-设置键的类型(默认为null,查询全部类型)
+     *                        </P>
      * @see KeysScanOptions
      */
     public static Collection<String> keys(final KeysScanOptions keysScanOptions) {

+ 215 - 45
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/SequenceUtils.java

@@ -1,7 +1,6 @@
 package com.vber.common.redis.utils;
 
 import cn.hutool.core.date.DatePattern;
-import cn.hutool.core.date.DateUtil;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
 import lombok.AccessLevel;
@@ -10,6 +9,10 @@ import org.redisson.api.RIdGenerator;
 import org.redisson.api.RedissonClient;
 
 import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAccessor;
 
 /**
  * 发号器工具类
@@ -22,12 +25,12 @@ public class SequenceUtils {
     /**
      * 默认初始值
      */
-    public static final Long DEFAULT_INIT_VALUE = 1L;
+    public static final long DEFAULT_INIT_VALUE = 1L;
 
     /**
      * 默认步长
      */
-    public static final Long DEFAULT_STEP_VALUE = 1L;
+    public static final long DEFAULT_STEP_VALUE = 1L;
 
     /**
      * 默认过期时间-天
@@ -39,6 +42,11 @@ public class SequenceUtils {
      */
     public static final Duration DEFAULT_EXPIRE_TIME_MINUTE = Duration.ofMinutes(1);
 
+    /**
+     * 默认最小ID容量位数 - 6位数(即至少可以生成的ID为999999个)
+     */
+    public static final int DEFAULT_MIN_ID_CAPACITY_BITS = 6;
+
     /**
      * 获取Redisson客户端实例
      */
@@ -53,14 +61,11 @@ public class SequenceUtils {
      * @param stepValue  ID步长
      * @return ID生成器
      */
-    private static RIdGenerator getIdGenerator(String key, Duration expireTime, Long initValue, Long stepValue) {
-        if (initValue == null || initValue <= 0) {
-            initValue = DEFAULT_INIT_VALUE;
-        }
-        if (stepValue == null || stepValue <= 0) {
-            stepValue = DEFAULT_STEP_VALUE;
-        }
+    public static RIdGenerator getIdGenerator(String key, Duration expireTime, long initValue, long stepValue) {
         RIdGenerator idGenerator = REDISSON_CLIENT.getIdGenerator(key);
+        // 初始值和步长不能小于等于0
+        initValue = initValue <= 0 ? DEFAULT_INIT_VALUE : initValue;
+        stepValue = stepValue <= 0 ? DEFAULT_STEP_VALUE : stepValue;
         // 设置初始值和步长
         idGenerator.tryInit(initValue, stepValue);
         // 设置过期时间
@@ -68,6 +73,17 @@ public class SequenceUtils {
         return idGenerator;
     }
 
+    /**
+     * 获取ID生成器
+     *
+     * @param key        业务key
+     * @param expireTime 过期时间
+     * @return ID生成器
+     */
+    public static RIdGenerator getIdGenerator(String key, Duration expireTime) {
+        return getIdGenerator(key, expireTime, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE);
+    }
+
     /**
      * 获取指定业务key的唯一id
      *
@@ -77,32 +93,32 @@ public class SequenceUtils {
      * @param stepValue  ID步长
      * @return 唯一id
      */
-    public static long nextId(String key, Duration expireTime, Long initValue, Long stepValue) {
+    public static long getNextId(String key, Duration expireTime, long initValue, long stepValue) {
         return getIdGenerator(key, expireTime, initValue, stepValue).nextId();
     }
 
     /**
-     * 获取指定业务key的唯一id字符串
+     * 获取指定业务key的唯一id (ID初始值=1,ID步长=1)
      *
      * @param key        业务key
      * @param expireTime 过期时间
-     * @param initValue  ID初始值
-     * @param stepValue  ID步长
      * @return 唯一id
      */
-    public static String nextIdStr(String key, Duration expireTime, Long initValue, Long stepValue) {
-        return String.valueOf(nextId(key, expireTime, initValue, stepValue));
+    public static long getNextId(String key, Duration expireTime) {
+        return getIdGenerator(key, expireTime).nextId();
     }
 
     /**
-     * 获取指定业务key的唯一id (ID初始值=1,ID步长=1)
+     * 获取指定业务key的唯一id字符串
      *
      * @param key        业务key
      * @param expireTime 过期时间
+     * @param initValue  ID初始值
+     * @param stepValue  ID步长
      * @return 唯一id
      */
-    public static long nextId(String key, Duration expireTime) {
-        return getIdGenerator(key, expireTime, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
+    public static String getNextIdString(String key, Duration expireTime, long initValue, long stepValue) {
+        return String.valueOf(getNextId(key, expireTime, initValue, stepValue));
     }
 
     /**
@@ -112,8 +128,8 @@ public class SequenceUtils {
      * @param expireTime 过期时间
      * @return 唯一id
      */
-    public static String nextIdStr(String key, Duration expireTime) {
-        return String.valueOf(nextId(key, expireTime));
+    public static String getNextIdString(String key, Duration expireTime) {
+        return String.valueOf(getNextId(key, expireTime));
     }
 
     /**
@@ -124,56 +140,210 @@ public class SequenceUtils {
      * @param width      位数,不足左补0
      * @return 补零后的唯一id字符串
      */
-    public static String nextPaddedIdStr(String key, Duration expireTime, Integer width) {
-        return StringUtils.leftPad(nextIdStr(key, expireTime), width, '0');
+    public static String getPaddedNextIdString(String key, Duration expireTime, Integer width) {
+        return StringUtils.leftPad(getNextIdString(key, expireTime), width, '0');
     }
 
     /**
-     * 获取 yyyyMMdd 开头的唯一id
+     * 获取 yyyyMMdd 格式的唯一id
      *
      * @return 唯一id
+     * @deprecated 请使用 {@link #getDateId(String)} 或 {@link #getDateId(String, boolean)}、{@link #getDateId(String, boolean, int)},确保不同业务的ID连续性
      */
-    public static String nextIdDate() {
-        return nextIdDate("");
+    @Deprecated
+    public static String getDateId() {
+        return getDateId("");
     }
 
     /**
-     * 获取 prefix + yyyyMMdd 开头的唯一id
+     * 获取 prefix + yyyyMMdd 格式的唯一id
      *
      * @param prefix 业务前缀
      * @return 唯一id
      */
-    public static String nextIdDate(String prefix) {
-        // 前缀+日期 构建 prefixKey
-        String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_FORMATTER));
-        // 获取下一个id
-        long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_DAY, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
-        // 返回完整id
-        return StringUtils.format("{}{}", prefixKey, nextId);
+    public static String getDateId(String prefix) {
+        return getDateId(prefix, true);
+    }
+
+    /**
+     * 获取 prefix + yyyyMMdd 格式的唯一id
+     *
+     * @param prefix       业务前缀
+     * @param isWithPrefix id是否携带业务前缀
+     * @return 唯一id
+     */
+    public static String getDateId(String prefix, boolean isWithPrefix) {
+        return getDateId(prefix, isWithPrefix, -1);
+    }
+
+    /**
+     * 获取 prefix + yyyyMMdd 格式的唯一id (启用ID补位,补位长度 = {@link #DEFAULT_MIN_ID_CAPACITY_BITS})})
+     *
+     * @param prefix       业务前缀
+     * @param isWithPrefix id是否携带业务前缀
+     * @return 唯一id
+     */
+    public static String getPaddedDateId(String prefix, boolean isWithPrefix) {
+        return getDateId(prefix, isWithPrefix, DEFAULT_MIN_ID_CAPACITY_BITS);
+    }
+
+    /**
+     * 获取 prefix + yyyyMMdd 格式的唯一id
+     *
+     * @param prefix            业务前缀
+     * @param isWithPrefix      id是否携带业务前缀
+     * @param minIdCapacityBits 最小ID容量位数,小于该位数的ID,左补0(小于等于0表示不启用补位)
+     * @return 唯一id
+     */
+    public static String getDateId(String prefix, boolean isWithPrefix, int minIdCapacityBits) {
+        return getDateId(prefix, isWithPrefix, minIdCapacityBits, LocalDate.now());
+    }
+
+    /**
+     * 获取 prefix + yyyyMMdd 格式的唯一id
+     *
+     * @param prefix            业务前缀
+     * @param isWithPrefix      id是否携带业务前缀
+     * @param minIdCapacityBits 最小ID容量位数,小于该位数的ID,左补0(小于等于0表示不启用补位)
+     * @param time              时间
+     * @return 唯一id
+     */
+    public static String getDateId(String prefix, boolean isWithPrefix, int minIdCapacityBits, LocalDate time) {
+        return getDateId(prefix, isWithPrefix, minIdCapacityBits, time, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE);
     }
 
     /**
-     * 获取 yyyyMMddHHmmss 开头的唯一id
+     * 获取 prefix + yyyyMMdd 格式的唯一id
      *
+     * @param prefix            业务前缀
+     * @param isWithPrefix      id是否携带业务前缀
+     * @param minIdCapacityBits 最小ID容量位数,小于该位数的ID,左补0(小于等于0表示不启用补位)
+     * @param time              时间
+     * @param initValue         ID初始值
+     * @param stepValue         ID步长
      * @return 唯一id
      */
-    public static String nextIdDateTime() {
-        return nextIdDateTime("");
+    public static String getDateId(String prefix, boolean isWithPrefix, int minIdCapacityBits, LocalDate time, long initValue, long stepValue) {
+        return getDatePatternId(prefix, isWithPrefix, minIdCapacityBits, time, DatePattern.PURE_DATE_FORMATTER, DEFAULT_EXPIRE_TIME_DAY, initValue, stepValue);
     }
 
     /**
-     * 获取 prefix + yyyyMMddHHmmss 开头的唯一id
+     * 获取 yyyyMMddHHmmss 格式的唯一id
+     *
+     * @return 唯一id
+     * @deprecated 请使用 {@link #getDateTimeId(String)} 或 {@link #getDateTimeId(String, boolean)}、{@link #getDateTimeId(String, boolean, int)},确保不同业务的ID连续性
+     */
+    @Deprecated
+    public static String getDateTimeId() {
+        return getDateTimeId("", false);
+    }
+
+    /**
+     * 获取 prefix + yyyyMMddHHmmss 格式的唯一id
      *
      * @param prefix 业务前缀
      * @return 唯一id
      */
-    public static String nextIdDateTime(String prefix) {
-        // 前缀+日期时间 构建 prefixKey
-        String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_FORMATTER));
-        // 获取下一个id
-        long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_MINUTE, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
-        // 返回完整id
-        return StringUtils.format("{}{}", prefixKey, nextId);
+    public static String getDateTimeId(String prefix) {
+        return getDateTimeId(prefix, true);
+    }
+
+    /**
+     * 获取 prefix + yyyyMMddHHmmss 格式的唯一id
+     *
+     * @param prefix       业务前缀
+     * @param isWithPrefix id是否携带业务前缀
+     * @return 唯一id
+     */
+    public static String getDateTimeId(String prefix, boolean isWithPrefix) {
+        return getDateTimeId(prefix, isWithPrefix, -1);
+    }
+
+    /**
+     * 获取 prefix + yyyyMMddHHmmss 格式的唯一id (启用ID补位,补位长度 = {@link #DEFAULT_MIN_ID_CAPACITY_BITS})})
+     *
+     * @param prefix       业务前缀
+     * @param isWithPrefix id是否携带业务前缀
+     * @return 唯一id
+     */
+    public static String getPaddedDateTimeId(String prefix, boolean isWithPrefix) {
+        return getDateTimeId(prefix, isWithPrefix, DEFAULT_MIN_ID_CAPACITY_BITS);
+    }
+
+    /**
+     * 获取 prefix + yyyyMMddHHmmss 格式的唯一id
+     *
+     * @param prefix            业务前缀
+     * @param isWithPrefix      id是否携带业务前缀
+     * @param minIdCapacityBits 最小ID容量位数,小于该位数的ID,左补0(小于等于0表示不启用补位)
+     * @return 唯一id
+     */
+    public static String getDateTimeId(String prefix, boolean isWithPrefix, int minIdCapacityBits) {
+        return getDateTimeId(prefix, isWithPrefix, minIdCapacityBits, LocalDateTime.now());
+    }
+
+    /**
+     * 获取 prefix + yyyyMMddHHmmss 格式的唯一id
+     *
+     * @param prefix            业务前缀
+     * @param isWithPrefix      id是否携带业务前缀
+     * @param minIdCapacityBits 最小ID容量位数,小于该位数的ID,左补0(小于等于0表示不启用补位)
+     * @param time              时间
+     * @return 唯一id
+     */
+    public static String getDateTimeId(String prefix, boolean isWithPrefix, int minIdCapacityBits, LocalDateTime time) {
+        return getDateTimeId(prefix, isWithPrefix, minIdCapacityBits, time, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE);
     }
 
+    /**
+     * 获取 prefix + yyyyMMddHHmmss 格式的唯一id
+     *
+     * @param prefix            业务前缀
+     * @param isWithPrefix      id是否携带业务前缀
+     * @param minIdCapacityBits 最小ID容量位数,小于该位数的ID,左补0(小于等于0表示不启用补位)
+     * @param initValue         ID初始值
+     * @param stepValue         ID步长
+     * @return 唯一id
+     */
+    public static String getDateTimeId(String prefix, boolean isWithPrefix, int minIdCapacityBits, LocalDateTime time, long initValue, long stepValue) {
+        return getDatePatternId(prefix, isWithPrefix, minIdCapacityBits, time, DatePattern.PURE_DATETIME_FORMATTER, DEFAULT_EXPIRE_TIME_MINUTE, initValue, stepValue);
+    }
+
+    /**
+     * 获取指定业务key的指定时间格式的ID
+     *
+     * @param prefix            业务前缀
+     * @param isWithPrefix      id是否携带业务前缀
+     * @param minIdCapacityBits 最小ID容量位数,小于该位数的ID,左补0(小于等于0表示不启用补位)
+     * @param temporalAccessor  时间访问器
+     * @param timeFormatter     时间格式
+     * @param expireTime        过期时间
+     * @param initValue         ID初始值
+     * @param stepValue         ID步长
+     * @return 唯一id
+     */
+    private static String getDatePatternId(String prefix, boolean isWithPrefix, int minIdCapacityBits, TemporalAccessor temporalAccessor, DateTimeFormatter timeFormatter, Duration expireTime, long initValue, long stepValue) {
+        // 时间前缀
+        String timePrefix = timeFormatter.format(temporalAccessor);
+        // 业务前缀 + 时间前缀 构建 prefixKey
+        String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), timePrefix);
+
+        // 获取id,例 -> 1
+        String nextId = getNextIdString(prefixKey, expireTime, initValue, stepValue);
+
+        // minIdCapacityBits 大于0,且 nextId 的长度小于 minIdCapacityBits,则左补0
+        if (minIdCapacityBits > 0 && nextId.length() < minIdCapacityBits) {
+            nextId = StringUtils.leftPad(nextId, minIdCapacityBits, '0');
+        }
+
+        // 是否携带业务前缀
+        if (isWithPrefix) {
+            // 例 -> P202507031
+            // 其中 P 为业务前缀,202507031 为 yyyyMMdd 格式时间, 1 为nextId
+            return StringUtils.format("{}{}", prefixKey, nextId);
+        }
+        // 例 -> 202507031
+        // 其中 202507031 为 yyyyMMdd 格式时间, 1 为nextId
+        return StringUtils.format("{}{}", timePrefix, nextId);
+    }
 }

+ 17 - 13
SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/src/main/java/com/vber/common/satoken/core/dao/PlusSaTokenDao.java

@@ -1,6 +1,6 @@
 package com.vber.common.satoken.core.dao;
 
-import cn.dev33.satoken.dao.SaTokenDao;
+import cn.dev33.satoken.dao.auto.SaTokenDaoBySessionFollowObject;
 import cn.dev33.satoken.util.SaFoxUtil;
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
  *
  * @author Iwb
  */
-public class PlusSaTokenDao implements SaTokenDao {
+public class PlusSaTokenDao implements SaTokenDaoBySessionFollowObject {
 
     private static final Cache<String, Object> CAFFEINE = Caffeine.newBuilder()
             // 设置最后一次写入或访问后经过固定时间过期
@@ -51,11 +51,7 @@ public class PlusSaTokenDao implements SaTokenDao {
         if (timeout == NEVER_EXPIRE) {
             RedisUtils.setCacheObject(key, value);
         } else {
-            if (RedisUtils.hasKey(key)) {
-                RedisUtils.setCacheObject(key, value, true);
-            } else {
-                RedisUtils.setCacheObject(key, value, Duration.ofSeconds(timeout));
-            }
+            RedisUtils.setCacheObject(key, value, Duration.ofSeconds(timeout));
         }
         CAFFEINE.invalidate(key);
     }
@@ -107,6 +103,19 @@ public class PlusSaTokenDao implements SaTokenDao {
         return o;
     }
 
+    /**
+     * 获取 Object (指定反序列化类型),如无返空
+     *
+     * @param key 键名称
+     * @return object
+     */
+    @SuppressWarnings("unchecked cast")
+    @Override
+    public <T> T getObject(String key, Class<T> classType) {
+        Object o = CAFFEINE.get(key, k -> RedisUtils.getCacheObject(key));
+        return (T) o;
+    }
+
     /**
      * 写入Object,并设定存活时间 (单位: 秒)
      */
@@ -119,11 +128,7 @@ public class PlusSaTokenDao implements SaTokenDao {
         if (timeout == NEVER_EXPIRE) {
             RedisUtils.setCacheObject(key, object);
         } else {
-            if (RedisUtils.hasKey(key)) {
-                RedisUtils.setCacheObject(key, object, true);
-            } else {
-                RedisUtils.setCacheObject(key, object, Duration.ofSeconds(timeout));
-            }
+            RedisUtils.setCacheObject(key, object, Duration.ofSeconds(timeout));
         }
         CAFFEINE.invalidate(key);
     }
@@ -165,7 +170,6 @@ public class PlusSaTokenDao implements SaTokenDao {
         RedisUtils.expire(key, Duration.ofSeconds(timeout));
     }
 
-
     /**
      * 搜索数据
      */

+ 0 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/src/main/java/com/vber/common/satoken/core/service/SaPermissionImpl.java

@@ -9,7 +9,6 @@ import com.vber.common.core.service.PermissionService;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.satoken.utils.LoginHelper;
-import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.ArrayList;
 import java.util.List;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/src/main/java/com/vber/common/satoken/utils/LoginHelper.java

@@ -6,8 +6,8 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
-import com.vber.common.core.constant.TenantConstants;
 import com.vber.common.core.constant.SystemConstants;
+import com.vber.common.core.constant.TenantConstants;
 import com.vber.common.core.domain.model.LoginUser;
 import com.vber.common.core.enums.UserType;
 import lombok.AccessLevel;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-security/src/main/java/com/vber/common/security/handler/AllUrlHandler.java

@@ -1,8 +1,8 @@
 package com.vber.common.security.handler;
 
 import cn.hutool.core.util.ReUtil;
-import lombok.Data;
 import com.vber.common.core.utils.SpringUtils;
+import lombok.Data;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.web.method.HandlerMethod;
 import org.springframework.web.servlet.mvc.method.RequestMappingInfo;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-sms/pom.xml

@@ -23,7 +23,7 @@
             <groupId>com.vap</groupId>
             <artifactId>vber-common-redis</artifactId>
         </dependency>
-    
+
     </dependencies>
 
 </project>

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/config/SocialAutoConfiguration.java

@@ -1,8 +1,8 @@
 package com.vber.common.social.config;
 
-import me.zhyd.oauth.cache.AuthStateCache;
 import com.vber.common.social.config.properties.SocialProperties;
 import com.vber.common.social.utils.AuthRedisStateCache;
+import me.zhyd.oauth.cache.AuthStateCache;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/gitea/AuthGiteaRequest.java

@@ -3,6 +3,8 @@ package com.vber.common.social.gitea;
 import cn.hutool.core.lang.Dict;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
+import com.vber.common.core.utils.SpringUtils;
+import com.vber.common.json.utils.JsonUtils;
 import lombok.extern.slf4j.Slf4j;
 import me.zhyd.oauth.cache.AuthStateCache;
 import me.zhyd.oauth.config.AuthConfig;
@@ -11,8 +13,6 @@ import me.zhyd.oauth.model.AuthCallback;
 import me.zhyd.oauth.model.AuthToken;
 import me.zhyd.oauth.model.AuthUser;
 import me.zhyd.oauth.request.AuthDefaultRequest;
-import com.vber.common.core.utils.SpringUtils;
-import com.vber.common.json.utils.JsonUtils;
 
 /**
  * @author Iwb

+ 4 - 4
SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/maxkey/AuthMaxKeyRequest.java

@@ -1,6 +1,8 @@
 package com.vber.common.social.maxkey;
 
 import cn.hutool.core.lang.Dict;
+import com.vber.common.core.utils.SpringUtils;
+import com.vber.common.json.utils.JsonUtils;
 import me.zhyd.oauth.cache.AuthStateCache;
 import me.zhyd.oauth.config.AuthConfig;
 import me.zhyd.oauth.exception.AuthException;
@@ -8,8 +10,6 @@ import me.zhyd.oauth.model.AuthCallback;
 import me.zhyd.oauth.model.AuthToken;
 import me.zhyd.oauth.model.AuthUser;
 import me.zhyd.oauth.request.AuthDefaultRequest;
-import com.vber.common.core.utils.SpringUtils;
-import com.vber.common.json.utils.JsonUtils;
 
 /**
  * @author 长春叭哥 2023年03月26日
@@ -30,7 +30,7 @@ public class AuthMaxKeyRequest extends AuthDefaultRequest {
     }
 
     @Override
-    public  AuthToken getAccessToken(AuthCallback authCallback) {
+    public AuthToken getAccessToken(AuthCallback authCallback) {
         String body = doPostAuthorizationCode(authCallback.getCode());
         Dict object = JsonUtils.parseMap(body);
         // oauth/token 验证异常
@@ -51,7 +51,7 @@ public class AuthMaxKeyRequest extends AuthDefaultRequest {
     }
 
     @Override
-    public  AuthUser getUserInfo(AuthToken authToken) {
+    public AuthUser getUserInfo(AuthToken authToken) {
         String body = doGetUserInfo(authToken);
         Dict object = JsonUtils.parseMap(body);
         // oauth/token 验证异常

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/utils/AuthRedisStateCache.java

@@ -1,9 +1,9 @@
 package com.vber.common.social.utils;
 
-import lombok.AllArgsConstructor;
-import me.zhyd.oauth.cache.AuthStateCache;
 import com.vber.common.core.constant.GlobalConstants;
 import com.vber.common.redis.utils.RedisUtils;
+import lombok.AllArgsConstructor;
+import me.zhyd.oauth.cache.AuthStateCache;
 
 import java.time.Duration;
 

+ 4 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/com/vber/common/social/utils/SocialUtils.java

@@ -58,9 +58,11 @@ public class SocialUtils {
             case "linkedin" -> new AuthLinkedinRequest(builder.build(), STATE_CACHE);
             case "microsoft" -> new AuthMicrosoftRequest(builder.build(), STATE_CACHE);
             case "renren" -> new AuthRenrenRequest(builder.build(), STATE_CACHE);
-            case "stack_overflow" -> new AuthStackOverflowRequest(builder.stackOverflowKey(obj.getStackOverflowKey()).build(), STATE_CACHE);
+            case "stack_overflow" ->
+                    new AuthStackOverflowRequest(builder.stackOverflowKey(obj.getStackOverflowKey()).build(), STATE_CACHE);
             case "huawei" -> new AuthHuaweiV3Request(builder.build(), STATE_CACHE);
-            case "wechat_enterprise" -> new AuthWeChatEnterpriseQrcodeV2Request(builder.agentId(obj.getAgentId()).build(), STATE_CACHE);
+            case "wechat_enterprise" ->
+                    new AuthWeChatEnterpriseQrcodeV2Request(builder.agentId(obj.getAgentId()).build(), STATE_CACHE);
             case "gitlab" -> new AuthGitlabRequest(builder.build(), STATE_CACHE);
             case "wechat_mp" -> new AuthWeChatMpRequest(builder.build(), STATE_CACHE);
             case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE);

+ 27 - 28
SERVER/VberAdminPlusV3/vber-common/vber-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java

@@ -10,7 +10,6 @@ import me.zhyd.oauth.exception.AuthException;
 import me.zhyd.oauth.model.AuthCallback;
 import me.zhyd.oauth.model.AuthToken;
 import me.zhyd.oauth.model.AuthUser;
-import me.zhyd.oauth.request.AuthDefaultRequest;
 import me.zhyd.oauth.utils.HttpUtils;
 import me.zhyd.oauth.utils.StringUtils;
 import me.zhyd.oauth.utils.UrlBuilder;
@@ -23,7 +22,7 @@ import me.zhyd.oauth.utils.UrlBuilder;
 public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultRequest {
 
     public AbstractAuthWeChatEnterpriseRequest(AuthConfig config, AuthSource source) {
-        super(config,source);
+        super(config, source);
     }
 
 
@@ -38,10 +37,10 @@ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultReq
         JSONObject object = this.checkResponse(response);
 
         return AuthToken.builder()
-            .accessToken(object.getString("access_token"))
-            .expireIn(object.getIntValue("expires_in"))
-            .code(authCallback.getCode())
-            .build();
+                .accessToken(object.getString("access_token"))
+                .expireIn(object.getIntValue("expires_in"))
+                .code(authCallback.getCode())
+                .build();
     }
 
     @Override
@@ -59,17 +58,17 @@ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultReq
         JSONObject userDetail = getUserDetail(authToken.getAccessToken(), userId, userTicket);
 
         return AuthUser.builder()
-            .rawUserInfo(userDetail)
-            .username(userDetail.getString("name"))
-            .nickname(userDetail.getString("alias"))
-            .avatar(userDetail.getString("avatar"))
-            .location(userDetail.getString("address"))
-            .email(userDetail.getString("email"))
-            .uuid(userId)
-            .gender(AuthUserGender.getWechatRealGender(userDetail.getString("gender")))
-            .token(authToken)
-            .source(source.toString())
-            .build();
+                .rawUserInfo(userDetail)
+                .username(userDetail.getString("name"))
+                .nickname(userDetail.getString("alias"))
+                .avatar(userDetail.getString("avatar"))
+                .location(userDetail.getString("address"))
+                .email(userDetail.getString("email"))
+                .uuid(userId)
+                .gender(AuthUserGender.getWechatRealGender(userDetail.getString("gender")))
+                .token(authToken)
+                .source(source.toString())
+                .build();
     }
 
     /**
@@ -98,9 +97,9 @@ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultReq
     @Override
     protected String accessTokenUrl(String code) {
         return UrlBuilder.fromBaseUrl(source.accessToken())
-            .queryParam("corpid", config.getClientId())
-            .queryParam("corpsecret", config.getClientSecret())
-            .build();
+                .queryParam("corpid", config.getClientId())
+                .queryParam("corpsecret", config.getClientSecret())
+                .build();
     }
 
     /**
@@ -112,9 +111,9 @@ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultReq
     @Override
     protected String userInfoUrl(AuthToken authToken) {
         return UrlBuilder.fromBaseUrl(source.userInfo())
-            .queryParam("access_token", authToken.getAccessToken())
-            .queryParam("code", authToken.getCode())
-            .build();
+                .queryParam("access_token", authToken.getAccessToken())
+                .queryParam("code", authToken.getCode())
+                .build();
     }
 
     /**
@@ -128,17 +127,17 @@ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultReq
     private JSONObject getUserDetail(String accessToken, String userId, String userTicket) {
         // 用户基础信息
         String userInfoUrl = UrlBuilder.fromBaseUrl("https://qyapi.weixin.qq.com/cgi-bin/user/get")
-            .queryParam("access_token", accessToken)
-            .queryParam("userid", userId)
-            .build();
+                .queryParam("access_token", accessToken)
+                .queryParam("userid", userId)
+                .build();
         String userInfoResponse = new HttpUtils(config.getHttpConfig()).get(userInfoUrl).getBody();
         JSONObject userInfo = checkResponse(userInfoResponse);
 
         // 用户敏感信息
         if (StringUtils.isNotEmpty(userTicket)) {
             String userDetailUrl = UrlBuilder.fromBaseUrl("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail")
-                .queryParam("access_token", accessToken)
-                .build();
+                    .queryParam("access_token", accessToken)
+                    .build();
             JSONObject param = new JSONObject();
             param.put("user_ticket", userTicket);
             String userDetailResponse = new HttpUtils(config.getHttpConfig()).post(userDetailUrl, param.toJSONString()).getBody();

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-sse/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>

+ 3 - 28
SERVER/VberAdminPlusV3/vber-common/vber-common-sse/src/main/java/com/vber/common/sse/controller/SseController.java

@@ -5,7 +5,6 @@ import cn.dev33.satoken.stp.StpUtil;
 import com.vber.common.core.domain.R;
 import com.vber.common.satoken.utils.LoginHelper;
 import com.vber.common.sse.core.SseEmitterManager;
-import com.vber.common.sse.dto.SseMessageDto;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -14,8 +13,6 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
-import java.util.List;
-
 /**
  * SSE 控制器
  *
@@ -33,6 +30,9 @@ public class SseController implements DisposableBean {
      */
     @GetMapping(value = "${sse.path}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
     public SseEmitter connect() {
+        if (!StpUtil.isLogin()) {
+            return null;
+        }
         String tokenValue = StpUtil.getTokenValue();
         Long userId = LoginHelper.getUserId();
         return sseEmitterManager.connect(userId, tokenValue);
@@ -50,31 +50,6 @@ public class SseController implements DisposableBean {
         return R.ok();
     }
 
-    /**
-     * 向特定用户发送消息
-     *
-     * @param userId 目标用户的 ID
-     * @param msg    要发送的消息内容
-     */
-    @GetMapping(value = "${sse.path}/send")
-    public R<Void> send(Long userId, String msg) {
-        SseMessageDto dto = new SseMessageDto();
-        dto.setUserIds(List.of(userId));
-        dto.setMessage(msg);
-        sseEmitterManager.publishMessage(dto);
-        return R.ok();
-    }
-
-    /**
-     * 向所有用户发送消息
-     *
-     * @param msg 要发送的消息内容
-     */
-    @GetMapping(value = "${sse.path}/sendAll")
-    public R<Void> send(String msg) {
-        sseEmitterManager.publishAll(msg);
-        return R.ok();
-    }
 
     /**
      * 清理资源。此方法目前不执行任何操作,但避免因未实现而导致错误

+ 3 - 3
SERVER/VberAdminPlusV3/vber-common/vber-common-sse/src/main/java/com/vber/common/sse/core/SseEmitterManager.java

@@ -1,9 +1,9 @@
 package com.vber.common.sse.core;
 
 import cn.hutool.core.map.MapUtil;
-import lombok.extern.slf4j.Slf4j;
 import com.vber.common.redis.utils.RedisUtils;
 import com.vber.common.sse.dto.SseMessageDto;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import java.io.IOException;
@@ -38,8 +38,8 @@ public class SseEmitterManager {
         // 每个用户可以有多个 SSE 连接,通过 token 进行区分
         Map<String, SseEmitter> emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>());
 
-        // 创建一个新的 SseEmitter 实例,超时时间设置为 0 表示无限制
-        SseEmitter emitter = new SseEmitter(0L);
+        // 创建一个新的 SseEmitter 实例,超时时间设置为一天 避免连接之后直接关闭浏览器导致连接停滞
+        SseEmitter emitter = new SseEmitter(86400000L);
 
         emitters.put(token, emitter);
 

+ 13 - 14
SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/config/TenantConfig.java

@@ -16,7 +16,6 @@ import org.redisson.config.ClusterServersConfig;
 import org.redisson.config.SingleServerConfig;
 import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.cache.CacheManager;
@@ -33,19 +32,6 @@ import org.springframework.context.annotation.Primary;
 @ConditionalOnProperty(value = "tenant.enable", havingValue = "true")
 public class TenantConfig {
 
-    @AutoConfiguration
-    static class MybatisPlusConfiguration {
-
-        /**
-         * 多租户插件
-         */
-        @Bean
-        public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) {
-            return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties));
-        }
-
-    }
-
     @Bean
     public RedissonAutoConfigurationCustomizer tenantRedissonCustomizer(RedissonProperties redissonProperties) {
         return config -> {
@@ -83,4 +69,17 @@ public class TenantConfig {
         return new TenantSaTokenDao();
     }
 
+    @AutoConfiguration
+    static class MybatisPlusConfiguration {
+
+        /**
+         * 多租户插件
+         */
+        @Bean
+        public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) {
+            return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties));
+        }
+
+    }
+
 }

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/core/TenantEntity.java

@@ -1,8 +1,8 @@
 package com.vber.common.tenant.core;
 
+import com.vber.common.mybatis.core.domain.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import com.vber.common.mybatis.core.domain.BaseEntity;
 
 /**
  * 租户基类

+ 1 - 3
SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/helper/TenantHelper.java

@@ -8,13 +8,11 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
 import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
 import com.vber.common.core.constant.GlobalConstants;
-import com.vber.common.core.utils.ServletUtils;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.core.utils.reflect.ReflectUtils;
 import com.vber.common.redis.utils.RedisUtils;
 import com.vber.common.satoken.utils.LoginHelper;
-import jakarta.servlet.http.HttpServletRequest;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -136,7 +134,7 @@ public class TenantHelper {
         }
         SaStorage storage = SaHolder.getStorage();
         String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
-        tenantId =  storage.getString(cacheKey);
+        tenantId = storage.getString(cacheKey);
         // 如果为 -1 说明已经查过redis并且不存在值 则直接返回null
         if (StringUtils.isNotBlank(tenantId)) {
             return tenantId.equals("-1") ? null : tenantId;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/handler/TranslationHandler.java

@@ -7,11 +7,11 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonSerializer;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.ContextualSerializer;
-import lombok.extern.slf4j.Slf4j;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.core.utils.reflect.ReflectUtils;
 import com.vber.common.translation.annotation.Translation;
 import com.vber.common.translation.core.TranslationInterface;
+import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
 import java.util.Map;

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/impl/DictTypeTranslationImpl.java

@@ -1,11 +1,11 @@
 package com.vber.common.translation.core.impl;
 
-import lombok.AllArgsConstructor;
 import com.vber.common.core.service.DictService;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.translation.annotation.TranslationType;
 import com.vber.common.translation.constant.TransConstant;
 import com.vber.common.translation.core.TranslationInterface;
+import lombok.AllArgsConstructor;
 
 /**
  * 字典翻译实现

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/impl/OssUrlTranslationImpl.java

@@ -1,10 +1,10 @@
 package com.vber.common.translation.core.impl;
 
-import lombok.AllArgsConstructor;
 import com.vber.common.core.service.OssService;
 import com.vber.common.translation.annotation.TranslationType;
 import com.vber.common.translation.constant.TransConstant;
 import com.vber.common.translation.core.TranslationInterface;
+import lombok.AllArgsConstructor;
 
 /**
  * OSS翻译实现

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/impl/UserNameTranslationImpl.java

@@ -1,10 +1,10 @@
 package com.vber.common.translation.core.impl;
 
-import lombok.AllArgsConstructor;
 import com.vber.common.core.service.UserService;
 import com.vber.common.translation.annotation.TranslationType;
 import com.vber.common.translation.constant.TransConstant;
 import com.vber.common.translation.core.TranslationInterface;
+import lombok.AllArgsConstructor;
 
 /**
  * 用户名翻译实现

+ 16 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/config/ResourcesConfig.java

@@ -1,9 +1,12 @@
 package com.vber.common.web.config;
 
+import cn.hutool.core.date.DateUtil;
+import com.vber.common.core.utils.StringUtils;
 import com.vber.common.web.handler.GlobalExceptionHandler;
 import com.vber.common.web.interceptor.PlusWebInvokeTimeInterceptor;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.context.annotation.Bean;
+import org.springframework.format.FormatterRegistry;
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
@@ -11,6 +14,8 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
+import java.util.Date;
+
 /**
  * 通用配置
  *
@@ -25,6 +30,17 @@ public class ResourcesConfig implements WebMvcConfigurer {
         registry.addInterceptor(new PlusWebInvokeTimeInterceptor());
     }
 
+    @Override
+    public void addFormatters(FormatterRegistry registry) {
+        // 全局日期格式转换配置
+        registry.addConverter(String.class, Date.class, source -> {
+            if (StringUtils.isBlank(source)) {
+                return null;
+            }
+            return DateUtil.parse(source);
+        });
+    }
+
     @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
     }

+ 5 - 5
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/handler/GlobalExceptionHandler.java

@@ -3,17 +3,17 @@ package com.vber.common.web.handler;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpStatus;
 import com.fasterxml.jackson.core.JsonParseException;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.ConstraintViolationException;
-import lombok.extern.slf4j.Slf4j;
 import com.vber.common.core.domain.R;
 import com.vber.common.core.exception.ServiceException;
 import com.vber.common.core.exception.SseException;
 import com.vber.common.core.exception.base.BaseException;
 import com.vber.common.core.utils.StreamUtils;
 import com.vber.common.json.utils.JsonUtils;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.ConstraintViolation;
+import jakarta.validation.ConstraintViolationException;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.support.DefaultMessageSourceResolvable;
 import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.validation.BindException;

+ 2 - 2
SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>

+ 25 - 25
SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/src/main/java/com/vber/job/admin/controller/JobInfoController.java

@@ -43,31 +43,6 @@ public class JobInfoController {
     @Resource
     private XxlJobService xxlJobService;
 
-    @RequestMapping
-    public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) {
-
-        // 枚举-字典
-        model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values());        // 路由策略-列表
-        model.addAttribute("GlueTypeEnum", GlueTypeEnum.values());                                // Glue类型-字典
-        model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values());        // 阻塞处理策略-字典
-        model.addAttribute("ScheduleTypeEnum", ScheduleTypeEnum.values());                        // 调度类型
-        model.addAttribute("MisfireStrategyEnum", MisfireStrategyEnum.values());                    // 调度过期策略
-
-        // 执行器列表
-        List<XxlJobGroup> jobGroupList_all = xxlJobGroupDao.findAll();
-
-        // filter group
-        List<XxlJobGroup> jobGroupList = filterJobGroupByRole(request, jobGroupList_all);
-        if (jobGroupList == null || jobGroupList.size() == 0) {
-            throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
-        }
-
-        model.addAttribute("JobGroupList", jobGroupList);
-        model.addAttribute("jobGroup", jobGroup);
-
-        return "jobinfo/jobinfo.index";
-    }
-
     public static List<XxlJobGroup> filterJobGroupByRole(HttpServletRequest request, List<XxlJobGroup> jobGroupList_all) {
         List<XxlJobGroup> jobGroupList = new ArrayList<>();
         if (jobGroupList_all != null && jobGroupList_all.size() > 0) {
@@ -96,6 +71,31 @@ public class JobInfoController {
         }
     }
 
+    @RequestMapping
+    public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) {
+
+        // 枚举-字典
+        model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values());        // 路由策略-列表
+        model.addAttribute("GlueTypeEnum", GlueTypeEnum.values());                                // Glue类型-字典
+        model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values());        // 阻塞处理策略-字典
+        model.addAttribute("ScheduleTypeEnum", ScheduleTypeEnum.values());                        // 调度类型
+        model.addAttribute("MisfireStrategyEnum", MisfireStrategyEnum.values());                    // 调度过期策略
+
+        // 执行器列表
+        List<XxlJobGroup> jobGroupList_all = xxlJobGroupDao.findAll();
+
+        // filter group
+        List<XxlJobGroup> jobGroupList = filterJobGroupByRole(request, jobGroupList_all);
+        if (jobGroupList == null || jobGroupList.size() == 0) {
+            throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
+        }
+
+        model.addAttribute("JobGroupList", jobGroupList);
+        model.addAttribute("jobGroup", jobGroup);
+
+        return "jobinfo/jobinfo.index";
+    }
+
     @RequestMapping("/pageList")
     @ResponseBody
     public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,

+ 2 - 3
SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/src/main/java/com/vber/job/admin/controller/JobLogController.java

@@ -42,13 +42,12 @@ import java.util.Map;
 @RequestMapping("/joblog")
 public class JobLogController {
     private static Logger logger = LoggerFactory.getLogger(JobLogController.class);
-
-    @Resource
-    private XxlJobGroupDao xxlJobGroupDao;
     @Resource
     public XxlJobInfoDao xxlJobInfoDao;
     @Resource
     public XxlJobLogDao xxlJobLogDao;
+    @Resource
+    private XxlJobGroupDao xxlJobGroupDao;
 
     @RequestMapping
     public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {

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