feat: 新增按状态批量删除链接功能
主要修改: 1. 在LinkController中新增按状态批量删除链接的接口,允许用户根据指定状态批量删除自己创建的链接。 2. 在LinkStatusService中实现批量删除逻辑,确保用户只能删除自己的链接,并进行状态验证。 3. 更新LinkTaskMapper和对应的XML文件,增加查询和删除链接任务的相关方法。 技术细节: - 通过新增的批量删除功能,提升了用户对链接的管理能力,确保操作的安全性和有效性,同时优化了数据库操作的灵活性。
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除链接(确保用户只能删除自己的链接)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user