Pu Zhibing
8 天以前 ccb2a08682a051a8936c45d74e0047186e436938
MessagePushTravel/src/main/java/com/sinata/push/util/echo/NettyServerController.java
@@ -5,6 +5,7 @@
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sinata.push.config.QYTConfig;
import com.sinata.push.util.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -33,18 +34,25 @@
   public static Hashtable<String, Hashtable<ChannelHandlerContext, String>> map = new Hashtable<String, Hashtable<ChannelHandlerContext,String>>();
   public static Hashtable<String,String> table;
   public static QYTConfig qytConfig;
   private RedisUtil redisUtil = SpringUtil.getObject(RedisUtil.class);
   
   private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
   static{
      if(table == null){
         table = new Hashtable<>();
      }
   }
   public static void setQytConfig(QYTConfig qytConfig) {
      NettyServerController.qytConfig = qytConfig;
   }
   
   public static boolean isdebug = false;
@@ -95,13 +103,15 @@
                String userId1 = jsonCon.getString("userId");
            String device = jsonCon.getString("device");
            String version = jsonCon.getString("version");
            String businessType = jsonCon.getString("businessType");//1:打车,2=代驾
            String business = "2".equals(businessType) ? "daijia" : "dache";
                if(StringUtil.isNotEmpty(userId1)){
                    //判断用户或者司机长连接
                    if(type==1){
                        //确保账号在单个设备上登录
                        if(StringUtil.isNotEmpty(token)){
                            String token_ = redisUtil.getValue("USER_APP_"+ userId1);//获取缓存中最新的数据
                            String token_ = redisUtil.getValue(business + ":USER_APP_"+ userId1);//获取缓存中最新的数据
                            if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向其他设备发送数据
                        ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(token_.length() - 16));
                        JSONObject msg_ = new JSONObject();
@@ -121,18 +131,18 @@
                                }, 5000);
                            }
                            NettyChannelMap.update_(token.substring(token.length() - 16), ctx);
                            NettyChannelMap.update("USER" + userId1, ctx);
                     redisUtil.setStrValue("USER_APP_" + userId1, token);
                            NettyChannelMap.update(business + ":USER" + userId1, ctx);
                     redisUtil.setStrValue(business + ":USER_APP_" + userId1, token);
                        }
                  //存储通讯通道
                  if(null != ctx && ctx.channel().isActive()){
                     NettyChannelMap.update("USER" + userId1, ctx);
                     NettyChannelMap.update(business + ":USER" + userId1, ctx);
                  }
                    }else{
                        //确保账号在单个设备上登录
                  if(StringUtil.isNotEmpty(token)){//APP端登录的操作
                            String token_ = redisUtil.getValue("DRIVER_" + userId1);//缓存中拿最新数据
                            String token_ = redisUtil.getValue(business + ":DRIVER_" + userId1);//缓存中拿最新数据
                            if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向当前设备发送数据
                                ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(token_.length() - 16));
                                if(null != data_){
@@ -147,13 +157,13 @@
                           }
                        }
                            }
                            NettyChannelMap.update("DRIVER" + userId1, ctx);
                            NettyChannelMap.update(business + ":DRIVER" + userId1, ctx);
                            NettyChannelMap.update_(token.substring(token.length() - 16), ctx);
                     redisUtil.setStrValue("DRIVER_" + userId1, token);
                     redisUtil.setStrValue(business + ":DRIVER_" + userId1, token);
                        }
                  //存储通讯通道
                        if(null != ctx && ctx.channel().isActive()){
                            NettyChannelMap.update("DRIVER" + userId1, ctx);
                            NettyChannelMap.update(business + ":DRIVER" + userId1, ctx);
                        }
                    }
                }
@@ -166,15 +176,18 @@
         //司机上传位置
         if(method.equals(Method.location)){
            Integer driverId = jsonCon.getInteger("driverId");
            String fluid_control = redisUtil.getValue("location_" + driverId);
            String businessType = jsonCon.getString("businessType");//1:打车,2=代驾
            String business = "2".equals(businessType) || null==businessType ? "daijia" : "dache";
            String fluid_control = redisUtil.getValue(business + ":location_" + driverId);
            if(!StringUtils.hasLength(fluid_control)){
               redisUtil.setStrValue("location_" + driverId, System.currentTimeMillis() + "");
               redisUtil.setStrValue(business + ":location_" + driverId, System.currentTimeMillis() + "");
            }else{
               long l = System.currentTimeMillis() - Long.valueOf(fluid_control);
               if(l < 5000){
                  return;
               }
               redisUtil.setStrValue("location_" + driverId, System.currentTimeMillis() + "");
               redisUtil.setStrValue(business + ":location_" + driverId, System.currentTimeMillis() + "");
            }
            
            Integer orderId = jsonCon.getInteger("orderId");
@@ -186,16 +199,44 @@
            System.out.println("司机上传位置:" + sdf.format(new Date()) + "----" + jsonCon.toJSONString());
            if(SinataUtil.isNotEmpty(driverId)){
               if(null !=  lon && 0 != lon && null !=  lat && 0 != lat){
                  if(null != orderId && 0 != driverId && null != orderType && 0 != orderType){//开始存入数据库
                  if("dache".equals(business)){
                     if(null != orderId && 0 != driverId && null != orderType && 0 != orderType){//开始存入数据库
                        Map<String, Object> params = new HashMap<>();
                        params.put("orderType", String.valueOf(orderType));
                        params.put("orderId", String.valueOf(orderId));
                        params.put("driverId", String.valueOf(driverId));
                        params.put("lon", String.valueOf(lon));
                        params.put("lat", String.valueOf(lat));
                        params.put("directionAngle", String.valueOf(computeAzimuth));
                        params.put("altitude", String.valueOf(altitude));
                        HttpRequest post = HttpUtil.createPost(qytConfig.getChuxingUrl() + "/driver-server/base/savePosition");
                        post.contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE);
                        post.form(params);
                        HttpResponse execute = post.execute();
                        if(200 != execute.getStatus()){
                           System.err.println("调用driver-server存储位置数据出错了");
                        }
                        JSONObject jsonObject = JSON.parseObject(execute.body(), JSONObject.class);
                        if(jsonObject.getIntValue("code") != 200){
                           System.err.println("调用driver-server存储位置数据出错了");
                        }
                     }
                  }
                  if("daijia".equals(business)){
                     HttpHeaders headers = new HttpHeaders();
                     // 以表单的方式提交
                     headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
                     //将请求头部和参数合成一个请求
                     Map<String, Object> params = new HashMap<>();
                     params.put("orderType", String.valueOf(orderType));
                     params.put("orderId", String.valueOf(orderId));
                     params.put("orderType", null == orderType ? orderType : String.valueOf(orderType));
                     params.put("orderId", null == orderId ? orderId : String.valueOf(orderId));
                     params.put("driverId", String.valueOf(driverId));
                     params.put("lon", String.valueOf(lon));
                     params.put("lat", String.valueOf(lat));
                     params.put("directionAngle", String.valueOf(computeAzimuth));
                     params.put("altitude", String.valueOf(altitude));
                     HttpRequest post = HttpUtil.createPost(URLUtil.zuul + "/driver-server/base/savePosition");
                     HttpRequest post = HttpUtil.createPost(qytConfig.getDaijiaurl() + "/driver-server/base/driver/addDriverPosition");
                     post.contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE);
                     post.form(params);
                     HttpResponse execute = post.execute();
@@ -207,7 +248,8 @@
                        System.err.println("调用driver-server存储位置数据出错了");
                     }
                  }
                  redisUtil.setStrValue("DRIVER" + driverId, lon + "," + lat, 30);//实时位置存入redis中
                  redisUtil.setStrValue(business + ":DRIVER" + driverId, lon + "," + lat, 30);//实时位置存入redis中
               }else{
                  this.sendMsgToClient(ctx, "__error__" + msg.toString());
               }