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.ListUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.*; import com.doumee.dao.business.model.*; import com.doumee.dao.system.dto.MemberCouponAddDTO; import com.doumee.dao.system.model.SystemUser; import com.doumee.dao.web.dto.CouponDTO; import com.doumee.dao.web.dto.MemberCouponDTO; import com.doumee.dao.web.request.PayDetailRequest; import com.doumee.dao.web.response.MemberCouponResponse; import com.doumee.dao.web.response.goods.OrderGoodsCalculateResponse; 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.xiaoymin.knife4j.core.util.CollectionUtils; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; /** * 用户优惠券关联表Service实现 * @author 江蹄蹄 * @date 2023/03/21 15:48 */ @Service public class MemberCouponServiceImpl implements MemberCouponService { @Autowired private MemberCouponMapper memberCouponMapper; @Autowired private GoodsMapper goodsMapper; @Autowired private GoodsSkuMapper goodsSkuMapper; @Autowired private MemberCouponJoinMapper memberCouponJoinMapper; @Autowired private LabelsMapper labelsMapper; @Autowired private CouponMapper couponMapper; @Autowired private MemberMapper memberMapper; @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public String addBatch(MemberCouponAddDTO memberCoupon){ checkAddBatchParamValid(memberCoupon); List couponList = getCouponListByParam(memberCoupon); List memberList = getMemberListByParam(memberCoupon); List addList = new ArrayList<>(); int index =1; LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal(); Date now = new Date(); for(Coupon param : memberCoupon.getAddCouponList()){ Coupon coupon = getCouponFromListById(param.getId(),couponList); if(coupon == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+index+"】个优惠券查询无效,请刷新页面重新!"); } for(Member member : memberList){ for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) { //挨个送 addList.add(initMemberCouponByParam(coupon,member,loginUserInfo,now)); } } index++; } if(addList.size()>0){ //批量插入数据 memberCouponMapper.insert(addList); } return "操作成功,成功人员数量:"+memberList.size()+",共发放优惠券数量:"+addList.size(); } private MemberCoupon initMemberCouponByParam(Coupon coupon, Member member, LoginUserInfo loginUserInfo ,Date now) { MemberCoupon insert = new MemberCoupon(); insert.setCreator(loginUserInfo.getId()); insert.setCreateDate(now); insert.setEditor(loginUserInfo.getId()); insert.setEditDate(now); insert.setIsdeleted(Constants.ZERO); insert.setRemark("定向发放"); insert.setMemberId(member.getId()); insert.setShopId(coupon.getShopId()); insert.setType(coupon.getType()); insert.setCouponType(coupon.getType()); insert.setLimitPrice(coupon.getLimitPrice()); insert.setPrice(coupon.getPrice()); if(Constants.equalsObject(coupon.getUseType(),Constants.ZERO)){ //如果是固定时段 insert.setStartDate(coupon.getStartDate()); insert.setEndDate(coupon.getEndDate()); }else{ //固定时长 //推迟天数 insert.setEndDate(DateUtil.addDaysToDate(now,Constants.formatIntegerNum(coupon.getValidDays()))); insert.setStartDate(now); } insert.setGetMethod(Constants.TWO);//定向发放 insert.setIntegral(coupon.getIntegral()); insert.setStatus(Constants.ZERO);//未使用 insert.setInfo(coupon.getInfo()); // insert.setBackIntegral(coupon.getB); insert.setName(coupon.getName()); insert.setApplyIds(coupon.getApplyIds()); insert.setApplyType(coupon.getApplyType()); insert.setCouponId(coupon.getId()); return insert; } private Coupon getCouponFromListById(Integer id, List couponList) { for(Coupon c : couponList){ if(Constants.equalsObject(id,c.getId())){ return c; } } return null; } private List getMemberListByParam(MemberCouponAddDTO memberCoupon) { List list = memberMapper.selectList(new QueryWrapper().lambda() .eq(Member::getIsdeleted,Constants.ZERO) .eq(memberCoupon.getAddType() == Constants.ZERO,Member::getId,memberCoupon.getAddMemberIds()) .in(memberCoupon.getAddType() == Constants.ONE,Member::getPhone,memberCoupon.getPhones())); if(list == null || list.size()==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,未查询到有效的用户信息!"); } return list; } private List getCouponListByParam(MemberCouponAddDTO memberCoupon) { List ids = new ArrayList<>(); for(Coupon coupon : memberCoupon.getAddCouponList()){ if(coupon.getId() ==null || Constants.formatLongNum(coupon.getNum())==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } ids.add(coupon.getId()); } List list = couponMapper.selectList(new QueryWrapper().lambda() .eq(Coupon::getStatus,Constants.ZERO) .eq(Coupon::getIsdeleted,Constants.ZERO) .in(Coupon::getId,ids)); if(list == null || list.size()==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,未查询到有效优惠券数据,请刷新页面重试!"); } return list; } private void checkAddBatchParamValid(MemberCouponAddDTO memberCoupon) { if(memberCoupon.getAddType() == null || memberCoupon.getAddCouponList()==null || memberCoupon.getAddCouponList().size()==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } if(Constants.equalsObject(memberCoupon.getAddType(),Constants.ZERO)){ //指定人员 if( memberCoupon.getAddMemberIds() ==null){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } }else if(Constants.equalsObject(memberCoupon.getAddType(),Constants.ONE)){ //指定手机号 if( StringUtils.isBlank(memberCoupon.getAddMemberPhones())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } String[] ss =memberCoupon.getAddMemberPhones().replace(" ","").split("\n"); if(ss == null ||ss.length==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } memberCoupon.setPhones(Arrays.asList(ss)); }else if(Constants.equalsObject(memberCoupon.getAddType(),Constants.TWO)){ //全部会员 }else{ throw new BusinessException(ResponseStatus.BAD_REQUEST); } } @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::getPhone,MemberCoupon::getMemberPhone); queryWrapper.selectAs(Member::getNickname,MemberCoupon::getNikeName); queryWrapper.selectAs(Goodsorder::getCode,MemberCoupon::getOrderCode); queryWrapper.selectAs(Goodsorder::getCouponPrice,MemberCoupon::getCouponPrice);//优惠金额 queryWrapper.selectAs(SystemUser::getUsername,MemberCoupon::getCreatorName); queryWrapper.leftJoin(Member.class,Member::getId,MemberCoupon::getMemberId); queryWrapper.leftJoin(Goodsorder.class,Goodsorder::getId,MemberCoupon::getOrderId); queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,MemberCoupon::getCreator); queryWrapper.eq(MemberCoupon::getIsdeleted, Constants.ZERO); if(pageWrap.getModel().getStatus()!=null && pageWrap.getModel().getStatus()!=2){ queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus()); } else if (pageWrap.getModel().getStatus()!=null && pageWrap.getModel().getStatus()==2) { //查询已过期(未使用,切已过了使用期限) queryWrapper.eq( MemberCoupon::getStatus, Constants.ZERO); queryWrapper.lt( MemberCoupon::getEndDate, new Date()); } queryWrapper.eq(pageWrap.getModel().getOrderCode()!=null,Goodsorder::getCode, pageWrap.getModel().getOrderCode()); 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); if(result!=null && result.getRecords()!=null){ for(MemberCoupon model :result.getRecords()){ model.setNikeName(StringUtils.defaultString(model.getNikeName(),"")+" "+StringUtils.defaultString(model.getMemberPhone(),"")); if(Constants.equalsInteger(model.getStatus(),Constants.ZERO) && model.getEndDate()!=null && model.getEndDate().before(new Date())){ //已过期 model.setStatus(Constants.TWO); } } } 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,Integer status) { IPage page = memberCouponMapper.memberCouponPage(pages,new QueryWrapper() .eq("m.MEMBER_ID",memberId) .eq("m.TYPE",Constants.ONE) .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.ZERO),"m.STATUS = 0 and m.END_DATE >= now()" ) .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.ONE),"m.STATUS = 1" ) .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.TWO),"m.STATUS = 0 and m.END_DATE < now() " ) .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; } @Override public MemberCouponResponse getMemberCouponDetail(Integer id){ MemberCoupon memberCoupon = memberCouponJoinMapper.selectById(id); if(Objects.isNull(memberCoupon)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } MemberCouponResponse memberCouponResponse = new MemberCouponResponse(); BeanUtils.copyProperties(memberCoupon,memberCouponResponse); if(StringUtils.isNotBlank(memberCouponResponse.getApplyIds())){ if(Constants.equalsInteger(memberCouponResponse.getApplyType(),Constants.ONE)){ List labelsList = labelsMapper.selectList(new QueryWrapper().lambda() .eq(Labels::getIsdeleted,Constants.ZERO) .eq(Labels::getType,Constants.LabelsType.GOODSTYPE.getKey()) .apply(" find_in_set( id , '"+memberCouponResponse.getApplyIds()+"' ) ") ); if(CollectionUtils.isNotEmpty(labelsList)){ memberCouponResponse.setRelationInfoList(labelsList.stream().map(i->i.getName()).collect(Collectors.toList())); } }else if(Constants.equalsInteger(memberCouponResponse.getApplyType(),Constants.TWO)){ List labelsList = goodsMapper.selectList(new QueryWrapper().lambda() .eq(Goods::getIsdeleted,Constants.ZERO) .apply(" find_in_set( id , '"+memberCouponResponse.getApplyIds()+"' ) ") ); if(CollectionUtils.isNotEmpty(labelsList)){ memberCouponResponse.setRelationInfoList(labelsList.stream().map(i->i.getName()).collect(Collectors.toList())); } } } return memberCouponResponse; } /** * 优惠券数量 * @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("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()) getApplyCoupon(List requestList,Integer memberId){ List memberCouponList = new ArrayList<>(); List goodsSkuList = goodsSkuMapper.selectList(new QueryWrapper() .lambda() .eq(GoodsSku::getIsdeleted,Constants.ZERO) .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList())) ); if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU信息错误,请刷新重试"); } //查询商品列表 List goodsList = goodsMapper.selectJoinList(Goods.class, new MPJLambdaWrapper() .selectAs(GoodsSku::getPrice,Goods::getSkuPrice) .selectAs(GoodsSku::getId,Goods::getSkuId) .leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId) .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))); if(Objects.isNull(goodsList)){ return memberCouponList; } //获取选择的商品总金额 与 单个商品金额 BigDecimal totalAmount = BigDecimal.ZERO; for (Goods goods:goodsList) { List request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), goods.getSkuId())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(request)){ goods.setSkuAmount(goods.getSkuPrice().multiply(new BigDecimal(request.get(Constants.ZERO).getGoodsNum()+""))); totalAmount = totalAmount.add(goods.getSkuAmount()); } } List goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new); //获取所有满足金额且可用的优惠券 List allCoupon = memberCouponMapper.selectList(new QueryWrapper().lambda() .eq(MemberCoupon::getIsdeleted,Constants.ZERO) .eq(MemberCoupon::getStatus,Constants.ZERO) .apply(" LIMIT_PRICE <= " + totalAmount) .apply(" now() between START_DATE and END_DATE ")); if(CollectionUtils.isNotEmpty(allCoupon)){ for (MemberCoupon memberCoupon:allCoupon) { //适用类型:0=全场;1=品类;2=指定商品 if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){ memberCoupon.setValidAmount(memberCoupon.getPrice()); }else{ List applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(",")); //获取有效可以使用优惠券的数据 isVaildUse(applyIdList,goodsCalculateList, Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO); BigDecimal skuAmount = goodsCalculateList.stream().filter(i->i.getUseCoupon()).map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); if(skuAmount.compareTo(memberCoupon.getLimitPrice())>=Constants.ZERO){ //根据金额计算实际折扣金额 BigDecimal couponPrice = skuAmount.multiply(memberCoupon.getPrice()).divide(new BigDecimal("100"),2, RoundingMode.HALF_UP); //折扣金额大于最大可折扣金额 则使用最大可折扣金额 memberCoupon.setValidAmount(couponPrice.compareTo(memberCoupon.getMaxPrice())>Constants.ZERO?memberCoupon.getMaxPrice():couponPrice); memberCouponList.add(memberCoupon); } } } } // 使用 Stream 排序 reversed() 表示倒序 memberCouponList = memberCouponList.stream().sorted(Comparator.comparing(MemberCoupon::getValidAmount,Comparator.nullsFirst(BigDecimal::compareTo)).reversed()) .collect(Collectors.toList()); return memberCouponList; } public void couponIsValid(List requestList,MemberCoupon memberCoupon){ if(Objects.isNull(memberCoupon) || Constants.equalsInteger(memberCoupon.getStatus(),Constants.ONE) ){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"优惠券信息无效或已被使用"); } if(memberCoupon.getStartDate().getTime() > System.currentTimeMillis()){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"优惠券未生效"); } if(memberCoupon.getEndDate().getTime() < System.currentTimeMillis()){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"优惠券已过期"); } List goodsSkuList = goodsSkuMapper.selectList(new QueryWrapper() .lambda() .eq(GoodsSku::getIsdeleted,Constants.ZERO) .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList())) ); if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU信息错误,请刷新重试"); } //查询商品列表 List goodsList = goodsMapper.selectJoinList(Goods.class, new MPJLambdaWrapper() .selectAs(GoodsSku::getPrice,Goods::getSkuPrice) .selectAs(GoodsSku::getId,Goods::getSkuId) .leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId) .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))); if(Objects.isNull(goodsList)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU商品信息错误,请刷新重试"); } //获取选择的商品总金额 与 单个商品金额 BigDecimal totalAmount = BigDecimal.ZERO; for (Goods goods:goodsList) { List request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), goods.getSkuId())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(request)){ goods.setSkuAmount(goods.getSkuPrice().multiply(new BigDecimal(request.get(Constants.ZERO).getGoodsNum()+""))); totalAmount = totalAmount.add(goods.getSkuAmount()); } } List goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new); if(totalAmount.compareTo(memberCoupon.getLimitPrice()) applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(",")); //获取有效可以使用优惠券的数据 isVaildUse(applyIdList,goodsCalculateList, Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO); BigDecimal skuAmount = goodsCalculateList.stream().filter(i->i.getUseCoupon()).map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); if(skuAmount.compareTo(memberCoupon.getLimitPrice())>=Constants.ZERO){ //根据金额计算实际折扣金额 BigDecimal couponPrice = skuAmount.multiply(memberCoupon.getPrice()).divide(new BigDecimal("100"),2, RoundingMode.HALF_UP); //折扣金额大于最大可折扣金额 则使用最大可折扣金额 memberCoupon.setValidAmount(couponPrice.compareTo(memberCoupon.getMaxPrice())>Constants.ZERO?memberCoupon.getMaxPrice():couponPrice); } } } /** * 计算当前已选择优惠券每个商品占比金额 * @param coupon 优惠券信息 * @param goodsCalculateList 商品集合 * @param totalAmount 订单总金额 */ public void calculateCouponRata(MemberCoupon coupon,List goodsCalculateList,BigDecimal totalAmount){ //总余额 BigDecimal validAmount = coupon.getValidAmount(); //剩余可分配金额 BigDecimal surplusValidAmount = validAmount; //已用占比比例值 BigDecimal rata = BigDecimal.ZERO; //根据优惠券类型 计算可以使用优惠券的商品信息 适用类型:0=全场;1=品类;2=指定商品 if(!Constants.equalsInteger(coupon.getApplyType(),Constants.ZERO)){ List applyIdList = Arrays.asList(coupon.getApplyIds().split(",")); isVaildUse(applyIdList,goodsCalculateList, Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO); } //使用了优惠券的商品数量 Integer countCouponNum = goodsCalculateList.stream().filter(i->i.getUseCoupon()).collect(Collectors.toList()).size(); Integer useCouponNum = Constants.ZERO; for (int i = 0; i < goodsCalculateList.size(); i++) { if(!goodsCalculateList.get(i).getUseCoupon()){ goodsCalculateList.get(i).setCouponDeductCash(BigDecimal.ZERO); continue; } if(Constants.equalsInteger(useCouponNum+1,countCouponNum)){ goodsCalculateList.get(i).setOrderCouponRata(new BigDecimal("1").subtract(rata)); goodsCalculateList.get(i).setCouponDeductCash(surplusValidAmount); break; } goodsCalculateList.get(i).setOrderCouponRata(goodsCalculateList.get(i).getSkuAmount().divide(totalAmount,2,BigDecimal.ROUND_DOWN)); goodsCalculateList.get(i).setCouponDeductCash(validAmount.multiply(goodsCalculateList.get(i).getOrderCouponRata())); surplusValidAmount = surplusValidAmount.subtract(goodsCalculateList.get(i).getCouponDeductCash()); rata = rata.add(goodsCalculateList.get(i).getOrderCouponRata()); useCouponNum = useCouponNum + 1; } } /** * 判断是否可以有效使用 * @param idList * @param goodsList * @param vaildType 0=商品;1=品类 * @return */ public void isVaildUse(List idList,List goodsList,Integer vaildType){ for (OrderGoodsCalculateResponse response:goodsList) { response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.ZERO)?response.getId().toString():response.getCategoryId().toString())?true:false); } } // public Set isVaildUse(List idList,List goodsList,Integer vaildType){ // List resultList = new ArrayList<>(); // for (String id:idList) { // if(Constants.equalsInteger(vaildType,Constants.ZERO)){ // resultList.addAll(goodsList.stream().filter(i->i.getId().toString().equals(id)).collect(Collectors.toList())); // }else{ // resultList.addAll(goodsList.stream().filter(i->i.getCategoryId().toString().equals(id)).collect(Collectors.toList())); // } // } // if(CollectionUtils.isNotEmpty(resultList)){ // return new HashSet<>(resultList.stream().map(i->i.getId()).collect(Collectors.toList())); // } // return new HashSet<>(); // } }