表格各项目小计(应收租金、未收租金)

返回数据结构

页面展示效果:

//html

 <el-table

          :height="200"

          v-if="columns.length > 0"

          :data="dataSource"

          border

          v-loading="loading"

          show-summary

          :summary-method="getSummaries"

          :span-method="objectSpanMethod"

          :row-class-name="

            ({ row, rowIndex }) => {

              return row.className

            }

          "

        >

          <el-table-column

            :align="item.align || 'center'"

            :prop="item.key"

            :label="item.name"

            v-for="item in columns"

            :key="item.name"

            :width="item.width"

            min-width="100"

            :show-overflow-tooltip="item.showTooltip"

            :class-name="item.className"

          >

            <template slot-scope="scope">

              <template v-if="item.key == 'xmmc'">

                {{ scope.row.xmmc || '--' }}

              </template>

              <template v-else>

                <template v-if="item.formatNum">{{ formatNumber(scope.row[item.key]) }}</template>

                <template v-else>{{ scope.row[item.key] }}</template>

              </template>

            </template>

          </el-table-column>

        </el-table>

//data

      dataSource: [],

columns: [

        { name: '项目名称', key: 'xmmc', align: 'left', showTooltip: true, minWidth: 100 },

        { name: '乙方', key: 'yf', align: 'left', showTooltip: true, minWidth: 100 },

        { name: '电话', key: 'tel', align: 'center', width: 120 },

        { name: '资源名称', key: 'zymc', align: 'center', minWidth: 150, showTooltip: true },

        { name: '应收日期', key: 'jfqx', align: 'center', width: 100 },

        { name: '计费开始日期', key: 'ksrq', align: 'center', width: 120 },

        { name: '计费截止日期', key: 'jsrq', align: 'center', width: 120 },

        { name: '应收租金', key: 'yjzj', align: 'right', formatNum: true, width: 120 },

        { name: '未收租金', key: 'qjzj', align: 'right', formatNum: true, width: 120 },

        { name: '欠款天数', key: 'qfsc', align: 'center', width: 85 },

      ],

//调用接口返回数据

 getList(params) {

      this.loading = true

      getQzmxList(params)

        .then((res) => {

          if (res.code == 200) {

            let arr = []

            res.data.list.forEach((item) => {

              let { xmmc, qzzje, details } = item

              xmmc = xmmc || '--'

              details = details.map((o) => ({ ...o, xmmc: o.xmmc || '--' }))

              arr = [...arr, ...details]

              arr.push({

                xmmc: xmmc + '小计',

                qjzj: qzzje,

                className: 'sum-row',

              })

            })

            this.dataSource = arr

          }

        })

        .finally(() => {

          this.loading = false

        })

    },

//js方法methods

 objectSpanMethod({ row, column, rowIndex, columnIndex }) {

      if (column.property === 'xmmc') {

        // 获取当前单元格的值

        const currentValue = row[column.property]

        // 获取上一行相同列的值

        const preRow = this.dataSource[rowIndex - 1]

        const preValue = preRow ? preRow[column.property] : null

        // 如果当前值和上一行的值相同,则将当前单元格隐藏

        if (currentValue === preValue) {

          // return { rowspan: 0, colspan: 0 }

          return { rowspan: 0, colspan: row.className == 'sum-row' ? 8 : 0 }

        } else {

          // 否则计算当前单元格应该跨越多少行

          let rowspan = 1

          for (let i = rowIndex + 1; i < this.dataSource.length; i++) {

            const nextRow = this.dataSource[i]

            const nextValue = nextRow[column.property]

            if (nextValue === currentValue) {

              rowspan++

            } else {

              break

            }

          }

          return { rowspan, colspan: row.className == 'sum-row' ? 8 : 1 }

        }

      } else if (column.property == 'qjzj' || column.property == 'qfsc') {

        return {

          rowspan: 1,

          colspan: 1,

        }

      } else {

        if (row.className == 'sum-row') {

          return {

            rowspan: 1,

            colspan: 0,

          }

        }

      }

    },

  getSummaries(param) {

      const { columns, data } = param

      const sums = []

      columns.forEach((column, index) => {

        if (index === 0) {

          sums[index] = '合计'

          return

        }

        if (this.sumKeys.includes(column.property)) {

          const values = data.map((item) => Number(item[column.property]))

          if (!values.every((value) => isNaN(value))) {

            sums[index] = values.reduce((prev, curr) => {

              const value = Number(curr)

              if (!isNaN(value)) {

                return prev + curr

              } else {

                return prev

              }

            }, 0)

            sums[index] += ' '

          } else {

            sums[index] = ''

          }

          if (column.property == 'qjzj') {

            sums[index] = sums[index] / 2

          }

          sums[index] = this.formatNumber(sums[index])

        }

      })

      return sums

    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值