| package com.xzx.gc.order.service;  | 
|   | 
| import cn.hutool.core.bean.BeanUtil;  | 
| 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 cn.hutool.json.JSONArray;  | 
| import com.alibaba.fastjson.JSON;  | 
| import com.fasterxml.jackson.core.type.TypeReference;  | 
| import com.fasterxml.jackson.databind.DeserializationFeature;  | 
| import com.fasterxml.jackson.databind.ObjectMapper;  | 
| import com.google.gson.Gson;  | 
| 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.dto.gdmap.CreateFenceDto;  | 
| import com.xzx.gc.common.dto.gdmap.GdReverseGEODto;  | 
| import com.xzx.gc.common.exception.RestException;  | 
| import com.xzx.gc.common.utils.BusinessUtil;  | 
| import com.xzx.gc.common.utils.gdmap.GdMapUtil;  | 
| import com.xzx.gc.entity.*;  | 
| import com.xzx.gc.model.JsonResult;  | 
| import com.xzx.gc.model.admin.AreaModel;  | 
| import com.xzx.gc.model.admin.LongiLatiModel;  | 
| import com.xzx.gc.model.admin.XzxElectronicFenceModel;  | 
| import com.xzx.gc.model.admin.XzxPartnerFenceModel;  | 
| import com.xzx.gc.model.order.FenceDto;  | 
| import com.xzx.gc.order.mapper.FenceMapper;  | 
| import com.xzx.gc.order.mapper.OtherUserMapper;  | 
| import com.xzx.gc.util.BeanUtils;  | 
| 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.*;  | 
| 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 CityPartnerService service;  | 
|   | 
|     @Autowired  | 
|     private BusinessUtil businessUtil;  | 
|   | 
|     @Autowired  | 
|     private CityPartnerService cityPartnerService;  | 
|   | 
|     @Autowired  | 
|     private PartnerFenceService partnerFenceService;  | 
|   | 
|   | 
|     public List<Fence> findByUserId(String userId){  | 
|         return  fenceMapper.findByUserId(userId);  | 
|     }  | 
|   | 
|   | 
|     public Fence findById(String id){  | 
|   | 
|         return  fenceMapper.selectByPrimaryKey(id);  | 
|     }  | 
|   | 
|   | 
|     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;  | 
|     }  | 
|   | 
|     public Fence findByGidForbidden(String gid){  | 
|         Fence fence=new Fence();  | 
|         fence.setGid(gid);  | 
|         fence.setDelFlag(Constants.DEL_NOT_FLAG);  | 
|         Fence fence1 = fenceMapper.selectOne(fence);  | 
|         return fence1;  | 
|     }  | 
|   | 
|     /**  | 
|      * 根据合伙人id查找所有围栏  | 
|      * @param partnerId  | 
|      * @return  | 
|      */  | 
|     public List<Fence> findByPartnerId(String partnerId){  | 
|         return fenceMapper.findByPartnerId(partnerId);  | 
|     }  | 
|   | 
|   | 
|   | 
|     /**  | 
|      * 根据区域id查询  | 
|      * @param areaId 区域统计  | 
|      * @return  | 
|      */  | 
|     public List<Fence> findByAreaId(String areaId){  | 
|         PartnerGaode byCityId=null;  | 
|             byCityId = partnerGaodeService.findByTownId(areaId);  | 
|   | 
|         if(byCityId!=null){  | 
|             List<Fence> byPartnerId = findByPartnerId(byCityId.getPartnerId());  | 
|             return byPartnerId;  | 
|         }  | 
|   | 
|         return null;  | 
|     }  | 
|   | 
|     /**  | 
|      *  | 
|      * @param townId  | 
|      * @param checkReceiver  | 
|      * @param lon  | 
|      * @param lat  | 
|      * @param checkFence  是否要监测围栏 不监测直接通过区id获取合伙人,单区域拥有多合伙人必须通过围栏才能判断  | 
|      * @return  | 
|      */  | 
|     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);  | 
|                     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;  | 
|     }  | 
|   | 
|     public List<String> queryTownListByArea(String townCode,String eleId){  | 
|         return fenceMapper.queryTownListByArea(townCode,eleId);  | 
|     }  | 
|   | 
|     public List<String> queryOrderTownListByArea(String townCode,String eleId){  | 
|         return fenceMapper.queryOrderTownListByArea(townCode,eleId);  | 
|     }  | 
|     public boolean queryPartnerAreaIds(String partnerId,String townId){  | 
|         boolean flag = false;  | 
|         //判断合伙人是否有天心区可建,岳麓区可以建围栏。  | 
|         List<String> townIds = service.queryTownIdsByPartnerId(partnerId);  | 
|         //特殊处理  | 
|         boolean check=false;  | 
|         if(null!=townIds&&townIds.size()>0){  | 
|             for (String tid:townIds) {  | 
|                 if(tid.equals(Constants.TIANXIN_CODE)){  | 
|                     check=true;  | 
|                     break;  | 
|                 }  | 
|             }  | 
|         }  | 
|         int num = 0;  | 
|         if(!check){  | 
|              num = fenceMapper.queryPartnerAreaIds(partnerId,townId);  | 
|         }else{  | 
|              if(townId.equals(Constants.YUELU_CODE)||townId.equals(Constants.YUHUA_CODE)){  | 
|                  num=1;  | 
|              }else{  | 
|                  num = fenceMapper.queryPartnerAreaIds(partnerId,townId);  | 
|              }  | 
|         }  | 
|         if(num>0){  | 
|             flag = true;  | 
|         }  | 
|         return flag;  | 
|     }  | 
|   | 
|     public String queryAreaTownId(String keyword){  | 
|         return fenceMapper.queryAreaTownId(keyword);  | 
|     }  | 
|   | 
|     public String queryPartnerIdByTownId(String townId){  | 
|         return fenceMapper.queryPartnerIdByTownId(townId);  | 
|     }  | 
|     public List<XzxElectronicFenceModel> queryFenceList(XzxElectronicFenceModel model){  | 
|         List<String> partnerIdList = service.queryPartnerByCurrent();  | 
|         model.setPartnerIdList(partnerIdList);  | 
|         List<XzxElectronicFenceModel> list =  fenceMapper.queryFenceList(model);  | 
|         for (XzxElectronicFenceModel model1:list) {  | 
|             String keyword = model1.getKeyword();  | 
|             if(null!=keyword&&!"".equals(keyword)) {  | 
|                 AreaModel m = new AreaModel();  | 
|                 m.setName(keyword.trim());  | 
|                 AreaModel map = service.queryAreaLongiLati(m);  | 
|                 if(map!=null){  | 
|                     model1.setLongitude(map.getLongitude());  | 
|                     model1.setLatitude(map.getLatitude());  | 
|                 }  | 
|   | 
|             }else{  | 
|                 String longLatiArr = model1.getLongLatiArr();  | 
|                 String longi="";  | 
|                 String lati="";  | 
|                 List<Map<String,Object>> longlaL = new ArrayList<>();  | 
|                 if(null!=longLatiArr&&!"".equals(longLatiArr)){  | 
|                     String[] liststr = longLatiArr.split(";");  | 
|                     for (String str : liststr) {  | 
|                         Map<String, Object> ageMap = new HashMap<String, Object>();  | 
|                         String[] stt = str.split(",");  | 
|                         longi = stt[0];  | 
|                         lati = stt[1];  | 
|                         ageMap.put("longitude",longi);  | 
|                         ageMap.put("latitude",lati);  | 
|                         longlaL.add(ageMap);  | 
|                         model1.setLongitude(longi);  | 
|                         model1.setLatitude(lati);  | 
|                         //break;  | 
|                     }  | 
|                     String jsonString = JSON.toJSONString(longlaL);  | 
|                     model1.setLongLatiArr(jsonString);  | 
|                 }  | 
|             }  | 
|   | 
|         }  | 
|         return list;  | 
|     }  | 
|     public XzxElectronicFence queryElectronic(XzxElectronicFenceModel info){  | 
|         return fenceMapper.queryElectronic(info);  | 
|     }  | 
|   | 
|     public String queryLongiLatiForTownName(String key,String location,String longiLatiStr){  | 
|         GdReverseGEODto gdReverseGEODto = new GdReverseGEODto();  | 
|         gdReverseGEODto.setKey(key);  | 
|   | 
|         boolean batch=false;  | 
|         if(StrUtil.isNotBlank(longiLatiStr)){  | 
|             gdReverseGEODto.setLocation(longiLatiStr);  | 
|             batch=true;  | 
|         }else{  | 
|             gdReverseGEODto.setLocation(location);  | 
|         }  | 
|   | 
|         //非批量  | 
|         Result areaInfo;  | 
|         if(!batch){  | 
|             areaInfo = GdMapUtil.getAreaInfo(gdReverseGEODto, 3);  | 
|             if(areaInfo.getCode()==0) {  | 
|                 return areaInfo.getData().toString();  | 
|             }  | 
|   | 
|         }else {  | 
|            areaInfo = GdMapUtil.getBatchAreaInfo(gdReverseGEODto);  | 
|             if(areaInfo.getCode()==0){  | 
|                 JSONArray regeocodes= (JSONArray) areaInfo.getData();  | 
|                 return checkAddressIp(regeocodes);  | 
|             }  | 
|         }  | 
|         throw new RestException("经纬度异常:"+areaInfo.getMsg());  | 
|   | 
|   | 
|   | 
|     }  | 
|   | 
|     private String checkAddressIp(JSONArray regeocodes){  | 
|         StringBuffer location=new StringBuffer();  | 
|         String address="";  | 
|         for (int i=0; i<regeocodes.size();i++) {  | 
|             Map maps1 = (Map) JSON.parse(regeocodes.get(i).toString());  | 
|             if(null!=address&&!"".equals(address)){  | 
|                 String component = maps1.get("addressComponent").toString();  | 
|                 Map mapsx = (Map) JSON.parse(component);  | 
|                 String addressNew= mapsx.get("district").toString();  | 
|                 if(address.equals(addressNew)){  | 
|                     continue;  | 
|                 }else{  | 
|                     location.append(",").append(i+1).append("_").append(address);  | 
|                 }  | 
|             }else{  | 
|                 String addressComponent = maps1.get("addressComponent").toString();  | 
|                 Map maps2 = (Map) JSON.parse(addressComponent);  | 
|                 address= maps2.get("district").toString();  | 
|                 location.append(i+1).append("_").append(address);  | 
|             }  | 
|   | 
|         }  | 
|         return location.toString();  | 
|     }  | 
|     public void updateGDFence(Fence info, XzxPartnerFenceModel pfInfo, String longiLatiStr, String gid){  | 
|         CityPartner  partner = service.queryById(pfInfo.getPartnerId());  | 
|         String key = partner.getPartnerKey();  | 
|   | 
|         Map<String,String> map = new HashMap<>();;  | 
|         map.put("name",info.getFenceName());  | 
|         if(null!=longiLatiStr&&!"".equals(longiLatiStr)){  | 
|             map.put("points",longiLatiStr);  | 
|         }else{  | 
|             map.put("center",info.getLongitude()+","+info.getLatitude());  | 
|             map.put("radius",String.valueOf(info.getRadius()));  | 
|         }  | 
|         //map.put("enable","true");  | 
|         map.put("valid_time","2054-12-30");  | 
|         map.put("repeat","Mon,Tues,Wed,Thur,Fri,Sat,Sun");  | 
|         //map.put("time","00:00,11:59;13:00,20:59");  | 
|         map.put("desc",info.getFenceName());  | 
|         map.put("alert_condition","enter");  | 
|   | 
|         CreateFenceDto createFenceDto = BeanUtil.mapToBean(map, CreateFenceDto.class, true);  | 
|         Result result = GdMapUtil.updateFence(createFenceDto, key, gid);  | 
|         if(result.getCode()!=0){  | 
|             throw new  RestException("修改电子围栏失败:"+result.getMsg());  | 
|         }  | 
|     }  | 
|     public List<String>  queryODByArea(String townCode){  | 
|         return fenceMapper.queryODByArea(townCode);  | 
|     }  | 
|   | 
|   | 
|   | 
|     public boolean update(Fence info) {  | 
|         int i = fenceMapper.updateByPrimaryKeySelective(info);  | 
|         return i>0?true:false;  | 
|     }  | 
|   | 
|     public boolean save(Fence info) {  | 
|         int i = fenceMapper.insertSelective(info);  | 
|         return i>0?true:false;  | 
|     }  | 
|   | 
|     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 model  | 
|      * @return  | 
|      */  | 
|     public JsonResult<String> addFence(XzxElectronicFenceModel model){  | 
|         String partnerIds = model.getPartnerIds();  | 
|         if(StrUtil.isBlank(partnerIds)){  | 
|             return JsonResult.failMessage("必须填写关联合伙人!");  | 
|         }  | 
|         model.setDelFlag(0);  | 
|         model.setCreateTime(DateUtil.now());  | 
|         Fence info = BeanUtils.copy(model, Fence.class);  | 
|         if(null!=model.getFenceName()&&!"".equals(model.getFenceName())){  | 
|             model.setFenceName(model.getFenceName().trim());  | 
|             //是否有重名电子围栏  | 
|             XzxElectronicFence oldInfo =queryElectronic(model);  | 
|             if(null!=oldInfo){  | 
|                 return JsonResult.failMessage("已经有相同的围栏名称,添加失败!");  | 
|             }else{  | 
|                 String longiLatiStr = "";  | 
|                 String longiLatiStr2 = "";  | 
|                 if(model.getFenceType().equals(OrderEnum.多边形围栏.getValue())){  | 
|                     List longLatiArrList = model.getLongLatiArrList();  | 
|                     if(null!=longLatiArrList&&longLatiArrList.size()>0){  | 
|                         ObjectMapper mapper = new ObjectMapper();  | 
|                         List<LongiLatiModel> LongiLati = mapper.convertValue(longLatiArrList, new TypeReference<List<LongiLatiModel>>() { });  | 
|                         Gson gson = new Gson();  | 
|                         String str = gson.toJson(LongiLati);  | 
|                         info.setLonglatiarr(str);  | 
|                         for (LongiLatiModel lola:LongiLati) {  | 
|                             if(null!=longiLatiStr&&!"".equals(longiLatiStr)){  | 
|                                 longiLatiStr = longiLatiStr+";"+lola.getLongitude()+","+lola.getLatitude();  | 
|                                 longiLatiStr2 = longiLatiStr2+"|"+lola.getLongitude()+","+lola.getLatitude();  | 
|                             }else{  | 
|                                 longiLatiStr =lola.getLongitude()+","+lola.getLatitude();  | 
|                                 longiLatiStr2 =lola.getLongitude()+","+lola.getLatitude();  | 
|                             }  | 
|   | 
|                         }  | 
|                     }else {  | 
|                         throw new RestException("请先添加经纬度");  | 
|                     }  | 
|                 }  | 
|                 info.setDelFlag(0);  | 
|                 if(null!=info.getKeyword()&&!"".equals(info.getKeyword())){  | 
|                     AreaModel areaModel = new AreaModel();  | 
|                     areaModel.setName(info.getKeyword());  | 
|                     AreaModel map = cityPartnerService.queryAreaLongiLati(areaModel);  | 
|                     info.setTownCode(map.getCode());  | 
|                     info.setLongitude(map.getLongitude());  | 
|                     info.setLatitude(map.getLatitude());  | 
|                 }  | 
|                 PartnerFence pfInfo = new PartnerFence();  | 
|                 XzxPartnerFenceModel pfInfo1 = new XzxPartnerFenceModel();  | 
|                 if(null!=partnerIds&&!"".equals(partnerIds)){  | 
|                     String partnerId = partnerIds;  | 
|                     if(null!=info.getKeyword()&&!"".equals(info.getKeyword())){  | 
|                         //校验该合伙人是否能创建电子围栏  | 
|                         String townId = queryAreaTownId(info.getKeyword());  | 
|                         if(null!=townId&&!"".equals(townId)){  | 
|                             if(townId.equals(Constants.YUELU_CODE)){  | 
|                                 return JsonResult.failMessage("岳麓区不能建区域围栏!");  | 
|                             }  | 
|                             if(townId.equals(Constants.YUHUA_CODE)){  | 
|                                 return JsonResult.failMessage("雨花区不能建区域围栏!");  | 
|                             }  | 
|                             boolean boolflag = queryPartnerAreaIds(partnerId,townId);  | 
|                             if(!boolflag){  | 
|                                 return JsonResult.failMessage("该合伙人不能创建该地区的电子围栏");  | 
|                             }else{  | 
|                                 //判断是否有在该区域建行政区  | 
|                                 if(model.getFenceType().equals(OrderEnum.行政区围栏.getValue())){  | 
|                                     //判断是否有在该区域建行政区  | 
|                                     List<String> townList = queryTownListByArea(info.getTownCode(),null);  | 
|                                     if(townList.size()>0){  | 
|                                         return JsonResult.failMessage(info.getKeyword()+" 已经建立行政区围栏,不能在该区域内创建其他围栏");  | 
|                                     }  | 
|                                 }  | 
|                             }  | 
|                         }else{  | 
|                             return JsonResult.failMessage("该合伙人不应属于该区域,无法创建电子围栏");  | 
|                         }  | 
|   | 
|                     }else{  | 
|                         String keyword="";  | 
|                         String[] keywordList = new String[20];  | 
|                         if(null!=longiLatiStr2&&!"".equals(longiLatiStr2)){  | 
|                             String location =info.getLonglatiarr();  | 
|                             CityPartner partner = cityPartnerService.queryById(partnerId);  | 
|                             keyword = queryLongiLatiForTownName(partner.getPartnerKey(),location,longiLatiStr2);  | 
|                             if(model.getFenceType().equals(OrderEnum.圆形围栏.getValue())){  | 
|                                 keywordList=null;  | 
|                             }else{  | 
|                                 keywordList = keyword.split(",");  | 
|   | 
|                             }  | 
|                         }else{  | 
|                             CityPartner partner = cityPartnerService.queryById(partnerId);  | 
|                             String location = model.getLongitude()+","+model.getLatitude();  | 
|                             keyword = queryLongiLatiForTownName(partner.getPartnerKey(),location,null);  | 
|                             if(model.getFenceType().equals(OrderEnum.圆形围栏.getValue())){  | 
|                                 keywordList=null;  | 
|                             }else{  | 
|                                 keywordList = keyword.split(",");  | 
|   | 
|                             }  | 
|                         }  | 
|                         if(null!=keyword&&!"".equals(keyword)){  | 
|                             if(null!=keywordList){  | 
|                                 if(keywordList.length>0){  | 
|                                     for (String keywords:keywordList) {  | 
|                                         if(null!=keywords&&!"".equals(keywords)){  | 
|                                             String[] obj = keywords.split("_");  | 
|                                             String keyword1 = obj[1];  | 
|                                             int num = Integer.parseInt(obj[0]);  | 
|                                             String townId = queryAreaTownId(keyword1);  | 
|                                             AreaModel areaModel1 = new AreaModel();  | 
|                                             areaModel1.setName(keyword1);  | 
|                                             AreaModel map1 = cityPartnerService.queryAreaLongiLati(areaModel1);  | 
|                                             info.setTownCode(map1.getCode());  | 
|                                             if(null!=townId&&!"".equals(townId)){  | 
|                                                 boolean boolflag = queryPartnerAreaIds(partnerId,townId);  | 
|                                                 if(!boolflag){  | 
|                                                     String[] ll2=  longiLatiStr.split(";");  | 
|                                                     String errorAddress = ll2[num];  | 
|                                                     return JsonResult.failMessage("该合伙人不应属于该区域,无法在经纬度为:"+errorAddress+" 创建电子围栏");  | 
|                                                 }else{  | 
|                                                     //判断是否有在该区域建行政区  | 
|                                                     List<String> townList = queryTownListByArea(info.getTownCode(),null);  | 
|                                                     if(townList.size()>0){  | 
|                                                         String[] ll2=  longiLatiStr.split(";");  | 
|                                                         String errorAddress = ll2[num];  | 
|                                                         return JsonResult.failMessage(keyword + " 已经建立行政区围栏,不能在:"+errorAddress+"该区域内创建其他围栏");  | 
|                                                     }  | 
|                                                 }  | 
|                                             }else{  | 
|                                                 return JsonResult.failMessage("区域为空,不能创建电子围栏");  | 
|                                             }  | 
|                                         }else{  | 
|                                             continue;  | 
|                                         }  | 
|                                     }  | 
|                                 }  | 
|                             }else{  | 
|                                 String townId = queryAreaTownId(keyword);  | 
|                                 AreaModel areaModel1 = new AreaModel();  | 
|                                 areaModel1.setName(keyword);  | 
|                                 AreaModel map1 = cityPartnerService.queryAreaLongiLati(areaModel1);  | 
|                                 info.setTownCode(map1.getCode());  | 
|                                 if(null!=townId&&!"".equals(townId)){  | 
|                                     boolean boolflag = queryPartnerAreaIds(partnerId,townId);  | 
|                                     if(!boolflag){  | 
|                                         return JsonResult.failMessage("该合伙人不应属于该区域,无法创建电子围栏");  | 
|                                     }else{  | 
|                                         //判断是否有在该区域建行政区  | 
|                                         List<String> townList = queryTownListByArea(info.getTownCode(),null);  | 
|                                         if(townList.size()>0){  | 
|                                             return JsonResult.failMessage(keyword + " 已经建立行政区围栏,不能在该区域内创建其他围栏");  | 
|                                         }  | 
|                                     }  | 
|                                 }else{  | 
|                                     return JsonResult.failMessage("区域为空,不能创建电子围栏");  | 
|                                 }  | 
|                             }  | 
|   | 
|                         }else{  | 
|                             return JsonResult.failMessage("找不到该区域,不能创建电子围栏");  | 
|                         }  | 
|                     }  | 
|                     pfInfo.setFenceId(info.getId()+"");  | 
|                     pfInfo.setPartnerId(partnerId);  | 
|                     pfInfo1.setPartnerId(partnerId);  | 
|                     if(model.getFenceType().equals(OrderEnum.行政区围栏.getValue())){  | 
|                         //判断行政区是否有其他围栏  | 
|                         List<String> idsOD = queryODByArea(info.getTownCode());  | 
|                         if(idsOD.size()>0){  | 
|                             return JsonResult.failMessage(info.getKeyword()+"已经建立围栏,不能在该区域内创建行政区围栏!");  | 
|                         }  | 
|                     }else{  | 
| //                        String resultJson = createGDFence(info,pfInfo1,FENCE_URL,longiLatiStr);  | 
|                         CityPartner  partner = cityPartnerService.queryById(pfInfo.getPartnerId());  | 
|                         String key = partner.getPartnerKey();  | 
|                         Map<String,String> map = new HashMap<>();  | 
|                         map.put("name",info.getFenceName());  | 
|                         if(null!=longiLatiStr&&!"".equals(longiLatiStr)){  | 
|                             map.put("points",longiLatiStr);  | 
|                         }else{  | 
|                             map.put("center",info.getLongitude()+","+info.getLatitude());  | 
|                             map.put("radius",String.valueOf(info.getRadius()));  | 
|                         }  | 
|   | 
|   | 
|                         map.put("enable","true");  | 
|                         map.put("valid_time","2054-12-30");  | 
|                         map.put("repeat","Mon,Tues,Wed,Thur,Fri,Sat,Sun");  | 
|                         //map.put("time","00:00,11:59;13:00,20:59");  | 
|                         map.put("desc",info.getFenceName());  | 
|                         map.put("alert_condition","enter;leave");  | 
|                         CreateFenceDto createFenceDto = BeanUtil.mapToBean(map, CreateFenceDto.class, true);  | 
|                         Result<String> resultJson = GdMapUtil.createFence(key, createFenceDto);  | 
|                         if(resultJson.getCode()==0){  | 
|                             info.setGid(resultJson.getData());  | 
|                         }else{  | 
|                             return JsonResult.failMessage("高德创建电子围栏失败,原因:"+resultJson.getMsg());  | 
|                         }  | 
|                     }  | 
|                 }else{  | 
|                     return JsonResult.failMessage("新增电子围栏失败");  | 
|                 }  | 
|   | 
|                 info.setLonglatiarr(longiLatiStr);  | 
|                 if(partnerIds.equals(Constants.DEFAULT_PARTNER_ID)){  | 
|                     //如果是岳麓区或雨花区的围栏 修改为天心区的  | 
|                     if(null!=info.getTownCode()&&!"".equals(info.getTownCode())){  | 
|                         if(businessUtil.isSpecialAreaByAdcode(info.getTownCode())){  | 
|                             info.setTownCode(Constants.TIANXIN_ADCODE);  | 
|                         }  | 
|                     }  | 
|                 }  | 
|                 //保存围栏  | 
|                 boolean bool = save(info);  | 
|                 if(!bool){  | 
|                     return JsonResult.failMessage("新增电子围栏失败");  | 
|                 }else{  | 
|                     //是否关联合伙人  | 
|                     //修改关联表  | 
|                     pfInfo.setFenceId(info.getId()+"");  | 
|                     pfInfo.setDelFlag(0);  | 
|                     pfInfo.setCreateTime(DateUtil.now());  | 
|                     partnerFenceService.save(pfInfo);  | 
|   | 
|                     return JsonResult.success(pfInfo.getFenceId());  | 
|                 }  | 
|             }  | 
|         }else{  | 
|             return JsonResult.failMessage("电子围栏名称不能为空!");  | 
|   | 
|         }  | 
|     }  | 
|   | 
|     /**  | 
|      * 修改电子围栏  | 
|      * @param model  | 
|      * @return  | 
|      */  | 
|     public JsonResult<String> updateFence(XzxElectronicFenceModel model){  | 
|         String partnerIds = model.getPartnerIds();  | 
|         if(StrUtil.isBlank(partnerIds)){  | 
|             return JsonResult.failMessage("必须填写关联合伙人!");  | 
|         }  | 
|   | 
|         ObjectMapper objectMapper = new ObjectMapper();  | 
|         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);  | 
|         Fence info = objectMapper.convertValue(model, Fence.class);  | 
|         Fence oldInfo1 =queryById(info.getId());  | 
|         info.setGid(oldInfo1.getGid());  | 
|         if(null!=model.getFenceName()&&!"".equals(model.getFenceName())){  | 
|             model.setFenceName(model.getFenceName().trim());  | 
|             //是否有重名电子围栏  | 
|             XzxElectronicFence oldInfo =queryElectronic(model);  | 
|             if(null!=oldInfo){  | 
|                 return JsonResult.failMessage("已经有相同的围栏名称,修改失败!");  | 
|             }else{  | 
|                 String longiLatiStr = "";  | 
|                 String longiLatiStr2 = "";  | 
|                 if(model.getFenceType().equals("4")){  | 
|                     List longLatiArrList = model.getLongLatiArrList();  | 
|   | 
|                     if(null!=longLatiArrList&&longLatiArrList.size()>0){  | 
|                         ObjectMapper mapper = new ObjectMapper();  | 
|                         List<LongiLatiModel> LongiLati = mapper.convertValue(longLatiArrList, new TypeReference<List<LongiLatiModel>>() { });  | 
|                         Gson gson = new Gson();  | 
|                         String str = gson.toJson(LongiLati);  | 
|                         info.setLonglatiarr(str);  | 
|                         for (LongiLatiModel lola:LongiLati) {  | 
|                             if(null!=longiLatiStr&&!"".equals(longiLatiStr)){  | 
|                                 longiLatiStr = longiLatiStr+";"+lola.getLongitude()+","+lola.getLatitude();  | 
|                                 longiLatiStr2 = longiLatiStr2+"|"+lola.getLongitude()+","+lola.getLatitude();  | 
|                             }else{  | 
|                                 longiLatiStr =lola.getLongitude()+","+lola.getLatitude();  | 
|                                 longiLatiStr2 =lola.getLongitude()+","+lola.getLatitude();  | 
|                             }  | 
|   | 
|                         }  | 
|                     }else {  | 
|                         throw new RestException("请先添加经纬度");  | 
|                     }  | 
|                 }  | 
|                 if(model.getFenceType().equals("3")){  | 
|                     info.setKeyword("");  | 
|                 }  | 
|                 info.setDelFlag(0);  | 
|                 info.setCreateTime(DateUtil.now());  | 
|                 if(null!=info.getKeyword()&&!"".equals(info.getKeyword())){  | 
|                     AreaModel areaModel = new AreaModel();  | 
|                     areaModel.setName(info.getKeyword());  | 
|                     AreaModel map = cityPartnerService.queryAreaLongiLati(areaModel);  | 
|                     info.setTownCode(map.getCode());  | 
|                     info.setLongitude(map.getLongitude());  | 
|                     info.setLatitude(map.getLatitude());  | 
|                     //该电子围栏是否包含该区域。  | 
|                 }  | 
|                 PartnerFence pfInfo = new PartnerFence();  | 
|                 XzxPartnerFenceModel pfInfo1 = new XzxPartnerFenceModel();  | 
|                 if(null!=partnerIds&&!"".equals(partnerIds)){  | 
|                     String partnerId = partnerIds;  | 
|                     if(null!=info.getKeyword()&&!"".equals(info.getKeyword())){  | 
|                         //校验该合伙人是否能创建电子围栏  | 
|                         String townId = queryAreaTownId(info.getKeyword());  | 
|                         if(null!=townId&&!"".equals(townId)){  | 
|                             boolean boolflag = queryPartnerAreaIds(partnerId,townId);  | 
|                             if(!boolflag){  | 
|                                 return JsonResult.failMessage("该合伙人不能创建该地区的电子围栏");  | 
|                             }else{  | 
|                                 //判断是否有在该区域建行政区  | 
|                                 if(model.getFenceType().equals("2")){  | 
|                                     //判断是否有在该区域建行政区  | 
|                                     List<String> townList = queryTownListByArea(info.getTownCode(),info.getId()+"");  | 
|                                     if(townList.size()>0){  | 
|                                         return JsonResult.failMessage("该区域不能创建电子围栏");  | 
|                                     }  | 
|   | 
|                                 }  | 
|                             }  | 
|                         }else{  | 
|                             return JsonResult.failMessage("该区域不能创建电子围栏");  | 
|                         }  | 
|   | 
|                     }else{  | 
|                         String keyword="";  | 
|                         List<String> keywordList =CollUtil.newArrayList();  | 
|                         if(null!=longiLatiStr2&&!"".equals(longiLatiStr2)){  | 
|                             String location =info.getLonglatiarr();  | 
|                             CityPartner partner = cityPartnerService.queryById(partnerId);  | 
|                             keyword = queryLongiLatiForTownName(partner.getPartnerKey(),location,longiLatiStr2);  | 
|                             keywordList = Arrays.asList(keyword.split(","));  | 
|                         }else{  | 
|                             CityPartner partner = cityPartnerService.queryById(partnerId);  | 
|                             String location = model.getLongitude()+","+model.getLatitude();  | 
|                             keyword = queryLongiLatiForTownName(partner.getPartnerKey(),location,null);  | 
|   | 
|                         }  | 
|                         if(null!=keyword&&!"".equals(keyword)){  | 
|                             if(CollUtil.isNotEmpty(keywordList)){  | 
|                                 for (String keywords:keywordList) {  | 
|                                     String[] obj = keywords.split("_");  | 
|                                     String keyword1 = obj[1];  | 
|                                     int num = Integer.parseInt(obj[0]);  | 
|                                     String townId = queryAreaTownId(keyword1);  | 
|                                     AreaModel areaModel1 = new AreaModel();  | 
|                                     areaModel1.setName(keyword1);  | 
|                                     AreaModel map1 = cityPartnerService.queryAreaLongiLati(areaModel1);  | 
|                                     info.setTownCode(map1.getCode());  | 
|                                     if(null!=townId&&!"".equals(townId)){  | 
|                                         boolean boolflag = queryPartnerAreaIds(partnerId,townId);  | 
|                                         if(!boolflag){  | 
|                                             String[] ll2=  longiLatiStr.split(";");  | 
|                                             String errorAddress = ll2[num];  | 
|                                             return JsonResult.failMessage("该合伙人不应属于该区域,无法在经纬度为:"+errorAddress+" 创建电子围栏");  | 
|                                         }else{  | 
|                                             //判断是否有在该区域建行政区  | 
|                                             List<String> townList = queryTownListByArea(info.getTownCode(),null);  | 
|                                             if(townList.size()>0){  | 
|                                                 String[] ll2=  longiLatiStr.split(";");  | 
|                                                 String errorAddress = ll2[num];  | 
|                                                 return JsonResult.failMessage(keyword + " 已经建立行政区围栏,不能在:"+errorAddress+"该区域内创建其他围栏");  | 
|                                             }  | 
|                                         }  | 
|                                     }else{  | 
|                                         return JsonResult.failMessage("区域为空,不能创建电子围栏");  | 
|                                     }  | 
|                                 }  | 
|                             }else{  | 
|                                 String townId = queryAreaTownId(keyword);  | 
|                                 if(null!=townId&&!"".equals(townId)){  | 
|                                     boolean boolflag = queryPartnerAreaIds(partnerId,townId);  | 
|                                     if(!boolflag){  | 
|                                         return JsonResult.failMessage("该合伙人不能创建该地区的电子围栏");  | 
|                                     }else{  | 
|                                         //判断是否有在该区域建行政区  | 
|                                         List<String> townList = queryTownListByArea(info.getTownCode(),info.getId()+"");  | 
|                                         if(townList.size()>0){  | 
|                                             return JsonResult.failMessage("该区域不能修改电子围栏");  | 
|                                         }  | 
|                                     }  | 
|                                 }else{  | 
|                                     return JsonResult.failMessage("该区域不能创建电子围栏");  | 
|                                 }  | 
|                             }  | 
|   | 
|                         }else{  | 
|                             return JsonResult.failMessage("该区域不能创建电子围栏");  | 
|                         }  | 
|   | 
|                     }  | 
|                     pfInfo.setFenceId(info.getId()+"");  | 
|                     pfInfo.setPartnerId(partnerId);  | 
|                     pfInfo1.setPartnerId(partnerId);  | 
|                     if(oldInfo1.getGid()!=null&&!"".equals(oldInfo1.getGid())){  | 
|                         String gid = oldInfo1.getGid();  | 
|                         updateGDFence(info,pfInfo1,longiLatiStr,gid);  | 
|                     }  | 
|   | 
|                 }else{  | 
|                     return JsonResult.failMessage("修改电子围栏失败");  | 
|                 }  | 
|                 info.setLonglatiarr(longiLatiStr);  | 
|                 if(partnerIds.equals(Constants.DEFAULT_PARTNER_ID)){  | 
|                     //如果是岳麓区或雨花区的围栏 修改为天心区的  | 
|                     if(null!=info.getTownCode()&&!"".equals(info.getTownCode())){  | 
|                         if(businessUtil.isSpecialAreaByAdcode(info.getTownCode())){  | 
|                             info.setTownCode(Constants.TIANXIN_ADCODE);  | 
|                         }  | 
|                     }  | 
|                 }  | 
|                 boolean bool = update(info);  | 
|                 if(!bool){  | 
|                     return JsonResult.failMessage("修改电子围栏失败");  | 
|                 }else{  | 
|                     //修改关联表  | 
|                     //pfInfo.setPartnerId();  | 
|                     pfInfo.setFenceId(info.getId()+"");  | 
|                     pfInfo.setDelFlag(0);  | 
|                     pfInfo.setUpdateTime(DateUtil.now());  | 
|   | 
|                     partnerFenceService.updateByFenceId(pfInfo);  | 
|                     return JsonResult.success(pfInfo.getFenceId());  | 
|                 }  | 
|   | 
|             }  | 
|         }else{  | 
|             return JsonResult.failMessage("电子围栏名称不能为空!");  | 
|   | 
|         }  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 删除高德围栏  | 
|      * @param model  | 
|      */  | 
|     public  void deleteFence(XzxElectronicFenceModel model){  | 
|         Fence info = queryById(model.getId());  | 
|         info.setDelFlag(1);  | 
|         update(info);  | 
|         CityPartner partner= partnerFenceService.queryPartnerIds(model.getId()+"");  | 
|         if(null!=partner){  | 
|             //删除高德围栏  | 
|             String gid = info.getGid();  | 
|             if(null!=gid&&!"".equals(gid)){  | 
|                 GdMapUtil.deleteFence(partner.getPartnerKey(),info.getGid());  | 
|             }  | 
|   | 
|         }  | 
|         //删除管理合伙人  | 
|         partnerFenceService.deleteByFenceId(model.getId()+"");  | 
|     }  | 
| }  |