package com.yunyan.business.document.y22;

import cn.hutool.core.math.MathUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.yunyan.business.constant.TemplateEpType;
import com.yunyan.business.document.EasyExcelFinalListener;
import com.yunyan.business.document.y22.pojo.finalExcelY22.*;
import com.yunyan.common.exception.ServiceException;
import com.yunyan.common.utils.NumberFormatUtils;
import com.yunyan.common.utils.StringUtils;
import io.swagger.models.auth.In;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 决算表的读取
 */
@Slf4j
public class ReadFinalExcelY22Utils {

      public static String fileName = "D:\\code\\gx-final-account\\doc\\excel\\决算系统传入批复数据后导出表格.xls";

      public static String fileName9 = "D:\\财政厅\\测试\\南宁市青秀区农业农村局（本级）2022.XLS";

    public static String fileName1 = "F:\\code\\gx-final-account-oracle\\doc\\excel\\南宁市青秀区教育局2022.XLS";
    public static String fileName2 = "F:\\code\\gx-final-account-oracle\\doc\\excel\\南宁市青秀区教育局2021.XLS";
    public static String fileName7 = "D:\\财政厅\\测试\\南宁市青秀区发展和改革局（本级）(4).XLS";
    public static String fileName6 = "D:\\财政厅\\测试\\南宁市青秀区发展和改革局（本级）(3).XLS";
    public static String fileName8 = "D:\\out\\测试-田东第二小学\\田东县第二小学.2022.XLS";
    public static String fileName10 = "D:\\out\\田东测试\\共青团田东县委员会（本级）.XLS";
    public static String fileName11 = "D:\\code\\gx-final-account-oracle\\doc\\excel\\南宁市青秀区教育局2021.XLS";
    public static String fileName12 = "D:\\ideaProject\\gx-final-account\\doc\\excel\\2022_广西桂平市房屋和土地征收服务中心.XLS";
    public static String fileName13 = "D:\\ideaProject\\gx-final-account\\doc\\excel\\2021_广西桂平市房屋和土地征收服务中心.XLS";

    public static String fileName15 = "F:\\code\\gx-final-account-oracle\\doc\\excel\\广西桂平市社会福利院_2022.XLS";
    public static String fileName16 = "F:\\code\\gx-final-account-oracle\\doc\\excel\\广西桂平市社会福利院_2021.XLS";
    public static String fileName18 = "F:\\out\\桂平测试\\广西桂平市金田镇经济发展中心.XLS";
    public static String fileName20 = "F:\\out\\桂平测试\\桂平市住房和城乡建设局.2022.XLS";
    public static String fileName21 = "F:\\out\\桂平测试\\桂平市住房和城乡建设局.2021.XLS";

    public static String fileName22 = "F:\\out\\田东测试\\田东县那拔镇（汇总）.2022.XLS";
    public static String fileName23 = "F:\\out\\田东测试\\田东县那拔镇（汇总）.2021.XLS";

    public static String fileName25 = "F:\\out\\决算\\23凭祥\\凭祥市财政局.23.xlsx";
    public static String fileName26 = "F:\\out\\决算\\23凭祥\\凭祥市财政局.22.xlsx";
    public static String fileName27 = "F:\\out\\决算\\桂平测试\\决算测试-2022年度\\广西桂平市博物馆.2022.XLS";
    public static String fileName28 = "F:\\out\\决算\\桂平测试\\决算测试-2022年度\\广西桂平市博物馆.2021.XLS";

//    static String fileName = "D:\\code\\gx-final-account\\doc\\excel\\1111.082112.xls";
//    public static String fileName = "D:\\code\\gx-final-account\\doc\\excel\\2022-青秀区财政局.0828.xls";
//    static String fileName = "D:\\code\\gx-final-account\\doc\\excel\\2021-青秀区财政局.0828.xls";

    @SneakyThrows
    public static void main(String[] args) {
        //getSheetInfos(null, fileName);
        FinalExcelDataVo finalExcelLastYearDataVo = ReadFinalExcelY22Utils.getSheetInfos(null, fileName27, 0);
        log.debug("读取完毕");
    }

    /**
     * 读取 决算excel的数据
     * @return
     */

    public static FinalExcelDataVo getSheetInfos(MultipartFile file, String fileName) throws IOException {
        return getSheetInfos(file, fileName, null);
    }

    /**
     * 读取 excel数据
     * 只需传一种方式， 当传文件时，直接读取文件
     * @param file 文件实体
     * @param fileName 文件路径名
     * @return
     * @throws IOException
     */
    public static FinalExcelDataVo getSheetInfos(MultipartFile file, String fileName, Integer lastYearFlag) throws IOException {
        // step1. 读取excel内容
        EasyExcelFinalListener easyExcelFinalListener = new EasyExcelFinalListener();
        ExcelReaderBuilder read = new ExcelReaderBuilder();
        //        ExcelReaderBuilder read = EasyExcelFactory.read(file.getInputStream(), easyExcelListener);
        if(null != file) {
            read = EasyExcelFactory.read(file.getInputStream(), easyExcelFinalListener);
        } else if(StringUtils.isNotBlank(fileName)) {
            read = EasyExcelFactory.read(fileName, easyExcelFinalListener);
        } else {
            throw new ServiceException("文件读取异常");
        }

        ExcelReader excelReader = read.build();
        // step2. 获取各个sheet页信息
        List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();
        // step3. 获取各个Shhet页表格内容存于map
        Map<Integer, List<LinkedHashMap<Integer, String>>> sheetInfos = new HashMap<>(sheets.size());
        for (ReadSheet sheet : sheets) {
            Integer sheetNo = sheet.getSheetNo();
            String sheetName =  sheet.getSheetName();
            excelReader.read(sheet);
            if(null != lastYearFlag && lastYearFlag == 1 ) {
                //限制去年的数据只取这几张表
                if(sheetNo.equals(0) || sheetNo.equals(1) || sheetNo.equals(10)) {
                    sheetInfos.put(sheetNo, easyExcelFinalListener.getListMap());
                }
            } else {
                sheetInfos.put(sheetNo, easyExcelFinalListener.getListMap());
            }

            //TODO 判断sheet是否顺序一致的问题
        }
        //保存
//        iSettlementMothReportService.saveExcelInfo(sheetInfos);
        FinalExcelDataVo vo = new FinalExcelDataVo();

        //p3t8 初始化
        FinalP3T8Vo p3T8Vo = new FinalP3T8Vo();
        p3T8Vo.setPerformance("");
        p3T8Vo.setAssessment("");
        p3T8Vo.setNoFillFlag(0);
        vo.setP3T8Vo(p3T8Vo);

        ReadFinalExcelY22Utils readFinalExcelY22Utils = new ReadFinalExcelY22Utils();
        readFinalExcelY22Utils.saveExcelInfo(sheetInfos, vo);


//        log.debug("sheetInfo [{}]", sheetInfos);
        return vo;
    }


    /**
     * 读取各个sheet表格的数据
     * @param sheetInfos
     */
    public void saveExcelInfo(Map<Integer, List<LinkedHashMap<Integer, String>>> sheetInfos, FinalExcelDataVo vo) {
//        SettlementMothReportSaveDTO settlementMothReportSaveDTO = new SettlementMothReportSaveDTO();
//        FinalExcelDataVo vo = new FinalExcelDataVo();
        for (Integer sheetNo : sheetInfos.keySet()) {
            List<LinkedHashMap<Integer, String>> maps = sheetInfos.get(sheetNo);
            // 不同sheet页数据处理方式不同
            switch (sheetNo) {
                case 0:
                    //表一 Z01
                    setTZ01T1Report(maps, vo);
                    break;
                case 3:
                    //表二 Z03
                    setTZ03T2Report(maps, vo);
                    break;
                case 4:
                    //表三 Z04
                    setTZ04T3Report(maps, vo);
                    break;
                case 1:
                    //表四 Z01_1
                    setTZ01S1T4Report(maps, vo);
                    break;
                case 10:
                    //表五 Z07
                    setTZ07T5Report(maps, vo);
                    break;
                case 11:
                    //p3t2 list z08财决表
                    setZ08P3T2Report(maps, vo);
                    break;
                case 12:
                    //表6 z08_1
                    setZ08S1T6Report(maps, vo);
                    break;
                case 21:
                    //基本数字表  F02 基本数字表(财决附02表)
                    setTF02Report(maps, vo);
                    break;
                case 22:
                    //表7 f03
                    setTF03T7Report(maps, vo);
                    break;
                case 14:
                    //表8 z09
                    setTZ09T8Report(maps, vo);
                    break;
                case 18:
                    //表9 z11
                    setTZ11T9Report(maps, vo);
                    break;
                case 27:
                    //CS02 主要指标变动情况表, 第3部分使用到
                    setP3T2Cs02Report(maps, vo);
                    break;
                default:
                    break;
            }
        }
        //log.debug("运行结果 [{}]", JSONUtil.toJsonStr(vo));
//        iBzjBaseInfoService.saveSettlementMothReport(settlementMothReportSaveDTO);
    }

    /**
     * 读取 z01财决01表 (表一)
     * @param maps
     * @param vo
     */
    private void setTZ01T1Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //z01对象
        FinalZ01Vo tvo = new FinalZ01Vo();
        List<FinalZ01ItemVo> list = new ArrayList<>();
        tvo.setList(list);

        FinalP3T1Vo p3T1Vo = new FinalP3T1Vo();

        // 是否读取项目的List
        boolean isListFlag = false;


        if(!maps.isEmpty() && null != maps.get(2) ) {
            //取部门, 编制单位
            String deptName = maps.get(2).getOrDefault(0, "").trim();
            deptName = StringUtils.isNotBlank(deptName) ? deptName.substring(deptName.indexOf("：") + 1) : "编制单位未找到";
            vo.setDeptName(deptName);

            //取年度
            String year = maps.get(2).getOrDefault(7, "").trim();
            year = StringUtils.isNotBlank(year) ? year.substring(0, year.lastIndexOf("年")) : "2023";
            vo.setYear(year);
            Integer yearLast = Integer.valueOf(year) - 1;
            vo.setYearLast(String.valueOf(yearLast));
        }


        for (LinkedHashMap<Integer, String> map : maps) {
            //行对象
            FinalZ01ItemVo itemVo = new FinalZ01ItemVo();

            if(map.containsValue("本年收入合计")) {
                //读取本年的收入， 支出合计
                isListFlag = false;
                tvo.setIncomeYearTotal(FinalY22Utils.getMapNumFormat(map, 4));
                tvo.setExpenditureYearTotal(FinalY22Utils.getMapNumFormat(map, 14));

                //添加到 循环list中
                itemVo.setRowNo(map.getOrDefault(1, "").replace(",",""));
                itemVo.setIncomeName(FinalY22Utils.getMapSubString(map, 0, "、"));
                itemVo.setIncomeValue(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setExpenditureName(FinalY22Utils.getMapSubString(map, 5, "、"));
                itemVo.setExpenditureValue(FinalY22Utils.getMapNumFormat(map, 14));

                //判断是否是空行， 空行就不添加
                if(StringUtils.isBlank(itemVo.getIncomeName()) && StringUtils.isBlank(itemVo.getExpenditureName()) ) {
                    continue;
                }
                list.add(itemVo);
            }


            //读取项目的list 收入 支出的明细
            if(isListFlag) {
//                log.debug("财决01 项目 [{}]", map);
                //行次
                itemVo.setRowNo(map.getOrDefault(1, "").replace(",",""));
                itemVo.setIncomeName( FinalY22Utils.getMapSubString(map, 0, "、") );
                itemVo.setIncomeValue(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setExpenditureName(FinalY22Utils.getMapSubString(map, 5, "、"));
                itemVo.setExpenditureValue(FinalY22Utils.getMapNumFormat(map, 9));

                //判断是否是空行， 空行就不添加
                if(StringUtils.isBlank(itemVo.getIncomeName()) && StringUtils.isBlank(itemVo.getExpenditureName()) ) {
                    continue;
                }
                list.add(itemVo);
                continue;
            }

            if(map.containsValue("栏次")) {
                isListFlag = true;
            }

            //总计也放在循环中
            if(map.containsValue("使用非财政拨款结余")) {
                //读取 使用非财政拨款结余
                tvo.setIncomeRest(FinalY22Utils.getMapNumFormat(map, 4));
                tvo.setExpenditureRest(FinalY22Utils.getMapNumFormat(map, 14));

                //添加到 循环list中
                itemVo.setRowNo(map.getOrDefault(1, "").replace(",",""));
                itemVo.setIncomeName(FinalY22Utils.getMapSubString(map, 0, "、"));
                itemVo.setIncomeValue(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setExpenditureName(FinalY22Utils.getMapSubString(map, 5, "、"));
                itemVo.setExpenditureValue(FinalY22Utils.getMapNumFormat(map, 14));

                //判断是否是空行， 空行就不添加
                if(StringUtils.isBlank(itemVo.getIncomeName()) && StringUtils.isBlank(itemVo.getExpenditureName()) ) {
                    continue;
                }
                list.add(itemVo);
            }

            if(map.containsValue("年初结转和结余")) {
                //读取 年初结转和结余
                tvo.setIncomeYearBegin(FinalY22Utils.getMapNumFormat(map, 4));
                tvo.setExpenditureYearEnd(FinalY22Utils.getMapNumFormat(map, 14));

                //添加到 循环list中
                itemVo.setRowNo(map.getOrDefault(1, "").replace(",",""));
                itemVo.setIncomeName(FinalY22Utils.getMapSubString(map, 0, "、"));
                itemVo.setIncomeValue(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setExpenditureName(FinalY22Utils.getMapSubString(map, 5, "、"));
                itemVo.setExpenditureValue(FinalY22Utils.getMapNumFormat(map, 14));

                //判断是否是空行， 空行就不添加
                if(StringUtils.isBlank(itemVo.getIncomeName()) && StringUtils.isBlank(itemVo.getExpenditureName()) ) {
                    continue;
                }
                list.add(itemVo);
            }

            if(map.containsValue("总计")) {
                //读取 年初结转和结余
                tvo.setIncomeTotal(FinalY22Utils.getMapNumFormat(map, 4));
                tvo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 14));

                //添加到 循环list中
                itemVo.setRowNo(map.getOrDefault(1, "").replace(",",""));
                itemVo.setIncomeName(FinalY22Utils.getMapSubString(map, 0, "、"));
                itemVo.setIncomeValue(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setExpenditureName(FinalY22Utils.getMapSubString(map, 5, "、"));
                itemVo.setExpenditureValue(FinalY22Utils.getMapNumFormat(map, 14));

                //判断是否是空行， 空行就不添加
                if(StringUtils.isBlank(itemVo.getIncomeName()) && StringUtils.isBlank(itemVo.getExpenditureName()) ) {
                    continue;
                }
                list.add(itemVo);

                break;
            }
        }

        //设置 z01
        vo.setT1Z01Vo(tvo);

        //设置 p3p1部分
        setP3P1Data(tvo, vo);

    }

    /**
     * 设置 第三部分第一部分
     * @param yearData
     */
    private void setP3P1Data(FinalZ01Vo yearData, FinalExcelDataVo vo) {

        String year = vo.getYear();
        String lastYear = String.valueOf(Integer.valueOf(year) - 1);

        //p3p1部分
        FinalP3T1Vo p3T1Vo = new FinalP3T1Vo();

        //收入/支出
        FinalP3T1TotalVo incomeVo = new FinalP3T1TotalVo();
        p3T1Vo.setIncome(incomeVo);
        FinalP3T1TotalVo expenditureVo = new FinalP3T1TotalVo();
        p3T1Vo.setExpenditure(expenditureVo);

        incomeVo.setTotal(yearData.getIncomeTotal());
        incomeVo.setTotalYear(yearData.getIncomeYearTotal());
        incomeVo.setTotalLastYear("0");

        expenditureVo.setTotal(yearData.getExpenditureTotal());
        expenditureVo.setTotalYear(yearData.getExpenditureYearTotal());
        expenditureVo.setTotalLastYear("0");

        //收入 较2020年度决算数2,488.67万元，减少948.36万元，下降38.11%。
        String addOrSubStr = FinalY22Utils.getAddOrSubString(incomeVo.getTotalYear(), incomeVo.getTotalLastYear());
        String compareLastYear = String.format("较%s年度决算数%s万元，%s", lastYear,
                incomeVo.getTotalLastYear(), addOrSubStr);
//                NumberUtil.decimalFormat(",###.00", incomeVo.getTotalLastYear()), addOrSubStr);
        incomeVo.setCompareLastYear(compareLastYear);

        //支出 较2020年度决算数2,488.67万元，减少948.36万元，下降38.11%
        String addOrSubStr2 = FinalY22Utils.getAddOrSubString(expenditureVo.getTotalYear(), expenditureVo.getTotalLastYear());
        String compareLastYear2 = String.format("较%s年度决算数%s万元，%s", lastYear,
                expenditureVo.getTotalLastYear(), addOrSubStr2);
//                NumberUtil.decimalFormat(",###.00", incomeVo.getTotalLastYear()), addOrSubStr);
        expenditureVo.setCompareLastYear(compareLastYear2);

        List<FinalP3T1TotalItemVo> incomeList = new ArrayList<>();
        incomeVo.setList(incomeList);
        List<FinalP3T1TotalItemVo> expenditureList = new ArrayList<>();
        expenditureVo.setList(expenditureList);

        List<FinalZ01ItemVo> z01ItemVoList = yearData.getList();
        List<FinalZ01ItemVo> z01ItemVoLastList = new ArrayList<>();
        int indexNoIncome = 1;
        int indexNoExpenditure = 1;
        //比对数据项
        for (FinalZ01ItemVo item : z01ItemVoList) {
            //FinalZ01ItemVo itemLastYear = z01ItemVoLastList.stream().filter(i->i.getRowNo().equals(item.getRowNo())).findFirst().orElse(null);
            FinalZ01ItemVo itemLastYear = z01ItemVoLastList.stream().filter(i->i.getRowNo().equals(item.getRowNo())).findFirst().orElse(null);
            /*if(null == itemLastYear) {
                log.error("未找到旧数据");
                continue;
            }*/
            //收入
            if(StringUtils.isNotBlank(item.getIncomeName()) && !item.getIncomeName().equals("本年收入合计") && !item.getIncomeName().equals("总计") ) {
                FinalP3T1TotalItemVo incomeItem = new FinalP3T1TotalItemVo();

                incomeItem.setValueYear(item.getIncomeValue());
                incomeItem.setValueLastYear("0");
                incomeItem.setName(item.getIncomeName());
                incomeItem.setRowNo(item.getRowNo());

                //一般公共预算财政拨款收入1,490.22 万元，为田阳区财政当年拨付的资金。较2020年度决算数2,107.15万元，减少616.93万元，下降29.28% ，主要原因是
                String addOrSubStrItem = FinalY22Utils.getAddOrSubString(incomeItem.getValueYear(), incomeItem.getValueLastYear());
                /*String compareLastYearItem = String.format("%s.%s %s 万元。较%s年度决算数%s万元，%s",
                        item.getRowNo(), item.getIncomeName().substring(item.getIncomeName().indexOf("、")+1), incomeItem.getValueYear(), lastYear, incomeItem.getValueLastYear(),  addOrSubStrItem);*/
                String compareLastYearItem = FinalY22Utils.getInfoCompareStrItemP3T1(incomeItem.getValueLastYear(), lastYear, addOrSubStrItem);

                incomeItem.setCompareLastYear(compareLastYearItem);
                String info = FinalY22Utils.getInfoStrItemP3T1( item.getIncomeName(), incomeItem.getValueYear());
                if(incomeItem.getName().equals("年初结转和结余")) {
                    info += "，为以前年度支出预算因客观条件变化未执行完毕、结转到本年度按有关规定继续使用的资金";
                }
                incomeItem.setInfo(info);
                Integer infoDescFlag = 1 == FinalY22Utils.getFlagByValue( incomeItem.getValueYear(), "0") && incomeItem.getName().equals("其他收入") ? 1 : 0;
                incomeItem.setInfoDescFlag(infoDescFlag);
                //本单位2022年无该项收入，故无数据情况说明。
                incomeItem.setReason(FinalY22Utils.getReasonStrItem(incomeItem.getValueYear(), incomeItem.getValueLastYear(), "本单位年度无该项收入，故无数据情况说明"));
                incomeItem.setReasonFlag(FinalY22Utils.getFlagByValue(incomeItem.getValueYear(), incomeItem.getValueLastYear()));
                incomeList.add(incomeItem);
                indexNoIncome++;
            }


            //支出
            if(StringUtils.isNotBlank(item.getExpenditureName()) && !item.getExpenditureName().equals("本年支出合计") && !item.getExpenditureName().equals("总计") ) {
                FinalP3T1TotalItemVo expenditureItem = new FinalP3T1TotalItemVo();

                expenditureItem.setValueYear(item.getExpenditureValue());
                expenditureItem.setValueLastYear("0");
                expenditureItem.setName(item.getExpenditureName());
                expenditureItem.setRowNo(item.getRowNo());

                //一般公共预算财政拨款收入1,490.22 万元，为田阳区财政当年拨付的资金。较2020年度决算数2,107.15万元，减少616.93万元，下降29.28% ，主要原因是
                String addOrSubStrItem = FinalY22Utils.getAddOrSubString(expenditureItem.getValueYear(), expenditureItem.getValueLastYear());
                /*String compareLastYearItem = String.format("%s.%s%s万元。较%s年度决算数%s万元，%s", indexNoExpenditure++,
                        item.getExpenditureName().substring(item.getExpenditureName().indexOf("、")+1), item.getExpenditureValue(), lastYear,
                        itemLastYear.getExpenditureValue(), addOrSubStrItem);*/
                String compareLastYearItem = FinalY22Utils.getInfoCompareStrItemP3T1(expenditureItem.getValueLastYear(), lastYear, addOrSubStrItem);


                expenditureItem.setCompareLastYear(compareLastYearItem);
                expenditureItem.setInfo(FinalY22Utils.getInfoStrItemP3T1( item.getExpenditureName(), expenditureItem.getValueYear()));
                expenditureItem.setInfoDescFlag(FinalY22Utils.getFlagByValue( expenditureItem.getValueYear(), "0"));
                //本单位2022年无该项支出，故无数据情况说明。
                expenditureItem.setReason(FinalY22Utils.getReasonStrItem(expenditureItem.getValueYear(), expenditureItem.getValueLastYear(), "本单位年度无该项支出，故无数据情况说明"));
                expenditureItem.setReasonFlag(FinalY22Utils.getFlagByValue(expenditureItem.getValueYear(), expenditureItem.getValueLastYear()));
                expenditureList.add(expenditureItem);
            }
        }

        //收入-非财政拨款结余, 收入-上年结转和结余, 支出-结余分配, 支出-年末结转和结余
        //FinalY22CompareLastUtils.setIncomeExpenditureRestEnd(yearData, null, indexNoIncome, indexNoExpenditure, lastYear, incomeList, expenditureList);

        //设置p3p1部分
        vo.setP3T1Vo(p3T1Vo);
    }

    /**
     * Z03 收入决算表(财决03表) (第二部分的表二)2023年
     * @param maps
     * @param vo
     */
    private void setTZ03T2Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //z01对象
        FinalZ03Vo tvo = new FinalZ03Vo();
        List<FinalZ03ItemVo> list = new ArrayList<>();
        tvo.setList(list);

        // 是否读取项目的List
        boolean isListFlag = false;

        for (LinkedHashMap<Integer, String> map : maps) {
            if(isListFlag && (null == map.get(0) || StringUtils.isBlank(map.get(0)))) {
                isListFlag = false;
                break;
            }

            //读取项目的list 收入 支出的明细
            if(isListFlag) {
//                log.debug("财决03 项目 [{}]", map);
                FinalZ03ItemVo itemVo = new FinalZ03ItemVo();
                itemVo.setCode(map.getOrDefault(0, ""));
                itemVo.setName(map.getOrDefault(3, ""));
                itemVo.setTotal(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setAllocation(FinalY22Utils.getMapNumFormat(map, 5));
                itemVo.setSubsidy(FinalY22Utils.getMapNumFormat(map, 6));
                itemVo.setProfession(FinalY22Utils.getMapNumFormat(map, 7));
                itemVo.setOperation(FinalY22Utils.getMapNumFormat(map, 9));
                itemVo.setSubsidiary(FinalY22Utils.getMapNumFormat(map, 10));
                itemVo.setOther(FinalY22Utils.getMapNumFormat(map, 11));
                list.add(itemVo);
                continue;
            }

            if(map.containsValue("合计")) {
                isListFlag = true;
                tvo.setTotal(FinalY22Utils.getMapNumFormat(map, 4));
                tvo.setAllocation(FinalY22Utils.getMapNumFormat(map, 5));
                tvo.setSubsidy(FinalY22Utils.getMapNumFormat(map, 6));
                tvo.setProfession(FinalY22Utils.getMapNumFormat(map, 7));
                tvo.setOperation(FinalY22Utils.getMapNumFormat(map, 9));
                tvo.setSubsidiary(FinalY22Utils.getMapNumFormat(map, 10));
                tvo.setOther(FinalY22Utils.getMapNumFormat(map, 11));
            }
        }

        //设置 z03
        vo.setT2Z03Vo(tvo);
    }

    /**
     * Z04 支出决算表(财决04表) (第二部分的表三)2023年
     * @param maps
     * @param vo
     */
    private void setTZ04T3Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //z01对象
        FinalZ04Vo tvo = new FinalZ04Vo();
        List<FinalZ04ItemVo> list = new ArrayList<>();
        tvo.setList(list);

        // 是否读取项目的List
        boolean isListFlag = false;

        for (LinkedHashMap<Integer, String> map : maps) {
            if(isListFlag && (null == map.get(0) || StringUtils.isBlank(map.get(0)))) {
                isListFlag = false;
                break;
            }

            //读取项目的list 收入 支出的明细
            if(isListFlag) {
//                log.debug("财决04 项目 [{}]", map);
                FinalZ04ItemVo itemVo = new FinalZ04ItemVo();
                itemVo.setCode(map.getOrDefault(0, ""));
                itemVo.setName(map.getOrDefault(3, ""));
                itemVo.setTotal(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setBase(FinalY22Utils.getMapNumFormat(map, 5));
                itemVo.setProject(FinalY22Utils.getMapNumFormat(map, 6));
                itemVo.setParent(FinalY22Utils.getMapNumFormat(map, 7));
                itemVo.setOperation(FinalY22Utils.getMapNumFormat(map, 8));
                itemVo.setSubsidiary(FinalY22Utils.getMapNumFormat(map, 9));
                list.add(itemVo);
                continue;
            }

            if(map.containsValue("合计")) {
                isListFlag = true;
                tvo.setTotal(FinalY22Utils.getMapNumFormat(map, 4));
                tvo.setBase(FinalY22Utils.getMapNumFormat(map, 5));
                tvo.setProject(FinalY22Utils.getMapNumFormat(map, 6));
                tvo.setParent(FinalY22Utils.getMapNumFormat(map, 7));
                tvo.setOperation(FinalY22Utils.getMapNumFormat(map, 8));
                tvo.setSubsidiary(FinalY22Utils.getMapNumFormat(map, 9));
            }
        }

        //设置 z04
        vo.setT3Z04Vo(tvo);
    }

    /**
     * Z01_1 财政拨款收入支出决算总表(财决01-1表) (第二部分的表四) 2023年
     * @param maps
     * @param vo
     */
    private void setTZ01S1T4Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //z01对象
        FinalZ01S1Vo tvo = new FinalZ01S1Vo();
        List<FinalZ01S1ItemVo> list = new ArrayList<>();
        tvo.setList(list);

        // 是否读取项目的List
        boolean isListFlag = false;
        //经济分类支出合计的list
        boolean isEconomicsListFlag = false;

        //是否读取 功能分类科目 list
        boolean isFunctionListFlag = false;

        //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目
        FinalP3T2Vo p3T2Vo = new FinalP3T2Vo();
        //项的大类
        List<FinalP3T2CategoryItemVo> p3T2List = new ArrayList<>();
        p3T2Vo.setList(p3T2List);
        //项的列表移动到 财决z8表
        /*List<FinalP3T2ItemVo> p3T2List = new ArrayList<>();
        p3T2Vo.setList(p3T2List);*/


        //3.3部分的年度一般公共预算财政拨款基本支出决算情况说明 经济分类支出科目
        //FinalP3T3Vo p3T3Vo = new FinalP3T3Vo();
        //List<FinalP3T3ItemVo> p3T3ItemList = new ArrayList<>();
        //p3T3Vo.setList(p3T3ItemList);

        //3.4年度政府性基金支出决算情况 (第三部分的第四) 决算项级功能分类科目综述
        FinalP3T4Vo p3T4Vo = new FinalP3T4Vo();
        List<FinalP3T4CategoryItemVo> p3T4CategoryList = new ArrayList<>();
        p3T4Vo.setList(p3T4CategoryList);

        //3.5年度国有资本经营预算支出决算情况 决算项级功能分类科目综述
        FinalP3T5Vo p3T5Vo = new FinalP3T5Vo();
        List<FinalP3T5CategoryItemVo> p3T5CategoryList = new ArrayList<>();
        p3T5Vo.setList(p3T5CategoryList);

        for (LinkedHashMap<Integer, String> map : maps) {

            //经济分类支出合计的list 结束
            if(isEconomicsListFlag && StringUtils.isBlank(map.get(19))) {
                isEconomicsListFlag = false;
            }

            if(map.containsValue("本年收入合计")) {
                tvo.setIncomeYearTotal(FinalY22Utils.getMapNumFormat(map, 4));
                tvo.setExpenditureYearSubtotal(FinalY22Utils.getMapNumFormat(map, 15));
            }

            //政府性基金预算财政拨款 一、基本支出
            if( "基本支出".equals(FinalY22Utils.getMapSubString(map, 19, "、") ) ) {
                p3T4Vo.setExpenditureBase(FinalY22Utils.getMapNumFormat(map, 31));
            }
            //二、项目支出
            if( "项目支出".equals(FinalY22Utils.getMapSubString(map, 19, "、") ) ) {
                p3T4Vo.setExpenditureProject(FinalY22Utils.getMapNumFormat(map, 31));
            }

            //本年支出合计
            if(map.containsValue("本年支出合计")) {
                //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目
                p3T2Vo.setExpenditureBudgetBegin(FinalY22Utils.getMapNumFormat(map, 8));
                p3T2Vo.setExpenditureFinal(FinalY22Utils.getMapNumFormat(map, 16));
                p3T2Vo.setExpenditureBudgetRatio(FinalY22Utils.getSuccessRatio(p3T2Vo.getExpenditureFinal(), p3T2Vo.getExpenditureBudgetBegin()));

                //3.4政府性基金支出决算情况
                p3T4Vo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 17));
                p3T4Vo.setExpenditureBudgetBegin(FinalY22Utils.getMapNumFormat(map, 9));
                p3T4Vo.setExpenditureFinal(FinalY22Utils.getMapNumFormat(map, 17));
                p3T4Vo.setExpenditureBudgetRatio(FinalY22Utils.getSuccessRatio(p3T4Vo.getExpenditureFinal(), p3T4Vo.getExpenditureBudgetBegin()));
                //标记 新导入 类款项
                p3T4Vo.setShowNewItemFlag(1);

                //判断 p3p4政府性基金支出 是否=0, =0时无lsit, 年初预算-年度政府性基金支出 支出决算-年度政府性基金支出
                if( 0 == FinalY22Utils.getFlagByValue(p3T4Vo.getExpenditureBudgetBegin(), p3T4Vo.getExpenditureFinal()) ) {
                    p3T4Vo.setNoListFlag(1);
                    p3T4Vo.setNoListReason(String.format("单位%s年度没有政府性基金收入，也没有政府性基金安排的支出，故无数据情况说明",  vo.getYear()));
                }

                //3.5年度国有资本经营预算支出决算情况 决算项级功能分类科目综述
                p3T5Vo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 18));
                p3T5Vo.setExpenditureBudgetBegin(FinalY22Utils.getMapNumFormat(map, 10));
                p3T5Vo.setExpenditureFinal(FinalY22Utils.getMapNumFormat(map, 18));
                p3T5Vo.setExpenditureBudgetRatio(FinalY22Utils.getSuccessRatio(p3T5Vo.getExpenditureFinal(), p3T5Vo.getExpenditureBudgetBegin()));
                p3T5Vo.setExpenditureBase("0.00");
                p3T5Vo.setExpenditureProject(p3T5Vo.getExpenditureTotal());

                //判断 p3p5国有资本经营预算支出是否=0, =0时无lsit
                if( 0 == FinalY22Utils.getFlagByValue(p3T5Vo.getExpenditureTotal(), "0") ) {
                    p3T5Vo.setNoListFlag(1);
                    p3T5Vo.setNoListReason(String.format("%s年度没有国有资本经营预算财政拨款收入，也没有国有资本经营预算财政拨款安排的支出，故无数据情况说明", vo.getYear()));
                }

                //不读取 功能分类科目 list
                isFunctionListFlag = false;
            }

            if(map.containsValue("总计")) {
                tvo.setIncomeTotal(FinalY22Utils.getMapNumFormat(map, 4));
                tvo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 15));
            }


            //废弃 取 z08_1 3.3部分的年度一般公共预算财政拨款基本支出决算情况说明 经济分类支出科目
            if(isEconomicsListFlag) {
                /*FinalP3T3ItemVo p3T3ItemVo = new FinalP3T3ItemVo();
                //p3T3ItemVo.setBeginValue(FinalY22Utils.getMapNumFormat(map, 21));
                //取另外的数据值 z08_1
                p3T3ItemVo.setBeginValue("0.00");
                p3T3ItemVo.setFinalValue(FinalY22Utils.getMapNumFormat(map, 29));
                p3T3ItemVo.setRatio(FinalY22Utils.getSuccessRatio(p3T3ItemVo.getFinalValue(), p3T3ItemVo.getBeginValue()));
                p3T3ItemVo.setName(FinalY22Utils.getMapSubString(map, 19, "、" ));
                p3T3ItemVo.setRowNo(map.getOrDefault(20, ""));
                p3T3ItemVo.setInfo(FinalY22Utils.getInfoStrP3T3(p3T3ItemVo.getName(), p3T3ItemVo.getFinalValue(), p3T3ItemVo.getBeginValue(), p3T3ItemVo.getRatio()));
                p3T3ItemVo.setList(new ArrayList<>());

                p3T3ItemList.add(p3T3ItemVo);*/
            }

            if(map.containsValue("经济分类支出合计")) {

                //p3T3Vo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 29));

                isEconomicsListFlag = true;
            }

            //读取项目的list 收入 支出的明细
            if(isListFlag) {
//                log.debug("财决01_1 项目 [{}]", map);
                FinalZ01S1ItemVo itemVo = new FinalZ01S1ItemVo();
                itemVo.setIncomeName(map.getOrDefault(0, ""));
                itemVo.setIncomeRowNo(map.getOrDefault(1, ""));
                itemVo.setIncomeValue(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setExpenditureName(map.getOrDefault(5, ""));
                itemVo.setExpenditureRowNo(map.getOrDefault(6, ""));
                itemVo.setExpenditureSubtotal(FinalY22Utils.getMapNumFormat(map, 15));
                itemVo.setExpenditurePublic(FinalY22Utils.getMapNumFormat(map, 16));
                itemVo.setExpenditureGovernment(FinalY22Utils.getMapNumFormat(map, 17));
                itemVo.setExpenditureState(FinalY22Utils.getMapNumFormat(map, 18));
                list.add(itemVo);

                //功能分类科目
                if(isFunctionListFlag) {
                    //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目 移动到 财决z8表(_01)
                    /*FinalP3T2ItemVo p3T2ItemVo = new FinalP3T2ItemVo();
                    p3T2ItemVo.setName(FinalY22Utils.getMapSubString(map, 5, "、" ));
                    p3T2ItemVo.setRowNo(map.getOrDefault(6, ""));
                    p3T2ItemVo.setBeginValue(FinalY22Utils.getMapNumFormat(map, 7));
                    p3T2ItemVo.setFinalValue(FinalY22Utils.getMapNumFormat(map, 15));
                    p3T2ItemVo.setRatio(FinalY22Utils.getSuccessRatio(p3T2ItemVo.getFinalValue(), p3T2ItemVo.getBeginValue()));
                    p3T2ItemVo.setInfo(FinalY22Utils.getInfoStr(p3T2ItemVo.getName(), p3T2ItemVo.getFinalValue(), p3T2ItemVo.getBeginValue(), p3T2ItemVo.getRatio()));
                    p3T2List.add(p3T2ItemVo);*/
                    //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目 移动到 财决z8表(_01)
                    FinalP3T2CategoryItemVo p3T2CategoryItemVo = new FinalP3T2CategoryItemVo();
                    p3T2CategoryItemVo.setName(FinalY22Utils.getMapSubString(map, 5, "、" ));
                    p3T2CategoryItemVo.setRowNo(map.getOrDefault(6, ""));
                    p3T2CategoryItemVo.setBeginValue(FinalY22Utils.getMapNumFormat(map, 8));
                    p3T2CategoryItemVo.setFinalValue(FinalY22Utils.getMapNumFormat(map, 16));
                    //p3T2CategoryItemVo.setRatio(FinalY22Utils.getSuccessRatio(p3T2ItemVo.getFinalValue(), p3T2ItemVo.getBeginValue()));
                    p3T2CategoryItemVo.setInfo(String.format("%s（类）决算数为%s万元，年初预算为%s万元", p3T2CategoryItemVo.getName(), p3T2CategoryItemVo.getFinalValue(), p3T2CategoryItemVo.getBeginValue()));
                    p3T2CategoryItemVo.setList(new ArrayList<>());
                    p3T2List.add(p3T2CategoryItemVo);

                    //3.4政府性基金支出决算情况 记录大于 0
                    String govTotal = FinalY22Utils.getMapNumFormat(map, 17);
                    if( 1 == FinalY22Utils.compareValue(govTotal, "0")) {
                        FinalP3T4CategoryItemVo p3T4CategoryItemVo = new FinalP3T4CategoryItemVo();
                        p3T4CategoryItemVo.setName(FinalY22Utils.getMapSubString(map, 5, "、" ));
                        p3T4CategoryItemVo.setRowNo(map.getOrDefault(6, ""));
                        p3T4CategoryItemVo.setBeginValue(FinalY22Utils.getMapNumFormat(map, 9));
                        p3T4CategoryItemVo.setFinalValue(FinalY22Utils.getMapNumFormat(map, 17));
                        p3T4CategoryItemVo.setRatio(FinalY22Utils.getSuccessRatio(p3T4CategoryItemVo.getFinalValue(), p3T4CategoryItemVo.getBeginValue()));
                        p3T4CategoryItemVo.setInfo(FinalY22Utils.getInfoStr(p3T4CategoryItemVo.getName(), p3T4CategoryItemVo.getFinalValue(), p3T4CategoryItemVo.getBeginValue(), p3T4CategoryItemVo.getRatio()));
                        p3T4CategoryItemVo.setList(new ArrayList<>());
                        p3T4CategoryList.add(p3T4CategoryItemVo);
                    }


                    //3.5年度国有资本经营预算支出决算情况 决算项级功能分类科目综述
                    String p3T5CategoryItemTotal = FinalY22Utils.getMapNumFormat(map, 18);
                    if( 1 == FinalY22Utils.compareValue(p3T5CategoryItemTotal, "0")) {
                        FinalP3T5CategoryItemVo p3T5CategoryVo = new FinalP3T5CategoryItemVo();
                        p3T5CategoryVo.setName(FinalY22Utils.getMapSubString(map, 5, "、" ));
                        p3T5CategoryVo.setRowNo(map.getOrDefault(6, ""));
                        p3T5CategoryVo.setBeginValue(FinalY22Utils.getMapNumFormat(map, 10));
                        p3T5CategoryVo.setFinalValue(FinalY22Utils.getMapNumFormat(map, 18));
                        p3T5CategoryVo.setRatio(FinalY22Utils.getSuccessRatio(p3T5CategoryVo.getFinalValue(), p3T5CategoryVo.getBeginValue()));
                        p3T5CategoryVo.setInfo(FinalY22Utils.getInfoStr(p3T5CategoryVo.getName(), p3T5CategoryVo.getFinalValue(), p3T5CategoryVo.getBeginValue(), p3T5CategoryVo.getRatio()));
                        p3T5CategoryList.add(p3T5CategoryVo);
                    }


                }


                if(map.containsValue("总计")) {
                    isListFlag = false;
                    break;
                }
                continue;
            }

            if(map.containsValue("栏    次")) {
                isListFlag = true;
                isFunctionListFlag = true;
            }


        }

        //设置 z04
        vo.setT4Z01S1Vo(tvo);

        //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目
        vo.setP3T2Vo(p3T2Vo);

        // 取 z08_1 3.3部分的年度一般公共预算财政拨款基本支出决算情况说明 经济分类支出科目
        //vo.setP3T3Vo(p3T3Vo);

        //3.4年度政府性基金支出决算情况 (第三部分的第四) 决算项级功能分类科目综述
        vo.setP3T4Vo(p3T4Vo);

        //3.5年度国有资本经营预算支出决算情况 决算项级功能分类科目综述
        vo.setP3T5Vo(p3T5Vo);
    }

    /**
     * Z07 一般公共预算财政拨款收入支出决算表(财决07表) (第二部分的表五)2023年
     * @param maps
     * @param vo
     */
    private void setTZ07T5Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //z07对象
        FinalZ07Vo tvo = new FinalZ07Vo();
        List<FinalZ07ItemVo> list = new ArrayList<>();
        tvo.setList(list);

        //p3t2
        FinalP3T2Vo p3T2Vo = vo.getP3T2Vo();
        if(null == p3T2Vo) {
            p3T2Vo = new FinalP3T2Vo();
            vo.setP3T2Vo(p3T2Vo);
        }
        //p3t3
        FinalP3T3Vo p3T3Vo = vo.getP3T3Vo();
        if(null == p3T3Vo) {
            p3T3Vo = new FinalP3T3Vo();
            vo.setP3T3Vo(p3T3Vo);
        }

        // 是否读取项目的List
        boolean isListFlag = false;
        //栏目的标记
        boolean isColumnFlag = false;

        for (LinkedHashMap<Integer, String> map : maps) {
            if(isListFlag && (null == map.get(0) || StringUtils.isBlank(map.get(0)))) {
                isListFlag = false;
                break;
            }

            //读取项目的list 收入 支出的明细
            if(isListFlag) {
                FinalZ07ItemVo itemVo = new FinalZ07ItemVo();
                itemVo.setCode(map.getOrDefault(0, ""));
                itemVo.setName(map.getOrDefault(3, ""));
                itemVo.setExpenditureYearSubtotal(FinalY22Utils.getMapNumFormat(map, 10));
                itemVo.setExpenditureBaseSubtotal(FinalY22Utils.getMapNumFormat(map, 11));
                itemVo.setExpenditureBasePerson(FinalY22Utils.getMapNumFormat(map, 12));
                itemVo.setExpenditureBasePublic(FinalY22Utils.getMapNumFormat(map, 13));
                itemVo.setExpenditureProject(FinalY22Utils.getMapNumFormat(map, 14));
                list.add(itemVo);
                continue;
            }

            if(!isColumnFlag && map.containsValue("栏次")) {
                //标记栏次
                isColumnFlag = true;
            }

            if(isColumnFlag &&  map.containsValue("合计")) {
                isListFlag = true;
                tvo.setExpenditureYearSubtotal(FinalY22Utils.getMapNumFormat(map, 10));
                tvo.setExpenditureBaseSubtotal(FinalY22Utils.getMapNumFormat(map, 11));
                tvo.setExpenditureBasePerson(FinalY22Utils.getMapNumFormat(map, 12));
                tvo.setExpenditureBasePublic(FinalY22Utils.getMapNumFormat(map, 13));
                tvo.setExpenditureProject(FinalY22Utils.getMapNumFormat(map, 14));

                //p3t2 取
                p3T2Vo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 10));
                p3T2Vo.setExpenditureBase(FinalY22Utils.getMapNumFormat(map, 11));
                p3T2Vo.setExpenditureProject(FinalY22Utils.getMapNumFormat(map, 14));

                //p3t3
                p3T3Vo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 11));
            }
        }

        //设置 z07
        vo.setT5Z07Vo(tvo);
    }

    /**
     * Z08财决 一般公共预算财政拨款支出决算明细表(财决08) (第三部分的p3t2) 2023年
     * @param maps
     * @param vo
     */
    private void setZ08P3T2Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo) {

        //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目
        FinalP3T2Vo p3T2Vo = vo.getP3T2Vo();


        //记录科目的 类,款,项
        Map<String, String> courseNameMap = new HashMap<>();

        boolean courseListflag = false;
        int courseLisClasstNum = 0;

        //p3p2 查询 大类
        FinalP3T2CategoryItemVo categoryItemVo = null;
        String categoryName = "";

        for (LinkedHashMap<Integer, String> map : maps) {

            if (map.containsValue("类")) {
                courseLisClasstNum = 1;
            }
            if( courseLisClasstNum > 0 && !courseListflag ) {
                courseLisClasstNum++;
                if(courseLisClasstNum > 3) {
                    courseListflag = true;
                }
            }

            String courseName = map.getOrDefault(3, "");
            if(courseListflag && StringUtils.isBlank(courseName)) {
                //结束
                courseListflag = false;
                break;
            }
            if(courseListflag) {
                String courseCode = map.getOrDefault(0, "");
                String courseValue = FinalY22Utils.getMapNumFormat(map, 4);

                if(courseCode.length() == 3 || courseCode.length() == 5) {
                    courseNameMap.put(courseCode, courseName);
                } else if(courseCode.length() == 7) {
                    //拼接
                    String nameC1 = courseNameMap.getOrDefault(courseCode.substring(0, 3), "（类）");
                    String nameC2 = courseNameMap.getOrDefault(courseCode.substring(0, 5), "（款）");
                    String name = String.format("%s（类）%s（款）%s（项）", nameC1, nameC2, courseName);

                    //查询 大类
                    if(null == categoryItemVo || StringUtils.isBlank(categoryName) || !nameC1.equals(categoryName)) {
                        categoryItemVo = p3T2Vo.getList().stream().filter(it-> it.getName().equals(nameC1)).findFirst().orElse(null);
                    }

                    if(null != categoryItemVo) {
                        //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目 调整
                        FinalP3T2ItemVo p3T2ItemVo = new FinalP3T2ItemVo();
                        p3T2ItemVo.setName(name);
                        p3T2ItemVo.setCode(courseCode);
                        p3T2ItemVo.setRowNo("");
                        p3T2ItemVo.setBeginValue("0");
                        p3T2ItemVo.setFinalValue(courseValue);
                        //判断是决算数 大于0 的填写, 不用输入主要用途
                        p3T2ItemVo.setUsageFlag(1 == FinalY22Utils.compareValue(p3T2ItemVo.getFinalValue(), "0") ? 1 : 0);
                        //判断是否是增长 大于小于才有 原因的填写, 相等不用输入原因
                        int compareInt = FinalY22Utils.compareValue(p3T2ItemVo.getFinalValue(), p3T2ItemVo.getBeginValue());
                        Integer reasonFlag = 0 == compareInt ? 0 : 1;
                        String compareValueStr = FinalY22Utils.compareValueStr(compareInt);
                        p3T2ItemVo.setReasonFlag(reasonFlag);
                        p3T2ItemVo.setCompareValueStr(compareValueStr);
                        //取 本年的预算数据后， 再次对比
                        p3T2ItemVo.setRatio(FinalY22Utils.getSuccessRatio(p3T2ItemVo.getFinalValue(), p3T2ItemVo.getBeginValue()));
                        p3T2ItemVo.setInfo(FinalY22Utils.getInfoStrP3T2(p3T2ItemVo.getName(), p3T2ItemVo.getFinalValue(), p3T2ItemVo.getBeginValue(), p3T2ItemVo.getRatio()));
                        //保存对应的 大类下的项 的数据
                        categoryItemVo.getList().add(p3T2ItemVo);
                    }

                }
            }
        }

        log.debug("财决z08表结束");
    }


    /**
     * Z08_1 一般公共预算财政拨款基本支出决算明细表(财决08_1) (第二部分的表六) 2023年
     * @param maps
     * @param vo
     */
    private void setZ08S1T6Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo) {

        FinalZ08S1T6Vo tvo = new FinalZ08S1T6Vo();
        List<FinalZ08S1T6ItemVo> list = new ArrayList<>();
        tvo.setList(list);

        //p3t3 部分的项
        //3.3部分的年度一般公共预算财政拨款基本支出决算情况说明 经济分类支出科目
        FinalP3T3Vo p3T3Vo = vo.getP3T3Vo();
        if(null == p3T3Vo) {
            p3T3Vo = new FinalP3T3Vo();
            vo.setP3T3Vo(p3T3Vo);
        }

        //List<FinalP3T3ItemVo> p3T3VoList = p3T3Vo.getList();
        List<FinalP3T3ItemVo> p3T3ItemList = new ArrayList<>();
        p3T3Vo.setList(p3T3ItemList);

        //人员经费 项目, 公用经费 项目
        List<FinalZ08S1T6ItemTempVo> itemTempVoList1 = new ArrayList<>();
        List<FinalZ08S1T6ItemTempVo> itemTempVoList2 = new ArrayList<>();

        //人员经费 总计
        BigDecimal total1 = BigDecimal.ZERO;
        //公用经费 总计
        BigDecimal total2 = BigDecimal.ZERO;

        //大类 临时存储
        String categoryNameTemp = "";
        //大类
        FinalP3T3ItemVo finalP3T3ItemVo = null;

        for (LinkedHashMap<Integer, String> map : maps) {
            if(map.containsValue("项目")) {
                //1-人员经费(工资福利支、对个人和家庭的补助), 2-公用经费
                int type = 1;
                int mapSize = map.size();
                for (int i = 5; i <= mapSize - 1; i++ ) {
                    String categoryName = map.getOrDefault(i, "");
                    //下级的项目名
                    String subCategoryName = maps.get(3).getOrDefault(i, "");
                    //String value = maps.get(7).getOrDefault(i, "").replace(",", "");
                    //合计行
                    String value = FinalY22Utils.getMapNum(maps.get(7), i, ",", "");

                    //记录大类
                    if(StringUtils.isNotBlank(categoryName)) {
                        categoryNameTemp = categoryName;
                    }

                    if(value.equals("一")) {
                        //log.debug("一 符号不记录");
                        continue;
                    }
                    if(StringUtils.isNotBlank(categoryName)) {
                        BigDecimal valueBigdecimal = BigDecimal.ZERO;
                        if(StringUtils.isNotBlank(value)) {
                            valueBigdecimal = new BigDecimal(value);
                        }
                        if(categoryName.equals("工资福利支出") || categoryName.equals("对个人和家庭的补助") ) {
                            type = 1;
                            //小计
                            total1 = total1.add(valueBigdecimal);
                        } else {
                            type = 2;
                            //小计
                            total2 = total2.add(valueBigdecimal);
                        }
                    }

                    //大类时, 取大类名, 否则取小类名
                    String name = StringUtils.isNotBlank(categoryName) ? categoryName : subCategoryName;
                    /*String fstr = String.format("index:  %s , type: %s name: %s Category: %s subCategoryName: %s subtotal: %s", i, type, name, categoryName, subCategoryName, value);
                    log.debug(fstr);*/

                    FinalZ08S1T6ItemTempVo itemTempVo = new FinalZ08S1T6ItemTempVo();
                    itemTempVo.setAmount(NumberFormatUtils.amountInThousands(value));
                    itemTempVo.setType(type);
                    itemTempVo.setName(name);
                    if(1 == type) {
                        itemTempVoList1.add(itemTempVo);
                    } else {
                        itemTempVoList2.add(itemTempVo);
                    }

                    //p3t3
                    //依据大类 查询
                    if(StringUtils.isNotBlank(categoryName)) {
                        //finalP3T3ItemVo = p3T3VoList.stream().filter(it->it.getName().equals(categoryName)).findFirst().orElse(null);

                        BigDecimal valueBigdecimal = BigDecimal.ZERO;
                        if(StringUtils.isNotBlank(value)) {
                            valueBigdecimal = new BigDecimal(value);
                        }

                        FinalP3T3ItemVo p3T3ItemVo = new FinalP3T3ItemVo();
                        //p3T3ItemVo.setBeginValue(FinalY22Utils.getMapNumFormat(map, 21));
                        //取另外的数据值
                        p3T3ItemVo.setBeginValue("0.00");
                        p3T3ItemVo.setFinalValue( NumberFormatUtils.amountInThousands(valueBigdecimal.toString()) );
                        p3T3ItemVo.setRatio(FinalY22Utils.getSuccessRatio(p3T3ItemVo.getFinalValue(), p3T3ItemVo.getBeginValue()));
                        p3T3ItemVo.setName(categoryName);
                        p3T3ItemVo.setRowNo("1");
                        p3T3ItemVo.setInfo(FinalY22Utils.getInfoStrP3T3(p3T3ItemVo.getName(), p3T3ItemVo.getFinalValue(), p3T3ItemVo.getBeginValue(), p3T3ItemVo.getRatio()));
                        //判断决算数大于0, 才有 主要用途的填写
                        p3T3ItemVo.setUsageFlag(1 == FinalY22Utils.compareValue(p3T3ItemVo.getFinalValue(), "0") ? 1 : 0);

                        //判断是否是增长 大于小于才有 原因的填写, 相等不用输入原因
                        int compareInt = FinalY22Utils.compareValue(p3T3ItemVo.getFinalValue(), p3T3ItemVo.getBeginValue());
                        Integer reasonFlag = 0 == compareInt ? 0 : 1;
                        String compareValueStr = FinalY22Utils.compareValueStr(compareInt);
                        p3T3ItemVo.setReasonFlag(reasonFlag);
                        p3T3ItemVo.setCompareValueStr(compareValueStr);

                        p3T3ItemVo.setList(new ArrayList<>());
                        p3T3ItemList.add(p3T3ItemVo);

                        //大类的
                        finalP3T3ItemVo = p3T3ItemVo;

                    }
                    //大类下的项
                    if(StringUtils.isBlank(categoryName) && null != finalP3T3ItemVo ) {
                        BigDecimal valueBigdecimal = BigDecimal.ZERO;
                        if(StringUtils.isNotBlank(value)) {
                            valueBigdecimal = new BigDecimal(value);
                        }
                        if(valueBigdecimal.compareTo(BigDecimal.ZERO) == 1 ) {
                            //设置 款的
                            FinalP3T3ParagraphItemVo p3T3ParagraphItemVo = new FinalP3T3ParagraphItemVo();
                            p3T3ParagraphItemVo.setName(name);
                            p3T3ParagraphItemVo.setValue(NumberFormatUtils.amountInThousands(value));
                            finalP3T3ItemVo.getList().add(p3T3ParagraphItemVo);
                        }

                    }

                }
                break;
            }
        }

        //合并行
        toTableListP2T6(itemTempVoList1, itemTempVoList2, list);
        //最后一行 合计行
        FinalZ08S1T6ItemVo totalItem = new FinalZ08S1T6ItemVo();
        totalItem.setName1("人员经费合计");
        totalItem.setName2("公用经费合计");
        totalItem.setAmount1(NumberFormatUtils.amountInThousands(total1.toString()));
        totalItem.setAmount2(NumberFormatUtils.amountInThousands(total2.toString()));
        totalItem.setCode1("");
        totalItem.setCode2("");
        list.add(totalItem);

        //设置 p3t3的款级项 在设置编码后, 再拼接
        //setP3p3ItmeParagraphStr(p3T3VoList);

        //设置 Z08_1
        vo.setT6VZ08S1Vo(tvo);
    }

    /**
     * 合并2种类型的数据成1行
     * @param list1
     * @param list2
     * @param list
     */
    private void toTableListP2T6(List<FinalZ08S1T6ItemTempVo> list1, List<FinalZ08S1T6ItemTempVo> list2, List<FinalZ08S1T6ItemVo> list ) {

        List<FinalZ08S1T6ItemTempVo> tempCheckList1 = new ArrayList<>();
        List<FinalZ08S1T6ItemTempVo> tempCheckList2 = new ArrayList<>();

        //比对, size比较大的用来循环
        if(list1.size() > list2.size()) {
            tempCheckList1 = list1;
            tempCheckList2 = list2;
        } else {
            tempCheckList1 = list2;
            tempCheckList2 = list1;
        }

        int i = 0;
        for (FinalZ08S1T6ItemTempVo itemTempVo : tempCheckList1 ) {
            FinalZ08S1T6ItemVo itemVo = new FinalZ08S1T6ItemVo();
            itemVo.setCode1("");
            itemVo.setCode2("");
            if(1 == itemTempVo.getType()) {
                itemVo.setName1(itemTempVo.getName());
                itemVo.setAmount1(itemTempVo.getAmount());
                //取值另外的List
                if(i < tempCheckList2.size()) {
                    itemVo.setName2(tempCheckList2.get(i).getName());
                    itemVo.setAmount2(tempCheckList2.get(i).getAmount());
                } else {
                    //设置 ""空字符串
                    itemVo.setName2("");
                    itemVo.setAmount2("");
                }
            } else {
                //2
                itemVo.setName2(itemTempVo.getName());
                itemVo.setAmount2(itemTempVo.getAmount());
                //取值另外的List
                if(i < tempCheckList2.size()) {
                    itemVo.setName1(tempCheckList2.get(i).getName());
                    itemVo.setAmount1(tempCheckList2.get(i).getAmount());
                } else {
                    //设置 ""空字符串
                    itemVo.setName1("");
                    itemVo.setAmount1("");
                }
            }
            list.add(itemVo);
            i++;
        }
    }

    /**
     * 设置 p3p3 的款级的显示 (编码 + 名称)
     */
    public static void setP3p3ItmeParagraphStr(List<FinalP3T3ItemVo> p3T3VoList) {
        p3T3VoList.stream().forEach(i-> {
            if(i.getList().size() > 0) {
                //String str = i.getList().stream().map(it-> it.getCode() + it.getName() + it.getValue() + "万元").collect(Collectors.joining("，"));
                String str = i.getList().stream().map(it-> it.getCode() + it.getName() + it.getValue() + "万元").collect(Collectors.joining("，"));
                i.setParagraphStr(str);
            }
        });
    }

    /**
     * F02 基本数字表(财决附02表) 2022年
     * @param maps
     * @param vo
     */
    private void setTF02Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //f02对象
        ExcelDeptInfoVo deptInfoVo = new ExcelDeptInfoVo();

        //栏目的标记
        boolean isRowTotalBeforeFlag = false;
        //合计栏的标记
        boolean isRowTotalFlag = false;

        for (LinkedHashMap<Integer, String> map : maps) {

            if( isRowTotalBeforeFlag && map.containsValue("合计") && map.getOrDefault(3, "").equals("合计") ) {
                isRowTotalFlag = true;
            }

            if(isRowTotalFlag) {
                //在职人数
                String personJob = FinalY22Utils.getMapOrDefault(map, 7, "0");
                deptInfoVo.setPersonJob(personJob);

                //合计人数 其他人数
                String personOther = FinalY22Utils.getMapOrDefault(map, 28, "0");
                String personTotal = FinalY22Utils.getMapOrDefault(map, 6, "0");
                deptInfoVo.setPersonTotal(personTotal);
                deptInfoVo.setPersonOther(personOther);

                break;
            }

            if( !isRowTotalBeforeFlag && map.containsValue("栏次") && map.getOrDefault(3, "").equals("栏次") ) {
                isRowTotalBeforeFlag = true;
            }
        }


        //部门信息 - 人数
        vo.setDeptInfoVo(deptInfoVo);
    }


    /**
     * F03 机构运行信息表(财决附03表) (第二部分的表七) 2023年
     * @param maps
     * @param vo
     */
    private void setTF03T7Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //f03对象
        FinalF03Vo tvo = new FinalF03Vo();
        List<FinalF03ItemVo> list = new ArrayList<>();
        tvo.setList(list);
        //预算决算的 item
        FinalF03ItemVo itemVo = new FinalF03ItemVo();
        list.add(itemVo);

        //部门信息
        ExcelDeptInfoVo deptInfoVo = vo.getDeptInfoVo();

        //栏目的标记
        boolean isRowFlag = false;

        //资产信息-车辆数的标记
        boolean isCarListFlag = false;
        //资产信息-单价xx 以上设备的标记
        boolean isDeviceListFlag = false;

        //离退休人员的列 开始
        boolean isPersonRetireListFlag = false;

        //预算数据
        /*FinalF03ItemVo budgetVo = new FinalF03ItemVo();
        //决算数据
        FinalF03ItemVo finalVo = new FinalF03ItemVo();
        tvo.setBudgetVo(budgetVo);
        tvo.setFinalVo(finalVo);*/

        //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明 2023年
        FinalP3T6Vo p3T6Vo = new FinalP3T6Vo();
        //因公出国（境）费支出 具体
        FinalP3T6ItemAbroadVo itemAbroadVo = new FinalP3T6ItemAbroadVo();
        p3T6Vo.setAbroadVo(itemAbroadVo);
        //公务用车购置及运行费支出
        FinalP3T6ItemCarVo itemCarVo = new FinalP3T6ItemCarVo();
        p3T6Vo.setCarVo(itemCarVo);
        //公务接待费支出具体
        FinalP3T6ItemReceptiondVo itemReceptiondVo = new FinalP3T6ItemReceptiondVo();
        p3T6Vo.setReceptiondVo(itemReceptiondVo);

        //3.7 其他重要事项情况说明 2023年
        FinalP3T7Vo p3T7Vo = new FinalP3T7Vo();
        //1.机关运行经费支出情况说明"
//        FinalP3T7ItemDeptOperateVo deptOperateVo = new FinalP3T7ItemDeptOperateVo();
        //2.政府采购支出情况说明
        FinalP3T7ItemGovBuyVo govBuyVo = new FinalP3T7ItemGovBuyVo();
        //3.国有资产占用情况说明
        FinalP3T7ItemAssetVo assetVo = new FinalP3T7ItemAssetVo();
//        p3T7Vo.setDeptOperateVo(deptOperateVo);
        p3T7Vo.setGovBuyVo(govBuyVo);
        p3T7Vo.setAssetVo(assetVo);


        for (LinkedHashMap<Integer, String> map : maps) {
            if(isRowFlag && map.containsValue("二、会议费")) {
                //标记栏次的结束
                isRowFlag = false;
                //break;
            }

            if(!isRowFlag && map.containsValue("一、“三公”经费支出")) {
                //标记栏次
                isRowFlag = true;
            }

            if(isRowFlag && map.containsValue("（一）支出合计")) {
                itemVo.setTotal(FinalY22Utils.getMapNumFormat(map, 3));
                itemVo.setTotal2(FinalY22Utils.getMapNumFormat(map, 4));

                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                p3T6Vo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 4));
                p3T6Vo.setExpenditureBegin(FinalY22Utils.getMapNumFormat(map, 2));
                p3T6Vo.setExpenditureBudgetRatio(FinalY22Utils.getSuccessRatio(p3T6Vo.getExpenditureTotal(), p3T6Vo.getExpenditureBegin()));
            }

            if(isRowFlag && map.containsValue("1．因公出国（境）费")) {
                itemVo.setAbroad(FinalY22Utils.getMapNumFormat(map, 3));
                itemVo.setAbroad2(FinalY22Utils.getMapNumFormat(map, 4));

                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //结算
                p3T6Vo.setAbroad(FinalY22Utils.getMapNumFormat(map, 4));

                //因公出国（境）费支出 具体 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                itemAbroadVo.setExpenditure(FinalY22Utils.getMapNumFormat(map, 4));
                itemAbroadVo.setBeginValue(FinalY22Utils.getMapNumFormat(map, 2));
                itemAbroadVo.setRatio(FinalY22Utils.getSuccessRatio(itemAbroadVo.getExpenditure(), itemAbroadVo.getBeginValue()));
                //项目名
                itemAbroadVo.setName(map.getOrDefault(0, ""));
                itemAbroadVo.setRowNo(map.getOrDefault(1, ""));
            }

            if(isRowFlag && map.containsValue("2．公务用车购置及运行维护费")) {
                itemVo.setCarSubtotal(FinalY22Utils.getMapNumFormat(map, 3));
                itemVo.setCarSubtotal2(FinalY22Utils.getMapNumFormat(map, 4));

                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //结算
                p3T6Vo.setCarSubtotal(FinalY22Utils.getMapNumFormat(map, 4));
                //公务用车购置及运行费支出
                itemCarVo.setCarSubtotal(FinalY22Utils.getMapNumFormat(map, 4));
                itemCarVo.setName(map.getOrDefault(0, ""));
                itemCarVo.setRowNo(map.getOrDefault(1, ""));
            }

            if(isRowFlag && map.containsValue("（1）公务用车购置费")) {
                itemVo.setCarBuy(FinalY22Utils.getMapNumFormat(map, 3));
                itemVo.setCarBuy2(FinalY22Utils.getMapNumFormat(map, 4));

                //公务用车购置支出
                itemCarVo.setCarBuyExpenditure(FinalY22Utils.getMapNumFormat(map, 4));
                itemCarVo.setCarBuyBeginValue(FinalY22Utils.getMapNumFormat(map, 2));
                itemCarVo.setCarBuyRatio(FinalY22Utils.getSuccessRatio(itemCarVo.getCarBuyExpenditure(), itemCarVo.getCarBuyBeginValue()));
            }

            if(isRowFlag && "公务用车运行维护费".equals(FinalY22Utils.getMapSubString(map, 0, "）"))  ) {
                itemVo.setCarOperate(FinalY22Utils.getMapNumFormat(map, 3));
                itemVo.setCarOperate2(FinalY22Utils.getMapNumFormat(map, 4));

                //公务用车运行维护费支出
                itemCarVo.setCarOperateExpenditure(FinalY22Utils.getMapNumFormat(map, 4));
                itemCarVo.setCarOperateBeginValue(FinalY22Utils.getMapNumFormat(map, 2));
                itemCarVo.setCarOperateRatio(FinalY22Utils.getSuccessRatio(itemCarVo.getCarOperateExpenditure(), itemCarVo.getCarOperateBeginValue()));
                //公务用车的运行维护费
                itemCarVo.setCarOperateYear(FinalY22Utils.getMapNumFormat(map, 4));
            }

            if(isRowFlag && map.containsValue("3．公务接待费")) {
                itemVo.setReception(FinalY22Utils.getMapNumFormat(map, 3));
                itemVo.setReception2(FinalY22Utils.getMapNumFormat(map, 4));


                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //结算
                p3T6Vo.setReception(FinalY22Utils.getMapNumFormat(map, 4));
                //公务接待费支出
                itemReceptiondVo.setExpenditure(FinalY22Utils.getMapNumFormat(map, 4));
                itemReceptiondVo.setBeginValue(FinalY22Utils.getMapNumFormat(map, 2));
                itemReceptiondVo.setRatio(FinalY22Utils.getSuccessRatio(itemReceptiondVo.getExpenditure(), itemReceptiondVo.getBeginValue()));
                itemReceptiondVo.setName(map.getOrDefault(0, ""));
                itemReceptiondVo.setRowNo(map.getOrDefault(1, ""));

            }

            if( "公务用车保有量（辆）".equals(FinalY22Utils.getMapSubString(map, 0, "．")) ) {
                itemCarVo.setCarNum(FinalY22Utils.getMapOrDefault(map, 4, "0"));
                //公务车运行费用/保有量 = 每辆运行费用
                itemCarVo.setCarOperateEach(FinalY22Utils.getDivisionNum(itemCarVo.getCarOperateYear(), itemCarVo.getCarNum()));
            }

            //相关统计数
            if(isRowFlag && map.containsValue("1．因公出国（境）团组数（个）")) {
                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //全年因公出国（境）团组总共(数量) 具体 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                itemAbroadVo.setDeptGroupNum(FinalY22Utils.getMapOrDefault(map, 4, "0").replace("—", "0"));
            }
            if(isRowFlag && map.containsValue("2．因公出国（境）人次数（人）")) {
                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //全年因公出国（境）团组总共(数量) 具体 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                itemAbroadVo.setPersonNum(FinalY22Utils.getMapOrDefault(map, 4, "0").replace("—", "0"));
            }
            if(isRowFlag && map.containsValue("5．国内公务接待批次（个）")) {
                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //5．国内公务接待批次（个） 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                itemReceptiondVo.setInBatch( FinalY22Utils.getMapOrDefault(map, 4, "0").replace("—", "0") );
            }
            if(isRowFlag && map.containsValue("6．国内公务接待人次（人）")) {
                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //6．国内公务接待人次（人） 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                itemReceptiondVo.setInPersonNum(FinalY22Utils.getMapOrDefault(map, 4, "0").replace("—", "0"));
            }
            if(isRowFlag && map.containsValue("7．国（境）外公务接待批次（个）")) {
                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //7．国（境）外公务接待批次（个） 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                itemReceptiondVo.setOutBatch(FinalY22Utils.getMapOrDefault(map, 4, "0").replace("—", "0"));
            }
            if(isRowFlag && map.containsValue("8．国（境）外公务接待人次（人）")) {
                //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                //8．国（境）外公务接待人次（人） 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
                itemReceptiondVo.setOutPersonNum(FinalY22Utils.getMapOrDefault(map, 4, "0").replace("—", "0"));
            }


            //五、资产信息
            if(isCarListFlag && map.get(5).contains("单价") && map.get(5).contains("万元（含）") && map.get(5).contains("设备") ) {
                //标记车辆的读取列表结束
                isCarListFlag = false;
                //单价 xx 设备的读取
                isDeviceListFlag = true;
            }
            if(isCarListFlag) {
                //3.7 其他重要事项情况说明
                //车辆的循环读取列表
                String num = FinalY22Utils.getMapOrDefault(map, 7, "0").replace("—", "0");
                String itemName = FinalY22Utils.getMapSubString(map, 5, "．");
                String newStr = StringUtils.isNotBlank(assetVo.getCarStr()) ? String.format("%s%s%s%s辆", assetVo.getCarStr(), "、", itemName, num) : String.format("%s%s辆", itemName, num);
                assetVo.setCarStr(newStr);
            }
            if(isRowFlag && map.containsValue("（一）车辆数合计（辆）")) {
                //3.7 其他重要事项情况说明
                assetVo.setTotal(FinalY22Utils.getMapOrDefault(map, 7, "0").replace("—", "0"));
                //车辆的循环读取列表
                isCarListFlag = true;
            }
            if(isDeviceListFlag && map.get(5).contains("单价") && map.get(5).contains("万元（含）") && map.get(5).contains("设备") ) {
                //单价 xx 设备的读取结束
                //isDeviceListFlag = true;
                String num = FinalY22Utils.getMapOrDefault(map, 7, "0").replace("—", "0");
                String itemName = FinalY22Utils.getMapSubString(map, 5, "）");
                String newStr = StringUtils.isNotBlank(assetVo.getDeviceStr()) ? String.format("%s%s%s%s台（套）", assetVo.getDeviceStr(), ";", itemName, num) : String.format("%s %s台（套）", itemName, num);
                assetVo.setDeviceStr(newStr);
            }

            //六、政府采购支出信息
            if(isDeviceListFlag && map.containsValue("（一）政府采购支出合计")) {
                govBuyVo.setTotal(FinalY22Utils.getMapNumFormat(map, 7));
                govBuyVo.setName(map.getOrDefault(5, ""));
                govBuyVo.setRowNo(map.getOrDefault(6, ""));
            }
            if(isDeviceListFlag && map.containsValue("1．政府采购货物支出")) {
                govBuyVo.setProduct(FinalY22Utils.getMapNumFormat(map, 7));
            }
            if(isDeviceListFlag && map.containsValue("2．政府采购工程支出")) {
                govBuyVo.setProject(FinalY22Utils.getMapNumFormat(map, 7));
            }
            if(isDeviceListFlag && map.containsValue("3．政府采购服务支出")) {
                govBuyVo.setService(FinalY22Utils.getMapNumFormat(map, 7));
            }
            if(isDeviceListFlag && map.containsValue("（二）政府采购授予中小企业合同金额")) {
                govBuyVo.setMedium(FinalY22Utils.getMapNumFormat(map, 7));
                govBuyVo.setMediumRatio(FinalY22Utils.getSuccessRatio(govBuyVo.getMedium(), govBuyVo.getTotal()));
            }
            if(isDeviceListFlag && map.containsValue("其中：授予小微企业合同金额")) {
                govBuyVo.setSmall(FinalY22Utils.getMapNumFormat(map, 7));
                govBuyVo.setSmallRatio(FinalY22Utils.getSuccessRatio(govBuyVo.getSmall(), govBuyVo.getTotal()));
            }

            if(isDeviceListFlag && map.containsValue("七、由养老保险基金发放养老金的离退休人员（人）") && map.getOrDefault(5, "").equals("七、由养老保险基金发放养老金的离退休人员（人）")) {
                String personRetire = FinalY22Utils.getMapOrDefault(map, 7, "0").replace("—", "0");
                //String personTotal = NumberUtil.add(deptInfoVo.getPersonJob(), personRetire).toString();
                deptInfoVo.setPersonRetire(personRetire);
                isDeviceListFlag = false;
                //结束读取
                break;
            }


        }

        //p2t7 remark
        String p2t7Remark = String.format("本部门%s年度没有“三公”经费收入，也没有“三公”经费安排的支出，故本表无数据", vo.getYear());
        if(null != itemVo ) {
            if(StringUtils.isNotBlank(itemVo.getTotal()) && StringUtils.isNotBlank(itemVo.getTotal2()) && itemVo.getTotal().equals("0.00") && itemVo.getTotal2().equals("0.00") ) {
                // 备注
                tvo.setRemark(p2t7Remark);
            }
        }

        //设置 f03
        vo.setT7F03Vo(tvo);

        //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明
        vo.setP3T6Vo(p3T6Vo);

        //3.7 其他重要事项情况说明
        vo.setP3T7Vo(p3T7Vo);
    }

    /**
     * Z09 政府性基金预算财政拨款收入支出决算表(财决09表) (第二部分的表八) 2023年
     * @param maps
     * @param vo
     */
    private void setTZ09T8Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //z07对象
        FinalZ09Vo tvo = new FinalZ09Vo();
        List<FinalZ09ItemVo> list = new ArrayList<>();
        tvo.setList(list);

        //p3p4
        FinalP3T4Vo p3T4Vo = vo.getP3T4Vo();

        // 是否读取项目的List
        boolean isListFlag = false;
        //栏目的标记
        boolean isColumnFlag = false;

        //记录科目的 类,款,项
        Map<String, String> courseNameMap = new HashMap<>();

        //p3p4 查询 大类
        FinalP3T4CategoryItemVo categoryItemVo = null;
        String categoryName = "";

        for (LinkedHashMap<Integer, String> map : maps) {
            if(isListFlag && (null == map.get(0) || StringUtils.isBlank(map.get(0)))) {
                isListFlag = false;
                break;
            }

            //读取项目的list 收入 支出的明细
            if(isListFlag) {
                FinalZ09ItemVo itemVo = new FinalZ09ItemVo();
                itemVo.setCode(map.getOrDefault(0, ""));
                itemVo.setName(map.getOrDefault(3, ""));
                itemVo.setYearBeginTotal(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setIncomeYear(FinalY22Utils.getMapNumFormat(map, 7));
                itemVo.setExpenditureYearSubtotal(FinalY22Utils.getMapNumFormat(map, 10));
                itemVo.setExpenditureBaseSubtotal(FinalY22Utils.getMapNumFormat(map, 11));
                itemVo.setExpenditureProject(FinalY22Utils.getMapNumFormat(map, 14));
                itemVo.setYearEndTotal(FinalY22Utils.getMapNumFormat(map, 15));
                list.add(itemVo);


                //记录 类 款 项的
                String courseName = map.getOrDefault(3, "");
                String courseCode = map.getOrDefault(0, "");
                String courseValue = FinalY22Utils.getMapNumFormat(map, 10);

                if(courseCode.length() == 3 || courseCode.length() == 5) {
                    courseNameMap.put(courseCode, courseName);
                } else if(courseCode.length() == 7) {
                    //拼接
                    String nameC1 = courseNameMap.getOrDefault(courseCode.substring(0, 3), "（类）");
                    String nameC2 = courseNameMap.getOrDefault(courseCode.substring(0, 5), "（款）");
                    String name = String.format("%s（类）%s（款）%s（项）", nameC1, nameC2, courseName);

                    //查询 大类
                    if(null == categoryItemVo || StringUtils.isBlank(categoryName) || !nameC1.equals(categoryName)) {
                        categoryItemVo = p3T4Vo.getList().stream().filter(it-> it.getName().equals(nameC1)).findFirst().orElse(null);
                    }

                    if(null != categoryItemVo) {
                        //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目 调整
                        FinalP3T4ItemVo p3T4ItemVo = new FinalP3T4ItemVo();
                        p3T4ItemVo.setName(name);
                        p3T4ItemVo.setCode(courseCode);
                        p3T4ItemVo.setRowNo("");
                        p3T4ItemVo.setBeginValue("0.00");
                        p3T4ItemVo.setFinalValue(courseValue);
                        //取 本年的预算数据后， 再次对比
                        p3T4ItemVo.setRatio(FinalY22Utils.getSuccessRatio(p3T4ItemVo.getFinalValue(), p3T4ItemVo.getBeginValue()));
                        p3T4ItemVo.setInfo(FinalY22Utils.getInfoStrP3T2(p3T4ItemVo.getName(), p3T4ItemVo.getFinalValue(), p3T4ItemVo.getBeginValue(), p3T4ItemVo.getRatio()));

                        //判断是否显示 用途
                        //判断是决算数 大于0 的填写, 用输入主要用途
                        p3T4ItemVo.setUsageFlag(1 == FinalY22Utils.compareValue(p3T4ItemVo.getFinalValue(), "0") ? 1 : 0);

                        //判断是否是增长 大于小于才有 原因的填写, 相等不用输入原因
                        int compareInt = FinalY22Utils.compareValue(p3T4ItemVo.getFinalValue(), p3T4ItemVo.getBeginValue());
                        Integer reasonFlag = 0 == compareInt ? 0 : 1;
                        String compareValueStr = FinalY22Utils.compareValueStr(compareInt);
                        p3T4ItemVo.setReasonFlag(reasonFlag);
                        p3T4ItemVo.setCompareValueStr(compareValueStr);

                        //保存对应的 大类下的项 的数据
                        categoryItemVo.getList().add(p3T4ItemVo);
                    }

                }

                continue;
            }

            if(!isColumnFlag && map.containsValue("栏次")) {
                //标记栏次
                isColumnFlag = true;
            }

            if(isColumnFlag &&  map.containsValue("合计")) {
                isListFlag = true;
                FinalZ09ItemVo itemVo = new FinalZ09ItemVo();
                itemVo.setCode(map.getOrDefault(0, ""));
                itemVo.setName(map.getOrDefault(3, ""));
                itemVo.setYearBeginTotal(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setIncomeYear(FinalY22Utils.getMapNumFormat(map, 7));
                itemVo.setExpenditureYearSubtotal(FinalY22Utils.getMapNumFormat(map, 10));
                itemVo.setExpenditureBaseSubtotal(FinalY22Utils.getMapNumFormat(map, 11));
                itemVo.setExpenditureProject(FinalY22Utils.getMapNumFormat(map, 14));
                itemVo.setYearEndTotal(FinalY22Utils.getMapNumFormat(map, 15));
                tvo.setTotalRow(itemVo);
            }
        }

        //设置 z09
        vo.setT8Z09Vo(tvo);
    }

    /**
     * Z11 国有资本经营预算财政拨款收入支出决算表(财决11表)(第二部分的表九) 2023年
     * @param maps
     * @param vo
     */
    private void setTZ11T9Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {
        //z11对象
        FinalZ11Vo tvo = new FinalZ11Vo();
        List<FinalZ11ItemVo> list = new ArrayList<>();
        tvo.setList(list);

        // 是否读取项目的List
        boolean isListFlag = false;
        //栏目的标记
        boolean isColumnFlag = false;

        //p3p5
        FinalP3T5Vo p3T5Vo = vo.getP3T5Vo();

        //记录科目的 类,款,项
        Map<String, String> courseNameMap = new HashMap<>();

        //p3p4 查询 大类
        FinalP3T5CategoryItemVo categoryItemVo = null;
        String categoryName = "";


        for (LinkedHashMap<Integer, String> map : maps) {
            if(isListFlag && (null == map.get(0) || StringUtils.isBlank(map.get(0)))) {
                isListFlag = false;
                break;
            }

            //读取项目的list 收入 支出的明细
            if(isListFlag) {
                FinalZ11ItemVo itemVo = new FinalZ11ItemVo();
                itemVo.setCode(map.getOrDefault(0, ""));
                itemVo.setName(map.getOrDefault(3, ""));
                itemVo.setYearBeginTotal(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setIncomeYear(FinalY22Utils.getMapNumFormat(map, 7));
                itemVo.setExpenditureYear(FinalY22Utils.getMapNumFormat(map, 8));
                itemVo.setYearEndTotal(FinalY22Utils.getMapNumFormat(map, 22));
                itemVo.setYearEndCarryForward(FinalY22Utils.getMapNumFormat(map, 23));
                itemVo.setYearEndRest(FinalY22Utils.getMapNumFormat(map, 24));
                list.add(itemVo);

                //记录 类 款 项的
                String courseName = map.getOrDefault(3, "");
                String courseCode = map.getOrDefault(0, "");
                String courseValue = FinalY22Utils.getMapNumFormat(map, 10);

                if(courseCode.length() == 3 || courseCode.length() == 5) {
                    courseNameMap.put(courseCode, courseName);
                } else if(courseCode.length() == 7) {
                    //拼接
                    String nameC1 = courseNameMap.getOrDefault(courseCode.substring(0, 3), "（类）");
                    String nameC2 = courseNameMap.getOrDefault(courseCode.substring(0, 5), "（款）");
                    String name = String.format("%s（类）%s（款）%s（项）", nameC1, nameC2, courseName);

                    //查询 大类
                    if(null == categoryItemVo || StringUtils.isBlank(categoryName) || !nameC1.equals(categoryName)) {
                        categoryItemVo = p3T5Vo.getList().stream().filter(it-> it.getName().equals(nameC1)).findFirst().orElse(null);
                    }

                    if(null != categoryItemVo) {
                        //3.2部分的年度一般公共预算财政拨款支出决算情况 功能分类科目 调整
                        FinalP3T5ItemVo p3T5ItemVo = new FinalP3T5ItemVo();
                        p3T5ItemVo.setName(name);
                        p3T5ItemVo.setCode(courseCode);
                        p3T5ItemVo.setRowNo("");
                        p3T5ItemVo.setBeginValue("0.00");
                        p3T5ItemVo.setFinalValue(courseValue);
                        //取 本年的预算数据后， 再次对比
                        p3T5ItemVo.setRatio(FinalY22Utils.getSuccessRatio(p3T5ItemVo.getFinalValue(), p3T5ItemVo.getBeginValue()));
                        p3T5ItemVo.setInfo(FinalY22Utils.getInfoStrP3T2(p3T5ItemVo.getName(), p3T5ItemVo.getFinalValue(), p3T5ItemVo.getBeginValue(), p3T5ItemVo.getRatio()));

                        //判断是否显示 用途
                        //判断是决算数 大于0 的填写, 用输入主要用途
                        p3T5ItemVo.setUsageFlag(1 == FinalY22Utils.compareValue(p3T5ItemVo.getFinalValue(), "0") ? 1 : 0);

                        //判断是否是增长 大于小于才有 原因的填写, 相等不用输入原因
                        int compareInt = FinalY22Utils.compareValue(p3T5ItemVo.getFinalValue(), p3T5ItemVo.getBeginValue());
                        Integer reasonFlag = 0 == compareInt ? 0 : 1;
                        String compareValueStr = FinalY22Utils.compareValueStr(compareInt);
                        p3T5ItemVo.setReasonFlag(reasonFlag);
                        p3T5ItemVo.setCompareValueStr(compareValueStr);

                        //保存对应的 大类下的项 的数据
                        categoryItemVo.getList().add(p3T5ItemVo);
                    }

                }


                continue;
            }

            if(!isColumnFlag && map.containsValue("栏次")) {
                //标记栏次
                isColumnFlag = true;
            }

            if(isColumnFlag &&  map.containsValue("合计")) {
                isListFlag = true;
                FinalZ11ItemVo itemVo = new FinalZ11ItemVo();
                itemVo.setCode(map.getOrDefault(0, ""));
                itemVo.setName(map.getOrDefault(3, ""));
                itemVo.setYearBeginTotal(FinalY22Utils.getMapNumFormat(map, 4));
                itemVo.setIncomeYear(FinalY22Utils.getMapNumFormat(map, 7));
                itemVo.setExpenditureYear(FinalY22Utils.getMapNumFormat(map, 8));
                itemVo.setYearEndTotal(FinalY22Utils.getMapNumFormat(map, 22));
                itemVo.setYearEndCarryForward(FinalY22Utils.getMapNumFormat(map, 23));
                itemVo.setYearEndRest(FinalY22Utils.getMapNumFormat(map, 24));
                tvo.setTotalRow(itemVo);
            }
        }

        //设置 z11
        vo.setT9Z11Vo(tvo);
    }

    /**
     * CS02 主要指标变动情况表, 第3部分使用到
     * @param maps
     * @param vo
     */
    private void setP3T2Cs02Report(List<LinkedHashMap<Integer, String>> maps, FinalExcelDataVo vo ) {

        //3.2部分的年度一般公共预算财政拨款支出决算情况 总体情况
        FinalP3T2Vo p3T2Vo = vo.getP3T2Vo();

        //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明 2023年
        FinalP3T6Vo p3T6Vo = vo.getP3T6Vo();
        //因公出国（境）费支出 具体
        FinalP3T6ItemAbroadVo itemAbroadVo = p3T6Vo.getAbroadVo();
        //公务用车购置及运行费支出
        FinalP3T6ItemCarVo itemCarVo = p3T6Vo.getCarVo();
        //公务接待费支出具体
        FinalP3T6ItemReceptiondVo itemReceptiondVo = p3T6Vo.getReceptiondVo();

        //1.机关运行经费支出情况说明 其他重要事项情况说明
        FinalP3T7ItemDeptOperateVo deptOperateVo = new FinalP3T7ItemDeptOperateVo();
        vo.getP3T7Vo().setDeptOperateVo(deptOperateVo);

        //栏目的标记
        boolean isColumnFlag = false;

        //本年收入
        boolean incomeYearFlag = false;
        //本年支出
        boolean expenditureYearFlag = false;
        //补充资料
        boolean supplementFlag = false;

        for (LinkedHashMap<Integer, String> map : maps) {
            /*if(isListFlag && (null == map.get(0) || StringUtils.isBlank(map.get(0)))) {
                isListFlag = false;
                break;
            }*/

            if( incomeYearFlag && !expenditureYearFlag && map.containsValue("2.本年支出")) {
                //标记本年支出的读取
                expenditureYearFlag = true;

                // 本部门年度一般公共预算财政拨款支出=财决07表_K9 是否改变取值
                /*p3T2Vo.setExpenditureTotal(FinalY22Utils.getMapNumFormat(map, 2));
                p3T2Vo.setExpenditureTotalLastYear(FinalY22Utils.getMapNumFormat(map, 3));
                String addOrSubStrItem = FinalY22Utils.getAddOrSubStringP3t2(p3T2Vo.getExpenditureTotal(), p3T2Vo.getExpenditureTotalLastYear());
                String lastYear = new BigDecimal(vo.getYear()).subtract(new BigDecimal(1)).toString();
                String compareStr= String.format("较%s年度决算数 %s", lastYear, addOrSubStrItem);
                p3T2Vo.setExpenditureCompareStr(compareStr);*/
            }



            //其中：一般公共预算财政拨款
            /*if( incomeYearFlag && expenditureYearFlag && map.containsValue("其中：一般公共预算财政拨款")) {
                p3T2Vo.setExpenditureBase(FinalY22Utils.getMapNumFormat(map, 2));
            }*/

            //其中：基本支出 换成 财决z07
            /*if( incomeYearFlag && expenditureYearFlag && map.containsValue("其中：基本支出")) {
                p3T2Vo.setExpenditureBase(FinalY22Utils.getMapNumFormat(map, 2));
            }

            //其中：基本支出
            if( incomeYearFlag && expenditureYearFlag && map.containsValue("项目支出")) {
                p3T2Vo.setExpenditureProject(FinalY22Utils.getMapNumFormat(map, 2));
            }
*/
            //3.6 一般公共预算财政拨款安排的“三公”经费支出决算情况说明 2023年
            if( incomeYearFlag && expenditureYearFlag && map.containsValue("2.“三公”经费支出")) {
                p3T6Vo.setExpenditureTotalLastYear(FinalY22Utils.getMapNumFormat(map, 3));
                p3T6Vo.setExpenditureCompareStr(FinalY22Utils.getP3t6ComapreTotalStr(vo.getYear(), p3T6Vo.getExpenditureTotal(), p3T6Vo.getExpenditureTotalLastYear()));
            }
            if( incomeYearFlag && expenditureYearFlag && map.containsValue("其中：因公出国（境）费")) {
                itemAbroadVo.setExpenditureLastYear(FinalY22Utils.getMapNumFormat(map, 3));
                itemAbroadVo.setCompareStr(FinalY22Utils.getAddOrSubStringP3t6(itemAbroadVo.getExpenditure(), itemAbroadVo.getExpenditureLastYear()));
            }
            if( incomeYearFlag && expenditureYearFlag && map.containsValue("其中：公务用车购置费")) {
                itemCarVo.setCarBuyExpenditureLastYear(FinalY22Utils.getMapNumFormat(map, 3));
                itemCarVo.setCarBuyCompareStr(FinalY22Utils.getAddOrSubStringP3t6(itemCarVo.getCarBuyExpenditure(), itemCarVo.getCarBuyExpenditureLastYear()));
            }
            if( incomeYearFlag && expenditureYearFlag && map.containsValue("公务用车运行维护费")) {
                   itemCarVo.setCarOperateExpenditureLastYear(FinalY22Utils.getMapNumFormat(map, 3));
                itemCarVo.setCarOperateCompareStr(FinalY22Utils.getAddOrSubStringP3t6(itemCarVo.getCarOperateExpenditure(), itemCarVo.getCarOperateExpenditureLastYear()));
            }
//            if( incomeYearFlag && expenditureYearFlag && map.containsValue("公务接待费")) {
            if( incomeYearFlag && expenditureYearFlag && map.get(0).contains("公务接待费")) {
                itemReceptiondVo.setExpenditureLastYear(FinalY22Utils.getMapNumFormat(map, 3));
                itemReceptiondVo.setCompareStr(FinalY22Utils.getAddOrSubStringP3t6(itemReceptiondVo.getExpenditure(), itemReceptiondVo.getExpenditureLastYear()));
            }

            if( !supplementFlag && map.get(0).contains("、补充资料")) {
                //补充资料的开始
                supplementFlag = true;
            }
            if( supplementFlag && map.get(0).contains("机关运行经费")) {
                //TODO 年初的没有
                deptOperateVo.setTotal(FinalY22Utils.getMapNumFormat(map, 2));
                deptOperateVo.setLastYear(FinalY22Utils.getMapNumFormat(map, 3));
                deptOperateVo.setLastYearRatio(map.getOrDefault(5, "").replace(",",""));
                deptOperateVo.setCompareLastYearStr(FinalY22Utils.getAddOrSubStringP3t7s1(deptOperateVo.getTotal(), deptOperateVo.getLastYear()));
            }


            if(!isColumnFlag && map.containsValue("栏次")) {
                //标记栏次
                isColumnFlag = true;
            }

            if(!incomeYearFlag && map.containsValue("1.本年收入")) {
                //标记本年收入的读取
                incomeYearFlag = true;
            }
        }

        log.debug("success");
        //设置
//        vo.setT9Z11Vo(tvo);
    }


}
