UserBenefitsServiceImpl.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. package com.cyksj.service.user.impl;
  2. import com.cyksj.common.EnvCommonService;
  3. import com.cyksj.common.constant.Constant;
  4. import com.cyksj.mapper.DistributeOrdersDeductPointsRecordMapper;
  5. import com.cyksj.mapper.UserBalanceSourceRecordMapper;
  6. import com.cyksj.mapper.UserMapper;
  7. import com.cyksj.mapper.shop.YhShopDistributeOrdersDeductPointsRecordMapper;
  8. import com.cyksj.model.entity.DistributeOrdersDeductPointsRecord;
  9. import com.cyksj.model.entity.User;
  10. import com.cyksj.model.entity.UserBalanceSourceRecord;
  11. import com.cyksj.model.entity.YhShopDistributeOrdersDeductPointsRecord;
  12. import com.cyksj.service.sms.SmsService;
  13. import com.cyksj.service.user.UserBenefitsService;
  14. import lombok.RequiredArgsConstructor;
  15. import org.springframework.dao.DuplicateKeyException;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.transaction.annotation.Transactional;
  18. import java.math.BigDecimal;
  19. /*
  20. *项目名: netflix
  21. *文件名: UserBenefitsServiceImpl
  22. *创建者: JavaZou
  23. *创建时间:2023/5/18 16:06
  24. */
  25. @Service
  26. @RequiredArgsConstructor
  27. public class UserBenefitsServiceImpl implements UserBenefitsService {
  28. private final UserMapper userMapper;
  29. private final DistributeOrdersDeductPointsRecordMapper distributeOrdersDeductPointsRecordMapper;
  30. private final UserBalanceSourceRecordMapper userBalanceSourceRecordMapper;
  31. private final EnvCommonService envCommonService;
  32. private final SmsService smsService;
  33. private final YhShopDistributeOrdersDeductPointsRecordMapper yhShopDistributeOrdersDeductPointsRecordMapper;
  34. @Override
  35. public void deductDistributePoints(Long orderId, Long userId, BigDecimal deductPoints) {
  36. if (deductPoints.compareTo(BigDecimal.ZERO) <= 0) {
  37. return;
  38. }
  39. while (true) {
  40. User user = userMapper.selectById(userId);
  41. if (user == null) break;
  42. BigDecimal points = user.getPoints();
  43. Integer success = userMapper.subPointsNegative(userId, points, deductPoints);
  44. if (success == 1){
  45. //记录积分已发送后,退款后扣除积分记录
  46. deductPointsRecord(orderId, userId, deductPoints);
  47. break;
  48. }
  49. }
  50. }
  51. @Override
  52. public void addDistributePoints(Long userId, BigDecimal addPoints) {
  53. if (addPoints.compareTo(BigDecimal.ZERO) <= 0) {
  54. return;
  55. }
  56. while (true) {
  57. User user = userMapper.selectById(userId);
  58. if (user == null) break;
  59. BigDecimal points = user.getPoints();
  60. Integer success = userMapper.updatePoints(user.getId(), points, addPoints);
  61. if (success == 1) break;
  62. }
  63. }
  64. @Override
  65. @Transactional(rollbackFor = Throwable.class)
  66. public void addUserBalance(Long userId, BigDecimal addBalance, UserBalanceSourceRecord.Source source, Long yhsId, Long orderId, String detail, Boolean isRecord) {
  67. if (addBalance == null || addBalance.compareTo(BigDecimal.ZERO) <= 0) {
  68. return;
  69. }
  70. while (true) {
  71. User user = userMapper.selectById(userId);
  72. if (user == null) break;
  73. BigDecimal balance = user.getBalance();
  74. Integer success = userMapper.addUserBalance(user.getId(), balance, addBalance);
  75. if (success == 1) {
  76. if (isRecord) {
  77. recordBalanceBySource(userId, addBalance, source, orderId, detail, null, null);
  78. }
  79. if (envCommonService.isPrdEnv() && isRecord && yhsId != null && yhsId == 0) {
  80. try {
  81. //短信到账提醒
  82. String msg = String.format(Constant.BALANCE_NOTIFY_MSG, addBalance.divide(BigDecimal.valueOf(100)));
  83. smsService.sendSmsToRelationUser(userId, msg);
  84. } catch (Exception e) {
  85. }
  86. }
  87. break;
  88. }
  89. }
  90. }
  91. @Override
  92. public void deductUserBalance(Long userId, BigDecimal subBalance) {
  93. if (subBalance.compareTo(BigDecimal.ZERO) <= 0) {
  94. return;
  95. }
  96. while (true) {
  97. User user = userMapper.selectById(userId);
  98. if (user == null) {
  99. throw new IllegalStateException("user does not exist");
  100. }
  101. BigDecimal balance = user.getBalance();
  102. if (balance.compareTo(subBalance) < 0) {
  103. throw new IllegalStateException("user balance is insufficient");
  104. }
  105. Integer success = userMapper.deductUserBalance(user.getId(), balance, subBalance);
  106. if (success == 1) break;
  107. }
  108. }
  109. public void deductPointsRecord(Long orderId, Long userId, BigDecimal deductPoints) {
  110. try {
  111. DistributeOrdersDeductPointsRecord record = new DistributeOrdersDeductPointsRecord();
  112. record.setOrderId(orderId);
  113. record.setUserId(userId);
  114. record.setDeductPoints(deductPoints);
  115. distributeOrdersDeductPointsRecordMapper.insert(record);
  116. } catch (DuplicateKeyException e) {
  117. }
  118. }
  119. @Override
  120. public void recordBalanceBySource(Long userId, BigDecimal balance, UserBalanceSourceRecord.Source source, Long orderId, String detail, String remark, String operator) {
  121. UserBalanceSourceRecord userBalanceSourceRecord = new UserBalanceSourceRecord();
  122. userBalanceSourceRecord.setUserId(userId);
  123. userBalanceSourceRecord.setBalance(balance);
  124. userBalanceSourceRecord.setSource(source);
  125. userBalanceSourceRecord.setOrderId(orderId);
  126. userBalanceSourceRecord.setDetail(detail);
  127. userBalanceSourceRecord.setRemark(remark);
  128. userBalanceSourceRecord.setOperator(operator);
  129. userBalanceSourceRecordMapper.insert(userBalanceSourceRecord);
  130. }
  131. @Override
  132. public void addYhsMoney(Long userId, BigDecimal addYhsMoney) {
  133. if (addYhsMoney.compareTo(BigDecimal.ZERO) <= 0) {
  134. return;
  135. }
  136. while (true) {
  137. User user = userMapper.selectById(userId);
  138. if (user == null) break;
  139. BigDecimal yhsMoney = user.getYhsMoney();
  140. Integer success = userMapper.addYhsMoney(user.getId(), yhsMoney, addYhsMoney);
  141. if (success == 1) {
  142. break;
  143. }
  144. }
  145. }
  146. @Override
  147. public void deductYhShopTakeMoney(Long orderId, Long shopUserId, BigDecimal deductMoney) {
  148. if (deductMoney.compareTo(BigDecimal.ZERO) <= 0) {
  149. return;
  150. }
  151. while (true) {
  152. User user = userMapper.selectById(shopUserId);
  153. if (user == null) break;
  154. BigDecimal yhsMoney = user.getYhsMoney();
  155. Integer success = userMapper.subYhShopUserMoney(shopUserId, yhsMoney, deductMoney);
  156. if (success == 1){
  157. //记录提成已发送后,退款后扣除用户店铺提成 记录
  158. deductYhsMoneyRecord(orderId, shopUserId, deductMoney);
  159. break;
  160. }
  161. }
  162. }
  163. @Override
  164. public void addDistributeSubMoney(Long userId, BigDecimal addApplyMoney) {
  165. if (addApplyMoney.compareTo(BigDecimal.ZERO) <= 0) {
  166. return;
  167. }
  168. while (true) {
  169. User user = userMapper.selectById(userId);
  170. if (user == null) break;
  171. BigDecimal subApplyMoney = user.getSubApplyMoney();
  172. Integer success = userMapper.addDistributeSubMoney(user.getId(), subApplyMoney, addApplyMoney);
  173. if (success == 1) {
  174. break;
  175. }
  176. }
  177. }
  178. @Override
  179. public void addMpMoney(Long userId, BigDecimal addMoney) {
  180. if (addMoney.compareTo(BigDecimal.ZERO) <= 0) {
  181. return;
  182. }
  183. while (true) {
  184. User user = userMapper.selectById(userId);
  185. if (user == null) break;
  186. BigDecimal mpMoney = user.getMpMoney();
  187. Integer success = userMapper.addMpMoney(user.getId(), mpMoney, addMoney);
  188. if (success == 1) {
  189. break;
  190. }
  191. }
  192. }
  193. @Override
  194. public void deductUserMirrorShopTakeMoney(Long orderId, Long shopUserId, BigDecimal deductMoney) {
  195. if (deductMoney.compareTo(BigDecimal.ZERO) <= 0) {
  196. return;
  197. }
  198. while (true) {
  199. User user = userMapper.selectById(shopUserId);
  200. if (user == null) break;
  201. BigDecimal mpMoney = user.getMpMoney();
  202. Integer success = userMapper.subUserMirrorShopMoney(shopUserId, mpMoney, deductMoney);
  203. if (success == 1){
  204. break;
  205. }
  206. }
  207. }
  208. private void deductYhsMoneyRecord(Long orderId, Long shopUserId, BigDecimal deductMoney) {
  209. try {
  210. YhShopDistributeOrdersDeductPointsRecord record = new YhShopDistributeOrdersDeductPointsRecord();
  211. record.setOrderId(orderId);
  212. record.setShopUserId(shopUserId);
  213. record.setDeductMoney(deductMoney);
  214. yhShopDistributeOrdersDeductPointsRecordMapper.insert(record);
  215. } catch (DuplicateKeyException e) {
  216. }
  217. }
  218. }