package com.doumee.service.business.impl; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.CouponMapper; import com.doumee.dao.business.MemberCouponJoinMapper; import com.doumee.dao.business.MemberCouponMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.model.*; import com.doumee.dao.web.dto.CouponDTO; import com.doumee.dao.web.dto.MemberCouponDTO; import com.doumee.service.business.MemberCouponService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.Objects; /** * 用户优惠券关联表Service实现 * @author 江蹄蹄 * @date 2023/03/21 15:48 */ @Service public class MemberCouponServiceImpl implements MemberCouponService { @Autowired private MemberCouponMapper memberCouponMapper; @Autowired private MemberCouponJoinMapper memberCouponJoinMapper; @Autowired private CouponMapper couponMapper; @Autowired private MemberMapper memberMapper; @Override public Integer create(MemberCoupon memberCoupon) { LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal(); Coupon coupon = couponMapper.selectById(memberCoupon.getCouponId()); if(Objects.isNull(coupon)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "未查询到优惠券信息"); } if(coupon.getStatus().equals(Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "该优惠券已禁用,无法兑换!"); } //查询已兑换数量 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("COUPON_ID",coupon.getId()); Long exchangeNum = memberCouponMapper.selectCount(queryWrapper); if(exchangeNum.compareTo(coupon.getNum()) >= Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "该优惠券已兑换完,无法兑换!"); } //是否已兑换 queryWrapper.eq("MEMBER_ID",coupon.getId()); if(memberCouponMapper.selectCount(queryWrapper) > Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "已兑换该优惠券,无法兑换!"); }; MemberCoupon insert = new MemberCoupon(); Date now = new Date(); insert.setCreator(loginUserInfo.getId()); insert.setCreateDate(now); insert.setEditor(loginUserInfo.getId()); insert.setEditDate(now); insert.setIsdeleted(Constants.ZERO); insert.setRemark(memberCoupon.getRemark()); insert.setMemberId(loginUserInfo.getMemberId()); insert.setShopId(coupon.getShopId()); insert.setType(coupon.getType()); insert.setLimitPrice(coupon.getLimitPrice()); insert.setPrice(coupon.getPrice()); insert.setStartDate(now); //推迟天数 LocalDateTime localDateTime = LocalDateTime.now().minusDays(coupon.getValidDays()); insert.setEndDate(DateUtil.toDate(localDateTime)); insert.setGetMethod(Constants.ONE); insert.setIntegral(coupon.getIntegral()); insert.setStatus(Constants.ZERO); insert.setInfo(coupon.getInfo()); // insert.setBackIntegral(coupon.getB); insert.setName(coupon.getName()); insert.setCouponId(coupon.getId()); memberCouponMapper.insert(insert); return memberCoupon.getId(); } @Override public void deleteById(Integer id) { memberCouponMapper.deleteById(id); } @Override public void delete(MemberCoupon memberCoupon) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(memberCoupon); memberCouponMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } memberCouponMapper.deleteBatchIds(ids); } @Override public void updateById(MemberCoupon memberCoupon) { memberCouponMapper.updateById(memberCoupon); } @Override public void updateByIdInBatch(List memberCoupons) { if (CollectionUtils.isEmpty(memberCoupons)) { return; } for (MemberCoupon memberCoupon: memberCoupons) { this.updateById(memberCoupon); } } @Override public MemberCoupon findById(Integer id) { return memberCouponMapper.selectById(id); } @Override public MemberCoupon findOne(MemberCoupon memberCoupon) { QueryWrapper wrapper = new QueryWrapper<>(memberCoupon); return memberCouponMapper.selectOne(wrapper); } @Override public List findList(MemberCoupon memberCoupon) { QueryWrapper wrapper = new QueryWrapper<>(memberCoupon); return memberCouponMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(MemberCoupon.class); queryWrapper.selectAs(Member::getNickname,MemberCoupon::getNikeName); queryWrapper.leftJoin(Member.class,Member::getId,MemberCoupon::getMemberId); queryWrapper.eq(MemberCoupon::getIsdeleted, Constants.ZERO); queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus()); queryWrapper.eq(pageWrap.getModel().getGetMethod()!=null,MemberCoupon::getGetMethod, pageWrap.getModel().getGetMethod()); queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNikeName()),ms -> ms.like( Member::getNickname, pageWrap.getModel().getNikeName()). or().eq( Member::getName, pageWrap.getModel().getNikeName()). or().eq( Member::getPhone, pageWrap.getModel().getNikeName())); queryWrapper.orderByDesc(MemberCoupon::getCreateDate); IPage result = memberCouponJoinMapper.selectJoinPage(page, MemberCoupon.class, queryWrapper); return PageData.from(result); } @Override public long count(MemberCoupon memberCoupon) { QueryWrapper wrapper = new QueryWrapper<>(memberCoupon); return memberCouponMapper.selectCount(wrapper); } /****************************************移动端接口开始********************************************************************/ /** * 优惠券列表 * @param pages * @param price * @param memberId * @param couponType * @return */ @Override public IPage memberCouponPage(IPage pages, BigDecimal price, Integer memberId,Integer couponType) { IPage page = memberCouponMapper.memberCouponPage(pages,new QueryWrapper() .eq("m.MEMBER_ID",memberId) .eq("m.TYPE",Constants.ONE) .eq("m.STATUS",Constants.ZERO) .eq("TYPE",couponType) .apply(!Objects.isNull(price)," m.LIMIT_PRICE >= "+price+" ") .apply(" now() between m.START_DATE and m.END_DATE ") .orderByDesc(" m.PRICE ") ); return page; } /** * 优惠券数量 * @param price * @param memberId * @param couponType * @return */ @Override public long memberCouponNum( BigDecimal price, Integer memberId,Integer couponType) { long count = memberCouponMapper.selectCount(new QueryWrapper() .eq("MEMBER_ID",memberId) .eq("TYPE",Constants.ONE) .eq("STATUS",Constants.ZERO) .eq("TYPE",couponType) .apply("LIMIT_PRICE >= "+price+" ") .apply(" now() between START_DATE and END_DATE ") .orderByDesc(" PRICE ") ); return count; } @Override public PageData findMemberCouponDTO(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAs(MemberCoupon::getId,MemberCouponDTO::getId); queryWrapper.selectAs(Member::getId,MemberCouponDTO::getMemberId); queryWrapper.selectAs(Member::getImgurl,MemberCouponDTO::getImgurl); queryWrapper.selectAs(MemberCoupon::getShopId,MemberCouponDTO::getShopId); queryWrapper.selectAs(MemberCoupon::getType,MemberCouponDTO::getType); queryWrapper.selectAs(MemberCoupon::getLimitPrice,MemberCouponDTO::getLimitPrice); queryWrapper.selectAs(MemberCoupon::getPrice,MemberCouponDTO::getPrice); queryWrapper.selectAs(MemberCoupon::getStartDate,MemberCouponDTO::getStartDate); queryWrapper.selectAs(MemberCoupon::getEndDate,MemberCouponDTO::getEndDate); queryWrapper.selectAs(MemberCoupon::getUseDate,MemberCouponDTO::getUseDate); queryWrapper.selectAs(MemberCoupon::getStatus,MemberCouponDTO::getStatus); queryWrapper.leftJoin(MemberCoupon.class,MemberCoupon::getMemberId,Member::getId); queryWrapper.eq(MemberCoupon::getCouponId,pageWrap.getModel().getCouponId()) .like(StringUtils.isNotBlank(pageWrap.getModel().getNikeName()),Member::getNickname,pageWrap.getModel().getNikeName()) .eq(MemberCoupon::getStatus,pageWrap.getModel().getStatus()); IPage result = memberCouponJoinMapper.selectJoinPage(page, MemberCouponDTO.class, queryWrapper); if (CollectionUtils.isEmpty(result.getRecords())){ return PageData.from(new Page<>()); } result.getRecords().stream().filter(s->Constants.equalsInteger(Constants.ZERO,s.getStatus())) .forEach(s->{ s.setStatus(s.getEndDate().before(new Date()) ? -1 : 0); }); return PageData.from(result); } public void exchangeCoupon(Integer couponId, Integer memberId){ Coupon coupon = couponMapper.selectById(couponId); if(Objects.isNull(coupon)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "未查询到优惠券信息"); } if(!coupon.getType().equals(Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "非平台优惠券,无法兑换!"); } if(coupon.getStatus().equals(Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "该优惠券已禁用,无法兑换!"); } //查询已兑换数量 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("COUPON_ID",couponId); Long exchangeNum = memberCouponMapper.selectCount(queryWrapper); if(exchangeNum.compareTo(coupon.getNum())>=Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "该优惠券已兑换完,无法兑换!"); } //是否已兑换 queryWrapper.eq("MEMBER_ID",memberId); if(memberCouponMapper.selectCount(queryWrapper)>Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "已兑换该优惠券,无法兑换!"); }; //查询剩余咖豆是否足够购买 Member member = memberMapper.selectById(memberId); if(member.getIntegral().compareTo(coupon.getIntegral())