Browse Source

自动开奖

cup 2 years ago
parent
commit
82e0a92728

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

@@ -20,6 +20,7 @@ import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.framework.security.handle.HostHolder;
 import com.qs.mp.user.domain.UserHitPrize;
 import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.domain.param.TicketAutoCashPrizeParam;
 import com.qs.mp.user.domain.vo.TicketAwardsLabelVO;
 import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
 import com.qs.mp.user.service.IUserExchangeOrderService;
@@ -42,6 +43,7 @@ import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.ws.rs.POST;
@@ -242,6 +244,13 @@ public class UserTicketController extends BaseApiController {
     return AjaxResult.success(jsonObject);
   }
 
+  @PostMapping("/ticket/autoCashPrize")
+  @ApiOperation("自动开奖")
+  public AjaxResult autoCashPrize(@Validated @RequestBody TicketAutoCashPrizeParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    return AjaxResult.success(userHitPrizeService.autoCashPrize(userId, param));
+  }
+
   /**
    * 兑奖
    */

+ 29 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/TicketAutoCashPrizeParam.java

@@ -0,0 +1,29 @@
+package com.qs.mp.user.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 盲票自动开奖入参类
+ * @author Cup
+ * @date 2022/5/23
+ */
+@ApiModel("盲票自动开奖入参类")
+@Data
+public class TicketAutoCashPrizeParam {
+
+    @ApiModelProperty("盲票ID")
+    private String ticketId;
+
+    @ApiModelProperty("盲票组id")
+    private String boxId;
+
+    @NotNull(message = "是否试玩不能为空")
+    @ApiModelProperty("是否试玩,0否,1试玩")
+    private Integer isTry;
+
+}

+ 43 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserHitPrizeDetailVO.java

@@ -0,0 +1,43 @@
+package com.qs.mp.user.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Cup
+ * @date 2022/5/23
+ */
+@ApiModel("用户中奖详情出参类")
+@Data
+public class UserHitPrizeDetailVO {
+
+    @ApiModelProperty("奖品id,主键")
+    private String prizeId;
+
+    @ApiModelProperty("奖品名称")
+    private String title;
+
+    @ApiModelProperty("奖品图片url")
+    private String picUrl;
+
+    @ApiModelProperty("奖品ID(GOODS_ID或COUPON_ID)")
+    private String refId;
+
+    @ApiModelProperty("奖品类型 1 实物商品 2优惠券 3平台代币")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketPrizeTypeEnum prizeType;
+
+    @ApiModelProperty("奖品价值")
+    private Integer value;
+
+
+    @ApiModelProperty("奖品信息列表")
+    List<TicketAwardsPrize> ticketAwardsPrizeList;
+}

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

@@ -5,7 +5,9 @@ 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.param.TicketAutoCashPrizeParam;
 import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
+import com.qs.mp.user.domain.vo.UserHitPrizeDetailVO;
 
 import java.util.List;
 
@@ -53,4 +55,13 @@ public interface IUserHitPrizeService extends IService<UserHitPrize> {
    * @return
    */
   List<TicketHitPrizeBarrageVO> expensiveHitPrizeBarrage(Long userId);
+
+  /**
+   * 盲票自动开奖
+   * @param ticket
+   * @param userId
+   * @param param
+   */
+  UserHitPrizeDetailVO autoCashPrize(Long userId, TicketAutoCashPrizeParam param);
+
 }

+ 106 - 10
mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java

@@ -3,28 +3,24 @@ 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.Coupon;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketAwards;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.dto.TicketDrawNumDTO;
 import com.qs.mp.admin.service.*;
+import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
-import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.system.service.id.BizIdGenerator;
-import com.qs.mp.user.domain.UserCoupon;
-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.param.TicketAutoCashPrizeParam;
 import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
+import com.qs.mp.user.domain.vo.UserHitPrizeDetailVO;
 import com.qs.mp.user.mapper.UserHitPrizeMapper;
 import com.qs.mp.user.service.IUserCoinService;
-import com.qs.mp.user.service.IUserCouponChannelService;
-import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserHitPrizeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.user.service.IUserPrizeStorageService;
@@ -33,17 +29,16 @@ 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 java.util.Random;
 
-import org.codehaus.janino.IClass.IField;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
-import org.springframework.util.CollectionUtils;
 
 /**
  * <p>
@@ -85,6 +80,9 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
     @Autowired
     private ICouponPkgService couponPkgService;
 
+    @Autowired
+    private IUserHitPrizeService userHitPrizeService;
+
     @Override
     public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
         UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
@@ -119,6 +117,104 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
         return awardsPrizes;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public UserHitPrizeDetailVO autoCashPrize(Long userId, TicketAutoCashPrizeParam param) {
+
+        UserHitPrizeDetailVO userHitPrizeDetailVO = new UserHitPrizeDetailVO();
+
+        // 封装出参对象
+        List<TicketAwardsPrize> ticketAwardsPrizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
+                .eq(TicketAwardsPrize::getBoxId, param.getBoxId()));
+
+        List<TicketAwardsPrize> params = new ArrayList<>();
+        int index = 0;
+        for (int i = 0; i < 48; i++) {
+            TicketAwardsPrize ticketAwardsPrize = new TicketAwardsPrize();
+            BeanUtils.copyProperties(ticketAwardsPrizeList.get(index),ticketAwardsPrize);
+            params.add(ticketAwardsPrize);
+            if (index == ticketAwardsPrizeList.size() - 1) {
+                index = 0;
+                continue;
+            }
+            index++;
+        }
+        userHitPrizeDetailVO.setTicketAwardsPrizeList(params);
+        if (param.getIsTry() == 1) {
+            List<TicketAwards> list = ticketAwardsService.list(new LambdaQueryWrapper<TicketAwards>()
+                    .eq(TicketAwards::getBoxId,param.getBoxId())
+                    .orderByAsc(TicketAwards::getSort));
+            List<TicketAwardsPrize> prizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
+                    .eq(TicketAwardsPrize::getBoxId, param.getBoxId())
+                    .in(TicketAwardsPrize::getAwardsId, list.get(0).getAwardsId(),list.get(1).getAwardsId()));
+            TicketAwardsPrize ticketAwardsPrize = prizeList.get(new Random().nextInt(prizeList.size()));
+            userHitPrizeDetailVO.setPrizeId(ticketAwardsPrize.getPrizeId());
+            userHitPrizeDetailVO.setPicUrl(ticketAwardsPrize.getPicUrl());
+            userHitPrizeDetailVO.setTitle(ticketAwardsPrize.getTitle());
+            userHitPrizeDetailVO.setValue(ticketAwardsPrize.getValue());
+            userHitPrizeDetailVO.setPrizeType(ticketAwardsPrize.getPrizeType());
+            userHitPrizeDetailVO.setRefId(ticketAwardsPrize.getRefId());
+        }else {
+
+            Ticket ticket = ticketService.getById(param.getTicketId());
+            if (null == ticket) {
+                throw new ServiceException("参数异常,盲票不存在");
+            }
+            if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+                throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1017);
+            }
+            if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+                throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1019);
+            }
+
+            // 查看奖级下的奖品
+            List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
+
+            // 开奖
+            int random = -1;
+            // 计算总权重
+            double sumWeight = 0;
+            for (TicketAwardsPrize ticketAwardsPrize : ticketAwardsPrizes) {
+                sumWeight += ticketAwardsPrize.getRemainQty();
+            }
+
+            //产生随机数
+            double randomNumber;
+            randomNumber = Math.random();
+
+            //根据随机数在所有奖品分布的区域并确定所抽奖品
+            double d1 = 0;
+            double d2 = 0;
+            for (int i = 0; i < ticketAwardsPrizes.size(); i++) {
+                d2 += Double.parseDouble(String.valueOf(ticketAwardsPrizes.get(i).getQuantity())) / sumWeight;
+                if (i == 0) {
+                    d1 = 0;
+                } else {
+                    d1 += Double.parseDouble(String.valueOf(ticketAwardsPrizes.get(i - 1).getQuantity())) / sumWeight;
+                }
+                if (randomNumber > d1 && randomNumber <= d2) {
+                    random = i;
+                    break;
+                }
+            }
+
+            TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizes.get(random);
+
+            userHitPrizeDetailVO.setPrizeId(ticketAwardsPrize.getPrizeId());
+            userHitPrizeDetailVO.setPicUrl(ticketAwardsPrize.getPicUrl());
+            userHitPrizeDetailVO.setTitle(ticketAwardsPrize.getTitle());
+            userHitPrizeDetailVO.setValue(ticketAwardsPrize.getValue());
+            userHitPrizeDetailVO.setPrizeType(ticketAwardsPrize.getPrizeType());
+            userHitPrizeDetailVO.setRefId(ticketAwardsPrize.getRefId());
+
+            // 兑奖
+            this.cashPrize(ticket, userId, ticketAwardsPrize.getAwardsId(), ticketAwardsPrize.getPrizeId());
+        }
+
+        return userHitPrizeDetailVO;
+
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId) {