| | |
| | | import com.baomidou.mybatisplus.service.impl.ServiceImpl; |
| | | import com.supersavedriving.user.core.util.ToolUtil; |
| | | import com.supersavedriving.user.modular.system.dao.OrderMapper; |
| | | import com.supersavedriving.user.modular.system.dao.TCompanyMapper; |
| | | import com.supersavedriving.user.modular.system.model.*; |
| | | import com.supersavedriving.user.modular.system.service.*; |
| | | import com.supersavedriving.user.modular.system.util.*; |
| | |
| | | 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.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 org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.concurrent.LinkedBlockingQueue; |
| | | import java.util.concurrent.ThreadPoolExecutor; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | |
| | | @Value("${callbackPath}") |
| | | private String callbackPath;//支付回调网关地址 |
| | | |
| | | @Autowired |
| | | private TCompanyMapper companyMapper; |
| | | |
| | | |
| | | |
| | |
| | | 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()); |
| | | TCompany company = companyMapper.selectById(order.getDriverId()); |
| | | //调三方订单中心创建行程单 |
| | | CreateTravelItineraryRequest request = new CreateTravelItineraryRequest(); |
| | | request.setOrderNo("DJ" + order.getId()); |
| | | request.setCustomerId(appUser.getOnconUUID()); |
| | | request.setDriverId(driver.getEmpId().toString()); |
| | | request.setSupplierShopId(company.getEnterCode()); |
| | | request.setServiceType(2); |
| | | String travelItinerary = OrderUtil.createTravelItinerary(request); |
| | | order.setTravelId(travelItinerary); |
| | | this.insertOrUpdate(order); |
| | | } |
| | | |
| | | if(insert){ |
| | | orderList.add(order); |
| | | } |
| | |
| | | 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())); |
| | | TCompany company = companyMapper.selectById(driver.getBranchOfficeId()); |
| | | request.setDriverId(driver.getEmpId().toString()); |
| | | request.setSupplierShopId(company.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); |
| | |
| | | } |
| | | 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; |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | //开始支付操作 |
| | | 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(); |
| | | } |
| | | |
| | |
| | | * @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; |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | 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())); |
| | | TCompany company = companyMapper.selectById(driver.getBranchOfficeId()); |
| | | request.setDriverId(driver.getEmpId().toString()); |
| | | request.setSupplierShopId(company.getEnterCode()); |
| | | OrderUtil.modifyTravelItinerary(request); |
| | | } |
| | | |
| | | Evaluate evaluate = new Evaluate(); |
| | | evaluate.setOrderId(orderId.intValue()); |
| | | evaluate.setCreateTime(new Date()); |
| | |
| | | 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)); |