无关风月
2025-03-19 12293a8893a129357fa0603550604df225bc2784
DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -235,8 +235,16 @@
            public void run() {
                if(pushMinistryOfTransport){
                    //上传数据
                    pushMinistryOfTransportUtil.orderCreate(orderId);
                    pushMinistryOfTransportUtil.orderMatch(orderId);
                    try {
                        pushMinistryOfTransportUtil.orderCreate(orderId);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                    try {
                        pushMinistryOfTransportUtil.orderMatch(orderId);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }).start();
@@ -323,99 +331,104 @@
                // 结束服务时查询轨迹,计算距离
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                String tid = gdFalconUtil.selectTerminal(driver.getPhone());
                String result = gdFalconUtil.selectTrack(tid, orderPrivateCar.getTrackId(),1);
                JSONObject jsonObject = JSONObject.parseObject(result);
                JSONArray tracks = jsonObject.getJSONArray("tracks");
                Integer counts = jsonObject.getInteger("counts");
                JSONArray points = new JSONArray();
                // 如果一单轨迹点数大于999,需进行分页查询,将所有的点查询出
                if(counts > 999){
                    int i = counts%999;
                    for (int j = 1; j < i + 1; j++) {
                        String res = gdFalconUtil.selectTrack(tid, orderPrivateCar.getTrackId(),1);
                        JSONObject jsonObject1 = JSONObject.parseObject(res);
                        JSONArray tracks1 = jsonObject1.getJSONArray("tracks");
                        Object ob = tracks1.get(0);
                double sum = 0;
                try {
                    String tid = gdFalconUtil.selectTerminal(driver.getPhone());
                    String result = gdFalconUtil.selectTrack(tid, orderPrivateCar.getTrackId(),1);
                    JSONObject jsonObject = JSONObject.parseObject(result);
                    JSONArray tracks = jsonObject.getJSONArray("tracks");
                    Integer counts = jsonObject.getInteger("counts");
                    JSONArray points = new JSONArray();
                    // 如果一单轨迹点数大于999,需进行分页查询,将所有的点查询出
                    if(counts > 999){
                        int i = counts%999;
                        for (int j = 1; j < i + 1; j++) {
                            String res = gdFalconUtil.selectTrack(tid, orderPrivateCar.getTrackId(),1);
                            JSONObject jsonObject1 = JSONObject.parseObject(res);
                            JSONArray tracks1 = jsonObject1.getJSONArray("tracks");
                            Object ob = tracks1.get(0);
                            String obs = JSONObject.toJSONString(ob);
                            JSONObject object = JSONObject.parseObject(obs);
                            JSONArray point = object.getJSONArray("points");
                            points.addAll(point);
                        }
                    }
                    // 轨迹点数小于999,一页查询出即可
                    if(counts > 0 && counts < 999){
                        Object ob = tracks.get(0);
                        String obs = JSONObject.toJSONString(ob);
                        JSONObject object = JSONObject.parseObject(obs);
                        JSONArray point = object.getJSONArray("points");
                        points.addAll(point);
                    }
                }
                // 轨迹点数小于999,一页查询出即可
                if(counts > 0 && counts < 999){
                    Object ob = tracks.get(0);
                    String obs = JSONObject.toJSONString(ob);
                    JSONObject object = JSONObject.parseObject(obs);
                    JSONArray point = object.getJSONArray("points");
                    points.addAll(point);
                }
                System.out.println("轨迹坐标点=====:"+points);
                String toLonLat = "";
                double sum = 0;
                List<OrderPosition> orderPositions = new ArrayList<>();
                for (Object o : points) {
                    String s = JSONObject.toJSONString(o);
                    JSONObject obj = JSONObject.parseObject(s);
                    String fromLonLat = obj.getString("location");
                    String[] split = fromLonLat.split(",");
                    Long locatetime = obj.getLong("locatetime");
                    Date date = new Date(locatetime);
                    if(date.after(orderPrivateCar.getStartServiceTime()) && date.before(orderPrivateCar.getEndServiceTime())){
                        // 封装定位文件里的单个定位对象
                        OrderPosition orderPosition = new OrderPosition();
                        orderPosition.setOrderId(orderId);
                        orderPosition.setOrderType(1);
                        orderPosition.setDriverId(orderPrivateCar.getDriverId());
                        orderPosition.setLat(split[1]);
                        orderPosition.setLon(split[0]);
                        orderPosition.setAltitude("0");
                        orderPosition.setDirectionAngle("0");
                        //先计算里程,在存储最新位置
                        orderPosition.setInsertTime(new Date());
                        orderPositions.add(orderPosition);
                    String toLonLat = "";
                    List<OrderPosition> orderPositions = new ArrayList<>();
                    for (Object o : points) {
                        String s = JSONObject.toJSONString(o);
                        JSONObject obj = JSONObject.parseObject(s);
                        String fromLonLat = obj.getString("location");
                        String[] split = fromLonLat.split(",");
                        Long locatetime = obj.getLong("locatetime");
                        Date date = new Date(locatetime);
                        if(date.after(orderPrivateCar.getStartServiceTime()) && date.before(orderPrivateCar.getEndServiceTime())){
                            // 封装定位文件里的单个定位对象
                            OrderPosition orderPosition = new OrderPosition();
                            orderPosition.setOrderId(orderId);
                            orderPosition.setOrderType(1);
                            orderPosition.setDriverId(orderPrivateCar.getDriverId());
                            orderPosition.setLat(split[1]);
                            orderPosition.setLon(split[0]);
                            orderPosition.setAltitude("0");
                            orderPosition.setDirectionAngle("0");
                            //先计算里程,在存储最新位置
                            orderPosition.setInsertTime(new Date());
                            orderPositions.add(orderPosition);
                            if(StringUtils.hasLength(fromLonLat) && StringUtils.hasLength(toLonLat)){
                                String[] from = fromLonLat.split(",");
                                String[] to = toLonLat.split(",");
                                GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0]));
                                GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0]));
                                double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84);
                                sum += WGS84;
                            }
                            toLonLat = fromLonLat;
                        }
                    }
                    //存储轨迹
                    // 将数据存储到文件中
                    File file = new File(filePath + orderId + "_" + 1 + ".txt");
                    if(!file.exists()){
                        file.getParentFile().mkdirs();
                        file.createNewFile();
                    }
                    //写入相应的文件
                    PrintWriter out = new PrintWriter(new FileWriter(file));
                    out.write(JSON.toJSONString(orderPositions));
                    out.flush();
                    out.close();
                }catch (Exception e){
                    e.printStackTrace();
                    System.err.println("查询高德轨迹出错,使用本地轨迹计算");
                    List<OrderPosition> list = orderPositionService.queryPosition(orderId, 1);
                    String fromLonLat = "";
                    for (OrderPosition orderPosition : list) {
                        String toLonLat = orderPosition.getLon() + "," + orderPosition.getLat();
                        if(StringUtils.hasLength(fromLonLat) && StringUtils.hasLength(toLonLat)){
                            String[] from = fromLonLat.split(",");
                            String[] to = toLonLat.split(",");
                            GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0]));
                            GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0]));
                            double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84);
                            System.err.println("WGS84坐标系计算结果:"+WGS84 + "米");
                            sum += WGS84;
                        }
                        toLonLat = fromLonLat;
                        fromLonLat = toLonLat;
                    }
                }
                //存储轨迹
                // 将数据存储到文件中
                File file = new File(filePath + orderId + "_" + 1 + ".txt");
                if(!file.exists()){
                    file.getParentFile().mkdirs();
                    file.createNewFile();
                }
                //写入相应的文件
                PrintWriter out = new PrintWriter(new FileWriter(file));
                out.write(JSON.toJSONString(orderPositions));
                out.flush();
                out.close();
                //获取预估里程,使用预估里程作为行驶里程计算金额
                String origins = orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat();
                String destination = orderPrivateCar.getGetoffLon() + "," + orderPrivateCar.getGetoffLat();
                Map<String, String> distance = gdMapElectricFenceUtil.getDistance(origins, destination, 1);
                Double distance1 = Double.valueOf(distance.get("distance"));
                if(distance1 - sum > 1000){
                    orderPrivateCar.setMileage(distance1);
                    orderPrivateCar.setIsAbnormal(1);
                }else{
                    orderPrivateCar.setMileage(sum);
                    orderPrivateCar.setIsAbnormal(0);
                }
                orderPrivateCar.setMileage(sum);
                orderPrivateCar.setIsAbnormal(0);
                break;
        }
        this.updateById(orderPrivateCar);