From 8b09fbc19a96b57bf1d0e4d7c79b51a76aeca554 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 28 三月 2025 19:57:56 +0800 Subject: [PATCH] 修改bug --- DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java | 911 +++++++++++++++++++++++++++++++------------------------- 1 files changed, 509 insertions(+), 402 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 39b20ea..0493a27 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 @@ -1,6 +1,7 @@ package com.stylefeng.guns.modular.system.service.impl; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.util.ToolUtil; @@ -8,10 +9,8 @@ import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics; import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService; -import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsSpreadService; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; -import com.stylefeng.guns.modular.specialTrain.server.impl.OrderPrivateCarServiceImpl; import com.stylefeng.guns.modular.system.dao.*; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; @@ -33,10 +32,13 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; @Service @@ -123,6 +125,9 @@ @Resource private CarModelMapper carModelMapper; + + @Resource + private QuartzUtil quartzUtil; @@ -136,9 +141,10 @@ 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); - for(SensitiveWords s : sensitiveWords){ - content = content.replaceAll(s.getContent(), "***"); + for(SensitiveWords s : sensitiveWords) { + content = content.replaceAll(s.getContent().toLowerCase(), "***"); } } reassign.setRemark(content); @@ -159,7 +165,7 @@ reassign.setInsertTime(new Date()); reassign.setState(2); this.insert(reassign); - + String tripId = ""; //修改改派通知状态 switch (reassign.getOrderType()){ case 1: @@ -168,6 +174,7 @@ orderPrivateCar.setState(11); orderPrivateCar.setReassignNotice(2); orderPrivateCarService.updateById(orderPrivateCar); + tripId = redisUtil.getValue("trip" + orderPrivateCar.getUserId()); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(reassign.getOrderId()); @@ -175,6 +182,7 @@ orderTaxi.setState(11); orderTaxi.setReassignNotice(2); orderTaxiService.updateById(orderTaxi); + tripId = redisUtil.getValue("trip" + orderTaxi.getUserId()); break; case 4: OrderLogistics orderLogistics = orderLogisticsService.selectById(reassign.getOrderId()); @@ -182,6 +190,7 @@ orderLogistics.setState(11); orderLogistics.setReassignNotice(2); orderLogisticsService.updateById(orderLogistics); + tripId = redisUtil.getValue("trip" + orderLogistics.getUserId()); break; case 5: OrderLogistics orderLogistics1 = orderLogisticsService.selectById(reassign.getOrderId()); @@ -189,440 +198,537 @@ orderLogistics1.setState(11); orderLogistics1.setReassignNotice(2); orderLogisticsService.updateById(orderLogistics1); + tripId = redisUtil.getValue("trip" + orderLogistics1.getUserId()); break; } systemNoticeService.addSystemNotice(2, language == 1 ? "您的改派申请已成功提交,我们会尽快为你处理!" : language == 2 ? "Your request for reassignment was submitted, we shall handle it for you as soon as possible." : "Votre demande de réaffectation a été soumise. Nous la traiterons pour vous dans les plus brefs délais.", uid); - + + //开始自动完成改派 switch (reassign.getOrderType()){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId()); - Company company = companyCityService.query1(String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司 + Company company = companyCityService.query1(orderPrivateCar.getUserId(), String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司 PushOrder pushOrder = pushOrderService.querys(1, 1, company.getId()).get(0); //获取空闲司机 - List<Driver> list = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机 + 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 = "J'ai reçu une nouvelle commande de course, à partir de " + orderPrivateCar.getStartAddress() + ", le trajet complet est d’environ " + orderPrivateCar.getEstimatedMileage() + "kilométrage"; - 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() { - Process process = null; - try { - process = Runtime.getRuntime().exec("rm -rf /usr/local/nginx/html/files/audio/" + fileName); - } catch (IOException e) { - throw new RuntimeException(e); - } - if (process != null) { - process.destroy(); - } - } - }, 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()); - } - - 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])); - //超时时间 - 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); + Optional<Driver> optional = list.stream().filter(d -> !d.getId().equals(orderPrivateCar.getDriverId())).findFirst(); + if(optional.isPresent()){ + Driver driver1 = optional.get(); + String text = ""; + reassign.setState(3); + reassign.setNowDriverId(driver1.getId()); + reassign.setNowCarId(driver1.getCarId()); + reassign.setCompleteTime(new Date()); + this.updateById(reassign); - driver.setState(2); - driverService.updateById(driver); - - //删除定时任务 - 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"); + + 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; - /** - * 超时用户取消不收费的提醒 - * 预约单:行程时间 + 配置不收费的时间 > 当前时间 (只弹一次) - * 即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次) - * - * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间 - * - * 定时提醒弹框 - * 司机只要开始超时且还未到达预约点,则需要定时提醒 - * - * 预约单需要提前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( - new OrderTimeOutJob().buildQuartzJob("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( - new OrderTimeOutJob().buildQuartzJob("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( - new OrderTimeOutJob().buildQuartzJob("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( - new OrderTimeOutJob().buildQuartzJob("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( - new OrderTimeOutJob().buildQuartzJob("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( - new OrderTimeOutJob().buildQuartzJob("3_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap) - , orderPrivateCar.getTravelTime(), reminderRules.getCar() * 60000, -1); } - } - - new Thread(()->{ + String audioUrl = ""; + String fileName = "pushOrder" + orderPrivateCar.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3"; try { - Car car = carService.selectById(orderPrivateCar.getCarId()); - if(!StringUtils.hasLength(car.getVehicleId())){ - car.setVehicleId(UUIDUtil.getRandomCode()); - carService.updateById(car); - } - String trip = fleetEngineUtil.getTrip(orderPrivateCar.getTripId()); - if(ToolUtil.isEmpty(trip)){ - String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId()); - if(ToolUtil.isEmpty(vehicles)){ - CarModel carModel = carModelMapper.selectById(car.getCarModelId()); - fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId()); + 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(); } - fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(), - orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(), orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString()); } + }, 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()); + } + + 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()); + } + } + 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{ //开始修改行程数据 - fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null); - }catch (Exception e){ - e.printStackTrace(); + 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); + } + } + } } - }).start(); + + + + //删除定时任务 + 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"); - //推送相关代码------------------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); + //即时单 + 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(); - - - 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, language1 == 1 ? "您的订单已指派给" + driver1.getFirstName() + "师傅,请保持电话畅通!" : - language1 == 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(String.valueOf(orderLogistics.getStartLon()), String.valueOf(orderLogistics.getStartLat()));//获取起点所属分公司 + Company company1 = companyCityService.query1(orderLogistics.getUserId(), String.valueOf(orderLogistics.getStartLon()), String.valueOf(orderLogistics.getStartLat()));//获取起点所属分公司 PushOrder pushOrder1 = pushOrderService.querys(1, 1, company1.getId()).get(0); //获取空闲司机 - List<Driver> list1 = driverService.queryIdleDriver(orderLogistics.getType(), orderLogistics.getServerCarModelId(), orderLogistics.getStartLon(), orderLogistics.getStartLat(), pushOrder1.getPushDistance(), null);//所有附近空闲司机 + 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); - - 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 = "J'ai reçu une nouvelle commande de livraison, à partir de " + orderLogistics.getStartAddress() + ", le trajet complet est d’environ " + orderLogistics.getEstimatedMileage() + "kilométrage"; - 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() { - Process process = null; - try { - process = Runtime.getRuntime().exec("rm -rf /usr/local/nginx/html/files/audio/" + fileName); - } catch (IOException e) { - throw new RuntimeException(e); - } - if (process != null) { - process.destroy(); - } - } - }, 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])); - //超时时间 - 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); + Optional<Driver> optional = list1.stream().filter(d -> !d.getId().equals(orderLogistics.getDriverId())).findFirst(); + if(optional.isPresent()){ + Driver driver1 = optional.get(); + reassign.setState(3); + reassign.setNowDriverId(driver1.getId()); + reassign.setNowCarId(driver1.getCarId()); + reassign.setCompleteTime(new Date()); + this.updateById(reassign); - driver.setState(2); - driverService.updateById(driver); + 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; - //删除定时任务 - 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( - new OrderTimeOutJob().buildQuartzJob("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( - new OrderTimeOutJob().buildQuartzJob("3_" + orderLogistics.getId() + "_4", "ORDER_TIME_OUT", jobDataMap) - , orderLogistics.getEstimateArriveTime(), reminderRules.getCar() * 60000, -1); - } - - new Thread(()->{ + } + String audioUrl = ""; + String fileName = "pushOrder" + driver1.getId() + UUIDUtil.getRandomCode(5) + ".mp3"; try { - Car car = carService.selectById(orderLogistics.getCarId()); - if(!StringUtils.hasLength(car.getVehicleId())){ - car.setVehicleId(UUIDUtil.getRandomCode()); - carService.updateById(car); - } - String trip = fleetEngineUtil.getTrip(orderLogistics.getTripId()); - if(ToolUtil.isEmpty(trip)){ - String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId()); - if(ToolUtil.isEmpty(vehicles)){ - CarModel carModel = carModelMapper.selectById(car.getCarModelId()); - fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId()); + 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(); } - fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderLogistics.getTripId(), - orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString()); - }else{ - //开始修改行程数据 - fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null); } - }catch (Exception 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()); } - }).start(); - - //推送相关代码------------------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); + 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()); } - }).start(); + 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); + } + } + } + }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; + } + 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); - 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, language1 == 1 ? "您的订单已指派给" + driver1.getFirstName() + "师傅,请保持电话畅通!" : - language1 == 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()); - + //超时循环提醒 + 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; } @@ -643,9 +749,10 @@ type = null == type ? 2 : type;//现目前微信只支持小程序支付 String content = reassign.getRemark(); if(ToolUtil.isNotEmpty(content)){ + content = content.toLowerCase(); List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null); - for(SensitiveWords s : sensitiveWords){ - content = content.replaceAll(s.getContent(), "***"); + for(SensitiveWords s : sensitiveWords) { + content = content.replaceAll(s.getContent().toLowerCase(), "***"); } } reassign.setRemark(content); -- Gitblit v1.7.1