feat(flow): 添加流程实例撤销功能

- 在控制器中新增撤销申请接口 /revoke/{instId}
- 实现服务层撤销逻辑,检查实例和任务状态
- 验证只有运行中的实例且所有任务都为待办状态时才允许撤销
- 更新实例和相关任务的状态为已撤销
- 添加事务管理确保数据一致性
- 完善接口文档注释说明撤销条件和返回值
This commit is contained in:
2026-02-24 15:21:37 +08:00
parent 4447fb1cb1
commit 4855420c86
3 changed files with 49 additions and 0 deletions

View File

@@ -73,4 +73,10 @@ public class HrmFlowInstanceController extends BaseController {
public R<List<HrmFlowInstanceVo>> all(HrmFlowInstanceBo bo) {
return R.ok(service.queryList(bo));
}
@Log(title = "撤销申请", businessType = BusinessType.UPDATE)
@PutMapping("/revoke/{instId}")
public R<Void> revoke(@PathVariable @NotNull Long instId) {
return toAjax(service.revokeInstance(instId));
}
}

View File

@@ -31,4 +31,11 @@ public interface IHrmFlowInstanceService {
Boolean updateByBo(HrmFlowInstanceBo bo);
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 撤销申请只有instance和所有相关task都是审批中状态时才能撤销
* @param instId 实例ID
* @return 是否成功
*/
Boolean revokeInstance(Long instId);
}

View File

@@ -171,6 +171,42 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService {
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean revokeInstance(Long instId) {
// 查询实例
HrmFlowInstance instance = baseMapper.selectById(instId);
if (instance == null || !"running".equals(instance.getStatus())) {
throw new RuntimeException("实例不存在或状态不允许撤销");
}
// 检查所有相关任务状态
List<HrmFlowTask> tasks = taskMapper.selectList(Wrappers.<HrmFlowTask>lambdaQuery()
.eq(HrmFlowTask::getInstId, instId)
.eq(HrmFlowTask::getDelFlag, 0)); // 未删除的任务
for (HrmFlowTask task : tasks) {
if (!"pending".equals(task.getStatus())) {
throw new RuntimeException("存在非待办状态的任务,无法撤销");
}
}
// 更新实例状态
HrmFlowInstance updateInstance = new HrmFlowInstance();
updateInstance.setInstId(instId);
updateInstance.setStatus("revoked");
baseMapper.updateById(updateInstance);
// 更新所有任务状态
for (HrmFlowTask task : tasks) {
HrmFlowTask updateTask = new HrmFlowTask();
updateTask.setTaskId(task.getTaskId());
updateTask.setStatus("revoked");
taskMapper.updateById(updateTask);
}
return true;
}
private LambdaQueryWrapper<HrmFlowInstance> buildQueryWrapper(HrmFlowInstanceBo bo) {
LambdaQueryWrapper<HrmFlowInstance> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getInstId() != null, HrmFlowInstance::getInstId, bo.getInstId());