From 79d97c39f1d118824f91467feb9f4a55717fd0c0 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 26 七月 2024 14:03:41 +0800 Subject: [PATCH] Merge branch '2.0' of http://120.76.84.145:10101/gitblit/r/java/IgoTravel into 2.0 --- DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 274 +++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 217 insertions(+), 57 deletions(-) diff --git a/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java index 299f2be..c7c6c56 100644 --- a/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java +++ b/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java @@ -15,13 +15,17 @@ import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; +import com.stylefeng.guns.modular.system.util.GoogleMap.DistancematrixVo; import com.stylefeng.guns.modular.system.util.GoogleMap.FleetEngineUtil; +import com.stylefeng.guns.modular.system.util.GoogleMap.GoogleMapUtil; import com.stylefeng.guns.modular.system.util.quartz.QuartzUtil; import com.stylefeng.guns.modular.system.util.quartz.jobs.OrderTimeOutJob; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; import org.apache.shiro.util.StringUtils; import org.quartz.JobDataMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -39,6 +43,8 @@ @Service public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService { + + Logger log = LoggerFactory.getLogger(this.getClass()); @Resource private OrderPrivateCarMapper orderPrivateCarMapper; @@ -97,7 +103,7 @@ private String filePath; @Autowired - private IReminderRulesService reminderRulesService; + private ISysOvertimeService sysOvertimeService; @Autowired private FleetEngineUtil fleetEngineUtil; @@ -107,6 +113,12 @@ @Autowired private ICarService carService; + + @Resource + private ICancleOrderService cancleOrderService; + + @Resource + private RedisUtil redisUtil; @@ -219,6 +231,18 @@ if(!StringUtils.hasLength(orderPrivateCar.getTripId())){ orderPrivateCar.setTripId(UUIDUtil.getRandomCode()); } + + if(orderPrivateCar.getOrderType() == 1){ + String value = redisUtil.getValue("DRIVER" + driver.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()); + } + } this.updateById(orderPrivateCar); //如果是预约单,则不修改司机为服务中 @@ -227,68 +251,145 @@ driver.setState(3); driverService.updateById(driver); } - - - //添加定时任务(普通任务) - ReminderRules reminderRules = reminderRulesService.selectOne(new EntityWrapper<ReminderRules>().eq("companyId", driver.getCompanyId())); - if(null != reminderRules){ - JSONObject jsonObject = JSON.parseObject(reminderRules.getContent()); - //预约单 - if(orderPrivateCar.getOrderType() == 1){ - long specialCarTimeoutReminderInterval = jsonObject.getInteger("specialCarTimeoutReminderInterval") * 60000L; - long m = (System.currentTimeMillis() - orderPrivateCar.getSnatchOrderTime().getTime()) / 60000; - JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("driverId", uid); - jobDataMap.put("orderId", orderPrivateCar.getId()); - jobDataMap.put("orderType", 1); - jobDataMap.put("describe", language == 1 ? "您的打车订单已超时" + m + "分钟,请抓紧!" : language == 2 ? "Your ride order is overdue for " + m + " minute(s), please go faster." : "Votre commande de course est en retard depuis " + m + " minute(s), veuillez aller plus vite."); - QuartzUtil.addSimpleQuartzTask( - new OrderTimeOutJob().buildQuartzJob(UUIDUtil.getRandomCode(5) + "_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap) - , new Date(specialCarTimeoutReminderInterval), specialCarTimeoutReminderInterval, -1); - }else{ - UserInfo userInfo = userInfoMapper.selectById(orderPrivateCar.getUserId()); - JSONObject reservationOrder = jsonObject.getJSONObject("reservationOrder"); - long appointmentReminder = reservationOrder.getInteger("appointmentReminder") * 60000L; - long appointmentTimeoutReminderInterval = reservationOrder.getInteger("appointmentTimeoutReminderInterval") * 60000L; - SimpleDateFormat sdf = new SimpleDateFormat(""); - JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("driverId", uid); - jobDataMap.put("orderId", orderPrivateCar.getId()); - jobDataMap.put("orderType", 1); - jobDataMap.put("describe", "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + userInfo.getFirstName() + " " + userInfo.getLastName() + ",请准时!"); - QuartzUtil.addSimpleQuartzTask( - new OrderTimeOutJob().buildQuartzJob(UUIDUtil.getRandomCode(5) + "_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap) - , new Date(appointmentReminder), appointmentReminder, 0); - + + /** + * 超时用户取消不收费的提醒 + * 预约单:行程时间 + 配置不收费的时间 > 当前时间 (只弹一次) + * 即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次) + * + * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间 + * + * 定时提醒弹框 + * 司机只要开始超时且还未到达预约点,则需要定时提醒 + * + * 预约单需要提前xx分钟提醒司机需要接乘客,过后每隔xx分钟提醒一次。超时后停止提醒 + */ + + //添加定时任务(普通任务) + SysOvertime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<SysOvertime>().eq("companyId", driver.getCompanyId())); + if(null != reminderRules){ + CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().eq("companyId", driver.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", uid); + jobDataMap.put("timeOutType", 1); + jobDataMap.put("orderId", orderPrivateCar.getId()); + jobDataMap.put("orderType", 1); + jobDataMap.put("language", language); + jobDataMap.put("timeOut", timeOut); + jobDataMap.put("describe", language == 1 ? "您已超时" + driverTimeout + "分钟,用户可免费取消订单" : language == 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(UUIDUtil.getRandomCode(5) + "_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap) + , new Date(timeOut), timeOut, 0); + + //超时循环提醒 jobDataMap = new JobDataMap(); jobDataMap.put("driverId", uid); + jobDataMap.put("timeOutType", 3); jobDataMap.put("orderId", orderPrivateCar.getId()); jobDataMap.put("orderType", 1); - jobDataMap.put("describe", "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + userInfo.getFirstName() + " " + userInfo.getLastName() + ",请准时!"); + jobDataMap.put("language", language); + jobDataMap.put("timeOut", orderPrivateCar.getEstimateArriveTime().getTime()); + jobDataMap.put("describe", ""); QuartzUtil.addSimpleQuartzTask( new OrderTimeOutJob().buildQuartzJob(UUIDUtil.getRandomCode(5) + "_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap) - , new Date(appointmentReminder + appointmentTimeoutReminderInterval), appointmentTimeoutReminderInterval, -1); + , orderPrivateCar.getEstimateArriveTime(), reminderRules.getCar() * 60000, -1); + }else{ + //超时时间 + long timeOut = orderPrivateCar.getTravelTime().getTime() + (driverTimeout * 60000); + //乘客取消不收费提醒 + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("driverId", uid); + jobDataMap.put("timeOutType", 1); + jobDataMap.put("orderId", orderPrivateCar.getId()); + jobDataMap.put("orderType", 1); + jobDataMap.put("language", language); + jobDataMap.put("timeOut", timeOut); + jobDataMap.put("describe", language == 1 ? "您已超时" + driverTimeout + "分钟,用户可免费取消订单" : language == 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(UUIDUtil.getRandomCode(5) + "_" + 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", uid); + jobDataMap.put("timeOutType", 2); + jobDataMap.put("orderId", orderPrivateCar.getId()); + jobDataMap.put("orderType", 1); + jobDataMap.put("language", language); + jobDataMap.put("timeOut", timeOut); + jobDataMap.put("describe", language == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + ",请准时!" : + language == 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(UUIDUtil.getRandomCode(5) + "_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap) + , new Date(travelTime), travelTime, 0); + + //预约单出发循环提醒 + jobDataMap = new JobDataMap(); + jobDataMap.put("driverId", uid); + jobDataMap.put("timeOutType", 2); + jobDataMap.put("orderId", orderPrivateCar.getId()); + jobDataMap.put("orderType", 1); + jobDataMap.put("language", language); + jobDataMap.put("timeOut", orderPrivateCar.getTravelTime().getTime()); + jobDataMap.put("describe", language == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + ",请准时!" : + language == 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(UUIDUtil.getRandomCode(5) + "_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap) + , new Date(travelTime + reminderRules.getReserveNext() * 60000), reminderRules.getReserveNext() * 60000, -1); + + //超时循环提醒 + jobDataMap = new JobDataMap(); + jobDataMap.put("driverId", uid); + jobDataMap.put("timeOutType", 3); + jobDataMap.put("orderId", orderPrivateCar.getId()); + jobDataMap.put("orderType", 1); + jobDataMap.put("language", language); + jobDataMap.put("timeOut", orderPrivateCar.getTravelTime().getTime()); + jobDataMap.put("describe", ""); + QuartzUtil.addSimpleQuartzTask( + new OrderTimeOutJob().buildQuartzJob(UUIDUtil.getRandomCode(5) + "_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap) + , orderPrivateCar.getTravelTime(), reminderRules.getCar() * 60000, -1); } } - 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()); + new Thread(()->{ + 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()); + } + fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(), + orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(), orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString()); + } + //开始修改行程数据 + fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null); + }catch (Exception e){ + e.printStackTrace(); } - fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(), - orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(), orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString()); - } - //开始修改行程数据 - fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null); + }).start(); //推送相关代码------------------start---------------- new Thread(new Runnable() { @@ -353,6 +454,7 @@ return ResultUtil.error(language == 1 ? "当前订单不能到达预约地点" : language == 2 ? "The current order cannot arrive at the reservation" : "La commande en cours ne peut pas atteindre le rendez-vous"); } String tripStatus = "UNKNOWN_TRIP_STATUS"; + String audioUrl = ""; switch (state){ case 3://出发前往预约点 orderPrivateCar.setState(3); @@ -401,6 +503,17 @@ out.flush(); out.close(); tripStatus = "ENROUTE_TO_DROPOFF"; + switch (language){ + case 1: + audioUrl = "http://182.160.16.251:81/files/audio/OnboardReminder-CN.mp3"; + break; + case 2: + audioUrl = "http://182.160.16.251:81/files/audio/OnboardReminder-EN.mp3"; + break; + case 3: + audioUrl = "http://182.160.16.251:81/files/audio/OnboardReminder-FR.mp3"; + break; + } break; case 6://结束服务(专车可以返回继续服务)不修改状态 orderPrivateCar.setState(6); @@ -410,13 +523,31 @@ orderPrivateCar.setGetoffTime(new Date()); orderPrivateCar.setEndServiceTime(new Date()); tripStatus = "COMPLETE"; + switch (language){ + case 1: + audioUrl = "http://182.160.16.251:81/files/audio/ReachDestination-CN.mp3"; + break; + case 2: + audioUrl = "http://182.160.16.251:81/files/audio/ReachDestination-EN.mp3"; + break; + case 3: + audioUrl = "http://182.160.16.251:81/files/audio/ReachDestination-FR.mp3"; + break; + } break; } this.updateById(orderPrivateCar); Driver driver = driverService.selectById(orderPrivateCar.getDriverId()); - //修改行程数据 - fleetEngineUtil.updateTrip(tripStatus, null, 1, orderPrivateCar.getTripId(), null, null, null, null); + String finalTripStatus = tripStatus; + new Thread(()->{ + //修改行程数据 + try { + fleetEngineUtil.updateTrip(finalTripStatus, null, 1, orderPrivateCar.getTripId(), null, null, null, null); + } catch (Exception e) { + throw new RuntimeException(e); + } + }).start(); // TODO: 2020/6/5 推送状态 OrderPrivateCar finalOrderPrivateCar = orderPrivateCar; @@ -427,7 +558,7 @@ pushUtil.pushOrderState(2, finalOrderPrivateCar.getDriverId(), finalOrderPrivateCar.getId(), 1, finalOrderPrivateCar.getState()); } }).start(); - return ResultUtil.success(); + return ResultUtil.success(audioUrl); } @@ -444,6 +575,9 @@ @Override public ResultUtil confirmFees(Integer language, Integer orderId, Integer type, Double parkingFee, Double crossingFee) throws Exception { OrderPrivateCar orderPrivateCar = this.selectById(orderId); + if(6 != orderPrivateCar.getState()){ + return ResultUtil.error("操作异常,请刷新订单"); + } if(orderPrivateCar.getArriveTime()==null){ orderPrivateCar.setArriveTime(orderPrivateCar.getStartServiceTime()); } @@ -523,6 +657,18 @@ pushUtil.pushOrderState(2, finalOrderTaxi.getDriverId(), finalOrderTaxi.getId(), 1, finalOrderTaxi.getState()); } }).start(); + + OrderPrivateCar finalOrderPrivateCar = orderPrivateCar; + new Thread(()->{ + try { + //上报google + fleetEngineUtil.reportBillableEvent(finalOrderPrivateCar.getTripId()); + log.warn("上报时间:{},tripid:{},created_at:{},completed_at:{}", System.currentTimeMillis(), finalOrderPrivateCar.getTripId(), + finalOrderPrivateCar.getInsertTime().getTime(), finalOrderPrivateCar.getEndServiceTime().getTime()); + }catch (Exception e){ + e.printStackTrace(); + } + }).start(); return ResultUtil.success(); } @@ -536,7 +682,7 @@ @Override public Map<String, Object> queryMoneyInfo(Integer orderId) throws Exception { OrderPrivateCar orderPrivateCar = this.selectById(orderId); - if(orderPrivateCar.getState() == 5){//服务中的时候获取实时费用数据 + if(orderPrivateCar.getState() == 6){//服务中的时候获取实时费用数据 this.setMoney(orderPrivateCar, 0D, 0D); } @@ -576,6 +722,7 @@ if(null != orderPosition){ old = orderPosition.getLon() + "," + orderPosition.getLat(); }else{ + orderPrivateCar.setToStartPointMileage(0D); orderPrivateCar.setMileage(0D); this.updateById(orderPrivateCar); return true;//第一条数据不作处理,直接存储 @@ -584,7 +731,12 @@ Map<String, Double> distance = GeodesyUtil.getDistance(now, old); if(null != distance){ Double distance1 = distance.get("WGS84"); - if(distance1 > 50 && orderPrivateCar.getState()==5/* && orderPosition.getInsertTime().getTime()>=orderPrivateCar.getBoardingTime().getTime()*/){//大于50米表示在移动 + if(distance1 > 50 && orderPrivateCar.getState() < 5){//大于50米表示在移动 + orderPrivateCar.setToStartPointMileage(new BigDecimal(orderPrivateCar.getToStartPointMileage()).add(new BigDecimal(distance1)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); + this.updateById(orderPrivateCar); + return true; + } + if(distance1 > 50 && orderPrivateCar.getState()==5){//大于50米表示在移动 orderPrivateCar.setMileage(new BigDecimal(orderPrivateCar.getMileage()).add(new BigDecimal(distance1)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); this.updateById(orderPrivateCar); return true; @@ -860,6 +1012,14 @@ orderPrivateCar.setEndLon(Double.valueOf(orderPrivateCar.getDestinationLon())); orderPrivateCar.setEndLat(Double.valueOf(orderPrivateCar.getDestinationLat())); orderPrivateCar.setEndAddress(orderPrivateCar.getDestination()); + //修改google地图行程终点 + try { + fleetEngineUtil.updateTrip(null, null, null, orderPrivateCar.getTripId(), + null, null, orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString()); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } } orderPrivateCar.setDestinationLon(""); orderPrivateCar.setDestination(""); -- Gitblit v1.7.1