From c2fdeb19b52f58a8ae8f7efdc26f16dff86569ef Mon Sep 17 00:00:00 2001 From: guyue <1721849008@qq.com> Date: 星期六, 16 八月 2025 00:59:44 +0800 Subject: [PATCH] 抢单和改派 --- UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java | 913 +++++++++++++++++++++++++++++++++++++++---- UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityWarpperPushOrder.java | 230 ++++++++++ UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java | 9 UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java | 28 + UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java | 28 + UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java | 6 UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java | 9 UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java | 6 8 files changed, 1,132 insertions(+), 97 deletions(-) diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java index f15375b..52fd760 100644 --- a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java +++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java @@ -380,10 +380,10 @@ */ @ResponseBody @PostMapping("/api/taxi/pushOrderTaxi") - @ApiOperation(value = "继续等待推单操作", tags = {"用户端-出租车", "用户端-专车"}, notes = "") + @ApiOperation(value = "继续等待推单操作", tags = {"用户端-出租车", "用户端-专车","用户端-跨城"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "订单id", name = "id", required = true, dataType = "int"), - @ApiImplicitParam(value = "订单类型(1=专车,2=出租车)", name = "orderType", required = true, dataType = "int"), + @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3-跨城)", name = "orderType", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil pushOrderTaxi(Integer id, Integer orderType){ @@ -393,6 +393,8 @@ return orderPrivateCarService.pushOrderPrivateCar(id); case 2: return orderTaxiService.pushOrderTaxi(id); +// case 3: +// return orderCrossCityService.pushOrderCrossCity(id); } return ResultUtil.success(); }catch (Exception e){ diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java index 857133a..97f6b03 100644 --- a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java +++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java @@ -3,6 +3,7 @@ import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; +import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpperPushOrder; import com.stylefeng.guns.modular.system.service.IUserInfoService; import com.stylefeng.guns.modular.system.util.ResultUtil; import com.stylefeng.guns.modular.system.util.SystemException; @@ -84,6 +85,33 @@ } } + /** + * 跨城出行下单操作(推单场景) + * @param orderCrossCityWarpperPushOrder + * @param request + * @return + */ + @ResponseBody + @RequestMapping(value = "/api/orderCrossCity/orderCrossCityPushOrder", method = RequestMethod.POST) + @ApiOperation(value = "跨城出行下单操作(推单场景)", tags = {"用户端-跨城"}, notes = "先进行下单操作,再根据返回的订单id进行支付") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") + }) + public ResultUtil<BaseWarpper> orderCrossCityPushOrder(OrderCrossCityWarpperPushOrder orderCrossCityWarpperPushOrder, HttpServletRequest request){ + try { + Integer uid = userInfoService.getUserIdFormRedis(request); + if(null == uid){ + return ResultUtil.tokenErr(); + } + return orderCrossCityService.orderCrossCityPushOrder(orderCrossCityWarpperPushOrder, uid); + } catch (SystemException se){ + return ResultUtil.error(se.getMessage()); + } catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } + /** * 摆渡车下单 diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java index 991d2ea..542a4d6 100644 --- a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java +++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.service.IService; import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; +import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpperPushOrder; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.system.util.ResultUtil; import com.stylefeng.guns.modular.system.warpper.BaseWarpper; @@ -63,7 +64,14 @@ */ ResultUtil payCrossCityOrder(Integer payType, Integer orderId, Integer couponId, Integer type)throws Exception; - +// /** +// * 订单完成支付订单操作(推单场景)(在controller层同一调用,新增一个支付方法要加一个orderType) +// * @param payType +// * @param orderId +// * @return +// * @throws Exception +// */ +// ResultUtil payCrossCityOrder2(Integer payType, Integer orderId, Integer couponId, Integer type)throws Exception; /** * 支付完成后的订单处理 @@ -84,7 +92,14 @@ */ ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception; - + /** + * 用户跨城下单操作(推单场景) + * @param orderCrossCityWarpperPushOrder + * @param uid + * @return + * @throws Exception + */ + ResultUtil<BaseWarpper> orderCrossCityPushOrder(OrderCrossCityWarpperPushOrder orderCrossCityWarpperPushOrder, Integer uid) throws Exception; /** @@ -264,4 +279,13 @@ */ void autoCancelOrder(); + +// /** +// * 继续推送操作 +// * @param id +// * @throws Exception +// */ +// ResultUtil pushOrderCrossCity(Integer id) throws Exception; + + } diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java index 9c7231c..18c58b4 100644 --- a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java +++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java @@ -16,6 +16,7 @@ import com.stylefeng.guns.modular.crossCity.server.ILineService; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; +import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpperPushOrder; import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; @@ -178,6 +179,8 @@ @Value("${callbackPath}") private String callbackPath; + public static List<Integer> crossCityOrderIds = new ArrayList<>(); + public Map<String, Thread> threadMap = new HashMap<>(); //存储摆渡车无接单后推送标识,实现多个类型的摆渡车订单无人接单后只给前端推送一次 @@ -274,6 +277,165 @@ } +// /** +// * 订单支付 +// * @param payType +// * @param orderId +// * @param couponId +// * @param type +// * @return +// * @throws Exception +// */ +// @Override +// public ResultUtil payCrossCityOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception { +// OrderCrossCity orderCrossCity = this.selectById(orderId); +// if(orderCrossCity.getState() != 7){ +// return ResultUtil.error("订单已完成支付,不允许重复支付", ""); +// } +// Integer uid = orderCrossCity.getUserId(); +// Double orderMoney = orderCrossCity.getOrderMoney(); +// System.err.println(orderMoney); +// UserInfo userInfo = userInfoService.selectById(uid); +// ResultUtil resultUtil = ResultUtil.success(""); +// orderCrossCity.setCouponMoney(0D);//初始化历史数据 +// orderCrossCity.setCouponId(null); +// +// //计算优惠券 +// BigDecimal payMoney = new BigDecimal(0); +// UserCouponRecord userCouponRecord = null; +// if(null != couponId){ +// userCouponRecord = userCouponRecordService.selectById(couponId); +// if(userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()){ +// return ResultUtil.error("优惠券不能用于此订单", ""); +// } +// if(userCouponRecord.getState() == 2){ +// return ResultUtil.error("优惠券已使用", ""); +// } +// if(userCouponRecord.getState() == 3){ +// return ResultUtil.error("优惠券已过期", ""); +// } +// if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3){ +// return ResultUtil.error("优惠券不能用于此类型订单", ""); +// } +// if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){ +// return ResultUtil.error("优惠券不能用于此订单", ""); +// } +// payMoney = new BigDecimal(orderMoney.toString()).subtract(new BigDecimal(userCouponRecord.getMoney())); +// System.err.println(payMoney); +// orderCrossCity.setCouponMoney(userCouponRecord.getMoney()); +// orderCrossCity.setCouponId(couponId); +// } +// if(payMoney.compareTo(new BigDecimal(0)) == 0 ){ +// payMoney = new BigDecimal(orderMoney.toString()); +// } +// //计算红包 +// UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney); +//// if(null != query && orderMoney.compareTo(query.getMoney()) > 0){ +//// orderMoney = orderMoney - query.getMoney(); +//// orderCrossCity.setRedPacketMoney(query.getMoney()); +//// orderCrossCity.setRedPacketId(query.getId()); +//// } +//// +//// //计算折扣 +//// UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId()); +//// if(null != query2){ +//// Double special = query2.getSpecial(); +//// orderCrossCity.setDiscount(special); +//// double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); +//// if(orderMoney.compareTo(v) > 0){ +//// orderCrossCity.setDiscountMoney(orderMoney - v); +//// orderCrossCity.setActivityId(query2.getId()); +//// orderMoney = v; +//// } +//// } +// if(payType == 1){//微信支付 +// String value = redisUtil.getValue("appletOpenId"); +// String appletsOpenId = null; +// if(ToolUtil.isNotEmpty(value)){ +// JSONObject jsonObject = JSON.parseObject(value); +// appletsOpenId = jsonObject.getString(uid.toString()); +// }else{ +// appletsOpenId = userInfo.getAppletsOpenId(); +// } +//// Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId); +//// if(map.get("code").equals("200")){ +//// paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据 +//// resultUtil = ResultUtil.success(map.get("data")); +//// }else{ +//// resultUtil = ResultUtil.error(map.get("msg"), ""); +//// } +// String app = type == 1 ? "APP" : "JSAPI"; +// resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), payMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); +// paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, Double.valueOf(payMoney.toString()), "", 1);//添加预支付数据 +// } +// if(payType == 2){//支付宝支付 +// Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null); +// if(map.get("code").equals("200")){ +// paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据 +// resultUtil = ResultUtil.success(map.get("data")); +// }else{ +// resultUtil = ResultUtil.error(map.get("msg"), ""); +// } +// } +// if(payType == 3){//余额支付 +// if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){ +// return ResultUtil.error("余额不足,无法完成支付", ""); +// } +// +// userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); +// +// SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId()); +// userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分 +// +// //添加交易明细 +// transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 3, orderId); +// userInfoService.updateById(userInfo); +// +// orderCrossCity.setState(2);//跨城支付完成后才开始服务 +// orderCrossCity.setPayType(3); +// orderCrossCity.setPayMoney(orderMoney); +// +// //处理优惠券和红包 +// if(null != userCouponRecord){ +// userCouponRecord.setState(2); +// userCouponRecord.setEndTime(new Date()); +// userCouponRecordService.updateById(userCouponRecord); +// } +// if(null != query){ +// query.setState(2); +// query.setEndTime(new Date()); +// userRedPacketRecordService.updateById(query); +// } +// +// //添加已收入明细 +// Line line = lineService.selectById(orderCrossCity.getLineId()); +// Double speMoney = Double.valueOf(line.getRakeRate()); +// BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入 +// BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入 +// incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue()); +// incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue()); +// Driver driver = driverService.selectById(orderCrossCity.getDriverId()); +// driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); +// driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); +// driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); +// driverService.updateById(driver); +// +// // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 +// new Thread(new Runnable() { +// @Override +// public void run() { +// pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); +// pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); +// pushUtil.pushDriverPosition(orderCrossCity.getId(), 3); +// } +// }).start(); +// +// systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1); +// } +// +// this.updateAllColumnById(orderCrossCity); +// return resultUtil; +// } /** * 订单支付 * @param payType @@ -296,37 +458,38 @@ ResultUtil resultUtil = ResultUtil.success(""); orderCrossCity.setCouponMoney(0D);//初始化历史数据 orderCrossCity.setCouponId(null); + if (orderCrossCity.getDriverId() != null) { - //计算优惠券 - BigDecimal payMoney = new BigDecimal(0); - UserCouponRecord userCouponRecord = null; - if(null != couponId){ - userCouponRecord = userCouponRecordService.selectById(couponId); - if(userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()){ - return ResultUtil.error("优惠券不能用于此订单", ""); + //计算优惠券 + BigDecimal payMoney = new BigDecimal(0); + UserCouponRecord userCouponRecord = null; + if (null != couponId) { + userCouponRecord = userCouponRecordService.selectById(couponId); + if (userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()) { + return ResultUtil.error("优惠券不能用于此订单", ""); + } + if (userCouponRecord.getState() == 2) { + return ResultUtil.error("优惠券已使用", ""); + } + if (userCouponRecord.getState() == 3) { + return ResultUtil.error("优惠券已过期", ""); + } + if (userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3) { + return ResultUtil.error("优惠券不能用于此类型订单", ""); + } + if (userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0) { + return ResultUtil.error("优惠券不能用于此订单", ""); + } + payMoney = new BigDecimal(orderMoney.toString()).subtract(new BigDecimal(userCouponRecord.getMoney())); + System.err.println(payMoney); + orderCrossCity.setCouponMoney(userCouponRecord.getMoney()); + orderCrossCity.setCouponId(couponId); } - if(userCouponRecord.getState() == 2){ - return ResultUtil.error("优惠券已使用", ""); + if (payMoney.compareTo(new BigDecimal(0)) == 0) { + payMoney = new BigDecimal(orderMoney.toString()); } - if(userCouponRecord.getState() == 3){ - return ResultUtil.error("优惠券已过期", ""); - } - if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3){ - return ResultUtil.error("优惠券不能用于此类型订单", ""); - } - if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){ - return ResultUtil.error("优惠券不能用于此订单", ""); - } - payMoney = new BigDecimal(orderMoney.toString()).subtract(new BigDecimal(userCouponRecord.getMoney())); - System.err.println(payMoney); - orderCrossCity.setCouponMoney(userCouponRecord.getMoney()); - orderCrossCity.setCouponId(couponId); - } - if(payMoney.compareTo(new BigDecimal(0)) == 0 ){ - payMoney = new BigDecimal(orderMoney.toString()); - } - //计算红包 - UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney); + //计算红包 + UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney); // if(null != query && orderMoney.compareTo(query.getMoney()) > 0){ // orderMoney = orderMoney - query.getMoney(); // orderCrossCity.setRedPacketMoney(query.getMoney()); @@ -345,15 +508,15 @@ // orderMoney = v; // } // } - if(payType == 1){//微信支付 - String value = redisUtil.getValue("appletOpenId"); - String appletsOpenId = null; - if(ToolUtil.isNotEmpty(value)){ - JSONObject jsonObject = JSON.parseObject(value); - appletsOpenId = jsonObject.getString(uid.toString()); - }else{ - appletsOpenId = userInfo.getAppletsOpenId(); - } + if (payType == 1) {//微信支付 + String value = redisUtil.getValue("appletOpenId"); + String appletsOpenId = null; + if (ToolUtil.isNotEmpty(value)) { + JSONObject jsonObject = JSON.parseObject(value); + appletsOpenId = jsonObject.getString(uid.toString()); + } else { + appletsOpenId = userInfo.getAppletsOpenId(); + } // Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId); // if(map.get("code").equals("200")){ // paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据 @@ -361,79 +524,373 @@ // }else{ // resultUtil = ResultUtil.error(map.get("msg"), ""); // } - String app = type == 1 ? "APP" : "JSAPI"; - resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), payMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); - paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, Double.valueOf(payMoney.toString()), "", 1);//添加预支付数据 - } - if(payType == 2){//支付宝支付 - Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null); - if(map.get("code").equals("200")){ - paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据 - resultUtil = ResultUtil.success(map.get("data")); - }else{ - resultUtil = ResultUtil.error(map.get("msg"), ""); + String app = type == 1 ? "APP" : "JSAPI"; + resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), payMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); + paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, Double.valueOf(payMoney.toString()), "", 1);//添加预支付数据 } - } - if(payType == 3){//余额支付 - if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){ - return ResultUtil.error("余额不足,无法完成支付", ""); + if (payType == 2) {//支付宝支付 + Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null); + if (map.get("code").equals("200")) { + paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据 + resultUtil = ResultUtil.success(map.get("data")); + } else { + resultUtil = ResultUtil.error(map.get("msg"), ""); + } } + if (payType == 3) {//余额支付 + if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) { + return ResultUtil.error("余额不足,无法完成支付", ""); + } - userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); + userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); - SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId()); - userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分 + SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId()); + userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分 - //添加交易明细 - transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 3, orderId); - userInfoService.updateById(userInfo); + //添加交易明细 + transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 3, orderId); + userInfoService.updateById(userInfo); - orderCrossCity.setState(2);//跨城支付完成后才开始服务 - orderCrossCity.setPayType(3); - orderCrossCity.setPayMoney(orderMoney); + orderCrossCity.setState(2);//跨城支付完成后才开始服务 + orderCrossCity.setPayType(3); + orderCrossCity.setPayMoney(orderMoney); - //处理优惠券和红包 - if(null != userCouponRecord){ - userCouponRecord.setState(2); - userCouponRecord.setEndTime(new Date()); - userCouponRecordService.updateById(userCouponRecord); + //处理优惠券和红包 + if (null != userCouponRecord) { + userCouponRecord.setState(2); + userCouponRecord.setEndTime(new Date()); + userCouponRecordService.updateById(userCouponRecord); + } + if (null != query) { + query.setState(2); + query.setEndTime(new Date()); + userRedPacketRecordService.updateById(query); + } + + //添加已收入明细 + Line line = lineService.selectById(orderCrossCity.getLineId()); + Double speMoney = Double.valueOf(line.getRakeRate()); + BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入 + BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入 + incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue()); + incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue()); + Driver driver = driverService.selectById(orderCrossCity.getDriverId()); + driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); + driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); + driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); + driverService.updateById(driver); + + // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 + new Thread(new Runnable() { + @Override + public void run() { + pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); + pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); + pushUtil.pushDriverPosition(orderCrossCity.getId(), 3); + } + }).start(); + + systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1); } - if(null != query){ - query.setState(2); - query.setEndTime(new Date()); - userRedPacketRecordService.updateById(query); + }else { + //没有指定司机 + //计算优惠券 + BigDecimal payMoney = new BigDecimal(0); + UserCouponRecord userCouponRecord = null; + if(null != couponId){ + userCouponRecord = userCouponRecordService.selectById(couponId); + if(userCouponRecord.getCompanyId() != null){ + return ResultUtil.error("优惠券不能用于此订单", ""); + } + if(userCouponRecord.getState() == 2){ + return ResultUtil.error("优惠券已使用", ""); + } + if(userCouponRecord.getState() == 3){ + return ResultUtil.error("优惠券已过期", ""); + } + if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3){ + return ResultUtil.error("优惠券不能用于此类型订单", ""); + } + if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){ + return ResultUtil.error("优惠券不能用于此订单", ""); + } + payMoney = new BigDecimal(orderMoney.toString()).subtract(new BigDecimal(userCouponRecord.getMoney())); + System.err.println(payMoney); + orderCrossCity.setCouponMoney(userCouponRecord.getMoney()); + orderCrossCity.setCouponId(couponId); } + if(payMoney.compareTo(new BigDecimal(0)) == 0 ){ + payMoney = new BigDecimal(orderMoney.toString()); + } + //计算红包 + //TODO:红包是否必须指定公司,必须要公司则不能用红包 +// UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney); +// if(null != query && orderMoney.compareTo(query.getMoney()) > 0){ +// orderMoney = orderMoney - query.getMoney(); +// orderCrossCity.setRedPacketMoney(query.getMoney()); +// orderCrossCity.setRedPacketId(query.getId()); +// } +// +// //计算折扣 +// UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId()); +// if(null != query2){ +// Double special = query2.getSpecial(); +// orderCrossCity.setDiscount(special); +// double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); +// if(orderMoney.compareTo(v) > 0){ +// orderCrossCity.setDiscountMoney(orderMoney - v); +// orderCrossCity.setActivityId(query2.getId()); +// orderMoney = v; +// } +// } + if(payType == 1){//微信支付 + String value = redisUtil.getValue("appletOpenId"); + String appletsOpenId = null; + if(ToolUtil.isNotEmpty(value)){ + JSONObject jsonObject = JSON.parseObject(value); + appletsOpenId = jsonObject.getString(uid.toString()); + }else{ + appletsOpenId = userInfo.getAppletsOpenId(); + } +// Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId); +// if(map.get("code").equals("200")){ +// paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据 +// resultUtil = ResultUtil.success(map.get("data")); +// }else{ +// resultUtil = ResultUtil.error(map.get("msg"), ""); +// } + String app = type == 1 ? "APP" : "JSAPI"; + resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), payMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); + paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, Double.valueOf(payMoney.toString()), "", 1);//添加预支付数据 + } + if(payType == 2){//支付宝支付 + Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null); + if(map.get("code").equals("200")){ + paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据 + resultUtil = ResultUtil.success(map.get("data")); + }else{ + resultUtil = ResultUtil.error(map.get("msg"), ""); + } + } + if(payType == 3){//余额支付 + if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){ + return ResultUtil.error("余额不足,无法完成支付", ""); + } - //添加已收入明细 - Line line = lineService.selectById(orderCrossCity.getLineId()); - Double speMoney = Double.valueOf(line.getRakeRate()); - BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入 - BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入 - incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue()); - incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue()); - Driver driver = driverService.selectById(orderCrossCity.getDriverId()); - driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); - driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); - driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); - driverService.updateById(driver); + userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); - // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 - new Thread(new Runnable() { - @Override - public void run() { - pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); - pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); - pushUtil.pushDriverPosition(orderCrossCity.getId(), 3); +// SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId()); +// userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分 + + //添加交易明细 + transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 3, orderId); + userInfoService.updateById(userInfo); + + orderCrossCity.setState(1);//跨城支付完成后才开始推单 + orderCrossCity.setPayType(3); + orderCrossCity.setPayMoney(orderMoney); + + //处理优惠券和红包 + if(null != userCouponRecord){ + userCouponRecord.setState(2); + userCouponRecord.setEndTime(new Date()); + userCouponRecordService.updateById(userCouponRecord); + } +// if(null != query){ +// query.setState(2); +// query.setEndTime(new Date()); +// userRedPacketRecordService.updateById(query); +// } + + //添加已收入明细 +// Line line = lineService.selectById(orderCrossCity.getLineId()); +// Double speMoney = Double.valueOf(line.getRakeRate()); +// BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入 +// BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入 +// incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue()); +// incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue()); +// Driver driver = driverService.selectById(orderCrossCity.getDriverId()); +// driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); +// driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); +// driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); +// driverService.updateById(driver); + + // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 +// new Thread(new Runnable() { +// @Override +// public void run() { +// pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); +// pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); +// pushUtil.pushDriverPosition(orderCrossCity.getId(), 3); +// } +// }).start(); + + systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1); + } +// 支付成功后,触发推单(异步执行,不阻塞支付响应) + new Thread(() -> { + try { + //推单操作 + if(orderCrossCity.getState() == 1){ + this.pushCrossCityOrder(orderCrossCity); + } + } catch (Exception e) { + e.printStackTrace(); } }).start(); - - systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1); } - this.updateAllColumnById(orderCrossCity); + return resultUtil; } - +// /** +// * 订单支付(推单场景) +// * @param payType +// * @param orderId +// * @param couponId +// * @param type +// * @return +// * @throws Exception +// */ +// @Override +// public ResultUtil payCrossCityOrder2(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception { +// OrderCrossCity orderCrossCity = this.selectById(orderId); +// if(orderCrossCity.getState() != 7){ +// return ResultUtil.error("订单已完成支付,不允许重复支付", ""); +// } +// Integer uid = orderCrossCity.getUserId(); +// Double orderMoney = orderCrossCity.getOrderMoney(); +// System.err.println(orderMoney); +// UserInfo userInfo = userInfoService.selectById(uid); +// ResultUtil resultUtil = ResultUtil.success(""); +// orderCrossCity.setCouponMoney(0D);//初始化历史数据 +// orderCrossCity.setCouponId(null); +// +// //计算优惠券 +// BigDecimal payMoney = new BigDecimal(0); +// UserCouponRecord userCouponRecord = null; +// if(null != couponId){ +// userCouponRecord = userCouponRecordService.selectById(couponId); +// if(userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()){ +// return ResultUtil.error("优惠券不能用于此订单", ""); +// } +// if(userCouponRecord.getState() == 2){ +// return ResultUtil.error("优惠券已使用", ""); +// } +// if(userCouponRecord.getState() == 3){ +// return ResultUtil.error("优惠券已过期", ""); +// } +// if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3){ +// return ResultUtil.error("优惠券不能用于此类型订单", ""); +// } +// if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){ +// return ResultUtil.error("优惠券不能用于此订单", ""); +// } +// payMoney = new BigDecimal(orderMoney.toString()).subtract(new BigDecimal(userCouponRecord.getMoney())); +// System.err.println(payMoney); +// orderCrossCity.setCouponMoney(userCouponRecord.getMoney()); +// orderCrossCity.setCouponId(couponId); +// } +// if(payMoney.compareTo(new BigDecimal(0)) == 0 ){ +// payMoney = new BigDecimal(orderMoney.toString()); +// } +// //计算红包 +// UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney); +//// if(null != query && orderMoney.compareTo(query.getMoney()) > 0){ +//// orderMoney = orderMoney - query.getMoney(); +//// orderCrossCity.setRedPacketMoney(query.getMoney()); +//// orderCrossCity.setRedPacketId(query.getId()); +//// } +//// +//// //计算折扣 +//// UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId()); +//// if(null != query2){ +//// Double special = query2.getSpecial(); +//// orderCrossCity.setDiscount(special); +//// double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); +//// if(orderMoney.compareTo(v) > 0){ +//// orderCrossCity.setDiscountMoney(orderMoney - v); +//// orderCrossCity.setActivityId(query2.getId()); +//// orderMoney = v; +//// } +//// } +// if(payType == 1){//微信支付 +// String value = redisUtil.getValue("appletOpenId"); +// String appletsOpenId = null; +// if(ToolUtil.isNotEmpty(value)){ +// JSONObject jsonObject = JSON.parseObject(value); +// appletsOpenId = jsonObject.getString(uid.toString()); +// }else{ +// appletsOpenId = userInfo.getAppletsOpenId(); +// } +//// Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId); +//// if(map.get("code").equals("200")){ +//// paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据 +//// resultUtil = ResultUtil.success(map.get("data")); +//// }else{ +//// resultUtil = ResultUtil.error(map.get("msg"), ""); +//// } +// String app = type == 1 ? "APP" : "JSAPI"; +// resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), payMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); +// paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, Double.valueOf(payMoney.toString()), "", 1);//添加预支付数据 +// } +// if(payType == 2){//支付宝支付 +// Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null); +// if(map.get("code").equals("200")){ +// paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据 +// resultUtil = ResultUtil.success(map.get("data")); +// }else{ +// resultUtil = ResultUtil.error(map.get("msg"), ""); +// } +// } +// if(payType == 3){//余额支付 +// if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){ +// return ResultUtil.error("余额不足,无法完成支付", ""); +// } +// +// userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); +// +// SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId()); +// userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分 +// +// //添加交易明细 +// transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 3, orderId); +// userInfoService.updateById(userInfo); +// +// orderCrossCity.setState(2);//跨城支付完成后才开始服务 +// orderCrossCity.setPayType(3); +// orderCrossCity.setPayMoney(orderMoney); +// +// //处理优惠券和红包 +// if(null != userCouponRecord){ +// userCouponRecord.setState(2); +// userCouponRecord.setEndTime(new Date()); +// userCouponRecordService.updateById(userCouponRecord); +// } +// if(null != query){ +// query.setState(2); +// query.setEndTime(new Date()); +// userRedPacketRecordService.updateById(query); +// } +// +// //添加已收入明细 +// Line line = lineService.selectById(orderCrossCity.getLineId()); +// Double speMoney = Double.valueOf(line.getRakeRate()); +// BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入 +// BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入 +// incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue()); +// incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue()); +// +// systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1); +// } +// +// this.updateAllColumnById(orderCrossCity); +// //没有司机,推单操作 +// if(orderCrossCity.getDriverId() == null && orderCrossCity.getState() == 2){ +// this.pushCrossCityOrder(orderCrossCity); +// } +// return resultUtil; +// } /** * 支付成功后的回调操作 @@ -763,6 +1220,193 @@ return ResultUtil.success(baseWarpper); } + /** + * 跨城下单操作(推单场景) + * @param orderCrossCityWarpperPushOrder + * @param uid + * @return + * @throws Exception + */ + @Override + public synchronized ResultUtil<BaseWarpper> orderCrossCityPushOrder(OrderCrossCityWarpperPushOrder orderCrossCityWarpperPushOrder, Integer uid) throws Exception { + /** + * 1.下了即时单就不能下预约单和即时单 + * 2.下了预约单和再下一张即时单不能再下预约单 + */ + List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11); + if(orderPrivateCars.size() > 0){ + return ResultUtil.error("有未完成的订单"); + } + List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11); + if(list.size() > 0){ + return ResultUtil.error("有未完成的订单"); + } + List<OrderCrossCity> orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 7, 11); + if(orderCrossCities1.size() > 0){ + return ResultUtil.error("有未完成的订单"); + } + + if(null == orderCrossCityWarpperPushOrder.getServerCarModelId()){ + return ResultUtil.error("请选择服务车型"); + } + OrderCrossCity orderCrossCity = new OrderCrossCity(); + orderCrossCity.setUserId(uid); + orderCrossCity.setServerCarModelId(orderCrossCityWarpperPushOrder.getServerCarModelId()); +// orderCrossCity.setDriverId(orderCrossCityWarpper.getDriverId()); + orderCrossCity.setLineId(orderCrossCityWarpperPushOrder.getLineId()); +// orderCrossCity.setLineShiftDriverId(orderCrossCityWarpper.getLineShiftDriverId()); +// orderCrossCity.setCarId(orderCrossCityWarpper.getCarId()); +// orderCrossCity.setOrderNum(this.getOrderNum(orderCrossCityWarpperPushOrder.getDriverId(), orderCrossCityWarpperPushOrder.getLineShiftDriverId())); + orderCrossCity.setPlacementLon(orderCrossCityWarpperPushOrder.getPlacementLon()); + orderCrossCity.setPlacementLat(orderCrossCityWarpperPushOrder.getPlacementLat()); + String placementAddress = orderCrossCityWarpperPushOrder.getPlacementAddress(); + placementAddress = placementAddress.replaceAll("& #40;", "("); + placementAddress = placementAddress.replaceAll("& #41;", ")"); + orderCrossCity.setPlacementAddress(placementAddress); + orderCrossCity.setStartLon(orderCrossCityWarpperPushOrder.getStartLon()); + orderCrossCity.setStartLat(orderCrossCityWarpperPushOrder.getStartLat()); + String startAddress = orderCrossCityWarpperPushOrder.getStartAddress(); + startAddress = startAddress.replaceAll("& #40;", "("); + startAddress = startAddress.replaceAll("& #41;", ")"); + orderCrossCity.setStartAddress(startAddress); + orderCrossCity.setEndLon(orderCrossCityWarpperPushOrder.getEndLon()); + orderCrossCity.setEndLat(orderCrossCityWarpperPushOrder.getEndLat()); + String endAddress = orderCrossCityWarpperPushOrder.getEndAddress(); + endAddress = endAddress.replaceAll("& #40;", "("); + endAddress = endAddress.replaceAll("& #41;", ")"); + orderCrossCity.setEndAddress(endAddress); + orderCrossCity.setMileage(0D); + ResultUtil<Map<String, Object>> price = this.getPrice(orderCrossCityWarpperPushOrder.getDistance(), orderCrossCityWarpperPushOrder.getPeopleNumber(), orderCrossCityWarpperPushOrder.getTravelMode(), orderCrossCityWarpperPushOrder.getLineId(), + orderCrossCityWarpperPushOrder.getServerCarModelId(), orderCrossCityWarpperPushOrder.getTotalSeat(), orderCrossCityWarpperPushOrder.getSeatNumber()); + Double money = Double.valueOf(price.getData().get("price").toString()); + orderCrossCity.setOrderMoney(money); +// Integer companyId = driver.getCompanyId(); +// orderCrossCity.setCompanyId(companyId); + UserInfo userInfo = userInfoService.selectById(uid); + orderCrossCity.setPassengers(userInfo.getNickName()); + orderCrossCity.setPassengersPhone(userInfo.getPhone()); + orderCrossCity.setPeopleNumber(orderCrossCityWarpperPushOrder.getPeopleNumber()); + orderCrossCity.setSeatNumber(orderCrossCityWarpperPushOrder.getSeatNumber()); + List<OrderCrossCity> orderCrossCities = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderCrossCity.getOrderNum()).eq("isDelete", 1)); + orderCrossCity.setSort(orderCrossCities.size() + 1); + orderCrossCity.setState(7);//待支付 + orderCrossCity.setInsertTime(new Date()); + orderCrossCity.setTravelTime(orderCrossCityWarpperPushOrder.getTravelTime()); + orderCrossCity.setSnatchOrderTime(new Date()); + orderCrossCity.setTravelMode(orderCrossCityWarpperPushOrder.getTravelMode()); + orderCrossCity.setOrderSource(orderCrossCityWarpperPushOrder.getOrderSource()); + orderCrossCity.setIsDelete(1); + orderCrossCity.setRemark(orderCrossCityWarpperPushOrder.getRemark()); + orderCrossCity.setIsReassign(1); + //调用高德创建轨迹 +// String s = gdFalconUtil.selectTerminal(driver.getPhone()); +// String track = gdFalconUtil.createTrack(s); +// orderCrossCity.setTrackId(track); +// if (orderCrossCity.getTravelMode() == 2) {//包车 +// orderCrossCity.setSeatNumber(lineShiftDriver.getLaveSeatNumber()); +// orderCrossCity.setPeopleNumber(lineShiftDriver.getLaveSeat()); +// } + + //调用移动的小号接口 + Map<String, String> geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); + Region region = regionMapper.query(geocode.get("districtCode")); +// Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1))); +// if (String.valueOf(map.get("code")).equals("200")) { +// orderCrossCity.setTelX(map.get("telX")); +// orderCrossCity.setBindId(map.get("bindId")); +// } + this.insert(orderCrossCity); + +// if (driver.getState() == 2) { +// driver.setState(3); +// driverService.updateById(driver); +// } + +// //修改预约班次的数据 +// if (orderCrossCity.getTravelMode() == 2) {//包车 +// lineShiftDriver.setLaveSeat(0); +// lineShiftDriver.setLaveSeatNumber(""); +// } else {//拼车 +// lineShiftDriver.setLaveSeat((lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber()) < 0 ? 0 : lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber()); +// String[] split = orderCrossCity.getSeatNumber().split(","); +// String[] split1 = lineShiftDriver.getLaveSeatNumber().split(","); +// String seatNumber = ""; +// //先判断选中座位号和剩余座位号是否匹配 +// for (String spl : split) { +// boolean b = true; +// for (String sp : split1) { +// if (ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)) { +// b = false; +// break; +// } +// } +// if (b) { +// throw new SystemException("您选中的" + spl + "号座位已被占用,请选择其他座位!"); +// } +// } +// for (String sp : split1) { +// boolean b = true; +// for (String spl : split) { +// if (ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)) { +// b = false; +// break; +// } +// } +// if (b && ToolUtil.isNotEmpty(sp)) { +// seatNumber += (sp + ","); +// } +// } +// lineShiftDriver.setLaveSeatNumber((ToolUtil.isNotEmpty(seatNumber) && seatNumber.length() > 0) ? +// seatNumber.substring(0, seatNumber.length() - 1) : ""); +// } +// lineShiftDriverMapper.updateById(lineShiftDriver); + + //添加消息 + systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功!", orderCrossCity.getUserId(), 1); + + BaseWarpper baseWarpper = new BaseWarpper(); + baseWarpper.setId(orderCrossCity.getId()); + + //创建定时任务,取消订单30分钟 + TimerTask timerTask = new TimerTask() { + @Override + public void run() { + OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId()); + if(orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null){ + orderCrossCity1.setState(10); + orderCrossCityMapper.updateById(orderCrossCity1); + + OrderCancel orderCancel = new OrderCancel(); + orderCancel.setOrderId(orderCrossCity.getId()); + orderCancel.setOrderType(3); + orderCancel.setReason("用户未及时付款,系统自动取消订单"); + orderCancel.setRemark("用户未及时付款,系统自动取消订单"); + orderCancel.setState(2); + orderCancel.setInsertTime(new Date()); + orderCancel.setUserType(2); + orderCancelService.insert(orderCancel); + +// //修改司机座位 +// LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId()); +// lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber()); +// lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber()); +// lineShiftDriverMapper.updateById(lineShiftDriver); +// +// //修改司机为空闲 +// List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11); +// if(orderCrossCities.size() == 0){ +// Driver driver = driverService.selectById(orderCrossCity.getDriverId()); +// driver.setState(2); +// driverService.updateById(driver); +// } + } + } + }; + Timer timer = new Timer(); + timer.schedule(timerTask, 30 * 60 * 1000); + + return ResultUtil.success(baseWarpper); + } /** * 获取订单 @@ -1863,4 +2507,87 @@ } } + + + /** + * 推送跨城抢单数据 + * @param orderCrossCity + * @throws Exception + */ + public void pushCrossCityOrder(OrderCrossCity orderCrossCity) throws Exception{ + new Thread(new Runnable() { + @Override + public void run() { + try { + crossCityOrderIds.add(orderCrossCity.getId());//添加记录,防止调用接口重复提醒无人接单 + String vehicle = redisUtil.getValue("VEHICLE"); + List<Integer> integers = new ArrayList<>(); + if(ToolUtil.isNotEmpty(vehicle)){ + integers = JSON.parseArray(vehicle).toJavaList(Integer.class); + } + Company query = companyCityService.query(String.valueOf(orderCrossCity.getStartLon()), String.valueOf(orderCrossCity.getStartLat()));//获取起点所属分公司 +// List<PushOrder> querys = pushOrderService.querys(null, 1, query.getId());//获取需要推送的次数 + for(int i = 1; i <= 3; i++){ + PushOrder pushOrder = pushOrderService.querys(i, 1, query.getId()).get(0); + //获取空闲司机 +// List<Driver> list = driverService.queryIdleDriver(1, orderCrossCity.getServerCarModelId(), orderCrossCity.getStartLon(), orderCrossCity.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机 + //获取同线路的同车型的跨城司机 + List<Driver> list = driverService.queryDriversByLineAndCarModel(orderCrossCity.getServerCarModelId(), orderCrossCity.getLineId()); + if(list.size() > 0){ + double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数 + int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取) + list = list.subList(0, lastIndex);//获取空闲司机中占比数据 + for(Driver driver : list){//开始进行推送 + boolean bo = false; + for(Integer integer : integers){ + if(integer.compareTo(driver.getId()) == 0){ + bo = true; + break; + } + } + if(bo){ + continue; + } + pushUtil.pushOrderState(2, driver.getId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), pushOrder.getPushTime()); + } + } + Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间 + Integer state = orderCrossCityMapper.selectById(orderCrossCity.getId()).getState(); + if(state > 1){ + break; + } +// if(i == querys.size() && state == 1){ + if(i == 3 && state == 1){ + pushUtil.pushEndPush(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 1); + orderIds.remove(orderCrossCity.getId()); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }).start(); + } + +// /** +// * 下单后继续等待 +// * @param id +// * @return +// * @throws Exception +// */ +// @Override +// public ResultUtil pushOrderCrossCity(Integer id) throws Exception { +// OrderCrossCity orderCrossCity = this.selectById(id); +// if(null == orderCrossCity){ +// return ResultUtil.error("推送订单失败,订单信息有误"); +// } +// if(orderCrossCity.getState() != 1){ +// return ResultUtil.error("订单已被司机接单,不能重复推送"); +// } +// +// +// this.pushCrossCityOrder(orderCrossCity); +// +// return ResultUtil.success(); +// } } diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityWarpperPushOrder.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityWarpperPushOrder.java new file mode 100644 index 0000000..b7703a0 --- /dev/null +++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityWarpperPushOrder.java @@ -0,0 +1,230 @@ +package com.stylefeng.guns.modular.crossCity.warpper; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.Date; + +@ApiModel("跨城订单") +public class OrderCrossCityWarpperPushOrder { + @ApiModelProperty(value = "服务车型id", required = true, dataType = "int") + private Integer serverCarModelId; + @ApiModelProperty(value = "司机预约排班id", required = false, dataType = "int") + private Integer lineShiftDriverId; + @ApiModelProperty(value = "司机id", required = false, dataType = "int") + private Integer driverId; + @ApiModelProperty(value = "线路id", required = true, dataType = "int") + private Integer lineId; + @ApiModelProperty(value = "车辆id", required = false, dataType = "int") + private Integer carId; + @ApiModelProperty(value = "下单地点经度", required = true, dataType = "double") + private Double placementLon; + @ApiModelProperty(value = "下单地点纬度", required = true, dataType = "double") + private Double placementLat; + @ApiModelProperty(value = "下单详细地址", required = true, dataType = "string") + private String placementAddress; + @ApiModelProperty(value = "起点经度", required = true, dataType = "double") + private Double startLon; + @ApiModelProperty(value = "起点纬度", required = true, dataType = "double") + private Double startLat; + @ApiModelProperty(value = "起点", required = true, dataType = "string") + private String startAddress; + @ApiModelProperty(value = "终点经度", required = true, dataType = "double") + private Double endLon; + @ApiModelProperty(value = "终点纬度", required = true, dataType = "double") + private Double endLat; + @ApiModelProperty(value = "终点详细地址", required = true, dataType = "string") + private String endAddress; + @ApiModelProperty(value = "出行时间(2020-09-04 12:00:00)", required = true, dataType = "string") + private Date travelTime; + @ApiModelProperty(value = "出行方式(1=拼车,2=包车)", required = true, dataType = "int") + private Integer travelMode; + @ApiModelProperty(value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)", required = true, dataType = "int") + private Integer orderSource; + @ApiModelProperty(value = "出行人数", required = true, dataType = "int") + private Integer peopleNumber; + @ApiModelProperty(value = "车辆总座位数", required = true, dataType = "int") + private Integer totalSeat; + @ApiModelProperty(value = "座位编号(1,3,4)", required = true, dataType = "string") + private String seatNumber; + @ApiModelProperty(value = "备注", required = false, dataType = "string") + private String remark; + @ApiModelProperty(value = "行驶里程数", required = true, dataType = "double") + private Double distance; + + public Integer getServerCarModelId() { + return serverCarModelId; + } + + public void setServerCarModelId(Integer serverCarModelId) { + this.serverCarModelId = serverCarModelId; + } + + public Integer getLineShiftDriverId() { + return lineShiftDriverId; + } + + public void setLineShiftDriverId(Integer lineShiftDriverId) { + this.lineShiftDriverId = lineShiftDriverId; + } + + public Integer getDriverId() { + return driverId; + } + + public void setDriverId(Integer driverId) { + this.driverId = driverId; + } + + public Integer getLineId() { + return lineId; + } + + public void setLineId(Integer lineId) { + this.lineId = lineId; + } + + public Integer getCarId() { + return carId; + } + + public void setCarId(Integer carId) { + this.carId = carId; + } + + public Double getPlacementLon() { + return placementLon; + } + + public void setPlacementLon(Double placementLon) { + this.placementLon = placementLon; + } + + public Double getPlacementLat() { + return placementLat; + } + + public void setPlacementLat(Double placementLat) { + this.placementLat = placementLat; + } + + public String getPlacementAddress() { + return placementAddress; + } + + public void setPlacementAddress(String placementAddress) { + this.placementAddress = placementAddress; + } + + public Double getStartLon() { + return startLon; + } + + public void setStartLon(Double startLon) { + this.startLon = startLon; + } + + public Double getStartLat() { + return startLat; + } + + public void setStartLat(Double startLat) { + this.startLat = startLat; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public Double getEndLon() { + return endLon; + } + + public void setEndLon(Double endLon) { + this.endLon = endLon; + } + + public Double getEndLat() { + return endLat; + } + + public void setEndLat(Double endLat) { + this.endLat = endLat; + } + + public String getEndAddress() { + return endAddress; + } + + public void setEndAddress(String endAddress) { + this.endAddress = endAddress; + } + + public Date getTravelTime() { + return travelTime; + } + + public void setTravelTime(Date travelTime) { + this.travelTime = travelTime; + } + + public Integer getTravelMode() { + return travelMode; + } + + public void setTravelMode(Integer travelMode) { + this.travelMode = travelMode; + } + + public Integer getOrderSource() { + return orderSource; + } + + public void setOrderSource(Integer orderSource) { + this.orderSource = orderSource; + } + + public Integer getTotalSeat() { + return totalSeat; + } + + public void setTotalSeat(Integer totalSeat) { + this.totalSeat = totalSeat; + } + + public Integer getPeopleNumber() { + return peopleNumber; + } + + public void setPeopleNumber(Integer peopleNumber) { + this.peopleNumber = peopleNumber; + } + + public String getSeatNumber() { + return seatNumber; + } + + public void setSeatNumber(String seatNumber) { + this.seatNumber = seatNumber; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Double getDistance() { + return distance; + } + + public void setDistance(Double distance) { + this.distance = distance; + } +} diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java index 27592b2..a9b7680 100644 --- a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java +++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java @@ -40,4 +40,13 @@ Map<String, Object> queryDriverInfo(@Param("id") Integer id); + + /** + * 跨城获取给定车型且相同线路的司机 + * @param serverCarModelId + * @param lineId + * @return + * @throws Exception + */ + List<Driver> queryDriversByLineAndCarModel (@Param("serverCarModelId") Integer serverCarModelId, @Param("lineId") Integer lineId ); } diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java index 96acd4e..f27e6e1 100644 --- a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java +++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java @@ -62,4 +62,13 @@ * @throws Exception */ List<BaseWarpper> queryBusiness(Integer uid) throws Exception; + + /** + * 跨城获取给定车型且相同线路的司机 + * @param serverCarModelId + * @param lineId + * @return + * @throws Exception + */ + List<Driver> queryDriversByLineAndCarModel (Integer serverCarModelId, Integer lineId ) throws Exception; } diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java index 5a77d5b..6fcee03 100644 --- a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java +++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java @@ -194,4 +194,10 @@ } return maps; } + + @Override + public List<Driver> queryDriversByLineAndCarModel(Integer serverCarModelId, Integer lineId) throws Exception { + List<Driver> drivers = driverMapper.queryDriversByLineAndCarModel(serverCarModelId, lineId); + return drivers; + } } -- Gitblit v1.7.1