zmc
2023-11-14 0ee16e9f5dd31c6c98df1a5fdcf081c8eb7f80df
修改了获取风险值的请求接口
已修改7个文件
已添加2个文件
800 ■■■■■ 文件已修改
src/api/exceptionApi.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/risk/riskApi.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/risk_estimate_common_function/index.js 296 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/risk_estimate_common_function/riskValue.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data_management/HistoryData.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exception/FlightInspection.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/line_graph/DataRiskModel.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/line_graph/DataRiskRank.vue 282 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/line_graph/SiteComprehensiveRskRanking.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/exceptionApi.js
@@ -18,6 +18,7 @@
      }
    })
  },
  // æ ¹æ®æœˆä»½å’Œç±»åž‹æŸ¥æ‰¾åˆ†æžæ•°æ®
  analysisdataByType(month,type) {
    return $http.get('/dust/analysisdataByType', {
@@ -27,6 +28,7 @@
      }
    })
  },
  // æ ¹æ®æ—¶æ®µå’Œç±»åž‹æŸ¥æ‰¾åˆ†æžæ•°æ®
  analysisdataByTimeAndType(beginTime,endTime,type) {
    return $http.get('/dust/analysisdataByTimeAndType', {
@@ -37,6 +39,8 @@
      }
    })
  },
  /**
   *
@@ -59,9 +63,6 @@
  },
  
  getSitesNum() {
    return $http.get('/dust/sitename')
src/api/risk/riskApi.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
import {$http} from '@/api/index.js';
export default{
    /**
     * æ ¹æ®ç«™ç‚¹ä¿¡æˆ–月份,类型 æŸ¥è¯¢é£Žé™©å€¼
     * @param:
     * @returns:
     */
    queryRiskValue(siteName,month,type){
        const params = {
            month:month,
            type:type,
        }
        if(siteName != '' || siteName  != null){
            params.siteName = siteName
        }
        return $http.post('/dust/risk/riskValue',params)
    },
}
src/utils/risk_estimate_common_function/index.js
@@ -1,4 +1,4 @@
import dayjs from 'dayjs';
import dayjs from 'dayjs'
// import exceptionApi from '../../api/exceptionApi';
export default {
  /**
@@ -8,7 +8,7 @@
   * @returns:
   */
  getDaysDifference(startDate, endDate) {
    return dayjs(endDate).diff(startDate, 'day') + 1;
    return dayjs(endDate).diff(startDate, 'day') + 1
  },
  /**
@@ -17,55 +17,52 @@
   * @returns:
   */
  calBillData(arr, beginTime, endTime) {
    let min = 65536;
    let max = -1;
    let avg = 0;
    let online = 0;
    let valid = 0;
    let exceeding = 0;
    let min = 65536
    let max = -1
    let avg = 0
    let online = 0
    let valid = 0
    let exceeding = 0
    let sumAvg = 0;
    let sumOnline = 0;
    let sumValid = 0;
    let sumExceeding = 0;
    let sumAvg = 0
    let sumOnline = 0
    let sumValid = 0
    let sumExceeding = 0
    // è®¡ç®—选择的时间的相差的天数
    let begin = dayjs(beginTime).format('YYYY-MM-DD');
    let end = dayjs(endTime).format('YYYY-MM-DD');
    let dayDiff = this.getDaysDifference(begin, end);
    let obj = {};
    let begin = dayjs(beginTime).format('YYYY-MM-DD')
    let end = dayjs(endTime).format('YYYY-MM-DD')
    let dayDiff = this.getDaysDifference(begin, end)
    let obj = {}
    // è®¡ç®—最小和大值
    arr.forEach((item) => {
      if (item.min < min) {
        min = item.min;
        min = item.min
      }
      if (item.max > max) {
        max = item.max;
        max = item.max
      }
      // è®¡ç®—平均值,在线率,有效率,超标率
      sumAvg = sumAvg + item.dayAvg;
      sumOnline = sumOnline + Number(item.dayOnline.slice(0, -1));
      sumValid = sumValid + Number(item.dayValid.slice(0, -1));
      sumExceeding = sumExceeding + Number(item.dayExceeding.slice(0, -1));
    });
      sumAvg = sumAvg + item.dayAvg
      sumOnline = sumOnline + Number(item.dayOnline.slice(0, -1))
      sumValid = sumValid + Number(item.dayValid.slice(0, -1))
      sumExceeding = sumExceeding + Number(item.dayExceeding.slice(0, -1))
    })
    // è®¡ç®—均值
    avg = sumAvg / dayDiff;
    online = sumOnline / dayDiff;
    valid = sumValid / dayDiff;
    exceeding = sumExceeding / dayDiff;
    obj['min'] = min.toFixed(3);
    obj['max'] = max.toFixed(3);
    avg = sumAvg / dayDiff
    online = sumOnline / dayDiff
    valid = sumValid / dayDiff
    exceeding = sumExceeding / dayDiff
    obj['min'] = min.toFixed(3)
    obj['max'] = max.toFixed(3)
    obj['avg'] = avg.toFixed(2);
    obj['online'] = online.toFixed(2);
    obj['valid'] = valid.toFixed(2);
    obj['exceeding'] = exceeding.toFixed(2);
    obj['avg'] = avg.toFixed(2)
    obj['online'] = online.toFixed(2)
    obj['valid'] = valid.toFixed(2)
    obj['exceeding'] = exceeding.toFixed(2)
    return obj;
    return obj
  },
  /**
   * è®¡ç®—异常类型聚集度:该时段出现的异常类型数量除8
@@ -74,159 +71,165 @@
   * @returns:
   */
  calRecur(exceptionArr) {
    if(exceptionArr.length == 0){
      let obj = {};
      obj['exceptionRecurrence'] = 0;
      obj['exceptionTypeAggregation'] = 0;
    if (exceptionArr.length == 0) {
      let obj = {}
      obj['exceptionRecurrence'] = 0
      obj['exceptionTypeAggregation'] = 0
      return obj;
      return obj
    }
    // å…¸åž‹å¼‚常复现率
    let exceptionTyprRecurRate = 0;
    // é‡çº§çªå˜
    let mutationCount = 0;
    let mutationCount = 0
    // è¶…标临近
    let exceedingNearCount = 0;
    let exceedingNearCount = 0
    // è¶…标次数临界
    let exceedingCriticalDegree = 0;
    let exceedingCriticalDegree = 0
    // ä¿å­˜å‡ºçŽ°çš„ä¸åŒå¼‚å¸¸ç±»åž‹
    let exception = [];
    let exception = []
    // å¼‚常类型聚集度
    let exceptionTypeAggregation = 0;
    let exceptionTypeAggregation = 0
    // å…¸åž‹å¼‚常复现率
    let exceptionTyprRecurRate = 0
    // è®°å½•指定3种异常出现的次数和不同的异常种类
    exceptionArr.forEach((item) => {
      // å¼‚常复现率
      // é‡çº§çªå˜å¼‚常
      if (item.exceptionType == 4) {
        mutationCount++;
        mutationCount++
        // ä¸´è¿‘超标异常
      } else if (item.exceptionType == 5) {
        exceedingNearCount++;
        exceedingNearCount++
        // å•日超标次数临界异常
      } else if (item.exceptionType == 6) {
        exceedingCriticalDegree++;
        exceedingCriticalDegree++
      }
      // å¼‚常类型聚集度
      if (exception.length == 0) {
        exception.push(item.exceptionType);
        exception.push(item.exceptionType)
      }
      // ä¿å­˜æ–°çš„异常类型
      else if (exception.indexOf(item.exceptionType) == -1) {
        exception.push(item.exceptionType);
        exception.push(item.exceptionType)
      }
    });
    })
    let sum = 0;
    let sum = 0
    // æ¬¡æ•°å‡1,该异常出现2次,算复现1次。出现3次,算复现2次...
    if (mutationCount > 1) {
      sum = sum + mutationCount - 1;
      sum = sum + mutationCount - 1
    }
    if (exceedingNearCount > 1) {
      sum = sum + exceedingNearCount - 1;
      sum = sum + exceedingNearCount - 1
    }
    if (exceedingCriticalDegree > 1) {
      sum = sum + exceedingCriticalDegree - 1;
      sum = sum + exceedingCriticalDegree - 1
    }
    switch (true) {
      case (sum == 0 || sum == 1) :
        exceptionTyprRecurRate = (sum / 3).toFixed(2);
        break;
      case (sum == 2|| sum >=3) :
        exceptionTyprRecurRate = 1;
        break;
      case sum == 0 || sum == 1:
        exceptionTyprRecurRate = (sum / 3).toFixed(2)
        break
      case sum == 2 || sum >= 3:
        exceptionTyprRecurRate = 1
        break
      default:
        return 'error';
        return 'error'
    }
    exceptionTypeAggregation = (exception.length / 8).toFixed(2);
    exceptionTypeAggregation = (exception.length / 8).toFixed(2)
    let obj = {};
    obj['exceptionRecurrence'] = exceptionTyprRecurRate;
    obj['exceptionTypeAggregation'] = exceptionTypeAggregation;
    let obj = {}
    obj['exceptionRecurrence'] = exceptionTyprRecurRate
    obj['exceptionTypeAggregation'] = exceptionTypeAggregation
    return obj;
},
// å‚数:对象数组(该对象中的属性不能是引用类型,否则拷贝的值还是会相互影响)
    // åŠŸèƒ½ï¼šæ‹·è´è¯¥å¯¹è±¡æ•°ç»„ã€‚
shallowCopyList(val) {
  if(val == 'arr'){
    let tempList = [];
    return tempList;
  }else if(val == 'obj'){
    let tempList = {};
    return tempList;
  }
},
getRate(obj){
  let a = {}
  a.online = obj['dayOnline']
  a.valid = obj['dayValid']
  a.exceeding = obj['dayExceeding']
  return a
},
/**
 * æ‰¾åˆ°å¯¹è±¡æ•°ç»„中属性mnCode为value的对象 æ·»åŠ è¿›æ•°ç»„ä¸­
 * @param: å¯¹è±¡æ•°ç»„ ï¼ŒmnCode等于value
 * @returns:
 */
findValue(exceptionData,value){
  if(exceptionData.length==0){
    return []
  }
  let temp = []
  exceptionData.forEach((res)=>{
    if(res.mnCode == value){
      temp.push(res)
    return obj
  },
  // å‚数:对象数组(该对象中的属性不能是引用类型,否则拷贝的值还是会相互影响)
  // åŠŸèƒ½ï¼šæ‹·è´è¯¥å¯¹è±¡æ•°ç»„ã€‚
  shallowCopyList(val) {
    if (val == 'arr') {
      let tempList = []
      return tempList
    } else if (val == 'obj') {
      let tempList = {}
      return tempList
    }
  })
  return temp
},
  },
  getRate(obj) {
    let a = {}
    a.online = obj['dayOnline']
    a.valid = obj['dayValid']
    a.exceeding = obj['dayExceeding']
    return a
  },
/**
 * è®¡ç®—风险值
 * @param: æ•°ç»„。依次是在线率,有效率,超标率,异常类型聚集度,异常复现率
 * @returns:
 */
calRiskValue(arr){
  // ç”¨100减 æ˜¯å› ä¸ºè¯¥å±žæ€§éœ€è¦è®¡ç®—的是风险值,应当是离线率,无效率
  // ä¹˜ä»¥0.01是因为去除百分号后需要再缩小100倍
  let weight = (
    (100 - parseFloat(arr[0].slice(0, -1)))*0.01 * 0.1 +
    (100 - parseFloat(arr[1].slice(0, -1)))*0.01 * 0.2 +
    parseFloat(arr[2].slice(0, -1))*0.01 * 0.2 +
    arr[3] * 0.2 +
    arr[4] * 0.3
  ).toFixed(2)
  return weight
},
  /**
   * æ‰¾åˆ°å¯¹è±¡æ•°ç»„中属性mnCode为value的对象 æ·»åŠ è¿›æ•°ç»„ä¸­
   * @param: å¯¹è±¡æ•°ç»„ ï¼ŒmnCode等于value
   * @returns:
   */
  findValue(exceptionData, value) {
    if (exceptionData.length == 0) {
      return []
    }
/**
 * å¯¹åˆ†æžå€¼å’Œå¼‚常值计算风险值
 * @param: åˆ†æžæ•°æ®ï¼Œå¼‚常数据,开始时间,结束时间
 * @returns:表格数据
 */
merge(anaData,exceptionData,beginTime,endTime){
    let temp = []
    exceptionData.forEach((res) => {
      if (res.mnCode == value) {
        temp.push(res)
      }
    })
    return temp
  },
  if (anaData.length == 0){
    return []
  }
  const table = []
  let i = 0
  anaData.forEach((res) =>{
      let siteName = res.name
  /**
   * è®¡ç®—风险值
   * @param: æ•°ç»„。依次是在线率,有效率,超标率,异常类型聚集度,异常复现率
   * @returns:
   */
  calRiskValue(arr) {
    // ç”¨100减 æ˜¯å› ä¸ºè¯¥å±žæ€§éœ€è¦è®¡ç®—的是风险值,应当是离线率,无效率
    // ä¹˜ä»¥0.01是因为去除百分号后需要再缩小100倍
    /* arr[0]:在线率 90%
     arr[1]:有效率 100%
     arr[2]:超标率 2%
     arr[3]:典型异常复现风险 0.2
     arr[4]:异常类型聚集风险  0.5
  */
    let weight = (
      (100 - parseFloat(arr[0].slice(0, -1))) * 0.01 * 0.1 +
      (100 - parseFloat(arr[1].slice(0, -1))) * 0.01 * 0.2 +
      parseFloat(arr[2].slice(0, -1)) * 0.01 * 0.2 +
      arr[3] * 0.2 +
      arr[4] * 0.3
    ).toFixed(2)
    return weight
  },
  /**
   * å¯¹åˆ†æžå€¼å’Œå¼‚常值计算风险值
   * @param: åˆ†æžæ•°æ®ï¼Œå¼‚常数据,开始时间,结束时间
   * @returns:表格数据
   */
  merge(anaData, exceptionData, beginTime, endTime) {
    if (anaData.length == 0) {
      return []
    }
    const table = []
    let i = 0
    anaData.forEach((res) => {
      // ä»Žåˆ†æžæ•°æ®ä¸­å¾—到设备编号
      let mnCode = res.mnCode
      // æ‰¾åˆ°å¼‚常数据中mnCode等于value的对象
      let d = this.findValue(exceptionData,mnCode)
      let d = this.findValue(exceptionData, mnCode)
      // let temp = [...res,...d]
      // è®¡ç®—在线,有效率,超标率
      let r1 = this.getRate(res, beginTime, endTime)
      // è®¡ç®—复现率
      let r2 = this.calRecur(d)
      i = i + 1
@@ -253,7 +256,6 @@
      if (weight >= 0.6) {
        obj.riskGrage = '高风险'
        obj.riskAdvice = '建议对该站点进行线下执法检查,专项数据对比'
      } else if (weight < 0.6 && weight >= 0.2) {
        obj.riskGrage = '中风险'
        obj.riskAdvice = '建议开展常态追踪分析'
@@ -265,5 +267,5 @@
    })
    return table
  }
}
}
src/utils/risk_estimate_common_function/riskValue.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
// import rank from '@/utils/risk_estimate_common_function/rank.js';
// import dayjs from 'dayjs.js';
export default {
    // // è®¡ç®—日风险值
    // calDailyRisk(allTypeRiskValue){
    //     let dailyRiskValue = allTypeRiskValue.onlineRisk*0.1 + allTypeRiskValue.validRisk*0.2 + allTypeRiskValue.exceedingRisk*0.2 + allTypeRiskValue.exceptionTypeAggregation*0.2 + allTypeRiskValue.typicalExceptionRepetitionRate*0.3
    //     return dailyRiskValue
    // },
    // // è®¡ç®—月风险值
    // calMonthRisk(DailyRiskValues,month){
    //     // æ ¹æ®æœˆä»½èŽ·å¾—è¯¥æœˆçš„å¤©æ•°
    //     let dayNum = dayjs(month).daysInMonth()
    //     // ç´¯åŠ æ—¥é£Žé™©å€¼
    //     let sum = 0
    //     for(let i in DailyRiskValues){
    //         sum += i
    //     }
    //     // æ—¥å¼‚常类型聚集率的和/当月天数
    //     let monthRiskValue = sum /dayNum
    //     return monthRiskValue
    // },
    // calRiskValue(allTypeRiskValue,queryMonth){
    //     // å¯¹è®¾å¤‡ç¼–号进行分组
    //     let groupeObj =  rank.groupByMncode(allTypeRiskValue)
    //     //
    //     for (let mnCode in groupeObj){
    //         // èŽ·å¾—è®¾å¤‡ç¼–å·å¯¹åº”çš„æ•°æ®
    //         let dayData = groupeObj[mnCode]
    //         // ä¿å­˜æŸè®¾å¤‡ç¼–号该段时间的日风险值
    //         let dailyRiskValues = []
    //         // è®¡ç®—日风险值
    //         for(let item in dayData){
    //             let dailyRiskValue = this.calDailyRisk(item)
    //             dailyRiskValues.push(dailyRiskValue)
    //         }
    //     }
    // }
    // è®¡ç®—月度风险值
    calMonthlyRiskValue(exceptionRiskValue){
        // ä¿å­˜æœˆåº¦é£Žé™©å€¼
        let monthlyRiskValue = []
        // è®¡ç®—每个站点的月度风险值
        for(let item in exceptionRiskValue){
            let value = item.onlineRisk*0.1 + item.validRisk*0.2 + item.exceedingRisk*0.2 + item.exceptionTypeAggregation*0.2 + item.typicalExceptionRepetitionRate*0.3
            monthlyRiskValue.push(value)
        }
        return monthlyRiskValue
    }
}
src/views/data_management/HistoryData.vue
@@ -234,7 +234,7 @@
              <el-col> 
                <el-form-item>
                <TimeShortCuts @submit-time="giveTime"></TimeShortCuts>
                <TimeShortCuts time-type="week"  @submit-time="giveTime"></TimeShortCuts>
              </el-form-item>
              <el-form-item>
src/views/exception/FlightInspection.vue
@@ -18,7 +18,7 @@
    DustLineChart,
    ButtonClick,
    AreaAndmonitorType,
    AnalysisCard
    AnalysisCard,
  },
  data() {
    return {
src/views/line_graph/DataRiskModel.vue
@@ -24,7 +24,7 @@
      isNoData: false,
      loading: false,
      screenLoading: false,
      parentDataFlag:false,
      parentDataFlag: false,
      chartData: [],
      chartData1: {}, //保存查询的结果
      chartData2: {},
@@ -78,7 +78,7 @@
  watch: {
    sName() {
      // å½“别的页面调用时
      if (this.sName != ''|| this.month_1 != '') {
      if (this.sName != '' || this.month_1 != '') {
        // æ›´æ–°ç«™ç‚¹åå­—和时间
        this.form.name = this.sName
        this.month = this.month_1
@@ -89,7 +89,7 @@
        this.getAnalysisData()
        // è®¡ç®—风险值
        this.calRiskValue()
      }
      }
    }
  },
@@ -244,7 +244,7 @@
          this.bill.exceptionTypeAggregation = obj['exceptionTypeAggregation']
        })
    },
    // é€‰æ‹©å…¶ä»–值类型时
    setChart() {
      if (this.chartData.length) {
@@ -338,8 +338,6 @@
      ></InputSearch>
    </el-form-item>
    <el-form-item>
      <MonthSelect :month="this.month_1" @submit-value="giveMonth"></MonthSelect>
    </el-form-item>
@@ -376,28 +374,44 @@
                label="序号"
                :index="indexMethod"
                fixed
                width="25"
                width="52"
                show-overflow-tooltip
                align="center"
              />
              <el-table-column prop="siteName" label="站点名称" show-overflow-tooltip />
              <el-table-column
                prop="riskValue"
                label="风险值"
                sortable
                width="67"
                prop="siteName"
                label="站点名称"
                show-overflow-tooltip
              />
              <el-table-column label="操作" align="center">
                align="center"
              >
                <template #default="{ row }">
                  <el-button
                    type="primary"
                    text
                    class="table-button"
                    @click="querySiteStaticsInfo(row)"
                    >风险详情</el-button
                    >{{ row.siteName }}</el-button
                  >
                </template>
              </el-table-column>
              <el-table-column
                prop="riskValue"
                label="风险值"
                sortable
                show-overflow-tooltip
                align="center"
              />
              <!-- <el-table-column label="操作" align="center">
                <template #default="{ row }">
                  <el-button
                    type="primary"
                    text
                    class="table-button"
                    @click="querySiteStaticsInfo(row)"
                    >详情</el-button
                  >
                </template>
              </el-table-column> -->
            </el-table>
          </el-card>
        </el-col>
@@ -409,7 +423,7 @@
                '数据有效风险',
                '典型异常复现风险',
                '异常类型聚集风险',
                '数据超标风险',
                '超标异常风险',
                '数据在线风险'
              ]"
              :yData="[
src/views/line_graph/DataRiskRank.vue
@@ -1,9 +1,9 @@
<script>
import TimeShortCuts from '@/sfc/TimeShortCuts.vue';
import AreaAndmonitorType from '@/sfc/AreaAndmonitorType.vue';
import { useCommonFunction } from '../../utils/common.js';
import requetsApi from '@/api/exportExcel/requetsApi.js';
import dayjs from 'dayjs';
import TimeShortCuts from '@/sfc/TimeShortCuts.vue'
import AreaAndmonitorType from '@/sfc/AreaAndmonitorType.vue'
import { useCommonFunction } from '../../utils/common.js'
import requetsApi from '@/api/exportExcel/requetsApi.js'
import dayjs from 'dayjs'
import ButtonExportExcel from '@/sfc/ButtonExportExcel.vue'
import ButtonClick from '@/sfc/ButtonClick.vue'
@@ -26,26 +26,28 @@
      isNoData: true,
      loading: false,
      // ç»Ÿè®¡åˆ†æžæŒ‰é’®åŠ è½½ä¸­
      queryButton:false,
      queryButton: false,
      // å¯¼å‡ºæŒ‰é’®åŠ è½½ä¸­
      exportButton:false,
      exportButton: false,
      form: {
        // å¼€å§‹æ—¶é—´
        beginTime: '',
        // ç»“束时间
        endTime: ''
      }
    };
      },
      tableHeight: '600'
    }
  },
  setup() {
    // å¼•å…¥ ç™¾åˆ†å·æ¯”较大小 å¯¼å‡ºåŠŸèƒ½
    const { cmpp, exportToExcel } = useCommonFunction();
    return { cmpp, exportToExcel };
    const { cmpp, exportToExcel } = useCommonFunction()
    return { cmpp, exportToExcel }
  },
  mounted() {
    this.form.name = '';
    this.form.name = ''
    this.fetchData()
    this.calTableHeight()
  },
  methods: {
    // åŠŸèƒ½ï¼šå¯¼å‡ºä¸ºExcel
@@ -53,10 +55,10 @@
      let params = {
        beginTime: this.form.beginTime,
        endTime: this.form.endTime
      };
      }
      this.exportButton = true
      requetsApi.fetchAllData(params).then((res) => {
        const data = res.data.data;
        const data = res.data.data
        const tableColumns = [
          'name',
@@ -68,7 +70,7 @@
          'dayOnline',
          'dayValid',
          'dayExceeding'
        ];
        ]
        const excelColumns = [
          ['A1', '站点名称'],
          ['B1', '设备编号'],
@@ -79,213 +81,183 @@
          ['G1', '在线率'],
          ['H1', '有效率'],
          ['I1', '超标率']
        ];
        this.exportToExcel(data, tableColumns, excelColumns, '分析表.xlsx');
        ]
        this.exportToExcel(data, tableColumns, excelColumns, '分析表.xlsx')
        this.exportButton = false
      });
      })
    },
    // åŠŸèƒ½ï¼šæ”¹å˜è¡¨æ ¼æŸä¸ªå•å…ƒæ ¼çš„é¢œè‰²
    tableCellClassName({ row, columnIndex }) {
      // å¹³å‡å€¼ä¸æ»¡è¶³æ ‡å‡†æ—¶
      if (columnIndex == 4) {
        if (row.dayAvg >= 0.8) {
          return 'warning-row';
          return 'warning-row'
        }
      }
      //  åœ¨çº¿çŽ‡ï¼Œæœ‰æ•ˆçŽ‡ ä¸æ»¡è¶³æ ‡å‡†æ—¶ å˜é¢œè‰²
      if (columnIndex == 7) {
        if (!this.cmpp(row.dayOnline, '90%')) {
          return 'red-color';
          return 'red-color'
        }
      }
      if (columnIndex == 8) {
        if (!this.cmpp(row.dayValid, '90%')) {
          return 'red-color';
          return 'red-color'
        }
      }
    },
    // åŠŸèƒ½ï¼šè¡¨æ ¼é«˜åº¦æ ¹æ®å†…å®¹è‡ªé€‚åº”
    calTableHeight() {
      const h1 = this.$refs.h1.$el.offsetHeight
      const h2 = this.$refs.h2.$el.offsetHeight;
      // å…¶ä¸­ä¸€ä¸ª40是盒子的总外边距
      this.tableHeight = `calc(100vh - ${h1}px - ${h2}px - 40px - 120px - var(--el-main-padding) * 2`;
    },
    // é¡µå¤§å°æ”¹å˜æ—¶è§¦å‘
    handleSizeChange(val) {
      this.pageSize = val;
      this.pageSize = val
      // æ”¹å˜æ¯é¡µæ˜¾ç¤ºæ•°ç›®æ—¶è·³åˆ°å½“前页
      this.handleCurrentChange(1);
      this.handleCurrentChange(1)
    },
    // é¡µå·æ”¹å˜æ—¶è§¦å‘
    handleCurrentChange(val) {
      // å°†å½“前页号给currentPage
      this.currentPage = val;
      this.currentPage = val
      // é¡µé¢å˜åŒ–时调用 æŸ¥è¯¢æ•°æ®å‡½æ•°
      this.fetchData();
      this.fetchData()
    },
    //序号递增
    indexMethod(index) {
      return index + 1 + (this.currentPage - 1) * this.pageSize;
      return index + 1 + (this.currentPage - 1) * this.pageSize
    },
    giveTime(val) {
      //将中国标准时间转为指定格式(该组件返回的标准时间的格式,所以必须的加这个函数)
      this.form.beginTime = dayjs(val[0]).format('YYYY-MM-DD HH:mm:ss');
      this.form.endTime = dayjs(val[1]).format('YYYY-MM-DD HH:mm:ss');
      this.form.beginTime = dayjs(val[0]).format('YYYY-MM-DD HH:mm:ss')
      this.form.endTime = dayjs(val[1]).format('YYYY-MM-DD HH:mm:ss')
    },
    // ç‚¹å‡»ç»Ÿè®¡æŒ‰é’®
    fetchData() {
      let params = {};
      params['page'] = this.currentPage;
      params['pageSize'] = this.pageSize;
      let params = {}
      params['page'] = this.currentPage
      params['pageSize'] = this.pageSize
      if (this.form.name) {
        params['siteName'] = this.form.name;
        params['siteName'] = this.form.name
      }
      if (this.form.beginTime) {
        params['beginTime'] = this.form.beginTime;
        params['beginTime'] = this.form.beginTime
      }
      if (this.form.endTime) {
        params['endTime'] = this.form.endTime;
        params['endTime'] = this.form.endTime
      }
      this.loading = true;
      this.loading = true
      this.queryButton = true
      this.isNoData = false
      this.$http
        .get('/dust/analysistime', { params: params })
        .then((response) => {
          this.tableData = response.data.data.rows;
          this.loading = false;
          this.queryButton = false
          if (response.data.data.total == 0) {
            this.isNoData = true;
            return;
          }
          // ç§»é™¤ç©ºæ•°æ®çŠ¶æ€
          this.isNoData = false;
          this.total = response.data.data.total;
        });
      this.$http.get('/dust/analysistime', { params: params }).then((response) => {
        this.tableData = response.data.data.rows
        this.loading = false
        this.queryButton = false
        if (response.data.data.total == 0) {
          this.isNoData = true
          return
        }
        // ç§»é™¤ç©ºæ•°æ®çŠ¶æ€
        this.isNoData = false
        this.total = response.data.data.total
      })
    }
  }
};
}
</script>
<template>
  <div class="search-container">
    <el-container>
      <el-main>
        <el-form :inline="true" :model="form">
          <el-form-item>
            <AreaAndmonitorType></AreaAndmonitorType>
          </el-form-item>
    <el-form :inline="true" :model="form" ref="h1">
      <el-form-item>
        <AreaAndmonitorType></AreaAndmonitorType>
      </el-form-item>
          <el-form-item>
            <TimeShortCuts
            timeType="currentMonth"
              @submit-time="giveTime"
            ></TimeShortCuts>
          </el-form-item>
          <el-form-item>
            <ButtonClick style="margin-right: 12px;" content="数据排名" type="primary" :loading="queryButton" @do-search="fetchData" ></ButtonClick>
            <ButtonExportExcel  content="导出数据" type="success" :loading="exportButton" @do-export="exportData"></ButtonExportExcel>
          </el-form-item>
        </el-form>
      <el-form-item>
        <TimeShortCuts timeType="currentMonth" @submit-time="giveTime"></TimeShortCuts>
      </el-form-item>
        <el-card v-show="!isNoData">
          <el-table
            :data="tableData"
            height="600px"
            style="width: 100%"
            v-loading="loading"
            :cell-class-name="tableCellClassName"
          >
            <el-table-column
              type="index"
              prop="name"
              label="序号"
              :index="indexMethod"
              fixed
              show-overflow-tooltip
            />
            <el-table-column
              prop="name"
              label="站点名称"
              show-overflow-tooltip
            />
      <el-form-item>
        <ButtonClick
          style="margin-right: 12px"
          content="数据排名"
          type="primary"
          :loading="queryButton"
          @do-search="fetchData"
        ></ButtonClick>
        <ButtonExportExcel
          content="导出数据"
          type="success"
          :loading="exportButton"
          @do-export="exportData"
        ></ButtonExportExcel>
      </el-form-item>
    </el-form>
            <el-table-column
              prop="mnCode"
              label="设备编号"
              show-overflow-tooltip
            />
    <el-card v-show="!isNoData">
      <el-table
        :data="tableData"
        :height="tableHeight"
        style="width: 100%"
        v-loading="loading"
        :cell-class-name="tableCellClassName"
      >
        <el-table-column
          type="index"
          prop="name"
          label="序号"
          :index="indexMethod"
          fixed
          show-overflow-tooltip
        />
        <el-table-column prop="name" label="站点名称" show-overflow-tooltip />
            <el-table-column
              prop="lst"
              label="监测日期"
              sortable
              show-overflow-tooltip
            />
        <el-table-column prop="mnCode" label="设备编号" show-overflow-tooltip />
            <el-table-column
              prop="dayAvg"
              label="日平均值"
              sortable
              show-overflow-tooltip
            />
            <el-table-column
              prop="min"
              label="日最小值"
              sortable
              show-overflow-tooltip
            />
            <el-table-column
              prop="max"
              label="日最大值"
              sortable
              show-overflow-tooltip
            />
        <el-table-column prop="lst" label="监测日期" sortable show-overflow-tooltip />
            <el-table-column
              prop="dayOnline"
              label="日在线率"
              sortable
              show-overflow-tooltip
            />
        <el-table-column prop="dayAvg" label="日平均值" sortable show-overflow-tooltip />
        <el-table-column prop="min" label="日最小值" sortable show-overflow-tooltip />
        <el-table-column prop="max" label="日最大值" sortable show-overflow-tooltip />
            <el-table-column
              prop="dayValid"
              label="日有效率"
              sortable
              show-overflow-tooltip
            />
        <el-table-column prop="dayOnline" label="日在线率" sortable show-overflow-tooltip />
            <el-table-column
              prop="dayExceeding"
              label="日超标率"
              sortable
              show-overflow-tooltip
            />
          </el-table>
        <el-table-column prop="dayValid" label="日有效率" sortable show-overflow-tooltip />
          <el-pagination
            :page-sizes="[10, 20, 50, 100]"
            :total="total"
            layout="total,sizes, prev, pager, next, jumper"
            v-model:current-page="currentPage"
            v-model:page-size="pageSize"
            @update:current-page="handleCurrentChange"
            @update:page-size="handleSizeChange"
          />
        </el-card>
        <el-empty v-show="isNoData" :image-size="200" />
      </el-main>
    </el-container>
  </div>
        <el-table-column prop="dayExceeding" label="日超标率" sortable show-overflow-tooltip />
      </el-table>
      <el-pagination
        ref="h2"
        :page-sizes="[10, 20, 50, 100]"
        :total="total"
        layout="total,sizes, prev, pager, next, jumper"
        v-model:current-page="currentPage"
        v-model:page-size="pageSize"
        @update:current-page="handleCurrentChange"
        @update:page-size="handleSizeChange"
      />
    </el-card>
    <el-empty v-show="isNoData" :image-size="200" />
</template>
<style scoped>
.el-form {
  margin: 20px;
}
.el-card {
  margin: 20px 20px 0px 20px;
}
:deep().el-table__row .warning-row {
  background-color: #f7ba1e;
}
src/views/line_graph/SiteComprehensiveRskRanking.vue
@@ -11,6 +11,8 @@
import SiteDetail from '@/views/line_graph/components/SiteDetail.vue'
import { useLoadingStore } from '@/stores/loadingStore';
import { mapStores } from 'pinia';
import riskApi from '@/api/risk/riskApi.js';
import riskValue from '@/utils/risk_estimate_common_function/riskValue.js';
export default {
  components: {
    AreaAndmonitorType,
@@ -109,47 +111,69 @@
      this.tableHeight = `calc(100vh - ${h1}px  - 40px - 40px - var(--el-main-padding) * 2`
    },
    // ç‚¹å‡»é£Žé™©æŽ’名按钮
    fetchData() {
    // fetchData() {
    //   this.loading = true
    //   this.queryButton = true
    //   exceptionApi
    //     .analysisdataByType(this.form.month, 'month')
    //     .then((response) => {
    //       this.chartData = response.data.data
    //       this.queryButton = false
    //       this.isNoData = false
    //       if (response.data.data.length == 0) {
    //         this.isNoData = true
    //         return
    //       }
    //       exceptionApi
    //         .exceptiondata1({
    //           siteName: '',
    //           beginTime: this.form.beginTime,
    //           endTime: this.form.endTime
    //         })
    //         .then((res) => {
    //           this.isNoData = false
    //           this.table = index.merge(
    //             this.chartData,
    //             res.data.data,
    //             this.form.beginTime,
    //             this.form.endTime
    //           )
    //           this.loading = false
    //           this.$nextTick(()=>{
    //           this.$refs.table.sort('riskValue','descending')
    //         })
    //         })
    //     })
    // },
     // ç‚¹å‡»é£Žé™©æŽ’名按钮
     fetchData() {
      this.loading = true
      this.queryButton = true
      exceptionApi
        .analysisdataByType(this.form.month, 'month')
      riskApi
        .queryRiskValue('',this.form.month, 'month')
        .then((response) => {
          this.chartData = response.data.data
          this.queryButton = false
          this.isNoData = false
          if (response.data.data.length == 0) {
            this.isNoData = true
            return
          }
          exceptionApi
            .exceptiondata1({
              siteName: '',
              beginTime: this.form.beginTime,
              endTime: this.form.endTime
            })
            .then((res) => {
              this.isNoData = false
              this.table = index.merge(
                this.chartData,
                res.data.data,
                this.form.beginTime,
                this.form.endTime
              )
              this.loading = false
          this.table = riskValue.calMonthlyRiskValue(response.data.data)
          this.queryButton = false
          this.isNoData = false
              this.$nextTick(()=>{
              this.$refs.table.sort('riskValue','descending')
              
            })
            })
        })
    },
    })
  },
    /**
     * åˆå§‹åŠ è½½å‡½æ•°