package com.xzx.gc.user.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.xzx.gc.common.Result; import com.xzx.gc.common.constant.Constants; import com.xzx.gc.common.constant.OrderEnum; import com.xzx.gc.common.utils.BusinessUtil; import com.xzx.gc.common.utils.gdmap.GdMapUtil; import com.xzx.gc.entity.AddressLevelInfo; import com.xzx.gc.entity.Fence; import com.xzx.gc.entity.OtherUserInfo; import com.xzx.gc.entity.PartnerGaode; import com.xzx.gc.model.order.FenceDto; import com.xzx.gc.user.mapper.FenceMapper; import com.xzx.gc.user.mapper.OtherUserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import tk.mybatis.mapper.entity.Example; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Service @Transactional public class FenceService { @Autowired private FenceMapper fenceMapper; @Autowired private AddressLevelService addressLevelService; @Autowired private PartnerGaodeService partnerGaodeService; @Autowired private HttpServletRequest request; @Autowired private OtherUserMapper otherUserMapper; @Autowired private BusinessUtil businessUtil; public Fence findById(Integer id){ Fence fence1 = fenceMapper.selectByPrimaryKey(id); return fence1; } public List findByIds(String townIds){ if(StrUtil.isNotBlank(townIds)) { Example example = new Example(Fence.class); Example.Criteria criteria = example.createCriteria(); criteria.andIn("id", CollUtil.newArrayList(townIds.split(","))); List fences = fenceMapper.selectByExample(example); return fences; }else { return new ArrayList<>(); } } public FenceDto getFence(String townId, boolean checkReceiver, String lon, String lat,boolean checkFence){ /** * 有2种情况 * 1:如果下单用户是处于岳麓区 则需要在岳麓区和天心区的合伙人里共同查找是属于哪个围栏内 * 2:否则根据下单地址查找对应的围栏 * */ FenceDto fenceDto=new FenceDto(); if(businessUtil.isSpecialArea(townId)){ PartnerGaode partnerGaode = partnerGaodeService.findByTownId(Constants.TIANXIN_CODE); if(partnerGaode!=null){ fenceDto.setPartnerId(partnerGaode.getPartnerId()); partnerGaode.setTownId(townId); String fenceId = getFenceByGaode(partnerGaode, false,checkReceiver,lon,lat); if(StrUtil.isNotBlank(fenceId)) { fenceDto.setFenceId(fenceId); fenceDto.setTownId(Constants.TIANXIN_CODE); return fenceDto; }else { partnerGaode = partnerGaodeService.findByTownId(townId); if(partnerGaode==null){ return fenceDto; } partnerGaode.setTownId(townId); fenceDto.setPartnerId(partnerGaode.getPartnerId()); fenceId = getFenceByGaode(partnerGaode, false,checkReceiver,lon,lat); fenceDto.setFenceId(fenceId); fenceDto.setTownId(townId); } }else { partnerGaode = partnerGaodeService.findByTownId(townId); if(partnerGaode==null){ return fenceDto; } partnerGaode.setTownId(townId); fenceDto.setPartnerId(partnerGaode.getPartnerId()); String fenceId = getFenceByGaode(partnerGaode, false,checkReceiver,lon,lat); fenceDto.setFenceId(fenceId); fenceDto.setTownId(townId); } }else { PartnerGaode partnerGaode = partnerGaodeService.findByTownId(townId); if(partnerGaode==null){ return fenceDto; }else { partnerGaode.setTownId(townId); fenceDto.setPartnerId(partnerGaode.getPartnerId()); } if(!checkFence){ fenceDto.setFenceId(Constants.DEFAULT_ID); return fenceDto; } String fenceId = getFenceByGaode(partnerGaode, true,checkReceiver,lon,lat); fenceDto.setFenceId(fenceId); fenceDto.setTownId(townId); } return fenceDto; } /** * * @param partnerGaode * @param checkTownFence 是否检查行政区围栏 * @checkReceiver 是否检查自助下单在围栏内 * @param lon 经度 在没有地址ID的时候传参 * @param lat 纬度 * @return */ public String getFenceByGaode(PartnerGaode partnerGaode,boolean checkTownFence,boolean checkReceiver,String lon, String lat){ //查找合伙人所有的围栏 如果有行政区域围栏 则优先查找 否则调用高德api查找 List byPartnerId = findByPartnerId(partnerGaode.getPartnerId()); if(CollUtil.isNotEmpty(byPartnerId)){ //1:POI围栏,2:行政区围栏,3:圆形围栏,4:多边形围栏 if(checkTownFence) { List fences = byPartnerId.stream().filter(x -> OrderEnum.行政区围栏.getValue().equals(x.getFenceType())).collect(Collectors.toList()); if (CollUtil.isNotEmpty(fences)) { for (Fence fence : fences) { AddressLevelInfo byAdcode = addressLevelService.findByAdcode(fence.getTownCode()); if (byAdcode != null) { String level3Id = byAdcode.getLevel3Id(); String townshipId = partnerGaode.getTownId(); if (level3Id.equals(townshipId)) { return fence.getId().toString(); } } } } } //进行高德围栏查询 String key = partnerGaode.getPartnerKey(); Result inFence = GdMapUtil.isInFence(lon + "," + lat + "," + DateUtil.currentSeconds(), GdMapUtil.getDiu(key),key); if(inFence.getCode()==0){ //设置围栏id Fence fence = findByGid(inFence.getData().toString()); if(fence!=null){ String fenceId = fence.getId().toString(); if(checkReceiver){ String receiverId=request.getHeader("userId"); OtherUserInfo otherUserInfo = otherUserMapper.selectByPrimaryKey(receiverId); String townId = otherUserInfo.getTownId(); List strings2 = Arrays.asList(townId.split(",")); if (strings2.contains(fenceId)) { return fenceId; }else { return null; } } return fenceId; } }else{ return null; } } return null; } public Fence findByGid(String gid){ Fence fence=new Fence(); fence.setGid(gid); fence.setDelFlag(Constants.DEL_NOT_FLAG); fence.setProhibit(false); Fence fence1 = fenceMapper.selectOne(fence); return fence1; } /** * 根据合伙人id查找所有围栏 * @param partnerId * @return */ public List findByPartnerId(String partnerId){ return fenceMapper.findByPartnerId(partnerId); } }