JiangYouYao
2022-03-18 e1ff283be2a6ca6ed8cead6248b4efa8eb005f6e
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
@@ -1,5 +1,6 @@
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;
@@ -7,11 +8,18 @@
import com.matrix.core.tools.DateUtil;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.validate.ParameterValidate;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.system.hive.dto.ProjUseOperationDto;
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;
@@ -19,6 +27,9 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * @date 2016-07-03 20:53
@@ -28,7 +39,11 @@
    @Autowired
    private SysProjUseDao sysProjUseDao;
    @Autowired
    SysProjServicesService projServicesService;
    @Autowired
    SysBeauticianStateService sysBeauticianStateService;
    @Autowired
    private SysProjuseFreezeDao sysProjuseFreezeDao;
@@ -49,6 +64,11 @@
    @Autowired
    SysVipInfoDao sysVipInfoDao;
    @Autowired
    ShoppingGoodsService shoppingGoodsService;
    @Autowired
    BusParameterSettingsDao busParameterSettingsDao;
    @Override
    public int add(SysProjUse sysProjUse) {
@@ -60,7 +80,6 @@
    @Override
    public int modify(SysProjUse sysProjUse) {
        //插入套餐项目操作记录
        return sysProjUseDao.update(sysProjUse);
@@ -221,7 +240,7 @@
                freeze.setVipId(taocan.getVipId());
                SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze);
                // todo  因为目前没有在冻结的时候插入冻结记录,所以这里暂时这样处理
                if(freezeProj!=null){
                if (freezeProj != null) {
                    Date dateAfter = DateUtil.nextNDate(taocan.getFailTime(), freezeProj.getGapDays());
                    taocan.setFailTime(dateAfter);
                }
@@ -232,7 +251,7 @@
        taocan.setStatus(Dictionary.TAOCAN_STATUS_YX);
        sysProjUseDao.updateProjStatus(taocan);
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(taocan.getProjName());
        useFlow.setProjUseId(taocan.getId());
        useFlow.setOptionType("人工修改");
@@ -273,7 +292,7 @@
            }
            SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
            SysProjUseFlow useFlow=new SysProjUseFlow();
            SysProjUseFlow useFlow = new SysProjUseFlow();
            useFlow.setProjName(taocan.getProjName());
            useFlow.setProjUseId(taocan.getId());
            useFlow.setOptionType("人工修改");
@@ -364,7 +383,7 @@
        int i = sysProjUseDao.updateTcStatus(sysProjUse.getId(), "无效");
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(taocan.getProjName());
        useFlow.setProjUseId(taocan.getId());
        useFlow.setOptionType("人工修改");
@@ -378,8 +397,6 @@
        return i;
    }
    /*********************以下为项目使用情况操作***********************/
@@ -468,7 +485,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) {
@@ -478,7 +495,7 @@
            i = sysProjuseFreezeDao.insert(freeze);
        }
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(sysProjUse.getProjName());
        useFlow.setProjUseId(sysProjUse.getId());
        useFlow.setOptionType("人工修改");
@@ -515,7 +532,7 @@
        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX);
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(sysProjUse.getProjName());
        useFlow.setProjUseId(sysProjUse.getId());
        useFlow.setOptionType("人工修改");
@@ -528,8 +545,6 @@
        sysProjUseDao.insertFlow(useFlow);
        return sysProjUseDao.update(sysProjUse);
    }
    /**
@@ -574,7 +589,7 @@
        sysProjUseDao.update(proj);
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(proj.getProjName());
        useFlow.setProjUseId(proj.getId());
        useFlow.setOptionType("人工修改");
@@ -589,6 +604,151 @@
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功");
    }
    /**
     * 添加用户套餐
     *
     * @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) {
        ParameterValidate.ValidResult baseIdResult = ParameterValidate.validateBean(projUseOperationDto, ProjUseGroup.addTc.class);
        if (baseIdResult.hasErrors()) {
            throw new GlobleException(baseIdResult.getErrors());
        }
        //新建套餐
        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());
            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) {
        ParameterValidate.ValidResult baseIdResult = ParameterValidate.validateBean(projUseOperationDto, ProjUseGroup.addProject.class);
        if (baseIdResult.hasErrors()) {
            throw new GlobleException(baseIdResult.getErrors());
        }
        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;
    }
    @Override
@@ -613,4 +773,21 @@
    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);
        }
    }
}