| package com.xzx.gc.system.service;  | 
|   | 
| import cn.hutool.core.collection.CollUtil;  | 
| import cn.hutool.core.convert.Convert;  | 
| 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.system.mapper.FenceMapper;  | 
| import com.xzx.gc.system.mapper.OtherUserMapper;  | 
| import org.springframework.beans.factory.annotation.Autowired;  | 
| import org.springframework.stereotype.Service;  | 
| import org.springframework.transaction.annotation.Transactional;  | 
|   | 
| import javax.servlet.http.HttpServletRequest;  | 
| 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 OtherUserMapper otherUserMapper;  | 
|   | 
|     @Autowired  | 
|     private HttpServletRequest request;  | 
|   | 
|     @Autowired  | 
|     private BusinessUtil businessUtil;  | 
|   | 
|   | 
|     public Fence queryById(Integer id) {  | 
|         return fenceMapper.selectByPrimaryKey(id);  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 根据用户下单地址和围栏ID转换成正确的订单所属区域  | 
|      * @param userAddrTownId  用户下单地址  | 
|      * @param fenceId  围栏Id  | 
|      * @return  | 
|      */  | 
|     public String findTownId(String userAddrTownId,String fenceId){  | 
|         if(businessUtil.isSpecialArea(userAddrTownId)){  | 
|             /**  | 
|              * 如果用户下单区域是岳麓区 需要根据围栏的town_code查询区域ID  | 
|              */  | 
|             return addressLevelService.findByAdcode(queryById(Convert.toInt(fenceId)).getTownCode()).getLevel3Id();  | 
|         }else {  | 
|             return userAddrTownId;  | 
|         }  | 
|     }  | 
|   | 
|     /**  | 
|      *  | 
|      * @param townId  | 
|      * @param checkReceiver  | 
|      * @param lon  | 
|      * @param lat  | 
|      * @param checkFence  是否要监测围栏 不监测则只获取合伙人  | 
|      * @return  | 
|      */  | 
|     public FenceDto getFence(String townId, boolean checkReceiver, String lon, String lat, boolean checkFence){  | 
|         //根据下单地址所在的市 匹配 对应的合伙人  | 
| //        PartnerGaode partnerGaode = partnerGaodeService.findByAddressId(addressId);  | 
|         /**  | 
|          * 有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);  | 
|                     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);  | 
|                 }  | 
|             }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);  | 
|             }  | 
|         }else {  | 
|             PartnerGaode partnerGaode = partnerGaodeService.findByTownId(townId);  | 
|             if(partnerGaode==null){  | 
|                 return fenceDto;  | 
|             }else {  | 
|                 fenceDto.setPartnerId(partnerGaode.getPartnerId());  | 
|                 partnerGaode.setTownId(townId);  | 
|             }  | 
|   | 
|             if(!checkFence){  | 
|                 fenceDto.setFenceId(Constants.DEFAULT_ID);  | 
|                 return fenceDto;  | 
|             }  | 
|             String fenceId = getFenceByGaode(partnerGaode, true,checkReceiver,lon,lat);  | 
|             fenceDto.setFenceId(fenceId);  | 
|         }  | 
|         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<Fence> byPartnerId =findByPartnerId(partnerGaode.getPartnerId());  | 
|         if(CollUtil.isNotEmpty(byPartnerId)){  | 
|             //1:POI围栏,2:行政区围栏,3:圆形围栏,4:多边形围栏  | 
|   | 
|             if(checkTownFence) {  | 
|                 List<Fence> 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<String> strings2 = Arrays.asList(townId.split(","));  | 
|                         if (strings2.contains(fenceId)) {  | 
|                             return fenceId;  | 
|                         }else {  | 
|                             return null;  | 
|                         }  | 
|                     }  | 
|                     return fenceId;  | 
|                 }  | 
|             }else{  | 
|                 return null;  | 
|             }  | 
|   | 
|         }  | 
|         return null;  | 
|     }  | 
|     /**  | 
|      * 根据合伙人id查找所有围栏  | 
|      * @param partnerId  | 
|      * @return  | 
|      */  | 
|     public List<Fence> findByPartnerId(String partnerId){  | 
|         return fenceMapper.findByPartnerId(partnerId);  | 
|     }  | 
|   | 
|     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;  | 
|     }  | 
|   | 
|   | 
| }  |