package com.sinata.rest.modular.member.service.impl;
|
|
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.io.unit.DataUnit;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.sinata.rest.modular.mall.model.MallGoods;
|
import com.sinata.rest.modular.member.dao.MyCouponMapper;
|
import com.sinata.rest.modular.member.model.MyCoupon;
|
import com.sinata.rest.modular.member.model.MyUserCoupon;
|
import com.sinata.rest.modular.member.model.MyUserCouponOrder;
|
import com.sinata.rest.modular.member.service.IMyCouponService;
|
import com.sinata.rest.modular.member.service.IMyUserCouponOrderService;
|
import com.sinata.rest.modular.member.service.IMyUserCouponService;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.util.List;
|
|
/**
|
* <p>
|
* 优惠券 服务实现类
|
* </p>
|
*
|
* @author fq
|
* @since 2023-03-05
|
*/
|
@Service
|
public class MyCouponServiceImpl extends ServiceImpl<MyCouponMapper, MyCoupon> implements IMyCouponService {
|
|
@Autowired
|
IMyUserCouponService myUserCouponService;
|
|
@Autowired
|
IMyUserCouponOrderService couponOrderService;
|
|
@Override
|
public List<MyCoupon> getCouponList(Page<MyCoupon> page, String cityCode, Integer userId, Integer role) {
|
return baseMapper.getCouponList(page, cityCode, userId, role);
|
}
|
|
@Override
|
public MyCoupon getCouponByUserCouponId(Integer userCouponId) {
|
return baseMapper.getCouponByUserCouponId(userCouponId);
|
}
|
|
@Override
|
public List<MallGoods> getCouponGoodsList(Integer couponId) {
|
return baseMapper.getCouponGoodsList(couponId);
|
}
|
|
@Override
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
public synchronized Boolean drawCoupon(Integer couponId, Integer userId) {
|
MyCoupon coupon = decideMyCoupon(couponId, userId);
|
MyUserCoupon userCoupon = new MyUserCoupon();
|
userCoupon.setUserId(userId);
|
userCoupon.setCouponId(couponId);
|
userCoupon.setBeginTime(coupon.getBeginTime());
|
userCoupon.setEndTime(coupon.getEndTime());
|
myUserCouponService.save(userCoupon);
|
return Boolean.TRUE;
|
}
|
|
@Override
|
public synchronized String drawPriceCoupon(Integer couponId, Integer userId) {
|
decideMyCoupon(couponId, userId);
|
MyUserCouponOrder order = new MyUserCouponOrder();
|
order.setOrderNo("MTC"+System.currentTimeMillis());
|
order.setCouponId(couponId);
|
order.setUserId(userId);
|
order.insert();
|
return order.getOrderNo();
|
}
|
|
/**
|
* 判断是否满足领取条件
|
* @param couponId
|
* @param userId
|
* @return
|
*/
|
private synchronized MyCoupon decideMyCoupon(Integer couponId, Integer userId) {
|
MyCoupon coupon = getById(couponId);
|
Integer count = 0;
|
if(coupon.getType().equals(2)){
|
//获取用户优惠券张数
|
LambdaQueryWrapper<MyUserCouponOrder> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.eq(MyUserCouponOrder::getUserId, userId);
|
queryWrapper.eq(MyUserCouponOrder::getCouponId, coupon.getId());
|
queryWrapper.ne(MyUserCouponOrder::getPayStatus, 3);
|
count = couponOrderService.count(queryWrapper);
|
}else{
|
LambdaQueryWrapper<MyUserCoupon> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.eq(MyUserCoupon::getUserId, userId);
|
queryWrapper.eq(MyUserCoupon::getCouponId, coupon.getId());
|
count = myUserCouponService.count(queryWrapper);
|
}
|
|
if (coupon.getQuota().compareTo(count) <= 0) {
|
throw new IllegalArgumentException("达到领取上限");
|
}
|
if (coupon.getStock().compareTo(0) <= 0) {
|
throw new IllegalArgumentException("优惠券库存不足");
|
}
|
if (!baseMapper.subCouponStock(couponId)) {
|
throw new IllegalArgumentException("优惠券领取失败");
|
}
|
return coupon;
|
}
|
|
@Override
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
public Boolean paySuccess(String orderNo) {
|
MyUserCouponOrder order = new MyUserCouponOrder();
|
order.setPayStatus(2);
|
LambdaQueryWrapper<MyUserCouponOrder> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.eq(MyUserCouponOrder::getOrderNo,orderNo);
|
queryWrapper.eq(MyUserCouponOrder::getPayStatus,1);
|
if(couponOrderService.update(order,queryWrapper)){
|
LambdaQueryWrapper<MyUserCouponOrder> queryWrapper2 = new LambdaQueryWrapper<>();
|
queryWrapper2.eq(MyUserCouponOrder::getOrderNo,orderNo);
|
order = couponOrderService.getOne(queryWrapper2);
|
final MyCoupon coupon = getById(order.getCouponId());
|
MyUserCoupon userCoupon = new MyUserCoupon();
|
userCoupon.setUserId(order.getUserId());
|
userCoupon.setCouponId(coupon.getId());
|
userCoupon.setBeginTime(coupon.getBeginTime());
|
userCoupon.setEndTime(coupon.getEndTime());
|
myUserCouponService.save(userCoupon);
|
}
|
return Boolean.FALSE;
|
}
|
|
@Override
|
public Boolean cancelOrder(String orderNo) {
|
MyUserCouponOrder order = new MyUserCouponOrder();
|
order.setPayStatus(3);
|
LambdaQueryWrapper<MyUserCouponOrder> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.eq(MyUserCouponOrder::getOrderNo,orderNo);
|
queryWrapper.eq(MyUserCouponOrder::getPayStatus,1);
|
if(couponOrderService.update(order,queryWrapper)){
|
LambdaQueryWrapper<MyUserCouponOrder> queryWrapper2 = new LambdaQueryWrapper<>();
|
queryWrapper2.eq(MyUserCouponOrder::getOrderNo,orderNo);
|
order = couponOrderService.getOne(queryWrapper2);
|
return baseMapper.addCouponStock(order.getCouponId());
|
}
|
return Boolean.FALSE;
|
}
|
|
@Override
|
public List<MyCoupon> orderCoupon(Integer userId, Integer goodsId, Integer goodsType, BigDecimal price , String dateTime) {
|
return baseMapper.orderCoupon(userId, goodsId,goodsType,price, dateTime);
|
}
|
|
@Override
|
public boolean updateUseCoupon(Integer userId, Integer couponId, Integer isUse) {
|
return baseMapper.updateUseCoupon(userId, couponId, isUse);
|
}
|
|
}
|