< 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'
}
]
}
]