Browse Source

Merge remote-tracking branch 'origin/lc_saas' into master_20240722

# Conflicts:
#	pom.xml
dongpo 9 months ago
parent
commit
b01e62db17
100 changed files with 6742 additions and 101 deletions
  1. 6 7
      pom.xml
  2. 12 0
      yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java
  3. 39 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/DictDataConstants.java
  4. 4 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/DictTypeConstants.java
  5. 23 1
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
  6. 1 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java
  7. 9 0
      yudao-module-bpm/yudao-module-bpm-biz/pom.xml
  8. 16 6
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java
  9. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java
  10. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSaveReqVO.java
  11. 124 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/OaConversionController.java
  12. 95 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionPageReqVO.java
  13. 116 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionRespVO.java
  14. 100 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionSaveReqVO.java
  15. 125 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/OaDimissionController.java
  16. 88 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionPageReqVO.java
  17. 108 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionRespVO.java
  18. 94 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionSaveReqVO.java
  19. 124 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/OaEntryController.java
  20. 77 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntryPageReqVO.java
  21. 94 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntryRespVO.java
  22. 85 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntrySaveReqVO.java
  23. 124 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/OaHolidayController.java
  24. 100 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/vo/OaHolidayPageReqVO.java
  25. 124 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/vo/OaHolidayRespVO.java
  26. 107 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/vo/OaHolidaySaveReqVO.java
  27. 96 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/leave/OaLeaveController.java
  28. 82 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/leave/vo/OaLeavePageReqVO.java
  29. 100 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/leave/vo/OaLeaveRespVO.java
  30. 74 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/leave/vo/OaLeaveSaveReqVO.java
  31. 0 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/oldLeave/BpmOALeaveController.http
  32. 8 6
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java
  33. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java
  34. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java
  35. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java
  36. 124 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/OaRenewController.java
  37. 102 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewPageReqVO.java
  38. 124 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewRespVO.java
  39. 105 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewSaveReqVO.java
  40. 146 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/OaUniversalController.java
  41. 97 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/vo/OaUniversalPageReqVO.java
  42. 138 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/vo/OaUniversalRespVO.java
  43. 36 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/vo/OaUniversalSaveReqVO.java
  44. 3 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
  45. 2 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
  46. 3 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java
  47. 6 5
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskReturnReqVO.java
  48. 21 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java
  49. 7 7
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java
  50. 3 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
  51. 2 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java
  52. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java
  53. 124 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/conversion/OaConversionDO.java
  54. 116 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/dimission/OaDimissionDO.java
  55. 105 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/entry/OaEntryDO.java
  56. 132 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/holiday/OaHolidayDO.java
  57. 107 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/leave/OaLeaveDO.java
  58. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java
  59. 132 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/renew/OaRenewDO.java
  60. 124 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/universal/OaUniversalDO.java
  61. 6 6
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionInfoMapper.java
  62. 47 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/conversion/OaConversionMapper.java
  63. 45 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/dimission/OaDimissionMapper.java
  64. 42 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/entry/OaEntryMapper.java
  65. 49 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/holiday/OaHolidayMapper.java
  66. 40 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/leave/OaLeaveMapper.java
  67. 3 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java
  68. 49 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/renew/OaRenewMapper.java
  69. 46 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/universal/OaUniversalMapper.java
  70. 4 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java
  71. 8 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java
  72. 6 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java
  73. 8 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java
  74. 9 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java
  75. 48 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignApplySelectScript.java
  76. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/strategy/BpmTaskCandidateGroupStrategy.java
  77. 2 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java
  78. 18 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
  79. 31 5
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java
  80. 70 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
  81. 2 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java
  82. 66 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/conversion/OaConversionService.java
  83. 254 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/conversion/OaConversionServiceImpl.java
  84. 66 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/dimission/OaDimissionService.java
  85. 254 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/dimission/OaDimissionServiceImpl.java
  86. 86 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/entry/OaEntryService.java
  87. 247 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/entry/OaEntryServiceImpl.java
  88. 66 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/holiday/OaHolidayService.java
  89. 255 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/holiday/OaHolidayServiceImpl.java
  90. 56 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/leave/OaLeaveService.java
  91. 73 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/leave/OaLeaveServiceImpl.java
  92. 2 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveStatusListener.java
  93. 6 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java
  94. 10 8
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java
  95. 66 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/renew/OaRenewService.java
  96. 253 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/renew/OaRenewServiceImpl.java
  97. 38 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/universal/OaUniversalService.java
  98. 486 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/universal/OaUniversalServiceImpl.java
  99. 3 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskAssignRuleServiceImpl.java
  100. 0 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java

+ 6 - 7
pom.xml

@@ -15,15 +15,14 @@
         <!-- 各种 module 拓展 -->
         <module>yudao-module-system</module>
         <module>yudao-module-infra</module>
-        <module>yudao-module-member</module>
+<!--        <module>yudao-module-member</module>-->
         <module>yudao-module-bpm</module>
-        <module>yudao-module-report</module>
+<!--        <module>yudao-module-report</module>-->
         <!--<module>yudao-module-mp</module>-->
-        <module>yudao-module-pay</module>
-        <module>yudao-module-mall</module>
-        <module>yudao-module-crm</module>
-        <module>yudao-module-erp</module>
-        <module>yudao-module-personnel</module>
+<!--        <module>yudao-module-pay</module>-->
+<!--        <module>yudao-module-mall</module>-->
+<!--        <module>yudao-module-crm</module>-->
+<!--        <module>yudao-module-erp</module>-->
     </modules>
 
     <name>${project.artifactId}</name>

+ 12 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.util.Assert;
 
@@ -23,16 +24,19 @@ public class CommonResult<T> implements Serializable {
      *
      * @see ErrorCode#getCode()
      */
+    @Schema(description = "状态码")
     private Integer code;
     /**
      * 返回数据
      */
+    @Schema(description = "返回的数据")
     private T data;
     /**
      * 错误提示,用户可阅读
      *
      * @see ErrorCode#getMsg() ()
      */
+    @Schema(description = "提示信息")
     private String msg;
 
     /**
@@ -68,6 +72,14 @@ public class CommonResult<T> implements Serializable {
         return result;
     }
 
+    public static <T> CommonResult<T> success(T data, String msg) {
+        CommonResult<T> result = new CommonResult<>();
+        result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
+        result.data = data;
+        result.msg = msg;
+        return result;
+    }
+
     public static boolean isSuccess(Integer code) {
         return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode());
     }

+ 39 - 0
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/DictDataConstants.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.bpm.enums;
+
+/**
+ * BPM 字典数据的枚举类
+ *
+ * @author dp
+ */
+public interface DictDataConstants {
+
+    /**
+     * 暂存状态
+     */
+    String OA_AUDIT_STATUS_STAGING = "0";
+    /**
+     * 已提交状态
+     */
+    String OA_AUDIT_STATUS_COMMITTED = "1";
+    /**
+     * 审核中状态
+     */
+    String OA_AUDIT_STATUS_AUDITING = "2";
+    /**
+     * 已审核状态
+     */
+    String OA_AUDIT_STATUS_AUDITED = "3";
+    /**
+     * 已关闭状态
+     */
+    String OA_AUDIT_STATUS_CLOSED = "4";
+    /**
+     * 已驳回状态
+     */
+    String OA_AUDIT_STATUS_RETURNED = "5";
+    /**
+     * 已撤回状态
+     */
+    String OA_AUDIT_STATUS_RECALLED = "6";
+    
+}

+ 4 - 0
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/DictTypeConstants.java

@@ -10,4 +10,8 @@ public interface DictTypeConstants {
     String TASK_ASSIGN_RULE_TYPE = "bpm_task_assign_rule_type"; // 任务分配规则类型
     String TASK_ASSIGN_SCRIPT = "bpm_task_assign_script"; // 任务分配自定义脚本
 
+    /**
+     * bpm流程审核状态
+     */
+    String BPM_TASK_AUDIT_STATUS = "bpm_task_audit_status";
 }

+ 23 - 1
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java

@@ -12,7 +12,7 @@ public interface ErrorCodeConstants {
     // ==========  通用流程处理 模块 1-009-000-000 ==========
 
     // ========== OA 流程模块 1-009-001-000 ==========
-    ErrorCode OA_LEAVE_NOT_EXISTS = new ErrorCode(1_009_001_001, "请假申请不存在");
+    ErrorCode OA_OLD_LEAVE_NOT_EXISTS = new ErrorCode(1_009_001_001, "请假申请不存在");
 
     // ========== 流程模型 1-009-002-000 ==========
     ErrorCode MODEL_KEY_EXISTS = new ErrorCode(1_009_002_000, "已经存在流程标识为【{}】的流程");
@@ -21,6 +21,7 @@ public interface ErrorCodeConstants {
     ErrorCode MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG = new ErrorCode(1_009_002_003, "部署流程失败,原因:流程表单未配置,请点击【修改流程】按钮进行配置");
     ErrorCode MODEL_DEPLOY_FAIL_TASK_CANDIDATE_NOT_CONFIG = new ErrorCode(1_009_002_004, "部署流程失败," +
             "原因:用户任务({})未配置审批人,请点击【流程设计】按钮,选择该它的【任务(审批人)】进行配置");
+    ErrorCode MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS = new ErrorCode(1009003005, "流程定义部署失败,原因:信息未发生变化");
     ErrorCode MODEL_DEPLOY_FAIL_BPMN_START_EVENT_NOT_EXISTS = new ErrorCode(1_009_002_005, "部署流程失败,原因:BPMN 流程图中,没有开始事件");
     ErrorCode MODEL_DEPLOY_FAIL_BPMN_USER_TASK_NAME_NOT_EXISTS = new ErrorCode(1_009_002_006, "部署流程失败,原因:BPMN 流程图中,用户任务({})的名字不存在");
 
@@ -51,7 +52,9 @@ public interface ErrorCodeConstants {
     ErrorCode TASK_SIGN_DELETE_NO_PARENT = new ErrorCode(1_009_005_012, "任务减签失败,被减签的任务必须是通过加签生成的任务");
     ErrorCode TASK_TRANSFER_FAIL_USER_REPEAT = new ErrorCode(1_009_005_013, "任务转办失败,转办人和当前审批人为同一人");
     ErrorCode TASK_TRANSFER_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_014, "任务转办失败,转办人不存在");
+    ErrorCode TASK_REVOCATION_NO_ALLOWED = new ErrorCode(1_009_006_015, "操作失败,原因:只有已提交状态的流程才能由申请人撤回!");
     ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!");
+    ErrorCode TASK_CREATE_FAIL_NO_START_SELECT_ASSIGNEE = new ErrorCode(1_009_006_004, "操作失败,原因:请选择审批人!");
 
     // ========== 动态表单模块 1-009-010-000 ==========
     ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在");
@@ -81,5 +84,24 @@ public interface ErrorCodeConstants {
     ErrorCode TASK_ASSIGN_SCRIPT_NOT_EXISTS = new ErrorCode(1_009_006_004, "操作失败,原因:任务分配脚本({}) 不存在");
 
 
+    ErrorCode SERVICE_ID_NOT_EXISTS = new ErrorCode(1009011000, "业务单据ID不能为空");
+    // ========== 入职流程信息 1-009-012-000 ==========
+    ErrorCode OA_ENTRY_NOT_EXISTS = new ErrorCode(1009012000, "入职流程信息不存在");
+
+
+
+    // ========== 请假流程信息 1-009-017-000 ==========
+    ErrorCode OA_LEAVE_NOT_EXISTS = new ErrorCode(1009017000, "请假流程信息不存在");
+
+    // ========== 转正流程信息 1-009_017_002 ==========
+    ErrorCode OA_CONVERSION_NOT_EXISTS = new ErrorCode(1009017002, "转正流程信息不存在");
+    // ========== 合同续签流程信息 1-009_017_003 ==========
+    ErrorCode OA_RENEW_NOT_EXISTS = new ErrorCode(1009017003, "合同续签流程信息不存在");
+    // ========== 离职流程信息 1-009_017_004 ==========
+    ErrorCode OA_DIMISSION_NOT_EXISTS = new ErrorCode(1009017004, "离职流程信息不存在");
+    // ========== 请假流程信息 1-009_017_005 ==========
+    ErrorCode OA_HOLIDAY_NOT_EXISTS = new ErrorCode(1009017005, "请假流程信息不存在");
+    // ========== 通用事项审批流程信息 1-009_017_006 ==========
+    ErrorCode OA_UNIVERSAL_NOT_EXISTS = new ErrorCode(1009017006, "通用事项审批流程信息不存在");
 
 }

+ 1 - 0
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java

@@ -14,6 +14,7 @@ import lombok.Getter;
 public enum BpmTaskRuleScriptEnum {
 
     START_USER(10L, "流程发起人"),
+    APPLY_SELECT(22L, "申请人自选"),
 
     LEADER_X1(20L, "流程发起人的一级领导"),
     LEADER_X2(21L, "流程发起人的二级领导");

+ 9 - 0
yudao-module-bpm/yudao-module-bpm-biz/pom.xml

@@ -16,6 +16,11 @@
         例如说:流程定义、表单配置、审核中心(我的申请、我的待办、我的已办)等等
     </description>
     <dependencies>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-infra-api</artifactId>
+            <version>${revision}</version>
+        </dependency>
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-module-bpm-api</artifactId>
@@ -26,6 +31,10 @@
             <artifactId>yudao-module-system-api</artifactId>
             <version>${revision}</version>
         </dependency>
+<!--        <dependency>-->
+<!--            <groupId>cn.iocoder.boot</groupId>-->
+<!--            <artifactId>yudao-common</artifactId>-->
+<!--        </dependency>-->
 
         <!-- 业务组件 -->
         <dependency>

+ 16 - 6
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java

@@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmPro
 import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.strategy.BpmTaskCandidateStartUserSelectStrategy;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
@@ -64,12 +64,12 @@ public class BpmProcessDefinitionController {
         // 获得 Deployment Map
         Map<String, Deployment> deploymentMap = processDefinitionService.getDeploymentMap(
                 convertSet(pageResult.getList(), ProcessDefinition::getDeploymentId));
-        // 获得 BpmProcessDefinitionInfoDO Map
-        Map<String, BpmProcessDefinitionInfoDO> processDefinitionMap = processDefinitionService.getProcessDefinitionInfoMap(
+        // 获得 BpmProcessDefinitionExtDO Map
+        Map<String, BpmProcessDefinitionExtDO> processDefinitionMap = processDefinitionService.getProcessDefinitionInfoMap(
                 convertSet(pageResult.getList(), ProcessDefinition::getId));
         // 获得 Form Map
         Map<Long, BpmFormDO> formMap = formService.getFormMap(
-               convertSet(processDefinitionMap.values(), BpmProcessDefinitionInfoDO::getFormId));
+               convertSet(processDefinitionMap.values(), BpmProcessDefinitionExtDO::getFormId));
         return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinitionPage(
                 pageResult, deploymentMap, processDefinitionMap, formMap, categoryMap));
     }
@@ -85,8 +85,8 @@ public class BpmProcessDefinitionController {
             return success(Collections.emptyList());
         }
 
-        // 获得 BpmProcessDefinitionInfoDO Map
-        Map<String, BpmProcessDefinitionInfoDO> processDefinitionMap = processDefinitionService.getProcessDefinitionInfoMap(
+        // 获得 BpmProcessDefinitionExtDO Map
+        Map<String, BpmProcessDefinitionExtDO> processDefinitionMap = processDefinitionService.getProcessDefinitionInfoMap(
                 convertSet(list, ProcessDefinition::getId));
         return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinitionList(
                 list, null, processDefinitionMap, null, null));
@@ -111,4 +111,14 @@ public class BpmProcessDefinitionController {
                 processDefinition, null, null, null, null, bpmnModel, userTaskList));
     }
 
+    @GetMapping ("/get-bpmn-xml")
+    @Operation(summary = "获得流程定义的 BPMN XML")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
+    public CommonResult<String>
+    getProcessDefinitionBpmnXML(@RequestParam("id") String id) {
+        String bpmnXML = processDefinitionService.getProcessDefinitionBpmnXML(id);
+        return success(bpmnXML);
+    }
+
 }

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java

@@ -20,7 +20,7 @@ public class BpmUserGroupRespVO {
     private String description;
 
     @Schema(description = "成员编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3")
-    private Set<Long> memberUserIds;
+    private Set<Long> userIds;
 
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Integer status;

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSaveReqVO.java

@@ -22,7 +22,7 @@ public class BpmUserGroupSaveReqVO {
 
     @Schema(description = "成员编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3")
     @NotNull(message = "成员编号数组不能为空")
-    private Set<Long> memberUserIds;
+    private Set<Long> userIds;
 
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotNull(message = "状态不能为空")

+ 124 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/OaConversionController.java

@@ -0,0 +1,124 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.conversion.OaConversionDO;
+import cn.iocoder.yudao.module.bpm.service.oa.conversion.OaConversionService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - 转正流程信息")
+@RestController
+@RequestMapping("/bpm/oa-conversion")
+@Validated
+public class OaConversionController {
+
+    @Resource
+    private OaConversionService oaConversionService;
+
+    @PostMapping("/start")
+    @Operation(summary = "提交或暂存转正流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:start')")
+    public CommonResult<Long> startOaConversion(@Valid @RequestBody OaConversionSaveReqVO createReqVO) {
+        return success(oaConversionService.startOaConversion(getLoginUserId(), createReqVO));
+    }
+
+    @PostMapping("/completeTure")
+    @Operation(summary = "审批同意转正流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-true')")
+    public CommonResult<Long> completeTrueOaConversion(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaConversionService.completeTrueOaConversion(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/completeFalse")
+    @Operation(summary = "驳回或撤回转正流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-false')")
+    public CommonResult<Long> completeFalseOaConversion(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaConversionService.completeFalseOaConversion(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/updateComplete")
+    @Operation(summary = "驳回和撤回后再次提交或关闭转正流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update-complete')")
+    public CommonResult<Long> updateCompleteOaConversion(@Valid @RequestBody OaConversionSaveReqVO createReqVO) {
+        return success(oaConversionService.updateCompleteOaConversion(getLoginUserId(), createReqVO, createReqVO.getBpmTaskApproveReqVO()));
+    }
+
+
+    @PostMapping("/create")
+    @Operation(summary = "创建转正流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:create')")
+    public CommonResult<Long> createOaConversion(@Valid @RequestBody OaConversionSaveReqVO createReqVO) {
+        return success(oaConversionService.createOaConversion(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新转正流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:update')")
+    public CommonResult<Boolean> updateOaConversion(@Valid @RequestBody OaConversionSaveReqVO updateReqVO) {
+        oaConversionService.updateOaConversion(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除转正流程信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:delete')")
+    public CommonResult<Boolean> deleteOaConversion(@RequestParam("id") Long id) {
+        oaConversionService.deleteOaConversion(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得转正流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:query')")
+    public CommonResult<OaConversionRespVO> getOaConversion(@RequestParam("id") Long id) {
+        OaConversionDO oaConversion = oaConversionService.getOaConversion(id);
+        return success(BeanUtils.toBean(oaConversion, OaConversionRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得转正流程信息分页")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:query')")
+    public CommonResult<PageResult<OaConversionRespVO>> getOaConversionPage(@Valid OaConversionPageReqVO pageReqVO) {
+        PageResult<OaConversionDO> pageResult = oaConversionService.getOaConversionPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, OaConversionRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出转正流程信息 Excel")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOaConversionExcel(@Valid OaConversionPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<OaConversionDO> list = oaConversionService.getOaConversionPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "转正流程信息.xls", "数据", OaConversionRespVO.class,
+                        BeanUtils.toBean(list, OaConversionRespVO.class));
+    }
+
+}

+ 95 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionPageReqVO.java

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 转正流程信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OaConversionPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "8575")
+    private String conversionId;
+
+    @Schema(description = "转正人id", example = "8274")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "12691")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "李四")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "23689")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "14280")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "14341")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "3755")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] entryDate;
+
+    @Schema(description = "试用期结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] probationEndDate;
+
+    @Schema(description = "转正日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] conversionDate;
+
+    @Schema(description = "转正申请理由", example = "不香")
+    private String conversionReason;
+
+    @Schema(description = "工作总结")
+    private String workSummary;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "10952")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "13372")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "15583")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "20635")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "32658")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 116 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionRespVO.java

@@ -0,0 +1,116 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 转正流程信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OaConversionRespVO {
+
+    @Schema(description = "转正表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27266")
+    @ExcelProperty("转正表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "8575")
+    @ExcelProperty("uuid")
+    private String conversionId;
+
+    @Schema(description = "转正人id", example = "8274")
+    @ExcelProperty("转正人id")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "12691")
+    @ExcelProperty("转正人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "李四")
+    @ExcelProperty("转正员工姓名")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "23689")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "14280")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "14341")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "3755")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    @ExcelProperty("入职日期")
+    private String entryDate;
+
+    @Schema(description = "试用期结束日期")
+    @ExcelProperty("试用期结束日期")
+    private String probationEndDate;
+
+    @Schema(description = "转正日期")
+    @ExcelProperty("转正日期")
+    private String conversionDate;
+
+    @Schema(description = "转正申请理由", example = "不香")
+    @ExcelProperty("转正申请理由")
+    private String conversionReason;
+
+    @Schema(description = "工作总结")
+    @ExcelProperty("工作总结")
+    private String workSummary;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "10952")
+    @ExcelProperty("流程实例id")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "13372")
+    @ExcelProperty("当前审核人用户id")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "15583")
+    @ExcelProperty("当前审核人用户uuid")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "20635")
+    @ExcelProperty("当前审核人员工id")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "32658")
+    @ExcelProperty("当前审核人员工uuid")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    @ExcelProperty("最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 100 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionSaveReqVO.java

@@ -0,0 +1,100 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 转正流程信息新增/修改 Request VO")
+@Data
+public class OaConversionSaveReqVO {
+
+    @Schema(description = "转正表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27266")
+    private Long id;
+
+    @Schema(description = "uuid", example = "8575")
+    private String conversionId;
+
+    @Schema(description = "转正人id", example = "8274")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "12691")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "李四")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "23689")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "14280")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "14341")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "3755")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    private String entryDate;
+
+    @Schema(description = "试用期结束日期")
+    private String probationEndDate;
+
+    @Schema(description = "转正日期")
+    private String conversionDate;
+
+    @Schema(description = "转正申请理由", example = "不香")
+    private String conversionReason;
+
+    @Schema(description = "工作总结")
+    private String workSummary;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "10952")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "13372")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "15583")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "20635")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "32658")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "审批,true 通过,false 驳回", example = "true")
+    private Boolean auditPass;
+
+    @Schema(description = "发起人自选审批人 Map", example = " [1, 1]")
+    private List<Long> startUserSelectAssignees;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+    @Schema(description = "审批信息")
+    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
+
+
+}

+ 125 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/OaDimissionController.java

@@ -0,0 +1,125 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo.OaDimissionPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo.OaDimissionRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo.OaDimissionSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.dimission.OaDimissionDO;
+import cn.iocoder.yudao.module.bpm.service.oa.dimission.OaDimissionService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - 离职流程信息")
+@RestController
+@RequestMapping("/bpm/oa-dimission")
+@Validated
+public class OaDimissionController {
+
+    @Resource
+    private OaDimissionService oaDimissionService;
+
+
+    @PostMapping("/start")
+    @Operation(summary = "提交或暂存离职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-Dimission:start')")
+    public CommonResult<Long> startOaDimission(@Valid @RequestBody OaDimissionSaveReqVO createReqVO) {
+        return success(oaDimissionService.startOaDimission(getLoginUserId(), createReqVO));
+    }
+
+    @PostMapping("/completeTure")
+    @Operation(summary = "审批同意离职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-true')")
+    public CommonResult<Long> completeTrueOaDimission(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaDimissionService.completeTrueOaDimission(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/completeFalse")
+    @Operation(summary = "驳回或撤回离职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-false')")
+    public CommonResult<Long> completeFalseOaDimission(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaDimissionService.completeFalseOaDimission(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/updateComplete")
+    @Operation(summary = "驳回和撤回后再次提交或关闭离职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update-complete')")
+    public CommonResult<Long> updateCompleteOaDimission(@Valid @RequestBody OaDimissionSaveReqVO createReqVO) {
+        return success(oaDimissionService.updateCompleteOaDimission(getLoginUserId(), createReqVO, createReqVO.getBpmTaskApproveReqVO()));
+    }
+
+
+    @PostMapping("/create")
+    @Operation(summary = "创建离职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:create')")
+    public CommonResult<Long> createOaDimission(@Valid @RequestBody OaDimissionSaveReqVO createReqVO) {
+        return success(oaDimissionService.createOaDimission(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新离职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:update')")
+    public CommonResult<Boolean> updateOaDimission(@Valid @RequestBody OaDimissionSaveReqVO updateReqVO) {
+        oaDimissionService.updateOaDimission(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除离职流程信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:delete')")
+    public CommonResult<Boolean> deleteOaDimission(@RequestParam("id") Long id) {
+        oaDimissionService.deleteOaDimission(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得离职流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:query')")
+    public CommonResult<OaDimissionRespVO> getOaDimission(@RequestParam("id") Long id) {
+        OaDimissionDO oaDimission = oaDimissionService.getOaDimission(id);
+        return success(BeanUtils.toBean(oaDimission, OaDimissionRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得离职流程信息分页")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:query')")
+    public CommonResult<PageResult<OaDimissionRespVO>> getOaDimissionPage(@Valid OaDimissionPageReqVO pageReqVO) {
+        PageResult<OaDimissionDO> pageResult = oaDimissionService.getOaDimissionPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, OaDimissionRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出离职流程信息 Excel")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOaDimissionExcel(@Valid OaDimissionPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<OaDimissionDO> list = oaDimissionService.getOaDimissionPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "离职流程信息.xls", "数据", OaDimissionRespVO.class,
+                        BeanUtils.toBean(list, OaDimissionRespVO.class));
+    }
+
+}

+ 88 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionPageReqVO.java

@@ -0,0 +1,88 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 离职流程信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OaDimissionPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "18425")
+    private String dimissionId;
+
+    @Schema(description = "转正人id", example = "18376")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "2649")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "赵六")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "9650")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "4544")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "24445")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "29090")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] startDate;
+
+    @Schema(description = "离职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] dimissionDate;
+
+    @Schema(description = "离职原因", example = "不喜欢")
+    private String dimissionReason;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "18482")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "12344")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "27993")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "31626")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "6500")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 108 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionRespVO.java

@@ -0,0 +1,108 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 离职流程信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OaDimissionRespVO {
+
+    @Schema(description = "离职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15606")
+    @ExcelProperty("离职表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "18425")
+    @ExcelProperty("uuid")
+    private String dimissionId;
+
+    @Schema(description = "转正人id", example = "18376")
+    @ExcelProperty("转正人id")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "2649")
+    @ExcelProperty("转正人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "赵六")
+    @ExcelProperty("转正员工姓名")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "9650")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "4544")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "24445")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "29090")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    @ExcelProperty("入职日期")
+    private String startDate;
+
+    @Schema(description = "离职日期")
+    @ExcelProperty("离职日期")
+    private String dimissionDate;
+
+    @Schema(description = "离职原因", example = "不喜欢")
+    @ExcelProperty("离职原因")
+    private String dimissionReason;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "18482")
+    @ExcelProperty("流程实例id")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "12344")
+    @ExcelProperty("当前审核人用户id")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "27993")
+    @ExcelProperty("当前审核人用户uuid")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "31626")
+    @ExcelProperty("当前审核人员工id")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "6500")
+    @ExcelProperty("当前审核人员工uuid")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    @ExcelProperty("最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 94 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionSaveReqVO.java

@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 离职流程信息新增/修改 Request VO")
+@Data
+public class OaDimissionSaveReqVO {
+
+    @Schema(description = "离职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15606")
+    private Long id;
+
+    @Schema(description = "uuid", example = "18425")
+    private String dimissionId;
+
+    @Schema(description = "转正人id", example = "18376")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "2649")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "赵六")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "9650")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "4544")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "24445")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "29090")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    private String startDate;
+
+    @Schema(description = "离职日期")
+    private String dimissionDate;
+
+    @Schema(description = "离职原因", example = "不喜欢")
+    private String dimissionReason;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "18482")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "12344")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "27993")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "31626")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "6500")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "审批,true 通过,false 驳回", example = "true")
+    private Boolean auditPass;
+
+    @Schema(description = "发起人自选审批人 Map", example = " [1, 1]")
+    private List<Long> startUserSelectAssignees;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+    @Schema(description = "审批信息")
+    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
+
+
+}

+ 124 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/OaEntryController.java

@@ -0,0 +1,124 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.entry;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntryPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntryRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntrySaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry.OaEntryDO;
+import cn.iocoder.yudao.module.bpm.service.oa.entry.OaEntryService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+
+@Tag(name = "管理后台 - 入职流程信息")
+@RestController
+@RequestMapping("/bpm/oa-entry")
+@Validated
+public class OaEntryController {
+
+    @Resource
+    private OaEntryService oaEntryService;
+
+    @PostMapping("/start")
+    @Operation(summary = "提交或暂存入职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:start')")
+    public CommonResult<Integer> startOaEntry(@Valid @RequestBody OaEntrySaveReqVO createReqVO) {
+        return success(oaEntryService.startOaEntry(getLoginUserId(), createReqVO));
+    }
+
+    @PostMapping("/completeTure")
+    @Operation(summary = "审批同意入职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-true')")
+    public CommonResult<Integer> completeTrueOaEntry(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaEntryService.completeTrueOaEntry(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/completeFalse")
+    @Operation(summary = "驳回或撤回入职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-false')")
+    public CommonResult<Integer> completeFalseOaEntry(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaEntryService.completeFalseOaEntry(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/updateComplete")
+    @Operation(summary = "驳回和撤回后再次提交或关闭入职流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update-complete')")
+    public CommonResult<Integer> updateCompleteOaEntry(@Valid @RequestBody OaEntrySaveReqVO createReqVO) {
+        return success(oaEntryService.updateCompleteOaEntry(getLoginUserId(), createReqVO, createReqVO.getBpmTaskApproveReqVO()));
+    }
+
+//    @PostMapping("/return")
+//    @Operation(summary = "撤回入职流程信息")
+//    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:start')")
+//    public CommonResult<Integer> returnCompelete(@Valid @RequestBody OaEntrySaveReqVO createReqVO,@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+//        return success(oaEntryService.completeOaEntry(getLoginUserId(),createReqVO,reqVO));
+//    }
+
+//    @PutMapping("/update")
+//    @Operation(summary = "更新入职流程信息")
+//    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update')")
+//    public CommonResult<Boolean> updateOaEntry(@Valid @RequestBody OaEntrySaveReqVO updateReqVO) {
+//        oaEntryService.updateOaEntry(updateReqVO);
+//        return success(true);
+//    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除入职流程信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:delete')")
+    public CommonResult<Boolean> deleteOaEntry(@RequestParam("id") Integer id) {
+        oaEntryService.deleteOaEntry(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得入职流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:query')")
+    public CommonResult<OaEntryRespVO> getOaEntry(@RequestParam("id") Integer id) {
+        OaEntryDO oaEntry = oaEntryService.getOaEntry(id);
+        return success(BeanUtils.toBean(oaEntry, OaEntryRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得入职流程信息分页")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:query')")
+    public CommonResult<PageResult<OaEntryRespVO>> getOaEntryPage(@Valid OaEntryPageReqVO pageReqVO) {
+        PageResult<OaEntryDO> pageResult = oaEntryService.getOaEntryPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, OaEntryRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出入职流程信息 Excel")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOaEntryExcel(@Valid OaEntryPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<OaEntryDO> list = oaEntryService.getOaEntryPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "入职流程信息.xls", "数据", OaEntryRespVO.class,
+                        BeanUtils.toBean(list, OaEntryRespVO.class));
+    }
+
+}

+ 77 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntryPageReqVO.java

@@ -0,0 +1,77 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 入职流程信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OaEntryPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "13471")
+    private String entryId;
+
+    @Schema(description = "部门", example = "2937")
+    private String deptId;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "员工类型", example = "1")
+    private String employeeType;
+
+    @Schema(description = "性别")
+    private String gender;
+
+    @Schema(description = "出身日期")
+    private String birthday;
+
+    @Schema(description = "联系电话")
+    private String contactNumber;
+
+    @Schema(description = "电子邮箱")
+    private String email;
+
+    @Schema(description = "教育背景")
+    private String education;
+
+    @Schema(description = "工作经验")
+    private String workExperience;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "最后审核时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] finalAuditDate;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "入职人", example = "李四")
+    private String entryName;
+
+    @Schema(description = "入职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] entryDate;
+
+    @Schema(description = "流程实例id", example = "9407")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5驳回)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人编号", example = "29870")
+    private String currentAuditEmployeeId;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+}

+ 94 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntryRespVO.java

@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 入职流程信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OaEntryRespVO {
+
+    @Schema(description = "uuid", example = "13471")
+    @ExcelProperty("uuid")
+    private String entryId;
+
+    @Schema(description = "部门", example = "2937")
+    @ExcelProperty("部门")
+    private String deptId;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "员工类型", example = "1")
+    @ExcelProperty("员工类型")
+    private String employeeType;
+
+    @Schema(description = "性别")
+    @ExcelProperty("性别")
+    private String gender;
+
+    @Schema(description = "出身日期")
+    @ExcelProperty("出身日期")
+    private String birthday;
+
+    @Schema(description = "联系电话")
+    @ExcelProperty("联系电话")
+    private String contactNumber;
+
+    @Schema(description = "电子邮箱")
+    @ExcelProperty("电子邮箱")
+    private String email;
+
+    @Schema(description = "教育背景")
+    @ExcelProperty("教育背景")
+    private String education;
+
+    @Schema(description = "工作经验")
+    @ExcelProperty("工作经验")
+    private String workExperience;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "最后审核时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("最后审核时间")
+    private String finalAuditDate;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "入职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27428")
+    @ExcelProperty("入职表单主键")
+    private Integer id;
+
+    @Schema(description = "入职人", example = "李四")
+    @ExcelProperty("入职人")
+    private String entryName;
+
+    @Schema(description = "入职日期")
+    @ExcelProperty("入职日期")
+    private String entryDate;
+
+    @Schema(description = "流程实例id", example = "9407")
+    @ExcelProperty("流程实例id")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5驳回)", example = "2")
+    @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5驳回)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29870")
+    @ExcelProperty("当前审核人编号")
+    private String currentAuditEmployeeId;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+}

+ 85 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntrySaveReqVO.java

@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 入职流程信息新增/修改 Request VO")
+@Data
+public class OaEntrySaveReqVO {
+
+    @Schema(description = "入职人", example = "李四")
+    private String entryName;
+
+    @Schema(description = "uuid", example = "13471")
+    private String entryId;
+
+    @Schema(description = "部门", example = "2937")
+    private String deptId;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "员工类型", example = "1")
+    private String employeeType;
+
+    @Schema(description = "性别")
+    private String gender;
+
+    @Schema(description = "出身日期")
+    private String birthday;
+
+    @Schema(description = "联系电话")
+    private String contactNumber;
+
+    @Schema(description = "电子邮箱")
+    private String email;
+
+    @Schema(description = "教育背景", example = "本科")
+    private String education;
+
+    @Schema(description = "工作经验", example = "5年Java开发经验")
+    private String workExperience;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "最后审核时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    // @NotEmpty(message = "最后审核时间不能为空")
+    private String finalAuditDate;
+
+    @Schema(description = "入职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer id;
+
+    @Schema(description = "入职日期")
+    private String entryDate;
+
+    @Schema(description = "流程实例id", example = "9407")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5驳回)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29870")
+    // @NotEmpty(message = "当前审核人编号不能为空")
+    private String currentAuditEmployeeId;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
+    // @NotEmpty(message = "数据来源,0流程添加、1手动添加不能为空")
+    private String infoSource;
+
+    @Schema(description = "审批,true 通过,false 驳回", example = "true")
+    private Boolean auditPass;
+
+    @Schema(description = "发起人自选审批人 Map", example = " [1, 1]")
+    private List<Long> startUserSelectAssignees;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+    @Schema(description = "审批信息")
+    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
+
+}

+ 124 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/OaHolidayController.java

@@ -0,0 +1,124 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidayPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidayRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidaySaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday.OaHolidayDO;
+import cn.iocoder.yudao.module.bpm.service.oa.holiday.OaHolidayService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - 请假流程信息")
+@RestController
+@RequestMapping("/bpm/oa-holiday")
+@Validated
+public class OaHolidayController {
+
+    @Resource
+    private OaHolidayService oaHolidayService;
+
+    @PostMapping("/start")
+    @Operation(summary = "提交或暂存请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-Holiday:start')")
+    public CommonResult<Long> startOaHoliday(@Valid @RequestBody OaHolidaySaveReqVO createReqVO) {
+        return success(oaHolidayService.startOaHoliday(getLoginUserId(), createReqVO));
+    }
+
+    @PostMapping("/completeTure")
+    @Operation(summary = "审批同意请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-true')")
+    public CommonResult<Long> completeTrueOaHoliday(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaHolidayService.completeTrueOaHoliday(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/completeFalse")
+    @Operation(summary = "驳回或撤回请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-false')")
+    public CommonResult<Long> completeFalseOaHoliday(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaHolidayService.completeFalseOaHoliday(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/updateComplete")
+    @Operation(summary = "驳回和撤回后再次提交或关闭请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update-complete')")
+    public CommonResult<Long> updateCompleteOaHoliday(@Valid @RequestBody OaHolidaySaveReqVO createReqVO) {
+        return success(oaHolidayService.updateCompleteOaHoliday(getLoginUserId(), createReqVO, createReqVO.getBpmTaskApproveReqVO()));
+    }
+
+
+    @PostMapping("/create")
+    @Operation(summary = "创建请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-holiday:create')")
+    public CommonResult<Long> createOaHoliday(@Valid @RequestBody OaHolidaySaveReqVO createReqVO) {
+        return success(oaHolidayService.createOaHoliday(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-holiday:update')")
+    public CommonResult<Boolean> updateOaHoliday(@Valid @RequestBody OaHolidaySaveReqVO updateReqVO) {
+        oaHolidayService.updateOaHoliday(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除请假流程信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-holiday:delete')")
+    public CommonResult<Boolean> deleteOaHoliday(@RequestParam("id") Long id) {
+        oaHolidayService.deleteOaHoliday(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得请假流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-holiday:query')")
+    public CommonResult<OaHolidayRespVO> getOaHoliday(@RequestParam("id") Long id) {
+        OaHolidayDO oaHoliday = oaHolidayService.getOaHoliday(id);
+        return success(BeanUtils.toBean(oaHoliday, OaHolidayRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得请假流程信息分页")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-holiday:query')")
+    public CommonResult<PageResult<OaHolidayRespVO>> getOaHolidayPage(@Valid OaHolidayPageReqVO pageReqVO) {
+        PageResult<OaHolidayDO> pageResult = oaHolidayService.getOaHolidayPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, OaHolidayRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出请假流程信息 Excel")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-holiday:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOaHolidayExcel(@Valid OaHolidayPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<OaHolidayDO> list = oaHolidayService.getOaHolidayPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "请假流程信息.xls", "数据", OaHolidayRespVO.class,
+                        BeanUtils.toBean(list, OaHolidayRespVO.class));
+    }
+
+}

+ 100 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/vo/OaHolidayPageReqVO.java

@@ -0,0 +1,100 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 请假流程信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OaHolidayPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "20728")
+    private String holidayId;
+
+    @Schema(description = "转正人id", example = "12388")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "31445")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "王五")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "25603")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "13640")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "26110")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "24393")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "1")
+    private String holidayType;
+
+    @Schema(description = "开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] startDate;
+
+    @Schema(description = "结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] endDate;
+
+    @Schema(description = "请假天数")
+    private String day;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    private String startTime;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    private String endTime;
+
+    @Schema(description = "请假原因", example = "不好")
+    private String reason;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "26074")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "19230")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "30632")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "7920")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "18105")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 124 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/vo/OaHolidayRespVO.java

@@ -0,0 +1,124 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 请假流程信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OaHolidayRespVO {
+
+    @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "26233")
+    @ExcelProperty("请假表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "20728")
+    @ExcelProperty("uuid")
+    private String holidayId;
+
+    @Schema(description = "转正人id", example = "12388")
+    @ExcelProperty("转正人id")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "31445")
+    @ExcelProperty("转正人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "王五")
+    @ExcelProperty("转正员工姓名")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "25603")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "13640")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "26110")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "24393")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    @ExcelProperty("员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "1")
+    @ExcelProperty("请假类型")
+    private String holidayType;
+
+    @Schema(description = "开始日期")
+    @ExcelProperty("开始日期")
+    private String startDate;
+
+    @Schema(description = "结束日期")
+    @ExcelProperty("结束日期")
+    private String endDate;
+
+    @Schema(description = "请假天数")
+    @ExcelProperty("请假天数")
+    private String day;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    @ExcelProperty("具体到上下午,am上午 pm下午")
+    private String startTime;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    @ExcelProperty("具体到上下午,am上午 pm下午")
+    private String endTime;
+
+    @Schema(description = "请假原因", example = "不好")
+    @ExcelProperty("请假原因")
+    private String reason;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "26074")
+    @ExcelProperty("流程实例id")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "19230")
+    @ExcelProperty("当前审核人用户id")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "30632")
+    @ExcelProperty("当前审核人用户uuid")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "7920")
+    @ExcelProperty("当前审核人员工id")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "18105")
+    @ExcelProperty("当前审核人员工uuid")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    @ExcelProperty("最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 107 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/holiday/vo/OaHolidaySaveReqVO.java

@@ -0,0 +1,107 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 请假流程信息新增/修改 Request VO")
+@Data
+public class OaHolidaySaveReqVO {
+
+    @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "26233")
+    private Long id;
+
+    @Schema(description = "uuid", example = "20728")
+    private String holidayId;
+
+    @Schema(description = "转正人id", example = "12388")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "31445")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "王五")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "25603")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "13640")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "26110")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "24393")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "1")
+    private String holidayType;
+
+    @Schema(description = "开始日期")
+    private String startDate;
+
+    @Schema(description = "结束日期")
+    private String endDate;
+
+    @Schema(description = "请假天数")
+    private String day;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    private String startTime;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    private String endTime;
+
+    @Schema(description = "请假原因", example = "不好")
+    private String reason;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "26074")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "19230")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "30632")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "7920")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "18105")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+
+    @Schema(description = "审批,true 通过,false 驳回", example = "true")
+    private Boolean auditPass;
+
+    @Schema(description = "发起人自选审批人 Map", example = " [1, 1]")
+    private List<Long> startUserSelectAssignees;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+    @Schema(description = "审批信息")
+    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
+
+
+}

+ 96 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/leave/OaLeaveController.java

@@ -0,0 +1,96 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.leave;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeavePageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeaveRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeaveSaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.leave.OaLeaveDO;
+import cn.iocoder.yudao.module.bpm.service.oa.leave.OaLeaveService;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+
+@Tag(name = "管理后台 - 请假流程信息")
+@RestController
+@RequestMapping("/bpm/oa-leave")
+@Validated
+public class OaLeaveController {
+
+    @Resource
+    private OaLeaveService oaLeaveService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-leave:create')")
+    public CommonResult<Integer> createOaLeave(@Valid @RequestBody OaLeaveSaveReqVO createReqVO) {
+        return success(oaLeaveService.createOaLeave(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新请假流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-leave:update')")
+    public CommonResult<Boolean> updateOaLeave(@Valid @RequestBody OaLeaveSaveReqVO updateReqVO) {
+        oaLeaveService.updateOaLeave(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除请假流程信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-leave:delete')")
+    public CommonResult<Boolean> deleteOaLeave(@RequestParam("id") Integer id) {
+        oaLeaveService.deleteOaLeave(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得请假流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')")
+    public CommonResult<OaLeaveRespVO> getOaLeave(@RequestParam("id") Integer id) {
+        OaLeaveDO oaLeave = oaLeaveService.getOaLeave(id);
+        return success(BeanUtils.toBean(oaLeave, OaLeaveRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得请假流程信息分页")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')")
+    public CommonResult<PageResult<OaLeaveRespVO>> getOaLeavePage(@Valid OaLeavePageReqVO pageReqVO) {
+        PageResult<OaLeaveDO> pageResult = oaLeaveService.getOaLeavePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, OaLeaveRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出请假流程信息 Excel")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-leave:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOaLeaveExcel(@Valid OaLeavePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<OaLeaveDO> list = oaLeaveService.getOaLeavePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "请假流程信息.xls", "数据", OaLeaveRespVO.class,
+                        BeanUtils.toBean(list, OaLeaveRespVO.class));
+    }
+
+}

+ 82 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/leave/vo/OaLeavePageReqVO.java

@@ -0,0 +1,82 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 请假流程信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OaLeavePageReqVO extends PageParam {
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "uuid", example = "17142")
+    private String leaveId;
+
+    @Schema(description = "员工姓名", example = "张三")
+    private String loginName;
+
+    @Schema(description = "员工编号", example = "18704")
+    private String loginId;
+
+    @Schema(description = "部门", example = "26420")
+    private String deptId;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "2")
+    private String type;
+
+    @Schema(description = "开始时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] startTime;
+
+    @Schema(description = "结束时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] endTime;
+
+    @Schema(description = "请假天数")
+    private String day;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    private String concreteDay1;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    private String concreteDay2;
+
+    @Schema(description = "请假原因", example = "不喜欢")
+    private String reason;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "32163")
+    private String procInsId;
+
+    @Schema(description = "单据状态(0:暂存,1:审批中,2:生效,4:审批完成,3:删除,5作废)", example = "1")
+    private String oaLeaveStatus;
+
+    @Schema(description = "审核状态(0:驳回,1:提交,2:审批中,4:审批完成,3:取消结束)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人编号", example = "12911")
+    private String auditLoginId;
+
+    @Schema(description = "最后审核时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] finalAuditDate;
+
+    @Schema(description = "数据来源,流程添加、手动添加")
+    private String infoSource;
+
+}

+ 100 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/leave/vo/OaLeaveRespVO.java

@@ -0,0 +1,100 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 请假流程信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OaLeaveRespVO {
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "11541")
+    @ExcelProperty("请假表单主键")
+    private Integer id;
+
+    @Schema(description = "uuid", example = "17142")
+    @ExcelProperty("uuid")
+    private String leaveId;
+
+    @Schema(description = "员工姓名", example = "张三")
+    @ExcelProperty("员工姓名")
+    private String loginName;
+
+    @Schema(description = "员工编号", example = "18704")
+    @ExcelProperty("员工编号")
+    private String loginId;
+
+    @Schema(description = "部门", example = "26420")
+    @ExcelProperty("部门")
+    private String deptId;
+
+    @Schema(description = "员工职位")
+    @ExcelProperty("员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "2")
+    @ExcelProperty("请假类型")
+    private String type;
+
+    @Schema(description = "开始时间")
+    @ExcelProperty("开始时间")
+    private String startTime;
+
+    @Schema(description = "结束时间")
+    @ExcelProperty("结束时间")
+    private String endTime;
+
+    @Schema(description = "请假天数")
+    @ExcelProperty("请假天数")
+    private String day;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    @ExcelProperty("具体到上下午,am上午 pm下午")
+    private String concreteDay1;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    @ExcelProperty("具体到上下午,am上午 pm下午")
+    private String concreteDay2;
+
+    @Schema(description = "请假原因", example = "不喜欢")
+    @ExcelProperty("请假原因")
+    private String reason;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "32163")
+    @ExcelProperty("流程实例id")
+    private String procInsId;
+
+    @Schema(description = "单据状态(0:暂存,1:审批中,2:生效,4:审批完成,3:删除,5作废)", example = "1")
+    @ExcelProperty("单据状态(0:暂存,1:审批中,2:生效,4:审批完成,3:删除,5作废)")
+    private String oaLeaveStatus;
+
+    @Schema(description = "审核状态(0:驳回,1:提交,2:审批中,4:审批完成,3:取消结束)", example = "2")
+    @ExcelProperty("审核状态(0:驳回,1:提交,2:审批中,4:审批完成,3:取消结束)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12911")
+    @ExcelProperty("当前审核人编号")
+    private String auditLoginId;
+
+    @Schema(description = "最后审核时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("最后审核时间")
+    private String finalAuditDate;
+
+    @Schema(description = "数据来源,流程添加、手动添加")
+    @ExcelProperty("数据来源,流程添加、手动添加")
+    private String infoSource;
+
+}

+ 74 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/leave/vo/OaLeaveSaveReqVO.java

@@ -0,0 +1,74 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 请假流程信息新增/修改 Request VO")
+@Data
+public class OaLeaveSaveReqVO {
+
+    @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "11541")
+    private Integer id;
+
+    @Schema(description = "uuid", example = "17142")
+    private String leaveId;
+
+    @Schema(description = "员工姓名", example = "张三")
+    private String loginName;
+
+    @Schema(description = "员工编号", example = "18704")
+    private String loginId;
+
+    @Schema(description = "部门", example = "26420")
+    private String deptId;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "2")
+    private String type;
+
+    @Schema(description = "开始时间")
+    private String startTime;
+
+    @Schema(description = "结束时间")
+    private String endTime;
+
+    @Schema(description = "请假天数")
+    private String day;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    private String concreteDay1;
+
+    @Schema(description = "具体到上下午,am上午 pm下午")
+    private String concreteDay2;
+
+    @Schema(description = "请假原因", example = "不喜欢")
+    private String reason;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "32163")
+    private String procInsId;
+
+    @Schema(description = "单据状态(0:暂存,1:审批中,2:生效,4:审批完成,3:删除,5作废)", example = "1")
+    private String oaLeaveStatus;
+
+    @Schema(description = "审核状态(0:驳回,1:提交,2:审批中,4:审批完成,3:取消结束)", example = "2")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12911")
+    @NotEmpty(message = "当前审核人编号不能为空")
+    private String auditLoginId;
+
+    @Schema(description = "最后审核时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "最后审核时间不能为空")
+    private String finalAuditDate;
+
+    @Schema(description = "数据来源,流程添加、手动添加")
+    private String infoSource;
+
+}

yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.http → yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/oldLeave/BpmOALeaveController.http


+ 8 - 6
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java

@@ -1,13 +1,15 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.oa;
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
-import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo.BpmOALeavePageReqVO;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo.BpmOALeaveCreateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo.BpmOALeaveRespVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.oldLeave.BpmOALeaveDO;
+
+import cn.iocoder.yudao.module.bpm.service.oa.oldLeave.BpmOALeaveService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;

+ 124 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/OaRenewController.java

@@ -0,0 +1,124 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.renew;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.renew.OaRenewDO;
+import cn.iocoder.yudao.module.bpm.service.oa.renew.OaRenewService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - 合同续签流程信息")
+@RestController
+@RequestMapping("/bpm/oa-renew")
+@Validated
+public class OaRenewController {
+
+    @Resource
+    private OaRenewService oaRenewService;
+
+    @PostMapping("/start")
+    @Operation(summary = "提交或暂存合同续签流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-Renew:start')")
+    public CommonResult<Long> startOaRenew(@Valid @RequestBody OaRenewSaveReqVO createReqVO) {
+        return success(oaRenewService.startOaRenew(getLoginUserId(), createReqVO));
+    }
+
+    @PostMapping("/completeTure")
+    @Operation(summary = "审批同意合同续签流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-true')")
+    public CommonResult<Long> completeTrueOaRenew(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaRenewService.completeTrueOaRenew(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/completeFalse")
+    @Operation(summary = "驳回或撤回合同续签流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-false')")
+    public CommonResult<Long> completeFalseOaRenew(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaRenewService.completeFalseOaRenew(getLoginUserId(), reqVO));
+    }
+
+    @PostMapping("/updateComplete")
+    @Operation(summary = "驳回和撤回后再次提交或关闭合同续签流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update-complete')")
+    public CommonResult<Long> updateCompleteOaRenew(@Valid @RequestBody OaRenewSaveReqVO createReqVO) {
+        return success(oaRenewService.updateCompleteOaRenew(getLoginUserId(), createReqVO, createReqVO.getBpmTaskApproveReqVO()));
+    }
+
+
+    @PostMapping("/create")
+    @Operation(summary = "创建合同续签流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:create')")
+    public CommonResult<Long> createOaRenew(@Valid @RequestBody OaRenewSaveReqVO createReqVO) {
+        return success(oaRenewService.createOaRenew(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新合同续签流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:update')")
+    public CommonResult<Boolean> updateOaRenew(@Valid @RequestBody OaRenewSaveReqVO updateReqVO) {
+        oaRenewService.updateOaRenew(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除合同续签流程信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:delete')")
+    public CommonResult<Boolean> deleteOaRenew(@RequestParam("id") Long id) {
+        oaRenewService.deleteOaRenew(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得合同续签流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:query')")
+    public CommonResult<OaRenewRespVO> getOaRenew(@RequestParam("id") Long id) {
+        OaRenewDO oaRenew = oaRenewService.getOaRenew(id);
+        return success(BeanUtils.toBean(oaRenew, OaRenewRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得合同续签流程信息分页")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:query')")
+    public CommonResult<PageResult<OaRenewRespVO>> getOaRenewPage(@Valid OaRenewPageReqVO pageReqVO) {
+        PageResult<OaRenewDO> pageResult = oaRenewService.getOaRenewPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, OaRenewRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出合同续签流程信息 Excel")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOaRenewExcel(@Valid OaRenewPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<OaRenewDO> list = oaRenewService.getOaRenewPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "合同续签流程信息.xls", "数据", OaRenewRespVO.class,
+                        BeanUtils.toBean(list, OaRenewRespVO.class));
+    }
+
+}

+ 102 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewPageReqVO.java

@@ -0,0 +1,102 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 合同续签流程信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OaRenewPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "14308")
+    private String renewId;
+
+    @Schema(description = "转正人id", example = "4530")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "24001")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "赵六")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "16762")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "12052")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "28162")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "17499")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "原合同开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] oldContractStartDate;
+
+    @Schema(description = "原合同结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] oldContractEndDate;
+
+    @Schema(description = "续签合同期限")
+    private String renewPeriod;
+
+    @Schema(description = "续签开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] renewContractStartDate;
+
+    @Schema(description = "续签结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] renewContractEndDate;
+
+    @Schema(description = "续签理由", example = "不喜欢")
+    private String renewReason;
+
+    @Schema(description = "工作表现")
+    private String workPerformance;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "25043")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "1")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "19532")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "31429")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "22621")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "12859")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 124 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewRespVO.java

@@ -0,0 +1,124 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 合同续签流程信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OaRenewRespVO {
+
+    @Schema(description = "续签表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31139")
+    @ExcelProperty("续签表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "14308")
+    @ExcelProperty("uuid")
+    private String renewId;
+
+    @Schema(description = "转正人id", example = "4530")
+    @ExcelProperty("转正人id")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "24001")
+    @ExcelProperty("转正人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "赵六")
+    @ExcelProperty("转正员工姓名")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "16762")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "12052")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "28162")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "17499")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "原合同开始日期")
+    @ExcelProperty("原合同开始日期")
+    private String oldContractStartDate;
+
+    @Schema(description = "原合同结束日期")
+    @ExcelProperty("原合同结束日期")
+    private String oldContractEndDate;
+
+    @Schema(description = "续签合同期限")
+    @ExcelProperty("续签合同期限")
+    private String renewPeriod;
+
+    @Schema(description = "续签开始日期")
+    @ExcelProperty("续签开始日期")
+    private String renewContractStartDate;
+
+    @Schema(description = "续签结束日期")
+    @ExcelProperty("续签结束日期")
+    private String renewContractEndDate;
+
+    @Schema(description = "续签理由", example = "不喜欢")
+    @ExcelProperty("续签理由")
+    private String renewReason;
+
+    @Schema(description = "工作表现")
+    @ExcelProperty("工作表现")
+    private String workPerformance;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "25043")
+    @ExcelProperty("流程实例id")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "1")
+    @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "19532")
+    @ExcelProperty("当前审核人用户id")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "31429")
+    @ExcelProperty("当前审核人用户uuid")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "22621")
+    @ExcelProperty("当前审核人员工id")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "12859")
+    @ExcelProperty("当前审核人员工uuid")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    @ExcelProperty("最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 105 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewSaveReqVO.java

@@ -0,0 +1,105 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "管理后台 - 合同续签流程信息新增/修改 Request VO")
+@Data
+public class OaRenewSaveReqVO {
+
+    @Schema(description = "续签表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31139")
+    private Long id;
+
+    @Schema(description = "uuid", example = "14308")
+    private String renewId;
+
+    @Schema(description = "转正人id", example = "4530")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "24001")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "赵六")
+    private String employeeName;
+
+    @Schema(description = "用户账号id", example = "16762")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "12052")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "28162")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "17499")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "原合同开始日期")
+    private String oldContractStartDate;
+
+    @Schema(description = "原合同结束日期")
+    private String oldContractEndDate;
+
+    @Schema(description = "续签合同期限")
+    private String renewPeriod;
+
+    @Schema(description = "续签开始日期")
+    private String renewContractStartDate;
+
+    @Schema(description = "续签结束日期")
+    private String renewContractEndDate;
+
+    @Schema(description = "续签理由", example = "不喜欢")
+    private String renewReason;
+
+    @Schema(description = "工作表现")
+    private String workPerformance;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "25043")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "1")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "19532")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "31429")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id", example = "22621")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "12859")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "审批,true 通过,false 驳回", example = "true")
+    private Boolean auditPass;
+
+    @Schema(description = "发起人自选审批人 Map", example = " [1, 1]")
+    private List<Long> startUserSelectAssignees;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+    @Schema(description = "审批信息")
+    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
+
+
+}

+ 146 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/OaUniversalController.java

@@ -0,0 +1,146 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.universal;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
+import cn.iocoder.yudao.module.bpm.service.oa.universal.OaUniversalService;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 通用事项审批流程信息")
+@RestController
+@RequestMapping("/bpm/oa-universal")
+@Validated
+public class OaUniversalController {
+
+    @Resource
+    private OaUniversalService oaUniversalService;
+
+    @PostMapping("/staging")
+    @Operation(summary = "暂存通用事项审批流程信息")
+    @ApiOperationSupport(order = 1)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:staging')")
+    public CommonResult<Long> startOaUniversal(@RequestBody OaUniversalSaveReqVO stagingReqVO) {
+        Long oaUniversalId = oaUniversalService.stagingOaUniversal(stagingReqVO);
+        return success(oaUniversalId, "暂存成功");
+    }
+
+    @PostMapping("/commit")
+    @Operation(summary = "提交通用事项审批流程信息")
+    @ApiOperationSupport(order = 2)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:commit')")
+    public CommonResult<Long> commitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO commitReqVO) {
+        Long oaUniversalId = oaUniversalService.commitOaUniversal(commitReqVO);
+        return success(oaUniversalId, "提交成功");
+    }
+
+    @PostMapping("/agree")
+    @Operation(summary = "审批同意通用事项审批流程信息")
+    @ApiOperationSupport(order = 3)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:agree')")
+    public CommonResult<Long> agreeOaUniversal(@Valid @RequestBody BpmTaskApproveReqVO agreeReqVO) {
+        Long result = oaUniversalService.agreeOaUniversal(agreeReqVO);
+        return success(result, "审批成功");
+    }
+
+    @PostMapping("/disagree")
+    @Operation(summary = "驳回通用事项审批流程信息")
+    @ApiOperationSupport(order = 4)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:disagree')")
+    public CommonResult<Long> disagreeOaUniversal(@Valid @RequestBody BpmTaskReturnReqVO disagreeReqVO) {
+        Long result = oaUniversalService.disagreeOaUniversal(disagreeReqVO);
+        return success(result, "驳回成功");
+    }
+
+    @PostMapping("/revocation")
+    @Operation(summary = "撤回通用事项审批流程信息")
+    @ApiOperationSupport(order = 5)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:revocation')")
+    public CommonResult<Long> revocationOaUniversal(@Valid @RequestBody BpmTaskApproveReqVO revocationReqVO) {
+        Long result = oaUniversalService.revocationOaUniversal(revocationReqVO);
+        return success(result, "撤回成功");
+    }
+
+    @PostMapping("/reCommit")
+    @Operation(summary = "驳回或撤回后再次提交通用用事项审批流程信息")
+    @ApiOperationSupport(order = 6)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:re-commit')")
+    public CommonResult<Long> reCommitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO reCommitReqVO) {
+        Long result = oaUniversalService.reCommitOaUniversal(reCommitReqVO);
+        return success(result, "提交成功");
+    }
+
+    @PostMapping("/close")
+    @Operation(summary = "驳回或撤回后关闭通用事项审批流程信息")
+    @ApiOperationSupport(order = 7)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:close')")
+    public CommonResult<Long> updateCompleteOaUniversal(@RequestBody OaUniversalSaveReqVO closeReqVO) {
+        Long result = oaUniversalService.closeOaUniversal(closeReqVO);
+
+        return success(result, "关闭成功");
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除通用事项审批流程信息")
+    @ApiOperationSupport(order = 8)
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:delete')")
+    public CommonResult<Boolean> deleteOaUniversal(@RequestParam("id") Long id) {
+        oaUniversalService.deleteOaUniversal(id);
+        return success(true, "删除成功");
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "根据id获得通用事项审批流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1")
+    @ApiOperationSupport(order = 9)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:query-id')")
+    public CommonResult<OaUniversalRespVO> getOaUniversal(@RequestParam("id") Long id) {
+        OaUniversalRespVO respVO = oaUniversalService.getOaUniversal(id);
+        return success(respVO, "查询对象成功");
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得通用事项审批流程信息分页")
+    @ApiOperationSupport(order = 10)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:query-page')")
+    public CommonResult<PageResult<OaUniversalRespVO>> getOaUniversalPage(@Valid OaUniversalPageReqVO pageReqVO) {
+        return success(oaUniversalService.getOaUniversalPage(pageReqVO), "查询列表成功");
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出通用事项审批流程信息 Excel")
+    @ApiOperationSupport(order = 11)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOaUniversalExcel(@Valid OaUniversalPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        PageResult<OaUniversalRespVO> pageResult = oaUniversalService.exportOaUniversalExcel(pageReqVO);
+        List<OaUniversalRespVO> list = pageResult.getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "通用事项审批流程信息.xls", "数据", OaUniversalRespVO.class,
+                        BeanUtils.toBean(list, OaUniversalRespVO.class));
+    }
+
+}

+ 97 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/vo/OaUniversalPageReqVO.java

@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 通用事项审批流程信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OaUniversalPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "12260")
+    private String universalId;
+
+    @Schema(description = "申请人id", example = "14065")
+    private Long employeeId;
+
+    @Schema(description = "申请人uuid", example = "8771")
+    private String employeeUuid;
+
+    @Schema(description = "申请员工姓名", example = "芋艿")
+    private String employeeName;
+
+    @Schema(description = "申请员工手机号", example = "13900000000")
+    private String employeePhone;
+
+    @Schema(description = "申请用户账号id", example = "18283")
+    private Long userId;
+
+    @Schema(description = "申请用户账号uuid", example = "28769")
+    private String userUuid;
+
+    @Schema(description = "申请用户账号手机号", example = "13900000000")
+    private String userPhone;
+
+    @Schema(description = "部门id", example = "12910")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "18681")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "申请事项标题")
+    private String title;
+
+    @Schema(description = "详细描述", example = "随便")
+    private String description;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id", example = "18345")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "1")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id", example = "31811")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid", example = "23687")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人用户姓名")
+    private String currentAuditUserName;
+
+    @Schema(description = "当前审核人员工id", example = "2375")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid", example = "13039")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "当前审核人员工姓名")
+    private String currentAuditEmployeeName;
+
+    @Schema(description = "最后审核时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 138 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/vo/OaUniversalRespVO.java

@@ -0,0 +1,138 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo;
+
+import cn.iocoder.yudao.framework.common.util.date.DateUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
+import cn.iocoder.yudao.module.infra.api.file.dto.FileDTO;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "管理后台 - 通用事项审批流程信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OaUniversalRespVO {
+
+    @Schema(description = "自增主键")
+    @ExcelProperty("自增主键")
+    private Long id;
+
+    @Schema(description = "uuid")
+    @ExcelProperty("uuid")
+    private String universalId;
+
+    @Schema(description = "申请人id")
+    @ExcelProperty("申请人id")
+    private Long employeeId;
+
+    @Schema(description = "申请人uuid")
+    @ExcelProperty("申请人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "申请员工姓名")
+    @ExcelProperty("申请员工姓名")
+    private String employeeName;
+
+    @Schema(description = "申请员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "申请用户账号id")
+    @ExcelProperty("申请用户账号id")
+    private Long userId;
+
+    @Schema(description = "申请用户账号uuid")
+    @ExcelProperty("申请用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "申请用户账号手机号")
+    private String userPhone;
+
+    @Schema(description = "部门id")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "部门名称")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "申请事项标题")
+    @ExcelProperty("申请事项标题")
+    private String title;
+
+    @Schema(description = "详细描述")
+    @ExcelProperty("详细描述")
+    private String description;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id")
+    @ExcelProperty("流程实例id")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回、6已撤回)")
+    @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回、6已撤回)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人用户id")
+    @ExcelProperty("当前审核人用户id")
+    private Long currentAuditUserId;
+
+    @Schema(description = "当前审核人用户uuid")
+    @ExcelProperty("当前审核人用户uuid")
+    private String currentAuditUserUuid;
+
+    @Schema(description = "当前审核人员工id")
+    @ExcelProperty("当前审核人员工id")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工uuid")
+    @ExcelProperty("当前审核人员工uuid")
+    private String currentAuditEmployeeUuid;
+
+    @Schema(description = "当前审核人员工uuid")
+    @ExcelProperty("当前审核人员工uuid")
+    private String currentAuditEmployeeName;
+
+    @Schema(description = "最后审核时间")
+    @ExcelProperty("最后审核时间")
+    @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建者")
+    @ExcelProperty("创建者")
+    private String creator;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "附件列表")
+    private List<FileDTO> fileList;
+
+    @Schema(description = "审批记录列表")
+    private List<BpmTaskRespVO> auditRecordList;
+
+    @Schema(description = "审批人员列表")
+    private List<AdminUserRespDTO> auditUserList;
+
+}

+ 36 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/vo/OaUniversalSaveReqVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Schema(description = "管理后台 - 通用事项审批流程信息新增/修改 Request VO")
+@Data
+public class OaUniversalSaveReqVO {
+
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.AUTO, example = "1")
+    private Long id;
+
+    @Schema(description = "申请事项标题",  example = "申请事项标题,最多20字")
+    @NotBlank(message = "申请事项标题不能为空")
+    private String title;
+
+    @Schema(description = "详细描述", example = "详细描述,最多200字")
+    @NotBlank(message = "详细描述不能为空")
+    private String description;
+
+    @Schema(description = "备注", example = "备注,最多200字")
+    private String remarks;
+
+    @Schema(description = "发起人选择审批人id集合", example = "[100, 1]")
+    private List<Long> startUserSelectAssignees;
+
+    @Schema(description = "附件主键id集合", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+}

+ 3 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java

@@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
@@ -61,7 +61,7 @@ public class BpmProcessInstanceController {
     private DeptApi deptApi;
 
     @GetMapping("/my-page")
-    @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
+    @Operation(summary = "获得我发起流程实例分页列表", description = "在【我的流程】菜单中,进行调用")
     @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
     public CommonResult<PageResult<BpmProcessInstanceRespVO>> getProcessInstanceMyPage(
             @Valid BpmProcessInstancePageReqVO pageReqVO) {
@@ -129,7 +129,7 @@ public class BpmProcessInstanceController {
         // 拼接返回
         ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(
                 processInstance.getProcessDefinitionId());
-        BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
+        BpmProcessDefinitionExtDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
                 processInstance.getProcessDefinitionId());
         String bpmnXml = BpmnModelUtils.getBpmnXml(
                 processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()));

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java

@@ -57,7 +57,7 @@ public class BpmTaskController {
     private DeptApi deptApi;
 
     @GetMapping("todo-page")
-    @Operation(summary = "获取 Todo 待办任务分页")
+    @Operation(summary = "获取我的待办任务分页")
     @PreAuthorize("@ss.hasPermission('bpm:task:query')")
     public CommonResult<PageResult<BpmTaskRespVO>> getTaskTodoPage(@Valid BpmTaskPageReqVO pageVO) {
         PageResult<Task> pageResult = taskService.getTaskTodoPage(getLoginUserId(), pageVO);
@@ -74,7 +74,7 @@ public class BpmTaskController {
     }
 
     @GetMapping("done-page")
-    @Operation(summary = "获取 Done 已办任务分页")
+    @Operation(summary = "获取我的已办任务分页")
     @PreAuthorize("@ss.hasPermission('bpm:task:query')")
     public CommonResult<PageResult<BpmTaskRespVO>> getTaskDonePage(@Valid BpmTaskPageReqVO pageVO) {
         PageResult<HistoricTaskInstance> pageResult = taskService.getTaskDonePage(getLoginUserId(), pageVO);

+ 3 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java

@@ -15,14 +15,13 @@ public class BpmTaskApproveReqVO {
     @NotEmpty(message = "任务编号不能为空")
     private String id;
 
-    @Schema(description = "审批意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "不错不错!")
-    @NotEmpty(message = "审批意见不能为空")
+    @Schema(description = "审批意见", requiredMode = Schema.RequiredMode.AUTO, example = "不错不错!")
     private String reason;
 
-    @Schema(description = "抄送的用户编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2")
+    @Schema(description = "抄送的用户编号数组", requiredMode = Schema.RequiredMode.AUTO)
     private Collection<Long> copyUserIds;
 
-    @Schema(description = "变量实例(动态表单)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "变量实例(动态表单)", requiredMode = Schema.RequiredMode.AUTO)
     private Map<String, Object> variables;
 
 }

+ 6 - 5
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskReturnReqVO.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
 
 @Schema(description = "管理后台 - 回退流程任务的 Request VO")
@@ -10,15 +11,15 @@ import javax.validation.constraints.NotEmpty;
 public class BpmTaskReturnReqVO {
 
     @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @NotEmpty(message = "任务编号不能为空")
+    @NotBlank(message = "任务编号不能为空")
     private String id;
 
-    @Schema(description = "回退到的任务 Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotEmpty(message = "回退到的任务 Key 不能为空")
+    @Schema(description = "回退到的任务 Key", requiredMode = Schema.RequiredMode.AUTO, example = "modifyApply")
+    // @NotEmpty(message = "回退到的任务 Key 不能为空")
     private String targetTaskDefinitionKey;
 
-    @Schema(description = "回退意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "我就是想驳回")
-    @NotEmpty(message = "回退意见不能为空")
+    @Schema(description = "回退意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "我就是想驳回,谁同意,谁反对?")
+    @NotBlank(message = "回退意见不能为空")
     private String reason;
 
 }

+ 21 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java

@@ -14,11 +14,13 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmPro
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
+import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
 import org.flowable.common.engine.impl.db.SuspensionState;
 import org.flowable.engine.repository.Deployment;
 import org.flowable.engine.repository.Model;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.mapstruct.Mapper;
+import org.mapstruct.MappingTarget;
 import org.mapstruct.factory.Mappers;
 
 import java.util.List;
@@ -134,4 +136,23 @@ public interface BpmModelConvert {
         return JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
     }
 
+    default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDO form) {
+        BpmProcessDefinitionCreateReqDTO createReqDTO = new BpmProcessDefinitionCreateReqDTO();
+        createReqDTO.setModelId(model.getId());
+        createReqDTO.setName(model.getName());
+        createReqDTO.setKey(model.getKey());
+        createReqDTO.setCategory(model.getCategory());
+        BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
+        // metaInfo
+        copyTo(metaInfo, createReqDTO);
+        // form
+        if (form != null) {
+            createReqDTO.setFormConf(form.getConf());
+            createReqDTO.setFormFields(form.getFields());
+        }
+        return createReqDTO;
+    }
+
+    void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmProcessDefinitionCreateReqDTO to);
+
 }

+ 7 - 7
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java

@@ -8,7 +8,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.bpmn.model.UserTask;
@@ -35,7 +35,7 @@ public interface BpmProcessDefinitionConvert {
 
     default PageResult<BpmProcessDefinitionRespVO> buildProcessDefinitionPage(PageResult<ProcessDefinition> page,
                                                                               Map<String, Deployment> deploymentMap,
-                                                                              Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap,
+                                                                              Map<String, BpmProcessDefinitionExtDO> processDefinitionInfoMap,
                                                                               Map<Long, BpmFormDO> formMap,
                                                                               Map<String, BpmCategoryDO> categoryMap) {
         List<BpmProcessDefinitionRespVO> list = buildProcessDefinitionList(page.getList(), deploymentMap, processDefinitionInfoMap, formMap, categoryMap);
@@ -44,12 +44,12 @@ public interface BpmProcessDefinitionConvert {
 
     default List<BpmProcessDefinitionRespVO> buildProcessDefinitionList(List<ProcessDefinition> list,
                                                                         Map<String, Deployment> deploymentMap,
-                                                                        Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap,
+                                                                        Map<String, BpmProcessDefinitionExtDO> processDefinitionInfoMap,
                                                                         Map<Long, BpmFormDO> formMap,
                                                                         Map<String, BpmCategoryDO> categoryMap) {
         return CollectionUtils.convertList(list, definition -> {
             Deployment deployment = MapUtil.get(deploymentMap, definition.getDeploymentId(), Deployment.class);
-            BpmProcessDefinitionInfoDO processDefinitionInfo = MapUtil.get(processDefinitionInfoMap, definition.getId(), BpmProcessDefinitionInfoDO.class);
+            BpmProcessDefinitionExtDO processDefinitionInfo = MapUtil.get(processDefinitionInfoMap, definition.getId(), BpmProcessDefinitionExtDO.class);
             BpmFormDO form = null;
             if (processDefinitionInfo != null) {
                 form = MapUtil.get(formMap, processDefinitionInfo.getFormId(), BpmFormDO.class);
@@ -61,7 +61,7 @@ public interface BpmProcessDefinitionConvert {
 
     default BpmProcessDefinitionRespVO buildProcessDefinition(ProcessDefinition definition,
                                                               Deployment deployment,
-                                                              BpmProcessDefinitionInfoDO processDefinitionInfo,
+                                                              BpmProcessDefinitionExtDO processDefinitionInfo,
                                                               BpmFormDO form,
                                                               BpmCategoryDO category,
                                                               BpmnModel bpmnModel,
@@ -72,7 +72,7 @@ public interface BpmProcessDefinitionConvert {
         if (deployment != null) {
             respVO.setDeploymentTime(LocalDateTimeUtil.of(deployment.getDeploymentTime()));
         }
-        // BpmProcessDefinitionInfoDO
+        // BpmProcessDefinitionExtDO
         if (processDefinitionInfo != null) {
             copyTo(processDefinitionInfo, respVO);
             // Form
@@ -93,6 +93,6 @@ public interface BpmProcessDefinitionConvert {
     }
 
     @Mapping(source = "from.id", target = "to.id", ignore = true)
-    void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessDefinitionRespVO to);
+    void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessDefinitionRespVO to);
 
 }

+ 3 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java

@@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
@@ -64,7 +64,7 @@ public interface BpmProcessInstanceConvert {
 
     default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
                                                           ProcessDefinition processDefinition,
-                                                          BpmProcessDefinitionInfoDO processDefinitionExt,
+                                                          BpmProcessDefinitionExtDO processDefinitionExt,
                                                           String bpmnXml,
                                                           AdminUserRespDTO startUser,
                                                           DeptRespDTO dept) {
@@ -86,7 +86,7 @@ public interface BpmProcessInstanceConvert {
     }
 
     @Mapping(source = "from.id", target = "to.id", ignore = true)
-    void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessDefinitionRespVO to);
+    void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessDefinitionRespVO to);
 
     default BpmProcessInstanceStatusEvent buildProcessInstanceStatusEvent(Object source, HistoricProcessInstance instance, Integer status) {
         return new BpmProcessInstanceStatusEvent(source).setId(instance.getId()).setStatus(status)

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java

@@ -16,12 +16,12 @@ import java.util.List;
  *
  * @author 芋道源码
  */
-@TableName(value = "bpm_process_definition_info", autoResultMap = true)
+@TableName(value = "bpm_process_definition_ext", autoResultMap = true)
 @Data
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class BpmProcessDefinitionInfoDO extends BaseDO {
+public class BpmProcessDefinitionExtDO extends BaseDO {
 
     /**
      * 编号

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java

@@ -45,6 +45,6 @@ public class BpmUserGroupDO extends BaseDO {
      * 成员用户编号数组
      */
     @TableField(typeHandler = JsonLongSetTypeHandler.class)
-    private Set<Long> memberUserIds;
+    private Set<Long> userIds;
 
 }

+ 124 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/conversion/OaConversionDO.java

@@ -0,0 +1,124 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.conversion;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 转正流程信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("bpm_oa_conversion")
+@KeySequence("bpm_oa_conversion_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaConversionDO extends BaseDO {
+
+    /**
+     * 转正表单主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String conversionId;
+    /**
+     * 转正人id
+     */
+    private Long employeeId;
+    /**
+     * 转正人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 转正员工姓名
+     */
+    private String employeeName;
+    /**
+     * 用户账号id
+     */
+    private Long userId;
+    /**
+     * 用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 职位
+     */
+    private String position;
+    /**
+     * 入职日期
+     */
+    private String entryDate;
+    /**
+     * 试用期结束日期
+     */
+    private String probationEndDate;
+    /**
+     * 转正日期
+     */
+    private String conversionDate;
+    /**
+     * 转正申请理由
+     */
+    private String conversionReason;
+    /**
+     * 工作总结
+     */
+    private String workSummary;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 流程实例id
+     */
+    private String procInstId;
+    /**
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)
+     */
+    private String auditStatus;
+    /**
+     * 当前审核人用户id
+     */
+    private Long currentAuditUserId;
+    /**
+     * 当前审核人用户uuid
+     */
+    private String currentAuditUserUuid;
+    /**
+     * 当前审核人员工id
+     */
+    private Long currentAuditEmployeeId;
+    /**
+     * 当前审核人员工uuid
+     */
+    private String currentAuditEmployeeUuid;
+    /**
+     * 最后审核时间
+     */
+    private LocalDateTime finalAuditDate;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+
+}

+ 116 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/dimission/OaDimissionDO.java

@@ -0,0 +1,116 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.dimission;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 离职流程信息 DO
+ *
+ * @author dp
+ */
+@TableName("bpm_oa_dimission")
+@KeySequence("bpm_oa_dimission_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaDimissionDO extends BaseDO {
+
+    /**
+     * 离职表单主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String dimissionId;
+    /**
+     * 转正人id
+     */
+    private Long employeeId;
+    /**
+     * 转正人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 转正员工姓名
+     */
+    private String employeeName;
+    /**
+     * 用户账号id
+     */
+    private Long userId;
+    /**
+     * 用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 职位
+     */
+    private String position;
+    /**
+     * 入职日期
+     */
+    private String startDate;
+    /**
+     * 离职日期
+     */
+    private String dimissionDate;
+    /**
+     * 离职原因
+     */
+    private String dimissionReason;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 流程实例id
+     */
+    private String procInstId;
+    /**
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)
+     */
+    private String auditStatus;
+    /**
+     * 当前审核人用户id
+     */
+    private Long currentAuditUserId;
+    /**
+     * 当前审核人用户uuid
+     */
+    private String currentAuditUserUuid;
+    /**
+     * 当前审核人员工id
+     */
+    private Long currentAuditEmployeeId;
+    /**
+     * 当前审核人员工uuid
+     */
+    private String currentAuditEmployeeUuid;
+    /**
+     * 最后审核时间
+     */
+    private LocalDateTime finalAuditDate;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+
+}

+ 105 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/entry/OaEntryDO.java

@@ -0,0 +1,105 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 入职流程信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("bpm_oa_entry")
+@KeySequence("bpm_oa_entry_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaEntryDO extends BaseDO {
+    /**
+     * 入职表单主键
+     */
+    @TableId
+    private Integer id;
+
+    /**
+     * uuid
+     */
+    private String entryId;
+    /**
+     * 入职人
+     */
+    private String entryName;
+    /**
+     * 部门
+     */
+    private String deptId;
+    /**
+     * 职位
+     */
+    private String position;
+    /**
+     * 员工类型
+     */
+    private String employeeType;
+    /**
+     * 性别
+     */
+    private String gender;
+    /**
+     * 出身日期
+     */
+    private String birthday;
+    /**
+     * 联系电话
+     */
+    private String contactNumber;
+    /**
+     * 电子邮箱
+     */
+    private String email;
+    /**
+     * 教育背景
+     */
+    private String education;
+    /**
+     * 工作经验
+     */
+    private String workExperience;
+    /**
+     * 入职日期
+     */
+    private String entryDate;
+    /**
+     * 备注
+     */
+    private String remarks;
+
+
+    /**
+     * 流程实例id
+     */
+    private String procInstId;
+    /**
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5驳回)
+     */
+    private String auditStatus;
+    /**
+     * 最后审核时间
+     */
+    private Date finalAuditDate;
+    /**
+     * 当前审核人编号
+     */
+    private String currentAuditEmployeeId;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+
+}

+ 132 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/holiday/OaHolidayDO.java

@@ -0,0 +1,132 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 请假流程信息 DO
+ *
+ * @author dp
+ */
+@TableName("bpm_oa_holiday")
+@KeySequence("bpm_oa_holiday_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaHolidayDO extends BaseDO {
+
+    /**
+     * 请假表单主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String holidayId;
+    /**
+     * 转正人id
+     */
+    private Long employeeId;
+    /**
+     * 转正人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 转正员工姓名
+     */
+    private String employeeName;
+    /**
+     * 用户账号id
+     */
+    private Long userId;
+    /**
+     * 用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 员工职位
+     */
+    private String position;
+    /**
+     * 请假类型
+     */
+    private String holidayType;
+    /**
+     * 开始日期
+     */
+    private String startDate;
+    /**
+     * 结束日期
+     */
+    private String endDate;
+    /**
+     * 请假天数
+     */
+    private String day;
+    /**
+     * 具体到上下午,am上午 pm下午
+     */
+    private String startTime;
+    /**
+     * 具体到上下午,am上午 pm下午
+     */
+    private String endTime;
+    /**
+     * 请假原因
+     */
+    private String reason;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 流程实例id
+     */
+    private String procInstId;
+    /**
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)
+     */
+    private String auditStatus;
+    /**
+     * 当前审核人用户id
+     */
+    private Long currentAuditUserId;
+    /**
+     * 当前审核人用户uuid
+     */
+    private String currentAuditUserUuid;
+    /**
+     * 当前审核人员工id
+     */
+    private Long currentAuditEmployeeId;
+    /**
+     * 当前审核人员工uuid
+     */
+    private String currentAuditEmployeeUuid;
+    /**
+     * 最后审核时间
+     */
+    private LocalDateTime finalAuditDate;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+
+}

+ 107 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/leave/OaLeaveDO.java

@@ -0,0 +1,107 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.leave;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 请假流程信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("bpm_oa_leave")
+@KeySequence("bpm_oa_leave_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaLeaveDO extends BaseDO {
+
+    /**
+     * 请假表单主键
+     */
+    @TableId
+    private Integer id;
+    /**
+     * uuid
+     */
+    private String leaveId;
+    /**
+     * 员工姓名
+     */
+    private String loginName;
+    /**
+     * 员工编号
+     */
+    private String loginId;
+    /**
+     * 部门
+     */
+    private String deptId;
+    /**
+     * 员工职位
+     */
+    private String position;
+    /**
+     * 请假类型
+     */
+    private String type;
+    /**
+     * 开始时间
+     */
+    private String startTime;
+    /**
+     * 结束时间
+     */
+    private String endTime;
+    /**
+     * 请假天数
+     */
+    private String day;
+    /**
+     * 具体到上下午,am上午 pm下午
+     */
+    private String concreteDay1;
+    /**
+     * 具体到上下午,am上午 pm下午
+     */
+    private String concreteDay2;
+    /**
+     * 请假原因
+     */
+    private String reason;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 流程实例id
+     */
+    private String procInsId;
+    /**
+     * 单据状态(0:暂存,1:审批中,2:生效,4:审批完成,3:删除,5作废)
+     */
+    private String oaLeaveStatus;
+    /**
+     * 审核状态(0:驳回,1:提交,2:审批中,4:审批完成,3:取消结束)
+     */
+    private String auditStatus;
+    /**
+     * 当前审核人编号
+     */
+    private String auditLoginId;
+    /**
+     * 最后审核时间
+     */
+    private String finalAuditDate;
+    /**
+     * 数据来源,流程添加、手动添加
+     */
+    private String infoSource;
+
+}

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.oldLeave;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;

+ 132 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/renew/OaRenewDO.java

@@ -0,0 +1,132 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.renew;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 合同续签流程信息 DO
+ *
+ * @author dp
+ */
+@TableName("bpm_oa_renew")
+@KeySequence("bpm_oa_renew_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaRenewDO extends BaseDO {
+
+    /**
+     * 续签表单主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String renewId;
+    /**
+     * 转正人id
+     */
+    private Long employeeId;
+    /**
+     * 转正人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 转正员工姓名
+     */
+    private String employeeName;
+    /**
+     * 用户账号id
+     */
+    private Long userId;
+    /**
+     * 用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 职位
+     */
+    private String position;
+    /**
+     * 原合同开始日期
+     */
+    private String oldContractStartDate;
+    /**
+     * 原合同结束日期
+     */
+    private String oldContractEndDate;
+    /**
+     * 续签合同期限
+     */
+    private String renewPeriod;
+    /**
+     * 续签开始日期
+     */
+    private String renewContractStartDate;
+    /**
+     * 续签结束日期
+     */
+    private String renewContractEndDate;
+    /**
+     * 续签理由
+     */
+    private String renewReason;
+    /**
+     * 工作表现
+     */
+    private String workPerformance;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 流程实例id
+     */
+    private String procInstId;
+    /**
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)
+     */
+    private String auditStatus;
+    /**
+     * 当前审核人用户id
+     */
+    private Long currentAuditUserId;
+    /**
+     * 当前审核人用户uuid
+     */
+    private String currentAuditUserUuid;
+    /**
+     * 当前审核人员工id
+     */
+    private Long currentAuditEmployeeId;
+    /**
+     * 当前审核人员工uuid
+     */
+    private String currentAuditEmployeeUuid;
+    /**
+     * 最后审核时间
+     */
+    private LocalDateTime finalAuditDate;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+
+}

+ 124 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/universal/OaUniversalDO.java

@@ -0,0 +1,124 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.universal;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 通用事项审批流程信息 DO
+ *
+ * @author dp
+ */
+@TableName("bpm_oa_universal")
+@KeySequence("bpm_oa_universal_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaUniversalDO extends BaseDO {
+
+    /**
+     * 自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String universalId;
+    /**
+     * 申请人id
+     */
+    private Long employeeId;
+    /**
+     * 申请人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 申请员工姓名
+     */
+    private String employeeName;
+    /**
+     * 申请员工手机号
+     */
+    private String employeePhone;
+    /**
+     * 申请用户账号id
+     */
+    private Long userId;
+    /**
+     * 申请用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 申请用户手机号
+     */
+    private String userPhone;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 职位
+     */
+    private String position;
+    /**
+     * 申请事项标题
+     */
+    private String title;
+    /**
+     * 详细描述
+     */
+    private String description;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 流程实例id
+     */
+    private String procInstId;
+    /**
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)
+     */
+    private String auditStatus;
+    /**
+     * 当前审核人用户id
+     */
+    private Long currentAuditUserId;
+    /**
+     * 当前审核人用户uuid
+     */
+    private String currentAuditUserUuid;
+    /**
+     * 当前审核人员工id
+     */
+    private Long currentAuditEmployeeId;
+    /**
+     * 当前审核人员工uuid
+     */
+    private String currentAuditEmployeeUuid;
+    /**
+     * 最后审核时间
+     */
+    private LocalDateTime finalAuditDate;
+    /**
+     * 申请人选择的审批人
+     */
+    private String startUserSelectAssignees;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+
+}

+ 6 - 6
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionInfoMapper.java

@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.module.bpm.dal.mysql.definition;
 
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -8,14 +8,14 @@ import java.util.Collection;
 import java.util.List;
 
 @Mapper
-public interface BpmProcessDefinitionInfoMapper extends BaseMapperX<BpmProcessDefinitionInfoDO> {
+public interface BpmProcessDefinitionInfoMapper extends BaseMapperX<BpmProcessDefinitionExtDO> {
 
-    default List<BpmProcessDefinitionInfoDO> selectListByProcessDefinitionIds(Collection<String> processDefinitionIds) {
-        return selectList(BpmProcessDefinitionInfoDO::getProcessDefinitionId, processDefinitionIds);
+    default List<BpmProcessDefinitionExtDO> selectListByProcessDefinitionIds(Collection<String> processDefinitionIds) {
+        return selectList(BpmProcessDefinitionExtDO::getProcessDefinitionId, processDefinitionIds);
     }
 
-    default BpmProcessDefinitionInfoDO selectByProcessDefinitionId(String processDefinitionId) {
-        return selectOne(BpmProcessDefinitionInfoDO::getProcessDefinitionId, processDefinitionId);
+    default BpmProcessDefinitionExtDO selectByProcessDefinitionId(String processDefinitionId) {
+        return selectOne(BpmProcessDefinitionExtDO::getProcessDefinitionId, processDefinitionId);
     }
 
 }

+ 47 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/conversion/OaConversionMapper.java

@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.conversion;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.conversion.OaConversionDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 转正流程信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface OaConversionMapper extends BaseMapperX<OaConversionDO> {
+
+    default PageResult<OaConversionDO> selectPage(OaConversionPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaConversionDO>()
+                .eqIfPresent(OaConversionDO::getConversionId, reqVO.getConversionId())
+                .eqIfPresent(OaConversionDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(OaConversionDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(OaConversionDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(OaConversionDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(OaConversionDO::getUserUuid, reqVO.getUserUuid())
+                .eqIfPresent(OaConversionDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaConversionDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(OaConversionDO::getPosition, reqVO.getPosition())
+                .betweenIfPresent(OaConversionDO::getEntryDate, reqVO.getEntryDate())
+                .betweenIfPresent(OaConversionDO::getProbationEndDate, reqVO.getProbationEndDate())
+                .betweenIfPresent(OaConversionDO::getConversionDate, reqVO.getConversionDate())
+                .eqIfPresent(OaConversionDO::getConversionReason, reqVO.getConversionReason())
+                .eqIfPresent(OaConversionDO::getWorkSummary, reqVO.getWorkSummary())
+                .eqIfPresent(OaConversionDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(OaConversionDO::getProcInstId, reqVO.getProcInstId())
+                .eqIfPresent(OaConversionDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(OaConversionDO::getCurrentAuditUserId, reqVO.getCurrentAuditUserId())
+                .eqIfPresent(OaConversionDO::getCurrentAuditUserUuid, reqVO.getCurrentAuditUserUuid())
+                .eqIfPresent(OaConversionDO::getCurrentAuditEmployeeId, reqVO.getCurrentAuditEmployeeId())
+                .eqIfPresent(OaConversionDO::getCurrentAuditEmployeeUuid, reqVO.getCurrentAuditEmployeeUuid())
+                .betweenIfPresent(OaConversionDO::getFinalAuditDate, reqVO.getFinalAuditDate())
+                .eqIfPresent(OaConversionDO::getInfoSource, reqVO.getInfoSource())
+                .betweenIfPresent(OaConversionDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(OaConversionDO::getId));
+    }
+
+}

+ 45 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/dimission/OaDimissionMapper.java

@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.dimission;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo.OaDimissionPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.dimission.OaDimissionDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 离职流程信息 Mapper
+ *
+ * @author dp
+ */
+@Mapper
+public interface OaDimissionMapper extends BaseMapperX<OaDimissionDO> {
+
+    default PageResult<OaDimissionDO> selectPage(OaDimissionPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaDimissionDO>()
+                .eqIfPresent(OaDimissionDO::getDimissionId, reqVO.getDimissionId())
+                .eqIfPresent(OaDimissionDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(OaDimissionDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(OaDimissionDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(OaDimissionDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(OaDimissionDO::getUserUuid, reqVO.getUserUuid())
+                .eqIfPresent(OaDimissionDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaDimissionDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(OaDimissionDO::getPosition, reqVO.getPosition())
+                .betweenIfPresent(OaDimissionDO::getStartDate, reqVO.getStartDate())
+                .betweenIfPresent(OaDimissionDO::getDimissionDate, reqVO.getDimissionDate())
+                .eqIfPresent(OaDimissionDO::getDimissionReason, reqVO.getDimissionReason())
+                .eqIfPresent(OaDimissionDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(OaDimissionDO::getProcInstId, reqVO.getProcInstId())
+                .eqIfPresent(OaDimissionDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(OaDimissionDO::getCurrentAuditUserId, reqVO.getCurrentAuditUserId())
+                .eqIfPresent(OaDimissionDO::getCurrentAuditUserUuid, reqVO.getCurrentAuditUserUuid())
+                .eqIfPresent(OaDimissionDO::getCurrentAuditEmployeeId, reqVO.getCurrentAuditEmployeeId())
+                .eqIfPresent(OaDimissionDO::getCurrentAuditEmployeeUuid, reqVO.getCurrentAuditEmployeeUuid())
+                .betweenIfPresent(OaDimissionDO::getFinalAuditDate, reqVO.getFinalAuditDate())
+                .eqIfPresent(OaDimissionDO::getInfoSource, reqVO.getInfoSource())
+                .betweenIfPresent(OaDimissionDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(OaDimissionDO::getId));
+    }
+
+}

+ 42 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/entry/OaEntryMapper.java

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.entry;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntryPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry.OaEntryDO;
+import org.apache.ibatis.annotations.Mapper;
+/**
+ * 入职流程信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface OaEntryMapper extends BaseMapperX<OaEntryDO> {
+
+    default PageResult<OaEntryDO> selectPage(OaEntryPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaEntryDO>()
+                .eqIfPresent(OaEntryDO::getEntryId, reqVO.getEntryId())
+                .eqIfPresent(OaEntryDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaEntryDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(OaEntryDO::getEmployeeType, reqVO.getEmployeeType())
+                .eqIfPresent(OaEntryDO::getGender, reqVO.getGender())
+                .eqIfPresent(OaEntryDO::getBirthday, reqVO.getBirthday())
+                .eqIfPresent(OaEntryDO::getContactNumber, reqVO.getContactNumber())
+                .eqIfPresent(OaEntryDO::getEmail, reqVO.getEmail())
+                .eqIfPresent(OaEntryDO::getEducation, reqVO.getEducation())
+                .eqIfPresent(OaEntryDO::getWorkExperience, reqVO.getWorkExperience())
+                .eqIfPresent(OaEntryDO::getRemarks, reqVO.getRemarks())
+                .betweenIfPresent(OaEntryDO::getFinalAuditDate, reqVO.getFinalAuditDate())
+                .betweenIfPresent(OaEntryDO::getCreateTime, reqVO.getCreateTime())
+                .likeIfPresent(OaEntryDO::getEntryName, reqVO.getEntryName())
+                .betweenIfPresent(OaEntryDO::getEntryDate, reqVO.getEntryDate())
+                .eqIfPresent(OaEntryDO::getProcInstId, reqVO.getProcInstId())
+                .eqIfPresent(OaEntryDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(OaEntryDO::getCurrentAuditEmployeeId, reqVO.getCurrentAuditEmployeeId())
+                .eqIfPresent(OaEntryDO::getInfoSource, reqVO.getInfoSource())
+                .orderByDesc(OaEntryDO::getId));
+    }
+
+}

+ 49 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/holiday/OaHolidayMapper.java

@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.holiday;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidayPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday.OaHolidayDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 请假流程信息 Mapper
+ *
+ * @author dp
+ */
+@Mapper
+public interface OaHolidayMapper extends BaseMapperX<OaHolidayDO> {
+
+    default PageResult<OaHolidayDO> selectPage(OaHolidayPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaHolidayDO>()
+                .eqIfPresent(OaHolidayDO::getHolidayId, reqVO.getHolidayId())
+                .eqIfPresent(OaHolidayDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(OaHolidayDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(OaHolidayDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(OaHolidayDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(OaHolidayDO::getUserUuid, reqVO.getUserUuid())
+                .eqIfPresent(OaHolidayDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaHolidayDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(OaHolidayDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(OaHolidayDO::getHolidayType, reqVO.getHolidayType())
+                .betweenIfPresent(OaHolidayDO::getStartDate, reqVO.getStartDate())
+                .betweenIfPresent(OaHolidayDO::getEndDate, reqVO.getEndDate())
+                .eqIfPresent(OaHolidayDO::getDay, reqVO.getDay())
+                .eqIfPresent(OaHolidayDO::getStartTime, reqVO.getStartTime())
+                .eqIfPresent(OaHolidayDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(OaHolidayDO::getReason, reqVO.getReason())
+                .eqIfPresent(OaHolidayDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(OaHolidayDO::getProcInstId, reqVO.getProcInstId())
+                .eqIfPresent(OaHolidayDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(OaHolidayDO::getCurrentAuditUserId, reqVO.getCurrentAuditUserId())
+                .eqIfPresent(OaHolidayDO::getCurrentAuditUserUuid, reqVO.getCurrentAuditUserUuid())
+                .eqIfPresent(OaHolidayDO::getCurrentAuditEmployeeId, reqVO.getCurrentAuditEmployeeId())
+                .eqIfPresent(OaHolidayDO::getCurrentAuditEmployeeUuid, reqVO.getCurrentAuditEmployeeUuid())
+                .betweenIfPresent(OaHolidayDO::getFinalAuditDate, reqVO.getFinalAuditDate())
+                .eqIfPresent(OaHolidayDO::getInfoSource, reqVO.getInfoSource())
+                .betweenIfPresent(OaHolidayDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(OaHolidayDO::getId));
+    }
+
+}

+ 40 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/leave/OaLeaveMapper.java

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.leave;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeavePageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.leave.OaLeaveDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 请假流程信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface OaLeaveMapper extends BaseMapperX<OaLeaveDO> {
+
+    default PageResult<OaLeaveDO> selectPage(OaLeavePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaLeaveDO>()
+                .eqIfPresent(OaLeaveDO::getLeaveId, reqVO.getLeaveId())
+                .likeIfPresent(OaLeaveDO::getLoginName, reqVO.getLoginName())
+                .eqIfPresent(OaLeaveDO::getLoginId, reqVO.getLoginId())
+                .eqIfPresent(OaLeaveDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaLeaveDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(OaLeaveDO::getType, reqVO.getType())
+                .betweenIfPresent(OaLeaveDO::getStartTime, reqVO.getStartTime())
+                .betweenIfPresent(OaLeaveDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(OaLeaveDO::getDay, reqVO.getDay())
+                .eqIfPresent(OaLeaveDO::getConcreteDay1, reqVO.getConcreteDay1())
+                .eqIfPresent(OaLeaveDO::getConcreteDay2, reqVO.getConcreteDay2())
+                .eqIfPresent(OaLeaveDO::getReason, reqVO.getReason())
+                .eqIfPresent(OaLeaveDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(OaLeaveDO::getProcInsId, reqVO.getProcInsId())
+                .eqIfPresent(OaLeaveDO::getOaLeaveStatus, reqVO.getOaLeaveStatus())
+                .eqIfPresent(OaLeaveDO::getInfoSource, reqVO.getInfoSource())
+                .orderByDesc(OaLeaveDO::getId));
+    }
+
+}

+ 3 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java

@@ -1,7 +1,6 @@
-package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
-
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.oldLeave;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo.BpmOALeavePageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.oldLeave.BpmOALeaveDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;

+ 49 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/renew/OaRenewMapper.java

@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.renew;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.renew.OaRenewDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 合同续签流程信息 Mapper
+ *
+ * @author dp
+ */
+@Mapper
+public interface OaRenewMapper extends BaseMapperX<OaRenewDO> {
+
+    default PageResult<OaRenewDO> selectPage(OaRenewPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaRenewDO>()
+                .eqIfPresent(OaRenewDO::getRenewId, reqVO.getRenewId())
+                .eqIfPresent(OaRenewDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(OaRenewDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(OaRenewDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(OaRenewDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(OaRenewDO::getUserUuid, reqVO.getUserUuid())
+                .eqIfPresent(OaRenewDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaRenewDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(OaRenewDO::getPosition, reqVO.getPosition())
+                .betweenIfPresent(OaRenewDO::getOldContractStartDate, reqVO.getOldContractStartDate())
+                .betweenIfPresent(OaRenewDO::getOldContractEndDate, reqVO.getOldContractEndDate())
+                .eqIfPresent(OaRenewDO::getRenewPeriod, reqVO.getRenewPeriod())
+                .betweenIfPresent(OaRenewDO::getRenewContractStartDate, reqVO.getRenewContractStartDate())
+                .betweenIfPresent(OaRenewDO::getRenewContractEndDate, reqVO.getRenewContractEndDate())
+                .eqIfPresent(OaRenewDO::getRenewReason, reqVO.getRenewReason())
+                .eqIfPresent(OaRenewDO::getWorkPerformance, reqVO.getWorkPerformance())
+                .eqIfPresent(OaRenewDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(OaRenewDO::getProcInstId, reqVO.getProcInstId())
+                .eqIfPresent(OaRenewDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(OaRenewDO::getCurrentAuditUserId, reqVO.getCurrentAuditUserId())
+                .eqIfPresent(OaRenewDO::getCurrentAuditUserUuid, reqVO.getCurrentAuditUserUuid())
+                .eqIfPresent(OaRenewDO::getCurrentAuditEmployeeId, reqVO.getCurrentAuditEmployeeId())
+                .eqIfPresent(OaRenewDO::getCurrentAuditEmployeeUuid, reqVO.getCurrentAuditEmployeeUuid())
+                .betweenIfPresent(OaRenewDO::getFinalAuditDate, reqVO.getFinalAuditDate())
+                .eqIfPresent(OaRenewDO::getInfoSource, reqVO.getInfoSource())
+                .betweenIfPresent(OaRenewDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(OaRenewDO::getId));
+    }
+
+}

+ 46 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/universal/OaUniversalMapper.java

@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.universal;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.universal.OaUniversalDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 通用事项审批流程信息 Mapper
+ *
+ * @author dp
+ */
+@Mapper
+public interface OaUniversalMapper extends BaseMapperX<OaUniversalDO> {
+
+    default PageResult<OaUniversalDO> selectPage(OaUniversalPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaUniversalDO>()
+                .eqIfPresent(OaUniversalDO::getUniversalId, reqVO.getUniversalId())
+                .eqIfPresent(OaUniversalDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(OaUniversalDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(OaUniversalDO::getEmployeeName, reqVO.getEmployeeName())
+                .likeIfPresent(OaUniversalDO::getEmployeePhone, reqVO.getEmployeePhone())
+                .eqIfPresent(OaUniversalDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(OaUniversalDO::getUserUuid, reqVO.getUserUuid())
+                .likeIfPresent(OaUniversalDO::getUserPhone, reqVO.getUserPhone())
+                .eqIfPresent(OaUniversalDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaUniversalDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(OaUniversalDO::getPosition, reqVO.getPosition())
+                .likeIfPresent(OaUniversalDO::getTitle, reqVO.getTitle())
+                .eqIfPresent(OaUniversalDO::getDescription, reqVO.getDescription())
+                .eqIfPresent(OaUniversalDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(OaUniversalDO::getProcInstId, reqVO.getProcInstId())
+                .eqIfPresent(OaUniversalDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(OaUniversalDO::getCurrentAuditUserId, reqVO.getCurrentAuditUserId())
+                .eqIfPresent(OaUniversalDO::getCurrentAuditUserUuid, reqVO.getCurrentAuditUserUuid())
+                .eqIfPresent(OaUniversalDO::getCurrentAuditEmployeeId, reqVO.getCurrentAuditEmployeeId())
+                .eqIfPresent(OaUniversalDO::getCurrentAuditEmployeeUuid, reqVO.getCurrentAuditEmployeeUuid())
+                .betweenIfPresent(OaUniversalDO::getFinalAuditDate, reqVO.getFinalAuditDate())
+                .eqIfPresent(OaUniversalDO::getInfoSource, reqVO.getInfoSource())
+                .betweenIfPresent(OaUniversalDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(OaUniversalDO::getId));
+    }
+
+}

+ 4 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.BpmActivityB
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.event.BpmProcessInstanceEventPublisher;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskAssignRuleService;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
 import org.flowable.spring.SpringProcessEngineConfiguration;
@@ -68,9 +69,10 @@ public class BpmFlowableConfiguration {
     // =========== 审批人相关的 Bean ==========
 
     @Bean
-    public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskCandidateInvoker bpmTaskCandidateInvoker) {
+    public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskAssignRuleService taskRuleService) {
         BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory();
-        bpmActivityBehaviorFactory.setTaskCandidateInvoker(bpmTaskCandidateInvoker);
+        bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService);
+//        bpmActivityBehaviorFactory.setTaskCandidateInvoker(bpmTaskCandidateInvoker);
         return bpmActivityBehaviorFactory;
     }
 

+ 8 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior;
 
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskAssignRuleService;
 import lombok.Setter;
 import org.flowable.bpmn.model.Activity;
 import org.flowable.bpmn.model.UserTask;
@@ -21,24 +22,27 @@ public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory {
 
     private BpmTaskCandidateInvoker taskCandidateInvoker;
 
+    @Setter
+    private BpmTaskAssignRuleService bpmTaskRuleService;
+
     @Override
-    public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) {
+    public BpmUserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) {
         return new BpmUserTaskActivityBehavior(userTask)
-                .setTaskCandidateInvoker(taskCandidateInvoker);
+                .setBpmTaskRuleService(bpmTaskRuleService);
     }
 
     @Override
     public ParallelMultiInstanceBehavior createParallelMultiInstanceBehavior(Activity activity,
                                                                              AbstractBpmnActivityBehavior behavior) {
         return new BpmParallelMultiInstanceBehavior(activity, behavior)
-                .setTaskCandidateInvoker(taskCandidateInvoker);
+                .setBpmTaskRuleService(bpmTaskRuleService);
     }
 
     @Override
     public SequentialMultiInstanceBehavior createSequentialMultiInstanceBehavior(Activity activity,
                                                                                  AbstractBpmnActivityBehavior behavior) {
         return new BpmSequentialMultiInstanceBehavior(activity, behavior)
-                .setTaskCandidateInvoker(taskCandidateInvoker);
+                .setBpmTaskRuleService(bpmTaskRuleService);
     }
 
 }

+ 6 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior;
 
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskAssignRuleService;
 import lombok.Setter;
 import org.flowable.bpmn.model.Activity;
 import org.flowable.engine.delegate.DelegateExecution;
@@ -23,6 +24,9 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
 
     private BpmTaskCandidateInvoker taskCandidateInvoker;
 
+    @Setter
+    private BpmTaskAssignRuleService bpmTaskRuleService;
+
     public BpmParallelMultiInstanceBehavior(Activity activity,
                                             AbstractBpmnActivityBehavior innerActivityBehavior) {
         super(activity, innerActivityBehavior);
@@ -48,7 +52,8 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
         super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
 
         // 第二步,获取任务的所有处理人
-        Set<Long> assigneeUserIds = taskCandidateInvoker.calculateUsers(execution);
+//        Set<Long> assigneeUserIds = taskCandidateInvoker.calculateUsers(execution);
+        Set<Long> assigneeUserIds = bpmTaskRuleService.calculateTaskCandidateUsers(execution);
         execution.setVariable(super.collectionVariable, assigneeUserIds);
         return assigneeUserIds.size();
     }

+ 8 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior;
 
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskAssignRuleService;
 import lombok.Setter;
 import org.flowable.bpmn.model.Activity;
 import org.flowable.engine.delegate.DelegateExecution;
@@ -23,6 +24,9 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
 
     private BpmTaskCandidateInvoker taskCandidateInvoker;
 
+    @Setter
+    private BpmTaskAssignRuleService bpmTaskRuleService;
+
     public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) {
         super(activity, innerActivityBehavior);
     }
@@ -42,7 +46,10 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
         super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
 
         // 第二步,获取任务的所有处理人
-        Set<Long> assigneeUserIds = new LinkedHashSet<>(taskCandidateInvoker.calculateUsers(execution)); // 保证有序!!!
+//        Set<Long> assigneeUserIds = new LinkedHashSet<>(taskCandidateInvoker.calculateUsers(execution)); // 保证有序!!!
+        // 第二步,获取任务的所有处理人
+        Set<Long> assigneeUserIds = bpmTaskRuleService.calculateTaskCandidateUsers(execution);
+
         execution.setVariable(super.collectionVariable, assigneeUserIds);
         return assigneeUserIds.size();
     }

+ 9 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.RandomUtil;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskAssignRuleService;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import org.flowable.bpmn.model.UserTask;
@@ -14,7 +15,9 @@ import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
 import org.flowable.engine.impl.util.TaskHelper;
 import org.flowable.task.service.TaskService;
 import org.flowable.task.service.impl.persistence.entity.TaskEntity;
+import org.springframework.context.annotation.Lazy;
 
+import javax.annotation.Resource;
 import java.util.List;
 import java.util.Set;
 
@@ -26,10 +29,12 @@ import java.util.Set;
  * @author 芋道源码
  */
 @Slf4j
+@Setter
 public class BpmUserTaskActivityBehavior extends UserTaskActivityBehavior {
 
+
     @Setter
-    private BpmTaskCandidateInvoker taskCandidateInvoker;
+    private BpmTaskAssignRuleService bpmTaskRuleService;
 
     public BpmUserTaskActivityBehavior(UserTask userTask) {
         super(userTask);
@@ -55,7 +60,9 @@ public class BpmUserTaskActivityBehavior extends UserTaskActivityBehavior {
 
         // 情况二,如果非多实例的任务,则计算任务处理人
         // 第一步,先计算可处理该任务的处理人们
-        Set<Long> candidateUserIds = taskCandidateInvoker.calculateUsers(execution);
+//        Set<Long> candidateUserIds = taskCandidateInvoker.calculateUsers(execution);
+        Set<Long> candidateUserIds = bpmTaskRuleService.calculateTaskCandidateUsers(execution);
+
         // 第二步,后随机选择一个任务的处理人
         // 疑问:为什么一定要选择一个任务处理人?
         // 解答:项目对 bpm 的任务是责任到人,所以每个任务有且仅有一个处理人。

+ 48 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignApplySelectScript.java

@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
+
+import cn.hutool.core.lang.Assert;
+import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
+import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 分配给 申请人自选 审批的 Script 实现类
+ *
+ * @author dp
+ */
+@Component
+public class BpmTaskAssignApplySelectScript implements BpmTaskAssignScript {
+
+    @Resource
+    @Lazy // 解决循环依赖
+    private BpmProcessInstanceService bpmProcessInstanceService;
+
+    @Override
+    public Set<Long> calculateTaskCandidateUsers(DelegateExecution execution) {
+        ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId());
+        Assert.notNull(processInstance, "流程实例({})不能为空", execution.getProcessInstanceId());
+        Map<String, List<Long>> startUserSelectAssignees = FlowableUtils.getStartUserSelectAssignees(processInstance);
+        Assert.notNull(startUserSelectAssignees, "流程实例({}) 的申请人自选审批人不能为空",
+                execution.getProcessInstanceId());
+        // 获得审批人
+        List<Long> assignees = startUserSelectAssignees.get(execution.getCurrentActivityId());
+        return new LinkedHashSet<>(assignees);
+    }
+
+    @Override
+    public BpmTaskRuleScriptEnum getEnum() {
+        return BpmTaskRuleScriptEnum.APPLY_SELECT;
+    }
+
+}

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/strategy/BpmTaskCandidateGroupStrategy.java

@@ -41,7 +41,7 @@ public class BpmTaskCandidateGroupStrategy implements BpmTaskCandidateStrategy {
     public Set<Long> calculateUsers(DelegateExecution execution, String param) {
         Set<Long> groupIds = StrUtils.splitToLongSet(param);
         List<BpmUserGroupDO> groups = userGroupService.getUserGroupList(groupIds);
-        return convertSetByFlatMap(groups, BpmUserGroupDO::getMemberUserIds, Collection::stream);
+        return convertSetByFlatMap(groups, BpmUserGroupDO::getUserIds, Collection::stream);
     }
 
 }

+ 2 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java

@@ -23,4 +23,6 @@ public interface BpmnModelConstants {
      */
     String USER_TASK_CANDIDATE_PARAM = "candidateParam";
 
+
+
 }

+ 18 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java

@@ -16,6 +16,8 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCand
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
+import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskAssignRuleService;
 import lombok.extern.slf4j.Slf4j;
 import org.flowable.bpmn.converter.BpmnXMLConverter;
 import org.flowable.bpmn.model.BpmnModel;
@@ -39,6 +41,7 @@ import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS;
 
 /**
  * Flowable流程模型实现
@@ -63,6 +66,9 @@ public class BpmModelServiceImpl implements BpmModelService {
     @Resource
     private BpmTaskCandidateInvoker taskCandidateInvoker;
 
+    @Resource
+    private BpmTaskAssignRuleService taskAssignRuleService;
+
     @Override
     public PageResult<Model> getModelPage(BpmModelPageReqVO pageVO) {
         ModelQuery modelQuery = repositoryService.createModelQuery();
@@ -142,8 +148,16 @@ public class BpmModelServiceImpl implements BpmModelService {
         BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
         BpmFormDO form = validateFormConfig(metaInfo);
         // 1.4 校验任务分配规则已配置
-        taskCandidateInvoker.validateBpmnConfig(bpmnBytes);
+        taskAssignRuleService.checkTaskAssignRuleAllConfig(id);
 
+        // 1.5 校验模型是否发生修改。如果未修改,则不允许创建
+        BpmProcessDefinitionCreateReqDTO definitionCreateReqDTO = BpmModelConvert.INSTANCE.convert2(model, form).setBpmnBytes(bpmnBytes);
+        if (processDefinitionService.isProcessDefinitionEquals(definitionCreateReqDTO)) { // 流程定义的信息相等
+            ProcessDefinition oldProcessDefinition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
+            if (oldProcessDefinition != null && taskAssignRuleService.isTaskAssignRulesEquals(model.getId(), oldProcessDefinition.getId())) {
+                throw exception(MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS);
+            }
+        }
         // 2.1 创建流程定义
         String definitionId = processDefinitionService.createProcessDefinition(model, metaInfo, bpmnBytes, form);
 
@@ -154,6 +168,9 @@ public class BpmModelServiceImpl implements BpmModelService {
         ProcessDefinition definition = processDefinitionService.getProcessDefinition(definitionId);
         model.setDeploymentId(definition.getDeploymentId());
         repositoryService.saveModel(model);
+
+        // 2.4 复制任务分配规则
+        taskAssignRuleService.copyTaskAssignRules(id, definition.getId());
     }
 
     private void validateBpmnXml(byte[] bpmnBytes) {

+ 31 - 5
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java

@@ -3,13 +3,15 @@ package cn.iocoder.yudao.module.bpm.service.definition;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
+import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
 import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.engine.repository.Deployment;
 import org.flowable.engine.repository.Model;
 import org.flowable.engine.repository.ProcessDefinition;
 
+import javax.validation.Valid;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -75,7 +77,7 @@ public interface BpmProcessDefinitionService {
      * @param id 流程定义编号
      * @return 流程定义信息
      */
-    BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id);
+    BpmProcessDefinitionExtDO getProcessDefinitionInfo(String id);
 
     /**
      * 获得流程定义的信息 List
@@ -83,10 +85,10 @@ public interface BpmProcessDefinitionService {
      * @param ids 流程定义编号数组
      * @return 流程额定义信息数组
      */
-    List<BpmProcessDefinitionInfoDO> getProcessDefinitionInfoList(Collection<String> ids);
+    List<BpmProcessDefinitionExtDO> getProcessDefinitionInfoList(Collection<String> ids);
 
-    default Map<String, BpmProcessDefinitionInfoDO> getProcessDefinitionInfoMap(Set<String> ids) {
-        return convertMap(getProcessDefinitionInfoList(ids), BpmProcessDefinitionInfoDO::getProcessDefinitionId);
+    default Map<String, BpmProcessDefinitionExtDO> getProcessDefinitionInfoMap(Set<String> ids) {
+        return convertMap(getProcessDefinitionInfoList(ids), BpmProcessDefinitionExtDO::getProcessDefinitionId);
     }
 
     /**
@@ -167,4 +169,28 @@ public interface BpmProcessDefinitionService {
      */
     BpmnModel getBpmnModel(String processDefinitionId);
 
+    /**
+     * 获得需要创建的流程定义,是否和当前激活的流程定义相等
+     *
+     * @param createReqDTO 创建信息
+     * @return 是否相等
+     */
+    boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO);
+
+    /**
+     * 获得编号对应的 BpmProcessDefinitionExtDO
+     *
+     * @param id 编号
+     * @return 流程定义拓展
+     */
+    BpmProcessDefinitionExtDO getProcessDefinitionExt(String id);
+
+
+    /**
+     * 获得流程定义对应的 BPMN XML
+     *
+     * @param id 流程定义编号
+     * @return BPMN XML
+     */
+    String getProcessDefinitionBpmnXML(String id);
 }

+ 70 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java

@@ -1,20 +1,24 @@
 package cn.iocoder.yudao.module.bpm.service.definition;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionInfoMapper;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
+import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
 import lombok.extern.slf4j.Slf4j;
+import org.flowable.bpmn.converter.BpmnXMLConverter;
 import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.common.engine.impl.db.SuspensionState;
+import org.flowable.common.engine.impl.util.io.BytesStreamSource;
 import org.flowable.engine.RepositoryService;
 import org.flowable.engine.repository.Deployment;
 import org.flowable.engine.repository.Model;
@@ -24,6 +28,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -128,7 +133,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
         }
 
         // 插入拓展表
-        BpmProcessDefinitionInfoDO definitionDO = BeanUtils.toBean(modelMetaInfo, BpmProcessDefinitionInfoDO.class)
+        BpmProcessDefinitionExtDO definitionDO = BeanUtils.toBean(modelMetaInfo, BpmProcessDefinitionExtDO.class)
                 .setModelId(model.getId()).setProcessDefinitionId(definition.getId());
         if (form != null) {
             definitionDO.setFormFields(form.getFields()).setFormConf(form.getConf());
@@ -160,12 +165,12 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
     }
 
     @Override
-    public BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id) {
+    public BpmProcessDefinitionExtDO getProcessDefinitionInfo(String id) {
         return processDefinitionMapper.selectByProcessDefinitionId(id);
     }
 
     @Override
-    public List<BpmProcessDefinitionInfoDO> getProcessDefinitionInfoList(Collection<String> ids) {
+    public List<BpmProcessDefinitionExtDO> getProcessDefinitionInfoList(Collection<String> ids) {
         return processDefinitionMapper.selectListByProcessDefinitionIds(ids);
     }
 
@@ -204,4 +209,65 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
         return repositoryService.getBpmnModel(processDefinitionId);
     }
 
+    @Override
+    public boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
+        // 校验 name、description 是否更新
+        ProcessDefinition oldProcessDefinition = getActiveProcessDefinition(createReqDTO.getKey());
+        if (oldProcessDefinition == null) {
+            return false;
+        }
+        BpmProcessDefinitionExtDO oldProcessDefinitionExt = getProcessDefinitionExt(oldProcessDefinition.getId());
+        if (!StrUtil.equals(createReqDTO.getName(), oldProcessDefinition.getName())
+                || !StrUtil.equals(createReqDTO.getDescription(), oldProcessDefinitionExt.getDescription())
+                || !StrUtil.equals(createReqDTO.getCategory(), oldProcessDefinition.getCategory())) {
+            return false;
+        }
+        // 校验 form 信息是否更新
+        if (!ObjectUtil.equal(createReqDTO.getFormType(), oldProcessDefinitionExt.getFormType())
+                || !ObjectUtil.equal(createReqDTO.getFormId(), oldProcessDefinitionExt.getFormId())
+                || !ObjectUtil.equal(createReqDTO.getFormConf(), oldProcessDefinitionExt.getFormConf())
+                || !ObjectUtil.equal(createReqDTO.getFormFields(), oldProcessDefinitionExt.getFormFields())
+                || !ObjectUtil.equal(createReqDTO.getFormCustomCreatePath(), oldProcessDefinitionExt.getFormCustomCreatePath())
+                || !ObjectUtil.equal(createReqDTO.getFormCustomViewPath(), oldProcessDefinitionExt.getFormCustomViewPath())) {
+            return false;
+        }
+        // 校验 BPMN XML 信息
+        BpmnModel newModel = buildBpmnModel(createReqDTO.getBpmnBytes());
+        BpmnModel oldModel = getBpmnModel(oldProcessDefinition.getId());
+        // 对比字节变化
+        if (!cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils.equals(oldModel, newModel)) {
+            return false;
+        }
+        // 最终发现都一致,则返回 true
+        return true;
+    }
+
+
+    @Override
+    public BpmProcessDefinitionExtDO getProcessDefinitionExt(String id) {
+        return processDefinitionMapper.selectByProcessDefinitionId(id);
+    }
+
+    /**
+     * 构建对应的 BPMN Model
+     *
+     * @param bpmnBytes 原始的 BPMN XML 字节数组
+     * @return BPMN Model
+     */
+    private  BpmnModel buildBpmnModel(byte[] bpmnBytes) {
+        // 转换成 BpmnModel 对象
+        BpmnXMLConverter converter = new BpmnXMLConverter();
+        return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true);
+    }
+
+    @Override
+    public String getProcessDefinitionBpmnXML(String id) {
+        BpmnModel bpmnModel = repositoryService.getBpmnModel(id);
+        if (bpmnModel == null) {
+            return null;
+        }
+        BpmnXMLConverter converter = new BpmnXMLConverter();
+        return StrUtil.utf8Str(converter.convertToXML(bpmnModel));
+    }
+
 }

+ 2 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.bpm.service.definition.dto;
 
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
 import lombok.Data;
 
@@ -7,7 +8,7 @@ import lombok.Data;
  * BPM 流程 MetaInfo Response DTO
  * 主要用于 { Model#setMetaInfo(String)} 的存储
  *
- * 最终,它的字段和 {@link cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO} 是一致的
+ * 最终,它的字段和 {@link BpmProcessDefinitionExtDO} 是一致的
  *
  * @author 芋道源码
  */

+ 66 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/conversion/OaConversionService.java

@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.bpm.service.oa.conversion;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.conversion.OaConversionDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.validation.Valid;
+
+/**
+ * 转正流程信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface OaConversionService extends IService<OaConversionDO>{
+
+    Long startOaConversion(Long userId, @Valid OaConversionSaveReqVO createReqVO);
+
+    Long completeTrueOaConversion(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long completeFalseOaConversion(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long updateCompleteOaConversion(Long userId, @Valid OaConversionSaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+
+
+    /**
+     * 创建转正流程信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createOaConversion(@Valid OaConversionSaveReqVO createReqVO);
+
+    /**
+     * 更新转正流程信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOaConversion(@Valid OaConversionSaveReqVO updateReqVO);
+
+    /**
+     * 删除转正流程信息
+     *
+     * @param id 编号
+     */
+    void deleteOaConversion(Long id);
+
+    /**
+     * 获得转正流程信息
+     *
+     * @param id 编号
+     * @return 转正流程信息
+     */
+    OaConversionDO getOaConversion(Long id);
+
+    /**
+     * 获得转正流程信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 转正流程信息分页
+     */
+    PageResult<OaConversionDO> getOaConversionPage(OaConversionPageReqVO pageReqVO);
+
+}

+ 254 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/conversion/OaConversionServiceImpl.java

@@ -0,0 +1,254 @@
+package cn.iocoder.yudao.module.bpm.service.oa.conversion;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.conversion.OaConversionDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.conversion.OaConversionMapper;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_CONVERSION_NOT_EXISTS;
+
+/**
+ * 转正流程信息 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class OaConversionServiceImpl extends ServiceImpl<OaConversionMapper, OaConversionDO> implements OaConversionService {
+
+    /**
+     * OA 转正对应的流程定义 KEY
+     */
+    public static final String PROCESS_KEY = "oa_conversion";
+
+    @Resource
+    private OaConversionMapper oaConversionMapper;
+
+    @Resource
+    private BpmProcessInstanceApi processInstanceApi;
+
+    @Resource
+    private BpmTaskService bpmTaskService;
+
+    @Resource
+    private TaskService taskService;
+
+
+    @Override
+    @Transactional
+    public Long startOaConversion(Long userId, OaConversionSaveReqVO createReqVO) {
+        //判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+        // 创建单据uuid
+        String uuid = IdUtil.fastSimpleUUID();
+        OaConversionDO oaConversion = BeanUtils.toBean(createReqVO, OaConversionDO.class);
+        if (StringUtils.isBlank(oaConversion.getConversionId())) {
+            oaConversion.setConversionId(uuid);
+        }
+        // 保存或更新表单信息
+        this.saveOrUpdate(oaConversion);
+
+        // 提交
+        if (auditPass) {
+            // 发起 BPM 流程
+            Map<String, Object> processInstanceVariables = new HashMap<>();
+            processInstanceVariables.put("auditPass", auditPass);
+            //添加审批人信息
+            Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
+            startUserSelectAssignees.put("approver", createReqVO.getStartUserSelectAssignees());
+            String processInstanceId = processInstanceApi
+                    .createProcessInstance(userId,
+                            new BpmProcessInstanceCreateReqDTO()
+                                    .setProcessDefinitionKey(PROCESS_KEY)
+                                    .setVariables(processInstanceVariables)
+                                    .setBusinessKey(String.valueOf(oaConversion.getId()))
+                                    .setStartUserSelectAssignees(startUserSelectAssignees));
+
+            //获取下一个审批人
+            Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+
+            // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 转正中
+            oaConversionMapper.updateById(new OaConversionDO()
+                    .setId(oaConversion.getId())
+                    .setProcInstId(processInstanceId)
+                    .setAuditStatus("1")
+                    .setConversionId(uuid)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee())));
+
+            // TODO 发送通知
+
+        }else {
+            // 暂存,不发起流程
+            // 将单据状态 更新到 OA转正中
+            oaConversionMapper.updateById(new OaConversionDO()
+                    .setId(oaConversion.getId())
+                    .setAuditStatus("0"));
+        }
+
+        // TODO 保存或更新附件uuid
+        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+        }
+
+        // 返回
+        return oaConversion.getId();
+    }
+    @Override
+    public Long completeTrueOaConversion(Long userId, BpmTaskApproveReqVO reqVO) {
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+        // 审批同意
+        bpmTaskService.approveTask(userId, reqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        if (nextTask != null) {
+            LambdaUpdateWrapper<OaConversionDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaConversionDO::getAuditStatus, "2")
+                    .set(OaConversionDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                    .set(OaConversionDO::getFinalAuditDate, new Date())
+                    .eq(OaConversionDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaConversionMapper.update(updateWrapper);
+        } else {
+            LambdaUpdateWrapper<OaConversionDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaConversionDO::getAuditStatus, "3")
+                    .set(OaConversionDO::getCurrentAuditEmployeeId, null)
+                    .set(OaConversionDO::getFinalAuditDate, new Date())
+                    .eq(OaConversionDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaConversionMapper.update(updateWrapper);
+
+            // TODO 复制业务单据信息到业务模块单据表
+
+        }
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long completeFalseOaConversion(Long userId, BpmTaskApproveReqVO reqVO) {
+
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+
+        BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
+        reqVO2.setTargetTaskDefinitionKey("modifyApply");
+        bpmTaskService.returnTask(userId, reqVO2);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaConversionDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaConversionDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaConversionDO::getFinalAuditDate, new Date())
+                .set(OaConversionDO::getAuditStatus, "0")
+                .eq(OaConversionDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaConversionMapper.update(updateWrapper);
+
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long updateCompleteOaConversion(Long userId, OaConversionSaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
+        // 判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+
+        OaConversionDO oaConversion = BeanUtils.toBean(createReqVO, OaConversionDO.class);
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaConversion.getProcInstId()).singleResult();
+
+        //审批通过
+        bpmTaskService.approveTask(userId, reqVO);
+
+        // 提交
+        if (auditPass) {
+            Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+            oaConversion.setAuditStatus("1");
+            oaConversion.setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()));
+            oaConversion.setFinalAuditDate(LocalDateTime.now());
+            oaConversionMapper.updateById(oaConversion);
+
+        } else {
+            OaConversionDO oaConversionClose = new OaConversionDO();
+            oaConversionClose.setId(oaConversion.getId());
+            oaConversionClose.setAuditStatus("4");
+            oaConversionClose.setCurrentAuditEmployeeId(null);
+            oaConversionClose.setFinalAuditDate(LocalDateTime.now());
+            oaConversionMapper.updateById(oaConversionClose);
+        }
+
+        return oaConversion.getId();
+    }
+
+
+
+    @Override
+    public Long createOaConversion(OaConversionSaveReqVO createReqVO) {
+        // 插入
+        OaConversionDO oaConversion = BeanUtils.toBean(createReqVO, OaConversionDO.class);
+        oaConversionMapper.insert(oaConversion);
+        // 返回
+        return oaConversion.getId();
+    }
+
+    @Override
+    public void updateOaConversion(OaConversionSaveReqVO updateReqVO) {
+        // 校验存在
+        validateOaConversionExists(updateReqVO.getId());
+        // 更新
+        OaConversionDO updateObj = BeanUtils.toBean(updateReqVO, OaConversionDO.class);
+        oaConversionMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteOaConversion(Long id) {
+        // 校验存在
+        validateOaConversionExists(id);
+        // 删除
+        oaConversionMapper.deleteById(id);
+    }
+
+    private void validateOaConversionExists(Long id) {
+        if (oaConversionMapper.selectById(id) == null) {
+            throw exception(OA_CONVERSION_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public OaConversionDO getOaConversion(Long id) {
+        return oaConversionMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<OaConversionDO> getOaConversionPage(OaConversionPageReqVO pageReqVO) {
+        return oaConversionMapper.selectPage(pageReqVO);
+    }
+
+}

+ 66 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/dimission/OaDimissionService.java

@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.bpm.service.oa.dimission;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo.OaDimissionPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo.OaDimissionSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.dimission.OaDimissionDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.validation.Valid;
+
+/**
+ * 离职流程信息 Service 接口
+ *
+ * @author dp
+ */
+public interface OaDimissionService extends IService<OaDimissionDO> {
+
+    Long startOaDimission(Long userId, @Valid OaDimissionSaveReqVO createReqVO);
+
+    Long completeTrueOaDimission(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long completeFalseOaDimission(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long updateCompleteOaDimission(Long userId, @Valid OaDimissionSaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+    
+
+    /**
+     * 创建离职流程信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createOaDimission(@Valid OaDimissionSaveReqVO createReqVO);
+
+    /**
+     * 更新离职流程信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOaDimission(@Valid OaDimissionSaveReqVO updateReqVO);
+
+    /**
+     * 删除离职流程信息
+     *
+     * @param id 编号
+     */
+    void deleteOaDimission(Long id);
+
+    /**
+     * 获得离职流程信息
+     *
+     * @param id 编号
+     * @return 离职流程信息
+     */
+    OaDimissionDO getOaDimission(Long id);
+
+    /**
+     * 获得离职流程信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 离职流程信息分页
+     */
+    PageResult<OaDimissionDO> getOaDimissionPage(OaDimissionPageReqVO pageReqVO);
+
+}

+ 254 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/dimission/OaDimissionServiceImpl.java

@@ -0,0 +1,254 @@
+package cn.iocoder.yudao.module.bpm.service.oa.dimission;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo.OaDimissionPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo.OaDimissionSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.dimission.OaDimissionDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.dimission.OaDimissionMapper;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_DIMISSION_NOT_EXISTS;
+
+/**
+ * 离职流程信息 Service 实现类
+ *
+ * @author dp
+ */
+@Service
+@Validated
+public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDimissionDO> implements OaDimissionService {
+
+
+    /**
+     * OA 离职对应的流程定义 KEY
+     */
+    public static final String PROCESS_KEY = "oa_dimission";
+
+
+    @Resource
+    private OaDimissionMapper oaDimissionMapper;
+
+    @Resource
+    private BpmProcessInstanceApi processInstanceApi;
+
+    @Resource
+    private BpmTaskService bpmTaskService;
+
+    @Resource
+    private TaskService taskService;
+
+    @Override
+    @Transactional
+    public Long startOaDimission(Long userId, OaDimissionSaveReqVO createReqVO) {
+        //判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+        // 创建单据uuid
+        String uuid = IdUtil.fastSimpleUUID();
+        OaDimissionDO oaDimission = BeanUtils.toBean(createReqVO, OaDimissionDO.class);
+        if (StringUtils.isBlank(oaDimission.getDimissionId())) {
+            oaDimission.setDimissionId(uuid);
+        }
+        // 保存或更新表单信息
+        this.saveOrUpdate(oaDimission);
+
+        // 提交
+        if (auditPass) {
+            // 发起 BPM 流程
+            Map<String, Object> processInstanceVariables = new HashMap<>();
+            processInstanceVariables.put("auditPass", auditPass);
+            //添加审批人信息
+            Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
+            startUserSelectAssignees.put("approver", createReqVO.getStartUserSelectAssignees());
+            String processInstanceId = processInstanceApi
+                    .createProcessInstance(userId,
+                            new BpmProcessInstanceCreateReqDTO()
+                                    .setProcessDefinitionKey(PROCESS_KEY)
+                                    .setVariables(processInstanceVariables)
+                                    .setBusinessKey(String.valueOf(oaDimission.getId()))
+                                    .setStartUserSelectAssignees(startUserSelectAssignees));
+
+            //获取下一个审批人
+            Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+
+            // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 转正中
+            oaDimissionMapper.updateById(new OaDimissionDO()
+                    .setId(oaDimission.getId())
+                    .setProcInstId(processInstanceId)
+                    .setAuditStatus("1")
+                    .setDimissionId(uuid)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee())));
+
+            // TODO 发送通知
+
+        }else {
+            // 暂存,不发起流程
+            // 将单据状态 更新到 OA转正中
+            oaDimissionMapper.updateById(new OaDimissionDO()
+                    .setId(oaDimission.getId())
+                    .setAuditStatus("0"));
+        }
+
+        // TODO 保存或更新附件uuid
+        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+        }
+
+        // 返回
+        return oaDimission.getId();
+    }
+    @Override
+    public Long completeTrueOaDimission(Long userId, BpmTaskApproveReqVO reqVO) {
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+        // 审批同意
+        bpmTaskService.approveTask(userId, reqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        if (nextTask != null) {
+            LambdaUpdateWrapper<OaDimissionDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaDimissionDO::getAuditStatus, "2")
+                    .set(OaDimissionDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                    .set(OaDimissionDO::getFinalAuditDate, new Date())
+                    .eq(OaDimissionDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaDimissionMapper.update(updateWrapper);
+        } else {
+            LambdaUpdateWrapper<OaDimissionDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaDimissionDO::getAuditStatus, "3")
+                    .set(OaDimissionDO::getCurrentAuditEmployeeId, null)
+                    .set(OaDimissionDO::getFinalAuditDate, new Date())
+                    .eq(OaDimissionDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaDimissionMapper.update(updateWrapper);
+
+            // TODO 复制业务单据信息到业务模块单据表
+
+        }
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long completeFalseOaDimission(Long userId, BpmTaskApproveReqVO reqVO) {
+
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+
+        BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
+        reqVO2.setTargetTaskDefinitionKey("modifyApply");
+        bpmTaskService.returnTask(userId, reqVO2);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaDimissionDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaDimissionDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaDimissionDO::getFinalAuditDate, new Date())
+                .set(OaDimissionDO::getAuditStatus, "0")
+                .eq(OaDimissionDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaDimissionMapper.update(updateWrapper);
+
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long updateCompleteOaDimission(Long userId, OaDimissionSaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
+        // 判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+
+        OaDimissionDO oaDimission = BeanUtils.toBean(createReqVO, OaDimissionDO.class);
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaDimission.getProcInstId()).singleResult();
+
+        //审批通过
+        bpmTaskService.approveTask(userId, reqVO);
+
+        // 提交
+        if (auditPass) {
+            Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+            oaDimission.setAuditStatus("1");
+            oaDimission.setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()));
+            oaDimission.setFinalAuditDate(LocalDateTime.now());
+            oaDimissionMapper.updateById(oaDimission);
+
+        } else {
+            OaDimissionDO oaDimissionClose = new OaDimissionDO();
+            oaDimissionClose.setId(oaDimission.getId());
+            oaDimissionClose.setAuditStatus("4");
+            oaDimissionClose.setCurrentAuditEmployeeId(null);
+            oaDimissionClose.setFinalAuditDate(LocalDateTime.now());
+            oaDimissionMapper.updateById(oaDimissionClose);
+        }
+
+        return oaDimission.getId();
+    }
+
+
+    @Override
+    public Long createOaDimission(OaDimissionSaveReqVO createReqVO) {
+        // 插入
+        OaDimissionDO oaDimission = BeanUtils.toBean(createReqVO, OaDimissionDO.class);
+        oaDimissionMapper.insert(oaDimission);
+        // 返回
+        return oaDimission.getId();
+    }
+
+    @Override
+    public void updateOaDimission(OaDimissionSaveReqVO updateReqVO) {
+        // 校验存在
+        validateOaDimissionExists(updateReqVO.getId());
+        // 更新
+        OaDimissionDO updateObj = BeanUtils.toBean(updateReqVO, OaDimissionDO.class);
+        oaDimissionMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteOaDimission(Long id) {
+        // 校验存在
+        validateOaDimissionExists(id);
+        // 删除
+        oaDimissionMapper.deleteById(id);
+    }
+
+    private void validateOaDimissionExists(Long id) {
+        if (oaDimissionMapper.selectById(id) == null) {
+            throw exception(OA_DIMISSION_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public OaDimissionDO getOaDimission(Long id) {
+        return oaDimissionMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<OaDimissionDO> getOaDimissionPage(OaDimissionPageReqVO pageReqVO) {
+        return oaDimissionMapper.selectPage(pageReqVO);
+    }
+
+}

+ 86 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/entry/OaEntryService.java

@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.bpm.service.oa.entry;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntryPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntrySaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry.OaEntryDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.validation.Valid;
+
+/**
+ * 入职流程信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface OaEntryService extends IService<OaEntryDO> {
+
+    /**
+     * 发起入职流程信息
+     *
+     * @param userId
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Integer startOaEntry(Long userId, @Valid OaEntrySaveReqVO createReqVO);
+
+    /**
+     * 审批同意入职流程信息
+     *
+     * @param userId
+     * @param reqVO  通过请求
+     * @return 编号
+     */
+    Integer completeTrueOaEntry(Long userId, BpmTaskApproveReqVO reqVO);
+
+    /**
+     * 驳回或撤回入职流程信息
+     *
+     * @param userId
+     * @param reqVO  驳回或撤回
+     * @return 编号
+     */
+    Integer completeFalseOaEntry(Long userId, BpmTaskApproveReqVO reqVO);
+
+    /**
+     * 驳回和撤回后再次提交或关闭入职流程信息
+     *
+     * @param userId
+     * @param createReqVO 创建信息
+     * @param reqVO       通过请求
+     * @return 编号
+     */
+    Integer updateCompleteOaEntry(Long userId, @Valid OaEntrySaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+
+    /**
+     * 更新入职流程信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOaEntry(@Valid OaEntrySaveReqVO updateReqVO);
+
+    /**
+     * 删除入职流程信息
+     *
+     * @param id 编号
+     */
+    void deleteOaEntry(Integer id);
+
+    /**
+     * 获得入职流程信息
+     *
+     * @param id 编号
+     * @return 入职流程信息
+     */
+    OaEntryDO getOaEntry(Integer id);
+
+    /**
+     * 获得入职流程信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 入职流程信息分页
+     */
+    PageResult<OaEntryDO> getOaEntryPage(OaEntryPageReqVO pageReqVO);
+
+}

+ 247 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/entry/OaEntryServiceImpl.java

@@ -0,0 +1,247 @@
+package cn.iocoder.yudao.module.bpm.service.oa.entry;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntryPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntrySaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry.OaEntryDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.entry.OaEntryMapper;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_ENTRY_NOT_EXISTS;
+
+/**
+ * 入职流程信息 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class OaEntryServiceImpl extends ServiceImpl<OaEntryMapper, OaEntryDO> implements OaEntryService {
+
+    /**
+     * OA 入职对应的流程定义 KEY
+     */
+    public static final String PROCESS_KEY = "oa_entry_workflow";
+
+    @Resource
+    private OaEntryMapper oaEntryMapper;
+
+    @Resource
+    private BpmProcessInstanceApi processInstanceApi;
+
+    @Resource
+    private BpmTaskService bpmTaskService;
+
+    @Resource
+    private TaskService taskService;
+
+    @Autowired
+    private RuntimeService runtimeService;
+
+    @Override
+    @Transactional
+    public Integer startOaEntry(Long userId, OaEntrySaveReqVO createReqVO) {
+        //判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+        // 创建单据uuid
+        String uuid = IdUtil.fastSimpleUUID();
+        OaEntryDO oaEntry = BeanUtils.toBean(createReqVO, OaEntryDO.class);
+        if (StringUtils.isBlank(oaEntry.getEntryId())) {
+            oaEntry.setEntryId(uuid);
+        }
+        // 保存或更新表单信息
+        this.saveOrUpdate(oaEntry);
+
+        // 提交
+        if (auditPass) {
+            // 发起 BPM 流程
+            Map<String, Object> processInstanceVariables = new HashMap<>();
+            processInstanceVariables.put("auditPass", auditPass);
+            //添加审批人信息
+            Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
+            startUserSelectAssignees.put("approver", createReqVO.getStartUserSelectAssignees());
+            String processInstanceId = processInstanceApi
+                    .createProcessInstance(userId,
+                            new BpmProcessInstanceCreateReqDTO()
+                                    .setProcessDefinitionKey(PROCESS_KEY)
+                                    .setVariables(processInstanceVariables)
+                                    .setBusinessKey(String.valueOf(oaEntry.getId()))
+                                    .setStartUserSelectAssignees(startUserSelectAssignees));
+
+            //获取下一个审批人
+            Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+
+            // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 入职中
+            oaEntryMapper.updateById(new OaEntryDO()
+                    .setId(oaEntry.getId())
+                    .setProcInstId(processInstanceId)
+                    .setAuditStatus("1")
+                    .setEntryId(uuid)
+                    .setFinalAuditDate(new Date())
+                    .setCurrentAuditEmployeeId(task.getAssignee()));
+
+            // TODO 发送通知
+
+        }else {
+            // 暂存,不发起流程
+            // 将单据状态 更新到 OA入职中
+            oaEntryMapper.updateById(new OaEntryDO()
+                    .setId(oaEntry.getId())
+                    .setAuditStatus("0"));
+        }
+
+        // TODO 保存或更新附件uuid
+        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+        }
+
+        // 返回
+        return oaEntry.getId();
+    }
+
+    @Override
+    public Integer completeTrueOaEntry(Long userId, BpmTaskApproveReqVO reqVO) {
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+        // 审批同意
+        bpmTaskService.approveTask(userId, reqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        if (nextTask != null) {
+            LambdaUpdateWrapper<OaEntryDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaEntryDO::getAuditStatus, "2")
+                    .set(OaEntryDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                    .set(OaEntryDO::getFinalAuditDate, new Date())
+                    .eq(OaEntryDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaEntryMapper.update(updateWrapper);
+        } else {
+            LambdaUpdateWrapper<OaEntryDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaEntryDO::getAuditStatus, "3")
+                    .set(OaEntryDO::getCurrentAuditEmployeeId, null)
+                    .set(OaEntryDO::getFinalAuditDate, new Date())
+                    .eq(OaEntryDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaEntryMapper.update(updateWrapper);
+
+            // TODO 复制业务单据信息到业务模块单据表
+
+        }
+        // 发送通知
+
+        // 返回
+        return 1;
+    }
+
+    @Override
+    public Integer completeFalseOaEntry(Long userId, BpmTaskApproveReqVO reqVO) {
+
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+
+        BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
+        reqVO2.setTargetTaskDefinitionKey("modifyApply");
+        bpmTaskService.returnTask(userId, reqVO2);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaEntryDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaEntryDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaEntryDO::getFinalAuditDate, new Date())
+                .set(OaEntryDO::getAuditStatus, "0")
+                .eq(OaEntryDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaEntryMapper.update(updateWrapper);
+
+        // 发送通知
+
+        // 返回
+        return 1;
+    }
+
+    @Override
+    public Integer updateCompleteOaEntry(Long userId, OaEntrySaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
+        // 判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+
+        OaEntryDO oaEntry = BeanUtils.toBean(createReqVO, OaEntryDO.class);
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaEntry.getProcInstId()).singleResult();
+
+        //审批通过
+        bpmTaskService.approveTask(userId, reqVO);
+
+        // 提交
+        if (auditPass) {
+            Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+            oaEntry.setAuditStatus("1");
+            oaEntry.setCurrentAuditEmployeeId(nextTask.getAssignee());
+            oaEntry.setFinalAuditDate(new Date());
+            oaEntryMapper.updateById(oaEntry);
+
+        } else {
+            OaEntryDO oaEntryClose = new OaEntryDO();
+            oaEntryClose.setId(oaEntry.getId());
+            oaEntryClose.setAuditStatus("4");
+            oaEntryClose.setCurrentAuditEmployeeId(null);
+            oaEntryClose.setFinalAuditDate(new Date());
+            oaEntryMapper.updateById(oaEntryClose);
+        }
+
+        return oaEntry.getId();
+    }
+
+    @Override
+    public void updateOaEntry(OaEntrySaveReqVO updateReqVO) {
+        // 校验存在
+        validateOaEntryExists(updateReqVO.getId());
+        // 更新
+        OaEntryDO updateObj = BeanUtils.toBean(updateReqVO, OaEntryDO.class);
+        oaEntryMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteOaEntry(Integer id) {
+        // 校验存在
+        validateOaEntryExists(id);
+        // 删除
+        oaEntryMapper.deleteById(id);
+    }
+
+    private void validateOaEntryExists(Integer id) {
+        if (oaEntryMapper.selectById(id) == null) {
+            throw exception(OA_ENTRY_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public OaEntryDO getOaEntry(Integer id) {
+        return oaEntryMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<OaEntryDO> getOaEntryPage(OaEntryPageReqVO pageReqVO) {
+        return oaEntryMapper.selectPage(pageReqVO);
+    }
+
+}

+ 66 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/holiday/OaHolidayService.java

@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.bpm.service.oa.holiday;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidayPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidaySaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday.OaHolidayDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.validation.Valid;
+
+/**
+ * 请假流程信息 Service 接口
+ *
+ * @author dp
+ */
+public interface OaHolidayService extends IService<OaHolidayDO> {
+
+    Long startOaHoliday(Long userId, @Valid OaHolidaySaveReqVO createReqVO);
+
+    Long completeTrueOaHoliday(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long completeFalseOaHoliday(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long updateCompleteOaHoliday(Long userId, @Valid OaHolidaySaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+
+
+    /**
+     * 创建请假流程信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createOaHoliday(@Valid OaHolidaySaveReqVO createReqVO);
+
+    /**
+     * 更新请假流程信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOaHoliday(@Valid OaHolidaySaveReqVO updateReqVO);
+
+    /**
+     * 删除请假流程信息
+     *
+     * @param id 编号
+     */
+    void deleteOaHoliday(Long id);
+
+    /**
+     * 获得请假流程信息
+     *
+     * @param id 编号
+     * @return 请假流程信息
+     */
+    OaHolidayDO getOaHoliday(Long id);
+
+    /**
+     * 获得请假流程信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 请假流程信息分页
+     */
+    PageResult<OaHolidayDO> getOaHolidayPage(OaHolidayPageReqVO pageReqVO);
+
+}

+ 255 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/holiday/OaHolidayServiceImpl.java

@@ -0,0 +1,255 @@
+package cn.iocoder.yudao.module.bpm.service.oa.holiday;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidayPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.holiday.vo.OaHolidaySaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.holiday.OaHolidayDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.holiday.OaHolidayMapper;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_HOLIDAY_NOT_EXISTS;
+
+/**
+ * 请假流程信息 Service 实现类
+ *
+ * @author dp
+ */
+@Service
+@Validated
+public class OaHolidayServiceImpl extends ServiceImpl<OaHolidayMapper, OaHolidayDO> implements OaHolidayService {
+
+
+    /**
+     * OA 离职对应的流程定义 KEY
+     */
+    public static final String PROCESS_KEY = "oa_holiday";
+
+
+    @Resource
+    private OaHolidayMapper oaHolidayMapper;
+
+    @Resource
+    private BpmProcessInstanceApi processInstanceApi;
+
+    @Resource
+    private BpmTaskService bpmTaskService;
+
+    @Resource
+    private TaskService taskService;
+
+    @Override
+    @Transactional
+    public Long startOaHoliday(Long userId, OaHolidaySaveReqVO createReqVO) {
+        //判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+        // 创建单据uuid
+        String uuid = IdUtil.fastSimpleUUID();
+        OaHolidayDO oaHoliday = BeanUtils.toBean(createReqVO, OaHolidayDO.class);
+        if (StringUtils.isBlank(oaHoliday.getHolidayId())) {
+            oaHoliday.setHolidayId(uuid);
+        }
+        // 保存或更新表单信息
+        this.saveOrUpdate(oaHoliday);
+
+        // 提交
+        if (auditPass) {
+            // 发起 BPM 流程
+            Map<String, Object> processInstanceVariables = new HashMap<>();
+            processInstanceVariables.put("auditPass", auditPass);
+            //添加审批人信息
+            Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
+            startUserSelectAssignees.put("approver", createReqVO.getStartUserSelectAssignees());
+            String processInstanceId = processInstanceApi
+                    .createProcessInstance(userId,
+                            new BpmProcessInstanceCreateReqDTO()
+                                    .setProcessDefinitionKey(PROCESS_KEY)
+                                    .setVariables(processInstanceVariables)
+                                    .setBusinessKey(String.valueOf(oaHoliday.getId()))
+                                    .setStartUserSelectAssignees(startUserSelectAssignees));
+
+            //获取下一个审批人
+            Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+
+            // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 转正中
+            oaHolidayMapper.updateById(new OaHolidayDO()
+                    .setId(oaHoliday.getId())
+                    .setProcInstId(processInstanceId)
+                    .setAuditStatus("1")
+                    .setHolidayId(uuid)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee())));
+
+            // TODO 发送通知
+
+        }else {
+            // 暂存,不发起流程
+            // 将单据状态 更新到 OA转正中
+            oaHolidayMapper.updateById(new OaHolidayDO()
+                    .setId(oaHoliday.getId())
+                    .setAuditStatus("0"));
+        }
+
+        // TODO 保存或更新附件uuid
+        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+        }
+
+        // 返回
+        return oaHoliday.getId();
+    }
+    @Override
+    public Long completeTrueOaHoliday(Long userId, BpmTaskApproveReqVO reqVO) {
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+        // 审批同意
+        bpmTaskService.approveTask(userId, reqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        if (nextTask != null) {
+            LambdaUpdateWrapper<OaHolidayDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaHolidayDO::getAuditStatus, "2")
+                    .set(OaHolidayDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                    .set(OaHolidayDO::getFinalAuditDate, new Date())
+                    .eq(OaHolidayDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaHolidayMapper.update(updateWrapper);
+        } else {
+            LambdaUpdateWrapper<OaHolidayDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaHolidayDO::getAuditStatus, "3")
+                    .set(OaHolidayDO::getCurrentAuditEmployeeId, null)
+                    .set(OaHolidayDO::getFinalAuditDate, new Date())
+                    .eq(OaHolidayDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaHolidayMapper.update(updateWrapper);
+
+            // TODO 复制业务单据信息到业务模块单据表
+
+        }
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long completeFalseOaHoliday(Long userId, BpmTaskApproveReqVO reqVO) {
+
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+
+        BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
+        reqVO2.setTargetTaskDefinitionKey("modifyApply");
+        bpmTaskService.returnTask(userId, reqVO2);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaHolidayDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaHolidayDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaHolidayDO::getFinalAuditDate, new Date())
+                .set(OaHolidayDO::getAuditStatus, "0")
+                .eq(OaHolidayDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaHolidayMapper.update(updateWrapper);
+
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long updateCompleteOaHoliday(Long userId, OaHolidaySaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
+        // 判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+
+        OaHolidayDO oaHoliday = BeanUtils.toBean(createReqVO, OaHolidayDO.class);
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaHoliday.getProcInstId()).singleResult();
+
+        //审批通过
+        bpmTaskService.approveTask(userId, reqVO);
+
+        // 提交
+        if (auditPass) {
+            Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+            oaHoliday.setAuditStatus("1");
+            oaHoliday.setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()));
+            oaHoliday.setFinalAuditDate(LocalDateTime.now());
+            oaHolidayMapper.updateById(oaHoliday);
+
+        } else {
+            OaHolidayDO oaHolidayClose = new OaHolidayDO();
+            oaHolidayClose.setId(oaHoliday.getId());
+            oaHolidayClose.setAuditStatus("4");
+            oaHolidayClose.setCurrentAuditEmployeeId(null);
+            oaHolidayClose.setFinalAuditDate(LocalDateTime.now());
+            oaHolidayMapper.updateById(oaHolidayClose);
+        }
+
+        return oaHoliday.getId();
+    }
+
+
+
+    @Override
+    public Long createOaHoliday(OaHolidaySaveReqVO createReqVO) {
+        // 插入
+        OaHolidayDO oaHoliday = BeanUtils.toBean(createReqVO, OaHolidayDO.class);
+        oaHolidayMapper.insert(oaHoliday);
+        // 返回
+        return oaHoliday.getId();
+    }
+
+    @Override
+    public void updateOaHoliday(OaHolidaySaveReqVO updateReqVO) {
+        // 校验存在
+        validateOaHolidayExists(updateReqVO.getId());
+        // 更新
+        OaHolidayDO updateObj = BeanUtils.toBean(updateReqVO, OaHolidayDO.class);
+        oaHolidayMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteOaHoliday(Long id) {
+        // 校验存在
+        validateOaHolidayExists(id);
+        // 删除
+        oaHolidayMapper.deleteById(id);
+    }
+
+    private void validateOaHolidayExists(Long id) {
+        if (oaHolidayMapper.selectById(id) == null) {
+            throw exception(OA_HOLIDAY_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public OaHolidayDO getOaHoliday(Long id) {
+        return oaHolidayMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<OaHolidayDO> getOaHolidayPage(OaHolidayPageReqVO pageReqVO) {
+        return oaHolidayMapper.selectPage(pageReqVO);
+    }
+
+}

+ 56 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/leave/OaLeaveService.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.bpm.service.oa.leave;
+
+import javax.validation.*;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeavePageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeaveSaveReqVO;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.leave.OaLeaveDO;
+
+/**
+ * 请假流程信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface OaLeaveService {
+
+    /**
+     * 创建请假流程信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Integer createOaLeave(@Valid OaLeaveSaveReqVO createReqVO);
+
+    /**
+     * 更新请假流程信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOaLeave(@Valid OaLeaveSaveReqVO updateReqVO);
+
+    /**
+     * 删除请假流程信息
+     *
+     * @param id 编号
+     */
+    void deleteOaLeave(Integer id);
+
+    /**
+     * 获得请假流程信息
+     *
+     * @param id 编号
+     * @return 请假流程信息
+     */
+    OaLeaveDO getOaLeave(Integer id);
+
+    /**
+     * 获得请假流程信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 请假流程信息分页
+     */
+    PageResult<OaLeaveDO> getOaLeavePage(OaLeavePageReqVO pageReqVO);
+
+}

+ 73 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/leave/OaLeaveServiceImpl.java

@@ -0,0 +1,73 @@
+package cn.iocoder.yudao.module.bpm.service.oa.leave;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeavePageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.leave.vo.OaLeaveSaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.leave.OaLeaveDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.leave.OaLeaveMapper;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+
+/**
+ * 请假流程信息 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class OaLeaveServiceImpl implements OaLeaveService {
+
+    @Resource
+    private OaLeaveMapper oaLeaveMapper;
+
+    @Override
+    public Integer createOaLeave(OaLeaveSaveReqVO createReqVO) {
+        // 插入
+        OaLeaveDO oaLeave = BeanUtils.toBean(createReqVO, OaLeaveDO.class);
+        oaLeaveMapper.insert(oaLeave);
+        // 返回
+        return oaLeave.getId();
+    }
+
+    @Override
+    public void updateOaLeave(OaLeaveSaveReqVO updateReqVO) {
+        // 校验存在
+        validateOaLeaveExists(updateReqVO.getId());
+        // 更新
+        OaLeaveDO updateObj = BeanUtils.toBean(updateReqVO, OaLeaveDO.class);
+        oaLeaveMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteOaLeave(Integer id) {
+        // 校验存在
+        validateOaLeaveExists(id);
+        // 删除
+        oaLeaveMapper.deleteById(id);
+    }
+
+    private void validateOaLeaveExists(Integer id) {
+        if (oaLeaveMapper.selectById(id) == null) {
+            throw exception(OA_LEAVE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public OaLeaveDO getOaLeave(Integer id) {
+        return oaLeaveMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<OaLeaveDO> getOaLeavePage(OaLeavePageReqVO pageReqVO) {
+        return oaLeaveMapper.selectPage(pageReqVO);
+    }
+
+}

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveStatusListener.java

@@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.bpm.service.oa.listener;
 
 import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
 import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;
-import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService;
-import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveServiceImpl;
+import cn.iocoder.yudao.module.bpm.service.oa.oldLeave.BpmOALeaveService;
+import cn.iocoder.yudao.module.bpm.service.oa.oldLeave.BpmOALeaveServiceImpl;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;

+ 6 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java

@@ -1,10 +1,12 @@
-package cn.iocoder.yudao.module.bpm.service.oa;
+package cn.iocoder.yudao.module.bpm.service.oa.oldLeave;
 
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
+
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo.BpmOALeavePageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo.BpmOALeaveCreateReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.oldLeave.BpmOALeaveDO;
 
 import javax.validation.Valid;
 

+ 10 - 8
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java

@@ -1,14 +1,16 @@
-package cn.iocoder.yudao.module.bpm.service.oa;
+package cn.iocoder.yudao.module.bpm.service.oa.oldLeave;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
-import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper;
+
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo.BpmOALeavePageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.oldLeave.vo.BpmOALeaveCreateReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.oldLeave.BpmOALeaveDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.oldLeave.BpmOALeaveMapper;
 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -19,7 +21,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_LEAVE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_OLD_LEAVE_NOT_EXISTS;
 
 /**
  * OA 请假申请 Service 实现类
@@ -34,7 +36,7 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService {
     /**
      * OA 请假对应的流程定义 KEY
      */
-    public static final String PROCESS_KEY = "oa_leave";
+    public static final String PROCESS_KEY = "oaa";
 
     @Resource
     private BpmOALeaveMapper leaveMapper;
@@ -72,7 +74,7 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService {
 
     private void validateLeaveExists(Long id) {
         if (leaveMapper.selectById(id) == null) {
-            throw exception(OA_LEAVE_NOT_EXISTS);
+            throw exception(OA_OLD_LEAVE_NOT_EXISTS);
         }
     }
 

+ 66 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/renew/OaRenewService.java

@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.bpm.service.oa.renew;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.renew.OaRenewDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.validation.Valid;
+
+/**
+ * 合同续签流程信息 Service 接口
+ *
+ * @author dp
+ */
+public interface OaRenewService extends IService<OaRenewDO> {
+
+    Long startOaRenew(Long userId, @Valid OaRenewSaveReqVO createReqVO);
+
+    Long completeTrueOaRenew(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long completeFalseOaRenew(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long updateCompleteOaRenew(Long userId, @Valid OaRenewSaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+
+
+    /**
+     * 创建合同续签流程信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createOaRenew(@Valid OaRenewSaveReqVO createReqVO);
+
+    /**
+     * 更新合同续签流程信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOaRenew(@Valid OaRenewSaveReqVO updateReqVO);
+
+    /**
+     * 删除合同续签流程信息
+     *
+     * @param id 编号
+     */
+    void deleteOaRenew(Long id);
+
+    /**
+     * 获得合同续签流程信息
+     *
+     * @param id 编号
+     * @return 合同续签流程信息
+     */
+    OaRenewDO getOaRenew(Long id);
+
+    /**
+     * 获得合同续签流程信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 合同续签流程信息分页
+     */
+    PageResult<OaRenewDO> getOaRenewPage(OaRenewPageReqVO pageReqVO);
+
+}

+ 253 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/renew/OaRenewServiceImpl.java

@@ -0,0 +1,253 @@
+package cn.iocoder.yudao.module.bpm.service.oa.renew;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.renew.OaRenewDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.renew.OaRenewMapper;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_RENEW_NOT_EXISTS;
+
+/**
+ * 合同续签流程信息 Service 实现类
+ *
+ * @author dp
+ */
+@Service
+@Validated
+public class OaRenewServiceImpl extends ServiceImpl<OaRenewMapper, OaRenewDO> implements OaRenewService {
+
+
+    /**
+     * OA 合同续签对应的流程定义 KEY
+     */
+    public static final String PROCESS_KEY = "oa_renew";
+
+    @Resource
+    private OaRenewMapper oaRenewMapper;
+
+    @Resource
+    private BpmProcessInstanceApi processInstanceApi;
+
+    @Resource
+    private BpmTaskService bpmTaskService;
+
+    @Resource
+    private TaskService taskService;
+
+    @Override
+    @Transactional
+    public Long startOaRenew(Long userId, OaRenewSaveReqVO createReqVO) {
+        //判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+        // 创建单据uuid
+        String uuid = IdUtil.fastSimpleUUID();
+        OaRenewDO oaRenew = BeanUtils.toBean(createReqVO, OaRenewDO.class);
+        if (StringUtils.isBlank(oaRenew.getRenewId())) {
+            oaRenew.setRenewId(uuid);
+        }
+        // 保存或更新表单信息
+        this.saveOrUpdate(oaRenew);
+
+        // 提交
+        if (auditPass) {
+            // 发起 BPM 流程
+            Map<String, Object> processInstanceVariables = new HashMap<>();
+            processInstanceVariables.put("auditPass", auditPass);
+            //添加审批人信息
+            Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
+            startUserSelectAssignees.put("approver", createReqVO.getStartUserSelectAssignees());
+            String processInstanceId = processInstanceApi
+                    .createProcessInstance(userId,
+                            new BpmProcessInstanceCreateReqDTO()
+                                    .setProcessDefinitionKey(PROCESS_KEY)
+                                    .setVariables(processInstanceVariables)
+                                    .setBusinessKey(String.valueOf(oaRenew.getId()))
+                                    .setStartUserSelectAssignees(startUserSelectAssignees));
+
+            //获取下一个审批人
+            Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+
+            // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 转正中
+            oaRenewMapper.updateById(new OaRenewDO()
+                    .setId(oaRenew.getId())
+                    .setProcInstId(processInstanceId)
+                    .setAuditStatus("1")
+                    .setRenewId(uuid)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee())));
+
+            // TODO 发送通知
+
+        }else {
+            // 暂存,不发起流程
+            // 将单据状态 更新到 OA转正中
+            oaRenewMapper.updateById(new OaRenewDO()
+                    .setId(oaRenew.getId())
+                    .setAuditStatus("0"));
+        }
+
+        // TODO 保存或更新附件uuid
+        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+        }
+
+        // 返回
+        return oaRenew.getId();
+    }
+    @Override
+    public Long completeTrueOaRenew(Long userId, BpmTaskApproveReqVO reqVO) {
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+        // 审批同意
+        bpmTaskService.approveTask(userId, reqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        if (nextTask != null) {
+            LambdaUpdateWrapper<OaRenewDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaRenewDO::getAuditStatus, "2")
+                    .set(OaRenewDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                    .set(OaRenewDO::getFinalAuditDate, new Date())
+                    .eq(OaRenewDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaRenewMapper.update(updateWrapper);
+        } else {
+            LambdaUpdateWrapper<OaRenewDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaRenewDO::getAuditStatus, "3")
+                    .set(OaRenewDO::getCurrentAuditEmployeeId, null)
+                    .set(OaRenewDO::getFinalAuditDate, new Date())
+                    .eq(OaRenewDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaRenewMapper.update(updateWrapper);
+
+            // TODO 复制业务单据信息到业务模块单据表
+
+        }
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long completeFalseOaRenew(Long userId, BpmTaskApproveReqVO reqVO) {
+
+        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+
+        BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
+        reqVO2.setTargetTaskDefinitionKey("modifyApply");
+        bpmTaskService.returnTask(userId, reqVO2);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaRenewDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaRenewDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaRenewDO::getFinalAuditDate, new Date())
+                .set(OaRenewDO::getAuditStatus, "0")
+                .eq(OaRenewDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaRenewMapper.update(updateWrapper);
+
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    public Long updateCompleteOaRenew(Long userId, OaRenewSaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
+        // 判断是否已经发起流程
+        Boolean auditPass = createReqVO.getAuditPass();
+
+        OaRenewDO oaRenew = BeanUtils.toBean(createReqVO, OaRenewDO.class);
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaRenew.getProcInstId()).singleResult();
+
+        //审批通过
+        bpmTaskService.approveTask(userId, reqVO);
+
+        // 提交
+        if (auditPass) {
+            Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+            oaRenew.setAuditStatus("1");
+            oaRenew.setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()));
+            oaRenew.setFinalAuditDate(LocalDateTime.now());
+            oaRenewMapper.updateById(oaRenew);
+
+        } else {
+            OaRenewDO oaRenewClose = new OaRenewDO();
+            oaRenewClose.setId(oaRenew.getId());
+            oaRenewClose.setAuditStatus("4");
+            oaRenewClose.setCurrentAuditEmployeeId(null);
+            oaRenewClose.setFinalAuditDate(LocalDateTime.now());
+            oaRenewMapper.updateById(oaRenewClose);
+        }
+
+        return oaRenew.getId();
+    }
+
+
+    @Override
+    public Long createOaRenew(OaRenewSaveReqVO createReqVO) {
+        // 插入
+        OaRenewDO oaRenew = BeanUtils.toBean(createReqVO, OaRenewDO.class);
+        oaRenewMapper.insert(oaRenew);
+        // 返回
+        return oaRenew.getId();
+    }
+
+    @Override
+    public void updateOaRenew(OaRenewSaveReqVO updateReqVO) {
+        // 校验存在
+        validateOaRenewExists(updateReqVO.getId());
+        // 更新
+        OaRenewDO updateObj = BeanUtils.toBean(updateReqVO, OaRenewDO.class);
+        oaRenewMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteOaRenew(Long id) {
+        // 校验存在
+        validateOaRenewExists(id);
+        // 删除
+        oaRenewMapper.deleteById(id);
+    }
+
+    private void validateOaRenewExists(Long id) {
+        if (oaRenewMapper.selectById(id) == null) {
+            throw exception(OA_RENEW_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public OaRenewDO getOaRenew(Long id) {
+        return oaRenewMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<OaRenewDO> getOaRenewPage(OaRenewPageReqVO pageReqVO) {
+        return oaRenewMapper.selectPage(pageReqVO);
+    }
+
+}

+ 38 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/universal/OaUniversalService.java

@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.bpm.service.oa.universal;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
+
+/**
+ * 通用事项审批流程信息 Service 接口
+ *
+ * @author dp
+ */
+public interface OaUniversalService {
+
+    Long stagingOaUniversal(OaUniversalSaveReqVO stagingReqVO);
+
+    Long commitOaUniversal(OaUniversalSaveReqVO commitReqVO);
+
+    Long agreeOaUniversal(BpmTaskApproveReqVO agreeReqVO);
+
+    Long disagreeOaUniversal(BpmTaskReturnReqVO disagreeReqVO);
+
+    Long revocationOaUniversal(BpmTaskApproveReqVO revocationReqVO);
+
+    Long reCommitOaUniversal(OaUniversalSaveReqVO reCommitReqVO);
+
+    Long closeOaUniversal(OaUniversalSaveReqVO closeReqVO);
+
+    void deleteOaUniversal(Long id);
+
+    OaUniversalRespVO getOaUniversal(Long id);
+
+    PageResult<OaUniversalRespVO> getOaUniversalPage(OaUniversalPageReqVO pageReqVO);
+
+    PageResult<OaUniversalRespVO> exportOaUniversalExcel(OaUniversalPageReqVO pageReqVO);
+}

+ 486 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/universal/OaUniversalServiceImpl.java

@@ -0,0 +1,486 @@
+package cn.iocoder.yudao.module.bpm.service.oa.universal;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo.OaUniversalSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.universal.OaUniversalDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.universal.OaUniversalMapper;
+import cn.iocoder.yudao.module.bpm.enums.DictDataConstants;
+import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
+import cn.iocoder.yudao.module.infra.api.file.dto.FileDTO;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_UNIVERSAL_NOT_EXISTS;
+
+/**
+ * 通用事项审批流程信息 Service 实现类
+ *
+ * @author dp
+ */
+@Service
+@Validated
+public class OaUniversalServiceImpl implements OaUniversalService {
+
+    /**
+     * OA 合同续签对应的流程定义 KEY
+     */
+    public static final String PROCESS_KEY = "oa_universal";
+
+
+    @Resource
+    private OaUniversalMapper oaUniversalMapper;
+
+    @Resource
+    private BpmProcessInstanceApi processInstanceApi;
+
+    @Resource
+    private BpmTaskService bpmTaskService;
+
+    @Resource
+    private TaskService taskService;
+
+    @Resource
+    private FileApi fileApi;
+
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @Resource
+    private DeptApi deptApi;
+
+    @Override
+    @Transactional
+    public Long stagingOaUniversal(OaUniversalSaveReqVO stagingReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
+        Objects.requireNonNull(loginUser, "登录用户不能为空");
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaUniversalDO oaUniversal = BeanUtils.toBean(stagingReqVO, OaUniversalDO.class);
+        if (StringUtils.isBlank(oaUniversal.getUniversalId())) {
+            // 创建单据uuid
+            String uuid = IdUtil.fastSimpleUUID();
+            oaUniversal.setUniversalId(uuid);
+        }
+        oaUniversal.setEmployeeId(loginUser.getId());
+        oaUniversal.setEmployeeName(loginUser.getNickname());
+        oaUniversal.setEmployeePhone(loginUser.getMobile());
+        oaUniversal.setDeptId(loginUser.getDeptId());
+        oaUniversal.setPosition("员工职位");
+        oaUniversal.setUserId(loginUser.getId());
+        oaUniversal.setUserPhone(loginUser.getMobile());
+        oaUniversal.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_STAGING);
+        oaUniversal.setInfoSource("0");
+        // 保存或更新表单信息
+        if (oaUniversal.getId() == null) {
+            oaUniversalMapper.insert(oaUniversal);
+        } else {
+            oaUniversalMapper.updateById(oaUniversal);
+        }
+        // 保存业务uuid到附件中
+        saveFileList(stagingReqVO.getFileIdList(), oaUniversal.getUniversalId());
+
+        return oaUniversal.getId();
+    }
+
+    @Override
+    @Transactional
+    public Long commitOaUniversal(OaUniversalSaveReqVO commitReqVO) {
+        if (CollectionUtil.isEmpty(commitReqVO.getStartUserSelectAssignees())) {
+            throw exception(ErrorCodeConstants.TASK_CREATE_FAIL_NO_START_SELECT_ASSIGNEE);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
+        Objects.requireNonNull(loginUser, "登录用户不能为空");
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaUniversalDO oaUniversal = BeanUtils.toBean(commitReqVO, OaUniversalDO.class);
+        if (StringUtils.isBlank(oaUniversal.getUniversalId())) {
+            // 创建单据uuid
+            String uuid = IdUtil.fastSimpleUUID();
+            oaUniversal.setUniversalId(uuid);
+        }
+        oaUniversal.setEmployeeId(loginUser.getId());
+        oaUniversal.setEmployeeName(loginUser.getNickname());
+        oaUniversal.setEmployeePhone(loginUser.getMobile());
+        oaUniversal.setDeptId(loginUser.getDeptId());
+        oaUniversal.setPosition("员工职位");
+        oaUniversal.setUserId(loginUser.getId());
+        oaUniversal.setUserPhone(loginUser.getMobile());
+        oaUniversal.setInfoSource("0");
+        // 保存或更新表单信息
+        if (oaUniversal.getId() == null) {
+            oaUniversalMapper.insert(oaUniversal);
+        } else {
+            oaUniversalMapper.updateById(oaUniversal);
+        }
+        // 发起流程
+        Map<String, Object> processInstanceVariables = new HashMap<>();
+        processInstanceVariables.put("auditPass", "true");
+        // 添加审批人信息
+        Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
+        List<Long> selectAssignees = commitReqVO.getStartUserSelectAssignees();
+        startUserSelectAssignees.put("approver", selectAssignees);
+        String processInstanceId = processInstanceApi
+                .createProcessInstance(loginUser.getId(),
+                        new BpmProcessInstanceCreateReqDTO()
+                                .setProcessDefinitionKey(PROCESS_KEY)
+                                .setVariables(processInstanceVariables)
+                                .setBusinessKey(String.valueOf(oaUniversal.getId()))
+                                .setStartUserSelectAssignees(startUserSelectAssignees));
+
+        //获取下一个审批人
+        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+
+        // 审批同意
+        BpmTaskApproveReqVO agreeReqVO = new BpmTaskApproveReqVO();
+        agreeReqVO.setId(task.getId());
+        agreeReqVO.setReason("[首次提交]");
+        taskService.setVariable(task.getId(), "auditPass", "true");
+        bpmTaskService.approveTask(loginUserId, agreeReqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+        if (nextTask == null) {
+            throw exception(ErrorCodeConstants.TASK_CREATE_FAIL_NO_START_SELECT_ASSIGNEE);
+        }
+
+        // 将工作流的流程实例ID、单据状态、最后一次审批时间、当前审批人更新到单据信息中
+        oaUniversalMapper.updateById(new OaUniversalDO()
+                .setId(oaUniversal.getId())
+                .setProcInstId(processInstanceId)
+                .setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
+                .setFinalAuditDate(LocalDateTime.now())
+                .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
+                .setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(","))));
+        // 保存业务uuid到附件中
+        saveFileList(commitReqVO.getFileIdList(), oaUniversal.getUniversalId());
+        // TODO DP 发送提交成功站内信
+        return oaUniversal.getId();
+    }
+
+    @Override
+    @Transactional
+    public Long agreeOaUniversal(BpmTaskApproveReqVO agreeReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        Task currentTask = bpmTaskService.getTask(agreeReqVO.getId());
+        if (currentTask == null) {
+            throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
+        }
+        LambdaQueryWrapper<OaUniversalDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaUniversalDO oaUniversal = oaUniversalMapper.selectOne(lambdaQueryWrapper);
+        // 审批同意
+        String reason = "[同意]";
+        if (StrUtil.isNotBlank(agreeReqVO.getReason())) {
+            reason = reason + agreeReqVO.getReason();
+        }
+        agreeReqVO.setReason(reason);
+        taskService.setVariable(agreeReqVO.getId(), "auditPass", "true");
+        bpmTaskService.approveTask(loginUserId, agreeReqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        OaUniversalDO oaUniversalDO = new OaUniversalDO();
+        if (nextTask != null) {
+            oaUniversalDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITING)
+                    .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaUniversal.getId());
+
+        } else {
+            oaUniversalDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITED)
+                    .setCurrentAuditEmployeeId(null)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaUniversal.getId());
+
+            // TODO 复制业务单据信息到业务模块单据表
+
+        }
+        oaUniversalMapper.updateById(oaUniversalDO);
+        // 发送通知
+
+        // 返回
+        return 1L;
+    }
+
+    @Override
+    @Transactional
+    public Long disagreeOaUniversal(BpmTaskReturnReqVO disagreeReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        Task currentTask = bpmTaskService.getTask(disagreeReqVO.getId());
+
+        disagreeReqVO.setTargetTaskDefinitionKey("modifyApply");
+        disagreeReqVO.setReason("[驳回]" + disagreeReqVO.getReason());
+        taskService.setVariable(disagreeReqVO.getId(), "auditPass", "false");
+        bpmTaskService.returnTask(loginUserId, disagreeReqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaUniversalDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaUniversalDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaUniversalDO::getFinalAuditDate, LocalDateTime.now())
+                .set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RETURNED)
+                .eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaUniversalMapper.update(updateWrapper);
+
+        // 发送通知
+
+        return 1L;
+    }
+
+    @Override
+    @Transactional
+    public Long revocationOaUniversal(BpmTaskApproveReqVO revocationReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        Task currentTask = bpmTaskService.getTask(revocationReqVO.getId());
+        if (currentTask == null) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TASK_NOT_EXISTS);
+        }
+        LambdaQueryWrapper<OaUniversalDO> lambdaQueryWrapper = new LambdaQueryWrapper<OaUniversalDO>()
+                .eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaUniversalDO oaUniversalDO = oaUniversalMapper.selectOne(lambdaQueryWrapper);
+        if (!DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaUniversalDO.getAuditStatus())
+            || !Objects.equals(String.valueOf(loginUserId), oaUniversalDO.getCreator())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TASK_REVOCATION_NO_ALLOWED);
+        }
+
+        BpmTaskReturnReqVO returnReqVO = BeanUtils.toBean(revocationReqVO, BpmTaskReturnReqVO.class);
+        returnReqVO.setTargetTaskDefinitionKey("modifyApply");
+        String reason = "[撤回]";
+        if (StrUtil.isNotBlank(returnReqVO.getReason())) {
+            reason = reason + returnReqVO.getReason();
+        }
+        returnReqVO.setReason(reason);
+        bpmTaskService.revocationTask(loginUserId, returnReqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaUniversalDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaUniversalDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaUniversalDO::getFinalAuditDate, LocalDateTime.now())
+                .set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RECALLED)
+                .eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaUniversalMapper.update(updateWrapper);
+
+        // 发送通知
+
+        return 1L;
+    }
+
+    @Override
+    @Transactional
+    public Long reCommitOaUniversal(OaUniversalSaveReqVO reCommitReqVO) {
+        if (reCommitReqVO.getId() == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaUniversalDO oaUniversalNew = BeanUtils.toBean(reCommitReqVO, OaUniversalDO.class);
+        OaUniversalDO oaUniversalOld = oaUniversalMapper.selectById(oaUniversalNew.getId());
+        oaUniversalNew.setUniversalId(oaUniversalOld.getUniversalId())
+                .setProcInstId(oaUniversalOld.getProcInstId());
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaUniversalNew.getProcInstId()).singleResult();
+        BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
+        approveReqVO.setId(currentTask.getId())
+                .setReason("[再次提交]");
+        if (CollectionUtil.isNotEmpty(reCommitReqVO.getStartUserSelectAssignees())) {
+            // 添加审批人信息到流程参数中
+            Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
+            List<Long> selectAssignees = reCommitReqVO.getStartUserSelectAssignees();
+            startUserSelectAssignees.put("approver", selectAssignees);
+            taskService.setVariable(currentTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees);
+            // 保存审批人信息
+            oaUniversalNew.setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(",")));
+        }
+        taskService.setVariable(currentTask.getId(), "auditPass", "true");
+        // 再次提交,和审批通过逻辑相同
+        bpmTaskService.approveTask(loginUserId, approveReqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        oaUniversalNew.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
+                .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
+                .setFinalAuditDate(LocalDateTime.now());
+        oaUniversalMapper.updateById(oaUniversalNew);
+
+        // 保存业务uuid到附件中
+        saveFileList(reCommitReqVO.getFileIdList(), oaUniversalNew.getUniversalId());
+
+        return 1L;
+    }
+
+    @Override
+    @Transactional
+    public Long closeOaUniversal(OaUniversalSaveReqVO closeReqVO) {
+        if (closeReqVO.getId() == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaUniversalDO oaUniversalNew = BeanUtils.toBean(closeReqVO, OaUniversalDO.class);
+        OaUniversalDO oaUniversalOld = oaUniversalMapper.selectById(oaUniversalNew.getId());
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaUniversalOld.getProcInstId()).singleResult();
+        BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
+        approveReqVO.setId(currentTask.getId())
+                .setReason("[关闭]");
+        taskService.setVariable(currentTask.getId(), "auditPass", "false");
+        // 关闭,使用审批通过的方法实现
+        bpmTaskService.approveTask(loginUserId, approveReqVO);
+
+        oaUniversalOld.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_CLOSED)
+                .setCurrentAuditEmployeeId(-1L)
+                .setFinalAuditDate(LocalDateTime.now());
+        oaUniversalMapper.updateById(oaUniversalOld);
+
+        return 1L;
+    }
+
+    @Override
+    public void deleteOaUniversal(Long id) {
+        // 校验存在
+        validateOaUniversalExists(id);
+        // 删除
+        oaUniversalMapper.deleteById(id);
+    }
+
+    @Override
+    public OaUniversalRespVO getOaUniversal(Long id) {
+        OaUniversalDO oaUniversalDO = oaUniversalMapper.selectById(id);
+        OaUniversalRespVO oaUniversalRespVO = BeanUtils.toBean(oaUniversalDO, OaUniversalRespVO.class);
+
+        // 附件列表
+        List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaUniversalDO.getUniversalId());
+        oaUniversalRespVO.setFileList(fileList);
+
+        // 审批记录
+        if (StrUtil.isNotBlank(oaUniversalDO.getProcInstId())) {
+            List<BpmTaskRespVO> auditRecordList = bpmTaskService.getAuditRecordListByProcessInstanceId(oaUniversalDO.getProcInstId());
+            oaUniversalRespVO.setAuditRecordList(auditRecordList);
+        }
+
+        // 审批人
+        String startUserSelectAssignees = oaUniversalDO.getStartUserSelectAssignees();
+        if (StrUtil.isNotEmpty(startUserSelectAssignees)) {
+            List<Long> userIdList = Arrays.stream(startUserSelectAssignees.split(","))
+                    .map(Long::valueOf).collect(Collectors.toList());
+            List<AdminUserRespDTO> userList = adminUserApi.getUserList(userIdList);
+            List<AdminUserRespDTO> auditUserList = new ArrayList<>();
+            for (Long userId : userIdList) {
+                for (AdminUserRespDTO adminUserRespDTO : userList) {
+                    if (Objects.equals(userId, adminUserRespDTO.getId())) {
+                        auditUserList.add(adminUserRespDTO);
+                        break;
+                    }
+                }
+            }
+            oaUniversalRespVO.setAuditUserList(auditUserList);
+        }
+
+        return oaUniversalRespVO;
+    }
+
+    @Override
+    public PageResult<OaUniversalRespVO> getOaUniversalPage(OaUniversalPageReqVO pageReqVO) {
+        PageResult<OaUniversalDO> oaUniversalDOPageResult = oaUniversalMapper.selectPage(pageReqVO);
+        PageResult<OaUniversalRespVO> oaUniversalRespVOPageResult = BeanUtils.toBean(oaUniversalDOPageResult, OaUniversalRespVO.class);
+
+        List<OaUniversalRespVO> oaUniversalRespVOList = oaUniversalRespVOPageResult.getList();
+        if (CollectionUtil.isNotEmpty(oaUniversalRespVOList)) {
+            List<Long> employeeIdList = oaUniversalRespVOList.stream().map(OaUniversalRespVO::getCurrentAuditEmployeeId).collect(Collectors.toList());
+            List<AdminUserRespDTO> employeeList = adminUserApi.getUserList(employeeIdList);
+            for (OaUniversalRespVO respVO : oaUniversalRespVOList) {
+                for (AdminUserRespDTO employee : employeeList) {
+                    if (respVO.getCurrentAuditEmployeeId() == employee.getId()) {
+                        respVO.setCurrentAuditEmployeeName(employee.getNickname());
+                        break;
+                    }
+                }
+            }
+
+            List<Long> deptIdList = oaUniversalRespVOList.stream().map(OaUniversalRespVO::getDeptId).collect(Collectors.toList());
+            List<DeptRespDTO> deptList = deptApi.getDeptList(deptIdList);
+            for (OaUniversalRespVO respVO : oaUniversalRespVOList) {
+                for (DeptRespDTO dept : deptList) {
+                    if (respVO.getDeptId() == dept.getId()) {
+                        respVO.setDeptName(dept.getName());
+                        break;
+                    }
+                }
+            }
+        }
+
+        return oaUniversalRespVOPageResult;
+    }
+
+    @Override
+    public PageResult<OaUniversalRespVO> exportOaUniversalExcel(OaUniversalPageReqVO pageReqVO) {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        return getOaUniversalPage(pageReqVO);
+    }
+
+    private void validateOaUniversalExists(Long id) {
+        if (oaUniversalMapper.selectById(id) == null) {
+            throw exception(OA_UNIVERSAL_NOT_EXISTS);
+        }
+    }
+
+    /**
+     * 保存业务uuid到附件中
+     */
+    private void saveFileList(List<Long> fileIdList, String serviceId) {
+        if (CollectionUtil.isNotEmpty(fileIdList) && StrUtil.isNotEmpty(serviceId)) {
+            fileApi.updateFileBiz(fileIdList, serviceId);
+        }
+    }
+
+}

+ 3 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskAssignRuleServiceImpl.java

@@ -34,6 +34,7 @@ import org.flowable.bpmn.model.UserTask;
 import org.flowable.common.engine.api.FlowableException;
 import org.flowable.engine.delegate.DelegateExecution;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -316,7 +317,7 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService {
     private Set<Long> calculateTaskCandidateUsersByUserGroup(BpmTaskAssignRuleDO rule) {
         List<BpmUserGroupDO> userGroups = userGroupService.getUserGroupList(rule.getOptions());
         Set<Long> userIds = new HashSet<>();
-        userGroups.forEach(group -> userIds.addAll(group.getMemberUserIds()));
+        userGroups.forEach(group -> userIds.addAll(group.getUserIds()));
         return userIds;
     }
 
@@ -331,7 +332,7 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService {
             scripts.add(script);
         });
         // 逐个计算任务
-        Set<Long> userIds = new HashSet<>();
+        Set<Long> userIds = new LinkedHashSet<>();
         scripts.forEach(script -> CollUtil.addAll(userIds, script.calculateTaskCandidateUsers(execution)));
         return userIds;
     }

+ 0 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java


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