记录el-table 编辑,复制、删除,前端分页等操作

按月份金额汇总演示

      <el-row>
        <el-col :span="20">
          <el-form ref="tableForm" :model="tableForm" :rules="tableRules">
            <el-row class="selectTableBox">
              <el-table
                ref="multipleTable"
                v-loading="loading"
                class="crud_form"
                max-height="38vh"
                :data="tableForm.tableData"
                :row-class-name="rouClassNameFn"
                style="width: 100%"
                :cell-style="{'text-align': 'center'}"
                :header-cell-style="{'text-align': 'center'}"
              >
                <el-table-column label="序号" fixed type="index" width="80" align="center" />
                <el-table-column label="编号" prop="code" min-width="80" show-overflow-tooltip />
                <el-table-column label="名称" prop="name" min-width="100" show-overflow-tooltip />
                <el-table-column
                  label="月份"
                  min-width="200"
                >
                  <template slot-scope="{row, $index}">
                    <el-form-item
                      :prop="'tableData.' + $index + '.monthBs'"
                      label=" "
                    >
                      <el-tooltip :content="row.monthBs" placement="top" :disabled="isshowtip">
                        <el-date-picker
                          v-model="row.monthBs"
                          value-format="yyyy-MM"
                          format="yyyy-MM"
                          size="small"
                          type="month"
                          style="width: 100%"
                          placeholder="请选择"
                          clearable
                          @mouseover.native="inputOnMouseOver($event)"
                          @change="changeTableContent(row, $index, 'monthBs', $event)"
                        />
                      </el-tooltip>
                    </el-form-item>
                  </template>
                </el-table-column>
                <el-table-column
                  label="付款金额"
                  min-width="250"
                >
                  <template slot-scope="{row, $index}">
                    <el-form-item
                      :prop="'tableData.' + $index + '.paymentAmount'"
                      :rules="tableRules.paymentAmount"
                      label=" "
                    >
                      <el-tooltip :content="row.paymentAmount + ''" placement="top" :disabled="isshowtip">
                        <el-input
                          v-model="row.paymentAmount"
                          size="small"
                          clearable
                          oninput="value=value.replace(/^\D*([0-9]\d*\.?\d{0,2})?.*$/,'$1')"
                          @blur="row.paymentAmount=$event.target.value"
                          @mouseover.native="inputOnMouseOver($event)"
                          @change="changeTableContent(row, $index, 'paymentAmount', $event)"
                        />
                      </el-tooltip>
                    </el-form-item>
                  </template>
                </el-table-column>

                <el-table-column label="金额" prop="amount" min-width="100" show-overflow-tooltip />
                <el-table-column label="特价" prop="bargainPrice" min-width="100" show-overflow-tooltip />
                <el-table-column label="涨幅" prop="increase" min-width="100" show-overflow-tooltip />
                <el-table-column label="月份" prop="businessMonth" min-width="100" show-overflow-tooltip />
                <el-table-column label="备注" prop="remark" min-width="100" show-overflow-tooltip />
                <el-table-column label="更新人" prop="updatedBy" min-width="200" show-overflow-tooltip />
                <el-table-column
                  label="操作"
                  align="center"
                  class-name="check_box"
                  width="150px"
                  fixed="right"
                >
                  <template slot-scope="{row,$index}">
                    <el-button
                      class="delBtn"
                      size="mini"
                      type="text"
                      icon="el-icon-delete"
                      @click="deleteRow(row, $index)"
                    >删除</el-button>
                    <el-button
                      class="copyBtn"
                      size="mini"
                      type="text"
                      icon="el-icon-document-add"
                      @click="copyRow(row, $index)"
                    >复制</el-button>
                  </template>
                </el-table-column>
              </el-table>
            </el-row>
          </el-form>
        </el-col>
      </el-row>
      <el-pagination
        v-show="total>0"
        class="pageBox"
        background
        :total="total"
        :current-page="pageNum"
        :page-size="pageSize"
        :page-sizes="[10, 20, 30, 50]"
        layout="total,sizes,prev,pager,next,jumper"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
      />
      <el-row class="monthAmountBox font-b">
        <span>按月份汇总金额:</span>
        <div>
          <el-row v-for="(section,i) in monthAmountArr" v-show="!validatenull(section.key)" :key="i">
            <span>{{ section.key || '-' }}</span>:
            <span>{{ section.amount || '0' }}</span>
          </el-row>
        </div>
      </el-row>

<script>
    export default {
      data () {
          return {
            isshowtip: true,
            // 遮罩层
            loading: false,
            // 总条数
            total: 0,
            // 页数
            pageNum: 1,
            // 每页显示数量
            pageSize: 10,
            monthAmountArr: [],
            // 表格数据
            tableList: [], // 所有数据
            tableForm: {
              tableData: [] // 当前页表格数据
            },
          }
      },
      created() {
        this.queryList()
      },
      methods: {
      changeTableContent(row, index, property, event) {
        if (property === 'monthBs' || property === 'paymentAmount') {
          this.$set(row, property, event)
          this.monthAmountArr = []
          const monthAmountArrTemp = []
          this.tableForm.tableData.map(el => {
            const monthAmountObj = {
              month: el.monthBs,
              amount: el.paymentAmount
            }
            monthAmountArrTemp.push(monthAmountObj)
          })
          this.monthAmountArr = this.getMonthAmountArray(monthAmountArrTemp)
        }
      },
      rouClassNameFn({ row, rowIndex }) {
        // 把每一行的索引放进row
        this.$set(row, 'index', rowIndex)
      },
      // 获取按月份汇总金额
      getMonthAmountArray(arr) {
        const arrMap = new Map()
        const dataArr = []

        arr.forEach(item => {
          if (arrMap.get(item.month) !== undefined) {
            let num = arrMap.get(item.month)
            arrMap.set(item.month, ++num)
          } else {
            arrMap.set(item.month, 1)
          }
          if (arrMap.get(item.month) > 1) {
            dataArr.map(el => {
              if (el.key === item.month) {
                el.value = arrMap.get(item.month)
                const ttarr = el.totalArr
                ttarr.push(item.amount)
                el.totalArr = ttarr
                el.amount = el.totalArr
                  .map(val => {
                    if (val) {
                      return val
                    }
                  })
                  .reduce((acc, cur = 0) => parseFloat(cur) + acc, 0).toFixed(2)
              }
            })
          } else {
            let amountTemp = 0
            if (!this.validatenull(item.amount)) {
              amountTemp = Number(item.amount).toFixed(2)
            } else {
              amountTemp = 0
            }
            const keyObj = {
              key: item.month,
              value: arrMap.get(item.month),
              amount: amountTemp,
              totalArr: []
            }
            const ftarr = []
            ftarr.push(item.amount)
            keyObj.totalArr = ftarr
            dataArr.push(keyObj)
          }
        })
        // 按月份升序排序
        dataArr.sort((a, b) => {
          return new Date(a.key).getTime() - new Date(b.key).getTime()
        })
        return dataArr
      },
      getAmountSummaryDisplayArr(data) {
        // 优化
        const map = new Map()
        data.forEach((item) => {
          if (map.has(item.key)) {
            const prev = map.get(item.key)
            map.set(item.key, { key: item.key, total: (parseFloat(prev.total) + parseFloat(item.amount)).toFixed(2), totalArr: [...prev.totalArr, item.amount] })
          } else {
            map.set(item.key, { key: item.key, total: parseFloat(item.amount), totalArr: [item.amount] })
          }
        })
        const resultArr = Array.from(map.values())
        // 按月份升序排序
        resultArr.sort((a, b) => {
          return new Date(a.key).getTime() - new Date(b.key).getTime()
        })
        return resultArr
      },
      /**
       * 判断是否为空
       */
      validatenull(val) {
        if (typeof val === 'boolean') {
          return false;
        }
        if (typeof val === 'number') {
          return false;
        }
        if (val instanceof Array) {
          if (val.length===0) return true;
        } else if (val instanceof Object) {
          if (JSON.stringify(val) === '{}') return true;
        } else {
          if (val==='null' || val===null || val==='undefined' || val===undefined || val==='') return true;
          return false;
        }
        return false;
      },
      // 删除行
      deleteRow(row, index) {
        this.tableForm.tableData.splice(index, 1)
        this.$message.success('删除成功!')
        if (!this.validatenull(row.id)) {
          const delObj = { id: row.id, isDel: '1' }
          this.delArr.push(delObj)
        }
        this.monthAmountArr = []
        const monthAmountArrTemp = []
        this.tableForm.tableData.map(el => {
          const monthAmountObj = {
            month: el.monthBs,
            amount: el.paymentAmount
          }
          monthAmountArrTemp.push(monthAmountObj)
        })
        this.monthAmountArr = this.getMonthAmountArray(monthAmountArrTemp)
      },
      // 复制行
      copyRow(row, index) {
        // 复制行放到被复制行下方
        this.tableForm.tableData.splice(index + 1, 0, {
          monthBs: row.monthBs,
          paymentAmount: row.paymentAmount,
          code: row.code,
          name: row.name,
          amount: row.amount,
          bargainPrice: row.bargainPrice,
          increase: row.increase,
          businessMonth: row.businessMonth,
          remark: row.remark,
          updatedBy: row.updatedBy,
        })
        // 清空表单校验
        this.$nextTick(() => {
          this.$refs.tableForm.clearValidate()
        })

        this.monthAmountArr = []
        const monthAmountArrTemp = []
        this.tableForm.tableData.map(el => {
          const monthAmountObj = {
            month: el.monthBs,
            amount: el.paymentAmount
          }
          monthAmountArrTemp.push(monthAmountObj)
        })
        this.monthAmountArr = this.getMonthAmountArray(monthAmountArrTemp)
      },
      // tooltip显示
      inputOnMouseOver(event) {
        const target = event.target
        if (target.offsetWidth < target.scrollWidth) {
          this.isshowtip = false
        } else {
          this.isshowtip = true
        }
      },
        // 初始化数据
      queryList() {
          const res = {
            data: [
              {
                code: 'No1',
                name: '键盘',
                amount: '180',
                bargainPrice: '167.83',
                increase: '2.22',
                businessMonth: '2018-02',
                remark: '备注1',
                updatedBy: '小明',
              },
              {
                code: 'No2',
                name: '鼠标',
                amount: '30',
                bargainPrice: '25.50',
                increase: '6.66',
                businessMonth: '2019-05',
                remark: '备注2',
                updatedBy: '小芳',
              },
              {
                code: 'No3',
                name: '显示器',
                amount: '2000',
                bargainPrice: '1888.88',
                increase: '99.88',
                businessMonth: '2020-12',
                remark: '备注3',
                updatedBy: '小红',
              },
            ]
          }
          this.tableList = res.data
          this.tableForm.tableData = this.tableList.slice(0, this.pageSize)
          this.total = this.tableList.length
      },
      // 获取表格数据 前端分页
      getList() {
        const start = Math.ceil(((this.pageNum - 1) * this.pageSize).toFixed(0)),
              end = Math.ceil((start + this.pageSize).toFixed(2))
        this.tableForm.tableData = this.tableList.slice(start >= 0 ? start : 0, end)
        // 滚动条回到起点
        this.$refs.multipleTable.bodyWrapper.scrollTo(0, 0)
      },
      handleSizeChange(val) {
        this.pageSize = val
        this.getList()
      },
      handleCurrentChange(val) {
        this.pageNum = val
        this.getList()
      }
      }
    }
</script>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值