feat: 新增按状态批量删除链接功能

主要修改:
1. 在LinkController中新增按状态批量删除链接的接口,允许用户根据指定状态批量删除自己创建的链接。
2. 在LinkStatusService中实现批量删除逻辑,确保用户只能删除自己的链接,并进行状态验证。
3. 更新LinkTaskMapper和对应的XML文件,增加查询和删除链接任务的相关方法。

技术细节:
- 通过新增的批量删除功能,提升了用户对链接的管理能力,确保操作的安全性和有效性,同时优化了数据库操作的灵活性。
This commit is contained in:
zyh
2025-08-28 12:41:44 +08:00
parent 080c55059a
commit 0801394999
7 changed files with 455 additions and 0 deletions

View File

@@ -266,6 +266,93 @@ public class LinkStatusService {
}).subscribeOn(Schedulers.boundedElastic());
}
/**
* 按状态批量删除链接(确保用户只能删除自己的链接)
*/
@Transactional(rollbackFor = Exception.class)
public Mono<BatchDeleteResponse> batchDeleteLinksByStatus(List<String> statusList, Long agentId) {
return Mono.fromCallable(() -> {
log.info("开始按状态批量删除链接: statusList={}, agentId={}", statusList, agentId);
if (statusList == null || statusList.isEmpty()) {
throw new IllegalArgumentException("要删除的状态列表不能为空");
}
if (statusList.size() > 10) {
throw new IllegalArgumentException("单次最多只能指定10个状态");
}
// 验证状态值是否有效
List<String> validStatuses = List.of("NEW", "USING", "LOGGED_IN", "COMPLETED", "REFUNDED", "EXPIRED");
for (String status : statusList) {
if (!validStatuses.contains(status)) {
throw new IllegalArgumentException("无效的状态值: " + status);
}
}
// 统计要删除的链接数量
long totalCount = linkTaskMapper.countByStatusListAndAgentId(statusList, agentId);
log.info("用户拥有的指定状态链接数量: {}", totalCount);
if (totalCount == 0) {
// 没有符合条件的链接
BatchDeleteResponse response = new BatchDeleteResponse(0, 0, 0,
List.of(), List.of(), List.of());
log.info("没有找到符合条件的链接");
return response;
}
// 查询要删除的链接详情(用于记录日志)
List<LinkTask> linksToDelete = linkTaskMapper.findByStatusListAndAgentId(statusList, agentId);
List<String> codeNosToDelete = linksToDelete.stream()
.map(LinkTask::getCodeNo)
.collect(Collectors.toList());
log.info("即将删除的链接: {}", codeNosToDelete);
// 执行批量删除
int deleteCount = linkTaskMapper.batchDeleteByStatusListAndAgentId(statusList, agentId);
log.info("批量删除执行结果: 预期删除数量={}, 实际删除数量={}", totalCount, deleteCount);
// 构建响应
List<String> successCodeNos = new ArrayList<>();
List<String> failedCodeNos = new ArrayList<>();
List<String> failedReasons = new ArrayList<>();
if (deleteCount == totalCount) {
// 全部删除成功
successCodeNos.addAll(codeNosToDelete);
} else if (deleteCount > 0) {
// 部分删除成功(这种情况比较少见,可能是并发操作导致)
successCodeNos.addAll(codeNosToDelete.subList(0, deleteCount));
failedCodeNos.addAll(codeNosToDelete.subList(deleteCount, codeNosToDelete.size()));
for (int i = deleteCount; i < codeNosToDelete.size(); i++) {
failedReasons.add("删除操作部分失败");
}
} else {
// 全部删除失败
failedCodeNos.addAll(codeNosToDelete);
for (int i = 0; i < codeNosToDelete.size(); i++) {
failedReasons.add("删除操作失败");
}
}
BatchDeleteResponse response = new BatchDeleteResponse(
successCodeNos.size(),
failedCodeNos.size(),
codeNosToDelete.size(),
successCodeNos,
failedCodeNos,
failedReasons
);
log.info("按状态批量删除完成: 总数={}, 成功={}, 失败={}",
response.getTotalCount(), response.getSuccessCount(), response.getFailedCount());
return response;
}).subscribeOn(Schedulers.boundedElastic());
}
/**
* 批量删除链接(确保用户只能删除自己的链接)
*/