|
@@ -1,13 +1,17 @@
|
|
|
package com.ym.mec.biz.service.impl;
|
|
|
|
|
|
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
|
|
|
import com.ym.mec.biz.dal.dao.SysCouponCodeDao;
|
|
|
import com.ym.mec.biz.dal.dao.SysCouponDao;
|
|
|
import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
|
|
|
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
|
|
|
import com.ym.mec.biz.dal.entity.SysCoupon;
|
|
|
import com.ym.mec.biz.dal.entity.SysCouponCode;
|
|
|
import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
|
|
|
import com.ym.mec.biz.service.SysCouponCodeService;
|
|
|
+import com.ym.mec.biz.service.SysCouponService;
|
|
|
import com.ym.mec.common.dal.BaseDAO;
|
|
|
+import com.ym.mec.common.exception.BizException;
|
|
|
import com.ym.mec.common.page.PageInfo;
|
|
|
import com.ym.mec.common.service.IdGeneratorService;
|
|
|
import com.ym.mec.common.service.impl.BaseServiceImpl;
|
|
@@ -19,6 +23,7 @@ import org.springframework.transaction.annotation.Isolation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
@Service
|
|
|
public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCode> implements SysCouponCodeService {
|
|
@@ -26,9 +31,13 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
|
|
|
@Autowired
|
|
|
private SysCouponCodeDao sysCouponCodeDao;
|
|
|
@Autowired
|
|
|
+ private SysCouponService sysCouponService;
|
|
|
+ @Autowired
|
|
|
private SysCouponDao sysCouponDao;
|
|
|
@Autowired
|
|
|
private IdGeneratorService idGeneratorService;
|
|
|
+ @Autowired
|
|
|
+ private StudentPaymentOrderDao studentPaymentOrderDao;
|
|
|
|
|
|
@Override
|
|
|
public BaseDAO<Long, SysCouponCode> getDAO() {
|
|
@@ -39,14 +48,18 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
|
|
|
@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
|
|
|
public boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId) {
|
|
|
if(Objects.isNull(userId)||Objects.isNull(couponId)||Objects.isNull(paymentOrderId)){
|
|
|
- return false;
|
|
|
+ throw new BizException("领取失败");
|
|
|
}
|
|
|
SysCoupon sysCoupon = sysCouponDao.lockCoupon(couponId);
|
|
|
Date now = new Date();
|
|
|
//如果优惠券不存在,或者已停用,或者不在领取有效期内,或者已消耗完,则此优惠券无效
|
|
|
- boolean invalid = Objects.isNull(sysCoupon)||0==sysCoupon.getStatus()||now.compareTo(sysCoupon.getStartDate())<0||now.compareTo(sysCoupon.getEndDate())>0||sysCoupon.getConsumeNum()>sysCoupon.getStockCount();
|
|
|
+ boolean invalid = Objects.isNull(sysCoupon)||0==sysCoupon.getStatus()||now.compareTo(sysCoupon.getStartDate())<0||now.compareTo(sysCoupon.getEndDate())>0||sysCoupon.getConsumeNum()>=sysCoupon.getStockCount();
|
|
|
if(invalid){
|
|
|
- return false;
|
|
|
+ throw new BizException("无效优惠券");
|
|
|
+ }
|
|
|
+ StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(paymentOrderId);
|
|
|
+ if(Objects.isNull(studentPaymentOrder)){
|
|
|
+ throw new BizException("无效订单");
|
|
|
}
|
|
|
if(sysCoupon.getLimitExchangeNum()!=-1){
|
|
|
int userUserNum = sysCouponCodeDao.countWithUserAndCoupon(userId, couponId);
|
|
@@ -54,7 +67,7 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
|
|
|
}
|
|
|
//如果用户使用数量超过优惠券限制则领取无效
|
|
|
if(invalid){
|
|
|
- return false;
|
|
|
+ throw new BizException("当前优惠券最多可领取{}次", sysCoupon.getLimitExchangeNum());
|
|
|
}
|
|
|
SysCouponCode sysCouponCode = new SysCouponCode();
|
|
|
sysCouponCode.setUserId(userId);
|
|
@@ -72,9 +85,15 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
|
|
|
sysCouponCode.setUseDeadlineDate(sysCoupon.getEndDate());
|
|
|
break;
|
|
|
default:
|
|
|
- return false;
|
|
|
+ throw new BizException("无效优惠券", sysCoupon.getLimitExchangeNum());
|
|
|
}
|
|
|
sysCouponCodeDao.insert(sysCouponCode);
|
|
|
+ sysCoupon.setConsumeNum(new AtomicInteger(sysCoupon.getConsumeNum()).incrementAndGet());
|
|
|
+ if(sysCoupon.getStockCount()-sysCoupon.getConsumeNum()>sysCoupon.getWarningStockNum()){
|
|
|
+ sysCoupon.setWarningStatus(1);
|
|
|
+ sysCouponService.stockWarning(sysCoupon.getId(),sysCoupon.getName());
|
|
|
+ }
|
|
|
+ sysCouponDao.update(sysCoupon);
|
|
|
return true;
|
|
|
}
|
|
|
|