package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.account.api.model.TAppUserWhitelist; import com.ruoyi.account.api.model.TChargingCard; import com.ruoyi.account.api.model.TVinManagement; import com.ruoyi.account.mapper.TAppUserWhitelistMapper; import com.ruoyi.account.mapper.TChargingCardMapper; import com.ruoyi.account.mapper.TVinManagementMapper; import com.ruoyi.account.service.FleetUnbindService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** *

* 车队解绑服务实现(内部链路:other 服务删除车队时触发,无管理端用户上下文) *

* * @author mxcd * @since 2026-09-29 */ @Service public class FleetUnbindServiceImpl implements FleetUnbindService { @Resource private TVinManagementMapper vinManagementMapper; @Resource private TChargingCardMapper chargingCardMapper; @Resource private TAppUserWhitelistMapper appUserWhitelistMapper; @Override @Transactional(rollbackFor = Exception.class) public int unbindByFleetIds(List fleetIds) { List distinct = normalize(fleetIds); if (distinct.isEmpty()) { return 0; } LocalDateTime now = LocalDateTime.now(); int total = 0; // 三表均在单事务内执行,任一失败整体回滚(调用方按失败中止车队删除,两侧数据保持一致) // 显式 set null 清空车队归属(MyBatis-Plus 字段策略会忽略实体 null,需走 UpdateWrapper) total += vinManagementMapper.update(null, new LambdaUpdateWrapper() .in(TVinManagement::getFleetId, distinct) .set(TVinManagement::getFleetId, null) .set(TVinManagement::getUpdateTime, now)); total += chargingCardMapper.update(null, new LambdaUpdateWrapper() .in(TChargingCard::getFleetId, distinct) .set(TChargingCard::getFleetId, null) .set(TChargingCard::getUpdateTime, now)); // 白名单实体无 updateTime 映射字段(表有 update_time 列),沿用现有解绑实现走 setSql total += appUserWhitelistMapper.update(null, new LambdaUpdateWrapper() .in(TAppUserWhitelist::getFleetId, distinct) .set(TAppUserWhitelist::getFleetId, null) .setSql("update_time = now()")); return total; } private List normalize(List fleetIds) { if (fleetIds == null || fleetIds.isEmpty()) { return Collections.emptyList(); } return fleetIds.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList()); } }