Browse Source

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

支付后盲票分配优化

See merge request quanshu/mp-server!809
jiang hao 2 years ago
parent
commit
40c94990ff

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

@@ -9,6 +9,8 @@ import com.qs.mp.common.utils.MessageHelper;
  *
  */
 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"),
     WX_APP_TOKEN_KEY("app_token_key_{0}", "小程序app token"),

+ 23 - 4
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -436,11 +436,30 @@ public class UserTicketOrderServiceImpl extends
                         .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.isBlank(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 {

+ 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">