rk
2 天以前 8213407057de7bc80e9884f102347a1d1a352546
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -34,10 +34,7 @@
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -72,6 +69,9 @@
    @Autowired
    private NoticeService noticeService;
    @Autowired
    private NoticeMapper noticeMapper;
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    @Override
@@ -146,8 +146,10 @@
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public Integer dealIntegral(DealIntegralRequest dealIntegralRequest) {
        Member member = memberMapper.selectById(dealIntegralRequest.getMemberId());
    public Integer dealIntegral(DealIntegralRequest dealIntegralRequest,Member member) {
        if(member == null){
              member = memberMapper.selectById(dealIntegralRequest.getMemberId());
        }
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到用户信息");
        }
@@ -158,40 +160,42 @@
        integral.setIsdeleted(Constants.ZERO);
        integral.setTitle(dealIntegralRequest.getIntegralObjType().getName());
        String info = dealIntegralRequest.getIntegralObjType().getNoteinfo();
        info = info.replace("${param}",dealIntegralRequest.getIntegralNum().toString());
        info = info.replace("${param}",dealIntegralRequest.getIntegralNum().intValue()+"");
        if(StringUtils.isNotBlank(dealIntegralRequest.getParam1())){
            info = info .replace("${param1}",dealIntegralRequest.getParam1());
        }
        integral.setContent(info);
        integral.setRemark(dealIntegralRequest.getRemark());
        integral.setObjId(dealIntegralRequest.getObjId());
        integral.setObjType(dealIntegralRequest.getIntegralObjType().getKey());
        integral.setType(dealIntegralRequest.getDealType());
        integral.setNum(dealIntegralRequest.getIntegralNum());
        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? member.getIntegral().add(integral.getNum()):member.getIntegral().subtract(integral.getNum()));
        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? Objects.nonNull(member.getIntegral())?member.getIntegral():BigDecimal.ZERO.add(integral.getNum()):Objects.nonNull(member.getIntegral())?member.getIntegral():BigDecimal.ZERO.subtract(integral.getNum()));
        integral.setOrderCode(dealIntegralRequest.getOrderCode());
        integral.setUserType(Constants.ZERO);
        integralMapper.insert(integral);
        if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
            memberMapper.addIntegral(member.getId(),dealIntegralRequest.getIntegralNum(),
                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
        }else{
            memberMapper.subtractIntegral(member.getId(),dealIntegralRequest.getIntegralNum());
        }
        LoginUserInfo user = dealIntegralRequest.getUser();
        memberMapper.update(null,new UpdateWrapper<Member>().lambda()
                .eq(Member::getId,member.getId())
                .set(Member::getEditDate,new Date())
                .set(Member::getEditor,user!=null ? user.getId():null)
                .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"total_integral = ifnull(total_integral,0)+" + dealIntegralRequest.getIntegralNum())//累计增加
                .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"integral = ifnull(integral,0)+" +  dealIntegralRequest.getIntegralNum())
                .setSql(dealIntegralRequest.getDealType().equals(Constants.ONE),"integral = ifnull(integral,0)-" + dealIntegralRequest.getIntegralNum()));
        //站内信
        noticeService.saveMemberIntegralNotice(
                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,member.getId(),dealIntegralRequest.getIntegralNum(),
                dealIntegralRequest.getIntegralObjType(),Constants.ONE,member.getId(),dealIntegralRequest.getIntegralNum(),
                integral.getId(), info
        );
        return integral.getId();
    }
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public Integer dealShopIntegral(DealIntegralRequest dealIntegralRequest) {
        Shop shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
    public Integer dealShopIntegral(DealIntegralRequest dealIntegralRequest,Shop shop) {
        if(shop ==null){
            shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
        }
        if(Objects.isNull(shop)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商户信息");
        }
@@ -199,7 +203,7 @@
        integral.setMemberId(shop.getId());
        integral.setCreateDate(new Date());
        integral.setIsdeleted(Constants.ZERO);
        integral.setTitle(dealIntegralRequest.getIntegralObjType().getName());
        integral.setTitle( dealIntegralRequest.getIntegralObjType()!=null?dealIntegralRequest.getIntegralObjType().getName():"");
        String info = dealIntegralRequest.getIntegralObjType().getNoteinfo();
        info = info.replace("${param}",dealIntegralRequest.getIntegralNum().toString());
        if(StringUtils.isNotBlank(dealIntegralRequest.getParam1())){
@@ -209,25 +213,27 @@
        integral.setObjId(dealIntegralRequest.getObjId());
        integral.setObjType(dealIntegralRequest.getIntegralObjType().getKey());
        integral.setType(dealIntegralRequest.getDealType());
        integral.setRemark(dealIntegralRequest.getRemark());
        integral.setNum(dealIntegralRequest.getIntegralNum());
        shop.setIntegral(Constants.formatBigdecimal(shop.getIntegral()));
        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? shop.getIntegral().add(integral.getNum()):shop.getIntegral().subtract(integral.getNum()));
        integral.setOrderCode(dealIntegralRequest.getOrderCode());
        integral.setUserType(Constants.ONE);
        integralMapper.insert(integral);
        if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
            shopMapper.addIntegral(shop.getId(),dealIntegralRequest.getIntegralNum(),
                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
        }else{
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                    .eq(Shop::getId,shop.getId())
                    .set(Shop::getEditDate,new Date())
                    .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"total_integral = ifnull(total_integral,0)+" + dealIntegralRequest.getIntegralNum())//累计增加
                    .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"integral = ifnull(integral,0)+" +  dealIntegralRequest.getIntegralNum())
                    .setSql(dealIntegralRequest.getDealType().equals(Constants.ONE),"integral = ifnull(integral,0)-" + dealIntegralRequest.getIntegralNum()));
            shopMapper.subtractIntegral(shop.getId(),dealIntegralRequest.getIntegralNum());
        }
        //站内信
        noticeService.saveMemberIntegralNotice(
                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,shop.getId(),dealIntegralRequest.getIntegralNum(),
                integral.getId(), info
        );
//        //站内信
//        noticeService.saveMemberIntegralNotice(
//                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,shop.getId(),dealIntegralRequest.getIntegralNum(),
//                integral.getId(), info
//        );
        return integral.getId();
    }
@@ -258,12 +264,13 @@
        integral.setOrderCode(dealIntegralRequest.getOrderCode());
        integral.setUserType(Constants.TWO);
        integralMapper.insert(integral);
        if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
            shopMapper.addAmount(shop.getId(),dealIntegralRequest.getIntegralNum(),
                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
        }else{
            shopMapper.subtractAmount(shop.getId(),dealIntegralRequest.getIntegralNum());
        }
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                .eq(Shop::getId,shop.getId())
                .set(Shop::getEditDate,new Date())
                .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"total_integral = ifnull(total_integral,0)+" + dealIntegralRequest.getIntegralNum())//累计增加
                .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"integral = ifnull(integral,0)+" +  dealIntegralRequest.getIntegralNum())
                .setSql(dealIntegralRequest.getDealType().equals(Constants.ONE),"integral = ifnull(integral,0)-" + dealIntegralRequest.getIntegralNum()));
        return integral.getId();
    }
@@ -511,9 +518,13 @@
        }
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        Date date = new Date();
        Integral integral = new Integral();
//        Date date = new Date();
//        Integral integral = new Integral();
        Constants.IntegralObjType integralObjType =null;
        DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
        dealIntegralRequest.setIntegralNum(param.getNum());
        dealIntegralRequest.setRemark(param.getRemark());
        dealIntegralRequest.setDealType(param.getType());
        if(Constants.equalsInteger(param.getUserType(), Constants.ZERO)){//用户账号
            MPJLambdaWrapper<Member> queryWrapper =new MPJLambdaWrapper<>();
            queryWrapper.selectAll(Member.class);
@@ -532,28 +543,12 @@
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"用户账户余额不足!");
            }
            integralObjType = param.getType()==0?Constants.IntegralObjType.SYSTEM_RECHARGE:Constants.IntegralObjType.SYSTEM_DEDUCT;
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(num);
            dealIntegralRequest.setDealType(param.getType());
            dealIntegralRequest.setMemberId(model.getId());
            dealIntegralRequest.setObjId(null);
            dealIntegralRequest.setOrderCode(null);
            dealIntegralRequest.setRemark(param.getRemark());
            dealIntegralRequest.setIntegralObjType(integralObjType);
            this.dealIntegral(dealIntegralRequest);
            dealIntegralRequest.setUser(user);
            this.dealIntegral(dealIntegralRequest,model);
            //账户余额
//            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
//                    .eq(Member::getId,model.getId())
//                    .set(Member::getEditDate,date)
//                    .set(Member::getEditor,user.getId())
//                    .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//累计增加
//                    .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
//                    .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
//
//            integralObjType = param.getType()==0?Constants.IntegralObjType.SYSTEM_RECHARGE:Constants.IntegralObjType.SYSTEM_DEDUCT;
//            integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(param.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(param.getNum()));
//            integral.setUserType(Constants.ZERO);
        }else{//经销商账户
            Shop model = shopMapper.selectById(param.getMemberId());
            if(model == null ||Constants.equalsObject(model.getIsdeleted(),Constants.ONE)){
@@ -565,42 +560,15 @@
//                num = num.multiply(new BigDecimal(-1));//减少
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"经销商账户积分余额不足!");
            }
            //账户余额
//            shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
//                    .eq(Shop::getId,model.getId())
//                    .set(Shop::getEditDate,date)
//                    .set(Shop::getEditor,user.getId())
//                    .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//累计增加
//                    .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
//                    .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
//            integralObjType = param.getType()==0?Constants.IntegralObjType.SHOP_SYSTEM_RECHARGE:Constants.IntegralObjType.SHOP_SYSTEM_DEDUCT;
//            integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(param.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(param.getNum()));
//            integral.setUserType(Constants.ONE);
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(num);
            dealIntegralRequest.setDealType(param.getType());
            integralObjType = param.getType()==0?Constants.IntegralObjType.SHOP_SYSTEM_RECHARGE:Constants.IntegralObjType.SHOP_SYSTEM_DEDUCT;
            dealIntegralRequest.setMemberId(model.getId());
            dealIntegralRequest.setObjId(null);
            dealIntegralRequest.setOrderCode(null);
            dealIntegralRequest.setIntegralObjType(integralObjType);
            this.dealShopIntegral(dealIntegralRequest);
            this.dealShopIntegral(dealIntegralRequest,model);
        }
//        integral.setCreateDate(new Date());
//        integral.setCreator(user.getId());
//        integral.setIsdeleted(Constants.ZERO);
//        integral.setNum(param.getNum());
//        integral.setTitle(integralObjType.getName());
//        integral.setContent(integralObjType.getNoteinfo().replace("${param}",integral.getNum().toString()));
//        integral.setMemberId(param.getMemberId());
//        integral.setObjId(param.getMemberId());
//        integral.setObjType(integralObjType.getKey());
//        integral.setType(param.getType());
//        integral.setRemark(param.getRemark());
//        integral.setOrderCode(null);
//        integralMapper.insert(integral);
    }
    @Override
    public IntegralDataResponse getIntegralData(IntegralRecordDTO model){
@@ -612,10 +580,17 @@
        IntegralDataResponse integralDataResponse = new IntegralDataResponse();
        integralDataResponse.setSurplusIntegral(BigDecimal.ZERO);
        integralDataResponse.setExpiredIntegral(BigDecimal.ZERO);
        Shop shop = shopMapper.selectById(model.getMemberId());
        if (Objects.nonNull(shop)) {
            integralDataResponse.setSurplusIntegral(
                    Constants.equalsInteger(model.getUserType(),Constants.TWO)?shop.getAmount():shop.getIntegral());
        //用户积分
        if(Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
            Member member = memberMapper.selectById(model.getMemberId());
            integralDataResponse.setSurplusIntegral(member.getIntegral());
        }else{
            //商户积分/余额
            Shop shop = shopMapper.selectById(model.getMemberId());
            if (Objects.nonNull(shop)) {
                integralDataResponse.setSurplusIntegral(
                        Constants.equalsInteger(model.getUserType(),Constants.TWO)?shop.getAmount():shop.getIntegral());
            }
        }
        List<Integral> list = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
@@ -649,26 +624,44 @@
                        .reduce(BigDecimal.ZERO, BigDecimal::add)
                );
            }
            //积分失效方式 0长期有效 1按积分产生时间失效
            Integer type  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
            //消费者积分 需要查询即将过期积分
            if(Constants.equalsInteger(type,Constants.ONE)&& Constants.equalsInteger(model.getUserType(),Constants.ONE)){
                Integer validYear  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
                if(validYear.compareTo(Constants.ZERO)>Constants.ZERO){
                     list = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                            .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
                            .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
                            .eq(Integral::getMemberId,model.getMemberId())
                             .apply(" CREATE_DATE >= DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL "+(validYear*12)+1+" MONTH) ")
                            .orderByDesc(Integral::getCreateDate));
                    BigDecimal newIntegral = list.stream().map(i->i.getNum().multiply(new BigDecimal(i.getType().toString()))
                    ).reduce(BigDecimal.ZERO, BigDecimal::add);
                    integralDataResponse.setExpiredIntegral(
                            integralDataResponse.getSurplusIntegral().compareTo(newIntegral)>Constants.ZERO?integralDataResponse.getSurplusIntegral().subtract(newIntegral):BigDecimal.ZERO
                    );
            if(Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
                //积分失效方式 0长期有效 1按积分产生时间失效
                Integer type  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
                //消费者积分 需要查询即将过期积分
                if(Constants.equalsInteger(type,Constants.ONE)&& Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
                    Integer validYear  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
                    if(validYear.compareTo(Constants.ZERO)>Constants.ZERO){
                        List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                                .eq(Integral::getUserType, Constants.ZERO)  // 消费者积分
                                .eq(Integral::getIsdeleted, Constants.ZERO) // 未删除
                                .eq(Integral::getMemberId,model.getMemberId())
                                // 查找超过有效期的积分(创建日期早于当前日期减去有效年限)
                                .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 已过期
                                .orderByAsc(Integral::getCreateDate));
                        //查询过期日期后的消耗积分
                        List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                                .eq(Integral::getUserType, Constants.ZERO)  // 消费者积分
                                .eq(Integral::getIsdeleted, Constants.ZERO) // 未删除
                                .eq(Integral::getType, Constants.ONE) // 使用的积分
                                .eq(Integral::getMemberId,model.getMemberId())
                                // 查找超过有效期的积分(创建日期早于当前日期减去有效年限)
                                .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 已过期
                                .orderByAsc(Integral::getCreateDate));
                        BigDecimal totalExpiredNum = expiredIntegrals.stream().map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
                        BigDecimal afterUseIntegral = useIntegrals.stream().map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
                        if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
                            integralDataResponse.setExpiredIntegral(BigDecimal.ZERO);
                        }else{
                            integralDataResponse.setExpiredIntegral(totalExpiredNum.subtract(afterUseIntegral));
                        }
                    }
                }
            }
        }
        String info  = systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALRULEINFO).getCode();
        integralDataResponse.setInfo(info);
@@ -677,7 +670,150 @@
    }
    /**
     * 积分过期处理(定时任务)
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void expiredIntegral() {
        // 积分失效方式 0 长期有效 1 按积分产生时间失效
        Integer type = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
        // 只有配置为按时间失效时才执行
        if (Constants.equalsInteger(type, Constants.ONE)) {
            Integer validYear = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
            if (validYear != null && validYear.compareTo(Constants.ZERO) > 0) {
                // 查询所有需要处理的用户积分记录
                // 查询所有已过期但还未处理的积分记录
                List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                        .eq(Integral::getUserType, Constants.ZERO)  // 消费者积分
                        .eq(Integral::getIsdeleted, Constants.ZERO) // 未删除
                        // 查找超过有效期的积分(创建日期早于当前日期减去有效年限)
                        .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 已过期
                        .orderByAsc(Integral::getCreateDate));
                //查询过期日期后的消耗积分
                List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                        .eq(Integral::getUserType, Constants.ZERO)  // 消费者积分
                        .eq(Integral::getIsdeleted, Constants.ZERO) // 未删除
                        .eq(Integral::getType, Constants.ONE) // 使用的积分
                        // 查找超过有效期的积分(创建日期早于当前日期减去有效年限)
                        .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 已过期
                        .orderByAsc(Integral::getCreateDate));
                if (CollectionUtils.isEmpty(expiredIntegrals)) {
                    return;
                }
                // 按会员分组统计过期积分
                Map<Integer, List<Integral>> memberIntegralMap = expiredIntegrals.stream()
                        .collect(Collectors.groupingBy(Integral::getMemberId));
                // 遍历每个用户的过期积分进行处理
                for (Map.Entry<Integer, List<Integral>> entry : memberIntegralMap.entrySet()) {
                    Integer memberId = entry.getKey();
                    List<Integral> integrals = entry.getValue();
                    // 统计该用户的总过期积分
                    BigDecimal totalExpiredNum = integrals.stream()
                            .map(Integral::getNum)
                            .reduce(BigDecimal.ZERO, BigDecimal::add);
                    if (totalExpiredNum.compareTo(BigDecimal.ZERO) <= 0) {
                        continue;
                    }
                    // 查询用户当前积分
                    Member member = memberMapper.selectById(memberId);
                    if (member == null || member.getIsdeleted() == Constants.ONE) {
                        continue;
                    }
                    BigDecimal afterUseIntegral = useIntegrals.stream().filter(i->Constants.equalsInteger(memberId,i.getMemberId())).map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
                    if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
                        continue;
                    }
                    DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
                    dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_YEAR_SETTLEMENT);
                    dealIntegralRequest.setIntegralNum(totalExpiredNum.subtract(afterUseIntegral));
                    dealIntegralRequest.setMemberId(memberId);
                    dealIntegralRequest.setDealType(Constants.ONE);
                    this.dealIntegral(dealIntegralRequest,member);
                }
            }
        }
    }
    /**
     * 积分即将过期通知
     */
    @Override
    public void expiredIntegralNotice() {
        // 积分失效方式 0 长期有效 1 按积分产生时间失效
        Integer type = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
        // 只有配置为按时间失效时才执行
        if (Constants.equalsInteger(type, Constants.ONE)) {
            Integer validYear = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
            if (validYear != null && validYear.compareTo(Constants.ZERO) > 0) {
                // 查询所有需要处理的用户积分记录
                // 查询所有已过期但还未处理的积分记录
                List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                        .eq(Integral::getUserType, Constants.ZERO)  // 消费者积分
                        .eq(Integral::getIsdeleted, Constants.ZERO) // 未删除
                        // 查找超过有效期的积分(创建日期早于当前日期减去有效年限)
                        .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 已过期
                        .orderByAsc(Integral::getCreateDate));
                //查询过期日期后的消耗积分
                List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                        .eq(Integral::getUserType, Constants.ZERO)  // 消费者积分
                        .eq(Integral::getIsdeleted, Constants.ZERO) // 未删除
                        .eq(Integral::getType, Constants.ONE) // 使用的积分
                        // 查找超过有效期的积分(创建日期早于当前日期减去有效年限)
                        .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 已过期
                        .orderByAsc(Integral::getCreateDate));
                if (CollectionUtils.isEmpty(expiredIntegrals)) {
                    return;
                }
                // 按会员分组统计过期积分
                Map<Integer, List<Integral>> memberIntegralMap = expiredIntegrals.stream()
                        .collect(Collectors.groupingBy(Integral::getMemberId));
                // 遍历每个用户的过期积分进行处理
                for (Map.Entry<Integer, List<Integral>> entry : memberIntegralMap.entrySet()) {
                    Integer memberId = entry.getKey();
                    List<Integral> integrals = entry.getValue();
                    // 统计该用户的总过期积分
                    BigDecimal totalExpiredNum = integrals.stream()
                            .map(Integral::getNum)
                            .reduce(BigDecimal.ZERO, BigDecimal::add);
                    BigDecimal afterUseIntegral = useIntegrals.stream().filter(i->Constants.equalsInteger(memberId,i.getMemberId())).map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
                    if (totalExpiredNum.compareTo(BigDecimal.ZERO) <= 0) {
                        continue;
                    }
                    // 查询用户当前积分
                    Member member = memberMapper.selectById(memberId);
                    if (member == null || member.getIsdeleted() == Constants.ONE) {
                        continue;
                    }
                    if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
                        continue;
                    }
                    //发送发货站内信
                    Notice notice = Notice.getNotice(
                            Constants.NoticeType.EXPIRE_INTEGRAL,
                            memberId,
                            null
                    );
                    notice.setContent(notice.getContent().replace("{param}", totalExpiredNum.subtract(afterUseIntegral).intValue()+""));
                    noticeMapper.insert(notice);
                }
            }
        }
    }
}