doum
11 小时以前 666a942f5f2b59209cf422bb202f6548fbbe212e
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -10,12 +10,17 @@
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.IntegralMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.ShopMapper;
import com.doumee.dao.business.join.IntegralJoinMapper;
import com.doumee.dao.business.model.Fund;
import com.doumee.dao.business.model.Integral;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.web.dto.IntegralDTO;
import com.doumee.dao.web.dto.IntegralRecordDTO;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.dao.web.response.IntegralDataResponse;
import com.doumee.service.business.AreasService;
import com.doumee.service.business.IntegralService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -58,6 +63,9 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private ShopMapper shopMapper;
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    @Override
@@ -150,6 +158,7 @@
        integral.setNum(dealIntegralRequest.getIntegralNum());
        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? member.getIntegral().add(integral.getNum()):member.getIntegral().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(),
@@ -160,7 +169,66 @@
        return integral.getId();
    }
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public Integer dealShopIntegral(DealIntegralRequest dealIntegralRequest) {
        Shop shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
        if(Objects.isNull(shop)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商户信息");
        }
        Integral integral = new Integral();
        integral.setMemberId(shop.getId());
        integral.setCreateDate(new Date());
        integral.setIsdeleted(Constants.ZERO);
        integral.setTitle(dealIntegralRequest.getIntegralObjType().getName());
        integral.setContent(dealIntegralRequest.getIntegralObjType().getNoteinfo());
        integral.setObjId(dealIntegralRequest.getObjId());
        integral.setObjType(dealIntegralRequest.getIntegralObjType().getKey());
        integral.setType(dealIntegralRequest.getDealType());
        integral.setNum(dealIntegralRequest.getIntegralNum());
        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.subtractIntegral(shop.getId(),dealIntegralRequest.getIntegralNum());
        }
        return integral.getId();
    }
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public Integer dealShopAmount(DealIntegralRequest dealIntegralRequest) {
        Shop shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
        if(Objects.isNull(shop)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商户信息");
        }
        Integral integral = new Integral();
        integral.setMemberId(shop.getId());
        integral.setCreateDate(new Date());
        integral.setIsdeleted(Constants.ZERO);
        integral.setTitle(dealIntegralRequest.getIntegralObjType().getName());
        integral.setContent(dealIntegralRequest.getIntegralObjType().getNoteinfo());
        integral.setObjId(dealIntegralRequest.getObjId());
        integral.setObjType(dealIntegralRequest.getIntegralObjType().getKey());
        integral.setType(dealIntegralRequest.getDealType());
        integral.setNum(dealIntegralRequest.getIntegralNum());
        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? shop.getAmount().add(integral.getNum()):shop.getAmount().subtract(integral.getNum()));
        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());
        }
        return integral.getId();
    }
    @Override
@@ -249,14 +317,14 @@
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.selectAll(Integral.class);
        queryWrapper.selectAs(Member::getNickname, Fund::getNickName);
        queryWrapper.selectAs(Member::getImgurl, Fund::getImgurl);
        queryWrapper.selectAs(Member::getPhone, Fund::getPhone);
        queryWrapper.selectAs(Member::getNickname, Integral::getNickName);
        queryWrapper.selectAs(Member::getImgurl, Integral::getImgurl);
        queryWrapper.selectAs(Member::getPhone, Integral::getPhone);
        queryWrapper.leftJoin(Member.class, Member::getId, Integral::getMemberId);
        queryWrapper.eq(pageWrap.getModel().getMemberId() != null, Integral::getMemberId, pageWrap.getModel().getMemberId());
        queryWrapper.eq(pageWrap.getModel().getType() != null, Integral::getType, pageWrap.getModel().getType());
        queryWrapper.eq(pageWrap.getModel().getUserType() != null, Integral::getUserType, pageWrap.getModel().getUserType());
        queryWrapper.eq(  pageWrap.getModel().getObjType() !=null, Integral::getObjType, pageWrap.getModel().getObjType());
        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNickName()), ms -> ms.like(Member::getNickname, pageWrap.getModel().getNickName())
                .or().like(Member::getPhone, pageWrap.getModel().getNickName())
        );
@@ -274,6 +342,7 @@
        String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILE).getCode();
        for (Integral model : result.getRecords()) {
            model.setStrObjType(Constants.IntegralObjType.getName(model.getObjType()));
            if (StringUtils.isNotBlank(model.getImgurl())) {
                model.setImgurl(path + model.getImgurl());
            }
@@ -319,4 +388,166 @@
        integralDTOIPage.setCurrent(result.getCurrent());
        return PageData.from(integralDTOIPage);
    }
    public List<Integral> getMyIntegralList(Integer memberId) {
        QueryWrapper<Integral> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(Integral::getMemberId,memberId);
        return integralMapper.selectList(queryWrapper);
    }
    @Override
    public PageData<Integral> findIntegralRecordPage(PageWrap<IntegralRecordDTO> pageWrap) {
        IPage<Integral> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        Utils.MP.blankToNull(pageWrap.getModel());
        IntegralRecordDTO model = pageWrap.getModel();
        IPage<Integral> result = integralMapper.selectPage(page,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())
                .orderByDesc(Integral::getCreateDate)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(result.getRecords())){
            for (Integral integral:result.getRecords()) {
                integral.setStrObjType(Constants.IntegralObjType.getName(integral.getObjType()));
            }
        }
        return PageData.from(result);
    }
    @Override
    @Transactional
    public void updateIntegral(Integral param) {
        if(param.getMemberId()==null || param.getType()==null
                || param.getType()<0
                || param.getType()>2
                || Constants.formatBigdecimal(param.getNum()).compareTo(new BigDecimal(0))<=0){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        Date date = new Date();
        Integral integral = new Integral();
        Constants.IntegralObjType integralObjType =null;
        if(Constants.equalsInteger(param.getUserType(), Constants.ZERO)){//用户账号
            MPJLambdaWrapper<Member> queryWrapper =new MPJLambdaWrapper<>();
            queryWrapper.selectAll(Member.class);
            queryWrapper.selectAs(Shop::getName,Member::getShopName);
            queryWrapper.leftJoin(Shop.class, Shop::getId,Member::getBindShopId);
            queryWrapper.eq(Member::getId,param.getMemberId());
            Member model = memberMapper.selectJoinOne(Member.class,queryWrapper);
            if(model == null ||Constants.equalsObject(model.getIsdeleted(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"客户信息查询无效!");
            }
            BigDecimal num = param.getNum();
            if(param.getType() == 1 &&Constants.formatBigdecimal(model.getIntegral()).compareTo(param.getNum())<0){
                //如果是减少,判断用户余额是否满足
                num = num.multiply(new BigDecimal(-1));//减少
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"用户账户余额不足!");
            }
            //账户余额
            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)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"经销商信息查询无效!");
            }
            BigDecimal num = param.getNum();
            if(param.getType() == 1 &&Constants.formatBigdecimal(model.getIntegral()).compareTo(param.getNum())<0){
                //如果是减少,判断用户余额是否满足
                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);
        }
        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){
        IntegralDataResponse integralDataResponse = new IntegralDataResponse();
        integralDataResponse.setSurplusIntegral(BigDecimal.ZERO);
        integralDataResponse.setExpiredIntegral(BigDecimal.ZERO);
        List<Integral> 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())
                .orderByDesc(Integral::getCreateDate));
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
            integralDataResponse.setSurplusIntegral(
                    list.stream().map(i->i.getNum().multiply(new BigDecimal(i.getType().toString()))
                    ).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.ZERO)){
                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
                    );
                }
            }
        }
        String info  = systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALRULEINFO).getCode();
        integralDataResponse.setInfo(info);
        return integralDataResponse;
    }
}