|
@@ -263,27 +263,112 @@
|
|
|
>
|
|
|
</div>
|
|
|
<div class="container-group container-group-l">
|
|
|
- <template v-if="!loading">
|
|
|
- <div class="container-item" v-for="(data, index) in rightColumns" :key="index">
|
|
|
- <div class="item-icon">
|
|
|
- <!-- <SvgIcon class="icon-style" size="18" name="temperature" /> -->
|
|
|
- <!-- <StarOutlined /> -->
|
|
|
- <CaretRightOutlined class="icon-style" />
|
|
|
- </div>
|
|
|
- <div class="item-name">{{ data.title }}</div>
|
|
|
- <div v-if="data.dataIndex.startsWith('Fan')">
|
|
|
- <div class="item-value" v-if="dataMonitorRowIndex == 0">{{
|
|
|
- selectData[data.dataIndex.replace('Fan', 'Fan1')] ? selectData[data.dataIndex.replace('Fan', 'Fan1')] : '-'
|
|
|
- }}</div>
|
|
|
- <div class="item-value" v-if="dataMonitorRowIndex == 1">{{
|
|
|
- selectData[data.dataIndex.replace('Fan', 'Fan2')] ? selectData[data.dataIndex.replace('Fan', 'Fan2')] : '-'
|
|
|
- }}</div>
|
|
|
- </div>
|
|
|
- <div v-else>
|
|
|
- <div class="item-value">{{ selectData[data.dataIndex] ? selectData[data.dataIndex] : '-' }}</div>
|
|
|
- </div>
|
|
|
+ <!-- <div class="warning-header">
|
|
|
+ <div class="header-item">
|
|
|
+ <div class="header-title"> 未处理数</div>
|
|
|
+ <div class="header-value">{{ selectData['warnLogNotOkCount'] }} </div>
|
|
|
</div>
|
|
|
- </template>
|
|
|
+ </div> -->
|
|
|
+
|
|
|
+ <div class="warning-group">
|
|
|
+ <template v-if="deviceType">
|
|
|
+ <div v-for="(state, index) in rightColumns" :key="index">
|
|
|
+ <template
|
|
|
+ v-if="selectData[state.dataIndex.replace('Fan', 'Fan1')] == 0.0 || selectData[state.dataIndex.replace('Fan', 'Fan1')] > 1"
|
|
|
+ >
|
|
|
+ <div class="container-item">
|
|
|
+ <div class="item-icon">
|
|
|
+ <CaretRightOutlined class="icon-style" />
|
|
|
+ </div>
|
|
|
+ <div class="item-name">{{ state.title }}</div>
|
|
|
+ <div v-if="state.dataIndex.startsWith('Fan')">
|
|
|
+ <div class="item-value" v-if="dataMonitorRowIndex == 0">{{
|
|
|
+ selectData[state.dataIndex.replace('Fan', 'Fan1')] ? selectData[state.dataIndex.replace('Fan', 'Fan1')] : '-'
|
|
|
+ }}</div>
|
|
|
+ <div class="item-value" v-if="dataMonitorRowIndex == 1">{{
|
|
|
+ selectData[state.dataIndex.replace('Fan', 'Fan2')] ? selectData[state.dataIndex.replace('Fan', 'Fan2')] : '-'
|
|
|
+ }}</div>
|
|
|
+ </div>
|
|
|
+ <div v-else>
|
|
|
+ <div class="item-value">{{ selectData[state.dataIndex] ? selectData[state.dataIndex] : '-' }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div class="warning-item">
|
|
|
+ <div class="item-name"> <div class="icon"></div> {{ state.title }} </div>
|
|
|
+ <div v-if="state.dataIndex.startsWith('Fan')">
|
|
|
+ <div class="signal-item" v-if="warningMonitorRowIndex == 0">
|
|
|
+ <template v-if="selectData['Fan1StartStatus'] == '0' && globalConfig?.simulatedPassword">
|
|
|
+ <div class="signal-round signal-round-gry"></div>
|
|
|
+ <div class="vent-margin-l-8">无状态</div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div
|
|
|
+ class="signal-round"
|
|
|
+ :class="{
|
|
|
+ 'signal-round-run': selectData[state.dataIndex.replace('Fan', 'Fan1')] == '0',
|
|
|
+ 'signal-round-warning':
|
|
|
+ selectData[state.dataIndex.replace('Fan', 'Fan1')] !== undefined &&
|
|
|
+ selectData[state.dataIndex.replace('Fan', 'Fan1')] == '1',
|
|
|
+ 'signal-round-gry': selectData[state.dataIndex.replace('Fan', 'Fan1')] === undefined,
|
|
|
+ }"
|
|
|
+ ></div>
|
|
|
+ <div class="vent-margin-l-8">{{
|
|
|
+ selectData[state.dataIndex.replace('Fan', 'Fan1')] === undefined
|
|
|
+ ? '无状态'
|
|
|
+ : selectData[state.dataIndex.replace('Fan', 'Fan1')] == '0'
|
|
|
+ ? '正常'
|
|
|
+ : '异常'
|
|
|
+ }}</div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ <div class="signal-item" v-if="warningMonitorRowIndex == 1">
|
|
|
+ <template v-if="selectData['Fan2StartStatus'] == '0' && globalConfig?.simulatedPassword">
|
|
|
+ <div class="signal-round signal-round-gry"></div>
|
|
|
+ <div class="vent-margin-l-8">无状态</div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div
|
|
|
+ class="signal-round"
|
|
|
+ :class="{
|
|
|
+ 'signal-round-run': selectData[state.dataIndex.replace('Fan', 'Fan2')] == '0',
|
|
|
+ 'signal-round-warning':
|
|
|
+ selectData[state.dataIndex.replace('Fan', 'Fan2')] != undefined &&
|
|
|
+ selectData[state.dataIndex.replace('Fan', 'Fan2')] == '1',
|
|
|
+ 'signal-round-gry': selectData[state.dataIndex.replace('Fan', 'Fan2')] == undefined,
|
|
|
+ }"
|
|
|
+ ></div>
|
|
|
+ <div class="vent-margin-l-8">{{
|
|
|
+ selectData[state.dataIndex.replace('Fan', 'Fan2')] == undefined
|
|
|
+ ? '无状态'
|
|
|
+ : selectData[state.dataIndex.replace('Fan', 'Fan2')] == '0'
|
|
|
+ ? '正常'
|
|
|
+ : '异常'
|
|
|
+ }}</div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-else>
|
|
|
+ <div class="signal-item">
|
|
|
+ <div
|
|
|
+ class="signal-round vent-margin-l-8"
|
|
|
+ :class="{
|
|
|
+ 'signal-round-run': selectData[state.dataIndex] == '0',
|
|
|
+ 'signal-round-warning': selectData[state.dataIndex] !== undefined && selectData[state.dataIndex] == '1',
|
|
|
+ 'signal-round-gry': selectData[state.dataIndex] === undefined,
|
|
|
+ }"
|
|
|
+ ></div>
|
|
|
+ <div class="vent-margin-l-8">{{
|
|
|
+ selectData[state.dataIndex] === undefined ? '无状态' : selectData[state.dataIndex] == '0' ? '正常' : '异常'
|
|
|
+ }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -310,30 +395,6 @@
|
|
|
</template>
|
|
|
</GroupMonitorTable>
|
|
|
</a-tab-pane>
|
|
|
- <a-tab-pane key="2" tab="实时曲线图" force-render v-if="hasPermission('echart:show')">
|
|
|
- <div class="tab-item" v-if="activeKey === '2'">
|
|
|
- <div class="vent-flex-row-between" style="height: 100%">
|
|
|
- <BarSingle
|
|
|
- :xAxisData="xAxisDataGas"
|
|
|
- :dataSource="dataSource[selectRowIndex]"
|
|
|
- height="100%"
|
|
|
- :chartsColumns="chartsColumns"
|
|
|
- style="flex: 3"
|
|
|
- />
|
|
|
- <BarSingle
|
|
|
- v-if="globalConfig?.simulatedPassword"
|
|
|
- :xAxisData="[
|
|
|
- { key: 'F1', valueKey: 'windQuantity1' },
|
|
|
- { key: 'F2', valueKey: 'windQuantity2' },
|
|
|
- ]"
|
|
|
- :dataSource="dataSource[selectRowIndex]"
|
|
|
- height="100%"
|
|
|
- :chartsColumns="chartsColumns1"
|
|
|
- style="flex: 2"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </a-tab-pane>
|
|
|
<a-tab-pane key="3" tab="历史数据">
|
|
|
<div class="tab-item" v-if="activeKey === '3'">
|
|
|
<template v-if="globalConfig.History_Type == 'remote'">
|
|
@@ -365,6 +426,43 @@
|
|
|
/>
|
|
|
</div>
|
|
|
</a-tab-pane>
|
|
|
+ <a-tab-pane key="2" tab="风量实时曲线图" force-render v-if="hasPermission('echart:show')">
|
|
|
+ <!-- <a-tab-pane key="2" tab="风量实时曲线图" force-render> -->
|
|
|
+ <div class="tab-item" v-if="activeKey === '2'">
|
|
|
+ <!-- <div class="vent-flex-row-between" style="height: 100%">
|
|
|
+ <BarSingle
|
|
|
+ :xAxisData="xAxisDataGas"
|
|
|
+ :dataSource="dataSource[selectRowIndex]"
|
|
|
+ height="100%"
|
|
|
+ :chartsColumns="chartsColumns"
|
|
|
+ style="flex: 3"
|
|
|
+ />
|
|
|
+ <BarSingle
|
|
|
+ v-if="globalConfig?.simulatedPassword"
|
|
|
+ :xAxisData="[
|
|
|
+ { key: 'F1', valueKey: 'windQuantity1' },
|
|
|
+ { key: 'F2', valueKey: 'windQuantity2' },
|
|
|
+ ]"
|
|
|
+ :dataSource="dataSource[selectRowIndex]"
|
|
|
+ height="100%"
|
|
|
+ :chartsColumns="chartsColumns1"
|
|
|
+ style="flex: 2"
|
|
|
+ />
|
|
|
+ </div> -->
|
|
|
+ <div class="vent-flex-row-between" style="height: 100%">
|
|
|
+ <BarAndLine
|
|
|
+ class="echarts-line"
|
|
|
+ xAxisPropType="time"
|
|
|
+ :dataSource="historyList"
|
|
|
+ height="90%"
|
|
|
+ width="100%"
|
|
|
+ :chartsColumns="chartsColumns"
|
|
|
+ :option="echatsOption"
|
|
|
+ chartsType="listMonitor"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </a-tab-pane>
|
|
|
</a-tabs>
|
|
|
<a-button
|
|
|
v-if="hasPermission('btn:reportDown')"
|
|
@@ -442,10 +540,7 @@
|
|
|
<div class="label">风机运行频率(Hz):</div>
|
|
|
<a-input-number size="small" v-model:value="fan1FrequencyVal" :min="20" :max="50" :step="0.1" />
|
|
|
</div>
|
|
|
- <div class="vent-flex-row input-box" v-if="controlType == 'needAir'">
|
|
|
- <div class="label">需风量(单位):</div>
|
|
|
- <a-input-number size="small" v-model:value="frequencyVal" :min="30" :max="50" :step="0.1" />
|
|
|
- </div>
|
|
|
+
|
|
|
<div class="vent-flex-row input-box" v-if="controlType == 'disAirAlarm'">
|
|
|
<div class="label">漏风率(%):</div>
|
|
|
<a-input-number size="small" v-model:value="frequencyVal" :min="0" :max="50" :step="0.1" />
|
|
@@ -492,6 +587,16 @@
|
|
|
<a-input-number size="small" v-model:value="modalTypeArr.rightBtnArr[3].max" :min="0" :max="50" :step="0.1" />
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="vent-flex-row input-box" v-if="controlType == 'zhlk'">
|
|
|
+ <div class="label">目标风量(m³/min):</div>
|
|
|
+ <a-input-number size="small" v-model:value="targetVolume" />
|
|
|
+ </div>
|
|
|
+ <div v-if="controlType == 'gasOverSet'">
|
|
|
+ <div class="vent-flex-row input-box">
|
|
|
+ <div class="label">设置瓦斯超限浓度:</div>
|
|
|
+ <a-input-number size="small" v-model:value="gasWarningVal" :min="0" :max="1" :step="0.01" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
<!-- 启动或停止 -->
|
|
|
<div class="" v-if="controlType == 'startSmoke'"> </div>
|
|
|
<div v-if="!globalConfig?.simulatedPassword" class="vent-flex-row input-box">
|
|
@@ -508,16 +613,17 @@
|
|
|
<script setup lang="ts">
|
|
|
import { ExclamationCircleFilled, ArrowRightOutlined } from '@ant-design/icons-vue';
|
|
|
import { onBeforeMount, ref, watch, onMounted, nextTick, defineAsyncComponent, reactive, onUnmounted, inject, unref } from 'vue';
|
|
|
- import BarSingle from '../../../../components/chart/BarSingle.vue';
|
|
|
+ // import BarSingle from '../../../../components/chart/BarSingle.vue';
|
|
|
+ import BarAndLine from '../../../../components/chart/BarAndLine.vue';
|
|
|
import GroupMonitorTable from '../comment/GroupMonitorTable.vue';
|
|
|
import AlarmHistoryTable from '../comment/AlarmHistoryTable.vue';
|
|
|
import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue';
|
|
|
import DeviceBaseInfo from '../comment/components/DeviceBaseInfo.vue';
|
|
|
import { mountedThree, setModelType, destroy, addCssText, addText, playSmoke } from './fanLocal.three';
|
|
|
import lodash from 'lodash';
|
|
|
- import { getTableList, list } from '/@/views/vent/monitorManager/fanLocalMonitor/fanLocal.api';
|
|
|
+ import { getTableList, list, autoAdjust } from '/@/views/vent/monitorManager/fanLocalMonitor/fanLocal.api';
|
|
|
import { list as baseList } from '../../deviceManager/fanTabel/fan.api';
|
|
|
- import { chartsColumns, chartsColumns1 } from './fanLocal.data';
|
|
|
+ import { chartsColumns1, echatsOption } from './fanLocal.data';
|
|
|
import { deviceControlApi } from '/@/api/vent/index';
|
|
|
import { setDivHeight } from '/@/utils/event';
|
|
|
import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';
|
|
@@ -622,6 +728,11 @@
|
|
|
permission: 'fanLocal:gasAlarmSet',
|
|
|
},
|
|
|
{
|
|
|
+ key: 'gasOverSet', //
|
|
|
+ value: '瓦斯限值设定',
|
|
|
+ permission: 'fanLocal:gasOverSet',
|
|
|
+ },
|
|
|
+ {
|
|
|
key: 'kkjc',
|
|
|
value: '工况辅助决策',
|
|
|
permission: 'fanLocal:kkjc',
|
|
@@ -713,6 +824,10 @@
|
|
|
const mainWindIsShow1 = ref('open'); // 主机默认启动leftColumns
|
|
|
const mainWindIsShow2 = ref('stop'); // 备机默认不启动
|
|
|
const fanControl = ref('');
|
|
|
+ const targetVolume = ref(600);
|
|
|
+ const historyList = ref([]);
|
|
|
+ const remoteChartsColumns = getTableHeaderColumns('fanlocal_chart');
|
|
|
+ const chartsColumns = remoteChartsColumns && remoteChartsColumns.length > 0 ? remoteChartsColumns : chartsColumns1;
|
|
|
|
|
|
const passWord = ref('');
|
|
|
// 默认初始是第一行
|
|
@@ -848,12 +963,35 @@
|
|
|
if (data['Fan2StartStatus'] && data['Fan2StartStatus'] === '1.0') data['Fan2StartStatus'] = '1';
|
|
|
if (data['Fan1StartStatus'] && data['Fan1StartStatus'] === '0.0') data['Fan1StartStatus'] = '0';
|
|
|
if (data['Fan2StartStatus'] && data['Fan2StartStatus'] === '0.0') data['Fan2StartStatus'] = '0';
|
|
|
-
|
|
|
+ data['windQuantity2'] =
|
|
|
+ data['windQuantity2'] ||
|
|
|
+ data['m3'] ||
|
|
|
+ data['ductOutletAirVolume_merge'] ||
|
|
|
+ data['windOutSpeed_merge'] ||
|
|
|
+ data['windOutSpeed1'] ||
|
|
|
+ data['windOutSpeed2'] ||
|
|
|
+ data['windOutSpeed_merge'];
|
|
|
// if (globSetting.sysOrgCode === 'sdmtjtbetmk') {
|
|
|
// if (data['m3']) data['ductOutletAirVolume_merge'] = data['m3'];
|
|
|
// if (data['m3']) data['inletAirVolume_merge'] = (Number(data['m3']) * 1.08).toFixed(2);
|
|
|
// }
|
|
|
dataSource.value.push(data);
|
|
|
+ if (selectRowIndex.value > -1) {
|
|
|
+ let echartsData = dataArr[selectRowIndex.value]['history'] || [];
|
|
|
+ echartsData = echartsData.filter((item) => {
|
|
|
+ item['FanfHz'] = data['Fan1StartStatus'] == '1' ? item['Fan1fHz'] : data['Fan2StartStatus'] == '1' ? item['Fan2fHz'] : 0;
|
|
|
+ item['windQuantity2'] =
|
|
|
+ item['windQuantity2'] ||
|
|
|
+ item['m3'] ||
|
|
|
+ item['ductOutletAirVolume_merge'] ||
|
|
|
+ item['windOutSpeed_merge'] ||
|
|
|
+ item['windOutSpeed1'] ||
|
|
|
+ item['windOutSpeed2'] ||
|
|
|
+ item['windOutSpeed_merge'];
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ historyList.value = echartsData;
|
|
|
+ }
|
|
|
});
|
|
|
} else {
|
|
|
return (dataSource.value = []);
|
|
@@ -1274,7 +1412,29 @@
|
|
|
}
|
|
|
modalTitle.value = '';
|
|
|
modalIsShow.value = false;
|
|
|
+ } else if (handType === 'zhlk' || handType === 'gasOverSet') {
|
|
|
+ if (targetVolume.value) {
|
|
|
+ const params =
|
|
|
+ handType === 'zhlk'
|
|
|
+ ? { auto: 1, fanlocalId: selectData.deviceID, xufengliang: targetVolume.value }
|
|
|
+ : { auto: 1, fanlocalId: selectData.deviceID, gasMax: gasWarningVal.value };
|
|
|
+ autoAdjust(params).then(() => {
|
|
|
+ if (res.success) {
|
|
|
+ if (globalConfig.History_Type == 'remote') {
|
|
|
+ message.success('指令已下发至生产管控平台成功!');
|
|
|
+ } else {
|
|
|
+ message.success('指令已下发成功!');
|
|
|
+ }
|
|
|
+ modalTitle.value = '';
|
|
|
+ modalIsShow.value = false;
|
|
|
+ } else {
|
|
|
+ message.error(res.message);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ //targetVolume
|
|
|
};
|
|
|
}
|
|
|
|
|
@@ -1489,22 +1649,14 @@
|
|
|
display: flex;
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
- background: url('/@/assets/images/vent/count-header-bg.png') no-repeat;
|
|
|
+ // background: url('/@/assets/images/vent/count-header-bg.png') no-repeat;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
.warning-group {
|
|
|
padding: 0 10px;
|
|
|
position: relative;
|
|
|
- // &::before {
|
|
|
- // content: '';
|
|
|
- // display: block;
|
|
|
- // width: 1px;
|
|
|
- // height: 100%;
|
|
|
- // position: absolute;
|
|
|
- // left: 12px;
|
|
|
- // background-color: #00f5fe;
|
|
|
- // }
|
|
|
+
|
|
|
.warning-item {
|
|
|
display: flex;
|
|
|
flex-direction: row;
|
|
@@ -1535,6 +1687,17 @@
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ .warning-group-r {
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ display: block;
|
|
|
+ width: 1px;
|
|
|
+ height: 100%;
|
|
|
+ position: absolute;
|
|
|
+ left: 12px;
|
|
|
+ background-color: #00f5fe;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|