From 20fb7c22fd9d4a936a2e9f4b003da51a0c2a0217 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 25 四月 2025 18:11:19 +0800 Subject: [PATCH] 修改bug --- ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java | 197 +++++- ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java | 8 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java | 639 +++++++++++++++++-- ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java | 2 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java | 231 +++++++ ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java | 126 +-- ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java | 35 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java | 46 + ManagementIGOTravel/guns-admin/pom.xml | 8 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java | 8 ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml | 5 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java | 239 +++++++ ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml | 5 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java | 39 + ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java | 105 -- ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java | 1 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java | 45 + ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java | 21 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java | 4 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java | 50 + ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java | 60 + ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java | 14 22 files changed, 1,572 insertions(+), 316 deletions(-) diff --git a/ManagementIGOTravel/guns-admin/pom.xml b/ManagementIGOTravel/guns-admin/pom.xml index 251aabf..9bb7061 100644 --- a/ManagementIGOTravel/guns-admin/pom.xml +++ b/ManagementIGOTravel/guns-admin/pom.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> @@ -64,11 +64,9 @@ <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> - <dependency> - <groupId>redis.clients</groupId> - <artifactId>jedis</artifactId> - <version>2.9.0</version> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 导入Excel数据依赖 start --> diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java index a2dada8..2352ca2 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java @@ -1,7 +1,5 @@ package com.stylefeng.guns.modular.system.controller.general; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.stylefeng.guns.core.shiro.ShiroKit; @@ -170,16 +168,12 @@ } List<TDriver> tDrivers = tDriverService.selectList(ne1); String keys = ""; + List<String> list = new ArrayList<>(); for(TDriver driver : tDrivers){ - keys += "DRIVER" + driver.getId() + ","; + String value = redisUtil.getValue("DRIVER" + driver.getId()); + list.add(value); } - if(keys.length() > 1){ - String value = redisUtil.getValues(keys.substring(0, keys.length() - 1)); - JSONArray jsonArray = JSON.parseArray(value); - map1.put("netcardriver", jsonArray.size()); //在线司机 - }else{ - map1.put("netcardriver", 0); //在线司机 - } + map1.put("netcardriver", list.size()); //在线司机 Wrapper<TOrderTaxi> travelTime1 = new EntityWrapper<TOrderTaxi>().between("travelTime", calendar1.getTime(), calendar2.getTime()); if(companyId != null){ diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java index eeec482..46ca401 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java @@ -1,36 +1,34 @@ package com.stylefeng.guns.modular.system.controller.general; -import cn.hutool.system.UserInfo; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; import com.stylefeng.guns.core.base.controller.BaseController; import com.stylefeng.guns.core.common.constant.factory.PageFactory; +import com.stylefeng.guns.core.log.LogObjectHolder; import com.stylefeng.guns.core.shiro.ShiroKit; -import com.stylefeng.guns.core.shiro.ShiroUser; import com.stylefeng.guns.core.util.DateUtil; import com.stylefeng.guns.core.util.SinataUtil; -import com.stylefeng.guns.modular.system.model.TSystemNotice; +import com.stylefeng.guns.modular.system.model.SysRedPacketRecord; import com.stylefeng.guns.modular.system.model.TUser; +import com.stylefeng.guns.modular.system.model.User; import com.stylefeng.guns.modular.system.model.UserRedPacketRecord; -import com.stylefeng.guns.modular.system.service.ITSystemNoticeService; -import com.stylefeng.guns.modular.system.service.ITUserService; -import com.stylefeng.guns.modular.system.service.IUserRedPacketRecordService; -import com.stylefeng.guns.modular.system.service.impl.UserServiceImpl; +import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.ResultUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.beans.factory.annotation.Autowired; -import com.stylefeng.guns.core.log.LogObjectHolder; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import com.stylefeng.guns.modular.system.model.SysRedPacketRecord; -import com.stylefeng.guns.modular.system.service.ISysRedPacketRecordService; +import org.springframework.web.bind.annotation.ResponseBody; import java.math.BigDecimal; -import java.util.*; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Random; /** * 控制器 @@ -42,13 +40,19 @@ @RequestMapping("/sysRedPacketRecord") public class SysRedPacketRecordController extends BaseController { - private String PREFIX = "/system/sysRedPacketRecord/"; + private final String PREFIX = "/system/sysRedPacketRecord/"; @Autowired private ISysRedPacketRecordService sysRedPacketRecordService; @Autowired private IUserRedPacketRecordService userRedPacketRecordService; - + @Autowired + private ITSystemNoticeService systemNoticeService; + @Autowired + private ITUserService userService; + + @Autowired + private IUserService iUserService; @RequestMapping("/redRecord") public String index( Model model,Integer couponActivityId,Integer activityType) { @@ -56,7 +60,6 @@ model.addAttribute("couponActivityId",couponActivityId); return PREFIX + "userRedRecord.html"; } - /** * 跳转到首页 @@ -89,14 +92,6 @@ LogObjectHolder.me().set(sysRedPacketRecord); return PREFIX + "sysRedPacketRecord_edit.html"; } - - - @Autowired - private ITSystemNoticeService systemNoticeService; - - @Autowired - private ITUserService userService; - @RequestMapping(value = "/direct") @ResponseBody @@ -138,50 +133,51 @@ // } } - String[] split = ids.split(","); + User user = iUserService.selectById(ShiroKit.getUser().getId()); + String[] split = ids.split(","); for (String s : split) { - if(money > 0||sysRedPacketRecord.getType()!=1){ - if (sysRedPacketRecord.getType()!=1){ - Double startMoney = Double.valueOf(String.valueOf(sysRedPacketRecord.getStartMoney())); - Double endMoney = Double.valueOf(String.valueOf(sysRedPacketRecord.getEndMoney())); - int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue(); - Random random = new Random(); - int num; - if (!startMoney.equals(endMoney)){ - num = random.nextInt(i); - - }else { - num = 0; + if(money > 0||sysRedPacketRecord.getType()!=1){ + if (sysRedPacketRecord.getType()!=1){ + Double startMoney = Double.valueOf(String.valueOf(sysRedPacketRecord.getStartMoney())); + Double endMoney = Double.valueOf(String.valueOf(sysRedPacketRecord.getEndMoney())); + int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue(); + Random random = new Random(); + int num; + if (!startMoney.equals(endMoney)){ + num = random.nextInt(i); + + }else { + num = 0; + } + money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + v=v-money; + if (v<0){ + return ResultUtil.success("当前红包为随机红包,可能有部分用户无法领取",null,"当前红包为随机红包,可能有部分用户无法领取"); + } } - money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); - v=v-money; - if (v<0){ - return ResultUtil.success("当前红包为随机红包,可能有部分用户无法领取",null,"当前红包为随机红包,可能有部分用户无法领取"); + //添加临时红包数据 + UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord(); + userRedPacketRecord.setMoney(money); + userRedPacketRecord.setRemainingAmount(money); + userRedPacketRecord.setInsertTime(new Date()); + userRedPacketRecord.setCompanyId(user.getObjectId()); + userRedPacketRecord.setState(1); + userRedPacketRecord.setOrderId(null); + // 标记为后台发放的红包 + userRedPacketRecord.setIsGrant(1); + userRedPacketRecord.setRedPacketActivityId(redId); + // userRedPacketRecord.setOrderType(3); + userRedPacketRecord.setUserId(Integer.valueOf(s)); + userRedPacketRecordService.insert(userRedPacketRecord); + + TUser tUser = userService.selectById(Integer.valueOf(s)); + Integer language = tUser.getLanguage(); + try { + systemNoticeService.addSystemNotice(1, language == 1 ? "您收到一个额度为GHS"+money+"的红包,请查收。" : language == 2 ? "You have received a red envelope with a limit of GHS"+money+". Please check it." : "Vous recevez un paquet rouge avec une limite de ghs+"+money+", veuillez vérifier.", tUser.getId()); + }catch (Exception e){ + e.printStackTrace(); } } - //添加临时红包数据 - UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord(); - userRedPacketRecord.setMoney(money); - userRedPacketRecord.setRemainingAmount(money); - userRedPacketRecord.setInsertTime(new Date()); - userRedPacketRecord.setCompanyId(1); - userRedPacketRecord.setState(1); - userRedPacketRecord.setOrderId(null); - // 标记为后台发放的红包 - userRedPacketRecord.setIsGrant(1); - userRedPacketRecord.setRedPacketActivityId(redId); -// userRedPacketRecord.setOrderType(3); - userRedPacketRecord.setUserId(Integer.valueOf(s)); - userRedPacketRecordService.insert(userRedPacketRecord); - - TUser tUser = userService.selectById(Integer.valueOf(s)); - Integer language = tUser.getLanguage(); - try { - systemNoticeService.addSystemNotice(1, language == 1 ? "您收到一个额度为GHS"+money+"的红包,请查收。" : language == 2 ? "You have received a red envelope with a limit of GHS"+money+". Please check it." : "Vous recevez un paquet rouge avec une limite de ghs+"+money+", veuillez vérifier.", tUser.getId()); - }catch (Exception e){ - e.printStackTrace(); - } - } } return ResultUtil.success("指派成功",null,"当前红包为随机红包,可能有部分用户无法领取"); } diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java index d943f34..c87bbdf 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java @@ -9,19 +9,18 @@ import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.ITCarService; import com.stylefeng.guns.modular.system.service.ITDriverService; +import com.stylefeng.guns.modular.system.service.ITOrderLogisticsService; import com.stylefeng.guns.modular.system.service.ITUserService; import com.stylefeng.guns.modular.system.util.GoogleMap.FleetEngineUtil; import com.stylefeng.guns.modular.system.util.HttpRequestUtil; import com.stylefeng.guns.modular.system.util.PushURL; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.beans.factory.annotation.Autowired; -import com.stylefeng.guns.core.log.LogObjectHolder; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import com.stylefeng.guns.modular.system.service.ITOrderLogisticsService; +import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.util.Arrays; @@ -55,9 +54,8 @@ @Resource private ITCarService carService; - - - + @Autowired + private ITDriverService itDriverService; /** * 跳转到小件物流订单首页 @@ -113,9 +111,6 @@ return super.packForBT(page); } - @Autowired - private ITDriverService itDriverService; - /** * 取消小件物流订单 */ @@ -151,10 +146,10 @@ //修改行程信息 TCar car = carService.selectById(tOrderLogistics.getCarId()); //修改行程信息 - boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderLogistics.getTripId(), null, null, null, null); + boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderLogistics.getTripId(), null, null, null, null, tOrderLogistics.getId(), 4); if(!updateTrip){ for (int i = 0; i < 5; i++) { - updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderLogistics.getTripId(), null, null, null, null); + updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderLogistics.getTripId(), null, null, null, null, tOrderLogistics.getId(), 4); if(updateTrip){ tOrderLogistics.setIsover(1); tOrderLogisticsService.updateById(tOrderLogistics); diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java index 6bc49db..1beddb3 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java @@ -281,10 +281,10 @@ tOrderPrivateCarService.updateById(orderPrivateCar); //修改行程数据 - boolean updateTrip = fleetEngineUtil.updateTrip("COMPLETE", null, null, orderPrivateCar.getTripId(), null, null, null, null); + boolean updateTrip = fleetEngineUtil.updateTrip("COMPLETE", null, null, orderPrivateCar.getTripId(), null, null, null, null, orderPrivateCar.getId(), 1); if(!updateTrip){ for (int i = 0; i < 5; i++) { - updateTrip = fleetEngineUtil.updateTrip("COMPLETE", null, null, orderPrivateCar.getTripId(), null, null, null, null); + updateTrip = fleetEngineUtil.updateTrip("COMPLETE", null, null, orderPrivateCar.getTripId(), null, null, null, null, orderPrivateCar.getId(), 1); if(updateTrip){ orderPrivateCar.setIsover(1); tOrderPrivateCarService.updateById(orderPrivateCar); @@ -639,10 +639,10 @@ //修改行程信息 TCar car = carService.selectById(tOrderPrivateCar.getCarId()); //修改行程信息 - boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderPrivateCar.getTripId(), null, null, null, null); + boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderPrivateCar.getTripId(), null, null, null, null, tOrderPrivateCar.getId(), 1); if(!updateTrip){ for (int i = 0; i < 5; i++) { - updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderPrivateCar.getTripId(), null, null, null, null); + updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderPrivateCar.getTripId(), null, null, null, null, tOrderPrivateCar.getId(), 1); if(updateTrip){ tOrderPrivateCar.setIsover(1); tOrderPrivateCarService.updateById(tOrderPrivateCar); diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java index 1aaec3e..6e03051 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java @@ -1,5 +1,7 @@ package com.stylefeng.guns.modular.system.controller.specialTrain; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.stylefeng.guns.core.base.controller.BaseController; @@ -8,13 +10,21 @@ import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.shiro.ShiroUser; import com.stylefeng.guns.core.util.SinataUtil; +import com.stylefeng.guns.core.util.ToolUtil; +import com.stylefeng.guns.modular.system.controller.util.PushUtil; import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper; import com.stylefeng.guns.modular.system.dao.OrderCancelMapper; +import com.stylefeng.guns.modular.system.dao.TCarModelMapper; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; -import com.stylefeng.guns.modular.system.util.HttpRequestUtil; -import com.stylefeng.guns.modular.system.util.PushURL; -import com.stylefeng.guns.modular.system.util.ResultUtil; +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.*; +import com.stylefeng.guns.modular.system.util.quartz.QuartzUtil; +import com.stylefeng.guns.modular.system.util.quartz.jobs.OrderTimeOutJob; +import org.apache.shiro.util.StringUtils; +import org.quartz.JobDataMap; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -25,11 +35,12 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.math.BigDecimal; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.util.*; /** * 专车改派管理控制器 @@ -45,6 +56,9 @@ @Autowired private ITReassignService tReassignService; + + @Autowired + private PushUtil pushUtil; @Autowired private ITOrderPrivateCarService itOrderPrivateCarService; @@ -83,6 +97,32 @@ private ITOrderLogisticsService orderLogisticsService; @Autowired private ITPubTransactionDetailsService itPubTransactionDetailsService; + + @Resource + private QuartzUtil quartzUtil; + + @Resource + private FleetEngineUtil fleetEngineUtil; + + @Resource + private TCarModelMapper carModelMapper; + + @Resource + private ITCarService carService; + + @Resource + private RedisUtil redisUtil; + + @Resource + private ITSysOverTimeService sysOvertimeService; + + @Resource + private ITSysCancleOrderService cancleOrderService; + + @Resource + private ITSystemNoticeService systemNoticeService; + + /** * 跳转到专车改派管理首页 @@ -585,40 +625,303 @@ @RequestMapping(value = "/selectDriver") @ResponseBody public Object selectDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) { - //修改订单 - TReassign tReassign = tReassignService.selectById(orderId); - TOrderPrivateCar tOrderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId()); - - //修改之前司机状态 -- 空闲 - TDriver oldDriver = itDriverService.selectById(tReassign.getOriginalDriverId()); - oldDriver.setState(2); - itDriverService.updateById(oldDriver); - - //查找司机对象 - TDriver nowDriver = itDriverService.selectById(driverId); - nowDriver.setState(3); - itDriverService.updateById(nowDriver); - - //修改专车订单 - tOrderPrivateCar.setState(tOrderPrivateCar.getOldState()); - tOrderPrivateCar.setDriverId(driverId); - tOrderPrivateCar.setCarId(nowDriver.getCarId()); - itOrderPrivateCarService.updateById(tOrderPrivateCar); - - //修改专车改派订单 - tReassign.setNowDriverId(driverId); - tReassign.setNowCarId(nowDriver.getCarId()); - tReassign.setState(3); - tReassign.setCompleteTime(new Date()); - tReassignService.updateById(tReassign); - - //增加推送 - Map<String,String> map = new HashMap<>(); - map.put("orderId", tOrderPrivateCar.getId().toString()); - map.put("orderType", "1"); - String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map); - System.out.println("专车改派:【orderId="+tOrderPrivateCar.getId().toString()+"】,调用接口:"+result); - return SUCCESS_TIP; + try { + //修改订单 + TReassign tReassign = tReassignService.selectById(orderId); + TOrderPrivateCar orderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId()); + String tripId = redisUtil.getValue("trip" + orderPrivateCar.getUserId()); + TDriver driver = itDriverService.selectById(orderPrivateCar.getDriverId()); + TDriver driver1 = itDriverService.selectById(driverId); + + String text = ""; + tReassign.setState(3); + tReassign.setNowDriverId(driver1.getId()); + tReassign.setNowCarId(driver1.getCarId()); + tReassign.setCompleteTime(new Date()); + tReassignService.updateById(tReassign); + + + 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); + } + // 等待命令执行完成 + process.waitFor(); + // 关闭流 + reader.close(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } + }, 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()); + } + } + itOrderPrivateCarService.updateAllColumnById(orderPrivateCar); + driver1.setState(3); + itDriverService.updateById(driver1); + + driver.setState(2); + itDriverService.updateById(driver); + + //检查google车辆信息或者添加新的车辆信息 + TCar 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)){ + TCarModel 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{ + //开始修改行程数据 + 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分钟提醒一次。超时后停止提醒 + */ + + //添加定时任务(普通任务) + TSysOverTime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<TSysOverTime>().eq("companyId", driver1.getCompanyId())); + if(null != reminderRules){ + TSysCancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().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); + + + TUser userInfo = userService.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 = userService.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()); + return SUCCESS_TIP; + }catch (Exception e){ + e.printStackTrace(); + } + return ERROR; } /** @@ -743,28 +1046,236 @@ @ResponseBody public Object selectSmallDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) { //修改订单 - TReassign tReassign = tReassignService.selectById(orderId); - TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(tReassign.getOrderId()); - - TDriver nowDriver = itDriverService.selectById(driverId); - //修改专车订单 - tOrderLogistics.setState(tOrderLogistics.getOldState()); - tOrderLogistics.setDriverId(driverId); - tOrderLogistics.setCarId(nowDriver.getCarId()); - orderLogisticsService.updateById(tOrderLogistics); - - tReassign.setNowDriverId(driverId); - tReassign.setNowCarId(nowDriver.getCarId()); - tReassign.setState(3); - tReassign.setCompleteTime(new Date()); - tReassignService.updateById(tReassign); - - //增加推送 - Map<String,String> map = new HashMap<>(); - map.put("orderId", tOrderLogistics.getId().toString()); - map.put("orderType", tOrderLogistics.getType().toString()); - String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map); - System.out.println("小件物流改派:【orderId="+tOrderLogistics.getId().toString()+"】,调用接口:"+result); - return SUCCESS_TIP; + try { + TReassign tReassign = tReassignService.selectById(orderId); + TOrderLogistics orderLogistics = orderLogisticsService.selectById(tReassign.getOrderId()); + String tripId = redisUtil.getValue("trip" + orderLogistics.getUserId()); + TDriver driver = itDriverService.selectById(orderLogistics.getDriverId()); + + TDriver driver1 = itDriverService.selectById(driverId); + tReassign.setState(3); + tReassign.setNowDriverId(driver1.getId()); + tReassign.setNowCarId(driver1.getCarId()); + tReassign.setCompleteTime(new Date()); + tReassignService.updateById(tReassign); + + 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 = null; + try { + fileName = "pushOrder" + driver1.getId() + UUIDUtil.getRandomCode(5) + ".mp3"; + } catch (Exception e) { + throw new RuntimeException(e); + } + try { + audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName); + } catch (Exception e) { + throw new RuntimeException(e); + } + //定时任务删除语音文件 + String finalFileName = fileName; + 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/" + finalFileName); + // 读取命令的输出 + 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); + itDriverService.updateById(driver1); + + driver.setState(2); + itDriverService.updateById(driver); + + //检查google车辆信息或者添加新的车辆信息 + TCar 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)){ + TCarModel 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, 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); + } + } + } + } + + + //删除定时任务 + 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"); + + /** + * 超时用户取消不收费的提醒 + * 即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次) + * + * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间 + * + * 定时提醒弹框 + * 司机只要开始超时且还未到达预约点,则需要定时提醒 + */ + + //添加定时任务(普通任务) + TSysOverTime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<TSysOverTime>().eq("companyId", driver1.getCompanyId())); + if(null != reminderRules){ + TSysCancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().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 = userService.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()); + + + return SUCCESS_TIP; + }catch (Exception e){ + e.printStackTrace(); + } + return ERROR; } } diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java index 17be056..0bb57ae 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java @@ -2,12 +2,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; - import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil; import com.stylefeng.guns.modular.system.util.PushURL; import com.stylefeng.guns.modular.system.util.RedisUtil; - - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -17,10 +14,9 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; -import java.math.BigDecimal; -import java.math.MathContext; -import java.math.RoundingMode; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Timer; /** * socket推单处理类 @@ -387,4 +383,39 @@ System.err.println(jsonObject1.getString("msg")); } } + + + /** + * 改派完成后推送用户端提醒 + * @param uid + * @param orderId + * @param orderType + */ + public void pushOrderReassign(Integer uid, Integer type, Integer orderId, Integer orderType, String audioUrl){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", 200); + jsonObject.put("msg", "SUCCESS"); + jsonObject.put("method", "REASSIGN"); + Map<String, Object> map = new HashMap<>(); + map.put("orderId", orderId); + map.put("orderType", orderType); + map.put("audioUrl", audioUrl); + jsonObject.put("data", map); + + //调用推送 + HttpHeaders headers = new HttpHeaders(); + // 以表单的方式提交 + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + //将请求头部和参数合成一个请求 + MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); + params.add("msg", jsonObject.toJSONString()); + params.add("id", String.valueOf(uid)); + params.add("type", type.toString()); + HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); + String s = internalRestTemplate.postForObject(PushURL.zull_user_url + "/netty/sendMsgToClient",requestEntity , String.class); + JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); + if(jsonObject1.getIntValue("code") != 200){ + System.err.println(jsonObject1.getString("msg")); + } + } } diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java index bb62023..47063d7 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java @@ -43,6 +43,7 @@ List<Map<String,Object>> getCanSelectPrivateCarDriverList(@Param("page") Page<Map<String, Object>> page, @Param("serverCarModelId") Integer serverCarModelId, @Param("driverId") Integer driverId, + @Param("type") Integer type, @Param("name") String name, @Param("phone") String phone); diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java index e0adbea..cc3de3d 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java @@ -275,6 +275,21 @@ */ @TableField("serverCarModelId") private Integer serverCarModelId; + /** + * 预估里程 + */ + @TableField("estimatedMileage") + private Double estimatedMileage; + /** + * 司机预估到达预约单时间 + */ + @TableField("estimateArriveTime") + private Date estimateArriveTime; + /** + * 司机预估距离预约点距离(米) + */ + @TableField("estimateArriveMileage") + private Long estimateArriveMileage; public Integer getOldState() { return oldState; @@ -773,6 +788,30 @@ this.serverCarModelId = serverCarModelId; } + public Double getEstimatedMileage() { + return estimatedMileage; + } + + public void setEstimatedMileage(Double estimatedMileage) { + this.estimatedMileage = estimatedMileage; + } + + public Date getEstimateArriveTime() { + return estimateArriveTime; + } + + public void setEstimateArriveTime(Date estimateArriveTime) { + this.estimateArriveTime = estimateArriveTime; + } + + public Long getEstimateArriveMileage() { + return estimateArriveMileage; + } + + public void setEstimateArriveMileage(Long estimateArriveMileage) { + this.estimateArriveMileage = estimateArriveMileage; + } + @Override protected Serializable pkVal() { return this.id; diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java index 7ebc08a..d80cd40 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java @@ -1,15 +1,15 @@ package com.stylefeng.guns.modular.system.model; -import com.baomidou.mybatisplus.annotations.TableField; -import com.baomidou.mybatisplus.enums.IdType; -import java.math.BigDecimal; -import java.util.Date; -import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; /** * <p> @@ -336,6 +336,22 @@ */ @TableField("isDispute") private Integer isDispute; + /** + * 司机预估到达预约单时间 + */ + @TableField("estimateArriveTime") + private Date estimateArriveTime; + + /** + * 司机预估距离预约点距离(米) + */ + @TableField("estimateArriveMileage") + private Long estimateArriveMileage; + /** + * 预估里程 + */ + @TableField("estimatedMileage") + private Double estimatedMileage; public Integer getIsFrozen() { return isFrozen; @@ -995,6 +1011,30 @@ this.isover = isover; } + public Long getEstimateArriveMileage() { + return estimateArriveMileage; + } + + public void setEstimateArriveMileage(Long estimateArriveMileage) { + this.estimateArriveMileage = estimateArriveMileage; + } + + public Double getEstimatedMileage() { + return estimatedMileage; + } + + public void setEstimatedMileage(Double estimatedMileage) { + this.estimatedMileage = estimatedMileage; + } + + public Date getEstimateArriveTime() { + return estimateArriveTime; + } + + public void setEstimateArriveTime(Date estimateArriveTime) { + this.estimateArriveTime = estimateArriveTime; + } + @Override protected Serializable pkVal() { return this.id; diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java index 8b18d06..36f3ebe 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java @@ -1,13 +1,10 @@ package com.stylefeng.guns.modular.system.model; -import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; /** * <p> @@ -17,41 +14,37 @@ * @author 吕雪 * @since 2020-06-09 */ -@TableName("t_sys_overtime") @Data -public class TSysOverTime extends Model<TSysOverTime> { - - private static final long serialVersionUID = 1L; - +@TableName("t_sys_overtime") +public class TSysOverTime { /** - * 主键id + * 主键 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** - * 企业id - */ - private Integer companyId; - - /** * 打车订单每隔xx分钟提醒一次 */ + @TableField("car") private Integer car; /** * 包裹订单每隔xx分钟提醒一次 */ + @TableField("packageTime") private Integer packageTime; /** * 预约订单 在预定时间前x分钟首次提醒 */ + @TableField("reserveTime") private Integer reserveTime; /** * 预约订单每隔xx分钟提醒一次 */ + @TableField("reserveNext") private Integer reserveNext; - - @Override - protected Serializable pkVal() { - return null; - } -} + /** + * 公司id + */ + @TableField("companyId") + private Integer companyId; +} \ No newline at end of file diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java index 30da49d..512c199 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java @@ -1,7 +1,7 @@ package com.stylefeng.guns.modular.system.service; -import com.stylefeng.guns.modular.system.model.TSystemNotice; import com.baomidou.mybatisplus.service.IService; +import com.stylefeng.guns.modular.system.model.TSystemNotice; /** * <p> @@ -12,6 +12,6 @@ * @since 2020-06-10 */ public interface ITSystemNoticeService extends IService<TSystemNotice> { - void addSystemNotice(Integer userType, String content, Integer userId) throws Exception; + void addSystemNotice(Integer userType, String content, Integer userId) ; } diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java index 5d47b94..0240a3b 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java @@ -29,7 +29,7 @@ @Override public List<Map<String, Object>> getCanSelectPrivateCarDriverList(Page<Map<String, Object>> page, Integer serverCarModelId, Integer driverId, String name, String phone) { - return this.baseMapper.getCanSelectPrivateCarDriverList(page, serverCarModelId, driverId, name, phone); + return this.baseMapper.getCanSelectPrivateCarDriverList(page, serverCarModelId, driverId, 1, name, phone); } @Override diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java index 73b2594..293e3c9 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java @@ -1,9 +1,9 @@ package com.stylefeng.guns.modular.system.service.impl; -import com.stylefeng.guns.modular.system.model.TSystemNotice; -import com.stylefeng.guns.modular.system.dao.TSystemNoticeMapper; -import com.stylefeng.guns.modular.system.service.ITSystemNoticeService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.stylefeng.guns.modular.system.dao.TSystemNoticeMapper; +import com.stylefeng.guns.modular.system.model.TSystemNotice; +import com.stylefeng.guns.modular.system.service.ITSystemNoticeService; import org.springframework.stereotype.Service; import java.util.Date; @@ -19,7 +19,7 @@ @Service public class TSystemNoticeServiceImpl extends ServiceImpl<TSystemNoticeMapper, TSystemNotice> implements ITSystemNoticeService { @Override - public void addSystemNotice(Integer userType, String content, Integer userId) throws Exception { + public void addSystemNotice(Integer userType, String content, Integer userId) { TSystemNotice systemNotice = new TSystemNotice(); systemNotice.setContent(content); systemNotice.setInsertTime(new Date()); diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java index a9c356a..7936750 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java @@ -10,7 +10,7 @@ import com.google.fleetengine.auth.token.FleetEngineToken; import com.google.fleetengine.auth.token.TripClaims; import com.google.fleetengine.auth.token.VehicleClaims; -import com.google.fleetengine.auth.token.factory.signer.*; +import com.google.fleetengine.auth.token.factory.signer.LocalSigner; import com.stylefeng.guns.modular.system.util.RedisUtil; import com.stylefeng.guns.modular.system.util.UUIDUtil; import lombok.extern.slf4j.Slf4j; @@ -20,7 +20,10 @@ import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -32,29 +35,18 @@ @Component public class FleetEngineUtil { - static Logger logger = LoggerFactory.getLogger(FleetEngineUtil.class); - - private final String SERVICE_ACCOUNT = "odrd-fleetengine-ondemandadmin@i-go-odrd-testing.iam.gserviceaccount.com"; - - private final String DRIVER_ACCOUNT = "odrd-fleetengine-driversdkuser@i-go-odrd-testing.iam.gserviceaccount.com"; - - private final String CONSUMER_ACCOUNT = "odrd-fleetengine-consumersdkus@i-go-odrd-testing.iam.gserviceaccount.com"; - - private final String serverPrivateKeyId = "254e18eefa9fdcca64d5899cdcd793d466c47c7d"; - - private final String serverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCfbNAWnukqLKIxItqmSABxsH5glySEHJ2gfL5KsRF0M02e0Z8/KNKZkoh7I6bOMt1fEtttFaWOeq70IdI2WAd5wVazL3upvl5FW4P08ly33LklfGyLljlJ7ChPny9x6OjAaiS0yD9fh7NWti7rZKU7gzcGL8HddNYXgXV5OajvoG3TGdu52WTxce9AUzU6gLPboz/RbGqrdrmgVJVb0EPlhTJf/NSsaiW4NoL8SEzf/pJGYBmqJs97mXwCHTY4avaC+CP/zz9yS8AQEJlApbVT6lSOhYoR0hNOBj5B886EZOssjubO6hQaiwRnGrV2RdpHynqA1iekfGpUGEtWTsqjAgMBAAECggEALyPbMd0iP8y71sCiG4nty7Au5ju62e+mMkbAc9CAwzXKTVxZdLEK+MsJ3TNxBsami47FYC+G6SbgpaJ8iIImD7v5+XjgXZRDRsnlLmAdx2YWPv3YELxGS1PvpX+B5XJDpGWeXfBaQNKc1lZ/cC4t53eIpSUo82UxSvkGNea1S8lR6vIByhNyCQOvLG4yqaxUy0hZi0kge37XrjYMGS+BivBBnDiVlBPLBVbrNBxOf31Lzz+XX0iwXX7Zl2jN759oe0xQyuIGWUSj8xBDIF8nNaJrla7rWVml3sZJh6/3r1Acj0mhZtE0ZMu5hiPGiIXgb1ng30j3dMP4yVPhXrpAtQKBgQDaU01VnHsnHxc0DQHE2vEOPGmPxVS0/JAssePAEUmKEueUogGef91YY+Vm/ItbhLwGjbytnXxe88zRAdB1u07efZ83ey93TrGl2CJUzLHIcgb+Q1tT642rqlfl+q8ep86hcZ+63pDiIPt2Z+HkbKIR0SWf5LIH4flquQOTQufXXQKBgQC674qDsjOJepZjMMN6PkVMcWBYDNmXHnqa5Oto0rZM745UulbXqEFGuBOsXPU7O33Kfz1vbtoluubKZi5B6cFNnPypE2SCfvdObHq4FuTuKPV6lN93SyhZchmSEXEs0PU4cGDRt+RRqQcjft1Wigiy4Y1y1SInCtcaP1hLejEJ/wKBgFAhvwKrGnBzctrB42JTUaJ9/eis7rg28tvUttjp/2nUIndlNt7r41vr3mj8TFHc1/43y4aVhO584THdTpvHkd0LkoKUjglmMsHCIGercZ02bOap5j1Y+XiGXxij995yjN6oi43U3qyAmosM+dYTITEU6JBVKhrGj/rhyTQlnF5pAoGBAKFGmo0mR/pbDbYD0xH6+VSLGCC+7VbIT+SkjUjBSdA0eOo2XUfvfGmj1C1HgbcZi1wRzJH/5CrbBdQmtc/d+QyZ3Q2NkpBXM8uwIWwDLH0gTzDzkZvc9rG8k70GWUrd+EI6Cf3FFjExj9wazqCjs/+IQr2Ijc97NbsKXYW4pOhHAoGAKf5wYk+cn0cVTsyAom0UbGD5Uijqh5732MeqFYs2Rcwx0OErJZo68COSFFF40hJmmIKn7p3qycIyd1FcYlXN1l4s8mEWTGTInRE0OlBU0+jLtIV9pwNgffpbPYcrWZU6s6YVeJ2nDwl+aD+4QvN0rkPTfho9kjgeyF3PW0I2u4E="; - - private final String driverPrivateKeyId = "859e85fb3aa4d18b4afaac3e24e8f65700da5cc9"; - - private final String driverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmzL1BqSH+Zh9Fct5mXqe5sYOMTnJtOJhwKXnjjo2tNPXv4alzUHz8Vbj6nMar5u5IuKRZMeRBlhoRSFrLm+J1+sfvpH8N4wsnG7hDANknqWzdsk9a68qMHxNQF3hFzs9+KKrR1LAG8e9ytMfliN0kX+xls4uPZDPu1Q39K6V9KXrH/GrMA56i3TtWi7Hmakt5YTELeGjhx4nGrfuQLFFovs1Z9uJtf7E8R95+65StrOAmbJNf7VciEqwBpWYlU5VeyLXMg/oHwnTv2cjdcFozyDrlUHbDmtTiVeBBsYFVLyAsDGfl1p6eiVTiBBuo56YSYLWfaLgYvTyEcZ9jBQsfAgMBAAECggEAQzbTuObX3PT3+vtb5XKVMf33XY2rDJo2y1PbWzhxnO9vf3e22dIAW4qLnOmaIWFQeht1lr/FFCzRWk+Gzu+FJTemY8osrMLmFp9T9CQeXZ4nUXruAVxs5WQMW0Tp4W+CK3tlwmJrgJDzhYyV1Mf/HQ5Oa3kbbu/ZAY/3MCLrb/ClJQvD2rZSDdzAkNMQm8P2hsE71+rH7mI2hHrSCHl2OIp2A64QT8HjtyRc5yHZtTp6ZST1ge9SSIsT0ZfmXKtKF7yGEIPtKNU+oLrGyK5P30xBWJ/bwb3PEz2MZcPvz31+B2+UvZMm7OTkqfcRwEztAf8Ckiuo4im2BRYbVmd9OQKBgQDd0MeLxR+Qtv12bVA0bHtagFEq36THgWG7IM1/1vS4Cl9sveKSOS8A6oKLy624fGE7PKcuTTIzkVA81GXtWBQ9Coq/4TmllQkFTH7pz9C2PNHSCychPwNNV8qUx3lE3d4DOjGKgoVFD4l90AO7lOvmLTSc3pDpr+jSjUH4lqGrbQKBgQDAgXBmpXfCTxwqkBzGwxX+hwJen9qSkCM47qnQ1L4NnXPL6s0EN6rQ3FnFemGIzBUGJ2tajntkKlUu5DzsQeoBGu/SaSwgqD+1UQDcUyo+retmqZ+QYbpeyd3l53bLJJuJNsfak0X76Ft6hrm4julx6RGlmboQyx4kZWbhx4YNOwKBgEG9/2aNpi1eDwFqpLrk7CqGnYf3gP8gebbcoguhyiZB7MZuARkVmbjLyKVmWLa1JpxH/cTbXGWsS/u7d/pAgL8WwMjeGBfbdDD92x+xWEqq/AUlCRPxeSkTPBech3TBzWtndAd5Z8ZwNG/1lyWhnck63L0huhGI8Zh2BXeILaKBAoGAKK3xq69BvGztPc1QV2w4RJ4RER/kl14gI1LDzd52/veL1cabZk3BKfu2eLWg0MCXnMJNvEgpqQQNFiii+yX+phckIKma6pfDRrSEYwqr/azQ9tPXZTJRqOAtpPyhrNHikD9kQjsm6dGzKxQ3QNnqWOjwkrcGi6/wga5v7Dw2hqsCgYEA2T/kSNQ9dqpVBAkfi2J50hqnfFESPjKeirJJZllqhVqsiV0ly8a8Fz8SjGqTzrq+UErko+QmtSlo5h3Uq9Ln+0CwYfrUL+74q2zLHdS0DpY3QsGTEDJXTxCyy9kO26X2UsM3Ez3YUAkdMwdpVz0uVZtinv2735QZOBxoVQV2kQ8="; - - private final String consumerPrivateKeyId = "40acf82cbd5250de2f5123caff40738bdd403b08"; - - private final String consumerPrivateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDSwtbSBFgIXna6mWeKFWCK31NXUJH6uGduR1XrODGRedrqrTgr0BdNg8PDo6/zh/T+K0Svor6kgqpwnl9soOdn73oC4Nu+Ad7EiKa38j650jlZdLAr4hR0Ou9Kcnv45x/94auUO8jBz844cu24swLKiPsK9OnX65wVlKRfhhkGFuS/4OI76CmE7NqZDqPOW16o8tBO5TsgPVNkglFAU73fTp0kcHoLauT9QOB0+yZi39mnNXyU+2cL3Ylp5oaQCJpyssDRUqz/EiHa7FxUUgzCadG00+ePf5iYSnZKQRKWoOIawFvcCfcHx8GAl8Nn+79HtVQHB9hLsQ5+jqcdfKPfAgMBAAECggEAE9Ufz912xzrUY1TCKH1Ae3Dub732Lqihmv/9dsfv6ieUURcBvSW0u6eViVhi20DE7hH2QazH0cU18qkEg71UaTRgv9qW8vdMFiRhw9d4zZWZrfBMD6UTlahiEhhZ0B83pHVS5v0FNC+w0SEHe6Tks1hWfz5yrs3N/z3ghdihjC/5i1jeBoHXs1262SMazuwNGHblLApGPG+86taeFtbDI+31TKvZ8nomZHkEVFnARRUoBBcIwowRMqNfwlpcJhlz6kDWnoD08kHJ2zzJokozu7Lim+Ugt/MWwUOcA0hgq2QdymZFpkRkDl7tZmJtwTfTirjbGlpnPHVXEc1bWM7ocQKBgQD0LJ8e7JXf6bVFngq0jSJNKK7XDHYg0KhHXMApF59xxi29hdHXWPzgRJ45KkoUJc7MITpIJLXfCmi1XyDMf9m8lIf/oaqhJ7idYi7iAAPOJkdnHbSt0lebyjBWzCQ6OgS4NfF1+LEibTzRqiFs5K8EAyPYAVSTrpWoguoWtTzIGQKBgQDc9/I2PS+91Eb5RvuidTNsDqZJliTJQFlBjlDViFo3+l1N7jDFYwPBR/Tv4TVM5p9Zb+/Lo9X1pjDbm8QriTR4V+4HaLXkcCnmOsdSRInFUW4UIafwLX5ifjgfyaWgdKdn2UP1Lu/1qBN6GU1xjSfBQ6N3UqQiKkNPb7tuPJGqtwKBgQCQ4hU8vTclGMC14VQK1B/BVt1/vuYtDIJ9bZycBWdXlDc52LitpiDOVgjodJ5mHBT77M9vVVERWlTNIfgNP+OL0TptRZlAbJhP0p1s/oNDhFUj6211InVXfH54UkNAxYJdZ6yxynIYsma/JcsVmQ/8Ony/Q/LSempVBfEurjW1qQKBgQCQWPjFLdtOKqnildg0HFPnNvqx/38waPTluk5b76LgBpGFIyCBEVmWnacIPRpQjidyiYkggnp26oXoMC1KM2svYmGAPYr1G8CDQcqLl3JYkAVU6VeHsnBpbwLC4TttQkdJs8iNFohy9cUjcfwBPbDGs6TJghbuqqUl81uBe9e8qQKBgQDZm8T2KB34J7HAc5A+vqkmAo7mQLZg51OrzB1KnDU86pSAf0o3eSvfDUT6dpU9fRuZ1XYnbPnpoJwjFH3m4u9gqKF3PtVYfZyJrEqYwmhB9z6vd+dcsUlXM0fi37bGZkKBD0JGGt5OljM1qJG15x/LYfC/nwOmqWoOhNPCst2Z7w=="; - - private final String provider = "i-go-odrd-testing"; - private final static String key = "AIzaSyCG6PsfkaCEc94VK2vIAZk1YYKvOS_Ewts"; + static Logger logger = LoggerFactory.getLogger(FleetEngineUtil.class); + private final String SERVICE_ACCOUNT = "odrd-fleetengine-ondemandadmin@i-go-odrd-testing.iam.gserviceaccount.com"; + private final String DRIVER_ACCOUNT = "odrd-fleetengine-driversdkuser@i-go-odrd-testing.iam.gserviceaccount.com"; + private final String CONSUMER_ACCOUNT = "odrd-fleetengine-consumersdkus@i-go-odrd-testing.iam.gserviceaccount.com"; + private final String serverPrivateKeyId = "254e18eefa9fdcca64d5899cdcd793d466c47c7d"; + private final String serverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCfbNAWnukqLKIxItqmSABxsH5glySEHJ2gfL5KsRF0M02e0Z8/KNKZkoh7I6bOMt1fEtttFaWOeq70IdI2WAd5wVazL3upvl5FW4P08ly33LklfGyLljlJ7ChPny9x6OjAaiS0yD9fh7NWti7rZKU7gzcGL8HddNYXgXV5OajvoG3TGdu52WTxce9AUzU6gLPboz/RbGqrdrmgVJVb0EPlhTJf/NSsaiW4NoL8SEzf/pJGYBmqJs97mXwCHTY4avaC+CP/zz9yS8AQEJlApbVT6lSOhYoR0hNOBj5B886EZOssjubO6hQaiwRnGrV2RdpHynqA1iekfGpUGEtWTsqjAgMBAAECggEALyPbMd0iP8y71sCiG4nty7Au5ju62e+mMkbAc9CAwzXKTVxZdLEK+MsJ3TNxBsami47FYC+G6SbgpaJ8iIImD7v5+XjgXZRDRsnlLmAdx2YWPv3YELxGS1PvpX+B5XJDpGWeXfBaQNKc1lZ/cC4t53eIpSUo82UxSvkGNea1S8lR6vIByhNyCQOvLG4yqaxUy0hZi0kge37XrjYMGS+BivBBnDiVlBPLBVbrNBxOf31Lzz+XX0iwXX7Zl2jN759oe0xQyuIGWUSj8xBDIF8nNaJrla7rWVml3sZJh6/3r1Acj0mhZtE0ZMu5hiPGiIXgb1ng30j3dMP4yVPhXrpAtQKBgQDaU01VnHsnHxc0DQHE2vEOPGmPxVS0/JAssePAEUmKEueUogGef91YY+Vm/ItbhLwGjbytnXxe88zRAdB1u07efZ83ey93TrGl2CJUzLHIcgb+Q1tT642rqlfl+q8ep86hcZ+63pDiIPt2Z+HkbKIR0SWf5LIH4flquQOTQufXXQKBgQC674qDsjOJepZjMMN6PkVMcWBYDNmXHnqa5Oto0rZM745UulbXqEFGuBOsXPU7O33Kfz1vbtoluubKZi5B6cFNnPypE2SCfvdObHq4FuTuKPV6lN93SyhZchmSEXEs0PU4cGDRt+RRqQcjft1Wigiy4Y1y1SInCtcaP1hLejEJ/wKBgFAhvwKrGnBzctrB42JTUaJ9/eis7rg28tvUttjp/2nUIndlNt7r41vr3mj8TFHc1/43y4aVhO584THdTpvHkd0LkoKUjglmMsHCIGercZ02bOap5j1Y+XiGXxij995yjN6oi43U3qyAmosM+dYTITEU6JBVKhrGj/rhyTQlnF5pAoGBAKFGmo0mR/pbDbYD0xH6+VSLGCC+7VbIT+SkjUjBSdA0eOo2XUfvfGmj1C1HgbcZi1wRzJH/5CrbBdQmtc/d+QyZ3Q2NkpBXM8uwIWwDLH0gTzDzkZvc9rG8k70GWUrd+EI6Cf3FFjExj9wazqCjs/+IQr2Ijc97NbsKXYW4pOhHAoGAKf5wYk+cn0cVTsyAom0UbGD5Uijqh5732MeqFYs2Rcwx0OErJZo68COSFFF40hJmmIKn7p3qycIyd1FcYlXN1l4s8mEWTGTInRE0OlBU0+jLtIV9pwNgffpbPYcrWZU6s6YVeJ2nDwl+aD+4QvN0rkPTfho9kjgeyF3PW0I2u4E="; + private final String driverPrivateKeyId = "859e85fb3aa4d18b4afaac3e24e8f65700da5cc9"; + private final String driverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmzL1BqSH+Zh9Fct5mXqe5sYOMTnJtOJhwKXnjjo2tNPXv4alzUHz8Vbj6nMar5u5IuKRZMeRBlhoRSFrLm+J1+sfvpH8N4wsnG7hDANknqWzdsk9a68qMHxNQF3hFzs9+KKrR1LAG8e9ytMfliN0kX+xls4uPZDPu1Q39K6V9KXrH/GrMA56i3TtWi7Hmakt5YTELeGjhx4nGrfuQLFFovs1Z9uJtf7E8R95+65StrOAmbJNf7VciEqwBpWYlU5VeyLXMg/oHwnTv2cjdcFozyDrlUHbDmtTiVeBBsYFVLyAsDGfl1p6eiVTiBBuo56YSYLWfaLgYvTyEcZ9jBQsfAgMBAAECggEAQzbTuObX3PT3+vtb5XKVMf33XY2rDJo2y1PbWzhxnO9vf3e22dIAW4qLnOmaIWFQeht1lr/FFCzRWk+Gzu+FJTemY8osrMLmFp9T9CQeXZ4nUXruAVxs5WQMW0Tp4W+CK3tlwmJrgJDzhYyV1Mf/HQ5Oa3kbbu/ZAY/3MCLrb/ClJQvD2rZSDdzAkNMQm8P2hsE71+rH7mI2hHrSCHl2OIp2A64QT8HjtyRc5yHZtTp6ZST1ge9SSIsT0ZfmXKtKF7yGEIPtKNU+oLrGyK5P30xBWJ/bwb3PEz2MZcPvz31+B2+UvZMm7OTkqfcRwEztAf8Ckiuo4im2BRYbVmd9OQKBgQDd0MeLxR+Qtv12bVA0bHtagFEq36THgWG7IM1/1vS4Cl9sveKSOS8A6oKLy624fGE7PKcuTTIzkVA81GXtWBQ9Coq/4TmllQkFTH7pz9C2PNHSCychPwNNV8qUx3lE3d4DOjGKgoVFD4l90AO7lOvmLTSc3pDpr+jSjUH4lqGrbQKBgQDAgXBmpXfCTxwqkBzGwxX+hwJen9qSkCM47qnQ1L4NnXPL6s0EN6rQ3FnFemGIzBUGJ2tajntkKlUu5DzsQeoBGu/SaSwgqD+1UQDcUyo+retmqZ+QYbpeyd3l53bLJJuJNsfak0X76Ft6hrm4julx6RGlmboQyx4kZWbhx4YNOwKBgEG9/2aNpi1eDwFqpLrk7CqGnYf3gP8gebbcoguhyiZB7MZuARkVmbjLyKVmWLa1JpxH/cTbXGWsS/u7d/pAgL8WwMjeGBfbdDD92x+xWEqq/AUlCRPxeSkTPBech3TBzWtndAd5Z8ZwNG/1lyWhnck63L0huhGI8Zh2BXeILaKBAoGAKK3xq69BvGztPc1QV2w4RJ4RER/kl14gI1LDzd52/veL1cabZk3BKfu2eLWg0MCXnMJNvEgpqQQNFiii+yX+phckIKma6pfDRrSEYwqr/azQ9tPXZTJRqOAtpPyhrNHikD9kQjsm6dGzKxQ3QNnqWOjwkrcGi6/wga5v7Dw2hqsCgYEA2T/kSNQ9dqpVBAkfi2J50hqnfFESPjKeirJJZllqhVqsiV0ly8a8Fz8SjGqTzrq+UErko+QmtSlo5h3Uq9Ln+0CwYfrUL+74q2zLHdS0DpY3QsGTEDJXTxCyy9kO26X2UsM3Ez3YUAkdMwdpVz0uVZtinv2735QZOBxoVQV2kQ8="; + private final String consumerPrivateKeyId = "40acf82cbd5250de2f5123caff40738bdd403b08"; + private final String consumerPrivateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDSwtbSBFgIXna6mWeKFWCK31NXUJH6uGduR1XrODGRedrqrTgr0BdNg8PDo6/zh/T+K0Svor6kgqpwnl9soOdn73oC4Nu+Ad7EiKa38j650jlZdLAr4hR0Ou9Kcnv45x/94auUO8jBz844cu24swLKiPsK9OnX65wVlKRfhhkGFuS/4OI76CmE7NqZDqPOW16o8tBO5TsgPVNkglFAU73fTp0kcHoLauT9QOB0+yZi39mnNXyU+2cL3Ylp5oaQCJpyssDRUqz/EiHa7FxUUgzCadG00+ePf5iYSnZKQRKWoOIawFvcCfcHx8GAl8Nn+79HtVQHB9hLsQ5+jqcdfKPfAgMBAAECggEAE9Ufz912xzrUY1TCKH1Ae3Dub732Lqihmv/9dsfv6ieUURcBvSW0u6eViVhi20DE7hH2QazH0cU18qkEg71UaTRgv9qW8vdMFiRhw9d4zZWZrfBMD6UTlahiEhhZ0B83pHVS5v0FNC+w0SEHe6Tks1hWfz5yrs3N/z3ghdihjC/5i1jeBoHXs1262SMazuwNGHblLApGPG+86taeFtbDI+31TKvZ8nomZHkEVFnARRUoBBcIwowRMqNfwlpcJhlz6kDWnoD08kHJ2zzJokozu7Lim+Ugt/MWwUOcA0hgq2QdymZFpkRkDl7tZmJtwTfTirjbGlpnPHVXEc1bWM7ocQKBgQD0LJ8e7JXf6bVFngq0jSJNKK7XDHYg0KhHXMApF59xxi29hdHXWPzgRJ45KkoUJc7MITpIJLXfCmi1XyDMf9m8lIf/oaqhJ7idYi7iAAPOJkdnHbSt0lebyjBWzCQ6OgS4NfF1+LEibTzRqiFs5K8EAyPYAVSTrpWoguoWtTzIGQKBgQDc9/I2PS+91Eb5RvuidTNsDqZJliTJQFlBjlDViFo3+l1N7jDFYwPBR/Tv4TVM5p9Zb+/Lo9X1pjDbm8QriTR4V+4HaLXkcCnmOsdSRInFUW4UIafwLX5ifjgfyaWgdKdn2UP1Lu/1qBN6GU1xjSfBQ6N3UqQiKkNPb7tuPJGqtwKBgQCQ4hU8vTclGMC14VQK1B/BVt1/vuYtDIJ9bZycBWdXlDc52LitpiDOVgjodJ5mHBT77M9vVVERWlTNIfgNP+OL0TptRZlAbJhP0p1s/oNDhFUj6211InVXfH54UkNAxYJdZ6yxynIYsma/JcsVmQ/8Ony/Q/LSempVBfEurjW1qQKBgQCQWPjFLdtOKqnildg0HFPnNvqx/38waPTluk5b76LgBpGFIyCBEVmWnacIPRpQjidyiYkggnp26oXoMC1KM2svYmGAPYr1G8CDQcqLl3JYkAVU6VeHsnBpbwLC4TttQkdJs8iNFohy9cUjcfwBPbDGs6TJghbuqqUl81uBe9e8qQKBgQDZm8T2KB34J7HAc5A+vqkmAo7mQLZg51OrzB1KnDU86pSAf0o3eSvfDUT6dpU9fRuZ1XYnbPnpoJwjFH3m4u9gqKF3PtVYfZyJrEqYwmhB9z6vd+dcsUlXM0fi37bGZkKBD0JGGt5OljM1qJG15x/LYfC/nwOmqWoOhNPCst2Z7w=="; + private final String provider = "i-go-odrd-testing"; // private final String SERVICE_ACCOUNT = "odrd-fleetengine-ondemandadmin@i-go-gcp.iam.gserviceaccount.com"; // @@ -75,7 +67,6 @@ // private final String consumerPrivateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCeBruAMii4e7LrGNwSWMbeztzjJV9lUS9CIhWi142G/Ed9b58oa1CAM3ym794PRqtHRvdzLSWRKf3SFJjzYl7CMmkpTgsQoV8tCp/G/vITZcrD9BxYfocysnSDy9d/nleomC1PeUV6coZpGPIjwuxkXyQbH1CnTyGK5RAU2siCw4plLMz6WQyXXyCZOdCijsvSPgytDWveO8DGPIBO1VlHHIJIfrfgVCYgpaXd63GSPQEJ81GYfy5VtnuLHpc3kowq5blLqMFUU6eAzA20Jg3mCovv2idSNN6R5K1kNT3Eu5fsQWuthDqK0H2IeNulb8cCPnri62AH03kxl6xFwC6pAgMBAAECggEAETkH88TZDfeNXHTCfM1oKfMUZ+fe1HAGB93Ryy8ATGyabgqy/KNq4U4QkTEmBowxMVIuuJgnDAHY7q3dWElUV93z+tMiqZas2iqE7MSZ0DtmifdvpMVwKWUBsIuQL7yA2UMcom4ZKxXoSElhD+diqYh6VZUSzpP1QpS3LU6wTm/4IzN+kjfn7sAENk9+ff04VZjBC4yPANWO6gXmNZlGvFvbp6ChBb9PnPlB6dUUiLCGkb/B0jagfqP7ARrDArMcRpJZyYbPDEfxEqqADV28N4k2qOYUZYVmXBXf+Zip7G+rikXmgxn/G1nHLJgUAmc42TUos8P0YsZiVyboQYtU8QKBgQDRcLK70zIZOhMRmr9gTC2khSBA37ZVVtCiJb6G4TtFfH7KLdn8r8aNLauH90WCzQvk2m/KKFlt/q2UJyFatJx5LB4mYKAS7BPfoHYqsoqDMuMXtNpe6PO5/rx8h90pl60gouG2iw1QcOq5NKNVr2INYkItJhc8u99Lhw675hVVOwKBgQDBKA2e1KERO3cOn7muaJjWubMJ6mK0XtOLmTL8maILwJVO2H6rMOxoYum3txZjc+oTdFcyfv5TJZrihm3F2XoZ6Xe1F0OhiX97OgA/uDygQSDsiFdhJ90svbpGxDxtQtamhuu+8Wp1TpNu8ORdG+3gmsCkxivrPTs/MnJnfiu9awKBgGJ1QYDsyvtzAq3e+qKxjS9vafc1dAjwVAo2BjhwP6Xt3cj7/yM8GvIZiy7S/rl73WCLk8wMZeZAuKcSMirrBzgrlkziVb4vfzQ8wfBWmKkOzhVB7vp5NsK0TzWXxU+dP0U9bTCcc/jh7GZ+qV5JoaW7EHMbGgdyJoniBvosMtErAoGAKVRvraejmzNVI0zsBzScV32+oIWFf0C3FSy/qysYcFlR2WAbonfCbgeUKNpFMRyRXn5LViO0OYhXXtcSz/3b0YWSNq52qy7nly9u9DNwzX2CFPqLb99+xN8H57J/l4VwtosyEFZJyDX6+AcVZhLe0GtsgxVgOmKMtdYOgrSNmWcCgYBu3KiRwYPfQgyEYOwfQBOjoMmPUB8H/vtvFLRlHXxZF7hPAyKs4e9dQRW7vb61epVgMVz5t4E4pKHqxpZu+j7Tby+Z5fAgSPiniZUyVH9AYGCTyAYZogr5r21vhpcAZJ0P8hoE5R2jhnzu/mhr6CkWz8nCHsZ7+KBjcVILUYIS9g=="; // // private final String provider = "i-go-gcp"; - @Autowired private RedisUtil redisUtil; @@ -449,7 +440,7 @@ * @param end_lng 终点经度 * @return */ - public boolean createTrip(String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) { + public JSONObject createTrip(String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) { String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips?tripId=" + tripId; HttpRequest post = HttpUtil.createPost(url); Map<String, String> headers = new HashMap<>(); @@ -478,7 +469,7 @@ end_point.put("longitude", end_lng); dropoffPoint.put("point", end_point); body.put("dropoffPoint", dropoffPoint); - logger.info("创建行程请求:{} {}", tripId, body.toJSONString()); + logger.info("创建行程请求:{} {}", tripId, body.toJSONString()); HttpRequest request = post.body(body.toJSONString()); HttpResponse response = request.execute(); logger.info("创建行程结果:{}", response.body()); @@ -499,7 +490,6 @@ } } logger.error("创建行程异常: tripId={} body={}", tripId, response.body()); - return false; } /** * 返回结果 @@ -616,7 +606,7 @@ * "currentRouteSegmentTrafficVersion": "2024-05-27T02:05:37.941167Z" * } */ - return true; + return jsonObject; } @@ -632,7 +622,7 @@ * @param end_lng 终点经度 * @return */ - public boolean updateTrip(String tripStatus, String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) { + public boolean updateTrip(String tripStatus, String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng, Integer orderId, Integer orderType) { String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips/" + tripId + "?updateMask="; List<String> sb = new ArrayList<>(); if(StringUtils.hasLength(vehicleId)){ @@ -698,7 +688,7 @@ dropoffPoint.put("point", end_point); body.put("dropoffPoint", dropoffPoint); } - logger.info("修改行程请求:{} {}", tripId, body.toJSONString()); + logger.info("修改行程请求:{} {}", tripId, body.toJSONString()); HttpRequest request = put.body(body.toJSONString()); HttpResponse response = request.execute(); logger.info("修改行程结果:{}", response.body()); @@ -710,13 +700,16 @@ String status = error.getString("status"); if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ redisUtil.remove("google_token"); - return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng); + return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng, orderId, orderType); } String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); if(reason.equals("ACCESS_TOKEN_EXPIRED")){ redisUtil.remove("google_token"); - return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng); + return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng, orderId, orderType); } + } + if(code == 404){ + return true; } logger.error("修改行程异常: tripId={} body={}", tripId, response.body()); return false; @@ -857,6 +850,7 @@ headers.put("Content-Type", "application/json"); get.addHeaders(headers); + logger.info("查询行程请求:{} {}", tripId, url); HttpResponse response = get.execute(); logger.info("查询行程结果:{}", response.body()); JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type")); @@ -965,12 +959,147 @@ /** + * 批量获取行程 + * @param vehicleId + * @param pageSize + * @param pageToken + * @return + */ + public String getTrips(String vehicleId, Integer pageSize, String pageToken) { + String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips:search"; + HttpRequest post = HttpUtil.createPost(url); + Map<String, String> headers = new HashMap<>(); + headers.put("Authorization", "Bearer " + getToken()); + headers.put("Content-Type", "application/json"); + post.addHeaders(headers); + JSONObject body = new JSONObject(); + if(StringUtils.hasLength(vehicleId)){ + body.put("vehicleId", vehicleId); + } + body.put("activeTripsOnly", false); + if(null != pageSize){ + body.put("pageSize", pageSize); + } + if(null != pageToken){ + body.put("pageToken", pageToken); + } + logger.info("查询行程请求:{}", body); + post.body(body.toJSONString()); + HttpResponse response = post.execute(); + logger.info("查询行程结果:{}", response.body()); + JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type")); + JSONObject error = jsonObject.getJSONObject("error"); + if(null != error){ + Integer code = error.getInteger("code"); + if(code == 404){ + return null; + } + if(code == 401){ + String status = error.getString("status"); + if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ + redisUtil.remove("google_token"); + return getTrips(vehicleId, pageSize, pageToken); + } + String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); + if(reason.equals("ACCESS_TOKEN_EXPIRED")){ + redisUtil.remove("google_token"); + return getTrips(vehicleId, pageSize, pageToken); + } + } + logger.error("获取行程异常:body={}", response.body()); + return null; + } + /** + * 返回结果 + * { + * "name": "providers/i-go-odrd-testing/trips/I-GO-RIDE1", + * "vehicleId": "I-GO-CAR1", + * "tripStatus": "ENROUTE_TO_PICKUP", + * "tripType": "SHARED", + * "pickupPoint": { + * "point": { + * "latitude": 30.604131, + * "longitude": 104.151957 + * }* }, + * "pickupTime": "2024-05-27T02:10:39.763347Z", + * "dropoffPoint": { + * "point": { + * "latitude": 30.636319, + * "longitude": 104.129219 + * } + * }, + * "dropoffTime": "2024-05-27T02:23:37.762549Z", + * "numberOfPassengers": 1, + * "remainingDistanceMeters": 0, + * "etaToFirstWaypoint": "2024-05-27T02:10:39.763347Z", + * "remainingWaypoints": [ + * { + * "location": { + * "point": { + * "latitude": 30.604131, + * "longitude": 104.151957 + * } + * }, + * "tripId": "I-GO-RIDE1", + * "waypointType": "PICKUP_WAYPOINT_TYPE", + * "distanceMeters": 0, + * "eta": "2024-05-27T02:10:39.763347Z", + * "duration": "0s" + * }, + * { + * "location": { + * "point": { + * "latitude": 30.636319, + * "longitude": 104.129219 + * } + * }, + * "tripId": "I-GO-RIDE1", + * "waypointType": "DROP_OFF_WAYPOINT_TYPE", + * "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA==", + * "distanceMeters": 8260, + * "eta": "2024-05-27T02:23:37.762549Z", + * "duration": "777.999202s", + * "trafficToWaypoint": { + * "speedReadingInterval": [ + * { + * "endPolylinePointIndex": 284, + * "speed": "NORMAL" + * } + * ], + * "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA==" + * } + * } + * ], + * "currentRouteSegmentVersion": "2024-05-27T02:10:39.773373Z", + * "remainingWaypointsVersion": "2024-05-27T02:05:37.941167Z", + * "currentRouteSegmentEndPoint": { + * "location": { + * "point": { + * "latitude": 30.604131, + * "longitude": 104.151957 + * } + * }, + * "tripId": "I-GO-RIDE1", + * "waypointType": "PICKUP_WAYPOINT_TYPE" + * }, + * "remainingWaypointsRouteVersion": "2024-05-27T02:10:39.773373Z", + * "currentRouteSegmentTrafficVersion": "2024-05-27T02:10:39.773373Z", + * "view": "SDK" + * } + */ + + return response.body(); + } + + + + /** * 上报google可结算订单 * @param tripId 行程id * @return */ public boolean reportBillableEvent(String tripId) { - log.info("上报行程:{}", tripId); + log.info("行程上报:{}", tripId); String billableEventId = UUIDUtil.getRandomCode(); String url = "https://mobilitybilling.googleapis.com/v1:reportBillableEvent?regionCode=GH&key=" + key + "&billableEventId=" + billableEventId; HttpRequest post = HttpUtil.createPost(url); diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java index 08a3b43..3760f4e 100644 --- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java @@ -1,21 +1,11 @@ package com.stylefeng.guns.modular.system.util; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.stylefeng.guns.core.util.ToolUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; -import java.util.HashMap; -import java.util.Map; +import java.util.concurrent.TimeUnit; /** @@ -23,30 +13,24 @@ */ @Component public class RedisUtil { - - - + + @Autowired + private RedisTemplate redisTemplate; + + + /** * 向redis中存储字符串没有过期时间 * @param key * @param value */ public void setStrValue(String key, String value){ - if(ToolUtil.isNotEmpty(key)){ - //将请求头部和参数合成一个请求 - Map<String,String> map = new HashMap<>(); - map.put("key", key); - map.put("value", value); - String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/setValue_", map); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } + if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){ + redisTemplate.opsForValue().set(key, value); } - } - - + + /** * 以分钟为单位设置存储值(设置过期时间) * @param key @@ -54,20 +38,12 @@ * @param time 秒 */ public void setStrValue(String key, String value, int time){ - if(ToolUtil.isNotEmpty(key)){ - Map<String,String> map = new HashMap<>(); - map.put("key", key); - map.put("value", value); - map.put("time", String.valueOf(time)); - String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/setValue", map); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } + if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){ + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); } } - - + + /** * 从redis中获取值 * @param key @@ -75,55 +51,22 @@ */ public String getValue(String key){ if(ToolUtil.isNotEmpty(key)){ - Map<String,String> map = new HashMap<>(); - map.put("key", key); - String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/getValue", map); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } - return jsonObject.getString("data"); + String data = (String) redisTemplate.opsForValue().get(key); + return data; } return null; } - - - - /** - * 从redis中获取值 - * @param key - * @return - */ - public String getValues(String key){ - if(ToolUtil.isNotEmpty(key)){ - Map<String,String> map = new HashMap<>(); - map.put("keys", key); - String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/getValues", map); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } - return jsonObject.getString("data"); - } - return null; - } - - + + + + /** * 删除key * @param key */ - public String remove(String key){ + public void remove(String key){ if(ToolUtil.isNotEmpty(key)){ - Map<String,String> map = new HashMap<>(); - map.put("key", key); - String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/remove", map); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } - return jsonObject.getString("data"); + redisTemplate.delete(key); } - return null; } } diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java new file mode 100644 index 0000000..97857c2 --- /dev/null +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java @@ -0,0 +1,60 @@ +package com.stylefeng.guns.modular.system.util; + +import com.google.cloud.texttospeech.v1.*; +import com.google.protobuf.ByteString; + +import java.io.FileOutputStream; +import java.io.OutputStream; + +/** + * Google语音合成工具 + * @author zhibing.pu + * @Date 2024/7/11 9:09 + */ +public class TextToSpeechUtil { + + + /** + * 合成音频文件 + * @param languageCode 语言编号 + * @param text 合成文本 + * @param fileName 音频文件名称 + * @throws Exception + */ + public static String create(String languageCode, String text, String fileName) throws Exception { + // Instantiates a client + try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) { + // Set the text input to be synthesized + SynthesisInput input = SynthesisInput.newBuilder().setText(text).build(); + + // Build the voice request, select the language code ("en-US") and the ssml voice gender + // ("neutral") + VoiceSelectionParams voice = + VoiceSelectionParams.newBuilder() + .setLanguageCode(languageCode) + .setSsmlGender(SsmlVoiceGender.MALE) + .build(); + + // Select the type of audio file you want returned + AudioConfig audioConfig = + AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build(); + + // Perform the text-to-speech request on the text input with the selected voice parameters and + // audio file type + SynthesizeSpeechResponse response = + textToSpeechClient.synthesizeSpeech(input, voice, audioConfig); + + // Get the audio contents from the response + ByteString audioContents = response.getAudioContent(); + + // Write the response to the output file. + try (OutputStream out = new FileOutputStream("/home/igotechgh/nginx/html/files/audio/" + fileName)) { + out.write(audioContents.toByteArray()); + return "https://igo.i-go.group/files/audio/" + fileName; + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } + } +} diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java new file mode 100644 index 0000000..258b883 --- /dev/null +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java @@ -0,0 +1,231 @@ +package com.stylefeng.guns.modular.system.util.quartz; + +import com.stylefeng.guns.modular.system.util.quartz.model.QuartzEnum; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * quartz任务调度工具类 + * @author zhibing.pu + * @Date 2024/3/20 11:12 + */ +@Slf4j +@Component +public class QuartzUtil { + + @Autowired + private Scheduler scheduler; + + /** + * 构建Trigger执行器 + * @param startTime 任务开始执行时间,为空则立即执行 + * @param intervalInMilliseconds 执行间隔毫秒数 + * @param repeatCount 重读执行次数,-1表示永远执行 + * @return + */ + private static Trigger getSimpleTrigger(String job_name, String group_name, Date startTime, long intervalInMilliseconds, int repeatCount){ + if(null == job_name || "".equals(job_name)){ + job_name = QuartzEnum.JOB_NAME.getValue(); + } + if(null == group_name || "".equals(group_name)){ + group_name = QuartzEnum.DEFAULT_GROUP.getValue(); + } + TriggerBuilder<Trigger> triggerTriggerBuilder = TriggerBuilder.newTrigger(); + if(null == startTime){ + triggerTriggerBuilder.startNow(); + }else{ + triggerTriggerBuilder.startAt(startTime); + } + + SimpleTrigger trigger = triggerTriggerBuilder + .withIdentity(job_name, group_name) + .withSchedule( + SimpleScheduleBuilder + .simpleSchedule() + .withIntervalInMilliseconds(intervalInMilliseconds) + .withRepeatCount(repeatCount) + ).build(); + return trigger; + } + + /** + * 构建cronExpression表达式执行器 + * @param cron cron表达式 + * @return + */ + private static Trigger getCronTrigger(String job_name, String group_name, String cron) { + if(null == job_name || "".equals(job_name)){ + job_name = QuartzEnum.JOB_NAME.getValue(); + } + if(null == group_name || "".equals(group_name)){ + group_name = QuartzEnum.DEFAULT_GROUP.getValue(); + } + CronTrigger trigger = TriggerBuilder.newTrigger() + .startNow() + .withIdentity(job_name, group_name) + .withSchedule( + CronScheduleBuilder.cronSchedule(cron) + ).build(); + return trigger; + } + + /** + * 添加普通定时任务 + * @param startTime 任务开始执行时间,为空则立即执行 + * @param intervalInMilliseconds 执行间隔毫秒数 + * @param repeatCount 重复执行次数,-1表示永远执行 + * @throws SchedulerException + */ + public void addSimpleQuartzTask(Class<? extends Job> clazz, String job_name, String group_name, JobDataMap jobDataMap, Date startTime, long intervalInMilliseconds, int repeatCount) throws SchedulerException { + JobKey jobKey = JobKey.jobKey(job_name, group_name); + if(scheduler.checkExists(jobKey)){ + log.error("[添加定时任务]已存在该作业,jobkey为:{}", jobKey); + return; + } + // 构建 Job + JobDetail job = JobBuilder.newJob(clazz) + .setJobData(jobDataMap) + .withIdentity(jobKey).build(); + // 构建 Trigger + Trigger trigger = getSimpleTrigger(job_name, group_name, startTime, intervalInMilliseconds, repeatCount); + // 启动调度器 + scheduler.scheduleJob(job, trigger); + scheduler.start(); + } + + /** + * 添加Cron表达式的定时任务 + * @param cron cron表达式 + * @throws SchedulerException + */ + public void addCronQuartzTask(Class<? extends Job> clazz, String job_name, String group_name, JobDataMap jobDataMap, String cron) throws SchedulerException { + JobKey jobKey = JobKey.jobKey(job_name, group_name); + if(scheduler.checkExists(jobKey)){ + log.error("[添加定时任务]已存在该作业,jobkey为:{}", jobKey); + return; + } + // 构建 Job + JobDetail job = JobBuilder.newJob(clazz) + .setJobData(jobDataMap) + .withIdentity(jobKey).build(); + // 构建 Trigger + Trigger trigger = getCronTrigger(job_name, group_name, cron); + // 启动调度器 + scheduler.scheduleJob(job, trigger); + scheduler.start(); + } + + /** + * 删除任务 + * @param name 任务名称 + * @param group 任务分组 + * @return + */ + public boolean deleteQuartzTask(String name, String group){ + JobKey jobKey = new JobKey(name, group); + boolean b = false; + try { + b = scheduler.deleteJob(jobKey); + } catch (SchedulerException e) { + throw new RuntimeException(e); + } + return b; + } + + /** + * 删除任务 + * @param jobKey + * @return + */ + public boolean deleteQuartzTask(JobKey jobKey){ + boolean b = false; + try { + b = scheduler.deleteJob(jobKey); + } catch (SchedulerException e) { + throw new RuntimeException(e); + } + return b; + } + + /** + * 删除分组下的所有定时任务 + * @param group 分组名称 + * @return + */ + public boolean deleteGroupQuartzTask(String group){ + try { + GroupMatcher<JobKey> groupMatcher = GroupMatcher.groupEquals(group); + Set<JobKey> jobKeys = scheduler.getJobKeys(groupMatcher); + boolean b = scheduler.deleteJobs(jobKeys.stream().collect(Collectors.toList())); + if(!b){ + return false; + } + }catch (Exception e){ + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 清空所有定时任务 + * @return + */ + public boolean deleteAllQuartzTask(){ + try { + List<String> jobGroupNames = scheduler.getJobGroupNames(); + for (String jobGroupName : jobGroupNames) { + GroupMatcher<JobKey> groupMatcher = GroupMatcher.groupEquals(jobGroupName); + Set<JobKey> jobKeys = scheduler.getJobKeys(groupMatcher); + boolean b = scheduler.deleteJobs(jobKeys.stream().collect(Collectors.toList())); + if(!b){ + return false; + } + } + }catch (Exception e){ + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 构建任务描述JobDetail对象 + * @return + */ + private JobDetail getJobDetail(Job job, String job_name, String group_name){ + if(null == job_name || "".equals(job_name)){ + job_name = QuartzEnum.JOB_NAME.getValue(); + } + if(null == group_name || "".equals(group_name)){ + group_name = QuartzEnum.DEFAULT_GROUP.getValue(); + } + return getJobDetail(job, job_name, group_name, null); + } + + /** + * 构建任务描述JobDetail对象 + * @param job 任务类 + * @param job_name 任务名称 + * @param group_name 任务分组名称 + * @param jobDataMap 自定义参数 + * @return + */ + private JobDetail getJobDetail(Job job, String job_name, String group_name, JobDataMap jobDataMap){ + JobDetail jobDetail = JobBuilder.newJob(job.getClass()) + .withIdentity(job_name, group_name) + .setJobData(jobDataMap) + .build(); + return jobDetail; + } + + +} diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java new file mode 100644 index 0000000..1905e9d --- /dev/null +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java @@ -0,0 +1,239 @@ +package com.stylefeng.guns.modular.system.util.quartz.jobs; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.stylefeng.guns.core.util.ToolUtil; +import com.stylefeng.guns.modular.system.controller.util.PushUtil; +import com.stylefeng.guns.modular.system.dao.TUserMapper; +import com.stylefeng.guns.modular.system.model.TDriver; +import com.stylefeng.guns.modular.system.model.TOrderLogistics; +import com.stylefeng.guns.modular.system.model.TOrderPrivateCar; +import com.stylefeng.guns.modular.system.model.TUser; +import com.stylefeng.guns.modular.system.service.ITDriverService; +import com.stylefeng.guns.modular.system.service.ITOrderLogisticsService; +import com.stylefeng.guns.modular.system.service.ITOrderPrivateCarService; +import com.stylefeng.guns.modular.system.util.HttpRequestUtil; +import com.stylefeng.guns.modular.system.util.PushURL; +import com.stylefeng.guns.modular.system.util.TextToSpeechUtil; +import com.stylefeng.guns.modular.system.util.quartz.QuartzUtil; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.text.SimpleDateFormat; +import java.util.*; + + +/** + * 订单司机超时提醒任务 + * @author zhibing.pu + * @Date 2024/4/18 15:19 + */ +@Slf4j +@Component +public class OrderTimeOutJob implements Job { + + @Resource + private PushUtil pushUtil; + @Resource + private ITOrderPrivateCarService orderPrivateCarService; + @Resource + private ITOrderLogisticsService orderLogisticsService; + @Resource + private ITDriverService driverService; + @Resource + private TUserMapper userInfoMapper; + + @Resource + private QuartzUtil quartzUtil; + + + /** + * 执行的业务逻辑 + * @param jobExecutionContext 定时任务上下文对象 + */ + public void run(JobExecutionContext jobExecutionContext) { + JobDetail jobDetail = jobExecutionContext.getJobDetail(); + JobDataMap jobDataMap = jobDetail.getJobDataMap(); + String name = jobDetail.getKey().getName(); + log.info("执行{}定时任务逻辑 JobDataMap:{}", name, JSON.toJSONString(jobDataMap)); + Integer timeOutType = jobDataMap.getIntValue("timeOutType"); + Integer driverId = jobDataMap.getIntValue("driverId"); + Integer orderId = jobDataMap.getIntValue("orderId"); + Integer orderType = jobDataMap.getIntValue("orderType"); + Integer driverTimeout = jobDataMap.getIntValue("driverTimeout"); + long timeOut = jobDataMap.getLongValue("timeOut"); + String describe = jobDataMap.getString("describe"); + TDriver driver = driverService.selectById(driverId); + Integer language = driver.getLanguage(); + if(1 == timeOutType){ + if(orderType == 1){ + describe = language == 1 ? "您已超时" + driverTimeout + "分钟,\n用户可免费取消订单" : language == 2 ? "You are overdue for " + driverTimeout + " minutes,\nThe subscriber could cancel the order for free" : "Vous êtes en retard de " + driverTimeout + " minutes,\nL'abonné peut annuler la commande gratuitement"; + } + if(orderType == 4){ + describe = language == 1 ? "您已超时" + driverTimeout + "分钟,\n用户可免费取消订单" : language == 2 ? "You are overdue for " + driverTimeout + " minutes,\nThe subscriber could cancel the order for free" : "Vous êtes en retard de " + driverTimeout + " minutes,\nL'abonné peut annuler la commande gratuitement"; + } + } + if(2 == timeOutType){ + if(orderType == 1){ + TOrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); + TUser userInfo = userInfoMapper.selectById(orderPrivateCar.getUserId()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); + 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."; + } + if(orderType == 4){ + } + } + if(3 == timeOutType){ + Integer m = Double.valueOf((System.currentTimeMillis() - timeOut) / 60000).intValue(); + if(orderType == 1){ + if(0 == m){ + describe = language == 1 ? "您的打车订单已超时,请抓紧!" : language == 2 ? "Your ride order is overdue, please go faster." : "Votre commande de course est en retard, veuillez aller plus vite."; + }else{ + 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."; + } + } + if(orderType == 4){ + if(0 == m){ + describe = language == 1 ? "您的包裹订单已超时,请抓紧!" : language == 2 ? "Your delivery order is overdue, please go faster." : "Votre commande de Delivery est en retard, veuillez aller plus vite."; + }else{ + describe = language == 1 ? "您的包裹订单已超时" + m + "分钟,请抓紧!" : language == 2 ? "Your delivery order is overdue for " + m + " minute(s), please go faster." : "Votre commande de livraison est en retard depuis " + m + " minute(s), veuillez aller plus vite."; + } + } + } + + + if(1 == orderType){ + //结束预约单出发循环提醒定时 + TOrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); + List<Integer> list = Arrays.asList(4, 5, 6, 7, 8, 9, 10, 11, 12); + if(1 == timeOutType && list.contains(orderPrivateCar.getState())){ + JobKey key = jobExecutionContext.getJobDetail().getKey(); + boolean b = quartzUtil.deleteQuartzTask(key); + if(!b){ + log.error("定时任务关闭失败:" + key.toString()); + } + return; + } + if(2 == timeOutType && (System.currentTimeMillis() >= timeOut || list.contains(orderPrivateCar.getState()))){ + JobKey key = jobExecutionContext.getJobDetail().getKey(); + boolean b = quartzUtil.deleteQuartzTask(key); + if(!b){ + log.error("定时任务关闭失败:" + key.toString()); + } + return; + } + + //结束超时循环提醒定时 + if(3 == timeOutType && list.contains(orderPrivateCar.getState())){ + JobKey key = jobExecutionContext.getJobDetail().getKey(); + boolean b = quartzUtil.deleteQuartzTask(key); + if(!b){ + log.error("定时任务关闭失败:" + key.toString()); + } + return; + } + + + } + if(4 == orderType){ + TOrderLogistics orderLogistics = orderLogisticsService.selectById(orderId); + List<Integer> list = Arrays.asList(4, 5, 6, 7, 8, 9, 10, 11, 12, 13); + if(1 == timeOutType && list.contains(orderLogistics.getState())){ + JobKey key = jobExecutionContext.getJobDetail().getKey(); + boolean b = quartzUtil.deleteQuartzTask(key); + if(!b){ + log.error("定时任务关闭失败:" + key.toString()); + } + return; + } + //结束超时循环提醒定时 + if(3 == timeOutType && list.contains(orderLogistics.getState())){ + JobKey key = jobExecutionContext.getJobDetail().getKey(); + boolean b = quartzUtil.deleteQuartzTask(key); + if(!b){ + log.error("定时任务关闭失败:" + key.toString()); + } + return; + } + } + + String fileName = "orderTimeOut" + driverId + "_" + timeOutType + ".mp3"; + String audioUrl = null; + try { + audioUrl = TextToSpeechUtil.create(language == 1 ? "cmn-CN" : language == 2 ? "en-US" : "fr-FR", describe, fileName); + } catch (Exception e) { + e.printStackTrace(); + } + + //定时任务删除语音文件 + 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); + + log.info("开始推送提醒-{}:orderId={};orderType={};timeOutType={};describe={};audioUrl={}", System.currentTimeMillis(), orderId, orderType, timeOutType, describe, audioUrl); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", 200); + jsonObject.put("msg", "SUCCESS"); + jsonObject.put("method", "ORDER_TIME_OUT"); + Map<String, Object> map = new HashMap<>(); + map.put("timeOutType", timeOutType); + map.put("orderId", orderId); + map.put("orderType", orderType); + map.put("describe", describe); + map.put("audioUrl", audioUrl); + jsonObject.put("data", map); + + //调用推送 + HttpHeaders headers = new HttpHeaders(); + // 以表单的方式提交 + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + //将请求头部和参数合成一个请求 + Map<String, String> params = new HashMap<>(); + params.put("msg", jsonObject.toJSONString()); + params.put("id", String.valueOf(driverId)); + params.put("type", String.valueOf(2)); + String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/netty/sendMsgToClient", params); + JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); + if(jsonObject1.getIntValue("code") != 200){ + System.err.println(jsonObject1.getString("msg")); + } + + } + + + @Override + public void execute(JobExecutionContext jobExecutionContext){ + run(jobExecutionContext); + } + + + + +} diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java new file mode 100644 index 0000000..e8d10de --- /dev/null +++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java @@ -0,0 +1,46 @@ +package com.stylefeng.guns.modular.system.util.quartz.model; + +/** + * + * quartz枚举常量 + * @author zhibing.pu + * @Date 2024/3/20 11:20 + */ +public enum QuartzEnum { + /** + * 任务名称 + */ + JOB_NAME("quartz_job"), + /** + * 任务分组 + */ + DEFAULT_GROUP("quartz_group"), + /** + * quartz任务调度器启动成功 + */ + SCHEDULER_START_SUCCESS("Quartz Scheduler start success!"), + /** + * 任务添加到调度器成功 + */ + ADD_SIMPLE_TRIGGER_SUCCESS("add Quartz SimpleTrigger success!"), + /** + * 任务添加到调度器成功 + */ + ADD_CRON_TRIGGER_SUCCESS("add Quartz CronTrigger success!") + ; + + + QuartzEnum(String value) { + this.value = value; + } + + private String value; + + public String getValue() { + return value; + } + + private void setValue(String value) { + this.value = value; + } +} diff --git a/ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml b/ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml index 2bc611b..9eff51b 100644 --- a/ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml +++ b/ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml @@ -27,6 +27,11 @@ multipart: max-request-size: 100MB max-file-size: 100MB + redis: + database: 0 + host: 127.0.0.1 + port: 6379 + password: 123456 profiles: active: dev diff --git a/ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml b/ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml index c2eadaf..369b756 100644 --- a/ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml +++ b/ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml @@ -29,6 +29,11 @@ multipart: max-request-size: 100MB max-file-size: 100MB + redis: + database: 0 + host: 127.0.0.1 + port: 16379 + password: mPMHThYzlT8DWgl8HLqwPEyPOiHDPPB5 mybatis-plus: type-aliases-package: com.stylefeng.guns.modular.system.model -- Gitblit v1.7.1