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<AddressVo> 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<AddressVo> 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<AddressVo> 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<AddressVo> addressQuery(AddressReq addressReq) {
|
List<AddressVo> 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<AddressInfo> find(){
|
AddressInfo addressInfo=new AddressInfo();
|
addressInfo.setDelFlag(Convert.toStr(Constants.DEL_NOT_FLAG));
|
List<AddressInfo> 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<AddressLevelInfo> byAny = findByAny(addressLevelInfo);
|
if(CollUtil.isNotEmpty(byAny)){
|
return byAny.get(0);
|
}else {
|
return null;
|
}
|
} else {
|
return null;
|
}
|
}
|
|
private List<AddressLevelInfo> findByAny(AddressLevelInfo addressLevelInfo) {
|
if(StrUtil.isNotBlank(addressLevelInfo.getLevel3Name())){
|
addressLevelInfo.setLevel3Name(businessUtil.changeArea(addressLevelInfo.getLevel3Name()));
|
}
|
|
List<AddressLevelInfo> addressLevelInfos = addressLevelInfoMapper.select(addressLevelInfo);
|
if(CollUtil.isNotEmpty(addressLevelInfos)){
|
for (AddressLevelInfo levelInfo : addressLevelInfos) {
|
levelInfo.setLevel3Name(businessUtil.changeArea(levelInfo.getLevel3Name()));
|
}
|
}
|
return addressLevelInfos;
|
}
|
|
public List<AddressInfo> findAllByUserId(String userId) {
|
AddressInfo addressInfo=new AddressInfo();
|
addressInfo.setUserId(userId);
|
addressInfo.setDelFlag(Constants.DEL_NOT_FLAG+"");
|
List<AddressInfo> select = addressMapper.select(addressInfo);
|
return select;
|
}
|
public AddressInfo findByUserId(String userId) {
|
AddressInfo addressInfo=new AddressInfo();
|
addressInfo.setUserId(userId);
|
addressInfo.setFlag(Constants.DEL_FLAG+"");
|
List<AddressInfo> select = addressMapper.select(addressInfo);
|
if(CollUtil.isNotEmpty(select)) {
|
List<AddressInfo> 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<PageInfo<GdAroundResDto>> 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<PageInfo<GdAroundResDto>> aroundPOI = GdMapUtil.findAroundPOI(gdAroundDto);
|
return aroundPOI;
|
}
|
}
|