From 0a20f349bffa7a7d7e0af246013473d2f72c4a6f Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期六, 12 四月 2025 18:12:36 +0800 Subject: [PATCH] 修改bug --- DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java | 195 +++++++++++++++++++++++++++++++++++++----------- 1 files changed, 151 insertions(+), 44 deletions(-) diff --git a/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java b/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java index 03d7d45..576bc6d 100644 --- a/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java +++ b/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java @@ -65,6 +65,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,26 +213,74 @@ //开始自动完成改派 + 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()); reassign.setNowCarId(driver1.getCarId()); reassign.setCompleteTime(new Date()); this.updateById(reassign); - - + + Integer language1 = driver1.getLanguage(); switch (language1){ case 1: @@ -238,7 +292,7 @@ case 3: text = "Reçu une nouvelle commande de course, à partir de " + orderPrivateCar.getStartAddress() + ", le trajet complet est d’environ " + orderPrivateCar.getEstimatedMileage(); break; - + } String audioUrl = ""; String fileName = "pushOrder" + orderPrivateCar.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3"; @@ -269,7 +323,7 @@ } } }, 30000); - + orderPrivateCar.setDriverId(driver1.getId()); orderPrivateCar.setCarId(driver1.getCarId()); orderPrivateCar.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : ( @@ -280,7 +334,7 @@ if(!StringUtils.hasLength(orderPrivateCar.getTripId())){ orderPrivateCar.setTripId(UUIDUtil.getRandomCode()); } - + if(orderPrivateCar.getOrderType() == 1){ String value = redisUtil.getValue("DRIVER" + driver1.getId()); if(ToolUtil.isNotEmpty(value)) { @@ -295,10 +349,10 @@ orderPrivateCarService.updateAllColumnById(orderPrivateCar); driver1.setState(3); driverService.updateById(driver1); - + driver.setState(2); driverService.updateById(driver); - + //检查google车辆信息或者添加新的车辆信息 Car car = carService.selectById(orderPrivateCar.getCarId()); if(ToolUtil.isEmpty(car.getVehicleId())){ @@ -323,7 +377,7 @@ } } } - + //修改google订单信息或者创建新的行程 String trip = fleetEngineUtil.getTrip(orderPrivateCar.getTripId()); if(ToolUtil.isEmpty(trip)){ @@ -363,15 +417,15 @@ } } } - - - + + + //删除定时任务 quartzUtil.deleteQuartzTask("1_" + orderPrivateCar.getId() + "_1","ORDER_TIME_OUT"); quartzUtil.deleteQuartzTask("2_1_" + orderPrivateCar.getId() + "_1","ORDER_TIME_OUT"); quartzUtil.deleteQuartzTask("2_2_" + orderPrivateCar.getId() + "_1","ORDER_TIME_OUT"); quartzUtil.deleteQuartzTask("3_" + orderPrivateCar.getId() + "_1","ORDER_TIME_OUT"); - + /** * 超时用户取消不收费的提醒 * 预约单:行程时间 + 配置不收费的时间 > 当前时间 (只弹一次) @@ -384,13 +438,13 @@ * * 预约单需要提前xx分钟提醒司机需要接乘客,过后每隔xx分钟提醒一次。超时后停止提醒 */ - + //添加定时任务(普通任务) SysOvertime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<SysOvertime>().eq("companyId", driver1.getCompanyId())); if(null != reminderRules){ CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().eq("companyId", driver1.getCompanyId())); Integer driverTimeout = JSON.parseObject(cancleOrder.getContent()).getInteger("driverTimeout"); - + //即时单 if(orderPrivateCar.getOrderType() == 1){ //超时时间 @@ -407,7 +461,7 @@ jobDataMap.put("describe", language1 == 1 ? "您已超时" + driverTimeout + "分钟,用户可免费取消订单" : language1 == 2 ? "Reminder You are overdue for " + driverTimeout + " minutes The subscriber could cancel the order for free Confirm" : "Rappel Vous êtes en retard de " + driverTimeout + " minutes L’abonné peut annuler la commande gratuitement Confirmer"); quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "1_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap , new Date(timeOut), timeOut, 0); - + //超时循环提醒 jobDataMap = new JobDataMap(); jobDataMap.put("driverId", driver1.getId()); @@ -435,10 +489,10 @@ jobDataMap.put("describe", language1 == 1 ? "您已超时" + driverTimeout + "分钟,用户可免费取消订单" : language1 == 2 ? "Reminder You are overdue for " + driverTimeout + " minutes The subscriber could cancel the order for free Confirm" : "Rappel Vous êtes en retard de " + driverTimeout + " minutes L’abonné peut annuler la commande gratuitement Confirmer"); quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "1_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap , new Date(timeOut), timeOut, 0); - - + + UserInfo userInfo = userInfoMapper.selectById(orderPrivateCar.getUserId()); - + //预约单出发首次提醒 long travelTime = orderPrivateCar.getTravelTime().getTime() - reminderRules.getReserveTime() * 60000; SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); @@ -455,7 +509,7 @@ "Vous allez chercher " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " à " + sdf.format(orderPrivateCar.getTravelTime()) + ", s’il vous plaît soyez à l’heure."); quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "2_1_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap , new Date(travelTime), travelTime, 0); - + //预约单出发循环提醒 jobDataMap = new JobDataMap(); jobDataMap.put("driverId", driver1.getId()); @@ -470,7 +524,7 @@ "Vous allez chercher " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " à " + sdf.format(orderPrivateCar.getTravelTime()) + ", s’il vous plaît soyez à l’heure."); quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "2_2_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap , new Date(travelTime + reminderRules.getReserveNext() * 60000), reminderRules.getReserveNext() * 60000, -1); - + //超时循环提醒 jobDataMap = new JobDataMap(); jobDataMap.put("driverId", driver1.getId()); @@ -485,7 +539,7 @@ , orderPrivateCar.getTravelTime(), reminderRules.getCar() * 60000, -1); } } - + //推送相关代码------------------start---------------- String finalAudioUrl = audioUrl; new Thread(new Runnable() { @@ -495,7 +549,7 @@ pushUtil.pushOrderReassign(orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, finalAudioUrl); } }).start(); - + Integer language2 = userInfoMapper.selectById(orderPrivateCar.getUserId()).getLanguage(); systemNoticeService.addSystemNotice(2, language1 == 1 ? "您已成功抢得打车订单,请及时联系客户!" : language1 == 2 ? "You have grabbed the ride order, please contact the client timely." @@ -503,26 +557,76 @@ 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()); reassign.setCompleteTime(new Date()); this.updateById(reassign); - + String text = ""; Integer language1 = driver1.getLanguage(); switch (language1){ @@ -535,7 +639,7 @@ case 3: text = "Reçu une nouvelle commande de livraison, à partir de " + orderLogistics.getStartAddress() + ", le trajet complet est d’environ " + orderLogistics.getEstimatedMileage(); break; - + } String audioUrl = ""; String fileName = "pushOrder" + driver1.getId() + UUIDUtil.getRandomCode(5) + ".mp3"; @@ -566,8 +670,8 @@ } } }, 30000); - - + + orderLogistics.setDriverId(driver1.getId()); orderLogistics.setCarId(driver1.getCarId()); orderLogistics.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : ( @@ -591,10 +695,10 @@ //修改司机为服务中 driver1.setState(3); driverService.updateById(driver1); - + driver.setState(2); driverService.updateById(driver); - + //检查google车辆信息或者添加新的车辆信息 Car car = carService.selectById(orderLogistics.getCarId()); if(ToolUtil.isEmpty(car.getVehicleId())){ @@ -619,7 +723,7 @@ } } } - + //修改google订单信息或者创建新的行程 String trip = fleetEngineUtil.getTrip(orderLogistics.getTripId()); if(ToolUtil.isEmpty(trip)){ @@ -659,14 +763,14 @@ } } } - - + + //删除定时任务 quartzUtil.deleteQuartzTask("1_" + orderLogistics.getId() + "_4","ORDER_TIME_OUT"); quartzUtil.deleteQuartzTask("2_1_" + orderLogistics.getId() + "_4","ORDER_TIME_OUT"); quartzUtil.deleteQuartzTask("2_2_" + orderLogistics.getId() + "_4","ORDER_TIME_OUT"); quartzUtil.deleteQuartzTask("3_" + orderLogistics.getId() + "_4","ORDER_TIME_OUT"); - + /** * 超时用户取消不收费的提醒 * 即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次) @@ -676,7 +780,7 @@ * 定时提醒弹框 * 司机只要开始超时且还未到达预约点,则需要定时提醒 */ - + //添加定时任务(普通任务) SysOvertime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<SysOvertime>().eq("companyId", driver1.getCompanyId())); if(null != reminderRules){ @@ -696,7 +800,7 @@ jobDataMap.put("describe", language1 == 1 ? "您已超时" + driverTimeout + "分钟,用户可免费取消订单" : language1 == 2 ? "Reminder You are overdue for " + driverTimeout + " minutes The subscriber could cancel the order for free Confirm" : "Rappel Vous êtes en retard de " + driverTimeout + " minutes L’abonné peut annuler la commande gratuitement Confirmer"); quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "1_" + orderLogistics.getId() + "_4", "ORDER_TIME_OUT", jobDataMap , new Date(timeOut), timeOut, 0); - + //超时循环提醒 jobDataMap = new JobDataMap(); jobDataMap.put("driverId", driver1.getId()); @@ -710,8 +814,8 @@ quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "3_" + orderLogistics.getId() + "_4", "ORDER_TIME_OUT", jobDataMap , orderLogistics.getEstimateArriveTime(), reminderRules.getCar() * 60000, -1); } - - + + //推送相关代码------------------start---------------- String finalAudioUrl = audioUrl; new Thread(new Runnable() { @@ -732,6 +836,9 @@ } break; } + + + return resultUtil; } -- Gitblit v1.7.1