소스 검색

Merge branch 'mp-server-test' into 'master'

Mp server test

See merge request quanshu/mp-server!818
zhong chunping 2 년 전
부모
커밋
9e00cf71db
19개의 변경된 파일652개의 추가작업 그리고 479개의 파일을 삭제
  1. 283 265
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  2. 2 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  3. 38 15
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  4. 1 1
      mp-admin/src/main/resources/application.yml
  5. 4 2
      mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java
  6. 2 0
      mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java
  7. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxParam.java
  8. 19 16
      mp-service/src/main/java/com/qs/mp/admin/mapper/TicketMapper.java
  9. 40 36
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketService.java
  10. 50 50
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketServiceImpl.java
  11. 1 1
      mp-service/src/main/java/com/qs/mp/channel/domain/param/OrderPayParam.java
  12. 4 2
      mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java
  13. 13 0
      mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java
  14. 53 5
      mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java
  15. 4 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserCouponVO.java
  16. 14 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java
  17. 3 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java
  18. 102 77
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  19. 15 6
      mp-service/src/main/resources/mapper/admin/TicketMapper.xml

+ 283 - 265
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java

@@ -65,294 +65,312 @@ import org.springframework.web.bind.annotation.RestController;
 @Api(tags = "用户端奖品提货接口")
 public class UserDeliverOrderController extends BaseApiController {
 
-  @Autowired
-  private IUserPrizeStorageService userPrizeStorageService;
-
-  @Autowired
-  private IUserAddrService userAddrService;
-
-  @Autowired
-  private IUserDeliverOrderService userDeliverOrderService;
-
-  @Autowired
-  private IUserDeliverOrderItemService userDeliverOrderItemService;
-
-  @Autowired
-  private IWalletService walletService;
-
-  @Autowired
-  private MapperFacade mapperFacade;
-
-  @Autowired
-  private ISysUserService sysUserService;
-
-  @Autowired
-  private RedisCache redisCache;
-
-  @Autowired
-  private IShippingTemplateRuleService shippingTemplateRuleService;
-
-  @Autowired
-  private IShippingTemplateService shippingTemplateService;
-
-  @Autowired
-  private IGoodsService goodsService;
-
-  @Autowired
-  private IGoodsSkuService goodsSkuService;
-
-  @Value("${shipping.user}")
-  public Long shippingTemplateId;
-
-  /**
-   * 订单列表
-   */
-  @PostMapping("/order/list")
-  @ApiOperation(value = "订单列表" , notes = "获取所有订单信息")
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "success", response = DeliverOrderVO.class)
-  )
-  public TableDataInfo list(@RequestBody JSONObject param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    String status = param.getString("status");
-    List<Integer> statusList = new ArrayList<>();
-    if (StringUtils.isNotBlank(status)) {
-      String[] arr = status.split(",");
-      for (int i = 0; i < arr.length; i++) {
-        statusList.add(Integer.valueOf(arr[i]));
-      }
-    }
-    startPage();
-    List<UserDeliverOrder> deliverOrders = userDeliverOrderService.list(
-        new LambdaQueryWrapper<UserDeliverOrder>().eq(UserDeliverOrder::getUserId, userId)
-            .in(!CollectionUtils.isEmpty(statusList), UserDeliverOrder::getStatus, statusList)
-            .orderByDesc(UserDeliverOrder::getCreatedTime));
-    List<DeliverOrderVO> deliverOrderVOList = mapperFacade.mapAsList(deliverOrders, DeliverOrderVO.class);
-    for (DeliverOrderVO deliverOrderVO : deliverOrderVOList) {
-      deliverOrderVO.setItems(userDeliverOrderItemService.selectUserDeliverOrderItemVOList(deliverOrderVO.getOrderId()));
-    }
-    TableDataInfo rspData = getDataTable(deliverOrders);
-    rspData.setRows(deliverOrderVOList);
-    return rspData;
-  }
-
-  /**
-   * 订单详情
-   */
-  @PostMapping("/order/detail")
-  @ApiOperation(value = "订单详情" , notes = "在订单列表页面查看详情")
-  public AjaxResult query(@RequestBody UserDeliverOrder order) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    UserDeliverOrder deliverOrder = userDeliverOrderService.getOne(new LambdaQueryWrapper<UserDeliverOrder>()
-        .eq(UserDeliverOrder::getOrderId, order.getOrderId()).eq(UserDeliverOrder::getUserId, userId));
-    DeliverOrderVO deliverOrderVO = mapperFacade.map(deliverOrder, DeliverOrderVO.class);
-
-    // 设置自动确认收货时间
-    if (deliverOrder != null && !Objects.isNull(deliverOrder.getDeliveryTime())) {
-      Date deliveryTime = deliverOrder.getDeliveryTime();
-      LocalDateTime autoConfirmTime = LocalDateTimeUtil.of(deliveryTime).plusDays(15);
-      Duration between = LocalDateTimeUtil.between(LocalDateTime.now(), autoConfirmTime);
-      long hours = between.toHours();
-      long day = hours / 24;
-      long hour = hours % 24;
-      deliverOrderVO.setAutoConfirmTime(day + "天" + hour + "小时");
+    @Autowired
+    private IUserPrizeStorageService userPrizeStorageService;
+
+    @Autowired
+    private IUserAddrService userAddrService;
+
+    @Autowired
+    private IUserDeliverOrderService userDeliverOrderService;
+
+    @Autowired
+    private IUserDeliverOrderItemService userDeliverOrderItemService;
+
+    @Autowired
+    private IWalletService walletService;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private IShippingTemplateRuleService shippingTemplateRuleService;
+
+    @Autowired
+    private IShippingTemplateService shippingTemplateService;
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private IGoodsSkuService goodsSkuService;
+
+    @Value("${shipping.user}")
+    public Long shippingTemplateId;
+
+    /**
+     * 订单列表
+     */
+    @PostMapping("/order/list")
+    @ApiOperation(value = "订单列表", notes = "获取所有订单信息")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "success", response = DeliverOrderVO.class)
+    )
+    public TableDataInfo list(@RequestBody JSONObject param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        String status = param.getString("status");
+        List<Integer> statusList = new ArrayList<>();
+        if (StringUtils.isNotBlank(status)) {
+            String[] arr = status.split(",");
+            for (int i = 0; i < arr.length; i++) {
+                statusList.add(Integer.valueOf(arr[i]));
+            }
+        }
+        startPage();
+        List<UserDeliverOrder> deliverOrders = userDeliverOrderService.list(
+            new LambdaQueryWrapper<UserDeliverOrder>().eq(UserDeliverOrder::getUserId, userId)
+                .in(!CollectionUtils.isEmpty(statusList), UserDeliverOrder::getStatus, statusList)
+                .orderByDesc(UserDeliverOrder::getCreatedTime));
+        List<DeliverOrderVO> deliverOrderVOList = mapperFacade.mapAsList(deliverOrders, DeliverOrderVO.class);
+        for (DeliverOrderVO deliverOrderVO : deliverOrderVOList) {
+            deliverOrderVO.setItems(
+                userDeliverOrderItemService.selectUserDeliverOrderItemVOList(deliverOrderVO.getOrderId()));
+        }
+        TableDataInfo rspData = getDataTable(deliverOrders);
+        rspData.setRows(deliverOrderVOList);
+        return rspData;
     }
 
-    deliverOrderVO.setItems(userDeliverOrderItemService.selectUserDeliverOrderItemVOList(deliverOrder.getOrderId()));
-    deliverOrderVO.setDeliverList(userDeliverOrderItemService.getDeliverItemList(order.getOrderId(), deliverOrderVO.getItems()));
-    return AjaxResult.success(deliverOrderVO);
-  }
-
-  /**
-   * 订单结算,每次更换地址时需重新请求此接口
-   */
-  @PostMapping("/order/settle")
-  @ApiOperation(value = "订单结算" , notes = "奖品库里点提货")
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "success", response = DeliverOrderSettleVO.class)
-  )
-  public AjaxResult settle(@Valid @RequestBody DeliverOrderParam param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-
-    DeliverOrderSettleVO orderSettleVO = new DeliverOrderSettleVO();
-
-    // 收货地址,如果用户选了地址,则此处不做处理
-    if (null == param.getAddrId() || 0 == param.getAddrId()) {
-      //读取默认地址
-      UserAddr addr = userAddrService.getDefaultChannelAddr(userId);
-      if (null != addr) {
-        orderSettleVO.setAddr(addr);
-      }
-    }
+    /**
+     * 订单详情
+     */
+    @PostMapping("/order/detail")
+    @ApiOperation(value = "订单详情", notes = "在订单列表页面查看详情")
+    public AjaxResult query(@RequestBody UserDeliverOrder order) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        UserDeliverOrder deliverOrder = userDeliverOrderService.getOne(new LambdaQueryWrapper<UserDeliverOrder>()
+            .eq(UserDeliverOrder::getOrderId, order.getOrderId()).eq(UserDeliverOrder::getUserId, userId));
+        DeliverOrderVO deliverOrderVO = mapperFacade.map(deliverOrder, DeliverOrderVO.class);
+
+        // 设置自动确认收货时间
+        if (deliverOrder != null && !Objects.isNull(deliverOrder.getDeliveryTime())) {
+            Date deliveryTime = deliverOrder.getDeliveryTime();
+            LocalDateTime autoConfirmTime = LocalDateTimeUtil.of(deliveryTime).plusDays(15);
+            Duration between = LocalDateTimeUtil.between(LocalDateTime.now(), autoConfirmTime);
+            long hours = between.toHours();
+            long day = hours / 24;
+            long hour = hours % 24;
+            deliverOrderVO.setAutoConfirmTime(day + "天" + hour + "小时");
+        }
 
-    // 订单金额计算
-    Integer orderAmt = 0;
-    Integer freightAmt = 0;
-
-
-    // 商品数量
-    int goodsNum = 0;
-    List<UserPrizeStorage> prizeStorageList = new ArrayList<>();
-    if (DeliverOrderResourceEnum.PAYMENT.equals(param.getResource())) {
-      // 现金支付,设置金额信息
-      if (Objects.isNull(param.getGoodsId()) || Objects.isNull(param.getNum())) {
-        return AjaxResult.error("商品信息不能为空");
-      }
-      goodsNum = param.getNum();
-      // 获取商品信息
-      Goods goods = goodsService.getById(param.getGoodsId());
-      GoodsSku goodsSku = goodsSkuService.getById(param.getSkuId());
-      if (Objects.isNull(goods)) {
-        return AjaxResult.error("商品不存在");
-      }
-      // 封装商品信息出参
-      UserPrizeStorage prizeStorage = new UserPrizeStorage();
-      prizeStorage.setGoodsId(goods.getGoodsId());
-      prizeStorage.setPicUrl(goods.getPicUrl());
-      prizeStorage.setTitle(goods.getTitle());
-      prizeStorage.setGoodsNum(goodsNum);
-      if (Objects.nonNull(goodsSku)) {
-        prizeStorage.setPicUrl(goodsSku.getPicUrl());
-        prizeStorage.setSkuId(goodsSku.getSkuId());
-        prizeStorage.setProperties(goodsSku.getProperties());
-
-        orderAmt = goodsNum * goodsSku.getValue();
-      }else {
-        orderAmt = goodsNum * goods.getValue();
-
-      }
-
-      prizeStorageList.add(prizeStorage);
-      orderSettleVO.setResource(DeliverOrderResourceEnum.PAYMENT.getValue());
-    }else {
-      prizeStorageList = userPrizeStorageService.list(new LambdaQueryWrapper<UserPrizeStorage>()
-              .eq(UserPrizeStorage::getUserId, userId).eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED)
-              .in(UserPrizeStorage::getStorageId, param.getIds()));
-      goodsNum = prizeStorageList.stream().mapToInt(UserPrizeStorage::getGoodsNum).sum();
-      orderSettleVO.setResource(DeliverOrderResourceEnum.DELIVER.getValue());
+        deliverOrderVO.setItems(
+            userDeliverOrderItemService.selectUserDeliverOrderItemVOList(deliverOrder.getOrderId()));
+        deliverOrderVO.setDeliverList(
+            userDeliverOrderItemService.getDeliverItemList(order.getOrderId(), deliverOrderVO.getItems()));
+        return AjaxResult.success(deliverOrderVO);
     }
 
+    /**
+     * 订单结算,每次更换地址时需重新请求此接口
+     */
+    @PostMapping("/order/settle")
+    @ApiOperation(value = "订单结算", notes = "奖品库里点提货")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "success", response = DeliverOrderSettleVO.class)
+    )
+    public AjaxResult settle(@Valid @RequestBody DeliverOrderParam param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+
+        DeliverOrderSettleVO orderSettleVO = new DeliverOrderSettleVO();
+
+        // 收货地址,如果用户选了地址,则此处不做处理
+        if (null == param.getAddrId() || 0 == param.getAddrId()) {
+            //读取默认地址
+            UserAddr addr = userAddrService.getDefaultChannelAddr(userId);
+            if (null != addr) {
+                orderSettleVO.setAddr(addr);
+            }
+        }
+
+        // 订单金额计算
+        Integer orderAmt = 0;
+        Integer freightAmt = 0;
+
+        // 商品数量
+        int goodsNum = 0;
+        List<UserPrizeStorage> prizeStorageList = new ArrayList<>();
+        if (DeliverOrderResourceEnum.PAYMENT.equals(param.getResource())) {
+            // 现金支付,设置金额信息
+            if (Objects.isNull(param.getGoodsId()) || Objects.isNull(param.getNum())) {
+                return AjaxResult.error("商品信息不能为空");
+            }
+            goodsNum = param.getNum();
+            // 获取商品信息
+            Goods goods = goodsService.getById(param.getGoodsId());
+            GoodsSku goodsSku = goodsSkuService.getById(param.getSkuId());
+            if (Objects.isNull(goods)) {
+                return AjaxResult.error("商品不存在");
+            }
+            // 封装商品信息出参
+            UserPrizeStorage prizeStorage = new UserPrizeStorage();
+            prizeStorage.setGoodsId(goods.getGoodsId());
+            prizeStorage.setPicUrl(goods.getPicUrl());
+            prizeStorage.setTitle(goods.getTitle());
+            prizeStorage.setGoodsNum(goodsNum);
+            if (Objects.nonNull(goodsSku)) {
+                prizeStorage.setPicUrl(goodsSku.getPicUrl());
+                prizeStorage.setSkuId(goodsSku.getSkuId());
+                prizeStorage.setProperties(goodsSku.getProperties());
+
+                orderAmt = goodsNum * goodsSku.getValue();
+            } else {
+                orderAmt = goodsNum * goods.getValue();
+
+            }
+
+            prizeStorageList.add(prizeStorage);
+            orderSettleVO.setResource(DeliverOrderResourceEnum.PAYMENT.getValue());
+        } else {
+            prizeStorageList = userPrizeStorageService.list(new LambdaQueryWrapper<UserPrizeStorage>()
+                .eq(UserPrizeStorage::getUserId, userId)
+                .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED)
+                .in(UserPrizeStorage::getStorageId, param.getIds()));
+            goodsNum = prizeStorageList.stream().mapToInt(UserPrizeStorage::getGoodsNum).sum();
+            orderSettleVO.setResource(DeliverOrderResourceEnum.DELIVER.getValue());
+        }
 
-    // 计算运费
-    UserAddr userAddr = orderSettleVO.getAddr();
-    if (Objects.nonNull(userAddr)) {
-      // TODO: 4L上线需要调整,后期放开就是取的商品里配的运费模板id
-      ShippingTemplateCalculateVO shippingTemplateCalculateVO = shippingTemplateRuleService.getShippingTemplateRuleByTemplateIdAndAreaInfo(shippingTemplateId, userAddr.getProvinceId(), userAddr.getCityId());
-      // 无法查到运费模板则默认为0
-      if (Objects.nonNull(shippingTemplateCalculateVO)) {
+        // 计算运费
+        UserAddr userAddr = orderSettleVO.getAddr();
+        if (Objects.nonNull(userAddr)) {
+            // TODO: 4L上线需要调整,后期放开就是取的商品里配的运费模板id
+            ShippingTemplateCalculateVO shippingTemplateCalculateVO = shippingTemplateRuleService.getShippingTemplateRuleByTemplateIdAndAreaInfo(
+                shippingTemplateId, userAddr.getProvinceId(), userAddr.getCityId());
+            // 无法查到运费模板则默认为0
+            if (Objects.nonNull(shippingTemplateCalculateVO)) {
 
-        orderSettleVO.setFreightRemark(shippingTemplateCalculateVO.getRemark());
-        orderSettleVO.setFreightType(shippingTemplateCalculateVO.getType());
+                orderSettleVO.setFreightRemark(shippingTemplateCalculateVO.getRemark());
+                orderSettleVO.setFreightType(shippingTemplateCalculateVO.getType());
 
-        if (ShippingTemplateRuleTypeEnum.SHIP.getValue().equals(shippingTemplateCalculateVO.getType())) {
-          // 计算运费
-          freightAmt = shippingTemplateService.calculateFreightAmt(goodsNum,shippingTemplateCalculateVO);
-        }
+                if (ShippingTemplateRuleTypeEnum.SHIP.getValue().equals(shippingTemplateCalculateVO.getType())) {
+                    // 计算运费
+                    freightAmt = shippingTemplateService.calculateFreightAmt(goodsNum, shippingTemplateCalculateVO);
+                }
 
-      }
-    }
+            }
+        }
 
+        orderSettleVO.setOrderAmt(orderAmt);
+        orderSettleVO.setFreightAmt(freightAmt);
+        orderSettleVO.setPayAmt(orderAmt + freightAmt);
+        orderSettleVO.setPrizeList(prizeStorageList);
 
-    orderSettleVO.setOrderAmt(orderAmt);
-    orderSettleVO.setFreightAmt(freightAmt);
-    orderSettleVO.setPayAmt(orderAmt + freightAmt);
-    orderSettleVO.setPrizeList(prizeStorageList);
-
-    // 缓存订单结算对象
-    redisCache.setCacheObject(RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
-    return AjaxResult.success(orderSettleVO);
-  }
-
-  /**
-   * 提交订单
-   */
-  @PostMapping("/order/submit")
-  @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
-  public AjaxResult submit(@RequestBody UserDeliverOrder order) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    DeliverOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId));
-    if (null == orderSettleVO) {
-      return AjaxResult.error("订单已过期,请重新下单");
+        // 缓存订单结算对象
+        redisCache.setCacheObject(RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId), orderSettleVO, 10,
+            TimeUnit.MINUTES);
+        return AjaxResult.success(orderSettleVO);
     }
-    if (null == orderSettleVO.getAddr()) {
-      return AjaxResult.error("请填写收货地址");
-    }
-    String orderId = userDeliverOrderService.submitOrder(userId,order.getMemo(), orderSettleVO);
-    JSONObject jsonObject = new JSONObject();
-    jsonObject.put("orderId", orderId);
-    if (orderSettleVO.getPayAmt() > 0) {
-      jsonObject.put("needPay", 1);
-    } else {
-      jsonObject.put("needPay", 0);
-    }
-    // 清除缓存的订单
-    redisCache.deleteObject(RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId));
+
+    /**
+     * 提交订单
+     */
+    @PostMapping("/order/submit")
+    @ApiOperation(value = "提交订单", notes = "在订单确认页面提交")
+    public AjaxResult submit(@RequestBody UserDeliverOrder order) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        DeliverOrderSettleVO orderSettleVO = redisCache.getCacheObject(
+            RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId));
+        if (null == orderSettleVO) {
+            return AjaxResult.error("订单已过期,请重新下单");
+        }
+        if (null == orderSettleVO.getAddr()) {
+            return AjaxResult.error("请填写收货地址");
+        }
+        String orderId = userDeliverOrderService.submitOrder(userId, order.getMemo(), orderSettleVO);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("orderId", orderId);
+        if (orderSettleVO.getPayAmt() > 0) {
+            jsonObject.put("needPay", 1);
+        } else {
+            jsonObject.put("needPay", 0);
+        }
+        // 清除缓存的订单
+        redisCache.deleteObject(RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId));
 
     if (orderSettleVO.getPayAmt() > 0) {
       return AjaxResult.error("支付系统升级中,请稍后再试");
     }
 
-    return AjaxResult.success(jsonObject);
-  }
-
-
-  /**
-   * 取消订单
-   */
-  @PostMapping("/order/cancel")
-  @ApiOperation(value = "取消订单" , notes = "在订单列表页面取消")
-  public AjaxResult cancel(@RequestBody UserDeliverOrderCancelParam param) {
-    userDeliverOrderService.cancelOrder(param.getOrderId());
-    return AjaxResult.success("取消成功");
-  }
-
-  /**
-   * 订单支付
-   */
-  @PostMapping("/order/pay")
-  @ApiOperation(value = "订单支付" , notes = "订单支付")
-  public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    SysUser sysUser = sysUserService.selectUserById(userId);
-    if (StringUtils.isBlank(sysUser.getOpenId())) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
-    }
-    UserDeliverOrder deliverOrder = userDeliverOrderService.getById(param.getOrderId());
-    JSONObject jsonObject;
-    try {
-      jsonObject = walletService.pay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(), sysUser.getOpenId(), deliverOrder.getPayAmt(), "盲票--提货订单");
-    }catch (ServiceException e) {
-      LogUtil.error(logger, e, "根据提货单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
-      return AjaxResult.error(e.getMessage());
-    }
-    return AjaxResult.success(jsonObject);
-  }
-
-  @PostMapping("/order/confirm")
-  @ApiOperation("订单确认收货")
-  public AjaxResult confirm(@RequestBody UserDeliverOrder order){
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    UserDeliverOrder userDeliverOrder = userDeliverOrderService.getById(order.getOrderId());
-    if (Objects.isNull(userDeliverOrder)) {
-      return AjaxResult.error("订单不存在");
+        return AjaxResult.success(jsonObject);
     }
 
-    if (!DeliverOrderStatusEnum.NOT_CONFIRM.equals(userDeliverOrder.getStatus())) {
-      return AjaxResult.error("订单状态不为待收货");
+
+    /**
+     * 取消订单
+     */
+    @PostMapping("/order/cancel")
+    @ApiOperation(value = "取消订单", notes = "在订单列表页面取消")
+    public AjaxResult cancel(@RequestBody UserDeliverOrderCancelParam param) {
+        userDeliverOrderService.cancelOrder(param.getOrderId());
+        return AjaxResult.success("取消成功");
     }
 
-    if (!userId.equals(userDeliverOrder.getUserId())) {
-      return AjaxResult.error("非法操作他人订单");
+    /**
+     * 订单支付
+     */
+    @PostMapping("/order/pay")
+    @ApiOperation(value = "订单支付", notes = "订单支付")
+    public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        if (param.getPayType() == 1) {
+            if (StringUtils.isBlank(sysUser.getAliuserId())) {
+                return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1026);
+            }
+        } else {
+            if (StringUtils.isBlank(sysUser.getOpenId())) {
+                return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+            }
+        }
+        UserDeliverOrder deliverOrder = userDeliverOrderService.getById(param.getOrderId());
+        JSONObject jsonObject;
+        try {
+            if (param.getPayType() == 1) {
+                // 支付宝支付
+                jsonObject = walletService.aliPay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getAliuserId(),
+                    deliverOrder.getPayAmt(), "盲票--提货订单");
+            } else {
+                // 微信支付
+                jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getOpenId(),
+                    deliverOrder.getPayAmt(), "盲票--提货订单");
+            }
+        } catch (ServiceException e) {
+            LogUtil.error(logger, e, "根据提货单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success(jsonObject);
     }
 
-    // 更新用户提货订单状态为已完成,并且设置收货时间
-    UserDeliverOrder param = new UserDeliverOrder();
-    param.setOrderId(order.getOrderId());
-    param.setStatus(DeliverOrderStatusEnum.FINISHED);
-    param.setConfirmTime(new Date());
-    userDeliverOrderService.updateById(param);
+    @PostMapping("/order/confirm")
+    @ApiOperation("订单确认收货")
+    public AjaxResult confirm(@RequestBody UserDeliverOrder order) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        UserDeliverOrder userDeliverOrder = userDeliverOrderService.getById(order.getOrderId());
+        if (Objects.isNull(userDeliverOrder)) {
+            return AjaxResult.error("订单不存在");
+        }
+
+        if (!DeliverOrderStatusEnum.NOT_CONFIRM.equals(userDeliverOrder.getStatus())) {
+            return AjaxResult.error("订单状态不为待收货");
+        }
 
-    return AjaxResult.success();
-  }
+        if (!userId.equals(userDeliverOrder.getUserId())) {
+            return AjaxResult.error("非法操作他人订单");
+        }
+
+        // 更新用户提货订单状态为已完成,并且设置收货时间
+        UserDeliverOrder param = new UserDeliverOrder();
+        param.setOrderId(order.getOrderId());
+        param.setStatus(DeliverOrderStatusEnum.FINISHED);
+        param.setConfirmTime(new Date());
+        userDeliverOrderService.updateById(param);
+
+        return AjaxResult.success();
+    }
 
 }

+ 2 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java

@@ -99,7 +99,7 @@ public class UserTicketController extends BaseApiController {
   private IChannelService channelService;
 
   /**
-   * 盲票进货列表
+   * 盲票列表
    */
   @PostMapping("/mall/ticket/list")
   @ApiOperation(value = "盲票组列表", notes = "获取所有盲票信息")
@@ -110,6 +110,7 @@ public class UserTicketController extends BaseApiController {
         new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
             .eq(null != param.getCategoryId() && 0 != param.getCategoryId(),
                 TicketBox::getCategoryId, param.getCategoryId())
+            .in(CollectionUtils.isNotEmpty(param.getBoxIds()), TicketBox::getBoxId, param.getBoxIds())
             .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
             .orderByDesc(TicketBox::getSortWeight)
     );

+ 38 - 15
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java

@@ -106,7 +106,6 @@ public class UserTicketOrderController extends BaseApiController {
 
         TicketOrderSettleVO orderSettleVO = new TicketOrderSettleVO();
 
-
         // 订单金额计算
         Integer orderAmt = 0;
         Integer discountAmt = 0;
@@ -137,7 +136,8 @@ public class UserTicketOrderController extends BaseApiController {
             }
         } else if (!CollectionUtils.isEmpty(param.getUserCouponIds())) {
             // 查询指定券
-            List<UserCouponVO> userCouponVOList = userCouponService.listTicketOrderCouponByIds(param.getUserCouponIds());
+            List<UserCouponVO> userCouponVOList = userCouponService.listTicketOrderCouponByIds(
+                param.getUserCouponIds());
             if (!CollectionUtils.isEmpty(userCouponVOList)) {
                 // 只考虑使用单张券
                 orderSettleVO.getCouponList().add(mapperFacade.map(userCouponVOList.get(0), UserCoupon4OrderVO.class));
@@ -156,7 +156,8 @@ public class UserTicketOrderController extends BaseApiController {
         orderSettleVO.setTitle(ticketBox.getTitle());
 
         // 缓存订单结算对象
-        redisCache.setCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
+        redisCache.setCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId), orderSettleVO, 10,
+            TimeUnit.MINUTES);
         return AjaxResult.success(orderSettleVO);
     }
 
@@ -167,7 +168,8 @@ public class UserTicketOrderController extends BaseApiController {
     @ApiOperation(value = "提交订单", notes = "在订单确认页面提交")
     public AjaxResult submit(@RequestBody UserShareVO userShareVO) {
         Long userId = SecurityUtils.getLoginUser().getUserId();
-        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(
+            RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
         if (null == orderSettleVO) {
             return AjaxResult.error("订单已过期,请重新下单");
         }
@@ -208,15 +210,31 @@ public class UserTicketOrderController extends BaseApiController {
     public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
         Long userId = SecurityUtils.getLoginUser().getUserId();
         SysUser sysUser = sysUserService.selectUserById(userId);
-        if (StringUtils.isBlank(sysUser.getOpenId())) {
-            return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+        if (param.getPayType() == 1) {
+            if (StringUtils.isBlank(sysUser.getAliuserId())) {
+                return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1026);
+            }
+        } else {
+            if (StringUtils.isBlank(sysUser.getOpenId())) {
+                return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+            }
         }
+
         UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
         JSONObject jsonObject;
         try {
-            jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getOpenId(), ticketOrder.getPayAmt(), ticketOrder.getTitle());
+            if (param.getPayType() == 1) {
+                // 支付宝支付
+                jsonObject = walletService.aliPay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getAliuserId(),
+                    ticketOrder.getPayAmt(), ticketOrder.getTitle());
+            } else {
+                // 微信支付
+                jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getOpenId(),
+                    ticketOrder.getPayAmt(), ticketOrder.getTitle());
+            }
         } catch (ServiceException e) {
-            LogUtil.error(logger, e, "根据盲票购买订单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
+            LogUtil.error(logger, e, "根据盲票购买订单创建支付单失败。userId:{0},orderId:{1}",
+                new Object[]{userId, param.getOrderId()});
             return AjaxResult.error(e.getMessage());
         }
         return AjaxResult.success(jsonObject);
@@ -228,16 +246,18 @@ public class UserTicketOrderController extends BaseApiController {
     @PostMapping("/order/coupon/list")
     @ApiOperation(value = "查询可用优惠券", notes = "在下单页面选择")
     @ApiResponses(
-            @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
+        @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
     )
     public AjaxResult listCoupon(@RequestBody TicketOrderParam param) {
         Long userId = SecurityUtils.getUserId();
-        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(
+            RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
         if (null == orderSettleVO) {
             return AjaxResult.error("订单已过期,请重新下单");
         }
         TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
-        List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
+        List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(),
+            ticketBox);
 
         // 设置选中状态
         for (UserCouponVO userCouponVO : userCouponVOList) {
@@ -257,17 +277,19 @@ public class UserTicketOrderController extends BaseApiController {
     @PostMapping("/order/coupon/listPage")
     @ApiOperation(value = "查询可用优惠券,分页", notes = "在下单页面选择")
     @ApiResponses(
-            @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
+        @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
     )
     public TableDataInfo listPageCoupon(@RequestBody TicketOrderParam param) {
         Long userId = SecurityUtils.getUserId();
-        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(
+            RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
         if (null == orderSettleVO) {
             return getErrorDataTable("订单已过期,请重新下单");
         }
         TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
         startPage();
-        List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
+        List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(),
+            ticketBox);
 
         // 设置选中状态
         for (UserCouponVO userCouponVO : userCouponVOList) {
@@ -280,7 +302,8 @@ public class UserTicketOrderController extends BaseApiController {
                 }
             }
         }
-        List<UserCouponVO> countUserCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
+        List<UserCouponVO> countUserCouponVOList = userCouponService.queryUserCouponList(userId,
+            orderSettleVO.getOrderAmt(), ticketBox);
         TableDataInfo dataTable = getDataTable(userCouponVOList);
         dataTable.setTotal(countUserCouponVOList.size());
         return dataTable;

+ 1 - 1
mp-admin/src/main/resources/application.yml

@@ -167,4 +167,4 @@ kuaidi100:
   key: vjxrpSAd2653
   customer: 3964DA3B34FC656A7ED1DA610CC92193
   secret: 437495658dc649bba7b31fbf0b545e95
-  userid: 2e5b03120bac44dfbc62fc42d988b5f6
+  userid: 2e5b03120bac44dfbc62fc42d988b5f6

+ 4 - 2
mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java

@@ -14,10 +14,12 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 public enum CouponUseAreaEnum implements IEnum<Integer> {
 
   COMMON(0, "通用"),
-  PRE_SCOPE(1, "指定范围"), // 生成优惠券的时候设定使用范围
+  ONLINE_SOME(1, "指定线上盲票"), // 盲票购买类优惠券,指定线上盲票
   POST_SCOPE(2, "指定范围"), // 门店消费类优惠券,发放的时候动态设定使用范围
   ONLINE_SCOPE(3, "所有线上盲票"), // 盲票购买类优惠券,仅限线上盲票
-  OFFLINE_SCOPE(4, "所有线下盲票"); // 盲票购买类优惠券,仅限线下盲票
+  OFFLINE_SCOPE(4, "所有线下盲票"), // 盲票购买类优惠券,仅限线下盲票
+  OFFLINE_SOME(5, "指定线下盲票"); // 盲票购买类优惠券,指定线下盲票
+
 
 
   private final int value;

+ 2 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java

@@ -32,6 +32,8 @@ public enum ErrorCodeEnum {
   ERROR_CODE_1023(1023, "盲票未激活"),
   ERROR_CODE_1024(1024, "删除失败,分类下存在商品"),
   ERROR_CODE_1025(1025, "删除失败,标签下存在商品"),
+
+  ERROR_CODE_1026(1026, "用户支付宝未授权登录"),
   ;
   private int code;
   private String msg;

+ 4 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxParam.java

@@ -4,6 +4,7 @@ import com.qs.mp.common.enums.TicketTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import java.math.BigDecimal;
+import java.util.List;
 import javax.validation.constraints.NotNull;
 import lombok.Data;
 
@@ -14,6 +15,9 @@ public class TicketBoxParam {
 	@ApiModelProperty(value = "盲票组ID",required=false)
 	private String boxId;
 
+	@ApiModelProperty(value = "盲票组ID列表",required=false)
+	private List<String> boxIds;
+
 	@ApiModelProperty(value = "分类ID",required=false)
 	private Long categoryId;
 

+ 19 - 16
mp-service/src/main/java/com/qs/mp/admin/mapper/TicketMapper.java

@@ -16,21 +16,24 @@ import org.apache.ibatis.annotations.Param;
  * @describe 盲票mapper类
  */
 public interface TicketMapper extends BaseMapper<Ticket> {
-  Ticket getRandOne(@Param("boxId") String boxId, @Param("status") int status);
 
-  List<Ticket> listTicket(@Param(Constants.WRAPPER) Wrapper<Ticket> queryWrapper);
-  
-  /**
-   * 统计经销商盲票销量,库存
-   * @param channelId
-   * @return
-   */
-  int getTicketQtyCnt(@Param("channelId") Long channelId);
-  
-  /**
-   * 查询统计数据
-   * @param queryWrapper
-   * @return
-   */
-  List<TicketCntVO> listTicketQtyCnt(@Param(Constants.WRAPPER) Wrapper<ChannelOrderDetail> queryWrapper);
+    Ticket getRandOne(@Param("boxId") String boxId, @Param("status") int status);
+
+    List<Ticket> listTicket(@Param(Constants.WRAPPER) Wrapper<Ticket> queryWrapper);
+
+    /**
+     * 统计经销商盲票销量,库存
+     *
+     * @param channelId
+     * @return
+     */
+    int getTicketQtyCnt(@Param("channelId") Long channelId);
+
+    /**
+     * 查询统计数据
+     *
+     * @param queryWrapper
+     * @return
+     */
+    List<TicketCntVO> listTicketQtyCnt(@Param(Constants.WRAPPER) Wrapper<ChannelOrderDetail> queryWrapper);
 }

+ 40 - 36
mp-service/src/main/java/com/qs/mp/admin/service/ITicketService.java

@@ -21,40 +21,44 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface ITicketService extends IService<Ticket> {
 
-  /**
-   * 随机取一条
-   * @param boxId
-   * @return
-   */
-  Ticket getRandOne(String boxId);
-
-
-  /**
-   * 盲票导入
-   * 导入就是只根据盲票序号更新幸运数字和抽奖数字两个字段
-   * @param ticketExcelList
-   * @return 导入的条数
-   */
-  int importTicket(List<TicketExcel> ticketExcelList);
-
-  /**
-   * 查询盲票列表
-   * @param queryWrapper
-   * @return
-   */
-  List<Ticket> listTicket(Wrapper<Ticket> queryWrapper);
-  
-  /**
-   * 统计经销商盲票销量,库存
-   * @param channelId
-   * @return
-   */
-  int getTicketQtyCnt(Long channelId);
-  
-  /**
-   * 查询统计数据
-   * @param queryWrapper
-   * @return
-   */
-  List<TicketCntVO> listTicketQtyCnt(Wrapper<ChannelOrderDetail> queryWrapper);
+    /**
+     * 随机取一条
+     *
+     * @param boxId
+     * @return
+     */
+    Ticket getRandOne(String boxId);
+
+
+    /**
+     * 盲票导入 导入就是只根据盲票序号更新幸运数字和抽奖数字两个字段
+     *
+     * @param ticketExcelList
+     * @return 导入的条数
+     */
+    int importTicket(List<TicketExcel> ticketExcelList);
+
+    /**
+     * 查询盲票列表
+     *
+     * @param queryWrapper
+     * @return
+     */
+    List<Ticket> listTicket(Wrapper<Ticket> queryWrapper);
+
+    /**
+     * 统计经销商盲票销量,库存
+     *
+     * @param channelId
+     * @return
+     */
+    int getTicketQtyCnt(Long channelId);
+
+    /**
+     * 查询统计数据
+     *
+     * @param queryWrapper
+     * @return
+     */
+    List<TicketCntVO> listTicketQtyCnt(Wrapper<ChannelOrderDetail> queryWrapper);
 }

+ 50 - 50
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketServiceImpl.java

@@ -32,61 +32,61 @@ import org.springframework.transaction.annotation.Transactional;
 @Service
 public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> implements ITicketService {
 
-	@Autowired
-	private ITicketService ticketService;
+    @Autowired
+    private ITicketService ticketService;
 
-	@Value("${export.page-size}")
-	private int pageSize;
+    @Value("${export.page-size}")
+    private int pageSize;
 
-	@Override
-	public Ticket getRandOne(String boxId) {
-		return getBaseMapper().getRandOne(boxId, 1);
-	}
+    @Override
+    public Ticket getRandOne(String boxId) {
+        return getBaseMapper().getRandOne(boxId, 1);
+    }
 
-	@Override
-	@Transactional
-	public int importTicket(List<TicketExcel> ticketExcelList) {
-		if (null != ticketExcelList && ticketExcelList.size() > 0) {
-			List<Ticket> ticketList = new ArrayList<Ticket>();
-			for (TicketExcel ticketExcel : ticketExcelList) {
-				if(null != ticketExcel && StringUtils.isNotBlank(ticketExcel.getSerialNo())) {
-					LambdaQueryWrapper<Ticket> ticketQueryWrapper = new LambdaQueryWrapper<Ticket>();
-					ticketQueryWrapper.eq(Ticket::getSerialNo, ticketExcel.getSerialNo());
-					Ticket ticket = ticketService.getOne(ticketQueryWrapper);
-					if(null != ticket && StringUtils.isNotBlank(ticket.getTicketId())) {
-						Ticket updateTicket = new Ticket();
-						updateTicket.setTicketId(ticket.getTicketId());
-						updateTicket.setCipherLuckyNum(RSAUtil.encrypt(ticketExcel.getCipherLuckyNum()));
-						updateTicket.setDrawNum(ticketExcel.getDrawNum());
-						ticketList.add(updateTicket);
-					}
-				}
-			}
-			if(null != ticketList && ticketList.size() > 0) {
-				boolean res = ticketService.updateBatchById(ticketList,pageSize);
-				if(!res) {
-					throw new ServiceException("盲票导入失败,请联系管理员");
-				}
-				return ticketList.size();
-			}
-		}
+    @Override
+    @Transactional
+    public int importTicket(List<TicketExcel> ticketExcelList) {
+        if (null != ticketExcelList && ticketExcelList.size() > 0) {
+            List<Ticket> ticketList = new ArrayList<Ticket>();
+            for (TicketExcel ticketExcel : ticketExcelList) {
+                if (null != ticketExcel && StringUtils.isNotBlank(ticketExcel.getSerialNo())) {
+                    LambdaQueryWrapper<Ticket> ticketQueryWrapper = new LambdaQueryWrapper<Ticket>();
+                    ticketQueryWrapper.eq(Ticket::getSerialNo, ticketExcel.getSerialNo());
+                    Ticket ticket = ticketService.getOne(ticketQueryWrapper);
+                    if (null != ticket && StringUtils.isNotBlank(ticket.getTicketId())) {
+                        Ticket updateTicket = new Ticket();
+                        updateTicket.setTicketId(ticket.getTicketId());
+                        updateTicket.setCipherLuckyNum(RSAUtil.encrypt(ticketExcel.getCipherLuckyNum()));
+                        updateTicket.setDrawNum(ticketExcel.getDrawNum());
+                        ticketList.add(updateTicket);
+                    }
+                }
+            }
+            if (null != ticketList && ticketList.size() > 0) {
+                boolean res = ticketService.updateBatchById(ticketList, pageSize);
+                if (!res) {
+                    throw new ServiceException("盲票导入失败,请联系管理员");
+                }
+                return ticketList.size();
+            }
+        }
 
-		return 0;
-	}
+        return 0;
+    }
 
-	@Override
-	public List<Ticket> listTicket(Wrapper<Ticket> queryWrapper) {
-		return getBaseMapper().listTicket(queryWrapper);
-	}
+    @Override
+    public List<Ticket> listTicket(Wrapper<Ticket> queryWrapper) {
+        return getBaseMapper().listTicket(queryWrapper);
+    }
 
-	@Override
-	public int getTicketQtyCnt(Long channelId) {
-		return getBaseMapper().getTicketQtyCnt(channelId);
-	}
+    @Override
+    public int getTicketQtyCnt(Long channelId) {
+        return getBaseMapper().getTicketQtyCnt(channelId);
+    }
+
+    @Override
+    public List<TicketCntVO> listTicketQtyCnt(Wrapper<ChannelOrderDetail> queryWrapper) {
+        return getBaseMapper().listTicketQtyCnt(queryWrapper);
+    }
 
-	@Override
-	public List<TicketCntVO> listTicketQtyCnt(Wrapper<ChannelOrderDetail> queryWrapper) {
-		return getBaseMapper().listTicketQtyCnt(queryWrapper);
-	}
-	
 }

+ 1 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/param/OrderPayParam.java

@@ -15,7 +15,7 @@ public class OrderPayParam {
 	private String orderId;
 
 	@NotNull(message = "支付方式不能为空")
-	@ApiModelProperty(value = "支付方式",required=true)
+	@ApiModelProperty(value = "支付方式:1支付宝,2微信",required=true)
 	private Integer payType;
 
 

+ 4 - 2
mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java

@@ -6,11 +6,12 @@ import com.qs.mp.common.utils.MessageHelper;
  * redis Key管理模版
  *
  * @author duota
- *
  */
 public enum RedisKey {
+
+    ONLINE_TICKET_ID_KEY("online_ticket_id_key_{0}", "线上盲票ID"),
     MARKETING_FAKE_NUM("marketing_fake_num_{0}", "营销活动虚拟参与人数"),
-    OPEN_LINK_KEY("open_link_key_{0}_{1}","微信scheme码缓存key"),
+    OPEN_LINK_KEY("open_link_key_{0}_{1}", "微信scheme码缓存key"),
     WX_APP_TOKEN_KEY("app_token_key_{0}", "小程序app token"),
     CHANNEL_ORDER_KEY("channel_order_{0}", "经销商下的盲票采购单"),
     USER_TICKET_ORDER_KEY("user_ticket_order_key_{0}", "用户购票订单"),
@@ -25,6 +26,7 @@ public enum RedisKey {
         this.keyTemplate = keyTemplate;
         this.desc = desc;
     }
+
     public static String build(RedisKey redisKey, Object... param) {
         return MessageHelper.formatMsg(redisKey.keyTemplate, param);
     }

+ 13 - 0
mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java

@@ -11,6 +11,19 @@ import com.qs.mp.pay.domain.PayOrder;
  */
 public interface IWalletService {
 
+  /**
+   * 支付宝支付
+   * @param bizType
+   * @param bizId
+   * @param openId
+   * @param money
+   * @param orderRemark
+   * @return
+   */
+  JSONObject aliPay(BizTypeEnum bizType, String bizId, String openId, int money,
+      String orderRemark);
+
+
   /**
    * 渠道订单支付
    * @param bizType

+ 53 - 5
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -83,10 +83,55 @@ public class WalletServiceImpl implements IWalletService {
   @Value("${pay.channel-sign}")
   private String channelPaySign;  //渠道端商户签名
 
+
+  @Value("${ali-miniApp.appId}")
+  private String aliMiniAppAppId;
+
   private static final String REQ_STATUS_SUCCESS = "R0001";
   private static final String PAY_RESOURCE = "2"; //2:微信支付
   private static final String PAY_RESOURCE_TYPE = "1017"; //2:微信小程序
 
+
+  @Override
+  public JSONObject aliPay(BizTypeEnum bizType, String bizId, String openId, int money, String orderRemark) {
+    String reqUrl = baseUrl + "/pay/payMoneyCTB";
+    String appId = aliMiniAppAppId;
+    String payShopNo = userPayShopNo;
+    String paySign = userPaySign;
+    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId, orderRemark, "1", "1014");
+    String result = OkHttpUtil.postJsonParams(reqUrl, params.toJSONString());
+    logger.info("request params:" + params.toJSONString() + "  result:" + result);
+    if (StringUtils.isBlank(result)) {
+      LogUtil.error(logger, "创建支付订单接口失败");
+      throw new ServiceException("创建三方支付订单失败");
+    }
+    JSONObject resultJson = JSONObject.parseObject(result);
+    String code = resultJson.getString("code");
+    String orderNo = resultJson.getString("order_no");
+    String payInfo = resultJson.getString("pay_info");
+    String orderstatus = resultJson.getString("orderstatus");
+    String resultMsg = resultJson.getString("result");
+    if (!REQ_STATUS_SUCCESS.equalsIgnoreCase(code)) {
+      throw new ServiceException(resultMsg);
+    }
+    //保存订单记录
+    PayOrder payOrder = buildPayOrder(params);
+    payOrder.setOrderId(resultJson.getString("shop_order_no"));
+    payOrder.setOrderNo(orderNo);
+    payOrder.setCode(code);
+    payOrder.setBizType(bizType);
+    payOrder.setBizId(bizId);
+    payOrder.setOrderStatus(orderstatus);
+    boolean ret = payOrderService.save(payOrder);
+    if (!ret) {
+      LogUtil.error(logger, "支付订单数据库保存失败.");
+      throw new ServiceException("支付订单保存失败");
+    }
+    JSONObject data = new JSONObject();
+    data.put("pay_info", payInfo);
+    return data;
+  }
+
   @Override
   public JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money,
       String orderRemark) {
@@ -99,7 +144,7 @@ public class WalletServiceImpl implements IWalletService {
       payShopNo = userPayShopNo;
       paySign = userPaySign;
     }
-    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId, orderRemark);
+    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId, orderRemark, PAY_RESOURCE, PAY_RESOURCE_TYPE);
     String result = OkHttpUtil.postJsonParams(reqUrl, params.toJSONString());
     logger.info("request params:" + params.toJSONString() + "  result:" + result);
     if (StringUtils.isBlank(result)) {
@@ -225,14 +270,14 @@ public class WalletServiceImpl implements IWalletService {
     return payOrder;
   }
 
-  private JSONObject buildPayOrderReqData(String shopNo, String sign, int money, String openId, String appId, String orderRemark) {
+  private JSONObject buildPayOrderReqData(String shopNo, String sign, int money, String openId, String appId, String orderRemark,String payResource, String payResourceType) {
 
     JSONObject sendData = new JSONObject();
     sendData.put("shop_no" , shopNo);
     sendData.put("shop_order_no" , String.valueOf(bizIdGenerator.newId()));
     sendData.put("shop_order_time" , DateUtils.getTime());
-    sendData.put("pay_resource" , PAY_RESOURCE); //支付来源 1:支付宝  2:微信支付 5:云闪付
-    sendData.put("trans_type_code" , PAY_RESOURCE_TYPE); //1017:微信小程序
+    sendData.put("pay_resource" , payResource); //支付来源 1:支付宝  2:微信支付 5:云闪付
+    sendData.put("trans_type_code" , payResourceType); //1017:微信小程序,1014支付宝
     sendData.put("transaction_amount" , money);
     sendData.put("order_remark" , "");
     sendData.put("timestamp" , System.currentTimeMillis());
@@ -244,7 +289,10 @@ public class WalletServiceImpl implements IWalletService {
 
     sendData.put("auth_code" , openId);
     sendData.put("notify_url" , notifyUrl);
-    sendData.put("app_id" , appId);
+    // 微信小程序必传appId
+    if ("2".equals(payResource)) {
+      sendData.put("app_id" , appId);
+    }
     return sendData;
   }
 }

+ 4 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserCouponVO.java

@@ -18,6 +18,7 @@ import java.util.Date;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import java.util.List;
 import lombok.Data;
 
 /**
@@ -79,6 +80,9 @@ public class UserCouponVO extends UserCoupon {
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private CouponUseAreaEnum useArea;
 
+  @ApiModelProperty("指定票组列表,type为1,useArea为1时才有值")
+  private List<String> boxIds;
+
   /**
    * 叠加使用;0不允许 1允许
    */

+ 14 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java

@@ -18,6 +18,7 @@ import com.qs.mp.user.mapper.UserCouponMapper;
 import com.qs.mp.user.service.IUserCouponService;
 import java.util.Iterator;
 import java.util.List;
+import java.util.stream.Collectors;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -60,6 +61,18 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
       queryWrapper.eq("t1.status", UserCouponStatusEnum.USED);
     }
     List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(queryWrapper);
+    for (UserCouponVO couponVO : userCouponVOList) {
+      // 指定盲票购买的优惠券
+      if (couponVO.getType() == CouponTypeEnum.TICKET_ORDER && couponVO.getUseArea() == CouponUseAreaEnum.ONLINE_SOME) {
+        List<CouponTicket> couponTicketList = couponTicketService.list(new LambdaQueryWrapper<CouponTicket>()
+            .eq(CouponTicket::getCouponId, couponVO.getCouponId()));
+        List<String> boxIds = couponTicketList.stream().map(couponTicket -> {
+          return couponTicket.getBoxId();
+        }).collect(Collectors.toList());
+        couponVO.setBoxIds(boxIds);
+      }
+    }
+
     return userCouponVOList;
   }
 
@@ -77,7 +90,7 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
     while (iterator.hasNext()) {
       UserCouponVO userCouponVO = iterator.next();
       // 校验使用范围
-      if (userCouponVO.getUseArea() == CouponUseAreaEnum.PRE_SCOPE) {
+      if (userCouponVO.getUseArea() == CouponUseAreaEnum.ONLINE_SOME) {
         // 指定盲票
         List<CouponTicket> couponTicketList = couponTicketService.list(
             new LambdaQueryWrapper<CouponTicket>()

+ 3 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java

@@ -40,6 +40,7 @@ import java.util.stream.Collectors;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -222,7 +223,8 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
             }
             try {
                 // 兑奖
-                this.cashPrize(ticket, userId, ticketAwardsPrize.getAwardsId(), ticketAwardsPrize.getPrizeId());
+                UserHitPrizeServiceImpl proxy = (UserHitPrizeServiceImpl) AopContext.currentProxy();
+                proxy.cashPrize(ticket, userId, ticketAwardsPrize.getAwardsId(), ticketAwardsPrize.getPrizeId());
             } finally {
                 distributedLocker.unlock(lockKey);
             }

+ 102 - 77
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -71,7 +71,7 @@ import org.springframework.util.Assert;
  */
 @Service
 public class UserTicketOrderServiceImpl extends
-        ServiceImpl<UserTicketOrderMapper, UserTicketOrder> implements IUserTicketOrderService {
+    ServiceImpl<UserTicketOrderMapper, UserTicketOrder> implements IUserTicketOrderService {
 
     protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -129,7 +129,7 @@ public class UserTicketOrderServiceImpl extends
 
     @Override
     public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO,
-                              UserShareVO userShareVO) {
+        UserShareVO userShareVO) {
         UserTicketOrderServiceImpl proxy = (UserTicketOrderServiceImpl) AopContext.currentProxy();
         if (StringUtils.isBlank(orderSettleVO.getTicketId())) {
             String lockKey = RedisLockKey.build(RedisLockKey.CREATED_ONLINE_TICKET_ORDER_KEY, orderSettleVO.getBoxId());
@@ -149,25 +149,25 @@ public class UserTicketOrderServiceImpl extends
 
     @Transactional(rollbackFor = Exception.class)
     public String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO,
-                                    UserShareVO userShareVO) {
+        UserShareVO userShareVO) {
         // 线上票更新票组销量,防止超卖
         TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
         if (ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
-                || ticketBox.getSaleQty() + orderSettleVO.getOrderNum() > ticketBox.getQuantity()) {
+            || ticketBox.getSaleQty() + orderSettleVO.getOrderNum() > ticketBox.getQuantity()) {
             LogUtil.error(logger, "库存不足,boxId:{0},qty:{1},saleQty:{2},orderNum:{3}",
-                    ticketBox.getBoxId(), ticketBox.getQuantity(), ticketBox.getSaleQty(),
-                    orderSettleVO.getOrderNum());
+                ticketBox.getBoxId(), ticketBox.getQuantity(), ticketBox.getSaleQty(),
+                orderSettleVO.getOrderNum());
             throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1020);
         }
         boolean rst = ticketBoxService.update(
-                new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
-                                ticketBox.getSaleQty() + orderSettleVO.getOrderNum())
-                        .set(ticketBox.getSaleQty() + orderSettleVO.getOrderNum() == ticketBox.getQuantity(),
-                                TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
-                        .eq(TicketBox::getBoxId, ticketBox.getBoxId())
-                        .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
+            new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
+                    ticketBox.getSaleQty() + orderSettleVO.getOrderNum())
+                .set(ticketBox.getSaleQty() + orderSettleVO.getOrderNum() == ticketBox.getQuantity(),
+                    TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
+                .eq(TicketBox::getBoxId, ticketBox.getBoxId())
+                .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
         Assert.isTrue(rst,
-                "盲票购买订单创建时,更新盲票销量失败。boxId:" + ticketBox.getBoxId() + "saleQty:" + ticketBox.getSaleQty());
+            "盲票购买订单创建时,更新盲票销量失败。boxId:" + ticketBox.getBoxId() + "saleQty:" + ticketBox.getSaleQty());
 
         // 核销优惠券
         String couponIds = verifyUserCoupon(orderSettleVO.getCouponList());
@@ -194,8 +194,8 @@ public class UserTicketOrderServiceImpl extends
 
         // 查询用户的所属经销商,线上票直接查询
         ChannelUserRel channelUserRel = channelUserRelService.getOne(
-                new LambdaQueryWrapper<ChannelUserRel>()
-                        .eq(ChannelUserRel::getUserId, userId));
+            new LambdaQueryWrapper<ChannelUserRel>()
+                .eq(ChannelUserRel::getUserId, userId));
         if (null != channelUserRel) {
             userTicketOrder.setChannelId(channelUserRel.getChannelId());
         } else {
@@ -203,16 +203,16 @@ public class UserTicketOrderServiceImpl extends
             if (null != userShareVO.getSuid() && 0 != userShareVO.getSuid()) {
                 if (UserShareVO.SHARE_TYPE_USER.equals(userShareVO.getType())) {
                     ChannelUserRel channelShareUserRel = channelUserRelService.getOne(
-                            new LambdaQueryWrapper<ChannelUserRel>()
-                                    .eq(ChannelUserRel::getUserId, userShareVO.getSuid()));
+                        new LambdaQueryWrapper<ChannelUserRel>()
+                            .eq(ChannelUserRel::getUserId, userShareVO.getSuid()));
                     if (null != channelShareUserRel) {
                         userTicketOrder.setChannelId(channelShareUserRel.getChannelId());
                         userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
                     }
                 } else if (UserShareVO.SHARE_TYPE_SITE.equals(userShareVO.getType())) {
                     Channel channel = channelService.getOne(
-                            new LambdaQueryWrapper<Channel>()
-                                    .eq(Channel::getUserId, userShareVO.getSuid()));
+                        new LambdaQueryWrapper<Channel>()
+                            .eq(Channel::getUserId, userShareVO.getSuid()));
                     if (null != channel) {
                         userTicketOrder.setChannelId(channel.getChannelId());
                         userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
@@ -248,7 +248,8 @@ public class UserTicketOrderServiceImpl extends
             // 无需支付的,直接置为成功
             processTicketOrder(userTicketOrder);
             // 插入付款异步任务
-            Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, userTicketOrder.getOrderId()), "盲票支付,创建异步任务失败:" + userTicketOrder.getOrderId());
+            Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, userTicketOrder.getOrderId()),
+                "盲票支付,创建异步任务失败:" + userTicketOrder.getOrderId());
         }
 
         return userTicketOrder.getOrderId();
@@ -258,14 +259,14 @@ public class UserTicketOrderServiceImpl extends
     public String createOfflineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
         Ticket ticket = ticketService.getById(orderSettleVO.getTicketId());
         Assert.isTrue(ticket.getStatus() == TicketStatusEnum.NOT_PAY,
-                "盲票已付款,ticketId:" + ticket.getTicketId());
+            "盲票已付款,ticketId:" + ticket.getTicketId());
         if (null != redisCache.getCacheObject(
-                RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()))) {
+            RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()))) {
             LogUtil.warn(logger, "线下盲票重复购买,ticketNo:{0}", ticket.getSerialNo());
             throw new ServiceException("重复购买,请稍后再试");
         }
         redisCache.setCacheObject(RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()),
-                userId, 5, TimeUnit.MINUTES);
+            userId, 5, TimeUnit.MINUTES);
 
         // 核销优惠券
         String couponIds = verifyUserCoupon(orderSettleVO.getCouponList());
@@ -292,11 +293,11 @@ public class UserTicketOrderServiceImpl extends
         }
         // 查询用户的所属经销商,线下票根据票包查询
         ChannelOrderDetail channelOrderDetail = channelOrderDetailService.getOne(
-                new LambdaQueryWrapper<ChannelOrderDetail>()
-                        .eq(ChannelOrderDetail::getPkgId, ticket.getPkgId()));
+            new LambdaQueryWrapper<ChannelOrderDetail>()
+                .eq(ChannelOrderDetail::getPkgId, ticket.getPkgId()));
         if (null == channelOrderDetail) {
             LogUtil.error(logger, "线下票,根据票包ID查询购买渠道为空。ticketId:{0}, pkgId{1}",
-                    ticket.getTicketId(), ticket.getPkgId());
+                ticket.getTicketId(), ticket.getPkgId());
         } else {
             ticketOrder.setChannelId(channelOrderDetail.getChannelId());
         }
@@ -318,7 +319,8 @@ public class UserTicketOrderServiceImpl extends
             processTicketOrder(ticketOrder);
 
             // 插入付款异步任务
-            Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, ticketOrder.getOrderId()), "盲票支付,创建异步任务失败:" + ticketOrder.getOrderId());
+            Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, ticketOrder.getOrderId()),
+                "盲票支付,创建异步任务失败:" + ticketOrder.getOrderId());
 
         }
         return ticketOrder.getOrderId();
@@ -347,7 +349,7 @@ public class UserTicketOrderServiceImpl extends
         for (String orderId : orderIds) {
             UserTicketOrder userTicketOrder = getById(orderId);
             Assert.isTrue(userTicketOrder.getResource() == TicketTypeEnum.ONLINE,
-                    "非在线盲票不用取消。boxId:" + boxId);
+                "非在线盲票不用取消。boxId:" + boxId);
             if (!rollbackOrder(userTicketOrder)) {
                 return false;
             }
@@ -360,14 +362,14 @@ public class UserTicketOrderServiceImpl extends
     private void rollbackBoxQty(String boxId, int qty) {
         TicketBox ticketBox = ticketBoxService.getById(boxId);
         boolean updateBox = ticketBoxService.update(
-                new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
-                                ticketBox.getSaleQty() - qty)
-                        .set(
-                                ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
-                                        && ticketBox.getManualOff() != 1,
-                                TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
-                        .eq(TicketBox::getBoxId, ticketBox.getBoxId())
-                        .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
+            new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
+                    ticketBox.getSaleQty() - qty)
+                .set(
+                    ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
+                        && ticketBox.getManualOff() != 1,
+                    TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+                .eq(TicketBox::getBoxId, ticketBox.getBoxId())
+                .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
         Assert.isTrue(updateBox, "取消过期未支付盲票购买订单,恢复票组销量失败。boxId:{0}" + boxId);
     }
 
@@ -390,7 +392,7 @@ public class UserTicketOrderServiceImpl extends
     private boolean rollbackOrder(UserTicketOrder userTicketOrder) {
         if (userTicketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
             LogUtil.warn(logger, "取消购票订单时,订单状态不是待支付,忽略。orderId:{0}, status:{1}",
-                    userTicketOrder.getOrderId(), userTicketOrder.getStatus());
+                userTicketOrder.getOrderId(), userTicketOrder.getStatus());
             return false;
         }
 
@@ -398,18 +400,18 @@ public class UserTicketOrderServiceImpl extends
             // 优惠券反核销
             List<String> userCouponIds = Arrays.asList(userTicketOrder.getCouponInfo().split(","));
             boolean rst = userCouponService.update(new LambdaUpdateWrapper<UserCoupon>()
-                    .set(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED)
-                    .set(UserCoupon::getVerifyTime, null)
-                    .in(UserCoupon::getId, userCouponIds));
+                .set(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED)
+                .set(UserCoupon::getVerifyTime, null)
+                .in(UserCoupon::getId, userCouponIds));
             Assert.isTrue(rst,
-                    "盲票购买订单取消时,反核销优惠券失败。orderId:" + userTicketOrder.getOrderId() + "userCouponIds:"
-                            + userTicketOrder.getCouponInfo());
+                "盲票购买订单取消时,反核销优惠券失败。orderId:" + userTicketOrder.getOrderId() + "userCouponIds:"
+                    + userTicketOrder.getCouponInfo());
         }
 
         boolean rst = update(new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus,
-                        UserTicketOrderStatusEnum.CANCELED)
-                .eq(UserTicketOrder::getOrderId, userTicketOrder.getOrderId())
-                .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
+                UserTicketOrderStatusEnum.CANCELED)
+            .eq(UserTicketOrder::getOrderId, userTicketOrder.getOrderId())
+            .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
         Assert.isTrue(rst, "盲票购买订单取消时,更新订单状态失败。orderId:" + userTicketOrder.getOrderId());
         return true;
     }
@@ -420,27 +422,47 @@ public class UserTicketOrderServiceImpl extends
         UserTicketOrder ticketOrder = getById(payOrder.getBizId());
         if (null == ticketOrder || ticketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
             LogUtil.error(logger, "支付回调用户购票订单处理,订单状态异常,不是待支付。payOrder:{0}, ticketOrder:{1}",
-                    JSONObject.toJSONString(payOrder), JSONObject.toJSONString(ticketOrder));
+                JSONObject.toJSONString(payOrder), JSONObject.toJSONString(ticketOrder));
             throw new ServiceException("支付回调用户购票订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
         }
         ticketOrder.setPayTime(DateUtils.parseDate(payOrder.getCompleteDate()));
 
         // 插入异步任务
-        Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, payOrder.getBizId()), "创建支付成功异步任务失败. orderId:" + payOrder.getOrderId());
+        Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, payOrder.getBizId()),
+            "创建支付成功异步任务失败. orderId:" + payOrder.getOrderId());
         return processTicketOrder(ticketOrder);
     }
 
     private boolean processTicketOrder(UserTicketOrder ticketOrder) {
         List<UserTicketOrderItem> orderItemList = userTicketOrderItemService.list(
-                new LambdaQueryWrapper<UserTicketOrderItem>()
-                        .eq(UserTicketOrderItem::getOrderId, ticketOrder.getOrderId()));
+            new LambdaQueryWrapper<UserTicketOrderItem>()
+                .eq(UserTicketOrderItem::getOrderId, ticketOrder.getOrderId()));
 
         for (UserTicketOrderItem orderItem : orderItemList) {
-            Ticket ticket;
+            Ticket ticket = null;
             if (ticketOrder.getResource() == TicketTypeEnum.ONLINE) {
-                // 线上票,要先分配票ticketId
-                ticket = ticketService.getRandOne(ticketOrder.getBoxId());
-                orderItem.setTicketId(ticket.getTicketId());
+                int loopNum = 0;
+                boolean flag = false;
+                // 循环3次
+                while (loopNum < 3) {
+                    loopNum++;
+                    // 线上票,要先分配票ticketId
+                    ticket = ticketService.getRandOne(ticketOrder.getBoxId());
+                    if (ticket == null) {
+                        continue;
+                    }
+                    String onlineTicketId = RedisKey.build(RedisKey.ONLINE_TICKET_ID_KEY, ticket.getTicketId());
+                    String ticketId = redisCache.getCacheObject(onlineTicketId);
+                    if (StringUtils.isNotBlank(ticketId)) {
+                        continue;
+                    }
+                    redisCache.setCacheObject(onlineTicketId, ticket.getTicketId(), 2, TimeUnit.MINUTES);
+                    orderItem.setTicketId(ticket.getTicketId());
+                    flag = true;
+                }
+                if (!flag) {
+                    throw new ServiceException("支付回调用户线上盲票订单处理,分配票失败。itemId:" + orderItem.getItemId());
+                }
                 boolean rst = userTicketOrderItemService.updateById(orderItem);
                 Assert.isTrue(rst, "支付回调用户购票订单处理,更新订单明细的盲票ID失败,itemId:" + orderItem.getItemId());
             } else {
@@ -449,21 +471,21 @@ public class UserTicketOrderServiceImpl extends
 
             // 开幸运数字,更新ticket状态为已激活
             boolean rtn = ticketService.update(
-                    new LambdaUpdateWrapper<Ticket>().set(Ticket::getPlainLuckyNum,
-                                    Integer.valueOf(RSAUtil.decrypt(ticket.getCipherLuckyNum())))
-                            .set(Ticket::getStatus, TicketStatusEnum.ACTIVATED)
-                            .eq(Ticket::getTicketId, ticket.getTicketId()));
+                new LambdaUpdateWrapper<Ticket>().set(Ticket::getPlainLuckyNum,
+                        Integer.valueOf(RSAUtil.decrypt(ticket.getCipherLuckyNum())))
+                    .set(Ticket::getStatus, TicketStatusEnum.ACTIVATED)
+                    .eq(Ticket::getTicketId, ticket.getTicketId()));
             Assert.isTrue(rtn, "支付回调用户购票订单处理,更新盲票状态失败,ticketId:" + ticket.getTicketId());
 
         }
 
         // 更新订单状态为已完成
         boolean updateRst = update(
-                new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus,
-                                UserTicketOrderStatusEnum.FINISHED)
-                        .set(UserTicketOrder::getPayTime, ticketOrder.getPayTime())
-                        .eq(UserTicketOrder::getOrderId, ticketOrder.getOrderId())
-                        .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
+            new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus,
+                    UserTicketOrderStatusEnum.FINISHED)
+                .set(UserTicketOrder::getPayTime, ticketOrder.getPayTime())
+                .eq(UserTicketOrder::getOrderId, ticketOrder.getOrderId())
+                .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
         Assert.isTrue(updateRst, "支付回调用户购票订单处理,更新订单状态失败,orderId:" + ticketOrder.getOrderId());
 
         return true;
@@ -477,10 +499,11 @@ public class UserTicketOrderServiceImpl extends
             UserTicketOrder ticketOrder = getById(orderId);
             BeanUtils.copyProperties(ticketOrder, channelCommParam);
             Assert.isTrue(channelCommParam.getCommStatus() != CommStatusEnum.YES,
-                    "结佣处理,结佣状态异常,不是结佣中或未结佣。orderId=" + orderId);
+                "结佣处理,结佣状态异常,不是结佣中或未结佣。orderId=" + orderId);
         } else {
             ChannelOrder channelOrder = channelOrderService.getById(orderId);
-            ChannelOrderItem channelOrderItem = channelOrderItemService.getOne(new LambdaQueryWrapper<ChannelOrderItem>()
+            ChannelOrderItem channelOrderItem = channelOrderItemService.getOne(
+                new LambdaQueryWrapper<ChannelOrderItem>()
                     .eq(ChannelOrderItem::getOrderId, orderId));
             channelCommParam.setBoxId(channelOrderItem.getBoxId());
             channelCommParam.setChannelId(channelOrder.getChannelId());
@@ -512,21 +535,21 @@ public class UserTicketOrderServiceImpl extends
                 channelCommission.setSaleCommAmt(siteCommission.getSaleCommAmt());
                 channelCommission.setCommRate(channel.getCommRate());
                 channelCommission.setCommAmt(new BigDecimal(channelCommission.getSaleCommAmt()).multiply(
-                                channelCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
-                        .intValue() - sumCommAmt);
+                        channelCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
+                    .intValue() - sumCommAmt);
                 channelCommissionService.save(channelCommission);
                 sumCommAmt += channelCommission.getCommAmt();
             }
         } else {
             LogUtil.info(logger, "渠道结佣时,订单对应的渠道不存在,无需结佣。orderId:{0}",
-                    channelCommParam.getOrderId());
+                channelCommParam.getOrderId());
         }
         if (ChannelCommissionResourceEnum.USER.getValue().equals(resource)) {
             boolean rst = update(
-                    new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus,
-                                    CommStatusEnum.YES)
-                            .eq(UserTicketOrder::getOrderId, orderId)
-                            .in(UserTicketOrder::getCommStatus, CommStatusEnum.DOING, CommStatusEnum.NO));
+                new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus,
+                        CommStatusEnum.YES)
+                    .eq(UserTicketOrder::getOrderId, orderId)
+                    .in(UserTicketOrder::getCommStatus, CommStatusEnum.DOING, CommStatusEnum.NO));
             Assert.isTrue(rst, "渠道结佣完成,更新订单状态失败。orderId:" + orderId);
         }
         return true;
@@ -543,7 +566,7 @@ public class UserTicketOrderServiceImpl extends
     }
 
     private ChannelCommission saveSiteCommAmt(ChannelCommParam channelCommParam, TicketBox ticketBox,
-                                              Channel channel) {
+        Channel channel) {
         ChannelCommission siteCommission = new ChannelCommission();
         siteCommission.setChannelId(channel.getChannelId());
         siteCommission.setOrderId(channelCommParam.getOrderId());
@@ -551,11 +574,11 @@ public class UserTicketOrderServiceImpl extends
         siteCommission.setSaleAmt(channelCommParam.getPayAmt());
         siteCommission.setSaleCommRate(ticketBox.getSaleCommRate());
         siteCommission.setSaleCommAmt(new BigDecimal(siteCommission.getSaleAmt()).multiply(
-                        siteCommission.getSaleCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
-                .intValue());
+                siteCommission.getSaleCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
+            .intValue());
         siteCommission.setCommRate(channel.getCommRate());
         siteCommission.setCommAmt(new BigDecimal(siteCommission.getSaleCommAmt()).multiply(
-                siteCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN).intValue());
+            siteCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN).intValue());
         channelCommissionService.save(siteCommission);
         return siteCommission;
     }
@@ -616,12 +639,14 @@ public class UserTicketOrderServiceImpl extends
     }
 
     @Override
-    public List<IndexVO> selectIndexTicketBoxTopByTicketOrderAndChannelOrder(IndexTicketBoxTopQueryParam indexTicketBoxTopQueryParam) {
+    public List<IndexVO> selectIndexTicketBoxTopByTicketOrderAndChannelOrder(
+        IndexTicketBoxTopQueryParam indexTicketBoxTopQueryParam) {
         return getBaseMapper().selectIndexTicketBoxTopByTicketOrderAndChannelOrder(indexTicketBoxTopQueryParam);
     }
 
     @Override
-    public List<IndexVO> selectIndexTicketSiteTopByTicketOrderAndChannelOrder(IndexTicketSiteTopQueryParam indexTicketSiteTopQueryParam) {
+    public List<IndexVO> selectIndexTicketSiteTopByTicketOrderAndChannelOrder(
+        IndexTicketSiteTopQueryParam indexTicketSiteTopQueryParam) {
         return getBaseMapper().selectIndexTicketSiteTopByTicketOrderAndChannelOrder(indexTicketSiteTopQueryParam);
     }
 

+ 15 - 6
mp-service/src/main/resources/mapper/admin/TicketMapper.xml

@@ -24,12 +24,21 @@
         ticket_id, box_id, pkg_id, title, serial_no, face_price, cipher_lucky_num, plain_lucky_num, draw_num, is_physical, status, created_time, updated_time
     </sql>
 
-    <select id="getRandOne" resultMap="BaseResultMap">
-        select t1.*
-        from mp_ticket  as t1
-            JOIN  (SELECT ROUND(RAND() * (SELECT MAX(ticket_id) FROM mp_ticket where box_id = #{boxId} AND status = #{status} )) AS id) AS t2
-        WHERE t1.ticket_id >= t2.id and t1.box_id = #{boxId} AND t1.status = #{status}
-        ORDER BY t1.ticket_id LIMIT 1;
+<!--    <select id="getRandOne" resultMap="BaseResultMap">-->
+<!--        select t1.*-->
+<!--        from mp_ticket  as t1-->
+<!--            JOIN  (SELECT ROUND(RAND() * (SELECT MAX(ticket_id) FROM mp_ticket where box_id = #{boxId} AND status = #{status} )) AS id) AS t2-->
+<!--        WHERE t1.ticket_id >= t2.id and t1.box_id = #{boxId} AND t1.status = #{status}-->
+<!--        ORDER BY t1.ticket_id LIMIT 1;-->
+<!--    </select>-->
+
+    <select id="getRandOne" resultType="com.qs.mp.admin.domain.Ticket">
+      SELECT t2.*
+      FROM (SELECT pkg_id FROM mp_ticket_package WHERE box_id = #{boxId} AND `status` != 3 ORDER BY RAND() LIMIT 1) as t1
+             LEFT JOIN mp_ticket t2 on t1.pkg_id = t2.pkg_id
+      WHERE t2.`status` = #{status}
+      ORDER BY RAND()
+      LIMIT 1;
     </select>
 
     <select id="listTicket" resultMap="BaseResultMap">