element 表格 评分表(合并单元格,单选框按钮选分,计算表格总分)

文件下载 >>https://download.csdn.net/download/jemycc/12837044

突然发现 vxe 会更方便

vxe官网: https://xuliangzhan_admin.gitee.io/vxe-table/#/table/start/install.

element 表格 评分表(合并单元格,单选框按钮选分)

图片: 在这里插入图片描述
在这里插入图片描述

html:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./css/demo.css">
</head>

<body>
    <div id="app">
        <template>
            <div class="tableA">
                <el-table :data="tableData"
                :span-method="objectSpanMethod"
                @cell-mouse-leave="cellMouseLeave"
                @cell-mouse-enter="cellMouseEnter"
                :cell-class-name="tableRowClassName" 
                border style="width: 100%" 
                >
                    <el-table-column prop="ONE" label="一级指标">
                    </el-table-column>
                    <el-table-column prop="TWO" label="二级指标">
                    </el-table-column>
                    <el-table-column prop="id" label="序号">
                    </el-table-column>
                    <el-table-column prop="THREE" label="三级指标"  width="180">
                    </el-table-column>
                    <el-table-column prop="explain" label="评分说明" width="700">
                    </el-table-column>
                    <el-table-column prop="score" label="得分">
                        <template slot-scope="scope">
                            <el-radio-group v-model="scope.row.score" :prop="`tableData.${scope.$index}.score`"  :rules="tableRules.score">
                                <el-radio :label="item" v-for="item in scope.row.scoreData ">{{item}}</el-radio>
                            </el-radio-group>
                        </template>
                    </el-table-column>
                </el-table>
                
            </div>

            <div class="tableB">
                <el-table :data="tableDataS" 
                :span-method="objectSpanMethodS"
                @cell-mouse-leave="cellMouseLeaveS"
                @cell-mouse-enter="cellMouseEnterS"
                :cell-class-name="tableRowClassNameS" 
                border style="width: 100%">
                    <el-table-column prop="ONE" label="一级指标">
                    </el-table-column>
                    <el-table-column prop="TWO" label="二级指标">
                    </el-table-column>
                    <el-table-column prop="id" label="序号">
                    </el-table-column>
                    <el-table-column prop="THREE" label="三级指标"  width="180">
                    </el-table-column>
                    <el-table-column prop="explain" label="评分说明" width="700">
                    </el-table-column>
                    <el-table-column prop="score" label="得分">
                        <template slot-scope="scope">
                            <el-radio-group v-model="scope.row.score">
                                <el-radio :label="item" v-for="item in scope.row.scoreData ">{{item}}</el-radio>
                            </el-radio-group>
                        </template>
                    </el-table-column>
                </el-table>
            </div>
            <div v-text="sum"></div>
        </template>
    </div>

</body>
<script src="./js/jquery-3.1.1.min.js"></script>
<script src="./js/vue.js"></script>
<script src="./js/elementui.min.js"></script>
<script src="./js/index.js"></script>
<script src="./js/demo.js"></script>

</html>

css:

@import url("index.css");
.tableB {
  margin-top: 80px;
}
// 一定要写这个,评分那一列使用了 换行符 "\n",加这个才能生效
.el-table .cell {
  white-space: pre-line;
}

js:

var App = new Vue({
  el: "#app",
  data() {
    return {
      // A表
      rowIndex: "-1",
      OrderIndexArr: [],
      TWOIndexArr: [],
      hoverOrderArr: [],
      // A表总和
      Asum:[],
      tableData: [
        {
          ONE: "演练准备",
          TWO: "演练组织",
          id: "1",
          THREE: "目标原则",
          explain:
            "5:目标制定有针对性;演练原则讲求实效。\n3:目标针对性不足,原则实效性不强。\n1:只有简单的演练目标或原则",
          scoreData: [5,3,1],
          score:null
        },
        {
          ONE: "演练准备",
          TWO: "演练组织",
          id: "2",
          THREE: "组织机构",
          explain:
            "7:按照“策划、保障、实施、评估”设置组织机构,权责分工明确。\n3:组织机构不健全,职责分工不明确。\n0:未成立应急演练组织机构",
            scoreData: [7,3,0],
            score: null
        },
        {
          ONE: "演练准备",
          TWO: "演练组织",
          id: "3",
          THREE: "指挥机构设施",
          explain:
            "8:明确演练总指挥、副指挥、现场指挥,演练指挥员佩戴袖标或演练职务标识证牌。\n5:明确演练总指挥、副指挥、现场指挥,但演练指挥员未佩戴袖标或演练职务标识证牌。\n1:基本明确明确演练总指挥、副指挥、现场指挥,但演练指挥员未佩戴袖标或演练职务标识证牌。",
            scoreData: [8,5,1],
            score: null,
        },
        {
          ONE: "演练准备",
          TWO: "计划方案",
          id: "4",
          THREE: "演练计划一致性",
          explain:
            "5:符合预案规定,按照“先单项后综合、循序渐进、时空有序”的原则制定,计划切合实际。\n3:有演练计划,但存在不合理内容。\n0:与预案等规定不一致。",
            scoreData: [5,3,3],
          score: null,
        },
        {
          ONE: "演练准备",
          TWO: "计划方案",
          id: "5",
          THREE: "演练情景设定",
          explain:
            "10:预案管理部门、专兼职救援队伍、志愿者等涉案单位均参与,对演练角色任务清楚。\n5:部分单位人员参与,未全面覆盖。\n1:队伍数量少。",
            scoreData: [10,5,1],
          score: null,
        },
        {
          ONE: "演练准备",
          TWO: "演练保障",
          id: "6",
          THREE: "参演力量",
          explain:
            "10:预案管理部门、专兼职救援队伍、志愿者等涉案单位均参与,对演练角色任务清楚。\n5:部分单位人员参与,未全面覆盖。\n1:队伍数量少。",
            scoreData: [10,5,1],
          score: null,
        },
        {
          ONE: "演练准备",
          TWO: "演练保障",
          id: "7",
          THREE: "演练经费",
          explain: "5:演练经费充足。\n3:有经费,但不充足。\n0:无经费。",
          scoreData: [5,3,0],
          score: null,
        },
        {
          ONE: "演练准备",
          TWO: "演练保障",
          id: "8",
          THREE: "应急专家",
          explain:
            "3:有专家参与,且专业对口。\n2:有专家参与,但专业不对口。\n1:无专家参与。",
            scoreData: [3,2,1],
          score: null,
        },
        {
          ONE: "演练实施",
          TWO: "信息传达",
          id: "9",
          THREE: "信息传递",
          explain:
            "5:信息传递清楚,要素齐全。\n3:传递比较迅速,部分要素不全。\n1:信息传递存在失误,需重复确认。",
            scoreData: [5,3,1],
          score: null,
        },
        {
          ONE: "演练实施",
          TWO: "信息传达",
          id: "10",
          THREE: "演练解说",
          explain:
            "5:演练背景、进程等解说清晰正确,与现场同步。。\n3:解说不清晰或不同步。\n0:演练解说存在重大错误或无演练解说。",
            scoreData: [5,3,0],
          score: null,
        },
        {
          ONE: "演练实施",
          TWO: "应急响应",
          id: "11",
          THREE: "分级响应",
          explain:
            "5:根据事态发展,分级响应迅速、准确。\n3:分级响应部分环节不准确。\n0:无分级响应。",
            scoreData: [5,3,0],
          score: null,
        },
        {
          ONE: "演练实施",
          TWO: "应急响应",
          id: "12",
          THREE: "指挥控制能力",
          explain:
            "7:演练指挥全程指挥控制能力强,指挥处理果断、有序,与演练脚本一致。\n3:指挥过程与演练脚本不一致。\n0:指挥决策不当。",
            scoreData: [7,3,0],
          score: null,
        },
        {
          ONE: "演练实施",
          TWO: "应急响应",
          id: "13",
          THREE: "处置措施",
          explain:
            "10:按照发生真实事件的应急处理程序进行处理,方法科学。\n5:处置措施单一。\n0:处置不科学。",
            scoreData: [10,5,0],
          score: null,
        },
        {
          ONE: "演练实施",
          TWO: "舆论引导",
          id: "14",
          THREE: "新闻宣传",
          explain:
            "5:舆论引导及时,有媒体参与。\n3:舆论引导及时,无媒体参与。\n0:无舆论引导,并引发不良社会影响。",
            scoreData: [5,3,0],
          score: null,
        },
        {
          ONE: "演练实施",
          TWO: "人员表现",
          id: "15",
          THREE: "人员表现",
          explain:
            "5:态度积极,演练现场效果真实。\n3:态度较为积极,演练现场效果一般。\n0:态度一般,演练现场效果较差。",
            scoreData: [5,3,0],
          score: null,
        },
        {
          ONE: "演练总结",
          TWO: "记录讲评",
          id: "16",
          THREE: "演练记录",
          explain:
            "5:演练全过程安排有文字、音像记录。\n3:有文字记录,但无音像记录。\n0:无文字、音像记录。",
            scoreData: [5,3,0],
          score: null,
        },
        {
          ONE: "演练总结",
          TWO: "记录讲评",
          id: "17",
          THREE: "演练讲评",
          explain:
            "5:演练讲评全面,问题分析到位。\n3:演练讲评不全面。\n1:演练讲评格式化,与演练对应性差。",
            scoreData: [5,3,1],
          score: null,
        },
        {
          ONE: "得分A",
          TWO: "",
          id: "",
          THREE: "",
          explain: "",
          score: null,
        },
      ],

      // B表
      rowIndexS: "-1",
      OrderIndexArrS: [],
      TWOIndexArrS: [],
      hoverOrderArrS: [],
      tableDataS: [
        {
          ONE: "评价总结",
          TWO: "预案完善",
          id: "1",
          THREE: "预案检验",
          explain:
            "5:能够发现预案存在的问题和薄弱点。\n3:提出的问题对完善预案作用不大。\n0:无检验效果。",
            scoreData: [5,3,0],
          score: null,
        },
        {
          ONE: "评价总结",
          TWO: "预案完善",
          id: "2",
          THREE: "完善措施",
          explain:
            "5:提出改进措施,有修订时间和具体步骤。\n3:无改进具体计划,改进效果不明显。\n1:无改善措施。",
            scoreData: [5,3,1],
          score: null,
        },
        {
          ONE: "评价总结",
          TWO: "资料备案",
          id: "3",
          THREE: "调查报告",
          explain:
            "5:符合演练实际,问题分析涵盖范围广,全面到位。\n3:仅对部分问题进行总结,但内容不全面。\n1:报告格式化,内容简单。",
            scoreData: [5,3,1],
          score: null,
        },
        {
          ONE: "评价总结",
          TWO: "资料备案",
          id: "4",
          THREE: "文件归档及备案",
          explain:
            "5:演练方案、演讲脚本、演练总结评估报告及音像资料归档、上报备案及时全面。\n3:有归档,但未上报备案。\n0:既未归档,也无上报备案。",
            scoreData: [5,3,0],
          score: null,
        },
        {
          ONE: "得分B",
          TWO: "",
          id: "",
          THREE: "",
          explain: "",
          score: "",
        },
      ],
      // 验证
      tableRules:{
        //银行所在省
        score:[
          { required: true, message: '请选择评分',trigger: 'change'},
        ],
      },
    };
  },
  created() {},
  
  computed: {
  //计算得分总和
    sum: function() {
      // 表A
      let total = 0
      let num =0
      this.tableData.forEach((v,i) => {
        total +=v.score
        num=i
      });
      this.tableData[num].TWO=total
      // 表B
      let totalS = 0
      let numS =0
      this.tableDataS.forEach((v,i) => {
        totalS +=v.score
        numS=i
      });
      console.log();
      this.tableDataS[numS].TWO=totalS
    }
  },
  mounted() {
    this.getOrderNumber();
  },
  methods: {
    getOrderNumber() {
      // A表
      let OrderObj = {};
      let TWOObj = {};
      // 循环,自动把重名的合并
      this.tableData.forEach((element, index) => {
        element.rowIndex = index;
        if (OrderObj[element.ONE]) {
          OrderObj[element.ONE].push(index);
        } else {
          OrderObj[element.ONE] = [];
          OrderObj[element.ONE].push(index);
        }
        if (TWOObj[element.TWO]) {
          TWOObj[element.TWO].push(index);
        } else {
          TWOObj[element.TWO] = [];
          TWOObj[element.TWO].push(index);
        }
      });

      // 将数组长度大于1的值 存储到this.OrderIndexArr(也就是需要合并的项)
      for (let k in OrderObj) {
        if (OrderObj[k].length > 1) {
          this.OrderIndexArr.push(OrderObj[k]);
        }
      }
      for (let k in TWOObj) {
        if (TWOObj[k].length > 1) {
          this.TWOIndexArr.push(TWOObj[k]);
        }
      }

      // B表
      let OrderObjS = {};
      let TWOObjS = {};
      this.tableDataS.forEach((element, index) => {
        element.rowIndex = index;
        if (OrderObjS[element.ONE]) {
          OrderObjS[element.ONE].push(index);
        } else {
          OrderObjS[element.ONE] = [];
          OrderObjS[element.ONE].push(index);
        }
        if (TWOObjS[element.TWO]) {
          TWOObjS[element.TWO].push(index);
        } else {
          TWOObjS[element.TWO] = [];
          TWOObjS[element.TWO].push(index);
        }
      });

      // 将数组长度大于1的值 存储到this.OrderIndexArr(也就是需要合并的项)
      for (let k in OrderObjS) {
        if (OrderObjS[k].length > 1) {
          this.OrderIndexArrS.push(OrderObjS[k]);
        }
      }
      for (let k in TWOObjS) {
        if (TWOObjS[k].length > 1) {
          this.TWOIndexArrS.push(TWOObjS[k]);
        }
      }
    },

    // 合并单元格 A表
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
    //  columnIndex 表示第几列!! 等于0 就是第一列
      if (columnIndex === 0) {
        for (let i = 0; i < this.OrderIndexArr.length; i++) {
          let element = this.OrderIndexArr[i];
          for (let j = 0; j < element.length; j++) {
            let item = element[j];
            if (rowIndex == item) {
              if (j == 0) {
                return {
                  rowspan: element.length,
                  colspan: 1,
                };
              } else if (j != 0) {
                return {
                  rowspan: 0,
                  colspan: 0,
                };
              }
            }
          }
        }
        //处理最后一行计算总和 ,他是第17行,然后再合并
        //这个就是合并同一行的!!
        if (rowIndex == 17) {
          return [1, 2];
        }
      } else if (columnIndex === 1) {
        for (let i = 0; i < this.TWOIndexArr.length; i++) {
          let element = this.TWOIndexArr[i];
          for (let j = 0; j < element.length; j++) {
            let item = element[j];
            if (rowIndex == item) {
              if (j == 0) {
                return {
                  rowspan: element.length,
                  colspan: 1,
                };
              } else if (j != 0) {
                return {
                  rowspan: 0,
                  colspan: 0,
                };
              }
            }
          }
        }
        if (rowIndex == 17) {
          return [2, 4];
        }
      }
    },
    tableRowClassName({ row, rowIndex }) {
      let arr = this.hoverOrderArr;
      for (let i = 0; i < arr.length; i++) {
        if (rowIndex == arr[i]) {
          return "hovered-row";
        }
      }
    },
    cellMouseEnter(row, column, cell, event) {
      this.rowIndex = row.rowIndex;
      this.hoverOrderArr = [];
      this.OrderIndexArr.forEach((element) => {
        if (element.indexOf(this.rowIndex) >= 0) {
          this.hoverOrderArr = element;
        }
      });
    },
    cellMouseLeave(row, column, cell, event) {
      this.rowIndex = "-1";
      this.hoverOrderArr = [];
    },

    // 合并单元格 B表
    objectSpanMethodS({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        for (let i = 0; i < this.OrderIndexArrS.length; i++) {
          let element = this.OrderIndexArrS[i];
          for (let j = 0; j < element.length; j++) {
            let item = element[j];
            if (rowIndex == item) {
              if (j == 0) {
                return {
                  rowspan: element.length,
                  colspan: 1,
                };
              } else if (j != 0) {
                return {
                  rowspan: 0,
                  colspan: 0,
                };
              }
            }
          }
        }
        if (rowIndex == 4) {
          return [1, 2];
        }
      } else if (columnIndex === 1) {
        for (let i = 0; i < this.TWOIndexArrS.length; i++) {
          let element = this.TWOIndexArrS[i];
          for (let j = 0; j < element.length; j++) {
            let item = element[j];
            if (rowIndex == item) {
              if (j == 0) {
                return {
                  rowspan: element.length,
                  colspan: 1,
                };
              } else if (j != 0) {
                return {
                  rowspan: 0,
                  colspan: 0,
                };
              }
            }
          }
        }
        if (rowIndex == 4) {
          return [2, 4];
        }
      }
    },

    tableRowClassNameS({ row, rowIndex }) {
      let arr = this.hoverOrderArr;
      for (let i = 0; i < arr.length; i++) {
        if (rowIndex == arr[i]) {
          return "hovered-row";
        }
      }
    },

    cellMouseEnterS(row, column, cell, event) {
      this.rowIndexS = row.rowIndex;
      this.hoverOrderArrS = [];
      this.OrderIndexArrS.forEach((element) => {
        if (element.indexOf(this.rowIndex) >= 0) {
          this.hoverOrderArrS = element;
        }
      });
    },

    cellMouseLeaveS(row, column, cell, event) {
      this.rowIndexS = "-1";
      this.hoverOrderArrS = [];
    },
  },
});

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值