RewardManagerImpl.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package com.punchsettle.server.service.manager.impl;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.Objects;
  5. import java.util.Optional;
  6. import com.punchsettle.server.atomic.entity.Account;
  7. import com.punchsettle.server.atomic.entity.Reward;
  8. import com.punchsettle.server.atomic.entity.RewardExchangeHistory;
  9. import com.punchsettle.server.atomic.entity.User;
  10. import com.punchsettle.server.atomic.service.IAccountService;
  11. import com.punchsettle.server.atomic.service.IRewardExchangeHistoryService;
  12. import com.punchsettle.server.atomic.service.IUserService;
  13. import com.punchsettle.server.common.constant.CommonEnableStatusEnum;
  14. import com.punchsettle.server.common.exception.BusinessException;
  15. import com.punchsettle.server.common.utils.Assert;
  16. import com.punchsettle.server.constant.RewardExchangeMethodEnum;
  17. import com.punchsettle.server.constant.VersionStatusEnum;
  18. import com.punchsettle.server.pojo.reward.RewardExchangeRequest;
  19. import com.punchsettle.server.pojo.reward.RewardQuery;
  20. import com.punchsettle.server.pojo.reward.RewardRequest;
  21. import com.punchsettle.server.utiis.UserUtils;
  22. import org.springframework.beans.BeanUtils;
  23. import org.springframework.beans.factory.BeanFactoryUtils;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.context.annotation.Bean;
  26. import org.springframework.stereotype.Service;
  27. import com.punchsettle.server.atomic.service.IRewardService;
  28. import com.punchsettle.server.pojo.reward.RewardVO;
  29. import com.punchsettle.server.service.manager.IRewardManager;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import org.springframework.util.CollectionUtils;
  32. /**
  33. * @author tyuio
  34. * @version 1.0.0
  35. * @description 奖励 服务类
  36. * @date 2024/11/25 20:59
  37. */
  38. @Service
  39. public class RewardManagerImpl implements IRewardManager {
  40. @Autowired
  41. private IRewardService rewardService;
  42. @Autowired
  43. private IAccountService accountService;
  44. @Autowired
  45. private IRewardExchangeHistoryService rewardExchangeHistoryService;
  46. @Autowired
  47. private IUserService userService;
  48. @Override
  49. public List<RewardVO> queryRewardList() {
  50. // 查询奖励列表
  51. RewardQuery rewardQuery = new RewardQuery();
  52. rewardQuery.setUserId(UserUtils.getCurrentUserId());
  53. rewardQuery.setRewardStatus(VersionStatusEnum.ACTIVE);
  54. List<Reward> rewards = rewardService.queryByCondition(rewardQuery);
  55. if (CollectionUtils.isEmpty(rewards)) {
  56. return List.of();
  57. }
  58. return rewards.stream().map(reward -> {
  59. RewardVO rewardVO = new RewardVO();
  60. BeanUtils.copyProperties(reward, rewardVO);
  61. return rewardVO;
  62. }).toList();
  63. }
  64. @Override
  65. public RewardVO queryReward(Long id) {
  66. Assert.isNullInBusiness(id, "请传入奖励ID");
  67. Reward reward = Optional.ofNullable(rewardService.getById(id)).orElseThrow(() -> BusinessException.fail("无法查询到该奖励"));
  68. RewardVO rewardVO = new RewardVO();
  69. BeanUtils.copyProperties(reward, rewardVO);
  70. return rewardVO;
  71. }
  72. @Override
  73. @Transactional(rollbackFor = Exception.class)
  74. public void saveReward(RewardRequest request) {
  75. Assert.isNullInBusiness(request, "请传入奖励信息");
  76. if (CommonEnableStatusEnum.ENABLED.equals(request.getAutoStatus()) && Objects.isNull(request.getAutoExchangeCount())) {
  77. BusinessException.throwFail("启用了自动兑换,自动兑换次数不能为空");
  78. }
  79. // 新增奖励数据
  80. Reward addReward = new Reward();
  81. BeanUtils.copyProperties(request, addReward);
  82. addReward.setId(null);
  83. addReward.setUserId(UserUtils.getCurrentUserId());
  84. addReward.setRewardStatus(VersionStatusEnum.ACTIVE);
  85. addReward.setRewardVersion(1);
  86. // 如果奖励已存在,则更新任务版本号、设置唯一ID、旧数据归档
  87. if (Objects.nonNull(request.getId())) {
  88. Reward oldReward = Optional.ofNullable(rewardService.getById(request.getId())).orElseThrow(() -> BusinessException.fail("无法查询到该奖励"));
  89. addReward.setRewardVersion(oldReward.getRewardVersion() + 1);
  90. addReward.setRewardUniqueId(oldReward.getRewardUniqueId());
  91. Reward updateReward = new Reward();
  92. updateReward.setId(oldReward.getId());
  93. updateReward.setRewardStatus(VersionStatusEnum.ARCHIVE);
  94. rewardService.update(updateReward);
  95. }
  96. rewardService.insert(addReward);
  97. if (Objects.isNull(addReward.getRewardUniqueId())) {
  98. Reward updateReward = new Reward();
  99. updateReward.setId(addReward.getId());
  100. updateReward.setRewardUniqueId(addReward.getId());
  101. rewardService.update(updateReward);
  102. }
  103. }
  104. @Override
  105. @Transactional(rollbackFor = Exception.class)
  106. public void deleteReward(Long id) {
  107. Assert.isNullInBusiness(id, "请传入奖励ID");
  108. // 新增奖励数据
  109. Reward addReward = copyAndArchive(id);
  110. addReward.setRewardStatus(VersionStatusEnum.DELETE);
  111. rewardService.insert(addReward);
  112. }
  113. private Reward copyAndArchive(Long id) {
  114. // 获取旧数据
  115. Reward oldReward = Optional.ofNullable(rewardService.getById(id)).orElseThrow(() -> BusinessException.fail("无法查询到该奖励"));
  116. // 旧数据归档
  117. Reward updateReward = new Reward();
  118. updateReward.setId(oldReward.getId());
  119. updateReward.setRewardStatus(VersionStatusEnum.ARCHIVE);
  120. rewardService.update(updateReward);
  121. // 新的奖励信息
  122. Reward reward = new Reward();
  123. BeanUtils.copyProperties(oldReward, reward);
  124. reward.setRewardStatus(VersionStatusEnum.ACTIVE);
  125. reward.setRewardVersion(Optional.ofNullable(oldReward.getRewardVersion()).orElse(0) + 1);
  126. return reward;
  127. }
  128. @Override
  129. @Transactional(rollbackFor = Exception.class)
  130. public void exchangeReward(RewardExchangeRequest request) {
  131. Assert.isNullInBusiness(request, "请传入奖励兑换信息");
  132. // 获取奖励信息
  133. Reward reward = Optional.ofNullable(rewardService.getById(request.getRewardId())).orElseThrow(() -> BusinessException.fail("无法查询到该奖励"));
  134. // 获取账户信息
  135. Account account = Optional.ofNullable(accountService.getById(request.getAccountId())).orElseThrow(() -> BusinessException.fail("无法查询到该账户"));
  136. // 兑换所需积分
  137. Integer exchangePoints = Optional.ofNullable(reward.getExchangePoints()).orElse(0);
  138. // 兑换所需总积分
  139. Integer exchangeTotalPoints = exchangePoints * request.getExchangeCount();
  140. // 兑换前账户中的积分
  141. Integer accountPointsBeforeExchange = Optional.ofNullable(account.getPoints()).orElse(0);
  142. if (accountPointsBeforeExchange.compareTo(exchangeTotalPoints) < 0) {
  143. BusinessException.throwFail("账户积分不足,无法兑换");
  144. }
  145. // 兑换后账户中的积分
  146. Integer accountPointsAfterExchange = accountPointsBeforeExchange - exchangeTotalPoints;
  147. // 获取用户信息
  148. User user = Optional.ofNullable(userService.getById(UserUtils.getCurrentUserId())).orElseThrow(() -> BusinessException.fail("无法查询到当前用户信息"));
  149. // 兑换前未使用积分
  150. Integer unusedPointsBeforeExchange = Optional.ofNullable(user.getUnusedPoints()).orElse(0);
  151. if (exchangeTotalPoints.compareTo(unusedPointsBeforeExchange) < 0) {
  152. BusinessException.throwFail("用户积分不足,无法兑换");
  153. }
  154. // 兑换前已使用积分
  155. Integer usedPointsBeforeExchange = Optional.ofNullable(user.getUsedPoints()).orElse(0);
  156. // 兑换后未使用积分
  157. Integer unusedPointsAfterExchange = unusedPointsBeforeExchange - exchangeTotalPoints;
  158. // 兑换后已使用积分
  159. Integer usedPointsAfterExchange = usedPointsBeforeExchange + exchangeTotalPoints;
  160. // 新增兑换记录
  161. RewardExchangeHistory addRewardExchangeHistory = new RewardExchangeHistory();
  162. addRewardExchangeHistory.setUserId(UserUtils.getCurrentUserId());
  163. addRewardExchangeHistory.setRewardId(reward.getId());
  164. addRewardExchangeHistory.setExchangeMethod(RewardExchangeMethodEnum.AUTO);
  165. addRewardExchangeHistory.setExchangeCount(request.getExchangeCount());
  166. addRewardExchangeHistory.setExchangeTotalPoints(exchangeTotalPoints);
  167. addRewardExchangeHistory.setAccountId(account.getId());
  168. addRewardExchangeHistory.setAccountPointsBeforeExchange(accountPointsBeforeExchange);
  169. addRewardExchangeHistory.setAccountPointsAfterExchange(accountPointsAfterExchange);
  170. addRewardExchangeHistory.setUnusedPointsBeforeExchange(unusedPointsBeforeExchange);
  171. addRewardExchangeHistory.setUnusedPointsAfterExchange(unusedPointsAfterExchange);
  172. addRewardExchangeHistory.setUsedPointsBeforeExchange(usedPointsBeforeExchange);
  173. addRewardExchangeHistory.setUsedPointsAfterExchange(usedPointsAfterExchange);
  174. rewardExchangeHistoryService.insert(addRewardExchangeHistory);
  175. User updateUser = new User();
  176. updateUser.setId(user.getId());
  177. updateUser.setUnusedPoints(unusedPointsAfterExchange);
  178. updateUser.setUsedPoints(usedPointsAfterExchange);
  179. userService.updateById(updateUser);
  180. Account updateAccount = new Account();
  181. updateAccount.setId(account.getId());
  182. updateAccount.setPoints(accountPointsAfterExchange);
  183. accountService.batchUpdate(Arrays.asList(updateAccount));
  184. }
  185. }