| | |
| | | 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.CouponNoticeRequest; |
| | | import com.doumee.dao.web.request.PayDetailRequest; |
| | | import com.doumee.dao.web.response.MemberCouponResponse; |
| | | import com.doumee.dao.web.response.goods.OrderGoodsCalculateResponse; |
| | |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.shiro.SecurityUtils; |
| | | import org.checkerframework.checker.units.qual.A; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @Autowired |
| | | private MemberMapper memberMapper; |
| | | |
| | | @Autowired |
| | | private NoticeMapper noticeMapper; |
| | | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = {BusinessException.class,Exception.class}) |
| | | public String addBatch(MemberCouponAddDTO memberCoupon){ |
| | | checkAddBatchParamValid(memberCoupon); |
| | | public String addBatch(MemberCouponAddDTO memberCouponAddDTO){ |
| | | checkAddBatchParamValid(memberCouponAddDTO); |
| | | |
| | | List<Coupon> couponList = getCouponListByParam(memberCoupon); |
| | | List<Member> memberList = getMemberListByParam(memberCoupon); |
| | | List<Coupon> couponList = getCouponListByParam(memberCouponAddDTO); |
| | | List<Member> memberList = getMemberListByParam(memberCouponAddDTO); |
| | | List<MemberCoupon> addList = new ArrayList<>(); |
| | | int index =1; |
| | | LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal(); |
| | | Date now = new Date(); |
| | | for(Coupon param : memberCoupon.getAddCouponList()){ |
| | | for(Coupon param : memberCouponAddDTO.getAddCouponList()){ |
| | | Coupon coupon = getCouponFromListById(param.getId(),couponList); |
| | | if(coupon == null){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+index+"】个优惠券查询无效,请刷新页面重新!"); |
| | | } |
| | | for(Member member : memberList){ |
| | | MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo); |
| | | for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) { |
| | | //满减卷不会生成maxPrice 需要根据优惠券减少金额设置 |
| | | if(Constants.equalsInteger(coupon.getCouponType(),Constants.ZERO)){ |
| | | memberCoupon.setMaxPrice(coupon.getPrice()); |
| | | } |
| | | //挨个送 |
| | | addList.add(MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo)); |
| | | addList.add(memberCoupon); |
| | | } |
| | | //优惠券发放通知 |
| | | Notice notice = Notice.getNotice(Constants.NoticeType.COUPON, |
| | | member.getId(),null); |
| | | notice.setContent(notice.getContent().replace("{param}",Constants.getCouponInfo(memberCoupon, (int) Constants.formatLongNum(param.getNum())))); |
| | | noticeMapper.insert(notice); |
| | | } |
| | | index++; |
| | | } |
| | |
| | | memberCouponMapper.insert(addList); |
| | | } |
| | | return "操作成功,成功人员数量:"+memberList.size()+",共发放优惠券数量:"+addList.size(); |
| | | |
| | | } |
| | | /* |
| | | |
| | |
| | | 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()); |
| | | if(Constants.equalsInteger(pageWrap.getModel().getStatus(),0)&&pageWrap.getModel().getIsexpire()!=null && pageWrap.getModel().getIsexpire()== 0){ |
| | | queryWrapper.gt( MemberCoupon::getEndDate, new Date()); |
| | | } else if (Constants.equalsInteger(pageWrap.getModel().getStatus(),0)&&pageWrap.getModel().getIsexpire()!=null && pageWrap.getModel().getIsexpire()== 1) { |
| | | queryWrapper.le( MemberCoupon::getEndDate, new Date()); |
| | | } |
| | | queryWrapper.in(pageWrap.getModel().getMethodList()!=null,MemberCoupon::getGetMethod, pageWrap.getModel().getMethodList()); |
| | | queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus()); |
| | | queryWrapper.eq(pageWrap.getModel().getCouponType()!=null,MemberCoupon::getCouponType, pageWrap.getModel().getCouponType()); |
| | | queryWrapper.eq(pageWrap.getModel().getCouponId()!=null,MemberCoupon::getCouponId, pageWrap.getModel().getCouponId()); |
| | | queryWrapper.like(pageWrap.getModel().getName()!=null,MemberCoupon::getName, pageWrap.getModel().getName()); |
| | | 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()). |
| | |
| | | && model.getEndDate()!=null |
| | | && model.getEndDate().before(new Date())){ |
| | | //已过期 |
| | | model.setStatus(Constants.TWO); |
| | | model.setIsexpire(Constants.ONE); |
| | | }else if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)){ |
| | | model.setIsexpire(Constants.ZERO); |
| | | } |
| | | } |
| | | } |
| | |
| | | memberCoupon.setBackIntegral(BigDecimal.ZERO); |
| | | memberCoupon.setName(coupon.getName()); |
| | | memberCouponMapper.insert(memberCoupon); |
| | | //TODO 添加积分变动记录 |
| | | |
| | | //更新用户积分 |
| | | memberMapper.subtractIntegral(memberId,memberCoupon.getIntegral()); |
| | | } |
| | | |
| | | |
| | |
| | | .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信息错误,请刷新重试"); |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU信息已失效,请刷新重试"); |
| | | } |
| | | //查询商品列表 |
| | | List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class, |
| | |
| | | List<MemberCoupon> allCoupon = memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda() |
| | | .eq(MemberCoupon::getIsdeleted,Constants.ZERO) |
| | | .eq(MemberCoupon::getStatus,Constants.ZERO) |
| | | .eq(MemberCoupon::getMemberId,memberId) |
| | | .apply(" LIMIT_PRICE <= " + totalAmount) |
| | | .apply(" now() between START_DATE and END_DATE ")); |
| | | .apply(" now() between START_DATE and END_DATE ") |
| | | .orderByDesc(MemberCoupon::getMaxPrice) |
| | | .orderByAsc(MemberCoupon::getEndDate) |
| | | ) |
| | | ; |
| | | |
| | | if(CollectionUtils.isNotEmpty(allCoupon)){ |
| | | for (MemberCoupon memberCoupon:allCoupon) { |
| | | //适用类型:0=全场;1=品类;2=指定商品 |
| | | if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){ |
| | | memberCoupon.setValidAmount(memberCoupon.getPrice()); |
| | | memberCouponList.add(memberCoupon); |
| | | }else{ |
| | | List<String> applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(",")); |
| | | //获取有效可以使用优惠券的数据 |
| | | isVaildUse(applyIdList,goodsCalculateList, |
| | | Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO); |
| | | isVaildUse(applyIdList,goodsCalculateList,memberCoupon.getApplyType()); |
| | | BigDecimal skuAmount = goodsCalculateList.stream().filter(i->i.getUseCoupon()).map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); |
| | | if(skuAmount.compareTo(memberCoupon.getLimitPrice())>=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信息错误,请刷新重试"); |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU信息已失效,请刷新重试"); |
| | | } |
| | | //查询商品列表 |
| | | List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class, |
| | |
| | | //根据优惠券类型 计算可以使用优惠券的商品信息 适用类型:0=全场;1=品类;2=指定商品 |
| | | if(!Constants.equalsInteger(coupon.getApplyType(),Constants.ZERO)){ |
| | | List<String> applyIdList = Arrays.asList(coupon.getApplyIds().split(",")); |
| | | isVaildUse(applyIdList,goodsCalculateList, |
| | | Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO); |
| | | isVaildUse(applyIdList,goodsCalculateList,coupon.getApplyType()); |
| | | //Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO); |
| | | }else{ |
| | | isVaildUse(null,goodsCalculateList,coupon.getApplyType()); |
| | | } |
| | | //使用了优惠券的商品数量 |
| | | Integer countCouponNum = goodsCalculateList.stream().filter(i->i.getUseCoupon()).collect(Collectors.toList()).size(); |
| | |
| | | * 判断是否可以有效使用 |
| | | * @param idList |
| | | * @param goodsList |
| | | * @param vaildType 0=商品;1=品类 |
| | | * @param vaildType 0=全场;1=品类;2=指定商品 |
| | | * @return |
| | | */ |
| | | public void isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){ |
| | | for (OrderGoodsCalculateResponse response:goodsList) { |
| | | response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.ZERO)?response.getId().toString():response.getCategoryId().toString())?true:false); |
| | | if(Constants.equalsInteger(vaildType,Constants.ZERO)){ |
| | | for (OrderGoodsCalculateResponse response:goodsList) { |
| | | response.setUseCoupon(true); |
| | | } |
| | | }else{ |
| | | for (OrderGoodsCalculateResponse response:goodsList) { |
| | | response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.TWO)?response.getId().toString():response.getCategoryId().toString())?true:false); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | // } |
| | | // return new HashSet<>(); |
| | | // } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = {Exception.class}) |
| | | public void notifyExpiredCoupon(Integer days) { |
| | | if (days == null || days <= 0) { |
| | | days = 3; // 默认提前 3 天通知 |
| | | } |
| | | String afterDate = DateUtil.afterDateToStr(days); |
| | | // 查询即将过期的优惠券(未使用且在目标日期范围内过期) |
| | | List<MemberCoupon> expiredCoupons = memberCouponMapper.selectList( |
| | | new QueryWrapper<MemberCoupon>().lambda() |
| | | .eq(MemberCoupon::getIsdeleted, Constants.ZERO) |
| | | .eq(MemberCoupon::getStatus, Constants.ZERO) // 未使用 |
| | | .eq(MemberCoupon::getNoticeStatus,Constants.ZERO)// 未通知数据 |
| | | .ge(MemberCoupon::getEndDate, DateUtil.getCurrDateTime()) // 大于等于开始时间 |
| | | .lt(MemberCoupon::getEndDate, (afterDate+" 23:59:59") ) // 小于结束时间 |
| | | ); |
| | | if (CollectionUtils.isEmpty(expiredCoupons)) { |
| | | return; |
| | | } |
| | | // 按用户分组统计 |
| | | Map<Integer, List<MemberCoupon>> memberCouponMap = expiredCoupons.stream() |
| | | .collect(Collectors.groupingBy(MemberCoupon::getMemberId)); |
| | | |
| | | // 遍历每个用户的优惠券发送通知 |
| | | for (Map.Entry<Integer, List<MemberCoupon>> entry : memberCouponMap.entrySet()) { |
| | | Integer memberId = entry.getKey(); |
| | | List<MemberCoupon> coupons = entry.getValue(); |
| | | if (CollectionUtils.isEmpty(coupons)) { |
| | | continue; |
| | | } |
| | | // 查询用户信息 |
| | | Member member = memberMapper.selectById(memberId); |
| | | if (member == null || member.getIsdeleted() == Constants.ONE) { |
| | | continue; |
| | | } |
| | | // 统计优惠券数量和类型 |
| | | long count = coupons.size(); |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | List<Integer> couponIds = coupons.stream().map(MemberCoupon::getId).collect(Collectors.toList()); |
| | | //发送站内信 优惠券即将过期 |
| | | Notice notice = Notice.getNotice( |
| | | Constants.NoticeType.EXPIRE_COUPON, |
| | | member.getId(), |
| | | null |
| | | ); |
| | | notice.setContent(notice.getContent().replace("{param}",Long.toString(count)).replace("{param1}",afterDate)); |
| | | noticeMapper.insert(notice); |
| | | memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda() |
| | | .set(MemberCoupon::getNoticeStatus,Constants.ONE) |
| | | .set(MemberCoupon::getNoticeTime,DateUtil.getCurrDateTime()) |
| | | .in(MemberCoupon::getId,couponIds) |
| | | ); |
| | | } |
| | | } |
| | | |
| | | } |