问题描述:
@Transactional 注解影响范围:
风险场景:
// 当前代码:没有事务保护
storeUser.setLogoutFlag(0);
storeUserMapper.updateById(storeUser); // 如果这里失败
storeInfoMapper.deleteById(storeInfo.getId()); // 店铺已删除,但用户状态未更新
建议修复:
@Transactional(rollbackFor = Exception.class)
public void cancellationOfBusinessJob() {
// 删除逻辑
}
问题描述:
影响范围:
风险场景:
// 当前代码:没有异常处理
for (StoreInfo storeInfo : storeInfos) {
// 如果这里抛出异常,整个循环中断
storeInfoMapper.deleteById(storeInfo.getId());
}
建议修复:
for (StoreInfo storeInfo : storeInfos) {
try {
// 删除逻辑
} catch (Exception e) {
log.error("删除店铺失败: storeId={}, error={}", storeInfo.getId(), e.getMessage(), e);
// 继续处理下一个店铺
}
}
问题描述:
影响范围:
建议修复:
参考 MerchantUserServiceImpl.resetToInitialStatus 的完整清理逻辑,补充以下清理:
// 1. 清理Redis地理位置
nearMeService.removeGeolocation(Boolean.TRUE, storeInfo.getId().toString());
// 2. 清理订单数据(根据业务需求决定是否物理删除)
// 3. 清理优惠券数据
// 4. 清理店铺图片
// 5. 清理评论数据
// 6. 清理通知消息
问题描述:
cancelLogoutStore 方法没有检查是否超过7天影响范围:
NullPointerException 或其他异常当前代码:
public void cancelLogoutStore(StoreInfoVo storeInfo) {
StoreInfo storeIn = storeInfoMapper.selectOne(...);
// 没有检查 storeIn 是否为 null
// 没有检查是否超过7天
storeIn.setLogoutFlag(0);
// ...
}
建议修复:
public void cancelLogoutStore(StoreInfoVo storeInfo) {
StoreInfo storeIn = storeInfoMapper.selectOne(...);
if (storeIn == null) {
throw new BusinessException("店铺不存在或已被删除");
}
// 检查是否超过7天
if (storeIn.getLogoutTime() != null) {
Date logoutTime = storeIn.getLogoutTime();
Calendar calendar = Calendar.getInstance();
calendar.setTime(logoutTime);
calendar.add(Calendar.DAY_OF_YEAR, 7);
if (new Date().after(calendar.getTime())) {
throw new BusinessException("已超过7天冷静期,无法取消注销");
}
}
// 取消注销逻辑
}
问题描述:
影响范围:
deleteById 是幂等的,但清理操作可能重复执行建议修复:
@XxlJob("cancellationOfBusinessJob")
public void cancellationOfBusinessJob() {
String lockKey = "job:cancellationOfBusinessJob";
String lockValue = baseRedisService.lock(lockKey, 300000, 10000); // 5分钟锁,10秒超时
if (lockValue == null) {
log.warn("获取分布式锁失败,跳过本次执行");
return;
}
try {
// 删除逻辑
} finally {
baseRedisService.unlock(lockKey, lockValue);
}
}
问题描述:
Date 和 Calendar 进行时间比较影响范围:
建议修复:
使用 LocalDateTime 或 Instant 进行时间计算,更精确:
LocalDateTime logoutTime = storeInfo.getLogoutTime().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
LocalDateTime sevenDaysLater = logoutTime.plusDays(7);
LocalDateTime now = LocalDateTime.now();
if (now.isAfter(sevenDaysLater) || now.isEqual(sevenDaysLater)) {
// 删除逻辑
}
问题描述:
建议修复:
log.info("开始删除店铺: storeId={}, storeName={}, logoutTime={}, relatedUsers={}",
storeInfo.getId(), storeInfo.getStoreName(), logoutTime, relatedStoreUsers.size());
// ... 删除操作
log.info("店铺删除完成: storeId={}, deletedUsers={}, deletedFans={}",
storeInfo.getId(), deletedUsers, deletedFans);
| 优先级 | 风险项 | 影响 | 修复难度 |
|---|---|---|---|
| P0 | 事务性问题 | 数据不一致 | 低 |
| P0 | 异常处理缺失 | 任务中断 | 低 |
| P1 | 关联数据清理不完整 | 数据冗余 | 中 |
| P1 | 取消注销逻辑不完善 | 用户体验 | 低 |
| P2 | 并发安全问题 | 重复执行 | 中 |
| P3 | 时间精度问题 | 边界情况 | 低 |
| P3 | 日志记录不完整 | 问题排查 | 低 |
单元测试:
集成测试:
压力测试:
定时任务监控:
数据一致性监控:
logoutFlag=1 且超过7天的店铺数量告警设置: