瀏覽代碼

盲票购买

chunping 3 年之前
父節點
當前提交
2242f0a637
共有 22 個文件被更改,包括 443 次插入115 次删除
  1. 3 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  2. 59 38
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  3. 1 8
      mp-admin/src/main/resources/application-8100.yml
  4. 1 8
      mp-admin/src/main/resources/application-8200.yml
  5. 1 8
      mp-admin/src/main/resources/application-dev.yml
  6. 1 8
      mp-admin/src/main/resources/application-test.yml
  7. 11 0
      mp-admin/src/main/resources/application.yml
  8. 1 2
      mp-common/src/main/java/com/qs/mp/common/enums/TicketStatusEnum.java
  9. 1 7
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java
  10. 1 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrder.java
  11. 1 1
      mp-service/src/main/java/com/qs/mp/channel/domain/param/OrderPayParam.java
  12. 50 18
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  13. 24 8
      mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java
  14. 2 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserCoupon.java
  15. 15 1
      mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java
  16. 1 1
      mp-service/src/main/java/com/qs/mp/user/domain/param/TicketOrderParam.java
  17. 7 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java
  18. 23 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  19. 7 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java
  20. 228 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  21. 1 2
      mp-service/src/main/resources/mapper/admin/TicketBoxMapper.xml
  22. 4 2
      mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

+ 3 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java

@@ -20,7 +20,7 @@ import com.qs.mp.channel.domain.ChannelCart;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.param.ChannelOrderParam;
-import com.qs.mp.channel.domain.param.ChannelOrderPayParam;
+import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
@@ -226,8 +226,8 @@ public class ChannelOrderController extends BaseApiController {
    */
   @PostMapping("/order/pay")
   @ApiOperation(value = "订单支付" , notes = "在订单列表页面支付")
-  public AjaxResult pay(@Valid @RequestBody ChannelOrderPayParam param) {
-    String openId = SecurityUtils.getLoginUser().getUser().getOpenId();
+  public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
+    String openId = SecurityUtils.getLoginUser().getUser().getChannelOpenId();
     ChannelOrder channelOrder = channelOrderService.getById(param.getOrderId());
     JSONObject jsonObject;
     try {

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

@@ -10,45 +10,30 @@
 
 package com.qs.mp.web.controller.api.user;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.Ticket;
-import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.TicketBox;
-import com.qs.mp.admin.domain.param.TicketBoxParam;
-import com.qs.mp.admin.domain.param.TicketParam;
-import com.qs.mp.admin.domain.vo.TicketBoxListVO;
-import com.qs.mp.admin.domain.vo.TicketBoxVO;
-import com.qs.mp.admin.domain.vo.TicketVO;
-import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ICouponTicketService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketService;
-import com.qs.mp.channel.domain.Channel;
-import com.qs.mp.channel.domain.ChannelAddr;
-import com.qs.mp.channel.domain.ChannelCart;
 import com.qs.mp.channel.domain.ChannelOrder;
-import com.qs.mp.channel.domain.param.ChannelOrderParam;
-import com.qs.mp.channel.domain.vo.ChannelCartVO;
-import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
+import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.common.core.domain.AjaxResult;
-import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
-import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketStatusEnum;
-import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.user.domain.UserTicketOrder;
-import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.param.TicketOrderParam;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
 import com.qs.mp.user.domain.vo.UserCouponVO;
 import com.qs.mp.user.service.IUserCouponService;
-import com.qs.mp.user.service.IUserHitPrizeService;
-import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
@@ -77,19 +62,19 @@ public class UserTicketOrderController extends BaseApiController {
   private ITicketBoxService ticketBoxService;
 
   @Autowired
-  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+  private IUserTicketOrderService userTicketOrderService;
 
   @Autowired
   private ITicketService ticketService;
 
   @Autowired
-  private IUserTicketOrderItemService userTicketOrderItemService;
+  private IUserCouponService userCouponService;
 
   @Autowired
-  private IUserHitPrizeService userHitPrizeService;
+  private ICouponTicketService couponTicketService;
 
   @Autowired
-  private IUserCouponService userCouponService;
+  private IWalletService walletService;
 
   @Autowired
   private MapperFacade mapperFacade;
@@ -102,7 +87,7 @@ public class UserTicketOrderController extends BaseApiController {
    * 订单结算,每次更换优惠券时需重新请求此接口
    */
   @PostMapping("/order/settle")
-  @ApiOperation(value = "订单结算" , notes = "购物车里点结算或者单个盲票商品上点立即购买")
+  @ApiOperation(value = "订单结算" , notes = "单个盲票商品上点立即购买")
   public AjaxResult settle(@Valid @RequestBody TicketOrderParam param) {
     if (StringUtils.isBlank(param.getTicketId()) && StringUtils.isBlank(param.getBoxId())) {
       return AjaxResult.error("参数缺失");
@@ -115,18 +100,16 @@ public class UserTicketOrderController extends BaseApiController {
     // 订单金额计算
     Integer orderAmt = 0;
     Integer discountAmt = 0;
-    String picUrl;
+    TicketBox ticketBox;
     if (StringUtils.isNotBlank(param.getTicketId())) {
       // 线下扫码购票
       Ticket ticket = ticketService.getById(param.getTicketId());
-      TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+      ticketBox = ticketBoxService.getById(ticket.getBoxId());
       orderAmt = ticketBox.getSalePrice();
-      picUrl = ticketBox.getPicUrl();
     } else {
       // 线上购票
-      TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+      ticketBox = ticketBoxService.getById(param.getBoxId());
       orderAmt = ticketBox.getSalePrice() * param.getOrderNum();
-      picUrl = ticketBox.getPicUrl();
     }
 
     if (param.getAutoCoupon() == 1) {
@@ -134,13 +117,23 @@ public class UserTicketOrderController extends BaseApiController {
       List<UserCouponVO> userCouponList = userCouponService.listTicketOrderCoupon(userId);
       for (UserCouponVO userCouponVO : userCouponList) {
         if (orderAmt >= userCouponVO.getMinOrderAmt() && orderAmt >= userCouponVO.getDiscount()) {
+          if (userCouponVO.getUseArea() == CouponUseAreaEnum.PRE_SCOPE) {
+            // 使用范围验证
+            List<CouponTicket> couponTicketList = couponTicketService.list(new LambdaQueryWrapper<CouponTicket>()
+                .eq(CouponTicket::getCouponId, userCouponVO.getCouponId()).eq(CouponTicket::getBoxId, ticketBox.getBoxId()));
+            if (CollectionUtils.isEmpty(couponTicketList)) {
+              continue;
+            }
+          }
           orderSettleVO.getCouponList().add(userCouponVO);
           discountAmt = userCouponVO.getDiscount();
         }
       }
-    } else {
+    } else if (!CollectionUtils.isEmpty(param.getUserCouponIds())){
       // 查询指定券
+      orderSettleVO.setCouponList(userCouponService.listTicketOrderCouponByIds(param.getUserCouponIds()));
     }
+
     orderSettleVO.setOrderAmt(orderAmt);
     orderSettleVO.setDiscountAmt(discountAmt);
     // 当前没有运费和优惠,实付金额=订单金额
@@ -148,7 +141,7 @@ public class UserTicketOrderController extends BaseApiController {
     orderSettleVO.setOrderNum(param.getOrderNum());
     orderSettleVO.setBoxId(param.getBoxId());
     orderSettleVO.setTicketId(param.getTicketId());
-    orderSettleVO.setPicUrl(picUrl);
+    orderSettleVO.setPicUrl(ticketBox.getPicUrl());
 
     // 缓存订单结算对象
     redisCache.setCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
@@ -167,12 +160,40 @@ public class UserTicketOrderController extends BaseApiController {
     if (null == orderSettleVO) {
       return AjaxResult.error("订单已过期,请重新下单");
     }
-    //String orderId = channelOrderService.submitOrder(channelId, order.getMemo(), orderSettleVO);
+    String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO);
 
     // 清除缓存的订单
     redisCache.deleteObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
 
-    return AjaxResult.success();
+    return AjaxResult.success(orderId);
+  }
+
+
+  /**
+   * 取消订单
+   */
+  @PostMapping("/order/cancel")
+  @ApiOperation(value = "取消订单" , notes = "在订单列表页面取消")
+  public AjaxResult cancel(@RequestBody ChannelOrder order) {
+    userTicketOrderService.cancelOrder(order.getOrderId());
+    return AjaxResult.success("取消成功");
+  }
+
+  /**
+   * 订单支付
+   */
+  @PostMapping("/order/pay")
+  @ApiOperation(value = "订单支付" , notes = "在盲票页面支付")
+  public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
+    String openId = SecurityUtils.getLoginUser().getUser().getOpenId();
+    UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
+    JSONObject jsonObject;
+    try {
+      jsonObject = walletService.pay(BizTypeEnum.USER_ORDER, param.getOrderId(), openId, ticketOrder.getPayAmt());
+    }catch (ServiceException e) {
+      return AjaxResult.error(e.getMessage());
+    }
+    return AjaxResult.success(jsonObject);
   }
 
 }

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

@@ -1,13 +1,6 @@
 #三方支付配置
 pay:
-  notify:
-    url: https://www.quanshu123.com
-  call:
-    backUrl: https://api.quanshu123.com/service/notify/payCallback
-  base:
-    url: https://jlpays.kakapaypay.com
-  shopNo: 1631243148392
-  sign: 121bb2b8446b48979958542749df9ee3
+  callbackUrl: https://api.quanshu123.com/service/notify/payCallback
 
 # 日志配置
 logging:

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

@@ -1,13 +1,6 @@
 #三方支付配置
 pay:
-  notify:
-    url: https://www.quanshu123.com
-  call:
-    backUrl: https://api.quanshu123.com/service/notify/payCallback
-  base:
-    url: https://jlpays.kakapaypay.com
-  shopNo: 1631243148392
-  sign: 121bb2b8446b48979958542749df9ee3
+  callbackUrl: https://api.quanshu123.com/service/notify/payCallback
 
 # 日志配置
 logging:

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

@@ -1,12 +1,5 @@
 pay:
-    notify:
-        url: https://www.quanshu123.com
-    call:
-        backUrl: https://test-mp.quanshu123.com/service/notify/payCallback
-    base:
-        url: https://jlpays.kakapaypay.com
-    shopNo: 1631243148392
-    sign: 121bb2b8446b48979958542749df9ee3
+    callbackUrl: https://test-mp.quanshu123.com/service/notify/payCallback
 
 # 数据源配置
 spring:

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

@@ -1,12 +1,5 @@
 pay:
-  notify:
-    url: https://www.quanshu123.com
-  call:
-    backUrl: https://test-mp.quanshu123.com/service/notify/payCallback
-  base:
-    url: https://jlpays.kakapaypay.com
-  shopNo: 1631243148392
-  sign: 121bb2b8446b48979958542749df9ee3
+  callbackUrl: https://test-mp.quanshu123.com/service/notify/payCallback
 
 # 日志配置
 logging:

+ 11 - 0
mp-admin/src/main/resources/application.yml

@@ -134,3 +134,14 @@ wx-user:
 #公众号appid
 wxgzh:
   appId: wxfe9785e665c741a2
+
+#三方支付配置
+pay:
+  notifyUrl: https://www.quanshu123.com
+  #callbackUrl: https://api.quanshu123.com/service/notify/payCallback
+  baseUrl: https://jlpays.kakapaypay.com
+  user-shopNo: 1646882813774
+  user-sign: 614140724fb74085be8aef8bebc538ed
+  channel-shopNo: 1646882813774
+  channel-sign: 614140724fb74085be8aef8bebc538ed
+

+ 1 - 2
mp-common/src/main/java/com/qs/mp/common/enums/TicketStatusEnum.java

@@ -14,8 +14,7 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 public enum TicketStatusEnum implements IEnum<Integer> {
   NOT_PAY(1, "未付款"),
   ACTIVATED(2, "已激活"),
-  CASHED(3, "已兑奖"),
-  PAYING(4, "付款中"),; // 线上订单创建后,盲票状态变更为付款中,防止并发
+  CASHED(3, "已兑奖"),;
 
   private final int value;
   private final String desc;

+ 1 - 7
mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java

@@ -80,12 +80,6 @@ public class TicketBox implements Serializable {
   @TableField("sale_qty")
   private Integer saleQty;
 
-  /**
-   * 盲票包原价
-   */
-  @TableField("pkg_price")
-  private Integer pkgPrice;
-
   /**
    * 盲票包售价
    */
@@ -147,7 +141,7 @@ public class TicketBox implements Serializable {
   private Date offTime;
 
   /**
-   * 人工下架标识
+   * 人工下架标识,1为人工下架
    */
   @TableField("manual_off")
   private Integer manualOff;

+ 1 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrder.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.Version;
 import com.qs.mp.common.enums.ChannelOrderStatusEnum;
 import java.io.Serializable;
 import java.util.Date;

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

@@ -8,7 +8,7 @@ import lombok.Data;
 
 @ApiModel(value= "订单支付参数")
 @Data
-public class ChannelOrderPayParam {
+public class OrderPayParam {
 
 	@NotNull(message = "订单ID不能为空")
 	@ApiModelProperty(value = "订单ID",required=true)

+ 50 - 18
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -3,6 +3,7 @@ package com.qs.mp.channel.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.channel.domain.ChannelAddr;
@@ -11,11 +12,9 @@ import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.mapper.ChannelOrderMapper;
-import com.qs.mp.channel.service.IChannelAddrService;
 import com.qs.mp.channel.service.IChannelCartService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.common.enums.ChannelOrderStatusEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
@@ -39,7 +38,9 @@ import org.springframework.transaction.annotation.Transactional;
  * @since 2022-03-02
  */
 @Service
-public class ChannelOrderServiceImpl extends ServiceImpl<ChannelOrderMapper, ChannelOrder> implements IChannelOrderService {
+public class ChannelOrderServiceImpl extends
+    ServiceImpl<ChannelOrderMapper, ChannelOrder> implements IChannelOrderService {
+
   protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
 
   @Autowired
@@ -87,11 +88,18 @@ public class ChannelOrderServiceImpl extends ServiceImpl<ChannelOrderMapper, Cha
       prodNum += channelCartVO.getOrderNum();
       title.append(ticketBox.getTitle()).append(",");
       // 更新盲票组的已销售数和状态,乐观锁
-      ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
-          .set(ticketBox.getPkgSalePrice() + channelCartVO.getOrderNum() == ticketBox.getPkgQty(), TicketBox::getStatus,
+      boolean rst = ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+          .set(ticketBox.getPkgSalePrice() + channelCartVO.getOrderNum() == ticketBox.getPkgQty(),
+              TicketBox::getStatus,
               TicketBoxStatusEnum.PUT_OFF)
           .set(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty() + channelCartVO.getOrderNum())
-          .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty()).eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+          .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty())
+          .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+      if (!rst) {
+        LogUtil.error(logger, "渠道采购票组订单创建时,更新盲票组销量失败。boxId:{0}, saleQty:{1}",
+            ticketBox.getBoxId(), ticketBox.getSaleQty());
+        throw new ServiceException("渠道采购票组订单创建时,更新盲票组销量失败");
+      }
       // 删除购物车
       if (null != channelCartVO.getCartId() && 0 != channelCartVO.getCartId()) {
         channelCartService.removeById(channelCartVO.getCartId());
@@ -131,31 +139,55 @@ public class ChannelOrderServiceImpl extends ServiceImpl<ChannelOrderMapper, Cha
       throw new ServiceException("订单状态异常,不能取消");
     }
 
-    List<ChannelOrderItem> orderItemList = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
-        .eq(ChannelOrderItem::getOrderId, orderId));
+    List<ChannelOrderItem> orderItemList = channelOrderItemService.list(
+        new LambdaQueryWrapper<ChannelOrderItem>()
+            .eq(ChannelOrderItem::getOrderId, orderId));
     for (ChannelOrderItem orderItem : orderItemList) {
       TicketBox ticketBox = ticketBoxService.getById(orderItem.getBoxId());
       // 恢复盲票组的已销售数和状态,乐观锁
-      ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
-          .set(ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF && ticketBox.getManualOff() != 1, TicketBox::getStatus,
+      boolean rst = ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+          .set(
+              ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF && ticketBox.getManualOff() != 1,
+              TicketBox::getStatus,
               TicketBoxStatusEnum.PUT_ON)
           .set(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty() - orderItem.getOrderNum())
-          .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty()).eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+          .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty())
+          .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+      if (!rst) {
+        LogUtil.error(logger, "渠道采购票组订单取消时,更新盲票组销量失败。boxId:{0}, saleQty:{1}",
+            ticketBox.getBoxId(), ticketBox.getSaleQty());
+        throw new ServiceException("渠道采购票组订单取消时,更新盲票组销量失败");
+      }
+    }
+    boolean rst = channelOrderService.update(
+        new LambdaUpdateWrapper<ChannelOrder>().set(ChannelOrder::getStatus,
+                ChannelOrderStatusEnum.CANCELED)
+            .eq(ChannelOrder::getOrderId, orderId)
+            .eq(ChannelOrder::getStatus, ChannelOrderStatusEnum.NOT_PAY));
+    if (!rst) {
+      LogUtil.error(logger, "渠道采购票组订单取消时,更新订单状态失败。orderId:{0}", orderId);
+      throw new ServiceException("渠道采购票组订单取消时,更新订单状态失败");
     }
-    channelOrderService.update(new LambdaUpdateWrapper<ChannelOrder>().set(ChannelOrder::getStatus, ChannelOrderStatusEnum.CANCELED)
-        .eq(ChannelOrder::getOrderId, orderId));
     return true;
   }
 
   @Override
   public void paySuccess(PayOrder payOrder) {
-    ChannelOrder channelOrder = channelOrderService.getById(payOrder.getBizId());
-    if (channelOrder.getStatus() != ChannelOrderStatusEnum.NOT_PAY) {
+    ChannelOrder channelOrder = getById(payOrder.getBizId());
+    if (null == channelOrder || channelOrder.getStatus() != ChannelOrderStatusEnum.NOT_PAY) {
       LogUtil.error(logger, "支付回调渠道订单处理,订单状态异常,不是待支付。payOrder:{0}, channelOrder:{1}",
-          new Object[]{JSONObject.toJSONString(payOrder), JSONObject.toJSONString(channelOrder)});
+          JSONObject.toJSONString(payOrder), JSONObject.toJSONString(channelOrder));
       throw new ServiceException("支付回调渠道订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
     }
-    channelOrderService.update(new LambdaUpdateWrapper<ChannelOrder>().set(ChannelOrder::getStatus, ChannelOrderStatusEnum.NOT_DELIVER)
-        .eq(ChannelOrder::getOrderId, channelOrder.getOrderId()));
+    boolean rst = update(
+        new LambdaUpdateWrapper<ChannelOrder>().set(ChannelOrder::getStatus,
+                ChannelOrderStatusEnum.NOT_DELIVER)
+            .eq(ChannelOrder::getOrderId, channelOrder.getOrderId())
+            .eq(ChannelOrder::getStatus, ChannelOrderStatusEnum.NOT_PAY));
+    if (!rst) {
+      LogUtil.error(logger, "渠道采购票组订单支付成功时,更新订单状态失败。orderId:{0}",
+          channelOrder.getOrderId());
+      throw new ServiceException("渠道采购票组订单支付成功时,更新订单状态失败");
+    }
   }
 }

+ 24 - 8
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -13,6 +13,7 @@ import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.pay.service.IPayOrderService;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.service.IUserTicketOrderService;
 import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,24 +39,32 @@ public class WalletServiceImpl implements IWalletService {
   @Autowired
   private IChannelOrderService channelOrderService;
 
+  @Autowired
+  private IUserTicketOrderService userTicketOrderService;
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
-  @Value("${pay.notify.url}")
+  @Value("${pay.notifyUrl}")
   private String notifyUrl;  //支付成功前端跳转地址
-  @Value("${pay.call.backUrl}")
+  @Value("${pay.callbackUrl}")
   private String callbackUrl;  //支付回调地址
-  @Value("${pay.base.url}")
-  private String baseUrl = "https://jlpays.kakapaypay.com/";
+  @Value("${pay.baseUrl}")
+  private String baseUrl;
   @Value("${wx-channel.appId}")
   private String channelAppId;
   @Value("${wx-user.appId}")
   private String userAppId;
 
-  @Value("${pay.shopNo}")
-  private String payShopNo;  //平台商户号
-  @Value("${pay.sign}")
-  private String paySign;  //平台商户签名
+  @Value("${pay.user-shopNo}")
+  private String userPayShopNo;  //用户端商户号
+  @Value("${pay.user-sign}")
+  private String userPaySign;  //用户端商户签名
+
+  @Value("${pay.channel-shopNo}")
+  private String channelPayShopNo;  //渠道端商户号
+  @Value("${pay.channel-sign}")
+  private String channelPaySign;  //渠道端商户签名
 
   private static final String REQ_STATUS_SUCCESS = "R0001";
   private static final String PAY_RESOURCE = "2"; //2:微信支付
@@ -65,8 +74,12 @@ public class WalletServiceImpl implements IWalletService {
   public JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money) {
     String reqUrl = baseUrl + "/pay/payMoneyCTB";
     String appId = channelAppId;
+    String payShopNo = channelPayShopNo;
+    String paySign = channelPaySign;
     if (bizType == BizTypeEnum.USER_ORDER) {
       appId = userAppId;
+      payShopNo = userPayShopNo;
+      paySign = userPaySign;
     }
     JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId);
     String result = OkHttpUtil.postJsonParams(reqUrl, params.toJSONString());
@@ -121,6 +134,9 @@ public class WalletServiceImpl implements IWalletService {
     if (BizTypeEnum.CHANNEL_ORDER == payOrder.getBizType()) {
       // 业务订单支付成功,调用业务订单服务处理
       channelOrderService.paySuccess(payOrder);
+    } else if (BizTypeEnum.CHANNEL_ORDER == payOrder.getBizType()) {
+      // 业务订单支付成功,调用业务订单服务处理
+      userTicketOrderService.paySuccess(payOrder);
     } else {
       //数据结构异常,告警
       LogUtil.error(logger, "该业务单据类型未支持,orderNo:" + orderNo);

+ 2 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserCoupon.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.Version;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
@@ -87,6 +88,7 @@ public class UserCoupon implements Serializable {
    * 更新时间
    */
   @TableField("updated_time")
+  @Version
   private Date updatedTime;
 
 

+ 15 - 1
mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
@@ -40,6 +42,12 @@ public class UserTicketOrder implements Serializable {
   @TableField("title")
   private String title;
 
+  /**
+   * 票组ID
+   */
+  @TableField("box_id")
+  private String boxId;
+
   /**
    * 订单金额
    */
@@ -74,7 +82,13 @@ public class UserTicketOrder implements Serializable {
    * 订单来源
    */
   @TableField("resource")
-  private String resource;
+  private TicketTypeEnum resource;
+
+  /**
+   * 使用优惠信息
+   */
+  @TableField("coupon_info")
+  private String couponInfo;
 
   /**
    * 订单状态;-1 已取消 0:待付款 1:已完成

+ 1 - 1
mp-service/src/main/java/com/qs/mp/user/domain/param/TicketOrderParam.java

@@ -10,7 +10,7 @@ import lombok.Data;
 public class TicketOrderParam {
 
 	@ApiModelProperty(value = "优惠券IDs",required=false)
-	private List<String> couponIds;
+	private List<String> userCouponIds;
 
 	@ApiModelProperty(value = "盲票组ID",required=false)
 	private String boxId;

+ 7 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java

@@ -21,4 +21,11 @@ public interface IUserCouponService extends IService<UserCoupon> {
    * @return
    */
   List<UserCouponVO> listTicketOrderCoupon(Long userId);
+
+  /**
+   * 根据用户优惠券ID列表查询
+   * @param userCouponIds
+   * @return
+   */
+  List<UserCouponVO> listTicketOrderCouponByIds(List<String> userCouponIds);
 }

+ 23 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java

@@ -1,7 +1,9 @@
 package com.qs.mp.user.service;
 
+import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
 
 /**
  * <p>
@@ -13,4 +15,25 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IUserTicketOrderService extends IService<UserTicketOrder> {
 
+  /**
+   * 提交盲票购买订单
+   * @param userId
+   * @param orderSettleVO
+   * @return
+   */
+  String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO);
+
+  /**
+   * 取消订单(恢复优惠券、票组销量)
+   * @param orderId
+   * @return
+   */
+  boolean cancelOrder(String orderId);
+
+  /**
+   * 支付成功回调
+   * @param payOrder
+   * @return
+   */
+  boolean paySuccess(PayOrder payOrder);
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java

@@ -32,4 +32,11 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
         .orderByDesc("t2.discount"));
     return userCouponVOList;
   }
+
+  @Override
+  public List<UserCouponVO> listTicketOrderCouponByIds(List<String> userCouponIds) {
+    List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(new QueryWrapper<UserCoupon>()
+        .in("t1.id", userCouponIds));
+    return userCouponVOList;
+  }
 }

+ 228 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -1,10 +1,45 @@
 package com.qs.mp.user.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelUserRel;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.enums.ChannelOrderStatusEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.pay.domain.PayOrder;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.UserCoupon;
 import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
+import com.qs.mp.user.domain.vo.UserCouponVO;
 import com.qs.mp.user.mapper.UserTicketOrderMapper;
+import com.qs.mp.user.service.IUserCouponService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <p>
@@ -17,4 +52,197 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserTicketOrderServiceImpl extends ServiceImpl<UserTicketOrderMapper, UserTicketOrder> implements IUserTicketOrderService {
 
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private IUserCouponService userCouponService;
+
+  @Autowired
+  private IChannelUserRelService channelUserRelService;
+
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Autowired
+  private ITicketService ticketService;
+
+  @Autowired
+  private BizIdGenerator bizIdGenerator;
+  @Override
+  @Transactional
+  public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+    if (StringUtils.isNotBlank(orderSettleVO.getBoxId())){
+      return createOnlineOrder(userId, orderSettleVO);
+    }
+
+    // 线下票不需锁库存,待付款成功后再更新票组销量
+    return createOfflineOrder(userId, orderSettleVO);
+  }
+
+  private String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+    // 线上票更新票组销量,防止超卖
+    TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
+    if (ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF || ticketBox.getSaleQty() + orderSettleVO.getOrderNum() > ticketBox.getQuantity()) {
+      LogUtil.error(logger, "库存不足,boxId:{0},qty:{1},saleQty:{2},orderNum:{3}", new Object[]{ticketBox.getBoxId(), ticketBox.getQuantity(), ticketBox.getSaleQty(), orderSettleVO.getOrderNum()});
+      throw new ServiceException("库存不足");
+    }
+    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()));
+    if (!rst) {
+      LogUtil.error(logger, "盲票购买订单创建时,更新盲票销量失败。boxId:{0}, saleQty:{1}", new Object[]{ticketBox.getBoxId(), ticketBox.getSaleQty()});
+      throw new ServiceException("盲票购买订单创建时,更新盲票销量失败");
+    }
+    // 核销优惠券
+    String couponIds = verifyUserCoupon(orderSettleVO.getCouponList());
+
+    // 创建订单
+    UserTicketOrder userTicketOrder = new UserTicketOrder();
+    userTicketOrder.setOrderId(bizIdGenerator.newId());
+    userTicketOrder.setUserId(userId);
+    userTicketOrder.setTitle(orderSettleVO.getTitle());
+    userTicketOrder.setBoxId(orderSettleVO.getBoxId());
+    userTicketOrder.setOrderAmt(orderSettleVO.getOrderAmt());
+    userTicketOrder.setDiscountAmt(orderSettleVO.getDiscountAmt());
+    userTicketOrder.setPayAmt(orderSettleVO.getPayAmt());
+    userTicketOrder.setTicketNum(orderSettleVO.getOrderNum());
+    userTicketOrder.setMemo("");
+    userTicketOrder.setResource(TicketTypeEnum.ONLINE);
+    userTicketOrder.setCouponInfo(couponIds);
+    userTicketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
+    save(userTicketOrder);
+
+    // 查询用户的所属经销商,线上票直接查询
+    ChannelUserRel channelUserRel = channelUserRelService.getOne(new LambdaQueryWrapper<ChannelUserRel>()
+        .eq(ChannelUserRel::getUserId, userId));
+    for (int i = 0; i < orderSettleVO.getOrderNum(); i++) {
+      UserTicketOrderItem orderItem = new UserTicketOrderItem();
+      orderItem.setItemId(bizIdGenerator.newId());
+      orderItem.setOrderId(userTicketOrder.getOrderId());
+      orderItem.setUserId(userId);
+      orderItem.setBoxId(ticketBox.getBoxId());
+      orderItem.setTicketId(null); // 付款成功后再分配具体盲票
+      orderItem.setChannelId(null == channelUserRel ? null : channelUserRel.getChannelId());
+      userTicketOrderItemService.save(orderItem);
+    }
+    return userTicketOrder.getOrderId();
+  }
+
+  private String createOfflineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+    Ticket ticket = ticketService.getById(orderSettleVO.getTicketId());
+    if (ticket.getStatus() != TicketStatusEnum.NOT_PAY) {
+      LogUtil.error(logger, "盲票已付款,ticketId:{0},status:{1}", new Object[]{ticket.getTicketId(), ticket.getStatus()});
+    }
+    // 核销优惠券
+    String couponIds = verifyUserCoupon(orderSettleVO.getCouponList());
+
+    UserTicketOrder ticketOrder = new UserTicketOrder();
+    ticketOrder.setOrderId(bizIdGenerator.newId());
+    ticketOrder.setUserId(userId);
+    ticketOrder.setTitle(ticket.getTitle());
+    ticketOrder.setBoxId(ticket.getBoxId());
+    ticketOrder.setOrderAmt(orderSettleVO.getOrderAmt());
+    ticketOrder.setDiscountAmt(orderSettleVO.getDiscountAmt());
+    ticketOrder.setPayAmt(orderSettleVO.getPayAmt());
+    ticketOrder.setTicketNum(1);
+    ticketOrder.setMemo("");
+    ticketOrder.setResource(TicketTypeEnum.OFFLINE);
+    ticketOrder.setCouponInfo(couponIds);
+    ticketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
+    save(ticketOrder);
+
+    // 查询用户的所属经销商,线上票直接查询
+    ChannelUserRel channelUserRel = channelUserRelService.getOne(new LambdaQueryWrapper<ChannelUserRel>()
+        .eq(ChannelUserRel::getUserId, userId));
+    UserTicketOrderItem orderItem = new UserTicketOrderItem();
+    orderItem.setItemId(bizIdGenerator.newId());
+    orderItem.setOrderId(ticketOrder.getOrderId());
+    orderItem.setUserId(userId);
+    orderItem.setBoxId(ticket.getBoxId());
+    orderItem.setTicketId(ticket.getTicketId());
+    orderItem.setChannelId(null == channelUserRel ? null : channelUserRel.getChannelId());
+    userTicketOrderItemService.save(orderItem);
+    return ticketOrder.getOrderId();
+  }
+
+  private String verifyUserCoupon (List<UserCouponVO> userCouponVOList) {
+    StringBuilder sb = new StringBuilder();
+    for (UserCouponVO userCouponVO : userCouponVOList) {
+      UserCoupon userCoupon = userCouponService.getById(userCouponVO.getId());
+      userCoupon.setVerifyTime(new Date());
+      userCoupon.setStatus(UserCouponStatusEnum.USED);
+      boolean rst = userCouponService.updateById(userCoupon);
+      if (!rst) {
+        LogUtil.error(logger, "盲票购买订单创建时,核销优惠券失败。userCoupon:{0}", new Object[]{JSONObject.toJSONString(userCoupon)});
+        throw new ServiceException("盲票购买订单创建时,核销优惠券失败");
+      }
+      sb.append(userCouponVO.getId()).append(",");
+    }
+    if (sb.length() > 0) {
+      return sb.substring(0, sb.length() -1);
+    }
+    return sb.toString();
+  }
+
+  @Override
+  @Transactional
+  public boolean cancelOrder(String orderId) {
+    UserTicketOrder userTicketOrder = getById(orderId);
+    if (userTicketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
+      LogUtil.warn(logger, "取消购票订单时,订单状态不是待支付,忽略。orderId:{0}, status:{1}", new Object[]{orderId, userTicketOrder.getStatus()});
+      return false;
+    }
+
+    if (StringUtils.isNotBlank(userTicketOrder.getCouponInfo())) {
+      // 优惠券反核销
+      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));
+      if (!rst) {
+        LogUtil.error(logger, "盲票购买订单取消时,反核销优惠券失败。orderId:{0}, userCouponIds:{1}", new Object[]{orderId, userTicketOrder.getCouponInfo()});
+        throw new ServiceException("盲票购买订单取消时,反核销优惠券失败");
+      }
+    }
+    if (userTicketOrder.getResource() == TicketTypeEnum.ONLINE) {
+      // TODO 线上票库存回滚,此处需要按票组累计起来回滚
+      TicketBox ticketBox = ticketBoxService.getById(userTicketOrder.getBoxId());
+      ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty, ticketBox.getSaleQty() - userTicketOrder.getTicketNum())
+          .set(ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF && ticketBox.getManualOff() != 1,TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+          .eq(TicketBox::getBoxId, ticketBox.getBoxId()).eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
+
+    }
+
+    boolean rst = update(new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.CANCELED)
+        .eq(UserTicketOrder::getOrderId, orderId).eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
+    if (!rst) {
+      LogUtil.error(logger, "盲票购买订单取消时,更新订单状态失败。orderId:{0}", orderId);
+      throw new ServiceException("盲票购买订单取消时,更新订单状态失败");
+    }
+    return true;
+  }
+
+  @Override
+  public boolean paySuccess(PayOrder payOrder) {
+    UserTicketOrder ticketOrder = getById(payOrder.getBizId());
+    if (null == ticketOrder || ticketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
+      LogUtil.error(logger, "支付回调用户购票订单处理,订单状态异常,不是待支付。payOrder:{0}, channelOrder:{1}",
+          JSONObject.toJSONString(payOrder), JSONObject.toJSONString(ticketOrder));
+      throw new ServiceException("支付回调用户购票订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
+    }
+    // 线上票,要先分配票ticketId
+    if (ticketOrder.getResource() == TicketTypeEnum.ONLINE) {
+      List<UserTicketOrderItem> orderItemList = userTicketOrderItemService.list(new LambdaQueryWrapper<UserTicketOrderItem>()
+          .eq(UserTicketOrderItem::getOrderId, ticketOrder.getOrderId()));
+    }
+    // 更新订单状态为已完成
+
+    // 开幸运数字
+
+    return false;
+  }
 }

+ 1 - 2
mp-service/src/main/resources/mapper/admin/TicketBoxMapper.xml

@@ -13,7 +13,6 @@
         <result column="type" property="type" />
         <result column="quantity" property="quantity" />
         <result column="sale_qty" property="saleQty" />
-        <result column="pkg_price" property="pkgPrice" />
         <result column="pkg_sale_price" property="pkgSalePrice" />
         <result column="pkg_unit" property="pkgUnit" />
         <result column="pkg_qty" property="pkgQty" />
@@ -33,7 +32,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        box_id, title, pic_url, category_id, description, sale_point, type, quantity, sale_qty, pkg_price, pkg_sale_price, pkg_unit, pkg_qty, sale_pkg_qty, face_price, sale_price, sale_comm_rate, properties, on_time, off_time, manual_off, status, is_deleted, created_time, updated_time
+        box_id, title, pic_url, category_id, description, sale_point, type, quantity, sale_qty, pkg_sale_price, pkg_unit, pkg_qty, sale_pkg_qty, face_price, sale_price, sale_comm_rate, properties, on_time, off_time, manual_off, status, is_deleted, created_time, updated_time
     </sql>
 
 </mapper>

+ 4 - 2
mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

@@ -7,12 +7,14 @@
         <id column="order_id" property="orderId" />
         <result column="user_id" property="userId" />
         <result column="title" property="title" />
+        <result column="box_id" property="boxId" />
         <result column="order_amt" property="orderAmt" />
         <result column="discount_amt" property="discountAmt" />
         <result column="pay_amt" property="payAmt" />
         <result column="ticket_num" property="ticketNum" />
         <result column="memo" property="memo" />
         <result column="resource" property="resource" />
+        <result column="coupon_info" property="couponInfo" />
         <result column="status" property="status" />
         <result column="created_time" property="createdTime" />
         <result column="updated_time" property="updatedTime" />
@@ -20,7 +22,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        order_id, user_id, title, order_amt, discount_amt, pay_amt, ticket_num, memo, resource, status, created_time, updated_time
+        order_id, user_id, title, box_id, order_amt, discount_amt, pay_amt, ticket_num, memo, resource, coupon_info, status, created_time, updated_time
     </sql>
 
-</mapper>
+</mapper>