feat(flow): 添加驳回实例删除功能并优化代码结构

- 在HrmFlowInstanceController中新增deleteRejected接口用于删除驳回状态的流程实例
- 在HrmFlowInstanceService中实现deleteRejectedInstance方法,包含状态校验和级联删除逻辑
- 修复代码中的缩进格式问题,统一代码风格
- 优化HrmFlowTaskServiceImpl中查询待办任务的逻辑,避免空指针异常
- 更新注释中的引号格式,保持代码一致性
- 添加数据验证注解确保参数合法性
This commit is contained in:
2026-02-25 09:30:11 +08:00
parent 4855420c86
commit cb231cb998
4 changed files with 41 additions and 8 deletions

View File

@@ -79,4 +79,10 @@ public class HrmFlowInstanceController extends BaseController {
public R<Void> revoke(@PathVariable @NotNull Long instId) { public R<Void> revoke(@PathVariable @NotNull Long instId) {
return toAjax(service.revokeInstance(instId)); return toAjax(service.revokeInstance(instId));
} }
@Log(title = "删除驳回实例", businessType = BusinessType.DELETE)
@DeleteMapping("/deleteRejected/{instId}")
public R<Void> deleteRejectedInstance(@PathVariable @NotNull Long instId) {
return toAjax(service.deleteRejectedInstance(instId));
}
} }

View File

@@ -5,6 +5,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.hrm.domain.bo.HrmFlowInstanceBo; import com.ruoyi.hrm.domain.bo.HrmFlowInstanceBo;
import com.ruoyi.hrm.domain.vo.HrmFlowInstanceVo; import com.ruoyi.hrm.domain.vo.HrmFlowInstanceVo;
import javax.validation.constraints.NotNull;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@@ -38,4 +39,6 @@ public interface IHrmFlowInstanceService {
* @return 是否成功 * @return 是否成功
*/ */
Boolean revokeInstance(Long instId); Boolean revokeInstance(Long instId);
Boolean deleteRejectedInstance(@NotNull Long instId);
} }

View File

@@ -82,9 +82,9 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService {
// 有模板:找首节点 // 有模板:找首节点
HrmFlowNode firstNode = nodeMapper.selectOne(Wrappers.<HrmFlowNode>lambdaQuery() HrmFlowNode firstNode = nodeMapper.selectOne(Wrappers.<HrmFlowNode>lambdaQuery()
.eq(HrmFlowNode::getTplId, bo.getTplId()) .eq(HrmFlowNode::getTplId, bo.getTplId())
.orderByAsc(HrmFlowNode::getOrderNo) .orderByAsc(HrmFlowNode::getOrderNo)
.last("limit 1")); .last("limit 1"));
if (firstNode == null) { if (firstNode == null) {
throw new RuntimeException("流程模板无节点,无法启动"); throw new RuntimeException("流程模板无节点,无法启动");
} }
@@ -182,8 +182,8 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService {
// 检查所有相关任务状态 // 检查所有相关任务状态
List<HrmFlowTask> tasks = taskMapper.selectList(Wrappers.<HrmFlowTask>lambdaQuery() List<HrmFlowTask> tasks = taskMapper.selectList(Wrappers.<HrmFlowTask>lambdaQuery()
.eq(HrmFlowTask::getInstId, instId) .eq(HrmFlowTask::getInstId, instId)
.eq(HrmFlowTask::getDelFlag, 0)); // 未删除的任务 .eq(HrmFlowTask::getDelFlag, 0)); // 未删除的任务
for (HrmFlowTask task : tasks) { for (HrmFlowTask task : tasks) {
if (!"pending".equals(task.getStatus())) { if (!"pending".equals(task.getStatus())) {
throw new RuntimeException("存在非待办状态的任务,无法撤销"); throw new RuntimeException("存在非待办状态的任务,无法撤销");
@@ -207,6 +207,28 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService {
return true; 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.<HrmFlowTask>lambdaQuery().eq(HrmFlowTask::getInstId, instId));
// 再删除实例本身
return baseMapper.deleteById(instId) > 0;
}
private LambdaQueryWrapper<HrmFlowInstance> buildQueryWrapper(HrmFlowInstanceBo bo) { private LambdaQueryWrapper<HrmFlowInstance> buildQueryWrapper(HrmFlowInstanceBo bo) {
LambdaQueryWrapper<HrmFlowInstance> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<HrmFlowInstance> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getInstId() != null, HrmFlowInstance::getInstId, bo.getInstId()); lqw.eq(bo.getInstId() != null, HrmFlowInstance::getInstId, bo.getInstId());

View File

@@ -295,7 +295,7 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService {
reTask.setNodeId(0L); reTask.setNodeId(0L);
reTask.setBizType(inst.getBizType()); reTask.setBizType(inst.getBizType());
reTask.setBizId(inst.getBizId()); reTask.setBizId(inst.getBizId());
// 撤回后回到原审批人(撤回前的办理人) // 撤回后回到"原审批人"(撤回前的办理人)
reTask.setAssigneeUserId(task.getAssigneeUserId()); reTask.setAssigneeUserId(task.getAssigneeUserId());
reTask.setStatus("pending"); reTask.setStatus("pending");
baseMapper.insert(reTask); baseMapper.insert(reTask);
@@ -358,7 +358,7 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService {
@Override @Override
public HrmFlowTaskVo queryTodoByBiz(String bizType, Long bizId, Long assigneeUserId) { public HrmFlowTaskVo queryTodoByBiz(String bizType, Long bizId, Long assigneeUserId) {
// 只取待办 pending的一条(理论上同一 biz 同一时刻最多一条待办) // 只取"待办 pending"的一条(理论上同一 biz 同一时刻最多一条待办)
LambdaQueryWrapper<HrmFlowTask> lqw = Wrappers.<HrmFlowTask>lambdaQuery() LambdaQueryWrapper<HrmFlowTask> lqw = Wrappers.<HrmFlowTask>lambdaQuery()
.eq(bizType != null, HrmFlowTask::getBizType, bizType) .eq(bizType != null, HrmFlowTask::getBizType, bizType)
.eq(bizId != null, HrmFlowTask::getBizId, bizId) .eq(bizId != null, HrmFlowTask::getBizId, bizId)
@@ -367,7 +367,9 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService {
.orderByDesc(HrmFlowTask::getTaskId) .orderByDesc(HrmFlowTask::getTaskId)
.last("limit 1"); .last("limit 1");
HrmFlowTaskVo hrmFlowTaskVo = baseMapper.selectVoOne(lqw); HrmFlowTaskVo hrmFlowTaskVo = baseMapper.selectVoOne(lqw);
hrmFlowTaskVo.setAssigneeNickName(userService.selectNickNameById(hrmFlowTaskVo.getAssigneeUserId())); if (hrmFlowTaskVo != null) {
hrmFlowTaskVo.setAssigneeNickName(userService.selectNickNameById(hrmFlowTaskVo.getAssigneeUserId()));
}
return hrmFlowTaskVo; return hrmFlowTaskVo;
} }