UserBenefitsServiceImpl.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package com.cyksj.service.user.impl;
  2. import com.cyksj.mapper.DistributeOrdersDeductPointsRecordMapper;
  3. import com.cyksj.mapper.UserBalanceSourceRecordMapper;
  4. import com.cyksj.mapper.UserMapper;
  5. import com.cyksj.model.entity.DistributeOrdersDeductPointsRecord;
  6. import com.cyksj.model.entity.User;
  7. import com.cyksj.model.entity.UserBalanceSourceRecord;
  8. import com.cyksj.service.user.UserBenefitsService;
  9. import lombok.RequiredArgsConstructor;
  10. import org.springframework.dao.DuplicateKeyException;
  11. import org.springframework.stereotype.Service;
  12. import java.math.BigDecimal;
  13. /*
  14. *项目名: netflix
  15. *文件名: UserBenefitsServiceImpl
  16. *创建者: JavaZou
  17. *创建时间:2023/5/18 16:06
  18. */
  19. @Service
  20. @RequiredArgsConstructor
  21. public class UserBenefitsServiceImpl implements UserBenefitsService {
  22. private final UserMapper userMapper;
  23. private final DistributeOrdersDeductPointsRecordMapper distributeOrdersDeductPointsRecordMapper;
  24. private final UserBalanceSourceRecordMapper userBalanceSourceRecordMapper;
  25. @Override
  26. public void deductDistributePoints(Long orderId, Long userId, BigDecimal deductPoints) {
  27. if (deductPoints.compareTo(BigDecimal.ZERO) <= 0) {
  28. return;
  29. }
  30. while (true) {
  31. User user = userMapper.selectById(userId);
  32. if (user == null) break;
  33. BigDecimal points = user.getPoints();
  34. Integer success = userMapper.subPointsNegative(userId, points, deductPoints);
  35. if (success == 1){
  36. //记录积分已发送后,退款后扣除积分记录
  37. deductPointsRecord(orderId, userId, deductPoints);
  38. break;
  39. }
  40. }
  41. }
  42. @Override
  43. public void addDistributePoints(Long userId, BigDecimal addPoints) {
  44. if (addPoints.compareTo(BigDecimal.ZERO) <= 0) {
  45. return;
  46. }
  47. while (true) {
  48. User user = userMapper.selectById(userId);
  49. if (user == null) break;
  50. BigDecimal points = user.getPoints();
  51. Integer success = userMapper.updatePoints(user.getId(), points, addPoints);
  52. if (success == 1) break;
  53. }
  54. }
  55. @Override
  56. public void addUserBalance(Long userId, BigDecimal addBalance, UserBalanceSourceRecord.Source source) {
  57. if (addBalance.compareTo(BigDecimal.ZERO) <= 0) {
  58. return;
  59. }
  60. while (true) {
  61. User user = userMapper.selectById(userId);
  62. if (user == null) break;
  63. BigDecimal balance = user.getBalance();
  64. Integer success = userMapper.addUserBalance(user.getId(), balance, addBalance);
  65. if (success == 1) {
  66. recordBalanceBySource(userId, addBalance, source);
  67. break;
  68. }
  69. }
  70. }
  71. @Override
  72. public void deductUserBalance(Long userId, BigDecimal subBalance) {
  73. if (subBalance.compareTo(BigDecimal.ZERO) <= 0) {
  74. return;
  75. }
  76. while (true) {
  77. User user = userMapper.selectById(userId);
  78. if (user == null) break;
  79. BigDecimal balance = user.getBalance();
  80. Integer success = userMapper.deductUserBalance(user.getId(), balance, subBalance);
  81. if (success == 1) break;
  82. }
  83. }
  84. public void deductPointsRecord(Long orderId, Long userId, BigDecimal deductPoints) {
  85. try {
  86. DistributeOrdersDeductPointsRecord record = new DistributeOrdersDeductPointsRecord();
  87. record.setOrderId(orderId);
  88. record.setUserId(userId);
  89. record.setDeductPoints(deductPoints);
  90. distributeOrdersDeductPointsRecordMapper.insert(record);
  91. } catch (DuplicateKeyException e) {
  92. }
  93. }
  94. @Override
  95. public void recordBalanceBySource(Long userId, BigDecimal balance, UserBalanceSourceRecord.Source source) {
  96. UserBalanceSourceRecord userBalanceSourceRecord = new UserBalanceSourceRecord();
  97. userBalanceSourceRecord.setUserId(userId);
  98. userBalanceSourceRecord.setBalance(balance);
  99. userBalanceSourceRecord.setSource(source);
  100. userBalanceSourceRecordMapper.insert(userBalanceSourceRecord);
  101. }
  102. }