|
@@ -1,10 +1,13 @@
|
|
|
package com.qs.mp.admin.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import com.qs.mp.admin.domain.Coupon;
|
|
|
import com.qs.mp.admin.domain.CouponPkg;
|
|
|
import com.qs.mp.admin.domain.CouponPkgItem;
|
|
|
+import com.qs.mp.admin.domain.Ticket;
|
|
|
import com.qs.mp.admin.domain.param.CouponPkgItemParam;
|
|
|
import com.qs.mp.admin.domain.param.CouponPkgParam;
|
|
|
import com.qs.mp.admin.domain.vo.CouponPkgItemVO;
|
|
@@ -13,12 +16,31 @@ import com.qs.mp.admin.mapper.CouponPkgMapper;
|
|
|
import com.qs.mp.admin.service.ICouponPkgItemService;
|
|
|
import com.qs.mp.admin.service.ICouponPkgService;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.qs.mp.admin.service.ICouponService;
|
|
|
+import com.qs.mp.channel.domain.Channel;
|
|
|
+import com.qs.mp.channel.service.IChannelService;
|
|
|
import com.qs.mp.common.enums.CouponPkgStatusEnum;
|
|
|
+import com.qs.mp.common.enums.CouponUseAreaEnum;
|
|
|
+import com.qs.mp.common.enums.UserCouponStatusEnum;
|
|
|
import com.qs.mp.common.exception.ServiceException;
|
|
|
+import com.qs.mp.common.utils.DateUtils;
|
|
|
+import com.qs.mp.common.utils.LogUtil;
|
|
|
+import com.qs.mp.system.service.id.BizIdGenerator;
|
|
|
+import com.qs.mp.user.domain.UserCoupon;
|
|
|
+import com.qs.mp.user.domain.UserCouponChannel;
|
|
|
+import com.qs.mp.user.domain.UserTicketOrder;
|
|
|
+import com.qs.mp.user.domain.UserTicketOrderItem;
|
|
|
+import com.qs.mp.user.service.IUserCouponChannelService;
|
|
|
+import com.qs.mp.user.service.IUserCouponService;
|
|
|
+import com.qs.mp.user.service.IUserTicketOrderItemService;
|
|
|
+import com.qs.mp.user.service.IUserTicketOrderService;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.Assert;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
@@ -35,9 +57,89 @@ import java.util.Objects;
|
|
|
@Service
|
|
|
public class CouponPkgServiceImpl extends ServiceImpl<CouponPkgMapper, CouponPkg> implements ICouponPkgService {
|
|
|
|
|
|
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
|
+
|
|
|
@Autowired
|
|
|
private ICouponPkgItemService couponPkgItemService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private BizIdGenerator bizIdGenerator;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserTicketOrderItemService userTicketOrderItemService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IChannelService channelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserTicketOrderService userTicketOrderService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserCouponChannelService userCouponChannelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserCouponService userCouponService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ICouponService couponService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void distribute(Ticket ticket, Long userId, String couponPkgId) {
|
|
|
+ List<Coupon> couponList = couponPkgItemService.listCouponByPkgId(couponPkgId);
|
|
|
+ if (CollectionUtils.isEmpty(couponList)) {
|
|
|
+ throw new ServiceException("优惠券不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<UserCouponChannel> userCouponChannelList = new ArrayList<>();
|
|
|
+ List<UserCoupon> userCouponList = new ArrayList<>();
|
|
|
+ for (Coupon coupon : couponList) {
|
|
|
+ UserCoupon userCoupon = new UserCoupon();
|
|
|
+ userCoupon.setId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
|
|
|
+ userCoupon.setUserId(userId);
|
|
|
+ userCoupon.setVerifyCode(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
|
|
|
+ userCoupon.setCouponId(coupon.getCouponId());
|
|
|
+ if (coupon.getDueDays() > 0) {
|
|
|
+ userCoupon.setValidStart(DateUtils.getToday());
|
|
|
+ userCoupon.setValidEnd(DateUtils.addDays(userCoupon.getValidStart(), coupon.getDueDays() - 1));
|
|
|
+ } else {
|
|
|
+ userCoupon.setValidStart(coupon.getValidStart());
|
|
|
+ userCoupon.setValidEnd(coupon.getValidEnd());
|
|
|
+ }
|
|
|
+ userCoupon.setStatus(UserCouponStatusEnum.UNUSED);
|
|
|
+
|
|
|
+ // 确定限定范围
|
|
|
+ if (coupon.getUseArea() == CouponUseAreaEnum.POST_SCOPE) {
|
|
|
+ UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
|
|
|
+ UserTicketOrder ticketOrder = userTicketOrderService.getById(orderItem.getOrderId());
|
|
|
+ if (null == orderItem || null == ticketOrder.getChannelId()) {
|
|
|
+ LogUtil.error(logger, "券包优惠券的限定使用范围类型为发放时生成,但找不到关联的渠道ID。orderItem:{0}",
|
|
|
+ new Object[]{JSONObject.toJSONString(orderItem)});
|
|
|
+ throw new ServiceException("优惠券发放失败");
|
|
|
+ }
|
|
|
+ UserCouponChannel userCouponChannel = new UserCouponChannel();
|
|
|
+ userCouponChannel.setUserCouponId(userCoupon.getId());
|
|
|
+ userCouponChannel.setChannelId(ticketOrder.getChannelId());
|
|
|
+ userCouponChannelList.add(userCouponChannel);
|
|
|
+ Channel channel = channelService.getById(ticketOrder.getChannelId());
|
|
|
+ userCoupon.setUseAreaDesc(channel.getSiteName());
|
|
|
+ } else {
|
|
|
+ userCoupon.setUseAreaDesc(coupon.getUseArea().getDesc());
|
|
|
+ }
|
|
|
+
|
|
|
+ userCouponList.add(userCoupon);
|
|
|
+
|
|
|
+ boolean rtn = couponService.update(new LambdaUpdateWrapper<Coupon>().set(Coupon::getDistributeQty, coupon.getDistributeQty() + 1)
|
|
|
+ .eq(Coupon::getCouponId, coupon.getCouponId()).eq(Coupon::getDistributeQty, coupon.getDistributeQty()));
|
|
|
+ Assert.isTrue(rtn, "领取优惠券奖品,更新优惠券发放量失败。couponId:" + coupon.getCouponId());
|
|
|
+ }
|
|
|
+
|
|
|
+ userCouponChannelService.saveBatch(userCouponChannelList);
|
|
|
+
|
|
|
+ userCouponService.saveBatch(userCouponList);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public boolean delete(Long id) {
|