JiangYouYao
2022-03-18 96e622e737ec7d0b9f3a64ecc4e4a53389a207a2
zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
@@ -1,11 +1,13 @@
package com.matrix.system.hive.service.imp;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.pojo.PaginationVO;
import com.matrix.core.pojo.VerificationResult;
import com.matrix.core.tools.DateUtil;
import com.matrix.core.tools.LogUtil;
import com.matrix.system.common.validate.ParameterValidate;
import com.matrix.system.common.validate.group.Group;
import com.matrix.system.constance.Dictionary;
@@ -16,7 +18,6 @@
import com.matrix.system.hive.plugin.util.MoneyUtil;
import com.matrix.system.hive.service.MoneyCardUseService;
import com.matrix.system.hive.service.ShoppingGoodsService;
import com.matrix.system.hive.validation.ProjUseGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -63,7 +64,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addVipMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtos) {
        moneyCardOperationDtos.forEach(dto->{
        moneyCardOperationDtos.forEach(dto -> {
            //参数校验
            ParameterValidate.ValidResult baseIdResult = ParameterValidate.validateBean(dto, Group.ADD.class);
            if (baseIdResult.hasErrors()) {
@@ -71,7 +72,7 @@
            }
            ShoppingGoods moneyCar = shoppingGoodsDao.selectById(dto.getGoodsId());
            MoneyCardUse moneyCardUse = new MoneyCardUse();
            BeanUtil.copyProperties(dto,moneyCardUse);
            BeanUtil.copyProperties(dto, moneyCardUse);
            moneyCardUse.setVipId(dto.getVipId());
            moneyCardUse.setGiftMoney(moneyCar.getReferencePice());
            moneyCardUse.setRealMoney(moneyCar.getSealPice());
@@ -93,7 +94,49 @@
            moneyCardUseDao.insert(moneyCardUse);
        });
    }
    @Override
    public void deleteByOrderItemId(Long id) {
        MoneyCardUseFlow  moneyCardUseFlow=new MoneyCardUseFlow();
        moneyCardUseFlow.setCarUseId(id);
        int i = moneyCardUseFlowDao.selectTotalRecord(moneyCardUseFlow);
        if(i>0){
            MoneyCardUse one = getOne(lambdaQuery().eq(MoneyCardUse::getOrderItemId,id));
            throw new GlobleException(one.getCardName()+"储值卡已经被启用无法删除");
        }else {
            moneyCardUseDao.deleteByOrderItemId(id);
        }
    }
    @Override
    public void moneyCardTk(List<MoneyCardOperationDto> moneyCardOperationDtos) {
        MoneyCardUseFlow  moneyCardUseFlow=new MoneyCardUseFlow();
        moneyCardOperationDtos.forEach(moneyCardOperationDto -> {
            List<MoneyCardUse> moneyCardUseList = list(lambdaQuery().eq(MoneyCardUse::getOrderItemId, moneyCardOperationDto.getOrderItemId()));
            for (MoneyCardUse moneyCardUse : moneyCardUseList) {
                moneyCardUse.setStatus(Dictionary.TAOCAN_STATUS_TK);
                moneyCardUseDao.update(moneyCardUse);
                //设置卡项使用流水
                moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
                moneyCardUseFlow.setOrderNo(moneyCardOperationDto.getOrderNo());
                moneyCardUseFlow.setVipId(moneyCardUse.getVipId());
                moneyCardUseFlow.setTimes(moneyCardUse.getLastCount());
                moneyCardUseFlow.setType(moneyCardOperationDto.getType());
                moneyCardUseFlow.setCreateTime(new Date());
                moneyCardUseFlow.setOperationId(moneyCardOperationDto.getUpdateUser());
                moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
                moneyCardUseFlowDao.insert(moneyCardUseFlow);
            }
        });
@@ -103,74 +146,119 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void changeMoneyCard(List<MoneyCardPayDto> moneyCardPayDtoList) {
        // 判断商品是否在充值卡的限制购买
        moneyCardPayDtoList.forEach(cardUse -> {
            VerificationResult verificationResult = checkIsBangding(cardUse.getCarUseId(), cardUse.getGoodsIds());
            if (!verificationResult.isJudgeResult()) {
                throw new GlobleException(verificationResult.getMsg());
            }
        });
        moneyCardPayDtoList.forEach(moneyCardPayDto -> {
            MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardPayDto.getCarUseId());
            MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow();
            if (Objects.nonNull(moneyCardPayDto.getGiftMoney()) && moneyCardPayDto.getGiftMoney()>0) {
                if (moneyCardUse.getGiftMoney() >= moneyCardPayDto.getGiftMoney()) {
                    double surplus = MoneyUtil.sub(moneyCardUse.getGiftMoney(), moneyCardPayDto.getGiftMoney());
                    moneyCardUse.setGiftMoney(surplus);
                    moneyCardUseFlow.setGiftMoney(0D - moneyCardPayDto.getGiftMoney());
                } else {
                    throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
                }
            } else {
                if (moneyCardUse.getRealMoney() >= moneyCardPayDto.getRealMoney()) {
                    double surplus = MoneyUtil.sub(moneyCardUse.getRealMoney(),  moneyCardPayDto.getRealMoney());
                    moneyCardUse.setRealMoney(surplus);
                    moneyCardUseFlow.setTotal(0 -  moneyCardPayDto.getRealMoney());
                } else {
                    throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
                }
            if (MoneyCardUseFlow.USE_TYPE_CONSUMER.equals(moneyCardPayDto.getType())) {
                //扣减储值卡余额
                deductMoneyCard(moneyCardPayDto);
            } else if (MoneyCardUseFlow.USE_TYPE_ORDRE_CANCEL.equals(moneyCardPayDto.getType())) {
                //回退储值卡余额
                returnMoneyCard(moneyCardPayDto);
            }
            if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_NO_N)) {
                //余额为0时充值卡变为无效
                if (moneyCardUse.getRealMoney().equals(0D) && moneyCardUse.getGiftMoney().equals(0D)) {
                    moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
                    moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX);
                }
            }
            ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId());
            if (shoppingGoods != null) {
                Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime());
                moneyCardUse.setFailTime(invalidTime);
            }
            moneyCardUse.setLastCount(moneyCardUse.getLastCount() - moneyCardPayDto.getCount());
            // 更新充值卡信息
            moneyCardUseDao.update(moneyCardUse);
            //设置卡项使用流水
            moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
            moneyCardUseFlow.setOrderNo(moneyCardPayDto.getOrderNo());
            moneyCardUseFlow.setVipId(moneyCardUse.getVipId());
            moneyCardUseFlow.setTimes(-1);
            moneyCardUseFlow.setType(moneyCardPayDto.getType());
            moneyCardUseFlow.setCreateTime(new Date());
            moneyCardUseFlow.setOperationId(moneyCardPayDto.getUpdateUser());
            moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
            moneyCardUseFlowDao.insert(moneyCardUseFlow);
        });
    }
    /**
     * 回退储值卡余额
     *
     * @param moneyCardPayDto
     */
    private void returnMoneyCard(MoneyCardPayDto moneyCardPayDto) {
        LogUtil.info("回退储值卡余额 {}", JSON.toJSONString(moneyCardPayDto));
        MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardPayDto.getCarUseId());
        MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow();
        if (Objects.nonNull(moneyCardPayDto.getGiftMoney())) {
            //jyytodo 余额余次的修改和新增在数据库层面做加减
            moneyCardUse.setGiftMoney(moneyCardUse.getGiftMoney() + moneyCardPayDto.getGiftMoney());
        }
        if (Objects.nonNull(moneyCardPayDto.getRealMoney())) {
            moneyCardUse.setRealMoney(moneyCardUse.getRealMoney() + moneyCardPayDto.getRealMoney());
        }
        moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
        moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
        moneyCardUseDao.update(moneyCardUse);
        //设置卡项使用流水
        moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
        moneyCardUseFlow.setOrderNo(moneyCardPayDto.getOrderNo());
        moneyCardUseFlow.setVipId(moneyCardUse.getVipId());
        moneyCardUseFlow.setTimes(moneyCardUse.getLastCount());
        moneyCardUseFlow.setType(moneyCardPayDto.getType());
        moneyCardUseFlow.setCreateTime(new Date());
        moneyCardUseFlow.setOperationId(moneyCardPayDto.getUpdateUser());
        moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
        moneyCardUseFlowDao.insert(moneyCardUseFlow);
    }
    /**
     * 扣减储值余额
     *
     * @param moneyCardPayDto
     */
    private void deductMoneyCard(MoneyCardPayDto moneyCardPayDto) {
        // 判断商品是否在充值卡的限制购买
        VerificationResult verificationResult = checkIsBangding(moneyCardPayDto.getCarUseId(), moneyCardPayDto.getGoodsIds());
        if (!verificationResult.isJudgeResult()) {
            throw new GlobleException(verificationResult.getMsg());
        }
        LogUtil.info("扣减储值卡余额 {}", JSON.toJSONString(moneyCardPayDto));
        MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardPayDto.getCarUseId());
        MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow();
        if (Objects.nonNull(moneyCardPayDto.getGiftMoney()) && moneyCardPayDto.getGiftMoney() > 0) {
            if (moneyCardUse.getGiftMoney() >= moneyCardPayDto.getGiftMoney()) {
                double surplus = MoneyUtil.sub(moneyCardUse.getGiftMoney(), moneyCardPayDto.getGiftMoney());
                moneyCardUse.setGiftMoney(surplus);
                moneyCardUseFlow.setGiftMoney(0D - moneyCardPayDto.getGiftMoney());
            } else {
                throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
            }
        } else {
            if (moneyCardUse.getRealMoney() >= moneyCardPayDto.getRealMoney()) {
                double surplus = MoneyUtil.sub(moneyCardUse.getRealMoney(), moneyCardPayDto.getRealMoney());
                moneyCardUse.setRealMoney(surplus);
                moneyCardUseFlow.setTotal(0 - moneyCardPayDto.getRealMoney());
            } else {
                throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
            }
        }
        if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_NO_N)) {
            //余额为0时充值卡变为无效
            if (moneyCardUse.getRealMoney().equals(0D) && moneyCardUse.getGiftMoney().equals(0D)) {
                moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
                moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX);
            }
        }
        ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId());
        if (shoppingGoods != null) {
            Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime());
            moneyCardUse.setFailTime(invalidTime);
        }
        moneyCardUse.setLastCount(moneyCardUse.getLastCount() - moneyCardPayDto.getCount());
        // 更新充值卡信息
        moneyCardUseDao.update(moneyCardUse);
        //设置卡项使用流水
        moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
        moneyCardUseFlow.setOrderNo(moneyCardPayDto.getOrderNo());
        moneyCardUseFlow.setVipId(moneyCardUse.getVipId());
        moneyCardUseFlow.setTimes(moneyCardUse.getLastCount());
        moneyCardUseFlow.setType(moneyCardPayDto.getType());
        moneyCardUseFlow.setCreateTime(new Date());
        moneyCardUseFlow.setOperationId(moneyCardPayDto.getUpdateUser());
        moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
        moneyCardUseFlowDao.insert(moneyCardUseFlow);
    }
    /**
     * 检查商品是否在储值卡的消费范围内
     *
     * @param moneyCardUseId 储值卡id
     * @param goodsIds  商品id集合
     * @param goodsIds       商品id集合
     * @return
     */
    private VerificationResult checkIsBangding(Long moneyCardUseId, List<Long> goodsIds) {