MrShi
9 小时以前 777bcb6c5660c0ed14d85207377b62b779d81dde
server/services/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -11,7 +11,9 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CouponMapper;
import com.doumee.dao.business.MemberCouponMapper;
import com.doumee.dao.business.model.Coupon;
import com.doumee.dao.business.model.MemberCoupon;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.MemberCouponService;
@@ -22,6 +24,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -31,6 +34,8 @@
    @Autowired
    private MemberCouponMapper memberCouponMapper;
    @Autowired
    private CouponMapper couponMapper;
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
@@ -146,4 +151,79 @@
        QueryWrapper<MemberCoupon> wrapper = new QueryWrapper<>(memberCoupon);
        return memberCouponMapper.selectCount(wrapper);
    }
    @Override
    public PageData<MemberCoupon> findMemberPage(Integer memberId, Integer status, PageWrap<MemberCoupon> pageWrap) {
        IPage<MemberCoupon> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<MemberCoupon> qw = new MPJLambdaWrapper<>();
        qw.selectAll(MemberCoupon.class)
                .eq(MemberCoupon::getMemberId, memberId)
                .eq(MemberCoupon::getIsdeleted, Constants.ZERO);
        if (status != null) {
            if (status == Constants.CouponStatus.expired.getKey()) {
                // 已失效包含两种:98=未领取已过期, 99=已过期
                qw.in(MemberCoupon::getStatus,
                        Constants.CouponStatus.expiredUnclaimed.getKey(),
                        Constants.CouponStatus.expired.getKey());
            } else {
                qw.eq(MemberCoupon::getStatus, status);
            }
        }
        // 按状态排序
        if (status != null) {
            switch (status) {
                case 0: // 待领取 → 创建时间倒序
                case 98: // 已失效(查询时包含了98和99)
                case 99:
                    qw.orderByDesc(MemberCoupon::getCreateDate);
                    break;
                case 1: // 待使用 → 领取时间倒序
                    qw.orderByDesc(MemberCoupon::getValidDate);
                    break;
                case 2: // 已使用 → 使用时间倒序
                    qw.orderByDesc(MemberCoupon::getUseDate);
                    break;
                default:
                    qw.orderByDesc(MemberCoupon::getId);
                    break;
            }
        } else {
            qw.orderByDesc(MemberCoupon::getId);
        }
        return PageData.from(memberCouponMapper.selectJoinPage(page, MemberCoupon.class, qw));
    }
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public void claimCoupon(Integer memberId, Integer couponId) {
        // 查询该会员的待领取优惠券记录
        MemberCoupon mc = memberCouponMapper.selectOne(new QueryWrapper<MemberCoupon>().lambda()
                .eq(MemberCoupon::getId, couponId)
                .eq(MemberCoupon::getMemberId, memberId)
                .eq(MemberCoupon::getStatus, Constants.CouponStatus.waitClaim.getKey())
                .eq(MemberCoupon::getIsdeleted, Constants.ZERO));
        if (mc == null) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        // 校验优惠券是否有效
        Coupon coupon = couponMapper.selectById(couponId);
        if (coupon == null || coupon.getStatus() != Constants.ZERO) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "优惠券无效");
        }
        // 标记已领取,计算有效期
        Date now = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(now);
        cal.add(Calendar.DAY_OF_MONTH, mc.getValidDays() != null ? mc.getValidDays() : 0);
        memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
                .set(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey())
                .set(MemberCoupon::getValidDate, now)
                .set(MemberCoupon::getStartDate, now)
                .set(MemberCoupon::getEndDate, cal.getTime())
                .set(MemberCoupon::getEditDate, now)
                .eq(MemberCoupon::getId, mc.getId()));
    }
}