package com.yunyan.business.document.y23.budget;

import cn.hutool.core.util.NumberUtil;
import com.yunyan.business.document.utils.ReadExcelUtil;
import com.yunyan.business.document.y22.ReadFinalExcelY22Utils;
import com.yunyan.business.document.y22.pojo.finalExcelY22.*;
import com.yunyan.business.document.y23.budget.pojo.budgetY23.*;
import com.yunyan.business.document.y23.budget.pojo.budgetY23.purchase.BudgetP3p10p2ItemVo;
import com.yunyan.business.document.y23.budget.pojo.budgetY23.table.BudgetP2p1ItemVo;
import com.yunyan.business.document.y23.budget.pojo.budgetY23.update.*;
import com.yunyan.business.domain.CourseCode;
import com.yunyan.common.core.domain.entity.SysDept;
import com.yunyan.common.exception.ServiceException;
import com.yunyan.common.utils.NumberFormatUtils;
import com.yunyan.common.utils.StringUtils;
import com.yunyan.common.utils.bean.BeanUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 更新 预算 填报的信息以及 对比去年的数据
 */
@Slf4j
public class UpdateReportBudgetData {


    /**
     * 更新 填报的信息
     * @param dataVo
     * @param updateVo
     */
    public static void updateFillData(BudgetExplainP3Vo dataVo, UpdateBudgetP3Vo updateVo) {

        //更新 p3p1
        updateP3p1(dataVo.getP3p1Vo(), updateVo.getP3p1Vo());

        //更新 p3p2
        updateP3p2(dataVo.getP3p2Vo(), updateVo.getP3p2Vo());

        //更新 p3p3
        updateP3p3(dataVo.getP3p3Vo(), updateVo.getP3p3Vo());

        //更新 p3p4
        updateP3p4(dataVo.getP3p4Vo(), updateVo.getP3p4Vo());

        //更新 p3p5
        updateP3p5(dataVo.getP3p5Vo(), updateVo.getP3p5Vo());

        //更新 p3p6
        updateP3p6(dataVo.getP3p6Vo(), updateVo.getP3p6Vo());

        //更新 p3p7
        updateP3p7(dataVo.getP3p7Vo().getP2Vo(), updateVo.getP3p7Vo().getP2Vo());

        //更新 p3p8
        updateP3p8(dataVo.getP3p8Vo(), updateVo.getP3p8Vo());
        //更新 p3p9
        updateP3p8(dataVo.getP3p9Vo(), updateVo.getP3p9Vo());

        //更新 p3p10
        updateP3p10(dataVo.getP3p10Vo(), updateVo.getP3p10Vo());

    }

    /**
     * 更新 p3p1 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p1(BudgetP3p1Vo dataVo, UpdateBudgetP3p1Vo updateVo) {
        dataVo.setReasonIn(updateVo.getReasonIn());
        dataVo.setReasonExpenditure(updateVo.getReasonExpenditure());
    }

    /**
     * 更新 p3p2 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p2(BudgetP3p2Vo dataVo, UpdateBudgetP3p2Vo updateVo) {
        dataVo.setReason(updateVo.getReason());
    }

    /**
     * 更新 p3p3 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p3(BudgetP3p3Vo dataVo, UpdateBudgetP3p3Vo updateVo) {
        if(null == updateVo) {
            throw new ServiceException("第3部分还未传值, 请稍后再试~");
        }
        updateP3p3ListItem(dataVo.getFuncList(), updateVo.getFuncList());
        updateP3p3ListItem(dataVo.getBaseList(), updateVo.getBaseList());
        updateP3p3ListItem(dataVo.getProjectList(), updateVo.getProjectList());
        //更新 原因
        dataVo.setReason(updateVo.getReason());
    }

    /**
     * 更新 p3p3的 item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3p3ListItem(List<BudgetP3p3ItemVo> list, List<UpdateBudgetP3p3ItemVo> updateList) {
        if(list.isEmpty()) {
            log.error("修改时, 第三部分的第3点的 list为空");
            return;
        }

        if(null == updateList) {
            return;
            //第三部分已修改
            //throw new ServiceException("第3部分的项还未传值, 请稍后再试~");
        }

        if(list.size() != updateList.size()) {
            log.error("第三大部分的 第3点的修改数据集合大小不一致, 请联系管理员~");
            throw new ServiceException("第三大部分的 第3点的修改数据集合大小不一致, 请联系管理员~");
        }

        int index = 0;
        for (BudgetP3p3ItemVo item : list) {
            if(updateList.size() > index ) {
                item.setReason(updateList.get(index).getReason());
            }
            index++;
        }
    }

    /**
     * 更新 p3p4 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p4(BudgetP3p4Vo dataVo, UpdateBudgetP3p4Vo updateVo) {
        dataVo.getIncomeVo().setReason(updateVo.getIncomeVo().getReason());
        dataVo.getExpenditureVo().setReason(updateVo.getExpenditureVo().getReason());
    }

    /**
     * 更新 p3p5 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p5(BudgetP3p5Vo dataVo, UpdateBudgetP3p5Vo updateVo) {
        updateP3p5ListItem(dataVo.getList(), updateVo.getList());
    }

    /**
     * 更新 p3p5的 item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3p5ListItem(List<BudgetP3p5ItemVo> list, List<UpdateBudgetP3p5ItemVo> updateList) {
        if(list.isEmpty()) {
            log.error("修改时, 第三部分的第5点的 list为空");
            return;
        }

        if(list.size() != updateList.size()) {
            log.error("第三大部分的 第3点的修改数据集合大小不一致, 请联系管理员~");
            throw new ServiceException("第三大部分的 第5点的修改数据集合大小不一致, 请联系管理员~");
        }

        int index = 0;
        for (BudgetP3p5ItemVo item : list) {
            if(updateList.size() > index ) {
                item.setReason(updateList.get(index).getReason());
                item.setUsage(updateList.get(index).getUsage());
                item.setUsageBase(updateList.get(index).getUsageBase());
                item.setUsageProject(updateList.get(index).getUsageProject());
            }
            index++;
        }
    }

    /**
     * 更新 p3p6 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p6(BudgetP3p6Vo dataVo, UpdateBudgetP3p6Vo updateVo) {
        updateP3p6ListItem(dataVo.getPersonVo().getList(), updateVo.getPersonVo().getList());
        updateP3p6ListItem(dataVo.getPublicVo().getList(), updateVo.getPublicVo().getList());
    }

    /**
     * 更新 p3p6的 item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3p6ListItem(List<BudgetP3p6ItemVo> list, List<UpdateBudgetP3p6ItemVo> updateList) {
        if(list.isEmpty()) {
            log.error("修改时, 第三部分的第六点的 list为空");
            return;
        }

        if(list.size() != updateList.size()) {
            log.error("第三大部分的 第六点的修改数据集合大小不一致, 请联系管理员~");
            throw new ServiceException("第三大部分的 第六点的修改数据集合大小不一致, 请联系管理员~");
        }

        int index = 0;
        for (BudgetP3p6ItemVo item : list) {
            if(updateList.size() > index ) {
                item.setReason(updateList.get(index).getReason());
            }
            index++;
        }
    }

    /**
     * 更新 p3p7 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p7(BudgetP3p7PartVo dataVo, UpdateBudgetP3p7PartVo updateVo) {
        dataVo.setReason(updateVo.getReason());
        updateP3p7Item(dataVo.getAbroadVo(), updateVo.getAbroadVo());
        updateP3p7Item(dataVo.getReceptionVo(), updateVo.getReceptionVo());
        updateP3p7Item(dataVo.getCarVo(), updateVo.getCarVo());
        updateP3p7Item(dataVo.getCarOperateVo(), updateVo.getCarOperateVo());
        updateP3p7Item(dataVo.getCarBuyVo(), updateVo.getCarBuyVo());
    }

    /**
     * 更新 p3p7的 item 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p7Item(BudgetP3p7PartItemVo dataVo, UpdateBudgetP3p7PartItemVo updateVo) {
        dataVo.setReason(updateVo.getReason());
        dataVo.setUsage(updateVo.getUsage());
    }

    /**
     * 更新 p3p8 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p8(BudgetP3p8Vo dataVo, UpdateBudgetP3p8Vo updateVo) {
        if(null == updateVo) {
            return;
        }
        dataVo.setReason(updateVo.getReason());
        dataVo.setUsage(updateVo.getUsage());
        updateP3p8ListItem(dataVo.getList(), updateVo.getList());
    }

    /**
     * 更新 p3p8的 item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3p8ListItem(List<BudgetP3p8ItemVo> list, List<UpdateBudgetP3p8ItemVo> updateList) {
        if(list.isEmpty()) {
            log.error("修改时, 第三部分的第8点的 list为空");
            return;
        }

        if(list.size() != updateList.size()) {
            log.error("第三大部分的 第8点的修改数据集合大小不一致, 请联系管理员~");
            throw new ServiceException("第三大部分的 第8点的修改数据集合大小不一致, 请联系管理员~");
        }

        int index = 0;
        for (BudgetP3p8ItemVo item : list) {
            if(updateList.size() > index ) {
                item.setReason(updateList.get(index).getReason());
                item.setUsage(updateList.get(index).getUsage());
            }
            index++;
        }
    }

    /**
     * 更新 p3p10 部分
     * @param dataVo
     * @param updateVo
     */
    private static void updateP3p10(BudgetP3p10Vo dataVo, UpdateBudgetP3p10Vo updateVo) {
        if(null == updateVo) {
            return;
        }

        //设置单位属性和下级单位属性的
        Integer deptAttr = dataVo.getP1Vo().getDeptAttr();
        Integer deptAttrChild = dataVo.getP1Vo().getDeptAttrChild();

        //记录原 t3vo
        BudgetP3p10p3T3Vo t3Vo = dataVo.getP3Vo().getT3Vo();
        BudgetP3p10p4Tp4Vo p3p10p4Tp4Vo = dataVo.getP4Tp4Vo();

        //更新 p3p10p1Tp4 模板类型4
        BudgetP3p10p1ItemVo p3p10p1ItemVo = dataVo.getP1Vo().getOperationItemVoTp4();
        if(null != p3p10p1ItemVo && null != updateVo.getP1Vo().getOperationItemVoTp4()) {
            p3p10p1ItemVo.setReason(updateVo.getP1Vo().getOperationItemVoTp4().getReason());
            p3p10p1ItemVo.setUsage(updateVo.getP1Vo().getOperationItemVoTp4().getUsage());
        }


        //不更新整个, 只更新原因, 模板一时
        //BudgetP3p10p1Vo p3p10p1Vo = dataVo.getP1Vo();
        //更新原因
        //p3p10p1Vo.getOperationItemVo().setReason(updateVo.getP1Vo().getOperationItemVo().getReason());
        //p3p10p1Vo.getOperationItemVo2().setReason(updateVo.getP1Vo().getOperationItemVo2().getReason());

        String p3p10P4FileUrl = dataVo.getP4Vo().getF1();
        BeanUtils.copyProperties(updateVo, dataVo);
        dataVo.getP4Vo().setF1(p3p10P4FileUrl);

        dataVo.getP1Vo().setDeptAttr(deptAttr);
        dataVo.getP1Vo().setDeptAttrChild(deptAttrChild);
        //dataVo.setP1Vo(p3p10p1Vo);

        //如果是 提交的 t3Vo为 null
        if(null == updateVo.getP3Vo().getT3Vo()) {
            dataVo.getP3Vo().setT3Vo(t3Vo);
        }
        if(null == updateVo.getP4Tp4Vo()) {
            dataVo.setP4Tp4Vo(p3p10p4Tp4Vo);
        }

        dataVo.getP1Vo().setOperationItemVoTp4(p3p10p1ItemVo);


    }

    /**
     * 预算 初始化设置 去年的数据
     * @param dataVo
     */
    public static void initLastValue(BudgetExplainP3Vo dataVo) {

        //p3p1 的初始化 去年
        setP3p1Last(dataVo.getP3p1Vo(), null, true);

        //p3p2 的初始化 去年
        setP3p2Last(dataVo.getP3p2Vo(), null, true);

        //p3p3 的初始化 去年
        setP3p3Last(dataVo.getP3p3Vo(), null, true);

    }

    /**
     * 预算 初始化数据
     * @param dataVo
     */
    public static void initValue(BudgetExplainP3Vo dataVo) {

        //初始化 p3p4
        initP3p4(dataVo);

        //初始化 p3p5 的 list
        initP3p5ListShowType(dataVo);

        //初始化 p3p6
        initP3p6(dataVo);

        //初始化 p3p7
        initP3p7(dataVo);

        //初始化 p3p10
        initP3p10(dataVo);
    }

    /**
     * 预算 设置 去年的数据, data
     * @param dataVo
     * @param dataLastVo 去年的数据, null时为初始化
     */
    public static void setLastValue(BudgetExplainP3Vo dataVo, BudgetExplainP3Vo dataLastVo) {
        //是否是初始化, 当传 null时, 为初始化
        boolean initFlag = false;
        if(null == dataLastVo) {
            initFlag = true;
        }

        //p3p1 设置 去年
        setP3p1Last(dataVo.getP3p1Vo(), null != dataLastVo ? dataLastVo.getP3p1Vo() : null, initFlag);

        //p3p2 设置 去年
        setP3p2Last(dataVo.getP3p2Vo(), null != dataLastVo ? dataLastVo.getP3p2Vo() : null, initFlag);

        //p3p3 设置 去年
        setP3p3Last(dataVo.getP3p3Vo(), null != dataLastVo ? dataLastVo.getP3p3Vo() : null, initFlag);

        //p3p4 设置 去年
        setP3p4Last(dataVo.getP3p4Vo(), null != dataLastVo ? dataLastVo.getP3p4Vo() : null, initFlag);

        //p3p5 设置 去年
        setP3p5Last(dataVo.getP3p5Vo(), null != dataLastVo ? dataLastVo.getP3p5Vo() : null, initFlag);

        //p3p6 设置 去年
        setP3p6Last(dataVo.getP3p6Vo(), null != dataLastVo ? dataLastVo.getP3p6Vo() : null, initFlag);

        //p3p7 设置 去年
        setP3p7Last(dataVo.getP3p7Vo(), null != dataLastVo ? dataLastVo.getP3p7Vo() : null, initFlag);

        //p3p8 设置 去年
        setP3p8Last(dataVo.getP3p8Vo(), null != dataLastVo ? dataLastVo.getP3p8Vo() : null, initFlag);

        //p3p9 设置 去年
        setP3p8Last(dataVo.getP3p9Vo(), null != dataLastVo ? dataLastVo.getP3p9Vo() : null, initFlag);
        //setP3p9Last(dataVo.getP3p9Vo(), dataLastVo.getP3p9Vo(), initFlag);

    }

    /**
     * p3p1 设置 去年的数据 初始化
     * @param dataVo
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    private static void setP3p1Last(BudgetP3p1Vo dataVo, BudgetP3p1Vo dataLastVo, boolean initFlag) {

        String totalLastIn = initFlag ? "0" : dataLastVo.getTotalIn();
        String totalLastExpenditure = initFlag ? "0" : dataLastVo.getTotalExpenditure();

        //收入
        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotalIn());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLastIn);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);

        dataVo.setTotalLastIn(totalLastIn);
        //设置更新数据 收入
        dataVo.setChangeAmountWordIn(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmountIn(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWordIn(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatioIn(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal));

        //支出
        //格式化的数值去掉 逗号
        BigDecimal totalValue2 = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotalExpenditure());
        BigDecimal totalValueLast2 = ReadExcelUtil.toBigDecimalByStr(totalLastIn);
        //本年- 去年 数值变化
        BigDecimal subNumTotal2 = NumberUtil.sub(totalValue2, totalValueLast2);

        dataVo.setTotalLastExpenditure(totalLastExpenditure);
        //设置更新数据 支出
        dataVo.setChangeAmountWordExpenditure(ReadExcelUtil.getChangeValueWord(subNumTotal2));
        dataVo.setChangeAmountExpenditure(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal2.abs()));
        dataVo.setChangeRatioWordExpenditure(ReadExcelUtil.getChangeRatioWord(subNumTotal2));
        dataVo.setChangeRatioExpenditure(ReadExcelUtil.getChangeRatioValue(totalValueLast2, subNumTotal2));
    }

    /**
     * p3p2 设置 去年的数据
     * @param dataVo 本年数据
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    private static void setP3p2Last(BudgetP3p2Vo dataVo, BudgetP3p2Vo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNum = NumberUtil.sub(totalValue, totalValueLast);

        dataVo.setTotalLast(totalLast);
        //设置更新数据 收入
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNum));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNum.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNum));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNum.abs()));

        //设置项
        setP3p2LastItem(dataVo, dataLastVo, initFlag);
    }

    private static void setP3p2LastItem(BudgetP3p2Vo dataVo, BudgetP3p2Vo dataLastVo, boolean initFlag) {
        BigDecimal totalAllValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());

        for (BudgetP3p2ItemVo itemVo : dataVo.getList() ) {
            String totalLast = "0";
            String total = itemVo.getTotal();
            if(!initFlag) {
                BudgetP3p2ItemVo itemLastVo = dataLastVo.getList().stream().filter(i->i.getName().equals(itemVo.getName())).findFirst().orElse(null);
                if(null != itemLastVo) {
                    totalLast = itemLastVo.getTotal();
                }
            }


            //格式化的数值去掉 逗号
            BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(total);
            BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
            //本年- 去年 数值变化
            BigDecimal subNum = NumberUtil.sub(totalValue, totalValueLast);


            itemVo.setTotalLast(totalLast);
            //设置更新数据 收入
            itemVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNum));
            itemVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNum.abs()));
            itemVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNum));
            itemVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNum.abs()));
            itemVo.setRatio(ReadExcelUtil.getChangeRatioValue(totalAllValue, totalValue));

        }

    }

    /**
     * p3p3 设置 去年的数据
     * @param dataVo 本年数据
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    private static void setP3p3Last(BudgetP3p3Vo dataVo, BudgetP3p3Vo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();
        String baseLast = initFlag ? "0" : dataLastVo.getBase();
        String projectLast = initFlag ? "0" : dataLastVo.getProject();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);

        BigDecimal baseValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getBase());
        BigDecimal baseValueLast = ReadExcelUtil.toBigDecimalByStr(baseLast);
        //本年- 去年 数值变化
        BigDecimal subNumBase = NumberUtil.sub(baseValue, baseValueLast);

        BigDecimal projectValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getProject());
        BigDecimal projectValueLast = ReadExcelUtil.toBigDecimalByStr(projectLast);
        //本年- 去年 数值变化
        BigDecimal subNumProject = NumberUtil.sub(projectValue, projectValueLast);


        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);
        dataVo.setBaseLast(baseLast);
        dataVo.setProjectLast(projectLast);

        //总体 设置 占比
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal));

        //基本 设置 占比
        dataVo.setRatioBase(ReadExcelUtil.getChangeRatioValue(totalValue, baseValue));
        dataVo.setChangeAmountWordBase(ReadExcelUtil.getChangeValueWord(subNumBase));
        dataVo.setChangeAmountBase(NumberFormatUtils.addThousandSeparatorForInteger(subNumBase.abs()));
        dataVo.setChangeRatioWordBase(ReadExcelUtil.getChangeRatioWord(subNumBase));
        dataVo.setChangeRatioBase(ReadExcelUtil.getChangeRatioValue(baseValueLast, subNumBase.abs()));

        //项目 设置 占比
        dataVo.setRatioProject(ReadExcelUtil.getChangeRatioValue(totalValue, projectValue));
        dataVo.setChangeAmountWordProject(ReadExcelUtil.getChangeValueWord(subNumProject));
        dataVo.setChangeAmountProject(NumberFormatUtils.addThousandSeparatorForInteger(subNumProject.abs()));
        dataVo.setChangeRatioWordProject(ReadExcelUtil.getChangeRatioWord(subNumProject));
        dataVo.setChangeRatioProject(ReadExcelUtil.getChangeRatioValue(projectValueLast, subNumProject));

        //设置项 functionList
        setP3p3LastItem(dataVo.getTotal(), dataVo.getFuncList(), null != dataLastVo ? dataLastVo.getFuncList() : null, initFlag);
        //设置项 基本
        setP3p3LastItem(dataVo.getBase(), dataVo.getBaseList(), null != dataLastVo ? dataLastVo.getBaseList() : null, initFlag);
    }

    /**
     * 设置  p3的项 去年的初始化
     * @param totalAll 不同的占比 , 传不同的 totalAll
     * @param list
     * @param listLast
     * @param initFlag
     */
    private static void setP3p3LastItem(String totalAll, List<BudgetP3p3ItemVo> list, List<BudgetP3p3ItemVo> listLast, boolean initFlag) {
        BigDecimal totalAllValue = ReadExcelUtil.toBigDecimalByStr(totalAll);

        for (BudgetP3p3ItemVo itemVo : list ) {
            String totalLast = "0";
            String total = itemVo.getTotal();
            if(!initFlag) {
                //TODO 注意: 是否会要名称同名的
                BudgetP3p3ItemVo itemLastVo = listLast.stream().filter(i->i.getName().equals(itemVo.getName())).findFirst().orElse(null);
                if(null != itemLastVo) {
                    totalLast = itemLastVo.getTotal();
                }
            }

            //格式化的数值去掉 逗号
            BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(total);
            BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
            BigDecimal subNum = NumberUtil.sub(totalValue, totalValueLast);

            itemVo.setTotalLast(totalLast);
            //设置更新数据 收入
            itemVo.setRatio(ReadExcelUtil.getChangeRatioValue(totalAllValue, totalValue));
            itemVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNum));
            itemVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNum.abs()));
            itemVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNum));
            itemVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNum.abs()));
        }
    }

    /**
     * p3p4 设置 去年的数据
     * @param dataVo 本年数据
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    private static void setP3p4Last(BudgetP3p4Vo dataVo, BudgetP3p4Vo dataLastVo, boolean initFlag) {

        //收入
        setP3p4LastSubItem(dataVo.getIncomeVo(), null != dataLastVo ? dataLastVo.getIncomeVo() : null, initFlag);

        //支出
        setP3p4LastSubItem(dataVo.getExpenditureVo(), null != dataLastVo ? dataLastVo.getExpenditureVo() : null, initFlag);
    }

    /**
     * 设置 p3p4的 收入/支出的
     * @param dataVo
     * @param dataLastVo
     * @param initFlag
     */
    private static void setP3p4LastSubItem(BudgetP3p4SubItemVo dataVo, BudgetP3p4SubItemVo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);


        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //基本 设置 占比
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal.abs()));
    }

    /**
     * p3p5 设置 去年的数据
     * @param dataVo 本年数据
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    private static void setP3p5Last(BudgetP3p5Vo dataVo, BudgetP3p5Vo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();
        String baseLast = initFlag ? "0" : dataLastVo.getBase();
        String projectLast = initFlag ? "0" : dataLastVo.getProject();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);

        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //总收入 设置 占比
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal.abs()));

        //设置项
        setP3p5LastItem(dataVo, null != dataLastVo ? dataLastVo.getList() : null, initFlag);
    }

    /**
     * 设置  p3p5的项 去年的初始化
     * @param dataVo
     * @param listLast
     * @param initFlag
     */
    private static void setP3p5LastItem(BudgetP3p5Vo dataVo, List<BudgetP3p5ItemVo> listLast, boolean initFlag) {
        BigDecimal totalAllValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());

        for (BudgetP3p5ItemVo itemVo : dataVo.getList() ) {
            String totalLast = "0";
            String total = itemVo.getTotal();
            if(!initFlag) {
                BudgetP3p5ItemVo itemLastVo = listLast.stream().filter(i-> i.getCode1().equals(itemVo.getCode1()) && i.getCode2().equals(itemVo.getCode2()) && i.getCode3().equals(itemVo.getCode3()))
                        .findFirst().orElse(null);
                if(null != itemLastVo) {
                    totalLast = itemLastVo.getTotal();
                }
            }

            //格式化的数值去掉 逗号
            BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(total);
            BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
            BigDecimal subNum = NumberUtil.sub(totalValue, totalValueLast);

            itemVo.setTotalLast(totalLast);
            //设置更新数据 收入
            itemVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNum));
            itemVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNum.abs()));
            itemVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNum));
            itemVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNum.abs()));
        }
    }

    /**
     * p3p6 设置 去年的数据
     * @param dataVo 本年数据
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    private static void setP3p6Last(BudgetP3p6Vo dataVo, BudgetP3p6Vo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();


        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);

        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //总收入 设置 占比
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal.abs()));

        //设置项 人员经费/公用经费
        setP3p6LastSubItem(dataVo.getPersonVo(), null != dataLastVo ? dataLastVo.getPersonVo() : null, initFlag);
        setP3p6LastSubItem(dataVo.getPublicVo(), null != dataLastVo ? dataLastVo.getPublicVo() : null, initFlag);
    }

    /**
     * 设置 p3p6的 人员经费/公用经费
     * @param dataVo
     * @param dataLastVo
     * @param initFlag
     */
    private static void setP3p6LastSubItem(BudgetP3p6SubItemVo dataVo, BudgetP3p6SubItemVo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);


        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //基本 设置 占比
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal));

        //设置项
        setP3p6LastItem(dataVo, null != dataLastVo ? dataLastVo.getList() : null, initFlag);
    }

    /**
     * 设置  p3p6的项 去年的初始化
     * @param dataVo
     * @param listLast
     * @param initFlag
     */
    private static void setP3p6LastItem(BudgetP3p6SubItemVo dataVo, List<BudgetP3p6ItemVo> listLast, boolean initFlag) {
        BigDecimal totalAllValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());

        for (BudgetP3p6ItemVo itemVo : dataVo.getList() ) {
            String totalLast = "0";
            String total = itemVo.getTotal();
            if(!initFlag) {
                //比较
                BudgetP3p6ItemVo itemLastVo = listLast.stream().filter(i-> i.getCode1().equals(itemVo.getCode1()) && i.getCode2().equals(itemVo.getCode2()) )
                        .findFirst().orElse(null);
                if(null != itemLastVo) {
                    totalLast = itemLastVo.getTotal();
                }
            }

            //格式化的数值去掉 逗号
            BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(total);
            BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
            BigDecimal subNum = NumberUtil.sub(totalValue, totalValueLast);

            itemVo.setTotalLast(totalLast);
            //设置更新数据 收入
            itemVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNum));
            itemVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNum.abs()));
            itemVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNum));
            itemVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNum.abs()));
        }
    }

    /**
     * p3p7 设置 去年的数据
     * @param dataVo 本年数据
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    private static void setP3p7Last(BudgetP3p7Vo dataVo, BudgetP3p7Vo dataLastVo, boolean initFlag) {
        //设置项 人员经费/公用经费
        setP3p7LastPart(dataVo.getP1Vo(), null != dataLastVo ? dataLastVo.getP1Vo() : null, initFlag);
        setP3p7LastPart(dataVo.getP2Vo(), null != dataLastVo ? dataLastVo.getP2Vo() : null, initFlag);
    }

    /**
     * 设置 p3p7的 部门预算全口径安排/一般公共预算资金安排
     * @param dataVo
     * @param dataLastVo
     * @param initFlag
     */
    private static void setP3p7LastPart(BudgetP3p7PartVo dataVo, BudgetP3p7PartVo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);


        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //基本 设置 占比
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal));

        //设置项
        setP3p7LastPartItem(dataVo.getAbroadVo(), null != dataLastVo ? dataLastVo.getAbroadVo() : null, initFlag);
        setP3p7LastPartItem(dataVo.getReceptionVo(), null != dataLastVo ? dataLastVo.getReceptionVo() : null, initFlag);
        setP3p7LastPartItem(dataVo.getCarVo(), null != dataLastVo ? dataLastVo.getCarVo() : null, initFlag);
        setP3p7LastPartItem(dataVo.getCarOperateVo(), null != dataLastVo ? dataLastVo.getCarOperateVo() : null, initFlag);
        setP3p7LastPartItem(dataVo.getCarBuyVo(), null != dataLastVo ? dataLastVo.getCarBuyVo() : null, initFlag);
    }

    /**
     * 设置 p3p7的 部门预算全口径安排/一般公共预算资金安排 的三公 项
     * @param dataVo
     * @param dataLastVo
     * @param initFlag
     */
    private static void setP3p7LastPartItem(BudgetP3p7PartItemVo dataVo, BudgetP3p7PartItemVo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);


        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //基本 设置 占比
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal));

    }

    /**
     * p3p8 设置 去年的数据
     * @param dataVo 本年数据
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    private static void setP3p8Last(BudgetP3p8Vo dataVo, BudgetP3p8Vo dataLastVo, boolean initFlag) {
        String totalLast = initFlag ? "0" : dataLastVo.getTotal();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);

        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //总收入 设置 占比
        dataVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNumTotal));
        dataVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNumTotal.abs()));
        dataVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNumTotal));
        dataVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNumTotal.abs()));

        //设置项
        setP3p8LastItem(dataVo, null != dataLastVo ? dataLastVo.getList() : null, initFlag);
    }

    /**
     * 设置  p3p8的项 去年的初始化
     * @param dataVo
     * @param listLast
     * @param initFlag
     */
    private static void setP3p8LastItem(BudgetP3p8Vo dataVo, List<BudgetP3p8ItemVo> listLast, boolean initFlag) {
        BigDecimal totalAllValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());

        for (BudgetP3p8ItemVo itemVo : dataVo.getList() ) {
            String totalLast = "0";
            String total = itemVo.getTotal();
            if(!initFlag) {
                BudgetP3p8ItemVo itemLastVo = listLast.stream().filter(i-> i.getCode1().equals(itemVo.getCode1()) && i.getCode2().equals(itemVo.getCode2()) && i.getCode3().equals(itemVo.getCode3()))
                        .findFirst().orElse(null);
                if(null != itemLastVo) {
                    totalLast = itemLastVo.getTotal();
                }
            }

            //格式化的数值去掉 逗号
            BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(total);
            BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
            BigDecimal subNum = NumberUtil.sub(totalValue, totalValueLast);

            itemVo.setTotalLast(totalLast);
            //设置更新数据 收入
            itemVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNum));
            itemVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNum.abs()));
            itemVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNum));
            itemVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNum.abs()));
        }
    }

    /**
     * p3p10p1 设置 去年的数据
     * @param dataVo 本年数据
     * @param dataLastVo 去年数据
     * @param initFlag 是否是初始化, 当是时,给 0
     */
    public static void setP3p10P1Last(BudgetP3p10p1Vo dataVo, BudgetP3p10p1Vo dataLastVo, boolean initFlag) {

        setP3p10p1LastSubItem(dataVo.getOperationItemVo(), null != dataLastVo ? dataLastVo.getOperationItemVo() : null, initFlag);
        setP3p10p1LastSubItem(dataVo.getOperationItemVo2(), null != dataLastVo ? dataLastVo.getOperationItemVo2() : null, initFlag);
        setP3p10p1LastSubItem(dataVo.getOperationItemVoTp4(), null != dataLastVo ? dataLastVo.getOperationItemVoTp4() : null, initFlag);

    }

    /**
     * 设置  p3p10p1的项 去年的初始化
     * @param dataVo
     * @param dataLastVo
     * @param initFlag
     */
    private static void setP3p10p1LastSubItem(BudgetP3p10p1ItemVo dataVo, BudgetP3p10p1ItemVo dataLastVo, boolean initFlag) {
        if(null == dataVo) {
            log.info("p3p10的项为空, 不设置去年");
            return;
        }

        String totalLast = initFlag ? "0" : dataLastVo.getTotal();

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);


        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //基本 设置 占比
        UpdateReportBudgetData.setBudgetP3ChangeItemVo(dataVo.getChangeItemVo(), dataVo.getTotal(), totalLast);
    }

    /**
     * 设置  p3p10p1的项 去年的初始化
     * @param dataVo
     * @param totalLast
     */
    public static void setP3p10p1LastSubItem(BudgetP3p10p1ItemVo dataVo, String totalLast) {
        if(null == dataVo) {
            log.info("p3p10的项为空, 不设置去年");
            return;
        }

        if(StringUtils.isBlank(totalLast)) {
            totalLast = "0.00";
        }

        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(dataVo.getTotal());
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        //本年- 去年 数值变化
        BigDecimal subNumTotal = NumberUtil.sub(totalValue, totalValueLast);


        //设置 保存 去年的
        dataVo.setTotalLast(totalLast);

        //基本 设置 占比
        UpdateReportBudgetData.setBudgetP3ChangeItemVo(dataVo.getChangeItemVo(), dataVo.getTotal(), totalLast);
    }

    /**
     * 设置变化 率的
     * @param changeItemVo
     * @param total
     * @param totalLast
     */
    public static void setBudgetP3ChangeItemVo(BudgetP3ChangeItemVo changeItemVo, String total, String totalLast) {
        //格式化的数值去掉 逗号
        BigDecimal totalValue = ReadExcelUtil.toBigDecimalByStr(total);
        BigDecimal totalValueLast = ReadExcelUtil.toBigDecimalByStr(totalLast);
        BigDecimal subNum = NumberUtil.sub(totalValue, totalValueLast);

        //设置更新数据 收入
        changeItemVo.setChangeAmountWord(ReadExcelUtil.getChangeValueWord(subNum));
        changeItemVo.setChangeAmount(NumberFormatUtils.addThousandSeparatorForInteger(subNum.abs()));
        changeItemVo.setChangeRatioWord(ReadExcelUtil.getChangeRatioWord(subNum));
        changeItemVo.setChangeRatio(ReadExcelUtil.getChangeRatioValue(totalValueLast, subNum.abs()));
    }

    /**
     * 设置 单位的级别显示不一样的标题
     * @param excelDataVo
     */
    public static void initBudgetDeptInfo(BudgetDataVo excelDataVo) {
        BudgetDeptInfoVo deptInfoVo = new BudgetDeptInfoVo();
        deptInfoVo.setDeptLevel(8);
        deptInfoVo.setShowTitle("部门");

        excelDataVo.setDeptInfoVo(deptInfoVo);

    }

    /**
     * 初始化 p3p4 的收入项包括
     * @param p3Vo
     */
    private static void initP3p4(BudgetExplainP3Vo p3Vo) {
        BudgetP3p4Vo p3p4Vo = p3Vo.getP3p4Vo();

        if(null == p3p4Vo.getIncomeVo() ) {
            return;
        }

        //一般公共预算拨款**万元, 政府性基金预算拨款**万元，国有资本经营预算拨款**万元
        /*BudgetP3p4ItemVo p3p4ItemVo0 = p3p4Vo.getIncomeVo().getList().stream().filter(i->i.getName().equals("一般公共预算拨款")).findFirst().orElse(null);
        if(null == p3p4ItemVo0) {
            p3p4ItemVo0 = new BudgetP3p4ItemVo();
            p3p4ItemVo0.setName("一般公共预算拨款");
            p3p4ItemVo0.setTotal("0.00");
            p3p4Vo.getIncomeVo().getList().add(p3p4ItemVo0);
        }
        BudgetP3p4ItemVo p3p4ItemVo1 = p3p4Vo.getIncomeVo().getList().stream().filter(i->i.getName().equals("政府性基金预算拨款")).findFirst().orElse(null);
        if(null == p3p4ItemVo1) {
            p3p4ItemVo1 = new BudgetP3p4ItemVo();
            p3p4ItemVo1.setName("政府性基金预算拨款");
            p3p4ItemVo1.setTotal("0.00");
            p3p4Vo.getIncomeVo().getList().add(p3p4ItemVo1);
        }

        BudgetP3p4ItemVo p3p4ItemVo2 = p3p4Vo.getIncomeVo().getList().stream().filter(i->i.getName().equals("国有资本经营预算拨款")).findFirst().orElse(null);
        if(null == p3p4ItemVo2) {
            p3p4ItemVo2 = new BudgetP3p4ItemVo();
            p3p4ItemVo2.setName("国有资本经营预算拨款");
            p3p4ItemVo2.setTotal("0.00");
            p3p4Vo.getIncomeVo().getList().add(p3p4ItemVo2);
        }*/

    }

    /**
     * 设置 预算类型4的 list 的显示 情况 预算类型4的显示情况: 1-全部是基本支出预算;2-全部是项目支出预算;3-合计数等于基本支出+项目支出
     * @param p3Vo
     */
    private static void initP3p5ListShowType(BudgetExplainP3Vo p3Vo) {
        BudgetP3p5Vo p3p5Vo = p3Vo.getP3p5Vo();

        if(null == p3p5Vo.getBase() || null == p3p5Vo.getProject() || p3p5Vo.getList().isEmpty()) {
            return;
        }

        p3p5Vo.getList().stream().forEach(i-> {
            if(null == i.getBase() || null == i.getProject() || null == i.getTotal()) {
                return;
            }

            if(i.getTotal().equals(i.getBase())) {
                i.setTp4ShowType(1);
            } else if(i.getTotal().equals(i.getProject())) {
                i.setTp4ShowType(2);
            } else {
                i.setTp4ShowType(3);
            }
        });
    }

    /**
     * 初始化 p3p6 空格无数据时
     *
     * @param p3Vo
     */
    private static void initP3p6(BudgetExplainP3Vo p3Vo) {
        BudgetP3p6Vo p3p6Vo = p3Vo.getP3p6Vo();

        /*if(null != p3p6Vo ) {
            return;
        }*/

        if(null == p3p6Vo.getTotal()) {
            p3p6Vo.setTotal("0.00");
        }

        /*if(null == p3p6Vo.getTotalLast()) {
            p3p6Vo.setTotalLast("0.00");
        }*/

        if(null == p3p6Vo.getPersonVo().getTotal()) {
            p3p6Vo.getPersonVo().setTotal("0.00");
        }

        if(null == p3p6Vo.getPublicVo().getTotal()) {
            p3p6Vo.getPublicVo().setTotal("0.00");
        }

    }

    /**
     * 初始化 p3p7
     * @param p3Vo
     */
    private static void initP3p7(BudgetExplainP3Vo p3Vo) {
        BudgetP3p7Vo p3p7Vo = p3Vo.getP3p7Vo();

        if(null != p3p7Vo.getP1Vo() && null != p3p7Vo.getP2Vo() ) {
            return;
        }

        String total = "0.00";
        BudgetP3p7PartItemVo p3p7PartItemVo = new BudgetP3p7PartItemVo();
        p3p7PartItemVo.setTotal("0.00");

        if(null == p3p7Vo.getP1Vo()) {
            BudgetP3p7PartVo p3p7PartVo1 = new BudgetP3p7PartVo();
            p3p7PartVo1.setTotal(total);
            p3p7PartVo1.setAbroadVo(p3p7PartItemVo);
            p3p7PartVo1.setReceptionVo(p3p7PartItemVo);
            p3p7PartVo1.setCarVo(p3p7PartItemVo);
            p3p7PartVo1.setCarOperateVo(p3p7PartItemVo);
            p3p7PartVo1.setCarBuyVo(p3p7PartItemVo);
            p3p7Vo.setP1Vo(p3p7PartVo1);
        }

        if(null == p3p7Vo.getP2Vo()) {
            BudgetP3p7PartVo p3p7PartVo1 = new BudgetP3p7PartVo();
            p3p7PartVo1.setTotal(total);
            p3p7PartVo1.setAbroadVo(p3p7PartItemVo);
            p3p7PartVo1.setReceptionVo(p3p7PartItemVo);
            p3p7PartVo1.setCarVo(p3p7PartItemVo);
            p3p7PartVo1.setCarOperateVo(p3p7PartItemVo);
            p3p7PartVo1.setCarBuyVo(p3p7PartItemVo);
            p3p7Vo.setP2Vo(p3p7PartVo1);
        }

        p3Vo.setP3p7Vo(p3p7Vo);
    }

    /**
     * p3p10的初始化
     * @param p3Vo
     */
    private static void initP3p10(BudgetExplainP3Vo p3Vo) {
        BudgetP3p10Vo p3p10Vo = p3Vo.getP3p10Vo();
        if(null == p3p10Vo) {
            p3p10Vo = new BudgetP3p10Vo();
            p3Vo.setP3p10Vo(p3p10Vo);
        }
        BudgetP3p10p1Vo p10p1Vo = p3p10Vo.getP1Vo();
        if(null == p10p1Vo) {
            p10p1Vo = new BudgetP3p10p1Vo();
            p3p10Vo.setP1Vo(p10p1Vo);
        }
        //默认值 1
        p10p1Vo.setDeptAttr(1);
        p10p1Vo.setDeptAttrChild(0);

        BudgetP3p10p1ItemVo p3p10p1ItemVo = new BudgetP3p10p1ItemVo();
        BudgetP3p10p1ItemVo p3p10p1ItemVo2 = new BudgetP3p10p1ItemVo();

        p3p10p1ItemVo.setChangeItemVo(new BudgetP3ChangeItemVo());
        p3p10p1ItemVo2.setChangeItemVo(new BudgetP3ChangeItemVo());

        p10p1Vo.setOperationItemVo(p3p10p1ItemVo);
        p10p1Vo.setOperationItemVo2(p3p10p1ItemVo2);

        //p3p10p2
        BudgetP3p10p2Vo p3p10p2Vo = new BudgetP3p10p2Vo();
        BudgetP3ChangeItemVo p3ChangeItemVo = new BudgetP3ChangeItemVo();
        p3ChangeItemVo.setChangeAmountWord("增加");
        p3ChangeItemVo.setChangeAmount("0.00");
        p3ChangeItemVo.setChangeRatioWord("增长");
        p3ChangeItemVo.setChangeRatio("0");
        p3p10p2Vo.setChangeTotalVo(p3ChangeItemVo);
        p3p10p2Vo.setChangeTotalVo2(p3ChangeItemVo);
        p3p10p2Vo.setChangeTotalVo3(p3ChangeItemVo);
        p3p10p2Vo.setTotal("0.00");
        p3p10p2Vo.setTotalLast("0.00");
        p3p10p2Vo.setTotal2("0.00");
        p3p10p2Vo.setTotalLast2("0.00");
        p3p10p2Vo.setRatio2("0");
        p3p10p2Vo.setTotal3("0.00");
        p3p10p2Vo.setTotalLast3("0.00");
        p3p10p2Vo.setRatio3("0");
        p3p10p2Vo.setTotalProduct("0.00");
        p3p10p2Vo.setTotalProject("0.00");
        p3p10p2Vo.setTotalService("0.00");
        p3p10p2Vo.setTotalPublic("0.00");
        p3p10p2Vo.setTotalFund("0.00");


        BudgetP3p10p3Vo p3p10p3Vo = new BudgetP3p10p3Vo();
        p3p10p3Vo.setCarList(new ArrayList<>());

        BudgetP3p10p4Vo p3p10p4Vo = new BudgetP3p10p4Vo();
        p3p10p4Vo.setProjectList(new ArrayList<>());
        p3p10p4Vo.setNoProjectFlag(0);
        p3p10p4Vo.setBt52024ProjectList(new ArrayList<>());

        //桂平预算的类型3
        BudgetP3p10p3T3Vo p3p10p3T3Vo = new BudgetP3p10p3T3Vo();
        p3p10p3T3Vo.setTotal("");
        p3p10p3T3Vo.setTotal1("");
        p3p10p3T3Vo.setRatio1("");
        p3p10p3T3Vo.setTotal2("");
        p3p10p3T3Vo.setRatio2("");
        p3p10p3T3Vo.setNum("");
        p3p10p3T3Vo.setBusiness("");
        p3p10p3T3Vo.setDuty("");
        p3p10p3T3Vo.setSpecial("");
        p3p10p3T3Vo.setOther("");
        p3p10p3T3Vo.setW200("无");
        p3p10p3Vo.setT3Vo(p3p10p3T3Vo);

        //预算第4模板 凭祥
        BudgetP3p10p4Tp4Vo p3p10p4Tp4Vo = new BudgetP3p10p4Tp4Vo();
        p3p10p4Tp4Vo.setSpecialNum("");
        p3p10p4Tp4Vo.setGeneralNum("");
        p3p10p4Tp4Vo.setPublicTotal("");
        p3p10p4Tp4Vo.setGovTotal("");
        p3p10p4Tp4Vo.setEnterpriseTotal("");
        p3p10p4Tp4Vo.setDeptTotal("");
        p3p10p4Tp4Vo.setLastTotal("");

        p3p10Vo.setP1Vo(p10p1Vo);
        p3p10Vo.setP2Vo(p3p10p2Vo);
        p3p10Vo.setP3Vo(p3p10p3Vo);
        p3p10Vo.setP4Vo(p3p10p4Vo);
        p3p10Vo.setP4Tp4Vo(p3p10p4Tp4Vo);

    }

    /**
     * 设置 第二部分的表5的编码,  p3p5的编码
     * @param budgetDataVo
     * @param codeList
     */
    public static void updateCourseCode(BudgetDataVo budgetDataVo, List<CourseCode> codeList) {
        //设置表6的编码
        setP3p5Code(budgetDataVo.getExplainVo().getP3p5Vo().getList(), codeList);
        /*//设置表6的编码
        setT6Code(finalExcelDataVo.getT6VZ08S1Vo().getList(), codeList);
        //设置 p3p3部分的款级
        setP3P3Code(finalExcelDataVo.getP3T3Vo().getList(), codeList);*/

        //设置表8的编码
        setP3p8Code(budgetDataVo.getExplainVo().getP3p8Vo().getList(), codeList);
        //设置表9的编码
        setP3p8Code(budgetDataVo.getExplainVo().getP3p9Vo().getList(), codeList);
    }

    /**
     * 设置p3p5的编码
     * @param list
     * @param codeList
     */
    private static void setP3p5Code(List<BudgetP3p5ItemVo> list, List<CourseCode> codeList) {
        if(list.isEmpty()) {
            return;
        }

        list.stream().forEach(i -> {
            //设置第一
            if(StringUtils.isNotBlank(i.getCode1())) {
                //查重编码
                Optional<CourseCode> codeObj1 = codeList.stream().filter(item -> {return i.getCode1().equals(item.getCourseCode());}).findFirst();
                if(codeObj1.isPresent()) {
                    //设置编码名
                    i.setName1(codeObj1.get().getCourseName());
                } else {
                    //没有则, 设置编码
                    i.setName1(i.getCode1());
                }
            }


            //第二
            if(StringUtils.isNotBlank(i.getCode2())) {
                String code2 = i.getCode1() + i.getCode2();
                Optional<CourseCode> codeObj2 = codeList.stream().filter(item -> {return code2.equals(item.getCourseCode());}).findFirst();
                if(codeObj2.isPresent()) {
                    i.setName2(codeObj2.get().getCourseName());
                } else {
                    //没有则, 设置编码
                    i.setName2(i.getCode2());
                }
            }
        });

    }

    /**
     * 设置表6的编码
     * @param list
     * @param codeList
     */
    private static void setT6Code(List<FinalZ08S1T6ItemVo> list, List<CourseCode> codeList) {
        if(list.isEmpty()) {
            return;
        }

        list.stream().forEach(i -> {
            //设置第一
            if(StringUtils.isNotBlank(i.getName1())) {
                //查重编码
                Optional<CourseCode> codeObj1 = codeList.stream().filter(item -> {return i.getName1().equals(item.getCourseName());}).findFirst();
                if(codeObj1.isPresent()) {
                    //设置编码
                    i.setCode1(codeObj1.get().getCourseCode());
                }
            }

            //第二
            if(StringUtils.isNotBlank(i.getName2())) {
                Optional<CourseCode> codeObj2 = codeList.stream().filter(item -> {return i.getName2().equals(item.getCourseName());}).findFirst();
                if(codeObj2.isPresent()) {
                    i.setCode2(codeObj2.get().getCourseCode());
                }
            }
        });

    }

    /**
     * 设置 p3p8的编码
     * @param list
     * @param codeList
     */
    private static void setP3p8Code(List<BudgetP3p8ItemVo> list, List<CourseCode> codeList) {
        if(list.isEmpty()) {
            return;
        }

        list.stream().forEach(i -> {
            //设置第一
            if(StringUtils.isNotBlank(i.getCode1())) {
                //查重编码
                Optional<CourseCode> codeObj1 = codeList.stream().filter(item -> {return i.getCode1().equals(item.getCourseCode());}).findFirst();
                if(codeObj1.isPresent()) {
                    //设置编码名
                    i.setName1(codeObj1.get().getCourseName());
                } else {
                    //没有则, 设置编码
                    i.setName1(i.getCode1());
                }
            }


            //第二
            if(StringUtils.isNotBlank(i.getCode2())) {
                String code2 = i.getCode1() + i.getCode2();
                Optional<CourseCode> codeObj2 = codeList.stream().filter(item -> {return code2.equals(item.getCourseCode());}).findFirst();
                if(codeObj2.isPresent()) {
                    i.setName2(codeObj2.get().getCourseName());
                } else {
                    //没有则, 设置编码
                    i.setName2(i.getCode2());
                }
            }
        });

    }

    /**
     * 修改 第二部分的表格的文字 不用修改, 已经有了?
     */
    @Deprecated
    public static void changeTableListWord(BudgetTableVo tableVo) {

        //设置 p2p1
        List<BudgetP2p1ItemVo> p2p1ItemVoList = tableVo.getP2p1Vo().getList();
        p2p1ItemVoList.stream().forEach(
                i -> {
                    //加 "收入"
                    if( StringUtils.isNotBlank(i.getNameIn()) &&  i.getNameIn().contains("）一般债券")) {
                        i.setNameIn(i.getNameIn() + "收入");
                    }
                    // 、财政专户管理资金收入 去除 收入
                    if( StringUtils.isNotBlank(i.getNameIn()) &&  i.getNameIn().contains("、财政专户管理资金收入")) {
                        i.setNameIn(i.getNameIn().replace("收入", ""));
                    }

                }
        );

        //设置 p2p4
        List<BudgetP2p1ItemVo> p2p4ItemVoList = tableVo.getP2p4Vo().getList();
        p2p4ItemVoList.stream().forEach(
                i -> {
                    //加 "收入"
                    if( StringUtils.isNotBlank(i.getNameIn()) &&  i.getNameIn().contains("、一般债券")  || StringUtils.isNotBlank(i.getNameIn()) &&  i.getNameIn().contains("、专项债券") ) {
                        i.setNameIn(i.getNameIn() + "收入");
                    }
                    // 、财政专户管理资金收入 去除 收入
                    if( StringUtils.isNotBlank(i.getNameIn()) &&  i.getNameIn().contains("、财政专户管理资金收入")) {
                        i.setNameIn(i.getNameIn().replace("收入", ""));
                    }

                }
        );


    }

    /**
     * 设置 p3p3的编码
     * @param list
     * @param codeList
     */
    private static void setP3P3Code(List<FinalP3T3ItemVo> list, List<CourseCode> codeList) {
        if(list.isEmpty()) {
            return;
        }

        list.stream().forEach(i -> {

            i.getList().stream().forEach(
                    it -> {
                        if(StringUtils.isNotBlank(it.getName())) {
                            //查重编码
                            Optional<CourseCode> codeObj1 = codeList.stream().filter(item -> {return it.getName().equals(item.getCourseName());}).findFirst();
                            if(codeObj1.isPresent()) {
                                //设置编码
                                it.setCode(codeObj1.get().getCourseCode());
                            }
                        }
                    }
            );
        });

        //设置 p3p3 的款级的显示 (编码 + 名称)
        ReadFinalExcelY22Utils.setP3p3ItmeParagraphStr(list);
    }

    /**
     * 替换掉 文字, 去掉 开头的 广西
     * @param source
     * @param targetSrc 广西
     * @param replaceStr
     * @return
     */
    public static String replaceStartIndexStr(String source, String targetSrc, String replaceStr) {
        if(StringUtils.isBlank(source)) {
            return source;
        }

        if(source.startsWith(targetSrc)) {
            String newStr = source.replaceFirst(targetSrc, replaceStr);
            return newStr;
        }

        return source;
    }

    /**
     * 设置 比较 采购的去年数据
     * @param dataList
     * @param dataLastList
     */
    public static void setPurchaseLastValue(List<BudgetP3p10p2ItemVo> dataList, List<BudgetP3p10p2ItemVo> dataLastList) {
        UpdateReportBudgetData.setPurchaseInitDefaultValue(dataList);
        //格式化
        UpdateReportBudgetData.setPurchaseInitDefaultValue(dataLastList);

        List<BudgetP3p10p2ItemVo> dataListAddLast = new ArrayList<>();
        //添加查询 2023年的, 2024年没有的
        dataLastList.stream().forEach(dataItemVo -> {
            BudgetP3p10p2ItemVo dataItemVoLast = dataList.stream().filter(i->i.getDeptCode().equals(dataItemVo.getDeptCode())).findFirst().orElse(null);
            if (null == dataItemVoLast) {
                BudgetP3p10p2ItemVo addItemVo = new BudgetP3p10p2ItemVo();
                addItemVo.setDeptCode(dataItemVo.getDeptCode());
                addItemVo.setDeptName(dataItemVo.getDeptName());
                addItemVo.setTotal("0.00");
                addItemVo.setTotal2("0.00");
                addItemVo.setTotal3("0.00");
                addItemVo.setTotalProduct("0.00");
                addItemVo.setTotalProject("0.00");
                addItemVo.setTotalService("0.00");
                addItemVo.setTotalPublic("0.00");
                addItemVo.setTotalFund("0.00");
                dataListAddLast.add(addItemVo);
            }
        });

        if(!dataListAddLast.isEmpty()) {
            dataList.addAll(dataListAddLast);
        }

        dataList.stream().forEach(dataItemVo -> {
            BudgetP3p10p2ItemVo dataItemVoLast = dataLastList.stream().filter(i->i.getDeptCode().equals(dataItemVo.getDeptCode())).findFirst().orElse(null);
            String totalLast1 = "0.00";
            String totalLast2 = "0.00";
            String totalLast3 = "0.00";

            //设置占比
            try {
                dataItemVo.setRatio2(ReadExcelUtil.getChangeRatioValue(new BigDecimal(dataItemVo.getTotal().replace(",", "")), new BigDecimal(dataItemVo.getTotal2().replace(",", ""))));
                dataItemVo.setRatio3(ReadExcelUtil.getChangeRatioValue(new BigDecimal(dataItemVo.getTotal().replace(",", "")), new BigDecimal(dataItemVo.getTotal3().replace(",", ""))));
            } catch (Exception e) {
                log.debug("出现异常: [{}] - [{}]", e.getMessage(), e);
                throw new ServiceException("读数异常: " + e.getMessage());
            }

            if(null != dataItemVoLast) {
                //设置去年的值
                totalLast1 = dataItemVoLast.getTotal();
                totalLast2 = dataItemVoLast.getTotal2();
                totalLast3 = dataItemVoLast.getTotal3();
            }

            //设置去年的值
            dataItemVo.setTotalLast(totalLast1);
            dataItemVo.setTotalLast2(totalLast2);
            dataItemVo.setTotalLast3(totalLast3);

            //设置去年的 变化率
            if(null == dataItemVo.getChangeTotalVo()) {
                dataItemVo.setChangeTotalVo(new BudgetP3ChangeItemVo());
            }
            if(null == dataItemVo.getChangeTotalVo2()) {
                dataItemVo.setChangeTotalVo2(new BudgetP3ChangeItemVo());
            }
            if(null == dataItemVo.getChangeTotalVo3()) {
                dataItemVo.setChangeTotalVo3(new BudgetP3ChangeItemVo());
            }
            UpdateReportBudgetData.setBudgetP3ChangeItemVo(dataItemVo.getChangeTotalVo(), dataItemVo.getTotal(), totalLast1);
            UpdateReportBudgetData.setBudgetP3ChangeItemVo(dataItemVo.getChangeTotalVo2(), dataItemVo.getTotal2(), totalLast2);
            UpdateReportBudgetData.setBudgetP3ChangeItemVo(dataItemVo.getChangeTotalVo3(), dataItemVo.getTotal3(), totalLast3);
        });
    }


    /**
     * 设置 空值时为0.00
     * @param list
     */
    private static void setPurchaseInitDefaultValue(List<BudgetP3p10p2ItemVo> list) {
        list.stream().forEach(i-> {
            if(StringUtils.isBlank(i.getTotal())) {
                i.setTotal("0.00");
            }
            if(StringUtils.isBlank(i.getTotal2())) {
                i.setTotal2("0.00");
            }
            if(StringUtils.isBlank(i.getTotal3())) {
                i.setTotal3("0.00");
            }
            if(StringUtils.isBlank(i.getTotalProduct())) {
                i.setTotalProduct("0.00");
            }
            if(StringUtils.isBlank(i.getTotalProject())) {
                i.setTotalProject("0.00");
            }
            if(StringUtils.isBlank(i.getTotalService())) {
                i.setTotalService("0.00");
            }

            if(StringUtils.isBlank(i.getTotalPublic())) {
                i.setTotalPublic("0.00");
            }
            if(StringUtils.isBlank(i.getTotalFund())) {
                i.setTotalFund("0.00");
            }

            //格式化
            i.setTotalProduct(NumberFormatUtils.addThousandSeparatorForInteger(i.getTotalProduct().replace(",", "")));
            i.setTotalService(NumberFormatUtils.addThousandSeparatorForInteger(i.getTotalService().replace(",", "")));

        });
    }

    /**
     * 设置 p3p10p2的采购信息
     * @param dataVo
     * @param list
     * @param deptCode 部门编码
     */
    public static void setPurchaseValue(BudgetExplainP3Vo dataVo, List<BudgetP3p10p2ItemVo> list, String deptCode) {

        BudgetP3p10p2Vo p3p10p2Vo = dataVo.getP3p10Vo().getP2Vo();

        BudgetP3p10p2ItemVo p3p10p2ItemVo = list.stream().filter(i->i.getDeptCode().equals(deptCode)).findFirst().orElse(null);
        if(null != p3p10p2ItemVo) {
            BeanUtils.copyProperties(p3p10p2ItemVo, p3p10p2Vo);
        }


    }

    /**
     * 设置 p3p10p2的采购信息 只更新2个字段
     * @param dataVo
     * @param list
     * @param deptCode 部门编码
     */
    public static void setPurchaseValueTotalFundAndPerson(BudgetExplainP3Vo dataVo, List<BudgetP3p10p2ItemVo> list, String deptCode) {

        BudgetP3p10p2Vo p3p10p2Vo = dataVo.getP3p10Vo().getP2Vo();

        BudgetP3p10p2ItemVo p3p10p2ItemVo = list.stream().filter(i->i.getDeptCode().equals(deptCode)).findFirst().orElse(null);
        if(null != p3p10p2ItemVo) {
            p3p10p2Vo.setTotalPublic(p3p10p2ItemVo.getTotalPublic());
            p3p10p2Vo.setTotalFund(p3p10p2ItemVo.getTotalFund());
        }

    }

    /**
     * 获取p5的子级单位的编码
     * @return
     */
    public static List<String> subDeptCodeListTb5(List<BudgetP3p5SubDeptVo> list) {
        List<String> deptCodeList = new ArrayList<>();
        if(null == list || list.isEmpty() || 1 == list.size()) {
            return deptCodeList;
        }

        deptCodeList = list.subList(1, list.size()).stream().map(i->i.getDeptCode()).collect(Collectors.toList());

        return deptCodeList;
    }

    /**
     * 设置 p3p10p1的运行总费用 分行政和事业单位 以及标记
     * @param list
     * @param p1Vo
     * @param tb5ChildDeptList
     */
    public static void setBudgetP3p10p1VoByDeptAttr(List<BudgetP3p5SubDeptVo> list, BudgetP3p10p1Vo p1Vo, List<SysDept> tb5ChildDeptList) {

        if( null == list || null == tb5ChildDeptList || list.isEmpty() || tb5ChildDeptList.isEmpty()) {
            log.debug("p3p10p1的运行费用的部门为空, 不设置单位信息");
            return;
        }

        //行政单位
        BudgetP3p10p1ItemVo operationItemVo = p1Vo.getOperationItemVo();

        //事业单位
        BudgetP3p10p1ItemVo operationItemVo2 = p1Vo.getOperationItemVo2();

        //判断子级的是否有行政和使用单位
        final boolean[] deptAttr1 = {false};
        final boolean[] deptAttr2 = {false};
        tb5ChildDeptList.stream().forEach(i-> {
            Integer deptAttr = i.getDeptAttr();
            if(null == deptAttr) {
                deptAttr = 1;
            }
            if( 1 == deptAttr ) {
                deptAttr1[0] = true;
            }
            if( 2 == deptAttr ) {
                deptAttr2[0] = true;
            }
        });
        Integer deptAttrChild = deptAttr1[0] && deptAttr2[0] ? 1 : 0;
        p1Vo.setDeptAttrChild(deptAttrChild);


        //总计行政单位和事业单位的总和
        BigDecimal total1 = BigDecimal.ZERO;
        BigDecimal total2 = BigDecimal.ZERO;
        for (BudgetP3p5SubDeptVo subDeptVo : list) {
            SysDept sysDept = tb5ChildDeptList.stream().filter(i-> subDeptVo.getDeptCode().equals(i.getDeptCode())).findFirst().orElse(null);
            if(null == sysDept) {
                log.error("p3p10p1未找到对应的单位");
                continue;
            }
            if(null == sysDept.getDeptAttr()) {
                log.error("p3p10p1未找到对应的单位设置的单位属性");
                continue;
            }

            String totalPublicStr = subDeptVo.getTotalPublic().replace(",", "");
            if(1 == sysDept.getDeptAttr()) {
                total1 = NumberUtil.add(total1, new BigDecimal(totalPublicStr));
            }
            if(2 == sysDept.getDeptAttr()) {
                total2 = NumberUtil.add(total2, new BigDecimal(totalPublicStr));
            }
        }

        operationItemVo.setTotal(NumberFormatUtils.addThousandSeparatorForInteger(total1));
        operationItemVo2.setTotal(NumberFormatUtils.addThousandSeparatorForInteger(total2));
    }



}
