src/views/mdc/base/modules/alarmAnalysis/alarmAnalysisMain.vue
@@ -19,47 +19,69 @@
      </div>
      <div id="DeviceList">
        <div class="openRateTrendDg">
          <div id="Efficiency" class="container" style="margin-top: 20px;">
            <div class="table2">
              <table class="dataContent table" border="1" cellspacing="0" cellpadding="0"
                     style="white-space: nowrap;text-align: left;">
                <thead>
                <tr class="thead fixed equipname">
                  <th class="thgu dong1 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">报警号
                  </th>
                  <th class="thgu dong2 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">
                    出现次数
                  </th>
                  <th class="thgu dong3 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">
                    合计持续时间(秒)
                  </th>
                  <th class="thgu dong4 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">
                    报警信息
                  </th>
                  <!--<template v-for="(tableHead, index) in tableHeads">-->
                  <!--<th class="timeth" :colspan="checkedList.length">{{tableHead}}</th>-->
                  <!--</template>-->
                </tr>
                </thead>
                <tbody>
                <tr class="mathData" v-for="(item, index) in dataList" @click="TableDraw(index,item)">
                  <td class="tdgu  kaitou">{{item.alarmCode}}</td>
                  <td class="tdgu1  kaitou">{{item.count}}</td>
                  <td class="tdgu2 kaitou">{{item.timeCount}}</td>
                  <td class="tdgu3 kaitou">{{item.alarmContent}}</td>
                  <!--<template v-for="(tableHead, index) in item.dataList">-->
                  <!--<td :style="{background:tableHead.color }">{{tableHead.utilizationRate | numFilter}}</td>-->
                  <!--</template>-->
                </tr>
                </tbody>
              </table>
            </div>
          <!--<div id="Efficiency" class="container">-->
          <!--<div class="table2">-->
          <!--<table class="dataContent table" border="1" cellspacing="0" cellpadding="0"-->
          <!--style="white-space: nowrap;text-align: left;">-->
          <!--<thead>-->
          <!--<tr class="thead fixed equipname">-->
          <!--<th class="thgu dong1 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">报警号-->
          <!--</th>-->
          <!--<th class="thgu dong2 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">-->
          <!--出现次数-->
          <!--</th>-->
          <!--<th class="thgu dong3 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">-->
          <!--合计持续时间-->
          <!--</th>-->
          <!--<th class="thgu dong4 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">-->
          <!--报警信息-->
          <!--</th>-->
          <!--&lt;!&ndash;<template v-for="(tableHead, index) in tableHeads">&ndash;&gt;-->
          <!--&lt;!&ndash;<th class="timeth" :colspan="checkedList.length">{{tableHead}}</th>&ndash;&gt;-->
          <!--&lt;!&ndash;</template>&ndash;&gt;-->
          <!--</tr>-->
          <!--</thead>-->
          <!--<tbody>-->
          <!--<tr class="mathData" v-for="(item, index) in dataList" @click="TableDraw(index,item)">-->
          <!--<td class="tdgu  kaitou">{{item.alarmCode}}</td>-->
          <!--<td class="tdgu1  kaitou">{{item.count}}</td>-->
          <!--<td class="tdgu2 kaitou">{{getFormattedTime(item.timeCount)}}-->
          <!--&lt;!&ndash;<td class="tdgu2 kaitou">{{item.timeCount}}</td>&ndash;&gt;-->
          <!--<td class="tdgu3 kaitou">{{item.alarmContent}}</td>-->
          <!--&lt;!&ndash;<template v-for="(tableHead, index) in item.dataList">&ndash;&gt;-->
          <!--&lt;!&ndash;<td :style="{background:tableHead.color }">{{tableHead.utilizationRate | numFilter}}</td>&ndash;&gt;-->
          <!--&lt;!&ndash;</template>&ndash;&gt;-->
          <!--</tr>-->
          <!--</tbody>-->
          <!--</table>-->
          <!--</div>-->
          <!--</div>-->
          <!--<a-spin :spinning=""></a-spin>-->
          <a-table :columns="columns" :data-source="dataList" bordered :pagination="false" :scroll="{y:210}"
                   :customRow="customRow"
                   rowKey="alarmCode" @expand="handleExpandChange" :loading="outerDataLoading"
          >
            <span slot="timeCount" slot-scope="text">{{text | getFormattedTime}}</span>
            <a-table
              slot="expandedRowRender"
              slot-scope="row"
              :columns="innerColumns"
              :data-source="row.innerDataList"
              :pagination="false"
              rowKey="rowIndex"
              :loading="innerDataLoading"
            >
              <span slot="duration" slot-scope="text">{{text | getFormattedTime}}</span>
            </a-table>
          </a-table>
        </div>
        <a-spin :spinning="echartLoading">
          <div style="width: 100%;height: 100%;display: flex;">
            <div id="MdcEquipmentWarningPie" style="height: 100%;width: 35%;"></div>
            <div id="MdcEquipmentWarningLine" style="height: 100%;width: 65%;"></div>
          </div>
        </div>
        <div style="width: 100%;height: 60%;display: flex;">
          <div id="MdcEquipmentWarningPie" style="height: 100%;width: 35%;"></div>
          <div id="MdcEquipmentWarningLine" style="height: 100%;width: 65%;"></div>
        </div>
        </a-spin>
      </div>
    </div>
  </div>
@@ -75,6 +97,44 @@
    JeecgListMixin
  } from '@/mixins/JeecgListMixin'
  const columns = [
    { title: '报警号', dataIndex: 'alarmCode', key: 'alarmCode', align: 'center' },
    { title: '出现次数', dataIndex: 'count', key: 'count', align: 'center', sorter: (a, b) => b.count - a.count },
    {
      title: '合计持续时间',
      dataIndex: 'timeCount',
      key: 'timeCount',
      scopedSlots: { customRender: 'timeCount' },
      align: 'center',
      sorter: (a, b) => b.timeCount - a.timeCount
    },
    { title: '报警信息', dataIndex: 'alarmContent', key: 'alarmContent', align: 'center', ellipsis: true }
  ]
  const innerColumns = [
    {
      title: '',
      dataIndex: 'rowIndex',
      key: 'rowIndex',
      width: 60,
      align: 'center',
      customRender: function(t, r, index) {
        return parseInt(index) + 1
      }
    },
    { title: '设备编号', dataIndex: 'equipmentId', key: 'equipmentId', align: 'center' },
    { title: '设备名称', dataIndex: 'equipmentName', key: 'equipmentName', align: 'center' },
    { title: '报警时间', dataIndex: 'startTime', key: 'startTime', align: 'center' },
    { title: '结束时间', dataIndex: 'endTime', key: 'endTime', align: 'center' },
    {
      title: '持续时间',
      dataIndex: 'duration',
      key: 'duration',
      scopedSlots: { customRender: 'duration' },
      align: 'center'
    }
  ]
  export default {
    // mixins: [JeecgListMixin],
    name: 'alarmAnalysisMain',
@@ -83,7 +143,9 @@
      return {
        dataSource: [],
        /* table加载状态 */
        loading: false,
        outerDataLoading: false,
        innerDataLoading: false,
        echartLoading: false,
        typeTree: '',
        typeParent: 1,
        typeEquipment: 1,
@@ -109,12 +171,16 @@
        url: {
          efficiencyList: '/mdc/alarmAnalyze/alarmList',
          listByType: '/mdc/MdcUtilizationRate/getByType',
          alarmTrend: '/mdc/alarmAnalyze/alarmTrend'
          alarmTrend: '/mdc/alarmAnalyze/alarmTrend',
          equipmentAlarmList: '/mdc/alarmAnalyze/equipmentAlarmList'
        },
        tableHeads: [],
        pieDate: [0],
        XData: [0],
        YData: [0]
        YData: [0],
        columns,
        innerColumns,
        hasRequsetAlarmCodeList: []
      }
    },
    props: { nodeTree: '', Type: '', nodePeople: '' },
@@ -170,6 +236,35 @@
        } else {
          return '0'
        }
      },
      /**
       * 格式化时间
       * @param seconds 秒数
       * @returns '' 格式化后时间字符串
       */
      getFormattedTime(seconds) {
        var hours = Math.floor(seconds / 3600)
        var minutes = Math.floor((seconds % 3600) / 60)
        var secs = seconds % 60
        if (hours === 0) {
          if (minutes === 0) {
            return secs === 0 ? 0 : `${secs}秒`
          } else {
            if (secs === 0) {
              return `${minutes}分`
            }
            return `${minutes}分 ${secs}秒`
          }
        } else {
          if (minutes === 0 && secs === 0) {
            return `${hours}小时`
          } else if (minutes !== 0 && secs === 0) {
            return `${hours}小时 ${minutes}分`
          }
        }
        return `${hours}小时 ${minutes}分 ${secs}秒`
      }
    },
    methods: {
@@ -182,34 +277,35 @@
      },
      TableDraw(key, val) {
        let that = this
        that.echartLoading = true
        that.queryParam.alarmCode = val.alarmCode
        console.log(this.queryParam)
        that.pieDate = []
        that.XData = []
        that.YData = []
        getAction(that.url.alarmTrend, that.queryParam).then(res => {
          if (res.success) {
            for (var i = 0; i < res.result.equipmentCountList.length; i++) {
              that.pieDate.push({
                name: res.result.equipmentCountList[i].key,
                value: res.result.equipmentCountList[i].count
        getAction(that.url.alarmTrend, that.queryParam)
          .then(res => {
            if (res.success) {
              that.pieDate = res.result.equipmentCountList.map(item => {
                return {
                  name: item.key,
                  value: item.count
                }
              })
              that.XData = res.result.dateCountList.map(item => item.key)
              that.YData = res.result.dateCountList.map(item => item.count)
              // this.tableHeads = res.result.dates
              // this.dataList = res.result
              // this.draw()
              // this.checkSameData(this.dataList)
              // this.checkSameData1(this.dataList)
              // this.checkSameData2(this.dataList)
              // this.combineCell();
              // this.initDeviceType(this.dataList)
              that.drawWrin()
            }
            for (var j = 0; j < res.result.dateCountList.length; j++) {
              that.XData.push(res.result.dateCountList[j].key)
              that.YData.push(res.result.dateCountList[j].count)
            }
            // this.tableHeads = res.result.dates
            // this.dataList = res.result
            // this.draw()
            // this.checkSameData(this.dataList)
            // this.checkSameData1(this.dataList)
            // this.checkSameData2(this.dataList)
            // this.combineCell();
            // this.initDeviceType(this.dataList)
            that.drawWrin()
          }
        })
          })
          .finally(() => {
            that.echartLoading = false
          })
        console.log(this.YData)
      },
@@ -337,12 +433,14 @@
      //     }
      //   }
      loadData1() {
        this.outerDataLoading = true
        this.tableHeads = []
        this.dataList = []
        getAction(this.url.efficiencyList, this.queryParam).then(res => {
          if (res.success) {
            // this.tableHeads = res.result.dates
            this.dataList = res.result
            this.hasRequsetAlarmCodeList = []
            // this.draw()
            // this.checkSameData(this.dataList)
            // this.checkSameData1(this.dataList)
@@ -351,6 +449,8 @@
            // this.initDeviceType(this.dataList)
          }
        }).finally(() => {
          this.outerDataLoading = false
        })
      },
      drawWrin() {
@@ -359,7 +459,10 @@
          title: {
            text: '各设备出现此报警的比例',
            x: 'center',
            y: 'bottom'
            y: 'bottom',
            textStyle: {
              color: '#4FAEDC'
            }
          },
          tooltip: {
            trigger: 'item',
@@ -369,17 +472,20 @@
          series: [{
            type: 'pie',
            radius: '60%',
            center: ['55%', '55%'],
            itemStyle: {
              normal: {
                /*color: function (params) {
                    var colorList = ['#4169E1', '#A8A8A8'];
                    return colorList[params.dataIndex]
                },*/
                color: function(params) {
                  var colorList = ['#5AB1EF', '#2EC7C9', '#B6A2DE', '#FFB980', '#D87A80', '#8D98B3']
                  return colorList[params.dataIndex]
                },
                label: {
                  show: true,
                  position: 'top',
                  formatter: '{b}\n{c}'
                  // position: 'top',
                  formatter: '{b}\n{c}',
                  color: function(params) {
                    var colorList = ['#5AB1EF', '#2EC7C9', '#B6A2DE', '#FFB980', '#D87A80', '#8D98B3']
                    return colorList[params.dataIndex]
                  }
                }
              }
            },
@@ -393,7 +499,10 @@
          title: {
            text: '每天出现此报警的数量走势',
            x: 'center',
            y: 'bottom'
            y: 'bottom',
            textStyle: {
              color: '#4FAEDC'
            }
          },
          tooltip: {
            trigger: 'axis'
@@ -406,13 +515,29 @@
              data: this.XData
              /*axisLabel :{
                  interval:0
              }*/
              }*/,
              axisLine: {
                //x轴线的颜色以及宽度
                show: true,
                lineStyle: {
                  width: 2,
                  color: '#4FAEDC'
                }
              }
            }
          ],
          yAxis: [
            {
              type: 'value',
              name: '次数'
              name: '次数',
              axisLine: {
                //x轴线的颜色以及宽度
                show: true,
                lineStyle: {
                  width: 2,
                  color: '#4FAEDC'
                }
              }
            }
          ],
          series: [
@@ -424,12 +549,68 @@
                data: [
                  { type: 'max', name: '最大值' },
                  { type: 'min', name: '最小值' }
                ]
                ],
                label: {
                  color: '#fff'
                }
              },
              itemStyle: {
                normal: {
                  color: '#2EC7C9'
                }
              }
            }
          ]
        }
        equipmentWarningLine.setOption(equipmentWarningLineOption, true)
      },
      /**
       * 自定义表格行触发
       * @param record 当前行信息
       * @param index 当前行下标
       * @returns {{on: {click: on.click}}} 返回对象
       */
      customRow(record, index) {
        return {
          on: {
            click: (event) => {
              // 如果点击的不是展开图标区域则渲染图表,相反则相当于点击展开图标
              if (event.target.className !== 'ant-table-row-expand-icon-cell') {
                this.TableDraw(index, record)
              } else {
                if (event.target.children && event.target.children.length > 0) event.target.children[0].click()
              }
            }
          }
        }
      },
      /**
       * 自定义表格行触发
       * @param expanded 当前行是否为展开状态
       * @param record 当前行信息
       */
      handleExpandChange(expanded, record) {
        let _this = this
        // 当展开时若该行未被展开过才会请求后台数据,展开过的数据会被缓存无需重复请求
        const param = Object.assign({ alarmCode: record.alarmCode }, this.queryParam)
        if (expanded && !this.hasRequsetAlarmCodeList.includes(record.alarmCode)) {
          this.innerDataLoading = true
          getAction(this.url.equipmentAlarmList, param).then(res => {
            if (res.success) {
              _this.dataList.forEach(item => {
                if (item.alarmCode === record.alarmCode) {
                  item.innerDataList = res.result
                }
              })
              _this.hasRequsetAlarmCodeList.push(record.alarmCode)
            }
          })
            .finally(() => {
              _this.innerDataLoading = false
            })
        }
      }
    }
  }
@@ -592,28 +773,28 @@
  @media screen and (min-width: 1920px) {
    #Efficiency {
      height: 337px !important;
      height: 258px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1680px) and (max-width: 1920px) {
    #Efficiency {
      height: 337px !important;
      height: 258px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1400px) and (max-width: 1680px) {
    #Efficiency {
      height: 190px !important;
      height: 160px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1280px) and (max-width: 1400px) {
    #Efficiency {
      height: 90px !important;
      height: 60px !important;
      overflow: scroll;
    }
  }
@@ -647,4 +828,29 @@
  .efficiency_list #DeviceList {
    height: 90% !important;
  }
  /deep/ .ant-table-body .ant-table-row td {
    padding-top: 10px;
    padding-bottom: 10px;
  }
  /deep/ .ant-table-scroll > .ant-table-body > table > .ant-table-tbody > .ant-table-row td {
    cursor: pointer;
  }
  /deep/ .ant-spin-nested-loading {
    height: 55%;
  }
  /deep/ .ant-spin-container {
    height: 100%;
  }
  /deep/ .ant-table.ant-table-bordered {
    height: 265px;
  }
  /deep/ .ant-table-scroll > .ant-table-placeholder {
    height: 210px;
  }
</style>