联调补招日志功能

This commit is contained in:
guanj
2025-08-26 09:45:01 +08:00
parent d6c494bd96
commit e277fd01a3
10 changed files with 5431 additions and 5416 deletions

View File

@@ -12,7 +12,9 @@ useSetTheme()
onMounted(async () => { onMounted(async () => {
const response = await fetch('/') const response = await fetch('/')
const WebSocketUrl:any = response.headers.get('X-WebSocket-Url') 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') const MqttUrl:any = response.headers.get('X-MqttUrl-Url')
localStorage.setItem('WebSocketUrl2', WebSocketUrl2)
localStorage.setItem('WebSocketUrl', WebSocketUrl) localStorage.setItem('WebSocketUrl', WebSocketUrl)
localStorage.setItem('MqttUrl', MqttUrl) localStorage.setItem('MqttUrl', MqttUrl)
}) })

View File

@@ -38,15 +38,18 @@ export default class SocketService {
} }
// 定义连接服务器的方法 // 定义连接服务器的方法
public async connect(id: string) { public async connect(url: string) {
if (!window.WebSocket) { if (!window.WebSocket) {
console.log('您的浏览器不支持WebSocket') console.log('您的浏览器不支持WebSocket')
return return
} }
setTimeout(() => { setTimeout(() => {
// ws://192.168.1.69:10407/mgtt/api/pushMessage/ // ws://192.168.1.69:10407/mgtt
const url = (localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/') + id // const url =
// (localStorage.getItem('WebSocketUrl') == 'null'
// ? 'ws://192.168.1.130:10405'
// : localStorage.getItem('WebSocketUrl')) + id
this.ws = new WebSocket(url) this.ws = new WebSocket(url)
this.ws.onopen = () => this.handleOpen() this.ws.onopen = () => this.handleOpen()
@@ -87,6 +90,7 @@ export default class SocketService {
if (event.data == '连接成功') { if (event.data == '连接成功') {
this.sendHeartbeat() this.sendHeartbeat()
} else if (event.data == 'connect') {
} else if (event.data.length > 10) { } else if (event.data.length > 10) {
let message: MessageType let message: MessageType
try { try {
@@ -99,7 +103,8 @@ export default class SocketService {
// console.log("🚀 ~ SocketService ~ handleMessage ~ message:", message) // console.log("🚀 ~ SocketService ~ handleMessage ~ message:", message)
// 通过接受服务端发送的type字段来回调函数 // 通过接受服务端发送的type字段来回调函数
if (message.key && this.callBackMapping['message']) {
if ((message.key || message.code) && this.callBackMapping['message']) {
this.callBackMapping['message']!(message) this.callBackMapping['message']!(message)
} else { } else {
console.log('抛弃====>') console.log('抛弃====>')

View File

@@ -7,7 +7,7 @@
<span style="line-height: 32px">公共连接点参数</span> <span style="line-height: 32px">公共连接点参数</span>
</div> </div>
</template> </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 <el-form
ref="formRef" ref="formRef"
:model="form" :model="form"
@@ -101,7 +101,7 @@
</el-select> </el-select>
</div> </div>
</template> </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-table v-bind="defaultAttribute" ref="vxeRef" height="auto" :data="equipmentList">
<vxe-column field="devName" title="终端名称"></vxe-column> <vxe-column field="devName" title="终端名称"></vxe-column>
<vxe-column field="devScale" title="电压等级" :formatter="formatter"></vxe-column> <vxe-column field="devScale" title="电压等级" :formatter="formatter"></vxe-column>
@@ -109,41 +109,6 @@
</vxe-table> </vxe-table>
</div> </div>
</el-card> </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"> <div class="button-group">
<el-button <el-button
type="primary" type="primary"
@@ -160,6 +125,41 @@
</div> </div>
</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%"> <el-dialog draggable v-model="dialogVisible" title="新增干扰源类型" width="70%">
<vxe-table v-bind="defaultAttribute" height="400px" ref="xTable" :data="userData"> <vxe-table v-bind="defaultAttribute" height="400px" ref="xTable" :data="userData">
<vxe-column type="checkbox" width="60"></vxe-column> <vxe-column type="checkbox" width="60"></vxe-column>
@@ -450,13 +450,20 @@ const selChange = async (e: any) => {
} }
// 导出 // 导出
const onExport = () => { const onExport = () => {
console.log("🚀 ~ onExport ~ document.getElementById('exportId'):", document.getElementById('exportId'))
// 转换成canvas // 转换成canvas
html2canvas(document.getElementById('exportId'), { html2canvas(document.getElementById('exportId'), {
scale: 2 useCORS: true, // 允许跨域图片
allowTaint: true, // 允许污染的画布
logging: false, // 关闭日志
scale: 2 // 提高缩放比例以获得更清晰的截图
}).then(function (canvas) { }).then(function (canvas) {
console.log('🚀 ~ onExport ~ canvas:', canvas)
// 创建a标签实现下载 // 创建a标签实现下载
let creatIMg = document.createElement('a') let creatIMg = document.createElement('a')
creatIMg.download = '光伏电站承载能力评估结果.png' // 设置下载的文件名, creatIMg.download = '光伏电站承载能力评估结果.png' // 设置下载的文件名,
creatIMg.href = canvas.toDataURL() // 下载url creatIMg.href = canvas.toDataURL() // 下载url
creatIMg.click() creatIMg.click()
creatIMg.remove() // 下载之后把创建的元素删除 creatIMg.remove() // 下载之后把创建的元素删除
@@ -477,14 +484,11 @@ onMounted(() => {
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.bottomBox {
position: relative;
.button-group { .button-group {
position: absolute; position: absolute;
top: 0px; bottom: -45px;
right: 10px; right: 10px;
} }
}
// .card-header { // .card-header {
// font-weight: 600; // font-weight: 600;
// } // }
@@ -501,8 +505,18 @@ onMounted(() => {
} }
.card-container { .card-container {
display: flex; display: flex;
position: relative;
} }
.evaluateTheResults { .evaluateTheResults {
display: flex; display: flex;
} }
:deep(.el-tag) {
display: inline-block;
width: 55px;
height: 24px;
.el-tag__content{
line-height: 23px;
}
}
</style> </style>

View File

@@ -108,10 +108,22 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </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> <el-divider content-position="left" v-show="showBtn">评估结果</el-divider>
<div class="bottomBox"> <div class="evaluateTheResults" v-if="showAssess">
<div class="evaluateTheResults" id="evaluateTheResults" v-if="showAssess">
<div style="height: 250px; flex: 1"> <div style="height: 250px; flex: 1">
<vxe-table <vxe-table
style="flex: 1.5" style="flex: 1.5"
@@ -125,25 +137,25 @@
</vxe-colgroup> </vxe-colgroup>
<vxe-column field="level1" title="安全"> <vxe-column field="level1" title="安全">
<template #default="{ row }"> <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> <span v-else>{{ row.level1 }}</span>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="level2" title="III级预警"> <vxe-column field="level2" title="III级预警">
<template #default="{ row }"> <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> <span v-else>{{ row.level2 }}</span>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="level3" title="II级预警"> <vxe-column field="level3" title="II级预警">
<template #default="{ row }"> <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> <span v-else>{{ row.level3 }}</span>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="level4" title="I级预警"> <vxe-column field="level4" title="I级预警">
<template #default="{ row }"> <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> <span v-else>{{ row.level4 }}</span>
</template> </template>
</vxe-column> </vxe-column>
@@ -153,18 +165,6 @@
<MyEChart style="flex: 1" :options="pieCharts" /> <MyEChart style="flex: 1" :options="pieCharts" />
</div> </div>
</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>
</div> </div>
</pane> </pane>
@@ -209,7 +209,7 @@ const size = ref(0)
const dictData = useDictData() const dictData = useDictData()
const datePickerRef = ref() const datePickerRef = ref()
const height = mainHeight(80).height const height = mainHeight(80).height
const tabsHeight = mainHeight(260).height const tabsHeight = mainHeight(300).height
const voltageLevelArr = dictData.getBasicData('Dev_Voltage_Stand') const voltageLevelArr = dictData.getBasicData('Dev_Voltage_Stand')
const tableData: any = ref([ 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) const res2 = await queryCarryCapacityQData(form)
q_βminMap.value = res2.data.q_βminMap q_βminMap.value = res2.data.q_βminMap
setEChart(2, res2.data.data, '无功功率', 'Var') setEChart(2, res2.data.data, '无功功率', 'kVar')
// 获取谐波电流数据并设置图表 // 获取谐波电流数据并设置图表
const res3 = await queryCarryCapacityIData(form) const res3 = await queryCarryCapacityIData(form)
@@ -839,15 +839,11 @@ onMounted(() => {
} }
.bottomBox { .bottomBox {
position: relative; margin-top: -3px;
.el-button {
position: absolute;
top: 0;
z-index: 1;
right: 10px;
top: -10px;
} }
.btnBox {
display: flex;
justify-content: end;
} }
:deep(.vxe-table--header thead tr:first-of-type th:first-of-type) { :deep(.vxe-table--header thead tr:first-of-type th:first-of-type) {

View File

@@ -64,7 +64,7 @@
</div> </div>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="comparisonOperators3" title="次谐波合格个数"> <vxe-column field="comparisonOperators3" title="次谐波合格个数">
<template #default="row"> <template #default="row">
<div class="cellBox" @click="cells(row, row.row.comparisonOperators3, row.row.count3, 3)"> <div class="cellBox" @click="cells(row, row.row.comparisonOperators3, row.row.count3, 3)">
{{ symbolJudgment(row.row.comparisonOperators3) {{ symbolJudgment(row.row.comparisonOperators3)

View File

@@ -165,11 +165,11 @@ const tableStore: any = new TableStore({
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
confirmButtonType: 'danger', confirmButtonType: 'danger',
title: '确定删除' title: '确定禁止接入'
}, },
click: row => { click: row => {
remove({ ids: row.id }).then(() => { remove({ ids: row.id }).then(() => {
ElMessage.success('删除成功') ElMessage.success('禁止接入成功')
tableStore.index() tableStore.index()
}) })
} }

View File

@@ -122,7 +122,7 @@
v-model="formData.maxProcessNum" v-model="formData.maxProcessNum"
onkeyup="value = value.replace(/[^0-9]/g,'')" onkeyup="value = value.replace(/[^0-9]/g,'')"
maxlength="5" maxlength="5"
placeholder="请输入最大进程数" placeholder="请根据监测点规模填写合适进程数1个进程最大可承载200个监测点"
></el-input> ></el-input>
<!-- <el-select v-model="formData.maxProcessNum" placeholder="请选择等级" style="width: 100%"> <!-- <el-select v-model="formData.maxProcessNum" placeholder="请选择等级" style="width: 100%">
<el-option <el-option

View File

@@ -4,32 +4,18 @@
<TableHeader date-picker ref="tableHeaderRef"> <TableHeader date-picker ref="tableHeaderRef">
<template #select> <template #select>
<el-form-item label="统计类型:"> <el-form-item label="统计类型:">
<el-select <el-select v-model="formData.statisticalType" placeholder="请选择统计类型" value-key="id"
v-model="formData.statisticalType" style="width: 100%">
placeholder="请选择统计类型" <el-option v-for="item in classificationData" :key="item.id" :label="item.name"
value-key="id" :value="item"></el-option>
style="width: 100%"
>
<el-option
v-for="item in classificationData"
:key="item.id"
:label="item.name"
:value="item"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="区域选择:"> <el-form-item label="区域选择:">
<!-- <el-select ref="select1" v-model="deptName" placeholder="请选择所属部门区域" style="width: 100%"> <!-- <el-select ref="select1" v-model="deptName" placeholder="请选择所属部门区域" style="width: 100%">
<el-option :value="formData.deptIndex" style="height: auto"> --> <el-option :value="formData.deptIndex" style="height: auto"> -->
<!-- {{ formData.deptIndex }} --> <!-- {{ formData.deptIndex }} -->
<el-cascader <el-cascader v-model="formData.deptIndex" :props="defaultProps" :options="treeData" filterable
v-model="formData.deptIndex" collapse-tags placeholder="请选择区域" />
:props="defaultProps"
:options="treeData"
filterable
collapse-tags
placeholder="请选择区域"
/>
<!-- <el-tree <!-- <el-tree
ref="tree" ref="tree"
v-model="formData.deptName" v-model="formData.deptName"
@@ -48,57 +34,24 @@
</el-select> --> </el-select> -->
</el-form-item> </el-form-item>
<el-form-item label="电压等级:"> <el-form-item label="电压等级:">
<el-select <el-select v-model="formData.scale" multiple collapse-tags clearable placeholder="请选择电压等级"
v-model="formData.scale" style="width: 100%" value-key="id">
multiple <el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name"
collapse-tags :value="item"></el-option>
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-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家:">
<el-select <el-select v-model="formData.manufacturer" multiple collapse-tags clearable
v-model="formData.manufacturer" placeholder="请选择终端厂家" style="width: 100%" value-key="id">
multiple <el-option v-for="(item, index) in terminaloption" :key="index" :label="item.name"
collapse-tags :value="item"></el-option>
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-select>
</el-form-item> </el-form-item>
<el-form-item label="干扰源类型:"> <el-form-item label="干扰源类型:">
<el-select <el-select v-model="formData.loadType" multiple collapse-tags clearable placeholder="请选择干扰源类型"
v-model="formData.loadType" style="width: 100%" value-key="id">
multiple <el-option v-for="(item, index) in interfereoption" :key="index" :label="item.name"
collapse-tags :value="item"></el-option>
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-select>
</el-form-item> </el-form-item>
</template> </template>
@@ -110,45 +63,41 @@
<div class="online_main"> <div class="online_main">
<el-tabs v-model="activeName" type="border-card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
<el-tab-pane :name="0" :lazy="true" label="数据完整性列表"> <el-tab-pane :name="0" :lazy="true" label="数据完整性列表">
<Table <Table ref="tableRef" :tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }"
ref="tableRef"
:tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }"
:checkbox-config="{ labelField: 'name', checkMethod: ({ row }) => true }" :checkbox-config="{ labelField: 'name', checkMethod: ({ row }) => true }"
:scroll-y="{ enabled: true }" :scroll-y="{ enabled: true }" v-if="activeName == 0" />
v-if="activeName == 0"
/>
</el-tab-pane> </el-tab-pane>
<el-tab-pane :name="1" :lazy="true" label="数据完整性图表"> <el-tab-pane :name="1" :lazy="true" label="数据完整性图表">
<charts v-if="activeName == 1" ref="chartsRef" /> <charts v-if="activeName == 1" ref="chartsRef" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<el-dialog v-model="dialogVisible" draggable title="补招" width="500"> <el-dialog v-model="timePopUp" draggable title="补招" width="500">
补招时间: 补招时间:
<el-date-picker <el-date-picker v-model="timeData" type="datetimerange" format="YYYY-MM-DD HH:mm:00"
v-model="timeData" value-format="YYYY-MM-DD HH:mm:00" range-separator="" date-format="YYYY-MM-DD" time-format="HH:mm:00"
type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期" style="width: 400px" :disabledDate="disabledDate" />
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> <template #footer>
<div class="dialog-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> <el-button type="primary" @click="makeUpSubmit">确认</el-button>
</div> </div>
</template> </template>
</el-dialog> </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> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, onMounted, watch } from 'vue' import { ref, onMounted, watch, nextTick } from 'vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import DatePicker from '@/components/form/datePicker/index.vue' import DatePicker from '@/components/form/datePicker/index.vue'
import { getAreaDept, FullRecall } from '@/api/harmonic-boot/area' 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 Table from '@/components/table/index.vue'
import charts from './components/charts.vue' import charts from './components/charts.vue'
import { ElMessage, ElMessageBox } from 'element-plus' 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({ defineOptions({
name: 'harmonic-boot/harmonic/getIntegrityData' name: 'harmonic-boot/harmonic/getIntegrityData'
}) })
const logRef = ref()
const tableRef = ref() const tableRef = ref()
const chartsRef = ref() const chartsRef = ref()
const dictData = useDictData() 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') const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
//字典获取终端厂家 //字典获取终端厂家
@@ -177,6 +135,7 @@ const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Ty
const treeData = ref([]) const treeData = ref([])
const idArr = ref([]) const idArr = ref([])
const timeData = ref([]) const timeData = ref([])
const logList: any = ref([])
const activeName = ref(0) const activeName = ref(0)
const getTreeData = async () => { const getTreeData = async () => {
await getAreaDept().then(res => { await getAreaDept().then(res => {
@@ -199,6 +158,7 @@ const formData = ref({
// searchBeginTime: '', // searchBeginTime: '',
// searchEndTime: '' // searchEndTime: ''
}) })
formData.value.deptIndex = treeData.value[0]?.id formData.value.deptIndex = treeData.value[0]?.id
const defaultProps = ref({ const defaultProps = ref({
label: 'name', label: 'name',
@@ -398,7 +358,8 @@ const makeUp = () => {
type: 'warning' type: 'warning'
}) })
} }
dialogVisible.value = true timeData.value = []
timePopUp.value = true
} }
// 补招提交 // 补招提交
const makeUpSubmit = () => { const makeUpSubmit = () => {
@@ -408,8 +369,7 @@ const makeUpSubmit = () => {
type: 'warning' type: 'warning'
}) })
} }
let form = {
FullRecall({
monitorId: tableRef.value monitorId: tableRef.value
.getRef() .getRef()
.getCheckboxRecords() .getCheckboxRecords()
@@ -417,13 +377,36 @@ const makeUpSubmit = () => {
.map(item => item.id), .map(item => item.id),
reCallEndTime: timeData.value[1], reCallEndTime: timeData.value[1],
reCallStartTime: timeData.value[0] reCallStartTime: timeData.value[0]
}).then(res => { }
ElMessage({
message: '补招命令下发成功', socket(form)
type: 'success' 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( watch(
() => treeData.value, () => treeData.value,
@@ -438,6 +421,8 @@ watch(
deep: true deep: true
} }
) )
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
// .online { // .online {
@@ -541,4 +526,14 @@ watch(
color: var(--el-color-primary-light-3) !important; color: var(--el-color-primary-light-3) !important;
} }
} }
.logList {
height: 300px;
overflow-y: auto;
p {
margin-bottom: 10px;
display: flex;
}
}
</style> </style>

View File

@@ -31,38 +31,38 @@
<div>电压</div> <div>电压</div>
<div> <div>
A相: A相:
<span style="color: #DAA520"> <span style="color: #daa520">
{{ echartsData1?.options?.series[1].data[0].value }} {{ echartsData1?.options?.series[1].data[0].value }}
</span> </span>
</div> </div>
<div> <div>
B相: B相:
<span style="color: #2E8B57"> <span style="color: #2e8b57">
{{ echartsData1?.options?.series[1].data[1].value }} {{ echartsData1?.options?.series[1].data[1].value }}
</span> </span>
</div> </div>
<div> <div>
C相: C相:
<span style="color: #A52a2a"> <span style="color: #a52a2a">
{{ echartsData1?.options?.series[1].data[2].value }} {{ echartsData1?.options?.series[1].data[2].value }}
</span> </span>
</div> </div>
<div style="margin-top: 10px">电流</div> <div style="margin-top: 10px">电流</div>
<div> <div>
A相: A相:
<span style="color: #DAA520"> <span style="color: #daa520">
{{ echartsData1?.options?.series[0].data[0].value }} {{ echartsData1?.options?.series[0].data[0].value }}
</span> </span>
</div> </div>
<div> <div>
B相: B相:
<span style="color: #2E8B57"> <span style="color: #2e8b57">
{{ echartsData1?.options?.series[0].data[1].value }} {{ echartsData1?.options?.series[0].data[1].value }}
</span> </span>
</div> </div>
<div> <div>
C相: C相:
<span style="color: #A52a2a"> <span style="color: #a52a2a">
{{ echartsData1?.options?.series[0].data[2].value }} {{ echartsData1?.options?.series[0].data[2].value }}
</span> </span>
</div> </div>
@@ -744,6 +744,7 @@ const initEcharts = (color: string, key: number) => {
} }
//渲染echarts //渲染echarts
const init = () => { const init = () => {
const url = (localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/')
echartsDataV1.value = initEcharts('#DAA520', 0) echartsDataV1.value = initEcharts('#DAA520', 0)
echartsDataV2.value = initEcharts('#2E8B57', 0) echartsDataV2.value = initEcharts('#2E8B57', 0)
echartsDataV3.value = initEcharts('#A52a2a', 0) echartsDataV3.value = initEcharts('#A52a2a', 0)
@@ -763,7 +764,9 @@ const init = () => {
}) })
} }
let pids = monitoringPoint.state.pid.split(',') 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) => { dataSocket.socketServe.registerCallBack('message', (res: any) => {
txtContent.value = res.value txtContent.value = res.value
let data = JSON.parse(res.value) let data = JSON.parse(res.value)

View File

@@ -127,7 +127,7 @@ const LngLat = [
] ]
import { getAssessOverview } from '@/api/device-boot/panorama' 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) { if (narimap.Config.examples.notlogin) {
initMap(narimap.Config.styles.sjRaster) initMap(narimap.Config.styles.sjRaster)
} else { } else {