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;
|
|
/**
|
* <p>
|
* 省市区三级联动 服务实现类
|
* </p>
|
*
|
* @author liu
|
* @since 2026-02-03
|
*/
|
@Service
|
public class XpRegionServiceImpl extends ServiceImpl<XpRegionMapper, XpRegion> implements XpRegionService {
|
|
@Resource
|
private RedisService redisService;
|
|
@Override
|
public List<List<XpRegion>> getXpRegion() {
|
|
// 缓存数据
|
List<Object> 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<XpRegion> tRegions = this.baseMapper.selectList(Wrappers.lambdaQuery(XpRegion.class));
|
List<List<XpRegion>> result = new ArrayList<>();
|
for (String initial : initials) {
|
List<XpRegion> 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<XpRegion> 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;
|
}
|
}
|