From 30f124fbe2c638eecda3d74c6dde053af5d574f0 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期六, 11 十月 2025 14:26:17 +0800 Subject: [PATCH] 提交代码 --- user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java | 349 ++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 205 insertions(+), 144 deletions(-) diff --git a/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java b/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java index c66740c..57069a5 100644 --- a/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java +++ b/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java @@ -15,10 +15,11 @@ import com.supersavedriving.user.modular.system.util.MallBook.model.*; import com.supersavedriving.user.modular.system.util.MallBook.util.Transfer; import com.supersavedriving.user.modular.system.util.MallBook.util.TrhRequest; -import com.supersavedriving.user.modular.system.util.juhe.WeatherUtil; import com.supersavedriving.user.modular.system.util.mongodb.model.Location; +import com.supersavedriving.user.modular.system.util.qianyuntong.OrderUtil; +import com.supersavedriving.user.modular.system.util.qianyuntong.model.*; import com.supersavedriving.user.modular.system.warpper.*; -import io.swagger.models.auth.In; +import org.redisson.api.RedissonClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -35,12 +36,13 @@ import javax.annotation.Resource; import java.math.BigDecimal; -import java.math.MathContext; import java.math.RoundingMode; -import java.net.InetAddress; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -79,6 +81,9 @@ private RedisUtil redisUtil; @Autowired + private RedissonClient redissonClient; + + @Autowired private MongoTemplate mongoTemplate; @Autowired @@ -101,12 +106,6 @@ @Autowired private IRevenueService revenueService; - - @Autowired - private IAgentService agentService; - - @Autowired - private IPlatformRechargeRecordService platformRechargeRecordService; @Autowired private IDivisionRecordService divisionRecordService; @@ -433,10 +432,6 @@ */ @Override public ResultUtil travelOrder(Integer uid, TravelOrder travelOrder) throws Exception { - boolean lock = redisUtil.lock(uid + "_travelOrder"); - if(!lock){ - return ResultUtil.error("系统繁忙,请稍后重试"); - } try { List<Integer> state = Arrays.asList(101, 102, 103, 104, 105, 106, 107, 201, 401); Order order = this.selectOne(new EntityWrapper<Order>().eq("userId", uid).eq("status", 1).in("state", state)); @@ -523,30 +518,54 @@ appUserService.updateById(appUser); } + + List<Order> orderList = new ArrayList<>(); for (Integer i = 0; i < travelOrder.getDriverNum(); i++) { order.setId(null); order.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(5)); boolean insert = this.insert(order); + if(null != order.getDriverId()){ + Driver driver = driverService.selectById(order.getDriverId()); + BranchOffice branchOffice = branchOfficeService.selectById(order.getBranchOfficeId()); + //调三方订单中心创建行程单 + CreateTravelItineraryRequest request = new CreateTravelItineraryRequest(); + request.setOrderNo("DJ" + order.getId()); + request.setCustomerId(appUser.getOnconUUID()); + request.setDriverId(driver.getEmpId().toString()); + request.setSupplierShopId(branchOffice.getEnterCode()); + request.setServiceType(2); + String travelItinerary = OrderUtil.createTravelItinerary(request); + order.setTravelId(travelItinerary); + this.insertOrUpdate(order); + } + if(insert){ - //推送状态 - pushUtil.pushOrderStatus(uid, 1, order.getId(), order.getState()); - if(null != order.getDriverId()){ - PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper(); - pushOrderInfoWarpper.setId(order.getId()); - pushOrderInfoWarpper.setState(order.getState()); - pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper); - }else{ - //推单 - pushOrder(order.getId()); - } + orderList.add(order); } } + new Thread(new Runnable() { + @Override + public void run() { + orderList.forEach(order -> { + //推送状态 + pushUtil.pushOrderStatus(uid, 1, order.getId(), order.getState()); + if(null != order.getDriverId()){ + PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper(); + pushOrderInfoWarpper.setId(order.getId()); + pushOrderInfoWarpper.setState(order.getState()); + pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper); + }else{ + //推单 + pushOrder(order.getId(), uid); + } + }); + } + }).start(); + redisUtil.setStrValue("newOrder", "true"); return ResultUtil.success(order.getId()); }catch (Exception e){ e.printStackTrace(); - }finally { - redisUtil.unlock(uid + "_travelOrder"); } return ResultUtil.error("系统异常"); } @@ -557,7 +576,9 @@ /** * 订单推送逻辑 */ - public void pushOrder(Long orderId){ + public void pushOrder(Long orderId, Integer uid){ + System.err.println("开始推单:" + orderId); +// RLock lock1 = redissonClient.getLock("pushOrder:" + uid); try { Order order = this.selectById(orderId); /** @@ -567,28 +588,14 @@ * 合适司:积分 > 评分 > 距离 * 3.司机没有接单直接将订单置入大厅 */ - boolean lock = redisUtil.lock(5); - if(!lock){ - int num1 = 1; - while (num1 <= 10){ - Thread.sleep(3000);//等待3秒 - lock = redisUtil.lock(5); - if(lock){ - break; - }else{ - num1++; - } - } - } - if(!lock){ - order.setHallOrder(1); - this.updateById(order); - ExtraPushOrder(order); - redisUtil.unlock(); - } +// boolean lock2 = lock1.tryLock(5, 10, TimeUnit.SECONDS); +// if(!lock2){ +// order.setHallOrder(1); +// this.updateById(order); +// ExtraPushOrder(order); +// } SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 1)); if(null == systemConfig){ - redisUtil.unlock(); return; } JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); @@ -735,6 +742,7 @@ } if(null != driver){ + System.err.println("完成司机查找:" + driver); //防止多笔订单推给一个司机 Driver driver1 = driverService.selectById(driver); driver1.setServerStatus(2); @@ -776,10 +784,10 @@ ExtraPushOrder(order); redisUtil.setStrValue("lobbyOrder", "true"); } - redisUtil.unlock(); }catch (Exception e){ e.printStackTrace(); - redisUtil.unlock(); + }finally { +// lock1.unlock(); } } @@ -847,13 +855,25 @@ order.setState(301); this.updateById(order); redisUtil.delSetValue("orderService", order.getId().toString()); + + Driver driver = driverService.selectById(order.getDriverId()); + if(null != order.getTravelId()){ + //中台修改订单状态 + ModifyTravelItineraryRequest request = new ModifyTravelItineraryRequest(); + request.setOrderId(order.getTravelId()); + request.setStatus(getState(order.getState())); + BranchOffice branchOffice = branchOfficeService.selectById(order.getBranchOfficeId()); + request.setDriverId(driver.getEmpId().toString()); + request.setSupplierShopId(branchOffice.getEnterCode()); + OrderUtil.modifyTravelItinerary(request); + } + AppUser appUser = appUserService.selectById(uid); appUser.setCancelCount(appUser.getCancelCount() + 1); if(appUser.getCancelCount() >= 3){ appUser.setIsException(2); } appUserService.updateById(appUser); - Driver driver = driverService.selectById(order.getDriverId()); if(null != driver){ driver.setServerStatus(1); driverService.updateById(driver); @@ -869,6 +889,36 @@ } redisUtil.setStrValue("cancelOrder", "true"); return ResultUtil.success(); + } + + + + private Integer getState(Integer state){ + switch (state){ + case 101://待接单 + return 1; + case 102://已接单 + return 2; + case 103://前往预约点 + return 3; + case 104://到达预约点 + return 4; + case 105://开始服务 + return 5; + case 106://到达目的地 + return 6; + case 107://待支付 + return 7; + case 108://待评价 + return 8; + case 109://已完成 + return 9; + case 201://转单中 + return 11; + case 301://已取消 + return 10; + } + return null; } @@ -1105,16 +1155,16 @@ } //开始支付操作 if(orderPayment.getPayType() == 1){//微信支付 - return weixinPay(order, appUser, orderPayment.getCouponId()); + return weixinPay(order, appUser, orderPayment.getCouponId(), orderPayment.getPath(), orderPayment.getIp()); } if(orderPayment.getPayType() == 2){//余额支付 return balancePayment(order, appUser, orderPayment.getCouponId()); } // if(orderPayment.getPayType() == 3){//线下支付(由司机端操作) // } - if(orderPayment.getPayType() == 4){//微信+余额 - return weixinAndBalancePayment(order, appUser, orderPayment.getCouponId()); - } +// if(orderPayment.getPayType() == 4){//微信+余额 +// return weixinAndBalancePayment(order, appUser, orderPayment.getCouponId()); +// } return ResultUtil.success(); } @@ -1128,100 +1178,100 @@ * @return * @throws Exception */ - public ResultUtil weixinPay(Order order, AppUser appUser, Integer couponId) throws Exception{ + public ResultUtil weixinPay(Order order, AppUser appUser, Integer couponId, String path, String ip) throws Exception{ Double payMoney = order.getPayMoney(); order.setPayType(1); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); - String out_trade_no = sdf.format(new Date()) + order.getId(); + ResultUtil resultUtil = ResultUtil.success(new Object()); + Driver driver = driverService.selectById(order.getDriverId()); + if(null == order.getIsCreated() || 0 == order.getIsCreated()){ + //调用中台创建订单及拉起支付接口 + TradeOrderCreateData tradeOrderCreateData = new TradeOrderCreateData(); + tradeOrderCreateData.setTreatShopId(driver.getEmpId().toString()); + tradeOrderCreateData.setField1("{\"profitSharing\":\"1\",\"isCompensate\":\"0\",\"isPromote\":\"0\"}"); + tradeOrderCreateData.setCharge(new BigDecimal(payMoney).setScale(2, RoundingMode.HALF_EVEN)); + tradeOrderCreateData.setOrderNo("DJ" + order.getId()); + tradeOrderCreateData.setCustomerId(appUser.getOnconUUID()); + tradeOrderCreateData.setPartnerPayId(order.getTravelId()); + tradeOrderCreateData.setTotalFee(Double.valueOf(payMoney * 100).intValue() + ""); + tradeOrderCreateData.setOrderDesc("完成订单"); + tradeOrderCreateData.setRetUrl(path); + tradeOrderCreateData.setClientIp(ip); + tradeOrderCreateData.setServiceType(3); -// -// PaymentOrder paymentOrder = new PaymentOrder(); -// paymentOrder.setBizOrderId(out_trade_no); -// paymentOrder.setAmount(new BigDecimal(payMoney).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + ""); -// paymentOrder.setOrderName("代驾服务费"); -// paymentOrder.setPayType("WX_MINI"); -// paymentOrder.setTransferType("0"); -// paymentOrder.setAsynSplitFlag("1"); -// paymentOrder.setAppid(appletsAppid); -// paymentOrder.setOpenid(appUser.getOpenid()); -// paymentOrder.setTerminalIp(InetAddress.getLocalHost().getHostAddress()); -// List<PaymentOrderGood> goodsDetail = new ArrayList<>(); -// PaymentOrderGood paymentOrderGood = new PaymentOrderGood(); -// paymentOrderGood.setGoodsName("服务费"); -// goodsDetail.add(paymentOrderGood); -// paymentOrder.setGoodsDetail(goodsDetail); -// paymentOrder.setFrontUrl(callbackPath + "/base/order/orderPayCallback"); -// paymentOrder.setNotifyUrl(callbackPath + "/base/order/orderPayCallback"); -// paymentOrder.setParameter1(order.getId().toString()); -// -// TrhRequest<PaymentOrder> request = new TrhRequest(); -// InterfaceResponse execute = request.execute(paymentOrder, PaymentOrder.SERVICE_CODE); - return MiniAppPay.pay(appUser.getOpenid(),new BigDecimal(payMoney).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "","/base/order/orderPayCallback",order.getCode()); -// return payMoneyUtil.weixinpay("服务费", String.valueOf(order.getId()),out_trade_no,new BigDecimal(payMoney).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "","/base/order/orderPayCallback","APP"); + List<GoodsInfoRequest> goodsInfo = new ArrayList<>(); + GoodsInfoRequest goodsInfoRequest = new GoodsInfoRequest(); + goodsInfoRequest.setSubOpenId(appUser.getOpenid()); + goodsInfoRequest.setProfitSharing("1"); + goodsInfo.add(goodsInfoRequest); + tradeOrderCreateData.setGoodsInfo(goodsInfo); + TradeOrderCreate tradeOrderCreate = OrderUtil.tradeOrderCreate1(tradeOrderCreateData, 0); + PayInfo payInfo = tradeOrderCreate.getPayInfo(); + if(!"000000".equals(payInfo.getRetCode())){ + return ResultUtil.error(payInfo.getRetMsg()); + } + order.setIsCreated(1); + order.setTravelId(tradeOrderCreate.getOrderInfo().getOrderId()); + resultUtil = ResultUtil.success(payInfo.getData().getRedirectUrl()); + }else{ + //拉起支付 + TradePayOff1Data tradePayOff1Data = new TradePayOff1Data(); + tradePayOff1Data.setPartnerPayId(order.getTravelId()); + tradePayOff1Data.setTotalFee(Double.valueOf(payMoney * 100).intValue() + ""); + tradePayOff1Data.setRetUrl(path); + tradePayOff1Data.setClientIp(ip); + tradePayOff1Data.setOrderDesc("完成订单"); + List<GoodsInfoRequest> goodsInfo = new ArrayList<>(); + GoodsInfoRequest goodsInfoRequest = new GoodsInfoRequest(); + goodsInfoRequest.setSubOpenId(appUser.getOpenid()); + goodsInfoRequest.setProfitSharing("1"); + goodsInfo.add(goodsInfoRequest); + tradePayOff1Data.setGoodsInfo(goodsInfo); + PayInfo payInfo = OrderUtil.tradePayOff1(tradePayOff1Data, 0); + if(!"000000".equals(payInfo.getRetCode())){ + return ResultUtil.error(payInfo.getRetMsg()); + } + resultUtil = ResultUtil.success(payInfo.getData().getRedirectUrl()); + } + this.updateById(order); + //创建定时任务查询订单支付状态 + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); + threadPoolExecutor.execute(()->{ + try { + int num = 1; + int wait = 0; + while (num <= 13) { + int min = 5000; + wait += (min * num); + Order order1 = this.selectById(order.getId()); + if (order1.getState() != 107) { + break; + } + GetTravelItineraryListRequest request = new GetTravelItineraryListRequest(); + request.setCustomerId(appUser.getOnconUUID()); + request.setOrderNo("DJ" + order1.getId()); + request.setDriverId(driver.getEmpId().toString()); + ListPage<List<TravelItinerary>> travelItineraryList = OrderUtil.getTravelItineraryList(request); + TravelItinerary travelItinerary = travelItineraryList.getList().get(0); + if(travelItinerary.getStatus() != 7 || Arrays.asList(3, 11).contains(travelItinerary.getOrderStatus())){ + GetPaymentInfoDataRequest getPaymentInfoDataRequest1 = new GetPaymentInfoDataRequest(); + getPaymentInfoDataRequest1.setPartnerPayId(order1.getTravelId()); + GetPaymentInfo getPaymentInfo1 = OrderUtil.paymentInfo(getPaymentInfoDataRequest1); + orderPayCallback(order1.getId().toString(), getPaymentInfo1.getPayId()); + break; + } + Thread.sleep(wait); + num++; + } + } catch (Exception e) { + e.printStackTrace(); + }finally { + threadPoolExecutor.shutdown(); + } + }); -// -// if(!"0000".equals(execute.getCode())){ -// return ResultUtil.error(execute.getMsg()); -// } -// JSONObject jsonObject = JSON.parseObject(execute.getResult()); -// String status = jsonObject.getString("status"); -// if("2".equals(status)){ -// return ResultUtil.error("失败"); -// } -// String merOrderId = jsonObject.getString("merOrderId"); -// String payCode = jsonObject.getString("payCode"); -// this.updateById(order); - -// if(ToolUtil.isNotEmpty(payCode)){ -// new Thread(new Runnable() { -// @Override -// public void run() { -// try { -// int num = 1; -// int wait = 0; -// while (num <= 10){ -// int min = 5000; -// wait += (min * num); -// Order order1 = OrderServiceImpl.this.selectById(order.getId()); -// if(order1.getState() != 107){ -// return; -// } -// QueryOrder queryOrder = new QueryOrder(); -// queryOrder.setOriginalMerOrderId(merOrderId); -// queryOrder.setQueryType("1"); -// TrhRequest<QueryOrder> request = new TrhRequest(); -// InterfaceResponse execute1 = request.execute(queryOrder, QueryOrder.SERVICE_CODE); -// if("0000".equals(execute1.getCode())){ -// JSONObject jsonObject1 = JSON.parseObject(execute1.getResult()); -// String status1 = jsonObject1.getString("status"); -// if("0".equals(status1)){//待处理 -// Thread.sleep(wait); -// num++; -// } -// if("1".equals(status1)){//成功 -// String merOrderId = jsonObject1.getString("merOrderId"); -// ResultUtil resultUtil = orderPayCallback(order1.getId().toString(), merOrderId); - -// break; -// } -// if("2".equals(status1) || 10 == num){//失败 -// break; -// } -// }else{ -// Thread.sleep(wait); -// num++; -// } -// } -// }catch (Exception e){ -// e.printStackTrace(); -// } -// } -// }).start(); -// } - -// return ResultUtil.success(payCode); + return resultUtil; } @@ -1506,6 +1556,18 @@ } order.setState(109); this.updateById(order); + Driver driver = driverService.selectById(order.getDriverId()); + //中台修改订单状态 + if(null != order.getTravelId()){ + ModifyTravelItineraryRequest request = new ModifyTravelItineraryRequest(); + request.setOrderId(order.getTravelId()); + request.setStatus(getState(order.getState())); + BranchOffice branchOffice = branchOfficeService.selectById(order.getBranchOfficeId()); + request.setDriverId(driver.getEmpId().toString()); + request.setSupplierShopId(branchOffice.getEnterCode()); + OrderUtil.modifyTravelItinerary(request); + } + Evaluate evaluate = new Evaluate(); evaluate.setOrderId(orderId.intValue()); evaluate.setCreateTime(new Date()); @@ -1514,7 +1576,6 @@ evaluate.setStatus(1); evaluate.setUserId(uid); evaluateService.insert(evaluate); - Driver driver = driverService.selectById(order.getDriverId()); driver.setScore(((null == driver.getScore() ? 0 : driver.getScore()) + score) / 2); if(score == 5){//司机积分奖励 SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 4)); -- Gitblit v1.7.1