联调补招日志功能
This commit is contained in:
@@ -12,7 +12,9 @@ useSetTheme()
|
||||
onMounted(async () => {
|
||||
const response = await fetch('/')
|
||||
const WebSocketUrl:any = response.headers.get('X-WebSocket-Url')
|
||||
const WebSocketUrl2:any = response.headers.get('X-WebSocket-Url2')
|
||||
const MqttUrl:any = response.headers.get('X-MqttUrl-Url')
|
||||
localStorage.setItem('WebSocketUrl2', WebSocketUrl2)
|
||||
localStorage.setItem('WebSocketUrl', WebSocketUrl)
|
||||
localStorage.setItem('MqttUrl', MqttUrl)
|
||||
})
|
||||
|
||||
@@ -38,15 +38,18 @@ export default class SocketService {
|
||||
}
|
||||
|
||||
// 定义连接服务器的方法
|
||||
public async connect(id: string) {
|
||||
public async connect(url: string) {
|
||||
if (!window.WebSocket) {
|
||||
console.log('您的浏览器不支持WebSocket')
|
||||
return
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
// ws://192.168.1.69:10407/mgtt/api/pushMessage/
|
||||
const url = (localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/') + id
|
||||
// ws://192.168.1.69:10407/mgtt
|
||||
// const url =
|
||||
// (localStorage.getItem('WebSocketUrl') == 'null'
|
||||
// ? 'ws://192.168.1.130:10405'
|
||||
// : localStorage.getItem('WebSocketUrl')) + id
|
||||
this.ws = new WebSocket(url)
|
||||
|
||||
this.ws.onopen = () => this.handleOpen()
|
||||
@@ -87,6 +90,7 @@ export default class SocketService {
|
||||
|
||||
if (event.data == '连接成功') {
|
||||
this.sendHeartbeat()
|
||||
} else if (event.data == 'connect') {
|
||||
} else if (event.data.length > 10) {
|
||||
let message: MessageType
|
||||
try {
|
||||
@@ -99,7 +103,8 @@ export default class SocketService {
|
||||
// console.log("🚀 ~ SocketService ~ handleMessage ~ message:", message)
|
||||
|
||||
// 通过接受服务端发送的type字段来回调函数
|
||||
if (message.key && this.callBackMapping['message']) {
|
||||
|
||||
if ((message.key || message.code) && this.callBackMapping['message']) {
|
||||
this.callBackMapping['message']!(message)
|
||||
} else {
|
||||
console.log('抛弃====>')
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<span style="line-height: 32px">公共连接点参数</span>
|
||||
</div>
|
||||
</template>
|
||||
<div :style="`height: calc(${height} - 380px);overflow-y: auto;max-height:350px`">
|
||||
<div :style="`height: calc(${height} - 420px);overflow-y: auto;max-height:350px`">
|
||||
<el-form
|
||||
ref="formRef"
|
||||
:model="form"
|
||||
@@ -101,7 +101,7 @@
|
||||
</el-select>
|
||||
</div>
|
||||
</template>
|
||||
<div :style="`height: calc(${height} - 380px);overflow-y: auto;max-height:350px`">
|
||||
<div :style="`height: calc(${height} - 420px);overflow-y: auto;max-height:350px`">
|
||||
<vxe-table v-bind="defaultAttribute" ref="vxeRef" height="auto" :data="equipmentList">
|
||||
<vxe-column field="devName" title="终端名称"></vxe-column>
|
||||
<vxe-column field="devScale" title="电压等级" :formatter="formatter"></vxe-column>
|
||||
@@ -109,41 +109,6 @@
|
||||
</vxe-table>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
|
||||
<div class="bottomBox pt1" id="exportId">
|
||||
<div v-if="showFlag">
|
||||
<el-divider content-position="left">一级评估</el-divider>
|
||||
<div style="height: 40px" class="pl30">
|
||||
结果: {{ outcome.firstResult }}%
|
||||
{{ outcome.firstResult > 0.1 ? '>' : (outcome.firstResult = 0.1 ? '=' : '<') }} 0.1%
|
||||
|
||||
<el-tag v-if="outcome.firstResult < 0.1" type="success" effect="dark">满足</el-tag>
|
||||
<el-tag v-else type="warning" effect="dark">不满足</el-tag>
|
||||
</div>
|
||||
<div style="height: 220px" v-if="!(outcome.firstResult < 0.1)" class="mb10">
|
||||
<el-divider content-position="left">二级评估</el-divider>
|
||||
<div class="evaluateTheResults">
|
||||
<div style="height: 200px; flex: 1">
|
||||
<vxe-table style="flex: 1.5" v-bind="defaultAttribute" height="auto" :data="level2Data">
|
||||
<vxe-column field="name" title="谐波次数" width="180"></vxe-column>
|
||||
<vxe-column v-for="item in column" :field="item.field" :title="item.title">
|
||||
<template #default="row">
|
||||
<span v-if="row.row.name == '是否允许值'">
|
||||
<Select v-if="row.row[row.column.field]" class="SelectIcon" />
|
||||
<CloseBold v-else class="SelectIcon" style="color: #f38d07" />
|
||||
</span>
|
||||
<span v-else>{{ row.row[row.column.field] }}</span>
|
||||
</template>
|
||||
</vxe-column>
|
||||
</vxe-table>
|
||||
</div>
|
||||
<div style="height: 200px; width: 350px">
|
||||
<MyEChart style="flex: 1" :options="pieCharts" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-group">
|
||||
<el-button
|
||||
type="primary"
|
||||
@@ -160,6 +125,41 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bottomBox pt1 mt40" id="exportId">
|
||||
<div v-if="showFlag">
|
||||
<el-divider content-position="left">一级评估</el-divider>
|
||||
<div style="height: 40px" class="pl30">
|
||||
结果: {{ outcome.firstResult }}%
|
||||
{{ outcome.firstResult > 0.1 ? '>' : (outcome.firstResult = 0.1 ? '=' : '<') }} 0.1%
|
||||
|
||||
<el-tag v-if="outcome.firstResult < 0.1" type="success" effect="dark">满足</el-tag>
|
||||
<el-tag v-else type="warning" effect="dark">不满足</el-tag>
|
||||
</div>
|
||||
<div style="height: 220px" v-if="!(outcome.firstResult < 0.1)" class="mb10">
|
||||
<el-divider content-position="left">二级评估</el-divider>
|
||||
<div class="evaluateTheResults">
|
||||
<div style="height: 200px; width: calc(100% - 350px)">
|
||||
<vxe-table v-bind="defaultAttribute" height="auto" :data="level2Data">
|
||||
<vxe-column field="name" title="谐波次数" width="180"></vxe-column>
|
||||
<vxe-column v-for="item in column" :field="item.field" :title="item.title">
|
||||
<template #default="row">
|
||||
<span v-if="row.row.name == '是否允许值'">
|
||||
<Select v-if="row.row[row.column.field]" class="SelectIcon" />
|
||||
<CloseBold v-else class="SelectIcon" style="color: #f38d07" />
|
||||
</span>
|
||||
<span v-else>{{ row.row[row.column.field] }}</span>
|
||||
</template>
|
||||
</vxe-column>
|
||||
</vxe-table>
|
||||
</div>
|
||||
<div style="height: 200px; width: 350px">
|
||||
<MyEChart :options="pieCharts" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<el-dialog draggable v-model="dialogVisible" title="新增干扰源类型" width="70%">
|
||||
<vxe-table v-bind="defaultAttribute" height="400px" ref="xTable" :data="userData">
|
||||
<vxe-column type="checkbox" width="60"></vxe-column>
|
||||
@@ -450,13 +450,20 @@ const selChange = async (e: any) => {
|
||||
}
|
||||
// 导出
|
||||
const onExport = () => {
|
||||
console.log("🚀 ~ onExport ~ document.getElementById('exportId'):", document.getElementById('exportId'))
|
||||
|
||||
// 转换成canvas
|
||||
html2canvas(document.getElementById('exportId'), {
|
||||
scale: 2
|
||||
useCORS: true, // 允许跨域图片
|
||||
allowTaint: true, // 允许污染的画布
|
||||
logging: false, // 关闭日志
|
||||
scale: 2 // 提高缩放比例以获得更清晰的截图
|
||||
}).then(function (canvas) {
|
||||
console.log('🚀 ~ onExport ~ canvas:', canvas)
|
||||
// 创建a标签,实现下载
|
||||
let creatIMg = document.createElement('a')
|
||||
creatIMg.download = '光伏电站承载能力评估结果.png' // 设置下载的文件名,
|
||||
|
||||
creatIMg.href = canvas.toDataURL() // 下载url
|
||||
creatIMg.click()
|
||||
creatIMg.remove() // 下载之后把创建的元素删除
|
||||
@@ -477,13 +484,10 @@ onMounted(() => {
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.bottomBox {
|
||||
position: relative;
|
||||
.button-group {
|
||||
.button-group {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
bottom: -45px;
|
||||
right: 10px;
|
||||
}
|
||||
}
|
||||
// .card-header {
|
||||
// font-weight: 600;
|
||||
@@ -501,8 +505,18 @@ onMounted(() => {
|
||||
}
|
||||
.card-container {
|
||||
display: flex;
|
||||
position: relative;
|
||||
}
|
||||
.evaluateTheResults {
|
||||
display: flex;
|
||||
}
|
||||
:deep(.el-tag) {
|
||||
display: inline-block;
|
||||
width: 55px;
|
||||
height: 24px;
|
||||
.el-tag__content{
|
||||
line-height: 23px;
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -108,10 +108,22 @@
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
|
||||
<div class="btnBox mt10 mr10">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-VideoPlay"
|
||||
@click="assess"
|
||||
v-if="showBtn && props.rowList.id == undefined && !showAssess"
|
||||
>
|
||||
启动评估
|
||||
</el-button>
|
||||
<el-button type="primary" icon="el-icon-Download" @click="onExport" v-if="showAssess">
|
||||
导出结果
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="bottomBox pt1" id="evaluateTheResults">
|
||||
<el-divider content-position="left" v-show="showBtn">评估结果</el-divider>
|
||||
<div class="bottomBox">
|
||||
<div class="evaluateTheResults" id="evaluateTheResults" v-if="showAssess">
|
||||
<div class="evaluateTheResults" v-if="showAssess">
|
||||
<div style="height: 250px; flex: 1">
|
||||
<vxe-table
|
||||
style="flex: 1.5"
|
||||
@@ -125,25 +137,25 @@
|
||||
</vxe-colgroup>
|
||||
<vxe-column field="level1" title="安全">
|
||||
<template #default="{ row }">
|
||||
<Select v-if="row.level1 == 1" class="SelectIcon" style="color: #2E7D32" />
|
||||
<Select v-if="row.level1 == 1" class="SelectIcon" style="color: #2e7d32" />
|
||||
<span v-else>{{ row.level1 }}</span>
|
||||
</template>
|
||||
</vxe-column>
|
||||
<vxe-column field="level2" title="III级预警">
|
||||
<template #default="{ row }">
|
||||
<Select v-if="row.level2 == 1" class="SelectIcon" style="color: #0288D1" />
|
||||
<Select v-if="row.level2 == 1" class="SelectIcon" style="color: #0288d1" />
|
||||
<span v-else>{{ row.level2 }}</span>
|
||||
</template>
|
||||
</vxe-column>
|
||||
<vxe-column field="level3" title="II级预警">
|
||||
<template #default="{ row }">
|
||||
<Select v-if="row.level3 == 1" class="SelectIcon" style="color: #F57C00" />
|
||||
<Select v-if="row.level3 == 1" class="SelectIcon" style="color: #f57c00" />
|
||||
<span v-else>{{ row.level3 }}</span>
|
||||
</template>
|
||||
</vxe-column>
|
||||
<vxe-column field="level4" title="I级预警">
|
||||
<template #default="{ row }">
|
||||
<Select v-if="row.level4 == 1" class="SelectIcon" style="color: #C62828" />
|
||||
<Select v-if="row.level4 == 1" class="SelectIcon" style="color: #c62828" />
|
||||
<span v-else>{{ row.level4 }}</span>
|
||||
</template>
|
||||
</vxe-column>
|
||||
@@ -153,18 +165,6 @@
|
||||
<MyEChart style="flex: 1" :options="pieCharts" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-VideoPlay"
|
||||
@click="assess"
|
||||
v-if="showBtn && props.rowList.id == undefined && !showAssess"
|
||||
>
|
||||
启动评估
|
||||
</el-button>
|
||||
<el-button type="primary" icon="el-icon-Download" @click="onExport" v-if="showAssess">
|
||||
导出结果
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</pane>
|
||||
@@ -209,7 +209,7 @@ const size = ref(0)
|
||||
const dictData = useDictData()
|
||||
const datePickerRef = ref()
|
||||
const height = mainHeight(80).height
|
||||
const tabsHeight = mainHeight(260).height
|
||||
const tabsHeight = mainHeight(300).height
|
||||
const voltageLevelArr = dictData.getBasicData('Dev_Voltage_Stand')
|
||||
const tableData: any = ref([
|
||||
{
|
||||
@@ -347,12 +347,12 @@ const onSubmit = async () => {
|
||||
}))
|
||||
|
||||
// 设置有功功率图表
|
||||
setEChart(1, res1.data.data, '有功功率', 'w')
|
||||
setEChart(1, res1.data.data, '有功功率', 'kW')
|
||||
|
||||
// 获取无功功率数据并设置图表
|
||||
const res2 = await queryCarryCapacityQData(form)
|
||||
q_βminMap.value = res2.data.q_βminMap
|
||||
setEChart(2, res2.data.data, '无功功率', 'Var')
|
||||
setEChart(2, res2.data.data, '无功功率', 'kVar')
|
||||
|
||||
// 获取谐波电流数据并设置图表
|
||||
const res3 = await queryCarryCapacityIData(form)
|
||||
@@ -415,7 +415,7 @@ const amplitudeQuery = async (e: any) => {
|
||||
const res3 = await queryCarryCapacityIData(form)
|
||||
i_βmax.value = res3.data.i_βmax
|
||||
setEChart(3, res3.data.data, '谐波电流幅值', 'A')
|
||||
options.value=options3.value
|
||||
options.value = options3.value
|
||||
currentLod.value = false
|
||||
}
|
||||
// 用户变化
|
||||
@@ -839,15 +839,11 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
.bottomBox {
|
||||
position: relative;
|
||||
|
||||
.el-button {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
right: 10px;
|
||||
top: -10px;
|
||||
}
|
||||
margin-top: -3px;
|
||||
}
|
||||
.btnBox {
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
}
|
||||
|
||||
:deep(.vxe-table--header thead tr:first-of-type th:first-of-type) {
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
</div>
|
||||
</template>
|
||||
</vxe-column>
|
||||
<vxe-column field="comparisonOperators3" title="畸次谐波合格个数">
|
||||
<vxe-column field="comparisonOperators3" title="奇次谐波合格个数">
|
||||
<template #default="row">
|
||||
<div class="cellBox" @click="cells(row, row.row.comparisonOperators3, row.row.count3, 3)">
|
||||
{{ symbolJudgment(row.row.comparisonOperators3)
|
||||
|
||||
@@ -165,11 +165,11 @@ const tableStore: any = new TableStore({
|
||||
confirmButtonText: '确认',
|
||||
cancelButtonText: '取消',
|
||||
confirmButtonType: 'danger',
|
||||
title: '确定删除?'
|
||||
title: '确定禁止接入?'
|
||||
},
|
||||
click: row => {
|
||||
remove({ ids: row.id }).then(() => {
|
||||
ElMessage.success('删除成功')
|
||||
ElMessage.success('禁止接入成功')
|
||||
tableStore.index()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
v-model="formData.maxProcessNum"
|
||||
onkeyup="value = value.replace(/[^0-9]/g,'')"
|
||||
maxlength="5"
|
||||
placeholder="请输入最大进程数"
|
||||
placeholder="请根据监测点规模填写合适进程数(1个进程最大可承载200个监测点)"
|
||||
></el-input>
|
||||
<!-- <el-select v-model="formData.maxProcessNum" placeholder="请选择等级" style="width: 100%">
|
||||
<el-option
|
||||
|
||||
@@ -4,32 +4,18 @@
|
||||
<TableHeader date-picker ref="tableHeaderRef">
|
||||
<template #select>
|
||||
<el-form-item label="统计类型:">
|
||||
<el-select
|
||||
v-model="formData.statisticalType"
|
||||
placeholder="请选择统计类型"
|
||||
value-key="id"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in classificationData"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item"
|
||||
></el-option>
|
||||
<el-select v-model="formData.statisticalType" placeholder="请选择统计类型" value-key="id"
|
||||
style="width: 100%">
|
||||
<el-option v-for="item in classificationData" :key="item.id" :label="item.name"
|
||||
:value="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="区域选择:">
|
||||
<!-- <el-select ref="select1" v-model="deptName" placeholder="请选择所属部门区域" style="width: 100%">
|
||||
<el-option :value="formData.deptIndex" style="height: auto"> -->
|
||||
<!-- {{ formData.deptIndex }} -->
|
||||
<el-cascader
|
||||
v-model="formData.deptIndex"
|
||||
:props="defaultProps"
|
||||
:options="treeData"
|
||||
filterable
|
||||
collapse-tags
|
||||
placeholder="请选择区域"
|
||||
/>
|
||||
<el-cascader v-model="formData.deptIndex" :props="defaultProps" :options="treeData" filterable
|
||||
collapse-tags placeholder="请选择区域" />
|
||||
<!-- <el-tree
|
||||
ref="tree"
|
||||
v-model="formData.deptName"
|
||||
@@ -43,62 +29,29 @@
|
||||
<template #default="{ node, data }">
|
||||
<span :title="data.name">{{ data?.name }}</span>
|
||||
</template>
|
||||
</el-tree> -->
|
||||
</el-tree> -->
|
||||
<!-- </el-option>
|
||||
</el-select> -->
|
||||
</el-form-item>
|
||||
<el-form-item label="电压等级:">
|
||||
<el-select
|
||||
v-model="formData.scale"
|
||||
multiple
|
||||
collapse-tags
|
||||
clearable
|
||||
placeholder="请选择电压等级"
|
||||
style="width: 100%"
|
||||
value-key="id"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in voltageleveloption"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item"
|
||||
></el-option>
|
||||
<el-select v-model="formData.scale" multiple collapse-tags clearable placeholder="请选择电压等级"
|
||||
style="width: 100%" value-key="id">
|
||||
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name"
|
||||
:value="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="终端厂家:">
|
||||
<el-select
|
||||
v-model="formData.manufacturer"
|
||||
multiple
|
||||
collapse-tags
|
||||
clearable
|
||||
placeholder="请选择终端厂家"
|
||||
style="width: 100%"
|
||||
value-key="id"
|
||||
>
|
||||
<el-option
|
||||
v-for="(item, index) in terminaloption"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item"
|
||||
></el-option>
|
||||
<el-select v-model="formData.manufacturer" multiple collapse-tags clearable
|
||||
placeholder="请选择终端厂家" style="width: 100%" value-key="id">
|
||||
<el-option v-for="(item, index) in terminaloption" :key="index" :label="item.name"
|
||||
:value="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="干扰源类型:">
|
||||
<el-select
|
||||
v-model="formData.loadType"
|
||||
multiple
|
||||
collapse-tags
|
||||
clearable
|
||||
placeholder="请选择干扰源类型"
|
||||
style="width: 100%"
|
||||
value-key="id"
|
||||
>
|
||||
<el-option
|
||||
v-for="(item, index) in interfereoption"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item"
|
||||
></el-option>
|
||||
<el-select v-model="formData.loadType" multiple collapse-tags clearable placeholder="请选择干扰源类型"
|
||||
style="width: 100%" value-key="id">
|
||||
<el-option v-for="(item, index) in interfereoption" :key="index" :label="item.name"
|
||||
:value="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</template>
|
||||
@@ -110,45 +63,41 @@
|
||||
<div class="online_main">
|
||||
<el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
|
||||
<el-tab-pane :name="0" :lazy="true" label="数据完整性列表">
|
||||
<Table
|
||||
ref="tableRef"
|
||||
:tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }"
|
||||
<Table ref="tableRef" :tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }"
|
||||
:checkbox-config="{ labelField: 'name', checkMethod: ({ row }) => true }"
|
||||
:scroll-y="{ enabled: true }"
|
||||
v-if="activeName == 0"
|
||||
/>
|
||||
:scroll-y="{ enabled: true }" v-if="activeName == 0" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane :name="1" :lazy="true" label="数据完整性图表">
|
||||
<charts v-if="activeName == 1" ref="chartsRef" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
<el-dialog v-model="dialogVisible" draggable title="补招" width="500">
|
||||
<el-dialog v-model="timePopUp" draggable title="补招" width="500">
|
||||
补招时间:
|
||||
<el-date-picker
|
||||
v-model="timeData"
|
||||
type="datetimerange"
|
||||
format="YYYY-MM-DD HH:mm:00"
|
||||
value-format="YYYY-MM-DD HH:mm:00"
|
||||
range-separator="至"
|
||||
date-format="YYYY-MM-DD"
|
||||
time-format="HH:mm:00"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
style="width: 400px"
|
||||
:disabledDate="disabledDate"
|
||||
/>
|
||||
<el-date-picker v-model="timeData" type="datetimerange" format="YYYY-MM-DD HH:mm:00"
|
||||
value-format="YYYY-MM-DD HH:mm:00" range-separator="至" date-format="YYYY-MM-DD" time-format="HH:mm:00"
|
||||
start-placeholder="开始日期" end-placeholder="结束日期" style="width: 400px" :disabledDate="disabledDate" />
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button @click="timePopUp = false">取消</el-button>
|
||||
<el-button type="primary" @click="makeUpSubmit">确认</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog v-model="logPopUp" draggable title="补招日志" width="800" @close="close">
|
||||
<div class="logList" ref="logRef">
|
||||
<p v-for="item in logList" :style="{
|
||||
color: item.type === 'error' ? '#F56C6C' : ''
|
||||
}">
|
||||
<div style="width: 150px;"> {{ item.time }}</div>
|
||||
<div style="flex: 1;">{{ item.name }}</div>
|
||||
</p>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ref, onMounted, watch } from 'vue'
|
||||
import { ref, onMounted, watch, nextTick } from 'vue'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import DatePicker from '@/components/form/datePicker/index.vue'
|
||||
import { getAreaDept, FullRecall } from '@/api/harmonic-boot/area'
|
||||
@@ -157,14 +106,23 @@ import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
import charts from './components/charts.vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { el, fa, tr } from 'element-plus/es/locale'
|
||||
import socketClient from '@/utils/webSocketClient'
|
||||
import { formatDate } from '@/utils/formatTime'
|
||||
import { useAdminInfo } from '@/stores/adminInfo'
|
||||
const adminInfo = useAdminInfo()
|
||||
defineOptions({
|
||||
name: 'harmonic-boot/harmonic/getIntegrityData'
|
||||
})
|
||||
const logRef = ref()
|
||||
const tableRef = ref()
|
||||
const chartsRef = ref()
|
||||
const dictData = useDictData()
|
||||
const dialogVisible = ref(false)
|
||||
const timePopUp = ref(false)
|
||||
const logPopUp = ref(false)
|
||||
//开始创建webSocket客户端
|
||||
const dataSocket = reactive({
|
||||
socketServe: socketClient.Instance
|
||||
})
|
||||
//字典获取电压等级
|
||||
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
|
||||
//字典获取终端厂家
|
||||
@@ -177,6 +135,7 @@ const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Ty
|
||||
const treeData = ref([])
|
||||
const idArr = ref([])
|
||||
const timeData = ref([])
|
||||
const logList: any = ref([])
|
||||
const activeName = ref(0)
|
||||
const getTreeData = async () => {
|
||||
await getAreaDept().then(res => {
|
||||
@@ -199,6 +158,7 @@ const formData = ref({
|
||||
// searchBeginTime: '',
|
||||
// searchEndTime: ''
|
||||
})
|
||||
|
||||
formData.value.deptIndex = treeData.value[0]?.id
|
||||
const defaultProps = ref({
|
||||
label: 'name',
|
||||
@@ -382,7 +342,7 @@ const tree2List = (list: any, id?: string) => {
|
||||
const disabledDate = (date: Date) => {
|
||||
return date > new Date() // 如果日期大于当前日期,则禁用
|
||||
}
|
||||
onMounted(() => {})
|
||||
onMounted(() => { })
|
||||
// 补招
|
||||
const makeUp = () => {
|
||||
// tableRef.value && tableRef.value.getRef().getCheckboxRecords()
|
||||
@@ -398,7 +358,8 @@ const makeUp = () => {
|
||||
type: 'warning'
|
||||
})
|
||||
}
|
||||
dialogVisible.value = true
|
||||
timeData.value = []
|
||||
timePopUp.value = true
|
||||
}
|
||||
// 补招提交
|
||||
const makeUpSubmit = () => {
|
||||
@@ -408,8 +369,7 @@ const makeUpSubmit = () => {
|
||||
type: 'warning'
|
||||
})
|
||||
}
|
||||
|
||||
FullRecall({
|
||||
let form = {
|
||||
monitorId: tableRef.value
|
||||
.getRef()
|
||||
.getCheckboxRecords()
|
||||
@@ -417,13 +377,36 @@ const makeUpSubmit = () => {
|
||||
.map(item => item.id),
|
||||
reCallEndTime: timeData.value[1],
|
||||
reCallStartTime: timeData.value[0]
|
||||
}).then(res => {
|
||||
ElMessage({
|
||||
message: '补招命令下发成功',
|
||||
type: 'success'
|
||||
}
|
||||
|
||||
socket(form)
|
||||
timePopUp.value = false
|
||||
logPopUp.value = true
|
||||
}
|
||||
const socket = async (form: any) => {
|
||||
const url = (localStorage.getItem('WebSocketUrl2') || 'ws://192.168.1.67:10405/api/recell/')
|
||||
logList.value = []
|
||||
await dataSocket.socketServe.connect(`${url}${adminInfo.id}`)
|
||||
await dataSocket.socketServe.send(form)
|
||||
logList.value.push({
|
||||
type: '',
|
||||
time: formatDate(new Date(), 'YYYY-MM-DD hh:mm:ss'),
|
||||
name: '开始补召,请稍等...',
|
||||
})
|
||||
dialogVisible.value = false
|
||||
await dataSocket.socketServe.registerCallBack('message', (res: any) => {
|
||||
logList.value.push({
|
||||
type: res.code == 500 ? 'error' : '',
|
||||
time: formatDate(new Date(), 'YYYY-MM-DD hh:mm:ss'),
|
||||
name: res.message
|
||||
})
|
||||
|
||||
setTimeout(() => {
|
||||
logRef.value && (logRef.value.scrollTop = (logRef.value.scrollHeight + 30))
|
||||
}, 10)
|
||||
})
|
||||
}
|
||||
const close = () => {
|
||||
dataSocket.socketServe?.closeWs()
|
||||
}
|
||||
watch(
|
||||
() => treeData.value,
|
||||
@@ -438,6 +421,8 @@ watch(
|
||||
deep: true
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
// .online {
|
||||
@@ -541,4 +526,14 @@ watch(
|
||||
color: var(--el-color-primary-light-3) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.logList {
|
||||
height: 300px;
|
||||
overflow-y: auto;
|
||||
|
||||
p {
|
||||
margin-bottom: 10px;
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -31,38 +31,38 @@
|
||||
<div>电压</div>
|
||||
<div>
|
||||
A相:
|
||||
<span style="color: #DAA520">
|
||||
<span style="color: #daa520">
|
||||
{{ echartsData1?.options?.series[1].data[0].value }}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
B相:
|
||||
<span style="color: #2E8B57">
|
||||
<span style="color: #2e8b57">
|
||||
{{ echartsData1?.options?.series[1].data[1].value }}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
C相:
|
||||
<span style="color: #A52a2a">
|
||||
<span style="color: #a52a2a">
|
||||
{{ echartsData1?.options?.series[1].data[2].value }}
|
||||
</span>
|
||||
</div>
|
||||
<div style="margin-top: 10px">电流</div>
|
||||
<div>
|
||||
A相:
|
||||
<span style="color: #DAA520">
|
||||
<span style="color: #daa520">
|
||||
{{ echartsData1?.options?.series[0].data[0].value }}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
B相:
|
||||
<span style="color: #2E8B57">
|
||||
<span style="color: #2e8b57">
|
||||
{{ echartsData1?.options?.series[0].data[1].value }}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
C相:
|
||||
<span style="color: #A52a2a">
|
||||
<span style="color: #a52a2a">
|
||||
{{ echartsData1?.options?.series[0].data[2].value }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -744,6 +744,7 @@ const initEcharts = (color: string, key: number) => {
|
||||
}
|
||||
//渲染echarts
|
||||
const init = () => {
|
||||
const url = (localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/')
|
||||
echartsDataV1.value = initEcharts('#DAA520', 0)
|
||||
echartsDataV2.value = initEcharts('#2E8B57', 0)
|
||||
echartsDataV3.value = initEcharts('#A52a2a', 0)
|
||||
@@ -763,7 +764,9 @@ const init = () => {
|
||||
})
|
||||
}
|
||||
let pids = monitoringPoint.state.pid.split(',')
|
||||
dataSocket.socketServe.connect(`${adminInfo.id},${monitoringPoint.state.lineId},${pids[pids.length - 2]}`)
|
||||
dataSocket.socketServe.connect(
|
||||
`${url}${adminInfo.id},${monitoringPoint.state.lineId},${pids[pids.length - 2]}`
|
||||
)
|
||||
dataSocket.socketServe.registerCallBack('message', (res: any) => {
|
||||
txtContent.value = res.value
|
||||
let data = JSON.parse(res.value)
|
||||
|
||||
@@ -127,7 +127,7 @@ const LngLat = [
|
||||
]
|
||||
import { getAssessOverview } from '@/api/device-boot/panorama'
|
||||
|
||||
narimap.Require(['PSRMap', 'Thematic', 'Components.Query','Components.MapSelector', 'Components.RegionSelector'], () => {
|
||||
narimap.Require(['PSRMap', 'Thematic','ManageGrid', 'Components.Query','Components.MapSelector', 'Components.RegionSelector'], () => {
|
||||
if (narimap.Config.examples.notlogin) {
|
||||
initMap(narimap.Config.styles.sjRaster)
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user