ソースを参照

Merge branch 'work-flow_update' of VberAdmin/VberAdminPlusV3 into dev

YueYunyun 9 ヶ月 前
コミット
1e28bda589
100 ファイル変更3456 行追加2722 行削除
  1. 1 0
      .gitignore
  2. 75 0
      SERVER/VberAdminPlusV3/.script/leave/leave1.json
  3. 111 0
      SERVER/VberAdminPlusV3/.script/leave/leave2.json
  4. 121 0
      SERVER/VberAdminPlusV3/.script/leave/leave3.json
  5. 90 0
      SERVER/VberAdminPlusV3/.script/leave/leave4.json
  6. 121 0
      SERVER/VberAdminPlusV3/.script/leave/leave5.json
  7. 215 0
      SERVER/VberAdminPlusV3/.script/leave/leave6.json
  8. 232 144
      SERVER/VberAdminPlusV3/.script/sql/flow.sql
  9. 12 7
      SERVER/VberAdminPlusV3/pom.xml
  10. 19 24
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml
  11. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/constant/CacheNames.java
  12. 71 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/CompleteTaskDTO.java
  13. 4 4
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/FlowCopyDTO.java
  14. 6 6
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/OrgDTO.java
  15. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/PostDTO.java
  16. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/RoleDTO.java
  17. 45 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/StartProcessDTO.java
  18. 30 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/StartProcessReturnDTO.java
  19. 101 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/TaskAssigneeDTO.java
  20. 34 6
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/event/ProcessEvent.java
  21. 30 8
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/event/ProcessTaskEvent.java
  22. 56 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/model/TaskAssigneeBody.java
  23. 95 18
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/enums/BusinessStatusEnum.java
  24. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/PermissionService.java
  25. 45 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/TaskAssigneeService.java
  26. 34 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/UserService.java
  27. 46 27
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/WorkflowService.java
  28. 27 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/TreeBuildUtils.java
  29. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/json/handler/CustomDateDeserializer.java
  30. 16 3
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/InjectionMetaObjectHandler.java
  31. 3 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-oss/src/main/java/com/vber/common/oss/core/OssClient.java
  32. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-ratelimiter/src/main/resources/spel-extension.json
  33. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/handler/RedisExceptionHandler.java
  34. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-translation/src/main/java/com/vber/common/translation/core/impl/NicknameTranslationImpl.java
  35. 1 4
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/controller/GenController.java
  36. 1 1
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/SysRole.java
  37. 1 1
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/bo/SysRoleBo.java
  38. 1 1
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysRoleVo.java
  39. 2 2
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/mapper/SysOrgMapper.java
  40. 3 3
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/ISysOrgService.java
  41. 6 14
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysClientServiceImpl.java
  42. 4 4
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysDataScopeServiceImpl.java
  43. 15 22
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysOrgServiceImpl.java
  44. 138 0
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysTaskAssigneeServiceImpl.java
  45. 80 5
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysUserServiceImpl.java
  46. 9 49
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/pom.xml
  47. 29 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/ConditionalOnEnable.java
  48. 29 89
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/constant/FlowConstant.java
  49. 65 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/ButtonPermissionEnum.java
  50. 0 54
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/FormTypeEnum.java
  51. 11 10
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/MessageTypeEnum.java
  52. 32 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/NodeExtEnum.java
  53. 109 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/TaskAssigneeEnum.java
  54. 49 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/TaskAssigneeType.java
  55. 22 12
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/TaskStatusEnum.java
  56. 16 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/config/WarmFlowConfig.java
  57. 0 158
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/ActModelController.java
  58. 0 157
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/ActProcessDefinitionController.java
  59. 0 160
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/ActProcessInstanceController.java
  60. 0 302
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/ActTaskController.java
  61. 136 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/FlwCategoryController.java
  62. 194 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/FlwDefinitionController.java
  63. 157 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/FlwInstanceController.java
  64. 212 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/FlwTaskController.java
  65. 26 25
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/TestLeaveController.java
  66. 0 107
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/WfCategoryController.java
  67. 0 80
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/WfDefinitionConfigController.java
  68. 0 115
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/WfFormManageController.java
  69. 0 152
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/ActHiProcinst.java
  70. 0 194
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/ActHiTaskinst.java
  71. 67 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/FlowCategory.java
  72. 6 4
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/TestLeave.java
  73. 0 52
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfCategory.java
  74. 0 57
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfDefinitionConfig.java
  75. 0 52
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfFormManage.java
  76. 0 61
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfNodeConfig.java
  77. 0 61
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfTaskBackNode.java
  78. 0 40
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/AddMultiBo.java
  79. 31 6
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/BackProcessBo.java
  80. 22 7
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/CompleteTaskBo.java
  81. 0 38
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/DelegateBo.java
  82. 0 52
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/DeleteMultiBo.java
  83. 9 9
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowCancelBo.java
  84. 46 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowCategoryBo.java
  85. 30 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowCopyBo.java
  86. 55 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowInstanceBo.java
  87. 31 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowInvalidBo.java
  88. 38 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowNextNodeBo.java
  89. 55 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowTaskBo.java
  90. 5 5
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowTerminationBo.java
  91. 0 66
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/ModelBo.java
  92. 0 34
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/ProcessDefinitionBo.java
  93. 0 43
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/ProcessInstanceBo.java
  94. 5 5
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/StartProcessBo.java
  95. 0 39
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/SysUserMultiBo.java
  96. 0 33
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TaskBo.java
  97. 48 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TaskOperationBo.java
  98. 0 34
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TaskUrgingBo.java
  99. 12 8
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TestLeaveBo.java
  100. 0 37
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TransmitBo.java

+ 1 - 0
.gitignore

@@ -67,3 +67,4 @@ build/
 
 *.flattened-pom.xml
 /SERVER/**/vber/profile/
+UI/VAP_V3.VUE/pnpm-lock.yaml

+ 75 - 0
SERVER/VberAdminPlusV3/.script/leave/leave1.json

@@ -0,0 +1,75 @@
+{
+  "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" : "[]"
+  } ]
+}

+ 111 - 0
SERVER/VberAdminPlusV3/.script/leave/leave2.json

@@ -0,0 +1,111 @@
+{
+  "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"
+    } ]
+  } ]
+}

+ 121 - 0
SERVER/VberAdminPlusV3/.script/leave/leave3.json

@@ -0,0 +1,121 @@
+{
+  "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"
+    } ]
+  } ]
+}

+ 90 - 0
SERVER/VberAdminPlusV3/.script/leave/leave4.json

@@ -0,0 +1,90 @@
+{
+  "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" : "[]"
+  } ]
+}

+ 121 - 0
SERVER/VberAdminPlusV3/.script/leave/leave5.json

@@ -0,0 +1,121 @@
+{
+  "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"
+    } ]
+  } ]
+}

+ 215 - 0
SERVER/VberAdminPlusV3/.script/leave/leave6.json

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

+ 232 - 144
SERVER/VberAdminPlusV3/.script/sql/flow.sql

@@ -1,124 +1,209 @@
 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 '流程版本',
+    `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 '审批表单路径',
+    `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',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB COMMENT ='流程定义表';
 
--- 流程分类信息表
-DROP TABLE IF EXISTS wf_category;
-CREATE TABLE wf_category
+CREATE TABLE `flow_node`
 (
-    id            BIGINT       NOT NULL COMMENT '主键' PRIMARY KEY AUTO_INCREMENT,
-    category_name VARCHAR(255) NULL COMMENT '分类名称',
-    category_code VARCHAR(255) NULL COMMENT '分类编码',
-    parent_id     BIGINT       NULL COMMENT '父级id',
-    sort_num      INT(19)      NULL COMMENT '排序',
-    tenant_id     VARCHAR(20)  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 '更新时间',
-    CONSTRAINT uni_category_code UNIQUE (category_code)
-) ENGINE = innodb COMMENT = '流程分类'
-  AUTO_INCREMENT = 1000;
-
-DROP TABLE IF EXISTS wf_task_back_node;
-CREATE TABLE wf_task_back_node
+    `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 '流程节点编码',
+    `node_name`       varchar(100)  DEFAULT NULL COMMENT '流程节点名称',
+    `permission_flag` varchar(200)  DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用@@隔开)',
+    `node_ratio`      decimal(6, 3) DEFAULT NULL COMMENT '流程签署比例值',
+    `coordinate`      varchar(100)  DEFAULT NULL COMMENT '坐标',
+    `any_node_skip`   varchar(100)  DEFAULT NULL COMMENT '任意结点跳转',
+    `listener_type`   varchar(100)  DEFAULT NULL COMMENT '监听器类型',
+    `listener_path`   varchar(400)  DEFAULT NULL COMMENT '监听器路径',
+    `handler_type`    varchar(100)  DEFAULT NULL COMMENT '处理器类型',
+    `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 '版本',
+    `create_time`     datetime      DEFAULT NULL COMMENT '创建时间',
+    `update_time`     datetime      DEFAULT NULL COMMENT '更新时间',
+    `ext`             text          COMMENT '扩展属性',
+    `del_flag`        char(1)       DEFAULT '0' COMMENT '删除标志',
+    `tenant_id`       varchar(40)   DEFAULT NULL COMMENT '租户id',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB COMMENT ='流程节点表';
+
+CREATE TABLE `flow_skip`
 (
-    id          BIGINT        NOT NULL PRIMARY KEY AUTO_INCREMENT,
-    node_id     VARCHAR(255)  NOT NULL COMMENT '节点id',
-    node_name   VARCHAR(255)  NOT NULL COMMENT '节点名称',
-    order_no    INT           NOT NULL COMMENT '排序',
-    instance_id VARCHAR(255)  NULL COMMENT '流程实例id',
-    task_type   VARCHAR(255)  NOT NULL COMMENT '节点类型',
-    assignee    VARCHAR(2000) NOT NULL COMMENT '审批人',
-    tenant_id   VARCHAR(20)   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 '更新时间'
-) ENGINE = innodb COMMENT '节点审批记录'
-  AUTO_INCREMENT = 1000;
-
-DROP TABLE IF EXISTS wf_definition_config;
-CREATE TABLE wf_definition_config
+    `id`             bigint       NOT NULL AUTO_INCREMENT COMMENT '主键id',
+    `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_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退回)',
+    `skip_condition` varchar(200) DEFAULT NULL COMMENT '跳转条件',
+    `coordinate`     varchar(100) DEFAULT NULL COMMENT '坐标',
+    `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_instance`
 (
-    id            BIGINT                  NOT NULL COMMENT '主键' PRIMARY KEY AUTO_INCREMENT,
-    table_name    VARCHAR(255)            NOT NULL COMMENT '表名',
-    definition_id VARCHAR(255)            NOT NULL COMMENT '流程定义ID',
-    process_key   VARCHAR(255)            NOT NULL COMMENT '流程KEY',
-    version       INT(10)                 NOT 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 '更新时间',
-    remark        VARCHAR(500) DEFAULT '' NULL COMMENT '备注',
-    tenant_id     VARCHAR(20)             NULL COMMENT '租户编号',
-    CONSTRAINT uni_definition_id UNIQUE (definition_id)
-) ENGINE = innodb COMMENT '流程定义配置'
-  AUTO_INCREMENT = 1000;
-
-DROP TABLE IF EXISTS wf_form_manage;
-CREATE TABLE wf_form_manage
+    `id`              bigint      NOT NULL AUTO_INCREMENT COMMENT '主键id',
+    `definition_id`   bigint      NOT NULL COMMENT '对应flow_definition表的id',
+    `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 '流程节点名称',
+    `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',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB COMMENT ='流程实例表';
+
+CREATE TABLE `flow_task`
 (
-    id          BIGINT       NOT NULL COMMENT '主键' PRIMARY KEY AUTO_INCREMENT,
-    form_name   VARCHAR(255) NOT NULL COMMENT '表单名称',
-    form_type   VARCHAR(255) NOT NULL COMMENT '表单类型',
-    router      VARCHAR(255) NOT NULL COMMENT '路由地址/表单ID',
-    remark      VARCHAR(500) NULL COMMENT '备注',
-    tenant_id   VARCHAR(20)  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 '更新时间'
-) ENGINE = innodb COMMENT '表单管理'
-  AUTO_INCREMENT = 1000;
-
-DROP TABLE IF EXISTS wf_node_config;
-CREATE TABLE wf_node_config
+    `id`            bigint       NOT NULL AUTO_INCREMENT COMMENT '主键id',
+    `definition_id` bigint       NOT NULL COMMENT '对应flow_definition表的id',
+    `instance_id`   bigint       NOT NULL COMMENT '对应flow_instance表的id',
+    `node_code`     varchar(100) NOT NULL COMMENT '节点编码',
+    `node_name`     varchar(100) DEFAULT NULL COMMENT '节点名称',
+    `node_type`     tinyint(1)   NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
+    `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 '审批表单路径',
+    `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_his_task`
 (
-    id              BIGINT       NOT NULL COMMENT '主键' PRIMARY KEY AUTO_INCREMENT,
-    tenant_id       VARCHAR(20)  NULL COMMENT '租户编号',
-    form_id         BIGINT       NULL COMMENT '表单id',
-    form_type       VARCHAR(255) NULL COMMENT '表单类型',
-    node_name       VARCHAR(255) NOT NULL COMMENT '节点名称',
-    node_id         VARCHAR(255) NOT NULL COMMENT '节点id',
-    definition_id   VARCHAR(255) NOT NULL COMMENT '流程定义id',
-    apply_user_task CHAR(1) DEFAULT '0' COMMENT '是否为申请人节点 (0是 1否)',
-    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 '更新时间'
-) ENGINE = innodb COMMENT '节点配置'
-  AUTO_INCREMENT = 1000;
-
-INSERT INTO wf_category (id, category_name, category_code, parent_id, sort_num, tenant_id, create_org, create_by, create_time, update_by, update_time)
-VALUES (1, 'OA', 'OA', 0, 0, '000000', 100, 1, SYSDATE(), NULL, NULL);
-
-INSERT INTO wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_org, create_by, create_time, update_by, update_time)
-VALUES (1, '请假申请', 'static', '/demo/leave/edit', NULL, '000000', 100, 1, SYSDATE(), NULL, NULL);
+    `id`               bigint(20)          NOT NULL AUTO_INCREMENT COMMENT '主键id',
+    `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_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 '审批者',
+    `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',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB COMMENT ='历史任务记录表';
+
+
+CREATE TABLE `flow_user`
+(
+    `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',
+    `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
+) ENGINE = InnoDB COMMENT ='流程用户表';
+
+-- ----------------------------
+-- 流程分类表
+-- ----------------------------
+create table flow_category
+(
+    category_id   bigint(20)  not null  AUTO_INCREMENT comment '流程分类ID',
+    tenant_id     varchar(20)  default '000000' comment '租户编号',
+    parent_id     bigint(20)   default 0 comment '父流程分类id',
+    ancestors     varchar(500) default '' comment '祖级列表',
+    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_by     bigint(20)  null comment '创建者',
+    create_time   datetime    null comment '创建时间',
+    update_by     bigint(20)  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);
 
+-- ----------------------------
 -- 请假单信息
-DROP TABLE IF EXISTS wfi_leave_apply;
-CREATE TABLE wfi_leave_apply
+-- ----------------------------
+create table test_leave
 (
-    id          BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键',
-    leave_type  VARCHAR(255) NOT NULL COMMENT '请假类型',
-    start_date  DATETIME     NOT NULL COMMENT '开始时间',
-    end_date    DATETIME     NOT NULL COMMENT '结束时间',
-    leave_days  INT(10)      NOT NULL COMMENT '请假天数',
-    status      VARCHAR(255) NULL COMMENT '状态',
-    remark      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 '更新时间',
-    tenant_id   VARCHAR(20)  NULL COMMENT '租户编号',
+    id          bigint(20)   not null AUTO_INCREMENT comment 'id',
+    tenant_id   varchar(20) default '000000' comment '租户编号',
+    leave_type  varchar(255) not null comment '请假类型',
+    start_date  datetime     not null comment '开始时间',
+    end_date    datetime     not null comment '结束时间',
+    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 '更新时间',
     PRIMARY KEY (id) USING BTREE
-) ENGINE = InnoDB COMMENT = '请假申请表'
-  AUTO_INCREMENT = 1000;
+) 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)
@@ -130,29 +215,19 @@ VALUES (4, '工作流', 0, 4, 'workflow', '', '', '1', '0', 'M', '0', '0', '', '
        (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, ''),
 
-       (152, '模型管理', 4, 2, 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model', 'box-seam', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1131, '模型查询', 152, '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:model:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1132, '模型新增', 152, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:model:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1133, '模型修改', 152, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:model:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1134, '模型删除', 152, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:model:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1135, '模型导出', 152, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:model:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1136, '设计模型', 152, 6, '#', '', '', 1, 0, 'F', '1', '0', 'workflow:model:design', '', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1137, '部署模型', 152, 7, '#', '', '', 1, 0, 'F', '1', '0', 'workflow:model:deploy', '', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1138, '复制模型', 152, 8, '#', '', '', 1, 0, 'F', '1', '0', 'workflow:model:copy', '', '', '', 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, ''),
-       (1141, '流程查询', 153, '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1142, '部署流程', 153, '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:upload', 'cloud-upload', 'btn btn-light-success', 'handleUpload', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1143, '流程删除', 153, '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:definition:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 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, ''),
-       (157, '表单管理', 4, 5, 'formManage', 'workflow/formManage/index', '', 1, 0, 'C', '0', '0', 'workflow:formManage', 'bounding-box-circles', '', '', 100, 1, SYSDATE(), NULL, NULL, '表单管理菜单'),
-       (1201, '表单查询', 157, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:formManage:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1202, '表单新增', 157, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:formManage:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1203, '表单修改', 157, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:formManage:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1204, '表单删除', 157, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:formManage:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1205, '表单导出', 157, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:formManage: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, ''),
@@ -163,24 +238,37 @@ VALUES (4, '工作流', 0, 4, 'workflow', '', '', '1', '0', 'M', '0', '0', '', '
 -- 请假申请菜单
 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, '请假申请菜单'),
-       (1281, '申请查询', 171, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', 'eye', '', '', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1282, '申请新增', 171, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1283, '申请修改', 171, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1284, '申请删除', 171, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, SYSDATE(), NULL, NULL, ''),
-       (1285, '申请导出', 171, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', 'cloud-download', 'btn btn-light-info', 'handleExport', 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)
-VALUES (21, '000000', '业务状态', 'wf_business_status', 103, 1, SYSDATE(), NULL, NULL, '业务状态列表'),
-       (22, '000000', '表单类型', 'wf_form_type', 103, 1, SYSDATE(), NULL, NULL, '表单类型列表');
+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', 103, 1, SYSDATE(), NULL, NULL, '已撤销'),
-       (52, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, SYSDATE(), NULL, NULL, '草稿'),
-       (53, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '待审核'),
-       (54, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, SYSDATE(), NULL, NULL, '已完成'),
-       (55, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已作废'),
-       (56, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已退回'),
-       (57, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已终止'),
-       (61, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, SYSDATE(), NULL, NULL, '自定义表单'),
-       (62, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '动态表单');
+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, '动态表单'),
+       (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, '待审核'),
+       (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, '转办'),
+       (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, '超时');

+ 12 - 7
SERVER/VberAdminPlusV3/pom.xml

@@ -56,6 +56,9 @@
         <!-- 面向运行时的D-ORM依赖 -->
         <anyline.version>8.7.2-20250101</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>
@@ -63,8 +66,6 @@
         <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
         <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
 
-        <!--工作流配置-->
-        <flowable.version>7.0.1</flowable.version>
         <!-- 打包默认跳过测试 -->
         <skipTests>true</skipTests>
     </properties>
@@ -127,12 +128,16 @@
                 <scope>import</scope>
             </dependency>
 
+            <!-- Warm-Flow国产工作流引擎, 在线文档:http://warm-flow.cn/ -->
             <dependency>
-                <groupId>org.flowable</groupId>
-                <artifactId>flowable-bom</artifactId>
-                <version>${flowable.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
+                <groupId>org.dromara.warm</groupId>
+                <artifactId>warm-flow-mybatis-plus-sb3-starter</artifactId>
+                <version>${warm-flow.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.dromara.warm</groupId>
+                <artifactId>warm-flow-plugin-ui-sb-web</artifactId>
+                <version>${warm-flow.version}</version>
             </dependency>
 
             <!-- JustAuth 的依赖配置-->

+ 19 - 24
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml

@@ -127,6 +127,7 @@ security:
     # swagger 文档配置
     - /*/api-docs
     - /*/api-docs/**
+    - /warm-flow-ui/config
 
 # 多租户配置
 tenant:
@@ -204,7 +205,7 @@ springdoc:
     contact:
       name: IwbY
       email: crazylionli@163.com
-      url: https://gitee.com/dromara/VberAdminPlus
+      url: https://gitee.com/VberAdminPlus
   components:
     # 鉴权方式配置
     security-schemes:
@@ -232,8 +233,7 @@ xss:
   # 排除链接
   excludeUrls:
     - /system/notice
-    - /workflow/model/save
-    - /workflow/model/editModelXml
+
 
 # 全局线程池相关配置
 # 如使用JDK21请直接使用虚拟线程 不要开启此配置
@@ -278,25 +278,20 @@ websocket:
   # 设置访问源地址
   allowedOrigins: '*'
 
---- #flowable配置
-flowable:
-  # 开关 用于启动/停用工作流
-  enabled: true
-  process.enabled: ${flowable.enabled}
-  eventregistry.enabled: ${flowable.enabled}
-  async-executor-activate: false #关闭定时任务JOB
-  #  将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。
-  database-schema-update: false
-  activity-font-name: 宋体
-  label-font-name: 宋体
-  annotation-font-name: 宋体
-  # 关闭各个模块生成表,目前只使用工作流基础表
-  idm:
-    enabled: false
-  cmmn:
-    enabled: false
-  dmn:
-    enabled: false
-  app:
-    enabled: false
+--- # warm-flow工作流配置
+warm-flow:
+  # 是否开启工作流,默认true
+  enabled: ${vb.workflowEnabled:true}
+  # 是否开启设计器ui
+  ui: true
+  # 默认Authorization,如果有多个token,用逗号分隔
+  token-name: ${sa-token.token-name},clientid
+  # 流程状态对应的三元色
+  chart-status-color:
+    ## 未办理
+    - 62,62,62
+    ## 待办理
+    - 255,205,23
+    ## 已办理
+    - 157,255,0
 

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/constant/CacheNames.java

@@ -69,7 +69,7 @@ public interface CacheNames {
     String SYS_ROLE_CUSTOM = "sys_role_custom#30d";
 
     /**
-     * 部门及以下权限
+     * 组织机构及以下权限
      */
     String SYS_ORG_AND_CHILD = "sys_org_and_child#30d";
 

+ 71 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/CompleteTaskDTO.java

@@ -0,0 +1,71 @@
+package com.vber.common.core.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 办理任务请求对象
+ *
+ * @author Iwb
+ */
+@Data
+public class CompleteTaskDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务id
+     */
+    private Long taskId;
+
+    /**
+     * 附件id
+     */
+    private String fileId;
+
+    /**
+     * 抄送人员
+     */
+    private List<FlowCopyDTO> flowCopyList;
+
+    /**
+     * 消息类型
+     */
+    private List<String> messageType;
+
+    /**
+     * 办理意见
+     */
+    private String message;
+
+    /**
+     * 消息通知
+     */
+    private String notice;
+
+    /**
+     * 流程变量
+     */
+    private Map<String, Object> variables;
+
+    /**
+     * 扩展变量(此处为逗号分隔的ossId)
+     */
+    private String ext;
+
+    public Map<String, Object> getVariables() {
+        if (variables == null) {
+            return new HashMap<>(16);
+        }
+        variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
+        return variables;
+    }
+
+}

+ 4 - 4
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/vo/WfCopy.java → SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/FlowCopyDTO.java

@@ -1,17 +1,18 @@
-package com.vber.workflow.domain.vo;
+package com.vber.common.core.domain.dto;
 
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
 
+
 /**
  * 抄送
  *
- * @author iwb
+ * @author Iwb
  */
 @Data
-public class WfCopy implements Serializable {
+public class FlowCopyDTO implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
@@ -25,6 +26,5 @@ public class WfCopy implements Serializable {
      * 用户名称
      */
     private String userName;
-    private String nickName;
 
 }

+ 6 - 6
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/OrgDTO.java

@@ -7,7 +7,7 @@ import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * 部门
+ * 组织机构
  *
  * @author Iwb
  */
@@ -20,18 +20,18 @@ public class OrgDTO implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /**
-     * 部门ID
+     * 组织机构ID
      */
-    private Long deptId;
+    private Long orgId;
 
     /**
-     * 父部门ID
+     * 父组织机构ID
      */
     private Long parentId;
 
     /**
-     * 部门名称
+     * 组织机构名称
      */
-    private String deptName;
+    private String orgName;
 
 }

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

@@ -25,7 +25,7 @@ public class PostDTO implements Serializable {
     private Long postId;
 
     /**
-     * 部门id
+     * 组织机构id
      */
     private Long orgId;
 

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

@@ -34,7 +34,7 @@ public class RoleDTO implements Serializable {
     private String roleKey;
 
     /**
-     * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限)
+     * 数据范围(1:全部数据权限 2:自定数据权限 3:本组织机构数据权限 4:本组织机构及以下数据权限 5:仅本人数据权限 6:组织机构及以下或本人数据权限)
      */
     private String dataScope;
 

+ 45 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/StartProcessDTO.java

@@ -0,0 +1,45 @@
+package com.vber.common.core.domain.dto;
+
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 启动流程对象
+ *
+ * @author Iwb
+ */
+@Data
+public class StartProcessDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 业务唯一值id
+     */
+    private String businessId;
+
+    /**
+     * 流程定义编码
+     */
+    private String flowCode;
+
+    /**
+     * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}}
+     */
+    private Map<String, Object> variables;
+
+    public Map<String, Object> getVariables() {
+        if (variables == null) {
+            return new HashMap<>(16);
+        }
+        variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
+        return variables;
+    }
+}

+ 30 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/StartProcessReturnDTO.java

@@ -0,0 +1,30 @@
+package com.vber.common.core.domain.dto;
+
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 启动流程返回对象
+ *
+ * @author Iwb
+ */
+@Data
+public class StartProcessReturnDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 流程实例id
+     */
+    private Long processInstanceId;
+
+    /**
+     * 任务id
+     */
+    private Long taskId;
+
+}

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

@@ -0,0 +1,101 @@
+package com.vber.common.core.domain.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 任务受让人
+ *
+ * @author Iwb
+ */
+@Data
+@NoArgsConstructor
+public class TaskAssigneeDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 总大小
+     */
+    private Long total = 0L;
+
+    /**
+     *
+     */
+    private List<TaskHandler> list;
+
+    public TaskAssigneeDTO(Long total, List<TaskHandler> list) {
+        this.total = total;
+        this.list = list;
+    }
+
+    /**
+     * 将源列表转换为 TaskHandler 列表
+     *
+     * @param <T>              通用类型
+     * @param sourceList       待转换的源列表
+     * @param storageId        提取 storageId 的函数
+     * @param handlerCode      提取 handlerCode 的函数
+     * @param handlerName      提取 handlerName 的函数
+     * @param groupName        提取 groupName 的函数
+     * @param createTimeMapper 提取 createTime 的函数
+     * @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) {
+        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());
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class TaskHandler {
+
+        /**
+         * 主键
+         */
+        private String storageId;
+
+        /**
+         * 权限编码
+         */
+        private String handlerCode;
+
+        /**
+         * 权限名称
+         */
+        private String handlerName;
+
+        /**
+         * 权限分组
+         */
+        private String groupName;
+
+        /**
+         * 创建时间
+         */
+        private Date createTime;
+    }
+
+}

+ 34 - 6
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/event/ProcessEvent.java

@@ -4,34 +4,62 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.Map;
 
 /**
  * 总体流程监听
  *
- * @author Yue
+ * @author Iwb
  */
 @Data
 public class ProcessEvent implements Serializable {
+
     @Serial
     private static final long serialVersionUID = 1L;
 
     /**
-     * 流程定义key
+     * 租户ID
      */
-    private String key;
+    private String tenantId;
+
+    /**
+     * 流程定义编码
+     */
+    private String flowCode;
 
     /**
      * 业务id
      */
-    private String businessKey;
+    private String businessId;
 
     /**
-     * 状态
+     * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)
+     */
+    private Integer nodeType;
+
+    /**
+     * 流程节点编码
+     */
+    private String nodeCode;
+
+    /**
+     * 流程节点名称
+     */
+    private String nodeName;
+
+    /**
+     * 流程状态
      */
     private String status;
 
+    /**
+     * 办理参数
+     */
+    private Map<String, Object> params;
+
     /**
      * 当为true时为申请人节点办理
      */
-    private boolean submit;
+    private Boolean submit;
+
 }

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

@@ -6,32 +6,54 @@ import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * 流程创建任务监听
+ * 流程任务监听
  *
- * @author Yue
+ * @author Iwb
  */
 @Data
 public class ProcessTaskEvent implements Serializable {
+
     @Serial
     private static final long serialVersionUID = 1L;
 
     /**
-     * 流程定义key
+     * 租户ID
+     */
+    private String tenantId;
+
+    /**
+     * 流程定义编码
+     */
+    private String flowCode;
+
+    /**
+     * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)
      */
-    private String key;
+    private Integer nodeType;
 
     /**
-     * 审批节点key
+     * 流程节点编码
      */
-    private String taskDefinitionKey;
+    private String nodeCode;
+
+    /**
+     * 流程节点名称
+     */
+    private String nodeName;
 
     /**
      * 任务id
      */
-    private String taskId;
+    private Long taskId;
 
     /**
      * 业务id
      */
-    private String businessKey;
+    private String businessId;
+
+    /**
+     * 流程状态
+     */
+    private String status;
+
 }

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

@@ -0,0 +1,56 @@
+package com.vber.common.core.domain.model;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 任务受让人
+ *
+ * @author Iwb
+ */
+@Data
+@NoArgsConstructor
+public class TaskAssigneeBody implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 权限编码
+     */
+    private String handlerCode;
+
+    /**
+     * 权限名称
+     */
+    private String handlerName;
+
+    /**
+     * 权限分组
+     */
+    private String groupId;
+
+    /**
+     * 开始时间
+     */
+    private String beginTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+
+    /**
+     * 当前页
+     */
+    private Integer pageNum = 1;
+
+    /**
+     * 每页显示条数
+     */
+    private Integer pageSize = 10;
+
+}

+ 95 - 18
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/enums/BusinessStatusEnum.java

@@ -7,6 +7,10 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 
 import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 业务状态枚举
@@ -16,30 +20,37 @@ import java.util.Arrays;
 @Getter
 @AllArgsConstructor
 public enum BusinessStatusEnum {
+
     /**
      * 已撤销
      */
     CANCEL("cancel", "已撤销"),
+
     /**
      * 草稿
      */
     DRAFT("draft", "草稿"),
+
     /**
      * 待审核
      */
     WAITING("waiting", "待审核"),
+
     /**
      * 已完成
      */
     FINISH("finish", "已完成"),
+
     /**
      * 已作废
      */
     INVALID("invalid", "已作废"),
+
     /**
      * 已退回
      */
     BACK("back", "已退回"),
+
     /**
      * 已终止
      */
@@ -55,20 +66,72 @@ public enum BusinessStatusEnum {
      */
     private final String desc;
 
+    private static final Map<String, BusinessStatusEnum> STATUS_MAP = Arrays.stream(BusinessStatusEnum.values())
+            .collect(Collectors.toConcurrentMap(BusinessStatusEnum::getStatus, Function.identity()));
+
     /**
-     * 获取业务状态
+     * 根据状态获取对应的 BusinessStatusEnum 枚举
      *
-     * @param status 状态
+     * @param status 业务状态码
+     * @return 对应的 BusinessStatusEnum 枚举,如果找不到则返回 null
+     */
+    public static BusinessStatusEnum getByStatus(String status) {
+        // 使用 STATUS_MAP 获取对应的枚举,若找不到则返回 null
+        return STATUS_MAP.get(status);
+    }
+
+    /**
+     * 根据状态获取对应的业务状态描述信息
+     *
+     * @param status 业务状态码
+     * @return 返回业务状态描述,若状态码为空或未找到对应的枚举,返回空字符串
      */
     public static String findByStatus(String status) {
         if (StringUtils.isBlank(status)) {
             return StrUtil.EMPTY;
         }
-        return Arrays.stream(BusinessStatusEnum.values())
-                .filter(statusEnum -> statusEnum.getStatus().equals(status))
-                .findFirst()
-                .map(BusinessStatusEnum::getDesc)
-                .orElse(StrUtil.EMPTY);
+        BusinessStatusEnum statusEnum = STATUS_MAP.get(status);
+        return (statusEnum != null) ? statusEnum.getDesc() : StrUtil.EMPTY;
+    }
+
+    /**
+     * 判断是否为指定的状态之一:草稿、已撤销或已退回
+     *
+     * @param status 要检查的状态
+     * @return 如果状态为草稿、已撤销或已退回之一,则返回 true;否则返回 false
+     */
+    public static boolean isDraftOrCancelOrBack(String status) {
+        return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status);
+    }
+
+    /**
+     * 判断是否为撤销,退回,作废,终止
+     *
+     * @param status status
+     * @return 结果
+     */
+    public static boolean initialState(String status) {
+        return CANCEL.status.equals(status) || BACK.status.equals(status) || INVALID.status.equals(status) || TERMINATION.status.equals(status);
+    }
+
+    /**
+     * 获取运行中的实例状态列表
+     *
+     * @return 包含运行中实例状态的不可变列表
+     * (包含 DRAFT、WAITING、BACK 和 CANCEL 状态)
+     */
+    public static List<String> runningStatus() {
+        return Arrays.asList(DRAFT.status, WAITING.status, BACK.status, CANCEL.status);
+    }
+
+    /**
+     * 获取结束实例的状态列表
+     *
+     * @return 包含结束实例状态的不可变列表
+     * (包含 FINISH、INVALID 和 TERMINATION 状态)
+     */
+    public static List<String> finishStatus() {
+        return Arrays.asList(FINISH.status, INVALID.status, TERMINATION.status);
     }
 
     /**
@@ -79,12 +142,17 @@ public enum BusinessStatusEnum {
     public static void checkStartStatus(String status) {
         if (WAITING.getStatus().equals(status)) {
             throw new ServiceException("该单据已提交过申请,正在审批中!");
-        } else {
-            checkStatus(status);
+        } else if (FINISH.getStatus().equals(status)) {
+            throw new ServiceException("该单据已完成申请!");
+        } else if (INVALID.getStatus().equals(status)) {
+            throw new ServiceException("该单据已作废!");
+        } else if (TERMINATION.getStatus().equals(status)) {
+            throw new ServiceException("该单据已终止!");
+        } else if (StringUtils.isBlank(status)) {
+            throw new ServiceException("流程状态为空!");
         }
     }
 
-
     /**
      * 撤销流程校验
      *
@@ -93,10 +161,16 @@ public enum BusinessStatusEnum {
     public static void checkCancelStatus(String status) {
         if (CANCEL.getStatus().equals(status)) {
             throw new ServiceException("该单据已撤销!");
+        } else if (FINISH.getStatus().equals(status)) {
+            throw new ServiceException("该单据已完成申请!");
+        } else if (INVALID.getStatus().equals(status)) {
+            throw new ServiceException("该单据已作废!");
+        } else if (TERMINATION.getStatus().equals(status)) {
+            throw new ServiceException("该单据已终止!");
         } else if (BACK.getStatus().equals(status)) {
             throw new ServiceException("该单据已退回!");
-        } else {
-            checkStatus(status);
+        } else if (StringUtils.isBlank(status)) {
+            throw new ServiceException("流程状态为空!");
         }
     }
 
@@ -108,10 +182,16 @@ public enum BusinessStatusEnum {
     public static void checkBackStatus(String status) {
         if (BACK.getStatus().equals(status)) {
             throw new ServiceException("该单据已退回!");
+        } else if (FINISH.getStatus().equals(status)) {
+            throw new ServiceException("该单据已完成申请!");
+        } else if (INVALID.getStatus().equals(status)) {
+            throw new ServiceException("该单据已作废!");
+        } else if (TERMINATION.getStatus().equals(status)) {
+            throw new ServiceException("该单据已终止!");
         } else if (CANCEL.getStatus().equals(status)) {
             throw new ServiceException("该单据已撤销!");
-        } else {
-            checkStatus(status);
+        } else if (StringUtils.isBlank(status)) {
+            throw new ServiceException("流程状态为空!");
         }
     }
 
@@ -121,10 +201,6 @@ public enum BusinessStatusEnum {
      * @param status 状态
      */
     public static void checkInvalidStatus(String status) {
-        checkStatus(status);
-    }
-
-    private static void checkStatus(String status) {
         if (FINISH.getStatus().equals(status)) {
             throw new ServiceException("该单据已完成申请!");
         } else if (INVALID.getStatus().equals(status)) {
@@ -135,5 +211,6 @@ public enum BusinessStatusEnum {
             throw new ServiceException("流程状态为空!");
         }
     }
+
 }
 

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

@@ -5,7 +5,7 @@ import java.util.Set;
 /**
  * 用户权限处理
  *
- * @author Lion Li
+ * @author Iwb
  */
 public interface PermissionService {
 

+ 45 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/TaskAssigneeService.java

@@ -0,0 +1,45 @@
+package com.vber.common.core.service;
+
+import com.vber.common.core.domain.dto.TaskAssigneeDTO;
+import com.vber.common.core.domain.model.TaskAssigneeBody;
+
+/**
+ * 工作流设计器获取任务执行人
+ *
+ * @author Iwb
+ */
+public interface TaskAssigneeService {
+
+    /**
+     * 查询角色并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery);
+
+    /**
+     * 查询岗位并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery);
+
+    /**
+     * 查询组织机构并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    TaskAssigneeDTO selectOrgsByTaskAssigneeList(TaskAssigneeBody taskQuery);
+
+    /**
+     * 查询用户并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery);
+
+}

+ 34 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/UserService.java

@@ -3,6 +3,7 @@ package com.vber.common.core.service;
 import com.vber.common.core.domain.dto.UserDTO;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 通用 用户服务
@@ -63,7 +64,7 @@ public interface UserService {
     /**
      * 通过组织结构ID查询用户
      *
-     * @param orgIds 部门ids
+     * @param orgIds 组织机构ids
      * @return 用户
      */
     List<UserDTO> selectUsersByOrgIds(List<Long> orgIds);
@@ -75,4 +76,36 @@ public interface UserService {
      * @return 用户
      */
     List<UserDTO> selectUsersByPostIds(List<Long> postIds);
+
+    /**
+     * 根据用户 ID 列表查询用户名称映射关系
+     *
+     * @param userIds 用户 ID 列表
+     * @return Map,其中 key 为用户 ID,value 为对应的用户名称
+     */
+    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);
 }

+ 46 - 27
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/WorkflowService.java

@@ -1,76 +1,95 @@
 package com.vber.common.core.service;
 
+import com.vber.common.core.domain.dto.CompleteTaskDTO;
+import com.vber.common.core.domain.dto.StartProcessDTO;
+import com.vber.common.core.domain.dto.StartProcessReturnDTO;
+
 import java.util.List;
 import java.util.Map;
 
 /**
  * 通用 工作流服务
  *
- * @author Yue
+ * @author Iwb
  */
 public interface WorkflowService {
 
     /**
      * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
      *
-     * @param businessKeys 业务id
+     * @param businessIds 业务id
      * @return 结果
      */
-    boolean deleteRunAndHisInstance(List<String> businessKeys);
+    boolean deleteInstance(List<Long> businessIds);
 
     /**
      * 获取当前流程状态
      *
      * @param taskId 任务id
+     * @return 状态
      */
-    String getBusinessStatusByTaskId(String taskId);
+    String getBusinessStatusByTaskId(Long taskId);
 
     /**
      * 获取当前流程状态
      *
-     * @param businessKey 业务id
+     * @param businessId 业务id
+     * @return 状态
      */
-    String getBusinessStatus(String businessKey);
+    String getBusinessStatus(String businessId);
 
     /**
-     * 设置流程变量(全局变量)
+     * 设置流程变量
      *
-     * @param taskId       任务id
-     * @param variableName 变量名称
-     * @param value        变量值
+     * @param instanceId 流程实例id
+     * @param variable   流程变量
      */
-    void setVariable(String taskId, String variableName, Object value);
+    void setVariable(Long instanceId, Map<String, Object> variable);
 
     /**
-     * 设置流程变量(全局变量)
+     * 获取流程变量
      *
-     * @param taskId    任务id
-     * @param variables 流程变量
+     * @param instanceId 流程实例id
      */
-    void setVariables(String taskId, Map<String, Object> variables);
+    Map<String, Object> instanceVariable(Long instanceId);
 
     /**
-     * 设置流程变量(本地变量,非全局变量)
+     * 按照业务id查询流程实例id
      *
-     * @param taskId       任务id
-     * @param variableName 变量名称
-     * @param value        变量值
+     * @param businessId 业务id
+     * @return 结果
      */
-    void setVariableLocal(String taskId, String variableName, Object value);
+    Long getInstanceIdByBusinessId(String businessId);
 
     /**
-     * 设置流程变量(本地变量,非全局变量)
+     * 新增租户流程定义
      *
-     * @param taskId    任务id
-     * @param variables 流程变量
+     * @param tenantId 租户id
      */
-    void setVariablesLocal(String taskId, Map<String, Object> variables);
+    void syncDef(String tenantId);
 
     /**
-     * 按照业务id查询流程实例id
+     * 启动流程
      *
-     * @param businessKey 业务id
+     * @param startProcess 参数
      * @return 结果
      */
-    String getInstanceIdByBusinessKey(String businessKey);
+    StartProcessReturnDTO startWorkFlow(StartProcessDTO startProcess);
+
+    /**
+     * 办理任务
+     * 系统后台发起审批 无用户信息 需要忽略权限
+     * completeTask.getVariables().put("ignore", true);
+     *
+     * @param completeTask 参数
+     */
+    boolean completeTask(CompleteTaskDTO completeTask);
+
+    /**
+     * 办理任务
+     *
+     * @param taskId  任务ID
+     * @param message 办理意见
+     */
+    boolean completeTask(Long taskId, String message);
 }

+ 27 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/TreeBuildUtils.java

@@ -10,6 +10,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
 import java.util.List;
+import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -60,6 +62,31 @@ public class TreeBuildUtils extends TreeUtil {
         return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser);
     }
 
+    /**
+     * 构建多根节点的树结构(支持多个顶级节点)
+     *
+     * @param list        原始数据列表
+     * @param getId       获取节点 ID 的方法引用,例如:node -> node.getId()
+     * @param getParentId 获取节点父级 ID 的方法引用,例如:node -> node.getParentId()
+     * @param parser      树节点属性映射器,用于将原始节点 T 转为 Tree 节点
+     * @param <T>         原始数据类型(如实体类、DTO 等)
+     * @param <K>         节点 ID 类型(如 Long、String)
+     * @return 构建完成的树形结构(可能包含多个顶级根节点)
+     */
+    public static <T, K> List<Tree<K>> buildMultiRoot(List<T> list, Function<T, K> getId, Function<T, K> getParentId, NodeParser<T, K> parser) {
+        if (CollUtil.isEmpty(list)) {
+            return CollUtil.newArrayList();
+        }
+
+        Set<K> rootParentIds = StreamUtils.toSet(list, getParentId);
+        rootParentIds.removeAll(StreamUtils.toSet(list, getId));
+
+        // 构建每一个根 parentId 下的树,并合并成最终结果列表
+        return rootParentIds.stream()
+                .flatMap(rootParentId -> TreeUtil.build(list, rootParentId, parser).stream())
+                .collect(Collectors.toList());
+    }
+
     /**
      * 获取节点列表中所有节点的叶子节点
      *

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/json/handler/CustomDateDeserializer.java

@@ -11,7 +11,7 @@ import java.util.Date;
 /**
  * 自定义 Date 类型反序列化处理器(支持多种格式)
  *
- * @author AprilWind
+ * @author Iwb
  */
 public class CustomDateDeserializer extends JsonDeserializer<Date> {
 

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

@@ -21,6 +21,11 @@ import java.util.Date;
 @Slf4j
 public class InjectionMetaObjectHandler implements MetaObjectHandler {
 
+    /**
+     * 如果用户不存在默认注入-1代表无用户
+     */
+    private static final Long DEFAULT_USER_ID = -1L;
+
     /**
      * 插入填充方法,用于在插入数据时自动填充实体对象中的创建时间、更新时间、创建人、更新人等信息
      *
@@ -34,14 +39,21 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler {
                 Date current = ObjectUtils.notNull(baseEntity.getCreateTime(), new Date());
                 baseEntity.setCreateTime(current);
                 baseEntity.setUpdateTime(current);
+
+                // 如果创建人为空,则填充当前登录用户的信息
                 if (ObjectUtil.isNull(baseEntity.getCreateBy())) {
                     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));
                     }
                 }
             } else {
@@ -66,12 +78,14 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler {
                 // 获取当前时间作为更新时间,无论原始对象中的更新时间是否为空都填充
                 Date current = new Date();
                 baseEntity.setUpdateTime(current);
+
                 // 获取当前登录用户的ID,并填充更新人信息
                 Long userId = LoginHelper.getUserId();
                 if (ObjectUtil.isNotNull(userId)) {
                     baseEntity.setUpdateBy(userId);
+                } else {
+                    baseEntity.setUpdateBy(DEFAULT_USER_ID);
                 }
-
             } else {
                 this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
             }
@@ -90,7 +104,6 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler {
         try {
             loginUser = LoginHelper.getLoginUser();
         } catch (Exception e) {
-            log.warn("自动注入警告 => 用户未登录");
             return null;
         }
         return loginUser;

+ 3 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-oss/src/main/java/com/vber/common/oss/core/OssClient.java

@@ -1,5 +1,6 @@
 package com.vber.common.oss.core;
 
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.IdUtil;
 import com.vber.common.core.config.VbConfig;
@@ -311,7 +312,7 @@ public class OssClient {
      * @throws OssException 如果上传失败,抛出自定义异常
      */
     public UploadResult uploadSuffix(byte[] data, String suffix) {
-        return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length), FileUtils.getMimeType(suffix));
+        return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Convert.toLong(data.length), FileUtils.getMimeType(suffix));
     }
 
     /**
@@ -340,7 +341,7 @@ public class OssClient {
     }
 
     public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) {
-        return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length), contentType);
+        return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Convert.toLong(data.length), contentType);
     }
 
 

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-ratelimiter/src/main/resources/spel-extension.json

@@ -1,5 +1,5 @@
 {
-  "org.dromara.common.ratelimiter.annotation.RateLimiter@key": {
+  "com.vber.common.ratelimiter.annotation.RateLimiter@key": {
     "method": {
       "parameters": true
     }

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/handler/RedisExceptionHandler.java

@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
 /**
  * Redis异常处理器
  *
- * @author AprilWind
+ * @author Iwb
  */
 @Slf4j
 @RestControllerAdvice

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

@@ -9,7 +9,7 @@ import lombok.AllArgsConstructor;
 /**
  * 用户名称翻译实现
  *
- * @author may
+ * @author Iwb
  */
 @AllArgsConstructor
 @TranslationType(type = TransConstant.USER_ID_TO_NICKNAME)

+ 1 - 4
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/controller/GenController.java

@@ -80,11 +80,8 @@ public class GenController extends BaseController {
     @SaCheckPermission("tool:gen")
     @GetMapping(value = "/column/{tableId}")
     public TableDataInfo<GenTableColumn> columnList(@PathVariable("tableId") Long tableId) {
-        TableDataInfo<GenTableColumn> dataInfo = new TableDataInfo<>();
         List<GenTableColumn> list = genTableService.selectGenTableColumnListByTableId(tableId);
-        dataInfo.setRows(list);
-        dataInfo.setTotal(list.size());
-        return dataInfo;
+        return TableDataInfo.build(list);
     }
 
     /**

+ 1 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/SysRole.java

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

+ 1 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/bo/SysRoleBo.java

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

+ 1 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysRoleVo.java

@@ -54,7 +54,7 @@ public class SysRoleVo implements Serializable {
      * 数据范围(1:全部数据权限 2:自定数据权限 3:本组织机构数据权限 4:本组织机构及以下数据权限)
      */
     @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限")
+    @ExcelDictFormat(readConverterExp = "1:全部数据权限 2:自定数据权限 3:本组织机构数据权限 4:本组织机构及以下数据权限 5:仅本人数据权限 6:组织机构及以下或本人数据权限")
     private String dataScope;
 
     /**

+ 2 - 2
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/mapper/SysOrgMapper.java

@@ -35,10 +35,10 @@ public interface SysOrgMapper extends BaseMapperPlus<SysOrg, SysOrgVo> {
     List<SysOrgVo> selectOrgList(@Param(Constants.WRAPPER) Wrapper<SysOrg> queryWrapper);
 
     /**
-     * 分页查询部门管理数据
+     * 分页查询组织机构管理数据
      *
      * @param queryWrapper 查询条件
-     * @return 部门信息集合
+     * @return 组织机构信息集合
      */
     @DataPermission({
             @DataColumn(key = "deptName", value = "dept_id"),

+ 3 - 3
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/ISysOrgService.java

@@ -16,11 +16,11 @@ import java.util.List;
 public interface ISysOrgService {
 
     /**
-     * 分页查询部门管理数据
+     * 分页查询组织机构管理数据
      *
-     * @param dept      部门信息
+     * @param dept      组织机构信息
      * @param pageQuery 分页对象
-     * @return 部门信息集合
+     * @return 组织机构信息集合
      */
     TableDataInfo<SysOrgVo> selectPageOrgList(SysOrgBo dept, PageQuery pageQuery);
     /**

+ 6 - 14
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysClientServiceImpl.java

@@ -1,5 +1,6 @@
 package com.vber.system.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.crypto.SecureUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -43,7 +44,7 @@ public class SysClientServiceImpl implements ISysClientService {
     @Override
     public SysClientVo queryById(Long id) {
         SysClientVo vo = baseMapper.selectVoById(id);
-        vo.setGrantTypeList(List.of(vo.getGrantType().split(",")));
+        vo.setGrantTypeList(StringUtils.splitList(vo.getGrantType()));
         return vo;
     }
 
@@ -64,7 +65,7 @@ public class SysClientServiceImpl implements ISysClientService {
     public TableDataInfo<SysClientVo> queryPageList(SysClientBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<SysClient> lqw = buildQueryWrapper(bo);
         Page<SysClientVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(","))));
+        result.getRecords().forEach(r -> r.setGrantTypeList(StringUtils.splitList(r.getGrantType())));
         return TableDataInfo.build(result);
     }
 
@@ -95,8 +96,7 @@ public class SysClientServiceImpl implements ISysClientService {
     @Override
     public Boolean insertByBo(SysClientBo bo) {
         SysClient add = MapstructUtils.convert(bo, SysClient.class);
-        validEntityBeforeSave(add);
-        add.setGrantType(String.join(",", bo.getGrantTypeList()));
+        add.setGrantType(CollUtil.join(bo.getGrantTypeList(), StringUtils.SEPARATOR));
         // 生成clientid
         add.setClientId(SecureUtil.md5(bo.getClientKey() + bo.getClientSecret()));
         boolean flag = baseMapper.insert(add) > 0;
@@ -113,7 +113,6 @@ public class SysClientServiceImpl implements ISysClientService {
     @Override
     public Boolean updateByBo(SysClientBo bo) {
         SysClient update = MapstructUtils.convert(bo, SysClient.class);
-        validEntityBeforeSave(update);
         update.setGrantType(String.join(",", bo.getGrantTypeList()));
         update.setClientId(SecureUtil.md5(bo.getClientKey() + bo.getClientSecret()));
         return baseMapper.updateById(update) > 0;
@@ -131,12 +130,7 @@ public class SysClientServiceImpl implements ISysClientService {
                         .eq(SysClient::getClientId, clientId));
     }
 
-    /**
-     * 保存前的数据校验
-     */
-    private void validEntityBeforeSave(SysClient entity) {
-        //TODO 做一些数据校验,如唯一约束
-    }
+
 
     /**
      * 批量删除客户端管理
@@ -144,9 +138,7 @@ public class SysClientServiceImpl implements ISysClientService {
     @Override
     @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true)
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if (isValid) {
-            //TODO 做一些业务上的校验,判断是否需要校验
-        }
+
         return baseMapper.deleteByIds(ids) > 0;
     }
 }

+ 4 - 4
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysDataScopeServiceImpl.java

@@ -36,7 +36,7 @@ public class SysDataScopeServiceImpl implements ISysDataScopeService {
      * 获取角色自定义权限
      *
      * @param roleId 角色Id
-     * @return 部门Id组
+     * @return 组织机构Id组
      */
     @Cacheable(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId", condition = "#roleId != null")
     @Override
@@ -55,10 +55,10 @@ public class SysDataScopeServiceImpl implements ISysDataScopeService {
     }
 
     /**
-     * 获取部门及以下权限
+     * 获取组织机构及以下权限
      *
-     * @param orgId 部门Id
-     * @return 部门Id组
+     * @param orgId 组织机构Id
+     * @return 组织机构Id组
      */
     @Cacheable(cacheNames = CacheNames.SYS_ORG_AND_CHILD, key = "#orgId", condition = "#orgId != null")
     @Override

+ 15 - 22
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysOrgServiceImpl.java

@@ -56,11 +56,11 @@ public class SysOrgServiceImpl implements ISysOrgService, OrgService {
 
 
     /**
-     * 分页查询部门管理数据
+     * 分页查询组织机构管理数据
      *
-     * @param org      部门信息
+     * @param org      组织机构信息
      * @param pageQuery 分页对象
-     * @return 部门信息集合
+     * @return 组织机构信息集合
      */
     @Override
     public TableDataInfo<SysOrgVo> selectPageOrgList(SysOrgBo org, PageQuery pageQuery) {
@@ -111,7 +111,7 @@ public class SysOrgServiceImpl implements ISysOrgService, OrgService {
         lqw.orderByAsc(SysOrg::getOrderNum);
         lqw.orderByAsc(SysOrg::getOrgId);
         if (ObjectUtil.isNotNull(bo.getBelongOrgId())) {
-            //部门树搜索
+            //组织机构树搜索
             lqw.and(x -> {
                 Long parentId = bo.getBelongOrgId();
                 List<SysOrg> orgList = baseMapper.selectListByParentId(parentId);
@@ -134,24 +134,17 @@ public class SysOrgServiceImpl implements ISysOrgService, OrgService {
         if (CollUtil.isEmpty(orgs)) {
             return CollUtil.newArrayList();
         }
-
-        // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点
-        List<Tree<Long>> treeList = CollUtil.newArrayList();
-        for (SysOrgVo d : orgs) {
-            Long parentId = d.getParentId();
-            SysOrgVo sysOrgVo = StreamUtils.findFirst(orgs, it -> it.getOrgId().longValue() == parentId);
-            if (ObjectUtil.isNull(sysOrgVo)) {
-                List<Tree<Long>> trees = TreeBuildUtils.build(orgs, parentId, (org, tree) ->
-                        tree.setId(org.getOrgId())
-                                .setParentId(org.getParentId())
-                                .setName(org.getOrgName())
-                                .setWeight(org.getOrderNum())
-                                .putExtra("disabled", SystemConstants.DISABLE.equals(org.getStatus())));
-                Tree<Long> tree =StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getOrgId());
-                treeList.add(tree);
-            }
-        }
-        return treeList;
+        return TreeBuildUtils.buildMultiRoot(
+                orgs,
+                SysOrgVo::getOrgId,
+                SysOrgVo::getParentId,
+                (node, treeNode) -> treeNode
+                        .setId(node.getOrgId())
+                        .setParentId(node.getParentId())
+                        .setName(node.getOrgName())
+                        .setWeight(node.getOrderNum())
+                        .putExtra("disabled", SystemConstants.DISABLE.equals(node.getStatus()))
+        );
     }
 
     /**

+ 138 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysTaskAssigneeServiceImpl.java

@@ -0,0 +1,138 @@
+package com.vber.system.service.impl;
+
+import cn.hutool.core.convert.Convert;
+import lombok.RequiredArgsConstructor;
+import com.vber.common.core.constant.SystemConstants;
+import com.vber.common.core.domain.dto.TaskAssigneeDTO;
+import com.vber.common.core.domain.model.TaskAssigneeBody;
+import com.vber.common.core.service.TaskAssigneeService;
+import com.vber.common.mybatis.core.page.PageQuery;
+import com.vber.common.mybatis.core.page.TableDataInfo;
+import com.vber.system.domain.bo.SysOrgBo;
+import com.vber.system.domain.bo.SysPostBo;
+import com.vber.system.domain.bo.SysRoleBo;
+import com.vber.system.domain.bo.SysUserBo;
+import com.vber.system.domain.vo.SysOrgVo;
+import com.vber.system.domain.vo.SysPostVo;
+import com.vber.system.domain.vo.SysRoleVo;
+import com.vber.system.domain.vo.SysUserVo;
+import com.vber.system.service.ISysOrgService;
+import com.vber.system.service.ISysPostService;
+import com.vber.system.service.ISysRoleService;
+import com.vber.system.service.ISysUserService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 工作流设计器获取任务执行人
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@Service
+public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
+
+    // 上级Service注入下级Service 其他Service永远不可能注入当前类 避免循环注入
+    private final ISysPostService postService;
+    private final ISysOrgService orgService;
+    private final ISysUserService userService;
+    private final ISysRoleService roleService;
+
+    /**
+     * 查询角色并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    @Override
+    public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) {
+        PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
+        SysRoleBo bo = new SysRoleBo();
+        bo.setRoleKey(taskQuery.getHandlerCode());
+        bo.setRoleName(taskQuery.getHandlerName());
+        bo.setStatus(SystemConstants.NORMAL);
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        TableDataInfo<SysRoleVo> page = roleService.selectPageRoleList(bo, pageQuery);
+        // 使用封装的字段映射方法进行转换
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
+            SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime);
+        return new TaskAssigneeDTO(page.getTotal(), handlers);
+    }
+
+    /**
+     * 查询岗位并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    @Override
+    public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) {
+        PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
+        SysPostBo bo = new SysPostBo();
+        bo.setPostCategory(taskQuery.getHandlerCode());
+        bo.setPostName(taskQuery.getHandlerName());
+        bo.setStatus(SystemConstants.NORMAL);
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        bo.setBelongOrgId(Convert.toLong(taskQuery.getGroupId()));
+        TableDataInfo<SysPostVo> page = postService.selectPagePostList(bo, pageQuery);
+        // 使用封装的字段映射方法进行转换
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
+            SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getOrgId, SysPostVo::getCreateTime);
+        return new TaskAssigneeDTO(page.getTotal(), handlers);
+    }
+
+    /**
+     * 查询部门并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    @Override
+    public TaskAssigneeDTO selectOrgsByTaskAssigneeList(TaskAssigneeBody taskQuery) {
+        PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
+        SysOrgBo bo = new SysOrgBo();
+        bo.setOrgCategory(taskQuery.getHandlerCode());
+        bo.setOrgName(taskQuery.getHandlerName());
+        bo.setStatus(SystemConstants.NORMAL);
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        bo.setBelongOrgId(Convert.toLong(taskQuery.getGroupId()));
+        TableDataInfo<SysOrgVo> page = orgService.selectPageOrgList(bo, pageQuery);
+        // 使用封装的字段映射方法进行转换
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
+            SysOrgVo::getOrgId, SysOrgVo::getOrgCategory, SysOrgVo::getOrgName, SysOrgVo::getParentId, SysOrgVo::getCreateTime);
+        return new TaskAssigneeDTO(page.getTotal(), handlers);
+    }
+
+    /**
+     * 查询用户并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    @Override
+    public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) {
+        PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
+        SysUserBo bo = new SysUserBo();
+        bo.setUserName(taskQuery.getHandlerCode());
+        bo.setNickName(taskQuery.getHandlerName());
+        bo.setStatus(SystemConstants.NORMAL);
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        bo.setOrgId(Convert.toLong(taskQuery.getGroupId()));
+        TableDataInfo<SysUserVo> page = userService.selectPageUserList(bo, pageQuery);
+        // 使用封装的字段映射方法进行转换
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
+            SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getOrgId, SysUserVo::getCreateTime);
+        return new TaskAssigneeDTO(page.getTotal(), handlers);
+    }
+
+}

+ 80 - 5
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysUserServiceImpl.java

@@ -40,10 +40,8 @@ import org.springframework.cache.annotation.Caching;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 用户 业务层处理
@@ -639,6 +637,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
         return ObjectUtils.notNullGetter(sysUser, SysUser::getEmail);
     }
 
+
     /**
      * 通过用户ID查询用户列表
      *
@@ -694,7 +693,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
     /**
      * 通过组织结构ID查询用户
      *
-     * @param orgIds 部门ids
+     * @param orgIds 组织机构ids
      * @return 用户
      */
     @Override
@@ -730,4 +729,80 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
 
         return selectListByIds(new ArrayList<>(userIds));
     }
+
+    /**
+     * 根据用户 ID 列表查询用户名称映射关系
+     *
+     * @param userIds 用户 ID 列表
+     * @return Map,其中 key 为用户 ID,value 为对应的用户名称
+     */
+    @Override
+    public Map<Long, String> selectUserNamesByIds(List<Long> userIds) {
+        if (CollUtil.isEmpty(userIds)) {
+            return Collections.emptyMap();
+        }
+        return baseMapper.selectList(
+                        new LambdaQueryWrapper<SysUser>()
+                                .select(SysUser::getUserId, SysUser::getNickName)
+                                .in(SysUser::getUserId, userIds)
+                ).stream()
+                .collect(Collectors.toMap(SysUser::getUserId, SysUser::getNickName));
+    }
+
+    /**
+     * 根据角色 ID 列表查询角色名称映射关系
+     *
+     * @param roleIds 角色 ID 列表
+     * @return Map,其中 key 为角色 ID,value 为对应的角色名称
+     */
+    @Override
+    public Map<Long, String> selectRoleNamesByIds(List<Long> roleIds) {
+        if (CollUtil.isEmpty(roleIds)) {
+            return Collections.emptyMap();
+        }
+        return roleMapper.selectList(
+                        new LambdaQueryWrapper<SysRole>()
+                                .select(SysRole::getRoleId, SysRole::getRoleName)
+                                .in(SysRole::getRoleId, roleIds)
+                ).stream()
+                .collect(Collectors.toMap(SysRole::getRoleId, SysRole::getRoleName));
+    }
+
+    /**
+     * 根据组织机构 ID 列表查询组织机构名称映射关系
+     *
+     * @param orgIds 组织机构 ID 列表
+     * @return Map,其中 key 为组织机构 ID,value 为对应的组织机构名称
+     */
+    @Override
+    public Map<Long, String> selectOrgNamesByIds(List<Long> orgIds) {
+        if (CollUtil.isEmpty(orgIds)) {
+            return Collections.emptyMap();
+        }
+        return orgMapper.selectList(
+                        new LambdaQueryWrapper<SysOrg>()
+                                .select(SysOrg::getOrgId, SysOrg::getOrgName)
+                                .in(SysOrg::getOrgId, orgIds)
+                ).stream()
+                .collect(Collectors.toMap(SysOrg::getOrgId, SysOrg::getOrgName));
+    }
+
+    /**
+     * 根据岗位 ID 列表查询岗位名称映射关系
+     *
+     * @param postIds 岗位 ID 列表
+     * @return Map,其中 key 为岗位 ID,value 为对应的岗位名称
+     */
+    @Override
+    public Map<Long, String> selectPostNamesByIds(List<Long> postIds) {
+        if (CollUtil.isEmpty(postIds)) {
+            return Collections.emptyMap();
+        }
+        return postMapper.selectList(
+                        new LambdaQueryWrapper<SysPost>()
+                                .select(SysPost::getPostId, SysPost::getPostName)
+                                .in(SysPost::getPostId, postIds)
+                ).stream()
+                .collect(Collectors.toMap(SysPost::getPostId, SysPost::getPostName));
+    }
 }

+ 9 - 49
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/pom.xml

@@ -13,57 +13,14 @@
     <name>${project.artifactId}</name>
     <description>工作流模块</description>
     <dependencies>
-        <!--引入flowable依赖-->
         <dependency>
-            <groupId>org.flowable</groupId>
-            <artifactId>flowable-spring-boot-autoconfigure</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.flowable</groupId>
-                    <artifactId>flowable-spring-security</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.flowable</groupId>
-            <artifactId>flowable-spring-configurator</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.flowable</groupId>
-            <artifactId>flowable-spring-boot-starter-actuator</artifactId>
-        </dependency>
-
-        <!-- 绘制flowable流程图 -->
-        <dependency>
-            <groupId>org.flowable</groupId>
-            <artifactId>flowable-image-generator</artifactId>
-        </dependency>
-
-        <!-- flowable json 转换 -->
-        <dependency>
-            <groupId>org.flowable</groupId>
-            <artifactId>flowable-json-converter</artifactId>
-            <version>6.8.0</version>
-        </dependency>
-
-        <!-- svg转png图片工具-->
-        <dependency>
-            <groupId>org.apache.xmlgraphics</groupId>
-            <artifactId>batik-all</artifactId>
-            <version>1.17</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>xalan</groupId>
-                    <artifactId>xalan</artifactId>
-                </exclusion>
-            </exclusions>
+            <groupId>com.vap</groupId>
+            <artifactId>vber-common-sse</artifactId>
         </dependency>
 
         <dependency>
             <groupId>com.vap</groupId>
-            <artifactId>vber-common-websocket</artifactId>
+            <artifactId>vber-common-doc</artifactId>
         </dependency>
 
         <dependency>
@@ -117,10 +74,13 @@
         </dependency>
         
         <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-sse</artifactId>
+            <groupId>org.dromara.warm</groupId>
+            <artifactId>warm-flow-mybatis-plus-sb3-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara.warm</groupId>
+            <artifactId>warm-flow-plugin-ui-sb-web</artifactId>
         </dependency>
-
     </dependencies>
 
 </project>

+ 29 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/ConditionalOnEnable.java

@@ -0,0 +1,29 @@
+package com.vber.workflow.common;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义条件注解,用于基于配置启用或禁用特定功能
+ * <p>
+ * 该注解只会在配置文件中 `warm-flow.enabled=true` 时,标注了此注解的类或方法才会被 Spring 容器加载
+ * <p>
+ * 示例配置:
+ * <pre>
+ * warm-flow:
+ *   enabled: true  # 设置为 true 时,启用工作流功能
+ * </pre>
+ * <p>
+ * 使用此注解时,可以动态控制工作流功能是否启用,而不需要修改代码逻辑
+ *
+ * @author Iwb
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@ConditionalOnProperty(value = "warm-flow.enabled", havingValue = "true")
+public @interface ConditionalOnEnable {
+}

+ 29 - 89
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/constant/FlowConstant.java

@@ -4,139 +4,79 @@ package com.vber.workflow.common.constant;
 /**
  * 工作流常量
  *
- * @author iwb
+ * @author Iwb
  */
 public interface FlowConstant {
 
-    String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人!";
-
-    String MESSAGE_SUSPENDED = "当前任务已挂起不可审批!";
-
-    /**
-     * 连线
-     */
-    String SEQUENCE_FLOW = "sequenceFlow";
-
-    /**
-     * 并行网关
-     */
-    String PARALLEL_GATEWAY = "parallelGateway";
-
-    /**
-     * 排它网关
-     */
-    String EXCLUSIVE_GATEWAY = "exclusiveGateway";
-
-    /**
-     * 包含网关
-     */
-    String INCLUSIVE_GATEWAY = "inclusiveGateway";
-
-    /**
-     * 结束节点
-     */
-    String END_EVENT = "endEvent";
-
-
-    /**
-     * 流程委派标识
-     */
-    String PENDING = "PENDING";
-
     /**
-     * 候选人标识
-     */
-    String CANDIDATE = "candidate";
-
-    /**
-     * 会签任务总数
-     */
-    String NUMBER_OF_INSTANCES = "nrOfInstances";
-
-    /**
-     * 正在执行的会签总数
-     */
-    String NUMBER_OF_ACTIVE_INSTANCES = "nrOfActiveInstances";
-
-    /**
-     * 已完成的会签任务总数
+     * 流程发起人
      */
-    String NUMBER_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances";
+    String INITIATOR = "initiator";
 
     /**
-     * 循环的索引值,可以使用elementIndexVariable属性修改loopCounter的变量名
+     * 业务id
      */
-    String LOOP_COUNTER = "loopCounter";
-
-    String ZIP = "ZIP";
+    String BUSINESS_ID = "businessId";
 
     /**
-     * 流程实例对象
+     * 委托
      */
-    String PROCESS_INSTANCE_VO = "processInstanceVo";
+    String DELEGATE_TASK = "delegateTask";
 
     /**
-     * 业务与流程实例关联对象
+     * 转办
      */
-    String BUSINESS_INSTANCE_DTO = "businessInstanceDTO";
+    String TRANSFER_TASK = "transferTask";
 
     /**
-     * 流程定义配置
+     * 加签
      */
-    String WF_DEFINITION_CONFIG_VO = "wfDefinitionConfigVo";
+    String ADD_SIGNATURE = "addSignature";
 
     /**
-     * 节点配置
+     * 减签
      */
-    String WF_NODE_CONFIG_VO = "wfNodeConfigVo";
+    String REDUCTION_SIGNATURE = "reductionSignature";
 
     /**
-     * 流程发起人
+     * 流程分类Id转名称
      */
-    String INITIATOR = "initiator";
+    String CATEGORY_ID_TO_NAME = "category_id_to_name";
 
     /**
-     * 流程实例id
+     * 流程分类名称
      */
-    String PROCESS_INSTANCE_ID = "processInstanceId";
+    String FLOW_CATEGORY_NAME = "flow_category_name#30d";
 
     /**
-     * 业务id
+     * 默认租户OA申请分类id
      */
-    String BUSINESS_KEY = "businessKey";
+    Long FLOW_CATEGORY_ID = 100L;
 
     /**
-     * 流程定义id
+     * 是否为申请人提交常量
      */
-    String PROCESS_DEFINITION_ID = "processDefinitionId";
+    String SUBMIT = "submit";
 
     /**
-     * 开启跳过表达式变
+     * 抄送常
      */
-    String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED";
+    String FLOW_COPY_LIST = "flowCopyList";
 
     /**
-     * 模型标识key命名规范正则表达式
+     * 消息类型常量
      */
-    String MODEL_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$";
+    String MESSAGE_TYPE = "messageType";
 
     /**
-     * 用户任务
+     * 消息通知常量
      */
-    String USER_TASK = "userTask";
+    String MESSAGE_NOTICE = "messageNotice";
 
     /**
-     * 会签
+     * 任务状态
      */
-    String MULTI_INSTANCE = "multiInstance";
+    String WF_TASK_STATUS = "wf_task_status";
 
-    /**
-     * 是
-     */
-    String TRUE = "0";
 
-    /**
-     * 否
-     */
-    String FALSE = "1";
 }

+ 65 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/ButtonPermissionEnum.java

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

+ 0 - 54
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/FormTypeEnum.java

@@ -1,54 +0,0 @@
-package com.vber.workflow.common.enums;
-
-import cn.hutool.core.util.StrUtil;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Arrays;
-
-/**
- * 任务状态枚举
- *
- * @author iwb
- */
-@Getter
-@AllArgsConstructor
-public enum FormTypeEnum {
-    /**
-     * 自定义表单
-     */
-    STATIC("static", "自定义表单"),
-    /**
-     * 动态表单
-     */
-    DYNAMIC("dynamic", "动态表单");
-
-    /**
-     * 类型
-     */
-    private final String type;
-
-    /**
-     * 描述
-     */
-    private final String desc;
-
-    /**
-     * 表单类型
-     *
-     * @param formType 表单类型
-     */
-    public static String findByType(String formType) {
-        if (StringUtils.isBlank(formType)) {
-            return StrUtil.EMPTY;
-        }
-
-        return Arrays.stream(FormTypeEnum.values())
-                .filter(statusEnum -> statusEnum.getType().equals(formType))
-                .findFirst()
-                .map(FormTypeEnum::getDesc)
-                .orElse(StrUtil.EMPTY);
-    }
-}
-

+ 11 - 10
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/MessageTypeEnum.java

@@ -3,25 +3,30 @@ package com.vber.workflow.common.enums;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.util.Arrays;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 消息类型枚举
  *
- * @author iwb
+ * @author Iwb
  */
 @Getter
 @AllArgsConstructor
 public enum MessageTypeEnum {
+
     /**
      * 站内信
      */
     SYSTEM_MESSAGE("1", "站内信"),
+
     /**
      * 邮箱
      */
     EMAIL_MESSAGE("2", "邮箱"),
+
     /**
      * 短信
      */
@@ -31,13 +36,8 @@ public enum MessageTypeEnum {
 
     private final String desc;
 
-    private final static Map<String, MessageTypeEnum> MESSAGE_TYPE_ENUM_MAP = new ConcurrentHashMap<>(MessageTypeEnum.values().length);
-
-    static {
-        for (MessageTypeEnum messageType : MessageTypeEnum.values()) {
-            MESSAGE_TYPE_ENUM_MAP.put(messageType.code, messageType);
-        }
-    }
+    private static final Map<String, MessageTypeEnum> MESSAGE_TYPE_ENUM_MAP = Arrays.stream(values())
+        .collect(Collectors.toConcurrentMap(MessageTypeEnum::getCode, Function.identity()));
 
     /**
      * 根据消息类型 code 获取 MessageTypeEnum
@@ -46,7 +46,8 @@ public enum MessageTypeEnum {
      * @return MessageTypeEnum
      */
     public static MessageTypeEnum getByCode(String code) {
-        return MESSAGE_TYPE_ENUM_MAP.get(code);
+        return MESSAGE_TYPE_ENUM_MAP.getOrDefault(code, null);
     }
+
 }
 

+ 32 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/NodeExtEnum.java

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

+ 109 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/TaskAssigneeEnum.java

@@ -0,0 +1,109 @@
+package com.vber.workflow.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import com.vber.common.core.exception.ServiceException;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 任务分配人枚举
+ *
+ * @author Iwb
+ */
+@Getter
+@AllArgsConstructor
+public enum TaskAssigneeEnum {
+
+    /**
+     * 用户
+     */
+    USER("用户", ""),
+
+    /**
+     * 角色
+     */
+    ROLE("角色", "role:"),
+
+    /**
+     * 组织机构
+     */
+    DEPT("组织机构", "dept:"),
+
+    /**
+     * 岗位
+     */
+    POST("岗位", "post:");
+
+    private final String desc;
+    private final String code;
+
+    /**
+     * 根据描述获取对应的枚举类型
+     * <p>
+     * 通过传入描述,查找并返回匹配的枚举项。如果未找到匹配项,会抛出 {@link ServiceException}。
+     * </p>
+     *
+     * @param desc 描述,用于匹配对应的枚举项
+     * @return TaskAssigneeEnum 返回对应的枚举类型
+     * @throws ServiceException 如果未找到匹配的枚举项
+     */
+    public static TaskAssigneeEnum fromDesc(String desc) {
+        for (TaskAssigneeEnum type : values()) {
+            if (type.getDesc().equals(desc)) {
+                return type;
+            }
+        }
+        throw new ServiceException("未知的办理人类型: " + desc);
+    }
+
+    /**
+     * 根据代码获取对应的枚举类型
+     * <p>
+     * 通过传入代码,查找并返回匹配的枚举项。如果未找到匹配项,会抛出 {@link ServiceException}。
+     * </p>
+     *
+     * @param code 代码,用于匹配对应的枚举项
+     * @return TaskAssigneeEnum 返回对应的枚举类型
+     * @throws IllegalArgumentException 如果未找到匹配的枚举项
+     */
+    public static TaskAssigneeEnum fromCode(String code) {
+        for (TaskAssigneeEnum type : values()) {
+            if (type.getCode().equals(code)) {
+                return type;
+            }
+        }
+        throw new ServiceException("未知的办理人类型代码: " + code);
+    }
+
+    /**
+     * 获取所有办理人类型的描述列表
+     * <p>
+     * 获取当前枚举类所有项的描述字段列表,通常用于展示选择项。
+     * </p>
+     *
+     * @return List<String> 返回所有办理人类型的描述列表
+     */
+    public static List<String> getAssigneeTypeList() {
+        return Arrays.stream(values())
+            .map(TaskAssigneeEnum::getDesc)
+            .collect(Collectors.toList());
+    }
+
+    /**
+     * 获取所有办理人类型的代码列表
+     * <p>
+     * 获取当前枚举类所有项的代码字段列表,通常用于程序内部逻辑的判断。
+     * </p>
+     *
+     * @return List<String> 返回所有办理人类型的代码列表
+     */
+    public static List<String> getAssigneeCodeList() {
+        return Arrays.stream(values())
+            .map(TaskAssigneeEnum::getCode)
+            .collect(Collectors.toList());
+    }
+}
+

+ 49 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/TaskAssigneeType.java

@@ -0,0 +1,49 @@
+package com.vber.workflow.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 人员类型
+ *
+ * @author Iwb
+ */
+@Getter
+@AllArgsConstructor
+public enum TaskAssigneeType {
+
+    /**
+     * 待办任务的审批人权限
+     * <p>该权限表示用户是待办任务的审批人,负责审核任务的执行情况。</p>
+     */
+    APPROVER("1", "待办任务的审批人权限"),
+
+    /**
+     * 待办任务的转办人权限
+     * <p>该权限表示用户是待办任务的转办人,负责将任务分配给其他人员。</p>
+     */
+    TRANSFER("2", "待办任务的转办人权限"),
+
+    /**
+     * 待办任务的委托人权限
+     * <p>该权限表示用户是待办任务的委托人,能够委托其他人代为处理任务。</p>
+     */
+    DELEGATE("3", "待办任务的委托人权限"),
+
+    /**
+     * 待办任务的抄送人权限
+     * <p>该权限表示用户是待办任务的抄送人,仅接收任务信息的通知,不参与任务的审批或处理。</p>
+     */
+    COPY("4", "待办任务的抄送人权限");
+
+    /**
+     * 类型
+     */
+    private final String code;
+
+    /**
+     * 描述
+     */
+    private final String description;
+
+}

+ 22 - 12
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/common/enums/TaskStatusEnum.java

@@ -3,62 +3,75 @@ package com.vber.workflow.common.enums;
 import cn.hutool.core.util.StrUtil;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.Arrays;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 任务状态枚举
  *
- * @author iwb
+ * @author Iwb
  */
 @Getter
 @AllArgsConstructor
 public enum TaskStatusEnum {
+
     /**
      * 撤销
      */
     CANCEL("cancel", "撤销"),
+
     /**
      * 通过
      */
     PASS("pass", "通过"),
+
     /**
      * 待审核
      */
     WAITING("waiting", "待审核"),
+
     /**
      * 作废
      */
     INVALID("invalid", "作废"),
+
     /**
      * 退回
      */
     BACK("back", "退回"),
+
     /**
      * 终止
      */
     TERMINATION("termination", "终止"),
+
     /**
      * 转办
      */
     TRANSFER("transfer", "转办"),
+
     /**
      * 委托
      */
-    PENDING("pending", "委托"),
+    DEPUTE("depute", "委托"),
+
     /**
      * 抄送
      */
     COPY("copy", "抄送"),
+
     /**
      * 加签
      */
     SIGN("sign", "加签"),
+
     /**
      * 减签
      */
     SIGN_OFF("sign_off", "减签"),
+
     /**
      * 超时
      */
@@ -74,21 +87,18 @@ public enum TaskStatusEnum {
      */
     private final String desc;
 
+    private static final Map<String, String> STATUS_DESC_MAP = Arrays.stream(values())
+        .collect(Collectors.toConcurrentMap(TaskStatusEnum::getStatus, TaskStatusEnum::getDesc));
+
     /**
      * 任务业务状态
      *
      * @param status 状态
      */
     public static String findByStatus(String status) {
-        if (StringUtils.isBlank(status)) {
-            return StrUtil.EMPTY;
-        }
-
-        return Arrays.stream(TaskStatusEnum.values())
-                .filter(statusEnum -> statusEnum.getStatus().equals(status))
-                .findFirst()
-                .map(TaskStatusEnum::getDesc)
-                .orElse(StrUtil.EMPTY);
+        // 从缓存中直接获取描述
+        return STATUS_DESC_MAP.getOrDefault(status, StrUtil.EMPTY);
     }
+
 }
 

+ 16 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/config/WarmFlowConfig.java

@@ -0,0 +1,16 @@
+package com.vber.workflow.config;
+
+import com.vber.workflow.common.ConditionalOnEnable;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * warmFlow配置
+ *
+ * @author Iwb
+ */
+@ConditionalOnEnable
+@Configuration
+public class WarmFlowConfig {
+
+}
+

+ 0 - 158
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/ActModelController.java

@@ -1,158 +0,0 @@
-package com.vber.workflow.controller;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import com.vber.common.core.domain.R;
-import com.vber.common.core.validate.AddGroup;
-import com.vber.common.core.validate.EditGroup;
-import com.vber.common.idempotent.annotation.RepeatSubmit;
-import com.vber.common.log.annotation.Log;
-import com.vber.common.log.enums.BusinessType;
-import com.vber.common.mybatis.core.page.PageQuery;
-import com.vber.common.mybatis.core.page.TableDataInfo;
-import com.vber.common.web.core.BaseController;
-import com.vber.workflow.domain.bo.ModelBo;
-import com.vber.workflow.domain.vo.ModelVo;
-import com.vber.workflow.service.IActModelService;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import lombok.RequiredArgsConstructor;
-import org.flowable.engine.RepositoryService;
-import org.flowable.engine.repository.Model;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 模型管理 控制层
- *
- * @author iwb
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/workflow/model")
-public class ActModelController extends BaseController {
-
-    @Autowired(required = false)
-    private final RepositoryService repositoryService;
-
-    private final IActModelService actModelService;
-
-
-    /**
-     * 分页查询模型
-     *
-     * @param modelBo 模型参数
-     */
-    @GetMapping("/list")
-    @SaCheckPermission("workflow:model:query")
-    public TableDataInfo<Model> page(ModelBo modelBo, PageQuery pageQuery) {
-        return actModelService.page(modelBo, pageQuery);
-    }
-
-    /**
-     * 新增模型
-     *
-     * @param modelBo 模型请求对象
-     */
-    @Log(title = "模型管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/save")
-    @SaCheckPermission("workflow:model:add")
-    public R<Void> saveNewModel(@Validated(AddGroup.class) @RequestBody ModelBo modelBo) {
-        return toAjax(actModelService.saveNewModel(modelBo));
-    }
-
-    /**
-     * 查询模型
-     *
-     * @param id 模型id
-     */
-    @GetMapping("/getInfo/{id}")
-    @SaCheckPermission("workflow:model:query")
-    public R<ModelVo> getInfo(@NotBlank(message = "模型id不能为空") @PathVariable String id) {
-        return R.ok(actModelService.getInfo(id));
-    }
-
-    /**
-     * 修改模型信息
-     *
-     * @param modelBo 模型数据
-     */
-    @Log(title = "模型管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping(value = "/update")
-    @SaCheckPermission("workflow:model:edit")
-    public R<Void> update(@RequestBody ModelBo modelBo) {
-        return toAjax(actModelService.update(modelBo));
-    }
-
-    /**
-     * 编辑XMl模型
-     *
-     * @param modelBo 模型数据
-     */
-    @Log(title = "模型管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping(value = "/editModelXml")
-    @SaCheckPermission("workflow:model:edit")
-    public R<Void> editModel(@Validated(EditGroup.class) @RequestBody ModelBo modelBo) {
-        return toAjax(actModelService.editModelXml(modelBo));
-    }
-
-    /**
-     * 删除流程模型
-     *
-     * @param ids 模型id
-     */
-    @Log(title = "模型管理", businessType = BusinessType.DELETE)
-    @RepeatSubmit()
-    @DeleteMapping("/{ids}")
-    @Transactional(rollbackFor = Exception.class)
-    @SaCheckPermission("workflow:model:remove")
-    public R<Void> delete(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) {
-        Arrays.stream(ids).parallel().forEachOrdered(repositoryService::deleteModel);
-        return R.ok();
-    }
-
-    /**
-     * 模型部署
-     *
-     * @param id 模型id
-     */
-    @Log(title = "模型管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/modelDeploy/{id}")
-    @SaCheckPermission("workflow:model:deploy")
-    public R<Void> deploy(@NotBlank(message = "模型id不能为空") @PathVariable("id") String id) {
-        return toAjax(actModelService.modelDeploy(id));
-    }
-
-    /**
-     * 导出模型zip压缩包
-     *
-     * @param modelIds 模型id
-     * @param response 相应
-     */
-    @GetMapping("/export/zip/{modelIds}")
-    @SaCheckPermission("workflow:model:export")
-    public void exportZip(@NotEmpty(message = "模型id不能为空") @PathVariable List<String> modelIds, HttpServletResponse response) {
-        actModelService.exportZip(modelIds, response);
-    }
-
-    /**
-     * 复制模型
-     *
-     * @param modelBo 模型数据
-     */
-    @PostMapping("/copyModel")
-    @SaCheckPermission("workflow:model:add")
-    public R<Void> copyModel(@RequestBody ModelBo modelBo) {
-        return toAjax(actModelService.copyModel(modelBo));
-    }
-}

+ 0 - 157
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/ActProcessDefinitionController.java

@@ -1,157 +0,0 @@
-package com.vber.workflow.controller;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import com.vber.common.core.domain.R;
-import com.vber.common.idempotent.annotation.RepeatSubmit;
-import com.vber.common.log.annotation.Log;
-import com.vber.common.log.enums.BusinessType;
-import com.vber.common.mybatis.core.page.PageQuery;
-import com.vber.common.mybatis.core.page.TableDataInfo;
-import com.vber.common.web.core.BaseController;
-import com.vber.workflow.domain.bo.ProcessDefinitionBo;
-import com.vber.workflow.domain.vo.ProcessDefinitionVo;
-import com.vber.workflow.service.IActProcessDefinitionService;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * 流程定义管理 控制层
- *
- * @author iwb
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/workflow/processDefinition")
-public class ActProcessDefinitionController extends BaseController {
-
-    private final IActProcessDefinitionService actProcessDefinitionService;
-
-    /**
-     * 分页查询
-     *
-     * @param bo 参数
-     */
-    @GetMapping("/list")
-    @SaCheckPermission("workflow:definition:query")
-    public TableDataInfo<ProcessDefinitionVo> page(ProcessDefinitionBo bo, PageQuery pageQuery) {
-        return actProcessDefinitionService.page(bo, pageQuery);
-    }
-
-    /**
-     * 查询历史流程定义列表
-     *
-     * @param key 流程定义key
-     */
-    @GetMapping("/getListByKey/{key}")
-    @SaCheckPermission("workflow:definition:query")
-    public R<List<ProcessDefinitionVo>> getListByKey(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) {
-        return R.ok("操作成功", actProcessDefinitionService.getListByKey(key));
-    }
-
-    /**
-     * 查看流程定义图片
-     *
-     * @param processDefinitionId 流程定义id
-     */
-    @GetMapping("/definitionImage/{processDefinitionId}")
-    @SaCheckPermission("workflow:definition:query")
-    public R<String> definitionImage(@PathVariable String processDefinitionId) {
-        return R.ok("操作成功", actProcessDefinitionService.definitionImage(processDefinitionId));
-    }
-
-    /**
-     * 查看流程定义xml文件
-     *
-     * @param processDefinitionId 流程定义id
-     */
-    @GetMapping("/definitionXml/{processDefinitionId}")
-    @SaCheckPermission("workflow:definition:query")
-    public R<Map<String, Object>> definitionXml(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) {
-        Map<String, Object> map = new HashMap<>();
-        String xmlStr = actProcessDefinitionService.definitionXml(processDefinitionId);
-        map.put("xml", Arrays.asList(xmlStr.split("\n")));
-        map.put("xmlStr", xmlStr);
-        return R.ok(map);
-    }
-
-    /**
-     * 删除流程定义
-     *
-     * @param deploymentIds        部署id
-     * @param processDefinitionIds 流程定义id
-     */
-    @Log(title = "流程定义管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{deploymentIds}/{processDefinitionIds}")
-    @SaCheckPermission("workflow:definition:remove")
-    public R<Void> deleteDeployment(@NotNull(message = "流程部署id不能为空") @PathVariable List<String> deploymentIds,
-                                    @NotNull(message = "流程定义id不能为空") @PathVariable List<String> processDefinitionIds) {
-        return toAjax(actProcessDefinitionService.deleteDeployment(deploymentIds, processDefinitionIds));
-    }
-
-    /**
-     * 激活或者挂起流程定义
-     *
-     * @param processDefinitionId 流程定义id
-     */
-    @Log(title = "流程定义管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping("/updateDefinitionState/{processDefinitionId}")
-    @SaCheckPermission("workflow:definition")
-    public R<Void> updateDefinitionState(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) {
-        return toAjax(actProcessDefinitionService.updateDefinitionState(processDefinitionId));
-    }
-
-    /**
-     * 迁移流程定义
-     *
-     * @param currentProcessDefinitionId 当前流程定义id
-     * @param fromProcessDefinitionId    需要迁移到的流程定义id
-     */
-    @Log(title = "流程定义管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping("/migrationDefinition/{currentProcessDefinitionId}/{fromProcessDefinitionId}")
-    @SaCheckPermission("workflow:definition")
-    public R<Void> migrationDefinition(@NotBlank(message = "当前流程定义id") @PathVariable String currentProcessDefinitionId,
-                                       @NotBlank(message = "需要迁移到的流程定义id") @PathVariable String fromProcessDefinitionId) {
-        return toAjax(actProcessDefinitionService.migrationDefinition(currentProcessDefinitionId, fromProcessDefinitionId));
-    }
-
-    /**
-     * 流程定义转换为模型
-     *
-     * @param processDefinitionId 流程定义id
-     */
-    @Log(title = "流程定义管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping("/convertToModel/{processDefinitionId}")
-    @SaCheckPermission("workflow:definition")
-    public R<Void> convertToModel(@NotEmpty(message = "流程定义id不能为空") @PathVariable String processDefinitionId) {
-        return toAjax(actProcessDefinitionService.convertToModel(processDefinitionId));
-    }
-
-    /**
-     * 通过zip或xml部署流程定义
-     *
-     * @param file         文件
-     * @param categoryCode 分类
-     */
-    @Log(title = "流程定义管理", businessType = BusinessType.INSERT)
-    @PostMapping("/deployByFile")
-    @SaCheckPermission("workflow:definition:upload")
-    public void deployByFile(@RequestParam("file") MultipartFile file, @RequestParam("categoryCode") String categoryCode) {
-        actProcessDefinitionService.deployByFile(file, categoryCode);
-    }
-
-}

+ 0 - 160
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/ActProcessInstanceController.java

@@ -1,160 +0,0 @@
-package com.vber.workflow.controller;
-
-import com.vber.common.core.domain.R;
-import com.vber.common.core.validate.AddGroup;
-import com.vber.common.idempotent.annotation.RepeatSubmit;
-import com.vber.common.log.annotation.Log;
-import com.vber.common.log.enums.BusinessType;
-import com.vber.common.mybatis.core.page.PageQuery;
-import com.vber.common.mybatis.core.page.TableDataInfo;
-import com.vber.common.web.core.BaseController;
-import com.vber.workflow.domain.bo.ProcessInstanceBo;
-import com.vber.workflow.domain.bo.ProcessInvalidBo;
-import com.vber.workflow.domain.bo.TaskUrgingBo;
-import com.vber.workflow.domain.vo.ActHistoryInfoVo;
-import com.vber.workflow.domain.vo.ProcessInstanceVo;
-import com.vber.workflow.service.IActProcessInstanceService;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 流程实例管理 控制层
- *
- * @author iwb
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/workflow/processInstance")
-public class ActProcessInstanceController extends BaseController {
-
-    private final IActProcessInstanceService actProcessInstanceService;
-
-    /**
-     * 分页查询正在运行的流程实例
-     *
-     * @param bo 参数
-     */
-    @GetMapping("/getPageByRunning")
-    public TableDataInfo<ProcessInstanceVo> getPageByRunning(ProcessInstanceBo bo, PageQuery pageQuery) {
-        return actProcessInstanceService.getPageByRunning(bo, pageQuery);
-    }
-
-    /**
-     * 分页查询已结束的流程实例
-     *
-     * @param bo 参数
-     */
-    @GetMapping("/getPageByFinish")
-    public TableDataInfo<ProcessInstanceVo> getPageByFinish(ProcessInstanceBo bo, PageQuery pageQuery) {
-        return actProcessInstanceService.getPageByFinish(bo, pageQuery);
-    }
-
-    /**
-     * 通过业务id获取历史流程图
-     *
-     * @param businessKey 业务id
-     */
-    @GetMapping("/getHistoryImage/{businessKey}")
-    public R<String> getHistoryImage(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
-        return R.ok("操作成功", actProcessInstanceService.getHistoryImage(businessKey));
-    }
-
-    /**
-     * 通过业务id获取历史流程图运行中,历史等节点
-     *
-     * @param businessKey 业务id
-     */
-    @GetMapping("/getHistoryList/{businessKey}")
-    public R<Map<String, Object>> getHistoryList(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
-        return R.ok("操作成功", actProcessInstanceService.getHistoryList(businessKey));
-    }
-
-    /**
-     * 获取审批记录
-     *
-     * @param businessKey 业务id
-     */
-    @GetMapping("/getHistoryRecord/{businessKey}")
-    public R<List<ActHistoryInfoVo>> getHistoryRecord(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
-        return R.ok(actProcessInstanceService.getHistoryRecord(businessKey));
-    }
-
-    /**
-     * 作废流程实例,不会删除历史记录(删除运行中的实例)
-     *
-     * @param processInvalidBo 参数
-     */
-    @Log(title = "流程实例管理", businessType = BusinessType.DELETE)
-    @RepeatSubmit()
-    @PostMapping("/deleteRunInstance")
-    public R<Void> deleteRunInstance(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) {
-        return toAjax(actProcessInstanceService.deleteRunInstance(processInvalidBo));
-    }
-
-    /**
-     * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
-     *
-     * @param businessKeys 业务id
-     */
-    @Log(title = "流程实例管理", businessType = BusinessType.DELETE)
-    @RepeatSubmit()
-    @DeleteMapping("/deleteRunAndHisInstance/{businessKeys}")
-    public R<Void> deleteRunAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) {
-        return toAjax(actProcessInstanceService.deleteRunAndHisInstance(Arrays.asList(businessKeys)));
-    }
-
-    /**
-     * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
-     *
-     * @param businessKeys 业务id
-     */
-    @Log(title = "流程实例管理", businessType = BusinessType.DELETE)
-    @RepeatSubmit()
-    @DeleteMapping("/deleteFinishAndHisInstance/{businessKeys}")
-    public R<Void> deleteFinishAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) {
-        return toAjax(actProcessInstanceService.deleteFinishAndHisInstance(Arrays.asList(businessKeys)));
-    }
-
-    /**
-     * 撤销流程申请
-     *
-     * @param businessKey 业务id
-     */
-    @Log(title = "流程实例管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/cancelProcessApply/{businessKey}")
-    public R<Void> cancelProcessApply(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
-        return toAjax(actProcessInstanceService.cancelProcessApply(businessKey));
-    }
-
-    /**
-     * 分页查询当前登录人单据
-     *
-     * @param bo 参数
-     */
-    @GetMapping("/getPageByCurrent")
-    public TableDataInfo<ProcessInstanceVo> getPageByCurrent(ProcessInstanceBo bo, PageQuery pageQuery) {
-        return actProcessInstanceService.getPageByCurrent(bo, pageQuery);
-    }
-
-    /**
-     * 任务催办(给当前任务办理人发送站内信,邮件,短信等)
-     *
-     * @param taskUrgingBo 任务催办
-     */
-    @Log(title = "流程实例管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/taskUrging")
-    public R<Void> taskUrging(@RequestBody TaskUrgingBo taskUrgingBo) {
-        return toAjax(actProcessInstanceService.taskUrging(taskUrgingBo));
-    }
-
-}

+ 0 - 302
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/ActTaskController.java

@@ -1,302 +0,0 @@
-package com.vber.workflow.controller;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.convert.Convert;
-import com.vber.common.core.domain.R;
-import com.vber.common.core.validate.AddGroup;
-import com.vber.common.idempotent.annotation.RepeatSubmit;
-import com.vber.common.log.annotation.Log;
-import com.vber.common.log.enums.BusinessType;
-import com.vber.common.mybatis.core.page.PageQuery;
-import com.vber.common.mybatis.core.page.TableDataInfo;
-import com.vber.common.satoken.utils.LoginHelper;
-import com.vber.common.web.core.BaseController;
-import com.vber.workflow.domain.WfTaskBackNode;
-import com.vber.workflow.domain.bo.*;
-import com.vber.workflow.domain.vo.TaskVo;
-import com.vber.workflow.domain.vo.VariableVo;
-import com.vber.workflow.service.IActTaskService;
-import com.vber.workflow.service.IWfTaskBackNodeService;
-import com.vber.workflow.utils.QueryUtils;
-import jakarta.validation.constraints.NotBlank;
-import lombok.RequiredArgsConstructor;
-import org.flowable.engine.TaskService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 任务管理 控制层
- *
- * @author iwb
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/workflow/task")
-public class ActTaskController extends BaseController {
-
-    private final IActTaskService actTaskService;
-
-    @Autowired(required = false)
-    private final TaskService taskService;
-
-    private final IWfTaskBackNodeService wfTaskBackNodeService;
-
-
-    /**
-     * 启动任务
-     *
-     * @param startProcessBo 启动流程参数
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/startWorkFlow")
-    public R<Map<String, Object>> startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) {
-        Map<String, Object> map = actTaskService.startWorkFlow(startProcessBo);
-        return R.ok("提交成功", map);
-    }
-
-    /**
-     * 办理任务
-     *
-     * @param completeTaskBo 办理任务参数
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/completeTask")
-    public R<Void> completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) {
-        return toAjax(actTaskService.completeTask(completeTaskBo));
-    }
-
-    /**
-     * 查询当前用户的待办任务
-     *
-     * @param taskBo 参数
-     */
-    @SaCheckPermission("workflow:task")
-    @GetMapping("/getPageByTaskWait")
-    public TableDataInfo<TaskVo> getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery) {
-        return actTaskService.getPageByTaskWait(taskBo, pageQuery);
-    }
-
-    /**
-     * 查询当前租户所有待办任务
-     *
-     * @param taskBo 参数
-     */
-    @SaCheckPermission("workflow:task")
-    @GetMapping("/getPageByAllTaskWait")
-    public TableDataInfo<TaskVo> getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery) {
-        return actTaskService.getPageByAllTaskWait(taskBo, pageQuery);
-    }
-
-    /**
-     * 查询当前用户的已办任务
-     *
-     * @param taskBo 参数
-     */
-    @SaCheckPermission("workflow:task")
-    @GetMapping("/getPageByTaskFinish")
-    public TableDataInfo<TaskVo> getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery) {
-        return actTaskService.getPageByTaskFinish(taskBo, pageQuery);
-    }
-
-    /**
-     * 查询当前用户的抄送
-     *
-     * @param taskBo 参数
-     */
-    @SaCheckPermission("workflow:task")
-    @GetMapping("/getPageByTaskCopy")
-    public TableDataInfo<TaskVo> getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery) {
-        return actTaskService.getPageByTaskCopy(taskBo, pageQuery);
-    }
-
-    /**
-     * 查询当前租户所有已办任务
-     *
-     * @param taskBo 参数
-     */
-    @SaCheckPermission("workflow:task")
-    @GetMapping("/getPageByAllTaskFinish")
-    public TableDataInfo<TaskVo> getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery) {
-        return actTaskService.getPageByAllTaskFinish(taskBo, pageQuery);
-    }
-
-    /**
-     * 签收(拾取)任务
-     *
-     * @param taskId 任务id
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/claim/{taskId}")
-    public R<Void> claimTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) {
-        try {
-            taskService.claim(taskId, Convert.toStr(LoginHelper.getUserId()));
-            return R.ok();
-        } catch (Exception e) {
-            e.printStackTrace();
-            return R.fail("签收任务失败:" + e.getMessage());
-        }
-    }
-
-    /**
-     * 归还(拾取的)任务
-     *
-     * @param taskId 任务id
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/returnTask/{taskId}")
-    public R<Void> returnTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) {
-        try {
-            taskService.setAssignee(taskId, null);
-            return R.ok();
-        } catch (Exception e) {
-            e.printStackTrace();
-            return R.fail("归还任务失败:" + e.getMessage());
-        }
-    }
-
-    /**
-     * 委派任务
-     *
-     * @param delegateBo 参数
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/delegateTask")
-    public R<Void> delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo delegateBo) {
-        return toAjax(actTaskService.delegateTask(delegateBo));
-    }
-
-    /**
-     * 终止任务
-     *
-     * @param terminationBo 参数
-     */
-    @Log(title = "任务管理", businessType = BusinessType.DELETE)
-    @RepeatSubmit()
-    @PostMapping("/terminationTask")
-    public R<Void> terminationTask(@RequestBody TerminationBo terminationBo) {
-        return toAjax(actTaskService.terminationTask(terminationBo));
-    }
-
-    /**
-     * 转办任务
-     *
-     * @param transmitBo 参数
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/transferTask")
-    public R<Void> transferTask(@Validated({AddGroup.class}) @RequestBody TransmitBo transmitBo) {
-        return toAjax(actTaskService.transferTask(transmitBo));
-    }
-
-    /**
-     * 会签任务加签
-     *
-     * @param addMultiBo 参数
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/addMultiInstanceExecution")
-    public R<Void> addMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody AddMultiBo addMultiBo) {
-        return toAjax(actTaskService.addMultiInstanceExecution(addMultiBo));
-    }
-
-    /**
-     * 会签任务减签
-     *
-     * @param deleteMultiBo 参数
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/deleteMultiInstanceExecution")
-    public R<Void> deleteMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody DeleteMultiBo deleteMultiBo) {
-        return toAjax(actTaskService.deleteMultiInstanceExecution(deleteMultiBo));
-    }
-
-    /**
-     * 驳回审批
-     *
-     * @param backProcessBo 参数
-     */
-    @Log(title = "任务管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/backProcess")
-    public R<String> backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo backProcessBo) {
-        return R.ok(actTaskService.backProcess(backProcessBo));
-    }
-
-    /**
-     * 获取当前任务
-     *
-     * @param taskId 任务id
-     */
-    @GetMapping("/getTaskById/{taskId}")
-    public R<TaskVo> getTaskById(@PathVariable String taskId) {
-        return R.ok(QueryUtils.getTask(taskId));
-    }
-
-
-    /**
-     * 修改任务办理人
-     *
-     * @param taskIds 任务id
-     * @param userId  办理人id
-     */
-    @Log(title = "任务管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping("/updateAssignee/{taskIds}/{userId}")
-    public R<Void> updateAssignee(@PathVariable String[] taskIds, @PathVariable String userId) {
-        return toAjax(actTaskService.updateAssignee(taskIds, userId));
-    }
-
-    /**
-     * 查询流程变量
-     *
-     * @param taskId 任务id
-     */
-    @GetMapping("/getInstanceVariable/{taskId}")
-    public R<List<VariableVo>> getProcessInstVariable(@PathVariable String taskId) {
-        return R.ok(actTaskService.getInstanceVariable(taskId));
-    }
-
-    /**
-     * 获取可驳回得任务节点
-     *
-     * @param processInstanceId 流程实例id
-     */
-    @GetMapping("/getTaskNodeList/{processInstanceId}")
-    public R<List<WfTaskBackNode>> getNodeList(@PathVariable String processInstanceId) {
-        return R.ok(CollUtil.reverse(wfTaskBackNodeService.getListByInstanceId(processInstanceId)));
-    }
-
-    /**
-     * 查询工作流任务用户选择加签人员
-     *
-     * @param taskId 任务id
-     */
-    @GetMapping("/getTaskUserIdsByAddMultiInstance/{taskId}")
-    public R<String> getTaskUserIdsByAddMultiInstance(@PathVariable String taskId) {
-        return R.ok(actTaskService.getTaskUserIdsByAddMultiInstance(taskId));
-    }
-
-    /**
-     * 查询工作流选择减签人员
-     *
-     * @param taskId 任务id
-     */
-    @GetMapping("/getListByDeleteMultiInstance/{taskId}")
-    public R<List<TaskVo>> getListByDeleteMultiInstance(@PathVariable String taskId) {
-        return R.ok(actTaskService.getListByDeleteMultiInstance(taskId));
-    }
-}

+ 136 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/FlwCategoryController.java

@@ -0,0 +1,136 @@
+package com.vber.workflow.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.lang.tree.Tree;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import com.vber.common.core.domain.R;
+import com.vber.common.core.validate.AddGroup;
+import com.vber.common.core.validate.EditGroup;
+import com.vber.common.excel.utils.ExcelUtil;
+import com.vber.common.idempotent.annotation.RepeatSubmit;
+import com.vber.common.log.annotation.Log;
+import com.vber.common.log.enums.BusinessType;
+import com.vber.common.web.core.BaseController;
+import com.vber.workflow.common.ConditionalOnEnable;
+import com.vber.workflow.common.constant.FlowConstant;
+import com.vber.workflow.domain.bo.FlowCategoryBo;
+import com.vber.workflow.domain.vo.FlowCategoryVo;
+import com.vber.workflow.service.IFlwCategoryService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 流程分类
+ *
+ * @author Iwb
+ */
+@ConditionalOnEnable
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/category")
+public class FlwCategoryController extends BaseController {
+
+    private final IFlwCategoryService flwCategoryService;
+
+    /**
+     * 查询流程分类列表
+     */
+    @SaCheckPermission("workflow:category:query")
+    @GetMapping("/list")
+    public R<List<FlowCategoryVo>> list(FlowCategoryBo bo) {
+        List<FlowCategoryVo> list = flwCategoryService.queryList(bo);
+        return R.ok(list);
+    }
+
+    /**
+     * 导出流程分类列表
+     */
+    @SaCheckPermission("workflow:category:export")
+    @Log(title = "流程分类", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(FlowCategoryBo bo, HttpServletResponse response) {
+        List<FlowCategoryVo> list = flwCategoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "流程分类", FlowCategoryVo.class, response);
+    }
+
+    /**
+     * 获取流程分类详细信息
+     *
+     * @param categoryId 主键
+     */
+    @SaCheckPermission("workflow:category:query")
+    @GetMapping("/{categoryId}")
+    public R<FlowCategoryVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long categoryId) {
+        flwCategoryService.checkCategoryDataScope(categoryId);
+        return R.ok(flwCategoryService.queryById(categoryId));
+    }
+
+    /**
+     * 新增流程分类
+     */
+    @SaCheckPermission("workflow:category:add")
+    @Log(title = "流程分类", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody FlowCategoryBo category) {
+        if (!flwCategoryService.checkCategoryNameUnique(category)) {
+            return R.fail("新增流程分类'" + category.getCategoryName() + "'失败,流程分类名称已存在");
+        }
+        return toAjax(flwCategoryService.insertByBo(category));
+    }
+
+    /**
+     * 修改流程分类
+     */
+    @SaCheckPermission("workflow:category:edit")
+    @Log(title = "流程分类", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody FlowCategoryBo category) {
+        Long categoryId = category.getCategoryId();
+        flwCategoryService.checkCategoryDataScope(categoryId);
+        if (!flwCategoryService.checkCategoryNameUnique(category)) {
+            return R.fail("修改流程分类'" + category.getCategoryName() + "'失败,流程分类名称已存在");
+        } else if (category.getParentId().equals(categoryId)) {
+            return R.fail("修改流程分类'" + category.getCategoryName() + "'失败,上级流程分类不能是自己");
+        }
+        return toAjax(flwCategoryService.updateByBo(category));
+    }
+
+    /**
+     * 删除流程分类
+     *
+     * @param categoryId 主键
+     */
+    @SaCheckPermission("workflow:category:remove")
+    @Log(title = "流程分类", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{categoryId}")
+    public R<Void> remove(@PathVariable Long categoryId) {
+        if (FlowConstant.FLOW_CATEGORY_ID.equals(categoryId)) {
+            return R.warn("默认流程分类,不允许删除");
+        }
+        if (flwCategoryService.hasChildByCategoryId(categoryId)) {
+            return R.warn("存在下级流程分类,不允许删除");
+        }
+        if (flwCategoryService.checkCategoryExistDefinition(categoryId)) {
+            return R.warn("流程分类存在流程定义,不允许删除");
+        }
+        return toAjax(flwCategoryService.deleteWithValidById(categoryId));
+    }
+
+    /**
+     * 获取流程分类树列表
+     *
+     * @param categoryBo 流程分类
+     */
+    @GetMapping("/categoryTree")
+    public R<List<Tree<String>>> categoryTree(FlowCategoryBo categoryBo) {
+        return R.ok(flwCategoryService.selectCategoryTreeList(categoryBo));
+    }
+
+}

+ 194 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/FlwDefinitionController.java

@@ -0,0 +1,194 @@
+package com.vber.workflow.controller;
+
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import com.vber.common.core.domain.R;
+import com.vber.common.idempotent.annotation.RepeatSubmit;
+import com.vber.common.log.annotation.Log;
+import com.vber.common.log.enums.BusinessType;
+import com.vber.common.mybatis.core.page.PageQuery;
+import com.vber.common.mybatis.core.page.TableDataInfo;
+import com.vber.common.web.core.BaseController;
+import org.dromara.warm.flow.core.entity.Definition;
+import org.dromara.warm.flow.core.service.DefService;
+import org.dromara.warm.flow.orm.entity.FlowDefinition;
+import com.vber.workflow.common.ConditionalOnEnable;
+import com.vber.workflow.domain.vo.FlowDefinitionVo;
+import com.vber.workflow.service.IFlwDefinitionService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 流程定义管理 控制层
+ *
+ * @author Iwb
+ */
+@ConditionalOnEnable
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/definition")
+public class FlwDefinitionController extends BaseController {
+
+    private final DefService defService;
+    private final IFlwDefinitionService flwDefinitionService;
+
+    /**
+     * 查询流程定义列表
+     *
+     * @param flowDefinition 参数
+     * @param pageQuery      分页
+     */
+    @GetMapping("/list")
+    public TableDataInfo<FlowDefinitionVo> list(FlowDefinition flowDefinition, PageQuery pageQuery) {
+        return flwDefinitionService.queryList(flowDefinition, pageQuery);
+    }
+
+    /**
+     * 查询未发布的流程定义列表
+     *
+     * @param flowDefinition 参数
+     * @param pageQuery      分页
+     */
+    @GetMapping("/unPublishList")
+    public TableDataInfo<FlowDefinitionVo> unPublishList(FlowDefinition flowDefinition, PageQuery pageQuery) {
+        return flwDefinitionService.unPublishList(flowDefinition, pageQuery);
+    }
+
+    /**
+     * 获取流程定义详细信息
+     *
+     * @param id 流程定义id
+     */
+    @GetMapping(value = "/{id}")
+    public R<Definition> getInfo(@PathVariable Long id) {
+        return R.ok(defService.getById(id));
+    }
+
+    /**
+     * 新增流程定义
+     *
+     * @param flowDefinition 参数
+     */
+    @Log(title = "流程定义", businessType = BusinessType.INSERT)
+    @PostMapping
+    @RepeatSubmit()
+    @Transactional(rollbackFor = Exception.class)
+    public R<Boolean> add(@RequestBody FlowDefinition flowDefinition) {
+        return R.ok(defService.checkAndSave(flowDefinition));
+    }
+
+    /**
+     * 修改流程定义
+     *
+     * @param flowDefinition 参数
+     */
+    @Log(title = "流程定义", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @RepeatSubmit()
+    @Transactional(rollbackFor = Exception.class)
+    public R<Boolean> edit(@RequestBody FlowDefinition flowDefinition) {
+        return R.ok(defService.updateById(flowDefinition));
+    }
+
+    /**
+     * 发布流程定义
+     *
+     * @param id 流程定义id
+     */
+    @Log(title = "流程定义", businessType = BusinessType.INSERT)
+    @PutMapping("/publish/{id}")
+    @RepeatSubmit()
+    public R<Boolean> publish(@PathVariable Long id) {
+        return R.ok(flwDefinitionService.publish(id));
+    }
+
+    /**
+     * 取消发布流程定义
+     *
+     * @param id 流程定义id
+     */
+    @Log(title = "流程定义", businessType = BusinessType.INSERT)
+    @PutMapping("/unPublish/{id}")
+    @RepeatSubmit()
+    @Transactional(rollbackFor = Exception.class)
+    public R<Boolean> unPublish(@PathVariable Long id) {
+        return R.ok(defService.unPublish(id));
+    }
+
+    /**
+     * 删除流程定义
+     */
+    @Log(title = "流程定义", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable List<Long> ids) {
+        return toAjax(flwDefinitionService.removeDef(ids));
+    }
+
+    /**
+     * 复制流程定义
+     *
+     * @param id 流程定义id
+     */
+    @Log(title = "流程定义", businessType = BusinessType.INSERT)
+    @PostMapping("/copy/{id}")
+    @RepeatSubmit()
+    @Transactional(rollbackFor = Exception.class)
+    public R<Boolean> copy(@PathVariable Long id) {
+        return R.ok(defService.copyDef(id));
+    }
+
+    /**
+     * 导入流程定义
+     *
+     * @param file     文件
+     * @param category 分类
+     */
+    @Log(title = "流程定义", businessType = BusinessType.IMPORT)
+    @PostMapping("/importDef")
+    public R<Boolean> importDef(MultipartFile file, String category) {
+        return R.ok(flwDefinitionService.importJson(file, category));
+    }
+
+    /**
+     * 导出流程定义
+     *
+     * @param id       流程定义id
+     * @param response 响应
+     * @throws IOException 异常
+     */
+    @Log(title = "流程定义", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportDef/{id}")
+    public void exportDef(@PathVariable Long id, HttpServletResponse response) throws IOException {
+        flwDefinitionService.exportDef(id, response);
+    }
+
+    /**
+     * 获取流程定义JSON字符串
+     *
+     * @param id 流程定义id
+     */
+    @GetMapping("/xmlString/{id}")
+    public R<String> xmlString(@PathVariable Long id) {
+        return R.ok("操作成功", defService.exportJson(id));
+    }
+
+    /**
+     * 激活/挂起流程定义
+     *
+     * @param id     流程定义id
+     * @param active 激活/挂起
+     */
+    @RepeatSubmit()
+    @PutMapping("/active/{id}")
+    @Transactional(rollbackFor = Exception.class)
+    public R<Boolean> active(@PathVariable Long id, @RequestParam boolean active) {
+        return R.ok(active ? defService.active(id) : defService.unActive(id));
+    }
+
+}

+ 157 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/FlwInstanceController.java

@@ -0,0 +1,157 @@
+package com.vber.workflow.controller;
+
+import lombok.RequiredArgsConstructor;
+import com.vber.common.core.domain.R;
+import com.vber.common.idempotent.annotation.RepeatSubmit;
+import com.vber.common.log.annotation.Log;
+import com.vber.common.log.enums.BusinessType;
+import com.vber.common.mybatis.core.page.PageQuery;
+import com.vber.common.mybatis.core.page.TableDataInfo;
+import com.vber.common.web.core.BaseController;
+import org.dromara.warm.flow.core.service.InsService;
+import com.vber.workflow.common.ConditionalOnEnable;
+import com.vber.workflow.domain.bo.FlowCancelBo;
+import com.vber.workflow.domain.bo.FlowInstanceBo;
+import com.vber.workflow.domain.bo.FlowInvalidBo;
+import com.vber.workflow.domain.vo.FlowInstanceVo;
+import com.vber.workflow.service.IFlwInstanceService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 流程实例管理 控制层
+ *
+ * @author Iwb
+ */
+@ConditionalOnEnable
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/instance")
+public class FlwInstanceController extends BaseController {
+
+    private final InsService insService;
+    private final IFlwInstanceService flwInstanceService;
+
+    /**
+     * 查询正在运行的流程实例列表
+     *
+     * @param flowInstanceBo 流程实例
+     * @param pageQuery      分页
+     */
+    @GetMapping("/pageByRunning")
+    public TableDataInfo<FlowInstanceVo> selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) {
+        return flwInstanceService.selectRunningInstanceList(flowInstanceBo, pageQuery);
+    }
+
+    /**
+     * 查询已结束的流程实例列表
+     *
+     * @param flowInstanceBo 流程实例
+     * @param pageQuery      分页
+     */
+    @GetMapping("/pageByFinish")
+    public TableDataInfo<FlowInstanceVo> selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) {
+        return flwInstanceService.selectFinishInstanceList(flowInstanceBo, pageQuery);
+    }
+
+    /**
+     * 根据业务id查询流程实例详细信息
+     *
+     * @param businessId 业务id
+     */
+    @GetMapping("/getInfo/{businessId}")
+    public R<FlowInstanceVo> getInfo(@PathVariable Long businessId) {
+        return R.ok(flwInstanceService.queryByBusinessId(businessId));
+    }
+
+    /**
+     * 按照业务id删除流程实例
+     *
+     * @param businessIds 业务id
+     */
+    @DeleteMapping("/deleteByBusinessIds/{businessIds}")
+    public R<Void> deleteByBusinessIds(@PathVariable List<Long> businessIds) {
+        return toAjax(flwInstanceService.deleteByBusinessIds(businessIds));
+    }
+
+    /**
+     * 按照实例id删除流程实例
+     *
+     * @param instanceIds 实例id
+     */
+    @DeleteMapping("/deleteByInstanceIds/{instanceIds}")
+    public R<Void> deleteByInstanceIds(@PathVariable List<Long> instanceIds) {
+        return toAjax(flwInstanceService.deleteByInstanceIds(instanceIds));
+    }
+
+    /**
+     * 撤销流程
+     *
+     * @param bo 参数
+     */
+    @RepeatSubmit()
+    @PutMapping("/cancelProcessApply")
+    public R<Void> cancelProcessApply(@RequestBody FlowCancelBo bo) {
+        return toAjax(flwInstanceService.cancelProcessApply(bo));
+    }
+
+    /**
+     * 激活/挂起流程实例
+     *
+     * @param id     流程实例id
+     * @param active 激活/挂起
+     */
+    @RepeatSubmit()
+    @PutMapping("/active/{id}")
+    public R<Boolean> active(@PathVariable Long id, @RequestParam boolean active) {
+        return R.ok(active ? insService.active(id) : insService.unActive(id));
+    }
+
+    /**
+     * 获取当前登陆人发起的流程实例
+     *
+     * @param flowInstanceBo 参数
+     * @param pageQuery      分页
+     */
+    @GetMapping("/pageByCurrent")
+    public TableDataInfo<FlowInstanceVo> selectCurrentInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) {
+        return flwInstanceService.selectCurrentInstanceList(flowInstanceBo, pageQuery);
+    }
+
+    /**
+     * 获取流程图,流程记录
+     *
+     * @param businessId 业务id
+     */
+    @GetMapping("/flowHisTaskList/{businessId}")
+    public R<Map<String, Object>> flowHisTaskList(@PathVariable String businessId) {
+        return R.ok(flwInstanceService.flowHisTaskList(businessId));
+    }
+
+    /**
+     * 获取流程变量
+     *
+     * @param instanceId 流程实例id
+     */
+    @GetMapping("/instanceVariable/{instanceId}")
+    public R<Map<String, Object>> instanceVariable(@PathVariable Long instanceId) {
+        return R.ok(flwInstanceService.instanceVariable(instanceId));
+    }
+
+    /**
+     * 作废流程
+     *
+     * @param bo 参数
+     */
+    @Log(title = "流程实例管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/invalid")
+    public R<Boolean> invalid(@Validated @RequestBody FlowInvalidBo bo) {
+        return R.ok(flwInstanceService.processInvalid(bo));
+    }
+
+}

+ 212 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/FlwTaskController.java

@@ -0,0 +1,212 @@
+package com.vber.workflow.controller;
+
+import lombok.RequiredArgsConstructor;
+import com.vber.common.core.domain.R;
+import com.vber.common.core.domain.dto.StartProcessReturnDTO;
+import com.vber.common.core.domain.dto.UserDTO;
+import com.vber.common.core.validate.AddGroup;
+import com.vber.common.idempotent.annotation.RepeatSubmit;
+import com.vber.common.log.annotation.Log;
+import com.vber.common.log.enums.BusinessType;
+import com.vber.common.mybatis.core.page.PageQuery;
+import com.vber.common.mybatis.core.page.TableDataInfo;
+import com.vber.common.web.core.BaseController;
+import org.dromara.warm.flow.core.entity.Node;
+import org.dromara.warm.flow.orm.entity.FlowNode;
+import com.vber.workflow.common.ConditionalOnEnable;
+import com.vber.workflow.domain.bo.*;
+import com.vber.workflow.domain.vo.FlowHisTaskVo;
+import com.vber.workflow.domain.vo.FlowTaskVo;
+import com.vber.workflow.service.IFlwTaskService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 任务管理 控制层
+ *
+ * @author Iwb
+ */
+@ConditionalOnEnable
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/task")
+public class FlwTaskController extends BaseController {
+
+    private final IFlwTaskService flwTaskService;
+
+    /**
+     * 启动任务
+     *
+     * @param startProcessBo 启动流程参数
+     */
+    @Log(title = "任务管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/startWorkFlow")
+    public R<StartProcessReturnDTO> startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) {
+        StartProcessReturnDTO startProcessReturn = flwTaskService.startWorkFlow(startProcessBo);
+        return R.ok("提交成功", startProcessReturn);
+    }
+
+    /**
+     * 办理任务
+     *
+     * @param completeTaskBo 办理任务参数
+     */
+    @Log(title = "任务管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/completeTask")
+    public R<Void> completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) {
+        return toAjax(flwTaskService.completeTask(completeTaskBo));
+    }
+
+    /**
+     * 查询当前用户的待办任务
+     *
+     * @param flowTaskBo 参数
+     * @param pageQuery  分页
+     */
+    @GetMapping("/pageByTaskWait")
+    public TableDataInfo<FlowTaskVo> pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
+        return flwTaskService.pageByTaskWait(flowTaskBo, pageQuery);
+    }
+
+    /**
+     * 查询当前用户的已办任务
+     *
+     * @param flowTaskBo 参数
+     * @param pageQuery  分页
+     */
+
+    @GetMapping("/pageByTaskFinish")
+    public TableDataInfo<FlowHisTaskVo> pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
+        return flwTaskService.pageByTaskFinish(flowTaskBo, pageQuery);
+    }
+
+    /**
+     * 查询待办任务
+     *
+     * @param flowTaskBo 参数
+     * @param pageQuery  分页
+     */
+    @GetMapping("/pageByAllTaskWait")
+    public TableDataInfo<FlowTaskVo> pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
+        return flwTaskService.pageByAllTaskWait(flowTaskBo, pageQuery);
+    }
+
+    /**
+     * 查询已办任务
+     *
+     * @param flowTaskBo 参数
+     * @param pageQuery  分页
+     */
+    @GetMapping("/pageByAllTaskFinish")
+    public TableDataInfo<FlowHisTaskVo> pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
+        return flwTaskService.pageByAllTaskFinish(flowTaskBo, pageQuery);
+    }
+
+    /**
+     * 查询当前用户的抄送
+     *
+     * @param flowTaskBo 参数
+     * @param pageQuery  分页
+     */
+    @GetMapping("/pageByTaskCopy")
+    public TableDataInfo<FlowTaskVo> pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
+        return flwTaskService.pageByTaskCopy(flowTaskBo, pageQuery);
+    }
+
+    /**
+     * 根据taskId查询代表任务
+     *
+     * @param taskId 任务id
+     */
+    @GetMapping("/getTask/{taskId}")
+    public R<FlowTaskVo> getTask(@PathVariable Long taskId) {
+        return R.ok(flwTaskService.selectById(taskId));
+    }
+
+    /**
+     * 获取下一节点信息
+     *
+     * @param bo 参数
+     */
+    @PostMapping("/getNextNodeList")
+    public R<List<FlowNode>> getNextNodeList(@RequestBody FlowNextNodeBo bo) {
+        return R.ok(flwTaskService.getNextNodeList(bo));
+    }
+
+    /**
+     * 终止任务
+     *
+     * @param bo 参数
+     */
+    @Log(title = "任务管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/terminationTask")
+    public R<Boolean> terminationTask(@RequestBody FlowTerminationBo bo) {
+        return R.ok(flwTaskService.terminationTask(bo));
+    }
+
+    /**
+     * 任务操作
+     *
+     * @param bo            参数
+     * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature
+     */
+    @Log(title = "任务管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit
+    @PostMapping("/taskOperation/{taskOperation}")
+    public R<Void> taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) {
+        return toAjax(flwTaskService.taskOperation(bo, taskOperation));
+    }
+
+    /**
+     * 修改任务办理人
+     *
+     * @param taskIdList 任务id
+     * @param userId     办理人id
+     */
+    @Log(title = "任务管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/updateAssignee/{userId}")
+    public R<Void> updateAssignee(@RequestBody List<Long> taskIdList, @PathVariable String userId) {
+        return toAjax(flwTaskService.updateAssignee(taskIdList, userId));
+    }
+
+    /**
+     * 驳回审批
+     *
+     * @param bo 参数
+     */
+    @Log(title = "任务管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/backProcess")
+    public R<Void> backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo bo) {
+        return toAjax(flwTaskService.backProcess(bo));
+    }
+
+    /**
+     * 获取可驳回的前置节点
+     *
+     * @param definitionId 流程定义id
+     * @param nowNodeCode  当前节点
+     */
+    @GetMapping("/getBackTaskNode/{definitionId}/{nowNodeCode}")
+    public R<List<Node>> getBackTaskNode(@PathVariable Long definitionId, @PathVariable String nowNodeCode) {
+        return R.ok(flwTaskService.getBackTaskNode(definitionId, nowNodeCode));
+    }
+
+    /**
+     * 获取当前任务的所有办理人
+     *
+     * @param taskId 任务id
+     */
+    @GetMapping("/currentTaskAllUser/{taskId}")
+    public R<List<UserDTO>> currentTaskAllUser(@PathVariable Long taskId) {
+        return R.ok(flwTaskService.currentTaskAllUser(List.of(taskId)));
+    }
+
+}

+ 26 - 25
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/TestLeaveController.java

@@ -1,6 +1,10 @@
 package com.vber.workflow.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
 import com.vber.common.core.domain.R;
 import com.vber.common.core.validate.AddGroup;
 import com.vber.common.core.validate.EditGroup;
@@ -11,13 +15,10 @@ import com.vber.common.log.enums.BusinessType;
 import com.vber.common.mybatis.core.page.PageQuery;
 import com.vber.common.mybatis.core.page.TableDataInfo;
 import com.vber.common.web.core.BaseController;
-import com.vber.workflow.domain.bo.LeaveApplyBo;
-import com.vber.workflow.domain.vo.LeaveApplyVo;
-import com.vber.workflow.service.ILeaveApplyService;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
+import com.vber.workflow.common.ConditionalOnEnable;
+import com.vber.workflow.domain.bo.TestLeaveBo;
+import com.vber.workflow.domain.vo.TestLeaveVo;
+import com.vber.workflow.service.ITestLeaveService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -26,35 +27,35 @@ import java.util.List;
 /**
  * 请假
  *
- * @author iwb
- * @date 2023-07-21
+ * @author Iwb
  */
+@ConditionalOnEnable
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/demo/leave")
+@RequestMapping("/workflow/leave")
 public class TestLeaveController extends BaseController {
 
-    private final ILeaveApplyService testLeaveService;
+    private final ITestLeaveService testLeaveService;
 
     /**
      * 查询请假列表
      */
-    @SaCheckPermission("demo:leave")
+    @SaCheckPermission("workflow:leave:query")
     @GetMapping("/list")
-    public TableDataInfo<LeaveApplyVo> list(LeaveApplyBo bo, PageQuery pageQuery) {
+    public TableDataInfo<TestLeaveVo> list(TestLeaveBo bo, PageQuery pageQuery) {
         return testLeaveService.queryPageList(bo, pageQuery);
     }
 
     /**
      * 导出请假列表
      */
-    @SaCheckPermission("demo:leave:export")
+    @SaCheckPermission("workflow:leave:export")
     @Log(title = "请假", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(LeaveApplyBo bo, HttpServletResponse response) {
-        List<LeaveApplyVo> list = testLeaveService.queryList(bo);
-        ExcelUtil.exportExcel(list, "请假", LeaveApplyVo.class, response);
+    public void export(TestLeaveBo bo, HttpServletResponse response) {
+        List<TestLeaveVo> list = testLeaveService.queryList(bo);
+        ExcelUtil.exportExcel(list, "请假", TestLeaveVo.class, response);
     }
 
     /**
@@ -62,32 +63,32 @@ public class TestLeaveController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("demo:leave:query")
+    @SaCheckPermission("workflow:leave:query")
     @GetMapping("/{id}")
-    public R<LeaveApplyVo> getInfo(@NotNull(message = "主键不能为空")
-                                   @PathVariable Long id) {
+    public R<TestLeaveVo> getInfo(@NotNull(message = "主键不能为空")
+                                  @PathVariable Long id) {
         return R.ok(testLeaveService.queryById(id));
     }
 
     /**
      * 新增请假
      */
-    @SaCheckPermission("demo:leave:add")
+    @SaCheckPermission("workflow:leave:add")
     @Log(title = "请假", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
-    public R<LeaveApplyVo> add(@Validated(AddGroup.class) @RequestBody LeaveApplyBo bo) {
+    public R<TestLeaveVo> add(@Validated(AddGroup.class) @RequestBody TestLeaveBo bo) {
         return R.ok(testLeaveService.insertByBo(bo));
     }
 
     /**
      * 修改请假
      */
-    @SaCheckPermission("demo:leave:edit")
+    @SaCheckPermission("workflow:leave:edit")
     @Log(title = "请假", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
-    public R<LeaveApplyVo> edit(@Validated(EditGroup.class) @RequestBody LeaveApplyBo bo) {
+    public R<TestLeaveVo> edit(@Validated(EditGroup.class) @RequestBody TestLeaveBo bo) {
         return R.ok(testLeaveService.updateByBo(bo));
     }
 
@@ -96,7 +97,7 @@ public class TestLeaveController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("demo:leave:remove")
+    @SaCheckPermission("workflow:leave:remove")
     @Log(title = "请假", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 0 - 107
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/WfCategoryController.java

@@ -1,107 +0,0 @@
-package com.vber.workflow.controller;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import com.vber.common.core.domain.R;
-import com.vber.common.core.validate.AddGroup;
-import com.vber.common.core.validate.EditGroup;
-import com.vber.common.excel.utils.ExcelUtil;
-import com.vber.common.idempotent.annotation.RepeatSubmit;
-import com.vber.common.log.annotation.Log;
-import com.vber.common.log.enums.BusinessType;
-import com.vber.common.web.core.BaseController;
-import com.vber.workflow.domain.bo.WfCategoryBo;
-import com.vber.workflow.domain.vo.WfCategoryVo;
-import com.vber.workflow.service.IWfCategoryService;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 流程分类
- *
- * @author iwb
- * @date 2023-06-28
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/workflow/category")
-public class WfCategoryController extends BaseController {
-
-    private final IWfCategoryService wfCategoryService;
-
-    /**
-     * 查询流程分类列表
-     */
-    @SaCheckPermission("workflow:category")
-    @GetMapping("/list")
-    public R<List<WfCategoryVo>> list(WfCategoryBo bo) {
-        List<WfCategoryVo> list = wfCategoryService.queryList(bo);
-        return R.ok(list);
-
-    }
-
-    /**
-     * 导出流程分类列表
-     */
-    @SaCheckPermission("workflow:category:export")
-    @Log(title = "流程分类", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(WfCategoryBo bo, HttpServletResponse response) {
-        List<WfCategoryVo> list = wfCategoryService.queryList(bo);
-        ExcelUtil.exportExcel(list, "流程分类", WfCategoryVo.class, response);
-    }
-
-    /**
-     * 获取流程分类详细信息
-     *
-     * @param id 主键
-     */
-    @SaCheckPermission("workflow:category:query")
-    @GetMapping("/{id}")
-    public R<WfCategoryVo> getInfo(@NotNull(message = "主键不能为空")
-                                   @PathVariable Long id) {
-        return R.ok(wfCategoryService.queryById(id));
-    }
-
-    /**
-     * 新增流程分类
-     */
-    @SaCheckPermission("workflow:category:add")
-    @Log(title = "流程分类", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody WfCategoryBo bo) {
-        return toAjax(wfCategoryService.insertByBo(bo));
-    }
-
-    /**
-     * 修改流程分类
-     */
-    @SaCheckPermission("workflow:category:edit")
-    @Log(title = "流程分类", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody WfCategoryBo bo) {
-        return toAjax(wfCategoryService.updateByBo(bo));
-    }
-
-    /**
-     * 删除流程分类
-     *
-     * @param id 主键
-     */
-    @SaCheckPermission("workflow:category:remove")
-    @Log(title = "流程分类", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{id}")
-    public R<Void> remove(@PathVariable Long id) {
-        if (wfCategoryService.hasChildById(id)) {
-            return R.warn("存在下级流程分类,不允许删除");
-        }
-        return toAjax(wfCategoryService.deleteById(id, true));
-    }
-}

+ 0 - 80
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/WfDefinitionConfigController.java

@@ -1,80 +0,0 @@
-package com.vber.workflow.controller;
-
-import com.vber.common.core.domain.R;
-import com.vber.common.core.validate.AddGroup;
-import com.vber.common.idempotent.annotation.RepeatSubmit;
-import com.vber.common.log.annotation.Log;
-import com.vber.common.log.enums.BusinessType;
-import com.vber.common.web.core.BaseController;
-import com.vber.workflow.domain.bo.WfDefinitionConfigBo;
-import com.vber.workflow.domain.vo.WfDefinitionConfigVo;
-import com.vber.workflow.service.IWfDefinitionConfigService;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 流程定义配置
- *
- * @author iwb
- * @date 2024-03-18
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/workflow/definitionConfig")
-public class WfDefinitionConfigController extends BaseController {
-
-    private final IWfDefinitionConfigService wfDefinitionConfigService;
-
-
-    /**
-     * 获取流程定义配置详细信息
-     *
-     * @param definitionId 主键
-     */
-    @GetMapping("/getByDefId/{definitionId}")
-    public R<WfDefinitionConfigVo> getByDefId(@NotBlank(message = "流程定义ID不能为空")
-                                              @PathVariable String definitionId) {
-        return R.ok(wfDefinitionConfigService.getByDefId(definitionId));
-    }
-
-    /**
-     * 新增流程定义配置
-     */
-    @Log(title = "流程定义配置", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping("/saveOrUpdate")
-    public R<Void> saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfDefinitionConfigBo bo) {
-        return toAjax(wfDefinitionConfigService.saveOrUpdate(bo));
-    }
-
-    /**
-     * 删除流程定义配置
-     *
-     * @param ids 主键串
-     */
-    @Log(title = "流程定义配置", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "主键不能为空")
-                          @PathVariable Long[] ids) {
-        return toAjax(wfDefinitionConfigService.deleteByIds(List.of(ids)));
-    }
-
-    /**
-     * 查询流程定义配置排除当前查询的流程定义
-     *
-     * @param tableName    表名
-     * @param definitionId 流程定义id
-     */
-    @GetMapping("/getByTableNameNotDefId/{tableName}/{definitionId}")
-    public R<List<WfDefinitionConfigVo>> getByTableNameNotDefId(@NotBlank(message = "表名不能为空") @PathVariable String tableName,
-                                                                @NotBlank(message = "流程定义ID不能为空") @PathVariable String definitionId) {
-        return R.ok(wfDefinitionConfigService.getByTableNameNotDefId(tableName, definitionId));
-    }
-
-}

+ 0 - 115
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/controller/WfFormManageController.java

@@ -1,115 +0,0 @@
-package com.vber.workflow.controller;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import com.vber.common.core.domain.R;
-import com.vber.common.core.validate.AddGroup;
-import com.vber.common.core.validate.EditGroup;
-import com.vber.common.excel.utils.ExcelUtil;
-import com.vber.common.idempotent.annotation.RepeatSubmit;
-import com.vber.common.log.annotation.Log;
-import com.vber.common.log.enums.BusinessType;
-import com.vber.common.mybatis.core.page.PageQuery;
-import com.vber.common.mybatis.core.page.TableDataInfo;
-import com.vber.common.web.core.BaseController;
-import com.vber.workflow.domain.bo.WfFormManageBo;
-import com.vber.workflow.domain.vo.WfFormManageVo;
-import com.vber.workflow.service.IWfFormManageService;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 表单管理
- *
- * @author iwb
- * @date 2024-03-29
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/workflow/formManage")
-public class WfFormManageController extends BaseController {
-
-    private final IWfFormManageService wfFormManageService;
-
-    /**
-     * 查询表单管理列表
-     */
-    @SaCheckPermission("workflow:formManage")
-    @GetMapping("/list")
-    public TableDataInfo<WfFormManageVo> list(WfFormManageBo bo, PageQuery pageQuery) {
-        return wfFormManageService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 查询表单管理列表
-     */
-    @SaCheckPermission("workflow:formManage")
-    @GetMapping("/list/selectList")
-    public R<List<WfFormManageVo>> selectList() {
-        return R.ok(wfFormManageService.selectList());
-    }
-
-    /**
-     * 导出表单管理列表
-     */
-    @SaCheckPermission("workflow:formManage:export")
-    @Log(title = "表单管理", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(WfFormManageBo bo, HttpServletResponse response) {
-        List<WfFormManageVo> list = wfFormManageService.queryList(bo);
-        ExcelUtil.exportExcel(list, "表单管理", WfFormManageVo.class, response);
-    }
-
-    /**
-     * 获取表单管理详细信息
-     *
-     * @param id 主键
-     */
-    @SaCheckPermission("workflow:formManage:query")
-    @GetMapping("/{id}")
-    public R<WfFormManageVo> getInfo(@NotNull(message = "主键不能为空")
-                                     @PathVariable Long id) {
-        return R.ok(wfFormManageService.queryById(id));
-    }
-
-    /**
-     * 新增表单管理
-     */
-    @SaCheckPermission("workflow:formManage:add")
-    @Log(title = "表单管理", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody WfFormManageBo bo) {
-        return toAjax(wfFormManageService.insertByBo(bo));
-    }
-
-    /**
-     * 修改表单管理
-     */
-    @SaCheckPermission("workflow:formManage:edit")
-    @Log(title = "表单管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody WfFormManageBo bo) {
-        return toAjax(wfFormManageService.updateByBo(bo));
-    }
-
-    /**
-     * 删除表单管理
-     *
-     * @param ids 主键串
-     */
-    @SaCheckPermission("workflow:formManage:remove")
-    @Log(title = "表单管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "主键不能为空")
-                          @PathVariable Long[] ids) {
-        return toAjax(wfFormManageService.deleteByIds(List.of(ids)));
-    }
-}

+ 0 - 152
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/ActHiProcinst.java

@@ -1,152 +0,0 @@
-package com.vber.workflow.domain;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 流程实例对象 act_hi_procinst
- *
- * @author iwb
- * @date 2023-07-22
- */
-@Data
-@TableName("ACT_HI_PROCINST")
-public class ActHiProcinst implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @TableId(value = "ID_")
-    private String id;
-
-    /**
-     *
-     */
-    @TableField(value = "REV_")
-    private Long rev;
-
-    /**
-     *
-     */
-    @TableField(value = "PROC_INST_ID_")
-    private String procInstId;
-
-    /**
-     *
-     */
-    @TableField(value = "BUSINESS_KEY_")
-    private String businessKey;
-
-    /**
-     *
-     */
-    @TableField(value = "PROC_DEF_ID_")
-    private String procDefId;
-
-    /**
-     *
-     */
-    @TableField(value = "START_TIME_")
-    private Date startTime;
-
-    /**
-     *
-     */
-    @TableField(value = "END_TIME_")
-    private Date endTime;
-
-    /**
-     *
-     */
-    @TableField(value = "DURATION_")
-    private Long duration;
-
-    /**
-     *
-     */
-    @TableField(value = "START_USER_ID_")
-    private String startUserId;
-
-    /**
-     *
-     */
-    @TableField(value = "START_ACT_ID_")
-    private String startActId;
-
-    /**
-     *
-     */
-    @TableField(value = "END_ACT_ID_")
-    private String endActId;
-
-    /**
-     *
-     */
-    @TableField(value = "SUPER_PROCESS_INSTANCE_ID_")
-    private String superProcessInstanceId;
-
-    /**
-     *
-     */
-    @TableField(value = "DELETE_REASON_")
-    private String deleteReason;
-
-    /**
-     *
-     */
-    @TableField(value = "TENANT_ID_")
-    private String tenantId;
-
-    /**
-     *
-     */
-    @TableField(value = "NAME_")
-    private String name;
-
-    /**
-     *
-     */
-    @TableField(value = "CALLBACK_ID_")
-    private String callbackId;
-
-    /**
-     *
-     */
-    @TableField(value = "CALLBACK_TYPE_")
-    private String callbackType;
-
-    /**
-     *
-     */
-    @TableField(value = "REFERENCE_ID_")
-    private String referenceId;
-
-    /**
-     *
-     */
-    @TableField(value = "REFERENCE_TYPE_")
-    private String referenceType;
-
-    /**
-     *
-     */
-    @TableField(value = "PROPAGATED_STAGE_INST_ID_")
-    private String propagatedStageInstId;
-
-    /**
-     *
-     */
-    @TableField(value = "BUSINESS_STATUS_")
-    private String businessStatus;
-
-
-}

+ 0 - 194
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/ActHiTaskinst.java

@@ -1,194 +0,0 @@
-package com.vber.workflow.domain;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 流程历史任务对象 act_hi_taskinst
- *
- * @author iwb
- * @date 2024-03-02
- */
-@Data
-@TableName("ACT_HI_TASKINST")
-public class ActHiTaskinst implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @TableId(value = "ID_")
-    private String id;
-
-    /**
-     * 版本
-     */
-    @TableField(value = "REV_")
-    private Long rev;
-
-    /**
-     * 流程定义id
-     */
-    @TableField(value = "PROC_DEF_ID_")
-    private String procDefId;
-
-    /**
-     *
-     */
-    @TableField(value = "TASK_DEF_ID_")
-    private String taskDefId;
-
-    /**
-     * 任务节点id
-     */
-    @TableField(value = "TASK_DEF_KEY_")
-    private String taskDefKey;
-
-    /**
-     * 流程实例id
-     */
-    @TableField(value = "PROC_INST_ID_")
-    private String procInstId;
-
-    /**
-     * 流程执行id
-     */
-    @TableField(value = "EXECUTION_ID")
-    private String executionId;
-
-    /**
-     *
-     */
-    @TableField(value = "SCOPE_ID_")
-    private String scopeId;
-
-    /**
-     *
-     */
-    @TableField(value = "SUB_SCOPE_ID_")
-    private String subScopeId;
-
-    /**
-     * 先用当前字段标识抄送类型
-     */
-    @TableField(value = "SCOPE_TYPE_")
-    private String scopeType;
-
-    /**
-     *
-     */
-    @TableField(value = "SCOPE_DEFINITION_ID_")
-    private String scopeDefinitionId;
-
-    /**
-     *
-     */
-    @TableField(value = "PROPAGATED_STAGE_INST_ID_")
-    private String propagatedStageInstId;
-
-    /**
-     * 任务名称
-     */
-    @TableField(value = "NAME_")
-    private String name;
-
-    /**
-     * 父级id
-     */
-    @TableField(value = "PARENT_TASK_ID_")
-    private String parentTaskId;
-
-    /**
-     * 描述
-     */
-    @TableField(value = "DESCRIPTION_")
-    private String description;
-
-    /**
-     * 办理人
-     */
-    @TableField(value = "OWNER_")
-    private String owner;
-
-    /**
-     * 办理人
-     */
-    @TableField(value = "ASSIGNEE_")
-    private String assignee;
-
-    /**
-     * 开始事件
-     */
-    @TableField(value = "START_TIME_")
-    private Date startTime;
-
-    /**
-     * 认领时间
-     */
-    @TableField(value = "CLAIM_TIME_")
-    private Date claimTime;
-
-    /**
-     * 结束时间
-     */
-    @TableField(value = "END_TIME_")
-    private Date endTime;
-
-    /**
-     * 持续时间
-     */
-    @TableField(value = "DURATION_")
-    private Long duration;
-
-    /**
-     * 删除原因
-     */
-    @TableField(value = "DELETE_REASON_")
-    private String deleteReason;
-
-    /**
-     * 优先级
-     */
-    @TableField(value = "PRIORITY_")
-    private Long priority;
-
-    /**
-     * 到期时间
-     */
-    @TableField(value = "DUE_DATE_")
-    private Date dueDate;
-
-    /**
-     *
-     */
-    @TableField(value = "FORM_KEY_")
-    private String formKey;
-
-    /**
-     * 分类
-     */
-    @TableField(value = "CATEGORY_")
-    private String category;
-
-    /**
-     * 最后修改时间
-     */
-    @TableField(value = "LAST_UPDATED_TIME_")
-    private Date lastUpdatedTime;
-
-    /**
-     * 租户id
-     */
-    @TableField(value = "TENANT_ID_")
-    private String tenantId;
-
-
-}

+ 67 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/FlowCategory.java

@@ -0,0 +1,67 @@
+package com.vber.workflow.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.vber.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 流程分类对象 wf_category
+ *
+ * @author Iwb
+ * @date 2023-06-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("flow_category")
+public class FlowCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 流程分类ID
+     */
+    @TableId(value = "category_id")
+    private Long categoryId;
+
+    /**
+     * 父流程分类id
+     */
+    private Long parentId;
+
+    /**
+     * 祖级列表
+     */
+    private String ancestors;
+
+    /**
+     * 流程分类名称
+     */
+    private String categoryName;
+
+    /**
+     * 显示顺序
+     */
+    private Long orderNum;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 子菜单
+     */
+    @TableField(exist = false)
+    private List<FlowCategory> children = new ArrayList<>();
+
+}

+ 6 - 4
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfiLeaveApply.java → SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/TestLeave.java

@@ -2,9 +2,9 @@ package com.vber.workflow.domain;
 
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.vber.common.mybatis.core.domain.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import com.vber.common.mybatis.core.domain.BaseEntity;
 
 import java.io.Serial;
 import java.util.Date;
@@ -12,13 +12,13 @@ import java.util.Date;
 /**
  * 请假对象 test_leave
  *
- * @author iwb
+ * @author Iwb
  * @date 2023-07-21
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@TableName("wfi_leave_apply")
-public class WfiLeaveApply extends BaseEntity {
+@TableName("test_leave")
+public class TestLeave extends BaseEntity {
 
     @Serial
     private static final long serialVersionUID = 1L;
@@ -58,4 +58,6 @@ public class WfiLeaveApply extends BaseEntity {
      * 状态
      */
     private String status;
+
+
 }

+ 0 - 52
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfCategory.java

@@ -1,52 +0,0 @@
-package com.vber.workflow.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import com.vber.common.tenant.core.TenantEntity;
-
-import java.io.Serial;
-
-/**
- * 流程分类对象 wf_category
- *
- * @author iwb
- * @date 2023-06-27
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("wf_category")
-public class WfCategory extends TenantEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 主键
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 分类名称
-     */
-    private String categoryName;
-
-    /**
-     * 分类编码
-     */
-    private String categoryCode;
-
-    /**
-     * 父级id
-     */
-    private Long parentId;
-
-    /**
-     * 排序
-     */
-    private Long sortNum;
-
-
-}

+ 0 - 57
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfDefinitionConfig.java

@@ -1,57 +0,0 @@
-package com.vber.workflow.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.vber.common.mybatis.core.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serial;
-
-/**
- * 流程定义配置对象 wf_definition_config
- *
- * @author iwb
- * @date 2024-03-18
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("wf_definition_config")
-public class WfDefinitionConfig extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 主键
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 表名
-     */
-    private String tableName;
-
-    /**
-     * 流程定义ID
-     */
-    private String definitionId;
-
-    /**
-     * 流程KEY
-     */
-    private String processKey;
-
-    /**
-     * 流程版本
-     */
-    private Integer version;
-
-    /**
-     * 备注
-     */
-    private String remark;
-
-
-}

+ 0 - 52
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfFormManage.java

@@ -1,52 +0,0 @@
-package com.vber.workflow.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.vber.common.tenant.core.TenantEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serial;
-
-/**
- * 表单管理对象 wf_form_manage
- *
- * @author iwb
- * @date 2024-03-29
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("wf_form_manage")
-public class WfFormManage extends TenantEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 主键
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 表单名称
-     */
-    private String formName;
-
-    /**
-     * 表单类型
-     */
-    private String formType;
-
-    /**
-     * 路由地址/表单ID
-     */
-    private String router;
-
-    /**
-     * 备注
-     */
-    private String remark;
-
-
-}

+ 0 - 61
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfNodeConfig.java

@@ -1,61 +0,0 @@
-package com.vber.workflow.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.vber.common.tenant.core.TenantEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serial;
-
-/**
- * 节点配置对象 wf_node_config
- *
- * @author iwb
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("wf_node_config")
-public class WfNodeConfig extends TenantEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 主键
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 表单id
-     */
-    private Long formId;
-
-    /**
-     * 表单类型
-     */
-    private String formType;
-
-    /**
-     * 节点名称
-     */
-    private String nodeName;
-
-    /**
-     * 节点id
-     */
-    private String nodeId;
-
-    /**
-     * 流程定义id
-     */
-    private String definitionId;
-
-    /**
-     * 是否为申请人节点 (0是 1否)
-     */
-    private String applyUserTask;
-
-
-}

+ 0 - 61
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/WfTaskBackNode.java

@@ -1,61 +0,0 @@
-package com.vber.workflow.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import com.vber.common.tenant.core.TenantEntity;
-
-import java.io.Serial;
-
-/**
- * 节点驳回记录 wf_task_back_node
- *
- * @author iwb
- * @date 2024-03-13
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("wf_task_back_node")
-public class WfTaskBackNode extends TenantEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 主键
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 实例id
-     */
-    private String instanceId;
-
-    /**
-     * 节点id
-     */
-    private String nodeId;
-
-    /**
-     * 节点名称
-     */
-    private String nodeName;
-
-    /**
-     * 排序
-     */
-    private Integer orderNo;
-
-    /**
-     * 节点类型
-     */
-    private String taskType;
-
-    /**
-     * 办理人
-     */
-    private String assignee;
-
-}

+ 0 - 40
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/AddMultiBo.java

@@ -1,40 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import lombok.Data;
-import com.vber.common.core.validate.AddGroup;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 加签参数请求
- *
- * @author iwb
- */
-@Data
-public class AddMultiBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 任务ID
-     */
-    @NotBlank(message = "任务ID不能为空", groups = AddGroup.class)
-    private String taskId;
-
-    /**
-     * 加签人员id
-     */
-    @NotEmpty(message = "加签人员不能为空", groups = AddGroup.class)
-    private List<Long> assignees;
-
-    /**
-     * 加签人员名称
-     */
-    @NotEmpty(message = "加签人员不能为空", groups = AddGroup.class)
-    private List<String> assigneeNames;
-}

+ 31 - 6
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/BackProcessBo.java

@@ -1,18 +1,21 @@
 package com.vber.workflow.domain.bo;
 
-import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import com.vber.common.core.validate.AddGroup;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 
 /**
  * 驳回参数请求
  *
- * @author iwb
+ * @author Iwb
  */
 @Data
 public class BackProcessBo implements Serializable {
@@ -23,8 +26,13 @@ public class BackProcessBo implements Serializable {
     /**
      * 任务ID
      */
-    @NotBlank(message = "任务ID不能为空", groups = AddGroup.class)
-    private String taskId;
+    @NotNull(message = "任务ID不能为空", groups = AddGroup.class)
+    private Long taskId;
+
+    /**
+     * 附件id
+     */
+    private String fileId;
 
     /**
      * 消息类型
@@ -34,11 +42,28 @@ public class BackProcessBo implements Serializable {
     /**
      * 驳回的节点id(目前未使用,直接驳回到申请人)
      */
-    @NotBlank(message = "驳回的节点不能为空", groups = AddGroup.class)
-    private String targetActivityId;
+    private String nodeCode;
 
     /**
      * 办理意见
      */
     private String message;
+
+    /**
+     * 通知
+     */
+    private String notice;
+
+    /**
+     * 流程变量
+     */
+    private Map<String, Object> variables;
+
+    public Map<String, Object> getVariables() {
+        if (variables == null) {
+            return new HashMap<>(16);
+        }
+        variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
+        return variables;
+    }
 }

+ 22 - 7
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/CompleteTaskBo.java

@@ -1,9 +1,8 @@
 package com.vber.workflow.domain.bo;
 
-import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import com.vber.common.core.validate.AddGroup;
-import com.vber.workflow.domain.vo.WfCopy;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -15,7 +14,7 @@ import java.util.Objects;
 /**
  * 办理任务请求对象
  *
- * @author iwb
+ * @author Iwb
  */
 @Data
 public class CompleteTaskBo implements Serializable {
@@ -26,8 +25,8 @@ public class CompleteTaskBo implements Serializable {
     /**
      * 任务id
      */
-    @NotBlank(message = "任务id不能为空", groups = {AddGroup.class})
-    private String taskId;
+    @NotNull(message = "任务id不能为空", groups = {AddGroup.class})
+    private Long taskId;
 
     /**
      * 附件id
@@ -37,7 +36,7 @@ public class CompleteTaskBo implements Serializable {
     /**
      * 抄送人员
      */
-    private List<WfCopy> wfCopyList;
+    private List<FlowCopyBo> flowCopyList;
 
     /**
      * 消息类型
@@ -49,14 +48,30 @@ public class CompleteTaskBo implements Serializable {
      */
     private String message;
 
+    /**
+     * 消息通知
+     */
+    private String notice;
+
     /**
      * 流程变量
      */
     private Map<String, Object> variables;
 
+    /**
+     * 弹窗选择的办理人
+     */
+    private Map<String, Object> assigneeMap;
+
+    /**
+     * 扩展变量(此处为逗号分隔的ossId)
+     */
+    private String ext;
+
     public Map<String, Object> getVariables() {
         if (variables == null) {
-            return new HashMap<>(16);
+            variables = new HashMap<>(16);
+            return variables;
         }
         variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
         return variables;

+ 0 - 38
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/DelegateBo.java

@@ -1,38 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-import com.vber.common.core.validate.AddGroup;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 委派任务请求对象
- *
- * @author iwb
- */
-@Data
-public class DelegateBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 委派人id
-     */
-    @NotBlank(message = "委派人id不能为空", groups = {AddGroup.class})
-    private String userId;
-
-    /**
-     * 委派人名称
-     */
-    @NotBlank(message = "委派人名称不能为空", groups = {AddGroup.class})
-    private String nickName;
-
-    /**
-     * 任务id
-     */
-    @NotBlank(message = "任务id不能为空", groups = {AddGroup.class})
-    private String taskId;
-}

+ 0 - 52
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/DeleteMultiBo.java

@@ -1,52 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import lombok.Data;
-import com.vber.common.core.validate.AddGroup;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 减签参数请求
- *
- * @author iwb
- */
-@Data
-public class DeleteMultiBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 任务ID
-     */
-    @NotBlank(message = "任务ID不能为空", groups = AddGroup.class)
-    private String taskId;
-
-    /**
-     * 减签人员
-     */
-    @NotEmpty(message = "减签人员不能为空", groups = AddGroup.class)
-    private List<String> taskIds;
-
-    /**
-     * 执行id
-     */
-    @NotEmpty(message = "执行id不能为空", groups = AddGroup.class)
-    private List<String> executionIds;
-
-    /**
-     * 人员id
-     */
-    @NotEmpty(message = "减签人员id不能为空", groups = AddGroup.class)
-    private List<Long> assigneeIds;
-
-    /**
-     * 人员名称
-     */
-    @NotEmpty(message = "减签人员不能为空", groups = AddGroup.class)
-    private List<String> assigneeNames;
-}

+ 9 - 9
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/ProcessInvalidBo.java → SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowCancelBo.java

@@ -1,31 +1,31 @@
 package com.vber.workflow.domain.bo;
 
-import com.vber.common.core.validate.AddGroup;
 import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
+import com.vber.common.core.validate.AddGroup;
 
 import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * 流程实例作废请求对象
+ * 撤销任务请求对象
  *
- * @author iwb
+ * @author Iwb
  */
 @Data
-public class ProcessInvalidBo implements Serializable {
+public class FlowCancelBo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
 
     /**
-     * 业务id
+     * 任务ID
      */
-    @NotBlank(message = "业务id不能为空", groups = {AddGroup.class})
-    private String businessKey;
+    @NotBlank(message = "业务ID不能为空", groups = AddGroup.class)
+    private String businessId;
 
     /**
-     * 作废原因
+     * 办理意见
      */
-    private String deleteReason;
+    private String message;
 }

+ 46 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowCategoryBo.java

@@ -0,0 +1,46 @@
+package com.vber.workflow.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.vber.common.core.validate.AddGroup;
+import com.vber.common.core.validate.EditGroup;
+import com.vber.common.mybatis.core.domain.BaseEntity;
+import com.vber.workflow.domain.FlowCategory;
+
+/**
+ * 流程分类业务对象 wf_category
+ *
+ * @author Iwb
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = FlowCategory.class, reverseConvertGenerate = false)
+public class FlowCategoryBo extends BaseEntity {
+
+    /**
+     * 流程分类ID
+     */
+    @NotNull(message = "流程分类ID不能为空", groups = { EditGroup.class })
+    private Long categoryId;
+
+    /**
+     * 父流程分类id
+     */
+    @NotNull(message = "父流程分类id不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long parentId;
+
+    /**
+     * 流程分类名称
+     */
+    @NotBlank(message = "流程分类名称不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String categoryName;
+
+    /**
+     * 显示顺序
+     */
+    private Long orderNum;
+
+}

+ 30 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowCopyBo.java

@@ -0,0 +1,30 @@
+package com.vber.workflow.domain.bo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 抄送
+ *
+ * @author Iwb
+ */
+@Data
+public class FlowCopyBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+}

+ 55 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowInstanceBo.java

@@ -0,0 +1,55 @@
+package com.vber.workflow.domain.bo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 流程实例请求对象
+ *
+ * @author Iwb
+ */
+@Data
+public class FlowInstanceBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 流程定义名称
+     */
+    private String flowName;
+
+    /**
+     * 流程定义编码
+     */
+    private String flowCode;
+
+    /**
+     * 任务发起人
+     */
+    private String startUserId;
+
+    /**
+     * 业务id
+     */
+    private String businessId;
+
+    /**
+     * 流程分类id
+     */
+    private String category;
+
+    /**
+     * 任务名称
+     */
+    private String nodeName;
+
+    /**
+     * 申请人Ids
+     */
+    private List<Long> createByIds;
+
+}

+ 31 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowInvalidBo.java

@@ -0,0 +1,31 @@
+package com.vber.workflow.domain.bo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import com.vber.common.core.validate.AddGroup;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 作废请求对象
+ *
+ * @author Iwb
+ */
+@Data
+public class FlowInvalidBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 流程实例id
+     */
+    @NotNull(message = "流程实例id为空", groups = AddGroup.class)
+    private Long id;
+
+    /**
+     * 审批意见
+     */
+    private String comment;
+}

+ 38 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowNextNodeBo.java

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

+ 55 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowTaskBo.java

@@ -0,0 +1,55 @@
+package com.vber.workflow.domain.bo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 任务请求对象
+ *
+ * @author Iwb
+ */
+@Data
+public class FlowTaskBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务名称
+     */
+    private String nodeName;
+
+    /**
+     * 流程定义名称
+     */
+    private String flowName;
+
+    /**
+     * 流程定义编码
+     */
+    private String flowCode;
+
+    /**
+     * 流程分类id
+     */
+    private String category;
+
+    /**
+     * 流程实例id
+     */
+    private Long instanceId;
+
+    /**
+     * 权限列表
+     */
+    private List<String> permissionList;
+
+    /**
+     * 申请人Ids
+     */
+    private List<Long> createByIds;
+
+}

+ 5 - 5
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TerminationBo.java → SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/FlowTerminationBo.java

@@ -1,6 +1,6 @@
 package com.vber.workflow.domain.bo;
 
-import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import com.vber.common.core.validate.AddGroup;
 
@@ -10,10 +10,10 @@ import java.io.Serializable;
 /**
  * 终止任务请求对象
  *
- * @author iwb
+ * @author Iwb
  */
 @Data
-public class TerminationBo implements Serializable {
+public class FlowTerminationBo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
@@ -21,8 +21,8 @@ public class TerminationBo implements Serializable {
     /**
      * 任务id
      */
-    @NotBlank(message = "任务id为空", groups = AddGroup.class)
-    private String taskId;
+    @NotNull(message = "任务id为空", groups = AddGroup.class)
+    private Long taskId;
 
     /**
      * 审批意见

+ 0 - 66
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/ModelBo.java

@@ -1,66 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import com.vber.common.core.validate.AddGroup;
-import com.vber.common.core.validate.EditGroup;
-import com.vber.workflow.common.constant.FlowConstant;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.Pattern;
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 模型请求对象
- *
- * @author iwb
- */
-@Data
-public class ModelBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 模型id
-     */
-    @NotBlank(message = "模型ID不能为空", groups = {EditGroup.class})
-    private String id;
-
-    /**
-     * 模型名称
-     */
-    @NotBlank(message = "模型名称不能为空", groups = {AddGroup.class})
-    private String name;
-
-    /**
-     * 模型标识key
-     */
-    @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class})
-    @Pattern(regexp = FlowConstant.MODEL_KEY_PATTERN, message = "模型标识key只能字符或者下划线开头", groups = {AddGroup.class})
-    private String key;
-
-    /**
-     * 模型分类
-     */
-    @NotBlank(message = "模型分类不能为空", groups = {AddGroup.class})
-    private String categoryCode;
-
-    /**
-     * 模型XML
-     */
-    @NotBlank(message = "模型XML不能为空", groups = {AddGroup.class})
-    private String xml;
-
-    /**
-     * 模型SVG图片
-     */
-    @NotBlank(message = "模型SVG不能为空", groups = {EditGroup.class})
-    private String svg;
-
-    /**
-     * 备注
-     */
-    private String description;
-
-}

+ 0 - 34
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/ProcessDefinitionBo.java

@@ -1,34 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 流程定义请求对象
- *
- * @author iwb
- */
-@Data
-public class ProcessDefinitionBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 流程定义名称key
-     */
-    private String key;
-
-    /**
-     * 流程定义名称
-     */
-    private String name;
-
-    /**
-     * 模型分类
-     */
-    private String categoryCode;
-
-}

+ 0 - 43
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/ProcessInstanceBo.java

@@ -1,43 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 流程实例请求对象
- *
- * @author iwb
- */
-@Data
-public class ProcessInstanceBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 流程名称
-     */
-    private String name;
-
-    /**
-     * 流程key
-     */
-    private String key;
-
-    /**
-     * 任务发起人
-     */
-    private String startUserId;
-
-    /**
-     * 业务id
-     */
-    private String businessKey;
-
-    /**
-     * 模型分类
-     */
-    private String categoryCode;
-}

+ 5 - 5
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/StartProcessBo.java

@@ -14,7 +14,7 @@ import java.util.Objects;
 /**
  * 启动流程对象
  *
- * @author iwb
+ * @author Iwb
  */
 @Data
 public class StartProcessBo implements Serializable {
@@ -26,13 +26,13 @@ public class StartProcessBo implements Serializable {
      * 业务唯一值id
      */
     @NotBlank(message = "业务ID不能为空", groups = {AddGroup.class})
-    private String businessKey;
+    private String businessId;
 
     /**
-     * 表名
+     * 流程定义编码
      */
-    @NotBlank(message = "表名不能为空", groups = {AddGroup.class})
-    private String tableName;
+    @NotBlank(message = "流程定义编码不能为空", groups = {AddGroup.class})
+    private String flowCode;
 
     /**
      * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}}

+ 0 - 39
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/SysUserMultiBo.java

@@ -1,39 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-
-/**
- * 用户加签查询
- *
- * @author iwb
- */
-@Data
-public class SysUserMultiBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 人员名称
-     */
-    private String userName;
-
-    /**
-     * 人员名称
-     */
-    private String nickName;
-
-    /**
-     * 组织结构id
-     */
-    private String orgId;
-
-    /**
-     * 任务id
-     */
-    private String taskId;
-}

+ 0 - 33
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TaskBo.java

@@ -1,33 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 任务请求对象
- *
- * @author iwb
- */
-@Data
-public class TaskBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 任务名称
-     */
-    private String name;
-
-    /**
-     * 流程定义名称
-     */
-    private String processDefinitionName;
-
-    /**
-     * 流程定义key
-     */
-    private String processDefinitionKey;
-}

+ 48 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TaskOperationBo.java

@@ -0,0 +1,48 @@
+package com.vber.workflow.domain.bo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import com.vber.common.core.validate.AddGroup;
+import com.vber.common.core.validate.EditGroup;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 任务操作业务对象,用于描述任务委派、转办、加签等操作的必要参数
+ * 包含了用户ID、任务ID、任务相关的消息、以及加签/减签的用户ID
+ *
+ * @author Iwb
+ */
+@Data
+public class TaskOperationBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 委派/转办人的用户ID(必填,准对委派/转办人操作)
+     */
+    @NotNull(message = "委派/转办人id不能为空", groups = {AddGroup.class})
+    private String userId;
+
+    /**
+     * 加签/减签人的用户ID列表(必填,针对加签/减签操作)
+     */
+    @NotNull(message = "加签/减签id不能为空", groups = {EditGroup.class})
+    private List<String> userIds;
+
+    /**
+     * 任务ID(必填)
+     */
+    @NotNull(message = "任务id不能为空")
+    private Long taskId;
+
+    /**
+     * 意见或备注信息(可选)
+     */
+    private String message;
+
+}

+ 0 - 34
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TaskUrgingBo.java

@@ -1,34 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 任务催办
- *
- * @author iwb
- */
-@Data
-public class TaskUrgingBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 流程实例id
-     */
-    private String processInstanceId;
-
-    /**
-     * 消息类型
-     */
-    private List<String> messageType;
-
-    /**
-     * 催办内容(为空默认系统内置信息)
-     */
-    private String message;
-}

+ 12 - 8
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/LeaveApplyBo.java → SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TestLeaveBo.java

@@ -1,28 +1,29 @@
 package com.vber.workflow.domain.bo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.vber.common.core.validate.AddGroup;
-import com.vber.common.core.validate.EditGroup;
-import com.vber.common.mybatis.core.domain.BaseEntity;
-import com.vber.workflow.domain.WfiLeaveApply;
 import io.github.linpeilie.annotations.AutoMapper;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import com.vber.common.core.validate.AddGroup;
+import com.vber.common.core.validate.EditGroup;
+import com.vber.common.mybatis.core.domain.BaseEntity;
+import com.vber.workflow.domain.TestLeave;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
 /**
  * 请假业务对象 test_leave
  *
- * @author iwb
+ * @author Iwb
  * @date 2023-07-21
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = WfiLeaveApply.class, reverseConvertGenerate = false)
-public class LeaveApplyBo extends BaseEntity {
+@AutoMapper(target = TestLeave.class, reverseConvertGenerate = false)
+public class TestLeaveBo extends BaseEntity {
 
     /**
      * 主键
@@ -40,6 +41,7 @@ public class LeaveApplyBo extends BaseEntity {
      * 开始时间
      */
     @NotNull(message = "开始时间不能为空", groups = {AddGroup.class, EditGroup.class})
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date startDate;
 
@@ -47,13 +49,13 @@ public class LeaveApplyBo extends BaseEntity {
      * 结束时间
      */
     @NotNull(message = "结束时间不能为空", groups = {AddGroup.class, EditGroup.class})
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date endDate;
 
     /**
      * 请假天数
      */
-    @NotNull(message = "请假天数不能为空", groups = {AddGroup.class, EditGroup.class})
     private Integer leaveDays;
 
     /**
@@ -75,4 +77,6 @@ public class LeaveApplyBo extends BaseEntity {
      * 状态
      */
     private String status;
+
+
 }

+ 0 - 37
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/domain/bo/TransmitBo.java

@@ -1,37 +0,0 @@
-package com.vber.workflow.domain.bo;
-
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-import com.vber.common.core.validate.AddGroup;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 终转办务请求对象
- *
- * @author iwb
- */
-@Data
-public class TransmitBo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 任务id
-     */
-    @NotBlank(message = "任务id为空", groups = AddGroup.class)
-    private String taskId;
-
-    /**
-     * 转办人id
-     */
-    @NotBlank(message = "转办人不能为空", groups = AddGroup.class)
-    private String userId;
-
-    /**
-     * 审批意见
-     */
-    private String comment;
-}

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません