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