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; 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.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.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; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; 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.text.SimpleDateFormat; import java.util.*; /** * 专车改派管理控制器 * * @author fengshuonan * @Date 2020-09-03 14:20:27 */ @Controller @RequestMapping("/tReassign") public class TReassignController extends BaseController { private String PREFIX = "/system/tReassign/"; @Autowired private ITReassignService tReassignService; @Autowired private PushUtil pushUtil; @Autowired private ITOrderPrivateCarService itOrderPrivateCarService; @Autowired private ITOrderCrossCityService itOrderCrossCityService; @Autowired private ITDriverService itDriverService; @Resource private LineShiftDriverMapper lineShiftDriverMapper; @Autowired private ITDispatchService dispatchService; @Resource private OrderCancelMapper orderCancelMapper; /* @Autowired private ICBCPayUtil icbcPayUtil;*/ @Autowired private ITUserService userService; @Autowired private ITransactionDetailsService transactionDetailsService; @Autowired private IPaymentRecordService paymentRecordService; @Autowired private IIncomeService incomeService; @Autowired 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; /** * 跳转到专车改派管理首页 */ @RequestMapping("") public String index() { return PREFIX + "tReassign.html"; } /** * 跳转到跨城出行改派管理首页 */ @RequestMapping("/cross") public String corse() { return PREFIX + "cross.html"; } /** * 跳转到小件物流改派管理首页 */ @RequestMapping("/smallPieceLogistics") public String smallPieceLogistics() { return PREFIX + "smallPieceLogistics.html"; } /** * 跳转到添加专车改派管理 */ @RequestMapping("/tReassign_add") public String tReassignAdd() { return PREFIX + "tReassign_add.html"; } /** * 跳转到修改专车改派管理 */ @RequestMapping("/tReassign_update/{tReassignId}") public String tReassignUpdate(@PathVariable Integer tReassignId, Model model) { TReassign tReassign = tReassignService.selectById(tReassignId); model.addAttribute("item",tReassign); LogObjectHolder.me().set(tReassign); return PREFIX + "tReassign_edit.html"; } /** * 跳转到修改专车改派管理 */ @RequestMapping("/tReassign_reassignment/{tReassignId}") public String tReassign_reassignment(@PathVariable Integer tReassignId, Model model) { model.addAttribute("tReassignId",tReassignId); return PREFIX + "tReassign_reassignment.html"; } /** * 跳转到修改跨城改派管理 */ @RequestMapping("/tReassign_reassignmentCross/{tReassignId}") public String tReassign_reassignmentCross(@PathVariable Integer tReassignId, Model model) { model.addAttribute("tReassignId",tReassignId); return PREFIX + "tReassign_reassignmentCross.html"; } /** * 跳转到修改跨城改派管理 */ @RequestMapping("/tReassign_reassignmentSmall/{tReassignId}") public String tReassign_reassignmentSmall(@PathVariable Integer tReassignId, Model model) { model.addAttribute("tReassignId",tReassignId); return PREFIX + "tReassign_reassignmentSmall.html"; } @RequestMapping("/lookDetail/{id}") public String lookDetail(@PathVariable Integer id, Model model) { TReassign tReassign = tReassignService.selectById(id); String str = tReassign.getReason(); model.addAttribute("str",str); return "/system/tComplaint/lookDetail.html"; } /** * 获取专车改派管理列表 */ @RequestMapping(value = "/list") @ResponseBody public Object list(String insertTime, String originalDriverName, String originalDriverPhone, String orderNum, String nowDriverName, String nowDriverPhone, Integer orderState, Integer state) { String beginTime = null; String endTime = null; if (SinataUtil.isNotEmpty(insertTime)){ String[] timeArray = insertTime.split(" - "); beginTime = timeArray[0]; endTime = timeArray[1]; } Page> page = new PageFactory>().defaultPage(); page.setRecords(tReassignService.getPrivateCarReassignOrderList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,originalDriverName,originalDriverPhone,orderNum,nowDriverName,nowDriverPhone,orderState,state)); return super.packForBT(page); } /** * 获取跨城改派管理列表 */ @RequestMapping(value = "/listCross") @ResponseBody public Object listCross(String insertTime, String originalDriverName, String originalDriverPhone, String orderNum, String nowDriverName, String nowDriverPhone, Integer orderState, Integer state) { String beginTime = null; String endTime = null; if (SinataUtil.isNotEmpty(insertTime)){ String[] timeArray = insertTime.split(" - "); beginTime = timeArray[0]; endTime = timeArray[1]; } Page> page = new PageFactory>().defaultPage(); page.setRecords(tReassignService.getCrossReassignOrderList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,originalDriverName,originalDriverPhone,orderNum,nowDriverName,nowDriverPhone,orderState,state)); return super.packForBT(page); } /** * 获取跨城改派管理列表 */ @RequestMapping(value = "/listSmallPieceLogistics") @ResponseBody public Object listSmallPieceLogistics(String insertTime, String originalDriverName, String originalDriverPhone, String orderNum, String nowDriverName, String nowDriverPhone, Integer orderState, Integer state) { String beginTime = null; String endTime = null; if (SinataUtil.isNotEmpty(insertTime)){ String[] timeArray = insertTime.split(" - "); beginTime = timeArray[0]; endTime = timeArray[1]; } Page> page = new PageFactory>().defaultPage(); page.setRecords(tReassignService.getSmallPieceLogisticsList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,originalDriverName,originalDriverPhone,orderNum,nowDriverName,nowDriverPhone,orderState,state)); return super.packForBT(page); } /** * 选择司机列表 */ @RequestMapping(value = "/selectDriver/{orderId}") @ResponseBody public Object selectDriver(@PathVariable Integer orderId, String name, String phone) { TReassign reassign = tReassignService.selectById(orderId); TOrderPrivateCar privateCar = itOrderPrivateCarService.selectById(reassign.getOrderId()); Page> page = new PageFactory>().defaultPage(); page.setRecords(tReassignService.getCanSelectPrivateCarDriverList(page,privateCar.getServerCarModelId(),privateCar.getDriverId(),name,phone)); return super.packForBT(page); } /** * 选择司机列表 */ @RequestMapping(value = "/selectCrossDriver/{orderId}") @ResponseBody public Object selectCrossDriver(@PathVariable Integer orderId, String name, String phone) { TReassign reassign = tReassignService.selectById(orderId); TOrderCrossCity tOrderCrossCity = itOrderCrossCityService.selectById(reassign.getOrderId()); LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(tOrderCrossCity.getLineShiftDriverId()); Page> page = new PageFactory>().defaultPage(); page.setRecords(tReassignService.getCanSelectCrossDriverList(page, tOrderCrossCity.getCompanyId(), tOrderCrossCity.getServerCarModelId(), tOrderCrossCity.getLineId(), lineShiftDriver.getLineShiftId(), tOrderCrossCity.getTravelTime(), tOrderCrossCity.getPeopleNumber(), name, phone, tOrderCrossCity.getDriverId())); return super.packForBT(page); } /** * 选择司机列表 */ @RequestMapping(value = "/selectSmallDriver/{orderId}") @ResponseBody public Object selectSmallDriver(@PathVariable Integer orderId, String name, String phone) { TReassign reassign = tReassignService.selectById(orderId); TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(reassign.getOrderId()); Page> page = new PageFactory>().defaultPage(); page.setRecords(tReassignService.getCanSelectSmallDriverList(page,tOrderLogistics.getServerCarModelId(), tOrderLogistics.getDriverId(), tOrderLogistics.getType(),name,phone)); return super.packForBT(page); } /** * 操作专车改派管理 * optType 1=拒绝 2=取消 */ @RequestMapping(value = "/opt") @ResponseBody public Object opt(@RequestParam Integer tReassignId,@RequestParam Integer optType) { ShiroUser user = ShiroKit.getUser(); TReassign tReassign = tReassignService.selectById(tReassignId); if (1 == optType){ tReassign.setState(5); tReassignService.updateById(tReassign); //还原订单状态 TOrderPrivateCar tOrderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId()); tOrderPrivateCar.setState(tOrderPrivateCar.getOldState()); itOrderPrivateCarService.updateById(tOrderPrivateCar); }else if (2 == optType){ tReassign.setState(4); tReassignService.updateById(tReassign); //修改订单状态"已取消" TOrderPrivateCar tOrderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId()); tOrderPrivateCar.setState(10); itOrderPrivateCarService.updateById(tOrderPrivateCar); //修改司机状态"空闲" TDriver driver = itDriverService.selectById(tReassign.getOriginalDriverId()); driver.setState(2); itDriverService.updateById(driver); //添加取消记录 OrderCancel orderCancel = new OrderCancel(); orderCancel.setOrderId(tReassign.getOrderId()); orderCancel.setOrderType(tReassign.getOrderType()); orderCancel.setReason("The platform cancels the order"); orderCancel.setRemark("The platform cancels the order"); orderCancel.setState(2); orderCancel.setInsertTime(new Date()); orderCancel.setUserType(3); orderCancel.setUserId(user.getId()); orderCancelMapper.insert(orderCancel); //调用推送 Map map = new HashMap<>(); map.put("id", tOrderPrivateCar.getId().toString()); map.put("orderType", "1"); map.put("from", "admin"); String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map); System.out.println("专车取消:【orderId="+tOrderPrivateCar.getId().toString()+"】,调用接口:"+result); } //返回驾驶员处罚金 // TDriver originalDriver = itDriverService.selectById(tReassign.getOriginalDriverId()); // originalDriver.setBalance(originalDriver.getBalance().add(new BigDecimal(tReassign.getMoney()))); // itDriverService.updateById(originalDriver); //增加交易明细 // TPubTransactionDetails details = new TPubTransactionDetails(); // details.setUserId(originalDriver.getId()); // details.setInsertTime(new Date()); // details.setRemark("【专车改派】:改派失败或订单取消"); // details.setMoney(new BigDecimal(tReassign.getMoney())); // details.setState(1); // details.setType(1); // details.setUserType(2); // details.setOrderType(3); // details.setOrderId(tReassign.getOrderId()); // itPubTransactionDetailsService.insert(details); return SUCCESS_TIP; } /** * 操作跨城改派管理 * optType 1=拒绝 2=取消 */ @RequestMapping(value = "/optCross") @ResponseBody public Object optCross(@RequestParam Integer tReassignId,@RequestParam Integer optType) { try { TReassign tReassign = tReassignService.selectById(tReassignId); ShiroUser user = ShiroKit.getUser(); if (1 == optType){ tReassign.setState(5); tReassign.setReviewer(user.getId()); tReassign.setReviewerType(2); tReassignService.updateById(tReassign); //还原订单状态 TOrderCrossCity tOrderCrossCity = itOrderCrossCityService.selectById(tReassign.getOrderId()); tOrderCrossCity.setState(tOrderCrossCity.getOldState()); itOrderCrossCityService.updateById(tOrderCrossCity); }else if (2 == optType){ tReassign.setState(4); tReassign.setReviewer(user.getId()); tReassign.setReviewerType(2); tReassignService.updateById(tReassign); TOrderCrossCity orderCrossCity = itOrderCrossCityService.selectById(tReassign.getOrderId()); if(orderCrossCity.getState() > 5 && orderCrossCity.getState() != 11){ return ResultUtil.error("订单状态不在可取消范围内"); } orderCrossCity.setState(10); itOrderCrossCityService.updateById(orderCrossCity); //修改司机信息 LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId()); lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ? lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber()); String seat = ""; String[] split = orderCrossCity.getSeatNumber().split(","); for(String s : split){ seat += s + ","; } seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1); //总和大于总座位数的情况 if(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){ seat = ""; for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){ seat += i + ","; } seat = seat.substring(0, seat.length() - 1); } lineShiftDriver.setLaveSeatNumber(seat); lineShiftDriverMapper.updateById(lineShiftDriver); if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){ TDriver driver = itDriverService.selectById(tReassign.getOriginalDriverId()); driver.setState(2); itDriverService.updateById(driver); } //调用推送 Map map = new HashMap<>(); map.put("id", orderCrossCity.getId().toString()); map.put("orderType", "3"); map.put("from", "admin"); String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map); System.out.println("跨城出行取消:【orderId="+orderCrossCity.getId().toString()+"】,调用接口:"+result); //已支付的情况下进行退款操作 if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()){ if(orderCrossCity.getPayType() == 3){//余额支付 TUser tUser = userService.selectById(orderCrossCity.getUserId()); tUser.setBalance(tUser.getBalance().add(orderCrossCity.getPayMoney())); userService.updateById(tUser); //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", orderCrossCity.getPayMoney().doubleValue(), 1, 1, 1, 3, tReassign.getOrderId()); }else{ PaymentRecord query = paymentRecordService.query(1, null, null, tReassign.getOrderId(), 3, null, 2); if(null == query){ return ResultUtil.error("订单还未进行支付"); } /*Map merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), tReassign.getOrderId() + "_3", orderCrossCity.getOrderNum()); if(Integer.valueOf(merrefund.get("code").toString()) == 0){ boolean b = true; while (b){ Map refundqry = icbcPayUtil.refundqry("", query.getCode(), orderCrossCity.getOrderNum()); if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 0){//成功 //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", query.getAmount(), 1, 1, 1, 3, tReassign.getOrderId()); } if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 1){//失败 return ResultUtil.error("订单取消失败(退款不成功)"); } if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 2){//未知 return ResultUtil.error("退款返回未知异常"); } } }*/ } //添加负的收入明细 List incomes = incomeService.selectList(new EntityWrapper().eq("type", 2).eq("incomeId", tReassign.getOrderId()).eq("orderType", 3)); for(Income income : incomes){ if(income.getUserType() == 2){//处理司机的收入 TDriver driver = itDriverService.selectById(income.getObjectId()); driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney()))); driver.setLaveBusinessMoney(new BigDecimal(driver.getLaveBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue()); driver.setBusinessMoney(new BigDecimal(driver.getBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue()); itDriverService.updateById(driver); } Income income1 = new Income(); BeanUtils.copyProperties(income, income1); income1.setMoney(income.getMoney() * -1); income1.setId(null); income1.setInsertTime(new Date()); incomeService.insert(income1); } } //添加取消记录 OrderCancel orderCancel = new OrderCancel(); orderCancel.setOrderId(tReassign.getOrderId()); orderCancel.setOrderType(tReassign.getOrderType()); orderCancel.setReason("The platform cancels the order"); orderCancel.setRemark("The platform cancels the order"); orderCancel.setState(2); orderCancel.setInsertTime(new Date()); orderCancel.setUserType(3); orderCancel.setUserId(user.getId()); orderCancelMapper.insert(orderCancel); } //返回驾驶员处罚金 TDriver originalDriver = itDriverService.selectById(tReassign.getOriginalDriverId()); originalDriver.setBalance(originalDriver.getBalance().add(new BigDecimal(tReassign.getMoney()))); itDriverService.updateById(originalDriver); //增加交易明细 TPubTransactionDetails details = new TPubTransactionDetails(); details.setUserId(originalDriver.getId()); details.setInsertTime(new Date()); details.setRemark("【跨城改派】:改派失败或订单取消"); details.setMoney(new BigDecimal(tReassign.getMoney())); details.setState(1); details.setType(1); details.setUserType(2); details.setOrderType(3); details.setOrderId(tReassign.getOrderId()); itPubTransactionDetailsService.insert(details); }catch (Exception e){ e.printStackTrace(); } return SUCCESS_TIP; } /** * 操作专车改派管理 * optType 1=拒绝 2=取消 */ @RequestMapping(value = "/optSmall") @ResponseBody public Object optSmall(@RequestParam Integer tReassignId,@RequestParam Integer optType) { ShiroUser user = ShiroKit.getUser(); TReassign tReassign = tReassignService.selectById(tReassignId); if (1 == optType){ tReassign.setState(5); tReassignService.updateById(tReassign); //还原订单状态 TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(tReassign.getOrderId()); tOrderLogistics.setState(tOrderLogistics.getOldState()); orderLogisticsService.updateById(tOrderLogistics); }else if (2 == optType){ tReassign.setState(4); tReassignService.updateById(tReassign); //修改订单状态"已取消" TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(tReassign.getOrderId()); tOrderLogistics.setState(10); orderLogisticsService.updateById(tOrderLogistics); //添加取消记录 OrderCancel orderCancel = new OrderCancel(); orderCancel.setOrderId(tReassign.getOrderId()); orderCancel.setOrderType(tReassign.getOrderType()); orderCancel.setReason("The platform cancels the order"); orderCancel.setRemark("The platform cancels the order"); orderCancel.setState(2); orderCancel.setInsertTime(new Date()); orderCancel.setUserType(3); orderCancel.setUserId(user.getId()); orderCancelMapper.insert(orderCancel); //调用推送 Map map = new HashMap<>(); map.put("id", tOrderLogistics.getId().toString()); map.put("orderType", tOrderLogistics.getType().toString()); map.put("from", "admin"); String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map); System.out.println("小件物流取消:【orderId="+tOrderLogistics.getId().toString()+"】,调用接口:"+result); } // //返回驾驶员处罚金 // TDriver originalDriver = itDriverService.selectById(tReassign.getOriginalDriverId()); // originalDriver.setBalance(originalDriver.getBalance().add(new BigDecimal(tReassign.getMoney()))); // itDriverService.updateById(originalDriver); // // //增加交易明细 // TPubTransactionDetails details = new TPubTransactionDetails(); // details.setUserId(originalDriver.getId()); // details.setInsertTime(new Date()); // details.setRemark("【小件物流】:改派失败或订单取消"); // details.setMoney(new BigDecimal(tReassign.getMoney())); // details.setState(1); // details.setType(1); // details.setUserType(2); // details.setOrderType(tReassign.getOrderType()); // details.setOrderId(tReassign.getOrderId()); // itPubTransactionDetailsService.insert(details); return SUCCESS_TIP; } /** * 专车订单改派司机 */ @RequestMapping(value = "/selectDriver") @ResponseBody public Object selectDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) { 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().eq("companyId", driver1.getCompanyId())); if(null != reminderRules){ TSysCancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper().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; } /** * 跨城出行订单改派司机 */ @RequestMapping(value = "/selectCrossDriver") @ResponseBody public Object selectCrossDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) { //修改原司机信息 //修改订单 TReassign tReassign = tReassignService.selectById(orderId); TOrderCrossCity tOrderCrossCity = itOrderCrossCityService.selectById(tReassign.getOrderId()); TDriver oldDriver = itDriverService.selectById(tReassign.getOriginalDriverId()); LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(tOrderCrossCity.getLineShiftDriverId()); lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + tOrderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ? lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + tOrderCrossCity.getPeopleNumber()); String seat = ""; String[] split = tOrderCrossCity.getSeatNumber().split(","); for(String s : split){ seat += s + ","; } seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1); //总和大于总座位数的情况 if(lineShiftDriver.getLaveSeat() + tOrderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){ seat = ""; for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){ seat += i + ","; } seat = seat.substring(0, seat.length() - 1); } lineShiftDriver.setLaveSeatNumber(seat); lineShiftDriverMapper.updateById(lineShiftDriver); if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){ oldDriver.setState(2); itDriverService.updateById(oldDriver); } //修改新司机数据 List query = lineShiftDriverMapper.query(lineShiftDriver.getLineShiftId(), driverId, tOrderCrossCity.getTravelTime()); if(query.size() == 0){ return ResultUtil.error("司机没有预约班次"); } LineShiftDriver lineShiftDriver1 = query.get(0); if(lineShiftDriver1.getLaveSeat() < tOrderCrossCity.getPeopleNumber()){ return ResultUtil.runErr("司机车辆剩余座位数不足"); } lineShiftDriver1.setLaveSeat(lineShiftDriver1.getLaveSeat() - tOrderCrossCity.getPeopleNumber()); String[] split1 = lineShiftDriver1.getLaveSeatNumber().split(","); String seat1 = "";//使用 String seat2 = "";//未使用 for(int i = 0; i < tOrderCrossCity.getPeopleNumber(); i++){ seat1 += split1[i] + ","; } for(int i = tOrderCrossCity.getPeopleNumber(); i < split.length; i++){ seat2 += split1[i] + ","; } lineShiftDriver1.setLaveSeatNumber(seat2); lineShiftDriverMapper.updateById(lineShiftDriver1); TDriver driver = itDriverService.selectById(driverId); if(driver.getState() == 1){ return ResultUtil.error("司机还未上班呢"); } if(driver.getState() == 2){ driver.setState(3); } //修改订单数据 tOrderCrossCity.setDriverId(driverId); tOrderCrossCity.setCarId(driver.getCarId()); tOrderCrossCity.setSeatNumber(seat1); tOrderCrossCity.setState(tOrderCrossCity.getOldState()); tOrderCrossCity.setLineShiftDriverId(lineShiftDriver1.getId()); tOrderCrossCity.setOldState(null); tOrderCrossCity.setIsReassign(2); try { tOrderCrossCity.setOrderNum(itOrderCrossCityService.getOrderNum(driverId, tOrderCrossCity.getLineShiftDriverId())); } catch (Exception e) { e.printStackTrace(); } itOrderCrossCityService.updateAllColumnById(tOrderCrossCity); //修改专车改派订单 tReassign.setNowDriverId(driverId); tReassign.setNowCarId(driver.getCarId()); tReassign.setState(3); tReassign.setCompleteTime(new Date()); tReassignService.updateById(tReassign); //修改收入明细,转给新司机(因为是先支付金额) List incomes = incomeService.selectList(new EntityWrapper().eq("userType", 2).eq("objectId", oldDriver.getId()).eq("type", 2).eq("incomeId", tReassign.getOrderId()).eq("orderType", 3)); if(incomes.size() > 0){ Income income = incomes.get(0); income.setObjectId(driverId); incomeService.updateById(income); oldDriver.setBusinessMoney(oldDriver.getBusinessMoney() - income.getMoney()); oldDriver.setLaveBusinessMoney(oldDriver.getLaveBusinessMoney() - income.getMoney()); oldDriver.setBalance(oldDriver.getBalance().subtract(new BigDecimal(income.getMoney()))); driver.setBusinessMoney(driver.getBusinessMoney() + income.getMoney()); driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() + income.getMoney()); driver.setBalance(driver.getBalance().add(new BigDecimal(income.getMoney()))); } itDriverService.updateById(oldDriver); itDriverService.updateById(driver); //增加推送 Map map = new HashMap<>(); map.put("orderId", tOrderCrossCity.getId().toString()); map.put("orderType", "3"); map.put("from", "admin"); String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map); System.out.println("跨城出行改派:【orderId="+tOrderCrossCity.getId().toString()+"】,调用接口:"+result); return SUCCESS_TIP; } /** * 专车订单改派司机 */ @RequestMapping(value = "/selectSmallDriver") @ResponseBody public Object selectSmallDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) { //修改订单 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().eq("companyId", driver1.getCompanyId())); if(null != reminderRules){ TSysCancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper().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; } }