From bfa0b11dfbfe5b71e11f4544e688e4d9f325d1b5 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期一, 09 六月 2025 10:26:51 +0800
Subject: [PATCH] 修改bug和管理后台报表
---
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java | 1106 +++++++++++++++++++++++++++++++--------------------------
1 files changed, 599 insertions(+), 507 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 8956c3a..c2c8625 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;
@@ -141,21 +147,11 @@
public ResultUtil saveData(Reassign reassign, Integer uid, Integer type, Integer language) throws Exception {
String content = reassign.getRemark();
if(ToolUtil.isNotEmpty(content)){
+ content = content.toLowerCase();
List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
- List<String> list = Arrays.asList(content.split(" "));
- for(SensitiveWords s : sensitiveWords){
- List<String> str = new ArrayList<>();
- String lowerCase = s.getContent().toLowerCase();
- for (String s1 : list) {
- if(lowerCase.equals(s1.toLowerCase())){
- str.add("***");
- }else{
- str.add(s1);
- }
- }
- list = str;
+ for(SensitiveWords s : sensitiveWords) {
+ content = content.replaceAll(s.getContent().toLowerCase(), "***");
}
- content = list.stream().collect(Collectors.joining(" "));
}
reassign.setRemark(content);
ResultUtil resultUtil = ResultUtil.success();
@@ -217,527 +213,633 @@
//开始自动完成改派
+ 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){
- String text = "";
- Driver driver1 = list.get(0);
- 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:
- text = "收到新的打车订单,从" + orderPrivateCar.getStartAddress() + "出发,全程约" + orderPrivateCar.getEstimatedMileage() + "公里";
- break;
- case 2:
- text = "Received a new ride order, starting from " + orderPrivateCar.getStartAddress() + ", the whole journey is about " + orderPrivateCar.getEstimatedMileage() + "kilometre";
- break;
- 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";
- try {
- audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- //定时任务删除语音文件
- new Timer().schedule(new TimerTask() {
- @Override
- public void run() {
- try {
- // 使用Runtime执行命令
- Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
- // 读取命令的输出
- BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
- String line;
- while ((line = reader.readLine()) != null) {
- System.out.println(line);
+ System.err.println("【" + orderPrivateCar.getId() + "】订单改派-指派空闲司机:" + JSON.toJSONString(list));
+ drivers = list.stream().filter(d -> !d.getId().equals(orderPrivateCar.getDriverId())).collect(Collectors.toList());
+ if(drivers.size() > 0) {//有司机,直接指派给司机
+ System.err.println("【" + orderPrivateCar.getId() + "】订单改派-指派候选司机:" + JSON.toJSONString(drivers));
+ 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;
+ }
}
- // 等待命令执行完成
- process.waitFor();
- // 关闭流
- reader.close();
- } catch (IOException | InterruptedException e) {
- e.printStackTrace();
+ }
+ 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;
+ }
}
}
- }, 30000);
-
- orderPrivateCar.setDriverId(driver1.getId());
- orderPrivateCar.setCarId(driver1.getCarId());
- orderPrivateCar.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : (
- driver1.getCompanyId() != null && driver1.getCompanyId() != 0 ? driver1.getCompanyId() : 1));
- orderPrivateCar.setSnatchOrderTime(new Date());
- orderPrivateCar.setState(orderPrivateCar.getOldState());
- orderPrivateCar.setOldState(null);
- if(!StringUtils.hasLength(orderPrivateCar.getTripId())){
- orderPrivateCar.setTripId(UUIDUtil.getRandomCode());
+ } else {
+ dr = drivers.get(0);
}
-
- if(orderPrivateCar.getOrderType() == 1){
- String value = redisUtil.getValue("DRIVER" + driver1.getId());
- if(ToolUtil.isNotEmpty(value)) {
- String[] split = value.split(",");
- DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
- //超时时间
- long timeOut = System.currentTimeMillis() + (distancematrix.getDuration() * 1000);
- orderPrivateCar.setEstimateArriveTime(new Date(timeOut));
- orderPrivateCar.setEstimateArriveMileage(distancematrix.getDistance());
+ System.err.println("【" + orderPrivateCar.getId() + "】订单改派-指派司机:" + JSON.toJSONString(dr));
+ Driver driver1 = driverService.selectById(dr.getId());
+ DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", dr.getId())
+ .eq("state", 1).like("type", "1"));
+ if(driver1.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:
+ text = "收到新的打车订单,从" + orderPrivateCar.getStartAddress() + "出发,全程约" + orderPrivateCar.getEstimatedMileage() + "公里";
+ break;
+ case 2:
+ text = "Received a new ride order, starting from " + orderPrivateCar.getStartAddress() + ", the whole journey is about " + orderPrivateCar.getEstimatedMileage() + "kilometre";
+ break;
+ case 3:
+ text = "Reçu une nouvelle commande de course, à partir de " + orderPrivateCar.getStartAddress() + ", le trajet complet est d’environ " + orderPrivateCar.getEstimatedMileage();
+ break;
+
}
- }
- 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())){
- car.setVehicleId(UUIDUtil.getRandomCode());
- carService.updateById(car);
- }
- String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
- if(ToolUtil.isEmpty(vehicles)){
- CarModel carModel = carModelMapper.selectById(car.getCarModelId());
- boolean createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
- if(!createVehicles){
- for (int i = 0; i < 5; i++) {
- createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
- if(createVehicles){
- break;
- }
+ String audioUrl = "";
+ String fileName = "pushOrder" + orderPrivateCar.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3";
+ try {
+ audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ //定时任务删除语音文件
+ new Timer().schedule(new TimerTask() {
+ @Override
+ public void run() {
try {
- Thread.sleep(3000L);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
+ // 使用Runtime执行命令
+ Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
+ // 读取命令的输出
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ System.out.println(line);
+ }
+ // 等待命令执行完成
+ process.waitFor();
+ // 关闭流
+ reader.close();
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
}
}
- }
- }
-
- //修改google订单信息或者创建新的行程
- String trip = fleetEngineUtil.getTrip(orderPrivateCar.getTripId());
- if(ToolUtil.isEmpty(trip)){
- JSONObject createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(),
- orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(), orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString());
- JSONObject error = createTrip.getJSONObject("error");
- if(null != error){
- for (int i = 0; i < 5; i++) {
- createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(),
- orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(), orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString());
- error = createTrip.getJSONObject("error");
- String tripStatus = createTrip.getString("tripStatus");
- if(null == error && "NEW".equals(tripStatus)){
- break;
- }
- try {
- Thread.sleep(3000L);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }
- }else{
- //开始修改行程数据
- boolean updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null);
- if(!updateTrip){
- for (int i = 0; i < 5; i++) {
- updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null);
- if(updateTrip){
- break;
- }
- try {
- Thread.sleep(3000L);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }
- }
+ }, 30000);
+ orderPrivateCar.setDriverId(driver1.getId());
+ orderPrivateCar.setCarId(driver1.getCarId());
+ orderPrivateCar.setCompanyId(driver1.getCompanyId());
+ orderPrivateCar.setSnatchOrderTime(new Date());
+ orderPrivateCar.setState(orderPrivateCar.getOldState());
+ orderPrivateCar.setOldState(null);
+ if(!StringUtils.hasLength(orderPrivateCar.getTripId())){
+ orderPrivateCar.setTripId(UUIDUtil.getRandomCode());
+ }
-
- //删除定时任务
- 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");
-
- /**
- * 超时用户取消不收费的提醒
- * 预约单:行程时间 + 配置不收费的时间 > 当前时间 (只弹一次)
- * 即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次)
- *
- * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间
- *
- * 定时提醒弹框
- * 司机只要开始超时且还未到达预约点,则需要定时提醒
- *
- * 预约单需要提前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){
- //超时时间
- long timeOut = orderPrivateCar.getEstimateArriveTime().getTime() + (driverTimeout * 60 * 1000);
- //乘客取消不收费提醒
- JobDataMap jobDataMap = new JobDataMap();
- jobDataMap.put("driverId", driver1.getId());
- jobDataMap.put("timeOutType", 1);
- jobDataMap.put("orderId", orderPrivateCar.getId());
- jobDataMap.put("orderType", 1);
- jobDataMap.put("language", language1);
- jobDataMap.put("timeOut", timeOut);
- jobDataMap.put("driverTimeout", driverTimeout);
- 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());
- jobDataMap.put("timeOutType", 3);
- jobDataMap.put("orderId", orderPrivateCar.getId());
- jobDataMap.put("orderType", 1);
- jobDataMap.put("language", language1);
- jobDataMap.put("timeOut", orderPrivateCar.getEstimateArriveTime().getTime());
- jobDataMap.put("driverTimeout", 0);
- jobDataMap.put("describe", "");
- quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "3_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
- , orderPrivateCar.getEstimateArriveTime(), reminderRules.getCar() * 60000, -1);
+ String value = redisUtil.getValue("DRIVER" + driver1.getId());
+ if(ToolUtil.isNotEmpty(value)) {
+ String[] split = value.split(",");
+ DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
+ //超时时间
+ long timeOut = System.currentTimeMillis() + (distancematrix.getDuration() * 1000);
+ orderPrivateCar.setEstimateArriveTime(new Date(timeOut));
+ orderPrivateCar.setEstimateArriveMileage(distancematrix.getDistance());
+ }
+ }
+ 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())){
+ car.setVehicleId(UUIDUtil.getRandomCode());
+ carService.updateById(car);
+ }
+ String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
+ if(ToolUtil.isEmpty(vehicles)){
+ CarModel carModel = carModelMapper.selectById(car.getCarModelId());
+ boolean createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
+ if(!createVehicles){
+ for (int i = 0; i < 5; i++) {
+ createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
+ if(createVehicles){
+ break;
+ }
+ try {
+ Thread.sleep(3000L);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+
+ //修改google订单信息或者创建新的行程
+ String trip = fleetEngineUtil.getTrip(orderPrivateCar.getTripId());
+ if(ToolUtil.isEmpty(trip)){
+ JSONObject createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(),
+ orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(), orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString());
+ JSONObject error = createTrip.getJSONObject("error");
+ if(null != error){
+ for (int i = 0; i < 5; i++) {
+ createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(),
+ orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(), orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString());
+ error = createTrip.getJSONObject("error");
+ String tripStatus = createTrip.getString("tripStatus");
+ if(null == error && "NEW".equals(tripStatus)){
+ break;
+ }
+ try {
+ Thread.sleep(3000L);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
}else{
- //超时时间
- long timeOut = orderPrivateCar.getTravelTime().getTime() + (driverTimeout * 60000);
- //乘客取消不收费提醒
- JobDataMap jobDataMap = new JobDataMap();
- jobDataMap.put("driverId", driver1.getId());
- jobDataMap.put("timeOutType", 1);
- jobDataMap.put("orderId", orderPrivateCar.getId());
- jobDataMap.put("orderType", 1);
- jobDataMap.put("language", language1);
- jobDataMap.put("timeOut", timeOut);
- jobDataMap.put("driverTimeout", driverTimeout);
- 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");
- jobDataMap = new JobDataMap();
- jobDataMap.put("driverId", driver1.getId());
- jobDataMap.put("timeOutType", 2);
- jobDataMap.put("orderId", orderPrivateCar.getId());
- jobDataMap.put("orderType", 1);
- jobDataMap.put("language", language1);
- jobDataMap.put("timeOut", timeOut);
- jobDataMap.put("driverTimeout", 0);
- jobDataMap.put("describe", language1 == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + ",请准时!" :
- language1 == 2 ? "You are going to pick up " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " at " + sdf.format(orderPrivateCar.getTravelTime()) + ", please be on time. " :
- "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());
- jobDataMap.put("timeOutType", 2);
- jobDataMap.put("orderId", orderPrivateCar.getId());
- jobDataMap.put("orderType", 1);
- jobDataMap.put("language", language1);
- jobDataMap.put("timeOut", orderPrivateCar.getTravelTime().getTime());
- jobDataMap.put("driverTimeout", 0);
- jobDataMap.put("describe", language1 == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + ",请准时!" :
- language1 == 2 ? "You are going to pick up " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " at " + sdf.format(orderPrivateCar.getTravelTime()) + ", please be on time. " :
- "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());
- jobDataMap.put("timeOutType", 3);
- jobDataMap.put("orderId", orderPrivateCar.getId());
- jobDataMap.put("orderType", 1);
- jobDataMap.put("language", language1);
- jobDataMap.put("timeOut", orderPrivateCar.getTravelTime().getTime());
- jobDataMap.put("driverTimeout", 0);
- jobDataMap.put("describe", "");
- quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "3_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
- , orderPrivateCar.getTravelTime(), reminderRules.getCar() * 60000, -1);
+ //开始修改行程数据
+ boolean updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null, orderPrivateCar.getId(), 1);
+ if(!updateTrip){
+ for (int i = 0; i < 5; i++) {
+ updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null, orderPrivateCar.getId(), 1);
+ if(updateTrip){
+ break;
+ }
+ try {
+ Thread.sleep(3000L);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
}
+
+
+
+ //删除定时任务
+ 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");
+
+ /**
+ * 超时用户取消不收费的提醒
+ * 预约单:行程时间 + 配置不收费的时间 > 当前时间 (只弹一次)
+ * 即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次)
+ *
+ * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间
+ *
+ * 定时提醒弹框
+ * 司机只要开始超时且还未到达预约点,则需要定时提醒
+ *
+ * 预约单需要提前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){
+ //超时时间
+ long timeOut = orderPrivateCar.getEstimateArriveTime().getTime() + (driverTimeout * 60 * 1000);
+ //乘客取消不收费提醒
+ JobDataMap jobDataMap = new JobDataMap();
+ jobDataMap.put("driverId", driver1.getId());
+ jobDataMap.put("timeOutType", 1);
+ jobDataMap.put("orderId", orderPrivateCar.getId());
+ jobDataMap.put("orderType", 1);
+ jobDataMap.put("language", language1);
+ jobDataMap.put("timeOut", timeOut);
+ jobDataMap.put("driverTimeout", driverTimeout);
+ 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());
+ jobDataMap.put("timeOutType", 3);
+ jobDataMap.put("orderId", orderPrivateCar.getId());
+ jobDataMap.put("orderType", 1);
+ jobDataMap.put("language", language1);
+ jobDataMap.put("timeOut", orderPrivateCar.getEstimateArriveTime().getTime());
+ jobDataMap.put("driverTimeout", 0);
+ jobDataMap.put("describe", "");
+ quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "3_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
+ , orderPrivateCar.getEstimateArriveTime(), reminderRules.getCar() * 60000, -1);
+ }else{
+ //超时时间
+ long timeOut = orderPrivateCar.getTravelTime().getTime() + (driverTimeout * 60000);
+ //乘客取消不收费提醒
+ JobDataMap jobDataMap = new JobDataMap();
+ jobDataMap.put("driverId", driver1.getId());
+ jobDataMap.put("timeOutType", 1);
+ jobDataMap.put("orderId", orderPrivateCar.getId());
+ jobDataMap.put("orderType", 1);
+ jobDataMap.put("language", language1);
+ jobDataMap.put("timeOut", timeOut);
+ jobDataMap.put("driverTimeout", driverTimeout);
+ 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");
+ jobDataMap = new JobDataMap();
+ jobDataMap.put("driverId", driver1.getId());
+ jobDataMap.put("timeOutType", 2);
+ jobDataMap.put("orderId", orderPrivateCar.getId());
+ jobDataMap.put("orderType", 1);
+ jobDataMap.put("language", language1);
+ jobDataMap.put("timeOut", timeOut);
+ jobDataMap.put("driverTimeout", 0);
+ jobDataMap.put("describe", language1 == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + ",请准时!" :
+ language1 == 2 ? "You are going to pick up " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " at " + sdf.format(orderPrivateCar.getTravelTime()) + ", please be on time. " :
+ "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());
+ jobDataMap.put("timeOutType", 2);
+ jobDataMap.put("orderId", orderPrivateCar.getId());
+ jobDataMap.put("orderType", 1);
+ jobDataMap.put("language", language1);
+ jobDataMap.put("timeOut", orderPrivateCar.getTravelTime().getTime());
+ jobDataMap.put("driverTimeout", 0);
+ jobDataMap.put("describe", language1 == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + ",请准时!" :
+ language1 == 2 ? "You are going to pick up " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " at " + sdf.format(orderPrivateCar.getTravelTime()) + ", please be on time. " :
+ "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());
+ jobDataMap.put("timeOutType", 3);
+ jobDataMap.put("orderId", orderPrivateCar.getId());
+ jobDataMap.put("orderType", 1);
+ jobDataMap.put("language", language1);
+ jobDataMap.put("timeOut", orderPrivateCar.getTravelTime().getTime());
+ jobDataMap.put("driverTimeout", 0);
+ jobDataMap.put("describe", "");
+ quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "3_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
+ , orderPrivateCar.getTravelTime(), reminderRules.getCar() * 60000, -1);
+ }
+ }
+
+ //推送相关代码------------------start----------------
+ String finalAudioUrl = audioUrl;
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ pushUtil.pushOrderReassign(orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, "");
+ 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."
+ : "Vous avez saisi la commande de course, veuillez contacter le client en temps opportun.", orderPrivateCar.getDriverId());
+ 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());
+
}
-
- //推送相关代码------------------start----------------
- String finalAudioUrl = audioUrl;
- new Thread(new Runnable() {
- @Override
- public void run() {
- pushUtil.pushOrderReassign(orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, "");
- 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."
- : "Vous avez saisi la commande de course, veuillez contacter le client en temps opportun.", orderPrivateCar.getDriverId());
- 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){
- Driver driver1 = list1.get(0);
- reassign.setState(3);
- reassign.setNowDriverId(driver1.getId());
- reassign.setNowCarId(driver1.getCarId());
- reassign.setCompleteTime(new Date());
- this.updateById(reassign);
+ System.err.println("【" + orderLogistics.getId() + "】订单改派-指派空闲司机:" + JSON.toJSONString(list1));
+ drivers = list1.stream().filter(d -> !d.getId().equals(orderLogistics.getDriverId())).collect(Collectors.toList());
+ if(drivers.size() > 0){//有司机,直接指派给司机
+ System.err.println("【" + orderLogistics.getId() + "】订单改派-指派候选司机:" + JSON.toJSONString(drivers));
+ 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);
+ }
- String text = "";
- Integer language1 = driver1.getLanguage();
- switch (language1){
- case 1:
- text = "收到新的包裹订单,从" + orderLogistics.getStartAddress() + "出发,全程约" + orderLogistics.getEstimatedMileage() + "公里";
- break;
- case 2:
- text = "Received a new delivery order, starting from " + orderLogistics.getStartAddress() + ", the whole journey is about " + orderLogistics.getEstimatedMileage() + "kilometre";
- break;
- 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";
- try {
- audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- //定时任务删除语音文件
- new Timer().schedule(new TimerTask() {
- @Override
- public void run() {
- try {
- // 使用Runtime执行命令
- Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
- // 读取命令的输出
- BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
- String line;
- while ((line = reader.readLine()) != null) {
- System.out.println(line);
- }
- // 等待命令执行完成
- process.waitFor();
- // 关闭流
- reader.close();
- } catch (IOException | InterruptedException e) {
- e.printStackTrace();
- }
- }
- }, 30000);
-
-
- orderLogistics.setDriverId(driver1.getId());
- orderLogistics.setCarId(driver1.getCarId());
- orderLogistics.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : (
- driver1.getCompanyId() != null && driver1.getCompanyId() != 0 ? driver1.getCompanyId() : 1));
- orderLogistics.setState(orderLogistics.getOldState());
- orderLogistics.setOldState(null);
- orderLogistics.setSnatchOrderTime(new Date());
- if(!StringUtils.hasLength(orderLogistics.getTripId())){
- orderLogistics.setTripId(UUIDUtil.getRandomCode());
- }
- String value = redisUtil.getValue("DRIVER" + driver1.getId());
- if(ToolUtil.isNotEmpty(value)) {
- String[] split = value.split(",");
- DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
- //超时时间
- long timeOut = System.currentTimeMillis() + (distancematrix.getDuration() * 1000);
- orderLogistics.setEstimateArriveTime(new Date(timeOut));
- orderLogistics.setEstimateArriveMileage(distancematrix.getDistance());
- }
- orderLogisticsService.updateAllColumnById(orderLogistics);
- //修改司机为服务中
- driver1.setState(3);
- driverService.updateById(driver1);
-
- driver.setState(2);
- driverService.updateById(driver);
-
- //检查google车辆信息或者添加新的车辆信息
- Car car = carService.selectById(orderLogistics.getCarId());
- if(ToolUtil.isEmpty(car.getVehicleId())){
- car.setVehicleId(UUIDUtil.getRandomCode());
- carService.updateById(car);
- }
- String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
- if(ToolUtil.isEmpty(vehicles)){
- CarModel carModel = carModelMapper.selectById(car.getCarModelId());
- boolean createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
- if(!createVehicles){
- for (int i = 0; i < 5; i++) {
- createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
- if(createVehicles){
- break;
- }
- try {
- Thread.sleep(3000L);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }
- }
-
- //修改google订单信息或者创建新的行程
- String trip = fleetEngineUtil.getTrip(orderLogistics.getTripId());
- if(ToolUtil.isEmpty(trip)){
- JSONObject createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderLogistics.getTripId(),
- orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString());
- JSONObject error = createTrip.getJSONObject("error");
- if(null != error){
- for (int i = 0; i < 5; i++) {
- createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderLogistics.getTripId(),
- orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString());
- error = createTrip.getJSONObject("error");
- String tripStatus = createTrip.getString("tripStatus");
- if(null == error && "NEW".equals(tripStatus)){
- break;
- }
- try {
- Thread.sleep(3000L);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
+ //再根据直线距离最短的司机中找出行驶距离最短的司机
+ 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{
- //开始修改行程数据
- boolean updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null);
- if(!updateTrip){
- for (int i = 0; i < 5; i++) {
- updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null);
- if(updateTrip){
- break;
- }
+ dr = drivers.get(0);
+ }
+ System.err.println("【" + orderLogistics.getId() + "】订单改派-指派司机:" + JSON.toJSONString(dr));
+ 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){
+ case 1:
+ text = "收到新的包裹订单,从" + orderLogistics.getStartAddress() + "出发,全程约" + orderLogistics.getEstimatedMileage() + "公里";
+ break;
+ case 2:
+ text = "Received a new delivery order, starting from " + orderLogistics.getStartAddress() + ", the whole journey is about " + orderLogistics.getEstimatedMileage() + "kilometre";
+ break;
+ 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";
+ try {
+ audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ //定时任务删除语音文件
+ new Timer().schedule(new TimerTask() {
+ @Override
+ public void run() {
try {
- Thread.sleep(3000L);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
+ // 使用Runtime执行命令
+ Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
+ // 读取命令的输出
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ System.out.println(line);
+ }
+ // 等待命令执行完成
+ process.waitFor();
+ // 关闭流
+ reader.close();
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }, 30000);
+
+
+ orderLogistics.setDriverId(driver1.getId());
+ orderLogistics.setCarId(driver1.getCarId());
+ orderLogistics.setCompanyId(driver1.getCompanyId());
+ orderLogistics.setState(orderLogistics.getOldState());
+ orderLogistics.setOldState(null);
+ orderLogistics.setSnatchOrderTime(new Date());
+ if(!StringUtils.hasLength(orderLogistics.getTripId())){
+ orderLogistics.setTripId(UUIDUtil.getRandomCode());
+ }
+ String value = redisUtil.getValue("DRIVER" + driver1.getId());
+ if(ToolUtil.isNotEmpty(value)) {
+ String[] split = value.split(",");
+ DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
+ //超时时间
+ long timeOut = System.currentTimeMillis() + (distancematrix.getDuration() * 1000);
+ orderLogistics.setEstimateArriveTime(new Date(timeOut));
+ orderLogistics.setEstimateArriveMileage(distancematrix.getDistance());
+ }
+ orderLogisticsService.updateAllColumnById(orderLogistics);
+ //修改司机为服务中
+ driver1.setState(3);
+ driverService.updateById(driver1);
+
+ driver.setState(2);
+ driverService.updateById(driver);
+
+ //检查google车辆信息或者添加新的车辆信息
+ Car car = carService.selectById(orderLogistics.getCarId());
+ if(ToolUtil.isEmpty(car.getVehicleId())){
+ car.setVehicleId(UUIDUtil.getRandomCode());
+ carService.updateById(car);
+ }
+ String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
+ if(ToolUtil.isEmpty(vehicles)){
+ CarModel carModel = carModelMapper.selectById(car.getCarModelId());
+ boolean createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
+ if(!createVehicles){
+ for (int i = 0; i < 5; i++) {
+ createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
+ if(createVehicles){
+ break;
+ }
+ try {
+ Thread.sleep(3000L);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
}
}
}
- }
-
- //删除定时任务
- 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");
-
- /**
- * 超时用户取消不收费的提醒
- * 即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次)
- *
- * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间
- *
- * 定时提醒弹框
- * 司机只要开始超时且还未到达预约点,则需要定时提醒
- */
-
- //添加定时任务(普通任务)
- 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");
- //超时时间
- long timeOut = orderLogistics.getEstimateArriveTime().getTime() + (driverTimeout * 60 * 1000);
- //乘客取消不收费提醒
- JobDataMap jobDataMap = new JobDataMap();
- jobDataMap.put("driverId", driver1.getId());
- jobDataMap.put("timeOutType", 1);
- jobDataMap.put("orderId", orderLogistics.getId());
- jobDataMap.put("orderType", 4);
- jobDataMap.put("language", language1);
- jobDataMap.put("timeOut", timeOut);
- jobDataMap.put("driverTimeout", driverTimeout);
- 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());
- jobDataMap.put("timeOutType", 3);
- jobDataMap.put("orderId", orderLogistics.getId());
- jobDataMap.put("orderType", 4);
- jobDataMap.put("language", language1);
- jobDataMap.put("timeOut", orderLogistics.getEstimateArriveTime().getTime());
- jobDataMap.put("driverTimeout", driverTimeout);
- jobDataMap.put("describe", "");
- 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() {
- @Override
- public void run() {
- pushUtil.pushOrderReassign(orderLogistics.getUserId(), 1, orderLogistics.getId(), 4, "");
- pushUtil.pushOrderReassign(orderLogistics.getDriverId(), 2, orderLogistics.getId(), 4, finalAudioUrl);
+ //修改google订单信息或者创建新的行程
+ String trip = fleetEngineUtil.getTrip(orderLogistics.getTripId());
+ if(ToolUtil.isEmpty(trip)){
+ JSONObject createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderLogistics.getTripId(),
+ orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString());
+ JSONObject error = createTrip.getJSONObject("error");
+ if(null != error){
+ for (int i = 0; i < 5; i++) {
+ createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderLogistics.getTripId(),
+ orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString());
+ error = createTrip.getJSONObject("error");
+ String tripStatus = createTrip.getString("tripStatus");
+ if(null == error && "NEW".equals(tripStatus)){
+ break;
+ }
+ try {
+ Thread.sleep(3000L);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }else{
+ //开始修改行程数据
+ boolean updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null, orderLogistics.getId(), 4);
+ if(!updateTrip){
+ for (int i = 0; i < 5; i++) {
+ updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null, orderLogistics.getId(), 4);
+ if(updateTrip){
+ break;
+ }
+ try {
+ Thread.sleep(3000L);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
}
- }).start();
- Integer language2 = userInfoMapper.selectById(orderLogistics.getUserId()).getLanguage();
- systemNoticeService.addSystemNotice(2, language1 == 1 ? "您已成功抢得包裹订单,请及时联系客户!" :
- language1 == 2 ? "You have grabbed the delivery order, please contact the client timely."
- : "Vous avez saisi la commande du livraison. Veuillez contacter le client en temps opportun.", orderLogistics.getDriverId());
- 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.", orderLogistics.getUserId());
-
+
+
+ //删除定时任务
+ 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");
+
+ /**
+ * 超时用户取消不收费的提醒
+ * 即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次)
+ *
+ * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间
+ *
+ * 定时提醒弹框
+ * 司机只要开始超时且还未到达预约点,则需要定时提醒
+ */
+
+ //添加定时任务(普通任务)
+ 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");
+ //超时时间
+ long timeOut = orderLogistics.getEstimateArriveTime().getTime() + (driverTimeout * 60 * 1000);
+ //乘客取消不收费提醒
+ JobDataMap jobDataMap = new JobDataMap();
+ jobDataMap.put("driverId", driver1.getId());
+ jobDataMap.put("timeOutType", 1);
+ jobDataMap.put("orderId", orderLogistics.getId());
+ jobDataMap.put("orderType", 4);
+ jobDataMap.put("language", language1);
+ jobDataMap.put("timeOut", timeOut);
+ jobDataMap.put("driverTimeout", driverTimeout);
+ 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());
+ jobDataMap.put("timeOutType", 3);
+ jobDataMap.put("orderId", orderLogistics.getId());
+ jobDataMap.put("orderType", 4);
+ jobDataMap.put("language", language1);
+ jobDataMap.put("timeOut", orderLogistics.getEstimateArriveTime().getTime());
+ jobDataMap.put("driverTimeout", driverTimeout);
+ jobDataMap.put("describe", "");
+ 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() {
+ @Override
+ public void run() {
+ pushUtil.pushOrderReassign(orderLogistics.getUserId(), 1, orderLogistics.getId(), 4, "");
+ pushUtil.pushOrderReassign(orderLogistics.getDriverId(), 2, orderLogistics.getId(), 4, finalAudioUrl);
+ }
+ }).start();
+ Integer language2 = userInfoMapper.selectById(orderLogistics.getUserId()).getLanguage();
+ systemNoticeService.addSystemNotice(2, language1 == 1 ? "您已成功抢得包裹订单,请及时联系客户!" :
+ language1 == 2 ? "You have grabbed the delivery order, please contact the client timely."
+ : "Vous avez saisi la commande du livraison. Veuillez contacter le client en temps opportun.", orderLogistics.getDriverId());
+ 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.", orderLogistics.getUserId());
+ }
}
break;
}
+
+
+
return resultUtil;
}
@@ -755,21 +857,11 @@
type = null == type ? 2 : type;//现目前微信只支持小程序支付
String content = reassign.getRemark();
if(ToolUtil.isNotEmpty(content)){
+ content = content.toLowerCase();
List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
- List<String> list = Arrays.asList(content.split(" "));
- for(SensitiveWords s : sensitiveWords){
- List<String> str = new ArrayList<>();
- String lowerCase = s.getContent().toLowerCase();
- for (String s1 : list) {
- if(lowerCase.equals(s1.toLowerCase())){
- str.add("***");
- }else{
- str.add(s1);
- }
- }
- list = str;
+ for(SensitiveWords s : sensitiveWords) {
+ content = content.replaceAll(s.getContent().toLowerCase(), "***");
}
- content = list.stream().collect(Collectors.joining(" "));
}
reassign.setRemark(content);
ResultUtil resultUtil = ResultUtil.success();
@@ -871,7 +963,7 @@
Map<String, String> map = new HashMap<>();
map.put("orderId", reassign.getOrderId().toString());
map.put("orderType", reassign.getOrderType().toString());
- List<Dispatch> dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1);
+ List<Dispatch> dispatches = dispatchMapper.queryDispatchs(driver.getCompanyId(), 1);
for(Dispatch dispatch : dispatches){
jgPushUtil.push(2,"有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId());
}
@@ -933,7 +1025,7 @@
Map<String, String> map = new HashMap<>();
map.put("orderId", reassign.getOrderId().toString());
map.put("orderType", reassign.getOrderType().toString());
- List<Dispatch> dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1);
+ List<Dispatch> dispatches = dispatchMapper.queryDispatchs(driver.getCompanyId(), 1);
for(Dispatch dispatch : dispatches){
jgPushUtil.push(2,"有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId());
}
@@ -1025,7 +1117,7 @@
Map<String, String> map = new HashMap<>();
map.put("orderId", reassign.getOrderId().toString());
map.put("orderType", reassign.getOrderType().toString());
- List<Dispatch> dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1);
+ List<Dispatch> dispatches = dispatchMapper.queryDispatchs(driver.getCompanyId(), 1);
for(Dispatch dispatch : dispatches){
jgPushUtil.push(2,"有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId());
}
--
Gitblit v1.7.1