package com.xzx.gc.user.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.comparator.PropertyComparator; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.emoji.EmojiUtil; import com.github.pagehelper.PageInfo; import com.xzx.gc.common.Result; import com.xzx.gc.common.constant.Constants; import com.xzx.gc.common.constant.UserEnum; import com.xzx.gc.common.dto.gdmap.*; import com.xzx.gc.common.exception.RestException; import com.xzx.gc.common.utils.BusinessUtil; import com.xzx.gc.common.utils.ExceptionUtils; import com.xzx.gc.common.utils.StringUtils; import com.xzx.gc.common.utils.gdmap.GdMapUtil; import com.xzx.gc.entity.AddressInfo; import com.xzx.gc.entity.AddressLevelInfo; import com.xzx.gc.entity.OrderInfo; import com.xzx.gc.entity.UserInfo; import com.xzx.gc.model.admin.LongiLatiModel; import com.xzx.gc.model.user.AddressReq; import com.xzx.gc.model.user.AddressVo; import com.xzx.gc.user.mapper.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeySelectiveMapper; import tk.mybatis.mapper.entity.Example; import javax.servlet.http.HttpServletRequest; import javax.xml.ws.soap.Addressing; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @Service @Slf4j @Transactional public class AddressService{ @Autowired AddressMapper addressMapper; @Autowired private UserTargetInfoService userTargetInfoService; @Autowired private HttpServletRequest request; @Autowired private BusinessUtil businessUtil; @Autowired private AddressLevelService addressLevelService; @Autowired private AddressLevelMapper addressLevelInfoMapper; @Autowired private OrderMapper orderMapper; @Autowired private UserService userService; /** * 根据经纬度获取省市区 * @param lon * @param lan * @return */ public AddressInfo getByLon(String lon,String lan) { GdReverseGEODto gdReverseGEODto = new GdReverseGEODto(); gdReverseGEODto.setLocation(lon + "," + lan); Result areaInfo = GdMapUtil.getAreaInfo(gdReverseGEODto, 0); if (areaInfo.getCode() == 0) { AddressInfo addressInfo1 = (AddressInfo) areaInfo.getData(); AddressLevelInfo addressLevelInfo = new AddressLevelInfo(); addressLevelInfo.setAdcode(addressInfo1.getAdcode()); AddressLevelInfo addressLevelInfo1 = addressLevelInfoMapper.selectOne(addressLevelInfo); if(addressLevelInfo1!=null) { addressInfo1.setTownshipId(addressLevelInfo1.getLevel3Id()); addressInfo1.setProvinceId(addressLevelInfo1.getLevel1Id()); addressInfo1.setCityId(addressLevelInfo1.getLevel2Id()); return addressInfo1; } } return null; } public void add(AddressInfo addressInfo){ addressInfo.setDelFlag(Constants.DEL_NOT_FLAG+""); addressInfo.setCreateTime(DateUtil.now()); addressMapper.insertSelective(addressInfo); } public long addressAdd(AddressReq addressReq) { long returnvalue= 0; try { addressReq.setDetailAddress(StringUtils.cleanStr(addressReq.getDetailAddress())); //若从微信取的地址则自动转换经纬度 if(StrUtil.isBlank(addressReq.getLatitude())){ GdGEODto gdGEODto=new GdGEODto(); if(StrUtil.isNotBlank(addressReq.getCityName())) { gdGEODto.setCity(addressReq.getCityName()); } gdGEODto.setAddress(addressReq.getAddressArea()+addressReq.getDetailAddress()); Result locationByAddress = GdMapUtil.getLocationByAddress(gdGEODto); if(locationByAddress.getCode()==0&&locationByAddress.getData()!=null){ addressReq.setLongitude(locationByAddress.getData().toString().split(",")[0]); addressReq.setLatitude(locationByAddress.getData().toString().split(",")[1]); } } if(StrUtil.isBlank(addressReq.getLatitude())){ throw new RestException(-1,"地址经纬度获取失败"); } AddressInfo addressInfo = new AddressInfo(); BeanUtils.copyProperties(addressReq, addressInfo); //获取省市区ID completeAddress(addressReq, addressInfo); String userId = request.getHeader("userId"); addressInfo.setDelFlag(Convert.toStr(Constants.DEL_NOT_FLAG)); changeLocation(addressInfo); addressInfo.setUserId(userId); addressInfo.setCreateTime(DateUtil.now()); addressInfo.setFlag(UserEnum.默认地址.getValue()); //修改用户的所有地址为非默认 updateByUserIdSetNoDefault(userId); addressMapper.insertSelective(addressInfo); returnvalue=addressInfo.getAddressId(); //修改意向客户的地址 来源是新增地址时 if(addressReq.getOrigin()==0) { userTargetInfoService.updateTargetUserAddr(addressInfo); } //判断地址是属于哪个围栏 从而获取合伙人ID // fenceService.findByPartnerId() } catch (BeansException e) { ExceptionUtils.err("新增地址失败",e); } return returnvalue; } /** * 替换经纬度 填补省市区 * @param addressInfo */ public void changeLocation(AddressInfo addressInfo) { GdPOIDto gdGEODto=new GdPOIDto(); gdGEODto.setKeywords(StrUtil.emptyToDefault(addressInfo.getAddressArea(),"")+StrUtil.emptyToDefault(addressInfo.getDetailAddress(),"")); //替换地址表的省市区ID if(StrUtil.isBlank(addressInfo.getProvinceId())){ addressInfo = GdMapUtil.getLocationByPOI(gdGEODto, addressInfo); AddressReq addressReq = new AddressReq(); addressReq.setProvinceName(addressInfo.getProvinceName()); addressReq.setCityName(addressInfo.getCityName()); addressReq.setTownshipName(addressInfo.getTownshipName()); List addressLevelList = addressMapper.queryAreaIdByName(addressReq); if (addressLevelList != null && addressLevelList.size() > 0) { String provinceId = addressLevelList.get(0).getProvinceId(); addressInfo.setProvinceId(provinceId); String cityId = addressLevelList.get(0).getCityId(); addressInfo.setCityId(cityId); String townshipId = addressLevelList.get(0).getTownshipId(); addressInfo.setTownshipId(townshipId); } } } private void getProvinceAndCityId(AddressReq addressReq, AddressInfo addressInfo) { if(StrUtil.isNotBlank(addressReq.getTownshipName())){ addressReq.setTownshipName( businessUtil.changeArea(addressReq.getTownshipName())); } List addressLevelList= addressMapper.queryAreaIdByName(addressReq); if (addressLevelList != null && addressLevelList.size() > 0){ String provinceId = addressLevelList.get(0).getProvinceId(); String cityId = addressLevelList.get(0).getCityId(); String townshipId = addressLevelList.get(0).getTownshipId(); String citycode = addressLevelList.get(0).getCitycode(); String adcode = addressLevelList.get(0).getAdcode(); String pcode = addressLevelList.get(0).getPcode(); addressInfo.setProvinceId(provinceId); addressInfo.setCityId(cityId); addressInfo.setTownshipId(townshipId); //用于poi筛选 addressInfo.setCityName(addressReq.getCityName()); addressInfo.setCitycode(citycode); addressInfo.setAdcode(adcode); addressInfo.setPcode(pcode); addressReq.setProvinceId(provinceId); addressReq.setCityId(cityId); addressReq.setTownshipId(townshipId); } } public void addressModify(AddressReq addressReq) { try { addressReq.setDetailAddress(StringUtils.cleanStr(addressReq.getDetailAddress())); AddressInfo addressInfo = new AddressInfo(); BeanUtils.copyProperties(addressReq, addressInfo); //当某一地址设为默认时,其它地址为非默认 if (UserEnum.默认地址.getValue().equals(addressReq.getFlag())){ addressMapper.updateAddressFlag(addressReq); } //获取省市区ID completeAddress(addressReq, addressInfo); changeLocation(addressInfo); //查询地址修改是否跨区 跨区则删除当前地址新增地址 AddressInfo addressInfo1 = addressMapper.selectByPrimaryKey(addressInfo.getAddressId()); String townshipId = addressInfo1.getTownshipId(); if(!townshipId.equals(addressInfo.getTownshipId())){ deleteById(addressInfo.getAddressId()); AddressInfo obj=new AddressInfo(); BeanUtil.copyProperties(addressInfo,obj); obj.setAddressId(null); obj.setDelFlag(Constants.DEL_NOT_FLAG+""); obj.setCreateTime(DateUtil.now()); addressMapper.insertSelective(obj); }else { addressMapper.updateByPrimaryKeySelective(addressInfo); } if (UserEnum.默认地址.getValue().equals(addressReq.getFlag())) { userTargetInfoService.updateTargetUserAddr(addressInfo); } } catch (BeansException e) { ExceptionUtils.err("修改地址失败",e); } } /** * 删除地址 * @param addressId */ public void deleteById(Long addressId){ AddressInfo addressInfo=new AddressInfo(); addressInfo.setAddressId(addressId); addressInfo.setDelFlag(Constants.DEL_FLAG+""); addressMapper.updateByPrimaryKeySelective(addressInfo); } public void deleteByUserId(String userId){ AddressInfo addressInfo = new AddressInfo(); addressInfo.setDelFlag(Constants.DEL_FLAG+""); Example example = new Example(AddressInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("userId", userId); addressMapper.updateByExampleSelective(addressInfo,example); } /** * 完善地址信息 * @param addressReq * @param addressInfo */ private void completeAddress(AddressReq addressReq, AddressInfo addressInfo) { if (StringUtils.isBlank(addressReq.getProvinceId())) { getProvinceAndCityId(addressReq, addressInfo); } else { //设置adcode if (StrUtil.isNotBlank(addressReq.getCityId()) && StrUtil.isNotBlank(addressReq.getTownshipId())) { AddressLevelInfo addressLevelInfo = addressLevelService.find(addressReq.getProvinceId(), addressReq.getCityId(), addressReq.getTownshipId()); if (addressLevelInfo != null) { addressInfo.setAdcode(addressLevelInfo.getAdcode()); addressInfo.setCitycode(addressLevelInfo.getCitycode()); } } } //判断详细地址和所选的区域是否正确 高德同一地点存在跨区可能不准 (只判断到市) checkLon(addressReq, addressInfo); } /** * 判断详细地址和所选的区域是否正确 高德同一地点存在跨区可能不准 (只判断到市) * @param addressReq * @param addressInfo */ private void checkLon(AddressReq addressReq, AddressInfo addressInfo) { GdReverseGEODto gdReverseGEODto = new GdReverseGEODto(); gdReverseGEODto.setLocation(addressReq.getLongitude() + "," + addressReq.getLatitude()); Result areaInfo = GdMapUtil.getAreaInfo(gdReverseGEODto, 0); if (areaInfo.getCode() == 0) { AddressInfo addressInfo1 = (AddressInfo) areaInfo.getData(); String adcode = addressInfo1.getCitycode(); if (StrUtil.isNotBlank(adcode) && StrUtil.isNotBlank(addressInfo.getCitycode())) { if (!StrUtil.equals(adcode, addressInfo.getCitycode())) { throw new RestException(-1, "详细地址与区域不一致,请重新选择"); } } } } public int addressDel(AddressReq addressReq) { int returnvalue= 0; try { Long addressId = addressReq.getAddressId(); //查询用户下有几条地址 addressReq.setAddressId(null); List list = addressMapper.addressQuery(addressReq); returnvalue = addressMapper.deleteAddress(addressId); if (UserEnum.默认地址.getValue().equals( addressReq.getFlag() )&&list.size()>1){ // 如果删除的是默认地址,则设置第一条数据为默认地址 returnvalue = addressMapper.autoSetDefaultAddress(addressReq.getUserId()); } } catch (Exception e) { ExceptionUtils.err("删除地址失败",e); } return returnvalue; } public List addressQuery(AddressReq addressReq) { List list = addressMapper.addressQuery(addressReq); return list; } public void updateByUserIdSetNoDefault(String userId) { if(StrUtil.isNotBlank(userId)) { AddressInfo addressInfo = new AddressInfo(); addressInfo.setFlag(UserEnum.非默认地址.getValue()); Example example = new Example(AddressInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("userId", userId); criteria.andEqualTo("delFlag",Constants.DEL_NOT_FLAG); addressMapper.updateByExampleSelective(addressInfo,example); } } public void updateAllById(AddressInfo addressInfo){ addressMapper.updateByPrimaryKey(addressInfo); } /** * 查询所有地址 * @return */ public List find(){ AddressInfo addressInfo=new AddressInfo(); addressInfo.setDelFlag(Convert.toStr(Constants.DEL_NOT_FLAG)); List select = addressMapper.select(addressInfo); return select; } public String updateUserAddress(AddressInfo address) { AddressInfo oldAddre = new AddressInfo(); oldAddre.setAddressId(address.getAddressId()); AddressInfo oldAddress = addressMapper.selectOne(oldAddre); oldAddress.setLongitude(address.getLongitude()); oldAddress.setLatitude(address.getLatitude()); String location = address.getLongitude()+","+address.getLatitude(); AddressLevelInfo addressLevelInfo = findByLocation(location); String addressArea = ""; if(null!=addressLevelInfo.getLevel1Id()&&!"".equals(addressLevelInfo.getLevel1Id())){ oldAddress.setProvinceId(addressLevelInfo.getLevel1Id()); addressArea = addressLevelInfo.getLevel1Name(); } if(null!=addressLevelInfo.getLevel2Id()&&!"".equals(addressLevelInfo.getLevel2Id())){ oldAddress.setCityId(addressLevelInfo.getLevel2Id()); addressArea = addressArea+addressLevelInfo.getLevel2Name(); } if(null!=addressLevelInfo.getLevel3Id()&&!"".equals(addressLevelInfo.getLevel3Id())){ oldAddress.setTownshipId(addressLevelInfo.getLevel3Id()); addressArea =addressArea+addressLevelInfo.getLevel3Name(); } //addressArea = addressArea + address.getDetailAddress(); oldAddress.setAddressArea(addressArea); oldAddress.setDetailAddress(address.getDetailAddress()); oldAddress.setTagName(address.getTagName()); oldAddress.setUnitName(address.getUnitName()); oldAddress.setHouseNumber(address.getHouseNumber()); oldAddress.setReceiveAddress(address.getReceiveAddress()); addressMapper.updateByPrimaryKeySelective(oldAddress); if(null!=address.getOrderId()&&!"".equals(address.getOrderId())){ OrderInfo orderInfo = new OrderInfo(); orderInfo.setOrderId(address.getOrderId()); orderInfo.setOrderStatus("1"); orderMapper.updateByPrimaryKeySelective(orderInfo); } return null; } public AddressLevelInfo findByLocation(String location){ GdReverseGEODto gdReverseGEODto = new GdReverseGEODto(); gdReverseGEODto.setLocation(location); Result areaInfo = GdMapUtil.getAreaInfo(gdReverseGEODto, 0); if (areaInfo.getCode() == 0) { AddressInfo addressInfo = (AddressInfo) areaInfo.getData(); AddressLevelInfo addressLevelInfo=new AddressLevelInfo(); addressLevelInfo.setLevel3Name(addressInfo.getTownshipName()); addressLevelInfo.setLevel2Name(addressInfo.getCityName()); addressLevelInfo.setLevel1Name(addressInfo.getProvinceName()); List byAny = findByAny(addressLevelInfo); if(CollUtil.isNotEmpty(byAny)){ return byAny.get(0); }else { return null; } } else { return null; } } private List findByAny(AddressLevelInfo addressLevelInfo) { if(StrUtil.isNotBlank(addressLevelInfo.getLevel3Name())){ addressLevelInfo.setLevel3Name(businessUtil.changeArea(addressLevelInfo.getLevel3Name())); } List addressLevelInfos = addressLevelInfoMapper.select(addressLevelInfo); if(CollUtil.isNotEmpty(addressLevelInfos)){ for (AddressLevelInfo levelInfo : addressLevelInfos) { levelInfo.setLevel3Name(businessUtil.changeArea(levelInfo.getLevel3Name())); } } return addressLevelInfos; } public List findAllByUserId(String userId) { AddressInfo addressInfo=new AddressInfo(); addressInfo.setUserId(userId); addressInfo.setDelFlag(Constants.DEL_NOT_FLAG+""); List select = addressMapper.select(addressInfo); return select; } public AddressInfo findByUserId(String userId) { AddressInfo addressInfo=new AddressInfo(); addressInfo.setUserId(userId); addressInfo.setFlag(Constants.DEL_FLAG+""); List select = addressMapper.select(addressInfo); if(CollUtil.isNotEmpty(select)) { List collect = select.stream().filter(x -> x.getDelFlag().equals("0")).collect(Collectors.toList()); if (CollUtil.isNotEmpty(collect)) { return collect.get(0); } else { CollUtil.sort(select, new PropertyComparator<>("createTime").reversed()); return select.get(0); } }else{ UserInfo byId = userService.findById(userId); if(StrUtil.isNotBlank(byId.getLatitude())){ AddressInfo addressInfo1 = getByLon(byId.getLongitude(),byId.getLatitude()); if (addressInfo1 != null) return addressInfo1; } } return null; } public AddressInfo findById(Long id){ return addressMapper.selectByPrimaryKey(id); } /** * 根据经纬度查询附近小区 * @param longiLatiModel * @return */ public Result> findHouseByLon(LongiLatiModel longiLatiModel) { GdAroundDto gdAroundDto =new GdAroundDto(); gdAroundDto.setLocation(longiLatiModel.getLongitude()+","+longiLatiModel.getLatitude()); gdAroundDto.setTypes(GdMapUtil.HOUSE_POI); gdAroundDto.setPage(longiLatiModel.getPageNo()); gdAroundDto.setOffset(longiLatiModel.getPageSize()); Result> aroundPOI = GdMapUtil.findAroundPOI(gdAroundDto); return aroundPOI; } }