DistributeServiceImpl.java 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package com.cyksj.service.distribute.impl;
  2. import cn.hutool.core.date.DateTime;
  3. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  4. import com.cyksj.common.constant.Constant;
  5. import com.cyksj.common.constant.TaskTypeEnum;
  6. import com.cyksj.common.exception.BusinessRuntimeException;
  7. import com.cyksj.mapper.GoodsDonMapper;
  8. import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
  9. import com.cyksj.mapper.manage.coupon.CouponMapper;
  10. import com.cyksj.mapper.manage.distribute.UserBusinessDefaultRateConfigMapper;
  11. import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
  12. import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
  13. import com.cyksj.mapper.manage.distribute.UserPlatDistributeRateMapper;
  14. import com.cyksj.mapper.market.task.TaskTypeMapper;
  15. import com.cyksj.model.entity.*;
  16. import com.cyksj.model.request.UserDistributeReq;
  17. import com.cyksj.redis.RedisService;
  18. import com.cyksj.service.distribute.DistributeService;
  19. import com.cyksj.service.market.task.TaskService;
  20. import lombok.RequiredArgsConstructor;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.springframework.dao.DuplicateKeyException;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import java.util.Optional;
  26. /*
  27. *项目名: netflix
  28. *文件名: DistributeServiceImpl
  29. *创建者: JavaZou
  30. *创建时间:2022/11/14 12:21
  31. */
  32. @Service
  33. @RequiredArgsConstructor
  34. @Slf4j
  35. public class DistributeServiceImpl implements DistributeService {
  36. private final UserDistributeMapper userDistributeMapper;
  37. private final UserPlatDistributeRateMapper userPlatDistributeRateMapper;
  38. private final GoodsDonMapper goodsDonMapper;
  39. private final TaskService taskService;
  40. private final TaskTypeMapper taskTypeMapper;
  41. private final UserDistributeSharedMapper userDistributeSharedMapper;
  42. private final UserBusinessDefaultRateConfigMapper defaultRateConfigMapper;
  43. private final RedisService redisService;
  44. private final CouponMapper couponMapper;
  45. private final CouponDistributePopularizeMapper couponDistributePopularizeMapper;
  46. @Override
  47. @Transactional(rollbackFor = Throwable.class)
  48. public void insertDistribute(UserDistributeReq userDistributeReq) {
  49. if (!redisService.setNx(String.valueOf(userDistributeReq.getUserId()), userDistributeReq.getUserId(), 30l)) {
  50. throw BusinessRuntimeException.getInstance("请勿重复点击");
  51. }
  52. UserDistribute exists = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeReq.getUserId()).eq(UserDistribute::getDeleted, true).last("limit 1"));
  53. if (exists != null) {
  54. throw BusinessRuntimeException.getInstance("该推广者已添加");
  55. }
  56. Long businessId = userDistributeReq.getBusinessId();
  57. UserDistribute userDistribute = new UserDistribute();
  58. userDistribute.setUserId(userDistributeReq.getUserId());
  59. userDistribute.setRemark(userDistributeReq.getRemark());
  60. userDistribute.setBusinessId(businessId);
  61. if (businessId != null && businessId != 0) {
  62. userDistribute.setBusinessBindTime(DateTime.now());
  63. }
  64. userDistributeMapper.insert(userDistribute);
  65. for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
  66. if (rate.getRate() < 0 || rate.getRate() > 100) {
  67. throw new BusinessRuntimeException("比例错误");
  68. }
  69. GoodsDon goodsDon = goodsDonMapper.selectById(rate.getGoodsId());
  70. if (goodsDon == null || !goodsDon.getDeleted() || goodsDon.getType() == 3) {
  71. throw new BusinessRuntimeException("平台错误");
  72. }
  73. //分销者虚物分销比例且配置商务
  74. if (businessId != null && goodsDon.getType() == 1) {
  75. checkDistributorAndBusinessRate(rate.getRate(), goodsDon.getId(), goodsDon.getTitle());
  76. }
  77. rate.setDistributeId(userDistribute.getId());
  78. userPlatDistributeRateMapper.insert(rate);
  79. }
  80. redisService.del(String.valueOf(userDistributeReq.getUserId()));
  81. }
  82. @Override
  83. @Transactional(rollbackFor = Throwable.class)
  84. public void editDistribute(UserDistributeReq userDistributeReq) {
  85. if (userDistributeReq.getId() == null || userDistributeReq.getId() < 1) {
  86. throw BusinessRuntimeException.getInstance("id错误");
  87. }
  88. UserDistribute userDistribute = new UserDistribute();
  89. userDistribute.setId(userDistributeReq.getId());
  90. userDistribute.setRemark(userDistributeReq.getRemark());
  91. Long businessId = userDistributeReq.getBusinessId();
  92. if (businessId == null) {
  93. userDistribute.setBusinessId(0l);
  94. } else {
  95. if (userDistribute.getBusinessId() != null && !userDistribute.getBusinessId().equals(businessId)) {
  96. userDistribute.setBusinessBindTime(DateTime.now());
  97. }
  98. userDistribute.setBusinessId(businessId);
  99. }
  100. userDistributeMapper.updateById(userDistribute);
  101. for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
  102. if (rate.getRate() < 0 || rate.getRate() > 100) {
  103. throw new BusinessRuntimeException("比例错误");
  104. }
  105. GoodsDon goodsDon = goodsDonMapper.selectById(rate.getGoodsId());
  106. if (rate.getId() != null && (goodsDon == null || !goodsDon.getDeleted())) {
  107. userPlatDistributeRateMapper.deleteById(rate.getId());
  108. continue;
  109. }
  110. if (goodsDon == null || !goodsDon.getDeleted() || goodsDon.getType() == 3) {
  111. throw new BusinessRuntimeException("平台错误");
  112. }
  113. //分销者虚物分销比例且配置商务
  114. if (businessId != null && goodsDon.getType() == 1) {
  115. checkDistributorAndBusinessRate(rate.getRate(), goodsDon.getId(), goodsDon.getTitle());
  116. }
  117. rate.setDistributeId(userDistribute.getId());
  118. if (rate.getId() == null) {
  119. try {
  120. userPlatDistributeRateMapper.insert(rate);
  121. } catch (DuplicateKeyException e) {
  122. }
  123. } else {
  124. userPlatDistributeRateMapper.updateById(rate);
  125. }
  126. }
  127. }
  128. @Override
  129. public void saveDistributionInvitation(Long sharedId, Long userId, Long dsPopularizeId) {
  130. UserDistributeShared userDistributeShared = new UserDistributeShared();
  131. userDistributeShared.setSharedId(sharedId);
  132. //存在分销
  133. userDistributeShared.setUserId(userId);
  134. userDistributeShared.setDsPopularizeId(dsPopularizeId);
  135. try {
  136. userDistributeSharedMapper.insert(userDistributeShared);
  137. TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
  138. .eq(TaskType::getName, TaskTypeEnum.share.getDesc()).last("limit 1"));
  139. taskService.completeTask(taskType, sharedId);
  140. } catch (DuplicateKeyException e) {
  141. log.info("分销被邀请人重复插入");
  142. }
  143. }
  144. @Override
  145. @Transactional(rollbackFor = Throwable.class)
  146. public void bindPopularizeCode(Long userId, String code) {
  147. Coupon coupon = couponMapper.getCouponById(Constant.GENERAL_POPULARIZE_COUPON_ID);
  148. if (!redisService.setNx(RedisService.key.GENERAL_POPULARIZE_CODE.getName() + code, userId, RedisService.key.GENERAL_POPULARIZE_CODE.getTimeout())) {
  149. throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置");
  150. }
  151. CouponDistributePopularize is_exists = couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class).eq(CouponDistributePopularize::getUserId, userId).last("limit 1"));
  152. if (is_exists != null) throw BusinessRuntimeException.getInstance("你已设置专属推广优惠码");
  153. CouponDistributePopularize couponDistributePopularize = new CouponDistributePopularize();
  154. couponDistributePopularize.setCouponId(coupon.getId());
  155. couponDistributePopularize.setUserId(userId);
  156. couponDistributePopularize.setIsGeneral(true);
  157. CouponDistributePopularize exists = couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class)
  158. .eq(CouponDistributePopularize::getExCode, code)
  159. .eq(CouponDistributePopularize::getDeleted, true)
  160. .ne(CouponDistributePopularize::getUserId, userId)
  161. .select(CouponDistributePopularize::getId)
  162. .last("limit 1"));
  163. if (exists != null) {
  164. throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置");
  165. } else {
  166. Coupon existsCoupon = couponMapper.selectOne(Wrappers.lambdaQuery(Coupon.class)
  167. .eq(Coupon::getExCode, couponDistributePopularize.getExCode())
  168. .eq(Coupon::getDeleted, true)
  169. .select(Coupon::getId)
  170. .last("limit 1"));
  171. if (existsCoupon != null) {
  172. throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置");
  173. }
  174. }
  175. couponDistributePopularize.setExCode(code);
  176. couponDistributePopularizeMapper.insert(couponDistributePopularize);
  177. }
  178. public void checkDistributorAndBusinessRate(Integer distributeGoodsRate, Long goodsId, String goodsName) {
  179. UserBusinessDefaultRateConfig defaultGoodsRateConfig = defaultRateConfigMapper.selectOne(Wrappers.lambdaQuery(UserBusinessDefaultRateConfig.class)
  180. .eq(UserBusinessDefaultRateConfig::getGoodsId, goodsId)
  181. .last("limit 1"));
  182. Optional.ofNullable(defaultGoodsRateConfig).ifPresent(config -> {
  183. if (distributeGoodsRate > config.getMaxRate()) {
  184. throw BusinessRuntimeException.getInstance(String.format("该%s平台最高可配置分销比例为%s", goodsName, config.getMaxRate()));
  185. }
  186. });
  187. }
  188. }