Browse Source

Merge branch 'master_20240722' of http://git.dgtis.com/15896567520/oneportal_saas into saas_20240723

zhaopeiqing 1 year ago
parent
commit
8958ba2459
64 changed files with 3344 additions and 2056 deletions
  1. 11 1
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/DictDataConstants.java
  2. 6 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/DictTypeConstants.java
  3. 11 2
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
  4. 87 55
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/OaConversionController.java
  5. 6 56
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionPageReqVO.java
  6. 35 24
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionRespVO.java
  7. 10 67
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/conversion/vo/OaConversionSaveReqVO.java
  8. 92 61
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/OaEntryController.java
  9. 8 7
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntryPageReqVO.java
  10. 62 18
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntryRespVO.java
  11. 15 32
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/entry/vo/OaEntrySaveReqVO.java
  12. 87 55
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/OaRenewController.java
  13. 7 61
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewPageReqVO.java
  14. 44 13
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewRespVO.java
  15. 12 66
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/renew/vo/OaRenewSaveReqVO.java
  16. 33 33
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/OaDimissionController.java
  17. 5 6
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionPageReqVO.java
  18. 6 8
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionRespVO.java
  19. 5 7
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/dimission/vo/OaDimissionSaveReqVO.java
  20. 28 19
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/OaUniversalController.java
  21. 5 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/vo/OaUniversalRespVO.java
  22. 0 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/universal/vo/OaUniversalSaveReqVO.java
  23. 15 7
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
  24. 32 8
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
  25. 8 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java
  26. 3 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java
  27. 2 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskPageReqVO.java
  28. 9 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java
  29. 3 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskReturnReqVO.java
  30. 27 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
  31. 26 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
  32. 29 10
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/conversion/OaConversionDO.java
  33. 27 10
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/entry/OaEntryDO.java
  34. 26 6
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/renew/OaRenewDO.java
  35. 7 7
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/dimission/OaDimissionDO.java
  36. 4 20
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/conversion/OaConversionMapper.java
  37. 0 45
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/dimission/OaDimissionMapper.java
  38. 2 19
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/renew/OaRenewMapper.java
  39. 45 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/turnover/OaTurnOverMapper.java
  40. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java
  41. 5 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java
  42. 11 11
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/web/config/BpmWebConfiguration.java
  43. 0 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
  44. 9 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java
  45. 11 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
  46. 16 39
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/conversion/OaConversionService.java
  47. 504 118
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/conversion/OaConversionServiceImpl.java
  48. 0 66
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/dimission/OaDimissionService.java
  49. 18 64
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/entry/OaEntryService.java
  50. 448 116
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/entry/OaEntryServiceImpl.java
  51. 16 41
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/renew/OaRenewService.java
  52. 512 118
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/renew/OaRenewServiceImpl.java
  53. 66 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/turnover/OaTurnoverService.java
  54. 71 71
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/dimission/OaDimissionServiceImpl.java
  55. 3 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/universal/OaUniversalService.java
  56. 119 11
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/universal/OaUniversalServiceImpl.java
  57. 9 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
  58. 32 7
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
  59. 218 217
      yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/oa/conversion/OaConversionServiceImplTest.java
  60. 0 209
      yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/oa/dimission/OaDimissionServiceImplTest.java
  61. 225 225
      yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/oa/renew/OaRenewServiceImplTest.java
  62. 208 0
      yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/oa/turnover/OaTurnoverServiceImplTest.java
  63. 1 1
      yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java
  64. 1 0
      yudao-server/src/main/resources/application-local.yaml

+ 11 - 1
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/DictDataConstants.java

@@ -35,5 +35,15 @@ public interface DictDataConstants {
      * 已撤回状态
      * 已撤回状态
      */
      */
     String OA_AUDIT_STATUS_RECALLED = "6";
     String OA_AUDIT_STATUS_RECALLED = "6";
-    
+
+    /**
+     * bpm任务定义节点Key:申请节点
+     */
+    String OA_TASK_DEFINITION_KEY_MODIFY_APPLY = "modifyApply";
+
+    /**
+     * bpm任务定义节点Key:审核节点
+     */
+    String OA_TASK_DEFINITION_KEY_APPROVER = "approver";
+
 }
 }

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

@@ -14,4 +14,10 @@ public interface DictTypeConstants {
      * bpm流程审核状态
      * bpm流程审核状态
      */
      */
     String BPM_TASK_AUDIT_STATUS = "bpm_task_audit_status";
     String BPM_TASK_AUDIT_STATUS = "bpm_task_audit_status";
+
+    /**
+     * bpm任务定义节点Key
+     */
+    String BPM_TASK_DEFINITION_KEY = "bpm_task_definition_key";
+
 }
 }

+ 11 - 2
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java

@@ -37,6 +37,7 @@ public interface ErrorCodeConstants {
     ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "流程取消失败,该流程不是你发起的");
     ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "流程取消失败,该流程不是你发起的");
     ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_003, "审批任务({})的审批人未配置");
     ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_003, "审批任务({})的审批人未配置");
     ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "审批任务({})的审批人({})不存在");
     ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "审批任务({})的审批人({})不存在");
+    ErrorCode PROCESS_INSTANCE_CREATE_FAIL_HAS_PROCESS = new ErrorCode(1_009_004_005, "流程发起失败,单据已发起过流程");
 
 
     // ========== 流程任务 1-009-005-000 ==========
     // ========== 流程任务 1-009-005-000 ==========
     ErrorCode TASK_OPERATE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "操作失败,原因:该任务的审批人不是你");
     ErrorCode TASK_OPERATE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "操作失败,原因:该任务的审批人不是你");
@@ -52,7 +53,8 @@ public interface ErrorCodeConstants {
     ErrorCode TASK_SIGN_DELETE_NO_PARENT = new ErrorCode(1_009_005_012, "任务减签失败,被减签的任务必须是通过加签生成的任务");
     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_REPEAT = new ErrorCode(1_009_005_013, "任务转办失败,转办人和当前审批人为同一人");
     ErrorCode TASK_TRANSFER_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_014, "任务转办失败,转办人不存在");
     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_REVOCATION_NOT_ALLOWED = new ErrorCode(1_009_006_015, "操作失败,原因:只有已提交状态的流程才能由申请人撤回!");
+    ErrorCode TASK_CLOSE_NOT_ALLOWED = new ErrorCode(1_009_006_016, "操作失败,原因:只有已驳回或已撤回状态的流程才能由申请人关闭!");
     ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!");
     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, "操作失败,原因:请选择审批人!");
     ErrorCode TASK_CREATE_FAIL_NO_START_SELECT_ASSIGNEE = new ErrorCode(1_009_006_004, "操作失败,原因:请选择审批人!");
 
 
@@ -85,11 +87,11 @@ public interface ErrorCodeConstants {
 
 
 
 
     ErrorCode SERVICE_ID_NOT_EXISTS = new ErrorCode(1009011000, "业务单据ID不能为空");
     ErrorCode SERVICE_ID_NOT_EXISTS = new ErrorCode(1009011000, "业务单据ID不能为空");
+    ErrorCode DELETE_FAIL_NOT_STAGING = new ErrorCode(1009011001, "非暂存状态不能删除");
     // ========== 入职流程信息 1-009-012-000 ==========
     // ========== 入职流程信息 1-009-012-000 ==========
     ErrorCode OA_ENTRY_NOT_EXISTS = new ErrorCode(1009012000, "入职流程信息不存在");
     ErrorCode OA_ENTRY_NOT_EXISTS = new ErrorCode(1009012000, "入职流程信息不存在");
 
 
 
 
-
     // ========== 请假流程信息 1-009-017-000 ==========
     // ========== 请假流程信息 1-009-017-000 ==========
     ErrorCode OA_LEAVE_NOT_EXISTS = new ErrorCode(1009017000, "请假流程信息不存在");
     ErrorCode OA_LEAVE_NOT_EXISTS = new ErrorCode(1009017000, "请假流程信息不存在");
 
 
@@ -104,4 +106,11 @@ public interface ErrorCodeConstants {
     // ========== 通用事项审批流程信息 1-009_017_006 ==========
     // ========== 通用事项审批流程信息 1-009_017_006 ==========
     ErrorCode OA_UNIVERSAL_NOT_EXISTS = new ErrorCode(1009017006, "通用事项审批流程信息不存在");
     ErrorCode OA_UNIVERSAL_NOT_EXISTS = new ErrorCode(1009017006, "通用事项审批流程信息不存在");
 
 
+
+    // ========== 员工信息 1_009_018_000 ==========
+    ErrorCode OA_EMPLOYEE_NOT_EXISTS = new ErrorCode(1_009_018_000, "员工信息不存在");
+
+    // ========== 登录用户信息 1_009_018_000 ==========
+    ErrorCode OA_LOGIN_USER_NOT_EXISTS = new ErrorCode(1_009_018_000, "登录用户不存在");
+
 }
 }

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

@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion;
 
 
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 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.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
@@ -10,12 +9,13 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversio
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo.OaConversionRespVO;
 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.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.BpmTaskApproveReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.conversion.OaConversionDO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 import cn.iocoder.yudao.module.bpm.service.oa.conversion.OaConversionService;
 import cn.iocoder.yudao.module.bpm.service.oa.conversion.OaConversionService;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
+import org.springdoc.api.annotations.ParameterObject;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -27,7 +27,6 @@ import java.util.List;
 
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 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.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 
 @Tag(name = "管理后台 - 转正流程信息")
 @Tag(name = "管理后台 - 转正流程信息")
 @RestController
 @RestController
@@ -38,87 +37,120 @@ public class OaConversionController {
     @Resource
     @Resource
     private OaConversionService oaConversionService;
     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("/staging")
+    @Operation(summary = "暂存转正审批流程信息")
+    @ApiOperationSupport(order = 1)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:staging')")
+    public CommonResult<Long> stagingOaConversion(@RequestBody OaConversionSaveReqVO stagingReqVO) {
+        Long oaConversionId = oaConversionService.stagingOaConversion(stagingReqVO);
+        return success(oaConversionId, "暂存成功");
     }
     }
 
 
-    @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("/commit")
+    @Operation(summary = "提交转正审批流程信息")
+    @ApiOperationSupport(order = 2)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:commit')")
+    public CommonResult<Long> commitOaConversion(@Valid @RequestBody OaConversionSaveReqVO commitReqVO) {
+        Long oaConversionId = oaConversionService.commitOaConversion(commitReqVO);
+        return success(oaConversionId, "提交成功");
     }
     }
 
 
-    @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("/agree")
+    @Operation(summary = "审批同意转正审批流程信息")
+    @ApiOperationSupport(order = 3)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:agree')")
+    public CommonResult<Long> agreeOaConversion(@Valid @RequestBody BpmTaskApproveReqVO agreeReqVO) {
+        Long result = oaConversionService.agreeOaConversion(agreeReqVO);
+        return success(result, "审批成功");
     }
     }
 
 
-    @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("/disagree")
+    @Operation(summary = "驳回转正审批流程信息")
+    @ApiOperationSupport(order = 4)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:disagree')")
+    public CommonResult<Long> disagreeOaConversion(@Valid @RequestBody BpmTaskReturnReqVO disagreeReqVO) {
+        Long result = oaConversionService.disagreeOaConversion(disagreeReqVO);
+        return success(result, "驳回成功");
     }
     }
 
 
+    @PostMapping("/revocation")
+    @Operation(summary = "撤回转正审批流程信息")
+    @ApiOperationSupport(order = 5)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:revocation')")
+    public CommonResult<Long> revocationOaConversion(@Valid @RequestBody BpmTaskApproveReqVO revocationReqVO) {
+        Long result = oaConversionService.revocationOaConversion(revocationReqVO);
+        return success(result, "撤回成功");
+    }
 
 
-    @PostMapping("/create")
-    @Operation(summary = "创建转正流程信息")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:create')")
-    public CommonResult<Long> createOaConversion(@Valid @RequestBody OaConversionSaveReqVO createReqVO) {
-        return success(oaConversionService.createOaConversion(createReqVO));
+    @PostMapping("/reCommit")
+    @Operation(summary = "驳回或撤回后再次提交转正审批流程信息")
+    @ApiOperationSupport(order = 6)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:re-commit')")
+    public CommonResult<Long> reCommitOaConversion(@Valid @RequestBody OaConversionSaveReqVO reCommitReqVO) {
+        Long result = oaConversionService.reCommitOaConversion(reCommitReqVO);
+        return success(result, "再次提交成功");
     }
     }
 
 
-    @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("/close")
+    @Operation(summary = "驳回或撤回后关闭转正审批流程信息")
+    @ApiOperationSupport(order = 7)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:close')")
+    public CommonResult<Long> closeOaConversion(@RequestParam("id") Long id) {
+        Long result = oaConversionService.closeOaConversion(id);
+
+        return success(result, "关闭成功");
     }
     }
 
 
     @DeleteMapping("/delete")
     @DeleteMapping("/delete")
-    @Operation(summary = "删除转正流程信息")
+    @Operation(summary = "删除转正审批流程信息")
+    @ApiOperationSupport(order = 8)
     @Parameter(name = "id", description = "编号", required = true)
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:delete')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:delete')")
     public CommonResult<Boolean> deleteOaConversion(@RequestParam("id") Long id) {
     public CommonResult<Boolean> deleteOaConversion(@RequestParam("id") Long id) {
         oaConversionService.deleteOaConversion(id);
         oaConversionService.deleteOaConversion(id);
-        return success(true);
+        return success(true, "删除成功");
     }
     }
 
 
     @GetMapping("/get")
     @GetMapping("/get")
-    @Operation(summary = "获得转正流程信息")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:query')")
+    @Operation(summary = "根据id获得转正审批流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1")
+    @ApiOperationSupport(order = 9)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:query-id')")
     public CommonResult<OaConversionRespVO> getOaConversion(@RequestParam("id") Long id) {
     public CommonResult<OaConversionRespVO> getOaConversion(@RequestParam("id") Long id) {
-        OaConversionDO oaConversion = oaConversionService.getOaConversion(id);
-        return success(BeanUtils.toBean(oaConversion, OaConversionRespVO.class));
+        OaConversionRespVO respVO = oaConversionService.getOaConversion(id);
+        return success(respVO, "查询对象成功");
+    }
+
+    @GetMapping("/getByProcInstId")
+    @Operation(summary = "根据流程实例id获得转正审批流程信息")
+    @Parameter(name = "procInstId", description = "流程实例id", required = true, example = "9528a78d-457e-11ef-853c-4c034fce6445")
+    @ApiOperationSupport(order = 10)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:query-proc-inst-id')")
+    public CommonResult<OaConversionRespVO> getOaConversionByProcInstId(@RequestParam("procInstId") String procInstId) {
+        OaConversionRespVO respVO = oaConversionService.getOaConversionByProcInstId(procInstId);
+        return success(respVO, "查询对象成功");
     }
     }
 
 
     @GetMapping("/page")
     @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));
+    @Operation(summary = "获得转正审批流程信息分页")
+    @ApiOperationSupport(order = 11)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:query-page')")
+    public CommonResult<PageResult<OaConversionRespVO>> getOaConversionPage(@Valid @ParameterObject OaConversionPageReqVO pageReqVO) {
+        return success(oaConversionService.getOaConversionPage(pageReqVO), "查询列表成功");
     }
     }
 
 
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
-    @Operation(summary = "导出转正流程信息 Excel")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:export')")
+    @Operation(summary = "导出转正审批流程信息 Excel")
+    @ApiOperationSupport(order = 12)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-conversion:export')")
     @ApiAccessLog(operateType = EXPORT)
     @ApiAccessLog(operateType = EXPORT)
     public void exportOaConversionExcel(@Valid OaConversionPageReqVO pageReqVO,
     public void exportOaConversionExcel(@Valid OaConversionPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
-        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<OaConversionDO> list = oaConversionService.getOaConversionPage(pageReqVO).getList();
+                                       HttpServletResponse response) throws IOException {
+        PageResult<OaConversionRespVO> pageResult = oaConversionService.exportOaConversionExcel(pageReqVO);
+        List<OaConversionRespVO> list = pageResult.getList();
         // 导出 Excel
         // 导出 Excel
-        ExcelUtils.write(response, "转正流程信息.xls", "数据", OaConversionRespVO.class,
-                        BeanUtils.toBean(list, OaConversionRespVO.class));
+        ExcelUtils.write(response, "转正审批流程信息.xls", "数据", OaConversionRespVO.class,
+                BeanUtils.toBean(list, OaConversionRespVO.class));
     }
     }
 
 
 }
 }

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo;
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo;
 
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import lombok.*;
 import lombok.*;
 import java.util.*;
 import java.util.*;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -15,80 +16,29 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @ToString(callSuper = true)
 @ToString(callSuper = true)
 public class OaConversionPageReqVO extends PageParam {
 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 = "李四")
     @Schema(description = "转正员工姓名", example = "李四")
     private String employeeName;
     private String employeeName;
 
 
-    @Schema(description = "用户账号id", example = "23689")
-    private Long userId;
-
-    @Schema(description = "用户账号uuid", example = "14280")
-    private String userUuid;
+    @Schema(description = "转正员工手机号", example = "1394920000")
+    private String employeePhone;
 
 
     @Schema(description = "部门id", example = "14341")
     @Schema(description = "部门id", example = "14341")
     private Long deptId;
     private Long deptId;
 
 
-    @Schema(description = "部门uuid", example = "3755")
-    private String deptUuid;
-
     @Schema(description = "职位")
     @Schema(description = "职位")
     private String position;
     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 = "转正日期")
     @Schema(description = "转正日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private String[] conversionDate;
     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")
     @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)", example = "2")
     private String auditStatus;
     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 = "申请人")
+    private String applyEmployeeName;
 
 
-    @Schema(description = "创建时间")
+    @Schema(description = "申请时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
     private LocalDateTime[] createTime;
 
 

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

@@ -1,5 +1,8 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo;
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.conversion.vo;
 
 
+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 io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import lombok.*;
 import java.util.*;
 import java.util.*;
@@ -25,29 +28,25 @@ public class OaConversionRespVO {
     @ExcelProperty("转正人id")
     @ExcelProperty("转正人id")
     private Long employeeId;
     private Long employeeId;
 
 
-    @Schema(description = "转正人uuid", example = "12691")
-    @ExcelProperty("转正人uuid")
-    private String employeeUuid;
-
     @Schema(description = "转正员工姓名", example = "李四")
     @Schema(description = "转正员工姓名", example = "李四")
     @ExcelProperty("转正员工姓名")
     @ExcelProperty("转正员工姓名")
     private String employeeName;
     private String employeeName;
 
 
+    @Schema(description = "转正员工手机号", example = "1394920000")
+    @ExcelProperty("转正员工手机号")
+    private String employeePhone;
+
     @Schema(description = "用户账号id", example = "23689")
     @Schema(description = "用户账号id", example = "23689")
     @ExcelProperty("用户账号id")
     @ExcelProperty("用户账号id")
     private Long userId;
     private Long userId;
 
 
-    @Schema(description = "用户账号uuid", example = "14280")
-    @ExcelProperty("用户账号uuid")
-    private String userUuid;
-
     @Schema(description = "部门id", example = "14341")
     @Schema(description = "部门id", example = "14341")
     @ExcelProperty("部门id")
     @ExcelProperty("部门id")
     private Long deptId;
     private Long deptId;
 
 
-    @Schema(description = "部门uuid", example = "3755")
-    @ExcelProperty("部门uuid")
-    private String deptUuid;
+    @Schema(description = "部门名称")
+    @ExcelProperty("部门名称")
+    private String deptName;
 
 
     @Schema(description = "职位")
     @Schema(description = "职位")
     @ExcelProperty("职位")
     @ExcelProperty("职位")
@@ -89,28 +88,40 @@ public class OaConversionRespVO {
     @ExcelProperty("当前审核人用户id")
     @ExcelProperty("当前审核人用户id")
     private Long currentAuditUserId;
     private Long currentAuditUserId;
 
 
-    @Schema(description = "当前审核人用户uuid", example = "15583")
-    @ExcelProperty("当前审核人用户uuid")
-    private String currentAuditUserUuid;
-
     @Schema(description = "当前审核人员工id", example = "20635")
     @Schema(description = "当前审核人员工id", example = "20635")
     @ExcelProperty("当前审核人员工id")
     @ExcelProperty("当前审核人员工id")
     private Long currentAuditEmployeeId;
     private Long currentAuditEmployeeId;
 
 
-    @Schema(description = "当前审核人员工uuid", example = "32658")
-    @ExcelProperty("当前审核人员工uuid")
-    private String currentAuditEmployeeUuid;
+    @Schema(description = "当前审核人员工姓名")
+    @ExcelProperty("当前审核人员工姓名")
+    private String currentAuditEmployeeName;
 
 
     @Schema(description = "最后审核时间")
     @Schema(description = "最后审核时间")
     @ExcelProperty("最后审核时间")
     @ExcelProperty("最后审核时间")
     private LocalDateTime finalAuditDate;
     private LocalDateTime finalAuditDate;
 
 
-    @Schema(description = "数据来源,0流程添加、1手动添加")
-    @ExcelProperty("数据来源,0流程添加、1手动添加")
-    private String infoSource;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
+    @Schema(description = "申请时间")
+    @ExcelProperty("申请时间")
     private LocalDateTime createTime;
     private LocalDateTime createTime;
 
 
+    @Schema(description = "申请人id")
+    @ExcelProperty("申请人id")
+    private Long applyEmployeeId;
+
+    @Schema(description = "申请人姓名")
+    @ExcelProperty("申请人姓名")
+    private String applyEmployeeName;
+
+    @Schema(description = "附件列表")
+    private List<FileDTO> fileList;
+
+    @Schema(description = "审批记录列表")
+    private List<BpmTaskRespVO> auditRecordList;
+
+    @Schema(description = "审批人员列表")
+    private List<AdminUserRespDTO> auditUserList;
+
+    @Schema(description = "当前用户待处理的任务id")
+    private String taskId;
+
 }
 }

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

@@ -12,46 +12,19 @@ import java.time.LocalDateTime;
 @Data
 @Data
 public class OaConversionSaveReqVO {
 public class OaConversionSaveReqVO {
 
 
-    @Schema(description = "转正表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27266")
+    @Schema(description = "转正表单主键", example = "1")
     private Long id;
     private Long id;
 
 
-    @Schema(description = "uuid", example = "8575")
-    private String conversionId;
-
-    @Schema(description = "转正人id", example = "8274")
+    @Schema(description = "转正人id", example = "1")
+    @NotNull(message = "转正人id不能为空")
     private Long employeeId;
     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 = "转正日期")
+    @Schema(description = "转正日期", example = "2024-07-24")
+    @NotBlank(message = "转正日期不能为空")
     private String conversionDate;
     private String conversionDate;
 
 
-    @Schema(description = "转正申请理由", example = "不香")
+    @Schema(description = "转正申请理由", example = "转正申请理由")
+    @NotBlank(message = "转正申请理由不能为空")
     private String conversionReason;
     private String conversionReason;
 
 
     @Schema(description = "工作总结")
     @Schema(description = "工作总结")
@@ -60,41 +33,11 @@ public class OaConversionSaveReqVO {
     @Schema(description = "备注")
     @Schema(description = "备注")
     private String remarks;
     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]")
+    @Schema(description = "发起人自选审批人id集合", example = " [100, 1]")
+    @NotEmpty(message = "发起人自选审批人集合不能为空")
     private List<Long> startUserSelectAssignees;
     private List<Long> startUserSelectAssignees;
 
 
-    @Schema(description = "附件主键id", example = "[1, 2]")
+    @Schema(description = "附件主键id集合", example = "[1, 2]")
     private List<Long> fileIdList;
     private List<Long> fileIdList;
 
 
-    @Schema(description = "审批信息")
-    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
-
-
 }
 }

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

@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.entry;
 
 
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 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.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
@@ -10,12 +9,12 @@ 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.OaEntryRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo.OaEntrySaveReqVO;
 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.BpmTaskApproveReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry.OaEntryDO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 import cn.iocoder.yudao.module.bpm.service.oa.entry.OaEntryService;
 import cn.iocoder.yudao.module.bpm.service.oa.entry.OaEntryService;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -27,10 +26,9 @@ import java.util.List;
 
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 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.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 
 
 
-@Tag(name = "管理后台 - 入职流程信息")
+@Tag(name = "管理后台 - 入职审批流程信息")
 @RestController
 @RestController
 @RequestMapping("/bpm/oa-entry")
 @RequestMapping("/bpm/oa-entry")
 @Validated
 @Validated
@@ -39,86 +37,119 @@ public class OaEntryController {
     @Resource
     @Resource
     private OaEntryService oaEntryService;
     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("/staging")
+    @Operation(summary = "暂存入职审批流程信息")
+    @ApiOperationSupport(order = 1)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:staging')")
+    public CommonResult<Long> stagingOaEntry(@RequestBody OaEntrySaveReqVO stagingReqVO) {
+        Long oaEntryId = oaEntryService.stagingOaEntry(stagingReqVO);
+        return success(oaEntryId, "暂存成功");
     }
     }
 
 
-    @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("/commit")
+    @Operation(summary = "提交入职审批流程信息")
+    @ApiOperationSupport(order = 2)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:commit')")
+    public CommonResult<Long> commitOaEntry(@Valid @RequestBody OaEntrySaveReqVO commitReqVO) {
+        Long oaEntryId = oaEntryService.commitOaEntry(commitReqVO);
+        return success(oaEntryId, "提交成功");
     }
     }
 
 
-    @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("/agree")
+    @Operation(summary = "审批同意入职审批流程信息")
+    @ApiOperationSupport(order = 3)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:agree')")
+    public CommonResult<Long> agreeOaEntry(@Valid @RequestBody BpmTaskApproveReqVO agreeReqVO) {
+        Long result = oaEntryService.agreeOaEntry(agreeReqVO);
+        return success(result, "审批成功");
     }
     }
 
 
-    @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("/disagree")
+    @Operation(summary = "驳回入职审批流程信息")
+    @ApiOperationSupport(order = 4)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:disagree')")
+    public CommonResult<Long> disagreeOaEntry(@Valid @RequestBody BpmTaskReturnReqVO disagreeReqVO) {
+        Long result = oaEntryService.disagreeOaEntry(disagreeReqVO);
+        return success(result, "驳回成功");
     }
     }
 
 
-//    @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);
-//    }
+    @PostMapping("/revocation")
+    @Operation(summary = "撤回入职审批流程信息")
+    @ApiOperationSupport(order = 5)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:revocation')")
+    public CommonResult<Long> revocationOaEntry(@Valid @RequestBody BpmTaskApproveReqVO revocationReqVO) {
+        Long result = oaEntryService.revocationOaEntry(revocationReqVO);
+        return success(result, "撤回成功");
+    }
+
+    @PostMapping("/reCommit")
+    @Operation(summary = "驳回或撤回后再次提交入职审批流程信息")
+    @ApiOperationSupport(order = 6)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:re-commit')")
+    public CommonResult<Long> reCommitOaEntry(@Valid @RequestBody OaEntrySaveReqVO reCommitReqVO) {
+        Long result = oaEntryService.reCommitOaEntry(reCommitReqVO);
+        return success(result, "再次提交成功");
+    }
+
+    @DeleteMapping("/close")
+    @Operation(summary = "驳回或撤回后关闭入职审批流程信息")
+    @ApiOperationSupport(order = 7)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:close')")
+    public CommonResult<Long> closeOaEntry(@RequestParam("id") Long id) {
+        Long result = oaEntryService.closeOaEntry(id);
+
+        return success(result, "关闭成功");
+    }
 
 
     @DeleteMapping("/delete")
     @DeleteMapping("/delete")
-    @Operation(summary = "删除入职流程信息")
+    @Operation(summary = "删除入职审批流程信息")
+    @ApiOperationSupport(order = 8)
     @Parameter(name = "id", description = "编号", required = true)
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:delete')")
-    public CommonResult<Boolean> deleteOaEntry(@RequestParam("id") Integer id) {
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:delete')")
+    public CommonResult<Boolean> deleteOaEntry(@RequestParam("id") Long id) {
         oaEntryService.deleteOaEntry(id);
         oaEntryService.deleteOaEntry(id);
-        return success(true);
+        return success(true, "删除成功");
     }
     }
 
 
     @GetMapping("/get")
     @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));
+    @Operation(summary = "根据id获得入职审批流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1")
+    @ApiOperationSupport(order = 9)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:query-id')")
+    public CommonResult<OaEntryRespVO> getOaEntry(@RequestParam("id") Long id) {
+        OaEntryRespVO respVO = oaEntryService.getOaEntry(id);
+        return success(respVO, "查询对象成功");
+    }
+
+    @GetMapping("/getByProcInstId")
+    @Operation(summary = "根据流程实例id获得入职审批流程信息")
+    @Parameter(name = "procInstId", description = "流程实例id", required = true, example = "9528a78d-457e-11ef-853c-4c034fce6445")
+    @ApiOperationSupport(order = 10)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:query-proc-inst-id')")
+    public CommonResult<OaEntryRespVO> getOaEntryByProcInstId(@RequestParam("procInstId") String procInstId) {
+        OaEntryRespVO respVO = oaEntryService.getOaEntryByProcInstId(procInstId);
+        return success(respVO, "查询对象成功");
     }
     }
 
 
     @GetMapping("/page")
     @GetMapping("/page")
-    @Operation(summary = "获得入职流程信息分页")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:query')")
+    @Operation(summary = "获得入职审批流程信息分页")
+    @ApiOperationSupport(order = 11)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:query-page')")
     public CommonResult<PageResult<OaEntryRespVO>> getOaEntryPage(@Valid OaEntryPageReqVO pageReqVO) {
     public CommonResult<PageResult<OaEntryRespVO>> getOaEntryPage(@Valid OaEntryPageReqVO pageReqVO) {
-        PageResult<OaEntryDO> pageResult = oaEntryService.getOaEntryPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, OaEntryRespVO.class));
+        return success(oaEntryService.getOaEntryPage(pageReqVO), "查询列表成功");
     }
     }
 
 
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
-    @Operation(summary = "导出入职流程信息 Excel")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:export')")
+    @Operation(summary = "导出入职审批流程信息 Excel")
+    @ApiOperationSupport(order = 12)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:export')")
     @ApiAccessLog(operateType = EXPORT)
     @ApiAccessLog(operateType = EXPORT)
     public void exportOaEntryExcel(@Valid OaEntryPageReqVO pageReqVO,
     public void exportOaEntryExcel(@Valid OaEntryPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
-        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<OaEntryDO> list = oaEntryService.getOaEntryPage(pageReqVO).getList();
+                                       HttpServletResponse response) throws IOException {
+        PageResult<OaEntryRespVO> pageResult = oaEntryService.exportOaEntryExcel(pageReqVO);
+        List<OaEntryRespVO> list = pageResult.getList();
         // 导出 Excel
         // 导出 Excel
-        ExcelUtils.write(response, "入职流程信息.xls", "数据", OaEntryRespVO.class,
-                        BeanUtils.toBean(list, OaEntryRespVO.class));
+        ExcelUtils.write(response, "入职审批流程信息.xls", "数据", OaEntryRespVO.class,
+                BeanUtils.toBean(list, OaEntryRespVO.class));
     }
     }
-
 }
 }

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

@@ -17,6 +17,9 @@ public class OaEntryPageReqVO extends PageParam {
     @Schema(description = "uuid", example = "13471")
     @Schema(description = "uuid", example = "13471")
     private String entryId;
     private String entryId;
 
 
+    @Schema(description = "入职人", example = "李四")
+    private String entryName;
+
     @Schema(description = "部门", example = "2937")
     @Schema(description = "部门", example = "2937")
     private String deptId;
     private String deptId;
 
 
@@ -29,7 +32,7 @@ public class OaEntryPageReqVO extends PageParam {
     @Schema(description = "性别")
     @Schema(description = "性别")
     private String gender;
     private String gender;
 
 
-    @Schema(description = "出日期")
+    @Schema(description = "出日期")
     private String birthday;
     private String birthday;
 
 
     @Schema(description = "联系电话")
     @Schema(description = "联系电话")
@@ -44,6 +47,10 @@ public class OaEntryPageReqVO extends PageParam {
     @Schema(description = "工作经验")
     @Schema(description = "工作经验")
     private String workExperience;
     private String workExperience;
 
 
+    @Schema(description = "入职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] entryDate;
+
     @Schema(description = "备注")
     @Schema(description = "备注")
     private String remarks;
     private String remarks;
 
 
@@ -55,12 +62,6 @@ public class OaEntryPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
     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")
     @Schema(description = "流程实例id", example = "9407")
     private String procInstId;
     private String procInstId;

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

@@ -1,23 +1,42 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.vo;
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.entry.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 io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import lombok.*;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.List;
+
 import com.alibaba.excel.annotation.*;
 import com.alibaba.excel.annotation.*;
+import org.springframework.format.annotation.DateTimeFormat;
 
 
 @Schema(description = "管理后台 - 入职流程信息 Response VO")
 @Schema(description = "管理后台 - 入职流程信息 Response VO")
 @Data
 @Data
 @ExcelIgnoreUnannotated
 @ExcelIgnoreUnannotated
 public class OaEntryRespVO {
 public class OaEntryRespVO {
 
 
+    @Schema(description = "入职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27428")
+    @ExcelProperty("入职表单主键")
+    private Integer id;
+
     @Schema(description = "uuid", example = "13471")
     @Schema(description = "uuid", example = "13471")
     @ExcelProperty("uuid")
     @ExcelProperty("uuid")
     private String entryId;
     private String entryId;
 
 
+    @Schema(description = "入职人", example = "李四")
+    @ExcelProperty("入职人")
+    private String entryName;
+
     @Schema(description = "部门", example = "2937")
     @Schema(description = "部门", example = "2937")
     @ExcelProperty("部门")
     @ExcelProperty("部门")
-    private String deptId;
+    private Long deptId;
+
+    @Schema(description = "部门名称")
+    @ExcelProperty("部门名称")
+    private String deptName;
 
 
     @Schema(description = "职位")
     @Schema(description = "职位")
     @ExcelProperty("职位")
     @ExcelProperty("职位")
@@ -31,8 +50,8 @@ public class OaEntryRespVO {
     @ExcelProperty("性别")
     @ExcelProperty("性别")
     private String gender;
     private String gender;
 
 
-    @Schema(description = "出日期")
-    @ExcelProperty("出日期")
+    @Schema(description = "出日期")
+    @ExcelProperty("出日期")
     private String birthday;
     private String birthday;
 
 
     @Schema(description = "联系电话")
     @Schema(description = "联系电话")
@@ -59,18 +78,6 @@ public class OaEntryRespVO {
     @ExcelProperty("最后审核时间")
     @ExcelProperty("最后审核时间")
     private String finalAuditDate;
     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 = "入职日期")
     @Schema(description = "入职日期")
     @ExcelProperty("入职日期")
     @ExcelProperty("入职日期")
     private String entryDate;
     private String entryDate;
@@ -83,12 +90,49 @@ public class OaEntryRespVO {
     @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5驳回)")
     @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5驳回)")
     private String auditStatus;
     private String auditStatus;
 
 
-    @Schema(description = "当前审核人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29870")
-    @ExcelProperty("当前审核人编号")
-    private String currentAuditEmployeeId;
+    @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 = "数据来源,0流程添加、1手动添加", requiredMode = Schema.RequiredMode.REQUIRED)
     @Schema(description = "数据来源,0流程添加、1手动添加", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("数据来源,0流程添加、1手动添加")
     @ExcelProperty("数据来源,0流程添加、1手动添加")
     private String infoSource;
     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;
+
+    @Schema(description = "当前用户待处理的任务id")
+    private String taskId;
+
 }
 }

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

@@ -4,37 +4,46 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveR
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
 
 
+import javax.validation.constraints.NotBlank;
 import java.util.List;
 import java.util.List;
 
 
 @Schema(description = "管理后台 - 入职流程信息新增/修改 Request VO")
 @Schema(description = "管理后台 - 入职流程信息新增/修改 Request VO")
 @Data
 @Data
 public class OaEntrySaveReqVO {
 public class OaEntrySaveReqVO {
 
 
+    @Schema(description = "入职表单主键", example = "1")
+    private Long id;
+
     @Schema(description = "入职人", example = "李四")
     @Schema(description = "入职人", example = "李四")
+    @NotBlank(message = "入职人不能为空")
     private String entryName;
     private String entryName;
 
 
-    @Schema(description = "uuid", example = "13471")
-    private String entryId;
-
     @Schema(description = "部门", example = "2937")
     @Schema(description = "部门", example = "2937")
+    @NotBlank(message = "部门不能为空")
     private String deptId;
     private String deptId;
 
 
     @Schema(description = "职位")
     @Schema(description = "职位")
+    @NotBlank(message = "职位不能为空")
     private String position;
     private String position;
 
 
     @Schema(description = "员工类型", example = "1")
     @Schema(description = "员工类型", example = "1")
+    @NotBlank(message = "员工类型不能为空")
     private String employeeType;
     private String employeeType;
 
 
     @Schema(description = "性别")
     @Schema(description = "性别")
+    @NotBlank(message = "性别不能为空")
     private String gender;
     private String gender;
 
 
-    @Schema(description = "出身日期")
+    @Schema(description = "出生日期")
+    @NotBlank(message = "出生日期不能为空")
     private String birthday;
     private String birthday;
 
 
     @Schema(description = "联系电话")
     @Schema(description = "联系电话")
+    @NotBlank(message = "联系电话不能为空")
     private String contactNumber;
     private String contactNumber;
 
 
     @Schema(description = "电子邮箱")
     @Schema(description = "电子邮箱")
+    @NotBlank(message = "电子邮箱不能为空")
     private String email;
     private String email;
 
 
     @Schema(description = "教育背景", example = "本科")
     @Schema(description = "教育背景", example = "本科")
@@ -46,40 +55,14 @@ public class OaEntrySaveReqVO {
     @Schema(description = "备注")
     @Schema(description = "备注")
     private String remarks;
     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 = "入职日期")
     @Schema(description = "入职日期")
+    @NotBlank(message = "入职日期不能为空")
     private String entryDate;
     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]")
+    @Schema(description = "发起人自选审批人 Map", example = " [100, 1]")
     private List<Long> startUserSelectAssignees;
     private List<Long> startUserSelectAssignees;
 
 
     @Schema(description = "附件主键id", example = "[1, 2]")
     @Schema(description = "附件主键id", example = "[1, 2]")
     private List<Long> fileIdList;
     private List<Long> fileIdList;
 
 
-    @Schema(description = "审批信息")
-    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
-
 }
 }

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

@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.renew;
 
 
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 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.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
@@ -10,12 +9,13 @@ 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.OaRenewRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo.OaRenewSaveReqVO;
 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.BpmTaskApproveReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.renew.OaRenewDO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 import cn.iocoder.yudao.module.bpm.service.oa.renew.OaRenewService;
 import cn.iocoder.yudao.module.bpm.service.oa.renew.OaRenewService;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
+import org.springdoc.api.annotations.ParameterObject;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -27,7 +27,6 @@ import java.util.List;
 
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 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.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 
 @Tag(name = "管理后台 - 合同续签流程信息")
 @Tag(name = "管理后台 - 合同续签流程信息")
 @RestController
 @RestController
@@ -38,87 +37,120 @@ public class OaRenewController {
     @Resource
     @Resource
     private OaRenewService oaRenewService;
     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("/staging")
+    @Operation(summary = "暂存续签审批流程信息")
+    @ApiOperationSupport(order = 1)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:staging')")
+    public CommonResult<Long> stagingOaRenew(@RequestBody OaRenewSaveReqVO stagingReqVO) {
+        Long oaRenewId = oaRenewService.stagingOaRenew(stagingReqVO);
+        return success(oaRenewId, "暂存成功");
     }
     }
 
 
-    @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("/commit")
+    @Operation(summary = "提交续签审批流程信息")
+    @ApiOperationSupport(order = 2)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:commit')")
+    public CommonResult<Long> commitOaRenew(@Valid @RequestBody OaRenewSaveReqVO commitReqVO) {
+        Long oaRenewId = oaRenewService.commitOaRenew(commitReqVO);
+        return success(oaRenewId, "提交成功");
     }
     }
 
 
-    @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("/agree")
+    @Operation(summary = "审批同意续签审批流程信息")
+    @ApiOperationSupport(order = 3)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:agree')")
+    public CommonResult<Long> agreeOaRenew(@Valid @RequestBody BpmTaskApproveReqVO agreeReqVO) {
+        Long result = oaRenewService.agreeOaRenew(agreeReqVO);
+        return success(result, "审批成功");
     }
     }
 
 
-    @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("/disagree")
+    @Operation(summary = "驳回续签审批流程信息")
+    @ApiOperationSupport(order = 4)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:disagree')")
+    public CommonResult<Long> disagreeOaRenew(@Valid @RequestBody BpmTaskReturnReqVO disagreeReqVO) {
+        Long result = oaRenewService.disagreeOaRenew(disagreeReqVO);
+        return success(result, "驳回成功");
     }
     }
 
 
+    @PostMapping("/revocation")
+    @Operation(summary = "撤回续签审批流程信息")
+    @ApiOperationSupport(order = 5)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:revocation')")
+    public CommonResult<Long> revocationOaRenew(@Valid @RequestBody BpmTaskApproveReqVO revocationReqVO) {
+        Long result = oaRenewService.revocationOaRenew(revocationReqVO);
+        return success(result, "撤回成功");
+    }
 
 
-    @PostMapping("/create")
-    @Operation(summary = "创建合同续签流程信息")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:create')")
-    public CommonResult<Long> createOaRenew(@Valid @RequestBody OaRenewSaveReqVO createReqVO) {
-        return success(oaRenewService.createOaRenew(createReqVO));
+    @PostMapping("/reCommit")
+    @Operation(summary = "驳回或撤回后再次提交续签审批流程信息")
+    @ApiOperationSupport(order = 6)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:re-commit')")
+    public CommonResult<Long> reCommitOaRenew(@Valid @RequestBody OaRenewSaveReqVO reCommitReqVO) {
+        Long result = oaRenewService.reCommitOaRenew(reCommitReqVO);
+        return success(result, "再次提交成功");
     }
     }
 
 
-    @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("/close")
+    @Operation(summary = "驳回或撤回后关闭续签审批流程信息")
+    @ApiOperationSupport(order = 7)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:close')")
+    public CommonResult<Long> closeOaRenew(@RequestParam("id") Long id) {
+        Long result = oaRenewService.closeOaRenew(id);
+
+        return success(result, "关闭成功");
     }
     }
 
 
     @DeleteMapping("/delete")
     @DeleteMapping("/delete")
-    @Operation(summary = "删除合同续签流程信息")
+    @Operation(summary = "删除续签审批流程信息")
+    @ApiOperationSupport(order = 8)
     @Parameter(name = "id", description = "编号", required = true)
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:delete')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:delete')")
     public CommonResult<Boolean> deleteOaRenew(@RequestParam("id") Long id) {
     public CommonResult<Boolean> deleteOaRenew(@RequestParam("id") Long id) {
         oaRenewService.deleteOaRenew(id);
         oaRenewService.deleteOaRenew(id);
-        return success(true);
+        return success(true, "删除成功");
     }
     }
 
 
     @GetMapping("/get")
     @GetMapping("/get")
-    @Operation(summary = "获得合同续签流程信息")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:query')")
+    @Operation(summary = "根据id获得续签审批流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1")
+    @ApiOperationSupport(order = 9)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:query-id')")
     public CommonResult<OaRenewRespVO> getOaRenew(@RequestParam("id") Long id) {
     public CommonResult<OaRenewRespVO> getOaRenew(@RequestParam("id") Long id) {
-        OaRenewDO oaRenew = oaRenewService.getOaRenew(id);
-        return success(BeanUtils.toBean(oaRenew, OaRenewRespVO.class));
+        OaRenewRespVO respVO = oaRenewService.getOaRenew(id);
+        return success(respVO, "查询对象成功");
+    }
+
+    @GetMapping("/getByProcInstId")
+    @Operation(summary = "根据流程实例id获得续签审批流程信息")
+    @Parameter(name = "procInstId", description = "流程实例id", required = true, example = "9528a78d-457e-11ef-853c-4c034fce6445")
+    @ApiOperationSupport(order = 10)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:query-proc-inst-id')")
+    public CommonResult<OaRenewRespVO> getOaRenewByProcInstId(@RequestParam("procInstId") String procInstId) {
+        OaRenewRespVO respVO = oaRenewService.getOaRenewByProcInstId(procInstId);
+        return success(respVO, "查询对象成功");
     }
     }
 
 
     @GetMapping("/page")
     @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));
+    @Operation(summary = "获得续签审批流程信息分页")
+    @ApiOperationSupport(order = 11)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:query-page')")
+    public CommonResult<PageResult<OaRenewRespVO>> getOaRenewPage(@Valid @ParameterObject OaRenewPageReqVO pageReqVO) {
+        return success(oaRenewService.getOaRenewPage(pageReqVO), "查询列表成功");
     }
     }
 
 
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
-    @Operation(summary = "导出合同续签流程信息 Excel")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-renew:export')")
+    @Operation(summary = "导出续签审批流程信息 Excel")
+    @ApiOperationSupport(order = 12)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-renew:export')")
     @ApiAccessLog(operateType = EXPORT)
     @ApiAccessLog(operateType = EXPORT)
     public void exportOaRenewExcel(@Valid OaRenewPageReqVO pageReqVO,
     public void exportOaRenewExcel(@Valid OaRenewPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
-        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<OaRenewDO> list = oaRenewService.getOaRenewPage(pageReqVO).getList();
+                                        HttpServletResponse response) throws IOException {
+        PageResult<OaRenewRespVO> pageResult = oaRenewService.exportOaRenewExcel(pageReqVO);
+        List<OaRenewRespVO> list = pageResult.getList();
         // 导出 Excel
         // 导出 Excel
-        ExcelUtils.write(response, "合同续签流程信息.xls", "数据", OaRenewRespVO.class,
-                        BeanUtils.toBean(list, OaRenewRespVO.class));
+        ExcelUtils.write(response, "续签审批流程信息.xls", "数据", OaRenewRespVO.class,
+                BeanUtils.toBean(list, OaRenewRespVO.class));
     }
     }
 
 
 }
 }

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

@@ -15,44 +15,18 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @ToString(callSuper = true)
 @ToString(callSuper = true)
 public class OaRenewPageReqVO extends PageParam {
 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 = "赵六")
+    @Schema(description = "续签员工姓名", example = "赵六")
     private String employeeName;
     private String employeeName;
 
 
-    @Schema(description = "用户账号id", example = "16762")
-    private Long userId;
-
-    @Schema(description = "用户账号uuid", example = "12052")
-    private String userUuid;
+    @Schema(description = "续签员工手机号", example = "1394920000")
+    private String employeePhone;
 
 
     @Schema(description = "部门id", example = "28162")
     @Schema(description = "部门id", example = "28162")
     private Long deptId;
     private Long deptId;
 
 
-    @Schema(description = "部门uuid", example = "17499")
-    private String deptUuid;
-
     @Schema(description = "职位")
     @Schema(description = "职位")
     private String position;
     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 = "续签开始日期")
     @Schema(description = "续签开始日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private String[] renewContractStartDate;
     private String[] renewContractStartDate;
@@ -61,41 +35,13 @@ public class OaRenewPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private String[] renewContractEndDate;
     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")
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回、6已撤回)", example = "1")
     private String auditStatus;
     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 = "申请人")
+    private String applyEmployeeName;
 
 
-    @Schema(description = "创建时间")
+    @Schema(description = "申请时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
     private LocalDateTime[] createTime;
 
 

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

@@ -1,5 +1,8 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo;
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.renew.vo;
 
 
+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 io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import lombok.*;
 import java.util.*;
 import java.util.*;
@@ -13,7 +16,7 @@ import com.alibaba.excel.annotation.*;
 @ExcelIgnoreUnannotated
 @ExcelIgnoreUnannotated
 public class OaRenewRespVO {
 public class OaRenewRespVO {
 
 
-    @Schema(description = "续签表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31139")
+    @Schema(description = "续签表单主键", example = "1")
     @ExcelProperty("续签表单主键")
     @ExcelProperty("续签表单主键")
     private Long id;
     private Long id;
 
 
@@ -21,18 +24,22 @@ public class OaRenewRespVO {
     @ExcelProperty("uuid")
     @ExcelProperty("uuid")
     private String renewId;
     private String renewId;
 
 
-    @Schema(description = "转正人id", example = "4530")
-    @ExcelProperty("转正人id")
+    @Schema(description = "续签人id", example = "4530")
+    @ExcelProperty("续签人id")
     private Long employeeId;
     private Long employeeId;
 
 
-    @Schema(description = "转正人uuid", example = "24001")
-    @ExcelProperty("转正人uuid")
+    @Schema(description = "续签人uuid", example = "24001")
+    @ExcelProperty("续签人uuid")
     private String employeeUuid;
     private String employeeUuid;
 
 
-    @Schema(description = "转正员工姓名", example = "赵六")
-    @ExcelProperty("转正员工姓名")
+    @Schema(description = "续签员工姓名", example = "赵六")
+    @ExcelProperty("续签员工姓名")
     private String employeeName;
     private String employeeName;
 
 
+    @Schema(description = "续签员工手机号", example = "1394920000")
+    @ExcelProperty("续签员工手机号")
+    private String employeePhone;
+
     @Schema(description = "用户账号id", example = "16762")
     @Schema(description = "用户账号id", example = "16762")
     @ExcelProperty("用户账号id")
     @ExcelProperty("用户账号id")
     private Long userId;
     private Long userId;
@@ -49,6 +56,10 @@ public class OaRenewRespVO {
     @ExcelProperty("部门uuid")
     @ExcelProperty("部门uuid")
     private String deptUuid;
     private String deptUuid;
 
 
+    @Schema(description = "部门名称")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
     @Schema(description = "职位")
     @Schema(description = "职位")
     @ExcelProperty("职位")
     @ExcelProperty("职位")
     private String position;
     private String position;
@@ -109,16 +120,36 @@ public class OaRenewRespVO {
     @ExcelProperty("当前审核人员工uuid")
     @ExcelProperty("当前审核人员工uuid")
     private String currentAuditEmployeeUuid;
     private String currentAuditEmployeeUuid;
 
 
+    @Schema(description = "当前审核人员工姓名")
+    @ExcelProperty("当前审核人员工姓名")
+    private String currentAuditEmployeeName;
+
     @Schema(description = "最后审核时间")
     @Schema(description = "最后审核时间")
     @ExcelProperty("最后审核时间")
     @ExcelProperty("最后审核时间")
     private LocalDateTime finalAuditDate;
     private LocalDateTime finalAuditDate;
 
 
-    @Schema(description = "数据来源,0流程添加、1手动添加")
-    @ExcelProperty("数据来源,0流程添加、1手动添加")
-    private String infoSource;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
+    @Schema(description = "申请时间")
+    @ExcelProperty("申请时间")
     private LocalDateTime createTime;
     private LocalDateTime createTime;
 
 
+    @Schema(description = "申请人id")
+    @ExcelProperty("申请人id")
+    private Long applyEmployeeId;
+
+    @Schema(description = "申请人姓名")
+    @ExcelProperty("申请人姓名")
+    private String applyEmployeeName;
+
+    @Schema(description = "附件列表")
+    private List<FileDTO> fileList;
+
+    @Schema(description = "审批记录列表")
+    private List<BpmTaskRespVO> auditRecordList;
+
+    @Schema(description = "审批人员列表")
+    private List<AdminUserRespDTO> auditUserList;
+
+    @Schema(description = "当前用户待处理的任务id")
+    private String taskId;
+
 }
 }

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

@@ -4,6 +4,8 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveR
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
 
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.List;
 
 
@@ -11,52 +13,27 @@ import java.util.List;
 @Data
 @Data
 public class OaRenewSaveReqVO {
 public class OaRenewSaveReqVO {
 
 
-    @Schema(description = "续签表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31139")
+    @Schema(description = "续签表单主键", example = "1")
     private Long id;
     private Long id;
 
 
-    @Schema(description = "uuid", example = "14308")
-    private String renewId;
-
-    @Schema(description = "转正人id", example = "4530")
+    @Schema(description = "续签人id", example = "1")
+    @NotNull(message = "续签人id不能为空")
     private Long employeeId;
     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 = "续签合同期限")
+    @Schema(description = "续签合同期限,单位:月")
+    @NotBlank(message = "续签合同期限,单位:月,不能为空")
     private String renewPeriod;
     private String renewPeriod;
 
 
     @Schema(description = "续签开始日期")
     @Schema(description = "续签开始日期")
+    @NotBlank(message = "续签开始日期,不能为空")
     private String renewContractStartDate;
     private String renewContractStartDate;
 
 
     @Schema(description = "续签结束日期")
     @Schema(description = "续签结束日期")
+    @NotBlank(message = "续签结束日期,不能为空")
     private String renewContractEndDate;
     private String renewContractEndDate;
 
 
     @Schema(description = "续签理由", example = "不喜欢")
     @Schema(description = "续签理由", example = "不喜欢")
+    @NotBlank(message = "续签理由,不能为空")
     private String renewReason;
     private String renewReason;
 
 
     @Schema(description = "工作表现")
     @Schema(description = "工作表现")
@@ -65,41 +42,10 @@ public class OaRenewSaveReqVO {
     @Schema(description = "备注")
     @Schema(description = "备注")
     private String remarks;
     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]")
+    @Schema(description = "发起人自选审批人id集合", example = " [100, 1]")
     private List<Long> startUserSelectAssignees;
     private List<Long> startUserSelectAssignees;
 
 
-    @Schema(description = "附件主键id", example = "[1, 2]")
+    @Schema(description = "附件主键id集合", example = "[1, 2]")
     private List<Long> fileIdList;
     private List<Long> fileIdList;
 
 
-    @Schema(description = "审批信息")
-    private BpmTaskApproveReqVO bpmTaskApproveReqVO;
-
-
 }
 }

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

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission;
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover;
 
 
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@@ -6,12 +6,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 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.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 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.oa.turnover.vo.OaTurnoverPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo.OaTurnoverRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo.OaTurnoverSaveReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
 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 cn.iocoder.yudao.module.bpm.dal.dataobject.oa.turnover.OaTurnoverDO;
+import cn.iocoder.yudao.module.bpm.service.oa.turnover.OaTurnoverService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -33,53 +33,53 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
 @RestController
 @RestController
 @RequestMapping("/bpm/oa-dimission")
 @RequestMapping("/bpm/oa-dimission")
 @Validated
 @Validated
-public class OaDimissionController {
+public class OaTurnoverController {
 
 
     @Resource
     @Resource
-    private OaDimissionService oaDimissionService;
+    private OaTurnoverService oaTurnoverService;
 
 
 
 
     @PostMapping("/start")
     @PostMapping("/start")
     @Operation(summary = "提交或暂存离职流程信息")
     @Operation(summary = "提交或暂存离职流程信息")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-Dimission:start')")
-    public CommonResult<Long> startOaDimission(@Valid @RequestBody OaDimissionSaveReqVO createReqVO) {
-        return success(oaDimissionService.startOaDimission(getLoginUserId(), createReqVO));
+    @PreAuthorize("@ss.hasPermission('bpm:oa-Turnover:start')")
+    public CommonResult<Long> startOaTurnover(@Valid @RequestBody OaTurnoverSaveReqVO createReqVO) {
+        return success(oaTurnoverService.startOaTurnover(getLoginUserId(), createReqVO));
     }
     }
 
 
     @PostMapping("/completeTure")
     @PostMapping("/completeTure")
     @Operation(summary = "审批同意离职流程信息")
     @Operation(summary = "审批同意离职流程信息")
     @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-true')")
     @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-true')")
-    public CommonResult<Long> completeTrueOaDimission(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
-        return success(oaDimissionService.completeTrueOaDimission(getLoginUserId(), reqVO));
+    public CommonResult<Long> completeTrueOaTurnover(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaTurnoverService.completeTrueOaTurnover(getLoginUserId(), reqVO));
     }
     }
 
 
     @PostMapping("/completeFalse")
     @PostMapping("/completeFalse")
     @Operation(summary = "驳回或撤回离职流程信息")
     @Operation(summary = "驳回或撤回离职流程信息")
     @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-false')")
     @PreAuthorize("@ss.hasPermission('bpm:oa-entry:complete-false')")
-    public CommonResult<Long> completeFalseOaDimission(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
-        return success(oaDimissionService.completeFalseOaDimission(getLoginUserId(), reqVO));
+    public CommonResult<Long> completeFalseOaTurnover(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        return success(oaTurnoverService.completeFalseOaTurnover(getLoginUserId(), reqVO));
     }
     }
 
 
     @PostMapping("/updateComplete")
     @PostMapping("/updateComplete")
     @Operation(summary = "驳回和撤回后再次提交或关闭离职流程信息")
     @Operation(summary = "驳回和撤回后再次提交或关闭离职流程信息")
     @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update-complete')")
     @PreAuthorize("@ss.hasPermission('bpm:oa-entry:update-complete')")
-    public CommonResult<Long> updateCompleteOaDimission(@Valid @RequestBody OaDimissionSaveReqVO createReqVO) {
-        return success(oaDimissionService.updateCompleteOaDimission(getLoginUserId(), createReqVO, createReqVO.getBpmTaskApproveReqVO()));
+    public CommonResult<Long> updateCompleteOaTurnover(@Valid @RequestBody OaTurnoverSaveReqVO createReqVO) {
+        return success(oaTurnoverService.updateCompleteOaTurnover(getLoginUserId(), createReqVO, createReqVO.getBpmTaskApproveReqVO()));
     }
     }
 
 
 
 
     @PostMapping("/create")
     @PostMapping("/create")
     @Operation(summary = "创建离职流程信息")
     @Operation(summary = "创建离职流程信息")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:create')")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:create')")
-    public CommonResult<Long> createOaDimission(@Valid @RequestBody OaDimissionSaveReqVO createReqVO) {
-        return success(oaDimissionService.createOaDimission(createReqVO));
+    public CommonResult<Long> createOaTurnover(@Valid @RequestBody OaTurnoverSaveReqVO createReqVO) {
+        return success(oaTurnoverService.createOaTurnover(createReqVO));
     }
     }
 
 
     @PutMapping("/update")
     @PutMapping("/update")
     @Operation(summary = "更新离职流程信息")
     @Operation(summary = "更新离职流程信息")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:update')")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:update')")
-    public CommonResult<Boolean> updateOaDimission(@Valid @RequestBody OaDimissionSaveReqVO updateReqVO) {
-        oaDimissionService.updateOaDimission(updateReqVO);
+    public CommonResult<Boolean> updateOaTurnover(@Valid @RequestBody OaTurnoverSaveReqVO updateReqVO) {
+        oaTurnoverService.updateOaTurnover(updateReqVO);
         return success(true);
         return success(true);
     }
     }
 
 
@@ -87,8 +87,8 @@ public class OaDimissionController {
     @Operation(summary = "删除离职流程信息")
     @Operation(summary = "删除离职流程信息")
     @Parameter(name = "id", description = "编号", required = true)
     @Parameter(name = "id", description = "编号", required = true)
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:delete')")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:delete')")
-    public CommonResult<Boolean> deleteOaDimission(@RequestParam("id") Long id) {
-        oaDimissionService.deleteOaDimission(id);
+    public CommonResult<Boolean> deleteOaTurnover(@RequestParam("id") Long id) {
+        oaTurnoverService.deleteOaTurnover(id);
         return success(true);
         return success(true);
     }
     }
 
 
@@ -96,30 +96,30 @@ public class OaDimissionController {
     @Operation(summary = "获得离职流程信息")
     @Operation(summary = "获得离职流程信息")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:query')")
     @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));
+    public CommonResult<OaTurnoverRespVO> getOaTurnover(@RequestParam("id") Long id) {
+        OaTurnoverDO oaTurnover = oaTurnoverService.getOaTurnover(id);
+        return success(BeanUtils.toBean(oaTurnover, OaTurnoverRespVO.class));
     }
     }
 
 
     @GetMapping("/page")
     @GetMapping("/page")
     @Operation(summary = "获得离职流程信息分页")
     @Operation(summary = "获得离职流程信息分页")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:query')")
     @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));
+    public CommonResult<PageResult<OaTurnoverRespVO>> getOaTurnoverPage(@Valid OaTurnoverPageReqVO pageReqVO) {
+        PageResult<OaTurnoverDO> pageResult = oaTurnoverService.getOaTurnoverPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, OaTurnoverRespVO.class));
     }
     }
 
 
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
     @Operation(summary = "导出离职流程信息 Excel")
     @Operation(summary = "导出离职流程信息 Excel")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:export')")
     @PreAuthorize("@ss.hasPermission('bpm:oa-dimission:export')")
     @ApiAccessLog(operateType = EXPORT)
     @ApiAccessLog(operateType = EXPORT)
-    public void exportOaDimissionExcel(@Valid OaDimissionPageReqVO pageReqVO,
+    public void exportOaTurnoverExcel(@Valid OaTurnoverPageReqVO pageReqVO,
               HttpServletResponse response) throws IOException {
               HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<OaDimissionDO> list = oaDimissionService.getOaDimissionPage(pageReqVO).getList();
+        List<OaTurnoverDO> list = oaTurnoverService.getOaTurnoverPage(pageReqVO).getList();
         // 导出 Excel
         // 导出 Excel
-        ExcelUtils.write(response, "离职流程信息.xls", "数据", OaDimissionRespVO.class,
-                        BeanUtils.toBean(list, OaDimissionRespVO.class));
+        ExcelUtils.write(response, "离职流程信息.xls", "数据", OaTurnoverRespVO.class,
+                        BeanUtils.toBean(list, OaTurnoverRespVO.class));
     }
     }
 
 
 }
 }

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

@@ -1,7 +1,6 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo;
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo;
 
 
 import lombok.*;
 import lombok.*;
-import java.util.*;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -13,10 +12,10 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @Data
 @Data
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 @ToString(callSuper = true)
-public class OaDimissionPageReqVO extends PageParam {
+public class OaTurnoverPageReqVO extends PageParam {
 
 
     @Schema(description = "uuid", example = "18425")
     @Schema(description = "uuid", example = "18425")
-    private String dimissionId;
+    private String turnoverId;
 
 
     @Schema(description = "转正人id", example = "18376")
     @Schema(description = "转正人id", example = "18376")
     private Long employeeId;
     private Long employeeId;
@@ -48,10 +47,10 @@ public class OaDimissionPageReqVO extends PageParam {
 
 
     @Schema(description = "离职日期")
     @Schema(description = "离职日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private String[] dimissionDate;
+    private String[] turnoverDate;
 
 
     @Schema(description = "离职原因", example = "不喜欢")
     @Schema(description = "离职原因", example = "不喜欢")
-    private String dimissionReason;
+    private String turnoverReason;
 
 
     @Schema(description = "备注")
     @Schema(description = "备注")
     private String remarks;
     private String remarks;

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

@@ -1,17 +1,15 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo;
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo;
 
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import lombok.*;
-import java.util.*;
-import java.util.*;
-import org.springframework.format.annotation.DateTimeFormat;
+
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import com.alibaba.excel.annotation.*;
 import com.alibaba.excel.annotation.*;
 
 
 @Schema(description = "管理后台 - 离职流程信息 Response VO")
 @Schema(description = "管理后台 - 离职流程信息 Response VO")
 @Data
 @Data
 @ExcelIgnoreUnannotated
 @ExcelIgnoreUnannotated
-public class OaDimissionRespVO {
+public class OaTurnoverRespVO {
 
 
     @Schema(description = "离职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15606")
     @Schema(description = "离职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15606")
     @ExcelProperty("离职表单主键")
     @ExcelProperty("离职表单主键")
@@ -19,7 +17,7 @@ public class OaDimissionRespVO {
 
 
     @Schema(description = "uuid", example = "18425")
     @Schema(description = "uuid", example = "18425")
     @ExcelProperty("uuid")
     @ExcelProperty("uuid")
-    private String dimissionId;
+    private String turnoverId;
 
 
     @Schema(description = "转正人id", example = "18376")
     @Schema(description = "转正人id", example = "18376")
     @ExcelProperty("转正人id")
     @ExcelProperty("转正人id")
@@ -59,11 +57,11 @@ public class OaDimissionRespVO {
 
 
     @Schema(description = "离职日期")
     @Schema(description = "离职日期")
     @ExcelProperty("离职日期")
     @ExcelProperty("离职日期")
-    private String dimissionDate;
+    private String turnoverDate;
 
 
     @Schema(description = "离职原因", example = "不喜欢")
     @Schema(description = "离职原因", example = "不喜欢")
     @ExcelProperty("离职原因")
     @ExcelProperty("离职原因")
-    private String dimissionReason;
+    private String turnoverReason;
 
 
     @Schema(description = "备注")
     @Schema(description = "备注")
     @ExcelProperty("备注")
     @ExcelProperty("备注")

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

@@ -1,22 +1,20 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.oa.dimission.vo;
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo;
 
 
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import lombok.*;
 import java.util.*;
 import java.util.*;
-import javax.validation.constraints.*;
-import org.springframework.format.annotation.DateTimeFormat;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 
 
 @Schema(description = "管理后台 - 离职流程信息新增/修改 Request VO")
 @Schema(description = "管理后台 - 离职流程信息新增/修改 Request VO")
 @Data
 @Data
-public class OaDimissionSaveReqVO {
+public class OaTurnoverSaveReqVO {
 
 
     @Schema(description = "离职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15606")
     @Schema(description = "离职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15606")
     private Long id;
     private Long id;
 
 
     @Schema(description = "uuid", example = "18425")
     @Schema(description = "uuid", example = "18425")
-    private String dimissionId;
+    private String turnoverId;
 
 
     @Schema(description = "转正人id", example = "18376")
     @Schema(description = "转正人id", example = "18376")
     private Long employeeId;
     private Long employeeId;
@@ -46,10 +44,10 @@ public class OaDimissionSaveReqVO {
     private String startDate;
     private String startDate;
 
 
     @Schema(description = "离职日期")
     @Schema(description = "离职日期")
-    private String dimissionDate;
+    private String turnoverDate;
 
 
     @Schema(description = "离职原因", example = "不喜欢")
     @Schema(description = "离职原因", example = "不喜欢")
-    private String dimissionReason;
+    private String turnoverReason;
 
 
     @Schema(description = "备注")
     @Schema(description = "备注")
     private String remarks;
     private String remarks;

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

@@ -15,7 +15,6 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -40,8 +39,8 @@ public class OaUniversalController {
     @PostMapping("/staging")
     @PostMapping("/staging")
     @Operation(summary = "暂存通用事项审批流程信息")
     @Operation(summary = "暂存通用事项审批流程信息")
     @ApiOperationSupport(order = 1)
     @ApiOperationSupport(order = 1)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:staging')")
-    public CommonResult<Long> startOaUniversal(@RequestBody OaUniversalSaveReqVO stagingReqVO) {
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:staging')")
+    public CommonResult<Long> stagingOaUniversal(@RequestBody OaUniversalSaveReqVO stagingReqVO) {
         Long oaUniversalId = oaUniversalService.stagingOaUniversal(stagingReqVO);
         Long oaUniversalId = oaUniversalService.stagingOaUniversal(stagingReqVO);
         return success(oaUniversalId, "暂存成功");
         return success(oaUniversalId, "暂存成功");
     }
     }
@@ -49,7 +48,7 @@ public class OaUniversalController {
     @PostMapping("/commit")
     @PostMapping("/commit")
     @Operation(summary = "提交通用事项审批流程信息")
     @Operation(summary = "提交通用事项审批流程信息")
     @ApiOperationSupport(order = 2)
     @ApiOperationSupport(order = 2)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:commit')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:commit')")
     public CommonResult<Long> commitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO commitReqVO) {
     public CommonResult<Long> commitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO commitReqVO) {
         Long oaUniversalId = oaUniversalService.commitOaUniversal(commitReqVO);
         Long oaUniversalId = oaUniversalService.commitOaUniversal(commitReqVO);
         return success(oaUniversalId, "提交成功");
         return success(oaUniversalId, "提交成功");
@@ -58,7 +57,7 @@ public class OaUniversalController {
     @PostMapping("/agree")
     @PostMapping("/agree")
     @Operation(summary = "审批同意通用事项审批流程信息")
     @Operation(summary = "审批同意通用事项审批流程信息")
     @ApiOperationSupport(order = 3)
     @ApiOperationSupport(order = 3)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:agree')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:agree')")
     public CommonResult<Long> agreeOaUniversal(@Valid @RequestBody BpmTaskApproveReqVO agreeReqVO) {
     public CommonResult<Long> agreeOaUniversal(@Valid @RequestBody BpmTaskApproveReqVO agreeReqVO) {
         Long result = oaUniversalService.agreeOaUniversal(agreeReqVO);
         Long result = oaUniversalService.agreeOaUniversal(agreeReqVO);
         return success(result, "审批成功");
         return success(result, "审批成功");
@@ -67,7 +66,7 @@ public class OaUniversalController {
     @PostMapping("/disagree")
     @PostMapping("/disagree")
     @Operation(summary = "驳回通用事项审批流程信息")
     @Operation(summary = "驳回通用事项审批流程信息")
     @ApiOperationSupport(order = 4)
     @ApiOperationSupport(order = 4)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:disagree')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:disagree')")
     public CommonResult<Long> disagreeOaUniversal(@Valid @RequestBody BpmTaskReturnReqVO disagreeReqVO) {
     public CommonResult<Long> disagreeOaUniversal(@Valid @RequestBody BpmTaskReturnReqVO disagreeReqVO) {
         Long result = oaUniversalService.disagreeOaUniversal(disagreeReqVO);
         Long result = oaUniversalService.disagreeOaUniversal(disagreeReqVO);
         return success(result, "驳回成功");
         return success(result, "驳回成功");
@@ -76,7 +75,7 @@ public class OaUniversalController {
     @PostMapping("/revocation")
     @PostMapping("/revocation")
     @Operation(summary = "撤回通用事项审批流程信息")
     @Operation(summary = "撤回通用事项审批流程信息")
     @ApiOperationSupport(order = 5)
     @ApiOperationSupport(order = 5)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:revocation')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:revocation')")
     public CommonResult<Long> revocationOaUniversal(@Valid @RequestBody BpmTaskApproveReqVO revocationReqVO) {
     public CommonResult<Long> revocationOaUniversal(@Valid @RequestBody BpmTaskApproveReqVO revocationReqVO) {
         Long result = oaUniversalService.revocationOaUniversal(revocationReqVO);
         Long result = oaUniversalService.revocationOaUniversal(revocationReqVO);
         return success(result, "撤回成功");
         return success(result, "撤回成功");
@@ -85,18 +84,18 @@ public class OaUniversalController {
     @PostMapping("/reCommit")
     @PostMapping("/reCommit")
     @Operation(summary = "驳回或撤回后再次提交通用用事项审批流程信息")
     @Operation(summary = "驳回或撤回后再次提交通用用事项审批流程信息")
     @ApiOperationSupport(order = 6)
     @ApiOperationSupport(order = 6)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:re-commit')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:re-commit')")
     public CommonResult<Long> reCommitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO reCommitReqVO) {
     public CommonResult<Long> reCommitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO reCommitReqVO) {
         Long result = oaUniversalService.reCommitOaUniversal(reCommitReqVO);
         Long result = oaUniversalService.reCommitOaUniversal(reCommitReqVO);
-        return success(result, "提交成功");
+        return success(result, "再次提交成功");
     }
     }
 
 
-    @PostMapping("/close")
+    @DeleteMapping("/close")
     @Operation(summary = "驳回或撤回后关闭通用事项审批流程信息")
     @Operation(summary = "驳回或撤回后关闭通用事项审批流程信息")
     @ApiOperationSupport(order = 7)
     @ApiOperationSupport(order = 7)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-entry:close')")
-    public CommonResult<Long> updateCompleteOaUniversal(@RequestBody OaUniversalSaveReqVO closeReqVO) {
-        Long result = oaUniversalService.closeOaUniversal(closeReqVO);
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-entry:close')")
+    public CommonResult<Long> closeOaUniversal(@RequestParam("id") Long id) {
+        Long result = oaUniversalService.closeOaUniversal(id);
 
 
         return success(result, "关闭成功");
         return success(result, "关闭成功");
     }
     }
@@ -105,7 +104,7 @@ public class OaUniversalController {
     @Operation(summary = "删除通用事项审批流程信息")
     @Operation(summary = "删除通用事项审批流程信息")
     @ApiOperationSupport(order = 8)
     @ApiOperationSupport(order = 8)
     @Parameter(name = "id", description = "编号", required = true)
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:delete')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:delete')")
     public CommonResult<Boolean> deleteOaUniversal(@RequestParam("id") Long id) {
     public CommonResult<Boolean> deleteOaUniversal(@RequestParam("id") Long id) {
         oaUniversalService.deleteOaUniversal(id);
         oaUniversalService.deleteOaUniversal(id);
         return success(true, "删除成功");
         return success(true, "删除成功");
@@ -115,24 +114,34 @@ public class OaUniversalController {
     @Operation(summary = "根据id获得通用事项审批流程信息")
     @Operation(summary = "根据id获得通用事项审批流程信息")
     @Parameter(name = "id", description = "编号", required = true, example = "1")
     @Parameter(name = "id", description = "编号", required = true, example = "1")
     @ApiOperationSupport(order = 9)
     @ApiOperationSupport(order = 9)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:query-id')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:query-id')")
     public CommonResult<OaUniversalRespVO> getOaUniversal(@RequestParam("id") Long id) {
     public CommonResult<OaUniversalRespVO> getOaUniversal(@RequestParam("id") Long id) {
         OaUniversalRespVO respVO = oaUniversalService.getOaUniversal(id);
         OaUniversalRespVO respVO = oaUniversalService.getOaUniversal(id);
         return success(respVO, "查询对象成功");
         return success(respVO, "查询对象成功");
     }
     }
 
 
+    @GetMapping("/getByProcInstId")
+    @Operation(summary = "根据流程实例id获得通用事项审批流程信息")
+    @Parameter(name = "procInstId", description = "流程实例id", required = true, example = "9528a78d-457e-11ef-853c-4c034fce6445")
+    @ApiOperationSupport(order = 10)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:query-proc-inst-id')")
+    public CommonResult<OaUniversalRespVO> getOaUniversalByProcInstId(@RequestParam("procInstId") String procInstId) {
+        OaUniversalRespVO respVO = oaUniversalService.getOaUniversalByProcInstId(procInstId);
+        return success(respVO, "查询对象成功");
+    }
+
     @GetMapping("/page")
     @GetMapping("/page")
     @Operation(summary = "获得通用事项审批流程信息分页")
     @Operation(summary = "获得通用事项审批流程信息分页")
-    @ApiOperationSupport(order = 10)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:query-page')")
+    @ApiOperationSupport(order = 11)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:query-page')")
     public CommonResult<PageResult<OaUniversalRespVO>> getOaUniversalPage(@Valid OaUniversalPageReqVO pageReqVO) {
     public CommonResult<PageResult<OaUniversalRespVO>> getOaUniversalPage(@Valid OaUniversalPageReqVO pageReqVO) {
         return success(oaUniversalService.getOaUniversalPage(pageReqVO), "查询列表成功");
         return success(oaUniversalService.getOaUniversalPage(pageReqVO), "查询列表成功");
     }
     }
 
 
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
     @Operation(summary = "导出通用事项审批流程信息 Excel")
     @Operation(summary = "导出通用事项审批流程信息 Excel")
-    @ApiOperationSupport(order = 11)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:export')")
+    @ApiOperationSupport(order = 12)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:export')")
     @ApiAccessLog(operateType = EXPORT)
     @ApiAccessLog(operateType = EXPORT)
     public void exportOaUniversalExcel(@Valid OaUniversalPageReqVO pageReqVO,
     public void exportOaUniversalExcel(@Valid OaUniversalPageReqVO pageReqVO,
               HttpServletResponse response) throws IOException {
               HttpServletResponse response) throws IOException {

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

@@ -104,8 +104,8 @@ public class OaUniversalRespVO {
     @ExcelProperty("当前审核人员工uuid")
     @ExcelProperty("当前审核人员工uuid")
     private String currentAuditEmployeeUuid;
     private String currentAuditEmployeeUuid;
 
 
-    @Schema(description = "当前审核人员工uuid")
-    @ExcelProperty("当前审核人员工uuid")
+    @Schema(description = "当前审核人员工姓名")
+    @ExcelProperty("当前审核人员工姓名")
     private String currentAuditEmployeeName;
     private String currentAuditEmployeeName;
 
 
     @Schema(description = "最后审核时间")
     @Schema(description = "最后审核时间")
@@ -135,4 +135,7 @@ public class OaUniversalRespVO {
     @Schema(description = "审批人员列表")
     @Schema(description = "审批人员列表")
     private List<AdminUserRespDTO> auditUserList;
     private List<AdminUserRespDTO> auditUserList;
 
 
+    @Schema(description = "当前用户待处理的任务id")
+    private String taskId;
+
 }
 }

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

@@ -1,12 +1,9 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.universal.vo;
 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 io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
 
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
 import java.util.List;
 import java.util.List;
 
 
 @Schema(description = "管理后台 - 通用事项审批流程信息新增/修改 Request VO")
 @Schema(description = "管理后台 - 通用事项审批流程信息新增/修改 Request VO")

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

@@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.Task;
+import org.springdoc.api.annotations.ParameterObject;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
@@ -34,10 +35,10 @@ import javax.annotation.Resource;
 import javax.validation.Valid;
 import javax.validation.Valid;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 
 @Tag(name = "管理后台 - 流程实例") // 流程实例,通过流程定义创建的一次“申请”
 @Tag(name = "管理后台 - 流程实例") // 流程实例,通过流程定义创建的一次“申请”
@@ -61,10 +62,10 @@ public class BpmProcessInstanceController {
     private DeptApi deptApi;
     private DeptApi deptApi;
 
 
     @GetMapping("/my-page")
     @GetMapping("/my-page")
-    @Operation(summary = "获得我发起的流程实例分页列表", description = "在【我的流程】菜单中,进行调用")
-    @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
+    @Operation(summary = "获得我发起的流程实例分页列表", description = "在【我的流程】菜单中,进行调用")
+    // @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
     public CommonResult<PageResult<BpmProcessInstanceRespVO>> getProcessInstanceMyPage(
     public CommonResult<PageResult<BpmProcessInstanceRespVO>> getProcessInstanceMyPage(
-            @Valid BpmProcessInstancePageReqVO pageReqVO) {
+            @Valid @ParameterObject BpmProcessInstancePageReqVO pageReqVO) {
         PageResult<HistoricProcessInstance> pageResult = processInstanceService.getProcessInstancePage(
         PageResult<HistoricProcessInstance> pageResult = processInstanceService.getProcessInstancePage(
                 getLoginUserId(), pageReqVO);
                 getLoginUserId(), pageReqVO);
         if (CollUtil.isEmpty(pageResult.getList())) {
         if (CollUtil.isEmpty(pageResult.getList())) {
@@ -76,10 +77,17 @@ public class BpmProcessInstanceController {
                 convertList(pageResult.getList(), HistoricProcessInstance::getId));
                 convertList(pageResult.getList(), HistoricProcessInstance::getId));
         Map<String, ProcessDefinition> processDefinitionMap = processDefinitionService.getProcessDefinitionMap(
         Map<String, ProcessDefinition> processDefinitionMap = processDefinitionService.getProcessDefinitionMap(
                 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
                 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
+        List<Task> tasksByProcessInstanceIds = taskService.getTasksByProcessInstanceIds(pageResult.getList().stream().map(HistoricProcessInstance::getId).collect(Collectors.toList()));
+        List<Long> collect = tasksByProcessInstanceIds.stream().map(task -> Long.valueOf(task.getAssignee())).collect(Collectors.toList());
+        List<AdminUserRespDTO> userList = adminUserApi.getUserList(collect);
+        Map<Long, AdminUserRespDTO> userMap = convertMap(userList, AdminUserRespDTO::getId);
         Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
         Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
                 convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory));
                 convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory));
+        Map<String, BpmProcessDefinitionExtDO> bpmProcessDefinitionExtDOMap = processDefinitionService.getProcessDefinitionExtMap(
+                convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)
+        );
         return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult,
         return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult,
-                processDefinitionMap, categoryMap, taskMap, null, null));
+                processDefinitionMap, categoryMap, taskMap, userMap, null, bpmProcessDefinitionExtDOMap));
     }
     }
 
 
     @GetMapping("/manager-page")
     @GetMapping("/manager-page")
@@ -106,7 +114,7 @@ public class BpmProcessInstanceController {
         Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
         Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
                 convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
                 convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
         return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult,
         return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult,
-                processDefinitionMap, categoryMap, taskMap, userMap, deptMap));
+                processDefinitionMap, categoryMap, taskMap, userMap, deptMap, null));
     }
     }
 
 
     @PostMapping("/create")
     @PostMapping("/create")

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

@@ -7,13 +7,16 @@ import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 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.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -22,6 +25,7 @@ import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.history.HistoricTaskInstance;
 import org.flowable.task.api.history.HistoricTaskInstance;
+import org.springdoc.api.annotations.ParameterObject;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
@@ -49,6 +53,8 @@ public class BpmTaskController {
     @Resource
     @Resource
     private BpmProcessInstanceService processInstanceService;
     private BpmProcessInstanceService processInstanceService;
     @Resource
     @Resource
+    private BpmProcessDefinitionService processDefinitionService;
+    @Resource
     private BpmFormService formService;
     private BpmFormService formService;
 
 
     @Resource
     @Resource
@@ -56,27 +62,42 @@ public class BpmTaskController {
     @Resource
     @Resource
     private DeptApi deptApi;
     private DeptApi deptApi;
 
 
+    @GetMapping("todo-count")
+    @Operation(summary = "获取我的待办任务数量")
+    @ApiOperationSupport(order = 1)
+    // @PreAuthorize("@ss.hasPermission('bpm:task:count')")
+    public CommonResult<Long> getTaskTodoCount(@Valid @ParameterObject BpmTaskPageReqVO pageVO) {
+        Long todoCount = taskService.getTaskTodoCount(getLoginUserId(), pageVO);
+        return success(todoCount, "查询我的待办任务数量成功");
+    }
+
     @GetMapping("todo-page")
     @GetMapping("todo-page")
     @Operation(summary = "获取我的待办任务分页")
     @Operation(summary = "获取我的待办任务分页")
-    @PreAuthorize("@ss.hasPermission('bpm:task:query')")
-    public CommonResult<PageResult<BpmTaskRespVO>> getTaskTodoPage(@Valid BpmTaskPageReqVO pageVO) {
+    @ApiOperationSupport(order = 2)
+    // @PreAuthorize("@ss.hasPermission('bpm:task:query')")
+    public CommonResult<PageResult<BpmTaskRespVO>> getTaskTodoPage(@Valid @ParameterObject BpmTaskPageReqVO pageVO) {
         PageResult<Task> pageResult = taskService.getTaskTodoPage(getLoginUserId(), pageVO);
         PageResult<Task> pageResult = taskService.getTaskTodoPage(getLoginUserId(), pageVO);
         if (CollUtil.isEmpty(pageResult.getList())) {
         if (CollUtil.isEmpty(pageResult.getList())) {
             return success(PageResult.empty());
             return success(PageResult.empty());
         }
         }
 
 
         // 拼接数据
         // 拼接数据
+        Map<String, Task> taskMap = convertMap(pageResult.getList(), Task::getId);
         Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap(
         Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap(
                 convertSet(pageResult.getList(), Task::getProcessInstanceId));
                 convertSet(pageResult.getList(), Task::getProcessInstanceId));
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                 convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
                 convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
-        return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap));
+        Map<String, BpmProcessDefinitionExtDO> bpmProcessDefinitionExtDOMap = processDefinitionService.getProcessDefinitionExtMap(
+                convertSet(processInstanceMap.values(), ProcessInstance::getProcessDefinitionId)
+        );
+        PageResult<BpmTaskRespVO> taskRespVOPageResult = BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap, bpmProcessDefinitionExtDOMap, taskMap);
+        return success(taskRespVOPageResult, "查询我的待办任务成功");
     }
     }
 
 
     @GetMapping("done-page")
     @GetMapping("done-page")
-    @Operation(summary = "获取我的已办任务分页")
-    @PreAuthorize("@ss.hasPermission('bpm:task:query')")
-    public CommonResult<PageResult<BpmTaskRespVO>> getTaskDonePage(@Valid BpmTaskPageReqVO pageVO) {
+    @Operation(summary = "获取我的已处理任务分页")
+    // @PreAuthorize("@ss.hasPermission('bpm:task:query')")
+    public CommonResult<PageResult<BpmTaskRespVO>> getTaskDonePage(@Valid @ParameterObject BpmTaskPageReqVO pageVO) {
         PageResult<HistoricTaskInstance> pageResult = taskService.getTaskDonePage(getLoginUserId(), pageVO);
         PageResult<HistoricTaskInstance> pageResult = taskService.getTaskDonePage(getLoginUserId(), pageVO);
         if (CollUtil.isEmpty(pageResult.getList())) {
         if (CollUtil.isEmpty(pageResult.getList())) {
             return success(PageResult.empty());
             return success(PageResult.empty());
@@ -87,7 +108,10 @@ public class BpmTaskController {
                 convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId));
                 convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId));
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                 convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
                 convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
-        return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null));
+        Map<String, BpmProcessDefinitionExtDO> bpmProcessDefinitionExtDOMap = processDefinitionService.getProcessDefinitionExtMap(
+                convertSet(processInstanceMap.values(), HistoricProcessInstance::getProcessDefinitionId)
+        );
+        return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null, bpmProcessDefinitionExtDOMap));
     }
     }
 
 
     @GetMapping("manager-page")
     @GetMapping("manager-page")
@@ -108,7 +132,7 @@ public class BpmTaskController {
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
         Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
         Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
                 convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
                 convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
-        return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap));
+        return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap, null));
     }
     }
 
 
     @GetMapping("/list-by-process-instance-id")
     @GetMapping("/list-by-process-instance-id")

+ 8 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java

@@ -46,6 +46,11 @@ public class BpmProcessInstanceRespVO {
      */
      */
     private User startUser;
     private User startUser;
 
 
+    /**
+     * 当前处理人
+     */
+    private User currentAuditUser;
+
     @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
     @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
     private String processDefinitionId;
     private String processDefinitionId;
     /**
     /**
@@ -84,6 +89,9 @@ public class BpmProcessInstanceRespVO {
         @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
         @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
         private String name;
         private String name;
 
 
+        @Schema(description = "当前任务处理人")
+        private String assignee;
+
     }
     }
 
 
 }
 }

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

@@ -24,4 +24,7 @@ public class BpmTaskApproveReqVO {
     @Schema(description = "变量实例(动态表单)", requiredMode = Schema.RequiredMode.AUTO)
     @Schema(description = "变量实例(动态表单)", requiredMode = Schema.RequiredMode.AUTO)
     private Map<String, Object> variables;
     private Map<String, Object> variables;
 
 
+    @Schema(description = "任务状态(冗余字段)")
+    private Integer taskStatus;
+
 }
 }

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

@@ -4,8 +4,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.format.annotation.DateTimeFormat;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
@@ -14,10 +12,10 @@ import java.time.LocalDateTime;
 @Data
 @Data
 public class BpmTaskPageReqVO extends PageParam {
 public class BpmTaskPageReqVO extends PageParam {
 
 
-    @Schema(description = "流程任务名", example = "芋道")
+    @Schema(description = "流程名", example = "通用")
     private String name;
     private String name;
 
 
-    @Schema(description = "创建时间")
+    @Schema(description = "创建时间,区间查询", example = "2024-07-20 00:00:00,2024-07-20 23:59:59")
     @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
     private LocalDateTime[] createTime;
 
 

+ 9 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
 
 
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
 
 
@@ -52,6 +53,11 @@ public class BpmTaskRespVO {
      */
      */
     private ProcessInstance processInstance;
     private ProcessInstance processInstance;
 
 
+    /**
+     * 流程定义扩展信息
+     */
+    private BpmProcessDefinitionExtDO processDefinition;
+
     @Schema(description = "父任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     @Schema(description = "父任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private String parentTaskId;
     private String parentTaskId;
     @Schema(description = "子任务列表(由加签生成)", requiredMode = Schema.RequiredMode.REQUIRED, example = "childrenTask")
     @Schema(description = "子任务列表(由加签生成)", requiredMode = Schema.RequiredMode.REQUIRED, example = "childrenTask")
@@ -84,6 +90,9 @@ public class BpmTaskRespVO {
         @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
         @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
         private String processDefinitionId;
         private String processDefinitionId;
 
 
+        @Schema(description = "业务唯一标识:业务单据id")
+        private Long businessKey;
+
         /**
         /**
          * 发起人的用户信息
          * 发起人的用户信息
          */
          */

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

@@ -22,4 +22,7 @@ public class BpmTaskReturnReqVO {
     @NotBlank(message = "回退意见不能为空")
     @NotBlank(message = "回退意见不能为空")
     private String reason;
     private String reason;
 
 
+    @Schema(description = "任务状态(冗余字段)")
+    private Integer taskStatus;
+
 }
 }

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.bpm.convert.task;
 package cn.iocoder.yudao.module.bpm.convert.task;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
@@ -8,12 +9,15 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmPro
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 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.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
+import cn.iocoder.yudao.module.bpm.enums.DictDataConstants;
 import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
 import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import io.swagger.v3.oas.models.security.SecurityScheme;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
@@ -41,15 +45,31 @@ public interface BpmProcessInstanceConvert {
                                                                           Map<String, BpmCategoryDO> categoryMap,
                                                                           Map<String, BpmCategoryDO> categoryMap,
                                                                           Map<String, List<Task>> taskMap,
                                                                           Map<String, List<Task>> taskMap,
                                                                           Map<Long, AdminUserRespDTO> userMap,
                                                                           Map<Long, AdminUserRespDTO> userMap,
-                                                                          Map<Long, DeptRespDTO> deptMap) {
+                                                                          Map<Long, DeptRespDTO> deptMap,
+                                                                          Map<String, BpmProcessDefinitionExtDO> bpmProcessDefinitionExtDOMap) {
         PageResult<BpmProcessInstanceRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class);
         PageResult<BpmProcessInstanceRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class);
         for (int i = 0; i < pageResult.getList().size(); i++) {
         for (int i = 0; i < pageResult.getList().size(); i++) {
             BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i);
             BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i);
-            respVO.setStatus(FlowableUtils.getProcessInstanceStatus(pageResult.getList().get(i)));
+            HistoricProcessInstance historicProcessInstance = pageResult.getList().get(i);
+            Integer processInstanceStatus = FlowableUtils.getProcessInstanceStatus(historicProcessInstance);
+            // 保底设置状态,暂时不用
+            if (historicProcessInstance.getEndTime() != null && processInstanceStatus != Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_CLOSED)) {
+                processInstanceStatus = Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_AUDITED);
+            }
+            respVO.setStatus(processInstanceStatus);
+
             MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(),
             MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(),
                     processDefinition -> respVO.setCategory(processDefinition.getCategory()));
                     processDefinition -> respVO.setCategory(processDefinition.getCategory()));
             MapUtils.findAndThen(categoryMap, respVO.getCategory(), category -> respVO.setCategoryName(category.getName()));
             MapUtils.findAndThen(categoryMap, respVO.getCategory(), category -> respVO.setCategoryName(category.getName()));
-            respVO.setTasks(BeanUtils.toBean(taskMap.get(respVO.getId()), BpmProcessInstanceRespVO.Task.class));
+            List<Task> tasks = taskMap.get(respVO.getId());
+            respVO.setTasks(BeanUtils.toBean(tasks, BpmProcessInstanceRespVO.Task.class));
+            if (CollectionUtil.isNotEmpty(tasks)) {
+                String assignee = tasks.get(0).getAssignee();
+                if (userMap != null){
+                    AdminUserRespDTO adminUserRespDTO = userMap.get(Long.valueOf(assignee));
+                    respVO.setCurrentAuditUser(BeanUtils.toBean(adminUserRespDTO, BpmProcessInstanceRespVO.User.class));
+                }
+            }
             // user
             // user
             if (userMap != null) {
             if (userMap != null) {
                 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(pageResult.getList().get(i).getStartUserId()));
                 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(pageResult.getList().get(i).getStartUserId()));
@@ -58,6 +78,10 @@ public interface BpmProcessInstanceConvert {
                     MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> respVO.getStartUser().setDeptName(dept.getName()));
                     MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> respVO.getStartUser().setDeptName(dept.getName()));
                 }
                 }
             }
             }
+            BpmProcessDefinitionExtDO bpmProcessDefinitionExtDO = bpmProcessDefinitionExtDOMap.get(respVO.getProcessDefinitionId());
+            BpmProcessDefinitionRespVO bpmProcessDefinitionRespVO = BeanUtils.toBean(bpmProcessDefinitionExtDO, BpmProcessDefinitionRespVO.class);
+            respVO.setProcessDefinition(bpmProcessDefinitionRespVO);
+
         }
         }
         return vpPageResult;
         return vpPageResult;
     }
     }

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

@@ -4,16 +4,20 @@ import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.repository.Model;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.history.HistoricTaskInstance;
 import org.flowable.task.api.history.HistoricTaskInstance;
@@ -21,7 +25,9 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 import org.mapstruct.factory.Mappers;
 
 
+import java.lang.reflect.Type;
 import java.util.Date;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -40,14 +46,25 @@ public interface BpmTaskConvert {
 
 
     default PageResult<BpmTaskRespVO> buildTodoTaskPage(PageResult<Task> pageResult,
     default PageResult<BpmTaskRespVO> buildTodoTaskPage(PageResult<Task> pageResult,
                                                         Map<String, ProcessInstance> processInstanceMap,
                                                         Map<String, ProcessInstance> processInstanceMap,
-                                                        Map<Long, AdminUserRespDTO> userMap) {
+                                                        Map<Long, AdminUserRespDTO> userMap,
+                                                        Map<String, BpmProcessDefinitionExtDO> bpmProcessDefinitionExtDOMap,
+                                                        Map<String, Task> taskMap) {
         return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> {
         return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> {
+            Task task = taskMap.get(taskVO.getId());
+            Map<String, Object> processVariables = task.getProcessVariables();
+            Object status = processVariables.get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS);
+            if (status instanceof String) {
+                status = Integer.valueOf((String) status);
+            }
+            taskVO.setStatus((Integer) status);
             ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId());
             ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId());
             if (processInstance == null) {
             if (processInstance == null) {
                 return;
                 return;
             }
             }
             taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
             taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
             AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
             AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
+            BpmProcessDefinitionExtDO bpmProcessDefinitionExtDO = bpmProcessDefinitionExtDOMap.get(processInstance.getProcessDefinitionId());
+            taskVO.setProcessDefinition(BeanUtils.toBean(bpmProcessDefinitionExtDO, BpmProcessDefinitionExtDO.class));
             taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
             taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
         });
         });
     }
     }
@@ -55,10 +72,13 @@ public interface BpmTaskConvert {
     default PageResult<BpmTaskRespVO> buildTaskPage(PageResult<HistoricTaskInstance> pageResult,
     default PageResult<BpmTaskRespVO> buildTaskPage(PageResult<HistoricTaskInstance> pageResult,
                                                     Map<String, HistoricProcessInstance> processInstanceMap,
                                                     Map<String, HistoricProcessInstance> processInstanceMap,
                                                     Map<Long, AdminUserRespDTO> userMap,
                                                     Map<Long, AdminUserRespDTO> userMap,
-                                                    Map<Long, DeptRespDTO> deptMap) {
+                                                    Map<Long, DeptRespDTO> deptMap,
+                                                    Map<String, BpmProcessDefinitionExtDO> bpmProcessDefinitionExtDOMap) {
         List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> {
         List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> {
             BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
             BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
-            taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task));
+            Integer taskStatus = FlowableUtils.getTaskStatus(task);
+            String taskReason = FlowableUtils.getTaskReason(task);
+            taskVO.setStatus(taskStatus).setReason(taskReason);
             // 用户信息
             // 用户信息
             AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
             AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
             if (assignUser != null) {
             if (assignUser != null) {
@@ -71,6 +91,9 @@ public interface BpmTaskConvert {
                 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
                 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
                 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
                 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
                 taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
                 taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
+
+                BpmProcessDefinitionExtDO bpmProcessDefinitionExtDO = bpmProcessDefinitionExtDOMap.get(processInstance.getProcessDefinitionId());
+                taskVO.setProcessDefinition(BeanUtils.toBean(bpmProcessDefinitionExtDO, BpmProcessDefinitionExtDO.class));
             }
             }
             return taskVO;
             return taskVO;
         });
         });

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

@@ -44,6 +44,10 @@ public class OaConversionDO extends BaseDO {
      * 转正员工姓名
      * 转正员工姓名
      */
      */
     private String employeeName;
     private String employeeName;
+    /**
+     * 转正员工手机号
+     */
+    private String employeePhone;
     /**
     /**
      * 用户账号id
      * 用户账号id
      */
      */
@@ -93,17 +97,13 @@ public class OaConversionDO extends BaseDO {
      */
      */
     private String procInstId;
     private String procInstId;
     /**
     /**
-     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回、6已撤回
      */
      */
     private String auditStatus;
     private String auditStatus;
     /**
     /**
-     * 当前审核人用户id
-     */
-    private Long currentAuditUserId;
-    /**
-     * 当前审核人用户uuid
+     * 数据来源,0流程添加、1手动添加
      */
      */
-    private String currentAuditUserUuid;
+    private String infoSource;
     /**
     /**
      * 当前审核人员工id
      * 当前审核人员工id
      */
      */
@@ -112,13 +112,32 @@ public class OaConversionDO extends BaseDO {
      * 当前审核人员工uuid
      * 当前审核人员工uuid
      */
      */
     private String currentAuditEmployeeUuid;
     private String currentAuditEmployeeUuid;
+    /**
+     * 当前审核人员工姓名
+     */
+    private String currentAuditEmployeeName;
+    /**
+     * 当前审核人用户id
+     */
+    private Long currentAuditUserId;
+    /**
+     * 当前审核人用户uuid
+     */
+    private String currentAuditUserUuid;
     /**
     /**
      * 最后审核时间
      * 最后审核时间
      */
      */
     private LocalDateTime finalAuditDate;
     private LocalDateTime finalAuditDate;
     /**
     /**
-     * 数据来源,0流程添加、1手动添加
+     * 申请人选择的审批人
      */
      */
-    private String infoSource;
-
+    private String startUserSelectAssignees;
+    /**
+     * 申请人id
+     */
+    private Long applyEmployeeId;
+    /**
+     * 申请人姓名
+     */
+    private String applyEmployeeName;
 }
 }

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

@@ -1,11 +1,12 @@
 package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry;
 package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry;
 
 
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 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
  * 入职流程信息 DO
@@ -25,7 +26,7 @@ public class OaEntryDO extends BaseDO {
      * 入职表单主键
      * 入职表单主键
      */
      */
     @TableId
     @TableId
-    private Integer id;
+    private Long id;
 
 
     /**
     /**
      * uuid
      * uuid
@@ -38,7 +39,7 @@ public class OaEntryDO extends BaseDO {
     /**
     /**
      * 部门
      * 部门
      */
      */
-    private String deptId;
+    private Long deptId;
     /**
     /**
      * 职位
      * 职位
      */
      */
@@ -52,7 +53,7 @@ public class OaEntryDO extends BaseDO {
      */
      */
     private String gender;
     private String gender;
     /**
     /**
-     * 出日期
+     * 出日期
      */
      */
     private String birthday;
     private String birthday;
     /**
     /**
@@ -92,11 +93,27 @@ public class OaEntryDO extends BaseDO {
     /**
     /**
      * 最后审核时间
      * 最后审核时间
      */
      */
-    private Date finalAuditDate;
+    private LocalDateTime finalAuditDate;
+    /**
+     * 当前审核人用户id
+     */
+    private Long currentAuditUserId;
+    /**
+     * 当前审核人用户uuid
+     */
+    private String currentAuditUserUuid;
+    /**
+     * 当前审核人员工id
+     */
+    private Long currentAuditEmployeeId;
+    /**
+     * 当前审核人员工uuid
+     */
+    private String currentAuditEmployeeUuid;
     /**
     /**
-     * 当前审核人编号
+     * 申请人选择的审批人
      */
      */
-    private String currentAuditEmployeeId;
+    private String startUserSelectAssignees;
     /**
     /**
      * 数据来源,0流程添加、1手动添加
      * 数据来源,0流程添加、1手动添加
      */
      */

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

@@ -33,17 +33,21 @@ public class OaRenewDO extends BaseDO {
      */
      */
     private String renewId;
     private String renewId;
     /**
     /**
-     * 转正人id
+     * 续签人id
      */
      */
     private Long employeeId;
     private Long employeeId;
     /**
     /**
-     * 转正人uuid
+     * 续签人uuid
      */
      */
     private String employeeUuid;
     private String employeeUuid;
     /**
     /**
-     * 转正员工姓名
+     * 续签员工姓名
      */
      */
     private String employeeName;
     private String employeeName;
+    /**
+     * 续签员工手机号
+     */
+    private String employeePhone;
     /**
     /**
      * 用户账号id
      * 用户账号id
      */
      */
@@ -101,9 +105,13 @@ public class OaRenewDO extends BaseDO {
      */
      */
     private String procInstId;
     private String procInstId;
     /**
     /**
-     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回、6已撤回
      */
      */
     private String auditStatus;
     private String auditStatus;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
     /**
     /**
      * 当前审核人用户id
      * 当前审核人用户id
      */
      */
@@ -120,13 +128,25 @@ public class OaRenewDO extends BaseDO {
      * 当前审核人员工uuid
      * 当前审核人员工uuid
      */
      */
     private String currentAuditEmployeeUuid;
     private String currentAuditEmployeeUuid;
+    /**
+     * 当前审核人员工姓名
+     */
+    private String currentAuditEmployeeName;
     /**
     /**
      * 最后审核时间
      * 最后审核时间
      */
      */
     private LocalDateTime finalAuditDate;
     private LocalDateTime finalAuditDate;
     /**
     /**
-     * 数据来源,0流程添加、1手动添加
+     * 申请人选择的审批人
      */
      */
-    private String infoSource;
+    private String startUserSelectAssignees;
+    /**
+     * 申请人id
+     */
+    private Long applyEmployeeId;
+    /**
+     * 申请人姓名
+     */
+    private String applyEmployeeName;
 
 
 }
 }

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

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.dimission;
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.turnover;
 
 
 import lombok.*;
 import lombok.*;
 import java.util.*;
 import java.util.*;
@@ -13,15 +13,15 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  *
  *
  * @author dp
  * @author dp
  */
  */
-@TableName("bpm_oa_dimission")
-@KeySequence("bpm_oa_dimission_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@TableName("bpm_oa_turnover")
+@KeySequence("bpm_oa_turnover_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
 @Data
 @Data
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 @ToString(callSuper = true)
 @Builder
 @Builder
 @NoArgsConstructor
 @NoArgsConstructor
 @AllArgsConstructor
 @AllArgsConstructor
-public class OaDimissionDO extends BaseDO {
+public class OaTurnoverDO extends BaseDO {
 
 
     /**
     /**
      * 离职表单主键
      * 离职表单主键
@@ -31,7 +31,7 @@ public class OaDimissionDO extends BaseDO {
     /**
     /**
      * uuid
      * uuid
      */
      */
-    private String dimissionId;
+    private String turnoverId;
     /**
     /**
      * 转正人id
      * 转正人id
      */
      */
@@ -71,11 +71,11 @@ public class OaDimissionDO extends BaseDO {
     /**
     /**
      * 离职日期
      * 离职日期
      */
      */
-    private String dimissionDate;
+    private String turnoverDate;
     /**
     /**
      * 离职原因
      * 离职原因
      */
      */
-    private String dimissionReason;
+    private String turnoverReason;
     /**
     /**
      * 备注
      * 备注
      */
      */

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

@@ -17,30 +17,14 @@ public interface OaConversionMapper extends BaseMapperX<OaConversionDO> {
 
 
     default PageResult<OaConversionDO> selectPage(OaConversionPageReqVO reqVO) {
     default PageResult<OaConversionDO> selectPage(OaConversionPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<OaConversionDO>()
         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::getEmployeeName, reqVO.getEmployeeName())
                 .eqIfPresent(OaConversionDO::getDeptId, reqVO.getDeptId())
                 .eqIfPresent(OaConversionDO::getDeptId, reqVO.getDeptId())
-                .eqIfPresent(OaConversionDO::getDeptUuid, reqVO.getDeptUuid())
                 .eqIfPresent(OaConversionDO::getPosition, reqVO.getPosition())
                 .eqIfPresent(OaConversionDO::getPosition, reqVO.getPosition())
-                .betweenIfPresent(OaConversionDO::getEntryDate, reqVO.getEntryDate())
-                .betweenIfPresent(OaConversionDO::getProbationEndDate, reqVO.getProbationEndDate())
+                .likeIfPresent(OaConversionDO::getEmployeePhone, reqVO.getEmployeePhone())
                 .betweenIfPresent(OaConversionDO::getConversionDate, reqVO.getConversionDate())
                 .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())
+                .eqIfPresent(OaConversionDO::getApplyEmployeeName, reqVO.getApplyEmployeeName())
                 .betweenIfPresent(OaConversionDO::getCreateTime, reqVO.getCreateTime())
                 .betweenIfPresent(OaConversionDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(OaConversionDO::getAuditStatus, reqVO.getAuditStatus())
                 .orderByDesc(OaConversionDO::getId));
                 .orderByDesc(OaConversionDO::getId));
     }
     }
 
 

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

@@ -1,45 +0,0 @@
-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));
-    }
-
-}

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

@@ -17,31 +17,14 @@ public interface OaRenewMapper extends BaseMapperX<OaRenewDO> {
 
 
     default PageResult<OaRenewDO> selectPage(OaRenewPageReqVO reqVO) {
     default PageResult<OaRenewDO> selectPage(OaRenewPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<OaRenewDO>()
         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())
                 .likeIfPresent(OaRenewDO::getEmployeeName, reqVO.getEmployeeName())
-                .eqIfPresent(OaRenewDO::getUserId, reqVO.getUserId())
-                .eqIfPresent(OaRenewDO::getUserUuid, reqVO.getUserUuid())
+                .likeIfPresent(OaRenewDO::getEmployeePhone, reqVO.getEmployeePhone())
                 .eqIfPresent(OaRenewDO::getDeptId, reqVO.getDeptId())
                 .eqIfPresent(OaRenewDO::getDeptId, reqVO.getDeptId())
-                .eqIfPresent(OaRenewDO::getDeptUuid, reqVO.getDeptUuid())
                 .eqIfPresent(OaRenewDO::getPosition, reqVO.getPosition())
                 .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::getRenewContractStartDate, reqVO.getRenewContractStartDate())
                 .betweenIfPresent(OaRenewDO::getRenewContractEndDate, reqVO.getRenewContractEndDate())
                 .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::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())
+                .likeIfPresent(OaRenewDO::getApplyEmployeeName, reqVO.getApplyEmployeeName())
                 .betweenIfPresent(OaRenewDO::getCreateTime, reqVO.getCreateTime())
                 .betweenIfPresent(OaRenewDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(OaRenewDO::getId));
                 .orderByDesc(OaRenewDO::getId));
     }
     }

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

@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.turnover;
+
+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.turnover.vo.OaTurnoverPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.turnover.OaTurnoverDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 离职流程信息 Mapper
+ *
+ * @author dp
+ */
+@Mapper
+public interface OaTurnOverMapper extends BaseMapperX<OaTurnoverDO> {
+
+    default PageResult<OaTurnoverDO> selectPage(OaTurnoverPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaTurnoverDO>()
+                .eqIfPresent(OaTurnoverDO::getTurnoverId, reqVO.getTurnoverId())
+                .eqIfPresent(OaTurnoverDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(OaTurnoverDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(OaTurnoverDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(OaTurnoverDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(OaTurnoverDO::getUserUuid, reqVO.getUserUuid())
+                .eqIfPresent(OaTurnoverDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaTurnoverDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(OaTurnoverDO::getPosition, reqVO.getPosition())
+                .betweenIfPresent(OaTurnoverDO::getStartDate, reqVO.getStartDate())
+                .betweenIfPresent(OaTurnoverDO::getTurnoverDate, reqVO.getTurnoverDate())
+                .eqIfPresent(OaTurnoverDO::getTurnoverReason, reqVO.getTurnoverReason())
+                .eqIfPresent(OaTurnoverDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(OaTurnoverDO::getProcInstId, reqVO.getProcInstId())
+                .eqIfPresent(OaTurnoverDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(OaTurnoverDO::getCurrentAuditUserId, reqVO.getCurrentAuditUserId())
+                .eqIfPresent(OaTurnoverDO::getCurrentAuditUserUuid, reqVO.getCurrentAuditUserUuid())
+                .eqIfPresent(OaTurnoverDO::getCurrentAuditEmployeeId, reqVO.getCurrentAuditEmployeeId())
+                .eqIfPresent(OaTurnoverDO::getCurrentAuditEmployeeUuid, reqVO.getCurrentAuditEmployeeUuid())
+                .betweenIfPresent(OaTurnoverDO::getFinalAuditDate, reqVO.getFinalAuditDate())
+                .eqIfPresent(OaTurnoverDO::getInfoSource, reqVO.getInfoSource())
+                .betweenIfPresent(OaTurnoverDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(OaTurnoverDO::getId));
+    }
+
+}

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java

@@ -68,7 +68,7 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
             if (StrUtil.isEmpty(activity.getTaskId())) {
             if (StrUtil.isEmpty(activity.getTaskId())) {
                 return;
                 return;
             }
             }
-            taskService.updateTaskStatusWhenCanceled(activity.getTaskId());
+            // taskService.updateTaskStatusWhenCanceled(activity.getTaskId());
         });
         });
     }
     }
 
 

+ 5 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java

@@ -78,7 +78,11 @@ public class FlowableUtils {
      * @return 状态
      * @return 状态
      */
      */
     private static Integer getProcessInstanceStatus(Map<String, Object> processVariables) {
     private static Integer getProcessInstanceStatus(Map<String, Object> processVariables) {
-        return (Integer) processVariables.get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS);
+        Object status = processVariables.get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS);
+        if (status instanceof String) {
+            status = Integer.valueOf((String) status);
+        }
+        return (Integer) status;
     }
     }
 
 
     /**
     /**

+ 11 - 11
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/web/config/BpmWebConfiguration.java

@@ -13,7 +13,7 @@ import org.springframework.context.annotation.Configuration;
  *
  *
  * @author 芋道源码
  * @author 芋道源码
  */
  */
-//@Configuration(proxyBeanMethods = false)
+@Configuration(proxyBeanMethods = false)
 public class BpmWebConfiguration {
 public class BpmWebConfiguration {
 
 
     /**
     /**
@@ -24,15 +24,15 @@ public class BpmWebConfiguration {
         return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("bpm");
         return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("bpm");
     }
     }
 
 
-    /**
-     * 配置 Flowable Web 过滤器
-     */
-    @Bean
-    public FilterRegistrationBean<FlowableWebFilter> flowableWebFilter() {
-        FilterRegistrationBean<FlowableWebFilter> registrationBean = new FilterRegistrationBean<>();
-        registrationBean.setFilter(new FlowableWebFilter());
-        registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER);
-        return registrationBean;
-    }
+    // /**
+    //  * 配置 Flowable Web 过滤器
+    //  */
+    // @Bean
+    // public FilterRegistrationBean<FlowableWebFilter> flowableWebFilter() {
+    //     FilterRegistrationBean<FlowableWebFilter> registrationBean = new FilterRegistrationBean<>();
+    //     registrationBean.setFilter(new FlowableWebFilter());
+    //     registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER);
+    //     return registrationBean;
+    // }
 
 
 }
 }

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

@@ -41,7 +41,6 @@ import java.util.Objects;
 
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 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.*;
-import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS;
 
 
 /**
 /**
  * Flowable流程模型实现
  * Flowable流程模型实现

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

@@ -193,4 +193,13 @@ public interface BpmProcessDefinitionService {
      * @return BPMN XML
      * @return BPMN XML
      */
      */
     String getProcessDefinitionBpmnXML(String id);
     String getProcessDefinitionBpmnXML(String id);
+
+    /**
+     * 根据流程定义id集合查询流程定义拓展信息集合
+     *
+     * @param processDefinitionIds 流程定义id集合
+     * @return 流程定义拓展信息集合,以流程定义id为key,以对应的流程定义拓展信息为value
+     */
+    Map<String, BpmProcessDefinitionExtDO> getProcessDefinitionExtMap(Collection<String> processDefinitionIds);
+
 }
 }

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

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
 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.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
@@ -14,6 +15,7 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConsta
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 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.BpmModelMetaInfoRespDTO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.flowable.bpmn.converter.BpmnXMLConverter;
 import org.flowable.bpmn.converter.BpmnXMLConverter;
 import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.bpmn.model.BpmnModel;
@@ -270,4 +272,13 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
         return StrUtil.utf8Str(converter.convertToXML(bpmnModel));
         return StrUtil.utf8Str(converter.convertToXML(bpmnModel));
     }
     }
 
 
+    @Override
+    public Map<String, BpmProcessDefinitionExtDO> getProcessDefinitionExtMap(Collection<String> processDefinitionIds) {
+        LambdaQueryWrapper<BpmProcessDefinitionExtDO> wrapper = new LambdaQueryWrapper<BpmProcessDefinitionExtDO>();
+        if (CollUtil.isNotEmpty(processDefinitionIds)) {
+            wrapper.in(BpmProcessDefinitionExtDO::getProcessDefinitionId, processDefinitionIds);
+        }
+        return CollectionUtils.convertMap(processDefinitionMapper.selectList(wrapper), BpmProcessDefinitionExtDO::getProcessDefinitionId);
+    }
+
 }
 }

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

@@ -2,65 +2,42 @@ package cn.iocoder.yudao.module.bpm.service.oa.conversion;
 
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 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.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.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.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.dataobject.oa.conversion.OaConversionDO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 
-import javax.validation.Valid;
-
 /**
 /**
  * 转正流程信息 Service 接口
  * 转正流程信息 Service 接口
  *
  *
  * @author 芋道源码
  * @author 芋道源码
  */
  */
-public interface OaConversionService extends IService<OaConversionDO>{
+public interface OaConversionService {
 
 
-    Long startOaConversion(Long userId, @Valid OaConversionSaveReqVO createReqVO);
+    Long stagingOaConversion(OaConversionSaveReqVO stagingReqVO);
 
 
-    Long completeTrueOaConversion(Long userId, BpmTaskApproveReqVO reqVO);
+    Long commitOaConversion(OaConversionSaveReqVO commitReqVO);
 
 
-    Long completeFalseOaConversion(Long userId, BpmTaskApproveReqVO reqVO);
+    Long agreeOaConversion(BpmTaskApproveReqVO agreeReqVO);
 
 
-    Long updateCompleteOaConversion(Long userId, @Valid OaConversionSaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+    Long disagreeOaConversion(BpmTaskReturnReqVO disagreeReqVO);
 
 
+    Long revocationOaConversion(BpmTaskApproveReqVO revocationReqVO);
 
 
-    /**
-     * 创建转正流程信息
-     *
-     * @param createReqVO 创建信息
-     * @return 编号
-     */
-    Long createOaConversion(@Valid OaConversionSaveReqVO createReqVO);
+    Long reCommitOaConversion(OaConversionSaveReqVO reCommitReqVO);
 
 
-    /**
-     * 更新转正流程信息
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateOaConversion(@Valid OaConversionSaveReqVO updateReqVO);
+    Long closeOaConversion(Long id);
 
 
-    /**
-     * 删除转正流程信息
-     *
-     * @param id 编号
-     */
     void deleteOaConversion(Long id);
     void deleteOaConversion(Long id);
 
 
-    /**
-     * 获得转正流程信息
-     *
-     * @param id 编号
-     * @return 转正流程信息
-     */
-    OaConversionDO getOaConversion(Long id);
+    OaConversionRespVO getOaConversion(Long id);
+
+    OaConversionRespVO getOaConversionByProcInstId(String procInstId);
+
+    PageResult<OaConversionRespVO> getOaConversionPage(OaConversionPageReqVO pageReqVO);
 
 
-    /**
-     * 获得转正流程信息分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 转正流程信息分页
-     */
-    PageResult<OaConversionDO> getOaConversionPage(OaConversionPageReqVO pageReqVO);
+    PageResult<OaConversionRespVO> exportOaConversionExcel(OaConversionPageReqVO pageReqVO);
 
 
 }
 }

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

@@ -2,19 +2,34 @@ package cn.iocoder.yudao.module.bpm.service.oa.conversion;
 
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 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.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 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.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 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.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.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.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.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.conversion.OaConversionDO;
 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.dal.mysql.oa.conversion.OaConversionMapper;
+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.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 com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.TaskService;
 import org.flowable.engine.TaskService;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.Task;
@@ -24,10 +39,8 @@ import org.springframework.validation.annotation.Validated;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_CONVERSION_NOT_EXISTS;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_CONVERSION_NOT_EXISTS;
@@ -39,7 +52,7 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_CONVERSION
  */
  */
 @Service
 @Service
 @Validated
 @Validated
-public class OaConversionServiceImpl extends ServiceImpl<OaConversionMapper, OaConversionDO> implements OaConversionService {
+public class OaConversionServiceImpl implements OaConversionService {
 
 
     /**
     /**
      * OA 转正对应的流程定义 KEY
      * OA 转正对应的流程定义 KEY
@@ -58,91 +71,211 @@ public class OaConversionServiceImpl extends ServiceImpl<OaConversionMapper, OaC
     @Resource
     @Resource
     private TaskService taskService;
     private TaskService taskService;
 
 
+    @Resource
+    private FileApi fileApi;
+
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @Resource
+    private DeptApi deptApi;
 
 
     @Override
     @Override
     @Transactional
     @Transactional
-    public Long startOaConversion(Long userId, OaConversionSaveReqVO createReqVO) {
-        //判断是否已经发起流程
-        Boolean auditPass = createReqVO.getAuditPass();
-        // 创建单据uuid
-        String uuid = IdUtil.fastSimpleUUID();
-        OaConversionDO oaConversion = BeanUtils.toBean(createReqVO, OaConversionDO.class);
+    public Long stagingOaConversion(OaConversionSaveReqVO stagingReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
+        Objects.requireNonNull(loginUser, "登录用户不能为空");
+        // 转正人信息
+        AdminUserRespDTO employee = adminUserApi.getUser(stagingReqVO.getEmployeeId());
+
+        OaConversionDO oaConversion = BeanUtils.toBean(stagingReqVO, OaConversionDO.class);
         if (StringUtils.isBlank(oaConversion.getConversionId())) {
         if (StringUtils.isBlank(oaConversion.getConversionId())) {
+            // 创建单据uuid
+            String uuid = IdUtil.fastSimpleUUID();
             oaConversion.setConversionId(uuid);
             oaConversion.setConversionId(uuid);
         }
         }
+        if (employee != null) {
+            oaConversion.setEmployeeId(loginUser.getId());
+            oaConversion.setEmployeeName(loginUser.getNickname());
+            oaConversion.setEmployeePhone(loginUser.getMobile());
+            oaConversion.setDeptId(loginUser.getDeptId());
+            oaConversion.setPosition("员工职位");
+            oaConversion.setUserId(loginUser.getId());
+        }
+        oaConversion.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_STAGING);
+        oaConversion.setInfoSource("0");
+        oaConversion.setApplyEmployeeId(loginUser.getId());
+        oaConversion.setApplyEmployeeName(loginUser.getNickname());
+        // 暂存不保存审批人信息
+        oaConversion.setStartUserSelectAssignees(null);
         // 保存或更新表单信息
         // 保存或更新表单信息
-        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())));
+        if (oaConversion.getId() == null) {
+            oaConversionMapper.insert(oaConversion);
+        } else {
+            oaConversionMapper.updateById(oaConversion);
+        }
+        // 保存业务uuid到附件中
+        saveFileList(stagingReqVO.getFileIdList(), oaConversion.getConversionId());
 
 
-            // TODO 发送通知
+        return oaConversion.getId();
+    }
 
 
-        }else {
-            // 暂存,不发起流程
-            // 将单据状态 更新到 OA转正中
-            oaConversionMapper.updateById(new OaConversionDO()
-                    .setId(oaConversion.getId())
-                    .setAuditStatus("0"));
+    @Override
+    @Transactional
+    public Long commitOaConversion(OaConversionSaveReqVO 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);
+        if (loginUser == null) {
+            throw exception(ErrorCodeConstants.OA_LOGIN_USER_NOT_EXISTS);
         }
         }
+        // 转正人信息
+        AdminUserRespDTO employee = adminUserApi.getUser(commitReqVO.getEmployeeId());
+        if (employee == null) {
+            throw exception(ErrorCodeConstants.OA_EMPLOYEE_NOT_EXISTS);
+        }
+
 
 
-        // TODO 保存或更新附件uuid
-        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+        OaConversionDO oaConversion = BeanUtils.toBean(commitReqVO, OaConversionDO.class);
+        if (StringUtils.isBlank(oaConversion.getConversionId())) {
+            // 创建单据uuid
+            String uuid = IdUtil.fastSimpleUUID();
+            oaConversion.setConversionId(uuid);
         }
         }
+        oaConversion.setEmployeeId(employee.getId());
+        oaConversion.setEmployeeName(employee.getNickname());
+        oaConversion.setEmployeePhone(employee.getMobile());
+        oaConversion.setDeptId(employee.getDeptId());
+        oaConversion.setPosition("员工职位");
+        oaConversion.setUserId(loginUser.getId());
+        oaConversion.setInfoSource("0");
+        oaConversion.setApplyEmployeeId(loginUser.getId());
+        oaConversion.setApplyEmployeeName(loginUser.getNickname());
+        // 保存或更新表单信息
+        if (oaConversion.getId() == null) {
+            oaConversionMapper.insert(oaConversion);
+        } else {
+            OaConversionDO oaConversionDO = oaConversionMapper.selectById(oaConversion.getId());
+            if (StrUtil.isNotBlank(oaConversionDO.getProcInstId())) {
+                throw exception(ErrorCodeConstants.PROCESS_INSTANCE_CREATE_FAIL_HAS_PROCESS);
+            }
+            oaConversionMapper.updateById(oaConversion);
+        }
+        // 发起流程
+        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(oaConversion.getId()))
+                                .setStartUserSelectAssignees(startUserSelectAssignees));
+
+        //获取下一个审批人
+        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
 
 
-        // 返回
+        // 审批同意
+        BpmTaskApproveReqVO agreeReqVO = new BpmTaskApproveReqVO();
+        agreeReqVO.setId(task.getId());
+        agreeReqVO.setReason("[首次提交]");
+        agreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_COMMITTED));
+        taskService.setVariable(task.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_COMMITTED);
+        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);
+        }
+        Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+        AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
+
+
+        // 将工作流的流程实例ID、单据状态、最后一次审批时间、当前审批人更新到单据信息中
+        oaConversionMapper.updateById(new OaConversionDO()
+                .setId(oaConversion.getId())
+                .setProcInstId(processInstanceId)
+                .setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
+                .setFinalAuditDate(LocalDateTime.now())
+                .setCurrentAuditEmployeeId(currentAuditEmployeeId)
+                .setCurrentAuditEmployeeName(currentAuditEmployee.getNickname())
+                .setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(","))));
+        // 保存业务uuid到附件中
+        saveFileList(commitReqVO.getFileIdList(), oaConversion.getConversionId());
+        // TODO DP 发送提交成功站内信
         return oaConversion.getId();
         return oaConversion.getId();
     }
     }
+
     @Override
     @Override
-    public Long completeTrueOaConversion(Long userId, BpmTaskApproveReqVO reqVO) {
-        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+    @Transactional
+    public Long agreeOaConversion(BpmTaskApproveReqVO agreeReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        Task currentTask = bpmTaskService.getTask(agreeReqVO.getId());
+        if (currentTask == null) {
+            throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
+        }
+        // 先更新为审批中
+        taskService.setVariable(currentTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
+        LambdaQueryWrapper<OaConversionDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(OaConversionDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaConversionDO oaConversion = oaConversionMapper.selectOne(lambdaQueryWrapper);
+        // 如果是最后一个人审批同意,设置流程审批状态为已审核
+        String[] auditPersons = oaConversion.getStartUserSelectAssignees().split(",");
+        String lastAuditPerson = Arrays.stream(auditPersons)
+                .reduce((first, second) -> second)
+                .orElse(null);
+        if (currentTask.getAssignee().equals(lastAuditPerson)) {
+            // 更新为已审核(暂时未生效,未找到原因,先不处理)
+            taskService.setVariable(agreeReqVO.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITED);
+        }
         // 审批同意
         // 审批同意
-        bpmTaskService.approveTask(userId, reqVO);
+        String reason = "[同意]";
+        if (StrUtil.isNotBlank(agreeReqVO.getReason())) {
+            reason = reason + agreeReqVO.getReason();
+        }
+        agreeReqVO.setReason(reason);
+        agreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_AUDITING));
+        taskService.setVariable(agreeReqVO.getId(), "auditPass", "true");
+        bpmTaskService.approveTask(loginUserId, agreeReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        OaConversionDO oaConversionDO = new OaConversionDO();
         if (nextTask != null) {
         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);
+            Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+            AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
+
+            // 如果审批人重复,实际未结束,再次更新为审核中
+            taskService.setVariable(nextTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
+            oaConversionDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITING)
+                    .setCurrentAuditEmployeeId(currentAuditEmployeeId)
+                    .setCurrentAuditEmployeeName(currentAuditEmployee.getNickname())
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaConversion.getId());
+
         } else {
         } 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);
+            oaConversionDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITED)
+                    .setCurrentAuditEmployeeId(null)
+                    .setCurrentAuditEmployeeName(null)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaConversion.getId());
 
 
             // TODO 复制业务单据信息到业务模块单据表
             // TODO 复制业务单据信息到业务模块单据表
 
 
         }
         }
+        oaConversionMapper.updateById(oaConversionDO);
         // 发送通知
         // 发送通知
 
 
         // 返回
         // 返回
@@ -150,81 +283,187 @@ public class OaConversionServiceImpl extends ServiceImpl<OaConversionMapper, OaC
     }
     }
 
 
     @Override
     @Override
-    public Long completeFalseOaConversion(Long userId, BpmTaskApproveReqVO reqVO) {
+    @Transactional
+    public Long disagreeOaConversion(BpmTaskReturnReqVO disagreeReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
 
 
-        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+        Task currentTask = bpmTaskService.getTask(disagreeReqVO.getId());
 
 
-        BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
-        reqVO2.setTargetTaskDefinitionKey("modifyApply");
-        bpmTaskService.returnTask(userId, reqVO2);
+        disagreeReqVO.setTargetTaskDefinitionKey("modifyApply");
+        disagreeReqVO.setReason("[驳回]" + disagreeReqVO.getReason());
+        disagreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_RETURNED));
+        taskService.setVariable(disagreeReqVO.getId(), "auditPass", "false");
+        taskService.setVariable(disagreeReqVO.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_RETURNED);
+        bpmTaskService.returnTask(loginUserId, disagreeReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+        AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
 
 
         // 更新单据状态,当前处理人,最后处理时间
         // 更新单据状态,当前处理人,最后处理时间
         LambdaUpdateWrapper<OaConversionDO> updateWrapper = new LambdaUpdateWrapper<>();
         LambdaUpdateWrapper<OaConversionDO> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.set(OaConversionDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
-                .set(OaConversionDO::getFinalAuditDate, new Date())
-                .set(OaConversionDO::getAuditStatus, "0")
+        updateWrapper.set(OaConversionDO::getCurrentAuditEmployeeId, currentAuditEmployeeId)
+                .set(OaConversionDO::getCurrentAuditEmployeeName, currentAuditEmployee.getNickname())
+                .set(OaConversionDO::getFinalAuditDate, LocalDateTime.now())
+                .set(OaConversionDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RETURNED)
                 .eq(OaConversionDO::getProcInstId, currentTask.getProcessInstanceId());
                 .eq(OaConversionDO::getProcInstId, currentTask.getProcessInstanceId());
         oaConversionMapper.update(updateWrapper);
         oaConversionMapper.update(updateWrapper);
 
 
         // 发送通知
         // 发送通知
 
 
-        // 返回
         return 1L;
         return 1L;
     }
     }
 
 
     @Override
     @Override
-    public Long updateCompleteOaConversion(Long userId, OaConversionSaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
-        // 判断是否已经发起流程
-        Boolean auditPass = createReqVO.getAuditPass();
+    @Transactional
+    public Long revocationOaConversion(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<OaConversionDO> lambdaQueryWrapper = new LambdaQueryWrapper<OaConversionDO>()
+                .eq(OaConversionDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaConversionDO oaConversionDO = oaConversionMapper.selectOne(lambdaQueryWrapper);
+        if (!DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaConversionDO.getAuditStatus())
+                || !Objects.equals(String.valueOf(loginUserId), oaConversionDO.getCreator())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TASK_REVOCATION_NOT_ALLOWED);
+        }
 
 
-        OaConversionDO oaConversion = BeanUtils.toBean(createReqVO, OaConversionDO.class);
+        BpmTaskReturnReqVO returnReqVO = BeanUtils.toBean(revocationReqVO, BpmTaskReturnReqVO.class);
+        returnReqVO.setTargetTaskDefinitionKey("modifyApply");
+        String reason = "[撤回]";
+        if (StrUtil.isNotBlank(returnReqVO.getReason())) {
+            reason = reason + returnReqVO.getReason();
+        }
+        returnReqVO.setReason(reason);
+        returnReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_RECALLED));
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_RECALLED);
+        bpmTaskService.revocationTask(loginUserId, returnReqVO);
 
 
-        Task currentTask = taskService.createTaskQuery().processInstanceId(oaConversion.getProcInstId()).singleResult();
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+        AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
 
 
-        //审批通过
-        bpmTaskService.approveTask(userId, reqVO);
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaConversionDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaConversionDO::getCurrentAuditEmployeeId, currentAuditEmployeeId)
+                .set(OaConversionDO::getCurrentAuditEmployeeName, currentAuditEmployee.getNickname())
+                .set(OaConversionDO::getFinalAuditDate, LocalDateTime.now())
+                .set(OaConversionDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RECALLED)
+                .eq(OaConversionDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaConversionMapper.update(updateWrapper);
 
 
-        // 提交
-        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);
+        return 1L;
+    }
 
 
-        } else {
-            OaConversionDO oaConversionClose = new OaConversionDO();
-            oaConversionClose.setId(oaConversion.getId());
-            oaConversionClose.setAuditStatus("4");
-            oaConversionClose.setCurrentAuditEmployeeId(null);
-            oaConversionClose.setFinalAuditDate(LocalDateTime.now());
-            oaConversionMapper.updateById(oaConversionClose);
+    @Override
+    @Transactional
+    public Long reCommitOaConversion(OaConversionSaveReqVO reCommitReqVO) {
+        if (reCommitReqVO.getId() == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
+        if (loginUser == null) {
+            throw exception(ErrorCodeConstants.OA_LOGIN_USER_NOT_EXISTS);
+        }
+        // 转正人信息
+        AdminUserRespDTO employee = adminUserApi.getUser(reCommitReqVO.getEmployeeId());
+        if (employee == null) {
+            throw exception(ErrorCodeConstants.OA_EMPLOYEE_NOT_EXISTS);
         }
         }
 
 
-        return oaConversion.getId();
-    }
+        OaConversionDO oaConversionNew = BeanUtils.toBean(reCommitReqVO, OaConversionDO.class);
+        OaConversionDO oaConversionOld = oaConversionMapper.selectById(oaConversionNew.getId());
+        oaConversionNew.setConversionId(oaConversionOld.getConversionId())
+                .setProcInstId(oaConversionOld.getProcInstId());
+
+        oaConversionNew.setEmployeeId(employee.getId());
+        oaConversionNew.setEmployeeName(employee.getNickname());
+        oaConversionNew.setEmployeePhone(employee.getMobile());
+        oaConversionNew.setDeptId(employee.getDeptId());
+        oaConversionNew.setPosition("员工职位");
+        oaConversionNew.setUserId(loginUser.getId());
+        oaConversionNew.setApplyEmployeeId(loginUser.getId());
+        oaConversionNew.setApplyEmployeeName(loginUser.getNickname());
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaConversionNew.getProcInstId()).singleResult();
+        BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
+        approveReqVO.setId(currentTask.getId())
+                .setReason("[再次提交]");
+        approveReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_COMMITTED));
+        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);
+            // 保存审批人信息
+            oaConversionNew.setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(",")));
+        }
+        taskService.setVariable(currentTask.getId(), "auditPass", "true");
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_COMMITTED);
+        // 再次提交,和审批通过逻辑相同
+        bpmTaskService.approveTask(loginUserId, approveReqVO);
 
 
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+        AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
+        oaConversionNew.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
+                .setCurrentAuditEmployeeId(currentAuditEmployeeId)
+                .setCurrentAuditEmployeeName(currentAuditEmployee.getNickname())
+                .setFinalAuditDate(LocalDateTime.now());
+        oaConversionMapper.updateById(oaConversionNew);
 
 
+        // 保存业务uuid到附件中
+        saveFileList(reCommitReqVO.getFileIdList(), oaConversionNew.getConversionId());
 
 
-    @Override
-    public Long createOaConversion(OaConversionSaveReqVO createReqVO) {
-        // 插入
-        OaConversionDO oaConversion = BeanUtils.toBean(createReqVO, OaConversionDO.class);
-        oaConversionMapper.insert(oaConversion);
-        // 返回
-        return oaConversion.getId();
+        return 1L;
     }
     }
 
 
     @Override
     @Override
-    public void updateOaConversion(OaConversionSaveReqVO updateReqVO) {
-        // 校验存在
-        validateOaConversionExists(updateReqVO.getId());
-        // 更新
-        OaConversionDO updateObj = BeanUtils.toBean(updateReqVO, OaConversionDO.class);
-        oaConversionMapper.updateById(updateObj);
+    @Transactional
+    public Long closeOaConversion(Long id) {
+        if (id == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaConversionDO oaConversionDO = oaConversionMapper.selectById(id);
+        if (!DictDataConstants.OA_AUDIT_STATUS_RETURNED.equals(oaConversionDO.getAuditStatus())
+                && !DictDataConstants.OA_AUDIT_STATUS_RECALLED.equals(oaConversionDO.getAuditStatus())) {
+            throw exception(ErrorCodeConstants.TASK_CLOSE_NOT_ALLOWED);
+        }
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaConversionDO.getProcInstId()).singleResult();
+        BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
+        approveReqVO.setId(currentTask.getId())
+                .setReason("[关闭]");
+        approveReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_CLOSED));
+        taskService.setVariable(currentTask.getId(), "auditPass", "false");
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_CLOSED);
+        // 关闭,使用审批通过的方法实现
+        bpmTaskService.approveTask(loginUserId, approveReqVO);
+
+        LambdaUpdateWrapper<OaConversionDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.set(OaConversionDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_CLOSED)
+                .set(OaConversionDO::getCurrentAuditEmployeeId, null)
+                .set(OaConversionDO::getCurrentAuditEmployeeName, null)
+                .set(OaConversionDO::getFinalAuditDate, LocalDateTime.now())
+                .eq(OaConversionDO::getId, id);
+        oaConversionMapper.update(lambdaUpdateWrapper);
+        return 1L;
     }
     }
 
 
     @Override
     @Override
@@ -235,20 +474,167 @@ public class OaConversionServiceImpl extends ServiceImpl<OaConversionMapper, OaC
         oaConversionMapper.deleteById(id);
         oaConversionMapper.deleteById(id);
     }
     }
 
 
-    private void validateOaConversionExists(Long id) {
-        if (oaConversionMapper.selectById(id) == null) {
-            throw exception(OA_CONVERSION_NOT_EXISTS);
+    @Override
+    public OaConversionRespVO getOaConversion(Long id) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaConversionDO oaConversionDO = oaConversionMapper.selectById(id);
+        OaConversionRespVO oaConversionRespVO = BeanUtils.toBean(oaConversionDO, OaConversionRespVO.class);
+        if (oaConversionDO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(oaConversionDO.getDeptId());
+            if (dept != null) {
+                oaConversionRespVO.setDeptName(dept.getName());
+            }
+        }
+
+        String procInstId = oaConversionDO.getProcInstId();
+        if (StrUtil.isNotBlank(procInstId)) {
+            Task task = taskService.createTaskQuery()
+                    .processInstanceId(procInstId)
+                    .taskAssignee(String.valueOf(loginUserId))
+                    .singleResult();
+            if (DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaConversionDO.getAuditStatus())) {
+                // 如果是已提交,不限制任务处理人是当前登录人,用于直接撤回
+                task = taskService.createTaskQuery()
+                        .processInstanceId(procInstId)
+                        .singleResult();
+            }
+            if (task != null) {
+                oaConversionRespVO.setTaskId(task.getId());
+            }
+        }
+
+        // 附件列表
+        List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaConversionDO.getConversionId());
+        oaConversionRespVO.setFileList(fileList);
+
+        // 审批记录
+        if (StrUtil.isNotBlank(oaConversionDO.getProcInstId())) {
+            List<BpmTaskRespVO> auditRecordList = bpmTaskService.getAuditRecordListByProcessInstanceId(oaConversionDO.getProcInstId());
+            oaConversionRespVO.setAuditRecordList(auditRecordList);
         }
         }
+
+        // 审批人
+        String startUserSelectAssignees = oaConversionDO.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;
+                    }
+                }
+            }
+            oaConversionRespVO.setAuditUserList(auditUserList);
+        }
+
+        return oaConversionRespVO;
+    }
+
+    @Override
+    public OaConversionRespVO getOaConversionByProcInstId(String procInstId) {
+        OaConversionDO oaConversionDO = oaConversionMapper.selectOne(OaConversionDO::getProcInstId, procInstId);
+        OaConversionRespVO oaConversionRespVO = BeanUtils.toBean(oaConversionDO, OaConversionRespVO.class);
+        if (oaConversionDO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(oaConversionDO.getDeptId());
+            if (dept != null) {
+                oaConversionRespVO.setDeptName(dept.getName());
+            }
+        }
+
+        // 附件列表
+        List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaConversionDO.getConversionId());
+        oaConversionRespVO.setFileList(fileList);
+
+        // 审批记录
+        if (StrUtil.isNotBlank(oaConversionDO.getProcInstId())) {
+            List<BpmTaskRespVO> auditRecordList = bpmTaskService.getAuditRecordListByProcessInstanceId(oaConversionDO.getProcInstId());
+            oaConversionRespVO.setAuditRecordList(auditRecordList);
+        }
+
+        // 审批人
+        String startUserSelectAssignees = oaConversionDO.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;
+                    }
+                }
+            }
+            oaConversionRespVO.setAuditUserList(auditUserList);
+        }
+
+        return oaConversionRespVO;
     }
     }
 
 
     @Override
     @Override
-    public OaConversionDO getOaConversion(Long id) {
-        return oaConversionMapper.selectById(id);
+    public PageResult<OaConversionRespVO> getOaConversionPage(OaConversionPageReqVO pageReqVO) {
+        PageResult<OaConversionDO> oaConversionDOPageResult = oaConversionMapper.selectPage(pageReqVO);
+        PageResult<OaConversionRespVO> oaConversionRespVOPageResult = BeanUtils.toBean(oaConversionDOPageResult, OaConversionRespVO.class);
+
+        List<OaConversionRespVO> oaConversionRespVOList = oaConversionRespVOPageResult.getList();
+        if (CollectionUtil.isNotEmpty(oaConversionRespVOList)) {
+            List<Long> employeeIdList = oaConversionRespVOList.stream().map(OaConversionRespVO::getCurrentAuditEmployeeId).collect(Collectors.toList());
+            List<AdminUserRespDTO> employeeList = adminUserApi.getUserList(employeeIdList);
+            for (OaConversionRespVO respVO : oaConversionRespVOList) {
+                for (AdminUserRespDTO employee : employeeList) {
+                    if (respVO.getCurrentAuditEmployeeId() == employee.getId()) {
+                        respVO.setCurrentAuditEmployeeName(employee.getNickname());
+                        break;
+                    }
+                }
+            }
+
+            List<Long> deptIdList = oaConversionRespVOList.stream().map(OaConversionRespVO::getDeptId).collect(Collectors.toList());
+            List<DeptRespDTO> deptList = deptApi.getDeptList(deptIdList);
+            for (OaConversionRespVO respVO : oaConversionRespVOList) {
+                for (DeptRespDTO dept : deptList) {
+                    if (respVO.getDeptId() == dept.getId()) {
+                        respVO.setDeptName(dept.getName());
+                        break;
+                    }
+                }
+            }
+        }
+
+        return oaConversionRespVOPageResult;
     }
     }
 
 
     @Override
     @Override
-    public PageResult<OaConversionDO> getOaConversionPage(OaConversionPageReqVO pageReqVO) {
-        return oaConversionMapper.selectPage(pageReqVO);
+    public PageResult<OaConversionRespVO> exportOaConversionExcel(OaConversionPageReqVO pageReqVO) {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        return getOaConversionPage(pageReqVO);
+    }
+
+    private void validateOaConversionExists(Long id) {
+        OaConversionDO oaConversionDO = oaConversionMapper.selectById(id);
+        if (oaConversionDO == null) {
+            throw exception(OA_CONVERSION_NOT_EXISTS);
+        }
+        if (!DictDataConstants.OA_AUDIT_STATUS_STAGING.equals(oaConversionDO.getAuditStatus())) {
+            throw exception(ErrorCodeConstants.DELETE_FAIL_NOT_STAGING);
+        }
+    }
+
+    /**
+     * 保存业务uuid到附件中
+     */
+    private void saveFileList(List<Long> fileIdList, String serviceId) {
+        if (CollectionUtil.isNotEmpty(fileIdList) && StrUtil.isNotEmpty(serviceId)) {
+            fileApi.updateFileBiz(fileIdList, serviceId);
+        }
     }
     }
 
 
 }
 }

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

@@ -1,66 +0,0 @@
-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);
-
-}

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

@@ -2,85 +2,39 @@ package cn.iocoder.yudao.module.bpm.service.oa.entry;
 
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 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.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.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.BpmTaskApproveReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry.OaEntryDO;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-import javax.validation.Valid;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 
 
 /**
 /**
  * 入职流程信息 Service 接口
  * 入职流程信息 Service 接口
  *
  *
  * @author 芋道源码
  * @author 芋道源码
  */
  */
-public interface OaEntryService extends IService<OaEntryDO> {
+public interface OaEntryService {
+
+    Long stagingOaEntry(OaEntrySaveReqVO stagingReqVO);
+
+    Long commitOaEntry(OaEntrySaveReqVO commitReqVO);
+
+    Long agreeOaEntry(BpmTaskApproveReqVO agreeReqVO);
 
 
-    /**
-     * 发起入职流程信息
-     *
-     * @param userId
-     * @param createReqVO 创建信息
-     * @return 编号
-     */
-    Integer startOaEntry(Long userId, @Valid OaEntrySaveReqVO createReqVO);
+    Long disagreeOaEntry(BpmTaskReturnReqVO disagreeReqVO);
 
 
-    /**
-     * 审批同意入职流程信息
-     *
-     * @param userId
-     * @param reqVO  通过请求
-     * @return 编号
-     */
-    Integer completeTrueOaEntry(Long userId, BpmTaskApproveReqVO reqVO);
+    Long revocationOaEntry(BpmTaskApproveReqVO revocationReqVO);
 
 
-    /**
-     * 驳回或撤回入职流程信息
-     *
-     * @param userId
-     * @param reqVO  驳回或撤回
-     * @return 编号
-     */
-    Integer completeFalseOaEntry(Long userId, BpmTaskApproveReqVO reqVO);
+    Long reCommitOaEntry(OaEntrySaveReqVO reCommitReqVO);
 
 
-    /**
-     * 驳回和撤回后再次提交或关闭入职流程信息
-     *
-     * @param userId
-     * @param createReqVO 创建信息
-     * @param reqVO       通过请求
-     * @return 编号
-     */
-    Integer updateCompleteOaEntry(Long userId, @Valid OaEntrySaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+    Long closeOaEntry(Long id);
 
 
-    /**
-     * 更新入职流程信息
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateOaEntry(@Valid OaEntrySaveReqVO updateReqVO);
+    void deleteOaEntry(Long id);
 
 
-    /**
-     * 删除入职流程信息
-     *
-     * @param id 编号
-     */
-    void deleteOaEntry(Integer id);
+    OaEntryRespVO getOaEntry(Long id);
 
 
-    /**
-     * 获得入职流程信息
-     *
-     * @param id 编号
-     * @return 入职流程信息
-     */
-    OaEntryDO getOaEntry(Integer id);
+    OaEntryRespVO getOaEntryByProcInstId(String procInstId);
 
 
-    /**
-     * 获得入职流程信息分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 入职流程信息分页
-     */
-    PageResult<OaEntryDO> getOaEntryPage(OaEntryPageReqVO pageReqVO);
+    PageResult<OaEntryRespVO> getOaEntryPage(OaEntryPageReqVO pageReqVO);
 
 
+    PageResult<OaEntryRespVO> exportOaEntryExcel(OaEntryPageReqVO pageReqVO);
 }
 }

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

@@ -2,33 +2,45 @@ package cn.iocoder.yudao.module.bpm.service.oa.entry;
 
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 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.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 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.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 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.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.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.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.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.entry.OaEntryDO;
 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.dal.mysql.oa.entry.OaEntryMapper;
+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.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 com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.flowable.engine.RuntimeService;
 import org.flowable.engine.TaskService;
 import org.flowable.engine.TaskService;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.Task;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+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.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_ENTRY_NOT_EXISTS;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_ENTRY_NOT_EXISTS;
@@ -40,12 +52,12 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_ENTRY_NOT_
  */
  */
 @Service
 @Service
 @Validated
 @Validated
-public class OaEntryServiceImpl extends ServiceImpl<OaEntryMapper, OaEntryDO> implements OaEntryService {
+public class OaEntryServiceImpl implements OaEntryService {
 
 
     /**
     /**
      * OA 入职对应的流程定义 KEY
      * OA 入职对应的流程定义 KEY
      */
      */
-    public static final String PROCESS_KEY = "oa_entry_workflow";
+    public static final String PROCESS_KEY = "oa_entry";
 
 
     @Resource
     @Resource
     private OaEntryMapper oaEntryMapper;
     private OaEntryMapper oaEntryMapper;
@@ -59,189 +71,509 @@ public class OaEntryServiceImpl extends ServiceImpl<OaEntryMapper, OaEntryDO> im
     @Resource
     @Resource
     private TaskService taskService;
     private TaskService taskService;
 
 
-    @Autowired
-    private RuntimeService runtimeService;
+    @Resource
+    private FileApi fileApi;
+
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @Resource
+    private DeptApi deptApi;
 
 
     @Override
     @Override
     @Transactional
     @Transactional
-    public Integer startOaEntry(Long userId, OaEntrySaveReqVO createReqVO) {
-        //判断是否已经发起流程
-        Boolean auditPass = createReqVO.getAuditPass();
-        // 创建单据uuid
-        String uuid = IdUtil.fastSimpleUUID();
-        OaEntryDO oaEntry = BeanUtils.toBean(createReqVO, OaEntryDO.class);
+    public Long stagingOaEntry(OaEntrySaveReqVO stagingReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
+        Objects.requireNonNull(loginUser, "登录用户不能为空");
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaEntryDO oaEntry = BeanUtils.toBean(stagingReqVO, OaEntryDO.class);
         if (StringUtils.isBlank(oaEntry.getEntryId())) {
         if (StringUtils.isBlank(oaEntry.getEntryId())) {
+            // 创建单据uuid
+            String uuid = IdUtil.fastSimpleUUID();
             oaEntry.setEntryId(uuid);
             oaEntry.setEntryId(uuid);
         }
         }
+        oaEntry.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_STAGING);
+        oaEntry.setInfoSource("0");
+        // 暂存不保存审批人信息
+        oaEntry.setStartUserSelectAssignees(null);
         // 保存或更新表单信息
         // 保存或更新表单信息
-        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();
+        if (oaEntry.getId() == null) {
+            oaEntryMapper.insert(oaEntry);
+        } else {
+            oaEntryMapper.updateById(oaEntry);
+        }
+        // 保存业务uuid到附件中
+        saveFileList(stagingReqVO.getFileIdList(), oaEntry.getEntryId());
 
 
-            // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 入职中
-            oaEntryMapper.updateById(new OaEntryDO()
-                    .setId(oaEntry.getId())
-                    .setProcInstId(processInstanceId)
-                    .setAuditStatus("1")
-                    .setEntryId(uuid)
-                    .setFinalAuditDate(new Date())
-                    .setCurrentAuditEmployeeId(task.getAssignee()));
+        return oaEntry.getId();
+    }
 
 
-            // TODO 发送通知
+    @Override
+    @Transactional
+    public Long commitOaEntry(OaEntrySaveReqVO 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 根据登录人查询出对应的员工信息
 
 
-        }else {
-            // 暂存,不发起流程
-            // 将单据状态 更新到 OA入职中
-            oaEntryMapper.updateById(new OaEntryDO()
-                    .setId(oaEntry.getId())
-                    .setAuditStatus("0"));
+        OaEntryDO oaEntry = BeanUtils.toBean(commitReqVO, OaEntryDO.class);
+        if (StringUtils.isBlank(oaEntry.getEntryId())) {
+            // 创建单据uuid
+            String uuid = IdUtil.fastSimpleUUID();
+            oaEntry.setEntryId(uuid);
         }
         }
+        oaEntry.setInfoSource("0");
+        // 保存或更新表单信息
+        if (oaEntry.getId() == null) {
+            oaEntryMapper.insert(oaEntry);
+        } else {
+            OaEntryDO oaEntryDO = oaEntryMapper.selectById(oaEntry.getId());
+            if (StrUtil.isNotBlank(oaEntryDO.getProcInstId())) {
+                throw exception(ErrorCodeConstants.PROCESS_INSTANCE_CREATE_FAIL_HAS_PROCESS);
+            }
+            oaEntryMapper.updateById(oaEntry);
+        }
+        // 发起流程
+        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(oaEntry.getId()))
+                                .setStartUserSelectAssignees(startUserSelectAssignees));
+
+        //获取下一个审批人
+        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
 
 
-        // TODO 保存或更新附件uuid
-        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+        // 审批同意
+        BpmTaskApproveReqVO agreeReqVO = new BpmTaskApproveReqVO();
+        agreeReqVO.setId(task.getId());
+        agreeReqVO.setReason("[首次提交]");
+        agreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_COMMITTED));
+        taskService.setVariable(task.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_COMMITTED);
+        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、单据状态、最后一次审批时间、当前审批人更新到单据信息中
+        oaEntryMapper.updateById(new OaEntryDO()
+                .setId(oaEntry.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(), oaEntry.getEntryId());
+        // TODO DP 发送提交成功站内信
         return oaEntry.getId();
         return oaEntry.getId();
     }
     }
 
 
     @Override
     @Override
-    public Integer completeTrueOaEntry(Long userId, BpmTaskApproveReqVO reqVO) {
-        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+    @Transactional
+    public Long agreeOaEntry(BpmTaskApproveReqVO agreeReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        Task currentTask = bpmTaskService.getTask(agreeReqVO.getId());
+        if (currentTask == null) {
+            throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
+        }
+        // 先更新为审批中
+        taskService.setVariable(currentTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
+        LambdaQueryWrapper<OaEntryDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(OaEntryDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaEntryDO oaEntry = oaEntryMapper.selectOne(lambdaQueryWrapper);
+        // 如果是最后一个人审批同意,设置流程审批状态为已审核
+        String[] auditPersons = oaEntry.getStartUserSelectAssignees().split(",");
+        String lastAuditPerson = Arrays.stream(auditPersons)
+                .reduce((first, second) -> second)
+                .orElse(null);
+        if (currentTask.getAssignee().equals(lastAuditPerson)) {
+            // 更新为已审核(暂时未生效,未找到原因,先不处理)
+            taskService.setVariable(agreeReqVO.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITED);
+        }
         // 审批同意
         // 审批同意
-        bpmTaskService.approveTask(userId, reqVO);
+        String reason = "[同意]";
+        if (StrUtil.isNotBlank(agreeReqVO.getReason())) {
+            reason = reason + agreeReqVO.getReason();
+        }
+        agreeReqVO.setReason(reason);
+        agreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_AUDITING));
+        taskService.setVariable(agreeReqVO.getId(), "auditPass", "true");
+        bpmTaskService.approveTask(loginUserId, agreeReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        OaEntryDO oaEntryDO = new OaEntryDO();
         if (nextTask != null) {
         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);
+            // 如果审批人重复,实际未结束,再次更新为审核中
+            taskService.setVariable(nextTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
+            oaEntryDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITING)
+                    .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaEntry.getId());
+
         } else {
         } 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);
+            oaEntryDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITED)
+                    .setCurrentAuditEmployeeId(null)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaEntry.getId());
 
 
             // TODO 复制业务单据信息到业务模块单据表
             // TODO 复制业务单据信息到业务模块单据表
 
 
         }
         }
+        oaEntryMapper.updateById(oaEntryDO);
         // 发送通知
         // 发送通知
 
 
         // 返回
         // 返回
-        return 1;
+        return 1L;
     }
     }
 
 
     @Override
     @Override
-    public Integer completeFalseOaEntry(Long userId, BpmTaskApproveReqVO reqVO) {
+    @Transactional
+    public Long disagreeOaEntry(BpmTaskReturnReqVO disagreeReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
 
 
-        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+        Task currentTask = bpmTaskService.getTask(disagreeReqVO.getId());
 
 
-        BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
-        reqVO2.setTargetTaskDefinitionKey("modifyApply");
-        bpmTaskService.returnTask(userId, reqVO2);
+        disagreeReqVO.setTargetTaskDefinitionKey("modifyApply");
+        disagreeReqVO.setReason("[驳回]" + disagreeReqVO.getReason());
+        disagreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_RETURNED));
+        taskService.setVariable(disagreeReqVO.getId(), "auditPass", "false");
+        taskService.setVariable(disagreeReqVO.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_RETURNED);
+        bpmTaskService.returnTask(loginUserId, disagreeReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
 
 
         // 更新单据状态,当前处理人,最后处理时间
         // 更新单据状态,当前处理人,最后处理时间
         LambdaUpdateWrapper<OaEntryDO> updateWrapper = new LambdaUpdateWrapper<>();
         LambdaUpdateWrapper<OaEntryDO> updateWrapper = new LambdaUpdateWrapper<>();
         updateWrapper.set(OaEntryDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
         updateWrapper.set(OaEntryDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
-                .set(OaEntryDO::getFinalAuditDate, new Date())
-                .set(OaEntryDO::getAuditStatus, "0")
+                .set(OaEntryDO::getFinalAuditDate, LocalDateTime.now())
+                .set(OaEntryDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RETURNED)
                 .eq(OaEntryDO::getProcInstId, currentTask.getProcessInstanceId());
                 .eq(OaEntryDO::getProcInstId, currentTask.getProcessInstanceId());
         oaEntryMapper.update(updateWrapper);
         oaEntryMapper.update(updateWrapper);
 
 
         // 发送通知
         // 发送通知
 
 
-        // 返回
-        return 1;
+        return 1L;
     }
     }
 
 
     @Override
     @Override
-    public Integer updateCompleteOaEntry(Long userId, OaEntrySaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
-        // 判断是否已经发起流程
-        Boolean auditPass = createReqVO.getAuditPass();
+    @Transactional
+    public Long revocationOaEntry(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<OaEntryDO> lambdaQueryWrapper = new LambdaQueryWrapper<OaEntryDO>()
+                .eq(OaEntryDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaEntryDO oaEntryDO = oaEntryMapper.selectOne(lambdaQueryWrapper);
+        if (!DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaEntryDO.getAuditStatus())
+                || !Objects.equals(String.valueOf(loginUserId), oaEntryDO.getCreator())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TASK_REVOCATION_NOT_ALLOWED);
+        }
 
 
-        OaEntryDO oaEntry = BeanUtils.toBean(createReqVO, OaEntryDO.class);
+        BpmTaskReturnReqVO returnReqVO = BeanUtils.toBean(revocationReqVO, BpmTaskReturnReqVO.class);
+        returnReqVO.setTargetTaskDefinitionKey("modifyApply");
+        String reason = "[撤回]";
+        if (StrUtil.isNotBlank(returnReqVO.getReason())) {
+            reason = reason + returnReqVO.getReason();
+        }
+        returnReqVO.setReason(reason);
+        returnReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_RECALLED));
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_RECALLED);
+        bpmTaskService.revocationTask(loginUserId, returnReqVO);
 
 
-        Task currentTask = taskService.createTaskQuery().processInstanceId(oaEntry.getProcInstId()).singleResult();
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
 
 
-        //审批通过
-        bpmTaskService.approveTask(userId, reqVO);
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaEntryDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaEntryDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaEntryDO::getFinalAuditDate, LocalDateTime.now())
+                .set(OaEntryDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RECALLED)
+                .eq(OaEntryDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaEntryMapper.update(updateWrapper);
 
 
-        // 提交
-        if (auditPass) {
-            Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        // 发送通知
 
 
-            oaEntry.setAuditStatus("1");
-            oaEntry.setCurrentAuditEmployeeId(nextTask.getAssignee());
-            oaEntry.setFinalAuditDate(new Date());
-            oaEntryMapper.updateById(oaEntry);
+        return 1L;
+    }
 
 
-        } else {
-            OaEntryDO oaEntryClose = new OaEntryDO();
-            oaEntryClose.setId(oaEntry.getId());
-            oaEntryClose.setAuditStatus("4");
-            oaEntryClose.setCurrentAuditEmployeeId(null);
-            oaEntryClose.setFinalAuditDate(new Date());
-            oaEntryMapper.updateById(oaEntryClose);
+    @Override
+    @Transactional
+    public Long reCommitOaEntry(OaEntrySaveReqVO reCommitReqVO) {
+        if (reCommitReqVO.getId() == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaEntryDO oaEntryNew = BeanUtils.toBean(reCommitReqVO, OaEntryDO.class);
+        OaEntryDO oaEntryOld = oaEntryMapper.selectById(oaEntryNew.getId());
+        oaEntryNew.setEntryId(oaEntryOld.getEntryId())
+                .setProcInstId(oaEntryOld.getProcInstId());
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaEntryNew.getProcInstId()).singleResult();
+        BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
+        approveReqVO.setId(currentTask.getId())
+                .setReason("[再次提交]");
+        approveReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_COMMITTED));
+        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);
+            // 保存审批人信息
+            oaEntryNew.setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(",")));
         }
         }
+        taskService.setVariable(currentTask.getId(), "auditPass", "true");
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_COMMITTED);
+        // 再次提交,和审批通过逻辑相同
+        bpmTaskService.approveTask(loginUserId, approveReqVO);
 
 
-        return oaEntry.getId();
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        oaEntryNew.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
+                .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
+                .setFinalAuditDate(LocalDateTime.now());
+        oaEntryMapper.updateById(oaEntryNew);
+
+        // 保存业务uuid到附件中
+        saveFileList(reCommitReqVO.getFileIdList(), oaEntryNew.getEntryId());
+
+        return 1L;
     }
     }
 
 
     @Override
     @Override
-    public void updateOaEntry(OaEntrySaveReqVO updateReqVO) {
-        // 校验存在
-        validateOaEntryExists(updateReqVO.getId());
-        // 更新
-        OaEntryDO updateObj = BeanUtils.toBean(updateReqVO, OaEntryDO.class);
-        oaEntryMapper.updateById(updateObj);
+    @Transactional
+    public Long closeOaEntry(Long id) {
+        if (id == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaEntryDO oaEntryDO = oaEntryMapper.selectById(id);
+        if (!DictDataConstants.OA_AUDIT_STATUS_RETURNED.equals(oaEntryDO.getAuditStatus())
+                && !DictDataConstants.OA_AUDIT_STATUS_RECALLED.equals(oaEntryDO.getAuditStatus())) {
+            throw exception(ErrorCodeConstants.TASK_CLOSE_NOT_ALLOWED);
+        }
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaEntryDO.getProcInstId()).singleResult();
+        BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
+        approveReqVO.setId(currentTask.getId())
+                .setReason("[关闭]");
+        approveReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_CLOSED));
+        taskService.setVariable(currentTask.getId(), "auditPass", "false");
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_CLOSED);
+        // 关闭,使用审批通过的方法实现
+        bpmTaskService.approveTask(loginUserId, approveReqVO);
+
+        LambdaUpdateWrapper<OaEntryDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.set(OaEntryDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_CLOSED)
+                .set(OaEntryDO::getCurrentAuditEmployeeId, null)
+                .set(OaEntryDO::getFinalAuditDate, LocalDateTime.now())
+                .eq(OaEntryDO::getId, id);
+        oaEntryMapper.update(lambdaUpdateWrapper);
+
+        return 1L;
     }
     }
 
 
     @Override
     @Override
-    public void deleteOaEntry(Integer id) {
+    public void deleteOaEntry(Long id) {
         // 校验存在
         // 校验存在
         validateOaEntryExists(id);
         validateOaEntryExists(id);
         // 删除
         // 删除
         oaEntryMapper.deleteById(id);
         oaEntryMapper.deleteById(id);
     }
     }
 
 
-    private void validateOaEntryExists(Integer id) {
-        if (oaEntryMapper.selectById(id) == null) {
-            throw exception(OA_ENTRY_NOT_EXISTS);
+    @Override
+    public OaEntryRespVO getOaEntry(Long id) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaEntryDO oaEntryDO = oaEntryMapper.selectById(id);
+        OaEntryRespVO oaEntryRespVO = BeanUtils.toBean(oaEntryDO, OaEntryRespVO.class);
+        if (oaEntryDO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(oaEntryDO.getDeptId());
+            if (dept != null) {
+                oaEntryRespVO.setDeptName(dept.getName());
+            }
         }
         }
+
+        String procInstId = oaEntryDO.getProcInstId();
+        if (StrUtil.isNotBlank(procInstId)) {
+            Task task = taskService.createTaskQuery()
+                    .processInstanceId(procInstId)
+                    .taskAssignee(String.valueOf(loginUserId))
+                    .singleResult();
+            if (DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaEntryDO.getAuditStatus())) {
+                // 如果是已提交,不限制任务处理人是当前登录人,用于直接撤回
+                task = taskService.createTaskQuery()
+                        .processInstanceId(procInstId)
+                        .singleResult();
+            }
+            if (task != null) {
+                oaEntryRespVO.setTaskId(task.getId());
+            }
+        }
+
+        // 附件列表
+        List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaEntryDO.getEntryId());
+        oaEntryRespVO.setFileList(fileList);
+
+        // 审批记录
+        if (StrUtil.isNotBlank(oaEntryDO.getProcInstId())) {
+            List<BpmTaskRespVO> auditRecordList = bpmTaskService.getAuditRecordListByProcessInstanceId(oaEntryDO.getProcInstId());
+            oaEntryRespVO.setAuditRecordList(auditRecordList);
+        }
+
+        // 审批人
+        String startUserSelectAssignees = oaEntryDO.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;
+                    }
+                }
+            }
+            oaEntryRespVO.setAuditUserList(auditUserList);
+        }
+
+        return oaEntryRespVO;
     }
     }
 
 
     @Override
     @Override
-    public OaEntryDO getOaEntry(Integer id) {
-        return oaEntryMapper.selectById(id);
+    public OaEntryRespVO getOaEntryByProcInstId(String procInstId) {
+        OaEntryDO oaEntryDO = oaEntryMapper.selectOne(OaEntryDO::getProcInstId, procInstId);
+        OaEntryRespVO oaEntryRespVO = BeanUtils.toBean(oaEntryDO, OaEntryRespVO.class);
+        if (oaEntryDO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(oaEntryDO.getDeptId());
+            if (dept != null) {
+                oaEntryRespVO.setDeptName(dept.getName());
+            }
+        }
+
+        // 附件列表
+        List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaEntryDO.getEntryId());
+        oaEntryRespVO.setFileList(fileList);
+
+        // 审批记录
+        if (StrUtil.isNotBlank(oaEntryDO.getProcInstId())) {
+            List<BpmTaskRespVO> auditRecordList = bpmTaskService.getAuditRecordListByProcessInstanceId(oaEntryDO.getProcInstId());
+            oaEntryRespVO.setAuditRecordList(auditRecordList);
+        }
+
+        // 审批人
+        String startUserSelectAssignees = oaEntryDO.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;
+                    }
+                }
+            }
+            oaEntryRespVO.setAuditUserList(auditUserList);
+        }
+
+        return oaEntryRespVO;
+    }
+
+    @Override
+    public PageResult<OaEntryRespVO> getOaEntryPage(OaEntryPageReqVO pageReqVO) {
+        PageResult<OaEntryDO> oaEntryDOPageResult = oaEntryMapper.selectPage(pageReqVO);
+        PageResult<OaEntryRespVO> oaEntryRespVOPageResult = BeanUtils.toBean(oaEntryDOPageResult, OaEntryRespVO.class);
+
+        List<OaEntryRespVO> oaEntryRespVOList = oaEntryRespVOPageResult.getList();
+        if (CollectionUtil.isNotEmpty(oaEntryRespVOList)) {
+            List<Long> employeeIdList = oaEntryRespVOList.stream().map(OaEntryRespVO::getCurrentAuditEmployeeId).collect(Collectors.toList());
+            List<AdminUserRespDTO> employeeList = adminUserApi.getUserList(employeeIdList);
+            for (OaEntryRespVO respVO : oaEntryRespVOList) {
+                for (AdminUserRespDTO employee : employeeList) {
+                    if (respVO.getCurrentAuditEmployeeId() == employee.getId()) {
+                        respVO.setCurrentAuditEmployeeName(employee.getNickname());
+                        break;
+                    }
+                }
+            }
+
+            List<Long> deptIdList = oaEntryRespVOList.stream().map(OaEntryRespVO::getDeptId).collect(Collectors.toList());
+            List<DeptRespDTO> deptList = deptApi.getDeptList(deptIdList);
+            for (OaEntryRespVO respVO : oaEntryRespVOList) {
+                for (DeptRespDTO dept : deptList) {
+                    if (respVO.getDeptId() == dept.getId()) {
+                        respVO.setDeptName(dept.getName());
+                        break;
+                    }
+                }
+            }
+        }
+
+        return oaEntryRespVOPageResult;
     }
     }
 
 
     @Override
     @Override
-    public PageResult<OaEntryDO> getOaEntryPage(OaEntryPageReqVO pageReqVO) {
-        return oaEntryMapper.selectPage(pageReqVO);
+    public PageResult<OaEntryRespVO> exportOaEntryExcel(OaEntryPageReqVO pageReqVO) {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        return getOaEntryPage(pageReqVO);
+    }
+
+    private void validateOaEntryExists(Long id) {
+        OaEntryDO oaEntryDO = oaEntryMapper.selectById(id);
+        if (oaEntryDO == null) {
+            throw exception(OA_ENTRY_NOT_EXISTS);
+        }
+        if (!DictDataConstants.OA_AUDIT_STATUS_STAGING.equals(oaEntryDO.getAuditStatus())) {
+            throw exception(ErrorCodeConstants.DELETE_FAIL_NOT_STAGING);
+        }
+    }
+
+    /**
+     * 保存业务uuid到附件中
+     */
+    private void saveFileList(List<Long> fileIdList, String serviceId) {
+        if (CollectionUtil.isNotEmpty(fileIdList) && StrUtil.isNotEmpty(serviceId)) {
+            fileApi.updateFileBiz(fileIdList, serviceId);
+        }
     }
     }
 
 
 }
 }

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

@@ -2,65 +2,40 @@ package cn.iocoder.yudao.module.bpm.service.oa.renew;
 
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 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.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.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.BpmTaskApproveReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.renew.OaRenewDO;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-import javax.validation.Valid;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 
 
 /**
 /**
  * 合同续签流程信息 Service 接口
  * 合同续签流程信息 Service 接口
  *
  *
  * @author dp
  * @author dp
  */
  */
-public interface OaRenewService extends IService<OaRenewDO> {
+public interface OaRenewService {
 
 
-    Long startOaRenew(Long userId, @Valid OaRenewSaveReqVO createReqVO);
+    Long stagingOaRenew(OaRenewSaveReqVO stagingReqVO);
 
 
-    Long completeTrueOaRenew(Long userId, BpmTaskApproveReqVO reqVO);
+    Long commitOaRenew(OaRenewSaveReqVO commitReqVO);
 
 
-    Long completeFalseOaRenew(Long userId, BpmTaskApproveReqVO reqVO);
+    Long agreeOaRenew(BpmTaskApproveReqVO agreeReqVO);
 
 
-    Long updateCompleteOaRenew(Long userId, @Valid OaRenewSaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+    Long disagreeOaRenew(BpmTaskReturnReqVO disagreeReqVO);
 
 
+    Long revocationOaRenew(BpmTaskApproveReqVO revocationReqVO);
 
 
-    /**
-     * 创建合同续签流程信息
-     *
-     * @param createReqVO 创建信息
-     * @return 编号
-     */
-    Long createOaRenew(@Valid OaRenewSaveReqVO createReqVO);
+    Long reCommitOaRenew(OaRenewSaveReqVO reCommitReqVO);
 
 
-    /**
-     * 更新合同续签流程信息
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateOaRenew(@Valid OaRenewSaveReqVO updateReqVO);
+    Long closeOaRenew(Long id);
 
 
-    /**
-     * 删除合同续签流程信息
-     *
-     * @param id 编号
-     */
     void deleteOaRenew(Long id);
     void deleteOaRenew(Long id);
 
 
-    /**
-     * 获得合同续签流程信息
-     *
-     * @param id 编号
-     * @return 合同续签流程信息
-     */
-    OaRenewDO getOaRenew(Long id);
+    OaRenewRespVO getOaRenew(Long id);
+
+    OaRenewRespVO getOaRenewByProcInstId(String procInstId);
+
+    PageResult<OaRenewRespVO> getOaRenewPage(OaRenewPageReqVO pageReqVO);
 
 
-    /**
-     * 获得合同续签流程信息分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 合同续签流程信息分页
-     */
-    PageResult<OaRenewDO> getOaRenewPage(OaRenewPageReqVO pageReqVO);
+    PageResult<OaRenewRespVO> exportOaRenewExcel(OaRenewPageReqVO pageReqVO);
 
 
 }
 }

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

@@ -2,19 +2,34 @@ package cn.iocoder.yudao.module.bpm.service.oa.renew;
 
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 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.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 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.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 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.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.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.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.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.renew.OaRenewDO;
 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.dal.mysql.oa.renew.OaRenewMapper;
+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.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 com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.TaskService;
 import org.flowable.engine.TaskService;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.Task;
@@ -24,10 +39,8 @@ import org.springframework.validation.annotation.Validated;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_RENEW_NOT_EXISTS;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_RENEW_NOT_EXISTS;
@@ -39,7 +52,7 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_RENEW_NOT_
  */
  */
 @Service
 @Service
 @Validated
 @Validated
-public class OaRenewServiceImpl extends ServiceImpl<OaRenewMapper, OaRenewDO> implements OaRenewService {
+public class OaRenewServiceImpl implements OaRenewService {
 
 
 
 
     /**
     /**
@@ -59,90 +72,215 @@ public class OaRenewServiceImpl extends ServiceImpl<OaRenewMapper, OaRenewDO> im
     @Resource
     @Resource
     private TaskService taskService;
     private TaskService taskService;
 
 
+    @Resource
+    private FileApi fileApi;
+
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @Resource
+    private DeptApi deptApi;
+
     @Override
     @Override
     @Transactional
     @Transactional
-    public Long startOaRenew(Long userId, OaRenewSaveReqVO createReqVO) {
-        //判断是否已经发起流程
-        Boolean auditPass = createReqVO.getAuditPass();
-        // 创建单据uuid
-        String uuid = IdUtil.fastSimpleUUID();
-        OaRenewDO oaRenew = BeanUtils.toBean(createReqVO, OaRenewDO.class);
+    public Long stagingOaRenew(OaRenewSaveReqVO stagingReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
+        Objects.requireNonNull(loginUser, "登录用户不能为空");
+        // 转正人信息
+        AdminUserRespDTO employee = adminUserApi.getUser(stagingReqVO.getEmployeeId());
+
+        OaRenewDO oaRenew = BeanUtils.toBean(stagingReqVO, OaRenewDO.class);
         if (StringUtils.isBlank(oaRenew.getRenewId())) {
         if (StringUtils.isBlank(oaRenew.getRenewId())) {
+            // 创建单据uuid
+            String uuid = IdUtil.fastSimpleUUID();
             oaRenew.setRenewId(uuid);
             oaRenew.setRenewId(uuid);
         }
         }
+        if (employee != null) {
+            oaRenew.setEmployeeId(loginUser.getId());
+            oaRenew.setEmployeeName(loginUser.getNickname());
+            oaRenew.setEmployeePhone(loginUser.getMobile());
+            oaRenew.setDeptId(loginUser.getDeptId());
+            oaRenew.setPosition("员工职位");
+            oaRenew.setOldContractStartDate("2023-01-01");
+            oaRenew.setOldContractEndDate("2023-12-31");
+            oaRenew.setUserId(loginUser.getId());
+        }
+        oaRenew.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_STAGING);
+        oaRenew.setInfoSource("0");
+        oaRenew.setApplyEmployeeId(loginUser.getId());
+        oaRenew.setApplyEmployeeName(loginUser.getNickname());
+        // 暂存不保存审批人信息
+        oaRenew.setStartUserSelectAssignees(null);
         // 保存或更新表单信息
         // 保存或更新表单信息
-        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())));
+        if (oaRenew.getId() == null) {
+            oaRenewMapper.insert(oaRenew);
+        } else {
+            oaRenewMapper.updateById(oaRenew);
+        }
+        // 保存业务uuid到附件中
+        saveFileList(stagingReqVO.getFileIdList(), oaRenew.getRenewId());
 
 
-            // TODO 发送通知
+        return oaRenew.getId();
+    }
 
 
-        }else {
-            // 暂存,不发起流程
-            // 将单据状态 更新到 OA转正中
-            oaRenewMapper.updateById(new OaRenewDO()
-                    .setId(oaRenew.getId())
-                    .setAuditStatus("0"));
+    @Override
+    @Transactional
+    public Long commitOaRenew(OaRenewSaveReqVO 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);
+        if (loginUser == null) {
+            throw exception(ErrorCodeConstants.OA_LOGIN_USER_NOT_EXISTS);
+        }
+        // 转正人信息
+        AdminUserRespDTO employee = adminUserApi.getUser(commitReqVO.getEmployeeId());
+        if (employee == null) {
+            throw exception(ErrorCodeConstants.OA_EMPLOYEE_NOT_EXISTS);
         }
         }
 
 
-        // TODO 保存或更新附件uuid
-        if (CollectionUtil.isNotEmpty(createReqVO.getFileIdList())) {
+
+        OaRenewDO oaRenew = BeanUtils.toBean(commitReqVO, OaRenewDO.class);
+        if (StringUtils.isBlank(oaRenew.getRenewId())) {
+            // 创建单据uuid
+            String uuid = IdUtil.fastSimpleUUID();
+            oaRenew.setRenewId(uuid);
         }
         }
+        oaRenew.setEmployeeId(employee.getId());
+        oaRenew.setEmployeeName(employee.getNickname());
+        oaRenew.setEmployeePhone(employee.getMobile());
+        oaRenew.setDeptId(employee.getDeptId());
+        oaRenew.setPosition("员工职位");
+        oaRenew.setOldContractStartDate("2023-01-01");
+        oaRenew.setOldContractEndDate("2023-12-31");
+        oaRenew.setUserId(loginUser.getId());
+        oaRenew.setInfoSource("0");
+        oaRenew.setApplyEmployeeId(loginUser.getId());
+        oaRenew.setApplyEmployeeName(loginUser.getNickname());
+        // 保存或更新表单信息
+        if (oaRenew.getId() == null) {
+            oaRenewMapper.insert(oaRenew);
+        } else {
+            OaRenewDO oaRenewDO = oaRenewMapper.selectById(oaRenew.getId());
+            if (StrUtil.isNotBlank(oaRenewDO.getProcInstId())) {
+                throw exception(ErrorCodeConstants.PROCESS_INSTANCE_CREATE_FAIL_HAS_PROCESS);
+            }
+            oaRenewMapper.updateById(oaRenew);
+        }
+        // 发起流程
+        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(oaRenew.getId()))
+                                .setStartUserSelectAssignees(startUserSelectAssignees));
+
+        //获取下一个审批人
+        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
 
 
-        // 返回
+        // 审批同意
+        BpmTaskApproveReqVO agreeReqVO = new BpmTaskApproveReqVO();
+        agreeReqVO.setId(task.getId());
+        agreeReqVO.setReason("[首次提交]");
+        agreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_COMMITTED));
+        taskService.setVariable(task.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_COMMITTED);
+        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);
+        }
+        Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+        AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
+
+
+        // 将工作流的流程实例ID、单据状态、最后一次审批时间、当前审批人更新到单据信息中
+        oaRenewMapper.updateById(new OaRenewDO()
+                .setId(oaRenew.getId())
+                .setProcInstId(processInstanceId)
+                .setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
+                .setFinalAuditDate(LocalDateTime.now())
+                .setCurrentAuditEmployeeId(currentAuditEmployeeId)
+                .setCurrentAuditEmployeeName(currentAuditEmployee.getNickname())
+                .setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(","))));
+        // 保存业务uuid到附件中
+        saveFileList(commitReqVO.getFileIdList(), oaRenew.getRenewId());
+        // TODO DP 发送提交成功站内信
         return oaRenew.getId();
         return oaRenew.getId();
     }
     }
+
     @Override
     @Override
-    public Long completeTrueOaRenew(Long userId, BpmTaskApproveReqVO reqVO) {
-        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+    @Transactional
+    public Long agreeOaRenew(BpmTaskApproveReqVO agreeReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        Task currentTask = bpmTaskService.getTask(agreeReqVO.getId());
+        if (currentTask == null) {
+            throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
+        }
+        // 先更新为审批中
+        taskService.setVariable(currentTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
+        LambdaQueryWrapper<OaRenewDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(OaRenewDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaRenewDO oaRenew = oaRenewMapper.selectOne(lambdaQueryWrapper);
+        // 如果是最后一个人审批同意,设置流程审批状态为已审核
+        String[] auditPersons = oaRenew.getStartUserSelectAssignees().split(",");
+        String lastAuditPerson = Arrays.stream(auditPersons)
+                .reduce((first, second) -> second)
+                .orElse(null);
+        if (currentTask.getAssignee().equals(lastAuditPerson)) {
+            // 更新为已审核(暂时未生效,未找到原因,先不处理)
+            taskService.setVariable(agreeReqVO.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITED);
+        }
         // 审批同意
         // 审批同意
-        bpmTaskService.approveTask(userId, reqVO);
+        String reason = "[同意]";
+        if (StrUtil.isNotBlank(agreeReqVO.getReason())) {
+            reason = reason + agreeReqVO.getReason();
+        }
+        agreeReqVO.setReason(reason);
+        agreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_AUDITING));
+        taskService.setVariable(agreeReqVO.getId(), "auditPass", "true");
+        bpmTaskService.approveTask(loginUserId, agreeReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        OaRenewDO oaRenewDO = new OaRenewDO();
         if (nextTask != null) {
         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);
+            Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+            AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
+
+            // 如果审批人重复,实际未结束,再次更新为审核中
+            taskService.setVariable(nextTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
+            oaRenewDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITING)
+                    .setCurrentAuditEmployeeId(currentAuditEmployeeId)
+                    .setCurrentAuditEmployeeName(currentAuditEmployee.getNickname())
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaRenew.getId());
+
         } else {
         } 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);
+            oaRenewDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITED)
+                    .setCurrentAuditEmployeeId(null)
+                    .setCurrentAuditEmployeeName(null)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaRenew.getId());
 
 
             // TODO 复制业务单据信息到业务模块单据表
             // TODO 复制业务单据信息到业务模块单据表
 
 
         }
         }
+        oaRenewMapper.updateById(oaRenewDO);
         // 发送通知
         // 发送通知
 
 
         // 返回
         // 返回
@@ -150,80 +288,189 @@ public class OaRenewServiceImpl extends ServiceImpl<OaRenewMapper, OaRenewDO> im
     }
     }
 
 
     @Override
     @Override
-    public Long completeFalseOaRenew(Long userId, BpmTaskApproveReqVO reqVO) {
+    @Transactional
+    public Long disagreeOaRenew(BpmTaskReturnReqVO disagreeReqVO) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
 
 
-        Task currentTask = bpmTaskService.getTask(reqVO.getId());
+        Task currentTask = bpmTaskService.getTask(disagreeReqVO.getId());
 
 
-        BpmTaskReturnReqVO reqVO2 = BeanUtils.toBean(reqVO, BpmTaskReturnReqVO.class);
-        reqVO2.setTargetTaskDefinitionKey("modifyApply");
-        bpmTaskService.returnTask(userId, reqVO2);
+        disagreeReqVO.setTargetTaskDefinitionKey("modifyApply");
+        disagreeReqVO.setReason("[驳回]" + disagreeReqVO.getReason());
+        disagreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_RETURNED));
+        taskService.setVariable(disagreeReqVO.getId(), "auditPass", "false");
+        taskService.setVariable(disagreeReqVO.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_RETURNED);
+        bpmTaskService.returnTask(loginUserId, disagreeReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+        AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
 
 
         // 更新单据状态,当前处理人,最后处理时间
         // 更新单据状态,当前处理人,最后处理时间
         LambdaUpdateWrapper<OaRenewDO> updateWrapper = new LambdaUpdateWrapper<>();
         LambdaUpdateWrapper<OaRenewDO> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.set(OaRenewDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
-                .set(OaRenewDO::getFinalAuditDate, new Date())
-                .set(OaRenewDO::getAuditStatus, "0")
+        updateWrapper.set(OaRenewDO::getCurrentAuditEmployeeId, currentAuditEmployeeId)
+                .set(OaRenewDO::getCurrentAuditEmployeeName, currentAuditEmployee.getNickname())
+                .set(OaRenewDO::getFinalAuditDate, LocalDateTime.now())
+                .set(OaRenewDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RETURNED)
                 .eq(OaRenewDO::getProcInstId, currentTask.getProcessInstanceId());
                 .eq(OaRenewDO::getProcInstId, currentTask.getProcessInstanceId());
         oaRenewMapper.update(updateWrapper);
         oaRenewMapper.update(updateWrapper);
 
 
         // 发送通知
         // 发送通知
 
 
-        // 返回
         return 1L;
         return 1L;
     }
     }
 
 
     @Override
     @Override
-    public Long updateCompleteOaRenew(Long userId, OaRenewSaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
-        // 判断是否已经发起流程
-        Boolean auditPass = createReqVO.getAuditPass();
+    @Transactional
+    public Long revocationOaRenew(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<OaRenewDO> lambdaQueryWrapper = new LambdaQueryWrapper<OaRenewDO>()
+                .eq(OaRenewDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaRenewDO oaRenewDO = oaRenewMapper.selectOne(lambdaQueryWrapper);
+        if (!DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaRenewDO.getAuditStatus())
+                || !Objects.equals(String.valueOf(loginUserId), oaRenewDO.getCreator())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TASK_REVOCATION_NOT_ALLOWED);
+        }
 
 
-        OaRenewDO oaRenew = BeanUtils.toBean(createReqVO, OaRenewDO.class);
+        BpmTaskReturnReqVO returnReqVO = BeanUtils.toBean(revocationReqVO, BpmTaskReturnReqVO.class);
+        returnReqVO.setTargetTaskDefinitionKey("modifyApply");
+        String reason = "[撤回]";
+        if (StrUtil.isNotBlank(returnReqVO.getReason())) {
+            reason = reason + returnReqVO.getReason();
+        }
+        returnReqVO.setReason(reason);
+        returnReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_RECALLED));
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_RECALLED);
+        bpmTaskService.revocationTask(loginUserId, returnReqVO);
 
 
-        Task currentTask = taskService.createTaskQuery().processInstanceId(oaRenew.getProcInstId()).singleResult();
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+        AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
 
 
-        //审批通过
-        bpmTaskService.approveTask(userId, reqVO);
+        // 更新单据状态,当前处理人,最后处理时间
+        LambdaUpdateWrapper<OaRenewDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaRenewDO::getCurrentAuditEmployeeId, currentAuditEmployeeId)
+                .set(OaRenewDO::getCurrentAuditEmployeeName, currentAuditEmployee.getNickname())
+                .set(OaRenewDO::getFinalAuditDate, LocalDateTime.now())
+                .set(OaRenewDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RECALLED)
+                .eq(OaRenewDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaRenewMapper.update(updateWrapper);
 
 
-        // 提交
-        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);
+        return 1L;
+    }
 
 
-        } else {
-            OaRenewDO oaRenewClose = new OaRenewDO();
-            oaRenewClose.setId(oaRenew.getId());
-            oaRenewClose.setAuditStatus("4");
-            oaRenewClose.setCurrentAuditEmployeeId(null);
-            oaRenewClose.setFinalAuditDate(LocalDateTime.now());
-            oaRenewMapper.updateById(oaRenewClose);
+    @Override
+    @Transactional
+    public Long reCommitOaRenew(OaRenewSaveReqVO reCommitReqVO) {
+        if (reCommitReqVO.getId() == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
+        if (loginUser == null) {
+            throw exception(ErrorCodeConstants.OA_LOGIN_USER_NOT_EXISTS);
+        }
+        // 转正人信息
+        AdminUserRespDTO employee = adminUserApi.getUser(reCommitReqVO.getEmployeeId());
+        if (employee == null) {
+            throw exception(ErrorCodeConstants.OA_EMPLOYEE_NOT_EXISTS);
         }
         }
 
 
-        return oaRenew.getId();
-    }
+        OaRenewDO oaRenewNew = BeanUtils.toBean(reCommitReqVO, OaRenewDO.class);
+        OaRenewDO oaRenewOld = oaRenewMapper.selectById(oaRenewNew.getId());
+        oaRenewNew.setRenewId(oaRenewOld.getRenewId())
+                .setProcInstId(oaRenewOld.getProcInstId());
+
+        oaRenewNew.setEmployeeId(employee.getId());
+        oaRenewNew.setEmployeeName(employee.getNickname());
+        oaRenewNew.setEmployeePhone(employee.getMobile());
+        oaRenewNew.setDeptId(employee.getDeptId());
+        oaRenewNew.setPosition("员工职位");
+        oaRenewNew.setOldContractStartDate("2023-01-01");
+        oaRenewNew.setOldContractEndDate("2023-12-31");
+        oaRenewNew.setUserId(loginUser.getId());
+        oaRenewNew.setApplyEmployeeId(loginUser.getId());
+        oaRenewNew.setApplyEmployeeName(loginUser.getNickname());
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaRenewNew.getProcInstId()).singleResult();
+        BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
+        approveReqVO.setId(currentTask.getId())
+                .setReason("[再次提交]");
+        approveReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_COMMITTED));
+        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);
+            // 保存审批人信息
+            oaRenewNew.setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(",")));
+        }
+        taskService.setVariable(currentTask.getId(), "auditPass", "true");
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_COMMITTED);
+        // 再次提交,和审批通过逻辑相同
+        bpmTaskService.approveTask(loginUserId, approveReqVO);
 
 
+        Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        Long currentAuditEmployeeId = Long.valueOf(nextTask.getAssignee());
+        AdminUserRespDTO currentAuditEmployee = adminUserApi.getUser(currentAuditEmployeeId);
+        oaRenewNew.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
+                .setCurrentAuditEmployeeId(currentAuditEmployeeId)
+                .setCurrentAuditEmployeeName(currentAuditEmployee.getNickname())
+                .setFinalAuditDate(LocalDateTime.now());
+        oaRenewMapper.updateById(oaRenewNew);
 
 
-    @Override
-    public Long createOaRenew(OaRenewSaveReqVO createReqVO) {
-        // 插入
-        OaRenewDO oaRenew = BeanUtils.toBean(createReqVO, OaRenewDO.class);
-        oaRenewMapper.insert(oaRenew);
-        // 返回
-        return oaRenew.getId();
+        // 保存业务uuid到附件中
+        saveFileList(reCommitReqVO.getFileIdList(), oaRenewNew.getRenewId());
+
+        return 1L;
     }
     }
 
 
     @Override
     @Override
-    public void updateOaRenew(OaRenewSaveReqVO updateReqVO) {
-        // 校验存在
-        validateOaRenewExists(updateReqVO.getId());
-        // 更新
-        OaRenewDO updateObj = BeanUtils.toBean(updateReqVO, OaRenewDO.class);
-        oaRenewMapper.updateById(updateObj);
+    @Transactional
+    public Long closeOaRenew(Long id) {
+        if (id == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaRenewDO oaRenewDO = oaRenewMapper.selectById(id);
+        if (!DictDataConstants.OA_AUDIT_STATUS_RETURNED.equals(oaRenewDO.getAuditStatus())
+                && !DictDataConstants.OA_AUDIT_STATUS_RECALLED.equals(oaRenewDO.getAuditStatus())) {
+            throw exception(ErrorCodeConstants.TASK_CLOSE_NOT_ALLOWED);
+        }
+
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaRenewDO.getProcInstId()).singleResult();
+        BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
+        approveReqVO.setId(currentTask.getId())
+                .setReason("[关闭]");
+        approveReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_CLOSED));
+        taskService.setVariable(currentTask.getId(), "auditPass", "false");
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_CLOSED);
+        // 关闭,使用审批通过的方法实现
+        bpmTaskService.approveTask(loginUserId, approveReqVO);
+
+        LambdaUpdateWrapper<OaRenewDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.set(OaRenewDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_CLOSED)
+                .set(OaRenewDO::getCurrentAuditEmployeeId, null)
+                .set(OaRenewDO::getCurrentAuditEmployeeName, null)
+                .set(OaRenewDO::getFinalAuditDate, LocalDateTime.now())
+                .eq(OaRenewDO::getId, id);
+        oaRenewMapper.update(lambdaUpdateWrapper);
+        return 1L;
     }
     }
 
 
     @Override
     @Override
@@ -234,20 +481,167 @@ public class OaRenewServiceImpl extends ServiceImpl<OaRenewMapper, OaRenewDO> im
         oaRenewMapper.deleteById(id);
         oaRenewMapper.deleteById(id);
     }
     }
 
 
-    private void validateOaRenewExists(Long id) {
-        if (oaRenewMapper.selectById(id) == null) {
-            throw exception(OA_RENEW_NOT_EXISTS);
+    @Override
+    public OaRenewRespVO getOaRenew(Long id) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
+        OaRenewDO oaRenewDO = oaRenewMapper.selectById(id);
+        OaRenewRespVO oaRenewRespVO = BeanUtils.toBean(oaRenewDO, OaRenewRespVO.class);
+        if (oaRenewDO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(oaRenewDO.getDeptId());
+            if (dept != null) {
+                oaRenewRespVO.setDeptName(dept.getName());
+            }
+        }
+
+        String procInstId = oaRenewDO.getProcInstId();
+        if (StrUtil.isNotBlank(procInstId)) {
+            Task task = taskService.createTaskQuery()
+                    .processInstanceId(procInstId)
+                    .taskAssignee(String.valueOf(loginUserId))
+                    .singleResult();
+            if (DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaRenewDO.getAuditStatus())) {
+                // 如果是已提交,不限制任务处理人是当前登录人,用于直接撤回
+                task = taskService.createTaskQuery()
+                        .processInstanceId(procInstId)
+                        .singleResult();
+            }
+            if (task != null) {
+                oaRenewRespVO.setTaskId(task.getId());
+            }
+        }
+
+        // 附件列表
+        List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaRenewDO.getRenewId());
+        oaRenewRespVO.setFileList(fileList);
+
+        // 审批记录
+        if (StrUtil.isNotBlank(oaRenewDO.getProcInstId())) {
+            List<BpmTaskRespVO> auditRecordList = bpmTaskService.getAuditRecordListByProcessInstanceId(oaRenewDO.getProcInstId());
+            oaRenewRespVO.setAuditRecordList(auditRecordList);
         }
         }
+
+        // 审批人
+        String startUserSelectAssignees = oaRenewDO.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;
+                    }
+                }
+            }
+            oaRenewRespVO.setAuditUserList(auditUserList);
+        }
+
+        return oaRenewRespVO;
+    }
+
+    @Override
+    public OaRenewRespVO getOaRenewByProcInstId(String procInstId) {
+        OaRenewDO oaRenewDO = oaRenewMapper.selectOne(OaRenewDO::getProcInstId, procInstId);
+        OaRenewRespVO oaRenewRespVO = BeanUtils.toBean(oaRenewDO, OaRenewRespVO.class);
+        if (oaRenewDO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(oaRenewDO.getDeptId());
+            if (dept != null) {
+                oaRenewRespVO.setDeptName(dept.getName());
+            }
+        }
+
+        // 附件列表
+        List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaRenewDO.getRenewId());
+        oaRenewRespVO.setFileList(fileList);
+
+        // 审批记录
+        if (StrUtil.isNotBlank(oaRenewDO.getProcInstId())) {
+            List<BpmTaskRespVO> auditRecordList = bpmTaskService.getAuditRecordListByProcessInstanceId(oaRenewDO.getProcInstId());
+            oaRenewRespVO.setAuditRecordList(auditRecordList);
+        }
+
+        // 审批人
+        String startUserSelectAssignees = oaRenewDO.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;
+                    }
+                }
+            }
+            oaRenewRespVO.setAuditUserList(auditUserList);
+        }
+
+        return oaRenewRespVO;
     }
     }
 
 
     @Override
     @Override
-    public OaRenewDO getOaRenew(Long id) {
-        return oaRenewMapper.selectById(id);
+    public PageResult<OaRenewRespVO> getOaRenewPage(OaRenewPageReqVO pageReqVO) {
+        PageResult<OaRenewDO> oaRenewDOPageResult = oaRenewMapper.selectPage(pageReqVO);
+        PageResult<OaRenewRespVO> oaRenewRespVOPageResult = BeanUtils.toBean(oaRenewDOPageResult, OaRenewRespVO.class);
+
+        List<OaRenewRespVO> oaRenewRespVOList = oaRenewRespVOPageResult.getList();
+        if (CollectionUtil.isNotEmpty(oaRenewRespVOList)) {
+            List<Long> employeeIdList = oaRenewRespVOList.stream().map(OaRenewRespVO::getCurrentAuditEmployeeId).collect(Collectors.toList());
+            List<AdminUserRespDTO> employeeList = adminUserApi.getUserList(employeeIdList);
+            for (OaRenewRespVO respVO : oaRenewRespVOList) {
+                for (AdminUserRespDTO employee : employeeList) {
+                    if (respVO.getCurrentAuditEmployeeId() == employee.getId()) {
+                        respVO.setCurrentAuditEmployeeName(employee.getNickname());
+                        break;
+                    }
+                }
+            }
+
+            List<Long> deptIdList = oaRenewRespVOList.stream().map(OaRenewRespVO::getDeptId).collect(Collectors.toList());
+            List<DeptRespDTO> deptList = deptApi.getDeptList(deptIdList);
+            for (OaRenewRespVO respVO : oaRenewRespVOList) {
+                for (DeptRespDTO dept : deptList) {
+                    if (respVO.getDeptId() == dept.getId()) {
+                        respVO.setDeptName(dept.getName());
+                        break;
+                    }
+                }
+            }
+        }
+
+        return oaRenewRespVOPageResult;
     }
     }
 
 
     @Override
     @Override
-    public PageResult<OaRenewDO> getOaRenewPage(OaRenewPageReqVO pageReqVO) {
-        return oaRenewMapper.selectPage(pageReqVO);
+    public PageResult<OaRenewRespVO> exportOaRenewExcel(OaRenewPageReqVO pageReqVO) {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        return getOaRenewPage(pageReqVO);
+    }
+
+    private void validateOaRenewExists(Long id) {
+        OaRenewDO oaRenewDO = oaRenewMapper.selectById(id);
+        if (oaRenewDO == null) {
+            throw exception(OA_RENEW_NOT_EXISTS);
+        }
+        if (!DictDataConstants.OA_AUDIT_STATUS_STAGING.equals(oaRenewDO.getAuditStatus())) {
+            throw exception(ErrorCodeConstants.DELETE_FAIL_NOT_STAGING);
+        }
+    }
+
+    /**
+     * 保存业务uuid到附件中
+     */
+    private void saveFileList(List<Long> fileIdList, String serviceId) {
+        if (CollectionUtil.isNotEmpty(fileIdList) && StrUtil.isNotEmpty(serviceId)) {
+            fileApi.updateFileBiz(fileIdList, serviceId);
+        }
     }
     }
 
 
 }
 }

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

@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.bpm.service.oa.turnover;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo.OaTurnoverPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo.OaTurnoverSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.turnover.OaTurnoverDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.validation.Valid;
+
+/**
+ * 离职流程信息 Service 接口
+ *
+ * @author dp
+ */
+public interface OaTurnoverService extends IService<OaTurnoverDO> {
+
+    Long startOaTurnover(Long userId, @Valid OaTurnoverSaveReqVO createReqVO);
+
+    Long completeTrueOaTurnover(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long completeFalseOaTurnover(Long userId, BpmTaskApproveReqVO reqVO);
+
+    Long updateCompleteOaTurnover(Long userId, @Valid OaTurnoverSaveReqVO createReqVO, @Valid BpmTaskApproveReqVO reqVO);
+    
+
+    /**
+     * 创建离职流程信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createOaTurnover(@Valid OaTurnoverSaveReqVO createReqVO);
+
+    /**
+     * 更新离职流程信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOaTurnover(@Valid OaTurnoverSaveReqVO updateReqVO);
+
+    /**
+     * 删除离职流程信息
+     *
+     * @param id 编号
+     */
+    void deleteOaTurnover(Long id);
+
+    /**
+     * 获得离职流程信息
+     *
+     * @param id 编号
+     * @return 离职流程信息
+     */
+    OaTurnoverDO getOaTurnover(Long id);
+
+    /**
+     * 获得离职流程信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 离职流程信息分页
+     */
+    PageResult<OaTurnoverDO> getOaTurnoverPage(OaTurnoverPageReqVO pageReqVO);
+
+}

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

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.service.oa.dimission;
+package cn.iocoder.yudao.module.bpm.service.oa.turnover;
 
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.IdUtil;
@@ -6,12 +6,12 @@ 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.BeanUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 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.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.oa.turnover.vo.OaTurnoverPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo.OaTurnoverSaveReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO;
 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.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.dal.dataobject.oa.turnover.OaTurnoverDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.turnover.OaTurnOverMapper;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -39,17 +39,17 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_DIMISSION_
  */
  */
 @Service
 @Service
 @Validated
 @Validated
-public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDimissionDO> implements OaDimissionService {
+public class OaTurnoverServiceImpl extends ServiceImpl<OaTurnOverMapper, OaTurnoverDO> implements OaTurnoverService {
 
 
 
 
     /**
     /**
      * OA 离职对应的流程定义 KEY
      * OA 离职对应的流程定义 KEY
      */
      */
-    public static final String PROCESS_KEY = "oa_dimission";
+    public static final String PROCESS_KEY = "oa_turnover";
 
 
 
 
     @Resource
     @Resource
-    private OaDimissionMapper oaDimissionMapper;
+    private OaTurnOverMapper oaTurnOverMapper;
 
 
     @Resource
     @Resource
     private BpmProcessInstanceApi processInstanceApi;
     private BpmProcessInstanceApi processInstanceApi;
@@ -62,17 +62,17 @@ public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDim
 
 
     @Override
     @Override
     @Transactional
     @Transactional
-    public Long startOaDimission(Long userId, OaDimissionSaveReqVO createReqVO) {
+    public Long startOaTurnover(Long userId, OaTurnoverSaveReqVO createReqVO) {
         //判断是否已经发起流程
         //判断是否已经发起流程
         Boolean auditPass = createReqVO.getAuditPass();
         Boolean auditPass = createReqVO.getAuditPass();
         // 创建单据uuid
         // 创建单据uuid
         String uuid = IdUtil.fastSimpleUUID();
         String uuid = IdUtil.fastSimpleUUID();
-        OaDimissionDO oaDimission = BeanUtils.toBean(createReqVO, OaDimissionDO.class);
-        if (StringUtils.isBlank(oaDimission.getDimissionId())) {
-            oaDimission.setDimissionId(uuid);
+        OaTurnoverDO oaTurnover = BeanUtils.toBean(createReqVO, OaTurnoverDO.class);
+        if (StringUtils.isBlank(oaTurnover.getTurnoverId())) {
+            oaTurnover.setTurnoverId(uuid);
         }
         }
         // 保存或更新表单信息
         // 保存或更新表单信息
-        this.saveOrUpdate(oaDimission);
+        this.saveOrUpdate(oaTurnover);
 
 
         // 提交
         // 提交
         if (auditPass) {
         if (auditPass) {
@@ -87,18 +87,18 @@ public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDim
                             new BpmProcessInstanceCreateReqDTO()
                             new BpmProcessInstanceCreateReqDTO()
                                     .setProcessDefinitionKey(PROCESS_KEY)
                                     .setProcessDefinitionKey(PROCESS_KEY)
                                     .setVariables(processInstanceVariables)
                                     .setVariables(processInstanceVariables)
-                                    .setBusinessKey(String.valueOf(oaDimission.getId()))
+                                    .setBusinessKey(String.valueOf(oaTurnover.getId()))
                                     .setStartUserSelectAssignees(startUserSelectAssignees));
                                     .setStartUserSelectAssignees(startUserSelectAssignees));
 
 
             //获取下一个审批人
             //获取下一个审批人
             Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
             Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
 
 
             // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 转正中
             // 将工作流的编号,单据状态 最后一次审批时间 当前审批人  更新到 OA 转正中
-            oaDimissionMapper.updateById(new OaDimissionDO()
-                    .setId(oaDimission.getId())
+            oaTurnOverMapper.updateById(new OaTurnoverDO()
+                    .setId(oaTurnover.getId())
                     .setProcInstId(processInstanceId)
                     .setProcInstId(processInstanceId)
                     .setAuditStatus("1")
                     .setAuditStatus("1")
-                    .setDimissionId(uuid)
+                    .setTurnoverId(uuid)
                     .setFinalAuditDate(LocalDateTime.now())
                     .setFinalAuditDate(LocalDateTime.now())
                     .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee())));
                     .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee())));
 
 
@@ -107,8 +107,8 @@ public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDim
         }else {
         }else {
             // 暂存,不发起流程
             // 暂存,不发起流程
             // 将单据状态 更新到 OA转正中
             // 将单据状态 更新到 OA转正中
-            oaDimissionMapper.updateById(new OaDimissionDO()
-                    .setId(oaDimission.getId())
+            oaTurnOverMapper.updateById(new OaTurnoverDO()
+                    .setId(oaTurnover.getId())
                     .setAuditStatus("0"));
                     .setAuditStatus("0"));
         }
         }
 
 
@@ -117,29 +117,29 @@ public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDim
         }
         }
 
 
         // 返回
         // 返回
-        return oaDimission.getId();
+        return oaTurnover.getId();
     }
     }
     @Override
     @Override
-    public Long completeTrueOaDimission(Long userId, BpmTaskApproveReqVO reqVO) {
+    public Long completeTrueOaTurnover(Long userId, BpmTaskApproveReqVO reqVO) {
         Task currentTask = bpmTaskService.getTask(reqVO.getId());
         Task currentTask = bpmTaskService.getTask(reqVO.getId());
         // 审批同意
         // 审批同意
         bpmTaskService.approveTask(userId, reqVO);
         bpmTaskService.approveTask(userId, reqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         if (nextTask != null) {
         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);
+            LambdaUpdateWrapper<OaTurnoverDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaTurnoverDO::getAuditStatus, "2")
+                    .set(OaTurnoverDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                    .set(OaTurnoverDO::getFinalAuditDate, new Date())
+                    .eq(OaTurnoverDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaTurnOverMapper.update(updateWrapper);
         } else {
         } 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);
+            LambdaUpdateWrapper<OaTurnoverDO> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(OaTurnoverDO::getAuditStatus, "3")
+                    .set(OaTurnoverDO::getCurrentAuditEmployeeId, null)
+                    .set(OaTurnoverDO::getFinalAuditDate, new Date())
+                    .eq(OaTurnoverDO::getProcInstId, currentTask.getProcessInstanceId());
+            oaTurnOverMapper.update(updateWrapper);
 
 
             // TODO 复制业务单据信息到业务模块单据表
             // TODO 复制业务单据信息到业务模块单据表
 
 
@@ -151,7 +151,7 @@ public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDim
     }
     }
 
 
     @Override
     @Override
-    public Long completeFalseOaDimission(Long userId, BpmTaskApproveReqVO reqVO) {
+    public Long completeFalseOaTurnover(Long userId, BpmTaskApproveReqVO reqVO) {
 
 
         Task currentTask = bpmTaskService.getTask(reqVO.getId());
         Task currentTask = bpmTaskService.getTask(reqVO.getId());
 
 
@@ -162,12 +162,12 @@ public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDim
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         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);
+        LambdaUpdateWrapper<OaTurnoverDO> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(OaTurnoverDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
+                .set(OaTurnoverDO::getFinalAuditDate, new Date())
+                .set(OaTurnoverDO::getAuditStatus, "0")
+                .eq(OaTurnoverDO::getProcInstId, currentTask.getProcessInstanceId());
+        oaTurnOverMapper.update(updateWrapper);
 
 
         // 发送通知
         // 发送通知
 
 
@@ -176,13 +176,13 @@ public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDim
     }
     }
 
 
     @Override
     @Override
-    public Long updateCompleteOaDimission(Long userId, OaDimissionSaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
+    public Long updateCompleteOaTurnover(Long userId, OaTurnoverSaveReqVO createReqVO, BpmTaskApproveReqVO reqVO) {
         // 判断是否已经发起流程
         // 判断是否已经发起流程
         Boolean auditPass = createReqVO.getAuditPass();
         Boolean auditPass = createReqVO.getAuditPass();
 
 
-        OaDimissionDO oaDimission = BeanUtils.toBean(createReqVO, OaDimissionDO.class);
+        OaTurnoverDO oaTurnover = BeanUtils.toBean(createReqVO, OaTurnoverDO.class);
 
 
-        Task currentTask = taskService.createTaskQuery().processInstanceId(oaDimission.getProcInstId()).singleResult();
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaTurnover.getProcInstId()).singleResult();
 
 
         //审批通过
         //审批通过
         bpmTaskService.approveTask(userId, reqVO);
         bpmTaskService.approveTask(userId, reqVO);
@@ -191,64 +191,64 @@ public class OaDimissionServiceImpl extends ServiceImpl<OaDimissionMapper, OaDim
         if (auditPass) {
         if (auditPass) {
             Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
             Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
 
 
-            oaDimission.setAuditStatus("1");
-            oaDimission.setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()));
-            oaDimission.setFinalAuditDate(LocalDateTime.now());
-            oaDimissionMapper.updateById(oaDimission);
+            oaTurnover.setAuditStatus("1");
+            oaTurnover.setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()));
+            oaTurnover.setFinalAuditDate(LocalDateTime.now());
+            oaTurnOverMapper.updateById(oaTurnover);
 
 
         } else {
         } else {
-            OaDimissionDO oaDimissionClose = new OaDimissionDO();
-            oaDimissionClose.setId(oaDimission.getId());
-            oaDimissionClose.setAuditStatus("4");
-            oaDimissionClose.setCurrentAuditEmployeeId(null);
-            oaDimissionClose.setFinalAuditDate(LocalDateTime.now());
-            oaDimissionMapper.updateById(oaDimissionClose);
+            OaTurnoverDO oaTurnoverClose = new OaTurnoverDO();
+            oaTurnoverClose.setId(oaTurnover.getId());
+            oaTurnoverClose.setAuditStatus("4");
+            oaTurnoverClose.setCurrentAuditEmployeeId(null);
+            oaTurnoverClose.setFinalAuditDate(LocalDateTime.now());
+            oaTurnOverMapper.updateById(oaTurnoverClose);
         }
         }
 
 
-        return oaDimission.getId();
+        return oaTurnover.getId();
     }
     }
 
 
 
 
     @Override
     @Override
-    public Long createOaDimission(OaDimissionSaveReqVO createReqVO) {
+    public Long createOaTurnover(OaTurnoverSaveReqVO createReqVO) {
         // 插入
         // 插入
-        OaDimissionDO oaDimission = BeanUtils.toBean(createReqVO, OaDimissionDO.class);
-        oaDimissionMapper.insert(oaDimission);
+        OaTurnoverDO oaTurnover = BeanUtils.toBean(createReqVO, OaTurnoverDO.class);
+        oaTurnOverMapper.insert(oaTurnover);
         // 返回
         // 返回
-        return oaDimission.getId();
+        return oaTurnover.getId();
     }
     }
 
 
     @Override
     @Override
-    public void updateOaDimission(OaDimissionSaveReqVO updateReqVO) {
+    public void updateOaTurnover(OaTurnoverSaveReqVO updateReqVO) {
         // 校验存在
         // 校验存在
-        validateOaDimissionExists(updateReqVO.getId());
+        validateOaTurnoverExists(updateReqVO.getId());
         // 更新
         // 更新
-        OaDimissionDO updateObj = BeanUtils.toBean(updateReqVO, OaDimissionDO.class);
-        oaDimissionMapper.updateById(updateObj);
+        OaTurnoverDO updateObj = BeanUtils.toBean(updateReqVO, OaTurnoverDO.class);
+        oaTurnOverMapper.updateById(updateObj);
     }
     }
 
 
     @Override
     @Override
-    public void deleteOaDimission(Long id) {
+    public void deleteOaTurnover(Long id) {
         // 校验存在
         // 校验存在
-        validateOaDimissionExists(id);
+        validateOaTurnoverExists(id);
         // 删除
         // 删除
-        oaDimissionMapper.deleteById(id);
+        oaTurnOverMapper.deleteById(id);
     }
     }
 
 
-    private void validateOaDimissionExists(Long id) {
-        if (oaDimissionMapper.selectById(id) == null) {
+    private void validateOaTurnoverExists(Long id) {
+        if (oaTurnOverMapper.selectById(id) == null) {
             throw exception(OA_DIMISSION_NOT_EXISTS);
             throw exception(OA_DIMISSION_NOT_EXISTS);
         }
         }
     }
     }
 
 
     @Override
     @Override
-    public OaDimissionDO getOaDimission(Long id) {
-        return oaDimissionMapper.selectById(id);
+    public OaTurnoverDO getOaTurnover(Long id) {
+        return oaTurnOverMapper.selectById(id);
     }
     }
 
 
     @Override
     @Override
-    public PageResult<OaDimissionDO> getOaDimissionPage(OaDimissionPageReqVO pageReqVO) {
-        return oaDimissionMapper.selectPage(pageReqVO);
+    public PageResult<OaTurnoverDO> getOaTurnoverPage(OaTurnoverPageReqVO pageReqVO) {
+        return oaTurnOverMapper.selectPage(pageReqVO);
     }
     }
 
 
 }
 }

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

@@ -26,12 +26,14 @@ public interface OaUniversalService {
 
 
     Long reCommitOaUniversal(OaUniversalSaveReqVO reCommitReqVO);
     Long reCommitOaUniversal(OaUniversalSaveReqVO reCommitReqVO);
 
 
-    Long closeOaUniversal(OaUniversalSaveReqVO closeReqVO);
+    Long closeOaUniversal(Long id);
 
 
     void deleteOaUniversal(Long id);
     void deleteOaUniversal(Long id);
 
 
     OaUniversalRespVO getOaUniversal(Long id);
     OaUniversalRespVO getOaUniversal(Long id);
 
 
+    OaUniversalRespVO getOaUniversalByProcInstId(String procInstId);
+
     PageResult<OaUniversalRespVO> getOaUniversalPage(OaUniversalPageReqVO pageReqVO);
     PageResult<OaUniversalRespVO> getOaUniversalPage(OaUniversalPageReqVO pageReqVO);
 
 
     PageResult<OaUniversalRespVO> exportOaUniversalExcel(OaUniversalPageReqVO pageReqVO);
     PageResult<OaUniversalRespVO> exportOaUniversalExcel(OaUniversalPageReqVO pageReqVO);

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

@@ -105,6 +105,8 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         oaUniversal.setUserPhone(loginUser.getMobile());
         oaUniversal.setUserPhone(loginUser.getMobile());
         oaUniversal.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_STAGING);
         oaUniversal.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_STAGING);
         oaUniversal.setInfoSource("0");
         oaUniversal.setInfoSource("0");
+        // 暂存不保存审批人信息
+        oaUniversal.setStartUserSelectAssignees(null);
         // 保存或更新表单信息
         // 保存或更新表单信息
         if (oaUniversal.getId() == null) {
         if (oaUniversal.getId() == null) {
             oaUniversalMapper.insert(oaUniversal);
             oaUniversalMapper.insert(oaUniversal);
@@ -147,6 +149,10 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         if (oaUniversal.getId() == null) {
         if (oaUniversal.getId() == null) {
             oaUniversalMapper.insert(oaUniversal);
             oaUniversalMapper.insert(oaUniversal);
         } else {
         } else {
+            OaUniversalDO oaUniversalDO = oaUniversalMapper.selectById(oaUniversal.getId());
+            if (StrUtil.isNotBlank(oaUniversalDO.getProcInstId())) {
+                throw exception(ErrorCodeConstants.PROCESS_INSTANCE_CREATE_FAIL_HAS_PROCESS);
+            }
             oaUniversalMapper.updateById(oaUniversal);
             oaUniversalMapper.updateById(oaUniversal);
         }
         }
         // 发起流程
         // 发起流程
@@ -171,6 +177,8 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         BpmTaskApproveReqVO agreeReqVO = new BpmTaskApproveReqVO();
         BpmTaskApproveReqVO agreeReqVO = new BpmTaskApproveReqVO();
         agreeReqVO.setId(task.getId());
         agreeReqVO.setId(task.getId());
         agreeReqVO.setReason("[首次提交]");
         agreeReqVO.setReason("[首次提交]");
+        agreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_COMMITTED));
+        taskService.setVariable(task.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_COMMITTED);
         taskService.setVariable(task.getId(), "auditPass", "true");
         taskService.setVariable(task.getId(), "auditPass", "true");
         bpmTaskService.approveTask(loginUserId, agreeReqVO);
         bpmTaskService.approveTask(loginUserId, agreeReqVO);
 
 
@@ -204,21 +212,35 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         if (currentTask == null) {
         if (currentTask == null) {
             throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
             throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
         }
         }
+        // 先更新为审批中
+        taskService.setVariable(currentTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
         LambdaQueryWrapper<OaUniversalDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<OaUniversalDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
         lambdaQueryWrapper.eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
         OaUniversalDO oaUniversal = oaUniversalMapper.selectOne(lambdaQueryWrapper);
         OaUniversalDO oaUniversal = oaUniversalMapper.selectOne(lambdaQueryWrapper);
+        // 如果是最后一个人审批同意,设置流程审批状态为已审核
+        String[] auditPersons = oaUniversal.getStartUserSelectAssignees().split(",");
+        String lastAuditPerson = Arrays.stream(auditPersons)
+                .reduce((first, second) -> second)
+                .orElse(null);
+        if (currentTask.getAssignee().equals(lastAuditPerson)) {
+            // 更新为已审核(暂时未生效,未找到原因,先不处理)
+            taskService.setVariable(agreeReqVO.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITED);
+        }
         // 审批同意
         // 审批同意
         String reason = "[同意]";
         String reason = "[同意]";
         if (StrUtil.isNotBlank(agreeReqVO.getReason())) {
         if (StrUtil.isNotBlank(agreeReqVO.getReason())) {
             reason = reason + agreeReqVO.getReason();
             reason = reason + agreeReqVO.getReason();
         }
         }
         agreeReqVO.setReason(reason);
         agreeReqVO.setReason(reason);
+        agreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_AUDITING));
         taskService.setVariable(agreeReqVO.getId(), "auditPass", "true");
         taskService.setVariable(agreeReqVO.getId(), "auditPass", "true");
         bpmTaskService.approveTask(loginUserId, agreeReqVO);
         bpmTaskService.approveTask(loginUserId, agreeReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         OaUniversalDO oaUniversalDO = new OaUniversalDO();
         OaUniversalDO oaUniversalDO = new OaUniversalDO();
         if (nextTask != null) {
         if (nextTask != null) {
+            // 如果审批人重复,实际未结束,再次更新为审核中
+            taskService.setVariable(nextTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
             oaUniversalDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITING)
             oaUniversalDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITING)
                     .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
                     .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
                     .setFinalAuditDate(LocalDateTime.now())
                     .setFinalAuditDate(LocalDateTime.now())
@@ -251,7 +273,9 @@ public class OaUniversalServiceImpl implements OaUniversalService {
 
 
         disagreeReqVO.setTargetTaskDefinitionKey("modifyApply");
         disagreeReqVO.setTargetTaskDefinitionKey("modifyApply");
         disagreeReqVO.setReason("[驳回]" + disagreeReqVO.getReason());
         disagreeReqVO.setReason("[驳回]" + disagreeReqVO.getReason());
+        disagreeReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_RETURNED));
         taskService.setVariable(disagreeReqVO.getId(), "auditPass", "false");
         taskService.setVariable(disagreeReqVO.getId(), "auditPass", "false");
+        taskService.setVariable(disagreeReqVO.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_RETURNED);
         bpmTaskService.returnTask(loginUserId, disagreeReqVO);
         bpmTaskService.returnTask(loginUserId, disagreeReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
@@ -285,7 +309,7 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         OaUniversalDO oaUniversalDO = oaUniversalMapper.selectOne(lambdaQueryWrapper);
         OaUniversalDO oaUniversalDO = oaUniversalMapper.selectOne(lambdaQueryWrapper);
         if (!DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaUniversalDO.getAuditStatus())
         if (!DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaUniversalDO.getAuditStatus())
             || !Objects.equals(String.valueOf(loginUserId), oaUniversalDO.getCreator())) {
             || !Objects.equals(String.valueOf(loginUserId), oaUniversalDO.getCreator())) {
-            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TASK_REVOCATION_NO_ALLOWED);
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TASK_REVOCATION_NOT_ALLOWED);
         }
         }
 
 
         BpmTaskReturnReqVO returnReqVO = BeanUtils.toBean(revocationReqVO, BpmTaskReturnReqVO.class);
         BpmTaskReturnReqVO returnReqVO = BeanUtils.toBean(revocationReqVO, BpmTaskReturnReqVO.class);
@@ -295,6 +319,8 @@ public class OaUniversalServiceImpl implements OaUniversalService {
             reason = reason + returnReqVO.getReason();
             reason = reason + returnReqVO.getReason();
         }
         }
         returnReqVO.setReason(reason);
         returnReqVO.setReason(reason);
+        returnReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_RECALLED));
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_RECALLED);
         bpmTaskService.revocationTask(loginUserId, returnReqVO);
         bpmTaskService.revocationTask(loginUserId, returnReqVO);
 
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
@@ -331,6 +357,7 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
         BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
         approveReqVO.setId(currentTask.getId())
         approveReqVO.setId(currentTask.getId())
                 .setReason("[再次提交]");
                 .setReason("[再次提交]");
+        approveReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_COMMITTED));
         if (CollectionUtil.isNotEmpty(reCommitReqVO.getStartUserSelectAssignees())) {
         if (CollectionUtil.isNotEmpty(reCommitReqVO.getStartUserSelectAssignees())) {
             // 添加审批人信息到流程参数中
             // 添加审批人信息到流程参数中
             Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
             Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
@@ -341,6 +368,7 @@ public class OaUniversalServiceImpl implements OaUniversalService {
             oaUniversalNew.setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(",")));
             oaUniversalNew.setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(",")));
         }
         }
         taskService.setVariable(currentTask.getId(), "auditPass", "true");
         taskService.setVariable(currentTask.getId(), "auditPass", "true");
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_COMMITTED);
         // 再次提交,和审批通过逻辑相同
         // 再次提交,和审批通过逻辑相同
         bpmTaskService.approveTask(loginUserId, approveReqVO);
         bpmTaskService.approveTask(loginUserId, approveReqVO);
 
 
@@ -358,29 +386,36 @@ public class OaUniversalServiceImpl implements OaUniversalService {
 
 
     @Override
     @Override
     @Transactional
     @Transactional
-    public Long closeOaUniversal(OaUniversalSaveReqVO closeReqVO) {
-        if (closeReqVO.getId() == null) {
+    public Long closeOaUniversal(Long id) {
+        if (id == null) {
             throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
             throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
         }
         }
         // 登录人信息
         // 登录人信息
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         // TODO DP 根据登录人查询出对应的员工信息
         // TODO DP 根据登录人查询出对应的员工信息
 
 
-        OaUniversalDO oaUniversalNew = BeanUtils.toBean(closeReqVO, OaUniversalDO.class);
-        OaUniversalDO oaUniversalOld = oaUniversalMapper.selectById(oaUniversalNew.getId());
+        OaUniversalDO oaUniversalDO = oaUniversalMapper.selectById(id);
+        if (!DictDataConstants.OA_AUDIT_STATUS_RETURNED.equals(oaUniversalDO.getAuditStatus())
+            && !DictDataConstants.OA_AUDIT_STATUS_RECALLED.equals(oaUniversalDO.getAuditStatus())) {
+            throw exception(ErrorCodeConstants.TASK_CLOSE_NOT_ALLOWED);
+        }
 
 
-        Task currentTask = taskService.createTaskQuery().processInstanceId(oaUniversalOld.getProcInstId()).singleResult();
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaUniversalDO.getProcInstId()).singleResult();
         BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
         BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
         approveReqVO.setId(currentTask.getId())
         approveReqVO.setId(currentTask.getId())
                 .setReason("[关闭]");
                 .setReason("[关闭]");
+        approveReqVO.setTaskStatus(Integer.valueOf(DictDataConstants.OA_AUDIT_STATUS_CLOSED));
         taskService.setVariable(currentTask.getId(), "auditPass", "false");
         taskService.setVariable(currentTask.getId(), "auditPass", "false");
+        taskService.setVariable(currentTask.getId(),BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_CLOSED);
         // 关闭,使用审批通过的方法实现
         // 关闭,使用审批通过的方法实现
         bpmTaskService.approveTask(loginUserId, approveReqVO);
         bpmTaskService.approveTask(loginUserId, approveReqVO);
 
 
-        oaUniversalOld.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_CLOSED)
-                .setCurrentAuditEmployeeId(-1L)
-                .setFinalAuditDate(LocalDateTime.now());
-        oaUniversalMapper.updateById(oaUniversalOld);
+        LambdaUpdateWrapper<OaUniversalDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_CLOSED)
+                .set(OaUniversalDO::getCurrentAuditEmployeeId, null)
+                .set(OaUniversalDO::getFinalAuditDate, LocalDateTime.now())
+                .eq(OaUniversalDO::getId, id);
+        oaUniversalMapper.update(lambdaUpdateWrapper);
 
 
         return 1L;
         return 1L;
     }
     }
@@ -395,8 +430,77 @@ public class OaUniversalServiceImpl implements OaUniversalService {
 
 
     @Override
     @Override
     public OaUniversalRespVO getOaUniversal(Long id) {
     public OaUniversalRespVO getOaUniversal(Long id) {
+        // 登录人信息
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        // TODO DP 根据登录人查询出对应的员工信息
+
         OaUniversalDO oaUniversalDO = oaUniversalMapper.selectById(id);
         OaUniversalDO oaUniversalDO = oaUniversalMapper.selectById(id);
         OaUniversalRespVO oaUniversalRespVO = BeanUtils.toBean(oaUniversalDO, OaUniversalRespVO.class);
         OaUniversalRespVO oaUniversalRespVO = BeanUtils.toBean(oaUniversalDO, OaUniversalRespVO.class);
+        if (oaUniversalDO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(oaUniversalDO.getDeptId());
+            if (dept != null) {
+                oaUniversalRespVO.setDeptName(dept.getName());
+            }
+        }
+
+        String procInstId = oaUniversalDO.getProcInstId();
+        if (StrUtil.isNotBlank(procInstId)) {
+            Task task = taskService.createTaskQuery()
+                    .processInstanceId(procInstId)
+                    .taskAssignee(String.valueOf(loginUserId))
+                    .singleResult();
+            if (DictDataConstants.OA_AUDIT_STATUS_COMMITTED.equals(oaUniversalDO.getAuditStatus())) {
+                // 如果是已提交,不限制任务处理人是当前登录人,用于直接撤回
+                task = taskService.createTaskQuery()
+                        .processInstanceId(procInstId)
+                        .singleResult();
+            }
+            if (task != null) {
+                oaUniversalRespVO.setTaskId(task.getId());
+            }
+        }
+
+        // 附件列表
+        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 OaUniversalRespVO getOaUniversalByProcInstId(String procInstId) {
+        OaUniversalDO oaUniversalDO = oaUniversalMapper.selectOne(OaUniversalDO::getProcInstId, procInstId);
+        OaUniversalRespVO oaUniversalRespVO = BeanUtils.toBean(oaUniversalDO, OaUniversalRespVO.class);
+        if (oaUniversalDO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(oaUniversalDO.getDeptId());
+            if (dept != null) {
+                oaUniversalRespVO.setDeptName(dept.getName());
+            }
+        }
 
 
         // 附件列表
         // 附件列表
         List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaUniversalDO.getUniversalId());
         List<FileDTO> fileList = fileApi.getFileDTOListByBiz(oaUniversalDO.getUniversalId());
@@ -469,9 +573,13 @@ public class OaUniversalServiceImpl implements OaUniversalService {
     }
     }
 
 
     private void validateOaUniversalExists(Long id) {
     private void validateOaUniversalExists(Long id) {
-        if (oaUniversalMapper.selectById(id) == null) {
+        OaUniversalDO oaUniversalDO = oaUniversalMapper.selectById(id);
+        if (oaUniversalDO == null) {
             throw exception(OA_UNIVERSAL_NOT_EXISTS);
             throw exception(OA_UNIVERSAL_NOT_EXISTS);
         }
         }
+        if (!DictDataConstants.OA_AUDIT_STATUS_STAGING.equals(oaUniversalDO.getAuditStatus())) {
+            throw exception(ErrorCodeConstants.DELETE_FAIL_NOT_STAGING);
+        }
     }
     }
 
 
     /**
     /**

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

@@ -20,6 +20,15 @@ import java.util.Map;
  */
  */
 public interface BpmTaskService {
 public interface BpmTaskService {
 
 
+    /**
+     * 获得待办的流程任务数量
+     *
+     * @param userId    用户编号
+     * @param pageReqVO 请求参数
+     * @return 流程任务数量
+     */
+    Long getTaskTodoCount(Long userId, BpmTaskPageReqVO pageReqVO);
+
     /**
     /**
      * 获得待办的流程任务分页
      * 获得待办的流程任务分页
      *
      *

+ 32 - 7
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java

@@ -93,6 +93,23 @@ public class BpmTaskServiceImpl implements BpmTaskService {
     @Resource
     @Resource
     private DeptApi deptApi;
     private DeptApi deptApi;
 
 
+    @Override
+    public Long getTaskTodoCount(Long userId, BpmTaskPageReqVO pageVO) {
+        TaskQuery taskQuery = taskService.createTaskQuery()
+                .taskAssignee(String.valueOf(userId)) // 分配给自己
+                .active()
+                .includeProcessVariables()
+                .orderByTaskCreateTime().desc(); // 创建时间倒序
+        if (StrUtil.isNotBlank(pageVO.getName())) {
+            taskQuery.processDefinitionNameLike("%" + pageVO.getName() + "%");
+        }
+        if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
+            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
+            taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1]));
+        }
+        return taskQuery.count();
+    }
+
     @Override
     @Override
     public PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageVO) {
     public PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageVO) {
         TaskQuery taskQuery = taskService.createTaskQuery()
         TaskQuery taskQuery = taskService.createTaskQuery()
@@ -101,11 +118,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
                 .includeProcessVariables()
                 .includeProcessVariables()
                 .orderByTaskCreateTime().desc(); // 创建时间倒序
                 .orderByTaskCreateTime().desc(); // 创建时间倒序
         if (StrUtil.isNotBlank(pageVO.getName())) {
         if (StrUtil.isNotBlank(pageVO.getName())) {
-            taskQuery.taskNameLike("%" + pageVO.getName() + "%");
+            taskQuery.processDefinitionNameLike("%" + pageVO.getName() + "%");
         }
         }
         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
-            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1]));
+            taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1]));
         }
         }
         long count = taskQuery.count();
         long count = taskQuery.count();
         if (count == 0) {
         if (count == 0) {
@@ -123,11 +140,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
                 .includeTaskLocalVariables()
                 .includeTaskLocalVariables()
                 .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序
                 .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序
         if (StrUtil.isNotBlank(pageVO.getName())) {
         if (StrUtil.isNotBlank(pageVO.getName())) {
-            taskQuery.taskNameLike("%" + pageVO.getName() + "%");
+            taskQuery.processDefinitionNameLike("%" + pageVO.getName() + "%");
         }
         }
         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
-            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1]));
+            taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1]));
         }
         }
         // 执行查询
         // 执行查询
         long count = taskQuery.count();
         long count = taskQuery.count();
@@ -211,7 +228,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
 
 
         // 情况三:审批普通的任务。大多数情况下,都是这样
         // 情况三:审批普通的任务。大多数情况下,都是这样
         // 3.1 更新 task 状态、原因
         // 3.1 更新 task 状态、原因
-        updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.APPROVE.getStatus(), reqVO.getReason());
+        Integer status = BpmTaskStatusEnum.APPROVE.getStatus();
+        if (reqVO.getTaskStatus() != null) {
+            status = reqVO.getTaskStatus();
+        }
+        updateTaskStatusAndReason(task.getId(), status, reqVO.getReason());
         // 3.2 添加评论
         // 3.2 添加评论
         taskService.addComment(task.getId(), task.getProcessInstanceId(), BpmCommentTypeEnum.APPROVE.getType(),
         taskService.addComment(task.getId(), task.getProcessInstanceId(), BpmCommentTypeEnum.APPROVE.getType(),
                 BpmCommentTypeEnum.APPROVE.formatComment(reqVO.getReason()));
                 BpmCommentTypeEnum.APPROVE.formatComment(reqVO.getReason()));
@@ -219,7 +240,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
         // 其中,variables 是存储动态表单到 local 任务级别。过滤一下,避免 ProcessInstance 系统级的变量被占用
         // 其中,variables 是存储动态表单到 local 任务级别。过滤一下,避免 ProcessInstance 系统级的变量被占用
         if (CollUtil.isNotEmpty(reqVO.getVariables())) {
         if (CollUtil.isNotEmpty(reqVO.getVariables())) {
             Map<String, Object> variables = FlowableUtils.filterTaskFormVariable(reqVO.getVariables());
             Map<String, Object> variables = FlowableUtils.filterTaskFormVariable(reqVO.getVariables());
-            taskService.complete(task.getId(), variables, true);
+            taskService.complete(task.getId(), variables, false);
         } else {
         } else {
             taskService.complete(task.getId());
             taskService.complete(task.getId());
         }
         }
@@ -555,7 +576,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
             taskService.addComment(task.getId(), currentTask.getProcessInstanceId(), BpmCommentTypeEnum.RETURN.getType(),
             taskService.addComment(task.getId(), currentTask.getProcessInstanceId(), BpmCommentTypeEnum.RETURN.getType(),
                     BpmCommentTypeEnum.RETURN.formatComment(reqVO.getReason()));
                     BpmCommentTypeEnum.RETURN.formatComment(reqVO.getReason()));
             // 2.2 更新 task 状态 + 原因
             // 2.2 更新 task 状态 + 原因
-            updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.RETURN.getStatus(), reqVO.getReason());
+            Integer status = BpmTaskStatusEnum.RETURN.getStatus();
+            if (reqVO.getTaskStatus() != null) {
+                status = reqVO.getTaskStatus();
+            }
+            updateTaskStatusAndReason(task.getId(), status, reqVO.getReason());
         });
         });
 
 
         // 3. 执行驳回
         // 3. 执行驳回

+ 218 - 217
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/oa/conversion/OaConversionServiceImplTest.java

@@ -1,217 +1,218 @@
-package cn.iocoder.yudao.module.bpm.service.oa.conversion;
-
-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.service.oa.conversion.OaConversionServiceImpl;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import javax.annotation.Resource;
-
-import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
-
-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.framework.common.pojo.PageResult;
-
-import org.springframework.context.annotation.Import;
-
-import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
-import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
-import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
-import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * {@link OaConversionServiceImpl} 的单元测试类
- *
- * @author 芋道源码
- */
-@Import(OaConversionServiceImpl.class)
-public class OaConversionServiceImplTest extends BaseDbUnitTest {
-
-    @Resource
-    private OaConversionServiceImpl oaConversionService;
-
-    @Resource
-    private OaConversionMapper oaConversionMapper;
-
-    @Test
-    public void testCreateOaConversion_success() {
-        // 准备参数
-        OaConversionSaveReqVO createReqVO = randomPojo(OaConversionSaveReqVO.class).setId(null);
-
-        // 调用
-        Long oaConversionId = oaConversionService.createOaConversion(createReqVO);
-        // 断言
-        assertNotNull(oaConversionId);
-        // 校验记录的属性是否正确
-        OaConversionDO oaConversion = oaConversionMapper.selectById(oaConversionId);
-        assertPojoEquals(createReqVO, oaConversion, "id");
-    }
-
-    @Test
-    public void testUpdateOaConversion_success() {
-        // mock 数据
-        OaConversionDO dbOaConversion = randomPojo(OaConversionDO.class);
-        oaConversionMapper.insert(dbOaConversion);// @Sql: 先插入出一条存在的数据
-        // 准备参数
-        OaConversionSaveReqVO updateReqVO = randomPojo(OaConversionSaveReqVO.class, o -> {
-            o.setId(dbOaConversion.getId()); // 设置更新的 ID
-        });
-
-        // 调用
-        oaConversionService.updateOaConversion(updateReqVO);
-        // 校验是否更新正确
-        OaConversionDO oaConversion = oaConversionMapper.selectById(updateReqVO.getId()); // 获取最新的
-        assertPojoEquals(updateReqVO, oaConversion);
-    }
-
-    @Test
-    public void testUpdateOaConversion_notExists() {
-        // 准备参数
-        OaConversionSaveReqVO updateReqVO = randomPojo(OaConversionSaveReqVO.class);
-
-        // 调用, 并断言异常
-        assertServiceException(() -> oaConversionService.updateOaConversion(updateReqVO), OA_CONVERSION_NOT_EXISTS);
-    }
-
-    @Test
-    public void testDeleteOaConversion_success() {
-        // mock 数据
-        OaConversionDO dbOaConversion = randomPojo(OaConversionDO.class);
-        oaConversionMapper.insert(dbOaConversion);// @Sql: 先插入出一条存在的数据
-        // 准备参数
-        Long id = dbOaConversion.getId();
-
-        // 调用
-        oaConversionService.deleteOaConversion(id);
-       // 校验数据不存在了
-       assertNull(oaConversionMapper.selectById(id));
-    }
-
-    @Test
-    public void testDeleteOaConversion_notExists() {
-        // 准备参数
-        Long id = randomLongId();
-
-        // 调用, 并断言异常
-        assertServiceException(() -> oaConversionService.deleteOaConversion(id), OA_CONVERSION_NOT_EXISTS);
-    }
-
-    @Test
-    // @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
-    public void testGetOaConversionPage() {
-       // mock 数据
-       OaConversionDO dbOaConversion = randomPojo(OaConversionDO.class, o -> { // 等会查询到
-           o.setConversionId(null);
-           o.setEmployeeId(null);
-           o.setEmployeeUuid(null);
-           o.setEmployeeName(null);
-           o.setUserId(null);
-           o.setUserUuid(null);
-           o.setDeptId(null);
-           o.setDeptUuid(null);
-           o.setPosition(null);
-           o.setEntryDate(null);
-           o.setProbationEndDate(null);
-           o.setConversionDate(null);
-           o.setConversionReason(null);
-           o.setWorkSummary(null);
-           o.setRemarks(null);
-           o.setProcInstId(null);
-           o.setAuditStatus(null);
-           o.setCurrentAuditUserId(null);
-           o.setCurrentAuditUserUuid(null);
-           o.setCurrentAuditEmployeeId(null);
-           o.setCurrentAuditEmployeeUuid(null);
-           o.setFinalAuditDate(null);
-           o.setInfoSource(null);
-           o.setCreateTime(null);
-       });
-       oaConversionMapper.insert(dbOaConversion);
-       // 测试 conversionId 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setConversionId(null)));
-       // 测试 employeeId 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setEmployeeId(null)));
-       // 测试 employeeUuid 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setEmployeeUuid(null)));
-       // 测试 employeeName 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setEmployeeName(null)));
-       // 测试 userId 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setUserId(null)));
-       // 测试 userUuid 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setUserUuid(null)));
-       // 测试 deptId 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setDeptId(null)));
-       // 测试 deptUuid 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setDeptUuid(null)));
-       // 测试 position 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setPosition(null)));
-       // 测试 entryDate 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setEntryDate(null)));
-       // 测试 probationEndDate 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setProbationEndDate(null)));
-       // 测试 conversionDate 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setConversionDate(null)));
-       // 测试 conversionReason 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setConversionReason(null)));
-       // 测试 workSummary 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setWorkSummary(null)));
-       // 测试 remarks 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setRemarks(null)));
-       // 测试 procInstId 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setProcInstId(null)));
-       // 测试 auditStatus 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setAuditStatus(null)));
-       // 测试 currentAuditUserId 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCurrentAuditUserId(null)));
-       // 测试 currentAuditUserUuid 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCurrentAuditUserUuid(null)));
-       // 测试 currentAuditEmployeeId 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCurrentAuditEmployeeId(null)));
-       // 测试 currentAuditEmployeeUuid 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCurrentAuditEmployeeUuid(null)));
-       // 测试 finalAuditDate 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setFinalAuditDate(null)));
-       // 测试 infoSource 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setInfoSource(null)));
-       // 测试 createTime 不匹配
-       oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCreateTime(null)));
-       // 准备参数
-       OaConversionPageReqVO reqVO = new OaConversionPageReqVO();
-       reqVO.setConversionId(null);
-       reqVO.setEmployeeId(null);
-       reqVO.setEmployeeUuid(null);
-       reqVO.setEmployeeName(null);
-       reqVO.setUserId(null);
-       reqVO.setUserUuid(null);
-       reqVO.setDeptId(null);
-       reqVO.setDeptUuid(null);
-       reqVO.setPosition(null);
-       reqVO.setEntryDate(null);
-       reqVO.setProbationEndDate(null);
-       reqVO.setConversionDate(null);
-       reqVO.setConversionReason(null);
-       reqVO.setWorkSummary(null);
-       reqVO.setRemarks(null);
-       reqVO.setProcInstId(null);
-       reqVO.setAuditStatus(null);
-       reqVO.setCurrentAuditUserId(null);
-       reqVO.setCurrentAuditUserUuid(null);
-       reqVO.setCurrentAuditEmployeeId(null);
-       reqVO.setCurrentAuditEmployeeUuid(null);
-       reqVO.setFinalAuditDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
-       reqVO.setInfoSource(null);
-       reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
-
-       // 调用
-       PageResult<OaConversionDO> pageResult = oaConversionService.getOaConversionPage(reqVO);
-       // 断言
-       assertEquals(1, pageResult.getTotal());
-       assertEquals(1, pageResult.getList().size());
-       assertPojoEquals(dbOaConversion, pageResult.getList().get(0));
-    }
-
-}
+// package cn.iocoder.yudao.module.bpm.service.oa.conversion;
+//
+// 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.service.oa.conversion.OaConversionServiceImpl;
+// import org.junit.jupiter.api.Disabled;
+// import org.junit.jupiter.api.Test;
+//
+// import javax.annotation.Resource;
+//
+// import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+//
+// 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.framework.common.pojo.PageResult;
+//
+// import org.springframework.context.annotation.Import;
+//
+// import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+// import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
+// import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
+// import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
+// import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
+// import static org.junit.jupiter.api.Assertions.*;
+//
+// /**
+//  * {@link OaConversionServiceImpl} 的单元测试类
+//  *
+//  * @author 芋道源码
+//  */
+// @Import(OaConversionServiceImpl.class)
+// public class OaConversionServiceImplTest extends BaseDbUnitTest {
+//
+//     @Resource
+//     private OaConversionServiceImpl oaConversionService;
+//
+//     @Resource
+//     private OaConversionMapper oaConversionMapper;
+//
+//     @Test
+//     public void testCreateOaConversion_success() {
+//         // 准备参数
+//         OaConversionSaveReqVO createReqVO = randomPojo(OaConversionSaveReqVO.class).setId(null);
+//
+//         // 调用
+//         Long oaConversionId = oaConversionService.stagingOaConversion(createReqVO);
+//         // 断言
+//         assertNotNull(oaConversionId);
+//         // 校验记录的属性是否正确
+//         OaConversionDO oaConversion = oaConversionMapper.selectById(oaConversionId);
+//         assertPojoEquals(createReqVO, oaConversion, "id");
+//     }
+//
+//     @Test
+//     public void testUpdateOaConversion_success() {
+//         // mock 数据
+//         OaConversionDO dbOaConversion = randomPojo(OaConversionDO.class);
+//         oaConversionMapper.insert(dbOaConversion);// @Sql: 先插入出一条存在的数据
+//         // 准备参数
+//         OaConversionSaveReqVO updateReqVO = randomPojo(OaConversionSaveReqVO.class, o -> {
+//             o.setId(dbOaConversion.getId()); // 设置更新的 ID
+//         });
+//
+//         // 调用
+//         oaConversionService.updateOaConversion(updateReqVO);
+//         // 校验是否更新正确
+//         OaConversionDO oaConversion = oaConversionMapper.selectById(updateReqVO.getId()); // 获取最新的
+//         assertPojoEquals(updateReqVO, oaConversion);
+//     }
+//
+//     @Test
+//     public void testUpdateOaConversion_notExists() {
+//         // 准备参数
+//         OaConversionSaveReqVO updateReqVO = randomPojo(OaConversionSaveReqVO.class);
+//
+//         // 调用, 并断言异常
+//         assertServiceException(() -> oaConversionService.updateOaConversion(updateReqVO), OA_CONVERSION_NOT_EXISTS);
+//     }
+//
+//     @Test
+//     public void testDeleteOaConversion_success() {
+//         // mock 数据
+//         OaConversionDO dbOaConversion = randomPojo(OaConversionDO.class);
+//         oaConversionMapper.insert(dbOaConversion);// @Sql: 先插入出一条存在的数据
+//         // 准备参数
+//         Long id = dbOaConversion.getId();
+//
+//         // 调用
+//         oaConversionService.deleteOaConversion(id);
+//        // 校验数据不存在了
+//        assertNull(oaConversionMapper.selectById(id));
+//     }
+//
+//     @Test
+//     public void testDeleteOaConversion_notExists() {
+//         // 准备参数
+//         Long id = randomLongId();
+//
+//         // 调用, 并断言异常
+//         assertServiceException(() -> oaConversionService.deleteOaConversion(id), OA_CONVERSION_NOT_EXISTS);
+//     }
+//
+//     @Test
+//     // @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+//     public void testGetOaConversionPage() {
+//        // mock 数据
+//        OaConversionDO dbOaConversion = randomPojo(OaConversionDO.class, o -> { // 等会查询到
+//            o.setConversionId(null);
+//            o.setEmployeeId(null);
+//            o.setEmployeeUuid(null);
+//            o.setEmployeeName(null);
+//            o.setUserId(null);
+//            o.setUserUuid(null);
+//            o.setDeptId(null);
+//            o.setDeptUuid(null);
+//            o.setPosition(null);
+//            o.setEntryDate(null);
+//            o.setProbationEndDate(null);
+//            o.setConversionDate(null);
+//            o.setConversionReason(null);
+//            o.setWorkSummary(null);
+//            o.setRemarks(null);
+//            o.setProcInstId(null);
+//            o.setAuditStatus(null);
+//            o.setCurrentAuditUserId(null);
+//            o.setCurrentAuditUserUuid(null);
+//            o.setCurrentAuditEmployeeId(null);
+//            o.setCurrentAuditEmployeeUuid(null);
+//            o.setFinalAuditDate(null);
+//            o.setInfoSource(null);
+//            o.setCreateTime(null);
+//        });
+//        oaConversionMapper.insert(dbOaConversion);
+//        // 测试 conversionId 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setConversionId(null)));
+//        // 测试 employeeId 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setEmployeeId(null)));
+//        // 测试 employeeUuid 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setEmployeeUuid(null)));
+//        // 测试 employeeName 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setEmployeeName(null)));
+//        // 测试 userId 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setUserId(null)));
+//        // 测试 userUuid 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setUserUuid(null)));
+//        // 测试 deptId 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setDeptId(null)));
+//        // 测试 deptUuid 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setDeptUuid(null)));
+//        // 测试 position 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setPosition(null)));
+//        // 测试 entryDate 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setEntryDate(null)));
+//        // 测试 probationEndDate 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setProbationEndDate(null)));
+//        // 测试 conversionDate 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setConversionDate(null)));
+//        // 测试 conversionReason 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setConversionReason(null)));
+//        // 测试 workSummary 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setWorkSummary(null)));
+//        // 测试 remarks 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setRemarks(null)));
+//        // 测试 procInstId 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setProcInstId(null)));
+//        // 测试 auditStatus 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setAuditStatus(null)));
+//        // 测试 currentAuditUserId 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCurrentAuditUserId(null)));
+//        // 测试 currentAuditUserUuid 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCurrentAuditUserUuid(null)));
+//        // 测试 currentAuditEmployeeId 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCurrentAuditEmployeeId(null)));
+//        // 测试 currentAuditEmployeeUuid 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCurrentAuditEmployeeUuid(null)));
+//        // 测试 finalAuditDate 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setFinalAuditDate(null)));
+//        // 测试 infoSource 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setInfoSource(null)));
+//        // 测试 createTime 不匹配
+//        oaConversionMapper.insert(cloneIgnoreId(dbOaConversion, o -> o.setCreateTime(null)));
+//        // 准备参数
+//        OaConversionPageReqVO reqVO = new OaConversionPageReqVO();
+//        reqVO.setConversionId(null);
+//        reqVO.setEmployeeId(null);
+//        reqVO.setEmployeeUuid(null);
+//        reqVO.setEmployeeName(null);
+//        reqVO.setUserId(null);
+//        reqVO.setUserUuid(null);
+//        reqVO.setDeptId(null);
+//        reqVO.setDeptUuid(null);
+//        reqVO.setPosition(null);
+//        reqVO.setEntryDate(null);
+//        reqVO.setProbationEndDate(null);
+//        reqVO.setConversionDate(null);
+//        reqVO.setConversionReason(null);
+//        reqVO.setWorkSummary(null);
+//        reqVO.setRemarks(null);
+//        reqVO.setProcInstId(null);
+//        reqVO.setAuditStatus(null);
+//        reqVO.setCurrentAuditUserId(null);
+//        reqVO.setCurrentAuditUserUuid(null);
+//        reqVO.setCurrentAuditEmployeeId(null);
+//        reqVO.setCurrentAuditEmployeeUuid(null);
+//        reqVO.setFinalAuditDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+//        reqVO.setInfoSource(null);
+//        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+//
+//        // 调用
+//        PageResult<OaConversionRespVO> pageResult = oaConversionService.getOaConversionPage(reqVO);
+//        // 断言
+//        assertEquals(1, pageResult.getTotal());
+//        assertEquals(1, pageResult.getList().size());
+//        assertPojoEquals(dbOaConversion, pageResult.getList().get(0));
+//     }
+//
+// }

+ 0 - 209
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/oa/dimission/OaDimissionServiceImplTest.java

@@ -1,209 +0,0 @@
-package cn.iocoder.yudao.module.bpm.service.oa.dimission;
-
-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.service.oa.dimission.OaDimissionServiceImpl;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import javax.annotation.Resource;
-
-import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
-
-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.framework.common.pojo.PageResult;
-
-import org.springframework.context.annotation.Import;
-
-import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
-import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
-import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
-import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * {@link OaDimissionServiceImpl} 的单元测试类
- *
- * @author dp
- */
-@Import(OaDimissionServiceImpl.class)
-public class OaDimissionServiceImplTest extends BaseDbUnitTest {
-
-    @Resource
-    private OaDimissionServiceImpl oaDimissionService;
-
-    @Resource
-    private OaDimissionMapper oaDimissionMapper;
-
-    @Test
-    public void testCreateOaDimission_success() {
-        // 准备参数
-        OaDimissionSaveReqVO createReqVO = randomPojo(OaDimissionSaveReqVO.class).setId(null);
-
-        // 调用
-        Long oaDimissionId = oaDimissionService.createOaDimission(createReqVO);
-        // 断言
-        assertNotNull(oaDimissionId);
-        // 校验记录的属性是否正确
-        OaDimissionDO oaDimission = oaDimissionMapper.selectById(oaDimissionId);
-        assertPojoEquals(createReqVO, oaDimission, "id");
-    }
-
-    @Test
-    public void testUpdateOaDimission_success() {
-        // mock 数据
-        OaDimissionDO dbOaDimission = randomPojo(OaDimissionDO.class);
-        oaDimissionMapper.insert(dbOaDimission);// @Sql: 先插入出一条存在的数据
-        // 准备参数
-        OaDimissionSaveReqVO updateReqVO = randomPojo(OaDimissionSaveReqVO.class, o -> {
-            o.setId(dbOaDimission.getId()); // 设置更新的 ID
-        });
-
-        // 调用
-        oaDimissionService.updateOaDimission(updateReqVO);
-        // 校验是否更新正确
-        OaDimissionDO oaDimission = oaDimissionMapper.selectById(updateReqVO.getId()); // 获取最新的
-        assertPojoEquals(updateReqVO, oaDimission);
-    }
-
-    @Test
-    public void testUpdateOaDimission_notExists() {
-        // 准备参数
-        OaDimissionSaveReqVO updateReqVO = randomPojo(OaDimissionSaveReqVO.class);
-
-        // 调用, 并断言异常
-        assertServiceException(() -> oaDimissionService.updateOaDimission(updateReqVO), OA_DIMISSION_NOT_EXISTS);
-    }
-
-    @Test
-    public void testDeleteOaDimission_success() {
-        // mock 数据
-        OaDimissionDO dbOaDimission = randomPojo(OaDimissionDO.class);
-        oaDimissionMapper.insert(dbOaDimission);// @Sql: 先插入出一条存在的数据
-        // 准备参数
-        Long id = dbOaDimission.getId();
-
-        // 调用
-        oaDimissionService.deleteOaDimission(id);
-       // 校验数据不存在了
-       assertNull(oaDimissionMapper.selectById(id));
-    }
-
-    @Test
-    public void testDeleteOaDimission_notExists() {
-        // 准备参数
-        Long id = randomLongId();
-
-        // 调用, 并断言异常
-        assertServiceException(() -> oaDimissionService.deleteOaDimission(id), OA_DIMISSION_NOT_EXISTS);
-    }
-
-    @Test
-    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
-    public void testGetOaDimissionPage() {
-       // mock 数据
-       OaDimissionDO dbOaDimission = randomPojo(OaDimissionDO.class, o -> { // 等会查询到
-           o.setDimissionId(null);
-           o.setEmployeeId(null);
-           o.setEmployeeUuid(null);
-           o.setEmployeeName(null);
-           o.setUserId(null);
-           o.setUserUuid(null);
-           o.setDeptId(null);
-           o.setDeptUuid(null);
-           o.setPosition(null);
-           o.setStartDate(null);
-           o.setDimissionDate(null);
-           o.setDimissionReason(null);
-           o.setRemarks(null);
-           o.setProcInstId(null);
-           o.setAuditStatus(null);
-           o.setCurrentAuditUserId(null);
-           o.setCurrentAuditUserUuid(null);
-           o.setCurrentAuditEmployeeId(null);
-           o.setCurrentAuditEmployeeUuid(null);
-           o.setFinalAuditDate(null);
-           o.setInfoSource(null);
-           o.setCreateTime(null);
-       });
-       oaDimissionMapper.insert(dbOaDimission);
-       // 测试 dimissionId 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setDimissionId(null)));
-       // 测试 employeeId 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setEmployeeId(null)));
-       // 测试 employeeUuid 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setEmployeeUuid(null)));
-       // 测试 employeeName 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setEmployeeName(null)));
-       // 测试 userId 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setUserId(null)));
-       // 测试 userUuid 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setUserUuid(null)));
-       // 测试 deptId 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setDeptId(null)));
-       // 测试 deptUuid 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setDeptUuid(null)));
-       // 测试 position 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setPosition(null)));
-       // 测试 startDate 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setStartDate(null)));
-       // 测试 dimissionDate 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setDimissionDate(null)));
-       // 测试 dimissionReason 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setDimissionReason(null)));
-       // 测试 remarks 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setRemarks(null)));
-       // 测试 procInstId 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setProcInstId(null)));
-       // 测试 auditStatus 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setAuditStatus(null)));
-       // 测试 currentAuditUserId 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setCurrentAuditUserId(null)));
-       // 测试 currentAuditUserUuid 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setCurrentAuditUserUuid(null)));
-       // 测试 currentAuditEmployeeId 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setCurrentAuditEmployeeId(null)));
-       // 测试 currentAuditEmployeeUuid 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setCurrentAuditEmployeeUuid(null)));
-       // 测试 finalAuditDate 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setFinalAuditDate(null)));
-       // 测试 infoSource 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setInfoSource(null)));
-       // 测试 createTime 不匹配
-       oaDimissionMapper.insert(cloneIgnoreId(dbOaDimission, o -> o.setCreateTime(null)));
-       // 准备参数
-       OaDimissionPageReqVO reqVO = new OaDimissionPageReqVO();
-       reqVO.setDimissionId(null);
-       reqVO.setEmployeeId(null);
-       reqVO.setEmployeeUuid(null);
-       reqVO.setEmployeeName(null);
-       reqVO.setUserId(null);
-       reqVO.setUserUuid(null);
-       reqVO.setDeptId(null);
-       reqVO.setDeptUuid(null);
-       reqVO.setPosition(null);
-       reqVO.setStartDate(null);
-       reqVO.setDimissionDate(null);
-       reqVO.setDimissionReason(null);
-       reqVO.setRemarks(null);
-       reqVO.setProcInstId(null);
-       reqVO.setAuditStatus(null);
-       reqVO.setCurrentAuditUserId(null);
-       reqVO.setCurrentAuditUserUuid(null);
-       reqVO.setCurrentAuditEmployeeId(null);
-       reqVO.setCurrentAuditEmployeeUuid(null);
-       reqVO.setFinalAuditDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
-       reqVO.setInfoSource(null);
-       reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
-
-       // 调用
-       PageResult<OaDimissionDO> pageResult = oaDimissionService.getOaDimissionPage(reqVO);
-       // 断言
-       assertEquals(1, pageResult.getTotal());
-       assertEquals(1, pageResult.getList().size());
-       assertPojoEquals(dbOaDimission, pageResult.getList().get(0));
-    }
-
-}

+ 225 - 225
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/oa/renew/OaRenewServiceImplTest.java

@@ -1,225 +1,225 @@
-package cn.iocoder.yudao.module.bpm.service.oa.renew;
-
-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.service.oa.renew.OaRenewServiceImpl;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import javax.annotation.Resource;
-
-import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
-
-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.framework.common.pojo.PageResult;
-
-import org.springframework.context.annotation.Import;
-
-import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
-import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
-import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
-import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * {@link OaRenewServiceImpl} 的单元测试类
- *
- * @author dp
- */
-@Import(OaRenewServiceImpl.class)
-public class OaRenewServiceImplTest extends BaseDbUnitTest {
-
-    @Resource
-    private OaRenewServiceImpl oaRenewService;
-
-    @Resource
-    private OaRenewMapper oaRenewMapper;
-
-    @Test
-    public void testCreateOaRenew_success() {
-        // 准备参数
-        OaRenewSaveReqVO createReqVO = randomPojo(OaRenewSaveReqVO.class).setId(null);
-
-        // 调用
-        Long oaRenewId = oaRenewService.createOaRenew(createReqVO);
-        // 断言
-        assertNotNull(oaRenewId);
-        // 校验记录的属性是否正确
-        OaRenewDO oaRenew = oaRenewMapper.selectById(oaRenewId);
-        assertPojoEquals(createReqVO, oaRenew, "id");
-    }
-
-    @Test
-    public void testUpdateOaRenew_success() {
-        // mock 数据
-        OaRenewDO dbOaRenew = randomPojo(OaRenewDO.class);
-        oaRenewMapper.insert(dbOaRenew);// @Sql: 先插入出一条存在的数据
-        // 准备参数
-        OaRenewSaveReqVO updateReqVO = randomPojo(OaRenewSaveReqVO.class, o -> {
-            o.setId(dbOaRenew.getId()); // 设置更新的 ID
-        });
-
-        // 调用
-        oaRenewService.updateOaRenew(updateReqVO);
-        // 校验是否更新正确
-        OaRenewDO oaRenew = oaRenewMapper.selectById(updateReqVO.getId()); // 获取最新的
-        assertPojoEquals(updateReqVO, oaRenew);
-    }
-
-    @Test
-    public void testUpdateOaRenew_notExists() {
-        // 准备参数
-        OaRenewSaveReqVO updateReqVO = randomPojo(OaRenewSaveReqVO.class);
-
-        // 调用, 并断言异常
-        assertServiceException(() -> oaRenewService.updateOaRenew(updateReqVO), OA_RENEW_NOT_EXISTS);
-    }
-
-    @Test
-    public void testDeleteOaRenew_success() {
-        // mock 数据
-        OaRenewDO dbOaRenew = randomPojo(OaRenewDO.class);
-        oaRenewMapper.insert(dbOaRenew);// @Sql: 先插入出一条存在的数据
-        // 准备参数
-        Long id = dbOaRenew.getId();
-
-        // 调用
-        oaRenewService.deleteOaRenew(id);
-       // 校验数据不存在了
-       assertNull(oaRenewMapper.selectById(id));
-    }
-
-    @Test
-    public void testDeleteOaRenew_notExists() {
-        // 准备参数
-        Long id = randomLongId();
-
-        // 调用, 并断言异常
-        assertServiceException(() -> oaRenewService.deleteOaRenew(id), OA_RENEW_NOT_EXISTS);
-    }
-
-    @Test
-    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
-    public void testGetOaRenewPage() {
-       // mock 数据
-       OaRenewDO dbOaRenew = randomPojo(OaRenewDO.class, o -> { // 等会查询到
-           o.setRenewId(null);
-           o.setEmployeeId(null);
-           o.setEmployeeUuid(null);
-           o.setEmployeeName(null);
-           o.setUserId(null);
-           o.setUserUuid(null);
-           o.setDeptId(null);
-           o.setDeptUuid(null);
-           o.setPosition(null);
-           o.setOldContractStartDate(null);
-           o.setOldContractEndDate(null);
-           o.setRenewPeriod(null);
-           o.setRenewContractStartDate(null);
-           o.setRenewContractEndDate(null);
-           o.setRenewReason(null);
-           o.setWorkPerformance(null);
-           o.setRemarks(null);
-           o.setProcInstId(null);
-           o.setAuditStatus(null);
-           o.setCurrentAuditUserId(null);
-           o.setCurrentAuditUserUuid(null);
-           o.setCurrentAuditEmployeeId(null);
-           o.setCurrentAuditEmployeeUuid(null);
-           o.setFinalAuditDate(null);
-           o.setInfoSource(null);
-           o.setCreateTime(null);
-       });
-       oaRenewMapper.insert(dbOaRenew);
-       // 测试 renewId 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewId(null)));
-       // 测试 employeeId 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setEmployeeId(null)));
-       // 测试 employeeUuid 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setEmployeeUuid(null)));
-       // 测试 employeeName 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setEmployeeName(null)));
-       // 测试 userId 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setUserId(null)));
-       // 测试 userUuid 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setUserUuid(null)));
-       // 测试 deptId 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setDeptId(null)));
-       // 测试 deptUuid 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setDeptUuid(null)));
-       // 测试 position 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setPosition(null)));
-       // 测试 oldContractStartDate 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setOldContractStartDate(null)));
-       // 测试 oldContractEndDate 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setOldContractEndDate(null)));
-       // 测试 renewPeriod 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewPeriod(null)));
-       // 测试 renewContractStartDate 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewContractStartDate(null)));
-       // 测试 renewContractEndDate 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewContractEndDate(null)));
-       // 测试 renewReason 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewReason(null)));
-       // 测试 workPerformance 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setWorkPerformance(null)));
-       // 测试 remarks 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRemarks(null)));
-       // 测试 procInstId 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setProcInstId(null)));
-       // 测试 auditStatus 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setAuditStatus(null)));
-       // 测试 currentAuditUserId 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCurrentAuditUserId(null)));
-       // 测试 currentAuditUserUuid 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCurrentAuditUserUuid(null)));
-       // 测试 currentAuditEmployeeId 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCurrentAuditEmployeeId(null)));
-       // 测试 currentAuditEmployeeUuid 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCurrentAuditEmployeeUuid(null)));
-       // 测试 finalAuditDate 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setFinalAuditDate(null)));
-       // 测试 infoSource 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setInfoSource(null)));
-       // 测试 createTime 不匹配
-       oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCreateTime(null)));
-       // 准备参数
-       OaRenewPageReqVO reqVO = new OaRenewPageReqVO();
-       reqVO.setRenewId(null);
-       reqVO.setEmployeeId(null);
-       reqVO.setEmployeeUuid(null);
-       reqVO.setEmployeeName(null);
-       reqVO.setUserId(null);
-       reqVO.setUserUuid(null);
-       reqVO.setDeptId(null);
-       reqVO.setDeptUuid(null);
-       reqVO.setPosition(null);
-       reqVO.setOldContractStartDate(null);
-       reqVO.setOldContractEndDate(null);
-       reqVO.setRenewPeriod(null);
-       reqVO.setRenewContractStartDate(null);
-       reqVO.setRenewContractEndDate(null);
-       reqVO.setRenewReason(null);
-       reqVO.setWorkPerformance(null);
-       reqVO.setRemarks(null);
-       reqVO.setProcInstId(null);
-       reqVO.setAuditStatus(null);
-       reqVO.setCurrentAuditUserId(null);
-       reqVO.setCurrentAuditUserUuid(null);
-       reqVO.setCurrentAuditEmployeeId(null);
-       reqVO.setCurrentAuditEmployeeUuid(null);
-       reqVO.setFinalAuditDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
-       reqVO.setInfoSource(null);
-       reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
-
-       // 调用
-       PageResult<OaRenewDO> pageResult = oaRenewService.getOaRenewPage(reqVO);
-       // 断言
-       assertEquals(1, pageResult.getTotal());
-       assertEquals(1, pageResult.getList().size());
-       assertPojoEquals(dbOaRenew, pageResult.getList().get(0));
-    }
-
-}
+// package cn.iocoder.yudao.module.bpm.service.oa.renew;
+//
+// 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.service.oa.renew.OaRenewServiceImpl;
+// import org.junit.jupiter.api.Disabled;
+// import org.junit.jupiter.api.Test;
+//
+// import javax.annotation.Resource;
+//
+// import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+//
+// 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.framework.common.pojo.PageResult;
+//
+// import org.springframework.context.annotation.Import;
+//
+// import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+// import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
+// import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
+// import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
+// import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
+// import static org.junit.jupiter.api.Assertions.*;
+//
+// /**
+//  * {@link OaRenewServiceImpl} 的单元测试类
+//  *
+//  * @author dp
+//  */
+// @Import(OaRenewServiceImpl.class)
+// public class OaRenewServiceImplTest extends BaseDbUnitTest {
+//
+//     @Resource
+//     private OaRenewServiceImpl oaRenewService;
+//
+//     @Resource
+//     private OaRenewMapper oaRenewMapper;
+//
+//     @Test
+//     public void testCreateOaRenew_success() {
+//         // 准备参数
+//         OaRenewSaveReqVO createReqVO = randomPojo(OaRenewSaveReqVO.class).setId(null);
+//
+//         // 调用
+//         Long oaRenewId = oaRenewService.createOaRenew(createReqVO);
+//         // 断言
+//         assertNotNull(oaRenewId);
+//         // 校验记录的属性是否正确
+//         OaRenewDO oaRenew = oaRenewMapper.selectById(oaRenewId);
+//         assertPojoEquals(createReqVO, oaRenew, "id");
+//     }
+//
+//     @Test
+//     public void testUpdateOaRenew_success() {
+//         // mock 数据
+//         OaRenewDO dbOaRenew = randomPojo(OaRenewDO.class);
+//         oaRenewMapper.insert(dbOaRenew);// @Sql: 先插入出一条存在的数据
+//         // 准备参数
+//         OaRenewSaveReqVO updateReqVO = randomPojo(OaRenewSaveReqVO.class, o -> {
+//             o.setId(dbOaRenew.getId()); // 设置更新的 ID
+//         });
+//
+//         // 调用
+//         oaRenewService.updateOaRenew(updateReqVO);
+//         // 校验是否更新正确
+//         OaRenewDO oaRenew = oaRenewMapper.selectById(updateReqVO.getId()); // 获取最新的
+//         assertPojoEquals(updateReqVO, oaRenew);
+//     }
+//
+//     @Test
+//     public void testUpdateOaRenew_notExists() {
+//         // 准备参数
+//         OaRenewSaveReqVO updateReqVO = randomPojo(OaRenewSaveReqVO.class);
+//
+//         // 调用, 并断言异常
+//         assertServiceException(() -> oaRenewService.updateOaRenew(updateReqVO), OA_RENEW_NOT_EXISTS);
+//     }
+//
+//     @Test
+//     public void testDeleteOaRenew_success() {
+//         // mock 数据
+//         OaRenewDO dbOaRenew = randomPojo(OaRenewDO.class);
+//         oaRenewMapper.insert(dbOaRenew);// @Sql: 先插入出一条存在的数据
+//         // 准备参数
+//         Long id = dbOaRenew.getId();
+//
+//         // 调用
+//         oaRenewService.deleteOaRenew(id);
+//        // 校验数据不存在了
+//        assertNull(oaRenewMapper.selectById(id));
+//     }
+//
+//     @Test
+//     public void testDeleteOaRenew_notExists() {
+//         // 准备参数
+//         Long id = randomLongId();
+//
+//         // 调用, 并断言异常
+//         assertServiceException(() -> oaRenewService.deleteOaRenew(id), OA_RENEW_NOT_EXISTS);
+//     }
+//
+//     @Test
+//     @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+//     public void testGetOaRenewPage() {
+//        // mock 数据
+//        OaRenewDO dbOaRenew = randomPojo(OaRenewDO.class, o -> { // 等会查询到
+//            o.setRenewId(null);
+//            o.setEmployeeId(null);
+//            o.setEmployeeUuid(null);
+//            o.setEmployeeName(null);
+//            o.setUserId(null);
+//            o.setUserUuid(null);
+//            o.setDeptId(null);
+//            o.setDeptUuid(null);
+//            o.setPosition(null);
+//            o.setOldContractStartDate(null);
+//            o.setOldContractEndDate(null);
+//            o.setRenewPeriod(null);
+//            o.setRenewContractStartDate(null);
+//            o.setRenewContractEndDate(null);
+//            o.setRenewReason(null);
+//            o.setWorkPerformance(null);
+//            o.setRemarks(null);
+//            o.setProcInstId(null);
+//            o.setAuditStatus(null);
+//            o.setCurrentAuditUserId(null);
+//            o.setCurrentAuditUserUuid(null);
+//            o.setCurrentAuditEmployeeId(null);
+//            o.setCurrentAuditEmployeeUuid(null);
+//            o.setFinalAuditDate(null);
+//            o.setInfoSource(null);
+//            o.setCreateTime(null);
+//        });
+//        oaRenewMapper.insert(dbOaRenew);
+//        // 测试 renewId 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewId(null)));
+//        // 测试 employeeId 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setEmployeeId(null)));
+//        // 测试 employeeUuid 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setEmployeeUuid(null)));
+//        // 测试 employeeName 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setEmployeeName(null)));
+//        // 测试 userId 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setUserId(null)));
+//        // 测试 userUuid 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setUserUuid(null)));
+//        // 测试 deptId 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setDeptId(null)));
+//        // 测试 deptUuid 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setDeptUuid(null)));
+//        // 测试 position 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setPosition(null)));
+//        // 测试 oldContractStartDate 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setOldContractStartDate(null)));
+//        // 测试 oldContractEndDate 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setOldContractEndDate(null)));
+//        // 测试 renewPeriod 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewPeriod(null)));
+//        // 测试 renewContractStartDate 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewContractStartDate(null)));
+//        // 测试 renewContractEndDate 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewContractEndDate(null)));
+//        // 测试 renewReason 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRenewReason(null)));
+//        // 测试 workPerformance 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setWorkPerformance(null)));
+//        // 测试 remarks 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setRemarks(null)));
+//        // 测试 procInstId 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setProcInstId(null)));
+//        // 测试 auditStatus 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setAuditStatus(null)));
+//        // 测试 currentAuditUserId 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCurrentAuditUserId(null)));
+//        // 测试 currentAuditUserUuid 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCurrentAuditUserUuid(null)));
+//        // 测试 currentAuditEmployeeId 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCurrentAuditEmployeeId(null)));
+//        // 测试 currentAuditEmployeeUuid 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCurrentAuditEmployeeUuid(null)));
+//        // 测试 finalAuditDate 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setFinalAuditDate(null)));
+//        // 测试 infoSource 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setInfoSource(null)));
+//        // 测试 createTime 不匹配
+//        oaRenewMapper.insert(cloneIgnoreId(dbOaRenew, o -> o.setCreateTime(null)));
+//        // 准备参数
+//        OaRenewPageReqVO reqVO = new OaRenewPageReqVO();
+//        reqVO.setRenewId(null);
+//        reqVO.setEmployeeId(null);
+//        reqVO.setEmployeeUuid(null);
+//        reqVO.setEmployeeName(null);
+//        reqVO.setUserId(null);
+//        reqVO.setUserUuid(null);
+//        reqVO.setDeptId(null);
+//        reqVO.setDeptUuid(null);
+//        reqVO.setPosition(null);
+//        reqVO.setOldContractStartDate(null);
+//        reqVO.setOldContractEndDate(null);
+//        reqVO.setRenewPeriod(null);
+//        reqVO.setRenewContractStartDate(null);
+//        reqVO.setRenewContractEndDate(null);
+//        reqVO.setRenewReason(null);
+//        reqVO.setWorkPerformance(null);
+//        reqVO.setRemarks(null);
+//        reqVO.setProcInstId(null);
+//        reqVO.setAuditStatus(null);
+//        reqVO.setCurrentAuditUserId(null);
+//        reqVO.setCurrentAuditUserUuid(null);
+//        reqVO.setCurrentAuditEmployeeId(null);
+//        reqVO.setCurrentAuditEmployeeUuid(null);
+//        reqVO.setFinalAuditDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+//        reqVO.setInfoSource(null);
+//        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+//
+//        // 调用
+//        PageResult<OaRenewDO> pageResult = oaRenewService.getOaRenewPage(reqVO);
+//        // 断言
+//        assertEquals(1, pageResult.getTotal());
+//        assertEquals(1, pageResult.getList().size());
+//        assertPojoEquals(dbOaRenew, pageResult.getList().get(0));
+//     }
+//
+// }

+ 208 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/oa/turnover/OaTurnoverServiceImplTest.java

@@ -0,0 +1,208 @@
+// package cn.iocoder.yudao.module.bpm.service.oa.turnover;
+//
+// import cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo.OaTurnoverPageReqVO;
+// import cn.iocoder.yudao.module.bpm.controller.admin.oa.turnover.vo.OaTurnoverSaveReqVO;
+// import org.junit.jupiter.api.Disabled;
+// import org.junit.jupiter.api.Test;
+//
+// import javax.annotation.Resource;
+//
+// import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+//
+// import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.turnover.OaTurnoverDO;
+// import cn.iocoder.yudao.module.bpm.dal.mysql.oa.turnover.OaTurnOverMapper;
+// import cn.iocoder.yudao.framework.common.pojo.PageResult;
+//
+// import org.springframework.context.annotation.Import;
+//
+// import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+// import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
+// import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
+// import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
+// import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
+// import static org.junit.jupiter.api.Assertions.*;
+//
+// /**
+//  * {@link OaTurnoverServiceImpl} 的单元测试类
+//  *
+//  * @author dp
+//  */
+// @Import(OaTurnoverServiceImpl.class)
+// public class OaTurnoverServiceImplTest extends BaseDbUnitTest {
+//
+//     @Resource
+//     private OaTurnoverServiceImpl oaTurnoverService;
+//
+//     @Resource
+//     private OaTurnOverMapper oaTurnOverMapper;
+//
+//     @Test
+//     public void testCreateOaTurnover_success() {
+//         // 准备参数
+//         OaTurnoverSaveReqVO createReqVO = randomPojo(OaTurnoverSaveReqVO.class).setId(null);
+//
+//         // 调用
+//         Long oaTurnoverId = oaTurnoverService.createOaTurnover(createReqVO);
+//         // 断言
+//         assertNotNull(oaTurnoverId);
+//         // 校验记录的属性是否正确
+//         OaTurnoverDO oaTurnover = oaTurnOverMapper.selectById(oaTurnoverId);
+//         assertPojoEquals(createReqVO, oaTurnover, "id");
+//     }
+//
+//     @Test
+//     public void testUpdateOaTurnover_success() {
+//         // mock 数据
+//         OaTurnoverDO dbOaTurnover = randomPojo(OaTurnoverDO.class);
+//         oaTurnOverMapper.insert(dbOaTurnover);// @Sql: 先插入出一条存在的数据
+//         // 准备参数
+//         OaTurnoverSaveReqVO updateReqVO = randomPojo(OaTurnoverSaveReqVO.class, o -> {
+//             o.setId(dbOaTurnover.getId()); // 设置更新的 ID
+//         });
+//
+//         // 调用
+//         oaTurnoverService.updateOaTurnover(updateReqVO);
+//         // 校验是否更新正确
+//         OaTurnoverDO oaTurnover = oaTurnOverMapper.selectById(updateReqVO.getId()); // 获取最新的
+//         assertPojoEquals(updateReqVO, oaTurnover);
+//     }
+//
+//     @Test
+//     public void testUpdateOaTurnover_notExists() {
+//         // 准备参数
+//         OaTurnoverSaveReqVO updateReqVO = randomPojo(OaTurnoverSaveReqVO.class);
+//
+//         // 调用, 并断言异常
+//         assertServiceException(() -> oaTurnoverService.updateOaTurnover(updateReqVO), OA_DIMISSION_NOT_EXISTS);
+//     }
+//
+//     @Test
+//     public void testDeleteOaTurnover_success() {
+//         // mock 数据
+//         OaTurnoverDO dbOaTurnover = randomPojo(OaTurnoverDO.class);
+//         oaTurnOverMapper.insert(dbOaTurnover);// @Sql: 先插入出一条存在的数据
+//         // 准备参数
+//         Long id = dbOaTurnover.getId();
+//
+//         // 调用
+//         oaTurnoverService.deleteOaTurnover(id);
+//        // 校验数据不存在了
+//        assertNull(oaTurnOverMapper.selectById(id));
+//     }
+//
+//     @Test
+//     public void testDeleteOaTurnover_notExists() {
+//         // 准备参数
+//         Long id = randomLongId();
+//
+//         // 调用, 并断言异常
+//         assertServiceException(() -> oaTurnoverService.deleteOaTurnover(id), OA_DIMISSION_NOT_EXISTS);
+//     }
+//
+//     @Test
+//     @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+//     public void testGetOaTurnoverPage() {
+//        // mock 数据
+//        OaTurnoverDO dbOaTurnover = randomPojo(OaTurnoverDO.class, o -> { // 等会查询到
+//            o.setTurnoverId(null);
+//            o.setEmployeeId(null);
+//            o.setEmployeeUuid(null);
+//            o.setEmployeeName(null);
+//            o.setUserId(null);
+//            o.setUserUuid(null);
+//            o.setDeptId(null);
+//            o.setDeptUuid(null);
+//            o.setPosition(null);
+//            o.setStartDate(null);
+//            o.setTurnoverDate(null);
+//            o.setTurnoverReason(null);
+//            o.setRemarks(null);
+//            o.setProcInstId(null);
+//            o.setAuditStatus(null);
+//            o.setCurrentAuditUserId(null);
+//            o.setCurrentAuditUserUuid(null);
+//            o.setCurrentAuditEmployeeId(null);
+//            o.setCurrentAuditEmployeeUuid(null);
+//            o.setFinalAuditDate(null);
+//            o.setInfoSource(null);
+//            o.setCreateTime(null);
+//        });
+//        oaTurnOverMapper.insert(dbOaTurnover);
+//        // 测试 dimissionId 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setTurnoverId(null)));
+//        // 测试 employeeId 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setEmployeeId(null)));
+//        // 测试 employeeUuid 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setEmployeeUuid(null)));
+//        // 测试 employeeName 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setEmployeeName(null)));
+//        // 测试 userId 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setUserId(null)));
+//        // 测试 userUuid 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setUserUuid(null)));
+//        // 测试 deptId 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setDeptId(null)));
+//        // 测试 deptUuid 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setDeptUuid(null)));
+//        // 测试 position 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setPosition(null)));
+//        // 测试 startDate 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setStartDate(null)));
+//        // 测试 dimissionDate 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setTurnoverDate(null)));
+//        // 测试 dimissionReason 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setTurnoverReason(null)));
+//        // 测试 remarks 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setRemarks(null)));
+//        // 测试 procInstId 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setProcInstId(null)));
+//        // 测试 auditStatus 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setAuditStatus(null)));
+//        // 测试 currentAuditUserId 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setCurrentAuditUserId(null)));
+//        // 测试 currentAuditUserUuid 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setCurrentAuditUserUuid(null)));
+//        // 测试 currentAuditEmployeeId 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setCurrentAuditEmployeeId(null)));
+//        // 测试 currentAuditEmployeeUuid 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setCurrentAuditEmployeeUuid(null)));
+//        // 测试 finalAuditDate 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setFinalAuditDate(null)));
+//        // 测试 infoSource 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setInfoSource(null)));
+//        // 测试 createTime 不匹配
+//        oaTurnOverMapper.insert(cloneIgnoreId(dbOaTurnover, o -> o.setCreateTime(null)));
+//        // 准备参数
+//        OaTurnoverPageReqVO reqVO = new OaTurnoverPageReqVO();
+//        reqVO.setTurnoverId(null);
+//        reqVO.setEmployeeId(null);
+//        reqVO.setEmployeeUuid(null);
+//        reqVO.setEmployeeName(null);
+//        reqVO.setUserId(null);
+//        reqVO.setUserUuid(null);
+//        reqVO.setDeptId(null);
+//        reqVO.setDeptUuid(null);
+//        reqVO.setPosition(null);
+//        reqVO.setStartDate(null);
+//        reqVO.setTurnoverDate(null);
+//        reqVO.setTurnoverReason(null);
+//        reqVO.setRemarks(null);
+//        reqVO.setProcInstId(null);
+//        reqVO.setAuditStatus(null);
+//        reqVO.setCurrentAuditUserId(null);
+//        reqVO.setCurrentAuditUserUuid(null);
+//        reqVO.setCurrentAuditEmployeeId(null);
+//        reqVO.setCurrentAuditEmployeeUuid(null);
+//        reqVO.setFinalAuditDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+//        reqVO.setInfoSource(null);
+//        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+//
+//        // 调用
+//        PageResult<OaTurnoverDO> pageResult = oaTurnoverService.getOaTurnoverPage(reqVO);
+//        // 断言
+//        assertEquals(1, pageResult.getTotal());
+//        assertEquals(1, pageResult.getList().size());
+//        assertPojoEquals(dbOaTurnover, pageResult.getList().get(0));
+//     }
+//
+// }

+ 1 - 1
yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java

@@ -18,7 +18,7 @@ public class DefaultController {
     @RequestMapping("/admin-api/bpm/**")
     @RequestMapping("/admin-api/bpm/**")
     public CommonResult<Boolean> bpm404() {
     public CommonResult<Boolean> bpm404() {
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
-                "[工作流模块 yudao-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]");
+                "[路径不存在或工作流模块 yudao-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]");
     }
     }
 
 
     @RequestMapping("/admin-api/mp/**")
     @RequestMapping("/admin-api/mp/**")

+ 1 - 0
yudao-server/src/main/resources/application-local.yaml

@@ -177,6 +177,7 @@ logging:
     cn.iocoder.yudao.module.holiday.dal.mysql: debug
     cn.iocoder.yudao.module.holiday.dal.mysql: debug
     cn.iocoder.yudao.module.attendance.dal.mysql: debug
     cn.iocoder.yudao.module.attendance.dal.mysql: debug
     org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
     org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+#    org.flowable: debug
 
 
 debug: false
 debug: false