2024-10-17 14:01:38 +08:00
|
|
|
|
<template>
|
|
|
|
|
<div class="airBlower">
|
|
|
|
|
<el-container class="containerPart">
|
|
|
|
|
<el-header class="headerPart">
|
|
|
|
|
<div class="headerLeft">
|
|
|
|
|
<div class="selectPart">
|
|
|
|
|
<span>{{ t('airBlower.status') }}</span>
|
|
|
|
|
<el-select
|
2024-10-24 19:13:18 +08:00
|
|
|
|
v-model="airBlowerSelect.iturbineoperationmode"
|
|
|
|
|
@change="selectAirBlower('iturbineoperationmode')"
|
2024-10-17 14:01:38 +08:00
|
|
|
|
:placeholder="'请选择' + t('airBlower.status')"
|
|
|
|
|
class="airBlowerSelect"
|
|
|
|
|
>
|
2024-10-24 19:13:18 +08:00
|
|
|
|
<el-option
|
|
|
|
|
v-for="v in airBlowerSelectOptions.iturbineoperationmode"
|
|
|
|
|
:key="v.value"
|
|
|
|
|
:label="v.label"
|
|
|
|
|
:value="v.value"
|
|
|
|
|
></el-option>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</el-select>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="selectPart">
|
|
|
|
|
<span>{{ t('airBlower.feeder') }}</span>
|
|
|
|
|
<el-select
|
2024-10-24 19:13:18 +08:00
|
|
|
|
v-model="airBlowerSelect.belongLine"
|
|
|
|
|
@change="selectAirBlower('belongLine')"
|
2024-10-17 14:01:38 +08:00
|
|
|
|
:placeholder="'请选择' + t('airBlower.feeder')"
|
|
|
|
|
class="airBlowerSelect"
|
|
|
|
|
>
|
2024-10-24 19:13:18 +08:00
|
|
|
|
<el-option v-for="v in airBlowerSelectOptions.belongLine" :key="v.value" :label="v.value" :value="v.value"></el-option>
|
|
|
|
|
</el-select>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</div>
|
|
|
|
|
<div class="selectPart">
|
2024-10-24 19:13:18 +08:00
|
|
|
|
<span>自动更新:</span>
|
|
|
|
|
<el-switch
|
|
|
|
|
v-model="autoUpdate"
|
|
|
|
|
class="ml-2"
|
|
|
|
|
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
|
|
|
|
|
></el-switch>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2024-11-26 10:51:14 +08:00
|
|
|
|
<div class="headerCenter">
|
|
|
|
|
<el-button type="primary" :icon="Crop" class="defaultBtn" @click="openMeasure">测点选择</el-button>
|
|
|
|
|
<el-button style="color: rgb(0, 100, 170)" :icon="Download" class="defaultBtn" @click="downFun">数据导出</el-button>
|
|
|
|
|
</div>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
<div class="headerRight">
|
2024-11-05 17:33:49 +08:00
|
|
|
|
<el-popconfirm title="确认启动么?" @confirm="airBlowerOperate('setTurbineFastStart')">
|
|
|
|
|
<template #reference>
|
|
|
|
|
<el-button type="primary">{{ t('airBlower.start') }}</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-popconfirm>
|
|
|
|
|
<el-popconfirm title="确认停机么?" @confirm="airBlowerOperate('setTurbineStop')">
|
|
|
|
|
<template #reference>
|
|
|
|
|
<el-button style="color: #0064aa">{{ t('airBlower.stop') }}</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-popconfirm>
|
|
|
|
|
<el-popconfirm title="确认复位么?" @confirm="airBlowerOperate('setTurbineResetStatusCode')">
|
|
|
|
|
<template #reference>
|
|
|
|
|
<el-button style="color: #0064aa">{{ t('airBlower.reset') }}</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-popconfirm>
|
2024-11-26 10:51:14 +08:00
|
|
|
|
<!-- <el-popconfirm title="确认风机对时么?">
|
2024-11-05 17:33:49 +08:00
|
|
|
|
<template #reference>
|
|
|
|
|
<el-button style="color: #0064aa">{{ t('airBlower.verify') }}</el-button>
|
|
|
|
|
</template>
|
2024-11-26 10:51:14 +08:00
|
|
|
|
</el-popconfirm> -->
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</div>
|
|
|
|
|
</el-header>
|
|
|
|
|
<el-main class="mainPart">
|
2024-10-25 17:13:39 +08:00
|
|
|
|
<el-table
|
|
|
|
|
ref="tableRef"
|
|
|
|
|
:column="tableColumn"
|
|
|
|
|
:data="tableData"
|
|
|
|
|
:header-row-style="tableHaderStyle"
|
|
|
|
|
@selectionChange="selectTable"
|
2024-11-20 09:00:15 +08:00
|
|
|
|
class="tableClass"
|
2024-10-25 17:13:39 +08:00
|
|
|
|
>
|
2024-10-24 19:13:18 +08:00
|
|
|
|
<el-table-column type="selection" width="55"></el-table-column>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
<template v-for="item in tableColumn" :key="item.prop">
|
|
|
|
|
<el-table-column
|
|
|
|
|
v-if="!item.custom"
|
|
|
|
|
:prop="item.prop"
|
2024-10-24 19:13:18 +08:00
|
|
|
|
:label="item.label"
|
2024-10-17 14:01:38 +08:00
|
|
|
|
:align="item.align"
|
|
|
|
|
:width="item.width"
|
|
|
|
|
:type="item.type"
|
|
|
|
|
/>
|
2024-10-24 19:13:18 +08:00
|
|
|
|
<el-table-column v-else :label="item.label" :align="item.align" :width="item.width">
|
2024-10-17 14:01:38 +08:00
|
|
|
|
<template v-if="item.custom === 'default'" #default="scope">
|
2024-10-24 19:13:18 +08:00
|
|
|
|
<div v-if="item.prop === 'iturbineoperationmode'">
|
2024-11-01 17:45:34 +08:00
|
|
|
|
<el-tag v-if="scope.row.locked === 1" color="rgba(254,55,49,0.20)" style="color: #fe3731">已锁定</el-tag>
|
2024-10-24 19:13:18 +08:00
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 20" color="rgba(0,100,170,0.20)" style="color: #0064aa"
|
|
|
|
|
>并网</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 10" color="rgba(0,160,150,0.20)" style="color: #00a096"
|
|
|
|
|
>维护</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 8" color="rgba(255,126,0,0.20)" style="color: #ff7e00"
|
|
|
|
|
>限功率运行</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 0" color="rgba(153,153,153,0.20)" style="color: #666666"
|
|
|
|
|
>离线</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 16" color="rgba(6,180,41,0.20)" style="color: #06b429"
|
|
|
|
|
>启动</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 6" color="rgba(254,55,49,0.20)" style="color: #fe3731"
|
|
|
|
|
>正常停机</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 1" color="rgba(254,55,49,0.20)" style="color: #fe3731"
|
2024-10-28 18:15:30 +08:00
|
|
|
|
>外部因素导致停机</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 2" color="rgba(254,55,49,0.20)" style="color: #fe3731"
|
|
|
|
|
>停机</el-tag
|
2024-10-24 19:13:18 +08:00
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 11" color="rgba(255,182,0,0.20)" style="color: #ffb600"
|
|
|
|
|
>待机</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 1110" color="rgba(153,153,153,0.20)" style="color: #666666"
|
|
|
|
|
>解缆状态</el-tag
|
|
|
|
|
>
|
|
|
|
|
<el-tag v-if="scope.row.iturbineoperationmode === 1111" color="rgba(254,55,49,0.20)" style="color: #fe3731"
|
2024-10-28 18:15:30 +08:00
|
|
|
|
>电网故障停机</el-tag
|
2024-10-24 19:13:18 +08:00
|
|
|
|
>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</div>
|
2024-11-26 10:51:14 +08:00
|
|
|
|
<div v-if="item.prop === 'chart'" @click="openLineChart(scope.row)" class="operate">
|
|
|
|
|
<div class="chartIcon">
|
|
|
|
|
<svg
|
|
|
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
|
|
|
class="icon"
|
|
|
|
|
width="100%"
|
|
|
|
|
height="100%"
|
|
|
|
|
viewBox="0 0 1024 1024"
|
|
|
|
|
version="1.1"
|
|
|
|
|
>
|
|
|
|
|
{{ scope.row }}
|
|
|
|
|
<path
|
|
|
|
|
d="M896 896H96a32 32 0 0 1-32-32V224a32 32 0 0 1 64 0v608h768a32 32 0 1 1 0 64zM247.008 640a32 32 0 0 1-20.992-56.192l200.992-174.24a32 32 0 0 1 42.272 0.288l172.128 153.44 229.088-246.304a32 32 0 0 1 46.88 43.616l-250.432 269.216a31.936 31.936 0 0 1-44.704 2.08l-174.56-155.52-179.744 155.84a31.872 31.872 0 0 1-20.928 7.776z"
|
|
|
|
|
fill="#00a4ff"
|
|
|
|
|
/>
|
|
|
|
|
</svg>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</template>
|
|
|
|
|
<template v-if="item.custom === 'header'" #header="scope">
|
|
|
|
|
<div>{{ scope.column.label.split(' ')[0] }}</div>
|
|
|
|
|
<div>{{ scope.column.label.split(' ')[1] }}</div>
|
|
|
|
|
</template>
|
|
|
|
|
<template v-if="item.custom === 'header'" #default="scope">
|
|
|
|
|
<div>{{ scope.row[item.prop] }}</div>
|
|
|
|
|
</template>
|
2024-10-24 19:13:18 +08:00
|
|
|
|
<template v-if="item.prop === 'name'" #default="scope">
|
2024-10-25 16:36:35 +08:00
|
|
|
|
<div class="tableColumnClick" @click="openWindTurbine(scope.row)">{{ scope.row[item.prop] }}</div>
|
2024-10-24 19:13:18 +08:00
|
|
|
|
</template>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</el-table-column>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table>
|
|
|
|
|
</el-main>
|
|
|
|
|
</el-container>
|
|
|
|
|
</div>
|
2024-11-05 17:33:49 +08:00
|
|
|
|
<el-dialog v-model="multiTaskVisible" :title="mutiTaskTitle" width="400" :close-on-click-modal="false">
|
|
|
|
|
<el-row v-for="item in mutiTaskList" :key="item.sendData.deviceId">
|
|
|
|
|
<el-col :span="18">
|
|
|
|
|
<div class="mutiTaskName">
|
|
|
|
|
{{ item.deviceName }}
|
|
|
|
|
</div>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<div class="mutiTaskStatus">
|
|
|
|
|
<el-icon style="color: #f56c6c" size="30" v-if="item.loading === 3">
|
|
|
|
|
<CircleClose />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<el-icon style="color: #06b429" size="30" v-if="item.loading === 2">
|
|
|
|
|
<CircleCheck />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<el-icon style="color: #4fa5ff" size="30" class="mutiTaskLoading" v-if="item.loading === 1">
|
|
|
|
|
<Loading />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<div v-if="item.loading === 0">等待发送</div>
|
|
|
|
|
</div>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-dialog>
|
2024-11-26 10:51:14 +08:00
|
|
|
|
<el-dialog v-model="selectPointVisible" title="选择测点" width="1000">
|
|
|
|
|
<SelectPoint ref="selectPointDialogRef" :defaultAttr="defaultAttr" :visible="selectPointVisible"></SelectPoint>
|
|
|
|
|
<template #footer>
|
|
|
|
|
<div class="selectPointDialogFooter">
|
|
|
|
|
<el-button type="primary" @click="saveSelectPoint">保存</el-button>
|
|
|
|
|
<el-button @click="selectPointVisible = false">取消</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
<el-dialog v-model="realDataLineChartVisible" title="实时曲线" @close="closeLineChart">
|
|
|
|
|
<RealDataChart :visible="realDataLineChartVisible" :id="clickRowId"></RealDataChart>
|
|
|
|
|
</el-dialog>
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
2024-10-24 19:13:18 +08:00
|
|
|
|
import { SelectTypeObjType, SelectTypeKeyUnionType, TableDataObjType, TableColumnType } from './type'
|
2024-11-26 10:51:14 +08:00
|
|
|
|
import { onUnmounted, reactive, ref, watch, computed, nextTick } from 'vue'
|
2024-10-17 14:01:38 +08:00
|
|
|
|
import { useI18n } from 'vue-i18n'
|
2024-11-13 15:32:15 +08:00
|
|
|
|
import { getAirBlowerListReq, getBelongLineListReq } from '/@/api/backend/airBlower/request'
|
2024-11-26 10:51:14 +08:00
|
|
|
|
import { CircleCheck, CircleClose, Loading, Crop, Download } from '@element-plus/icons-vue'
|
2024-11-05 17:33:49 +08:00
|
|
|
|
import { ElMessage, TableInstance, ElPopconfirm } from 'element-plus'
|
2024-10-25 16:36:35 +08:00
|
|
|
|
import { useRouter, useRoute } from 'vue-router'
|
2024-11-26 10:51:14 +08:00
|
|
|
|
import { getRealTimeState, getCutDecimalsValue } from './utils'
|
2024-11-05 17:33:49 +08:00
|
|
|
|
import { sendCommandReq } from '/@/api/backend/control/request'
|
2024-11-08 17:51:17 +08:00
|
|
|
|
import { adminBaseRoutePath } from '/@/router/static/adminBase'
|
2024-11-26 10:51:14 +08:00
|
|
|
|
import { getRealValueListReq } from '/@/api/backend/deviceModel/request'
|
|
|
|
|
import SelectPoint from '/@/views/backend/equipment/airBlower/selectPoint.vue'
|
|
|
|
|
import RealDataChart from '/@/views/backend/equipment/airBlower/realDataChart.vue'
|
2024-10-25 16:36:35 +08:00
|
|
|
|
const router = useRouter()
|
2024-10-17 14:01:38 +08:00
|
|
|
|
|
|
|
|
|
const { t } = useI18n()
|
|
|
|
|
|
2024-10-24 19:13:18 +08:00
|
|
|
|
const airBlowerSelect = reactive<SelectTypeObjType>({
|
|
|
|
|
iturbineoperationmode: 987654321,
|
|
|
|
|
belongLine: '全部',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
})
|
|
|
|
|
|
2024-10-24 19:13:18 +08:00
|
|
|
|
const airBlowerSelectOptions = reactive<{ [K in SelectTypeKeyUnionType]: { label: string; value: string | number }[] }>({
|
|
|
|
|
iturbineoperationmode: [
|
|
|
|
|
{
|
|
|
|
|
label: '全部',
|
|
|
|
|
value: 987654321,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '并网',
|
|
|
|
|
value: 20,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '待机',
|
|
|
|
|
value: 11,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '启动',
|
|
|
|
|
value: 16,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '维护',
|
|
|
|
|
value: 10,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '离线',
|
|
|
|
|
value: 0,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '限功率运行',
|
|
|
|
|
value: 8,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '正常停机',
|
|
|
|
|
value: 6,
|
|
|
|
|
},
|
|
|
|
|
{
|
2024-10-28 18:15:30 +08:00
|
|
|
|
label: '外部因素导致停机',
|
2024-10-24 19:13:18 +08:00
|
|
|
|
value: 1,
|
|
|
|
|
},
|
2024-10-28 18:15:30 +08:00
|
|
|
|
{
|
|
|
|
|
label: '停机',
|
|
|
|
|
value: 2,
|
|
|
|
|
},
|
2024-10-24 19:13:18 +08:00
|
|
|
|
{
|
|
|
|
|
label: '解缆状态',
|
|
|
|
|
value: 1110,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '电网故障停机',
|
|
|
|
|
value: 1111,
|
|
|
|
|
},
|
2024-10-30 14:03:17 +08:00
|
|
|
|
{
|
|
|
|
|
label: '安全链停机',
|
|
|
|
|
value: 1112,
|
|
|
|
|
},
|
2024-10-24 19:13:18 +08:00
|
|
|
|
],
|
|
|
|
|
belongLine: [],
|
2024-10-17 14:01:38 +08:00
|
|
|
|
})
|
|
|
|
|
|
2024-10-24 19:13:18 +08:00
|
|
|
|
const selectAirBlower = (type: SelectTypeKeyUnionType) => {
|
2024-10-25 10:00:42 +08:00
|
|
|
|
if (airBlowerSelect.belongLine === '全部' && airBlowerSelect.iturbineoperationmode === 987654321) {
|
|
|
|
|
tableData.value = originTableData.value
|
|
|
|
|
return
|
|
|
|
|
} else if (airBlowerSelect.belongLine !== '全部' && airBlowerSelect.iturbineoperationmode !== 987654321) {
|
2024-10-29 16:19:47 +08:00
|
|
|
|
if (type === 'iturbineoperationmode' && airBlowerSelect.iturbineoperationmode === 2) {
|
2024-10-30 14:03:17 +08:00
|
|
|
|
const type1 = originTableData.value.filter((item) => item.iturbineoperationmode === 1)
|
|
|
|
|
const type6 = originTableData.value.filter((item) => item.iturbineoperationmode === 6)
|
|
|
|
|
const type2 = originTableData.value.filter((item) => item.iturbineoperationmode === 2)
|
|
|
|
|
const typeAll = [...type1, ...type6, ...type2]
|
|
|
|
|
tableData.value = typeAll.filter((item) => item.belongLine === airBlowerSelect.belongLine)
|
2024-10-29 16:19:47 +08:00
|
|
|
|
return
|
|
|
|
|
}
|
2024-10-30 14:03:17 +08:00
|
|
|
|
const resData = originTableData.value.filter((item) => item.iturbineoperationmode === airBlowerSelect.iturbineoperationmode)
|
|
|
|
|
tableData.value = resData.filter((item) => item.belongLine === airBlowerSelect.belongLine)
|
2024-10-25 10:00:42 +08:00
|
|
|
|
return
|
|
|
|
|
} else {
|
|
|
|
|
if (type === 'belongLine' && airBlowerSelect.belongLine === '全部') {
|
|
|
|
|
tableData.value = originTableData.value.filter((item) => item.iturbineoperationmode === airBlowerSelect.iturbineoperationmode)
|
|
|
|
|
return
|
|
|
|
|
} else if (type === 'iturbineoperationmode' && airBlowerSelect.iturbineoperationmode === 987654321) {
|
|
|
|
|
tableData.value = originTableData.value.filter((item) => item.belongLine === airBlowerSelect.belongLine)
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-10-29 16:19:47 +08:00
|
|
|
|
if (type === 'iturbineoperationmode' && airBlowerSelect.iturbineoperationmode === 2) {
|
|
|
|
|
const type1 = originTableData.value.filter((item) => item.iturbineoperationmode === 1)
|
|
|
|
|
const type6 = originTableData.value.filter((item) => item.iturbineoperationmode === 6)
|
|
|
|
|
const type2 = originTableData.value.filter((item) => item.iturbineoperationmode === 2)
|
|
|
|
|
tableData.value = [...type1, ...type6, ...type2]
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-25 10:00:42 +08:00
|
|
|
|
tableData.value = originTableData.value.filter((item) => item[type] === airBlowerSelect[type])
|
|
|
|
|
return
|
2024-10-17 14:01:38 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-07 09:32:34 +08:00
|
|
|
|
const airBlowerOperate = async (type: 'setTurbineFastStart' | 'setTurbineStop' | 'setTurbineResetStatusCode') => {
|
2024-11-01 17:45:34 +08:00
|
|
|
|
const sendTypeEnum = {
|
|
|
|
|
setTurbineFastStart: '风机快速启动指令',
|
|
|
|
|
setTurbineStop: '风机停机指令',
|
|
|
|
|
setTurbineResetStatusCode: '风机复位故障代码指令',
|
|
|
|
|
}
|
2024-11-05 17:33:49 +08:00
|
|
|
|
if (!selectList.value.length) {
|
|
|
|
|
ElMessage.warning('请先选择风机')
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-10-24 19:13:18 +08:00
|
|
|
|
const data = selectList.value.map((item) => {
|
|
|
|
|
return {
|
2024-11-05 17:33:49 +08:00
|
|
|
|
sendData: {
|
|
|
|
|
deviceId: item,
|
|
|
|
|
serviceName: sendTypeEnum[type],
|
|
|
|
|
serviceCode: type,
|
|
|
|
|
optDesc: sendTypeEnum[type] + ',设定值为:' + 1,
|
|
|
|
|
opValue: 1 as const,
|
|
|
|
|
},
|
|
|
|
|
deviceName: tableData.value.find((listItem) => listItem.irn === item)!.name,
|
|
|
|
|
loading: 0 as const,
|
2024-10-24 19:13:18 +08:00
|
|
|
|
}
|
|
|
|
|
})
|
2024-11-05 17:33:49 +08:00
|
|
|
|
mutiTaskList.value = data
|
|
|
|
|
mutiTaskTitle.value = sendTypeEnum[type]
|
|
|
|
|
multiTaskVisible.value = true
|
2024-11-07 09:32:34 +08:00
|
|
|
|
|
|
|
|
|
for (let i = 0; i < mutiTaskList.value.length; i++) {
|
|
|
|
|
mutiTaskList.value[i].loading = 1
|
2024-11-07 10:26:39 +08:00
|
|
|
|
runTask(mutiTaskList.value[i].sendData, i)
|
2024-11-07 09:32:34 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-07 11:18:03 +08:00
|
|
|
|
const runTask = async (data: any, index: number) => {
|
|
|
|
|
try {
|
|
|
|
|
let resp = await sendCommandReq(data)
|
|
|
|
|
if (resp.success) {
|
|
|
|
|
mutiTaskList.value[index].loading = 2
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
mutiTaskList.value[index].loading = 3
|
|
|
|
|
}
|
2024-11-07 10:26:39 +08:00
|
|
|
|
|
2024-11-07 11:18:03 +08:00
|
|
|
|
// .then((res: any) => {
|
|
|
|
|
// console.log(res)
|
|
|
|
|
// if (res.success) {
|
|
|
|
|
// console.log(data, 'success')
|
|
|
|
|
// mutiTaskList.value[index].loading = 2
|
|
|
|
|
// } else {
|
|
|
|
|
// mutiTaskList.value[index].loading = 3
|
|
|
|
|
// }
|
|
|
|
|
// })
|
|
|
|
|
// .catch(() => {
|
|
|
|
|
// mutiTaskList.value[index].loading = 3
|
|
|
|
|
// })
|
2024-10-17 14:01:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const tableHaderStyle = {
|
|
|
|
|
color: '#333',
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-26 10:51:14 +08:00
|
|
|
|
const defaultColumn: TableColumnType[] = [
|
2024-10-17 14:01:38 +08:00
|
|
|
|
{
|
2024-10-24 19:13:18 +08:00
|
|
|
|
label: '风机列表',
|
|
|
|
|
prop: 'name',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
2024-10-24 19:13:18 +08:00
|
|
|
|
custom: 'default',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
2024-11-26 10:51:14 +08:00
|
|
|
|
{
|
|
|
|
|
label: '实时曲线',
|
|
|
|
|
prop: 'chart',
|
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'default',
|
|
|
|
|
width: 55,
|
|
|
|
|
},
|
2024-10-17 14:01:38 +08:00
|
|
|
|
{
|
2024-10-24 19:13:18 +08:00
|
|
|
|
label: '风机型号',
|
|
|
|
|
prop: 'model',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 120,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-10-24 19:13:18 +08:00
|
|
|
|
label: '风机状态',
|
|
|
|
|
prop: 'iturbineoperationmode',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'default',
|
|
|
|
|
},
|
2024-11-26 10:51:14 +08:00
|
|
|
|
]
|
|
|
|
|
const dynamicColumn: TableColumnType[] = [
|
|
|
|
|
{
|
|
|
|
|
label: '风速 (m/s)',
|
|
|
|
|
prop: 'iwindspeed',
|
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
|
|
|
|
width: 100,
|
|
|
|
|
},
|
2024-10-17 14:01:38 +08:00
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '风向 (°)',
|
|
|
|
|
prop: 'iwinddirection',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
custom: 'header',
|
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '发电机转速 (rmp)',
|
|
|
|
|
prop: 'igenspeed',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '有功功率 (KW)',
|
2024-10-24 19:13:18 +08:00
|
|
|
|
prop: 'igenpower',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '有功给定 (KW)',
|
|
|
|
|
prop: 'iactivepowersetpointvalue',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '无功功率 (KVar)',
|
|
|
|
|
prop: 'ireactivepower',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '无功给定 (KVar)',
|
|
|
|
|
prop: 'ireactivepowersetpointvalue',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
custom: 'header',
|
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '桨叶1角度 (°)',
|
|
|
|
|
prop: 'ipitchangle1',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '桨叶2角度 (°)',
|
|
|
|
|
prop: 'ipitchangle2',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '桨叶3角度 (°)',
|
|
|
|
|
prop: 'ipitchangle3',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '限电原因',
|
|
|
|
|
prop: 'powerlimitsource',
|
|
|
|
|
align: 'center',
|
|
|
|
|
width: 100,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '机舱位置 (°)',
|
|
|
|
|
prop: 'ivanedirection',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
{
|
2024-11-26 10:51:14 +08:00
|
|
|
|
label: '日发电量 (kWh)',
|
|
|
|
|
prop: 'ikwhthisday',
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align: 'center',
|
2024-11-26 10:51:14 +08:00
|
|
|
|
custom: 'header',
|
|
|
|
|
width: 100,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '总发电量 (万kWh)',
|
|
|
|
|
prop: 'ikwhoverall',
|
|
|
|
|
align: 'center',
|
|
|
|
|
custom: 'header',
|
|
|
|
|
width: 100,
|
2024-10-17 14:01:38 +08:00
|
|
|
|
},
|
|
|
|
|
]
|
2024-11-26 10:51:14 +08:00
|
|
|
|
const tableColumn = ref<TableColumnType[]>([...defaultColumn, ...dynamicColumn])
|
2024-10-17 14:01:38 +08:00
|
|
|
|
|
2024-10-25 17:13:39 +08:00
|
|
|
|
const tableRef = ref<TableInstance>()
|
2024-10-24 19:13:18 +08:00
|
|
|
|
const tableData = ref<TableDataObjType[]>([])
|
|
|
|
|
const originTableData = ref<TableDataObjType[]>([])
|
2024-11-26 10:51:14 +08:00
|
|
|
|
|
|
|
|
|
const createTableReqParams = (airblowerList: { irn: string; name: string }[]) => {
|
|
|
|
|
const curTableKey = tableColumn.value.map((item) => item.prop)
|
|
|
|
|
const airBlowerIds: any = []
|
|
|
|
|
const airBlowerInfo: any = {}
|
|
|
|
|
const params = airblowerList.map((item: any) => {
|
|
|
|
|
airBlowerInfo[item.irn] = {
|
|
|
|
|
name: item.name,
|
|
|
|
|
model: item.model,
|
|
|
|
|
belongLine: item.belongLine,
|
|
|
|
|
modelId: item.modelId,
|
|
|
|
|
deviceCode: item.deviceCode,
|
|
|
|
|
}
|
|
|
|
|
airBlowerIds.push(item.irn)
|
|
|
|
|
return {
|
|
|
|
|
deviceId: item.irn,
|
|
|
|
|
attributes: [...curTableKey, 'iturbineoperationmode', 'iyplevel', 'gridlostdetected', 'ibplevel'],
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
return { params, airBlowerInfo, airBlowerIds }
|
|
|
|
|
}
|
2024-10-24 19:13:18 +08:00
|
|
|
|
const getTableData = () => {
|
2024-11-26 10:51:14 +08:00
|
|
|
|
let airBlowerInfoObj: any = {}
|
|
|
|
|
let airBlowerIdList: any[] = []
|
2024-10-24 19:13:18 +08:00
|
|
|
|
getAirBlowerListReq()
|
|
|
|
|
.then((res) => {
|
2024-11-26 10:51:14 +08:00
|
|
|
|
if (res.success) {
|
|
|
|
|
return createTableReqParams(res.data)
|
2024-10-25 10:17:06 +08:00
|
|
|
|
} else {
|
2024-11-26 10:51:14 +08:00
|
|
|
|
throw '获取风机列表失败'
|
2024-10-25 10:17:06 +08:00
|
|
|
|
}
|
2024-11-26 10:51:14 +08:00
|
|
|
|
})
|
|
|
|
|
.then((data) => {
|
|
|
|
|
airBlowerInfoObj = data.airBlowerInfo
|
|
|
|
|
airBlowerIdList = data.airBlowerIds
|
|
|
|
|
return getRealValueListReq(data!.params)
|
|
|
|
|
})
|
|
|
|
|
.then((res) => {
|
|
|
|
|
if (res.success) {
|
|
|
|
|
const data = airBlowerIdList.map((id) => {
|
|
|
|
|
const realData: any = {}
|
|
|
|
|
Object.keys(res.data[id]).forEach((key) => {
|
|
|
|
|
realData[key] = getCutDecimalsValue(res.data[id][key])
|
2024-10-26 18:18:09 +08:00
|
|
|
|
})
|
2024-11-26 10:51:14 +08:00
|
|
|
|
const state = getRealTimeState(res.data[id])
|
|
|
|
|
return {
|
|
|
|
|
irn: id,
|
|
|
|
|
name: airBlowerInfoObj[id].name,
|
|
|
|
|
model: airBlowerInfoObj[id].model,
|
|
|
|
|
iotModelId: airBlowerInfoObj[id].modelId,
|
|
|
|
|
belongLine: airBlowerInfoObj[id].belongLine,
|
|
|
|
|
deviceCode: airBlowerInfoObj[id].deviceCode,
|
|
|
|
|
...realData,
|
|
|
|
|
iturbineoperationmode: state,
|
|
|
|
|
}
|
2024-10-26 18:18:09 +08:00
|
|
|
|
})
|
2024-11-26 10:51:14 +08:00
|
|
|
|
originTableData.value = data
|
|
|
|
|
|
|
|
|
|
if (airBlowerSelect.belongLine === '全部' && airBlowerSelect.iturbineoperationmode === 987654321) {
|
|
|
|
|
tableData.value = data
|
|
|
|
|
console.log(tableData.value)
|
|
|
|
|
} else {
|
|
|
|
|
const irn = tableData.value.map((item) => item.irn)
|
|
|
|
|
const result: TableDataObjType[] = []
|
|
|
|
|
data.forEach((item: TableDataObjType) => {
|
|
|
|
|
if (irn.includes(item.irn)) {
|
|
|
|
|
result.push(item)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
tableData.value = result
|
|
|
|
|
}
|
|
|
|
|
if (selectList.value.length) {
|
|
|
|
|
const selected = tableData.value.filter((item) => selectList.value.includes(item.irn))
|
|
|
|
|
selected.forEach((item) => {
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
tableRef.value?.toggleRowSelection(item, true)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
throw '获取风机列表失败'
|
2024-10-26 18:18:09 +08:00
|
|
|
|
}
|
2024-10-24 19:13:18 +08:00
|
|
|
|
})
|
2024-11-26 10:51:14 +08:00
|
|
|
|
.catch((err) => {
|
|
|
|
|
ElMessage.error(err)
|
2024-10-24 19:13:18 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getBlongLineList = () => {
|
|
|
|
|
getBelongLineListReq()
|
|
|
|
|
.then((res) => {
|
|
|
|
|
const data = res.data.map((item: any) => {
|
|
|
|
|
return {
|
|
|
|
|
value: item,
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
airBlowerSelectOptions.belongLine = [{ value: '全部', label: '全部' }, ...data]
|
|
|
|
|
})
|
|
|
|
|
.catch((err) => {
|
|
|
|
|
console.log(err)
|
|
|
|
|
})
|
|
|
|
|
}
|
2024-10-17 14:01:38 +08:00
|
|
|
|
|
2024-10-26 18:18:09 +08:00
|
|
|
|
const selectList = ref<string[]>([])
|
2024-10-24 19:13:18 +08:00
|
|
|
|
|
|
|
|
|
const selectTable = (selected: TableDataObjType[]) => {
|
2024-10-26 18:18:09 +08:00
|
|
|
|
selectList.value = selected.map((item) => item.irn)
|
2024-10-24 19:13:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-26 10:51:14 +08:00
|
|
|
|
const autoUpdate = ref(true)
|
2024-10-24 19:13:18 +08:00
|
|
|
|
const autoUpdateInterval = ref<any>(null)
|
|
|
|
|
watch(autoUpdate, (newVal: boolean) => {
|
|
|
|
|
if (newVal) {
|
|
|
|
|
if (autoUpdateInterval.value) return
|
2024-10-25 10:00:42 +08:00
|
|
|
|
ElMessage.success('开启自动刷新')
|
2024-10-24 19:13:18 +08:00
|
|
|
|
autoUpdateInterval.value = setInterval(() => {
|
|
|
|
|
getTableData()
|
|
|
|
|
}, 2000)
|
|
|
|
|
} else {
|
2024-11-26 10:51:14 +08:00
|
|
|
|
if (realDataLineChartVisible.value) {
|
|
|
|
|
ElMessage.warning('关闭自动刷新')
|
|
|
|
|
}
|
2024-10-24 19:13:18 +08:00
|
|
|
|
clearInterval(autoUpdateInterval.value)
|
|
|
|
|
autoUpdateInterval.value = null
|
|
|
|
|
}
|
2024-10-17 14:01:38 +08:00
|
|
|
|
})
|
|
|
|
|
|
2024-10-25 16:36:35 +08:00
|
|
|
|
const openWindTurbine = (row: TableDataObjType) => {
|
|
|
|
|
if (!router.hasRoute('windTurbine')) {
|
|
|
|
|
router.addRoute('admin', {
|
2024-11-08 17:51:17 +08:00
|
|
|
|
path: adminBaseRoutePath + '/windTurbine',
|
2024-10-25 16:36:35 +08:00
|
|
|
|
name: 'windTurbine',
|
|
|
|
|
component: () => import('/@/views/backend/WindBlower/index.vue'),
|
|
|
|
|
meta: {
|
2024-11-08 17:51:17 +08:00
|
|
|
|
title: 'WindBlower',
|
2024-10-25 17:34:28 +08:00
|
|
|
|
menuDesc: '单风机详情',
|
2024-10-26 18:18:09 +08:00
|
|
|
|
addtab: true,
|
2024-10-25 16:36:35 +08:00
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
2024-11-26 10:51:14 +08:00
|
|
|
|
console.log(row)
|
2024-10-25 17:13:39 +08:00
|
|
|
|
|
2024-10-25 16:36:35 +08:00
|
|
|
|
router.push({
|
|
|
|
|
name: 'windTurbine',
|
|
|
|
|
query: {
|
|
|
|
|
irn: row.irn,
|
2024-10-28 18:15:30 +08:00
|
|
|
|
iotModelId: row.iotModelId,
|
2024-11-26 10:51:14 +08:00
|
|
|
|
deviceCode: row.deviceCode,
|
2024-10-25 16:36:35 +08:00
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-05 17:33:49 +08:00
|
|
|
|
const multiTaskVisible = ref(false)
|
|
|
|
|
const mutiTaskTitle = ref('')
|
|
|
|
|
const mutiTaskList = ref<
|
|
|
|
|
{
|
|
|
|
|
loading: 0 | 1 | 2 | 3
|
|
|
|
|
deviceName: string
|
|
|
|
|
sendData: {
|
|
|
|
|
deviceId: string
|
|
|
|
|
serviceName: string
|
|
|
|
|
serviceCode: string
|
|
|
|
|
optDesc: string
|
|
|
|
|
opValue: 1
|
|
|
|
|
}
|
|
|
|
|
}[]
|
|
|
|
|
>([])
|
|
|
|
|
|
2024-11-26 10:51:14 +08:00
|
|
|
|
const selectPointDialogRef = ref()
|
|
|
|
|
const selectPointVisible = ref(false)
|
|
|
|
|
const defaultAttr = computed(() => {
|
|
|
|
|
return dynamicColumn.map((item) => {
|
|
|
|
|
return {
|
|
|
|
|
attributeName: item.label.split(' ')[0],
|
|
|
|
|
unit: item.label.split(' ')[1] ?? '',
|
|
|
|
|
attributeCode: item.prop as string,
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
const openMeasure = () => {
|
|
|
|
|
selectPointVisible.value = true
|
|
|
|
|
}
|
|
|
|
|
const saveSelectPoint = () => {
|
|
|
|
|
const list = selectPointDialogRef.value?.getSelectList()
|
|
|
|
|
if (list) {
|
|
|
|
|
console.log(list)
|
|
|
|
|
|
|
|
|
|
const addCoulmn = list.map((item: any) => {
|
|
|
|
|
return {
|
|
|
|
|
label: item.unit ? item.attributeName + item.unit : item.attributeName,
|
|
|
|
|
prop: item.attributeCode.toLowerCase(),
|
|
|
|
|
align: 'center',
|
|
|
|
|
custom: item.unit ? 'header' : undefined,
|
|
|
|
|
width: 100,
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
tableColumn.value = [...defaultColumn, ...addCoulmn]
|
|
|
|
|
|
|
|
|
|
getTableData()
|
|
|
|
|
selectPointVisible.value = false
|
|
|
|
|
ElMessage.success('选择成功')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const downFun = () => {
|
|
|
|
|
const itemsWithoutAge = tableData.value.map((item) => {
|
|
|
|
|
const { irn, ...rest } = item
|
|
|
|
|
return rest
|
|
|
|
|
})
|
|
|
|
|
if (!tableColumn.value.length || !itemsWithoutAge.length) {
|
|
|
|
|
return []
|
|
|
|
|
}
|
|
|
|
|
const columnSet = new Set(tableColumn.value.map((item) => item.prop))
|
|
|
|
|
const result: any = []
|
|
|
|
|
itemsWithoutAge.forEach((item) => {
|
|
|
|
|
const newItem: any = {}
|
|
|
|
|
for (const itemKey in item) {
|
|
|
|
|
if (columnSet.has(itemKey)) {
|
|
|
|
|
newItem[itemKey] = item[itemKey]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (Object.keys(newItem).length > 0) {
|
|
|
|
|
result.push(newItem)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
let addobj: any = {}
|
|
|
|
|
tableColumn.value.map((v, i) => {
|
|
|
|
|
addobj['rowData' + i] = v.label
|
|
|
|
|
})
|
|
|
|
|
let tableDatadown = JSON.parse(JSON.stringify(result))
|
|
|
|
|
tableDatadown.unshift(addobj)
|
|
|
|
|
console.log(tableDatadown)
|
|
|
|
|
|
|
|
|
|
let str = ``
|
|
|
|
|
for (let i = 0; i < tableDatadown.length; i++) {
|
|
|
|
|
for (let item in tableDatadown[i]) {
|
|
|
|
|
if (typeof tableDatadown[i][item] === 'string') {
|
|
|
|
|
tableDatadown[i][item] = tableDatadown[i][item].replace(/[\n,]/g, (match: any) => (match === '\n' ? ' ' : ','))
|
|
|
|
|
} else {
|
|
|
|
|
console.warn(`tableDatadown[${i}][${item}] is not a string`)
|
|
|
|
|
}
|
|
|
|
|
str += `${tableDatadown[i][item] + '\t'},`
|
|
|
|
|
}
|
|
|
|
|
str += '\n'
|
|
|
|
|
}
|
|
|
|
|
let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str)
|
|
|
|
|
let link = document.createElement('a')
|
|
|
|
|
link.href = uri
|
|
|
|
|
link.download = '实时数据' + Date.now() + '.csv'
|
|
|
|
|
document.body.appendChild(link)
|
|
|
|
|
link.click()
|
|
|
|
|
document.body.removeChild(link)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const clickRowId = ref('')
|
|
|
|
|
const realDataLineChartVisible = ref(false)
|
|
|
|
|
const openLineChart = (row: TableDataObjType) => {
|
|
|
|
|
clickRowId.value = row.irn
|
|
|
|
|
realDataLineChartVisible.value = true
|
|
|
|
|
autoUpdate.value = false
|
|
|
|
|
}
|
|
|
|
|
const closeLineChart = () => {
|
|
|
|
|
autoUpdate.value = true
|
|
|
|
|
}
|
2024-10-25 17:13:39 +08:00
|
|
|
|
onUnmounted(() => {
|
|
|
|
|
autoUpdateInterval.value && clearInterval(autoUpdateInterval.value)
|
|
|
|
|
autoUpdateInterval.value = null
|
|
|
|
|
})
|
2024-10-24 19:13:18 +08:00
|
|
|
|
getTableData()
|
|
|
|
|
getBlongLineList()
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
|
.airBlower {
|
2024-11-06 09:50:34 +08:00
|
|
|
|
width: 100%;
|
2024-10-17 14:01:38 +08:00
|
|
|
|
height: 100%;
|
|
|
|
|
.containerPart {
|
2024-11-06 16:10:30 +08:00
|
|
|
|
width: 100%;
|
2024-10-17 14:01:38 +08:00
|
|
|
|
height: 100%;
|
|
|
|
|
.headerPart {
|
|
|
|
|
padding: 20px;
|
2024-11-06 16:10:30 +08:00
|
|
|
|
width: 100%;
|
|
|
|
|
height: 60px;
|
2024-10-17 14:01:38 +08:00
|
|
|
|
display: flex;
|
2024-11-26 10:51:14 +08:00
|
|
|
|
// justify-content: space-between;
|
2024-10-17 14:01:38 +08:00
|
|
|
|
align-items: center;
|
|
|
|
|
.headerLeft {
|
|
|
|
|
display: flex;
|
2024-11-26 10:51:14 +08:00
|
|
|
|
flex-shrink: 0;
|
2024-10-17 14:01:38 +08:00
|
|
|
|
.selectPart {
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
align-items: center;
|
|
|
|
|
height: 40px;
|
|
|
|
|
margin-right: 20px;
|
|
|
|
|
span {
|
|
|
|
|
margin-right: 10px;
|
|
|
|
|
}
|
|
|
|
|
.airBlowerSelect {
|
|
|
|
|
width: 200px;
|
|
|
|
|
:deep(.el-select__wrapper) {
|
|
|
|
|
height: 40px;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-11-26 10:51:14 +08:00
|
|
|
|
.headerCenter {
|
|
|
|
|
width: 212px;
|
|
|
|
|
margin-left: 30px;
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
.el-button {
|
|
|
|
|
width: 100px;
|
|
|
|
|
height: 40px;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-10-17 14:01:38 +08:00
|
|
|
|
.headerRight {
|
2024-11-26 10:51:14 +08:00
|
|
|
|
margin-left: auto;
|
|
|
|
|
width: 336px;
|
2024-10-17 14:01:38 +08:00
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
.el-button {
|
|
|
|
|
width: 100px;
|
|
|
|
|
height: 40px;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.mainPart {
|
2024-11-06 16:10:30 +08:00
|
|
|
|
width: 100%;
|
|
|
|
|
height: calc(100% - 60px);
|
2024-11-26 10:51:14 +08:00
|
|
|
|
.tableClass {
|
2024-11-20 09:00:15 +08:00
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
}
|
2024-10-24 19:13:18 +08:00
|
|
|
|
.tableColumnClick {
|
|
|
|
|
text-decoration: underline;
|
|
|
|
|
color: #00a4ff;
|
|
|
|
|
cursor: pointer;
|
2024-10-17 14:01:38 +08:00
|
|
|
|
}
|
2024-11-26 10:51:14 +08:00
|
|
|
|
.operate {
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
align-items: center;
|
|
|
|
|
.chartIcon {
|
|
|
|
|
width: 16px;
|
|
|
|
|
height: 16px;
|
|
|
|
|
}
|
|
|
|
|
&:hover {
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-10-17 14:01:38 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-11-05 17:33:49 +08:00
|
|
|
|
|
|
|
|
|
.mutiTaskName {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 40px;
|
|
|
|
|
line-height: 40px;
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
}
|
|
|
|
|
.mutiTaskStatus {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: right;
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 40px;
|
|
|
|
|
}
|
|
|
|
|
.mutiTaskLoading {
|
|
|
|
|
animation: rotate 1s linear infinite;
|
|
|
|
|
}
|
|
|
|
|
@keyframes rotate {
|
|
|
|
|
0% {
|
|
|
|
|
transform: rotate(0deg);
|
|
|
|
|
}
|
|
|
|
|
100% {
|
|
|
|
|
transform: rotate(360deg);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-11-26 10:51:14 +08:00
|
|
|
|
|
|
|
|
|
.selectPointDialogFooter {
|
|
|
|
|
text-align: center;
|
|
|
|
|
.el-button {
|
|
|
|
|
width: 120px;
|
|
|
|
|
height: 40px;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-10-17 14:01:38 +08:00
|
|
|
|
</style>
|