zmc
2023-12-01 28cbf4f043cfc0a4621cc8683ba66bcbdd350eca
1.增加了风险模型的弹出框组件  2.增加了用户可配置的页面
已修改8个文件
已删除1个文件
已添加7个文件
2534 ■■■■■ 文件已修改
src/api/audit/submitApi.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/setting/exceptionSetting.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/setting/requestTaskSetting.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/layout/AppAside.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/sfc/TimeSinglePicker.vue 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/chartFunction/exceptionOption.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data_management/BusinessReport.vue 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data_management/ParameterConfiguration.vue 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data_management/components/CompEditException.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data_management/components/CompEditRequest.vue 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exception/FlightInspection.vue 1328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exception/components/CompDialogDetail.vue 350 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exception/components/CompFlightInspection.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exception/components/DustLineChart.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vite.config.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/audit/submitApi.js
@@ -14,6 +14,8 @@
            exceptionId:id,
            auditStatus:status
        }
        if(reviewer == '' || reviewer  == null){
            params.checker = 'admin'
        }else{
src/api/setting/exceptionSetting.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
import { $http } from '@/api/index.js';
export default {
    /**
     * æäº¤ æ•°æ®èŽ·å–çš„é…ç½®å‚æ•°ä¿®æ”¹
     * @param: é…ç½®è¡¨å¯¹åº”的字段对象
     * @returns:
     */
    submitExceptionSetting(params){
        console.log('异常配置提交的参数为:',params);
        return $http.post('/dust/requestSetting/modify',params)
    }
}
src/api/setting/requestTaskSetting.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
import { $http } from '@/api/index.js';
export default {
    /**
     * æäº¤ æ•°æ®èŽ·å–çš„é…ç½®å‚æ•°ä¿®æ”¹
     * @param: é…ç½®è¡¨å¯¹åº”的字段对象
     * @returns:
     */
    submitRequestSetting(params){
        console.log('请求配置提交的参数为:',params);
        // return $http.post('/dust/requestSetting/modify',params)
    }
}
src/components/layout/AppAside.vue
@@ -136,10 +136,15 @@
          åŽ†å²æ•°æ®ç®¡ç†
          </el-menu-item>
         <!-- <el-menu-item index="/management" >
            <el-icon><i-ep-Histogram /></el-icon>
          æ•°æ®æŽ¥å…¥ç®¡ç†
          </el-menu-item> -->
         <el-menu-item index="/config" v-show="menu[6].avalue" @click="changeIcon(6)">
          <img src="@/assets/generalModel.png" height="23">
            å‚数配置
          </el-menu-item>
          <el-menu-item index="/config" v-show="!menu[6].avalue" @click="changeIcon(6)">
            <img src="@/assets/generalModel2.png" height="23">
            å‚数配置
          </el-menu-item>
          
          <!-- <el-menu-item index="report" >
src/router/index.js
@@ -63,12 +63,12 @@
          component: () => import('@/views/data_management/DataAccessManagement.vue')
        },
        //  ä¸šåŠ¡æŠ¥è¡¨
        //  å‚数配置
        {
          path: '/report',
          name: 'report',
          meta: { title: '业务报表' },
          component: () => import('@/views/data_management/BusinessReport.vue')
          path: '/config',
          name: 'config',
          meta: { title: '参数配置' },
          component: () => import('@/views/data_management/ParameterConfiguration.vue')
        },
        //  æ•°æ®æŽ¥å…¥é…ç½®
src/sfc/TimeSinglePicker.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
<!-- å•个 æ—¥æœŸæ—¶é—´é€‰æ‹©å™¨ç»„ä»¶   å¸¦æ—¥å‘¨æœˆå¿«æ·é€‰é¡¹
  å‰ä¸€å¤©æ˜¯å½“前时间的前一天的00点到23:59:59
  å‰ä¸ƒå¤© å’Œ ä¸Šä¸€ä¸ªæœˆåŒæ ·
  ä¼šå°†åˆå§‹é»˜è®¤æ—¶é—´ï¼ˆä¸€å‘¨å‰ï¼‰å’Œæ”¹å˜çš„æ—¶é—´é€šè¿‡äº‹ä»¶â€˜submitTime’传递给父组件
  åˆå§‹æ¸²æŸ“时就将时间传递给父组件:
  **
  åœ¨çˆ¶ç»„件中设置
    <TimeSinglePicker @submit-time="(n) => (form.staticsDailyTime = n)"  :selected-time="form.staticsDailyTime"/>
  ***
-->
<script>
import dayjs from 'dayjs'
export default {
  props: {
    // çˆ¶ç»„件传入的时间
    selectedTime: {
      type: String,
      default: ''
    },
    // æ˜¯å¦è®¾ç½®åªè¯»å±žæ€§
    readOnly: {
      type: Boolean,
      default: false
    }
  },
  emits: ['submitTime'],
  data() {
    return {
      time: '',
      shortcuts: []
    }
  },
  // watch: {
  //   selectedTime(newVal) {
  //     console.log('time', this.selectedTime)
  //     if (newVal != '') {
  //       this.time = this.selectedTime
  //     }
  //   }
  // },
  mounted() {
    console.log('time', this.selectedTime)
    this.time = this.selectedTime
  },
  methods: {
  }
}
</script>
<template>
  <el-date-picker
    v-model="time"
    type="datetime"
    placeholder="选择时间"
    :shortcuts="shortcuts"
    value-format="YYYY-MM-DD HH:mm:ss"
    @change="$emit('submitTime', time)"
  />
</template>
<style scoped></style>
src/utils/chartFunction/exceptionOption.js
@@ -8,7 +8,7 @@
   * @param:异常类型
   * @returns:
   */
  setExceptionChartOption(
  setExceptionChartOption({
    xData,
    yData,
    exceptionBeginTime,
@@ -19,6 +19,7 @@
    areaObj,
    lineColor,
    exceptionType
  }
  ) {
    switch (exceptionType) {
      case '0':
@@ -303,7 +304,7 @@
          name: '颗粒物浓度',
          type: 'line',
          data: yData.map((item) => {
            if (item <= 0.01) {
            if (item <= 0.02) {
              return {
                value: item,
                itemStyle: {
@@ -333,9 +334,8 @@
              {
                name: '数据超低',
                type: 'average',
                yAxis: 0.01,
                yAxis: 0.02,
                lineStyle: {
                  // color: '#ff0000'
                  color: 'red'
                }
              }
src/views/data_management/BusinessReport.vue
ÎļþÒÑɾ³ý
src/views/data_management/ParameterConfiguration.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,215 @@
<script>
import TimeSinglePicker from '@/sfc/TimeSinglePicker.vue'
import CompEditRequest from '@/views/data_management/components/CompEditRequest.vue'
import CompEditException from '@/views/data_management/components/CompEditException.vue'
export default {
  components: {
    TimeSinglePicker,
    CompEditRequest,
    CompEditException
  },
  data() {
    return {
      activeName: 'first',
      // å¯¹è¯æ¡†æ˜¾ç¤º
      dialog:{
        formRequestVisible: false,
        formExceptionVisible: false
      },
      request: [
        {
          user: 'admin',
          updateTime: '2023-10-10 09:16:41',
          region: '金山区',
          version: '1.0',
          requestStartTime: '2023-10-12 08:43:00',
          requestEndTime: null,
          requestIntervalSeconds: 43200,
          requestRangeHour: 8,
          requestRangeIntervalSeconds: 5,
          requestFailWaitSeconds: 120,
          requestRetryTimes: 4,
          requestCookieValidDuration: 48,
          staticsDailyTime: '2023-10-11 09:00:00',
          staticsMonthlyTime: '2023-10-01 10:00:00',
          loginFailWaitSeconds: 5,
          loginRetryTimes: 5,
          taskRetryWaitSeconds: 120,
          firstRequestOffsetDays: 30
        }
      ],
      exceptionSetting: [{
        user: 'admin',
        updateTime: '2023-10-10 09:16:41',
        region: '金山区',
        version: '1.0',
        missDataMinutes: 45,
        dataLow: 0.02,
        longTimeNoChange: 5,
        mutationNum: 2,
        mutationRate: 1,
        nearExceedLowValue: 0.7,
        nearExceedHighValue: 1,
        nearExceedNum: 4,
        dayExceedBorderlineLowNum: 6,
        dayExceedBorderlineHighNum: 7,
        changeTrendGroup: 12,
        changeTrendInterval: 12,
        changeTrendRate: 1,
        changeTrendTimes: 3,
        exceedingStandard: 1
      }],
      form_1: {
        user: '11',
        requestStartTime: '',
        requestEndTime: '',
        staticsDailyTime: '',
        staticsMonthlyTime: ''
      },
      loading:false,
    }
  },
  mounted() {},
  methods: {
    handleClick(tab, event) {
      // console.log(tab, event)
    },
    fetchData(){
      console.log('获取表格数据');
      this.loading = true
      setTimeout(() => {
        this.loading = false
      }, 700);
    },
    // å–消
    cancel_1() {
      this.dialogTableVisible = false
    },
    // æäº¤
    submit() {
      this.dialogTableVisible = false
    },
    render() {
      ElMessageBox.alert(
        h('div', ['this is', h('em', { style: { color: 'teal', fontSize: '14px' } }, 'Vnode')])
      )
    },
  }
}
</script>
<template>
  <el-row>
    <el-col>
      <em>参数配置</em>
      <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
        <el-tab-pane label="数据获取"  name="first" >
          <div>展示</div>
          <div>修改</div>
          <el-table :data="request" border>
            <el-table-column prop="user" label="用户名"> </el-table-column>
            <el-table-column prop="updateTime" label="更新时间"> </el-table-column>
            <el-table-column prop="region" label="区域"> </el-table-column>
            <el-table-column prop="version" label="版本"> </el-table-column>
            <el-table-column prop="requestStartTime" label="数据获取开始时间"> </el-table-column>
            <el-table-column prop="requestEndTime" label="数据获取结束时间"> </el-table-column>
            <el-table-column prop="requestIntervalSeconds" label="数据获取频率"> </el-table-column>
            <el-table-column prop="requestRangeHour" label="任务分段时长"> </el-table-column>
            <el-table-column prop="requestRangeIntervalSeconds" label="分段执行时的每段的间隔时间"> </el-table-column>
            <el-table-column prop="requestFailWaitSeconds" label="获取数据任务异常时再次尝试间隔"> </el-table-column>
            <el-table-column prop="requestRetryTimes" label="获取数据失败时再次尝试的总次数"> </el-table-column>
            <el-table-column prop="requestCookieValidDuration" label="cookie有效时常长"> </el-table-column>
            <el-table-column prop="staticsDailyTime" label="日统计执行时间"> </el-table-column>
            <el-table-column prop="staticsMonthlyTime" label="月统计执行时间"> </el-table-column>
            <el-table-column prop="loginFailWaitSeconds" label="登录失败等待时长"> </el-table-column>
            <el-table-column prop="loginRetryTimes" label="登录失败尝试次数"> </el-table-column>
            <el-table-column prop="taskRetryWaitSeconds" label="数据获取任务重新开始尝试等待时间"> </el-table-column>
            <el-table-column prop="firstRequestOffsetDays" label=" æ•°æ®èŽ·å–å¼€å§‹æ—¶é—´ç›¸å¯¹å½“æ—¥å¾€å‰åç§»"> </el-table-column>
          </el-table>
          <el-button type="primary" size="small" @click="dialog.formRequestVisible = !dialog.formRequestVisible">
            ä¿®æ”¹é…ç½®</el-button
          >
          <CompEditRequest v-model="dialog.formRequestVisible" :tableData="request[0]">
          </CompEditRequest>
        </el-tab-pane>
        <el-tab-pane label="异常分析" name="second"
          ><div>展示</div>
          <el-table :data="exceptionSetting" border>
            <el-table-column prop="user" label="用户名"> </el-table-column>
            <el-table-column prop="updateTime" label="更新时间"> </el-table-column>
            <el-table-column prop="region" label="区域"> </el-table-column>
            <el-table-column prop="version" label="版本"> </el-table-column>
            <el-table-column prop="missDataMinutes" label="数据获取开始时间"> </el-table-column>
            <el-table-column prop="dataLow" label="数据获取结束时间"> </el-table-column>
            <el-table-column prop="longTimeNoChange" label="数据获取频率"> </el-table-column>
            <el-table-column prop="mutationNum" label="任务分段时长"> </el-table-column>
            <el-table-column prop="mutationRate" label="分段执行时的每段的间隔时间"> </el-table-column>
            <el-table-column prop="nearExceedLowValue" label="获取数据任务异常时再次尝试间隔"> </el-table-column>
            <el-table-column prop="nearExceedHighValue" label="获取数据失败时再次尝试的总次数"> </el-table-column>
            <el-table-column prop="nearExceedNum" label="cookie有效时常长"> </el-table-column>
            <el-table-column prop="dayExceedBorderlineLowNum" label="日统计执行时间"> </el-table-column>
            <el-table-column prop="dayExceedBorderlineHighNum" label="月统计执行时间"> </el-table-column>
            <el-table-column prop="changeTrendGroup" label="登录失败等待时长"> </el-table-column>
            <el-table-column prop="changeTrendInterval" label="登录失败尝试次数"> </el-table-column>
            <el-table-column prop="changeTrendRate" label="数据获取任务重新开始尝试等待时间"> </el-table-column>
            <el-table-column prop="changeTrendTimes" label=" æ•°æ®èŽ·å–å¼€å§‹æ—¶é—´ç›¸å¯¹å½“æ—¥å¾€å‰åç§»"> </el-table-column>
            <el-table-column prop="exceedingStandard" label=" æ•°æ®èŽ·å–å¼€å§‹æ—¶é—´ç›¸å¯¹å½“æ—¥å¾€å‰åç§»"> </el-table-column>
          </el-table>
          <div>修改</div>
          <CompEditException  v-model="dialog.formExceptionVisible" ></CompEditException>
          <el-button type="primary" size="small" @click="dialog.formExceptionVisible = !dialog.formExceptionVisible">
            ä¿®æ”¹é…ç½®</el-button
          >
        </el-tab-pane>
      </el-tabs>
      <!-- <el-button @click="render"> æ¸²æŸ“html</el-button> -->
      <!-- <el-button @click="addObj"> å¢žåŠ å¯¹è±¡</el-button> -->
    </el-col>
  </el-row>
</template>
<style scoped>
.el-row {
  margin: 20px;
}
em {
  font-size: 30px;
  color: #333333;
}
</style>
<!-- <script>
  export default {
    data() {
      return{
        inputValue:null
      }
    },
    mounted() {
    },
    methods: {
     }
}
</script>
<template>
  {{inputValue}}
  è¾“å…¥<el-input v-model.number="inputValue" maxlength="10">
     </el-input>
</template> -->
src/views/data_management/components/CompEditException.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,157 @@
<script>
import TimeSinglePicker from '@/sfc/TimeSinglePicker.vue'
export default {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  components: {
    TimeSinglePicker
  },
  computed: {
    visible: {
      get() {
        return this.modelValue
      },
      set(value) {
        this.$emit('update:modelValue', value)
      }
    }
  },
  data() {
    return {
      form: {
        user: 'admin',
        updateTime: '2023-10-10 09:16:41',
        region: '金山区',
        version: '1.0',
        missDataMinutes: 45,
        dataLow: 0.02,
        longTimeNoChange: 5,
        mutationNum: 2,
        mutationRate: 1,
        nearExceedLowValue: 0.7,
        nearExceedHighValue: 1,
        nearExceedNum: 4,
        dayExceedBorderlineLowNum: 6,
        dayExceedBorderlineHighNum: 7,
        changeTrendGroup: 12,
        changeTrendInterval: 12,
        changeTrendRate: 1,
        changeTrendTimes: 3,
        exceedingStandard: 1
      },
      describe: null
    }
  },
  mounted() {
    this.operation()
  },
  methods: {
    // æäº¤
    submit() {
      this.visible = false
    },
    // å–消
    cancel_1() {
      this.visible = false
    },
    // å¯¹è±¡å¤„理
    operation() {
      // console.log(Object.keys(this.form));
      // console.log(Object.values(this.form));
      console.log(Object.entries(this.form))
      let temp = []
      let arr = Object.entries(this.form)
      for (let item of arr) {
        let obj = {}
        obj.label = item[0]
        obj.value = item[1]
        temp.push(obj)
      }
      this.describe = temp
      console.log(temp)
    }
  }
}
</script>
<template>
  <el-dialog v-model="visible" title="请求数据" align-center>
    <el-form :model="form" label-width="120px">
      <el-form-item label="用户名">
        <el-input v-model="form.user" disabled />
      </el-form-item>
      <el-form-item label="开始时间">
        <TimeSinglePicker @submit-time="(n) => (form.requestStartTime = n)"></TimeSinglePicker>
      </el-form-item>
      <el-form-item label="结束时间">
        <TimeSinglePicker @submit-time="(n) => (form.requestEndTime = n)"></TimeSinglePicker>
      </el-form-item>
      <el-form-item label="获取频率">
        <el-input-number v-model="num" :min="1" :max="24" @change="handleChange" />
      </el-form-item>
      <el-form-item label="分段时长">
        <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
      </el-form-item>
      <el-form-item label="分段执行时的每段的间隔时间">
        <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
      </el-form-item>
      <el-form-item label="获取数据任务异常时再次尝试间隔">
        <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
      </el-form-item>
      <el-form-item label="获取数据失败时再次尝试的总次数">
        <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
      </el-form-item>
      <el-form-item label="日统计">
        <TimeSinglePicker @submit-time="(n) => (form.staticsDailyTime = n)" />
      </el-form-item>
      <el-form-item label="月统计">
        <TimeSinglePicker @submit-time="(n) => (form.staticsMonthlyTime = n)" />
      </el-form-item>
      <el-form-item label="登录失败等待时长">
        <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
      </el-form-item>
      <el-form-item label="登录失败尝试次数">
        <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
      </el-form-item>
      <el-form-item label="任务重新开始尝试等待时间">
        <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
      </el-form-item>
      <el-form-item label="数据获取开始时间相对当日往前偏移">
        <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
      </el-form-item>
    </el-form>
    <template #footer>
      <el-button @click="cancel_1">取消</el-button>
      <el-button type="primary" @click="submit">提交</el-button>
    </template>
  </el-dialog>
  <!-- <el-button @click="operation">对象处理</el-button> -->
  <el-descriptions title="异常分析配置" :column="4" size="large" border>
    <el-descriptions-item
      v-for="item in describe"
      :key="item.label"
      :label="item.label"
      label-align="left"
      align="center"
      class-name="content-text"
      label-class-name="label-text"
    >
      {{ item.value }}
    </el-descriptions-item>
  </el-descriptions>
</template>
<style scoped>
:deep(.label-text) {
  font-size: 14px !important;
  font-weight: bold !important;
  color: #333333 !important;
}
:deep(.content-text) {
  color: #333333 !important;
}
</style>
src/views/data_management/components/CompEditRequest.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,248 @@
<script>
import TimeSinglePicker from '@/sfc/TimeSinglePicker.vue'
import requestTaskSetting from '@/api/setting/requestTaskSetting.js'
export default {
  components: {
    TimeSinglePicker
  },
  props: {
    modelValue: {
      type: Boolean,
      default: false
    },
    tableData: {
      type: Object,
      default: {}
    }
  },
  emits: ['update:modelValue'],
  computed: {
    value: {
      get() {
        return this.modelValue
      },
      set(value) {
        this.$emit('update:modelValue', value)
      }
    },
    formDataAfterCal() {
      return {
        user: this.form.user,
        updateTime: this.form.updateTime,
        region: this.form.region,
        version: this.form.version,
        requestStartTime: this.form.requestStartTime,
        requestEndTime: this.form.requestEndTime,
        requestIntervalSeconds: this.form.requestIntervalSeconds * 3600,
        requestRangeHour: this.form.requestRangeHour,
        requestRangeIntervalSeconds: this.form.requestRangeIntervalSeconds,
        requestFailWaitSeconds: this.form.requestFailWaitSeconds,
        requestRetryTimes: this.form.requestRetryTimes,
        requestCookieValidDuration: this.form.requestCookieValidDuration,
        staticsDailyTime: this.form.staticsDailyTime,
        staticsMonthlyTime: this.form.staticsMonthlyTime,
        loginFailWaitSeconds: this.form.loginFailWaitSeconds,
        loginRetryTimes: this.form.loginRetryTimes,
        taskRetryWaitSeconds: this.form.taskRetryWaitSeconds,
        firstRequestOffsetDays: this.form.firstRequestOffsetDays
      }
    }
  },
  data() {
    return {
      form: {
        user: 'admin',
        updateTime: '2023-10-10 09:16:41',
        region: '金山区',
        version: '1.0',
        requestStartTime: '2023-10-12 08:43:00',
        requestEndTime: null,
        requestIntervalSeconds: 12,
        requestRangeHour: 8,
        requestRangeIntervalSeconds: 5,
        requestFailWaitSeconds: 120,
        requestRetryTimes: 4,
        requestCookieValidDuration: 48,
        staticsDailyTime: '2023-10-11 09:00:00',
        staticsMonthlyTime: '2023-10-01 10:00:00',
        loginFailWaitSeconds: 5,
        loginRetryTimes: 5,
        taskRetryWaitSeconds: 120,
        firstRequestOffsetDays: 30
      },
      rules: {
        requestIntervalSeconds: [{ validator: this.checkRequestIntervalSeconds, trigger: 'blur' }],
        requestRangeHour: [
          { type: 'number', pattern: '/^\d+$/', message: '请输入数字', trigger: 'blur' }
          // {pattern:'/^[0-9]+$/'}
        ]
        // requestRangeIntervalSeconds: [{ validator: this.checkRequestRangeIntervalSeconds, trigger: 'blur' }],
        // requestFailWaitSeconds: [{ validator: this.checkRequestFailWaitSeconds, trigger: 'blur' }],
        // requestRetryTimes: [{ validator: this.checkRequestRetryTimes, trigger: 'blur' }],
        // loginFailWaitSeconds: [{ validator: this.checkLoginFailWaitSeconds, trigger: 'blur' }],
        // loginRetryTimes: [{ validator: this.checkLoginRetryTimes, trigger: 'blur' }],
        // taskRetryWaitSeconds: [{ validator: this.checkTaskRetryWaitSeconds, trigger: 'blur' }],
        // firstRequestOffsetDays: [{ validator: this.checkFirstRequestOffsetDays, trigger: 'blur' }],
      }
    }
  },
  mounted() {
    // const { ...temp } = this.tableData
    // this.form = temp
  },
  methods: {
    // æäº¤
    /*   submitForm() {
      // å‘送修改的请求
      requestTaskSetting.submitRequestSetting(this.form)
      this.$message.success('提交成功')
      this.value = false
    }, */
    async submitForm(formEl) {
      if (!formEl) return
      await formEl.validate((valid, fields) => {
        if (valid) {
          console.log('submit!')
        } else {
          console.log('error submit!', fields)
        }
      })
    },
    // å–消
    cancel_1() {
      this.value = false
    },
    checkRequestIntervalSeconds(rule, value, callback) {
      if (!value) {
        return callback(new Error('请输入有效值'))
      }
      setTimeout(() => {
        if (!Number.isInteger(value)) {
          callback(new Error('请输入数字'))
        } else {
          if (value < 2 || value > 24) {
            callback(new Error('范围在2~24'))
          } else {
            callback()
          }
        }
      }, 300)
    }
  }
}
</script>
<template>
  <el-dialog v-model="value" title="数据获取配置参数修改" close-delay="200" align-center>
    <el-form :model="form" ref="ruleFormRef" label-width="210px" status-icon :rules="rules">
      <el-form-item label="用户名">
        <el-input v-model="form.user" disabled />
      </el-form-item>
      <el-form-item label="开始时间">
        <TimeSinglePicker
          :selectedTime="form.requestStartTime"
          @submit-time="(n) => (form.requestStartTime = n)"
        ></TimeSinglePicker>
      </el-form-item>
      <el-form-item label="结束时间">
        <TimeSinglePicker
          @submit-time="(n) => (form.requestEndTime = n)"
          :selected-time="form.requestEndTime"
        ></TimeSinglePicker>
      </el-form-item>
      <!-- ---------------------------------------------------------- -->
      <el-form-item label="获取频率" prop="requestIntervalSeconds">
        <el-input v-model.number="form.requestIntervalSeconds">
          <template #append>小时/次</template>
        </el-input>
      </el-form-item>
      <el-form-item label="任务分段时长" prop="requestRangeHour">
        <el-input v-model.number="form.requestRangeHour" :min="1" :max="10">
          <template #append>小时</template>
        </el-input>
      </el-form-item>
      <el-form-item label="分段执行的间隔" prop="requestRangeIntervalSeconds">
        <el-input v-model.number="form.requestRangeIntervalSeconds" :min="1" :max="10">
          <template #append>秒</template>
        </el-input>
      </el-form-item>
      <el-form-item label="获取任务异常时再次尝试间隔" prop="requestFailWaitSeconds">
        <el-input v-model.number="form.requestFailWaitSeconds" :min="1" :max="10">
          <template #append>秒</template>
        </el-input>
      </el-form-item>
      <el-form-item label="获取失败时再次尝试的总次数" prop="requestRetryTimes">
        <el-input v-model.number="form.requestRetryTimes" :min="1" :max="10">
          <template #append>次数</template>
        </el-input>
      </el-form-item>
      <el-form-item label="日统计">
        <TimeSinglePicker
          @submit-time="(n) => (form.staticsDailyTime = n)"
          :selected-time="form.staticsDailyTime"
        />
      </el-form-item>
      <el-form-item label="月统计">
        <TimeSinglePicker
          @submit-time="(n) => (form.staticsMonthlyTime = n)"
          :selected-time="form.staticsMonthlyTime"
        />
      </el-form-item>
      <el-form-item label="登录失败等待时长" prop="loginFailWaitSeconds">
        <el-input v-model.number="form.loginFailWaitSeconds" :min="1" :max="10">
          <template #append>秒</template>
        </el-input>
      </el-form-item>
      <el-form-item label="登录失败尝试次数" prop="loginRetryTimes">
        <el-input v-model.number="form.loginRetryTimes" :min="1" :max="10">
          <template #append>次数</template>
        </el-input>
      </el-form-item>
      <el-form-item label="任务重新开始尝试等待时间" prop="taskRetryWaitSeconds">
        <el-input v-model.number="form.taskRetryWaitSeconds" :min="1" :max="10">
          <template #append>秒</template>
        </el-input>
      </el-form-item>
      <el-form-item label="获取开始时间相对当日往前偏移" prop="firstRequestOffsetDays">
        <el-input v-model.number="form.firstRequestOffsetDays" :min="1" :max="10">
          <template #append>天</template>
        </el-input>
      </el-form-item>
    </el-form>
    <template #footer>
      <el-button @click="cancel_1">取消</el-button>
      <el-button type="primary" @click="submitForm(ruleFormRef)">提交</el-button>
    </template>
  </el-dialog>
</template>
<style scoped>
/* .el-form {
    display: flex;
    flex-direction: column;
  }
   */
/* .el-form-item {
    display: flex;
    margin-top: 5px;
  } */
/* .el-input {
    width: 700px;
  }
   */
</style>
src/views/exception/FlightInspection.vue
@@ -1,4 +1,4 @@
<script>
<!-- <script>
  import CompFlightInspection from '@/views/exception/components/CompFlightInspection.vue'
  export default {
    components: {
@@ -24,4 +24,1330 @@
<style  scoped>
</style> -->
<script>
  import { defineAsyncComponent } from 'vue'
  import TimeShortCuts from '@/sfc/TimeShortCuts.vue'
  import { useCommonFunction } from '@/utils/common.js'
  import AreaAndmonitorType from '@/sfc/AreaAndmonitorType.vue'
  import ButtonClick from '@/sfc/ButtonClick.vue'
  import index from '@/utils/exception_common_function/index.js'
  //  å¼‚常图形异步组件
  const DustLineChart = defineAsyncComponent(() =>  import('@/views/exception/components/DustLineChart.vue'))
  import exceptionApi from '@/api/exceptionApi.js'
  import dayjs from 'dayjs'
  import { ElMessage } from 'element-plus'
  import AnalysisCard from '@/views/exception/components/AnalysisCard.vue'
  import DutyCompany from '@/sfc/DutyCompany.vue'
  import StreetInfo from '@/sfc/StreetInfo.vue'
  import historyApi from '@/api/historyApi.js'
  import time from '@/utils/time.js'
  import lineChart from '@/utils/chartFunction/lineChart.js'
  import exceptionOption from '@/utils/chartFunction/exceptionOption.js'
  import exception0 from '@/assets/exception/exception0.png'
  import exception1 from '@/assets/exception/exception1.png'
  import exception2 from '@/assets/exception/exception2.png'
  import exception3 from '@/assets/exception/exception3.png'
  import exception4 from '@/assets/exception/exception4.png'
  import exception5 from '@/assets/exception/exception5.png'
  import exception6 from '@/assets/exception/exception6.png'
  import exception7 from '@/assets/exception/exception7.png'
  import CompDialogDetail from '@/views/exception/components/CompDialogDetail.vue'
  export default {
    props: {
      // ç‚¹ä½åå­—
      siteName: {
        type: String,
        default: ''
      },
      // æ—¥æ—¶é—´æˆ–者月时间
      time:{
          type:String,
          default:''
      },
      // å±•示页面的全部
      showAll: {
        type: Boolean,
        default: true
      },
      // 0代表日时间,1代表月时间
      timeType:{
        type:Number,
        default:-1
      }
    },
    components: {
      TimeShortCuts,
      DustLineChart,
      ButtonClick,
      AreaAndmonitorType,
      AnalysisCard,
      DutyCompany,
      StreetInfo,
      CompDialogDetail
    },
    data() {
      return {
        //  è¡¨å•内容
        form: {
          // ç«™ç‚¹åç§°
          name: '',
          // è¿ç»´å•†
          dutyCompany: [],
          // è¡—道
          street: [],
          // é€‰æ‹©çš„异常类型
          exceptionName: []
        },
        beginTime: '',
        endTime: '',
        // è¿”回的数据
        tableData: [],
        // è¡¨æ ¼å±•示的数据
        displayData: [],
        // è¡¨æ ¼é«˜åº¦
        tableHeight: 400,
        // è¡¨æ ¼æ˜¾ç¤º
        isTableShow: false,
        // å®¡æ ¸è¾…助按钮显示
        auditButton: false,
        // å½“前页
        currentPage: 1,
        // æ¯é¡µæ¡æ•°
        pageSize: 20,
        // è¡¨æ ¼çš„æ€»è®°å½•æ•°
        total: 0,
        // æŸ¥è¯¢æŒ‰é’®æ— æ•°æ®æ—¶
        isNoData: {
          exception0: true,
          exception1: true,
          exception2: true,
          exception3: true,
          exception4: true,
          exception5: true,
          exception6: true,
          exception7: true,
          exception8: true
        },
        // eslint-disable-next-line no-undef
        // å¯¹è¯æ¡†æ˜¾ç¤º
        dialogTableVisible: false,
        // ä¿å­˜å¼‚常对应的店铺名称和设备编号
        exception: {
          // æ–­ç”µæˆ–断网
          exception0: [],
          // æ•°æ®è¶…低
          exception1: [],
          // è¶…æ ‡
          exception2: [],
          // æ•°æ®é•¿æ—¶æ®µæ— æ³¢åЍ
          exception3: [],
          // é‡çº§çªå˜å¼‚常
          exception4: [],
          // ä¸´è¿‘超标异常
          exception5: [],
          // å•日超标次数临界异常
          exception6: [],
          // æ»‘动平均值异常
          exception7: [],
          // æœ‰æ•ˆçއ异叏
          exception8: [],
          // è¯¥æ—¶æ®µçš„异常数量
          exception0Num: 0,
          exception1Num: 0,
          exception2Num: 0,
          exception3Num: 0,
          exception4Num: 0,
          exception5Num: 0,
          exception6Num: 0,
          exception7Num: 0,
          exception8Num: 0
        },
        // ç«™ç‚¹æ€»æ•°é‡
        siteTotal: 0,
        // é€‰ä¸­è¡¨æ ¼å½“前行的数据
        tableCurrentRowData: null,
        // é€‰ä¸­è¡¨æ ¼å½“前行的索引
        selectedRowIndex: -2,
        // é¡µé¢ä¸Šçš„æŒ‰é’®åŠ è½½çŠ¶æ€
        loading: {
          // æŸ¥è¯¢æŒ‰é’®
          queryButton: false,
          // è¡¨æ ¼åŠ è½½ä¸­
          tableLoading: false,
          // ä¸Šä¸€æ¡æŒ‰é’®
          preButton: false,
          // ä¸‹ä¸€æ¡æŒ‰é’®
          afterButton: false,
          // æŠ˜çº¿å›¾
          lineChart: false
        },
        dialog: {
          // æ‰“开对话框请求该区间的历史数据
          historyData: [],
          // è¯¥æ—¶é—´æ®µçš„异常条数
          exceptionTotal: 0,
          // æŠ˜çº¿å›¾é…ç½®é¡¹
          option: {},
          // â€™ä¸Šä¸€æ¡â€˜æŒ‰é’®æ˜¯å¦å¯ä»¥è¢«ç‚¹å‡»çŠ¶æ€
          isPreCantouch: false,
          // â€™ä¸‹ä¸€æ¡â€˜æŒ‰é’®æ˜¯å¦å¯ä»¥è¢«ç‚¹å‡»çŠ¶æ€
          isNextCantouch: false,
          // å¼‚常的前中后区间所有数据
          allExceptionTimeData: []
        },
        // æ ‡è®°ä½
        flag: {
          // æ•°æ®åŠ è½½æ—¶ ä¸Šä¸‹æ¡æŒ‰é’®ä¸èƒ½å†ç‚¹å‡»
          banTouch: 0,
          // 0代表分页,1代表不分页
          originClick: 0
        },
        areaColor: null
      }
    },
    setup() {
      const { isExceedOneMonth } = useCommonFunction()
      return {
        isExceedOneMonth
      }
    },
    // ç›‘听  åˆ¤æ–­æŒ‰é’®æ˜¯å¦å¯ç‚¹å‡»
    watch: {
      selectedRowIndex(newVaue) {
        // å¤„于表格的最后一条数据 è®¾ç½®â€˜ä¸Šä¸€æ¡â€™æŒ‰é’®ä¸å¯ç‚¹
        if (newVaue === 0) {
          this.dialog.isPreCantouch = true
          //用户先点了第一条,pre为true,然后点击最后一条,next为true。此时两个按钮都被封锁
          if (this.dialog.isNextCantouch == true) {
            this.dialog.isNextCantouch = false
          }
        }
        // å¤„于表格第一条数据 è®¾ç½®â€˜ä¸Šä¸€æ¡â€™æŒ‰é’®ä¸å¯ç‚¹
        else if (newVaue === this.displayData.length - 1) {
          this.dialog.isNextCantouch = true
          //用户先点了表格最后一条,next为true,然后点击第一条,pre为true。此时两个按钮都被封锁
          if (this.dialog.isPreCantouch == true) {
            this.dialog.isPreCantouch = false
          }
        }
        // å¤„于表格的中间行 å°†æŒ‰é’®è®¾ç½®ä¸ºå¯ç‚¹å‡»çŠ¶æ€
        else {
          this.dialog.isPreCantouch = false
          this.dialog.isNextCantouch = false
        }
      },
      dialogTableVisible() {
        window.addEventListener('resize', this.updateChart)
      },
      // é¡µé¢åŠ è½½æ—¶showAll才会变化一次
      // ä¸ºtrue表示的飞行巡检页面
      showAll(){
          if(this.showAll){
              this.backExceptionDataAWeekAgo()
          }
      },
      // siteName(){
      //   if(this.siteName!=''){
      //     this.beginTime = dayjs(this.month).startOf('month').format('YYYY-MM-DD HH:mm:ss')
      //     this.endTime = dayjs(this.month).endOf('month').format('YYYY-MM-DD HH:mm:ss')
      //     this.backExceptionDataAWeekAgo()
      //     this.getShopNames()
      //   }
      // },
      timeType(){
        if(this.timeType == '0'){
          this.beginTime = dayjs(this.time).format('YYYY-MM-DD 00:00:00')
          this.endTime = dayjs(this.time).format('YYYY-MM-DD 23:59:59')
        }else if(this.timeType == '1'){
          this.beginTime = dayjs(this.time).startOf('month').format('YYYY-MM-DD HH:mm:ss')
          this.endTime = dayjs(this.time).endOf('month').format('YYYY-MM-DD HH:mm:ss')
        }
        this.backExceptionDataAWeekAgo()
        this.getShopNames()
      },
      watch:{
    dialogTableVisible:{
        handler(newValue){
            console.log('真假1',this.dialogTableVisible);
        }
    }
},
    },
    computed: {
      exceptionAllNum() {
        let sum =
          this.exception.exception0Num +
          this.exception.exception1Num +
          this.exception.exception2Num +
          this.exception.exception3Num +
          this.exception.exception4Num +
          this.exception.exception5Num +
          this.exception.exception6Num +
          this.exception.exception7Num +
          this.exception.exception8Num
        if (sum == 0) {
          return 1
        } else {
          return sum
        }
      },
      long_time_notchange() {
        let sum =
          this.exception.exception0Num +
          this.exception.exception1Num +
          this.exception.exception2Num +
          this.exception.exception3Num +
          this.exception.exception4Num +
          this.exception.exception5Num +
          this.exception.exception6Num +
          this.exception.exception7Num +
          this.exception.exception8Num
        if (sum == 0) {
          return 0
        } else {
          return (
            100 -
            (this.exception.exception0Num / this.exceptionAllNum) * 100 -
            (this.exception.exception1Num / this.exceptionAllNum) * 100 -
            (this.exception.exception2Num / this.exceptionAllNum) * 100 -
            (this.exception.exception4Num / this.exceptionAllNum) * 100 -
            (this.exception.exception5Num / this.exceptionAllNum) * 100 -
            (this.exception.exception6Num / this.exceptionAllNum) * 100 -
            (this.exception.exception7Num / this.exceptionAllNum) * 100 -
            (this.exception.exception8Num / this.exceptionAllNum) * 100
          ).toFixed(1)
        }
      },
      // ç¬¬ä¸€æŽ’卡片
      cardRow() {
        return [
          {
            siteName: this.exception.exception4,
            exceptionType: '4',
            exceptionName: '量级突变',
            iconSrc: exception4,
            siteNum: this.exception.exception4.length,
            exceptionNum: this.exception.exception4Num,
            isNoDataStatus: this.isNoData.exception4,
            span: 5
          },
          {
            siteName: this.exception.exception5,
            exceptionType: '5',
            exceptionName: '临近超标异常',
            iconSrc: exception5,
            siteNum: this.exception.exception5.length,
            exceptionNum: this.exception.exception5Num,
            isNoDataStatus: this.isNoData.exception5,
            span: 5
          },
          {
            siteName: this.exception.exception8,
            exceptionType: '8',
            exceptionName: '有效率异常',
            iconSrc: exception0,
            siteNum: this.exception.exception8.length,
            exceptionNum: this.exception.exception8Num,
            isNoDataStatus: this.isNoData.exception8,
            span: 5
          },
          {
            siteName: this.exception.exception6,
            exceptionType: '6',
            exceptionName: '单日超标次数临界异常',
            iconSrc: exception6,
            siteNum: this.exception.exception6.length,
            exceptionNum: this.exception.exception6Num,
            isNoDataStatus: this.isNoData.exception6,
            span: 5
          },
          {
            siteName: this.exception.exception7,
            exceptionType: '7',
            exceptionName: '变化趋势异常',
            iconSrc: exception7,
            siteNum: this.exception.exception7.length,
            exceptionNum: this.exception.exception7Num,
            isNoDataStatus: this.isNoData.exception7,
            span: 4
          },
          {
            siteName: this.exception.exception0,
            exceptionType: '0',
            exceptionName: '数据缺失异常',
            iconSrc: exception0,
            siteNum: this.exception.exception0.length,
            exceptionNum: this.exception.exception0Num,
            isNoDataStatus: this.isNoData.exception0,
            span: 6
          },
          {
            siteName: this.exception.exception1,
            exceptionType: '1',
            exceptionName: '数据超低',
            iconSrc: exception1,
            siteNum: this.exception.exception1.length,
            exceptionNum: this.exception.exception1Num,
            isNoDataStatus: this.isNoData.exception1,
            span: 6
          },
          {
            siteName: this.exception.exception2,
            exceptionType: '2',
            exceptionName: '超标',
            iconSrc: exception2,
            siteNum: this.exception.exception2.length,
            exceptionNum: this.exception.exception2Num,
            isNoDataStatus: this.isNoData.exception2,
            span: 6
          },
          {
            siteName: this.exception.exception3,
            exceptionType: '3',
            exceptionName: '数据长时段无波动',
            iconSrc: exception3,
            siteNum: this.exception.exception3.length,
            exceptionNum: this.exception.exception3Num,
            isNoDataStatus: this.isNoData.exception3,
            span: 6
          }
        ]
      },
    },
    mounted() {
      this.getSiteNume()
      // é£žè¡Œå·¡æ£€é¡µé¢ï¼Œè¿›åŽ»åŠ è½½
      if(this.showAll == true){
        this.backExceptionDataAWeekAgo()
        this.getShopNames()
      }
    },
    methods: {
      /**
       * æœ‰æ•ˆçއ异叏 è®¾ç½®æŠ˜çº¿å›¾é…ç½®é¡¹
       * @param:
       * @returns:
       */
      validProcess() {
        // x轴数据
        let xList = time.ascTime(
          this.tableCurrentRowData.beginTime,
          this.tableCurrentRowData.endTime,
          15
        )
        // y轴数据
        let yList = []
        xList.forEach((item) => {
          // æŸ¥æ‰¾è¯¥æ—¶é—´çš„æ•°æ®
          let r = lineChart.findDate(this.dialog.historyData, item)
          if (r) {
            yList.push(r.dustValue)
          } else {
            yList.push(null)
          }
        })
        // é¢œè‰²èƒŒæ™¯åŒºé—´
        // å¾—到无数据的时间点或flag不等于N的时间点
        let noDataTime = time.invalidTime(this.dialog.historyData, xList)
        let rangeTime = time.seriesTime(noDataTime, 15)
        // let rangeTime_1 = time.splitTime(rangeTime)
        // å¾—到背景区间的配置
        let areaObj = lineChart.getMarkArea(rangeTime, '异常')
        // let lineColor = lineChart.getLineColor(rangeTime,xList)
        let lineColor = []
        // console.log('线段',lineColor);
        // ä¼ å…¥å‚æ•°
        this.dialog.option = exceptionOption.setExceptionChartOption(
          xList,
          yList,
          '',
          '',
          '',
          '',
          this.tableCurrentRowData.exception,
          areaObj,
          lineColor,
          this.tableCurrentRowData.exceptionType
        )
      },
      getImageUrl(name) {
        return new URL(`../../lib/Carousel/assets/${name}`, import.meta.url).href
      },
      // æ”¾å›žç«™ç‚¹æ€»æ•°é‡
      getSiteNume() {
        exceptionApi.getSitesNum().then((res) => {
          this.siteTotal = res.data.data.length
        })
      },
      /**
       * description:点击异常站点名字时 è¿”回的数据
       * @param:
       * @createTime:2023-08-17
       * @returns:
       */
      getAbnormalDataByClick(val) {
        this.flag.originClick = 1
        // æ˜¾ç¤ºè¡¨æ ¼
        this.isTableShow = true
        this.tableData = val
        this.total = this.tableData.length
        // é»˜è®¤æ˜¾ç¤ºç¬¬ä¸€é¡µ
        this.handleCurrentChange(1)
      },
      // ç‚¹å‡»è¡¨æ ¼çš„行时
      selectTableRow() {
        // èŽ·å–å½“å‰è¡Œçš„ç´¢å¼•
        this.selectedRowIndex = this.displayData.indexOf(this.tableCurrentRowData)
      },
      /**
       * description:断电或断网时设置的表格数据
       */
      setOfflineTbleData() {
        // æ— æ•°æ®æ—¶çš„æ—¶é—´æ•°ç»„ æ—¶é—´ç›¸å·®15分钟
        const abnormalTimeTenMinute = index.descFiftyTime(
          this.tableCurrentRowData.beginTime,
          this.tableCurrentRowData.endTime
        )
        // ä¿å­˜æ— æ•°æ®æ—¶è¡¨æ ¼æ¡æ•°
        this.dialog.exceptionTotal = abnormalTimeTenMinute.length
        // åŽ»é™¤ä¾›ç”µå¼‚å¸¸å’ŒæŽ‰çº¿åŒºé—´çš„ç¬¬ä¸€ä¸ªæœ‰å…ƒç´ çš„å€¼
        this.dialog.historyData = []
        for (let i = 0; i < abnormalTimeTenMinute.length; i++) {
          this.dialog.historyData.push({
            name: this.tableCurrentRowData.name,
            mnCode: this.tableCurrentRowData.mnCode,
            dutyCompany: this.tableCurrentRowData.dutyCompany,
            lst: abnormalTimeTenMinute[i],
            dustValue: ''
          })
        }
      },
      // æ®µç”µæˆ–断网区间无数据,需要补充。其他的都有数据,直接一次请求全部时段就好
      // æ ¹æ®å¼‚常区间构造前后端首尾 å‰åŒºé—´ ä¸­é—´åŒºé—´ åŽåŒºé—´
      // åˆ¤æ–­æ˜¯æ®µç”µæˆ–断网?是则请求前后区间,否则只请求一次完整的
      // å¾—到最终数据
      // å†åˆ¤æ–­å¼‚常种类 ï¼Œè¿›è¡Œè®¾ç½®é…ç½®é¡¹
      /**
       * description:一次请求回前中后区间的数据,对数据进行分析
       * @param: å‰ä¸­åŽåŒºé—´çš„请求参数,前中后的总区间时间,异常开始时间,一场结束时间
       */
      otherExceptionRequest(allTimeArgs, allTime, exceptionBT, exceptionET) {
        // æŠ˜çº¿å›¾åŠ è½½ä¸­æ•ˆæžœ
        this.loading.lineChart = true
        historyApi.queryHistoryData(allTimeArgs).then((result) => {
          this.dialog.allExceptionTimeData = result.data.data
          //  æ•°æ®ç¼ºå¤±å¼‚常时重新设置表格
          if (this.tableCurrentRowData.exceptionType == '0') {
            this.setOfflineTbleData()
          }
          // x轴日期时间
          let dateList = []
          // yè½´ è¶…标油烟浓度
          let dustValue = []
          let timeAndValue = {}
          // ä»Žæ·»åŠ äº†é¦–ä½åŒºé—´çš„å¼€å§‹å’Œç»“æŸæ—¶é—´è¿›è¡ŒéåŽ† ä¿è¯æ—¶é—´ä»¥15分钟为间隔
          timeAndValue = index.keepContinuousByEachFiftyMinutes(
            allTime[0],
            allTime[3],
            this.dialog.allExceptionTimeData
          )
          dateList = timeAndValue['xAxis']
          dustValue = timeAndValue['yAxis']
          // æå–异常起始时间点在整个区间内的数据索引
          let startIndex = dateList.findIndex((item) => item === exceptionBT)
          let endIndex = dateList.findIndex((item) => item === exceptionET)
          // è®¾ç½®æŠ˜çº¿å›¾é…ç½®é¡¹
          // this.reSetChart(dateList, dustValue, exceptionBT, exceptionET, startIndex, endIndex)
          this.dialog.option = exceptionOption.setExceptionChartOption(
            dateList,
            dustValue,
            exceptionBT,
            exceptionET,
            startIndex,
            endIndex,
            this.tableCurrentRowData.exception,
            '',
            '',
            this.tableCurrentRowData.exceptionType
          )
          this.flag.banTouch = 0
          this.loading.lineChart = false
        })
      },
      /**
       * description:划分出异常起始时间,构造请求前中后的参数
       */
      timeAndDataProcessed() {
        //异常的开始时间 ç»“束时间
        let exceptionBeginTime = this.tableCurrentRowData.beginTime
        let exceptionEndTime = this.tableCurrentRowData.endTime
        // beforeAndAfterTime[0]:前45分钟的时间点
        // beforeAndAfterTime[1]:前15分钟的时间点
        // beforeAndAfterTime[2]:后15分钟的时间点
        // beforeAndAfterTime[3]:后45分钟的时间点
        let beforeAndAfterTime = index.before45AndAfter45(exceptionBeginTime, exceptionEndTime)
        // æž„造异常时间前后区间数据请求参数(除了断网中都用到)
        let paramsAllTime = index.requestGetParms(
          this.tableCurrentRowData.name,
          beforeAndAfterTime[0],
          beforeAndAfterTime[3]
        )
        // å°†å¼‚常数据进行预处理,随后将结果作为折线图的配置项
        this.otherExceptionRequest(
          paramsAllTime,
          beforeAndAfterTime,
          exceptionBeginTime,
          exceptionEndTime
        )
      },
      /**
       * description:获取下一条异常信息
       */
      getPreviousRowData() {
        //     // ä¸æ˜¯è¡¨æ ¼çš„æœ€åŽä¸€è¡Œ
        if (this.selectedRowIndex < this.displayData.length - 1) {
          // ç‚¹å‡»è¿‡ç¨‹ä¸­ é”ä½ä¸Šä¸‹æ¡æŒ‰é’®  åœ¨è®¾ç½®å®Œå›¾å½¢é…ç½®é¡¹åŽè§£é”
          this.flag.banTouch = 1
          //得到上一行数据索引
          this.selectedRowIndex = this.selectedRowIndex + 1
          // å¾—到上一行的数据
          this.tableCurrentRowData = this.displayData[this.selectedRowIndex]
          this.loading.preButton = true
          historyApi
            .queryHistoryData({
              siteName: this.tableCurrentRowData.name,
              beginTime: this.tableCurrentRowData.beginTime,
              endTime: this.tableCurrentRowData.endTime
            })
            .then((response) => {
              // ä¿å­˜è¿”回的超标数据
              this.dialog.historyData = response.data.data
              this.dialog.exceptionTotal = response.data.data.length
              // é€»è¾‘处理
              if (this.tableCurrentRowData.exceptionType != '8') {
                this.timeAndDataProcessed()
              } else {
                this.loading.lineChart = true
                this.validProcess()
                this.loading.lineChart = false
                this.flag.banTouch = 0
              }
              this.loading.preButton = false
            })
        }
      },
      /**
       * description:获取下一条异常信息
       */
      getNextRowData() {
        // ä¸æ˜¯è¡¨æ ¼çš„第一行
        if (this.selectedRowIndex !== 0) {
          // ç‚¹å‡»è¿‡ç¨‹ä¸­ é”ä½ä¸Šä¸‹æ¡æŒ‰é’®  åœ¨è®¾ç½®å®Œå›¾å½¢é…ç½®é¡¹åŽè§£é”
          this.flag.banTouch = 1
          //得到上一行数据索引
          this.selectedRowIndex = this.selectedRowIndex - 1
          // å¾—到上一行的数据
          this.tableCurrentRowData = this.displayData[this.selectedRowIndex]
          this.loading.afterButton = true
          historyApi
            .queryHistoryData({
              siteName: this.tableCurrentRowData.name,
              beginTime: this.tableCurrentRowData.beginTime,
              endTime: this.tableCurrentRowData.endTime
            })
            .then((response) => {
              // ä¿å­˜è¿”回的超标数据
              this.dialog.historyData = response.data.data
              this.dialog.exceptionTotal = response.data.data.length
              // é€»è¾‘处理
              if (this.tableCurrentRowData.exceptionType != '8') {
                this.timeAndDataProcessed()
              } else {
                this.loading.lineChart = true
                this.validProcess()
                this.loading.lineChart = false
                this.flag.banTouch = 0
              }
              this.loading.afterButton = false
            })
        }
      },
      /**
       * description:从子组件获得某站点该时段的异常数据
       * @createTime:2023-08-18
       */
      backExceptionData(val1, val2) {
        this.displayData = val1
        this.total = val2
      },
      // æŸ¥è¯¢å¼‚常数据的站点名字和数量
      queryExceptionSite(url, exceptionType) {
        let params = {}
        params['beginTime'] = this.beginTime
        params['endTime'] = this.endTime
        params['exceptionType'] = exceptionType
        if(this.siteName){
          params['siteName'] = this.siteName
        }
        // if (this.form.street.length != 0) {
        //   params['street'] = this.form.street.join()
        // }
        if (this.form.dutyCompany.length != 0) {
          params['dutyCompany'] = this.form.dutyCompany.join()
        }
        return this.$http.get(url, { params: params })
      },
      /**
       * description:当用户改变查询的时间区间时,会根据该区间查询各异常的站点,查询该时间区间的各异常数量
       * @createTime:2023-08-18
       */
      getShopNames() {
        /* æŸ¥è¯¢å¼‚常的站点 */
        this.queryExceptionSite('/dust/sitenamecode', 0).then((result) => {
          this.exception.exception0 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception0 = true
            return
          }
          this.isNoData.exception0 = false
        })
        this.queryExceptionSite('/dust/sitenamecode', 1).then((result) => {
          this.exception.exception1 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception1 = true
            return
          }
          this.isNoData.exception1 = false
        })
        this.queryExceptionSite('/dust/sitenamecode', 2).then((result) => {
          this.exception.exception2 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception2 = true
            return
          }
          this.isNoData.exception2 = false
        })
        this.queryExceptionSite('/dust/sitenamecode', 3).then((result) => {
          this.exception.exception3 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception3 = true
            return
          }
          this.isNoData.exception3 = false
        })
        this.queryExceptionSite('/dust/sitenamecode', 4).then((result) => {
          this.exception.exception4 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception4 = true
            return
          }
          this.isNoData.exception4 = false
        })
        this.queryExceptionSite('/dust/sitenamecode', 5).then((result) => {
          this.exception.exception5 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception5 = true
            return
          }
          this.isNoData.exception5 = false
        })
        this.queryExceptionSite('/dust/sitenamecode', 6).then((result) => {
          this.exception.exception6 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception6 = true
            return
          }
          this.isNoData.exception6 = false
        })
        this.queryExceptionSite('/dust/sitenamecode', 7).then((result) => {
          this.exception.exception7 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception7 = true
            return
          }
          this.isNoData.exception7 = false
        })
        this.queryExceptionSite('/dust/sitenamecode', 8).then((result) => {
          this.exception.exception8 = result.data.data
          if (result.data.data.length == 0) {
            this.isNoData.exception8 = true
            return
          }
          this.isNoData.exception8 = false
        })
        /* å¼‚常异常数量 */
        this.queryExceptionSite('/dust/exceptionnum', 0).then((result) => {
          this.exception.exception0Num = result.data.data
        })
        this.queryExceptionSite('/dust/exceptionnum', 1).then((result) => {
          this.exception.exception1Num = result.data.data
        })
        this.queryExceptionSite('/dust/exceptionnum', 2).then((result) => {
          this.exception.exception2Num = result.data.data
        })
        this.queryExceptionSite('/dust/exceptionnum', 3).then((result) => {
          this.exception.exception3Num = result.data.data
        })
        this.queryExceptionSite('/dust/exceptionnum', 4).then((result) => {
          this.exception.exception4Num = result.data.data
        })
        this.queryExceptionSite('/dust/exceptionnum', 5).then((result) => {
          this.exception.exception5Num = result.data.data
        })
        this.queryExceptionSite('/dust/exceptionnum', 6).then((result) => {
          this.exception.exception6Num = result.data.data
        })
        this.queryExceptionSite('/dust/exceptionnum', 7).then((result) => {
          this.exception.exception7Num = result.data.data
        })
        this.queryExceptionSite('/dust/exceptionnum', 8).then((result) => {
          this.exception.exception8Num = result.data.data
        })
      },
      /**
       * description:显示对话框,返回该异常时间段的所有数据
       * @param:点击‘查看详情’的该行所有字段数据
       * @createTime:2023-08-18
       */
      showDialog(row) {
        // æ‰“开对话框
        this.dialogTableVisible = true
        // ä¿å­˜å½“前行数据
        this.tableCurrentRowData = row
        // // èŽ·å–å½“å‰è¡Œçš„ç´¢å¼•
        // this.selectedRowIndex = this.displayData.indexOf(row)
        // //根据当前行的编号,起始时间来 è¯·æ±‚异常数据
        // // å¯¹è¯·æ±‚到的数据进行首尾拼接
        // // å¾—到前后完整数据进行绘制图形
        // historyApi
        //   .queryHistoryData({
        //     siteName: row.name,
        //     beginTime: row.beginTime,
        //     endTime: row.endTime
        //   })
        //   .then((response) => {
        //     // ä¿å­˜è¿”回的超标数据
        //     this.dialog.historyData = response.data.data
        //     this.dialog.exceptionTotal = response.data.data.length
        //     // é€»è¾‘处理
        //     if (this.tableCurrentRowData.exceptionType != '8') {
        //       this.timeAndDataProcessed()
        //     } else {
        //       this.loading.lineChart = true
        //       this.validProcess()
        //       this.loading.lineChart = false
        //       this.flag.banTouch = 0
        //     }
        //   })
      },
      /**
       * description:条件查询异常的数据
       * @createTime:2023-08-18
       */
      handleSubmit() {
        if (this.isExceedOneMonth(this.beginTime, this.endTime)) {
          alert('时间跨度不能超过一个月')
          return
        }
        // æ›´æ–°å¼‚常分析
        this.getShopNames()
        this.loading.queryButton = true
        this.flag.originClick = 0
        this.loading.tableLoading = true
        let params = {}
        params['page'] = this.currentPage
        params['pageSize'] = this.pageSize
        if (this.siteName) {
          params['siteName'] = this.siteName
        }
        // if (this.form.street.length != 0) {
        //   params['street'] = this.form.street.join()
        // }
        if (this.form.dutyCompany.length != 0) {
          params['dutyCompany'] = this.form.dutyCompany.join()
        }
        params['beginTime'] = this.beginTime
        params['endTime'] = this.endTime
        this.$http.get('/dust/exceptiondata2', { params: params }).then((response) => {
          // ä¿å­˜è¿”回的
          this.displayData = response.data.data.rows
          this.loading.queryButton = false
          this.loading.tableLoading = false
          if (response.data.data.total == 0) {
            ElMessage('该时段无数据')
            this.isTableShow = false
            return
          }
          this.isTableShow = true
          this.total = response.data.data.total
          // ç§»é™¤ç©ºæ•°æ®çŠ¶æ€
        })
      },
      /**
       * description:打开页面默认加载最近一周的异常数据
       * @createTime:2023-08-18
       */
      backExceptionDataAWeekAgo() {
        this.loading.tableLoading = true
        let params = {}
        if (this.siteName) {
          params['siteName'] = this.siteName
        }
        params['beginTime'] = this.beginTime
        params['endTime'] = this.endTime
        console.log('name',this.siteName)
        this.$http.get('/dust/exceptiondata', { params: params }).then((response) => {
          // ä¿å­˜è¿”回的
          // this.tableData = response.data.data.rows;
          this.displayData = response.data.data.rows
          this.loading.tableLoading = false
          if (response.data.data.total == 0) {
            ElMessage('该时段无数据')
            this.isTableShow = false
            return
          }
          this.isTableShow = true
          this.total = response.data.data.total
        })
      },
      /**
       * description:将中国标准时间转为指定格式(该组件返回的标准时间的格式,所以必须的加这个函数)
       * @createTime:2023-08-17
       */
      giveTime(val) {
        this.beginTime = dayjs(val[0]).format('YYYY-MM-DD HH:mm:ss')
        this.endTime = dayjs(val[1]).format('YYYY-MM-DD HH:mm:ss')
      },
      // åŠŸèƒ½ï¼šè¡¨æ ¼é«˜åº¦æ ¹æ®å†…å®¹è‡ªé€‚åº”
      calTableHeight() {
        const h1 = this.$refs.h1.$el.offsetHeight
        const h2 = this.$refs.h2.$el.offsetHeight
        const h3 = this.$refs.h3.$el.offsetHeight
        const h4 = this.$refs.h4.$el.offsetHeight
        // å…¶ä¸­ä¸€ä¸ª40是盒子的总外边距
        this.tableHeight = `calc(100vh - ${h1}px - ${h2}px - ${h3}px - ${h4}px - 40px - var(--el-main-padding) * 2)`
      },
      // é¡µå¤§å°æ”¹å˜æ—¶è§¦å‘
      handleSizeChange(val) {
        this.pageSize = val
        // æ”¹å˜æ¯é¡µæ˜¾ç¤ºæ•°ç›®æ—¶è·³åˆ°å½“前页
        this.handleCurrentChange(1)
      },
      // é¡µå·æ”¹å˜æ—¶è§¦å‘
      /**
       * description:页号改变时触发
       * @param: å½“前页,标记位(0代表是点击‘查询’触发的,1代表时点击异常站点文本按钮触发的)
       * @createTime:2023-08-17
       * @returns:
       */
      handleCurrentChange(val) {
        // å°†å½“前页号给currentPage
        this.currentPage = val
        // é¡µé¢å˜åŒ–时调用 æŸ¥è¯¢æ•°æ®å‡½æ•°
        if (this.flag.originClick == 0) {
          this.handleSubmit()
        } else if (this.flag.originClick == 1) {
          const startIndex = (val - 1) * this.pageSize
          const endIndex = startIndex + this.pageSize
          this.displayData = this.tableData.slice(startIndex, endIndex)
        }
      },
      // è¡¨æ ¼åºå·é€’增
      indexMethod1(index) {
        return index + 1 + (this.currentPage - 1) * this.pageSize
      },
      // è¡¨æ ¼åºå·é€’增
      indexMethod2(index) {
        return index + 1
      }
    }
  }
  </script>
  <template>
    <div class="all-container">
      <el-row ref="h1">
        <el-col>
          <el-form :inline="true">
            <div class="head-container-text">
              <el-form-item>
                <AreaAndmonitorType></AreaAndmonitorType>
              </el-form-item>
              <el-form-item v-show="!showAll">
                <span class="site-text"> ç‚¹ä½åç§°:</span>
                <span> {{ this.siteName }}</span>
              </el-form-item>
              <el-form-item v-show="showAll">
                <DutyCompany @submitDutyCompanyValue="(n) => (form.dutyCompany = n)"> </DutyCompany>
              </el-form-item>
              <!-- <el-form-item v-show="showAll">
                <StreetInfo @submitStreetValue="(n) => (form.street = n)"> </StreetInfo>
              </el-form-item> -->
              <el-form-item>
                <TimeShortCuts timeType="day" @submit-time="giveTime" :beginAndEndTime="[beginTime,endTime]"></TimeShortCuts>
              </el-form-item>
              <el-form-item>
                <ButtonClick
                  content="风险评估"
                  type="warning"
                  color="rgb(12,104,165)"
                  :loading="loading.queryButton"
                  :havaIcon="false"
                  @do-search="handleSubmit"
                  ><img src="@/assets/exception/riskButton.png" height="24" class="img-button"
                /></ButtonClick>
              </el-form-item>
            </div>
          </el-form>
        </el-col>
      </el-row>
      <!-- æ—¶é—´æ‘˜è¦ -->
      <el-row class="head-describtion-text" ref="h2">
        <el-row>
          <span> é‡‘山区 {{ beginTime }} â€”— {{ endTime }} æ‰¬å°˜ç›‘测异常信息汇总</span>
        </el-row>
      </el-row>
      <!-- å¼‚常分析 -->
      <el-row ref="h3">
        <el-col>
          <el-card class="card-container">
            <template #header>
              <div class="card-header">异常分析</div>
            </template>
            <el-row :gutter="20">
              <el-col v-for="item in cardRow" :key="item.exceptionType" :span="item.span">
                <AnalysisCard
                  :site-name="item.siteName"
                  :exception-type="item.exceptionType"
                  :begin-time="beginTime"
                  :end-time="endTime"
                  :exception-name="item.exceptionName"
                  :site-num="item.siteNum"
                  :exception-num="item.exceptionNum"
                  :exception-all-num="exceptionAllNum"
                  :site-num-all="siteTotal"
                  :isNoDataStatus="item.isNoDataStatus"
                  :icon="item.iconSrc"
                  @get-abnormal-data-by-click="getAbnormalDataByClick"
                  class="card-row"
                >
                  >
                </AnalysisCard>
              </el-col>
            </el-row>
          </el-card>
        </el-col>
      </el-row>
      <el-button-group>
        <el-button color="#626aef" plain @click="isTableShow = true" v-show="!isTableShow">
          æ˜¾ç¤ºå¼‚常清单<el-icon class="i-ep-Arrow"><i-ep-ArrowUp /></el-icon>
        </el-button>
        <el-button color="#626aef" plain @click="isTableShow = false" v-show="isTableShow">
          éšè—å¼‚常清单<el-icon class="i-ep-Arrow"><i-ep-ArrowDown /></el-icon>
        </el-button>
      </el-button-group>
      <!-- è¡¨æ ¼ -->
      <el-row v-show="isTableShow">
        <el-col>
          <el-table
            ref="table"
            :data="displayData"
            :height="tableHeight"
            :highlight-current-row="true"
            size="default"
            v-loading="loading.tableLoading"
            border
          >
            <el-table-column
              type="index"
              label="序号"
              width="60px"
              align="center"
              fixed
              :index="indexMethod1"
            />
            <el-table-column prop="name" label="点位名称" show-overflow-tooltip />
            <el-table-column prop="mnCode" label="设备编码" align="center" show-overflow-tooltip />
            <el-table-column prop="exception" label="异常类型" align="center" show-overflow-tooltip />
            <el-table-column prop="region" label="区县" align="center" show-overflow-tooltip />
            <el-table-column prop="beginTime" label="开始时间" align="center" show-overflow-tooltip />
            <el-table-column prop="endTime" label="结束时间" align="center" show-overflow-tooltip />
            <el-table-column
              prop="typename"
              label="场景"
              align="center"
              width="82"
              show-overflow-tooltip
            />
            <el-table-column prop="address" label="地址" align="center" show-overflow-tooltip />
            <el-table-column prop="dutyCompany" label="运维商" align="center" show-overflow-tooltip />
            <el-table-column label="操作" align="center">
              <template #default="{ row }">
                <el-button type="primary" class="table-button" @click="showDialog(row)"
                  >查看详情</el-button
                >
              </template>
            </el-table-column>
          </el-table>
          <el-pagination
            ref="h4"
            background
            layout="total, sizes, prev, pager, next, jumper"
            v-model:current-page="currentPage"
            v-model:page-size="pageSize"
            :total="total"
            :page-sizes="[10, 20, 50, 100]"
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
          >
          </el-pagination>
        </el-col>
      </el-row>
      <CompDialogDetail   :row="tableCurrentRowData"  v-model="dialogTableVisible"/>
    </div>
  </template>
  <style lang="scss" scoped>
  .el-row {
    margin-left: 10px;
  }
  /* æ¡ä»¶æŸ¥è¯¢æ¨¡å—的样式 */
  .el-form {
    margin: 10px;
  }
  img {
    margin-right: 5px;
  }
  .head-container-search {
    float: right;
  }
  .head-describtion-text {
    justify-content: flex-end;
    margin-bottom: 2px;
    margin-right: 20px;
    font-size: 14px;
    color: gray;
  }
  .button-set {
    margin: 10px;
  }
  /* æ¡ä»¶æŸ¥è¯¢æ¨¡å—结束 */
  /* å¼‚常分析模块的样式 */
  .card-text1 {
    /* é»‘体的异常名字部分 */
    margin: 10px;
  }
  .card-text1 + div {
    /* é»‘体的异常名字下面的 */
    margin: 12px;
  }
  .card-exception-buttom {
    /* å¼‚常站点文本按钮区域 */
    padding: 11px;
  }
  .card-header {
    margin-left: 5px;
    font-size: 18px;
    font-weight: bold;
  }
  .card-content-unnormal {
    min-height: 200px;
    border: 2px solid #ffcf8b;
    border-radius: 20px;
  }
  .card-content-normal {
    min-height: 200px;
    border: 2px solid red;
    border-radius: 20px;
  }
  .card-header-text {
    font-size: 16px;
    font-weight: bold;
    margin-top: 4px;
    margin-left: 4px;
  }
  .card-content-text {
    white-space: nowrap;
  }
  .card-exceptionname-text1 {
    /*  å¼‚常站点占比 */
    font-size: 14px;
    white-space: nowrap;
  }
  .card-exceptionname-text2 {
    /* å¼‚常数占比的外边距 */
    font-size: 14px;
    white-space: nowrap;
  }
  .text-blank {
    /* é€—号 */
    margin-right: 10px;
    color: #000000;
  }
  .card-row {
    margin-bottom: 10px;
  }
  /* å¼‚常分析模块结束 */
  /* éšè—è¡¨æ ¼æŒ‰é’®ç»„样式 */
  .el-button-group {
    margin: 10px 0px 10px 10px;
  }
  .i-ep-Arrow {
    margin-left: 6px;
    margin-bottom: 2px;
    font-size: 1.2em;
  }
  /* éšè—è¡¨æ ¼æŒ‰é’®ç»„样式结束 */
  /* è¡¨æ ¼æ¨¡å—的样式 */
  .el-table {
    color: #333333;
  }
  /* è¡¨æ ¼æ¨¡å—结束 */
  /* æŸ¥çœ‹è¯¦æƒ…对话框模块的样式 */
  .diag-head {
    /* å¯¹è¯æ¡†å¤´éƒ¨åŒºåŸŸ */
    min-height: 200px;
  }
  .diag-head-text1 {
    /* å¯¹è¯æ¡†å¤´éƒ¨çš„属性字段加粗 */
    font-weight: bold;
  }
  .diag-head-text > div {
    /*  å¯¹è¯æ¡†å¼‚常时间段 */
    margin-top: 15px;
  }
  .diag-head-text {
    margin: 10px;
    padding: 10px;
    background: linear-gradient(90deg, #00c9ff 0%, #92fe9d 100%);
    border: 2px solid #7bc0fc;
  }
  .chart-jump-button {
    display: flex;
    justify-content: right;
  }
  .mx-1 {
    /* position: absolute;
    left: 10px;
    bottom: 10px; */
    justify-content: flex-start;
  }
  .dialog-footer{
    display: flex;
  }
  .dialog-footer-text {
    justify-content: flex-end;
    margin-left: auto;
    font-size: 14px;
    /* color: #333333; */
  }
  /* æŸ¥çœ‹è¯¦æƒ…对话框模块结束 */
</style>
src/views/exception/components/CompDialogDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,350 @@
<!-- ç‚¹å‡» â€æŸ¥çœ‹è¯¦ç»†â€ çš„对话框 -->
<!-- ä¸Šä¸€æ¡ä¸‹ä¸€æ¡ç”±å­ç»„件传递给父组件,父组件监听信号 -->
<script>
import exceptionOption from '@/utils/chartFunction/exceptionOption.js'
import index from '@/utils/exception_common_function/index.js'
import DustLineChart from '@/views/exception/components/DustLineChart.vue'
import historyApi from '@/api/historyApi.js'
export default {
  props: {
    // è¡¨æ ¼çš„一行数据
    row: {
      type: Object,
      default: {}
    },
    // å¯¹è¯æ¡†æ˜¯å¦æ˜¾ç¤º
    dialogTableVisible: {
      type: Boolean,
      default: false
    }
  },
  components: {
    DustLineChart
  },
  emits: ['update:dialogTableVisible'],
  computed: {
    dialogTableVisible: {
      get() {
        return this.dialogTableVisible
      },
      set(value) {
        this.$emit('update:dialogTableVisible', value)
      }
    }
  },
  watch: {
    row: {
      handler(newValue) {
        this.display()
      },
      deep: true
    }
  },
  data() {
    return {
      // å¼‚常表格的数据
      historyData: [],
      //  æŠ˜çº¿å›¾é…ç½®é¡¹
      lineChartOption: {},
      loading: {
        // ä¸Šä¸€æ¡æŒ‰é’®
        preButton: false,
        // ä¸‹ä¸€æ¡æŒ‰é’®
        afterButton: false,
        // æŠ˜çº¿å›¾
        lineChart: false
      },
      // æ ‡è®°ä½
      flag: {
        // æ•°æ®åŠ è½½æ—¶ ä¸Šä¸‹æ¡æŒ‰é’®ä¸èƒ½å†ç‚¹å‡»
        banTouch: 0,
      },
      isPreCantouch:false,
      isNextCantouch:false
    }
  },
  mounted() {},
  methods: {
    display() {
      // è¡¨æ ¼æ•°æ®
      this.getExceptionTableDataByCurrenrRow(this.row)
      // æŠ˜çº¿å›¾æ•°æ®
      this.setLineChart(this.row)
    },
    /**
     * å¾—到异常表格的数据
     * @param: ç‚¹ä½åç§°ï¼Œå¼‚常开始时间,异常结束时间
     * @returns:
     */
    async getExceptionTableDataByCurrenrRow({ name, beginTime, endTime, exceptionType }) {
      if (!name || !beginTime || !endTime) {
        return
      }
      // æ•°æ®ç¼ºå¤±å¼‚常时,构造表格数据
      if (this.exceptionType == '0') {
        this.setOfflineTbleData(this.row)
        return
      }
      // æ ¹æ®å¼‚常的点位名称、开始、结束时间,查询该时段的颗粒物浓度数据
      const response = await historyApi.queryHistoryData({
        siteName: name,
        beginTime: beginTime,
        endTime: endTime
      })
      //  å¼‚常表格得到数据
      this.historyData = response.data.data
    },
    /* ***********************************************************************************  æŠ˜çº¿å›¾ */
    /**
     * è®¾ç½®æŠ˜çº¿å›¾
     * @param:
     * @returns:
     */
    async setLineChart({ beginTime, endTime }) {
      // è®¡ç®—异常区间的前后45分钟
      const beforeAndAfterTime = index.before45AndAfter45(beginTime, endTime)
      // è¯·æ±‚整段时间段的颗粒物浓度数据
      // å¯¹è¯·æ±‚回的数据进行划分
      const chartParams = await this.organizeLineChartsOptionParams(beforeAndAfterTime, this.row)
      this.lineChartOption = exceptionOption.setExceptionChartOption(chartParams)
    },
    /**
     * æž„建折线图的配置项的参数
     * @param: å¼‚常区间前后数据时间点, è¡¨æ ¼å½“前行数据
     * @returns:
     */
    async organizeLineChartsOptionParams(
      time_point,
      { name, beginTime, endTime, exception, exceptionType }
    ) {
      // æŠ˜çº¿å›¾åŠ è½½ä¸­æ•ˆæžœ
      this.loading.lineChart = true
      // è¯·æ±‚整段颗粒物浓度的数据
      const response = await historyApi.queryHistoryData({
        siteName: name,
        beginTime: time_point[0],
        endTime: time_point[3]
      })
      // å¼‚常区间数据加上前后45分钟数据
      const allTimeData = response.data.data
      // x轴日期时间
      let xData = []
      // yè½´ è¶…标油烟浓度
      let yData = []
      let timeAndValue = {}
      // ä»Žæ·»åŠ äº†é¦–ä½åŒºé—´çš„å¼€å§‹å’Œç»“æŸæ—¶é—´è¿›è¡ŒéåŽ† ä¿è¯æ—¶é—´ä»¥15分钟为间隔
      timeAndValue = index.keepContinuousByEachFiftyMinutes(
        time_point[0],
        time_point[3],
        allTimeData
      )
      xData = timeAndValue['xAxis']
      yData = timeAndValue['yAxis']
      // æå–异常起始时间点在整个区间内的数据索引
      let beginIndex = xData.findIndex((item) => item === beginTime)
      let endIndex = xData.findIndex((item) => item === endTime)
      this.flag.banTouch = 0
      this.loading.lineChart = false
      // è¿”回折线图的配置项的参数
      return {
        xData,
        yData,
        exceptionBeginTime: beginTime,
        exceptionEndTime: endTime,
        beginIndex,
        endIndex,
        exceptionName: exception,
        areaObj: '',
        lineColor: '',
        exceptionType
      }
    },
    /**
     * description:数据缺失异常时,设置的表格数据
     */
    setOfflineTbleData({ name, mnCode, dutyCompany, beginTime, endTime }) {
      // æ— æ•°æ®æ—¶çš„æ—¶é—´æ•°ç»„ æ—¶é—´ç›¸å·®15分钟
      const abnormalTimeTenMinute = index.descFiftyTime(beginTime, endTime)
      //  å¯¹è¡¨æ ¼æ•°æ®è¿›è¡Œé‡æž„
      this.historyData = []
      for (let i = 0; i < abnormalTimeTenMinute.length; i++) {
        this.historyData.push({
          name: name,
          mnCode: mnCode,
          dutyCompany: dutyCompany,
          lst: abnormalTimeTenMinute[i],
          yData: ''
        })
      }
    }
  }
}
</script>
<template>
  <el-dialog
    class="exception-dialog"
    v-model="dialogTableVisible"
    draggable
    align-center
    height="700px"
    width="700px"
  >
    <!-- å¤´ -->
    <template #header>
      <div class="diag-head">
        <div class="diag-head-text">
          <div><span class="diag-head-text1">站点名称:</span>{{ row.name }}</div>
          <div><span class="diag-head-text1">设备编号:</span>{{ row.mnCode }}</div>
          <div><span class="diag-head-text1">运维商:</span>{{ row.dutyCompany }}</div>
          <div>
            <span class="diag-head-text1">异常时间段:</span>{{ row.beginTime }} ~
            {{ row.endTime }}
          </div>
        </div>
      </div>
      <!-- <div class="chart-jump-button">
        <el-button
          type="danger"
          :loading="loading.preButton"
          :disabled="isPreCantouch || flag.banTouch"
          @click="getNextRowData"
          >上条异常</el-button
        >
        <el-button
          type="danger"
          :loading="loading.afterButton"
          :disabled="isNextCantouch || flag.banTouch"
          @click="getPreviousRowData"
          >下条异常</el-button
        >
      </div> -->
    </template>
    <!-- å›¾å½¢ -->
    <DustLineChart :option="lineChartOption" v-loading="loading.lineChart"></DustLineChart>
    <!-- è¡¨æ ¼ -->
    <div>
      <el-table :data="historyData" size="default" height="200" border>
        <el-table-column
          type="index"
          label="序号"
          width="60px"
          align="center"
          fixed
        ></el-table-column>
        <el-table-column prop="lst" label="采集时间" align="center" show-overflow-tooltip />
        <el-table-column prop="yData" label="TSP(mg/m³)" align="center" show-overflow-tooltip />
        <el-table-column prop="flag" label="数据标识" align="center" show-overflow-tooltip />
      </el-table>
    </div>
    <template #footer>
      <div class="dialog-footer">
        <el-tag type="success" class="mx-1" effect="dark" round
          ><span class="table-line-lable" v-show="row.exceptionType == '0'">缺失数据: </span>
          <span
            v-show="
              row.exceptionType == '1' ||
              row.exceptionType == '2' ||
              row.exceptionType == '3' ||
              row.exceptionType == '4' ||
              row.exceptionType == '5' ||
              row.exceptionType == '6' ||
              row.exceptionType == '7' ||
              row.exceptionType == '8'
            "
            >异常数据:</span
          >
          <span class="table-line-num">{{ historyData.length }}条</span>
          <span v-show="row.exceptionType == '0'"> (逻辑计算)</span>
        </el-tag>
        <el-text v-show="row.exceptionType == '8'" type="warning" class="dialog-footer-text"
          >数据标识A为数据长期缺失,系统自动补全</el-text
        >
      </div>
    </template>
  </el-dialog>
</template>
<style scoped>
/* æŸ¥çœ‹è¯¦æƒ…对话框模块的样式 */
.diag-head {
  /* å¯¹è¯æ¡†å¤´éƒ¨åŒºåŸŸ */
  min-height: 200px;
}
.diag-head-text1 {
  /* å¯¹è¯æ¡†å¤´éƒ¨çš„属性字段加粗 */
  font-weight: bold;
}
.diag-head-text > div {
  /*  å¯¹è¯æ¡†å¼‚常时间段 */
  margin-top: 15px;
}
.diag-head-text {
  margin: 10px;
  padding: 10px;
  background: linear-gradient(90deg, #00c9ff 0%, #92fe9d 100%);
  border: 2px solid #7bc0fc;
}
.chart-jump-button {
  display: flex;
  justify-content: right;
}
.mx-1 {
  /* position: absolute;
  left: 10px;
  bottom: 10px; */
  justify-content: flex-start;
}
.dialog-footer {
  display: flex;
}
.dialog-footer-text {
  justify-content: flex-end;
  margin-left: auto;
  font-size: 14px;
  /* color: #333333; */
}
/* æŸ¥çœ‹è¯¦æƒ…对话框模块结束 */
</style>
src/views/exception/components/CompFlightInspection.vue
@@ -176,7 +176,7 @@
      // æ ‡è®°ä½
      flag: {
        // åŠ è½½æ—¶ ä¸Šä¸‹æ¡æŒ‰é’®ä¸èƒ½å†ç‚¹å‡»
        // æ•°æ®åŠ è½½æ—¶ ä¸Šä¸‹æ¡æŒ‰é’®ä¸èƒ½å†ç‚¹å‡»
        banTouch: 0,
        // 0代表分页,1代表不分页
        originClick: 0
@@ -549,7 +549,6 @@
        let endIndex = dateList.findIndex((item) => item === exceptionET)
        // è®¾ç½®æŠ˜çº¿å›¾é…ç½®é¡¹
        // this.reSetChart(dateList, dustValue, exceptionBT, exceptionET, startIndex, endIndex)
        this.dialog.option = exceptionOption.setExceptionChartOption(
          dateList,
          dustValue,
@@ -1363,6 +1362,8 @@
}
/* è¡¨æ ¼æ¨¡å—结束 */
/* æŸ¥çœ‹è¯¦æƒ…对话框模块的样式 */
.diag-head {
src/views/exception/components/DustLineChart.vue
@@ -6,11 +6,10 @@
 -->
 <template>
       <div  id="main" class="line-chart-exception"></div>
  </template>
  
  <script>
  import * as echarts from 'echarts';
import * as echarts from 'echarts'
  
  export default {
    props: {
@@ -19,39 +18,32 @@
        default(){
          return {}
        }
      },
      isOpenDialog:{
        type:Boolean
      },
    }
    },
    data() {
      return {
        chart: null
      };
    }
    },
    mounted() {
       // èŽ·å–é¡µé¢å®½åº¦çš„ä¸€åŠ
      this.initChart();
    this.initChart()
      this.chart.clear
      this.chart.setOption(this.option,true)
      window.addEventListener('resize', this.resizeChart);
    window.addEventListener('resize', this.resizeChart)
    },
    watch: {
      option(){
        // this.chart.clear
        // ä¸ä¸Žä¹‹å‰çš„option进行合并
        this.chart.setOption(this.option,true)
      },
      isOpenDialog(){
        window.addEventListener('resize', this.resizeChart);
      },
    }
    },
 
    methods: {
      initChart() {
        // åˆ›å»ºecharts实例
        this.chart = echarts.init(document.getElementById('main'));
      this.chart = echarts.init(document.getElementById('main'))
        // å®šä¹‰å›¾è¡¨çš„配置项和数据
        const option = {
          grid: {
@@ -74,10 +66,10 @@
          },
          xAxis: {
            type: 'time',
            data: [],
          data: []
          },
          yAxis: {
            type: 'value',
          type: 'value'
          },
          series: [
            {
@@ -86,23 +78,22 @@
              data: []
            }
          ]
        };
      }
        // ä½¿ç”¨åˆšæŒ‡å®šçš„配置项和数据显示图表
        this.chart.setOption(option, true);
      this.chart.setOption(option, true)
      },
  
      // è·Ÿé¡µé¢å“åº”式变化
      resizeChart() {
        this.$nextTick(() => {
        if (this.chart) {
          this.chart.resize();
          this.chart.resize()
        }
      });
      })
      }
    }
  };
}
  </script>
  
  <style scoped>
  .line-chart-exception {
@@ -112,4 +103,3 @@
    min-width: 500px;
  }
  </style>
vite.config.js
@@ -45,5 +45,8 @@
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server: {
    host: '0.0.0.0'
 }
 
})