| | |
| | | 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.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; |
| | |
| | | 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<Coupon> couponList = getCouponListByParam(memberCoupon); |
| | | List<Member> memberList = getMemberListByParam(memberCoupon); |
| | | List<MemberCoupon> 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<Coupon> couponList) { |
| | | for(Coupon c : couponList){ |
| | | if(Constants.equalsObject(id,c.getId())){ |
| | | return c; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | |
| | | private List<Member> getMemberListByParam(MemberCouponAddDTO memberCoupon) { |
| | | List<Member> list = memberMapper.selectList(new QueryWrapper<Member>().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<Coupon> getCouponListByParam(MemberCouponAddDTO memberCoupon) { |
| | | List<Integer> 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<Coupon> list = couponMapper.selectList(new QueryWrapper<Coupon>().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(); |
| | |
| | | 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()); |
| | |
| | | IPage<MemberCoupon> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); |
| | | MPJLambdaWrapper<MemberCoupon> 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); |
| | | queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus()); |
| | | 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<MemberCoupon> 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); |
| | | } |
| | | |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public IPage<CouponDTO> memberCouponPage(IPage pages, BigDecimal price, Integer memberId,Integer couponType) { |
| | | IPage<CouponDTO> page = memberCouponMapper.memberCouponPage(pages,new QueryWrapper<CouponDTO>() |
| | | public IPage<MemberCouponResponse> memberCouponPage(IPage pages, BigDecimal price, Integer memberId,Integer couponType,Integer status) { |
| | | IPage<MemberCouponResponse> page = memberCouponMapper.memberCouponPage(pages,new QueryWrapper<MemberCouponResponse>() |
| | | .eq("m.MEMBER_ID",memberId) |
| | | .eq("m.TYPE",Constants.ONE) |
| | | .eq("m.STATUS",Constants.ZERO) |
| | | .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 ") |
| | |
| | | } |
| | | |
| | | |
| | | @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<Labels> labelsList = labelsMapper.selectList(new QueryWrapper<Labels>().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<Goods> labelsList = goodsMapper.selectList(new QueryWrapper<Goods>().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; |
| | | } |
| | | |
| | | |
| | | |
| | |
| | | if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU信息错误,请刷新重试"); |
| | | } |
| | | |
| | | //查询商品列表 |
| | | List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class, |
| | | new MPJLambdaWrapper<Goods>() |
| | |
| | | if(Objects.isNull(goodsList)){ |
| | | return memberCouponList; |
| | | } |
| | | |
| | | //获取选择的商品总金额 与 单个商品金额 |
| | | BigDecimal totalAmount = BigDecimal.ZERO; |
| | | for (Goods goods:goodsList) { |
| | |
| | | memberCouponList = memberCouponList.stream().sorted(Comparator.comparing(MemberCoupon::getValidAmount,Comparator.nullsFirst(BigDecimal::compareTo)).reversed()) |
| | | .collect(Collectors.toList()); |
| | | return memberCouponList; |
| | | } |
| | | |
| | | |
| | | public void couponIsValid(List<PayDetailRequest> 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<GoodsSku> goodsSkuList = goodsSkuMapper.selectList(new QueryWrapper<GoodsSku>() |
| | | .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<Goods> goodsList = goodsMapper.selectJoinList(Goods.class, |
| | | new MPJLambdaWrapper<Goods>() |
| | | .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<PayDetailRequest> 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<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new); |
| | | if(totalAmount.compareTo(memberCoupon.getLimitPrice())<Constants.ZERO){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前商品金额未满足可使用门槛"); |
| | | } |
| | | //适用类型:0=全场;1=品类;2=指定商品 |
| | | if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){ |
| | | memberCoupon.setValidAmount(memberCoupon.getPrice()); |
| | | }else{ |
| | | List<String> 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.ZERO)?response.getId().toString():response.getCategoryId().toString())?true:false); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | // public Set<Integer> isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){ |
| | | // List<OrderGoodsCalculateResponse> resultList = new ArrayList<>(); |
| | | // for (String id:idList) { |