935090232@qq.com
2022-03-20 e23c8975e6bb0934cb5db46a94d0f83c9739d9ab
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
@@ -1,27 +1,35 @@
package com.matrix.system.hive.service.imp;
import cn.hutool.core.collection.CollUtil;
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.core.pojo.PaginationVO;
import com.matrix.core.tools.DateUtil;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.app.mapper.SysProjUseMapper;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.dao.SysUsersDao;
import com.matrix.system.common.validate.GroupValidateStatusCheckUtil;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.system.hive.plugin.util.CollectionUtils;
import com.matrix.core.tools.DateUtil;
import com.matrix.system.hive.dto.ProjUseOperationDto;
import com.matrix.system.hive.hievEnum.OrderOperationEnum;
import com.matrix.system.hive.plugin.util.MoneyUtil;
import com.matrix.system.hive.service.ShoppingGoodsService;
import com.matrix.system.hive.service.SysBeauticianStateService;
import com.matrix.system.hive.service.SysProjServicesService;
import com.matrix.system.hive.service.SysProjUseService;
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 javax.xml.crypto.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * @date 2016-07-03 20:53
@@ -31,7 +39,11 @@
    @Autowired
    private SysProjUseDao sysProjUseDao;
    @Autowired
    SysProjServicesService projServicesService;
    @Autowired
    SysBeauticianStateService sysBeauticianStateService;
    @Autowired
    private SysProjuseFreezeDao sysProjuseFreezeDao;
@@ -52,6 +64,14 @@
    @Autowired
    SysVipInfoDao sysVipInfoDao;
    @Autowired
    ShoppingGoodsService shoppingGoodsService;
    @Autowired
    BusParameterSettingsDao busParameterSettingsDao;
    @Autowired
    SysUsersDao sysUsersDao;
    @Override
    public int add(SysProjUse sysProjUse) {
@@ -62,6 +82,8 @@
    @Override
    public int modify(SysProjUse sysProjUse) {
        //插入套餐项目操作记录
        return sysProjUseDao.update(sysProjUse);
@@ -198,24 +220,52 @@
    @Override
    public AjaxResult activeTc(SysProjUse proj) {
        Date newDate = proj.getFailTime();
        Date today = new Date();
        SysProjUse taocan = sysProjUseDao.selectById(proj.getId());
        switch (taocan.getStatus()) {
            case Dictionary.TAOCAN_STATUS_WX:
                // 如果到期,需要重新设置有效期
                if (taocan.getFailTime().before(new Date())) {
                    taocan.setFailTime(DateUtil.getDateAfterMonth(new Date(),12));
                if (newDate != null && !newDate.equals("")) {
                    taocan.setFailTime(newDate);
                    if (newDate.before(today)) {
                        return new AjaxResult(AjaxResult.STATUS_FAIL, "有效期要大于当前日期");
                    }
                }
                if (newDate == null && (taocan.getFailTime() == null || taocan.getFailTime().before(today))) {
                    return new AjaxResult(AjaxResult.STATUS_SUCCESS, "已过期");
                }
                break;
            //TODO 如果是冻结状态则要算出冻结的天数,延长有效期
            case Dictionary.TAOCAN_STATUS_DJ:
                SysProjuseFreeze freeze = new SysProjuseFreeze();
                freeze.setOrderItemId(taocan.getId().toString());
                freeze.setVipId(taocan.getVipId());
                SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze);
                // todo  因为目前没有在冻结的时候插入冻结记录,所以这里暂时这样处理
                if (freezeProj != null) {
                    Date dateAfter = DateUtil.nextNDate(taocan.getFailTime(), freezeProj.getGapDays());
                    taocan.setFailTime(dateAfter);
                }
                break;
            default:
                return new AjaxResult(AjaxResult.STATUS_FAIL, "请选择无效或者冻结的套餐");
        }
        taocan.setStatus(Dictionary.TAOCAN_STATUS_YX);
        sysProjUseDao.updateTcStatus(taocan.getId(),"有效");
        sysProjUseDao.updateProjStatus(taocan);
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(taocan.getProjName());
        useFlow.setProjUseId(taocan.getId());
        useFlow.setOptionType("人工修改");
        useFlow.setRemark("设置为有效状态");
        useFlow.setFailTime(taocan.getFailTime());
        useFlow.setStatus(Dictionary.TAOCAN_STATUS_YX);
        useFlow.setCreateBy(sysUsers.getSuName());
        useFlow.setUpdateBy(sysUsers.getSuName());
        sysProjUseDao.insertFlow(useFlow);
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功");
    }
@@ -243,6 +293,19 @@
            } else {
                i = sysProjuseFreezeDao.insert(freeze);
            }
            SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
            SysProjUseFlow useFlow = new SysProjUseFlow();
            useFlow.setProjName(taocan.getProjName());
            useFlow.setProjUseId(taocan.getId());
            useFlow.setOptionType("人工修改");
            useFlow.setStatus(Dictionary.TAOCAN_STATUS_DJ);
            useFlow.setRemark("冻结项目");
            useFlow.setCreateBy(sysUsers.getSuName());
            useFlow.setUpdateBy(sysUsers.getSuName());
            sysProjUseDao.insertFlow(useFlow);
            return i;
        } else {
            throw new GlobleException("未找到套餐");
@@ -288,73 +351,6 @@
        return money;
    }
    public double getTotalMoney(SysProjUse sysProjUse, MoneyCardUse cardUse, Long moneyCardUseId) {
        List<SysProjUse> list = sysProjUseDao.selectByModel(sysProjUse);
        double money = 0;
        if (CollectionUtils.isEmpty(list)) {
            throw new GlobleException("该套餐没有可退款的项目!");
        }
        //判断套餐是否存在欠款
        SysProjUse projuse = list.get(0);
        checkOrderStatu(projuse);
        if (!(projuse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) {
            throw new GlobleException("不是有效套餐");
        }
        if (projuse.getSource().contains(Dictionary.TAOCAN_SOURCE_ZR)) {
            throw new GlobleException("转让的套餐不能退款");
        }
        if (projuse.getSource().contains(Dictionary.TAOCAN_SOURCE_ZS)) {
            throw new GlobleException("赠送的套餐不能退款");
        }
        //获取会员卡
        cardUse = moneyCardUseDao.selectVipCard(projuse.getVipId());
        String content;
        //如果是套餐卡
        ShoppingGoodsAssemble shoppingGoodsAssemble = shoppingGoodsAssembleDao.selectById(sysProjUse.getAssembleId());
        ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(shoppingGoodsAssemble.getShoppingGoodsId());
        if (Dictionary.SHOPPING_GOODS_TYPE_TCK.equals(projuse.getType())) {
            money = projuse.getBalance();
            //余次使用流水操作
            content = shoppingGoods.getName() + "退款¥" + projuse.getBalance();
        } else {
            for (SysProjUse itemUser : list) {
                Double emoney = MoneyUtil.mul(Double.parseDouble(itemUser.getSurplusCount() + ""), itemUser.getPrice());
                money = MoneyUtil.add(emoney, money);
            }
            //余次使用流水操作
            content = shoppingGoods.getName() + "退款¥" + money;
        }
        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        // 1、金额退到该用户的有效会籍卡中
        System.out.println("==========" + cardUse);
        if (moneyCardUseId != null) {
            if (cardUse == null) {
                content += "到现金。";
            } else {
                //SysOrderItem orderItem = orderItemDao.selectById(cardUse.getOrderItemId());
                StringBuilder contentBuild = new StringBuilder();
                contentBuild.append("到" + cardUse.getCardName())
                        .append(",余次:" + cardUse.getLastCountName())
                        .append(",本金余额:" + MoneyUtil.add(cardUse.getRealMoney(), money))
                        .append(",赠送余额:" + cardUse.getGiftMoney())
                        .append(",有效期:" + DateUtil.dateToString(cardUse.getFailTime(), DateUtil.DATE_FORMAT_MM))
                        .append(",是否赠送:" + cardUse.getSourceName());
                content += contentBuild.toString();
                cardUse.setRealMoney(cardUse.getRealMoney() + money);
                ;
                moneyCardUseDao.update(cardUse);
            }
        } else {
            content += "到现金。";
        }
        return money;
    }
    /**
     * 检测是否存在欠款
@@ -365,11 +361,9 @@
        if (Dictionary.TAOCAN_SOURCE_QY.equals(projuse.getSource())) {
            return;
        }
        if (projuse.getPlatformFlag().contains(Dictionary.SHOPPING_GOODS_SALE_PLATFORM_XX)) {
            SysOrderItem orderItem = orderItemDao.selectById(projuse.getOrderItemId());
            if (!Dictionary.ORDER_STATU_YFK.equals(orderItem.getStatus())) {
                throw new GlobleException("该商品存在欠款!");
            }
        String orderStatus = orderItemDao.selectOrderStatusByItemId(projuse.getOrderItemId());
        if (!Dictionary.ORDER_STATU_YFK.equals(orderStatus)) {
            throw new GlobleException(projuse.getProjName()+"的购买订单存在欠款!");
        }
    }
@@ -386,26 +380,23 @@
                throw new GlobleException("套餐已冻结");
        }
        taocan.setStatus(Dictionary.TAOCAN_STATUS_WX);
        int i = sysProjUseDao.updateTcStatus(sysProjUse.getId(), "无效");
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(taocan.getProjName());
        useFlow.setProjUseId(taocan.getId());
        useFlow.setOptionType("人工修改");
        useFlow.setStatus(Dictionary.TAOCAN_STATUS_WX);
        useFlow.setRemark("设置为无效状态");
        useFlow.setFailTime(taocan.getFailTime());
        useFlow.setCreateBy(sysUsers.getSuName());
        useFlow.setUpdateBy(sysUsers.getSuName());
        sysProjUseDao.insertFlow(useFlow);
        return i;
    }
    /**
     * cardUser暂时没有用到
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int returnMoneyTc(SysProjUse sysProjUse, MoneyCardUse cardUse, Long moneyCardUseId) {
        //充值记录
        //SysRechargeFlow flow=new SysRechargeFlow();
        // 计算出套餐所有项目的剩余次数的钱
        getTotalMoney(sysProjUse, cardUse, moneyCardUseId);
        //3、套餐下的项目状态改为退款
        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK);
        int j = sysProjUseDao.updateProjStatus(sysProjUse);
        return j;
    }
@@ -495,7 +486,7 @@
        SysProjuseFreeze freeze = new SysProjuseFreeze();
        freeze.setFreezeTime(new Date());
        freeze.setVipId(sysProjUse.getVipId());
        freeze.setOrderItemId(sysProjUse.getId()+"");
        freeze.setOrderItemId(sysProjUse.getId() + "");
        SysProjuseFreeze getfreeze = sysProjuseFreezeDao.selectByOrderItemId(freeze);
        int i = 0;
        if (getfreeze != null) {
@@ -504,6 +495,17 @@
        } else {
            i = sysProjuseFreezeDao.insert(freeze);
        }
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(sysProjUse.getProjName());
        useFlow.setProjUseId(sysProjUse.getId());
        useFlow.setOptionType("人工修改");
        useFlow.setStatus(Dictionary.TAOCAN_STATUS_DJ);
        useFlow.setRemark("冻结项目");
        useFlow.setCreateBy(sysUsers.getSuName());
        useFlow.setUpdateBy(sysUsers.getSuName());
        sysProjUseDao.insertFlow(useFlow);
        return i;
    }
@@ -529,56 +531,22 @@
                throw new GlobleException("套餐已冻结");
        }
        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX);
        ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(sysProjUse.getProjId());
        String content = shoppingGoods.getName() + "设置为" + sysProjUse.getStatus();
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(sysProjUse.getProjName());
        useFlow.setProjUseId(sysProjUse.getId());
        useFlow.setOptionType("人工修改");
        useFlow.setStatus(Dictionary.TAOCAN_STATUS_WX);
        useFlow.setRemark("设置为无效状态");
        useFlow.setFailTime(sysProjUse.getFailTime());
        useFlow.setCreateBy(sysUsers.getSuName());
        useFlow.setUpdateBy(sysUsers.getSuName());
        sysProjUseDao.insertFlow(useFlow);
        return sysProjUseDao.update(sysProjUse);
    }
    /**
     * 退款
     *
     * @param sysProjUse
     * @return
     */
    public int returnMoneyProj(SysProjUse sysProjUse, MoneyCardUse cardUse, Long moneyCardUseId) {
        int i = 0;
        sysProjUse = sysProjUseDao.selectById(sysProjUse.getId());
        //判断套餐是否存在欠款
        checkOrderStatu(sysProjUse);
        if (!(sysProjUse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) {
            throw new GlobleException("不是有效项目");
        }
        if (sysProjUse.getSource().equals(Dictionary.TAOCAN_SOURCE_ZR)) {
            throw new GlobleException("转让的项目不能退款");
        }
        if (sysProjUse.getSource().equals(Dictionary.TAOCAN_SOURCE_ZS)) {
            throw new GlobleException("赠送的项目不能退款");
        }
        StringBuilder content = new StringBuilder();
        ShoppingGoodsAssemble shoppingGoodsAssemble = shoppingGoodsAssembleDao.selectById(sysProjUse.getAssembleId());
        ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(shoppingGoodsAssemble.getShoppingGoodsId());
        content.append(shoppingGoods + "退款");
        if (cardUse != null) {
            // 1、金额退到该用户的有效会籍卡中
            MoneyCardUse upCard = moneyCardUseDao.selectById(cardUse.getId());
            upCard.setRealMoney(upCard.getRealMoney() + sysProjUse.getBalance());
            ;
            moneyCardUseDao.update(upCard);
            content.append("到会籍卡(" + upCard.getCardName() + ")" + sysProjUse.getBalance() + "元")
                    .append(",余次:" + upCard.getLastCountName())
                    .append(",本金余额:" + upCard.getRealMoney())
                    .append(",有效期:" + DateUtil.dateToString(upCard.getFailTime(), DateUtil.DATE_FORMAT_MM))
                    .append(",是否赠送:" + upCard.getSourceName());
        } else {
            content.append("现金" + sysProjUse.getBalance() + "元");
        }
        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK);
        return sysProjUseDao.update(sysProjUse);
    }
    /**
     * 设置为有效套餐
@@ -590,8 +558,8 @@
    public AjaxResult activeProj(SysProjUse proj) {
        Date today = new Date();
        Date newDate = proj.getFailTime();
        proj = sysProjUseDao.selectById(proj.getId());
        // TODO 设置项目有效时,需完善该逻辑
        switch (proj.getStatus()) {
            case Dictionary.TAOCAN_STATUS_WX:
                // 如果到期,需要重新设置有效期
@@ -601,45 +569,283 @@
                        return new AjaxResult(AjaxResult.STATUS_FAIL, "有效期要大于当前日期");
                    }
                }
                if (newDate == null || newDate.before(today)) {
                if (newDate == null && (proj.getFailTime() == null || proj.getFailTime().before(today))) {
                    return new AjaxResult(AjaxResult.STATUS_SUCCESS, "已过期");
                }
                break;
            //如果是冻结状态则要算出冻结的天数,延长有效期
            case Dictionary.TAOCAN_STATUS_DJ:
                SysProjuseFreeze freeze = new SysProjuseFreeze();
                freeze.setOrderItemId(proj.getId().toString());
                freeze.setVipId(proj.getVipId());
                SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze);
                Date dateAfter = DateUtil.nextNDate(proj.getFailTime(), freezeProj.getGapDays());
                proj.setFailTime(dateAfter);
                break;
            default:
                return new AjaxResult(AjaxResult.STATUS_FAIL, "请选择无效或者冻结的套餐");
        }
        proj.setStatus(Dictionary.TAOCAN_STATUS_YX);
        sysProjUseDao.update(proj);
        StringBuilder content = new StringBuilder();
        ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(proj.getProjId());
        content.append(shoppingGoods.getName() + "设置为有效")
                .append(",有效期:" + DateUtil.dateToString(proj.getFailTime(), DateUtil.DATE_FORMAT_MM));
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(proj.getProjName());
        useFlow.setProjUseId(proj.getId());
        useFlow.setOptionType("人工修改");
        useFlow.setStatus(Dictionary.TAOCAN_STATUS_YX);
        useFlow.setRemark("设置为有效状态");
        useFlow.setFailTime(proj.getFailTime());
        useFlow.setCreateBy(sysUsers.getSuName());
        useFlow.setUpdateBy(sysUsers.getSuName());
        sysProjUseDao.insertFlow(useFlow);
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功");
    }
    /**
     * 退款项目
     * 项目套餐退款
     * @param projUseDtoList
     */
    @Override
    public double getTotalMoneyProj(SysProjUse sysProjUse) {
        sysProjUse = sysProjUseDao.selectById(sysProjUse.getId());
        //判断套餐是否存在欠款
        checkOrderStatu(sysProjUse);
        if (!(sysProjUse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) {
            throw new GlobleException("不是有效项目");
    public void projectTk(List<ProjUseOperationDto> projUseDtoList) {
        List<ShoppingGoods> shoppingGoodsList = shoppingGoodsDao.selectByIds(projUseDtoList.stream().map(ProjUseOperationDto::getGoodsId).collect(Collectors.toList()));
        Map<Long, ShoppingGoods> shoppingGoodsMap = shoppingGoodsList.stream().collect(Collectors.toMap(ShoppingGoods::getId, Function.identity()));
        projUseDtoList.forEach(projUseOperationDto -> {
            //校验参数
            GroupValidateStatusCheckUtil.check(projUseOperationDto, ProjUseGroup.projectTk.class);
            ShoppingGoods shoppingGoods = shoppingGoodsMap.get(projUseOperationDto.getGoodsId());
            if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(shoppingGoods.getGoodType())) {
                doProjectTk(projUseOperationDto);
            } else if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())) {
                taocanTk(projUseOperationDto);
            }
        });
    }
    /**
     * 套餐退款
     * @param projUseOperationDto
     */
    private void taocanTk(ProjUseOperationDto projUseOperationDto) {
        List<SysProjUse> projUseList = sysProjUseDao.selectByOrderItemId(projUseOperationDto.getOrderItemId());
        List<SysProjUse> tcList = projUseList.stream().filter(item -> Objects.isNull(item.getTaocanId()) && item.getStatus().equals(Dictionary.TAOCAN_STATUS_YX) ).collect(Collectors.toList());
        if (tcList.size() < projUseOperationDto.getCount()) {
            throw new GlobleException("套餐余次不足");
        }
        if (sysProjUse.getSource().equals(Dictionary.TAOCAN_SOURCE_ZR)) {
            throw new GlobleException("转让的项目不能退款");
        projUseOperationDto.setOrderOperationType(OrderOperationEnum.RETURN);
        for (int i = 0; i < projUseOperationDto.getCount(); i++) {
            SysProjUse sysProjUse = tcList.get(i);
            setTaocanTk(sysProjUse,projUseOperationDto);
            //设置套餐下的项目无效
            projUseList.stream().filter(item->Objects.equals(sysProjUse.getId(),item.getTaocanId())).collect(Collectors.toList())
                    .forEach(item-> setTaocanTk(item,projUseOperationDto));
        }
        if (sysProjUse.getSource().contains(Dictionary.TAOCAN_SOURCE_ZS)) {
            throw new GlobleException("赠送的项目不能退款");
    }
    private void setTaocanTk(SysProjUse sysProjUse, ProjUseOperationDto projUseOperationDto) {
        sysProjUse.setIsOver(Dictionary.FLAG_YES_Y);
        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK);
        sysProjUse.setSurplusCount(0);
        sysProjUseDao.update(sysProjUse);
        saveProjUseFlow(projUseOperationDto,sysProjUse);
    }
    /**
     * 项目退款
     * @param projUseOperationDto
     */
    private void doProjectTk(ProjUseOperationDto projUseOperationDto) {
        List<SysProjUse> projUseList = sysProjUseDao.selectByOrderItemId(projUseOperationDto.getOrderItemId());
        if(projUseList.size()==1){
            SysProjUse sysProjUse = projUseList.get(0);
            int sub = sysProjUse.getSurplusCount() - projUseOperationDto.getCount();
            if (sub < 0) {
                throw new GlobleException("项目余次不足");
            } else if (sub == 0) {
                sysProjUse.setIsOver(Dictionary.FLAG_YES_Y);
                sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK);
            }
            sysProjUse.setSurplusCount(sub);
            sysProjUseDao.update(sysProjUse);
            projUseOperationDto.setOrderOperationType(OrderOperationEnum.RETURN);
            //保存操作流水
            saveProjUseFlow(projUseOperationDto,sysProjUse);
        }else{
            throw new GlobleException("查询项目余次异常");
        }
        return sysProjUse.getBalance();
    }
    /**
     * 保存项目操作流水
     * @param projUseOperationDto
     * @param sysProjUse
     */
    private void saveProjUseFlow(ProjUseOperationDto projUseOperationDto, SysProjUse sysProjUse) {
        SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse);
        sysProjUseFlow.setOptionType(projUseOperationDto.getOrderOperationType().getDisplayName());
        SysUsers user = sysUsersDao.selectById(projUseOperationDto.getUpdateUserId());
        sysProjUseFlow.setUpdateBy(user.getSuName());
        sysProjUseFlow.setCreateBy(user.getSuName());
        sysProjUseDao.insertFlow(sysProjUseFlow);
    }
    /**
     * 添加用户套餐
     *
     * @param projUseDtoList
     * @return
     */
    @Override
    public void addUserProjUse(List<ProjUseOperationDto> projUseDtoList) {
        if(CollUtil.isEmpty(projUseDtoList)){
            throw new GlobleException("projUseDtoList 不能为空");
        }
        List<ShoppingGoods> shoppingGoodsList = shoppingGoodsDao.selectByIds(projUseDtoList.stream().map(ProjUseOperationDto::getGoodsId).collect(Collectors.toList()));
        Map<Long, ShoppingGoods> shoppingGoodsMap = shoppingGoodsList.stream().collect(Collectors.toMap(ShoppingGoods::getId, Function.identity()));
        for (ProjUseOperationDto projUseOperationDto : projUseDtoList) {
            ShoppingGoods shoppingGoods = shoppingGoodsMap.get(projUseOperationDto.getGoodsId());
            if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(shoppingGoods.getGoodType())) {
                createProjectUse(projUseOperationDto, shoppingGoods);
            } else if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())) {
                //每个套餐独立生成一个明细
                int orderCount = projUseOperationDto.getCount();
                while (orderCount > 0) {
                    createTaocanProjUse(projUseOperationDto, shoppingGoods);
                    orderCount--;
                }
            }
        }
    }
    private void createTaocanProjUse(ProjUseOperationDto projUseOperationDto, ShoppingGoods shoppingGoods) {
        GroupValidateStatusCheckUtil.check(projUseOperationDto,ProjUseGroup.addTc.class);
        //新建套餐
        SysProjUse taocanProjUse = new SysProjUse();
        ShoppingGoods taocanShoppingGoods = shoppingGoods;
        Long projId = shoppingGoods.getId();
        taocanProjUse.setProjId(projId);
        taocanProjUse.setIsOver(Dictionary.DELETED_N);
        taocanProjUse.setOrderItemId(projUseOperationDto.getOrderItemId());
        taocanProjUse.setProjName(taocanShoppingGoods.getName());
        taocanProjUse.setVipId(projUseOperationDto.getVipId());
        taocanProjUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
        taocanProjUse.setType(Dictionary.SHOPPING_GOODS_TYPE_TC);
        taocanProjUse.setIsCourse(taocanShoppingGoods.getIsCourse());
        taocanProjUse.setIsInfinite(taocanShoppingGoods.getIsInfinite());
        // 赠送和打折后金额为0的都视为赠送项目
        if (projUseOperationDto.isFree()) {
            taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
        } else {
            taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
        }
        // 失效时间
        Date invalidTime = shoppingGoodsService.calInvalidTime(taocanShoppingGoods, 1, null);
        taocanProjUse.setFailTime(invalidTime);
        sysProjUseDao.insert(taocanProjUse);
        //计划次数
        int surplusCount = 0;
        //总余额
        Double sumBanance = 0D;
        //创建套餐绑定的项目
        List<ShoppingGoodsAssemble> assembleList = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(projId, ShoppingGoods.SHOPPING_GOODS_TYPE_XM);
        for (ShoppingGoodsAssemble assemble : assembleList) {
            ProjUseOperationDto projUseDto = new ProjUseOperationDto();
            projUseDto.setCount(assemble.getTotal());
            projUseDto.setGoodsId(assemble.getShoppingGoodsId());
            projUseDto.setFree(projUseOperationDto.isFree());
            projUseDto.setPayMoney(MoneyUtil.mul(assemble.getPrice(), projUseOperationDto.getTcZk()));
            projUseDto.setOrderItemId(projUseOperationDto.getOrderItemId());
            projUseDto.setVipId(projUseOperationDto.getVipId());
            projUseDto.setTcId(taocanProjUse.getId());
            projUseDto.setUpdateUserId(projUseOperationDto.getUpdateUserId());
            SysProjUse tempUse = createProjectUse(projUseDto, assemble.getShoppingGoods());
            sumBanance += tempUse.getBalance();
            surplusCount += tempUse.getSurplusCount();
        }
        if (Dictionary.FLAG_NO_N.equals(taocanShoppingGoods.getIsCourse())) {
            //固定套餐,剩余次数等于绑定项目的次数
            taocanProjUse.setSurplusCount(surplusCount);
            //合计套餐余额
            taocanProjUse.setBalance(sumBanance);
        } else {
            //任选套餐剩余次数等于最大使用次数
            taocanProjUse.setSurplusCount(taocanShoppingGoods.getCarUseCount());
            taocanProjUse.setBalance(projUseOperationDto.getPayMoney());
        }
        sysProjUseDao.update(taocanProjUse);
    }
    private SysProjUse createProjectUse(ProjUseOperationDto projUseOperationDto, ShoppingGoods shoppingGoods) {
        GroupValidateStatusCheckUtil.check(projUseOperationDto,ProjUseGroup.addProject.class);
        SysProjUse puse = new SysProjUse();
        puse.setIsOver(Dictionary.DELETED_N);
        puse.setOrderItemId(projUseOperationDto.getOrderItemId());
        puse.setProjId(projUseOperationDto.getGoodsId());
        puse.setSurplusCount(projUseOperationDto.getCount());
        puse.setVipId(projUseOperationDto.getVipId());
        puse.setStatus(Dictionary.TAOCAN_STATUS_YX);
        puse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM);
        puse.setProjName(shoppingGoods.getName());
        puse.setTaocanId(projUseOperationDto.getTcId());
        // 赠送和打折后金额为0的都视为赠送项目
        if (!projUseOperationDto.isFree()) {
            puse.setSource(Dictionary.TAOCAN_SOURCE_GM);
            puse.setPrice(projUseOperationDto.getPayMoney());
        } else {
            puse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
            //赠送项目是否计算消耗业绩否则 赠送产品按原价计算消耗
            boolean zsConsumeAchieve = projServicesService.skipServiceOrderStep(Dictionary.ZS_CONSUME_ACHIEVE);
            if (zsConsumeAchieve) {
                //赠送情况下,如果收款金额大于0,就是赠送金额划扣的情况,金额即为划扣的折扣金额
                if (projUseOperationDto.getPayMoney() > 0) {
                    puse.setPrice(projUseOperationDto.getPayMoney());
                } else {
                    puse.setPrice(shoppingGoods.getSealPice());
                }
            } else {
                puse.setPrice(0D);
            }
        }
        // 设置失效时间
        Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null);
        puse.setFailTime(invalidTime);
        puse.setBalance(puse.getPrice() * puse.getSurplusCount());
        sysProjUseDao.insert(puse);
        return puse;
    }
@@ -649,9 +855,37 @@
    }
    @Override
    public List<SysProjUse> selectTaocanProjUse(Long taocanId) {
    public List<SysProjUse> selectTaocanProjUse(Long taocanId, String status) {
        SysProjUse projUse = new SysProjUse();
        projUse.setTaocanId(taocanId);
        projUse.setStatus(status);
        return sysProjUseDao.selectByModel(projUse);
    }
    @Override
    public List<SysProjUse> findTaocaoProjUseWithProj(SysProjUse sysProjUse) {
        return sysProjUseDao.selectTaoCanListWithProj(sysProjUse);
    }
    @Override
    public int findTaocanCountForCourseAndInfinite(Long taocanId, Long vipId) {
        return sysProjUseDao.selectTaocanCountForCourseAndInfinite(taocanId, vipId);
    }
    @Override
    public void deleteByOrderItemId(Long id) {
        int count=sysProjUseDao.selectUseCountByOrderItemId(id);
        if(count>0){
            SysProjUse query=new SysProjUse();
            query.setOrderItemId(id);
            List<SysProjUse> sysProjUses = sysProjUseDao.selectByModel(query);
            if(sysProjUses.size()>1){
                throw new GlobleException(sysProjUses.get(0).getProjName()+"套餐已经被使用无法删除");
            }else {
                throw new GlobleException(sysProjUses.get(0).getProjName()+"项目已经被使用无法删除");
            }
        }else {
            sysProjUseDao.deleteByOrderItemId(id);
        }
    }
}