| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package com.izouma.walkchina.service;
- import com.izouma.walkchina.constant.AppConstants;
- import com.izouma.walkchina.constant.Strings;
- import com.izouma.walkchina.domain.Message;
- import com.izouma.walkchina.domain.UserCoinRecord;
- import com.izouma.walkchina.domain.UserInfo;
- import com.izouma.walkchina.exception.ServiceException;
- import com.izouma.walkchina.repo.MessageRepository;
- import com.izouma.walkchina.repo.UserCoinRecordRepository;
- import com.izouma.walkchina.repo.UserInfoRepository;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import java.math.BigDecimal;
- import java.util.Optional;
- @Slf4j
- @Service
- public class CoinService {
- @Autowired
- private UserCoinRecordRepository userCoinRecordRepository;
- @Autowired
- private UserInfoRepository userInfoRepository;
- @Autowired
- private MessageRepository messageRepository;
- public void reward(Long userId, Long target, BigDecimal amount) {
- UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
- UserInfo targetUserInfo = userInfoRepository.findById(target).orElseThrow(new ServiceException("用户不存在"));
- BigDecimal balance = Optional.ofNullable(userInfo.getCoin()).orElse(BigDecimal.ZERO);
- if (balance.compareTo(amount) < 0) {
- throw new ServiceException("打赏失败,余额不足");
- }
- balanceChange(userInfo, amount.negate(), AppConstants.CoinRecordType.REWARD, Strings.REMARK_REWARD, null);
- balanceChange(targetUserInfo, amount, AppConstants.CoinRecordType.BE_REWARD, Strings.REMARK_BE_REWARD,
- String.format(Strings.MSG_BE_REWARD, userInfo.getNickname(), amount));
- }
- public void balanceChange(UserInfo userInfo, BigDecimal amount, int type, String remark, String message) {
- BigDecimal balance = Optional.ofNullable(userInfo.getCoin()).orElse(BigDecimal.ZERO);
- balance = balance.add(amount);
- userInfo.setCoin(balance);
- userInfoRepository.save(userInfo);
- UserCoinRecord record = UserCoinRecord.builder()
- .userId(userInfo.getId())
- .modify(amount)
- .balance(balance)
- .type(type)
- .remark(remark)
- .build();
- userCoinRecordRepository.save(record);
- if (StringUtils.isNotEmpty(message)) {
- Message msg = Message.builder()
- .userId(userInfo.getId())
- .content(message)
- .type(AppConstants.MessageType.NORMAL)
- .isRead(false)
- .active(true)
- .build();
- messageRepository.save(msg);
- }
- }
- public BigDecimal totalAward(Long userId) {
- return userCoinRecordRepository.sumTotalAward(userId).orElse(BigDecimal.ZERO);
- }
- }
|