Browse Source

盲票首页中奖弹幕接口

cup 3 years ago
parent
commit
19ec8272af

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

@@ -3,6 +3,7 @@ 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.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.TicketBox;
@@ -25,21 +26,25 @@ import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.user.domain.UserHitPrize;
 import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
 import com.qs.mp.user.service.IUserHitPrizeService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 @RestController
@@ -231,4 +236,50 @@ public class UserTicketController extends BaseApiController {
     return AjaxResult.success();
   }
 
+  @GetMapping("/ticket/hitPrizeBarrage")
+  @ApiOperation(value = "中奖弹幕", notes = "获取最近中奖的 20-22 条信息")
+  public AjaxResult hitPrizeBarrage() {
+
+    // 获取用户 id
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+
+    // 弹幕列表
+    List<TicketHitPrizeBarrageVO> listOne = new ArrayList<>();
+    List<TicketHitPrizeBarrageVO> listTwo = new ArrayList<>();
+
+    // 获取用户当天中奖的 2 条弹幕
+    if (userId != null) {
+      List<TicketHitPrizeBarrageVO> ticketHitPrizeBarrageVOList = userHitPrizeService.hitPrizeBarrageByUserId(userId);
+      if (CollectionUtils.isNotEmpty(ticketHitPrizeBarrageVOList)) {
+        for (int i = 0; i < ticketHitPrizeBarrageVOList.size(); i++) {
+          if (i % 2 == 0) {
+            listOne.add(ticketHitPrizeBarrageVOList.get(i));
+          }else {
+            listTwo.add(ticketHitPrizeBarrageVOList.get(i));
+          }
+        }
+      }
+    }
+    // 获取除该用户外,最近中奖的 20 条弹幕信息
+    List<TicketHitPrizeBarrageVO> ticketHitPrizeBarrageVOList = userHitPrizeService.hitPrizeBarrage(userId);
+
+    for (int i = 0; i < ticketHitPrizeBarrageVOList.size(); i++) {
+      if (i % 2 == 0) {
+        listOne.add(ticketHitPrizeBarrageVOList.get(i));
+      }else {
+        listTwo.add(ticketHitPrizeBarrageVOList.get(i));
+      }
+    }
+    Map<String,List<TicketHitPrizeBarrageVO>> ticketHitPrizeBarrageMap = new HashMap<>();
+    ticketHitPrizeBarrageMap.put("listOne",listOne);
+    ticketHitPrizeBarrageMap.put("listTwo",listTwo);
+
+    return AjaxResult.success(ticketHitPrizeBarrageMap);
+  }
+
+
+
+
+
+
 }

+ 32 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/TicketHitPrizeBarrageVO.java

@@ -0,0 +1,32 @@
+package com.qs.mp.user.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 盲票中奖弹幕 VO
+ *
+ * @author Cup
+ * @date 2022/4/13
+ */
+@ApiModel("盲票中奖弹幕 VO")
+@Data
+public class TicketHitPrizeBarrageVO {
+
+    @ApiModelProperty("用户名")
+    private String nickName;
+
+    @ApiModelProperty("用户头像")
+    private String avatar;
+
+    @ApiModelProperty("奖品信息")
+    private String prizeInfo;
+
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/user/mapper/UserHitPrizeMapper.java

@@ -2,6 +2,11 @@ package com.qs.mp.user.mapper;
 
 import com.qs.mp.user.domain.UserHitPrize;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @auther quanshu
@@ -10,4 +15,19 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface UserHitPrizeMapper extends BaseMapper<UserHitPrize> {
 
+    /**
+     * 获取除该用户外的近 20 条中奖弹幕
+     *
+     * @param userId 用户 id
+     * @return
+     */
+    List<TicketHitPrizeBarrageVO> selectTicketHitPrizeBarrageNotByUserId(@Param("userId") Long userId);
+
+    /**
+     * 获取用户当天中奖的 2 条弹幕
+     *
+     * @param userId
+     * @return
+     */
+    List<TicketHitPrizeBarrageVO> selectTicketHitPrizeBarrageByUserId(@Param("userId") Long userId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 }

+ 16 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserHitPrizeService.java

@@ -5,6 +5,8 @@ import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.user.domain.UserHitPrize;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
+
 import java.util.List;
 
 /**
@@ -30,4 +32,18 @@ public interface IUserHitPrizeService extends IService<UserHitPrize> {
    * @return
    */
   void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId);
+
+  /**
+   * 获取除该用户外的近 20 条中奖弹幕
+   * @param userId  用户 id
+   * @return
+   */
+  List<TicketHitPrizeBarrageVO> hitPrizeBarrage(Long userId);
+
+  /**
+   * 获取用户当天中奖的 2 条弹幕
+   * @param userId  用户 id
+   * @return
+   */
+  List<TicketHitPrizeBarrageVO> hitPrizeBarrageByUserId(Long userId);
 }

+ 95 - 80
mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java

@@ -28,6 +28,7 @@ import com.qs.mp.user.domain.UserCouponChannel;
 import com.qs.mp.user.domain.UserHitPrize;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
 import com.qs.mp.user.mapper.UserHitPrizeMapper;
 import com.qs.mp.user.service.IUserCoinService;
 import com.qs.mp.user.service.IUserCouponChannelService;
@@ -36,9 +37,13 @@ import com.qs.mp.user.service.IUserHitPrizeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.user.service.IUserPrizeStorageService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+
 import org.codehaus.janino.IClass.IField;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,102 +64,112 @@ import org.springframework.util.CollectionUtils;
 @Service
 public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, UserHitPrize> implements IUserHitPrizeService {
 
-  protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 
-  @Autowired
-  private IUserTicketOrderItemService userTicketOrderItemService;
+    @Autowired
+    private IUserTicketOrderItemService userTicketOrderItemService;
 
-  @Autowired
-  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+    @Autowired
+    private ITicketAwardsPrizeService ticketAwardsPrizeService;
 
-  @Autowired
-  private IUserPrizeStorageService userPrizeStorageService;
+    @Autowired
+    private IUserPrizeStorageService userPrizeStorageService;
 
-  @Autowired
-  private IUserCoinService userCoinService;
+    @Autowired
+    private IUserCoinService userCoinService;
 
-  @Autowired
-  private ICouponService couponService;
+    @Autowired
+    private ICouponService couponService;
 
-  @Autowired
-  private ITicketAwardsService ticketAwardsService;
+    @Autowired
+    private ITicketAwardsService ticketAwardsService;
 
-  @Autowired
-  private ITicketService ticketService;
+    @Autowired
+    private ITicketService ticketService;
 
-  @Autowired
-  private BizIdGenerator bizIdGenerator;
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
 
-  @Override
-  public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
-    UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
-    UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
-    if (null == orderItem) {
-      LogUtil.error(logger, "查询盲票的奖品信息,盲票订单不存在。ticketId:{0}, userId:{1}",
-          new Object[]{ticket.getTicketId(), userId});
-      throw new ServiceException("盲票订单不存在");
-    }
+    @Override
+    public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
+        UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
+        UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
+        if (null == orderItem) {
+            LogUtil.error(logger, "查询盲票的奖品信息,盲票订单不存在。ticketId:{0}, userId:{1}",
+                    new Object[]{ticket.getTicketId(), userId});
+            throw new ServiceException("盲票订单不存在");
+        }
 
-    if (null == userHitPrize) {
-      List<TicketDrawNumDTO> drawNumDTOList = JSONObject.parseArray(ticket.getDrawNum(), TicketDrawNumDTO.class);
-      for (TicketDrawNumDTO ticketDrawNumDTO : drawNumDTOList) {
-        if (ticketDrawNumDTO.getNum() == ticket.getPlainLuckyNum()) {
-          userHitPrize = new UserHitPrize();
-          userHitPrize.setId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
-          userHitPrize.setUserId(userId);
-          userHitPrize.setOrderId(orderItem.getOrderId());
-          userHitPrize.setOrderItemId(orderItem.getItemId());
-          userHitPrize.setTicketId(ticket.getTicketId());
-          TicketAwards ticketAwards = ticketAwardsService.getOne(new LambdaQueryWrapper<TicketAwards>()
-              .eq(TicketAwards::getBoxId, ticket.getBoxId()).eq(TicketAwards::getName, ticketDrawNumDTO.getName()));
-          userHitPrize.setAwardsId(ticketAwards.getAwardsId());
-          // 奖品ID等用户选择后填入
+        if (null == userHitPrize) {
+            List<TicketDrawNumDTO> drawNumDTOList = JSONObject.parseArray(ticket.getDrawNum(), TicketDrawNumDTO.class);
+            for (TicketDrawNumDTO ticketDrawNumDTO : drawNumDTOList) {
+                if (ticketDrawNumDTO.getNum() == ticket.getPlainLuckyNum()) {
+                    userHitPrize = new UserHitPrize();
+                    userHitPrize.setId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+                    userHitPrize.setUserId(userId);
+                    userHitPrize.setOrderId(orderItem.getOrderId());
+                    userHitPrize.setOrderItemId(orderItem.getItemId());
+                    userHitPrize.setTicketId(ticket.getTicketId());
+                    TicketAwards ticketAwards = ticketAwardsService.getOne(new LambdaQueryWrapper<TicketAwards>()
+                            .eq(TicketAwards::getBoxId, ticket.getBoxId()).eq(TicketAwards::getName, ticketDrawNumDTO.getName()));
+                    userHitPrize.setAwardsId(ticketAwards.getAwardsId());
+                    // 奖品ID等用户选择后填入
 //          userHitPrize.setPrizeId();
-          save(userHitPrize);
+                    save(userHitPrize);
+                }
+            }
         }
-      }
-    }
-    List<TicketAwardsPrize> awardsPrizes = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
-        .eq(TicketAwardsPrize::getAwardsId, userHitPrize.getAwardsId()).orderByDesc(TicketAwardsPrize::getRemainQty));
-    return awardsPrizes;
-  }
-
-  @Override
-  @Transactional
-  public void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId) {
-    // 更新奖品已兑奖数量
-    TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizeService.getById(prizeId);
-    if (ticketAwardsPrize.getRemainQty() <= 0) {
-      throw new ServiceException("奖品已兑完,请重新选择");
-    }
-    // 乐观锁
-    ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getCashedQty, ticketAwardsPrize.getCashedQty() + 1)
-        .set(TicketAwardsPrize::getRemainQty, ticketAwardsPrize.getRemainQty() - 1)
-        .eq(TicketAwardsPrize::getPrizeId, prizeId).eq(TicketAwardsPrize::getCashedQty, ticketAwardsPrize.getCashedQty()));
-
-    // 保存奖品到中奖记录中
-    UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
-    if (StringUtils.isNotBlank(userHitPrize.getPrizeId())) {
-      throw new ServiceException("盲票已兑奖");
-    }
-    userHitPrize.setPrizeId(prizeId);
-    updateById(userHitPrize);
-
-    // 放入仓库
-    if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COIN) {
-      userCoinService.produce(userId, ticketAwardsPrize.getValue(), userHitPrize.getId());
-    } else if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
-      couponService.distribute(ticket, userId, ticketAwardsPrize.getRefId());
-    } else {
-      userPrizeStorageService.takeInStorage(userId, ticketAwardsPrize, PrizeStorageInTypeEnum.TICKET_CASHED, userHitPrize.getId());
+        List<TicketAwardsPrize> awardsPrizes = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
+                .eq(TicketAwardsPrize::getAwardsId, userHitPrize.getAwardsId()).orderByDesc(TicketAwardsPrize::getRemainQty));
+        return awardsPrizes;
     }
 
-    boolean rtn = ticketService.update(new LambdaUpdateWrapper<Ticket>().set(Ticket::getStatus, TicketStatusEnum.CASHED)
-        .eq(Ticket::getTicketId, ticket.getTicketId()).eq(Ticket::getStatus, TicketStatusEnum.ACTIVATED));
-    Assert.isTrue(rtn, "兑奖后更新盲票状态失败。ticketId:" + ticket.getTicketId());
-  }
+    @Override
+    @Transactional
+    public void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId) {
+        // 更新奖品已兑奖数量
+        TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizeService.getById(prizeId);
+        if (ticketAwardsPrize.getRemainQty() <= 0) {
+            throw new ServiceException("奖品已兑完,请重新选择");
+        }
+        // 乐观锁
+        ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getCashedQty, ticketAwardsPrize.getCashedQty() + 1)
+                .set(TicketAwardsPrize::getRemainQty, ticketAwardsPrize.getRemainQty() - 1)
+                .eq(TicketAwardsPrize::getPrizeId, prizeId).eq(TicketAwardsPrize::getCashedQty, ticketAwardsPrize.getCashedQty()));
+
+        // 保存奖品到中奖记录中
+        UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
+        if (StringUtils.isNotBlank(userHitPrize.getPrizeId())) {
+            throw new ServiceException("盲票已兑奖");
+        }
+        userHitPrize.setPrizeId(prizeId);
+        updateById(userHitPrize);
+
+        // 放入仓库
+        if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COIN) {
+            userCoinService.produce(userId, ticketAwardsPrize.getValue(), userHitPrize.getId());
+        } else if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
+            couponService.distribute(ticket, userId, ticketAwardsPrize.getRefId());
+        } else {
+            userPrizeStorageService.takeInStorage(userId, ticketAwardsPrize, PrizeStorageInTypeEnum.TICKET_CASHED, userHitPrize.getId());
+        }
 
+        boolean rtn = ticketService.update(new LambdaUpdateWrapper<Ticket>().set(Ticket::getStatus, TicketStatusEnum.CASHED)
+                .eq(Ticket::getTicketId, ticket.getTicketId()).eq(Ticket::getStatus, TicketStatusEnum.ACTIVATED));
+        Assert.isTrue(rtn, "兑奖后更新盲票状态失败。ticketId:" + ticket.getTicketId());
+    }
 
 
+    @Override
+    public List<TicketHitPrizeBarrageVO> hitPrizeBarrage(Long userId) {
+        return this.getBaseMapper().selectTicketHitPrizeBarrageNotByUserId(userId);
+    }
+
+    @Override
+    public List<TicketHitPrizeBarrageVO> hitPrizeBarrageByUserId(Long userId) {
+        LocalDateTime startTime = LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN);
+        LocalDateTime endTime = LocalDateTime.now().withNano(0);
+        return this.getBaseMapper().selectTicketHitPrizeBarrageByUserId(userId, startTime, endTime);
+    }
 
 }

+ 26 - 0
mp-service/src/main/resources/mapper/user/UserHitPrizeMapper.xml

@@ -20,4 +20,30 @@
         id, user_id, order_id, order_item_id, ticket_id, awards_id, prize_id, created_time, updated_time
     </sql>
 
+    <select id="selectTicketHitPrizeBarrageNotByUserId"
+            resultType="com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO">
+        SELECT su.nick_name nickName,
+                su.avatar avatar,
+                mtap.title prizeInfo
+        FROM mp_user_hit_prize muhp
+                 LEFT JOIN mp_ticket_awards_prize mtap ON muhp.prize_id = mtap.prize_id
+                 LEFT JOIN sys_user su ON muhp.user_id = su.user_id
+        WHERE muhp.prize_id != ''
+        AND muhp.user_id != #{userId}
+        AND ((mtap.prize_type = 'coin' AND mtap.quantity >= 100) OR mtap.prize_type='goods')
+        ORDER BY muhp.created_time DESC
+        LIMIT 20
+    </select>
+
+    <select id="selectTicketHitPrizeBarrageByUserId" resultType="com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO">
+        SELECT su.nick_name,su.avatar,mtap.title
+        FROM mp_user_hit_prize muhp
+                 LEFT JOIN mp_ticket_awards_prize mtap ON muhp.prize_id = mtap.prize_id
+                 LEFT JOIN sys_user su ON muhp.user_id = su.user_id
+        WHERE muhp.prize_id != ''
+          AND muhp.user_id = #{userId}
+          AND muhp.created_time BETWEEN	#{startTime} AND #{endTime}
+        ORDER BY muhp.created_time DESC
+        LIMIT 2
+    </select>
 </mapper>