|
|
@@ -1,138 +1,148 @@
|
|
|
package cn.seecoder.courselearning.serviceimpl;
|
|
|
|
|
|
-import cn.seecoder.courselearning.dto.CourseCouponDTO;
|
|
|
-import cn.seecoder.courselearning.dto.UniversalCouponDTO;
|
|
|
-import cn.seecoder.courselearning.dto.UserCouponDTO;
|
|
|
-import cn.seecoder.courselearning.mapperservice.CouponMapper;
|
|
|
-import cn.seecoder.courselearning.po.Coupon;
|
|
|
-import cn.seecoder.courselearning.service.CouponStrategy;
|
|
|
+import cn.seecoder.courselearning.dto.CouponDTO;
|
|
|
+import cn.seecoder.courselearning.dto.DeliverCouponDTO;
|
|
|
+import cn.seecoder.courselearning.mapperservice.*;
|
|
|
+import cn.seecoder.courselearning.po.*;
|
|
|
+import cn.seecoder.courselearning.service.CouponDeliverStrategy;
|
|
|
import cn.seecoder.courselearning.service.CouponService;
|
|
|
-import cn.seecoder.courselearning.serviceimpl.couponstrategy.CourseCouponStrategyImpl;
|
|
|
-import cn.seecoder.courselearning.serviceimpl.couponstrategy.UniversalCouponStrategyImpl;
|
|
|
-import cn.seecoder.courselearning.serviceimpl.couponstrategy.UserCouponStrategyImpl;
|
|
|
import cn.seecoder.courselearning.util.Constant;
|
|
|
import cn.seecoder.courselearning.util.CouponValidator;
|
|
|
import cn.seecoder.courselearning.vo.CouponVO;
|
|
|
import cn.seecoder.courselearning.vo.CourseOrderVO;
|
|
|
import cn.seecoder.courselearning.vo.ResultVO;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
|
public class CouponServiceImpl implements CouponService {
|
|
|
@Resource
|
|
|
private CouponMapper couponMapper;
|
|
|
|
|
|
-// private final List<CouponStrategy> couponStrategyList;
|
|
|
-//
|
|
|
-// @Autowired
|
|
|
-// public CouponServiceImpl(UniversalCouponStrategyImpl universalCouponMatchStrategy, CourseCouponStrategyImpl courseCouponMatchStrategy, UserCouponStrategyImpl userCouponMatchStrategy) {
|
|
|
-// couponStrategyList = new ArrayList<>();
|
|
|
-// couponStrategyList.add(universalCouponMatchStrategy);
|
|
|
-// couponStrategyList.add(courseCouponMatchStrategy);
|
|
|
-// couponStrategyList.add(userCouponMatchStrategy);
|
|
|
-// }
|
|
|
+ @Resource
|
|
|
+ private UserMapper userMapper;
|
|
|
|
|
|
- @Override
|
|
|
- public ResultVO<CouponVO> createUniversalCoupon(UniversalCouponDTO universalCouponDTO) {
|
|
|
- System.out.println(universalCouponDTO);
|
|
|
+ @Resource
|
|
|
+ private UserCouponMapper userCouponMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private CourseMapper courseMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private CourseOrderMapper orderMapper;
|
|
|
+ /**
|
|
|
+ * 直接创建优惠券并发放
|
|
|
+ * @param couponDTO
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ResultVO<CouponVO> createCoupon(CouponDTO couponDTO) {
|
|
|
+ System.out.println(couponDTO);
|
|
|
Coupon coupon = new Coupon();
|
|
|
- BeanUtils.copyProperties(universalCouponDTO, coupon);
|
|
|
- // 网站优惠活动生成的优惠券一定是对所有用户、所有课程均有效的
|
|
|
- coupon.setValidUserId(-1);
|
|
|
- coupon.setCourseId(-1);
|
|
|
+ BeanUtils.copyProperties(couponDTO, coupon);
|
|
|
coupon.setValid(true);
|
|
|
- if(CouponValidator.isInvalid(coupon))
|
|
|
+ if (CouponValidator.isInvalid(coupon)) {
|
|
|
return new ResultVO<>(Constant.REQUEST_FAIL, "优惠信息填写有误!");
|
|
|
- if(couponMapper.insert(coupon) > 0) {
|
|
|
- System.out.println(coupon);
|
|
|
- return new ResultVO<>(Constant.REQUEST_SUCCESS, "网站优惠活动创建成功", new CouponVO(coupon));
|
|
|
}
|
|
|
- return new ResultVO<>(Constant.REQUEST_FAIL, "网站优惠活动创建失败");
|
|
|
+ if (couponMapper.insert(coupon) <= 0) {
|
|
|
+ return new ResultVO<>(Constant.REQUEST_FAIL, "优惠活动创建失败");
|
|
|
+ }
|
|
|
+ ResultVO<CouponVO> ret = new ResultVO<>(Constant.REQUEST_SUCCESS, "优惠活动创建成功", new CouponVO(coupon));
|
|
|
+ if (couponDTO.getDeliverCouponDTO() != null) {
|
|
|
+ // 异步发放优惠券
|
|
|
+ DeliverCouponDTO deliverCouponDTO = couponDTO.getDeliverCouponDTO();
|
|
|
+ deliverCouponDTO.setCouponId(coupon.getId());
|
|
|
+ deliverCouponToUsers(deliverCouponDTO);
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public ResultVO<CouponVO> createCourseCoupon(CourseCouponDTO courseCouponDTO) {
|
|
|
- Coupon coupon = new Coupon();
|
|
|
- BeanUtils.copyProperties(courseCouponDTO, coupon);
|
|
|
- // 课程优惠活动生成的优惠券是对所有用户均有效的
|
|
|
- coupon.setValidUserId(-1);
|
|
|
- coupon.setValid(true);
|
|
|
- if(CouponValidator.isInvalid(coupon) || coupon.getCourseId() == -1)
|
|
|
- return new ResultVO<>(Constant.REQUEST_FAIL, "优惠信息填写有误!");
|
|
|
- if(couponMapper.insert(coupon) > 0)
|
|
|
- return new ResultVO<>(Constant.REQUEST_SUCCESS, "课程优惠活动创建成功", new CouponVO(coupon));
|
|
|
- return new ResultVO<>(Constant.REQUEST_FAIL, "课程优惠活动创建失败");
|
|
|
+ public ResultVO<Boolean> deliverCoupon(DeliverCouponDTO courseCouponDTO) {
|
|
|
+ deliverCouponToUsers(courseCouponDTO);
|
|
|
+ return new ResultVO<>(Constant.REQUEST_SUCCESS, "发放成功");
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public ResultVO<CouponVO> createUserCoupon(UserCouponDTO userCouponDTO) {
|
|
|
- Coupon coupon = new Coupon();
|
|
|
- BeanUtils.copyProperties(userCouponDTO, coupon);
|
|
|
- coupon.setValid(true);
|
|
|
- // 用户定制化优惠活动生成的优惠券仅对某个用户有效
|
|
|
- if(CouponValidator.isInvalid(coupon) || coupon.getValidUserId() == -1)
|
|
|
- return new ResultVO<>(Constant.REQUEST_FAIL, "优惠信息填写有误!");
|
|
|
- if(couponMapper.insert(coupon) > 0)
|
|
|
- return new ResultVO<>(Constant.REQUEST_SUCCESS, "用户优惠券发放成功", new CouponVO(coupon));
|
|
|
- return new ResultVO<>(Constant.REQUEST_FAIL, "用户优惠券发放失败");
|
|
|
+ public ResultVO<List<CouponVO>> getAllAvailableCoupons() {
|
|
|
+ List<Coupon> coupons = couponMapper.selectAll();
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ // 获取还未结束或还未开始的可发放的优惠券
|
|
|
+ List<CouponVO> result = coupons.stream().filter(coupon -> coupon.getEndTime().isAfter(now) && coupon.isValid()).map(CouponVO::new).collect(Collectors.toList());
|
|
|
+ return new ResultVO<>(Constant.REQUEST_SUCCESS, "获取成功", result);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<CouponVO> getUniversalCoupons() {
|
|
|
- List<Coupon> couponList = couponMapper.selectByCourseIdAndUserId(-1, -1);
|
|
|
- List<CouponVO> ret = new ArrayList<>();
|
|
|
- couponList.forEach(coupon -> ret.add(new CouponVO(coupon)));
|
|
|
- return ret;
|
|
|
+ public ResultVO<List<CouponVO>> getAllAvailableCouponsForOrder(Integer orderId) {
|
|
|
+ CourseOrder courseOrder = orderMapper.selectByPrimaryKey(orderId);
|
|
|
+ if (orderId == null) {
|
|
|
+ return new ResultVO<>(Constant.REQUEST_FAIL, "查询失败,订单不存在!", Collections.EMPTY_LIST);
|
|
|
+ }
|
|
|
+ CourseOrderVO orderVO = new CourseOrderVO(courseOrder);
|
|
|
+ // 获取已经使用的优惠券
|
|
|
+ List<Coupon> usedCoupons = couponMapper.selectByOrderId(orderVO.getId());
|
|
|
+ boolean sharable = true;
|
|
|
+ // 获取对应的优惠券
|
|
|
+ for (Coupon usedCoupon : usedCoupons) {
|
|
|
+ if (!usedCoupon.isSharable()) {
|
|
|
+ sharable = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (sharable) {
|
|
|
+ // 查询可用优惠券
|
|
|
+ List<Coupon> userCoupons = couponMapper.selectByUserId(orderVO.getUserId());
|
|
|
+ List<Coupon> availableCoupons = new ArrayList<>();
|
|
|
+ Course course = courseMapper.selectByPrimaryKey(orderVO.getCourseId());
|
|
|
+ for (Coupon coupon : userCoupons) {
|
|
|
+ if (coupon.getType().getCouponStrategy().canUse(orderVO, coupon) && coupon.getScope().canUse(course, coupon)) {
|
|
|
+ // 再去除当前订单使用的
|
|
|
+ Coupon usedCoupon = usedCoupons.stream().filter(used -> used.getId().equals(coupon.getId())).findFirst().orElse(null);
|
|
|
+ if (usedCoupon == null) {
|
|
|
+ availableCoupons.add(coupon);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return new ResultVO<>(Constant.REQUEST_SUCCESS, "查询成功", availableCoupons.stream().map(CouponVO::new).collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+ return new ResultVO<>(Constant.REQUEST_SUCCESS, "查询成功", Collections.EMPTY_LIST);
|
|
|
}
|
|
|
|
|
|
-// @Override
|
|
|
-// public List<CouponVO> getCourseCoupons(Integer courseId) {
|
|
|
-// List<Coupon> couponList = couponMapper.selectByCourseIdAndUserId(courseId, -1);
|
|
|
-// List<CouponVO> ret = new ArrayList<>();
|
|
|
-// couponList.forEach(coupon -> ret.add(new CouponVO(coupon)));
|
|
|
-// return ret;
|
|
|
-// }
|
|
|
-
|
|
|
-// @Override
|
|
|
-// public List<CouponVO> getAllEffectiveUserCoupons(Integer userId) {
|
|
|
-// List<Coupon> couponList = couponMapper.selectByUserId(userId);
|
|
|
-// List<CouponVO> ret = new ArrayList<>();
|
|
|
-// couponList.forEach(coupon -> {
|
|
|
-// CourseOrderVO orderVO = new CourseOrderVO();
|
|
|
-// orderVO.setCourseId(coupon.getCourseId());
|
|
|
-// orderVO.setUserId(userId);
|
|
|
-// orderVO.setCost(0);
|
|
|
-// orderVO.setCreateTime(new Date());
|
|
|
-// if (couponStrategyList.get(2).isEffective(orderVO, coupon))
|
|
|
-// ret.add(new CouponVO(coupon));
|
|
|
-// });
|
|
|
-// return ret;
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// public List<CouponVO> getAllEffectiveCouponsForOrder(CourseOrderVO orderVO) {
|
|
|
-// List<Coupon> universalCoupons = couponMapper.selectByCourseIdAndUserId(-1, -1);
|
|
|
-// List<Coupon> courseCoupons = couponMapper.selectByCourseIdAndUserId(orderVO.getCourseId(), -1);
|
|
|
-// List<Coupon> userCoupons = couponMapper.selectByUserId(orderVO.getUserId());
|
|
|
-// List<Coupon> temp = new ArrayList<>(universalCoupons);
|
|
|
-// temp.addAll(courseCoupons);
|
|
|
-// temp.addAll(userCoupons);
|
|
|
-// List<CouponVO> ret = new ArrayList<>();
|
|
|
-// temp.forEach(coupon -> {
|
|
|
-// for(CouponStrategy strategy: couponStrategyList) {
|
|
|
-// if (strategy.isEffective(orderVO, coupon)) {
|
|
|
-// ret.add(new CouponVO(coupon));
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// });
|
|
|
-// return ret;
|
|
|
-// }
|
|
|
+ @Async("taskExecutor")
|
|
|
+ protected void deliverCouponToUsers(DeliverCouponDTO deliverCouponDTO) {
|
|
|
+ List<User> users = userMapper.selectAll();
|
|
|
+ Coupon coupon = couponMapper.selectByPrimaryKey(deliverCouponDTO.getCouponId());
|
|
|
+ if (coupon == null || users.isEmpty()) return;
|
|
|
+ List<User> targetUsers = new ArrayList<>();
|
|
|
+ CouponDeliverStrategy deliverStrategy = deliverCouponDTO.getDeliver().getDeliverStrategy();
|
|
|
+ for (User user : users) {
|
|
|
+ if (deliverStrategy.canDeliver(user, coupon, deliverCouponDTO.getExtra())) {
|
|
|
+ if (deliverCouponDTO.getCanDuplicate()) {
|
|
|
+ targetUsers.add(user);
|
|
|
+ } else {
|
|
|
+ UserCoupon userCoupon = userCouponMapper.selectByCouponIdAndUserId(deliverCouponDTO.getCouponId(), user.getId());
|
|
|
+ if (userCoupon == null) {
|
|
|
+ targetUsers.add(user);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (User user : targetUsers) {
|
|
|
+ UserCoupon userCoupon = userCouponMapper.selectByCouponIdAndUserId(deliverCouponDTO.getCouponId(), user.getId());
|
|
|
+ if (userCoupon != null) {
|
|
|
+ userCoupon.setNums(userCoupon.getNums() + deliverCouponDTO.getNums());
|
|
|
+ userCouponMapper.update(userCoupon);
|
|
|
+ } else {
|
|
|
+ userCoupon = new UserCoupon(deliverCouponDTO.getCouponId(), user.getId(), deliverCouponDTO.getNums());
|
|
|
+ userCouponMapper.insert(userCoupon);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|