MHDController.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package com.ruoyi.system.controller;
  2. import com.ruoyi.common.core.domain.AjaxResult;
  3. import com.ruoyi.common.core.domain.R;
  4. import com.ruoyi.common.utils.StringUtils;
  5. import com.ruoyi.system.domain.*;
  6. import com.ruoyi.system.service.*;
  7. import io.swagger.models.auth.In;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import javax.annotation.Resource;
  12. import java.beans.Transient;
  13. import java.util.*;
  14. import java.util.stream.Collectors;
  15. import java.util.stream.Stream;
  16. /**
  17. * @author Losino
  18. * @version 1.0
  19. */
  20. @RestController
  21. @RequestMapping("/MHD")
  22. public class MHDController {
  23. @Resource
  24. private ISysXPoolService poolService;
  25. @Resource
  26. private ISysXPrizesService prizesService;
  27. @Resource
  28. private ISysXProbabilitiesService probabilitiesService;
  29. @Resource
  30. private IDbUsersService usersService;
  31. @Resource
  32. private ISysXPoolCountService countService;
  33. @Resource
  34. private ISysXPrizesPackageService packageService;
  35. /**
  36. * 返回用户中奖背包
  37. * @param steamId
  38. * @return
  39. */
  40. @RequestMapping("/getPackage")
  41. public R getPackage(@RequestParam(name = "steamId", required = false) String steamId) {
  42. List<SysXPrizesPackage> packages = packageService.selectSysXPrizesPackageList(new SysXPrizesPackage()).stream().filter(res -> res.getSteamId().equals(steamId)).collect(Collectors.toList());
  43. return R.ok(packages);
  44. }
  45. /**
  46. * 抽奖
  47. *
  48. * @param steamId
  49. * @param poolId
  50. * @return
  51. */
  52. @RequestMapping("/startPrize")
  53. @Transient
  54. public R startPrize(@RequestParam(name = "steamId", required = false) String steamId,
  55. @RequestParam(name = "id", required = false) Long poolId) {
  56. // 获取抽奖次数
  57. List<SysXPoolCount> poolCountList = countService.selectSysXPoolCountList(new SysXPoolCount()).stream().filter(res -> res.getSteamId().equals(steamId)).filter(res -> res.getPoolId().equals(poolId)).collect(Collectors.toList());
  58. SysXPoolCount poolCount = null;
  59. if (poolCountList.size() > 0) {
  60. poolCount = poolCountList.get(0);
  61. }
  62. if (poolCount == null || !(poolCount.getCount() > 0)) {
  63. return R.fail("后端校验抽奖次数不足,请重试");
  64. }
  65. // 获取卡池id对应概率
  66. List<SysXProbabilities> filterProbabilitiesList = probabilitiesService
  67. .selectSysXProbabilitiesList(new SysXProbabilities()).stream()
  68. .filter(res -> res.getPoolId().equals(poolId)).collect(Collectors.toList());
  69. // 获取获取卡池id对应奖池
  70. List<SysXPrizes> prizeList = prizesService.selectSysXPrizesList(new SysXPrizes()).stream()
  71. .filter(res -> res.getPoolId().equals(poolId)).collect(Collectors.toList());
  72. // 计算每个级别的概率和奖品数量
  73. Map<String, Integer> levelPrizeCountMap = prizeList.stream()
  74. .collect(Collectors.toMap(SysXPrizes::getQuality, prize -> 1, Integer::sum, LinkedHashMap::new));
  75. // 过滤掉无奖品的级别,并计算每个级别的概率
  76. Map<String, Long> levelProbabilityMap = new LinkedHashMap<>();
  77. for (SysXProbabilities probabilities : filterProbabilitiesList) {
  78. if (levelPrizeCountMap.containsKey(probabilities.getName())) {
  79. levelProbabilityMap.put(probabilities.getName(),
  80. levelProbabilityMap.getOrDefault(probabilities.getName(), 0L) + probabilities.getValue());
  81. }
  82. }
  83. // 根据级别概率和奖品数量进行抽奖
  84. SysXPrizes drawnPrize = null;
  85. Random rand = new Random();
  86. List<String> levelList = new ArrayList<>();
  87. for (Map.Entry<String, Long> entry : levelProbabilityMap.entrySet()) {
  88. for (int i = 0; i < entry.getValue(); i++) {
  89. levelList.add(entry.getKey());
  90. }
  91. }
  92. Collections.shuffle(levelList);
  93. String selectedLevel = levelList.get(rand.nextInt(levelList.size()));
  94. // 根据级别随机选择一个奖品
  95. List<SysXPrizes> levelPrizes = prizeList.stream()
  96. .filter(prize -> prize.getQuality().equals(selectedLevel))
  97. .collect(Collectors.toList());
  98. if (!levelPrizes.isEmpty()) {
  99. drawnPrize = levelPrizes.get(rand.nextInt(levelPrizes.size()));
  100. }
  101. if (drawnPrize != null) {
  102. // 存入背包
  103. SysXPrizesPackage prizesPackage = new SysXPrizesPackage();
  104. // 获取用户信息
  105. DbUsers user = usersService.selectDbUsersBySteamID(steamId);
  106. // 获取卡池信息
  107. SysXPool pool = poolService.selectSysXPoolById(poolId);
  108. prizesPackage.setSteamId(steamId);
  109. prizesPackage.setZhanghao(user.getZhanghao());
  110. prizesPackage.setSteamName(user.getSteamName());
  111. prizesPackage.setPoolId(poolId);
  112. prizesPackage.setPoolName(pool.getTitle());
  113. prizesPackage.setPrizeId(drawnPrize.getId() + "");
  114. prizesPackage.setPrizeName(drawnPrize.getName());
  115. prizesPackage.setQuality(drawnPrize.getQuality());
  116. prizesPackage.setCreateTime(new Date());
  117. prizesPackage.setIsCheck(0L);
  118. int pageRow = packageService.insertSysXPrizesPackage(prizesPackage);
  119. // 抽中奖品后,减少一次该用户对应卡池的抽奖次数
  120. if (pageRow > 0) {
  121. poolCount.setCount(poolCount.getCount() - 1);
  122. countService.updateSysXPoolCount(poolCount);
  123. }
  124. return R.ok(drawnPrize);
  125. }
  126. else {
  127. return R.fail("未抽中任何奖品");
  128. }
  129. }
  130. @RequestMapping("/login")
  131. public R login(@RequestParam String username,
  132. @RequestParam String password) {
  133. List<DbUsers> users = usersService.selectDbUsersList(new DbUsers());
  134. for (DbUsers user : users) {
  135. String zhanghao = user.getZhanghao();
  136. String mima = user.getMima();
  137. if (zhanghao == null || mima == null) {
  138. continue;
  139. }
  140. if (zhanghao.equals(username)) {
  141. if (mima.equals(password)) {
  142. return R.ok(user);
  143. }
  144. else {
  145. return R.fail("密码错误");
  146. }
  147. }
  148. }
  149. return R.fail("账号不存在");
  150. }
  151. /**
  152. * 返回整理好卡池的结构
  153. */
  154. @RequestMapping("/list")
  155. public R<List<MHDPool>> list(@RequestParam(value = "steamId", required = false) String steamId) {
  156. List<SysXPool> sysXPools = poolService.selectSysXPoolList(new SysXPool());
  157. List<SysXPrizes> sysXPrizes = prizesService.selectSysXPrizesList(new SysXPrizes());
  158. List<SysXProbabilities> sysXProbabilities = probabilitiesService
  159. .selectSysXProbabilitiesList(new SysXProbabilities());
  160. List<MHDPool> mhdPools = new ArrayList<>();
  161. // 将sysXPool的属性直接覆盖到mhdPool
  162. for (SysXPool sysXPool : sysXPools) {
  163. Long poolId = sysXPool.getId();
  164. // 筛选奖池
  165. List<SysXPrizes> filterSysXPrizes = sysXPrizes.stream().filter(res -> res.getPoolId().equals(poolId))
  166. .sorted((a, b) -> {
  167. String[] order = {"史诗", "稀有", "精良", "普通"};
  168. return order.length - 1 - order.length + Arrays.asList(order).indexOf(a.getQuality())
  169. - Arrays.asList(order).indexOf(b.getQuality());
  170. }).collect(Collectors.toList());
  171. // 筛选概率
  172. List<SysXProbabilities> filterSysXProbabilities = sysXProbabilities.stream()
  173. .filter(res -> res.getPoolId().equals(poolId)).collect(Collectors.toList());
  174. MHDPool mhdPool = new MHDPool();
  175. mhdPool.setId(poolId);
  176. mhdPool.setTitle(sysXPool.getTitle());
  177. mhdPool.setPrice(sysXPool.getPrice());
  178. mhdPool.setDescription(sysXPool.getDescription());
  179. mhdPool.setBorderColor(sysXPool.getBorderColor());
  180. mhdPool.setBgColor(sysXPool.getBgColor());
  181. mhdPool.setTextColor(sysXPool.getTextColor());
  182. mhdPool.setFullDescription(sysXPool.getFullDescription());
  183. mhdPool.setPrizes(filterSysXPrizes);
  184. mhdPool.setProbabilities(filterSysXProbabilities);
  185. mhdPool.setPoolCount(sysXPool.getCount());
  186. mhdPool.setCount(0L);
  187. // 加入用户剩余抽奖次数
  188. if (steamId != null) {
  189. List<SysXPoolCount> countList = countService.selectSysXPoolCountList(new SysXPoolCount())
  190. .stream()
  191. .filter(res -> res.getSteamId().equals(steamId))
  192. .filter(res -> res.getPoolId().equals(poolId))
  193. .collect(Collectors.toList());
  194. if (countList.size() > 0) {
  195. mhdPool.setCount(countList.get(0).getCount());
  196. }
  197. }
  198. mhdPools.add(mhdPool);
  199. }
  200. return R.ok(mhdPools);
  201. }
  202. }