package com.doumee.service.business.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.PinYinUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.AreasMapper; import com.doumee.dao.business.model.Areas; import com.doumee.dao.business.model.Labels; import com.doumee.dao.web.dto.shop.Position; import com.doumee.service.business.AreasService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.awt.geom.Area; import java.util.*; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import java.util.stream.Collectors; /** * 省市区信息表Service实现 * @author 江蹄蹄 * @date 2023/02/15 08:55 */ @Service public class AreasServiceImpl implements AreasService { public static List ALL_AREA_LIST; public static List PROVINCE_LIST; public static List CITY_LIST; public static List AREA_LIST; public static List ALL_AREA_TREE; @Autowired private AreasMapper areasMapper; @Autowired RestTemplate restTemplate ; @Value("${tencent.map.remoteHost}") private String remoteHost; @Value("${tencent.map.appKey}") private String appKey; @Override public Integer create(Areas areas) { /* if (Objects.isNull(areas.getParentId())){ areas.setType(Constants.ZERO); }else { Areas parentArea = areasMapper.selectById(areas.getParentId()); if (Objects.isNull(parentArea)){ areas.setType(Constants.ZERO); }else { areas.setType(parentArea.getType()+Constants.ONE); } }*/ areas.setIsdeleted(Constants.ZERO); areasMapper.insert(areas); areas.setCode(areas.getId().toString()); areasMapper.updateById(areas); //刷新缓存数据 cacheData(); return areas.getId(); } @Override public void deleteById(Integer id) { areasMapper.deleteById(id); //刷新缓存数据 cacheData(); } @Override public void delete(Areas areas) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(areas); areasMapper.delete(deleteWrapper); //刷新缓存数据 cacheData(); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } areasMapper.deleteBatchIds(ids); //刷新缓存数据 cacheData(); } @Override public void updateById(Areas areas) { UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.lambda().eq(Areas::getId,areas.getId()); Areas update = new Areas(); update.setName(areas.getName()); update.setSortnum(areas.getSortnum()); areasMapper.update(update,wrapper); //刷新缓存数据 cacheData(); } @Override public void updateByIdInBatch(List areass) { if (CollectionUtils.isEmpty(areass)) { return; } for (Areas areas: areass) { this.updateById(areas); } //刷新缓存数据 cacheData(); } @Override public Areas findById(Integer id) { if(ALL_AREA_LIST!=null){ for(Areas a : ALL_AREA_LIST){ if(Constants.equalsInteger(a.getId(),id)){ return a; } } } // return areasMapper.selectById(id); return null; } @Override public Areas findById(Integer id,Integer type) { List list = null; if(type == null){ list = ALL_AREA_LIST; }else if(Constants.equalsInteger(type,Constants.ZERO)){ list = PROVINCE_LIST; }else if(Constants.equalsInteger(type,Constants.ONE)){ list = CITY_LIST; } else if (Constants.equalsInteger(type,Constants.TWO)){ list = AREA_LIST; } if(list!=null){ for(Areas a : list){ if(Constants.equalsInteger(a.getId(),id)){ return a; } } } return null; } @Override public Areas findByName(String name,Integer type){ List list = null; if(type == null){ list = ALL_AREA_LIST; }else if(Constants.equalsInteger(type,Constants.ZERO)){ list = PROVINCE_LIST; }else if(Constants.equalsInteger(type,Constants.ONE)){ list = CITY_LIST; } else if (Constants.equalsInteger(type,Constants.TWO)){ list = AREA_LIST; } if(list!=null){ for(Areas a : list){ if(StringUtils.equals(name,a.getName())){ return a; } } } return null; } @Override public Areas findByNameAndParentId(String name,Integer type,Integer parentId){ List list = null; if(type == null){ list = ALL_AREA_LIST; }else if(Constants.equalsInteger(type,Constants.ZERO)){ list = PROVINCE_LIST; }else if(Constants.equalsInteger(type,Constants.ONE)){ list = CITY_LIST; } else if (Constants.equalsInteger(type,Constants.TWO)){ list = AREA_LIST; } if(list!=null){ for(Areas a : list){ if(StringUtils.equals(name,a.getName()) && Constants.equalsInteger(parentId,a.getParentId())){ return a; } } } return null; } /** * * @param type * @param parentId * @param flag 0无子集 1包含子集县区 * @return */ @Override public List findByParentId(Integer parentId,Integer type ,int flag) { List list = null; if(type == null){ list = ALL_AREA_LIST; }else if(Constants.equalsInteger(type,Constants.ZERO)){ list = PROVINCE_LIST; }else if(Constants.equalsInteger(type,Constants.ONE)){ list = CITY_LIST; } else if (Constants.equalsInteger(type,Constants.TWO)){ list = AREA_LIST; } if(list!=null && Objects.nonNull(parentId)){ list = list.stream().filter(s->Constants.equalsInteger(s.getParentId(),parentId)) .collect(Collectors.toList()); } if(flag == 0){ List result = new ArrayList<>(); for(Areas a : list){ Areas r = new Areas(); BeanUtils.copyProperties(a,r); r.setChildList(null); result.add(r); } return result; } return list; } @Override public List findChildByParentId(Integer id,List list){ List result =null; if(list == null){ list = ALL_AREA_LIST; } if(list!=null && list.size()>0){ for(Areas model :list){ if(Constants.equalsInteger(id,model.getParentId())){ if(result == null){ result = new ArrayList<>(); } result.add(model ); } } } return result; } @Override public boolean isAreaValid(String proName,String cityName,String areaName){ Areas pro = findByName(proName,Constants.ZERO); if(pro == null){ return false; } Areas city = findByName(proName,Constants.ONE); if(city == null && !Constants.equalsInteger(city.getParentId(),pro.getId())){ return false; } Areas area = findByName(proName,Constants.TWO); if(area == null && !Constants.equalsInteger(area.getParentId(),city.getId())){ return false; } return false; } @Override public Areas findOne(Areas areas) { QueryWrapper wrapper = new QueryWrapper<>(areas); return areasMapper.selectOne(wrapper); } @Override public List findList(Areas areas) { List list = null; Integer type =areas.getType(); if(type == null){ list = ALL_AREA_LIST; }else if(Constants.equalsInteger(type,Constants.ZERO)){ list = PROVINCE_LIST; }else if(Constants.equalsInteger(type,Constants.ONE)){ list = CITY_LIST; } else if (Constants.equalsInteger(type,Constants.TWO)){ list = AREA_LIST; } List result = null; if(StringUtils.isNotBlank(areas.getName())){ for(Areas a : list){ if(StringUtils.contains(a.getName(),areas.getName())){ if(result == null){ result = new ArrayList<>(); } result.add(a); } } return result; } return list; } @Override public List listByParentId(Areas areas) { List list = null; Integer type =areas.getType(); if(type == null){ list = ALL_AREA_LIST; }else if(Constants.equalsInteger(type,Constants.ZERO)){ list = PROVINCE_LIST; }else if(Constants.equalsInteger(type,Constants.ONE)){ list = CITY_LIST; } else if (Constants.equalsInteger(type,Constants.TWO)){ list = AREA_LIST; } List result = null; if( areas.getParentId() !=null){ for(Areas a : list){ if(Constants.equalsInteger(a.getParentId(),areas.getParentId())){ if(result == null){ result = new ArrayList<>(); } result.add(a); } } return result; } return list; } @Override public void cacheData() { Areas a = new Areas(); a.setIsdeleted(Constants.ZERO); ALL_AREA_LIST = null; PROVINCE_LIST =null; CITY_LIST=null; AREA_LIST = null; ALL_AREA_TREE = null; ALL_AREA_LIST = areasMapper.selectJoinList(Areas.class,new MPJLambdaWrapper() .selectAll(Areas.class) .selectAs(Labels::getName,Areas::getBigAreaName) .leftJoin(Labels.class,Labels::getId,Areas::getBigAreaId ) .eq(Areas::getIsdeleted,Constants.ZERO) .orderByDesc(Areas::getSortnum)); if(ALL_AREA_LIST!=null){ for(Areas model : ALL_AREA_LIST){ if(Constants.equalsInteger(model.getType(),Constants.ZERO)){ if(PROVINCE_LIST == null){ PROVINCE_LIST = new ArrayList<>(); } PROVINCE_LIST.add(model); }else if(Constants.equalsInteger(model.getType(),Constants.ONE)){ if(CITY_LIST == null){ CITY_LIST = new ArrayList<>(); } CITY_LIST.add(model); if(model.getParentId() != null){ Areas p = findById(model.getParentId()); if(p!=null ){ model.setProvinceId(p.getId()); model.setProvinceName(p.getName()); } } }else if(Constants.equalsInteger(model.getType(),Constants.TWO)){ if(AREA_LIST == null){ AREA_LIST = new ArrayList<>(); } AREA_LIST.add(model); Areas city = findById(model.getParentId()); if(city!=null ){ model.setCityId(city.getId()); model.setCityName(city.getName()); if(city!=null && city.getParentId()!=null){ Areas p = findById(city.getParentId()); if(p!=null ){ model.setProvinceId(p.getId()); model.setProvinceName(p.getName()); } } } } } } if(CITY_LIST!=null){ for(Areas aa : CITY_LIST){ aa.setChildList(findChildByParentId(aa.getId(), AREA_LIST)); } } if(PROVINCE_LIST!=null){ for(Areas aa : PROVINCE_LIST){ aa.setChildList(findChildByParentId(aa.getId(),CITY_LIST)); } } System.out.println("================="); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper queryWrapper = new QueryWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); if (pageWrap.getModel().getId() != null) { queryWrapper.lambda().eq(Areas::getId, pageWrap.getModel().getId()); } if (pageWrap.getModel().getCreator() != null) { queryWrapper.lambda().eq(Areas::getCreator, pageWrap.getModel().getCreator()); } if (pageWrap.getModel().getCreateDate() != null) { queryWrapper.lambda().ge(Areas::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())); queryWrapper.lambda().le(Areas::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); } if (pageWrap.getModel().getEditor() != null) { queryWrapper.lambda().eq(Areas::getEditor, pageWrap.getModel().getEditor()); } if (pageWrap.getModel().getEditDate() != null) { queryWrapper.lambda().ge(Areas::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())); queryWrapper.lambda().le(Areas::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())); } if (pageWrap.getModel().getIsdeleted() != null) { queryWrapper.lambda().eq(Areas::getIsdeleted, pageWrap.getModel().getIsdeleted()); } if (pageWrap.getModel().getName() != null) { queryWrapper.lambda().eq(Areas::getName, pageWrap.getModel().getName()); } if (pageWrap.getModel().getInfo() != null) { queryWrapper.lambda().eq(Areas::getInfo, pageWrap.getModel().getInfo()); } if (pageWrap.getModel().getCode() != null) { queryWrapper.lambda().eq(Areas::getCode, pageWrap.getModel().getCode()); } if (pageWrap.getModel().getParentId() != null) { queryWrapper.lambda().eq(Areas::getParentId, pageWrap.getModel().getParentId()); } if (pageWrap.getModel().getType() != null) { queryWrapper.lambda().eq(Areas::getType, pageWrap.getModel().getType()); } for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(areasMapper.selectPage(page, queryWrapper)); } @Override public long count(Areas areas) { QueryWrapper wrapper = new QueryWrapper<>(areas); return areasMapper.selectCount(wrapper); } @Override public Areas findByCityAndArea(String cityName, String areasName) { Areas city = findByName(cityName,Constants.ONE); if(city !=null){ return findByNameAndParentId(areasName,Constants.TWO,city.getId()); } return null; } @Override public String getAddress(Integer cityId,Integer areaId){ Areas cityAreas = findById(cityId, Constants.ONE); Areas areas = findById(areaId, Constants.TWO); String cityName = Optional.ofNullable(cityAreas) .map(s -> s.getProvinceName() + s.getName()) .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST)); String areaName = Optional.ofNullable(areas).map(s -> s.getName()).orElse(""); return cityName+areaName; } @Override public String getAddress(Integer areaId) { Areas areas = findById(areaId, Constants.TWO); String cityName = Optional.ofNullable(areas) .map(s -> s.getProvinceName() + s.getCityName()) .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST)); String areaName = Optional.ofNullable(areas).map(s -> s.getName()).orElse(""); return cityName+areaName; } public static Areas getAddressByAreaId(Integer areaId) { if(areaId ==null){ return null; } if(AREA_LIST!=null){ for(Areas a : AREA_LIST){ if(Constants.equalsInteger(a.getId(),areaId)){ return a; // return StringUtils.defaultString(a.getProvinceName(),"")+StringUtils.defaultString(a.getCityName(),"")+StringUtils.defaultString(a.getName(),"") } } } return null; } @Override public List getCityList(Areas areas) { //查询全部城市数据 List dataList = findByParentId(null,Constants.ONE,0); if (StringUtils.isNotBlank(areas.getCityName())){ dataList = dataList.stream().filter(s -> s.getName().contains(areas.getCityName())).collect(Collectors.toList()); } if(dataList != null){ for(Areas c: dataList){ c.setFullspell(PinYinUtil.getFullSpell(c.getName())); c.setFirstSpell(PinYinUtil.getFirstFirstSpell(c.getName())); } Collections.sort(dataList); } return dataList; } @Override public Areas getAreasByPosition(Position position) { String location = position.getLatitude().toString()+","+position.getLongitude(); String res = restTemplate.getForObject(remoteHost+"/ws/geocoder/v1/?location=" + location + "&key="+appKey+"&get_poi=1", String.class); JSONObject obj = JSON.parseObject(res).getJSONObject("result"); if (JSON.parseObject(res).getInteger("status") != Constants.ZERO){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"获取地址失败"); } String adInfo = obj.getJSONObject("ad_info").getString("district"); Areas byName = findByName(adInfo, Constants.TWO); return byName; } }