element基于表头返回 merge: true 配置列合并

news2025/5/17 23:45:47
<template>
  <div class="wrap" v-loading="listLoading">
    <div class="content_wrap mt-10">
      <div style="text-align: center;">
        <h3>酿造交酒酒罐统计表({{month}}{{day}}日)</h3>
      </div>
      <div class="fr"><h4>单位:个</h4></div>
      <el-table 
        :data="dataList" 
        style="width: 100%" 
        border 
        :span-method="objectSpanMethod"
      >
        <!-- 遍历表头 -->
        <template v-for="(column, index) in tableHeader">
          <el-table-column
            v-if="column.children"
            :label="column.propName"
            align="center"
            width="150px"
          >
            <!-- 遍历二级表头 -->
            <el-table-column
              v-for="(childColumn, childIndex) in column.children"
              :key="childIndex"
              :label="childColumn.propName"
              :prop="childColumn.prop"
              width="150px"
              align="center"
            >
            </el-table-column>
          </el-table-column>
          <!-- 如果是一级表头(没有子表头) -->
          <el-table-column
            v-else
            :label="column.propName"
            :prop="column.prop"
            align="center"
            width="150px"
          ></el-table-column>
        </template>
      </el-table>
    </div>
  </div>
</template>

<script> 
import { mapGetters } from 'vuex'
import { Message } from 'element-ui'
import { stamnosstatistics } from "../../api/TasteandgradeApi";

export default {
  name: 'Winecanstatistics',
  data() {
    return {
      tableHeader: [],
      dataList: [], 
      tableColumnList: [],
      listLoading: false,
      month: '',
      day: '',
      spanMaps: {}, // 存储所有需要合并列的合并规则
      mergeColumns: [] // 存储所有需要合并的列prop
    }
  },
  mounted() {
    this.getdata()
    this.getTableData()
  },
  methods: {
    getdata() {
      const now = new Date();
      this.month = now.getMonth() + 1;
      this.day = now.getDate();
    },
    
    getTableData() {
      stamnosstatistics().then((response) => {
        this.dataList = response.data.result.dataList
        this.tableHeader = response.data.result.columnList
        // 提取需要合并的列
        this.extractMergeColumns()
        // 计算合并规则
        this.calculateSpans()
      })
    },
    
    // 递归提取所有标记了merge:true的列
    extractMergeColumns() {
      this.mergeColumns = []
      
      const findMergeColumns = (columns) => {
        columns.forEach(column => {
          if (column.merge) {
            this.mergeColumns.push(column.prop)
          }
          if (column.children) {
            findMergeColumns(column.children)
          }
        })
      }
      
      findMergeColumns(this.tableHeader)
    },
    
    // 计算所有需要合并列的合并规则
    calculateSpans() {
      this.spanMaps = {}
      
      this.mergeColumns.forEach(prop => {
        const spanMap = new Map()
        let pos = 0
        
        // 初始化,所有行默认不合并(rowspan=1)
        for (let i = 0; i < this.dataList.length; i++) {
          spanMap.set(i, 1)
        }
        
        // 计算合并规则
        for (let i = 1; i < this.dataList.length; i++) {
          // 当前行与上一行值相同则合并
          if (this.dataList[i][prop] === this.dataList[i - 1][prop]) {
            spanMap.set(pos, spanMap.get(pos) + 1) // 合并行数+1
            spanMap.set(i, 0) // 当前行设置为0表示被合并
          } else {
            pos = i // 值不同,重置合并位置
          }
        }
        
        this.spanMaps[prop] = spanMap
      })
    },
    
    // Element表格合并单元格方法
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // 获取当前列的prop
      const currentProp = this.getColumnProp(columnIndex)
      
      // 如果当前列是需要合并的列
      if (currentProp && this.spanMaps[currentProp]) {
        const rowspan = this.spanMaps[currentProp].get(rowIndex)
        const colspan = rowspan > 0 ? 1 : 0
        
        return {
          rowspan,
          colspan
        }
      }
    },
    
    // 根据列索引获取列的prop
    getColumnProp(columnIndex) {
      let currentIndex = 0
      
      const findProp = (columns) => {
        for (const column of columns) {
          if (column.children) {
            const prop = findProp(column.children)
            if (prop) return prop
          } else {
            if (currentIndex === columnIndex) {
              return column.prop
            }
            currentIndex++
          }
        }
        return null
      }
      
      return findProp(this.tableHeader)
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss">
</style>
[
  {
    propName: '分类',
    prop: 'category',
    merge: true // 此列需要合并
  },
  {
    propName: '春天酒',
    children: [
      {
        propName: '货场空罐',
        prop: 'chuntianjiu_inEmpty',
        merge: true // 此列需要合并
      },
      {
        propName: '货场满罐',
        prop: 'chuntianjiu_inFull'
      }
    ]
  }
]

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql sql复习

虽然之前学习过sql&#xff0c;但由于重在赶学习进度&#xff0c;没有学扎实&#xff0c;导致自己刷题的时候有的地方还是模模糊糊&#xff0c;现在主要是复习&#xff0c;补一补知识点。 今日靶场&#xff1a; NSSCTF 云曦历年考核题 在做题之前先回顾一下sql注入的原理&…

介绍一下什么是 AI、 AGI、 ASI

1. AI&#xff08;人工智能&#xff09;&#xff1a;工具化的“窄域智能”​​ 定义​&#xff1a; AI 是能够执行特定任务的智能系统&#xff0c;依赖大量数据和预设规则&#xff0c;​缺乏自主意识和跨领域通用性。 特点​&#xff1a; ​任务专用​&#xff1a;如图像识…

利用 Amazon Bedrock Data Automation(BDA)对视频数据进行自动化处理与检索

当前点播视频平台搜索功能主要是基于视频标题的关键字检索。对于点播平台而言&#xff0c;我们希望可以通过优化视频搜索体验满足用户通过模糊描述查找视频的需求&#xff0c;从而提高用户的搜索体验。借助 Amazon Bedrock Data Automation&#xff08;BDA&#xff09;技术&…

模拟jenkins+k8s自动化部署

参考 Jenkins+k8s实现自动化部署 - 掘金 手把手教你用 Jenkins + K8S 打造流水线环境 - 简书 安装插件 调整插件升级站点 (提高插件下载速度) 默认地址 https://updates.jenkins.io/update-center.json 新地址 http://mirror.xmission.com/jenkins/updates/update-center.json …

MySQL——十一、主从复制

主从复制是指将主数据库的DDL和DML操作通过二进制日志传入从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 优点&#xff1a; 主库出现问题&#xff0c;可以快速切换到从库提供服务实现读…

如何让 Google 收录 Github Pages 个人博客

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 如何确认自己的网站有没有被 google 收录 假设网址是&#xff1a;https://cyrus-studio.github.io/blog 搜索&#xff1a;site:https://cyrus-studio.github…

servlet-api

本次内容总结 1、再次学习Servlet的初始化方法 2、学习Servlet中的ServletContext和<context-param> 3、什么是业务层 4、IOC 5、过滤器 7、TransActionManager、ThreadLocal、OpenSessionInViewFilter 1、再次学习Servlet的初始化方法 1&#xff09;Servlet生命周期&…

根据输入的数据渲染柱形图

背景&#xff1a;根据不同季度的销售额&#xff0c;生成对应的柱形图&#xff0c;直观的看出差异 效果&#xff1a; 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatibl…

Java SpringBoot项目JPA查询数据demo

目录 一、前置1、IDEA创建SpringBoot项目2、基础设置、配置 二、JPA查询数据1、配置SQL server连接2、创建实体类QueryEntity.java生成Getter and Setter 3、创建Repository接口QueryRepository.java 4、创建Service服务类QueryService.java 5、创建Controller控制器类QueryCon…

vue2集成可在线编辑的思维导图(simple-mind-map)

最近要求做一个可在线编辑的思维导图&#xff0c;经过层层调研和实测&#xff0c;最简单的思维导图导图实现还得是simple-mind-map组件 simple-mind-map中文文档 当前我使用的是vue2项目&#xff0c;目前没试过是否支持vue3&#xff0c;但是看官网描述他们也给了有vue3的demo项…

如何在Windows右键新建菜单中添加自定义项,将notepad添加到新建菜单

一、简介 Windows 右键新建菜单的核心管理机制隐藏在注册表的 HKEY_CLASSES_ROOT 根键中。这里存在两种关键注册表项&#xff1a;文件扩展名项和文件类型项&#xff0c;它们共同构成了新建菜单的完整控制体系。 以常见的.txt文件为例&#xff0c;系统通过以下机制实现新建菜单…

CS016-4-unity ecs

【37】将系统转换为任务 Converting System to Job 【Unity6】使用DOTS制作RTS游戏|17小时完整版|CodeMonkey|【37】将系统转换为任务 Converting System to Job_哔哩哔哩_bilibili a. 将普通的方法&#xff0c;转化成job。第一个是写一个partial struct xxx&#xff1b;第二…

微信小程序第三方代开发模式技术调研与实践总结

🚀 微信小程序第三方代开发模式技术调研与实践总结 📖 前言 随着企业对私有化品牌运营诉求的增加,许多大型客户希望将原本由 SaaS 平台统一提供的小程序迁移至自有主体(AppID)下运行,同时又希望继续沿用 SaaS 平台的业务服务与数据托管方式。微信开放平台提供的“小程…

upload-labs通关笔记-第8关 文件上传之点绕过

目录 一、点绕过原理 二、deldot()函数 三、源码分析 四、渗透实战 1、构建脚本test8.php 2、打开靶场 3、bp开启拦截 4、点击上传 5、bp拦截 6、后缀名增加点 7、发包并获取脚本地址 8、访问脚本 本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗…

PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试

Title: PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试 文章目录 I . PolygonMesh1. PolygonMesh 结构体2. Vertices 结构体与点云索引3. 测试 PolygonMesh II. TextureMesh1. TextureMesh 结构体2. TexMaterial 结构体3. 纹理坐标与纹理坐标索引4. 测试 TextureMesh 以下…

量子算法:开启计算新时代的技术密码

摘要 量子算法是利用量子力学特性&#xff08;如叠加态、纠缠、干涉&#xff09;设计的计算模型&#xff0c;在特定问题上相比经典算法具有指数级加速优势。本文深入探讨了量子算法的核心原理、代表性算法及其在多个领域的应用&#xff0c;分析了量子算法面临的挑战与未来发展…

多线程代码案例-1 单例模式

单例模式 单例模式是开发中常见的设计模式。 设计模式&#xff0c;是我们在编写代码时候的一种软性的规定&#xff0c;也就是说&#xff0c;我们遵守了设计模式&#xff0c;代码的下限就有了一定的保证。设计模式有很多种&#xff0c;在不同的语言中&#xff0c;也有不同的设计…

CSS实现文本自动平衡text-wrap: balance

不再有排版孤行和寡行 我们都知道那些标题&#xff0c;最后一个单词换行并单独站在新行上&#xff0c;破坏了视觉效果&#xff0c;看起来很奇怪。当然&#xff0c;有老式的 手动换行或将内容分成不同部分。但您听说过text-wrap: balance吗&#xff1f; 通过应用text-wrap: bal…

mac M芯片运行docker-desktop异常问题

虽然mac已经迭代到m4了&#xff0c;但官方的docker-desktop运行仍然有问题&#xff0c;包括但不限于&#xff1a; 命令行docker找不到docker-desk打不开docker-desktop闪退容器起不来 尝试不同版本后&#xff0c;看到了其他可以在mac跑docker的开源方法&#xff0c;更简单、轻…

事件响应策略规范模版

事件响应策略 一、事件分级定义 根据事件对业务的影响程度和紧急程度,将事件分为 4个等级(P1-P4),明确各级事件的判定标准:、 二、响应时效承诺 响应时间(从事件确认到首次回复) P1 事件:15 分钟内响应(724 小时电话 / 工单优先接入) P2 事件:30 分钟内响应(工…