<template>
    <div class="app-container">

        <el-form ref="queryForm" size="small" :inline="true" label-width="68px">
            <el-form-item label="模板" prop="name">
                <el-select v-model="selectedOption" ref="mySelect" size="mini" @change="handleOptionChange" filterable
                    placeholder="请选择您要查看的模板">
                    <el-option v-for="item in depss" :key="item.id" :label="item.templateName" :value="item.id"
                        :disabled="item.disabled">
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="清洗规则" prop="roleid">
                <el-select v-model="selectedRule" ref="mySelect" size="mini" @change="handleRuleChange" filterable
                    placeholder="请选择您要查看的规则">
                    <el-option v-for="iem in luckyrule" :key="iem.id" :label="iem.roleName" :value="iem.id">
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="时间" prop="date">
                <el-date-picker @change="handledateChange" v-model="date" type="month" placeholder="选择月">
                </el-date-picker>
            </el-form-item>
            <el-form-item label="所属矿区" prop="mining">
                <el-select v-model="mining" placeholder="请选择矿区" @change="handleminingChange">
                    <el-option v-for="item in miningValue" :key="item.id" :label="item.name" :value="item.id">

                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
            </el-form-item>
        </el-form>
        <el-row :gutter="10" class="mb8">
            <el-col :span="1.5">
                <el-button type="warning" plain icon="el-icon-upload2" size="mini" @click="handleExport">导出</el-button>
            </el-col>
            <el-col :span="1.5">
                <el-upload type="file" name="file" ref="upload" :before-upload="handleFileChange" action='' accept='.xlsx'
                    :limit="1" :file-list="fileList" :disabled="disableNextButton" :show-file-list=false>
                    <el-button plain size="mini" icon="el-icon-download" type="primary" :disabled="disableNextButton"
                        @click="rulesdate">导入</el-button>
                </el-upload>
                <el-button :plain="true" style="display: none;" @click="open4">错误</el-button>

            </el-col>
            <el-button plain size="mini" type="primary" @click="dialogTableVisible = true">查看</el-button>
        </el-row>
        <el-dialog title="详细信息" :visible.sync="dialogTableVisible">
            <el-table :data="detail">
                <el-table-column property="v.name" label="行"></el-table-column>
                <el-table-column property="v.material" label="列"></el-table-column>
                <el-table-column property="v.v" label="金额"></el-table-column>
                <el-table-column label="合并的行">
                    <template slot-scope="scope">
                        {{ scope.row.index.map(index => index + 1).join(', ') }}
                    </template>
                </el-table-column>
            </el-table>
        </el-dialog>

        <!-- luckysheet容器 -->
        <div id="luckysheet" style="margin: 0px; padding: 0px; position: absolute; width: 100%; height:80vh; z-index: 0">
        </div>
        <div v-if="showMask" class="mask">
            <div class="loading-spinner"></div>
        </div>

    </div>
</template>


<script>
import { selectActSuppliesHistorydata, selectActSuppliesHistorydataAcc } from "@/api/Actsupplies/cleaning_rule";
import { getSuppliesTemplate, listSuppliesTemplate, roleList, materialConvert, materialListPZ, accountingcode, department, roleListid, materialList } from "@/api/ruoyi-myLuckyexcel/myluckyexcel";
import { addInsert, addInsert1, addInsert2, addInsertAccount1, addInsertAccount2 } from "@/api/system/historydata"
/*import luckysheet from 'luckysheet'*/
import LuckyExcel from 'luckyexcel'
//导入库export.js 这个文件是es6的,不能在普通的HTML文件直接引入js文件(虽然都是js文件,但是有区别,具体请百度es6与es5)!需要把es6转es5才可以直接引入使用!
/*import {materialList} from "@/api/ruoyi-myLuckyexcel/myluckyexcel";*/
import { exportExcel } from '../../../../public/exportExcel';
import { v4 as uuidv4 } from 'uuid';
import { getInfo } from "@/api/login";
import { listSuppliesexpense } from "../../../api/ActClassification/ActClassification";
var fileName = "新建XLSX工作表"; //定义表名
var rule = [];
var tempId;
var roleId;
var uuid1;
var trueORfalse = false;
var modify = false;
export default {
    name: "Mymodule",
    data() {
        return {
            //详细信息
            dialogTableVisible: false,
            //清洗规则名字
            selectname: '',
            //详情页
            detail: [],
            //kuang
            mine: '',
            num: 1,
            nums: 1,
            value: '',
            VoucherForm: '',
            miningValue: [

                {
                    name: '林西矿',
                    id: '011704'
                },

                {
                    name: '唐山矿',
                    id: '010101'
                },
                {
                    name: '东欢坨矿',
                    id: '010102'
                },
                {
                    name: '单侯矿',
                    id: '011204'
                },
                {
                    name: '吕矿',
                    id: '011702'
                }

            ],
            Cleaningrole: '',
            phone: '',
            classify: '',
            userName: '',
            //选择的矿区
            select: '',
            //转换完成成本材料的所有数据
            middle: '',
            //未导入成本材料表模板所有数据
            jsondata: '',
            //编码数据
            codess: '',
            luckyrule: [],
            showMask: false,
            //选中的表的数据
            selected: '',
            uuid: '',
            //弹出页面的表名
            from_name: "",
            //单侯煤矿的成本表
            newArray: '',
            //往后台穿的导入表的东西
            ImportTables: {},
            //往后台传生成表的数据
            generate: {},
            cleaning: '',
            // 是否显示弹出层
            dialogVisible: false,
            selectedOption: '',
            selectedRule: '',
            luckysheetData: '',
            fileList: [],
            disableNextButton: true,
            depss: [],
            // 表单参数
            from: {},
            date: '',
            mining: '',
            froms: {
                hId: "",
                projectId: "",
                projectName: "",
                departmentName: "",
                number: "",
                nuitPrice: "",
                money: "",
                createBy: "",
                hDate: null,
                mining: ""
            },
            synthesis: '',
            historyRole: [],
            dfrom: {},
            imp: {},
            ssd: {},
            // 查询参数
            queryParams: {
                status: 0
            },

        };
    },
    created() {
        //刷新页面时进行的操作
        this.getList();
    },
    mounted() {

        this.init();
        fileName = "新建XLSX工作表";
        this.list()
    },
    methods: {
        //查询材料编码
        list() {
            materialListPZ().then(response => {
                this.codess = response.rows
            })
            //查用户名称
            getInfo().then(response => {
                this.userName = response.user.nickName
            })
            getSuppliesTemplate(1248).then(response => {
                const sysSupplies = response.rows;
                this.luckysheetData = sysSupplies[0].templateContent;
                let VoucherForm = JSON.parse(sysSupplies[0].templateContent);
                this.VoucherForm = JSON.stringify(VoucherForm)
            })
            getSuppliesTemplate(1257).then(response => {
                this.generate.historyName = response.rows[0].templateName + '(生成文件)';
                const sysSupplies = response.rows;
                this.luckysheetData = sysSupplies[0].templateContent;
                //将接收到的json存到json_data中
                //const json_data = response.data;
                this.jsondata = JSON.parse(sysSupplies[0].templateContent);
            })
            //单侯煤矿需要的东西
            getSuppliesTemplate(1264).then(response => {
                const sysSupplies = response.rows;
                this.newArray = JSON.parse(sysSupplies[0].templateContent);
            })


        },
        //手机号
        open(evt) {
            this.$prompt('请输入用友系统的用户名', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                inputPattern: /^(?:\+?86)?1[3-9]\d{9}$/,
                inputErrorMessage: '手机号格式不正确'
            }).then(({ value }) => {
                this.$message({
                    type: 'success',
                    message: '你的用户名是: ' + value
                });
                this.phone = value
                this.zhuan(evt)
            }).catch(() => {
                this.$message({
                    type: 'info',
                    message: '取消输入'
                });
                this.showMask = false
            });
        },
        /** 判断是否选择时间*/
        rulesdate() {

            const minvalue = this.miningValue.find(obj => obj.id === this.mining)
            const Luckysheetlabel = this.luckyrule.find(obj => obj.id === this.selectedRule);
            console.log(this.cleaning, this.mining)
            if (this.date == '' || this.date == null) {
                this.disableNextButton = true;
                this.$message.error('请选择时间日期!');
            } else if (this.mining == '' || this.mining == null) {
                this.disableNextButton = true;
                this.$message.error('请选择所属矿区!');
            } else if (this.cleaning == '') {
                this.disableNextButton = true;
                this.$message.error('请选择清洗规则!');
            } else if (!this.selectname.includes(this.mine)) {
                console.log('2222')
                this.disableNextButton = true;
                this.$message.error('清洗规则和所属矿区必须一致!');
            }
        },
        handledateChange(value) {
            const date = new Date(value);

            // 获取年份和月份
            const year = date.getFullYear(); // 获取年份
            const month = (date.getMonth() + 1).toString().padStart(2, "0"); // 获取月份并补零处理

            // 将年份和月份拼接成 "YYYY-MM" 的格式
            const formattedDate = year + "-" + month;


            this.date = formattedDate
            if (this.date == '' || this.date == null || this.date == undefined) {
                this.disableNextButton = true;
            } else {
                this.disableNextButton = false;
            }
        },
        handleminingChange(value) {
            department(value).then(response => {
                this.classify = response
            })
            const selectedItem = this.miningValue.find(item => item.id === value);
            if (selectedItem) {
                this.mine = selectedItem.name
            }
            this.select = value
            if (this.date == '' || this.date == null || this.date == undefined) {
                this.disableNextButton = true;
            } else {
                this.disableNextButton = false;
            }
        },

        /** 页面刷新时展示的数据*/
        getList() {
            listSuppliesTemplate(this.queryParams).then(response => {
                response.rows.forEach(row => {
                    if (row.templateName.includes('六矿')) {
                        row.disabled = true;
                    }
                });
                this.depss = response.rows;
            });

        },
        /** 下拉选和页面luckysheet绑定 */
        handleOptionChange(value) {
            this.date = ''
            this.mining = ''
            this.ImportTables.templateId = value
            this.generate.templateId = value

            this.selectedRule = '';
            this.disableNextButton = this.selectedRule === '';
            //根据选中的下拉选项值获取相应的信息
            getSuppliesTemplate(this.selectedOption).then(response => {
                //如果为六矿汇总表,导出时隐藏前两列
                if (this.selectedOption === 7 || this.selectedOption === 10) {
                    trueORfalse = true;
                } else {
                    trueORfalse = false;
                }
                modify = false;
                tempId = this.selectedOption;
                uuid1 = this.uuid = uuidv4().substring(0, 8);

                const sysSupplies = response.rows;
                this.luckysheetData = sysSupplies[0].templateContent;
                //将接收到的json存到json_data中
                //const json_data = response.data;
                var json_data = JSON.parse(sysSupplies[0].templateContent);
                roleList(value).then(response => {
                    this.luckyrule = response.rows;
                });
                let suffixArr = sysSupplies[0].templateName.split('.');
                fileName = suffixArr[0];
                //luckysheet.destroy()
                luckysheet.create({
                    container: "luckysheet", // Luckysheet 的容器元素 ID
                    title: fileName, // Excel 文件名
                    data: json_data, // Excel 数据
                    showinfobar: false,
                    allowEdit: false,//是否显示顶部名称栏
                    lang: 'zh',
                });
                this.value = fileName
            }).catch(() => {
                // 处理错误逻辑,这里是一个空的错误处理函数
                this.$message.error('查询失败,发生未知错误!');
            });
        },
        open4() {
            this.$message.error('找不到部门名称或者结算金额和材料编码列,请改为正确名称');
        },
        /** 规则下拉选 调佣后端的方法*/
        handleRuleChange(value) {
            const selectedItem = this.luckyrule.find(item => item.id === value);
            if (selectedItem) {
                this.selectname = selectedItem.roleName
            }

            if (this.selectedOption === '') {
                this.selectedRule = '';
                this.$message.warning("选择规则前请先选择模板!");
                return; // 如果按钮被禁用,提前返回,避免执行下一步操作
            }

            this.disableNextButton = this.selectedRule === '';
            roleListid(this.selectedRule).then(response => {
                roleId = this.selectedRule;
                rule = response.rows;
                //清洗规则
                this.cleaning = JSON.parse(response.rows[0].detailContent)
                this.ImportTables.convenRole = response.rows[0].detailContent

            });
            if (tempId === 7 || tempId === 10) {
                getSuppliesTemplate(tempId).then(response => {
                    uuid1 = this.uuid = uuidv4().substring(0, 8);
                    // 通过遍历this.luckyrule找到对应的iem.roleName
                    for (let i = 0; i < this.luckyrule.length; i++) {
                        if (this.luckyrule[i].id === this.selectedRule) {
                            let name = this.luckyrule[i].roleName;
                            fileName = name.slice(0, -2);
                            break;
                        }
                    }
                    modify = false;
                    const sysSupplies = response.rows;
                    this.luckysheetData = sysSupplies[0].templateContent;
                    let json_data = JSON.parse(sysSupplies[0].templateContent);
                    luckysheet.create({
                        container: "luckysheet", // Luckysheet 的容器元素 ID
                        title: fileName, // Excel 文件名
                        data: json_data, // Excel 数据
                        showinfobar: false, //是否显示顶部名称栏
                        lang: 'zh',
                    });
                }).catch(() => {
                    // 处理错误逻辑,这里是一个空的错误处理函数
                    this.$message.error('查询失败,发生未知错误!');
                });
            }


        },

        /** 重置按钮操作 */
        resetQuery() {
            //刷新下拉选框内容
            fileName = "新建XLSX工作表";
            this.selectedOption = '';
            this.disableNextButton = '';
            this.luckyrule = [];

            this.selectedRule = '';
            trueORfalse = false;
            modify = false;
            uuid1 = '';
            //刷新luckysheet表格
            this.init();
        },




        /** Luckyexcel文档 */
        init() {
            let options = {
                container: 'luckysheet', //luckysheet为容器id
                title: '',
                lang: 'zh',
                showinfobar: false,
                data: [
                    {
                        "name": "sheet1", //工作表名称
                        "color": "", //工作表颜色
                        "index": 0, //工作表索引
                        "status": 1, //激活状态
                        "order": 0, //工作表的下标
                        "hide": 0,//是否隐藏
                        "row": 50, //行数
                        "column": 20, //列数
                        "defaultRowHeight": 19, //自定义行高
                        "defaultColWidth": 73, //自定义列宽
                        "celldata": [


                        ], //初始化使用的单元格数据
                        "config": {
                            "merge": {
                            }, //合并单元格
                            "rowlen": {}, //表格行高
                            "columnlen": {}, //表格列宽
                            "rowhidden": {}, //隐藏行
                            "colhidden": {}, //隐藏列
                            "borderInfo": {

                            }, //边框
                            "authority": {}, //工作表保护
                        },
                    },

                ]

            }
            luckysheet.create(options);

        },
        async handleFileChange(evt) {
            if (modify) {
                this.$confirm('再次导入将会清空表内数据,是否继续操作?', '注意!!!', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(async () => {
                    // 确认继续后刷新页面返回模板
                    getSuppliesTemplate(this.selectedOption).then(response => {
                        const sysSupplies = response.rows;
                        this.luckysheetData = sysSupplies[0].templateContent;
                        let json_data = JSON.parse(sysSupplies[0].templateContent);
                        luckysheet.destroy()
                        luckysheet.create({
                            container: "luckysheet", // Luckysheet 的容器元素 ID
                            title: fileName, // Excel 文件名
                            data: json_data, // Excel 数据
                            allowEdit: false,//作用:是否允许前台编辑
                            showinfobar: false, //是否显示顶部名称栏
                            lang: 'zh',
                        });
                        modify = false;
                        this.open(evt)

                    }).then(async () => {


                    }).catch(() => {
                    });
                }).catch(() => {
                    // 用户点击了取消按钮
                    this.$message({ type: 'info', message: '操作已取消' });
                });
            } else {
                this.open(evt)
                this.showMask = true;
                LuckyExcel(evt, exportJson => {
                    //获取导入表格所有数据exportJson
                    this.open(exportJson)
                        // this.summary(exportJson)
                        .then(async () => {

                            // this.submit(exportJson);
                        })
                        .catch(error => {
                            this.$message({
                                message: error.message,
                                type: "error"
                            });

                        })
                        .finally(() => {
                            // 导入完成后关闭遮罩层
                            this.showMask = false;
                        });
                });

            }

        },
        //转换方法 cc是导入表数据
        // 唐山矿转入方法
        zhuan(file) {
            let cc = '';
            const transformPromise = new Promise((resolve, reject) => {
                LuckyExcel.transformExcelToLucky(file, (lucksheetfile) => {
                    resolve(lucksheetfile);
                });
            });
            transformPromise.then((result) => {
                let resultJSON = JSON.stringify(result.sheets)
                cc = result;
                this.ImportTables.historyName = result.info.name + '(导入表名)'

                let codess = this.codess
                let CompositeTable = this.jsondata
                let classify = {}
                this.classify.forEach(item => {
                    if (item.nameType) {
                        if (classify[item.nameType]) {
                            classify[item.nameType] += `, ${item.name}`;
                        } else {
                            classify[item.nameType] = item.name;
                        }
                    }
                });
                let c = cc.sheets[0].celldata
                let cjson=JSON.stringify(c)
                let config = cc.sheets[0].config
                    //表头所在行
                    let headRow = this.cleaning[0].HeaderRow - 2
                    //部门名称列

                    let DepartmentColumns = this.cleaning[0].DepartmentColumn - 1
                    let Department = c.flat().filter(obj => obj.c && obj.c === DepartmentColumns && obj.r > headRow)
                    //编码所在列
                    let codecolumn = this.cleaning[0].CodeColumn - 1
                    let code = c.flat().filter(obj => obj.c && obj.c === codecolumn && obj.r > headRow)
                    //林西的类别名称
                    let names = c.flat().filter(obj => obj.v && (obj.v.v === "类别名称" || obj.v.v === "收发类别"))[0]?.c;
                    let name = c.flat().filter(obj => obj.c && obj.c === names && obj.r > headRow)
                    //数量所在列
                    let numbercolumn = this.cleaning[0].NumberColumn - 1
                    let number = c.flat().filter(obj => obj.c && obj.c === numbercolumn && obj.r > headRow)
                    //单价所在列
                    let MoneyColumn = this.cleaning[0].MoneyColumn - 1
                    let moneys = c.flat().filter(obj => obj.c && obj.c === MoneyColumn && obj.r > headRow)
                    //算总额
                    let money = []
                    number.forEach((n, index) => {
                        if (n.r === moneys[index].r) {
                            moneys[index].v.v = (moneys[index].v.v * n.v.v).toFixed(2)
                            money.push(moneys[index])
                        }
                    })
                // 唐山矿转换方法
                //没任何规则
                if (this.mine.includes('唐山') && this.selectname.includes('唐山')) {
                    if (code && money && Department) {
                        let newobj = []
                        //把这三个数组push到newobj里
                        newobj.unshift(money);
                        newobj.unshift(code);
                        newobj.unshift(Department);
                        //跟材料表的数据对比  如果编码一样 则把导入表的列数换成模板的列数
                        codess.forEach(c => {
                            let codeLength = String(c.code).length;
                            let codeToCompare = String(c.code).substring(0, codeLength);
                            newobj[1].forEach(column => {
                                let columnIdString = String(column.v.v);
                                let idToMatch = columnIdString.substring(0, codeLength);
                                if (idToMatch === codeToCompare) {
                                    column.ccc = c.oneLevel * 1;
                                }
                            });
                        });

                        //按照部门划分,去找到他所在科室分类
                        newobj = newobj.map(subArr => {
                            return subArr.map(obj => {
                                let v = obj.v.v;
                                for (let key in classify) {
                                    if (classify[key].includes(v)) {
                                        obj.v.m = key;
                                        obj.v.v = key;
                                        obj.v.name = key
                                        obj.whether = true
                                        return obj;
                                    }
                                }
                                obj.whether = false
                                return obj;
                            });
                        });
                        newobj[2].forEach((item, i) => {
                            if ('name' in newobj[0][i].v) {
                                item.v.name = newobj[0][i].v.name;
                            }
                        });
                        //直接luck表格初始化 替换数据

                        //找到所在的行数,按照  -的前后去找,前面是标题,后面是标题后的小分类,如选煤,洗煤等
                        CompositeTable[0].data = luckysheet.transToData(CompositeTable[0]["celldata"])
                        newobj[0].forEach((item) => {
                            if (item.v.m !== undefined) {
                                let index = item.v.m.indexOf("-");
                                if (index !== -1) {
                                    let substrBeforeDash = item.v.m.slice(0, index);
                                    let DepartColumns = CompositeTable[0]["celldata"].flat().find(obj =>
                                        obj.v && obj.v.v && typeof obj.v.v === 'string' && obj.v.v.includes(item.v.m.slice(0, index))
                                    );

                                    if (DepartColumns && DepartColumns.r) {
                                        let index = item.v.m.indexOf("-")
                                        if (index !== -1) {
                                            let substrAfterDash = item.v.m.slice(index + 1);
                                            switch (substrAfterDash) {
                                                case '':
                                                    item.r = DepartColumns.r;
                                                    break;
                                                case '原煤':
                                                    item.r = DepartColumns.r + 1;
                                                    break;
                                                case '洗煤':
                                                    item.r = DepartColumns.r + 2;
                                                    break;
                                                case '选煤':
                                                    item.r = DepartColumns.r + 3;
                                                    break;
                                                case '厂区服务':
                                                    item.r = DepartColumns.r + 1;
                                                    break;
                                                default:
                                                // 默认情况
                                            }
                                        }
                                    }
                                }
                            }
                        });
                        //把原来分类找不到的放到其他数据类型中,最后一列其他列中
                        newobj[1].forEach((item, i) => {
                            if (item.ccc && newobj[0][i].r < 8) {
                                item.c = item.ccc;
                                delete item.ccc;
                            } else {
                                item.c = 10;
                            }
                        });
                        //金额列和行是原先导入表的行列 要替换掉模板表的行列
                        newobj[0].forEach((item, i) => {
                            if (item.whether) {
                                newobj[2][i].r = item.r;
                                newobj[2][i].c = newobj[1][i].c;
                                newobj[2][i].v.v = Number(newobj[2][i].v.v);
                            } else {
                                newobj[2][i].r = '';
                                newobj[2][i].c = '';
                            }
                        });
                        //同一个单元格的数据 金额相加。
                        let i = headRow - 1
                        let duplicateData = [];
                        let seen = new Map();

                        // 根据行列信息合并重复数据并记录索引
                        for (let obj of newobj[2]) {
                            i += 1;
                            let key = obj.r + ',' + obj.c;
                            if (seen.has(key)) {
                                let existingObj = seen.get(key);
                                existingObj.v.v += obj.v.v;
                                existingObj.v.m = (parseInt(existingObj.v.m) + parseInt(obj.v.m)).toString();
                                existingObj.index.push(newobj[1][i].r);
                            } else {
                                obj.index = [newobj[1][i].r];
                                seen.set(key, obj);
                            }
                        }
                        // 将合并后的数据放入 duplicateData 数组
                        for (let obj of seen.values()) {
                            if (obj.v.v > 0 || parseInt(obj.v.m) > 0) {
                                duplicateData.push(obj);
                            }
                        }
                        duplicateData = duplicateData.map(item => {
                            return {
                                ...item,
                                v: {
                                    ...item.v,
                                    v: isNaN(item.v.v) ? item.v.v : Number(item.v.v).toFixed(2)
                                }
                            };
                        });
                        // 替换金额所在列和行相同的模板表中的数据
                        //金额所在列和行,去模板表中查找,如果行列一致则替换
                        for (let i = 0; i < duplicateData.length; i++) {
                            //     // 对比 c 和 r 是否与 CompositeTable[0]["celldata"] 中相应对象相同
                            for (let k = 0; k < CompositeTable[0]["celldata"].length; k++) {
                                if (duplicateData[i].r === CompositeTable[0]["celldata"][k].r && duplicateData[i].c === CompositeTable[0]["celldata"][k].c) {
                                    // 如果相同,则进行替换
                                    CompositeTable[0]["celldata"][k] = duplicateData[i];
                                }
                            }
                        }
                        // celldata => data 生成表格所需二维数组
                        CompositeTable[0].data = luckysheet.transToData(CompositeTable[0]["celldata"])
                        if (!(this.value.includes('凭证'))) {
                            luckysheet.create({
                                container: "luckysheet", // Luckysheet 的容器元素 ID
                                title: fileName, // Excel 文件名
                                data: CompositeTable, // Excel 数据
                                showinfobar: false, //是否显示顶部名称栏
                                lang: 'zh',
                            });
                            modify = true
                            this.showMask = false;
                        }
                        //this.from 往后台村的数据
                        this.ImportTables.historyContent = resultJSON
                        this.generate.historyContent = JSON.stringify(CompositeTable)
                        //往后台传科目编码相关的东西
                        duplicateData.forEach(obj => {
                            CompositeTable[0].celldata.forEach(cell => {
                                if (obj.c === cell.c && cell.r === 3) {
                                    obj.v.material = cell.v.v;
                                }
                            });
                        });
                        this.middle = CompositeTable
                        this.Vouchers(duplicateData)
                    } else {
                        this.open4()
                        this.showMask = false;
                    }
                }
                //林西矿转换方法
                //机电制造费用现在是筛选出来了,。没有放到里面,如果想放进去也可以放进去,但是具体划分就不明细了
                if (this.mine.includes('林西') && this.selectname.includes('林西')) {
                    //类别名称,部门名称,不含税金额,存货编码
                    if (name && Department && money && code) {
                        let nameColums = name
                        nameColums = nameColums.flat().filter(obj => obj.v.hasOwnProperty('v'));
                        let name1 = Department
                        // code 编码 name1部门名称 money金额  name1 部门名称
                        // 清空属性
                        money.forEach(entry => {
                            entry.department = '';
                            entry.remark = '';
                            entry.classify = '';
                            entry.code = '';
                            entry.index=entry.r
                        });

                        // 合并数组
                        let newobj = [...name1, ...nameColums, ...code];

                        // 匹配赋值
                        money.forEach(m => {
                            newobj.forEach(a => {
                                if (m.r === a.r) {
                                    if (a.c === DepartmentColumns) m.remark = a.v.v || a.v.m;
                                    if (a.c === names) m.classify = a.v.v || a.v.m;
                                    if (a.c === codecolumn) m.code = a.v.v || a.v.m;
                                    m.cc = '';
                                }
                            });
                        });

                        // 删除指定分类
                        const filteredClassifications = ["研发费用", "基金", "安全费用"];
                        money = money.filter(item => !filteredClassifications.includes(item.classify));

                        // 替换属性值
                        money.forEach(item => {
                            if (item.head === "坑木") item.head = "木材";
                            if (!item.remark) item.v.name = "基本生产-原煤";
                        });

                        // 提取特定属性值相同的数据
                        const Electromechanical = "机电制造分公司";
                        const filteredMoney = money.filter(item => {
                            if (item.remark === Electromechanical) {
                                money.splice(money.indexOf(item), 1);
                                return true;
                            }
                            return false;
                        });

                        // 对比替换导入表和模板的列数
                        codess.forEach(code => {
                            let codeLength = String(code.code).length;
                            money.forEach(m => {
                                let columnIdString = String(m.code);
                                let idToMatch = columnIdString.substring(0, codeLength);
                                if (idToMatch === String(code.code).substring(0, codeLength)) {
                                    m.cc = code.oneLevel * 1;
                                }
                            });
                        });

                        // 设置属性值
                        money.forEach(item => {
                            item.c = item.cc ? item.cc * 1 : 10;
                        });
                        money = money.map(obj => {
                            let v = obj.remark;
                            for (let key in classify) {
                                if (classify[key].includes(v)) {
                                    obj.v.name = key;
                                    obj.whether = true;
                                    return obj;
                                }
                            }
                            obj.v.name = "基本生产-原煤";
                            return obj;
                        });

                        money.forEach(item => {
                            if (item.department && item.v.name) {
                                let originalString = item.v.name;
                                let parts = originalString.split("-");
                                let replacedString = parts[0] + "-" + item.department;
                                item.v.name = replacedString;
                            }
                        });

                        money.forEach(item => {
                            if (item.v.name !== undefined) {
                                let index = item.v.name.indexOf("-");
                                if (index !== -1) {
                                    let substrBeforeDash = item.v.name.slice(0, index);
                                    let DepartColumns = CompositeTable[0]["celldata"].flat().filter(obj => {
                                        if (obj.v && obj.v.v && typeof obj.v.v === 'string') {
                                            return obj.v.v.includes(item.v.name.slice(0, index));
                                        }
                                        return false;
                                    })[0];

                                    if (DepartColumns && DepartColumns.r) {
                                        let index = item.v.name.indexOf("-");
                                        if (index !== -1) {
                                            let substrAfterDash = item.v.name.slice(index + 1);
                                            switch (substrAfterDash) {
                                                case '':
                                                    item.r = DepartColumns.r;
                                                    break;
                                                case '原煤':
                                                    item.r = DepartColumns.r + 1;
                                                    break;
                                                case '洗煤':
                                                    item.r = DepartColumns.r + 2;
                                                    break;
                                                case '选煤':
                                                    item.r = DepartColumns.r + 3;
                                                    break;
                                                case '厂区服务':
                                                    item.r = DepartColumns.r + 1;
                                                    break;
                                                case '加工修理':
                                                    item.r = DepartColumns.r + 4;
                                                    break;
                                                default:
                                                // 默认情况
                                            }
                                        }
                                    }
                                }
                            }
                        });

                        money.forEach(item => {
                            if (item.r > 8 && item.c < 10) {
                                item.c = 10;
                            }
                        });
                        // 同一个单元格,金额相加
                        let seen = new Map();
                        let duplicateData = [];

                        money.forEach((obj) => {
                            let key = obj.r + ',' + obj.c;
                            if (seen.has(key)) {
                                let existingObj = seen.get(key);
                                existingObj.v.v = Number(existingObj.v.v) + Number(obj.v.v);
                                existingObj.v.m = existingObj.v.v.toString();
                                existingObj.index.push(obj.index);
                            } else {
                                obj.index = [obj.index];
                                seen.set(key, obj);
                            }
                        });

                        seen.forEach(obj => {
                            if (obj.v.v > 0 || parseInt(obj.v.m) > 0) {
                                duplicateData.push(obj);
                            }
                        });
                        duplicateData = duplicateData.map(item => {
                            return {
                                ...item,
                                v: {
                                    ...item.v,
                                    v: isNaN(item.v.v) ? item.v.v : Number(item.v.v).toFixed(2)
                                }
                            };
                        });
                        //金额所在列和行,去模板表中查找,如果行列一致则替换
                        for (let i = 0; i < duplicateData.length; i++) {
                            //     // 对比 c 和 r 是否与 CompositeTable[0]["celldata"] 中相应对象相同
                            for (let k = 0; k < CompositeTable[0]["celldata"].length; k++) {
                                if (duplicateData[i].r === CompositeTable[0]["celldata"][k].r && duplicateData[i].c === CompositeTable[0]["celldata"][k].c) {
                                    // 如果相同,则进行替换
                                    CompositeTable[0]["celldata"][k] = duplicateData[i];
                                }
                            }
                        }
                        CompositeTable[0].data = luckysheet.transToData(CompositeTable[0]["celldata"])
                        if (!(this.value.includes('凭证'))) {
                            luckysheet.create({
                                container: "luckysheet", // Luckysheet 的容器元素 ID
                                title: fileName, // Excel 文件名
                                data: CompositeTable, // Excel 数据
                                showinfobar: false, //是否显示顶部名称栏
                                allowEdit: false,//作用:是否允许前台编辑
                                lang: 'zh',
                            });
                            modify = true
                            this.showMask = false;

                        }
                        //this.from 往后台村的数据
                        this.ImportTables.historyContent = resultJSON
                        this.generate.historyContent = JSON.stringify(CompositeTable)
                        //往后台传科目编码相关的东西
                        duplicateData.forEach(obj => {
                            CompositeTable[0].celldata.forEach(cell => {
                                if (obj.c === cell.c && cell.r === 3) {
                                    obj.v.material = cell.v.v;
                                }
                            });
                        });
                        this.middle = CompositeTable
                        this.Vouchers(duplicateData)
                    } else {
                        this.open4()
                        this.showMask = false;
                    }
                }
                //东欢坨矿转换方法
                //如果部门为旧品和设备 并且他们的材料为支护用品和大型材料就把他们放到基本生产里
                if (this.mine.includes('东欢坨') && this.selectname.includes('东欢坨')) {
                    //材料编码,金额,部门
                    if (code && money && Department) {
                        //code 编码 ,,money金额,remark 部门
                        let remark = Department
                        remark.forEach((item) => {
                            if (item.v.v.includes("单项卡")) {
                                item.v.v = item.v.v.replace(/单项卡/g, '');
                            }
                        });

                        money.forEach((item) => {
                            item.remark = '';
                            item.code = '';
                            item.cc = '';
                            item.v.name = '';
                            item.index=item.r
                        });

                        for (let i = 0; i < money.length; i++) {
                            if (money[i].r == code[i].r) {
                                money[i].code = code[i].v.v;
                            }
                            if (money[i].r == remark[i].r) {
                                money[i].remark = remark[i].v.v;
                            }
                        }

                        codess.forEach((codeItem) => {
                            let codeLength = String(codeItem.code).length;
                            let codeToCompare = String(codeItem.code).substring(0, codeLength);
                            money.forEach((moneyItem) => {
                                let columnIdString = String(moneyItem.code);
                                let idToMatch = columnIdString.substring(0, codeLength);
                                if (idToMatch === codeToCompare) {
                                    moneyItem.cc = codeItem.oneLevel * 1;
                                }
                            });
                        });

                        money = money.map((item) => {
                            let v = item.remark;
                            for (let key in classify) {
                                if (classify[key].includes(v)) {
                                    item.v.name = key;
                                    return item;
                                }
                            }
                            item.v.name = "基本生产-原煤";
                            return item;
                        });
                        //东欢坨矿的规则 如果部门为旧品和设备 并且他们的材料为支护用品和大型材料就把他们放到基本生产里
                        money.forEach((item) => {
                            if (item.remark == "旧品利用中心" || item.remark == "设备管理科") {
                                if (item.cc == 3 || item.cc == 2) {
                                    item.v.name = "基本生产-原煤";
                                }
                            }
                        });

                        money.forEach((item) => {
                            item.c = item.cc ? item.cc * 1 : 10;
                        });

                        money.forEach((item) => {
                            if (item.department && item.v.name) {
                                let originalString = item.v.name;
                                let parts = originalString.split("-");
                                let replacedString = parts[0] + "-" + item.department;
                                item.v.name = replacedString;
                            }
                        });

                        money.forEach((item) => {
                            if (item.v.name !== undefined) {
                                let index = item.v.name.indexOf("-");
                                if (index !== -1) {
                                    let substrBeforeDash = item.v.name.slice(0, index);
                                    let DepartColumns = CompositeTable[0]["celldata"].flat().find((obj) => {
                                        if (obj.v && obj.v.v && typeof obj.v.v === 'string') {
                                            return obj.v.v.includes(item.v.name.slice(0, index));
                                        }
                                        return false;
                                    });

                                    if (DepartColumns && DepartColumns.r) {
                                        let index = item.v.name.indexOf("-");
                                        if (index !== -1) {
                                            let substrAfterDash = item.v.name.slice(index + 1);
                                            switch (substrAfterDash) {
                                                case '':
                                                    item.r = DepartColumns.r;
                                                    break;
                                                case '原煤':
                                                    item.r = DepartColumns.r + 1;
                                                    break;
                                                case '洗煤':
                                                    item.r = DepartColumns.r + 2;
                                                    break;
                                                case '选煤':
                                                    item.r = DepartColumns.r + 3;
                                                    break;
                                                case '厂区服务':
                                                    item.r = DepartColumns.r + 1;
                                                    break;
                                                default:
                                                // 默认情况
                                            }
                                        }
                                    }
                                }
                            }
                        });

                        // 更新金额列
                        for (let item of money) {
                            if (item.r > 8 && item.c < 10) {
                                item.c = 10;
                            }
                        }

                        // 合并重复单元格数据
                        let cellMap = new Map();
                        for (let i = 0; i < money.length; i++) {
                            let key = money[i].r + ',' + money[i].c;
                            if (cellMap.has(key)) {
                                let existingItem = cellMap.get(key);
                                existingItem.v.v = Number(existingItem.v.v) + Number(money[i].v.v);
                                existingItem.v.m = existingItem.v.v.toString();
                                existingItem.index.push(money[i].index);
                            } else {
                                money[i].index = [money[i].index];
                                cellMap.set(key, money[i]);
                            }
                        }
                        let duplicateData = Array.from(cellMap.values()).filter(item => item.v.v > 0 || parseInt(item.v.m) > 0);
                        duplicateData = duplicateData.map(item => {
                            return {
                                ...item,
                                v: {
                                    ...item.v,
                                    v: isNaN(item.v.v) ? item.v.v : Number(item.v.v).toFixed(2)
                                }
                            };
                        });
                        // 替换原始数据中的重复单元格数据
                        //金额所在列和行,去模板表中查找,如果行列一致则替换
                        for (let i = 0; i < duplicateData.length; i++) {
                            //     // 对比 c 和 r 是否与 CompositeTable[0]["celldata"] 中相应对象相同
                            for (let k = 0; k < CompositeTable[0]["celldata"].length; k++) {
                                if (duplicateData[i].r === CompositeTable[0]["celldata"][k].r && duplicateData[i].c === CompositeTable[0]["celldata"][k].c) {
                                    // 如果相同,则进行替换
                                    CompositeTable[0]["celldata"][k] = duplicateData[i];
                                }
                            }
                        }
                        CompositeTable[0].data = luckysheet.transToData(CompositeTable[0]["celldata"])
                        if (!(this.value.includes('凭证'))) {
                            luckysheet.create({
                                container: "luckysheet", // Luckysheet 的容器元素 ID
                                title: fileName, // Excel 文件名
                                data: CompositeTable, // Excel 数据
                                showinfobar: false, //是否显示顶部名称栏
                                lang: 'zh',
                            });
                            modify = true
                            this.showMask = false;
                        }
                        //this.from 往后台村的数据
                        this.ImportTables.historyContent = resultJSON
                        this.generate.historyContent = JSON.stringify(CompositeTable)
                        //往后台传科目编码相关的东西
                        duplicateData.forEach(obj => {
                            CompositeTable[0].celldata.forEach(cell => {
                                if (obj.c === cell.c && cell.r === 3) {
                                    obj.v.material = cell.v.v;
                                }
                            });
                        });
                        this.middle = CompositeTable
                        this.Vouchers(duplicateData)
                    } else {
                        this.open4()
                        this.showMask = false
                    }
                }
                //单侯矿转换方法&& this.selectname.includes('单侯') 
                //特定规则 制造费用可能放也可能不放,制造费用后期可能会晒出来
                if (this.mine.includes('单侯')) {
                    let headRows = this.newArray[0].celldata.flat().filter(obj => obj.v && obj.v.v === "火工品")[0]?.r
                    //费用来源
                    let fylyColumn = c.flat().filter(obj => obj.v && obj.v.v === "费用来源")[0]?.c
                    if (Department && money && code) {
                        let headRow = this.newArray[0].celldata.flat().filter(obj => obj.r && obj.r === headRows && obj.c > 0)
                        let fyly = c.flat().filter(obj => obj.c && obj.c === fylyColumn && obj.r > 0)
                        // 清空money数组中的属性
                        money.forEach(item => {
                            item.Department = '';
                            item.code = '';
                            item.cc = '';
                            item.fyly = '';
                            item.rr = '';
                            item.index = item.r
                        });
                        // 更新money数组中的属性
                        money = money.filter(item => {
                            let matchingCode = code.find(c => c.r === item.r);
                            if (matchingCode) {
                                item.code = matchingCode.v.v;
                            }

                            let matchingRemark = Department.find(r => r.r === item.r);
                            if (matchingRemark) {
                                item.Department = matchingRemark.v.v;
                            }

                            let matchingFyly = fyly.find(f => f.r === item.r);
                            if (matchingFyly) {
                                item.fyly = matchingFyly.v.v;
                            }

                            return (matchingCode && matchingRemark && matchingFyly);
                        });

                        money.forEach((item) => {
                            if (item.Department.startsWith('物管科')) {
                                item.Department = '物管科';
                            }
                            if (item.Department.endsWith('储运科')) {
                                item.Department = '储运科';
                            }
                            if (item.Department.includes('生活')) {
                                item.Department = '生活科'
                            }
                        });
                        money = money.map(obj => {
                            let v = obj.Department;
                            for (let key in classify) {
                                if (classify[key].includes(v)) {
                                    obj.v.name = key;
                                    obj.whether = true;
                                    return obj;
                                }
                            }
                            return obj;
                        });
                        for (let i = 0; i < codess.length; i++) {
                            let codeLength = String(codess[i].code).length;
                            let codeToCompare = String(codess[i].code).substring(0, codeLength);
                            for (let k = 0; k < money.length; k++) {
                                let columnIdString = String(money[k].code);
                                let idToMatch = columnIdString.substring(0, codeLength);
                                if (idToMatch === codeToCompare) {
                                    money[k].cc = codess[i].oneLevel * 1
                                }
                            }
                        }
                        let synthesis = this.newArray
                        let head = synthesis[0].celldata.flat().filter(obj => obj.c == 0 && obj.r > 4)
                        head.forEach(itemA => {
                            let targetRemark = itemA.v.v; // 需要匹配的目标值,这里是 a 属性中的 v.v
                            money.forEach(itemB => {
                                if (itemB.Department.includes(targetRemark)) { // 使用 include 方法进行模糊匹配
                                    itemB.rr = itemA.r; // 如果匹配到,则将 a 属性中的 r 的值赋给 b 属性中的 rr
                                }
                            });
                        });
                        for (let i = 0; i < money.length; i++) {
                            if (money[i].rr) {
                                money[i].r = money[i].rr
                            }
                            if (money[i].cc) {
                                money[i].c = money[i].cc * 1
                            }
                            if (!money[i].cc) {
                                money[i].c = 10

                            }
                        }
                        let seen = new Map();
                        let duplicateData = [];
                        for (let obj of money) {
                            let key = obj.r + ',' + obj.c;
                            if (seen.has(key)) {
                                let existingObj = seen.get(key);
                                existingObj.v.v = Number(existingObj.v.v) + Number(obj.v.v);
                                existingObj.v.m = existingObj.v.v.toString();
                                existingObj.index.push(obj.index)
                            } else {
                                obj.index = [obj.index]
                                seen.set(key, obj);
                            }
                        }
                        for (let obj of seen.values()) {
                            if (obj.v.v > 0 || parseInt(obj.v.m) > 0) {
                                duplicateData.push(obj);
                            }
                        }
                        for (let i = 0; i < duplicateData.length; i++) {
                            //     // 对比 c 和 r 是否与 he[0]["celldata"] 中相应对象相同
                            for (let k = 0; k < synthesis[0]["celldata"].length; k++) {
                                if (duplicateData[i].r === synthesis[0]["celldata"][k].r && duplicateData[i].c === synthesis[0]["celldata"][k].c) {
                                    // 如果相同,则进行替换
                                    synthesis[0]["celldata"][k] = duplicateData[i];
                                }
                            }
                        }
                        synthesis[0].data = luckysheet.transToData(synthesis[0]["celldata"])
                        if (!(this.value.includes('凭证'))) {
                            luckysheet.create({
                                container: "luckysheet", // Luckysheet 的容器元素 ID
                                title: fileName, // Excel 文件名
                                data: synthesis, // Excel 数据
                                showinfobar: false, //是否显示顶部名称栏
                                lang: 'zh',
                            });
                            modify = true
                            this.showMask = false;
                        }
                        duplicateData.forEach(item => {
                            const matchedHeadRow = headRow.find(headItem => headItem.c === item.c);
                            if (matchedHeadRow) {
                                item.v.material = matchedHeadRow.v.v;
                            }
                        });
                        for (let i = 0; i < duplicateData.length; i++) {
                            if (duplicateData[i].r > 4 && duplicateData[i].r < 16) {
                                //管理费用
                                duplicateData[i].r = 6
                                duplicateData[i].c = 12

                            }
                            if (duplicateData[i].r > 16 && duplicateData[i].r < 27) {
                                //制造费用
                                duplicateData[i].r = 7
                                duplicateData[i].c = 10


                            }
                            if (duplicateData[i].r > 28 && duplicateData[i].r < 43) {
                                //基本费用
                                duplicateData[i].r = 8

                            }
                            if (duplicateData[i].r > 43 && duplicateData[i].r < 46) {
                                //销售费用
                                duplicateData[i].r = 9
                                duplicateData[i].c = 10


                            }
                            if (duplicateData[i].r > 46 && duplicateData[i].r < 48) {
                                //其他业务
                                duplicateData[i].r = 10
                                duplicateData[i].c = 10
                            }

                            if (duplicateData[i].r > 49 && duplicateData[i].r < 51) {
                                //安全费用  
                                duplicateData[i].r = 11
                                duplicateData[i].c = 10
                            }
                        }
                        let seens = new Map();
                        let duplicateDatas = [];
                        for (let obj of duplicateData) {
                            let key = obj.r + ',' + obj.c;
                            if (seens.has(key)) {
                                let existingObj = seens.get(key);
                                existingObj.v.v = Number(existingObj.v.v) + Number(obj.v.v);
                                existingObj.v.m = existingObj.v.v.toString();
                            } else {

                                seens.set(key, obj);
                            }
                        }
                        for (let obj of seens.values()) {
                            if (obj.v.v > 0 || parseInt(obj.v.m) > 0) {
                                duplicateDatas.push(obj);
                            }
                        }
                        this.Vouchers(duplicateDatas)
                    } else {
                        this.open4()
                        this.showMask = false;
                    }
                }
                //吕矿转换,
                //吕矿规则,他自己带成本费用,只需要找到部门列 然后合并行
                if (this.mine.includes('吕矿')) {
                    let results = ['10.安全费用', '11.研究费用', '12.维简及井巷费']
                    //先把安全费用 研发什么的插入到成本材料表中
                    for (let i = 0, k = 0; i < CompositeTable[0].celldata.length && k < results.length; i++) {
                        if (CompositeTable[0].celldata[i] && CompositeTable[0].celldata[i].r && CompositeTable[0].celldata[i].r >= 23 && CompositeTable[0].celldata[i].r < 26 && CompositeTable[0].celldata[i].c == 0) {
                            CompositeTable[0].celldata[i].v.v = results[k];
                            CompositeTable[0].celldata[i].v.m = results[k];
                            k++;
                        }
                    }
                    let c=JSON.parse(cjson)
                    // 使用 filter 方法筛选 r 值为 1 的对象,得到贷款信息
                    const loan = c.filter(obj => obj.r === 1);
                    // 使用 filter 方法筛选 r 值为 0 的对象,得到表头信息
                    const head = c.filter(obj => obj.r === 0);
                    // 找出空白列
                    const mincolumn = head.filter(obj => !obj.v.v);
                    // 获取最大列
                    const maxcolumn = loan[loan.length - 1].c;
                    // 遍历空白列,根据表头信息进行填充
                    for (let k = 0; k < mincolumn.length; k++) {
                        let i = 1;
                        while (true) {
                            const targetHead = head.find(obj => obj.c === mincolumn[k].c - i);
                            if (targetHead && targetHead.v.v !== undefined) {
                                mincolumn[k].v.v = targetHead.v.v;
                                break;
                            }
                            i++;
                        }
                    }
                    // 更新表格中的空白列数据
                    mincolumn.forEach(min => {
                        const matchingCell = c.find(cell => cell.r === min.r && cell.c === min.c);
                        if (matchingCell) {
                            matchingCell.v.v = min.v.v;
                        }
                    });
                    // 获取最小列
                    const min = mincolumn[0].c - 1;
                    // 使用 filter 方法筛选包含有效值的对象
                    const max = c.filter(obj => obj.v.v);
                    for (let i = max.length - 1; i >= 0; i--) {
                        const item = max[i];
                        if (item.v.v === "NaN") {
                            max.splice(i, 1);
                        }
                    }
                    // 获取编码列的索引
                    const codecolumn = max.find(obj => obj.c === 2).c;
                    // 获取表头合并所需的信息
                    const head1 = max.filter(obj => obj.r >= 2 && obj.c === codecolumn);
                    // 遍历表格,为每一项添加类别信息和金额信息
                    max.forEach(obj => {
                        if (obj.r > 0 && obj.c >= min) {
                            let coulumn = obj.c;
                            obj.v.name = max.find(c => c.c === coulumn && c.r === 0).v.v;
                            obj.category = max.find(c => c.c === coulumn && c.r === 1)?.v.v;
                        }
                    });
                    // 输出整理后的表格数据
                    const code = max.filter(obj => obj.r >= 2 && obj.c == 2);
                    // 获取金额列
                    const moneycolumn = max.filter(obj => obj.r >= 2 && obj.c >= min);
                    moneycolumn.forEach(money => {
                        const matchingCode = code.find(code => code.r === money.r);
                        if (matchingCode) {
                            money.code = matchingCode.v.v;
                        }
                    });
                    const money = moneycolumn.filter(obj => (obj.category.includes('单价') || obj.category.includes('数量')));
                    // 计算总金额
                    const result = [];
                    const map = new Map();
                    money.forEach(item => {
                        if (map.has(item.r)) {
                            const existingItem = map.get(item.r);
                            existingItem.v.v *= parseFloat(item.v.v);
                        } else {
                            map.set(item.r, { ...item, v: { ...item.v, v: parseFloat(item.v.v) }, category: "总金额" });
                        }
                    });
                    map.forEach(value => result.push(value));
                    // 对 部门分类 进行处理
                    const duplicateDatas = result.map(item => {
                        let categories = item.v.name;
                        if (categories.includes('--') || categories.includes('-')) {
                            categories = categories.replace(/--/g, '-');
                        } else {
                            categories += '-';
                        }
                        item.v.name = categories;
                        return item;
                    });
                    duplicateDatas.forEach(item => {
                        item.index = item.r
                        if (item.v.name !== undefined) {
                            let index = item.v.name.indexOf("-");
                            if (index !== -1) {
                                let substrBeforeDash = item.v.name.slice(0, index);
                                let DepartColumns = CompositeTable[0]["celldata"].flat().filter(obj => {
                                    if (obj.v && obj.v.v && typeof obj.v.v === 'string') {
                                        return obj.v.v.includes(item.v.name.slice(0, index));
                                    }
                                    return false;
                                })[0];
                                if (DepartColumns && DepartColumns.r) {
                                    let index = item.v.name.indexOf("-");
                                    if (index !== -1) {
                                        let substrAfterDash = item.v.name.slice(index + 1);
                                        switch (substrAfterDash) {
                                            case '':
                                                item.r = DepartColumns.r;
                                                break;
                                            case '原煤':
                                                item.r = DepartColumns.r + 1;
                                                break;
                                            case '洗煤':
                                                item.r = DepartColumns.r + 2;
                                                break;
                                            case '选煤':
                                                item.r = DepartColumns.r + 3;
                                                break;
                                            case '厂区服务':
                                                item.r = DepartColumns.r + 1;
                                                break;
                                            default:
                                            // 默认情况

                                        }
                                    }
                                }
                            }
                        }
                    });
                    codess.forEach(codeItem => {
                        let codeLength = String(codeItem.code).length;
                        let codeToCompare = String(codeItem.code).substring(0, codeLength);
                        let matchingItem = duplicateDatas.find(duplicateItem => String(duplicateItem.code).startsWith(codeToCompare));
                        if (matchingItem) {
                            matchingItem.cc = codeItem.oneLevel * 1;
                        }
                    });
                    duplicateDatas.forEach((item) => {
                        item.c = item.cc ? item.cc * 1 : 10;
                    });
                    //同一个单元格的数据 金额相加。
                    let duplicateData = [];
                    let seen = new Map();
                    // 根据行列信息合并重复数据并记录索引
                    for (let obj of duplicateDatas) {
                        let key = obj.r + ',' + obj.c;
                        if (seen.has(key)) {
                            let existingObj = seen.get(key);
                            existingObj.v.v += obj.v.v;
                            existingObj.v.m = (parseInt(existingObj.v.m) + parseInt(obj.v.m)).toString();
                            existingObj.index.push(obj.index);
                        } else {
                            obj.index = [obj.index];
                            seen.set(key, obj);
                        }
                    }
                    // 将合并后的数据放入 duplicateData 数组
                    for (let obj of seen.values()) {
                        if (obj.v.v > 0 || parseInt(obj.v.m) > 0) {
                            duplicateData.push(obj);
                        }
                    }
                    duplicateData = duplicateData.map(item => {
                        return {
                            ...item,
                            v: {
                                ...item.v,
                                v: isNaN(item.v.v) ? item.v.v : Number(item.v.v).toFixed(2)
                            }
                        };
                    });
                    // 替换金额所在列和行相同的模板表中的数据
                    //金额所在列和行,去模板表中查找,如果行列一致则替换
                    for (let i = 0; i < duplicateData.length; i++) {
                        //     // 对比 c 和 r 是否与 CompositeTable[0]["celldata"] 中相应对象相同
                        for (let k = 0; k < CompositeTable[0]["celldata"].length; k++) {
                            if (duplicateData[i].r === CompositeTable[0]["celldata"][k].r && duplicateData[i].c === CompositeTable[0]["celldata"][k].c) {
                                // 如果相同,则进行替换
                                CompositeTable[0]["celldata"][k] = duplicateData[i];
                            }
                        }
                    }
                    // celldata => data 生成表格所需二维数组
                    CompositeTable[0].data = luckysheet.transToData(CompositeTable[0]["celldata"])
                    if (!(this.value.includes('凭证'))) {
                        luckysheet.create({
                            container: "luckysheet", // Luckysheet 的容器元素 ID
                            title: fileName, // Excel 文件名
                            data: CompositeTable, // Excel 数据
                            showinfobar: false, //是否显示顶部名称栏
                            lang: 'zh',
                        });
                        modify = true
                        this.showMask = false;

                    }
                    //this.from 往后台村的数据
                    this.ImportTables.historyContent = resultJSON
                    this.generate.historyContent = JSON.stringify(CompositeTable)
                    //往后台传科目编码相关的东西
                    duplicateData.forEach(obj => {
                        CompositeTable[0].celldata.forEach(cell => {
                            if (obj.c === cell.c && cell.r === 3) {
                                obj.v.material = cell.v.v;
                            }
                        });
                    });
                    this.middle = CompositeTable
                    this.Vouchers(duplicateData)

                }
            });
        },
        //成本表往凭证但转      
        Vouchers(duplicateData) {
            console.log(duplicateData)
            this.detail = duplicateData.map(item => {
                if (typeof item.v.v === 'number') {
                    item.v.v = Number(item.v.v.toFixed(2)); // 如果是数字,则进行处理
                }
                if (typeof item.v.m === 'number') {
                    item.v.m = parseFloat(item.v.m).toFixed(2); // 如果是数字,则进行处理
                }
                return item;
            });

            let sum = [{
                code: '2241005',
                material: '其他材料',
                v: 0
            }, {
                code: '1403002',
                material: "火工品",
                v: 0,
            }];

            for (let i = 0; i < duplicateData.length; i++) {
                if (duplicateData[i].v.material === "火工品") {
                    sum[1].v += Number(duplicateData[i].v.v);
                } else {
                    sum[0].v += Number(duplicateData[i].v.v);
                }
            }

            sum.forEach(item => {
                item.v = Number(item.v).toFixed(2);
            });

            const VoucherForm = JSON.parse(this.VoucherForm);
            const filteredData = VoucherForm[0].celldata.filter(obj => obj.r === 5);
            const needKeys = [
                "*手工码",
                "*会计主体",
                "*核算账簿",
                "*单据日期",
                "*凭证类型",
                "*制单人",
                "*分录摘要",
                "*币种",
                "本币汇率类型",
                "*本币汇率",
                "*业务日期",
                "凭证单摘要",
            ];

            // 根据需要的关键词获取对应的单元格
            const need = needKeys.map(key => filteredData.find(obj => obj.v.v === key).c);
            const loan = filteredData.filter(obj => obj.v.v === "原币贷方金额")[0].c;
            const loan1 = filteredData.filter(obj => obj.v.v === "本币贷方金额")[0].c;
            const money = filteredData.filter(obj => obj.v.v === "原币借方金额")[0].c;
            const money1 = filteredData.filter(obj => obj.v.v === "本币借方金额")[0].c;

            // 根据特定条件筛选单元格
            const foundObjects = filteredData.filter(obj => obj.v.v === "物料基本分类");
            let Classification;
            let oldClassification;
            if (foundObjects.length >= 2) {
                oldClassification = foundObjects[0].c;
                Classification = foundObjects[1].c;
            } else {
                // 处理找不到两个满足条件的对象的情况
            }

            // 遍历duplicateData数组,为每个对象添加mining属性并赋值为this.select
            duplicateData.forEach(obj => {
                obj.mining = this.select;
            });

            // 生成标准模板
            const Fusion = {
                "r": '',
                "c": '',
                "v": {
                    "ct": {
                        "fa": "@",
                        "t": "s"
                    },
                    "fs": 8,
                    "ff": "微软雅黑",
                    "tb": 2,
                    "v": "",
                    "qp": 1,
                    "m": ""
                }
            };

            // 获取当前日期并格式化为 YYYY-MM-DD 的字符串
            const currentDate = new Date();
            const year = currentDate.getFullYear(); // 获取当前年份
            const month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); // 获取当前月份,记得要加 1
            const day = currentDate.getDate(); // 获取当前日期
            const formattedDate = `${year}-${month}-${day}`;
            // 生成唯一标识符uuid
            function generateUniqueShortUuid() {
                return uuidv4().replace(/-/g, '').substring(0, 12);
            }
            const uuid = generateUniqueShortUuid();

            // 创建data1数组
            const data1 = [
                uuid, this.select, this.select, this.date, '转', this.phone, '转本月材料分配', 'CNY', 'E001', '1.00000000', formattedDate, uuid
            ];
            const newData = duplicateData.map(obj => {
                const [name, department] = obj.v.name.split("-");
                return {
                    r: obj.r,
                    c: obj.c,
                    //金额
                    money: obj.v.v,
                    name,
                    indexRow: obj.index,
                    department,
                    material: obj.v.material,
                    mining: obj.mining,
                    //uuid
                    accountuuid: data1[0],
                    accountdate: this.date,
                };
            });
            this.ImportTables.exportUuid = data1[0]
            this.generate.exportUuid = data1[0]
            this.ImportTables.identifyingCode = 0;
            this.ImportTables.date = this.date
            // this.ImportTables.exportUuid = 1;
            this.ImportTables.mining = this.select
            this.ImportTables.tylkStatus = 3

            this.generate.tylkStatus = 3
            // this.generate.exportUuid = 1;
            this.generate.identifyingCode = 1;
            this.generate.date = this.date
            this.generate.mining = this.select
            let list = [this.ImportTables, this.generate]
            let filteredArr;
            accountingcode(newData).then(response => {
                //合并起来的每行的值转换成一行一个编码 知道哪行合并了起来
                filteredArr = response.rows.map(obj =>
                    Object.entries(obj)
                        .filter(([key, value]) => value !== null)
                        .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})
                );
                this.ImportTables.historyRole = filteredArr.map(item => {
                    let extractedItem = {};
                    if (item.accountingCode) {
                        extractedItem.accountingCode = item.accountingCode;
                    }

                    if (Array.isArray(item.indexRow)) {
                        extractedItem.indexRow = item.indexRow.join(', ');
                    }
                    if (item.name) {
                        extractedItem.name = item.name;
                    }
                    return extractedItem;
                });
                let historyContent = [];
                for (let i = 0; i < this.ImportTables.historyRole.length; i++) {
                    if (this.ImportTables.historyRole[i].indexRow && this.ImportTables.historyRole[i].accountingCode) {
                        const indexRowArray = this.ImportTables.historyRole[i].indexRow.split(', ');
                        for (let j = 0; j < indexRowArray.length; j++) {
                            let historyRole = {
                                value: `${this.ImportTables.historyRole[i].accountingCode},${this.ImportTables.historyRole[i].name}`,
                                key: String(indexRowArray[j])
                            };

                            historyContent.push(historyRole);
                        }
                    }
                }
                console.log(this.ImportTables.historyRole)
                console.log(historyContent)
                this.ImportTables.historyRole = JSON.stringify(historyContent)
                for (let i = 0; i < sum.length; i++) {
                    for (let j = 0; j < filteredArr.length; j++) {
                        if (sum[i].code === filteredArr[j].accountingCode) {
                            sum[i].index = j;
                            break;
                        }
                    }
                }
                let isArray = []
                for (let i = 0; i < filteredArr.length; i++) {
                    let newRow1 = {
                        "r": 8 + i,
                        "c": money,
                        "v": {
                            "ct": Fusion.v.ct,
                            "bg": Fusion.v.bg,
                            "fs": Fusion.v.fs,
                            "ff": Fusion.v.ff,
                            "ht": Fusion.v.ht,
                            "vt": Fusion.v.vt,
                            "tb": Fusion.v.tb,
                            "v": duplicateData[i]?.v.v,
                            "qp": Fusion.v.qp,
                            "m": duplicateData[i]?.v.m
                        }

                    };
                    let newRow2 = {
                        "r": 8 + i,
                        "c": money1,
                        "v": {
                            "ct": Fusion.v.ct,
                            "bg": Fusion.v.bg,
                            "fs": Fusion.v.fs,
                            "ff": Fusion.v.ff,
                            "ht": Fusion.v.ht,
                            "vt": Fusion.v.vt,
                            "tb": Fusion.v.tb,
                            "v": duplicateData[i]?.v.v,
                            "qp": Fusion.v.qp,
                            "m": duplicateData[i]?.v.m
                        }

                    };

                    for (let l = 0; l < need.length; l++) {
                        let needIndex = l % need.length;
                        let newRow3 = {
                            "r": 8 + i,
                            "c": need[l],
                            "v": {
                                "ct": Fusion.v.ct,
                                "bg": Fusion.v.bg,
                                "fs": Fusion.v.fs,
                                "ff": Fusion.v.ff,
                                "ht": Fusion.v.ht,
                                "vt": Fusion.v.vt,
                                "tb": Fusion.v.tb,
                                "v": data1[l],
                                "qp": Fusion.v.qp,
                                "m": Fusion.v.m
                            }

                        };

                        isArray.push(newRow3);
                    }
                    isArray.push(newRow1, newRow2)

                }

                const newRows = [];
                for (let i = 0; i < filteredArr.length; i++) {
                    const codeValue = filteredArr[i]?.accountingCode;
                    if (codeValue) {
                        const newRow = {
                            "r": 8 + i,
                            "c": 12,
                            "v": {
                                "ct": Fusion.v.ct,
                                "bg": Fusion.v.bg,
                                "fs": Fusion.v.fs,
                                "ff": Fusion.v.ff,
                                "ht": Fusion.v.ht,
                                "vt": Fusion.v.vt,
                                "tb": Fusion.v.tb,
                                "v": codeValue,
                                "qp": Fusion.v.qp,
                                "m": Fusion.v.m
                            }
                        };
                        isArray.push(newRow);
                    }
                }
                const result = [];

                filteredArr.forEach((obj, index) => {
                    Object.keys(obj).forEach(key => {
                        if (obj[key] && obj[key].includes(",")) {
                            const [prop, val] = obj[key].split(",");
                            const propName = prop.trim().replace('*', ''); // 去除属性名中的星号(*)
                            result.push({ [propName]: val.trim(), row: index });
                        }
                    });
                });
                let cleanedData = result.filter(entry => {
                    return Object.values(entry).every(value => value !== "null" && value !== null);
                });
                let name = []
                for (let i = 0; i < cleanedData.length; i++) {
                    for (let key in cleanedData[i]) {
                        let columns = filteredData.filter(obj => obj.v.v === key)[0]?.c
                        if (columns && columns !== oldClassification) {
                            name.push(columns)
                        }
                        if (columns === oldClassification) {
                            name.push(Classification)

                        }
                    }
                }
                cleanedData = cleanedData.filter(obj => Object.keys(obj)[0] !== "");
                for (let i = 0; i < name.length; i++) {
                    const newRow = {
                        "r": 8 + cleanedData[i].row,
                        "c": name[i],
                        "v": {
                            "ct": Fusion.v.ct,
                            "bg": Fusion.v.bg,
                            "fs": Fusion.v.fs,
                            "ff": Fusion.v.ff,
                            "ht": Fusion.v.ht,
                            "vt": Fusion.v.vt,
                            "tb": Fusion.v.tb,
                            "v": Object.values(cleanedData[i])[0],
                            "qp": Fusion.v.qp,
                            "m": Object.values(cleanedData[i])[0]
                        }
                    };
                    isArray.push(newRow);
                }
                for (let i = 0; i < sum.length; i++) {
                    const newRow = {
                        "r": 8 + sum[i].index,
                        "c": loan,
                        "v": {
                            "ct": Fusion.v.ct,
                            "bg": Fusion.v.bg,
                            "fs": Fusion.v.fs,
                            "ff": Fusion.v.ff,
                            "ht": Fusion.v.ht,
                            "vt": Fusion.v.vt,
                            "tb": Fusion.v.tb,
                            "v": sum[i].v,
                            "qp": Fusion.v.qp,
                            "m": sum[i].v,
                        }
                    };
                    const newRow1 = {
                        "r": 8 + sum[i].index,
                        "c": loan1,
                        "v": {
                            "ct": Fusion.v.ct,
                            "bg": Fusion.v.bg,
                            "fs": Fusion.v.fs,
                            "ff": Fusion.v.ff,
                            "ht": Fusion.v.ht,
                            "vt": Fusion.v.vt,
                            "tb": Fusion.v.tb,
                            "v": sum[i].v,
                            "qp": Fusion.v.qp,
                            "m": sum[i].v,
                        }
                    };
                    isArray.push(newRow, newRow1);
                }
                VoucherForm[0].celldata.push(...isArray)
                if (this.value.includes('凭证')) {

                    luckysheet.create({
                        container: "luckysheet", // Luckysheet 的容器元素 ID
                        title: fileName, // Excel 文件名
                        allowEdit: false,//作用:是否允许前台编辑
                        data: VoucherForm, // Excel 数据
                        showinfobar: false, //是否显示顶部名称栏
                        lang: 'zh',
                    });

                    modify = true
                    this.showMask = false;
                }
                addInsert(list).then(response => {
                    if (response.code == 200) {
                        this.$message({
                            message: '保存成功', type: 'success'
                        })
                    }
                });
                VoucherForm[0].celldata = []

            })

        },
        /** 保存导入文件和生成文件 */
        submit(contents) {
            const name = contents.info.name;
            const obj = contents.sheets;
            let list = [];
            //导入文件内容转json
            let str = JSON.stringify(obj)// 对象转化为字符串
            let objsheet = luckysheet.getAllSheets() // 得到表的数据
            //生成文件转json
            let strsheet = JSON.stringify(objsheet)// 对象转化为字符串
            this.from.templateId = this.dfrom.templateId = tempId;
            this.from.importUuid = this.dfrom.importUuid = uuid1;
            this.from.roleId = this.dfrom.roleId = roleId;
            this.dfrom.historyName = name + '(导入文件)';
            this.dfrom.historyContent = str;
            this.dfrom.identifyingCode = 0;
            this.dfrom.tylkStatus = 1;
            this.dfrom.historyRole = this.historyRole;
            let date = new Date(this.date);
            let fullYear = date.getFullYear();
            let month = ("0" + (date.getMonth() + 1)).slice(-2);
            let datastr = fullYear + month;
            this.dfrom.date = datastr
            this.dfrom.mining = this.mining
            this.from.status = this.dfrom.status = 0;
            list.push(this.dfrom);
            this.from.historyName = fileName + '(生成文件)';
            this.from.historyContent = strsheet;
            this.from.identifyingCode = 1;
            this.from.date = datastr;
            this.from.tylkStatus = 1;
            this.from.mining = this.mining
            list.push(this.from);
            addInsert(list).then(response => {
                if (response.code == 200) {
                    this.$message({
                        message: '保存成功', type: 'success'
                    })
                }
            });

        },
        /** 导出设置 */
        handleExport: debounce(function () {
            // 处理点击事件
            exportExcel(luckysheet.getAllSheets(), fileName, trueORfalse, this.value);

            // 清洗数据
            selectActSuppliesHistorydataAcc(3).then(response => {
                var data = response.data;
                let list = [];
                let list1 = [];
                for (let i = 0; i < data.length; i++) {

                    if (data[i].identifyingCode == 1) {
                        let imp = {}
                        imp.exportUuid = data[i].exportUuid
                        let parse = JSON.parse(data[i].historyContent);
                        let transToCellData = window.luckysheet.transToData(parse[0].celldata);
                        imp.hId = data[i].id;
                        imp.createBy = data[i].createBy;
                        imp.hDate = data[i].date;
                        imp.mining = data[i].mining;
                        imp.actOperation2 = transToCellData;
                        list.push(imp);
                    } else {
                        let ssd = {}
                        ssd.exportUuid = data[i].exportUuid
                        let parse = JSON.parse(data[i].historyContent);
                        let transToCellData = window.luckysheet.transToData(parse[0].celldata);
                        ssd.hId = data[i].id;
                        ssd.createBy = data[i].createBy;
                        ssd.hDate = data[i].date;
                        ssd.mining = data[i].mining;
                        ssd.actOperation2 = transToCellData;
                        ssd.convenRole = data[i].convenRole
                        ssd.historyRole = data[i].historyRole
                        list1.push(ssd);
                    }
                }
                addInsertAccount1(list).then(response => {

                });

                addInsertAccount2(list1).then(response => {

                });
            });

        }, 500), // 设置延迟时间,单位为毫秒
    }
    // 配置项111
};



// debounce函数定义
function debounce(func, delay) {
    let timer;
    return function () {
        const context = this;
        const args = arguments;
        clearTimeout(timer);
        timer = setTimeout(function () {
            func.apply(context, args);
        }, delay);
    };
}
function getKeyByValue(map, value) {
    for (let [key, val] of map) {
        if (val === value) {
            return key;
        }
        if (Array.isArray(val) && val.includes(value)) {
            return key;
        }
    }
}
function generateUUID() {
    let array = new Uint32Array(4);
    window.crypto.getRandomValues(array);
    return array.join("-");
}
</script>
<style>
.mask {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    display: flex;
    justify-content: center;
    align-items: center;
}

.loading-spinner {
    /* 添加你的加载动画样式 */
    width: 40px;
    height: 40px;
    border-radius: 50%;
    border: 4px solid #f3f3f3;
    border-top: 4px solid #3498db;
    animation: spin 1s linear infinite;
}

@keyframes spin {
    0% {
        transform: rotate(0deg);
    }

    100% {
        transform: rotate(360deg);
    }
}
</style>