package com.xiaopeng.operation.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.common.core.constant.CacheConstants; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.operation.mapper.XpRegionMapper; import com.xiaopeng.api.model.operation.XpRegion; import com.xiaopeng.operation.service.XpRegionService; import com.xiaopeng.operation.vo.RegionDistrictSyncResultVO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** *

* 省市区三级联动 服务实现类 *

* * @author liu * @since 2026-02-03 */ @Service public class XpRegionServiceImpl extends ServiceImpl implements XpRegionService { @Resource private RedisService redisService; @Override public List> getXpRegion() { // 缓存数据 List cacheList = redisService.getCacheList(CacheConstants.XP_REGION); if (cacheList != null && !cacheList.isEmpty()) { try { return cacheList.stream() .filter(obj -> obj instanceof List) .map(obj -> { List list = (List) obj; return list.stream() .filter(item -> item instanceof XpRegion) .map(item -> (XpRegion) item) .collect(Collectors.toList()); }) .collect(Collectors.toList()); } catch (ClassCastException e) { // 缓存数据结构异常,重新加载 redisService.deleteObject(CacheConstants.XP_REGION); } } String[] initials = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; List tRegions = this.baseMapper.selectList(Wrappers.lambdaQuery(XpRegion.class)); List> result = new ArrayList<>(); for (String initial : initials) { List init = tRegions.stream().filter(e -> e.getInitial().equals(initial) && !e.getCode().contains("0000")).collect(Collectors.toList()); result.add(init); } redisService.setCacheList(CacheConstants.XP_REGION, result); return result; } @Override @Transactional(rollbackFor = Exception.class) public RegionDistrictSyncResultVO syncDistrictFromRegionAll() { Long cityCount = Objects.requireNonNullElse(this.baseMapper.countCityForDistrictSync(), 0L); Long candidateDistrictCount = Objects.requireNonNullElse(this.baseMapper.countCandidateDistrictForSync(), 0L); List missingDistrictList = this.baseMapper.selectMissingDistrictFromRegionAll(); long insertedCount = 0L; if (missingDistrictList != null && !missingDistrictList.isEmpty()) { this.saveBatch(missingDistrictList); insertedCount = missingDistrictList.size(); } redisService.deleteObject(CacheConstants.XP_REGION); redisService.deleteObject(CacheConstants.XP_REGION_CITY); RegionDistrictSyncResultVO result = new RegionDistrictSyncResultVO(); result.setCityCount(cityCount); result.setCandidateDistrictCount(candidateDistrictCount); result.setInsertedCount(insertedCount); result.setSkippedCount(Math.max(candidateDistrictCount - insertedCount, 0)); result.setMessage("区级数据同步完成"); return result; } }