doum
9 小时以前 80fd41ea0dc602ac3ca33778f17fce5bc2e817b1
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -11,6 +11,8 @@
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;
@@ -28,6 +30,7 @@
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;
@@ -64,6 +67,144 @@
    @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();
@@ -88,7 +229,6 @@
        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());
@@ -173,20 +313,41 @@
        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);
    }
@@ -252,7 +413,6 @@
                }
            }
        }
        return memberCouponResponse;
    }
@@ -379,7 +539,6 @@
        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>()
@@ -391,7 +550,6 @@
        if(Objects.isNull(goodsList)){
            return memberCouponList;
        }
        //获取选择的商品总金额 与 单个商品金额
        BigDecimal totalAmount = BigDecimal.ZERO;
        for (Goods goods:goodsList) {
@@ -434,6 +592,68 @@
        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);
            }
        }
    }
@@ -493,6 +713,9 @@
            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) {