CouponServiceImpl.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package cn.seecoder.courselearning.serviceimpl.coupon;
  2. import cn.seecoder.courselearning.dto.CouponDTO;
  3. import cn.seecoder.courselearning.dto.DeliverCouponDTO;
  4. import cn.seecoder.courselearning.mapperservice.*;
  5. import cn.seecoder.courselearning.po.*;
  6. import cn.seecoder.courselearning.service.coupon.coupondeliverstrategy.CouponDeliverStrategy;
  7. import cn.seecoder.courselearning.service.coupon.CouponService;
  8. import cn.seecoder.courselearning.service.course.CourseService;
  9. import cn.seecoder.courselearning.service.order.CourseOrderService;
  10. import cn.seecoder.courselearning.service.user.UserService;
  11. import cn.seecoder.courselearning.util.Constant;
  12. import cn.seecoder.courselearning.util.CouponValidator;
  13. import cn.seecoder.courselearning.vo.CouponVO;
  14. import cn.seecoder.courselearning.vo.CourseOrderVO;
  15. import cn.seecoder.courselearning.vo.ResultVO;
  16. import org.springframework.beans.BeanUtils;
  17. import org.springframework.scheduling.annotation.Async;
  18. import org.springframework.stereotype.Service;
  19. import javax.annotation.Resource;
  20. import java.time.LocalDateTime;
  21. import java.util.ArrayList;
  22. import java.util.Collections;
  23. import java.util.List;
  24. import java.util.stream.Collectors;
  25. @Service
  26. public class CouponServiceImpl implements CouponService {
  27. @Resource
  28. private CouponMapper couponMapper;
  29. @Resource
  30. private UserCouponMapper userCouponMapper;
  31. @Resource
  32. private UserService userService;
  33. @Resource
  34. private CourseService courseService;
  35. @Resource
  36. private CourseOrderService orderService;
  37. /**
  38. * 直接创建优惠券并发放
  39. * @param couponDTO
  40. * @return
  41. */
  42. public ResultVO<CouponVO> createCoupon(CouponDTO couponDTO) {
  43. System.out.println(couponDTO);
  44. Coupon coupon = new Coupon();
  45. BeanUtils.copyProperties(couponDTO, coupon);
  46. coupon.setValid(true);
  47. if (CouponValidator.isInvalid(coupon)) {
  48. return new ResultVO<>(Constant.REQUEST_FAIL, "优惠信息填写有误!");
  49. }
  50. if (couponMapper.insert(coupon) <= 0) {
  51. return new ResultVO<>(Constant.REQUEST_FAIL, "优惠活动创建失败");
  52. }
  53. ResultVO<CouponVO> ret = new ResultVO<>(Constant.REQUEST_SUCCESS, "优惠活动创建成功", new CouponVO(coupon));
  54. if (couponDTO.getDeliverCouponDTO() != null) {
  55. // 异步发放优惠券
  56. DeliverCouponDTO deliverCouponDTO = couponDTO.getDeliverCouponDTO();
  57. deliverCouponDTO.setCouponId(coupon.getId());
  58. deliverCouponToUsers(deliverCouponDTO);
  59. }
  60. return ret;
  61. }
  62. @Override
  63. public ResultVO<Boolean> deliverCoupon(DeliverCouponDTO courseCouponDTO) {
  64. deliverCouponToUsers(courseCouponDTO);
  65. return new ResultVO<>(Constant.REQUEST_SUCCESS, "发放成功");
  66. }
  67. @Override
  68. public ResultVO<List<CouponVO>> getAllAvailableCoupons() {
  69. List<Coupon> coupons = couponMapper.selectAll();
  70. LocalDateTime now = LocalDateTime.now();
  71. // 获取还未结束或还未开始的可发放的优惠券
  72. List<CouponVO> result = coupons.stream().filter(coupon -> coupon.getEndTime().isAfter(now) && coupon.isValid()).map(CouponVO::new).collect(Collectors.toList());
  73. return new ResultVO<>(Constant.REQUEST_SUCCESS, "获取成功", result);
  74. }
  75. @Override
  76. public ResultVO<List<CouponVO>> getAllAvailableCouponsForOrder(Integer orderId) {
  77. CourseOrder courseOrder = orderService.getByPrimaryKey(orderId);
  78. if (orderId == null) {
  79. return new ResultVO<>(Constant.REQUEST_FAIL, "查询失败,订单不存在!", Collections.EMPTY_LIST);
  80. }
  81. CourseOrderVO orderVO = new CourseOrderVO(courseOrder);
  82. // 获取已经使用的优惠券
  83. List<Coupon> usedCoupons = couponMapper.selectByOrderId(orderVO.getId());
  84. boolean sharable = true;
  85. // 获取对应的优惠券
  86. for (Coupon usedCoupon : usedCoupons) {
  87. if (!usedCoupon.isSharable()) {
  88. sharable = false;
  89. break;
  90. }
  91. }
  92. if (sharable) {
  93. // 查询可用优惠券
  94. List<Coupon> userCoupons = couponMapper.selectByUserId(orderVO.getUserId());
  95. List<Coupon> availableCoupons = new ArrayList<>();
  96. Course course = courseService.getByPrimaryKey(orderVO.getCourseId());
  97. for (Coupon coupon : userCoupons) {
  98. if (coupon.getType().getCouponStrategy().canUse(orderVO, coupon) && coupon.getScope().canUse(course, coupon)) {
  99. // 再去除当前订单使用的
  100. Coupon usedCoupon = usedCoupons.stream().filter(used -> used.getId().equals(coupon.getId())).findFirst().orElse(null);
  101. if (usedCoupon == null) {
  102. availableCoupons.add(coupon);
  103. }
  104. }
  105. }
  106. return new ResultVO<>(Constant.REQUEST_SUCCESS, "查询成功", availableCoupons.stream().map(CouponVO::new).collect(Collectors.toList()));
  107. }
  108. return new ResultVO<>(Constant.REQUEST_SUCCESS, "查询成功", Collections.EMPTY_LIST);
  109. }
  110. @Override
  111. public List<Coupon> getByOrderId(Integer orderId) {
  112. return couponMapper.selectByOrderId(orderId);
  113. }
  114. @Override
  115. public Coupon getByPrimaryKey(Integer couponId) {
  116. return couponMapper.selectByPrimaryKey(couponId);
  117. }
  118. @Override
  119. public List<UserCoupon> getUserCouponsByUserId(Integer userId) {
  120. return userCouponMapper.selectByUserId(userId);
  121. }
  122. @Override
  123. public void deleteUserCoupon(Integer userId, Integer couponId) {
  124. userCouponMapper.deleteByUserIdAndCouponId(userId, couponId);
  125. }
  126. @Override
  127. public void updateUserCoupon(UserCoupon userCoupon) {
  128. userCouponMapper.update(userCoupon);
  129. }
  130. @Override
  131. public UserCoupon getUserCouponByCouponIdAndUserId(Integer couponId, Integer userId) {
  132. return userCouponMapper.selectByCouponIdAndUserId(couponId, userId);
  133. }
  134. @Async("taskExecutor")
  135. protected void deliverCouponToUsers(DeliverCouponDTO deliverCouponDTO) {
  136. List<User> users = userService.getAll();
  137. Coupon coupon = couponMapper.selectByPrimaryKey(deliverCouponDTO.getCouponId());
  138. if (coupon == null || users.isEmpty()) return;
  139. List<User> targetUsers = new ArrayList<>();
  140. CouponDeliverStrategy deliverStrategy = deliverCouponDTO.getDeliver().getDeliverStrategy();
  141. for (User user : users) {
  142. if (deliverStrategy.canDeliver(user, coupon, deliverCouponDTO.getExtra())) {
  143. if (deliverCouponDTO.getCanDuplicate()) {
  144. targetUsers.add(user);
  145. } else {
  146. UserCoupon userCoupon = userCouponMapper.selectByCouponIdAndUserId(deliverCouponDTO.getCouponId(), user.getId());
  147. if (userCoupon == null) {
  148. targetUsers.add(user);
  149. }
  150. }
  151. }
  152. }
  153. for (User user : targetUsers) {
  154. UserCoupon userCoupon = userCouponMapper.selectByCouponIdAndUserId(deliverCouponDTO.getCouponId(), user.getId());
  155. if (userCoupon != null) {
  156. userCoupon.setNums(userCoupon.getNums() + deliverCouponDTO.getNums());
  157. userCouponMapper.update(userCoupon);
  158. } else {
  159. userCoupon = new UserCoupon(deliverCouponDTO.getCouponId(), user.getId(), deliverCouponDTO.getNums());
  160. userCouponMapper.insert(userCoupon);
  161. }
  162. }
  163. }
  164. }