Răsfoiți Sursa

抽奖相关

sunkean 2 ani în urmă
părinte
comite
cb03738cbf

+ 4 - 0
src/main/java/com/izouma/nineth/domain/MetaLuckyDrawAwardReceiveRecord.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.domain;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.converter.MetaLuckyDrawAwardConverter;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -21,14 +22,17 @@ public class MetaLuckyDrawAwardReceiveRecord extends BaseEntity {
 
     @ApiModelProperty("用户id")
     @ExcelProperty("用户id")
+    @Searchable
     private Long userId;
 
     @ApiModelProperty("抽奖活动id")
     @ExcelProperty("抽奖活动id")
+    @Searchable
     private Long metaLuckyDrawId;
 
     @ApiModelProperty("奖励名称")
     @ExcelProperty("奖励名称")
+    @Searchable
     private String metaLuckDrawAwardName;
 
     @ApiModelProperty("玩家抽奖获得的奖励")

+ 55 - 0
src/main/java/com/izouma/nineth/service/MetaLuckyDrawAwardReceiveRecordService.java

@@ -1,20 +1,75 @@
 package com.izouma.nineth.service;
 
+import com.izouma.nineth.annotations.RedisLock;
+import com.izouma.nineth.domain.MetaLuckyDraw;
+import com.izouma.nineth.domain.MetaLuckyDrawAwardModel;
 import com.izouma.nineth.domain.MetaLuckyDrawAwardReceiveRecord;
+import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaAwardTypeEnum;
 import com.izouma.nineth.repo.MetaLuckyDrawAwardReceiveRecordRepo;
+import com.izouma.nineth.repo.MetaLuckyDrawRepo;
 import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.LotteryUtils;
+import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
 @Service
 @AllArgsConstructor
 public class MetaLuckyDrawAwardReceiveRecordService {
 
     private MetaLuckyDrawAwardReceiveRecordRepo metaLuckyDrawAwardReceiveRecordRepo;
 
+    private MetaLuckyDrawRepo metaLuckyDrawRepo;
+
     public Page<MetaLuckyDrawAwardReceiveRecord> all(PageQuery pageQuery) {
         return metaLuckyDrawAwardReceiveRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaLuckyDrawAwardReceiveRecord.class), JpaUtils.toPageRequest(pageQuery));
     }
+
+    @RedisLock("#metaLuckyDrawId")
+    public MetaRestResult<MetaLuckyDrawAwardReceiveRecord> save(Long metaLuckyDrawId) {
+        if (Objects.isNull(metaLuckyDrawId)) {
+            return MetaRestResult.returnError("Illegal parameter : metaLuckyDrawId must be null");
+        }
+        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        MetaLuckyDraw metaLuckyDraw = metaLuckyDrawRepo.findById(metaLuckyDrawId).orElse(null);
+        if (Objects.isNull(metaLuckyDraw)) {
+            return MetaRestResult.returnError("不存在该抽奖活动");
+        }
+        List<MetaLuckyDrawAwardModel> metaLuckDrawAwards = metaLuckyDraw.getMetaLuckDrawAwards();
+        if (CollectionUtils.isEmpty(metaLuckDrawAwards)) {
+            return MetaRestResult.returnError("该抽奖活动未配置奖励");
+        }
+        List<MetaLuckyDrawAwardModel> newMetaLuckDrawAwards = new ArrayList<>();
+        metaLuckDrawAwards.forEach(metaLuckyDrawAwardModel -> {
+            if (metaLuckyDrawAwardModel.getAwardType().equals(MetaAwardTypeEnum.NFT) && metaLuckyDrawAwardModel.isLimitNum()) {
+                int count = metaLuckyDrawAwardReceiveRecordRepo.countByMetaLuckyDrawIdAndMetaLuckDrawAwardName(metaLuckyDrawId, metaLuckyDrawAwardModel.getName());
+                if (count < metaLuckyDrawAwardModel.getMaxNum()) {
+                    newMetaLuckDrawAwards.add(metaLuckyDrawAwardModel);
+                }
+            } else {
+                newMetaLuckDrawAwards.add(metaLuckyDrawAwardModel);
+            }
+        });
+        if (CollectionUtils.isEmpty(newMetaLuckDrawAwards)) {
+            return MetaRestResult.returnError("当前奖励已经全部抽完!");
+        }
+        MetaLuckyDrawAwardReceiveRecord metaLuckyDrawAwardReceiveRecord = new MetaLuckyDrawAwardReceiveRecord();
+        MetaLuckyDrawAwardModel metaLuckyDrawAwardModel = LotteryUtils.lotteryForMetaLuckyDrawAward(newMetaLuckDrawAwards);
+        metaLuckyDrawAwardReceiveRecord.setMetaLuckyDrawId(metaLuckyDrawId);
+        metaLuckyDrawAwardReceiveRecord.setUserId(userId);
+        metaLuckyDrawAwardReceiveRecord.setFinishTime(LocalDateTime.now());
+        metaLuckyDrawAwardReceiveRecord.setMetaLuckDrawAward(metaLuckyDrawAwardModel);
+        metaLuckyDrawAwardReceiveRecord.setMetaLuckDrawAwardName(metaLuckyDrawAwardModel.getName());
+        return MetaRestResult.returnSuccess(metaLuckyDrawAwardReceiveRecordRepo.save(metaLuckyDrawAwardReceiveRecord));
+    }
+
 }

+ 22 - 26
src/main/java/com/izouma/nineth/utils/LotteryUtils.java

@@ -9,46 +9,42 @@ import java.util.Collections;
 import java.util.List;
 
 public class LotteryUtils {
-    public static MetaGameAward lotteryForMetaGameAward(List<MetaGameAward> metaGameAwards) {
-        int size = metaGameAwards.size();
-        AtomicDouble sumProbability = new AtomicDouble();
-        metaGameAwards.forEach(metaGameAward -> {
-            sumProbability.addAndGet(metaGameAward.getProbability());
-        });
 
-        List<Double> sortAwardProbabilityList = new ArrayList<>(size);
-        AtomicDouble tempSumProbability = new AtomicDouble();
+    public static MetaGameAward lotteryForMetaGameAward(List<MetaGameAward> metaGameAwards) {
+        List<Integer> probability = new ArrayList<>();
         metaGameAwards.forEach(metaGameAward -> {
-            tempSumProbability.addAndGet(metaGameAward.getProbability());
-            sortAwardProbabilityList.add(tempSumProbability.get() / sumProbability.get());
+            probability.add(metaGameAward.getProbability());
         });
-        double randomDouble = Math.random();
-        sortAwardProbabilityList.add(randomDouble);
-        Collections.sort(sortAwardProbabilityList);
-        int lotteryIndex = sortAwardProbabilityList.indexOf(randomDouble);
-        return metaGameAwards.get(lotteryIndex);
+        return metaGameAwards.get(lottery(probability));
     }
 
     public static MetaLuckyDrawAwardModel lotteryForMetaLuckyDrawAward(List<MetaLuckyDrawAwardModel> metaLuckyDrawAwardModels) {
-        int size = metaLuckyDrawAwardModels.size();
-        AtomicDouble sumProbability = new AtomicDouble();
-        metaLuckyDrawAwardModels.forEach(metaGameAward -> {
-            sumProbability.addAndGet(metaGameAward.getProbability());
+        List<Integer> probability = new ArrayList<>();
+        metaLuckyDrawAwardModels.forEach(metaLuckyDrawAwardModel -> {
+            probability.add(metaLuckyDrawAwardModel.getProbability());
         });
+        return metaLuckyDrawAwardModels.get(lottery(probability));
+    }
 
+    /**
+     * 根据概率返回一个index索引
+     *
+     * @param probability 概率集合
+     * @return 索引
+     */
+    public static int lottery(List<Integer> probability) {
+        int size = probability.size();
+        AtomicDouble sumProbability = new AtomicDouble();
+        probability.forEach(sumProbability::addAndGet);
         List<Double> sortAwardProbabilityList = new ArrayList<>(size);
         AtomicDouble tempSumProbability = new AtomicDouble();
-        metaLuckyDrawAwardModels.forEach(metaGameAward -> {
-            tempSumProbability.addAndGet(metaGameAward.getProbability());
+        probability.forEach(p -> {
+            tempSumProbability.addAndGet(p);
             sortAwardProbabilityList.add(tempSumProbability.get() / sumProbability.get());
         });
         double randomDouble = Math.random();
         sortAwardProbabilityList.add(randomDouble);
         Collections.sort(sortAwardProbabilityList);
-        int lotteryIndex = sortAwardProbabilityList.indexOf(randomDouble);
-        return metaLuckyDrawAwardModels.get(lotteryIndex);
+        return sortAwardProbabilityList.indexOf(randomDouble);
     }
-
-
-
 }

+ 2 - 49
src/main/java/com/izouma/nineth/web/MetaLuckyDrawAwardReceiveRecordController.java

@@ -1,28 +1,17 @@
 package com.izouma.nineth.web;
 
-import com.izouma.nineth.domain.MetaLuckyDraw;
-import com.izouma.nineth.domain.MetaLuckyDrawAwardModel;
 import com.izouma.nineth.domain.MetaLuckyDrawAwardReceiveRecord;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
-import com.izouma.nineth.enums.MetaAwardTypeEnum;
-import com.izouma.nineth.repo.MetaLuckyDrawAwardReceiveRecordRepo;
-import com.izouma.nineth.repo.MetaLuckyDrawRepo;
 import com.izouma.nineth.service.MetaLuckyDrawAwardReceiveRecordService;
-import com.izouma.nineth.utils.LotteryUtils;
-import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
-import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.time.LocalDateTime;
-import java.util.ArrayList;
 import java.util.List;
-import java.util.Objects;
 
 @RestController
 @RequestMapping("/metaLuckyDrawAwardReceiveRecord")
@@ -31,48 +20,12 @@ public class MetaLuckyDrawAwardReceiveRecordController extends BaseController {
 
     private MetaLuckyDrawAwardReceiveRecordService metaLuckyDrawAwardReceiveRecordService;
 
-    private MetaLuckyDrawRepo metaLuckyDrawRepo;
-
-    private MetaLuckyDrawAwardReceiveRecordRepo metaLuckyDrawAwardReceiveRecordRepo;
-
-
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
-    public MetaRestResult<MetaLuckyDrawAwardReceiveRecord> save(@RequestBody MetaLuckyDrawAwardReceiveRecord metaLuckyDrawAwardReceiveRecord) {
-        if (Objects.isNull(metaLuckyDrawAwardReceiveRecord)) {
-            return MetaRestResult.returnError("Illegal parameter : params must be null");
-        }
-        if (Objects.isNull(metaLuckyDrawAwardReceiveRecord.getMetaLuckyDrawId())) {
-            return MetaRestResult.returnError("Illegal parameter : metaLuckyDrawId must be null");
-        }
-        Long userId = SecurityUtils.getAuthenticatedUser().getId();
-        MetaLuckyDraw metaLuckyDraw = metaLuckyDrawRepo.findById(metaLuckyDrawAwardReceiveRecord.getMetaLuckyDrawId()).orElse(null);
-        if (Objects.isNull(metaLuckyDraw)) {
-            return MetaRestResult.returnError("不存在该抽奖活动");
-        }
-        List<MetaLuckyDrawAwardModel> metaLuckDrawAwards = metaLuckyDraw.getMetaLuckDrawAwards();
-        if (CollectionUtils.isEmpty(metaLuckDrawAwards)) {
-            return MetaRestResult.returnError("该抽奖活动未配置奖励");
-        }
-        List<MetaLuckyDrawAwardModel> newMetaLuckDrawAwards = new ArrayList<>();
-        metaLuckDrawAwards.forEach(metaLuckyDrawAwardModel -> {
-            if (metaLuckyDrawAwardModel.getAwardType().equals(MetaAwardTypeEnum.NFT) && metaLuckyDrawAwardModel.isLimitNum()) {
-                int count = metaLuckyDrawAwardReceiveRecordRepo.countByMetaLuckyDrawIdAndMetaLuckDrawAwardName(metaLuckyDrawAwardReceiveRecord.getMetaLuckyDrawId(), metaLuckyDrawAwardModel.getName());
-                if (count < metaLuckyDrawAwardModel.getMaxNum()) {
-                    newMetaLuckDrawAwards.add(metaLuckyDrawAwardModel);
-                }
-            }
-            newMetaLuckDrawAwards.add(metaLuckyDrawAwardModel);
-        });
-        MetaLuckyDrawAwardModel metaLuckyDrawAwardModel = LotteryUtils.lotteryForMetaLuckyDrawAward(newMetaLuckDrawAwards);
-        metaLuckyDrawAwardReceiveRecord.setUserId(userId);
-        metaLuckyDrawAwardReceiveRecord.setFinishTime(LocalDateTime.now());
-        metaLuckyDrawAwardReceiveRecord.setMetaLuckDrawAward(metaLuckyDrawAwardModel);
-        metaLuckyDrawAwardReceiveRecord.setMetaLuckDrawAwardName(metaLuckyDrawAwardModel.getName());
-        return MetaRestResult.returnSuccess(metaLuckyDrawAwardReceiveRecordRepo.save(metaLuckyDrawAwardReceiveRecord));
+    public MetaRestResult<MetaLuckyDrawAwardReceiveRecord> save(Long metaLuckyDrawId) {
+        return metaLuckyDrawAwardReceiveRecordService.save(metaLuckyDrawId);
     }
 
-
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     public Page<MetaLuckyDrawAwardReceiveRecord> all(@RequestBody PageQuery pageQuery) {

+ 5 - 6
src/main/vue/src/views/MetaLuckyDrawAwardReceiveRecordList.vue

@@ -34,12 +34,11 @@
 			v-loading="fetchingData"
 		>
 			<el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
-			<el-table-column prop="id" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="userId" label="用户id"> </el-table-column>
-			<el-table-column prop="metaLuckyDrawId" label="抽奖活动id"> </el-table-column>
-			<el-table-column prop="metaLuckDrawAwardName" label="奖励名称"> </el-table-column>
-			<el-table-column prop="metaLuckDrawAward" label="玩家抽奖获得的奖励"> </el-table-column>
-			<el-table-column prop="finishTime" label="奖励获得时间"> </el-table-column>
+			<el-table-column prop="id" align="center" label="ID" width="100"> </el-table-column>
+			<el-table-column prop="userId" align="center" label="用户id"> </el-table-column>
+			<el-table-column prop="metaLuckyDrawId" align="center" label="抽奖活动id"> </el-table-column>
+			<el-table-column prop="metaLuckDrawAwardName" align="center" label="奖励名称"> </el-table-column>
+			<el-table-column prop="finishTime" align="center" label="奖励获得时间"> </el-table-column>
 		</el-table>
 		<div class="pagination-wrapper">
 			<el-pagination