rk
2 天以前 7b09a9950f13521190a4aef9bbc2a6163445566c
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
@@ -160,7 +160,7 @@
        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());
        }
@@ -170,7 +170,7 @@
        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);
@@ -185,7 +185,7 @@
        //站内信
        noticeService.saveMemberIntegralNotice(
                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,member.getId(),dealIntegralRequest.getIntegralNum(),
                dealIntegralRequest.getIntegralObjType(),Constants.ONE,member.getId(),dealIntegralRequest.getIntegralNum(),
                integral.getId(), info
        );
        return integral.getId();
@@ -193,7 +193,6 @@
    @Override
    public Integer dealShopIntegral(DealIntegralRequest dealIntegralRequest,Shop shop) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(shop ==null){
            shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
        }
@@ -225,23 +224,16 @@
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                    .eq(Shop::getId,shop.getId())
                    .set(Shop::getEditDate,new Date())
                    .set(Shop::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()));
     /* if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
            shopMapper.addIntegral(shop.getId(),dealIntegralRequest.getIntegralNum(),
                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
        }else{
            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();
    }
@@ -273,22 +265,12 @@
        integral.setUserType(Constants.TWO);
        integralMapper.insert(integral);
        LoginUserInfo user =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                .eq(Shop::getId,shop.getId())
                .set(Shop::getEditDate,new Date())
                .set(Shop::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()));
      /*  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());
        }*/
        return integral.getId();
    }
@@ -598,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())
@@ -635,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);
@@ -663,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);
                }
            }
        }
    }
}