935090232@qq.com
2022-03-18 baa1c7ecdc47c5da14790b422007ce21e0547ffa
zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
@@ -1,30 +1,36 @@
package com.matrix.system.hive.service.imp;
import com.matrix.core.constance.MatrixConstance;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.pojo.PaginationVO;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.core.pojo.VerificationResult;
import com.matrix.core.tools.DateUtil;
import com.matrix.system.common.validate.ParameterValidate;
import com.matrix.system.common.validate.group.Group;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.core.tools.DateUtil;
import com.matrix.system.hive.dto.MoneyCardOperationDto;
import com.matrix.system.hive.dto.MoneyCardPayDto;
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;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * @date 2016-09-17 10:17
 */
@Service("moneyCardUseService")
public class MoneyCardUseServiceImpl implements MoneyCardUseService {
public class MoneyCardUseServiceImpl extends ServiceImpl<MoneyCardUseDao, MoneyCardUse> implements MoneyCardUseService {
    @Autowired
@@ -42,9 +48,183 @@
    @Autowired
    private SysVipLevelDao viplevelDao;
    @Autowired
    ShoppingGoodsDao shoppingGoodsDao;
    @Autowired
    MoneyCardAssembleDao moneyCardAssembleDao;
    @Autowired
    MoneyCardUseFlowDao moneyCardUseFlowDao;
    @Autowired
    private ShoppingGoodsService shoppingGoodsService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addVipMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtos) {
        moneyCardOperationDtos.forEach(dto->{
            //参数校验
            ParameterValidate.ValidResult baseIdResult = ParameterValidate.validateBean(dto, Group.ADD.class);
            if (baseIdResult.hasErrors()) {
                throw new GlobleException(baseIdResult.getErrors());
            }
            ShoppingGoods moneyCar = shoppingGoodsDao.selectById(dto.getGoodsId());
            MoneyCardUse moneyCardUse = new MoneyCardUse();
            BeanUtil.copyProperties(dto,moneyCardUse);
            moneyCardUse.setVipId(dto.getVipId());
            moneyCardUse.setGiftMoney(moneyCar.getReferencePice());
            moneyCardUse.setRealMoney(moneyCar.getSealPice());
            moneyCardUse.setGoodsId(moneyCar.getId());
            moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
            moneyCardUse.setIsVipCar(Dictionary.FLAG_NO_N);
            //余次处理
            if (moneyCar.getCarUseCount() == null || moneyCar.getCarUseCount() == 0) {
                moneyCardUse.setUseTotal(999999999);
                moneyCardUse.setLastCount(999999999);
            } else {
                moneyCardUse.setUseTotal(moneyCar.getCarUseCount());
                moneyCardUse.setLastCount(moneyCar.getCarUseCount());
            }
            //失效时间处理
            Date invalidTime = shoppingGoodsService.calInvalidTime(moneyCar, 1, null);
            moneyCardUse.setFailTime(invalidTime);
            moneyCardUseDao.insert(moneyCardUse);
        });
    }
    @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 (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 moneyCardUseId 储值卡id
     * @param goodsIds  商品id集合
     * @return
     */
    private VerificationResult checkIsBangding(Long moneyCardUseId, List<Long> goodsIds) {
        // 如果是一卡通则肯定在绑定范围内
        MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardUseId);
        //默认储值卡可以购买所有产品
        if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)) {
            return VerificationResult.success();
        } else {
            // 不是默认储值卡判断卡是否可应用于所有产品
            ShoppingGoods cardGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId());
            if (cardGoods != null) {
                if (Dictionary.FLAG_YES.equals(cardGoods.getGoodType())) {
                    return VerificationResult.success();
                }
            }
            // 比较分类
            MoneyCardAssemble moneyCardAssemble = new MoneyCardAssemble();
            moneyCardAssemble.setCardId(moneyCardUse.getGoodsId());
            List<MoneyCardAssemble> cardAssembleList = moneyCardAssembleDao.selectByModel(moneyCardAssemble);
            List<ShoppingGoods> yhGoods = shoppingGoodsDao.selectByIds(goodsIds);
            StringBuilder msgBuilder = new StringBuilder();
            for (ShoppingGoods goods : yhGoods) {
                boolean isMatch = false;
                for (MoneyCardAssemble cardAssemble : cardAssembleList) {
                    // 比较类型
                    if (cardAssemble.getType().equals(Dictionary.CZK_ASSEMBLE_FL)) {
                        if (goods.getCateId().equals(cardAssemble.getCateId())) {
                            isMatch = true;
                            break;
                        }
                    } else {
                        // 比较绑定
                        if (goods.getId().equals(cardAssemble.getGoodsId())) {
                            isMatch = true;
                            break;
                        }
                    }
                }
                if (!isMatch) {
                    msgBuilder.append(goods.getName() + "不在" + moneyCardUse.getCardName() + "优惠中 ");
                }
            }
            if (msgBuilder.length() > 0) {
                return VerificationResult.fail(msgBuilder.toString());
            } else {
                return VerificationResult.success();
            }
        }
    }
    @Override
    public int add(MoneyCardUse moneyCardUse) {
@@ -218,7 +398,6 @@
    }
    //设置为有效
    @Override
    public void active(MoneyCardUse proj) {
@@ -231,8 +410,7 @@
            }
        }
        moneyCardUseDao.update(proj);
        StringBuilder content = new StringBuilder();
        content.append(proj.getCardName() + "设置有效");
    }
    //设置为失效