| | |
| | | <div class="item-t">设备时长</div> |
| | | <div class="item-c"> |
| | | <el-table |
| | | :data="timeData" |
| | | :data="facityWarnTable" |
| | | :header-cell-style="headerStyle" |
| | | :cell-style="rowStyle" |
| | | style="height: 100%;" |
| | | > |
| | | <el-table-column prop="type" label="异常监测点" /> |
| | | <el-table-column prop="device" label="异常设备" /> |
| | | <el-table-column prop="address" label="报警内容" min-width="150" /> |
| | | <el-table-column prop="time" label="报警时长" /> |
| | | <el-table-column prop="pointName" label="异常监测点" /> |
| | | <el-table-column prop="facilityName" label="异常设备" /> |
| | | <el-table-column prop="description" label="报警内容" /> |
| | | <el-table-column prop="alarmTime" label="报警时长" /> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="title-left">风机管理</div> |
| | | <div class="title-right"> |
| | | <el-select |
| | | v-model="value" |
| | | v-model="typeValue.fengji" |
| | | size="small" |
| | | style="width: 8rem" |
| | | @change="getFanList" |
| | | > |
| | | <el-option |
| | | v-for="item in options" |
| | | v-for="item in fengjiOption" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | |
| | | </div> |
| | | <div class="item-c"> |
| | | <div class="fengji"> |
| | | <div class="fengjiItem"> |
| | | <div class="fengji-title">重庆市丰都县东麓国际小区4栋附三层风机</div> |
| | | <div class="fengjiItem" v-for="(item, index) in fengjiList" :key="index"> |
| | | <div class="fengji-title">{{ item.pointName }}</div> |
| | | <div class="fengji-status"> |
| | | <img src="@/assets/images/screen/fengji.png" alt="" /> |
| | | <span>正在运行</span> |
| | | </div> |
| | | </div> |
| | | <div class="fengjiItem"> |
| | | <div class="fengji-title">重庆市丰都县东麓国际小区4栋附三层风机</div> |
| | | <div class="fengji-status"> |
| | | <img src="@/assets/images/screen/fengji.png" alt="" /> |
| | | <span>正在运行</span> |
| | | </div> |
| | | </div> |
| | | <div class="fengjiItem"> |
| | | <div class="fengji-title">重庆市丰都县东麓国际小区4栋附三层风机</div> |
| | | <div class="fengji-status"> |
| | | <img src="@/assets/images/screen/fengji.png" alt="" /> |
| | | <span>正在运行</span> |
| | | </div> |
| | | </div> |
| | | <div class="fengjiItem"> |
| | | <div class="fengji-title">重庆市丰都县东麓国际小区4栋附三层风机</div> |
| | | <div class="fengji-status"> |
| | | <img src="@/assets/images/screen/fengji.png" alt="" /> |
| | | <span>正在运行</span> |
| | | </div> |
| | | </div> |
| | | <div class="fengjiItem"> |
| | | <div class="fengji-title">重庆市丰都县东麓国际小区4栋附三层风机</div> |
| | | <div class="fengji-status"> |
| | | <img src="@/assets/images/screen/fengji.png" alt="" /> |
| | | <span>正在运行</span> |
| | | </div> |
| | | </div> |
| | | <div class="fengjiItem"> |
| | | <div class="fengji-title">重庆市丰都县东麓国际小区4栋附三层风机</div> |
| | | <div class="fengji-status"> |
| | | <img src="@/assets/images/screen/fengji.png" alt="" /> |
| | | <span>正在运行</span> |
| | | </div> |
| | | </div> |
| | | <div class="fengjiItem"> |
| | | <div class="fengji-title">重庆市丰都县东麓国际小区4栋附三层风机</div> |
| | | <div class="fengji-status"> |
| | | <img src="@/assets/images/screen/fengji.png" alt="" /> |
| | | <span>正在运行</span> |
| | | <img :class="{run: item.facilityFanState === 1}" src="@/assets/images/screen/fengji.png" alt="" /> |
| | | <span v-if="item.facilityFanState === 0">停止</span> |
| | | <span v-else-if="item.facilityFanState === 1">运行中</span> |
| | | <span v-else-if="item.facilityFanState === 2">一级报警</span> |
| | | <span v-else-if="item.facilityFanState === 3">二级报警</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="item-t">工单处理</div> |
| | | <div class="item-c"> |
| | | <el-table |
| | | :data="timeData" |
| | | :data="ordertable" |
| | | :header-cell-style="headerStyle" |
| | | :cell-style="rowStyle" |
| | | style="height: 100%;" |
| | | > |
| | | <el-table-column prop="type" label="工单号" /> |
| | | <el-table-column prop="device" label="工单类型" /> |
| | | <el-table-column prop="device" label="上报时间" /> |
| | | <el-table-column prop="time" label="上报人" /> |
| | | <el-table-column prop="code" label="工单号" /> |
| | | <el-table-column prop="typeView" label="工单类型" /> |
| | | <el-table-column prop="createTimeView" label="上报时间" /> |
| | | <el-table-column prop="createUserName" label="上报人" /> |
| | | <el-table-column prop="address" label="所属地址" /> |
| | | <el-table-column prop="status" label="工单状态"> |
| | | <div>已处理</div> |
| | | <el-table-column label="工单状态"> |
| | | <template #default="scoped"> |
| | | <div v-if="scoped.row.executeState === 200" style="color: #36fc0e;">已处理</div> |
| | | <div v-else style="color: #ccc;">未处理</div> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | |
| | | <div class="title-left">实时数据</div> |
| | | <div class="title-right"> |
| | | <el-select |
| | | v-model="value" |
| | | v-model="typeValue.pointId" |
| | | size="small" |
| | | style="width: 8rem" |
| | | @change="getNewData" |
| | | > |
| | | <el-option |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | v-for="item in pointList" |
| | | :key="item.id" |
| | | :label="item.pointName" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | <el-select |
| | | v-model="value" |
| | | <el-select |
| | | v-model="typeValue.facilityState" |
| | | size="small" |
| | | style="width: 8rem" |
| | | @change="getNewData" |
| | | > |
| | | <el-option |
| | | v-for="item in options" |
| | | v-for="item in fengjiOption" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | |
| | | </div> |
| | | <div class="item-c"> |
| | | <div class="data-list"> |
| | | <dataItem /> |
| | | <template v-for="(item, index) in newDataList" :key="index"> |
| | | <dataItem :item="item" /> |
| | | </template> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="item-t">风机状态</div> |
| | | <div class="item-c"> |
| | | <el-table |
| | | :data="timeData" |
| | | :data="fengjiStatusTable" |
| | | :header-cell-style="headerStyle" |
| | | :cell-style="rowStyle" |
| | | style="height: 100%;" |
| | | > |
| | | <el-table-column prop="type" label="风机编号" /> |
| | | <el-table-column prop="device" label="单次运行时长" /> |
| | | <el-table-column prop="address" label="运行地址" /> |
| | | <el-table-column prop="time" label="总运行时长" /> |
| | | <el-table-column prop="facilityId" label="风机编号" /> |
| | | <el-table-column prop="runTimeString" label="单次运行时长" /> |
| | | <el-table-column prop="pointName" label="运行地址" /> |
| | | <el-table-column prop="sumTimeString" label="总运行时长" /> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="item-t">设备报警</div> |
| | | <div class="item-c"> |
| | | <el-table |
| | | :data="timeData" |
| | | :data="warnRecordTable" |
| | | :header-cell-style="headerStyle" |
| | | :cell-style="rowStyle" |
| | | style="height: 100%;" |
| | | > |
| | | <el-table-column prop="type" label="设备编号" /> |
| | | <el-table-column prop="device" label="报警类型" /> |
| | | <el-table-column prop="facilityCode" label="设备编号" /> |
| | | <el-table-column prop="alarmTypeView" label="报警类型" /> |
| | | <el-table-column prop="address" label="报警地址" /> |
| | | <el-table-column prop="time" label="报警时间" /> |
| | | <el-table-column prop="latestAlarmTime" label="报警时间" /> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { onMounted } from 'vue'; |
| | | import { onMounted, reactive } from 'vue'; |
| | | import dataItem from './components/dataItem.vue' |
| | | import * as echarts from 'echarts'; |
| | | import { getOrder, getFanFacity, getFacityData, getFacityRunTime, getFacityWarn, getFacityStatus, getPointStatic } from '@/api/screen/device' |
| | | import { getWarnRecord } from '@/api/screen/data' |
| | | import pointApi from "@/api/facility/point"; |
| | | |
| | | const timeData = ref([ |
| | | { type: '甲烷浓度异常', device: '风机', address: '重庆市丰都县龙城大道435号', time: '2.9小时' }, |
| | | { type: '甲烷浓度异常', device: '风机', address: '重庆市丰都县龙城大道435号', time: '2.9小时' }, |
| | | { type: '甲烷浓度异常', device: '风机', address: '重庆市丰都县龙城大道435号', time: '2.9小时' }, |
| | | ]) |
| | | const facityWarnTable = ref([]) |
| | | const fengjiList = ref([]) |
| | | const ordertable = ref([]) |
| | | const facityStatus = ref([]) |
| | | const newDataList = ref([]) |
| | | const lineChartList = ref([]) |
| | | const fengjiStatusTable = ref([]) |
| | | const warnRecordTable = ref([]) |
| | | |
| | | const typeValue = reactive({ |
| | | fengji: 1, |
| | | pointId: '', |
| | | facilityState: 1, |
| | | }) |
| | | const fengjiOption = [ |
| | | {label: '停止', value: 0}, |
| | | {label: '运行中', value: 1}, |
| | | {label: '一级报警', value: 2}, |
| | | {label: '二级报警', value: 3} |
| | | ] |
| | | const pointList = ref([]) |
| | | |
| | | const headerStyle = { |
| | | "background-color": '#041025 !important' |
| | |
| | | "background-color": '#081C3F !important' |
| | | } |
| | | |
| | | const value = ref('') |
| | | const options = [ |
| | | { |
| | | value: 1, |
| | | label: 'Option1', |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: 'Option2', |
| | | } |
| | | ] |
| | | const statusRef = ref() |
| | | const moniterRef = ref() |
| | | let statusCharts = null |
| | | let moniterCharts = null |
| | | |
| | | const setStatusCharts = () => { |
| | | if(statusRef.value){ |
| | | statusCharts = echarts.init(statusRef.value) |
| | | |
| | | const option = { |
| | | const option = { |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | series: [ |
| | | { |
| | | name: 'Access From', |
| | | type: 'pie', |
| | | radius: ['40%', '70%'], |
| | | data: [ |
| | | { value: 1048, name: 'Search Engine' }, |
| | | { value: 735, name: 'Direct' }, |
| | | { value: 580, name: 'Email' }, |
| | | { value: 484, name: 'Union Ads' }, |
| | | { value: 300, name: 'Video Ads' } |
| | | ] |
| | | type: 'pie', |
| | | radius: ['40%', '70%'], |
| | | data: facityStatus.value |
| | | } |
| | | ] |
| | | }; |
| | | |
| | | statusCharts.setOption(option) |
| | | } |
| | | } |
| | | |
| | | const setMoniterCharts = () => { |
| | | if(moniterRef.value){ |
| | | moniterCharts = echarts.init(moniterRef.value) |
| | | |
| | | const option = { |
| | | let xdata = [] |
| | | let sdata = [] |
| | | lineChartList.value.forEach(el => { |
| | | xdata.push(el.pointName) |
| | | sdata.push(el.count) |
| | | }) |
| | | const option = { |
| | | tooltip: { |
| | | trigger: 'item' |
| | | trigger: 'axis' |
| | | }, |
| | | dataZoom: [ |
| | | { |
| | | id: 'dataZoomX', |
| | | type: 'slider', |
| | | xAxisIndex: [0], |
| | | filterMode: 'filter' |
| | | } |
| | | ], |
| | | xAxis: { |
| | | type: 'category', |
| | | boundaryGap: false, |
| | | data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] |
| | | data: xdata |
| | | }, |
| | | yAxis: { |
| | | type: 'value' |
| | | }, |
| | | series: [ |
| | | { |
| | | data: [820, 932, 901, 934, 1290, 1330, 1320], |
| | | data: sdata, |
| | | type: 'line', |
| | | areaStyle: { |
| | | color: { |
| | |
| | | }; |
| | | |
| | | moniterCharts.setOption(option) |
| | | } |
| | | |
| | | // 获取监控点列表 |
| | | const getPointData = () => { |
| | | const searchData = { |
| | | limit: 100, |
| | | page: 1 |
| | | } |
| | | return pointApi().search(searchData).then((res) => { |
| | | pointList.value = res.data.list |
| | | typeValue.pointId = res.data.list[0].id |
| | | }) |
| | | } |
| | | |
| | | // 设备报警时长 |
| | | const getFacityTimelong = () => { |
| | | getFacityWarn().then(res => { |
| | | facityWarnTable.value = res.data |
| | | }) |
| | | } |
| | | |
| | | // 获取工单 |
| | | const getOrderList = () => { |
| | | getOrder().then(res => { |
| | | ordertable.value = res.data |
| | | }) |
| | | } |
| | | |
| | | // 风机管理 |
| | | const getFanList = () => { |
| | | getFanFacity({ type: typeValue.fengji }).then(res => { |
| | | fengjiList.value = res.data |
| | | }) |
| | | } |
| | | |
| | | // 设备状态 |
| | | const getStatus = () => { |
| | | getFacityStatus().then(res => { |
| | | facityStatus.value = res.data.map(item => { |
| | | return { |
| | | name: item.typeName, |
| | | value: Number(item.value) |
| | | } |
| | | }) |
| | | setStatusCharts() |
| | | }) |
| | | } |
| | | |
| | | // 实时数据 |
| | | const getNewData = () => { |
| | | const searchData = { |
| | | pointId: typeValue.pointId, |
| | | facilityState: typeValue.facilityState |
| | | } |
| | | getFacityData(searchData).then(res => { |
| | | newDataList.value = res.data |
| | | }) |
| | | } |
| | | |
| | | // 监控统计 |
| | | const getPoint = () => { |
| | | getPointStatic().then(res => { |
| | | lineChartList.value = res.data |
| | | setMoniterCharts() |
| | | }) |
| | | } |
| | | |
| | | |
| | | // 风机状态 |
| | | const getFanStatus = () => { |
| | | getFacityRunTime().then(res => { |
| | | fengjiStatusTable.value = res.data |
| | | }) |
| | | } |
| | | |
| | | // 设备报警 |
| | | const getFacityWarnRecord = () => { |
| | | getWarnRecord().then(res => { |
| | | warnRecordTable.value = res.data |
| | | }) |
| | | } |
| | | |
| | | const init = async () => { |
| | | if(statusRef.value){ |
| | | statusCharts = echarts.init(statusRef.value) |
| | | } |
| | | if(moniterRef.value){ |
| | | moniterCharts = echarts.init(moniterRef.value) |
| | | } |
| | | await getPointData() |
| | | getFacityTimelong() |
| | | getOrderList() |
| | | getFanList() |
| | | getStatus() |
| | | getNewData() |
| | | getPoint() |
| | | getFanStatus() |
| | | getFacityWarnRecord() |
| | | } |
| | | |
| | | |
| | | onMounted(() => { |
| | | setStatusCharts() |
| | | setMoniterCharts() |
| | | init() |
| | | }) |
| | | </script> |
| | | |
| | |
| | | width: 2rem; |
| | | height: 2rem; |
| | | margin-right: 2rem; |
| | | } |
| | | .run{ |
| | | animation: rotateAnimation 1s linear 0s infinite; |
| | | } |
| | | } |
| | |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | .data-list{ |
| | | height: 100%; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 0.7rem; |
| | | overflow-y: scroll; |
| | | &::-webkit-scrollbar{ |
| | | display: none; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |