Pu Zhibing
2025-04-12 0a20f349bffa7a7d7e0af246013473d2f72c4a6f
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java
@@ -66,6 +66,9 @@
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Resource
    private IDriverWorkService driverWorkService;
    /*@Autowired
    private ICBCPayUtil icbcPayUtil;*/
@@ -128,6 +131,9 @@
    
    @Resource
    private QuartzUtil quartzUtil;
    @Resource
    private IAssignOrderService assignOrderService;
@@ -207,18 +213,66 @@
    
        
        //开始自动完成改派
        List<Driver> drivers = new ArrayList<>();
        switch (reassign.getOrderType()){
            case 1:
                OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId());
                Company company = companyCityService.query1(orderPrivateCar.getUserId(), String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司
                AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", company.getId()).eq("type", 1));
                if(null == assignOrder || assignOrder.getPeople() == 0) {//配置了指派规则才处理
                    return resultUtil;
                }
                PushOrder pushOrder = pushOrderService.querys(1, 1, company.getId()).get(0);
                //获取空闲司机
                List<Driver> list = driverService.queryIdleDriver(orderPrivateCar.getUserId(), 1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                System.err.println("【" + orderPrivateCar.getId() + "】空闲司机:" + JSON.toJSONString(list));
                if(list.size() > 0){
                    Optional<Driver> optional = list.stream().filter(d -> !d.getId().equals(orderPrivateCar.getDriverId())).findFirst();
                    if(optional.isPresent()){
                        Driver driver1 = optional.get();
                drivers = list.stream().filter(d -> !d.getId().equals(orderPrivateCar.getDriverId())).collect(Collectors.toList());
                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 driver1 = null;
                            long m = 0;
                            int index = 0;
                            for (int j = 0; j < drivers.size(); j++) {
                                String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
                                if (null != value) {
                                    String[] split = value.split(",");
                                    DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                                    Long distance = distancematrix.getDistance();
                                    if ((0 == m && null == driver1) || (distance < m)) {
                                        driver1 = drivers.get(j);
                                        m = distance;
                                        index = j;
                                    }
                                }
                            }
                            ds.add(driver1);
                            drivers.remove(index);
                        }
                        //再根据直线距离最短的司机中找出行驶距离最短的司机
                        Long m = 0L;
                        for (Driver driver1 : ds) {
                            String value = redisUtil.getValue("DRIVER" + driver1.getId());
                            if (null != value) {
                                String[] split = value.split(",");
                                DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                                Long d = distancematrix.getDistance();
                                if ((0 == m && null == dr) || (d.intValue() < m.intValue())) {
                                    dr = driver1;
                                    m = d;
                                }
                            }
                        }
                    } else {
                        dr = drivers.get(0);
                    }
                    Driver driver1 = driverService.selectById(dr.getId());
                    DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", dr.getId())
                            .eq("state", 1).like("type", "1"));
                    if(driver.getState() == 2 && null != driverWork) {
                        String text = "";
                        reassign.setState(3);
                        reassign.setNowDriverId(driver1.getId());
@@ -503,20 +557,70 @@
                        systemNoticeService.addSystemNotice(1, language2 == 1 ? "您的订单已指派给" + driver1.getFirstName() + "师傅,请保持电话畅通!" :
                                language2 == 2 ? "Your order has been assigned to the driver- " + driver1.getFirstName() + ", please keep your line on."
                                        : "Votre commande a été attribuée au chauffeur- " + driver1.getFirstName() + ", S'il vous plaît, restez en ligne.", orderPrivateCar.getUserId());
                    }
                }
                break;
            case 4:
                OrderLogistics orderLogistics = orderLogisticsService.selectById(reassign.getOrderId());
                Company company1 = companyCityService.query1(orderLogistics.getUserId(), String.valueOf(orderLogistics.getStartLon()), String.valueOf(orderLogistics.getStartLat()));//获取起点所属分公司
                AssignOrder assignOrder1 = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", company1.getId()).eq("type", 1));
                if(null == assignOrder1 || assignOrder1.getPeople() == 0) {//配置了指派规则才处理
                    return resultUtil;
                }
                PushOrder pushOrder1 = pushOrderService.querys(1, 1, company1.getId()).get(0);
                //获取空闲司机
                List<Driver> list1 = driverService.queryIdleDriver(orderLogistics.getUserId(), orderLogistics.getType(), orderLogistics.getServerCarModelId(), orderLogistics.getStartLon(), orderLogistics.getStartLat(), pushOrder1.getPushDistance(), null);//所有附近空闲司机
                System.err.println("【" + orderLogistics.getId() + "】空闲司机:" + JSON.toJSONString(list1));
                if(list1.size() > 0){
                    Optional<Driver> optional = list1.stream().filter(d -> !d.getId().equals(orderLogistics.getDriverId())).findFirst();
                    if(optional.isPresent()){
                        Driver driver1 = optional.get();
                drivers = list1.stream().filter(d -> !d.getId().equals(orderLogistics.getDriverId())).collect(Collectors.toList());
                if(drivers.size() > 0){//有司机,直接指派给司机
                    Driver dr = null;
                    if(drivers.size() > 1){
                        List<Driver> ds = new ArrayList<>();//存储直线距离最近的几个司机
                        for(int i = 0; i < assignOrder1.getPeople(); i++){
                            Driver driver1 = null;
                            long m = 0;
                            int index = 0;
                            for(int j = 0; j < drivers.size(); j++){
                                String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
                                if(null != value){
                                    String[] split = value.split(",");
                                    DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                                    Long distance = distancematrix.getDistance();
                                    if((0 == m && null == driver1) || (distance < m)){
                                        driver1 = drivers.get(j);
                                        m = distance;
                                        index = j;
                                    }
                                }
                            }
                            ds.add(driver1);
                            drivers.remove(index);
                        }
                        //再根据直线距离最短的司机中找出行驶距离最短的司机
                        Long m = 0L;
                        for(Driver driver1 : ds){
                            String value = redisUtil.getValue("DRIVER" + driver1.getId());
                            if(null != value){
                                String[] split = value.split(",");
                                DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                                Long d = distancematrix.getDistance();
                                if((0 == m && null == dr) || (d.intValue() < m.intValue())){
                                    dr = driver1;
                                    m = d;
                                }
                            }
                        }
                    }else{
                        dr = drivers.get(0);
                    }
                    Driver driver1 = driverService.selectById(dr.getId());
                    DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driver1.getId())
                            .eq("state", 1).like("type", "4"));
                    if(driver1.getState() == 2 || null != driverWork){
                        reassign.setState(3);
                        reassign.setNowDriverId(driver1.getId());
                        reassign.setNowCarId(driver1.getCarId());
@@ -732,6 +836,9 @@
                }
                break;
        }
        return resultUtil;
    }