CoinService.java 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package com.izouma.walkchina.service;
  2. import com.izouma.walkchina.constant.AppConstants;
  3. import com.izouma.walkchina.constant.Strings;
  4. import com.izouma.walkchina.domain.Message;
  5. import com.izouma.walkchina.domain.UserCoinRecord;
  6. import com.izouma.walkchina.domain.UserInfo;
  7. import com.izouma.walkchina.exception.ServiceException;
  8. import com.izouma.walkchina.repo.MessageRepository;
  9. import com.izouma.walkchina.repo.UserCoinRecordRepository;
  10. import com.izouma.walkchina.repo.UserInfoRepository;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import java.math.BigDecimal;
  16. import java.util.Optional;
  17. @Slf4j
  18. @Service
  19. public class CoinService {
  20. @Autowired
  21. private UserCoinRecordRepository userCoinRecordRepository;
  22. @Autowired
  23. private UserInfoRepository userInfoRepository;
  24. @Autowired
  25. private MessageRepository messageRepository;
  26. public void reward(Long userId, Long target, BigDecimal amount) {
  27. UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
  28. UserInfo targetUserInfo = userInfoRepository.findById(target).orElseThrow(new ServiceException("用户不存在"));
  29. BigDecimal balance = Optional.ofNullable(userInfo.getCoin()).orElse(BigDecimal.ZERO);
  30. if (balance.compareTo(amount) < 0) {
  31. throw new ServiceException("打赏失败,余额不足");
  32. }
  33. balanceChange(userInfo, amount.negate(), AppConstants.CoinRecordType.REWARD, Strings.REMARK_REWARD, null);
  34. balanceChange(targetUserInfo, amount, AppConstants.CoinRecordType.BE_REWARD, Strings.REMARK_BE_REWARD,
  35. String.format(Strings.MSG_BE_REWARD, userInfo.getNickname(), amount));
  36. }
  37. public void balanceChange(UserInfo userInfo, BigDecimal amount, int type, String remark, String message) {
  38. BigDecimal balance = Optional.ofNullable(userInfo.getCoin()).orElse(BigDecimal.ZERO);
  39. balance = balance.add(amount);
  40. userInfo.setCoin(balance);
  41. userInfoRepository.save(userInfo);
  42. UserCoinRecord record = UserCoinRecord.builder()
  43. .userId(userInfo.getId())
  44. .modify(amount)
  45. .balance(balance)
  46. .type(type)
  47. .remark(remark)
  48. .build();
  49. userCoinRecordRepository.save(record);
  50. if (StringUtils.isNotEmpty(message)) {
  51. Message msg = Message.builder()
  52. .userId(userInfo.getId())
  53. .content(message)
  54. .type(AppConstants.MessageType.NORMAL)
  55. .isRead(false)
  56. .active(true)
  57. .build();
  58. messageRepository.save(msg);
  59. }
  60. }
  61. public BigDecimal totalAward(Long userId) {
  62. return userCoinRecordRepository.sumTotalAward(userId).orElse(BigDecimal.ZERO);
  63. }
  64. }