Pu Zhibing
15 小时以前 1da73e129402bb3923e92f3d561ac49acc87fee5
UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -195,6 +195,9 @@
    @Value("${pushMinistryOfTransport}")
    private boolean pushMinistryOfTransport;
    @Autowired
    private IAppOperationLogService appOperationLogService;
    /**
@@ -215,9 +218,9 @@
     * @throws Exception
     */
    @Override
    public synchronized ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat, String startLon, String startLat,
                                          String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid,
                                                                    BigDecimal estimatedPrice,String cityCode,Integer carIndex) throws Exception {
    public ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat, String startLon, String startLat,
                                                       String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid,
                                                       BigDecimal estimatedPrice, String cityCode, Integer carIndex) throws Exception {
        long timeMillis = System.currentTimeMillis();
        //如果出行时间大于当前10分钟则默认为预约单
        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
@@ -364,6 +367,9 @@
            orderPrivateCar.setEstimatedPrice(data.getAmount());
            orderPrivateCar.setPayMethod(0);
            this.insert(orderPrivateCar);
            appOperationLogService.addAppOperationLog(uid, "{\"type\":\"用户下单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderPrivateCar\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
            BaseWarpper baseWarpper = new BaseWarpper();
            baseWarpper.setId(orderPrivateCar.getId());
            baseWarpper.setState(orderPrivateCar.getState());
@@ -376,7 +382,7 @@
            orderPrivateCar.setIsDelete(1);
            orderPrivateCar.setPayMethod(1);
            this.insert(orderPrivateCar);
            appOperationLogService.addAppOperationLog(uid, "{\"type\":\"用户下单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderPrivateCar\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
            if(orderSource == 2){//扫码下单
                new Thread(new Runnable() {
                    @Override
@@ -410,58 +416,102 @@
                        if(drivers.size() > 0) {//有司机,直接指派给司机
                            Driver dr = null;
                            if (drivers.size() > 1) {
                                List<Driver> ds = new ArrayList<>();//存储直线距离最近的几个司机
                                for (int i = 0; i < assignOrder.getPeople(); i++) {
                                    Driver driver = null;
                                    int m = 0;
                                    int index = 0;
                                    // 查询预约单
                                    List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
                                    List<Integer> orderPrivateCarDriverIds = orderPrivateCars.stream().map(OrderPrivateCar::getDriverId).collect(Collectors.toList());
                                    for (int j = 0; j < drivers.size(); j++) {
                                        Driver driver1 = drivers.get(j);
                                        if (orderPrivateCar.getOrderType() == 2 && orderPrivateCarDriverIds.contains(driver.getId())) {
                                            continue;
                                        }
                                        // 判断该司机是否有30分钟内预约单
                                        long count = orderPrivateCarss.stream().filter(s -> s.getDriverId().equals(driver1.getId()) &&
                                                DateUtil.dateToLocalDateTime(s.getTravelTime()).minusMinutes(query.getLimitationTime()).isBefore(LocalDateTime.now())).count();
                                        if (count > 0) {
                                            continue;
                                        }
                                        String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
                                        if (null != value) {
                                            Map<String, Double> distance1 = geodesyUtil.getDistance(orderPrivateCar.getStartLat() + "," + orderPrivateCar.getStartLon(), value);
                                            int d = distance1.get("WGS84").intValue();
                                            if ((0 == m && null == driver) || (d < m)) {
                                                driver = drivers.get(j);
                                                m = d;
                                                index = j;
                                            }
                                List<Driver> ds = new ArrayList<>();
                                double dis = assignOrder.getDistance() * 1000;
                                // 查询预约单
                                List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
                                List<Integer> orderPrivateCarDriverIds = orderPrivateCars.stream().map(OrderPrivateCar::getDriverId).collect(Collectors.toList());
                                for (int j = 0; j < drivers.size(); j++) {
                                    Driver driver1 = drivers.get(j);
                                    driver1.setDistance(0D);
                                    if (orderPrivateCar.getOrderType() == 2 && orderPrivateCarDriverIds.contains(driver1.getId())) {
                                        continue;
                                    }
                                    // 判断该司机是否有30分钟内预约单
                                    long count = orderPrivateCarss.stream().filter(s -> s.getDriverId().equals(driver1.getId()) &&
                                            DateUtil.dateToLocalDateTime(s.getTravelTime()).minusMinutes(query.getLimitationTime()).isBefore(LocalDateTime.now())).count();
                                    if (count > 0) {
                                        continue;
                                    }
                                    String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
                                    if (null != value) {
                                        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1);
                                        double d = Double.parseDouble(distance.get("distance"));
                                        if(dis >= d){
                                            driver1.setDistance(d);
                                            ds.add(driver1);
                                        }
                                    }
                                    ds.add(driver);
                                    drivers.remove(index);
                                }
                                //再根据直线距离最短的司机中找出行驶距离最短的司机
                                Integer m = 0;
                                for (Driver driver : ds) {
                                    String value = redisUtil.getValue("DRIVER" + driver.getId());
                                    if (null != value) {
                                        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLon + "," + startLat, value, 1);
                                        int distance1 = Integer.parseInt(distance.get("distance"));
                                        if ((0 == m && null == dr) || (distance1 < m.intValue())) {
                                            dr = driver;
                                            m = distance1;
                                if(!ds.isEmpty()){
                                    ds.sort(new Comparator<Driver>() {
                                        @Override
                                        public int compare(Driver o1, Driver o2) {
                                            return o1.getDistance().compareTo(o2.getDistance());
                                        }
                                    }
                                    });
                                    appOperationLogService.addAppOperationLog(uid, "{\"type\":\"指派推单,符合条件的司机\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"driver\":\"" + JSON.toJSONString(ds) + "\"}");
                                    dr = ds.get(0);
                                }
//                                for (int i = 0; i < assignOrder.getPeople(); i++) {
//                                    Driver driver = null;
//                                    int m = 0;
//                                    int index = 0;
//                                    // 查询预约单
//                                    List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
//                                    List<Integer> orderPrivateCarDriverIds = orderPrivateCars.stream().map(OrderPrivateCar::getDriverId).collect(Collectors.toList());
//                                    for (int j = 0; j < drivers.size(); j++) {
//                                        Driver driver1 = drivers.get(j);
//                                        if (orderPrivateCar.getOrderType() == 2 && orderPrivateCarDriverIds.contains(driver.getId())) {
//                                            continue;
//                                        }
//                                        // 判断该司机是否有30分钟内预约单
//                                        long count = orderPrivateCarss.stream().filter(s -> s.getDriverId().equals(driver1.getId()) &&
//                                                DateUtil.dateToLocalDateTime(s.getTravelTime()).minusMinutes(query.getLimitationTime()).isBefore(LocalDateTime.now())).count();
//                                        if (count > 0) {
//                                            continue;
//                                        }
//                                        String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
//                                        if (null != value) {
//                                            Map<String, String> distance = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1);
//                                            int d = Integer.parseInt(distance.get("distance"));
//                                            if ((0 == m && null == driver) || (d < m)) {
//                                                driver = drivers.get(j);
//                                                m = d;
//                                                index = j;
//                                            }
//                                        }
//                                    }
//                                    ds.add(driver);
//                                    drivers.remove(index);
//                                }
//
//                                //再根据直线距离最短的司机中找出行驶距离最短的司机
//                                Integer m = 0;
//                                for (Driver driver : ds) {
//                                    String value = redisUtil.getValue("DRIVER" + driver.getId());
//                                    if (null != value) {
//                                        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLon + "," + startLat, value, 1);
//                                        int distance1 = Integer.parseInt(distance.get("distance"));
//                                        if ((0 == m && null == dr) || (distance1 < m.intValue())) {
//                                            dr = driver;
//                                            m = distance1;
//                                        }
//                                    }
//                                }
                            } else {
                                List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
                                if (orderPrivateCarss.size() == 0) {
                                    dr = drivers.get(0);
                                }
                                appOperationLogService.addAppOperationLog(uid, "{\"type\":\"指派推单,符合条件的司机\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"driver\":\"" + JSON.toJSONString(dr) + "\"}");
                            }
                            if (Objects.nonNull(dr)) {
@@ -985,6 +1035,7 @@
                        }
                    }
                }
                appOperationLogService.addAppOperationLog(uid, "{\"type\":\"用户取消订单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderPrivateCar\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
                this.deleteTask(id);//删除定时任务
                new Thread(new Runnable() {
@@ -1220,6 +1271,8 @@
                            double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                            int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
                            list = list.subList(0, lastIndex);//获取空闲司机中占比数据
                            appOperationLogService.addAppOperationLog(orderPrivateCar.getUserId(), "{\"type\":\"范围推单,第" + i +"轮,符合条件的司机\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"driver\":\"" + JSON.toJSONString(list) + "\"}");
                            for(Driver driver : list){//开始进行推送
                                // 判断该司机是否有30分钟内预约单
                                long count = orderPrivateCars.stream().filter(orderPrivateCar1 -> driver.getId().equals(orderPrivateCar1.getDriverId())
@@ -1252,9 +1305,12 @@
                            pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1);
                            orderIds.remove(orderPrivateCar.getId());
                            // 第三轮取消订单
                            orderPrivateCar.setState(10);
                            orderPrivateCarMapper.updateById(orderPrivateCar);
                            appOperationLogService.addAppOperationLog(orderPrivateCar.getUserId(), "{\"type\":\"范围推单结束,无司机接单,自动取消订单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderInfo\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
                            pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
                            // 添加站内信
                            systemNoticeService.addSystemNotice(1, "当前区域未能及时为您匹配到合适车辆。为避免耽误您的行程,系统已自动取消订单,建议您稍后重新尝试。", orderPrivateCar.getUserId(), 1);
@@ -1425,11 +1481,9 @@
    
            Integer uid = orderPrivateCar.getUserId();
            Double orderMoney = orderPrivateCar.getOrderMoney();
            System.out.println("=========================订单金额====================="+orderMoney);
            if(Objects.nonNull(orderPrivateCar.getPaymentAdvanceMoney()) && orderPrivateCar.getPaymentAdvanceMoney() > 0){
                double couponMoney1 = Objects.nonNull(orderPrivateCar.getCouponMoney()) ? orderPrivateCar.getCouponMoney() : 0.00;
                orderMoney = orderMoney - orderPrivateCar.getPaymentAdvanceMoney() - couponMoney1;
                System.out.println("=========================减去先付后金额====================="+orderMoney);
            }
            UserInfo userInfo = userInfoService.selectById(uid);
            ResultUtil resultUtil = ResultUtil.success(new HashMap<>());
@@ -1492,6 +1546,7 @@
                resultUtil = payMoneyUtil.weixinpay("完成订单",orderId +"", code,orderMoney+"","/base/wxPayOrderTaxi","JSAPI",userInfo.getAppletsOpenId());
                if(resultUtil.getCode()==200){
                    paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, null, 1, code);//添加预支付数据
                    appOperationLogService.addAppOperationLog(orderPrivateCar.getUserId(), "{\"type\":\"用户支付订单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderInfo\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
                    new Thread(()->{
                        int num = 1;
                        int wait = 0;
@@ -1696,7 +1751,8 @@
            }
    
            this.updateAllColumnById(orderPrivateCar);
            appOperationLogService.addAppOperationLog(orderPrivateCar.getUserId(), "{\"type\":\"用户" + (payType == 1 ? "微信" : payType == 2 ? "支付宝" : "余额") + "支付订单," + (orderPrivateCar.getPayMethod() == 0 ? "先付" : "后付") + "\"" +
                    ",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderInfo\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
            new Thread(new Runnable() {
                @Override
                public void run() {
@@ -1932,7 +1988,6 @@
                // 判断先付还是后付
                if(orderPrivateCar.getPayMethod() == 0){
                    if (Objects.nonNull(orderPrivateCar.getPaymentAdvanceMoney()) && orderPrivateCar.getPaymentAdvanceMoney() > 0 ) {
                        orderPrivateCar.setState(8);
                        orderPrivateCar.setOrderMoney(orderPrivateCar.getOrderMoney()+query.getAmount());
@@ -2001,6 +2056,10 @@
                        incomeService.saveDriverData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue(), driver.getLaveBusinessMoney());
                    }
                }
                appOperationLogService.addAppOperationLog(orderPrivateCar.getUserId(), "{\"type\":\"用户" + (type == 1 ? "微信" : "支付宝") + "支付订单," + (orderPrivateCar.getPayMethod() == 0 ? "先付" : "后付") + "\"" +
                        ",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderInfo\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
                // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
                new Thread(new Runnable() {
                    @Override