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 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; } /** * 根据合伙人id查找所有围栏 * @param partnerId * @return */ public List 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; } }