Browse Source

通用事项流程接口调整

dongpo 1 year ago
parent
commit
0b2a42848c

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

@@ -54,6 +54,7 @@ public interface ErrorCodeConstants {
     ErrorCode TASK_TRANSFER_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_014, "任务转办失败,转办人不存在");
     ErrorCode TASK_REVOCATION_NO_ALLOWED = new ErrorCode(1_009_006_015, "操作失败,原因:只有已提交状态的流程才能由申请人撤回!");
     ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!");
+    ErrorCode TASK_CREATE_FAIL_NO_START_SELECT_ASSIGNEE = new ErrorCode(1_009_006_004, "操作失败,原因:请选择审批人!");
 
     // ========== 动态表单模块 1-009-010-000 ==========
     ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在");
@@ -83,7 +84,7 @@ public interface ErrorCodeConstants {
     ErrorCode TASK_ASSIGN_SCRIPT_NOT_EXISTS = new ErrorCode(1_009_006_004, "操作失败,原因:任务分配脚本({}) 不存在");
 
 
-
+    ErrorCode SERVICE_ID_NOT_EXISTS = new ErrorCode(1009011000, "业务单据ID不能为空");
     // ========== 入职流程信息 1-009-012-000 ==========
     ErrorCode OA_ENTRY_NOT_EXISTS = new ErrorCode(1009012000, "入职流程信息不存在");
 

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

@@ -1,8 +1,6 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.oa.universal;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
-import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -39,26 +37,24 @@ public class OaUniversalController {
     @Resource
     private OaUniversalService oaUniversalService;
 
-    @PostMapping("/commit")
-    @Operation(summary = "提交通用事项审批流程信息")
-    @ApiOperationSupport(order = 1)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:commit')")
-    public CommonResult<Long> commitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO commitReqVO) {
-        if (CollectionUtil.isEmpty(commitReqVO.getStartUserSelectAssignees())) {
-            return CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"请选择审批人");
-        }
-        Long oaUniversalId = oaUniversalService.commitOaUniversal(commitReqVO);
-        return success(oaUniversalId, "提交成功");
-    }
     @PostMapping("/staging")
     @Operation(summary = "暂存通用事项审批流程信息")
-    @ApiOperationSupport(order = 2)
+    @ApiOperationSupport(order = 1)
     @PreAuthorize("@ss.hasPermission('bpm:oa-universal:staging')")
     public CommonResult<Long> startOaUniversal(@RequestBody OaUniversalSaveReqVO stagingReqVO) {
         Long oaUniversalId = oaUniversalService.stagingOaUniversal(stagingReqVO);
         return success(oaUniversalId, "暂存成功");
     }
 
+    @PostMapping("/commit")
+    @Operation(summary = "提交通用事项审批流程信息")
+    @ApiOperationSupport(order = 2)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-universal:commit')")
+    public CommonResult<Long> commitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO commitReqVO) {
+        Long oaUniversalId = oaUniversalService.commitOaUniversal(commitReqVO);
+        return success(oaUniversalId, "提交成功");
+    }
+
     @PostMapping("/agree")
     @Operation(summary = "审批同意通用事项审批流程信息")
     @ApiOperationSupport(order = 3)
@@ -91,9 +87,6 @@ public class OaUniversalController {
     @ApiOperationSupport(order = 6)
     @PreAuthorize("@ss.hasPermission('bpm:oa-universal:re-commit')")
     public CommonResult<Long> reCommitOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO reCommitReqVO) {
-        if (reCommitReqVO.getId() == null) {
-            return CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "id不能为空");
-        }
         Long result = oaUniversalService.reCommitOaUniversal(reCommitReqVO);
         return success(result, "提交成功");
     }
@@ -103,30 +96,11 @@ public class OaUniversalController {
     @ApiOperationSupport(order = 7)
     @PreAuthorize("@ss.hasPermission('bpm:oa-entry:close')")
     public CommonResult<Long> updateCompleteOaUniversal(@RequestBody OaUniversalSaveReqVO closeReqVO) {
-        if (closeReqVO.getId() == null) {
-            return CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "id不能为空");
-        }
         Long result = oaUniversalService.closeOaUniversal(closeReqVO);
 
         return success(result, "关闭成功");
     }
 
-
-    // @PostMapping("/create")
-    // @Operation(summary = "创建通用事项审批流程信息")
-    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:create')")
-    // public CommonResult<Long> createOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO createReqVO) {
-    //     return success(oaUniversalService.createOaUniversal(createReqVO));
-    // }
-    //
-    // @PutMapping("/update")
-    // @Operation(summary = "更新通用事项审批流程信息")
-    // @PreAuthorize("@ss.hasPermission('bpm:oa-universal:update')")
-    // public CommonResult<Boolean> updateOaUniversal(@Valid @RequestBody OaUniversalSaveReqVO updateReqVO) {
-    //     oaUniversalService.updateOaUniversal(updateReqVO);
-    //     return success(true);
-    // }
-
     @DeleteMapping("/delete")
     @Operation(summary = "删除通用事项审批流程信息")
     @ApiOperationSupport(order = 8)

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

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

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

@@ -14,10 +14,10 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnRe
  */
 public interface OaUniversalService {
 
-    Long commitOaUniversal(OaUniversalSaveReqVO commitReqVO);
-
     Long stagingOaUniversal(OaUniversalSaveReqVO stagingReqVO);
 
+    Long commitOaUniversal(OaUniversalSaveReqVO commitReqVO);
+
     Long agreeOaUniversal(BpmTaskApproveReqVO agreeReqVO);
 
     Long disagreeOaUniversal(BpmTaskReturnReqVO disagreeReqVO);
@@ -28,42 +28,10 @@ public interface OaUniversalService {
 
     Long closeOaUniversal(OaUniversalSaveReqVO closeReqVO);
 
-    // /**
-    //  * 创建通用事项审批流程信息
-    //  *
-    //  * @param createReqVO 创建信息
-    //  * @return 编号
-    //  */
-    // Long createOaUniversal(@Valid OaUniversalSaveReqVO createReqVO);
-    //
-    // /**
-    //  * 更新通用事项审批流程信息
-    //  *
-    //  * @param updateReqVO 更新信息
-    //  */
-    // void updateOaUniversal(@Valid OaUniversalSaveReqVO updateReqVO);
-
-    /**
-     * 删除通用事项审批流程信息
-     *
-     * @param id 编号
-     */
     void deleteOaUniversal(Long id);
 
-    /**
-     * 获得通用事项审批流程信息
-     *
-     * @param id 编号
-     * @return 通用事项审批流程信息
-     */
     OaUniversalRespVO getOaUniversal(Long id);
 
-    /**
-     * 获得通用事项审批流程信息分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 通用事项审批流程信息分页
-     */
     PageResult<OaUniversalRespVO> getOaUniversalPage(OaUniversalPageReqVO pageReqVO);
 
     PageResult<OaUniversalRespVO> exportOaUniversalExcel(OaUniversalPageReqVO pageReqVO);

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

@@ -34,6 +34,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.TaskService;
 import org.flowable.task.api.Task;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
@@ -81,14 +82,15 @@ public class OaUniversalServiceImpl implements OaUniversalService {
     private DeptApi deptApi;
 
     @Override
-    public Long commitOaUniversal(OaUniversalSaveReqVO commitReqVO) {
+    @Transactional
+    public Long stagingOaUniversal(OaUniversalSaveReqVO stagingReqVO) {
         // 登录人信息
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
         Objects.requireNonNull(loginUser, "登录用户不能为空");
         // TODO DP 根据登录人查询出对应的员工信息
 
-        OaUniversalDO oaUniversal = BeanUtils.toBean(commitReqVO, OaUniversalDO.class);
+        OaUniversalDO oaUniversal = BeanUtils.toBean(stagingReqVO, OaUniversalDO.class);
         if (StringUtils.isBlank(oaUniversal.getUniversalId())) {
             // 创建单据uuid
             String uuid = IdUtil.fastSimpleUUID();
@@ -101,6 +103,7 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         oaUniversal.setPosition("员工职位");
         oaUniversal.setUserId(loginUser.getId());
         oaUniversal.setUserPhone(loginUser.getMobile());
+        oaUniversal.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_STAGING);
         oaUniversal.setInfoSource("0");
         // 保存或更新表单信息
         if (oaUniversal.getId() == null) {
@@ -108,46 +111,25 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         } else {
             oaUniversalMapper.updateById(oaUniversal);
         }
-        // 发起流程
-        Map<String, Object> processInstanceVariables = new HashMap<>();
-        processInstanceVariables.put("auditPass", "true");
-        // 添加审批人信息
-        Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
-        List<Long> selectAssignees = commitReqVO.getStartUserSelectAssignees();
-        startUserSelectAssignees.put("approver", selectAssignees);
-        String processInstanceId = processInstanceApi
-                .createProcessInstance(loginUser.getId(),
-                        new BpmProcessInstanceCreateReqDTO()
-                                .setProcessDefinitionKey(PROCESS_KEY)
-                                .setVariables(processInstanceVariables)
-                                .setBusinessKey(String.valueOf(oaUniversal.getId()))
-                                .setStartUserSelectAssignees(startUserSelectAssignees));
-
-        //获取下一个审批人
-        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
-        // 将工作流的流程实例ID、单据状态、最后一次审批时间、当前审批人更新到单据信息中
-        oaUniversalMapper.updateById(new OaUniversalDO()
-                .setId(oaUniversal.getId())
-                .setProcInstId(processInstanceId)
-                .setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
-                .setFinalAuditDate(LocalDateTime.now())
-                .setCurrentAuditEmployeeId(Long.valueOf(task.getAssignee()))
-                .setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(","))));
         // 保存业务uuid到附件中
-        saveFileList(commitReqVO.getFileIdList(), oaUniversal.getUniversalId());
-        // TODO DP 发送提交成功站内信
+        saveFileList(stagingReqVO.getFileIdList(), oaUniversal.getUniversalId());
+
         return oaUniversal.getId();
     }
 
     @Override
-    public Long stagingOaUniversal(OaUniversalSaveReqVO stagingReqVO) {
+    @Transactional
+    public Long commitOaUniversal(OaUniversalSaveReqVO commitReqVO) {
+        if (CollectionUtil.isEmpty(commitReqVO.getStartUserSelectAssignees())) {
+            throw exception(ErrorCodeConstants.TASK_CREATE_FAIL_NO_START_SELECT_ASSIGNEE);
+        }
         // 登录人信息
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
         Objects.requireNonNull(loginUser, "登录用户不能为空");
         // TODO DP 根据登录人查询出对应的员工信息
 
-        OaUniversalDO oaUniversal = BeanUtils.toBean(stagingReqVO, OaUniversalDO.class);
+        OaUniversalDO oaUniversal = BeanUtils.toBean(commitReqVO, OaUniversalDO.class);
         if (StringUtils.isBlank(oaUniversal.getUniversalId())) {
             // 创建单据uuid
             String uuid = IdUtil.fastSimpleUUID();
@@ -160,7 +142,6 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         oaUniversal.setPosition("员工职位");
         oaUniversal.setUserId(loginUser.getId());
         oaUniversal.setUserPhone(loginUser.getMobile());
-        oaUniversal.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_STAGING);
         oaUniversal.setInfoSource("0");
         // 保存或更新表单信息
         if (oaUniversal.getId() == null) {
@@ -168,39 +149,91 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         } else {
             oaUniversalMapper.updateById(oaUniversal);
         }
-        // 保存业务uuid到附件中
-        saveFileList(stagingReqVO.getFileIdList(), oaUniversal.getUniversalId());
+        // 发起流程
+        Map<String, Object> processInstanceVariables = new HashMap<>();
+        processInstanceVariables.put("auditPass", "true");
+        // 添加审批人信息
+        Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
+        List<Long> selectAssignees = commitReqVO.getStartUserSelectAssignees();
+        startUserSelectAssignees.put("approver", selectAssignees);
+        String processInstanceId = processInstanceApi
+                .createProcessInstance(loginUser.getId(),
+                        new BpmProcessInstanceCreateReqDTO()
+                                .setProcessDefinitionKey(PROCESS_KEY)
+                                .setVariables(processInstanceVariables)
+                                .setBusinessKey(String.valueOf(oaUniversal.getId()))
+                                .setStartUserSelectAssignees(startUserSelectAssignees));
 
+        //获取下一个审批人
+        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+
+        // 审批同意
+        BpmTaskApproveReqVO agreeReqVO = new BpmTaskApproveReqVO();
+        agreeReqVO.setId(task.getId());
+        agreeReqVO.setReason("[首次提交]");
+        taskService.setVariable(task.getId(), "auditPass", "true");
+        bpmTaskService.approveTask(loginUserId, agreeReqVO);
+
+        Task nextTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
+        if (nextTask == null) {
+            throw exception(ErrorCodeConstants.TASK_CREATE_FAIL_NO_START_SELECT_ASSIGNEE);
+        }
+
+        // 将工作流的流程实例ID、单据状态、最后一次审批时间、当前审批人更新到单据信息中
+        oaUniversalMapper.updateById(new OaUniversalDO()
+                .setId(oaUniversal.getId())
+                .setProcInstId(processInstanceId)
+                .setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_COMMITTED)
+                .setFinalAuditDate(LocalDateTime.now())
+                .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
+                .setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(","))));
+        // 保存业务uuid到附件中
+        saveFileList(commitReqVO.getFileIdList(), oaUniversal.getUniversalId());
+        // TODO DP 发送提交成功站内信
         return oaUniversal.getId();
     }
 
     @Override
+    @Transactional
     public Long agreeOaUniversal(BpmTaskApproveReqVO agreeReqVO) {
         // 登录人信息
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         // TODO DP 根据登录人查询出对应的员工信息
 
         Task currentTask = bpmTaskService.getTask(agreeReqVO.getId());
+        if (currentTask == null) {
+            throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
+        }
+        LambdaQueryWrapper<OaUniversalDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
+        OaUniversalDO oaUniversal = oaUniversalMapper.selectOne(lambdaQueryWrapper);
         // 审批同意
-        agreeReqVO.setReason("[同意]" + agreeReqVO.getReason());
+        String reason = "[同意]";
+        if (StrUtil.isNotBlank(agreeReqVO.getReason())) {
+            reason = reason + agreeReqVO.getReason();
+        }
+        agreeReqVO.setReason(reason);
+        taskService.setVariable(agreeReqVO.getId(), "auditPass", "true");
         bpmTaskService.approveTask(loginUserId, agreeReqVO);
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
+        OaUniversalDO oaUniversalDO = new OaUniversalDO();
         if (nextTask != null) {
-            LambdaUpdateWrapper<OaUniversalDO> updateWrapper = new LambdaUpdateWrapper<>();
-            updateWrapper.set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_AUDITING)
-                    .set(OaUniversalDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
-                    .set(OaUniversalDO::getFinalAuditDate, LocalDateTime.now());
-            oaUniversalMapper.update(updateWrapper);
+            oaUniversalDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITING)
+                    .setCurrentAuditEmployeeId(Long.valueOf(nextTask.getAssignee()))
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaUniversal.getId());
+
         } else {
-            LambdaUpdateWrapper<OaUniversalDO> updateWrapper = new LambdaUpdateWrapper<>();
-            updateWrapper.set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_AUDITED)
-                    .set(OaUniversalDO::getCurrentAuditEmployeeId, null)
-                    .set(OaUniversalDO::getFinalAuditDate, new Date());
-            oaUniversalMapper.update(updateWrapper);
+            oaUniversalDO.setAuditStatus(DictDataConstants.OA_AUDIT_STATUS_AUDITED)
+                    .setCurrentAuditEmployeeId(null)
+                    .setFinalAuditDate(LocalDateTime.now())
+                    .setId(oaUniversal.getId());
 
             // TODO 复制业务单据信息到业务模块单据表
+
         }
+        oaUniversalMapper.updateById(oaUniversalDO);
         // 发送通知
 
         // 返回
@@ -208,6 +241,7 @@ public class OaUniversalServiceImpl implements OaUniversalService {
     }
 
     @Override
+    @Transactional
     public Long disagreeOaUniversal(BpmTaskReturnReqVO disagreeReqVO) {
         // 登录人信息
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
@@ -217,6 +251,7 @@ public class OaUniversalServiceImpl implements OaUniversalService {
 
         disagreeReqVO.setTargetTaskDefinitionKey("modifyApply");
         disagreeReqVO.setReason("[驳回]" + disagreeReqVO.getReason());
+        taskService.setVariable(disagreeReqVO.getId(), "auditPass", "false");
         bpmTaskService.returnTask(loginUserId, disagreeReqVO);
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
@@ -225,7 +260,8 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         LambdaUpdateWrapper<OaUniversalDO> updateWrapper = new LambdaUpdateWrapper<>();
         updateWrapper.set(OaUniversalDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
                 .set(OaUniversalDO::getFinalAuditDate, LocalDateTime.now())
-                .set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RETURNED);
+                .set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RETURNED)
+                .eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
         oaUniversalMapper.update(updateWrapper);
 
         // 发送通知
@@ -234,6 +270,7 @@ public class OaUniversalServiceImpl implements OaUniversalService {
     }
 
     @Override
+    @Transactional
     public Long revocationOaUniversal(BpmTaskApproveReqVO revocationReqVO) {
         // 登录人信息
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
@@ -253,7 +290,11 @@ public class OaUniversalServiceImpl implements OaUniversalService {
 
         BpmTaskReturnReqVO returnReqVO = BeanUtils.toBean(revocationReqVO, BpmTaskReturnReqVO.class);
         returnReqVO.setTargetTaskDefinitionKey("modifyApply");
-        returnReqVO.setReason("[撤回]" + returnReqVO.getReason());
+        String reason = "[撤回]";
+        if (StrUtil.isNotBlank(returnReqVO.getReason())) {
+            reason = reason + returnReqVO.getReason();
+        }
+        returnReqVO.setReason(reason);
         bpmTaskService.revocationTask(loginUserId, returnReqVO);
 
         Task nextTask = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).singleResult();
@@ -262,7 +303,8 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         LambdaUpdateWrapper<OaUniversalDO> updateWrapper = new LambdaUpdateWrapper<>();
         updateWrapper.set(OaUniversalDO::getCurrentAuditEmployeeId, nextTask.getAssignee())
                 .set(OaUniversalDO::getFinalAuditDate, LocalDateTime.now())
-                .set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RECALLED);
+                .set(OaUniversalDO::getAuditStatus, DictDataConstants.OA_AUDIT_STATUS_RECALLED)
+                .eq(OaUniversalDO::getProcInstId, currentTask.getProcessInstanceId());
         oaUniversalMapper.update(updateWrapper);
 
         // 发送通知
@@ -271,24 +313,32 @@ public class OaUniversalServiceImpl implements OaUniversalService {
     }
 
     @Override
+    @Transactional
     public Long reCommitOaUniversal(OaUniversalSaveReqVO reCommitReqVO) {
+        if (reCommitReqVO.getId() == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
         // 登录人信息
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         // TODO DP 根据登录人查询出对应的员工信息
 
         OaUniversalDO oaUniversalNew = BeanUtils.toBean(reCommitReqVO, OaUniversalDO.class);
         OaUniversalDO oaUniversalOld = oaUniversalMapper.selectById(oaUniversalNew.getId());
+        oaUniversalNew.setUniversalId(oaUniversalOld.getUniversalId())
+                .setProcInstId(oaUniversalOld.getProcInstId());
 
-        Task currentTask = taskService.createTaskQuery().processInstanceId(oaUniversalOld.getProcInstId()).singleResult();
+        Task currentTask = taskService.createTaskQuery().processInstanceId(oaUniversalNew.getProcInstId()).singleResult();
         BpmTaskApproveReqVO approveReqVO = new BpmTaskApproveReqVO();
         approveReqVO.setId(currentTask.getId())
                 .setReason("[再次提交]");
         if (CollectionUtil.isNotEmpty(reCommitReqVO.getStartUserSelectAssignees())) {
-            // 添加审批人信息
+            // 添加审批人信息到流程参数中
             Map<String, List<Long>> startUserSelectAssignees = new HashMap<>();
             List<Long> selectAssignees = reCommitReqVO.getStartUserSelectAssignees();
             startUserSelectAssignees.put("approver", selectAssignees);
             taskService.setVariable(currentTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees);
+            // 保存审批人信息
+            oaUniversalNew.setStartUserSelectAssignees(selectAssignees.stream().map(String::valueOf).collect(Collectors.joining(",")));
         }
         taskService.setVariable(currentTask.getId(), "auditPass", "true");
         // 再次提交,和审批通过逻辑相同
@@ -301,13 +351,17 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         oaUniversalMapper.updateById(oaUniversalNew);
 
         // 保存业务uuid到附件中
-        saveFileList(reCommitReqVO.getFileIdList(), oaUniversalOld.getUniversalId());
+        saveFileList(reCommitReqVO.getFileIdList(), oaUniversalNew.getUniversalId());
 
         return 1L;
     }
 
     @Override
+    @Transactional
     public Long closeOaUniversal(OaUniversalSaveReqVO closeReqVO) {
+        if (closeReqVO.getId() == null) {
+            throw exception(ErrorCodeConstants.SERVICE_ID_NOT_EXISTS);
+        }
         // 登录人信息
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         // TODO DP 根据登录人查询出对应的员工信息
@@ -331,24 +385,6 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         return 1L;
     }
 
-    // @Override
-    // public Long createOaUniversal(OaUniversalSaveReqVO createReqVO) {
-    //     // 插入
-    //     OaUniversalDO oaUniversal = BeanUtils.toBean(createReqVO, OaUniversalDO.class);
-    //     oaUniversalMapper.insert(oaUniversal);
-    //     // 返回
-    //     return oaUniversal.getId();
-    // }
-    //
-    // @Override
-    // public void updateOaUniversal(OaUniversalSaveReqVO updateReqVO) {
-    //     // 校验存在
-    //     validateOaUniversalExists(updateReqVO.getId());
-    //     // 更新
-    //     OaUniversalDO updateObj = BeanUtils.toBean(updateReqVO, OaUniversalDO.class);
-    //     oaUniversalMapper.updateById(updateObj);
-    // }
-
     @Override
     public void deleteOaUniversal(Long id) {
         // 校验存在
@@ -357,12 +393,6 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         oaUniversalMapper.deleteById(id);
     }
 
-    private void validateOaUniversalExists(Long id) {
-        if (oaUniversalMapper.selectById(id) == null) {
-            throw exception(OA_UNIVERSAL_NOT_EXISTS);
-        }
-    }
-
     @Override
     public OaUniversalRespVO getOaUniversal(Long id) {
         OaUniversalDO oaUniversalDO = oaUniversalMapper.selectById(id);
@@ -436,6 +466,12 @@ public class OaUniversalServiceImpl implements OaUniversalService {
         return getOaUniversalPage(pageReqVO);
     }
 
+    private void validateOaUniversalExists(Long id) {
+        if (oaUniversalMapper.selectById(id) == null) {
+            throw exception(OA_UNIVERSAL_NOT_EXISTS);
+        }
+    }
+
     /**
      * 保存业务uuid到附件中
      */