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()+"");
|
}
|
}
|