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;  
 | 
    }  
 | 
  
 | 
  
 | 
}  
 |