diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmFlowInstanceController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmFlowInstanceController.java index d043efd..8190c54 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmFlowInstanceController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmFlowInstanceController.java @@ -79,4 +79,10 @@ public class HrmFlowInstanceController extends BaseController { public R revoke(@PathVariable @NotNull Long instId) { return toAjax(service.revokeInstance(instId)); } + + @Log(title = "删除驳回实例", businessType = BusinessType.DELETE) + @DeleteMapping("/deleteRejected/{instId}") + public R deleteRejectedInstance(@PathVariable @NotNull Long instId) { + return toAjax(service.deleteRejectedInstance(instId)); + } } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmFlowInstanceService.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmFlowInstanceService.java index 89bc8af..286fa55 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmFlowInstanceService.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmFlowInstanceService.java @@ -5,6 +5,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.hrm.domain.bo.HrmFlowInstanceBo; import com.ruoyi.hrm.domain.vo.HrmFlowInstanceVo; +import javax.validation.constraints.NotNull; import java.util.Collection; import java.util.List; @@ -38,4 +39,6 @@ public interface IHrmFlowInstanceService { * @return 是否成功 */ Boolean revokeInstance(Long instId); + + Boolean deleteRejectedInstance(@NotNull Long instId); } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowInstanceServiceImpl.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowInstanceServiceImpl.java index 707412c..661d9fe 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowInstanceServiceImpl.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowInstanceServiceImpl.java @@ -82,9 +82,9 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService { // 有模板:找首节点 HrmFlowNode firstNode = nodeMapper.selectOne(Wrappers.lambdaQuery() - .eq(HrmFlowNode::getTplId, bo.getTplId()) - .orderByAsc(HrmFlowNode::getOrderNo) - .last("limit 1")); + .eq(HrmFlowNode::getTplId, bo.getTplId()) + .orderByAsc(HrmFlowNode::getOrderNo) + .last("limit 1")); if (firstNode == null) { throw new RuntimeException("流程模板无节点,无法启动"); } @@ -182,8 +182,8 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService { // 检查所有相关任务状态 List tasks = taskMapper.selectList(Wrappers.lambdaQuery() - .eq(HrmFlowTask::getInstId, instId) - .eq(HrmFlowTask::getDelFlag, 0)); // 未删除的任务 + .eq(HrmFlowTask::getInstId, instId) + .eq(HrmFlowTask::getDelFlag, 0)); // 未删除的任务 for (HrmFlowTask task : tasks) { if (!"pending".equals(task.getStatus())) { throw new RuntimeException("存在非待办状态的任务,无法撤销"); @@ -207,6 +207,28 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService { return true; } + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteRejectedInstance(Long instId) { + // 查询实例 + HrmFlowInstance instance = baseMapper.selectById(instId); + if (instance == null) { + throw new RuntimeException("未找到对应的流程实例"); + } + + // 判断实例状态是否为驳回 + if (!"rejected".equals(instance.getStatus())) { + throw new RuntimeException("只有驳回状态的实例才能被删除"); + } + + // 删除实例及对应的任务 + // 先删除关联的任务 + taskMapper.delete(Wrappers.lambdaQuery().eq(HrmFlowTask::getInstId, instId)); + + // 再删除实例本身 + return baseMapper.deleteById(instId) > 0; + } + private LambdaQueryWrapper buildQueryWrapper(HrmFlowInstanceBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getInstId() != null, HrmFlowInstance::getInstId, bo.getInstId()); diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowTaskServiceImpl.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowTaskServiceImpl.java index 7268a2f..cad19f7 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowTaskServiceImpl.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowTaskServiceImpl.java @@ -295,7 +295,7 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { reTask.setNodeId(0L); reTask.setBizType(inst.getBizType()); reTask.setBizId(inst.getBizId()); - // 撤回后回到“原审批人”(撤回前的办理人) + // 撤回后回到"原审批人"(撤回前的办理人) reTask.setAssigneeUserId(task.getAssigneeUserId()); reTask.setStatus("pending"); baseMapper.insert(reTask); @@ -358,7 +358,7 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { @Override public HrmFlowTaskVo queryTodoByBiz(String bizType, Long bizId, Long assigneeUserId) { - // 只取“待办 pending”的一条(理论上同一 biz 同一时刻最多一条待办) + // 只取"待办 pending"的一条(理论上同一 biz 同一时刻最多一条待办) LambdaQueryWrapper lqw = Wrappers.lambdaQuery() .eq(bizType != null, HrmFlowTask::getBizType, bizType) .eq(bizId != null, HrmFlowTask::getBizId, bizId) @@ -367,7 +367,9 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { .orderByDesc(HrmFlowTask::getTaskId) .last("limit 1"); HrmFlowTaskVo hrmFlowTaskVo = baseMapper.selectVoOne(lqw); - hrmFlowTaskVo.setAssigneeNickName(userService.selectNickNameById(hrmFlowTaskVo.getAssigneeUserId())); + if (hrmFlowTaskVo != null) { + hrmFlowTaskVo.setAssigneeNickName(userService.selectNickNameById(hrmFlowTaskVo.getAssigneeUserId())); + } return hrmFlowTaskVo; }