From 6c0d8fb2db64b8982c4162c7527e72841547110b Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 27 十二月 2024 15:28:50 +0800 Subject: [PATCH] 修改推单规则 --- UserAHTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 293 ++++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 192 insertions(+), 101 deletions(-) diff --git a/UserAHTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserAHTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java index b54f179..3cc8479 100644 --- a/UserAHTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java +++ b/UserAHTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java @@ -41,6 +41,7 @@ import java.math.MathContext; import java.math.RoundingMode; import java.util.*; +import java.util.stream.Collectors; @Service @@ -78,6 +79,9 @@ @Autowired private IDriverService driverService; + + @Resource + private DriverMapper driverMapper; @Autowired private IDriverServiceService driverServiceService; @@ -164,6 +168,15 @@ @Value("${pushMinistryOfTransport}") private boolean pushMinistryOfTransport; + + @Autowired + private IOrderCrossCityService crossCityService; + + @Autowired + private GeodesyUtil geodesyUtil; + + @Autowired + private IOrderEvaluateService orderEvaluateService; @@ -326,7 +339,8 @@ //推单操作 if(orderPrivateCar.getState() == 1){ - this.pushOrder(orderPrivateCar); + Integer id = orderPrivateCar.getId(); + redisUtil.addListRight("push_order_ids", id.toString()); } //添加消息 @@ -482,7 +496,8 @@ //推单操作 if(orderPrivateCar.getState() == 1){ - this.pushOrder(orderPrivateCar); + Integer id = orderPrivateCar.getId(); + redisUtil.addListRight("push_order_ids", id.toString()); } //添加消息 @@ -508,36 +523,8 @@ if(orderPrivateCar.getState() != 1){ return ResultUtil.error("订单已被司机接单,不能重复推送"); } - //处理摆渡订单的继续推单操作 - if(orderPrivateCar.getType() == 2){ - OrderCrossCityServiceImpl.pushEndMap.put(orderPrivateCar.getCrossCityOrderId(), false);//还原标识数据 - List<OrderPrivateCar> list = this.selectList(new EntityWrapper<OrderPrivateCar>().eq("type", 2).eq("crossCityOrderId", orderPrivateCar.getCrossCityOrderId()).eq("place", orderPrivateCar.getPlace())); - List<Map<String, Integer>> orders = new ArrayList<>(); - for(OrderPrivateCar orderPrivateCar1 : list){ - if(orderPrivateCar1.getState() != 1){ - return ResultUtil.error("订单已被司机接单,推单取消"); - } - Map<String, Integer> map = new HashMap<>(); - map.put("orderType", 1); - map.put("orderId", orderPrivateCar1.getId()); - orders.add(map); - } -// List<OrderTaxi> list1 = orderTaxiService.selectList(new EntityWrapper<OrderTaxi>().eq("type", 2).eq("crossCityOrderId", orderPrivateCar.getCrossCityOrderId()).eq("place", orderPrivateCar.getPlace())); -// for(OrderTaxi orderTaxi : list1){ -// if(orderTaxi.getState() != 1){ -// return ResultUtil.error("订单已被司机接单,推单取消"); -// } -// Map<String, Integer> map = new HashMap<>(); -// map.put("orderType", 2); -// map.put("orderId", orderTaxi.getId()); -// orders.add(map); -// } - //开始重新推单 - orderCrossCityService.pushOrder(orders); - - }else{ - this.pushOrder(orderPrivateCar); - } + //继续将订单添加到推送列表中 + redisUtil.addListLeft("push_order_ids", id.toString()); return ResultUtil.success(); } @@ -550,7 +537,7 @@ double amount = 0; CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId()); if(null != orderPrivateCar.getDriverId() && - (orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况 + (orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < System.currentTimeMillis()){//收费的情况 if(null != query){ amount += query.getMoney(); } @@ -830,6 +817,103 @@ } }).start(); } + + + /** + * 推送抢单数据 + * @throws Exception + */ + public boolean pushOrder1(Integer id){ + try { + OrderPrivateCar orderPrivateCar = this.selectById(id); + if(1 != orderPrivateCar.getState()){ + return true; + } + long time = System.currentTimeMillis() - orderPrivateCar.getInsertTime().getTime(); + Company query = companyCityService.query(String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司 + List<PushOrder> querys = pushOrderService.querys(null, 1, query.getId());//获取需要推送的次数 + long pushTime = 0; + if(null != querys && querys.size() > 0){ + pushTime = querys.stream().mapToInt(PushOrder::getPushTime).sum() * 1000; + } + if(time >= pushTime){ + pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1); + return true; + } + + List<Driver> drivers = driverMapper.queryIdleDriver_(1, orderPrivateCar.getServerCarModelId(), query.getId()); + drivers = drivers.stream().filter(s->s.getBalance() > -100).collect(Collectors.toList()); + System.err.println("当前获取的司机:"+ JSON.toJSONString(drivers)); + + //找出距离最近且评分最高的司机 + Double dis = 100000D; + Double pf = -1d; + Driver driver1 = null; + for(Driver driver : drivers){ + List<OrderCrossCity> orderCrossCities = crossCityService.selectList(new EntityWrapper<OrderCrossCity>().eq("state", 2).eq("driverId", driver.getId())); + if (orderCrossCities!=null&& !orderCrossCities.isEmpty()){ + continue; + } + String value = redisUtil.getValue("DRIVER" + driver.getId()); + System.err.println("------" + value); + if(null != value){ + Map<String, Double> distance1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value); + double d = Double.valueOf(distance1.get("WGS84")).doubleValue(); + List<OrderEvaluate> evaluates = orderEvaluateService.selectList(new EntityWrapper<OrderEvaluate>().eq("driverId", driver.getId())); + double fraction = evaluates.stream().mapToDouble(OrderEvaluate::getFraction).sum(); + if(fraction > 0){ + fraction = fraction / evaluates.size(); + } + if(dis > d){ + dis = d; + pf = fraction; + driver1 = driver; + }else if(dis == d){ + if(fraction > pf){ + dis = d; + pf = fraction; + driver1 = driver; + } + } + } + } + System.err.println("------" + JSON.toJSONString(driver1)); + if(null != driver1){ + 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.setState(2); + orderPrivateCar.setSnatchOrderTime(new Date()); + orderPrivateCarMapper.updateById(orderPrivateCar); + //修改司机状态 + //如果是预约单,则不修改司机为服务中 + if(orderPrivateCar.getOrderType() != 2 || (orderPrivateCar.getOrderType() == 2 && orderPrivateCar.getTravelTime().getTime() < System.currentTimeMillis() + 600000)){ + //修改司机为服务中 + driver1.setState(3); + driverService.updateById(driver1); + } + new Thread(new Runnable() { + @Override + public void run() { + pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0); + pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0); + if(orderPrivateCar.getType() == 2){ + pushUtil.pushFerryOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 2); + } + } + }).start(); + + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + + @Override public synchronized String getOrderNum() throws Exception{ @@ -950,34 +1034,6 @@ resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi"); paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, "", 1);//添加预支付数据 } - - -// 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 + ",1", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId); -// if(map.get("code").equals("200")){ -// paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据 -// resultUtil = ResultUtil.success(map.get("data")); -// }else{ -// resultUtil = ResultUtil.error(map.get("msg"), ""); -// } -// } -// if(payType == 2) {//支付宝支付 -// Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",1", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null); -// if (map.get("code").equals("200")) { -// paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 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("余额不足,无法完成支付"); @@ -1010,21 +1066,35 @@ //添加已收入明细 Company company = companyService.selectById(orderPrivateCar.getCompanyId()); - Double speMoney = company.getSpeMoney(); BigDecimal d = null;//企业收入 BigDecimal c = null;//司机收入 - if(company.getIsSpeFixedOrProportional() == 2){//固定 - d = new BigDecimal(speMoney); - c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机 - } - if(company.getIsSpeFixedOrProportional() == 1){//比例 - Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney(); - d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN); - c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + Driver driver = driverService.selectById(orderPrivateCar.getDriverId()); + Double speMoney = driver.getSpecialCarCommission(); + if(null == speMoney){ + speMoney = company.getSpeMoney(); + if(company.getIsSpeFixedOrProportional() == 2){//固定 + d = new BigDecimal(speMoney); + c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + } + if(company.getIsSpeFixedOrProportional() == 1){//比例 + Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney(); + d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN); + c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + } + }else{ + if(driver.getSpecialCarCommissionType() == 2){//固定 + d = new BigDecimal(speMoney); + c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + } + if(driver.getSpecialCarCommissionType() == 1){//比例 + Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney(); + d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN); + c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + } } incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue()); incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue()); - Driver driver = driverService.selectById(orderPrivateCar.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()); @@ -1224,21 +1294,37 @@ //添加已收入明细 Company company = companyService.selectById(orderPrivateCar.getCompanyId()); - Double taxi = company.getSpeMoney(); BigDecimal d = null;//企业收入 BigDecimal c = null;//司机收入 - if(company.getIsSpeFixedOrProportional() == 2){//固定 - d = new BigDecimal(taxi); - c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + Driver driver = driverService.selectById(orderPrivateCar.getDriverId()); + Double taxi = driver.getSpecialCarCommission(); + if(null == taxi){ + taxi = company.getSpeMoney(); + if(company.getIsSpeFixedOrProportional() == 2){//固定 + d = new BigDecimal(taxi); + c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + } + if(company.getIsSpeFixedOrProportional() == 1){//比例 + Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney(); + d = new BigDecimal(price).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN); + c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + } + }else{ + if(driver.getSpecialCarCommissionType() == 2){//固定 + d = new BigDecimal(taxi); + c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + } + if(driver.getSpecialCarCommissionType() == 1){//比例 + Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney(); + d = new BigDecimal(price).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN); + c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); + } } - if(company.getIsSpeFixedOrProportional() == 1){//比例 - Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney(); - d = new BigDecimal(price).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN); - c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN); - } + + incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue()); incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue()); - Driver driver = driverService.selectById(orderPrivateCar.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()); @@ -1331,28 +1417,33 @@ @Override public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception { OrderPrivateCar orderPrivateCar = this.selectById(orderId); - //计算预计距离和剩余时间 - String value = redisUtil.getValue("DRIVER" + String.valueOf(orderPrivateCar.getDriverId())); - if(null == value || "".equals(value)){ - System.err.println("司机没有上传位置信息"); - - //调用获取轨迹中的数据 - List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 2); - if(list.size() > 0){ - Map<String, Object> map = list.get(list.size() - 1); - value = map.get("lon") + "," + map.get("lat"); - } - - } - Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), 1); + String value = null; String d = "0"; String t = "0"; - if(null == distance){ - System.err.println("查询距离出错了"); - }else{ - d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString(); - t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + ""; + if(null != orderPrivateCar.getDriverId()){ + //计算预计距离和剩余时间 + value = redisUtil.getValue("DRIVER" + orderPrivateCar.getDriverId()); + if(null == value || "".equals(value)){ + System.err.println("司机没有上传位置信息"); + + //调用获取轨迹中的数据 + List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 2); + if(list.size() > 0){ + Map<String, Object> map = list.get(list.size() - 1); + value = map.get("lon") + "," + map.get("lat"); + } + + } + Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), 1); + + if(null == distance){ + System.err.println("查询距离出错了"); + }else{ + d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString(); + t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + ""; + } } + OrderServerWarpper orderServerWarpper = new OrderServerWarpper(); orderServerWarpper.setOrderId(orderPrivateCar.getId()); orderServerWarpper.setOrderType(1); @@ -1369,7 +1460,7 @@ orderServerWarpper.setLaveTime("0"); } if(orderPrivateCar.getState() == 5 || orderPrivateCar.getState() == 6){//服务中 - distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), 1); + Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), 1); if(null == distance){ System.err.println("查询距离出错了"); }else{ -- Gitblit v1.7.1