5 Commits

Author SHA1 Message Date
guanj
21756e05d4 修改地图 2026-05-27 10:47:31 +08:00
guanj
abfdf29a38 修改页面样式 调整查询条件 2026-05-22 09:58:07 +08:00
guanj
120892808b 提交代码 2026-04-25 15:21:53 +08:00
guanj
0f5cb1d3c5 提交代码 2026-04-09 11:44:06 +08:00
cdf
dbaa42ff7e 通用台账查询页面调整 2026-04-09 11:42:54 +08:00
50 changed files with 2160 additions and 2073 deletions

View File

@@ -13,9 +13,11 @@ 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 WebSocketUrl2:any = response.headers.get('X-WebSocket-Url2')
const WebSocketUrl3:any = response.headers.get('X-WebSocket-Url3')
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('WebSocketUrl2', WebSocketUrl2)
localStorage.setItem('WebSocketUrl3', WebSocketUrl3)
localStorage.setItem('MqttUrl', MqttUrl) localStorage.setItem('MqttUrl', MqttUrl)
}) })
</script> </script>

BIN
src/assets/imgs/m0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
src/assets/imgs/m1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
src/assets/imgs/m2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
src/assets/imgs/m3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
src/assets/imgs/m4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -1,29 +1,20 @@
<template> <template>
<div ref="tableHeader" class="cn-table-header"> <div ref="tableHeader" class="cn-table-header">
<div class="table-header ba-scroll-style"> <div class="table-header ba-scroll-style">
<el-form <el-form style="flex: 1; height: 32px; display: flex; flex-wrap: wrap" ref="headerForm" @submit.prevent=""
style="flex: 1; height: 32px; display: flex; flex-wrap: wrap" @keyup.enter="onComSearch" label-position="left" :inline="true">
ref="headerForm"
@submit.prevent=""
@keyup.enter="onComSearch"
label-position="left"
:inline="true"
>
<el-form-item v-if="datePicker" style="grid-column: span 2; max-width: 630px"> <el-form-item v-if="datePicker" style="grid-column: span 2; max-width: 630px">
<template #label> <template #label>
<el-checkbox v-if="showTimeAll" v-model="timeAll" label="统计时间" /> <el-checkbox v-if="showTimeAll" v-model="timeAll" label="统计时间" />
<span v-else>{{ dateLabel }}</span> <span v-else>{{ dateLabel }}</span>
</template> </template>
<DatePicker <DatePicker ref="datePickerRef" v-if="timeAll" :nextFlag="nextFlag"
ref="datePickerRef" :theCurrentTime="theCurrentTime"></DatePicker>
v-if="timeAll"
:nextFlag="nextFlag"
:theCurrentTime="theCurrentTime"
></DatePicker>
</el-form-item> </el-form-item>
<el-form-item label="区域" v-if="area"> <el-form-item label="区域" v-if="area">
<Area ref="areaRef" v-model="tableStore.table.params.deptIndex" @change-value="onAreaChange" /> <Area ref="areaRef" v-model="tableStore.table.params.deptIndex" @change-value="onAreaChange"
style="width: 200px;" />
</el-form-item> </el-form-item>
<slot name="select"></slot> <slot name="select"></slot>
</el-form> </el-form>
@@ -32,43 +23,24 @@
<Icon size="14" name="el-icon-ArrowUp" style="color: #fff" v-if="showSelect" /> <Icon size="14" name="el-icon-ArrowUp" style="color: #fff" v-if="showSelect" />
<Icon size="14" name="el-icon-ArrowDown" style="color: #fff" v-else /> <Icon size="14" name="el-icon-ArrowDown" style="color: #fff" v-else />
</el-button> </el-button>
<el-button <el-button @click="onComSearch" v-if="showSearch" :loading="tableStore.table.loading" type="primary"
@click="onComSearch" :icon="Search">
v-if="showSearch"
:loading="tableStore.table.loading"
type="primary"
:icon="Search"
>
查询 查询
</el-button> </el-button>
<el-button <el-button @click="onResetForm" v-if="showSearch && showReset" :loading="tableStore.table.loading"
@click="onResetForm" :icon="RefreshLeft">
v-if="showSearch && showReset"
:loading="tableStore.table.loading"
:icon="RefreshLeft"
>
重置 重置
</el-button> </el-button>
<el-button <el-button @click="onExport" v-if="showExport" :loading="tableStore.table.exportLoading" type="primary"
@click="onExport" icon="el-icon-Download">
v-if="showExport"
:loading="tableStore.table.exportLoading"
type="primary"
icon="el-icon-Download"
>
导出 导出
</el-button> </el-button>
</template> </template>
<slot name="operation"></slot> <slot name="operation"></slot>
</div> </div>
<el-form <el-form :style="showSelect && showUnfoldButton ? headerFormSecondStyleOpen : headerFormSecondStyleClose"
:style="showSelect && showUnfoldButton ? headerFormSecondStyleOpen : headerFormSecondStyleClose" ref="headerFormSecond" @submit.prevent="" @keyup.enter="onComSearch" label-position="left"
ref="headerFormSecond" :inline="true"></el-form>
@submit.prevent=""
@keyup.enter="onComSearch"
label-position="left"
:inline="true"
></el-form>
</div> </div>
</template> </template>
@@ -81,7 +53,7 @@ import { mainHeight } from '@/utils/layout'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { Search, RefreshLeft } from '@element-plus/icons-vue' import { Search, RefreshLeft } from '@element-plus/icons-vue'
import { defineProps } from 'vue' import { defineProps } from 'vue'
const emit = defineEmits(['selectChange','areaChange']) const emit = defineEmits(['selectChange', 'areaChange'])
const tableStore = inject('tableStore') as TableStore const tableStore = inject('tableStore') as TableStore
const tableHeader = ref() const tableHeader = ref()
const datePickerRef = ref() const datePickerRef = ref()
@@ -132,9 +104,8 @@ const headerFormSecondStyleClose = {
padding: '0' padding: '0'
} }
const onAreaChange = (data) => { const onAreaChange = data => {
emit('areaChange', { label: data.label })
emit('areaChange', {label: data.label})
} }
watch( watch(
@@ -142,7 +113,6 @@ watch(
newVal => { newVal => {
setTimeout(() => { setTimeout(() => {
areaRef.value && areaRef.value.change() areaRef.value && areaRef.value.change()
}, 0) }, 0)
} }
) )
@@ -238,14 +208,14 @@ const onResetForm = () => {
//时间重置成默认值 //时间重置成默认值
datePickerRef.value?.setTheDate(3) datePickerRef.value?.setTheDate(3)
if(props.showTimeAll){ if (props.showTimeAll) {
timeAll.value = false timeAll.value = false
delete tableStore.table.params.searchBeginTime delete tableStore.table.params.searchBeginTime
delete tableStore.table.params.searchEndTime delete tableStore.table.params.searchEndTime
delete tableStore.table.params.startTime delete tableStore.table.params.startTime
delete tableStore.table.params.endTime delete tableStore.table.params.endTime
delete tableStore.table.params.timeFlag delete tableStore.table.params.timeFlag
delete tableStore.table.params.interval delete tableStore.table.params.interval
} }
if (props.datePicker && timeAll.value) { if (props.datePicker && timeAll.value) {
@@ -264,7 +234,6 @@ const setTheDate = (val: any) => {
} }
// 导出 // 导出
const onExport = () => { const onExport = () => {
tableStore.onTableAction('export', { showAllFlag: true }) tableStore.onTableAction('export', { showAllFlag: true })
} }
@@ -300,6 +269,7 @@ defineExpose({
padding: 13px 15px; padding: 13px 15px;
font-size: 14px; font-size: 14px;
overflow: hidden; overflow: hidden;
.table-header-operate-text { .table-header-operate-text {
margin-left: 6px; margin-left: 6px;
} }
@@ -327,7 +297,7 @@ defineExpose({
margin-left: 12px; margin-left: 12px;
} }
.mlr-12 + .el-button { .mlr-12+.el-button {
margin-left: 12px; margin-left: 12px;
} }
@@ -362,7 +332,7 @@ defineExpose({
border-radius: 0; border-radius: 0;
} }
.el-button + .el-button { .el-button+.el-button {
margin: 0; margin: 0;
} }
@@ -373,6 +343,7 @@ defineExpose({
html.dark { html.dark {
.table-search-button-group { .table-search-button-group {
button:focus, button:focus,
button:active { button:active {
background-color: var(--el-color-info-dark-2); background-color: var(--el-color-info-dark-2);

View File

@@ -28,66 +28,66 @@ const info = (id: any) => {
expanded.value = [id] expanded.value = [id]
getTerminalTree().then(res => { getTerminalTree().then(res => {
// let arr: any[] = [] // let arr: any[] = []
if (VITE_FLAG) { // if (VITE_FLAG) {
res.data.forEach((item: any) => { // res.data.forEach((item: any) => {
item.icon = 'el-icon-Menu' // item.icon = 'el-icon-Menu'
item.plevel = item.level // item.plevel = item.level
item.level = 0 // item.level = 0
item.children.forEach((item2: any) => { // item.children.forEach((item2: any) => {
item2.icon = 'el-icon-HomeFilled' // item2.icon = 'el-icon-HomeFilled'
item2.plevel = item2.level // item2.plevel = item2.level
item2.level = 100 // item2.level = 100
expanded.value.push(item2.id) // expanded.value.push(item2.id)
item2.children.forEach((item3: any) => { // item2.children.forEach((item3: any) => {
item3.icon = 'el-icon-CollectionTag' // item3.icon = 'el-icon-CollectionTag'
item3.plevel = item3.level // item3.plevel = item3.level
item3.level = 200 // item3.level = 200
item3.children.forEach((item4: any) => { // item3.children.forEach((item4: any) => {
item4.icon = 'el-icon-Flag' // item4.icon = 'el-icon-Flag'
item4.plevel = item4.level // item4.plevel = item4.level
item4.level = 300 // item4.level = 300
// arr.push(item4) // // arr.push(item4)
item4.children.forEach((item5: any) => { // item4.children.forEach((item5: any) => {
item5.icon = 'el-icon-OfficeBuilding' // item5.icon = 'el-icon-OfficeBuilding'
item5.plevel = item5.level // item5.plevel = item5.level
item5.level = 300 // item5.level = 300
// item5.id = item4.id // // item5.id = item4.id
item5.children.forEach((item6: any) => { // item5.children.forEach((item6: any) => {
item6.icon = 'el-icon-HelpFilled' // item6.icon = 'el-icon-HelpFilled'
item6.plevel = 4 // item6.plevel = 4
if (item6.name == '电网侧' && item6.children.length == 0) { // if (item6.name == '电网侧' && item6.children.length == 0) {
item6.level = 400 // item6.level = 400
} else { // } else {
item6.level = 400 // item6.level = 400
} // }
item6.children.forEach((item7: any) => { // item6.children.forEach((item7: any) => {
item7.icon = 'el-icon-Film' // item7.icon = 'el-icon-Film'
item7.plevel = item7.level // item7.plevel = item7.level
item7.level = 400 // item7.level = 400
item7.children.forEach((item8: any) => { // item7.children.forEach((item8: any) => {
item8.icon = 'el-icon-Collection' // item8.icon = 'el-icon-Collection'
item8.plevel = item8.level // item8.plevel = item8.level
item8.level = 500 // item8.level = 500
item8.children.forEach((item9: any) => { // item8.children.forEach((item9: any) => {
item9.icon = 'el-icon-Share' // item9.icon = 'el-icon-Share'
item9.plevel = item9.level // item9.plevel = item9.level
item9.level = 600 // item9.level = 600
item9.children.forEach((item10: any) => { // item9.children.forEach((item10: any) => {
item10.icon = 'el-icon-Location' // item10.icon = 'el-icon-Location'
item10.plevel = item10.level // item10.plevel = item10.level
item10.level = 700 // item10.level = 700
}) // })
}) // })
}) // })
}) // })
}) // })
}) // })
}) // })
}) // })
}) // })
}) // })
} else { // } else {
res.data.forEach((item: any) => { res.data.forEach((item: any) => {
item.icon = 'el-icon-Menu' item.icon = 'el-icon-Menu'
item.plevel = item.level item.plevel = item.level
@@ -129,7 +129,7 @@ const info = (id: any) => {
}) })
}) })
}) })
} // }
tree.value = res.data tree.value = res.data

View File

@@ -50,7 +50,8 @@ import { ref, reactive, onMounted } from 'vue'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import MQTT from '@/utils/mqtt' // import MQTT from '@/utils/mqtt'
import socketClient from '@/utils/webSocketClient'
const dictData = useDictData() const dictData = useDictData()
const event = dictData.getBasicData('Event_Statis') const event = dictData.getBasicData('Event_Statis')
import { useAdminInfo } from '@/stores/adminInfo' import { useAdminInfo } from '@/stores/adminInfo'
@@ -68,37 +69,72 @@ const handleClose = (done: any) => {
drawer.value = false drawer.value = false
done() done()
} }
const init = async () => { const dataSocket = reactive({
const mqttClient = new MQTT('/sendEvent') socketServe: socketClient.Instance
// 设置消息接收回调 })
try { // const init = async () => {
await mqttClient.init() // const mqttClient = new MQTT('/sendEvent')
// // 设置消息接收回调
// try {
// await mqttClient.init()
// 订阅主题 // // 订阅主题
await mqttClient.subscribe() // await mqttClient.subscribe()
// 设置消息接收回调 // // 设置消息接收回调
mqttClient.onMessage((topic, message) => { // mqttClient.onMessage((topic, message) => {
const msg = JSON.parse(message.toString()) // const msg = JSON.parse(message.toString())
// console.log('🚀 ~ init ~ msg:', msg) // // console.log('🚀 ~ init ~ msg:', msg)
if (msg.deptList.includes(adminInfo.$state.deptId)) { // if (msg.deptList.includes(adminInfo.$state.deptId)) {
drawer.value = true // drawer.value = true
isLoading.value = true // isLoading.value = true
eventList.value.unshift(msg) // eventList.value.unshift(msg)
setTimeout(() => { // setTimeout(() => {
isLoading.value = false // isLoading.value = false
}, 500) // }, 500)
} // }
}) // })
} catch (error) { // } catch (error) {
// console.error('MQTT 初始化失败:', error) // // console.error('MQTT 初始化失败:', error)
} // }
// }
const socket = async () => {
const url = localStorage.getItem('WebSocketUrl3') || 'null' //'ws://192.168.2.130:10203/event/'
// const url = 'ws://192.168.1.68:10203/event/'
await dataSocket.socketServe.connect(`${url}${adminInfo.id}`)
await dataSocket.socketServe.registerCallBack('message', (res: any) => {
if (res.deptList.includes(adminInfo.$state.deptId)) {
drawer.value = true
isLoading.value = true
eventList.value.unshift(res)
setTimeout(() => {
isLoading.value = false
}, 500)
}
// logList.value.push({
// type: res.code == 500 ? 'error' : '',
// time: formatDate(new Date(), 'YYYY-MM-DD hh:mm:ss'),
// name: res.message
// })
})
} }
onUnmounted(() => {
dataSocket.socketServe?.closeWs()
})
onMounted(() => { onMounted(() => {
// startMqtt('/sendEvent', (topic, message) => { // startMqtt('/sendEvent', (topic, message) => {
// const msg = JSON.parse(message.toString()) // const msg = JSON.parse(message.toString())
// console.log(msg) // console.log(msg)
// }) // })
init()
setTimeout(() => {
socket()
}, 3000)
}) })
defineExpose({ defineExpose({
open, open,

View File

@@ -404,6 +404,11 @@ body,
.el-select__wrapper { .el-select__wrapper {
height: 32px !important; height: 32px !important;
} }
.BMap_center,
.BMap_top,
.BMap_bottom {
background-color: #fff;
}
@font-face { @font-face {
font-family: 'AlimamaFangYuanTiVF'; font-family: 'AlimamaFangYuanTiVF';
src: url('../assets/font/ali/AlimamaFangYuanTiVF-Thin.woff') format('woff'), src: url('../assets/font/ali/AlimamaFangYuanTiVF-Thin.woff') format('woff'),

View File

@@ -11,6 +11,7 @@ const calculateValue = (o: number, value: number, num: number, isMin: boolean) =
} else if (value > -1 && value < 0 && isMin == false) { } else if (value > -1 && value < 0 && isMin == false) {
return 0 return 0
} }
let base let base
if (Math.abs(o) >= 100) { if (Math.abs(o) >= 100) {
base = 100 base = 100
@@ -19,8 +20,11 @@ const calculateValue = (o: number, value: number, num: number, isMin: boolean) =
} else if (Math.abs(o) >= 1) { } else if (Math.abs(o) >= 1) {
base = 1 base = 1
} else { } else {
base = 0.1 const multiple = 1 / 0.1
base = Math.ceil(Math.abs(o) * multiple) / multiple
} }
let calculatedValue let calculatedValue
if (isMin) { if (isMin) {
if (value < 0) { if (value < 0) {
@@ -35,18 +39,19 @@ const calculateValue = (o: number, value: number, num: number, isMin: boolean) =
calculatedValue = value + num * value calculatedValue = value + num * value
} }
} }
if (base === 0.1) { if (base === 0.1) {
return parseFloat(calculatedValue.toFixed(1)) // return parseFloat(calculatedValue.toFixed(1))
return Math.ceil(calculatedValue * 10) / 10
} else if (isMin) { } else if (isMin) {
return Math.floor(calculatedValue / base) * base return Math.floor(calculatedValue / base) * base
} else { } else {
return Math.ceil(calculatedValue / base) * base return Math.ceil(calculatedValue / base) * base
} }
} }
// 处理y轴最大最小值 // 处理y轴最大最小值
export const yMethod = (arr: any) => { export const yMethod = (arr: any) => {
let num = 0.1 let num = 0.2
let numList = dataProcessing(arr) let numList = dataProcessing(arr)
let maxValue = 0 let maxValue = 0
let minValue = 0 let minValue = 0
@@ -54,12 +59,9 @@ export const yMethod = (arr: any) => {
let min = 0 let min = 0
maxValue = Math.max(...numList) maxValue = Math.max(...numList)
minValue = Math.min(...numList) minValue = Math.min(...numList)
const o = maxValue - minValue const o = maxValue - minValue == 0 ? maxValue : maxValue - minValue
if (Math.abs(o) >= 300) {
num = 0.02
}
min = calculateValue(o, minValue, num, true) min = calculateValue(o, minValue, num, true)
max = calculateValue(o, maxValue, num, false) max = calculateValue(o, maxValue, num, false)
// if (-100 >= minValue) { // if (-100 >= minValue) {
// min = Math.floor((minValue + num * minValue) / 100) * 100 // min = Math.floor((minValue + num * minValue) / 100) * 100
@@ -158,8 +160,6 @@ export const exportCSV = (title: object, data: any, filename: string) => {
URL.revokeObjectURL(link.href) URL.revokeObjectURL(link.href)
} }
/** /**
* 补全时间序列数据中缺失的条目 * 补全时间序列数据中缺失的条目
* @param rawData 原始数据,格式为 [["时间字符串", "数值", "单位", "类型"], ...] * @param rawData 原始数据,格式为 [["时间字符串", "数值", "单位", "类型"], ...]

View File

@@ -27,8 +27,8 @@ class MQTT {
clean: true, clean: true,
connectTimeout: 30 * 1000, connectTimeout: 30 * 1000,
clientId: `mqttjs_${Math.random().toString(16).substr(2, 8)}`, clientId: `mqttjs_${Math.random().toString(16).substr(2, 8)}`,
username: 't_user', username: '',
password: 'njcnpqs', password: '',
reconnectPeriod: 1000, // 默认1秒重试一次 reconnectPeriod: 1000, // 默认1秒重试一次
maxReconnectTimes: 3 // 默认最大重连5次 maxReconnectTimes: 3 // 默认最大重连5次
} }

View File

@@ -1,400 +1,432 @@
interface TreeHelperConfig { interface TreeHelperConfig {
id: string id: string
children: string children: string
pid: string pid: string
} }
const DEFAULT_CONFIG: TreeHelperConfig = { const DEFAULT_CONFIG: TreeHelperConfig = {
id: 'id', id: 'id',
children: 'children', children: 'children',
pid: 'pid' pid: 'pid'
} }
export const defaultProps = { export const defaultProps = {
children: 'children', children: 'children',
label: 'name', label: 'name',
value: 'id', value: 'id',
isLeaf: 'leaf', isLeaf: 'leaf',
emitPath: false // 用于 cascader 组件:在选中节点改变时,是否返回由该节点所在的各级菜单的值所组成的数组,若设置 false则只返回该节点的值 emitPath: false // 用于 cascader 组件:在选中节点改变时,是否返回由该节点所在的各级菜单的值所组成的数组,若设置 false则只返回该节点的值
} }
const getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config) const getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config)
// tree from list // tree from list
export const listToTree = <T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] => { export const listToTree = <T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] => {
const conf = getConfig(config) as TreeHelperConfig const conf = getConfig(config) as TreeHelperConfig
const nodeMap = new Map() const nodeMap = new Map()
const result: T[] = [] const result: T[] = []
const { id, children, pid } = conf const { id, children, pid } = conf
for (const node of list) { for (const node of list) {
node[children] = node[children] || [] node[children] = node[children] || []
nodeMap.set(node[id], node) nodeMap.set(node[id], node)
} }
for (const node of list) { for (const node of list) {
const parent = nodeMap.get(node[pid]) const parent = nodeMap.get(node[pid])
;(parent ? parent.children : result).push(node) ;(parent ? parent.children : result).push(node)
} }
return result return result
} }
export const treeToList = <T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T => { export const treeToList = <T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T => {
config = getConfig(config) config = getConfig(config)
const { children } = config const { children } = config
const result: any = [...tree] const result: any = [...tree]
for (let i = 0; i < result.length; i++) { for (let i = 0; i < result.length; i++) {
if (!result[i][children!]) continue if (!result[i][children!]) continue
result.splice(i + 1, 0, ...result[i][children!]) result.splice(i + 1, 0, ...result[i][children!])
} }
return result return result
} }
export const findNode = <T = any>( export const findNode = <T = any>(
tree: any, tree: any,
func: Fn, func: Fn,
config: Partial<TreeHelperConfig> = {} config: Partial<TreeHelperConfig> = {}
): T | null => { ): T | null => {
config = getConfig(config) config = getConfig(config)
const { children } = config const { children } = config
const list = [...tree] const list = [...tree]
for (const node of list) { for (const node of list) {
if (func(node)) return node if (func(node)) return node
node[children!] && list.push(...node[children!]) node[children!] && list.push(...node[children!])
} }
return null return null
} }
export const findNodeAll = <T = any>( export const findNodeAll = <T = any>(
tree: any, tree: any,
func: Fn, func: Fn,
config: Partial<TreeHelperConfig> = {} config: Partial<TreeHelperConfig> = {}
): T[] => { ): T[] => {
config = getConfig(config) config = getConfig(config)
const { children } = config const { children } = config
const list = [...tree] const list = [...tree]
const result: T[] = [] const result: T[] = []
for (const node of list) { for (const node of list) {
func(node) && result.push(node) func(node) && result.push(node)
node[children!] && list.push(...node[children!]) node[children!] && list.push(...node[children!])
} }
return result return result
} }
export const findPath = <T = any>( export const findPath = <T = any>(
tree: any, tree: any,
func: Fn, func: Fn,
config: Partial<TreeHelperConfig> = {} config: Partial<TreeHelperConfig> = {}
): T | T[] | null => { ): T | T[] | null => {
config = getConfig(config) config = getConfig(config)
const path: T[] = [] const path: T[] = []
const list = [...tree] const list = [...tree]
const visitedSet = new Set() const visitedSet = new Set()
const { children } = config const { children } = config
while (list.length) { while (list.length) {
const node = list[0] const node = list[0]
if (visitedSet.has(node)) { if (visitedSet.has(node)) {
path.pop() path.pop()
list.shift() list.shift()
} else { } else {
visitedSet.add(node) visitedSet.add(node)
node[children!] && list.unshift(...node[children!]) node[children!] && list.unshift(...node[children!])
path.push(node) path.push(node)
if (func(node)) { if (func(node)) {
return path return path
} }
} }
} }
return null return null
} }
export const findPathAll = (tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) => { export const findPathAll = (tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) => {
config = getConfig(config) config = getConfig(config)
const path: any[] = [] const path: any[] = []
const list = [...tree] const list = [...tree]
const result: any[] = [] const result: any[] = []
const visitedSet = new Set(), const visitedSet = new Set(),
{ children } = config { children } = config
while (list.length) { while (list.length) {
const node = list[0] const node = list[0]
if (visitedSet.has(node)) { if (visitedSet.has(node)) {
path.pop() path.pop()
list.shift() list.shift()
} else { } else {
visitedSet.add(node) visitedSet.add(node)
node[children!] && list.unshift(...node[children!]) node[children!] && list.unshift(...node[children!])
path.push(node) path.push(node)
func(node) && result.push([...path]) func(node) && result.push([...path])
} }
} }
return result return result
} }
export const filter = <T = any>( export const filter = <T = any>(
tree: T[], tree: T[],
func: (n: T) => boolean, func: (n: T) => boolean,
config: Partial<TreeHelperConfig> = {} config: Partial<TreeHelperConfig> = {}
): T[] => { ): T[] => {
config = getConfig(config) config = getConfig(config)
const children = config.children as string const children = config.children as string
function listFilter(list: T[]) { function listFilter(list: T[]) {
return list return list
.map((node: any) => ({ ...node })) .map((node: any) => ({ ...node }))
.filter((node) => { .filter((node) => {
node[children] = node[children] && listFilter(node[children]) node[children] = node[children] && listFilter(node[children])
return func(node) || (node[children] && node[children].length) return func(node) || (node[children] && node[children].length)
}) })
} }
return listFilter(tree) return listFilter(tree)
} }
export const filterTree = <T = any>(
export const forEach = <T = any>( tree: T[],
tree: T[], func: (n: T) => boolean,
func: (n: T) => any, config: Partial<TreeHelperConfig> = {}
config: Partial<TreeHelperConfig> = {} ): T[] => {
): void => { config = getConfig(config)
config = getConfig(config) const children = config.children as string
const list: any[] = [...tree]
const { children } = config function listFilter(list: T[]) {
for (let i = 0; i < list.length; i++) { return list
// func 返回true就终止遍历避免大量节点场景下无意义循环引起浏览器卡顿 .map((node: any) => ({ ...node }))
if (func(list[i])) { .filter((node) => {
return // 1. 如果当前节点匹配 → 直接保留【所有子节点】,不再过滤下级
} if (func(node)) {
children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]) return true;
} }
}
// 2. 如果当前节点不匹配,递归过滤子节点
/** if (node[children]) {
* @description: Extract tree specified structure const filteredChildren = listFilter(node[children]);
*/ if (filteredChildren.length > 0) {
export const treeMap = <T = any>( node[children] = filteredChildren;
treeData: T[], return true;
opt: { children?: string; conversion: Fn } }
): T[] => { }
return treeData.map((item) => treeMapEach(item, opt))
} // 3. 都不匹配,过滤掉
return false;
/** })
* @description: Extract tree specified structure }
*/
export const treeMapEach = ( return listFilter(tree)
data: any, }
{ children = 'children', conversion }: { children?: string; conversion: Fn } export const forEach = <T = any>(
) => { tree: T[],
const haveChildren = Array.isArray(data[children]) && data[children].length > 0 func: (n: T) => any,
const conversionData = conversion(data) || {} config: Partial<TreeHelperConfig> = {}
if (haveChildren) { ): void => {
return { config = getConfig(config)
...conversionData, const list: any[] = [...tree]
[children]: data[children].map((i: number) => const { children } = config
treeMapEach(i, { for (let i = 0; i < list.length; i++) {
children, // func 返回true就终止遍历避免大量节点场景下无意义循环引起浏览器卡顿
conversion if (func(list[i])) {
}) return
) }
} children && list[i][children] && list.splice(i + 1, 0, ...list[i][children])
} else { }
return { }
...conversionData
} /**
} * @description: Extract tree specified structure
} */
export const treeMap = <T = any>(
/** treeData: T[],
* 递归遍历树结构 opt: { children?: string; conversion: Fn }
* @param treeDatas 树 ): T[] => {
* @param callBack 回调 return treeData.map((item) => treeMapEach(item, opt))
* @param parentNode 父节点 }
*/
export const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => { /**
treeDatas.forEach((element) => { * @description: Extract tree specified structure
const newNode = callBack(element, parentNode) || element */
if (element.children) { export const treeMapEach = (
eachTree(element.children, callBack, newNode) data: any,
} { children = 'children', conversion }: { children?: string; conversion: Fn }
}) ) => {
} const haveChildren = Array.isArray(data[children]) && data[children].length > 0
const conversionData = conversion(data) || {}
/** if (haveChildren) {
* 构造树型结构数据 return {
* @param {*} data 数据源 ...conversionData,
* @param {*} id id字段 默认 'id' [children]: data[children].map((i: number) =>
* @param {*} parentId 父节点字段 默认 'parentId' treeMapEach(i, {
* @param {*} children 孩子节点字段 默认 'children' children,
*/ conversion
export const handleTree = (data: any[], id?: string, parentId?: string, children?: string) => { })
if (!Array.isArray(data)) { )
console.warn('data must be an array') }
return [] } else {
} return {
const config = { ...conversionData
id: id || 'id', }
parentId: parentId || 'parentId', }
childrenList: children || 'children' }
}
/**
const childrenListMap = {} * 递归遍历树结构
const nodeIds = {} * @param treeDatas 树
const tree: any[] = [] * @param callBack 回调
* @param parentNode 父节点
for (const d of data) { */
const parentId = d[config.parentId] export const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => {
if (childrenListMap[parentId] == null) { treeDatas.forEach((element) => {
childrenListMap[parentId] = [] const newNode = callBack(element, parentNode) || element
} if (element.children) {
nodeIds[d[config.id]] = d eachTree(element.children, callBack, newNode)
childrenListMap[parentId].push(d) }
} })
}
for (const d of data) {
const parentId = d[config.parentId] /**
if (nodeIds[parentId] == null) { * 构造树型结构数据
tree.push(d) * @param {*} data 数据源
} * @param {*} id id字段 默认 'id'
} * @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} children 孩子节点字段 默认 'children'
for (const t of tree) { */
adaptToChildrenList(t) export const handleTree = (data: any[], id?: string, parentId?: string, children?: string) => {
} if (!Array.isArray(data)) {
console.warn('data must be an array')
function adaptToChildrenList(o) { return []
if (childrenListMap[o[config.id]] !== null) { }
o[config.childrenList] = childrenListMap[o[config.id]] const config = {
} id: id || 'id',
if (o[config.childrenList]) { parentId: parentId || 'parentId',
for (const c of o[config.childrenList]) { childrenList: children || 'children'
adaptToChildrenList(c) }
}
} const childrenListMap = {}
} const nodeIds = {}
const tree: any[] = []
return tree
} for (const d of data) {
const parentId = d[config.parentId]
/** if (childrenListMap[parentId] == null) {
* 构造树型结构数据 childrenListMap[parentId] = []
* @param {*} data 数据源 }
* @param {*} id id字段 默认 'id' nodeIds[d[config.id]] = d
* @param {*} parentId 父节点字段 默认 'parentId' childrenListMap[parentId].push(d)
* @param {*} children 孩子节点字段 默认 'children' }
* @param {*} rootId 根Id 默认 0
*/ for (const d of data) {
// @ts-ignore const parentId = d[config.parentId]
export const handleTree2 = (data, id, parentId, children, rootId) => { if (nodeIds[parentId] == null) {
id = id || 'id' tree.push(d)
parentId = parentId || 'parentId' }
// children = children || 'children' }
rootId =
rootId || for (const t of tree) {
Math.min( adaptToChildrenList(t)
...data.map((item) => { }
return item[parentId]
}) function adaptToChildrenList(o) {
) || if (childrenListMap[o[config.id]] !== null) {
0 o[config.childrenList] = childrenListMap[o[config.id]]
// 对源数据深度克隆 }
const cloneData = JSON.parse(JSON.stringify(data)) if (o[config.childrenList]) {
// 循环所有项 for (const c of o[config.childrenList]) {
const treeData = cloneData.filter((father) => { adaptToChildrenList(c)
const branchArr = cloneData.filter((child) => { }
// 返回每一项的子级数组 }
return father[id] === child[parentId] }
})
branchArr.length > 0 ? (father.children = branchArr) : '' return tree
// 返回第一层 }
return father[parentId] === rootId
}) /**
return treeData !== '' ? treeData : data * 构造树型结构数据
} * @param {*} data 数据源
* @param {*} id id字段 默认 'id'
/** * @param {*} parentId 父节点字段 默认 'parentId'
* 校验选中的节点,是否为指定 level * @param {*} children 孩子节点字段 默认 'children'
* * @param {*} rootId 根Id 默认 0
* @param tree 要操作的树结构数据 */
* @param nodeId 需要判断在什么层级的数据 // @ts-ignore
* @param level 检查的级别, 默认检查到二级 export const handleTree2 = (data, id, parentId, children, rootId) => {
* @return true 是false 否 id = id || 'id'
*/ parentId = parentId || 'parentId'
export const checkSelectedNode = (tree: any[], nodeId: any, level = 2): boolean => { // children = children || 'children'
if (typeof tree === 'undefined' || !Array.isArray(tree) || tree.length === 0) { rootId =
console.warn('tree must be an array') rootId ||
return false Math.min(
} ...data.map((item) => {
return item[parentId]
// 校验是否是一级节点 })
if (tree.some((item) => item.id === nodeId)) { ) ||
return false 0
} // 对源数据深度克隆
const cloneData = JSON.parse(JSON.stringify(data))
// 递归计数 // 循环所有项
let count = 1 const treeData = cloneData.filter((father) => {
const branchArr = cloneData.filter((child) => {
// 深层次校验 // 返回每一项的子级数组
function performAThoroughValidation(arr: any[]): boolean { return father[id] === child[parentId]
count += 1 })
for (const item of arr) { branchArr.length > 0 ? (father.children = branchArr) : ''
if (item.id === nodeId) { // 返回第一层
return true return father[parentId] === rootId
} else if (typeof item.children !== 'undefined' && item.children.length !== 0) { })
if (performAThoroughValidation(item.children)) { return treeData !== '' ? treeData : data
return true }
}
} /**
} * 校验选中的节点,是否为指定 level
return false *
} * @param tree 要操作的树结构数据
* @param nodeId 需要判断在什么层级的数据
for (const item of tree) { * @param level 检查的级别, 默认检查到二级
count = 1 * @return true 是false 否
if (performAThoroughValidation(item.children)) { */
// 找到后对比是否是期望的层级 export const checkSelectedNode = (tree: any[], nodeId: any, level = 2): boolean => {
if (count >= level) { if (typeof tree === 'undefined' || !Array.isArray(tree) || tree.length === 0) {
return true console.warn('tree must be an array')
} return false
} }
}
// 校验是否是一级节点
return false if (tree.some((item) => item.id === nodeId)) {
} return false
}
/**
* 获取节点的完整结构 // 递归计数
* @param tree 树数据 let count = 1
* @param nodeId 节点 id
*/ // 深层次校验
export const treeToString = (tree: any[], nodeId) => { function performAThoroughValidation(arr: any[]): boolean {
if (typeof tree === 'undefined' || !Array.isArray(tree) || tree.length === 0) { count += 1
console.warn('tree must be an array') for (const item of arr) {
return '' if (item.id === nodeId) {
} return true
// 校验是否是一级节点 } else if (typeof item.children !== 'undefined' && item.children.length !== 0) {
const node = tree.find((item) => item.id === nodeId) if (performAThoroughValidation(item.children)) {
if (typeof node !== 'undefined') { return true
return node.name }
} }
let str = '' }
return false
function performAThoroughValidation(arr) { }
for (const item of arr) {
if (item.id === nodeId) { for (const item of tree) {
str += ` / ${item.name}` count = 1
return true if (performAThoroughValidation(item.children)) {
} else if (typeof item.children !== 'undefined' && item.children.length !== 0) { // 找到后对比是否是期望的层级
str += ` / ${item.name}` if (count >= level) {
if (performAThoroughValidation(item.children)) { return true
return true }
} }
} }
}
return false return false
} }
for (const item of tree) { /**
str = `${item.name}` * 获取节点的完整结构
if (performAThoroughValidation(item.children)) { * @param tree 树数据
break * @param nodeId 节点 id
} */
} export const treeToString = (tree: any[], nodeId) => {
return str if (typeof tree === 'undefined' || !Array.isArray(tree) || tree.length === 0) {
} console.warn('tree must be an array')
return ''
}
// 校验是否是一级节点
const node = tree.find((item) => item.id === nodeId)
if (typeof node !== 'undefined') {
return node.name
}
let str = ''
function performAThoroughValidation(arr) {
for (const item of arr) {
if (item.id === nodeId) {
str += ` / ${item.name}`
return true
} else if (typeof item.children !== 'undefined' && item.children.length !== 0) {
str += ` / ${item.name}`
if (performAThoroughValidation(item.children)) {
return true
}
}
}
return false
}
for (const item of tree) {
str = `${item.name}`
if (performAThoroughValidation(item.children)) {
break
}
}
return str
}

View File

@@ -43,13 +43,11 @@ export default class SocketService {
console.log('您的浏览器不支持WebSocket') console.log('您的浏览器不支持WebSocket')
return return
} }
console.log("🚀 ~ SocketService ~ connect ~ url:", url)
if (url === null || (typeof url === 'string' && url.includes('null'))) return;
setTimeout(() => { setTimeout(() => {
// 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 = new WebSocket(url)
this.ws.onopen = () => this.handleOpen() this.ws.onopen = () => this.handleOpen()
@@ -58,7 +56,6 @@ export default class SocketService {
this.ws.onmessage = event => this.handleMessage(event) this.ws.onmessage = event => this.handleMessage(event)
}, 0) }, 0)
} }
// 处理连接成功事件 // 处理连接成功事件
private handleOpen(): void { private handleOpen(): void {
ElMessage.success('webSocket连接服务端成功了') ElMessage.success('webSocket连接服务端成功了')
@@ -90,7 +87,7 @@ export default class SocketService {
if (event.data == '连接成功') { if (event.data == '连接成功') {
this.sendHeartbeat() this.sendHeartbeat()
} else if (event.data == 'connect') { } else if (event.data == 'over') {
} else if (event.data.length > 10) { } else if (event.data.length > 10) {
let message: MessageType let message: MessageType
try { try {
@@ -104,7 +101,7 @@ export default class SocketService {
// 通过接受服务端发送的type字段来回调函数 // 通过接受服务端发送的type字段来回调函数
if ((message.key || message.code) && this.callBackMapping['message']) { if ((message.key || message.code || message.time) && this.callBackMapping['message']) {
this.callBackMapping['message']!(message) this.callBackMapping['message']!(message)
} else { } else {
console.log('抛弃====>') console.log('抛弃====>')
@@ -112,6 +109,7 @@ export default class SocketService {
// 丢弃或继续写你的逻辑 // 丢弃或继续写你的逻辑
} }
} else { } else {
this.callBackMapping['message']!({ Flag: false })
ElMessage.error(event.data) ElMessage.error(event.data)
} }
} }

View File

@@ -90,7 +90,6 @@ const loading = ref(false)
const statistics = ref() const statistics = ref()
const flg = ref(true) const flg = ref(true)
const showMqtt = ref(false)
const zoom = ref('') //图表焦点校验 const zoom = ref('') //图表焦点校验
const resultList = ref([ const resultList = ref([

View File

@@ -2,7 +2,7 @@
<div class="default-main"> <div class="default-main">
<TableHeader :showReset="false" showExport> <TableHeader :showReset="false" showExport>
<template #select> <template #select>
<el-form-item label="关键字筛选"> <el-form-item label="筛选数据">
<el-input <el-input
maxlength="32" maxlength="32"
show-word-limit show-word-limit

View File

@@ -3,7 +3,7 @@
<!-- 案例库 --> <!-- 案例库 -->
<TableHeader ref="TableHeaderRef"> <TableHeader ref="TableHeaderRef">
<template #select> <template #select>
<el-form-item label="名称"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入搜索名称" maxlength="32" show-word-limit/> <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入搜索名称" maxlength="32" show-word-limit/>
</el-form-item> </el-form-item>

View File

@@ -3,7 +3,7 @@
<!-- 模版 --> <!-- 模版 -->
<TableHeader ref="TableHeaderRef" > <TableHeader ref="TableHeaderRef" >
<template #select> <template #select>
<el-form-item label="名称"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable <el-input v-model="tableStore.table.params.searchValue" clearable
placeholder="请输入搜索名称" maxlength="32" show-word-limit/> placeholder="请输入搜索名称" maxlength="32" show-word-limit/>
</el-form-item> </el-form-item>

View File

@@ -1,274 +1,289 @@
<template> <template>
<div class="default-main online"> <div class="default-main online">
<div class="online_header"> <div class="online_header">
<TableHeader date-picker area ref="tableHeaderRef"> <TableHeader date-picker area ref="tableHeaderRef">
<template #select> <template #select>
<el-form-item label="统计类型:"> <el-form-item label="统计类型">
<el-select <el-select
v-model="tableStore.table.params.statisticalType" v-model="tableStore.table.params.statisticalType"
placeholder="请选择统计类型" placeholder="请选择统计类型"
value-key="id" value-key="id"
style="width: 100%" style="width: 100%"
> >
<el-option <el-option
v-for="item in classificationData" v-for="item in classificationData"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></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="tableStore.table.params.scale" v-model="tableStore.table.params.scale"
multiple multiple
collapse-tags collapse-tags
clearable clearable
placeholder="请选择电压等级" placeholder="请选择电压等级"
style="width: 100%" style="width: 100%"
value-key="id" value-key="id"
> >
<el-option <el-option
v-for="item in voltageleveloption" v-for="item in voltageleveloption"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></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="tableStore.table.params.powerFlag" v-model="tableStore.table.params.powerFlag"
clearable clearable
style="width: 100%" style="width: 100%"
placeholder="请选择电网标识" placeholder="请选择电网标识"
> >
<el-option <el-option
v-for="item in powerFlagList" v-for="item in powerFlagList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.algoDescribe" :value="item.algoDescribe"
></el-option> ></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="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
multiple multiple
collapse-tags collapse-tags
clearable clearable
placeholder="请选择终端厂家" placeholder="请选择终端厂家"
style="width: 100%" style="width: 100%"
value-key="id" value-key="id"
> >
<el-option <el-option
v-for="(item, index) in terminaloption" v-for="(item, index) in terminaloption"
:key="index" :key="index"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></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="tableStore.table.params.loadType" v-model="tableStore.table.params.loadType"
multiple multiple
collapse-tags collapse-tags
clearable clearable
placeholder="请选择干扰源类型" placeholder="请选择干扰源类型"
style="width: 100%" style="width: 100%"
value-key="id" value-key="id"
> >
<el-option <el-option
v-for="(item, index) in interfereoption" v-for="(item, index) in interfereoption"
:key="index" :key="index"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</template> <el-form-item label="筛选数据">
</TableHeader> <el-input
</div> v-model.trim="tableStore.table.params.searchValue"
<div class="online_main"> clearable
<el-tabs v-model="activeName" type="border-card" @tab-click="handleClick"> style="width: 200px"
<el-tab-pane :name="0" :lazy="true" label="稳态指标符合性占比表格"> placeholder="请输入关键字筛选"
<Table />
ref="tableRef" </el-form-item>
:tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }" </template>
:scroll-y="{ enabled: true }" </TableHeader>
v-if="activeName == 0" </div>
/> <div class="online_main">
</el-tab-pane> <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
<el-tab-pane :name="1" :lazy="true" label="稳态指标符合性占比"> <el-tab-pane :name="0" :lazy="true" label="稳态指标符合性占比表格">
<charts v-if="activeName == 1" ref="chartsRef" /> <Table
</el-tab-pane> ref="tableRef"
</el-tabs> :tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }"
</div> :scroll-y="{ enabled: true }"
</div> v-if="activeName == 0"
</template> />
<script lang="ts" setup> </el-tab-pane>
import { ref, onMounted, watch } from 'vue' <el-tab-pane :name="1" :lazy="true" label="稳态指标符合性占比图">
import { useDictData } from '@/stores/dictData' <charts v-if="activeName == 1" ref="chartsRef" />
import DatePicker from '@/components/form/datePicker/index.vue' </el-tab-pane>
import { getAreaDept } from '@/api/harmonic-boot/area' </el-tabs>
import TableHeader from '@/components/table/header/index.vue' </div>
import TableStore from '@/utils/tableStore' </div>
import Table from '@/components/table/index.vue' </template>
import charts from './components/charts.vue' <script lang="ts" setup>
defineOptions({ import { ref, onMounted, watch } from 'vue'
name: 'harmonic-boot/area/SteadyState' import { useDictData } from '@/stores/dictData'
}) import DatePicker from '@/components/form/datePicker/index.vue'
const tableRef = ref() import { getAreaDept } from '@/api/harmonic-boot/area'
const onlineChartsRef = ref() import TableHeader from '@/components/table/header/index.vue'
const dictData = useDictData() import TableStore from '@/utils/tableStore'
//字典获取电压等级 import Table from '@/components/table/index.vue'
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand') import charts from './components/charts.vue'
//字典获取终端厂家 import { filterTree } from '@/utils/tree'
const terminaloption = dictData.getBasicData('Dev_Manufacturers') defineOptions({
//字典获取干扰源类型 name: 'harmonic-boot/area/SteadyState'
const interfereoption = dictData.getBasicData('Interference_Source') })
//字典获取统计类型 const tableRef = ref()
const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type']) const onlineChartsRef = ref()
//字典获取监督对象类型 const dictData = useDictData()
const powerFlagList = dictData.getBasicData('power_flag') //字典获取电压等级
//调用区域接口获取区域 const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const treeData = ref([]) //字典获取终端厂家
const idArr = ref([]) const terminaloption = dictData.getBasicData('Dev_Manufacturers')
const activeName = ref(0) //字典获取干扰源类型
const getTreeData = async () => { const interfereoption = dictData.getBasicData('Interference_Source')
await getAreaDept().then(res => { //字典获取统计类型
var data = res.data const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type'])
data.forEach(element => { //字典获取监督对象类型
idArr.value.push(element.id) const powerFlagList = dictData.getBasicData('power_flag')
}) //调用区域接口获取区域
treeData.value = JSON.parse(JSON.stringify(res.data)) const treeData = ref([])
}) const idArr = ref([])
} const activeName = ref(0)
getTreeData() const getTreeData = async () => {
await getAreaDept().then(res => {
const chartsRef = ref() var data = res.data
const handleClick = (tab: any, e: any) => { data.forEach(element => {
// console.log(tab,e,"??????????"); idArr.value.push(element.id)
// if(activeName.value===1){ })
tableStore.index() treeData.value = JSON.parse(JSON.stringify(res.data))
// } })
} }
getTreeData()
// const datePickerRef = ref()
const tableHeaderRef = ref() const chartsRef = ref()
const tableStore = new TableStore({ const handleClick = (tab: any, e: any) => {
publicHeight: 60, // console.log(tab,e,"??????????");
showPage: false, // if(activeName.value===1){
url: '/harmonic-boot/steadyExceedRate/getSteadyExceedRateData', tableStore.index()
method: 'POST', // }
column: [ }
{
title: '', // const datePickerRef = ref()
field: 'name', const tableHeaderRef = ref()
align: 'left', const tableStore = new TableStore({
treeNode: true, publicHeight: 60,
width: 350 showPage: false,
}, url: '/harmonic-boot/steadyExceedRate/getSteadyExceedRateData',
{ method: 'POST',
title: '电压等级', column: [
field: 'voltageLevel', {
title: '',
formatter: function (row) { field: 'name',
return row.cellValue ? row.cellValue : '/' align: 'left',
} treeNode: true,
}, width: 350
{ },
title: '厂家', {
field: 'factoryName', title: '电压等级',
field: 'voltageLevel',
formatter: function (row) {
return row.cellValue ? row.cellValue : '/' formatter: function (row) {
} return row.cellValue ? row.cellValue : '/'
}, }
{ },
title: '网络参数', {
field: 'networkParam', title: '厂家',
field: 'factoryName',
formatter: function (row) {
return row.cellValue ? row.cellValue : '/' formatter: function (row) {
} return row.cellValue ? row.cellValue : '/'
}, }
{ },
title: '监测点名称', {
field: 'lineName', title: '网络参数',
field: 'networkParam',
formatter: function (row) {
return row.cellValue ? row.cellValue : '/' formatter: function (row) {
} return row.cellValue ? row.cellValue : '/'
}, }
{ },
title: '符合性占比(%)', {
field: 'steadyExceedRate', title: '监测点名称',
field: 'lineName',
formatter: function (row) {
return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue formatter: function (row) {
} return row.cellValue ? row.cellValue : '/'
} }
], },
{
loadCallback: () => { title: '符合性占比(%)',
tableStore.table.data = tree2List(tableStore.table.data, Math.random() * 1000) field: 'steadyExceedRate',
tableStore.table.column[0].title = tableStore.table.params.statisticalType.name
formatter: function (row) {
chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params) return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue
setTimeout(() => { }
activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true) }
}, 0) ],
}
}) loadCallback: () => {
tableStore.table.data = tree2List(
tableStore.table.params.statisticalType = classificationData[0] filterTree(tableStore.table.data, node => {
tableStore.table.params.scale = [] return node.name.includes(tableStore.table.params.searchValue)
tableStore.table.params.manufacturer = [] }),
tableStore.table.params.loadType = [] Math.random() * 1000
tableStore.table.params.powerFlag = 2 )
tableStore.table.params.serverName = 'harmonicBoot' tableStore.table.column[0].title = tableStore.table.params.statisticalType.name
provide('tableStore', tableStore)
const tree2List = (list: any, id?: string) => { chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params)
//存储结果的数组 setTimeout(() => {
let arr: any = [] activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true)
// 遍历 tree 数组 }, 0)
list.forEach((item: any) => { }
item.uPid = id })
item.uId = Math.random() * 1000
item.valueOver == 3.14159 ? 0 : item.valueOver >= 90 ? 1 : item.valueOver && item.valueOver < 90 ? 2 : 3 tableStore.table.params.statisticalType = classificationData[0]
// 判断item是否存在children tableStore.table.params.scale = []
if (!item.children) return arr.push(item) tableStore.table.params.manufacturer = []
// 函数递归对children数组进行tree2List的转换 tableStore.table.params.loadType = []
const children = tree2List(item.children, item.uId) tableStore.table.params.powerFlag = 2
// 删除item的children属性 tableStore.table.params.serverName = 'harmonicBoot'
delete item.children tableStore.table.params.searchValue = ''
// 把item和children数组添加至结果数组 provide('tableStore', tableStore)
//..children: 意思是把children数组展开 const tree2List = (list: any, id?: string) => {
arr.push(item, ...children) //存储结果的数组
}) let arr: any = []
// 返回结果数组 // 遍历 tree 数组
return arr list.forEach((item: any) => {
} item.uPid = id
item.uId = Math.random() * 1000
onMounted(() => { item.valueOver == 3.14159 ? 0 : item.valueOver >= 90 ? 1 : item.valueOver && item.valueOver < 90 ? 2 : 3
tableStore.index() // 判断item是否存在children
}) if (!item.children) return arr.push(item)
</script> // 函数递归对children数组进行tree2List的转换
<style lang="scss" scoped> const children = tree2List(item.children, item.uId)
// .online { // 删除item的children属性
// width: 100%; delete item.children
// height: 100%; // 把item和children数组添加至结果数组
// .online_header { //..children: 意思是把children数组展开
// width: 100%; arr.push(item, ...children)
// max-height: 140px; })
// padding: 10px; // 返回结果数组
// box-sizing: border-box; return arr
// } }
// .online_main {
// padding: 0 10px; onMounted(() => {
// } tableStore.index()
// } })
</style> </script>
<style lang="scss" scoped>
// .online {
// width: 100%;
// height: 100%;
// .online_header {
// width: 100%;
// max-height: 140px;
// padding: 10px;
// box-sizing: border-box;
// }
// .online_main {
// padding: 0 10px;
// }
// }
</style>

View File

@@ -6,7 +6,7 @@
<el-form-item label="筛选数据"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" placeholder="输入关键字筛选" clearable maxlength="32" show-word-limit/> <el-input v-model="tableStore.table.params.searchValue" placeholder="输入关键字筛选" clearable maxlength="32" show-word-limit/>
</el-form-item> </el-form-item>
<el-form-item label="统计类型:"> <el-form-item label="统计类型">
<el-select <el-select
v-model="tableStore.table.params.statisticalType" v-model="tableStore.table.params.statisticalType"
value-key="id" value-key="id"
@@ -21,7 +21,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="电压等级:"> <el-form-item label="电压等级">
<el-select <el-select
v-model="tableStore.table.params.scale" v-model="tableStore.table.params.scale"
multiple multiple
@@ -38,7 +38,7 @@
></el-option> ></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="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
multiple multiple
@@ -55,7 +55,7 @@
></el-option> ></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="tableStore.table.params.loadType" v-model="tableStore.table.params.loadType"
multiple multiple

View File

@@ -3,14 +3,14 @@
<div class="online_header"> <div class="online_header">
<TableHeader date-picker ref="tableHeaderRef"> <TableHeader date-picker ref="tableHeaderRef">
<template #select> <template #select>
<el-form-item label="统计类型:"> <el-form-item label="统计类型">
<el-select v-model="formData.statisticalType" placeholder="请选择统计类型" value-key="id" <el-select v-model="formData.statisticalType" placeholder="请选择统计类型" value-key="id"
style="width: 100%"> style="width: 100%">
<el-option v-for="item in classificationData" :key="item.id" :label="item.name" <el-option v-for="item in classificationData" :key="item.id" :label="item.name"
:value="item"></el-option> :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 }} -->
@@ -33,28 +33,28 @@
<!-- </el-option> <!-- </el-option>
</el-select> --> </el-select> -->
</el-form-item> </el-form-item>
<el-form-item label="电压等级:"> <el-form-item label="电压等级">
<el-select v-model="formData.scale" multiple collapse-tags clearable placeholder="请选择电压等级" <el-select v-model="formData.scale" multiple collapse-tags clearable placeholder="请选择电压等级"
style="width: 100%" value-key="id"> style="width: 100%" value-key="id">
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" <el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name"
:value="item"></el-option> :value="item"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家">
<el-select v-model="formData.manufacturer" multiple collapse-tags clearable <el-select v-model="formData.manufacturer" multiple collapse-tags clearable
placeholder="请选择终端厂家" style="width: 100%" value-key="id"> placeholder="请选择终端厂家" style="width: 100%" value-key="id">
<el-option v-for="(item, index) in terminaloption" :key="index" :label="item.name" <el-option v-for="(item, index) in terminaloption" :key="index" :label="item.name"
:value="item"></el-option> :value="item"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="干扰源类型:"> <el-form-item label="干扰源类型">
<el-select v-model="formData.loadType" multiple collapse-tags clearable placeholder="请选择干扰源类型" <el-select v-model="formData.loadType" multiple collapse-tags clearable placeholder="请选择干扰源类型"
style="width: 100%" value-key="id"> style="width: 100%" value-key="id">
<el-option v-for="(item, index) in interfereoption" :key="index" :label="item.name" <el-option v-for="(item, index) in interfereoption" :key="index" :label="item.name"
:value="item"></el-option> :value="item"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="关键字筛选:"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字"></el-input> <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字"></el-input>
</el-form-item> </el-form-item>
</template> </template>
@@ -473,7 +473,7 @@ const makeUpSubmit = () => {
logPopUp.value = true logPopUp.value = true
} }
const socket = async (form: any) => { const socket = async (form: any) => {
const url = (localStorage.getItem('WebSocketUrl2') || 'ws://192.168.1.67:10405/api/recell/') const url = (localStorage.getItem('WebSocketUrl2') || 'null')//'ws://192.168.1.67:10405/api/recell/')
logList.value = [] logList.value = []
await dataSocket.socketServe.connect(`${url}${adminInfo.id}`) await dataSocket.socketServe.connect(`${url}${adminInfo.id}`)
await dataSocket.socketServe.send(form) await dataSocket.socketServe.send(form)

View File

@@ -1,259 +1,275 @@
<template> <template>
<div class="default-main online"> <div class="default-main online">
<div class="online_header"> <div class="online_header">
<TableHeader date-picker area ref="tableHeaderRef"> <TableHeader date-picker area ref="tableHeaderRef">
<template #select> <template #select>
<el-form-item label="统计类型:"> <el-form-item label="统计类型">
<el-select <el-select
v-model="tableStore.table.params.statisticalType" v-model="tableStore.table.params.statisticalType"
placeholder="请选择统计类型" placeholder="请选择统计类型"
value-key="id" value-key="id"
style="width: 100%" style="width: 100%"
> >
<el-option <el-option
v-for="item in classificationData" v-for="item in classificationData"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></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="tableStore.table.params.scale" v-model="tableStore.table.params.scale"
multiple multiple
collapse-tags collapse-tags
clearable clearable
placeholder="请选择电压等级" placeholder="请选择电压等级"
style="width: 100%" style="width: 100%"
value-key="id" value-key="id"
> >
<el-option <el-option
v-for="item in voltageleveloption" v-for="item in voltageleveloption"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></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="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
multiple multiple
collapse-tags collapse-tags
clearable clearable
placeholder="请选择终端厂家" placeholder="请选择终端厂家"
style="width: 100%" style="width: 100%"
value-key="id" value-key="id"
> >
<el-option <el-option
v-for="(item, index) in terminaloption" v-for="(item, index) in terminaloption"
:key="index" :key="index"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></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="tableStore.table.params.loadType" v-model="tableStore.table.params.loadType"
multiple multiple
collapse-tags collapse-tags
clearable clearable
placeholder="请选择干扰源类型" placeholder="请选择干扰源类型"
style="width: 100%" style="width: 100%"
value-key="id" value-key="id"
> >
<el-option <el-option
v-for="(item, index) in interfereoption" v-for="(item, index) in interfereoption"
:key="index" :key="index"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="电网标志"> <el-form-item label="电网标志">
<el-select v-model="tableStore.table.params.powerFlag" placeholder="请选择电网标志"> <el-select v-model="tableStore.table.params.powerFlag" placeholder="请选择电网标志">
<el-option <el-option
v-for="item in sign" v-for="item in sign"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.algoDescribe" :value="item.algoDescribe"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</template> <el-form-item label="筛选数据">
</TableHeader> <el-input
</div> v-model.trim="tableStore.table.params.searchValue"
<div class="online_main"> clearable
<el-tabs v-model="activeName" type="border-card" @tab-click="handleClick"> style="width: 200px"
<el-tab-pane :name="0" :lazy="true" label="谐波畸变率统计表"> placeholder="请输入关键字筛选"
<Table />
ref="tableRef" </el-form-item>
:tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }" </template>
:scroll-y="{ enabled: true }" </TableHeader>
v-if="activeName == 0" </div>
/> <div class="online_main">
</el-tab-pane> <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
<el-tab-pane :name="1" :lazy="true" label="谐波畸变率统计"> <el-tab-pane :name="0" :lazy="true" label="谐波畸变率统计">
<charts v-if="activeName == 1" ref="chartsRef" /> <Table
</el-tab-pane> ref="tableRef"
</el-tabs> :tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }"
</div> :scroll-y="{ enabled: true }"
</div> v-if="activeName == 0"
</template> />
<script lang="ts" setup> </el-tab-pane>
import { ref, onMounted, watch } from 'vue' <el-tab-pane :name="1" :lazy="true" label="谐波畸变率统计图">
import { useDictData } from '@/stores/dictData' <charts v-if="activeName == 1" ref="chartsRef" />
import DatePicker from '@/components/form/datePicker/index.vue' </el-tab-pane>
import { getAreaDept } from '@/api/harmonic-boot/area' </el-tabs>
import TableHeader from '@/components/table/header/index.vue' </div>
import TableStore from '@/utils/tableStore' </div>
import Table from '@/components/table/index.vue' </template>
import charts from './components/charts.vue' <script lang="ts" setup>
defineOptions({ import { ref, onMounted, watch } from 'vue'
name: 'harmonic-boot/area/harmonicDistortionRate' import { useDictData } from '@/stores/dictData'
}) import DatePicker from '@/components/form/datePicker/index.vue'
const tableRef = ref() import { getAreaDept } from '@/api/harmonic-boot/area'
const onlineChartsRef = ref() import TableHeader from '@/components/table/header/index.vue'
const dictData = useDictData() import TableStore from '@/utils/tableStore'
//字典获取电压等级 import Table from '@/components/table/index.vue'
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand') import charts from './components/charts.vue'
//字典获取终端厂家 import { filterTree } from '@/utils/tree'
const terminaloption = dictData.getBasicData('Dev_Manufacturers') defineOptions({
//字典获取干扰源类型 name: 'harmonic-boot/area/harmonicDistortionRate'
const interfereoption = dictData.getBasicData('Interference_Source') })
//字典获取统计类型 const tableRef = ref()
const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type']) const onlineChartsRef = ref()
//调用区域接口获取区域 const dictData = useDictData()
const sign = dictData.getBasicData('power_flag') //字典获取电压等级
const treeData = ref([]) const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const idArr = ref([]) //字典获取终端厂家
const activeName = ref(0) const terminaloption = dictData.getBasicData('Dev_Manufacturers')
const getTreeData = async () => { //字典获取干扰源类型
await getAreaDept().then(res => { const interfereoption = dictData.getBasicData('Interference_Source')
var data = res.data //字典获取统计类型
data.forEach(element => { const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type'])
idArr.value.push(element.id) //调用区域接口获取区域
}) const sign = dictData.getBasicData('power_flag')
treeData.value = JSON.parse(JSON.stringify(res.data)) const treeData = ref([])
}) const idArr = ref([])
} const activeName = ref(0)
getTreeData() const getTreeData = async () => {
await getAreaDept().then(res => {
const chartsRef = ref() var data = res.data
const handleClick = (tab: any, e: any) => { data.forEach(element => {
// console.log(tab,e,"??????????"); idArr.value.push(element.id)
// if(activeName.value===1){ })
tableStore.index() treeData.value = JSON.parse(JSON.stringify(res.data))
// } })
} }
getTreeData()
// const datePickerRef = ref()
const tableHeaderRef = ref() const chartsRef = ref()
const tableStore = new TableStore({ const handleClick = (tab: any, e: any) => {
publicHeight: 60, // console.log(tab,e,"??????????");
showPage: false, // if(activeName.value===1){
url: '/harmonic-boot/tHDistortion/getTHDistortionData', tableStore.index()
method: 'POST', // }
column: [ }
{
title: '', // const datePickerRef = ref()
field: 'name', const tableHeaderRef = ref()
align: 'left', const tableStore = new TableStore({
treeNode: true, publicHeight: 60,
width: 350 showPage: false,
}, url: '/harmonic-boot/tHDistortion/getTHDistortionData',
{ method: 'POST',
title: '电压等级', column: [
field: 'voltageLevel', {
align: 'center', title: '',
formatter: function (row) { field: 'name',
return row.cellValue ? row.cellValue : '/' align: 'left',
} treeNode: true,
}, width: 350
{ },
title: '网络参数', {
field: 'networkParam', title: '电压等级',
align: 'center', field: 'voltageLevel',
formatter: function (row) { align: 'center',
return row.cellValue ? row.cellValue : '/' formatter: function (row) {
} return row.cellValue ? row.cellValue : '/'
}, }
{ },
title: '监测点名称', {
field: 'lineName', title: '网络参数',
align: 'center', field: 'networkParam',
formatter: function (row) { align: 'center',
return row.cellValue ? row.cellValue : '/' formatter: function (row) {
} return row.cellValue ? row.cellValue : '/'
}, }
{ },
title: '总谐波畸变率(%)', {
field: 'distortion', title: '监测点名称',
align: 'center', field: 'lineName',
formatter: function (row) { align: 'center',
return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue formatter: function (row) {
} return row.cellValue ? row.cellValue : '/'
} }
], },
{
loadCallback: () => { title: '总谐波畸变率(%)',
tableStore.table.data = tree2List(tableStore.table.data, Math.random() * 1000) field: 'distortion',
tableStore.table.column[0].title = tableStore.table.params.statisticalType.name align: 'center',
chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params) formatter: function (row) {
setTimeout(() => { return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue
activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true) }
}, 0) }
} ],
})
loadCallback: () => {
tableStore.table.params.statisticalType = classificationData[0] tableStore.table.data = tree2List(
tableStore.table.params.scale = [] filterTree(tableStore.table.data, node => {
tableStore.table.params.manufacturer = [] // 筛选条件name 包含关键词
tableStore.table.params.loadType = [] return node.name.includes(tableStore.table.params.searchValue)
tableStore.table.params.powerFlag = sign[0]?.algoDescribe || 0 }),
tableStore.table.params.serverName = 'harmonicBoot' Math.random() * 1000
provide('tableStore', tableStore) )
const tree2List = (list: any, id?: string) => { tableStore.table.column[0].title = tableStore.table.params.statisticalType.name
//存储结果的数组 chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params)
let arr: any = [] setTimeout(() => {
// 遍历 tree 数组 activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true)
list.forEach((item: any) => { }, 0)
item.uPid = id }
item.uId = Math.random() * 1000 })
item.valueOver == 3.14159 ? 0 : item.valueOver >= 90 ? 1 : item.valueOver && item.valueOver < 90 ? 2 : 3
// 判断item是否存在children tableStore.table.params.statisticalType = classificationData[0]
if (!item.children) return arr.push(item) tableStore.table.params.scale = []
// 函数递归对children数组进行tree2List的转换 tableStore.table.params.manufacturer = []
const children = tree2List(item.children, item.uId) tableStore.table.params.loadType = []
// 删除item的children属性 tableStore.table.params.powerFlag = sign[0]?.algoDescribe || 0
delete item.children tableStore.table.params.serverName = 'harmonicBoot'
// 把item和children数组添加至结果数组 tableStore.table.params.searchValue = ''
//..children: 意思是把children数组展开 provide('tableStore', tableStore)
arr.push(item, ...children) const tree2List = (list: any, id?: string) => {
}) //存储结果的数组
// 返回结果数组 let arr: any = []
return arr // 遍历 tree 数组
} list.forEach((item: any) => {
item.uPid = id
onMounted(() => { item.uId = Math.random() * 1000
tableStore.index() item.valueOver == 3.14159 ? 0 : item.valueOver >= 90 ? 1 : item.valueOver && item.valueOver < 90 ? 2 : 3
}) // 判断item是否存在children
</script> if (!item.children) return arr.push(item)
<style lang="scss" scoped> // 函数递归对children数组进行tree2List的转换
// .online { const children = tree2List(item.children, item.uId)
// width: 100%; // 删除item的children属性
// height: 100%; delete item.children
// .online_header { // 把item和children数组添加至结果数组
// width: 100%; //..children: 意思是把children数组展开
// max-height: 140px; arr.push(item, ...children)
// padding: 10px; })
// box-sizing: border-box; // 返回结果数组
// } return arr
// .online_main { }
// padding: 0 10px;
// } onMounted(() => {
// } tableStore.index()
</style> })
</script>
<style lang="scss" scoped>
// .online {
// width: 100%;
// height: 100%;
// .online_header {
// width: 100%;
// max-height: 140px;
// padding: 10px;
// box-sizing: border-box;
// }
// .online_main {
// padding: 0 10px;
// }
// }
</style>

View File

@@ -2,7 +2,7 @@
<div class="default-main"> <div class="default-main">
<TableHeader date-picker area showExport> <TableHeader date-picker area showExport>
<template #select> <template #select>
<el-form-item label="统计类型:" v-if="false"> <el-form-item label="统计类型" v-if="false">
<el-select <el-select
v-model="tableStore.table.params.statisticalType" v-model="tableStore.table.params.statisticalType"
placeholder="请选择统计类型" placeholder="请选择统计类型"
@@ -18,7 +18,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="电压等级:" v-if="false"> <el-form-item label="电压等级" v-if="false">
<el-select <el-select
v-model="tableStore.table.params.scale" v-model="tableStore.table.params.scale"
multiple multiple
@@ -36,7 +36,7 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:" v-if="false"> <el-form-item label="终端厂家" v-if="false">
<el-select <el-select
v-model="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
multiple multiple
@@ -55,7 +55,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="干扰源类型:"> <el-form-item label="干扰源类型">
<el-select <el-select
v-model="tableStore.table.params.loadType" v-model="tableStore.table.params.loadType"
multiple multiple

View File

@@ -3,7 +3,7 @@
<div class="online_header"> <div class="online_header">
<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" v-model="formData.statisticalType"
placeholder="请选择统计类型" placeholder="请选择统计类型"
@@ -18,7 +18,7 @@
></el-option> ></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 }} -->
@@ -48,7 +48,7 @@
<!-- </el-option> <!-- </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.scale" v-model="formData.scale"
multiple multiple
@@ -66,7 +66,7 @@
></el-option> ></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" v-model="formData.manufacturer"
multiple multiple
@@ -84,7 +84,7 @@
></el-option> ></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" v-model="formData.loadType"
multiple multiple
@@ -102,7 +102,7 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="关键字筛选:"> <el-form-item label="筛选数据">
<el-input <el-input
v-model="tableStore.table.params.searchValue" v-model="tableStore.table.params.searchValue"
clearable clearable

View File

@@ -1,305 +1,305 @@
<template> <template>
<div class="charts" style="position: relative; width: 100%"> <div class="charts" style="position: relative; width: 100%">
<div style="position: absolute; right: 60px; top: 5px; font-weight: bold"> <div style="position: absolute; right: 60px; top: 5px; font-weight: bold">
<el-tag <el-tag
style=" style="
background: #A52a2a; background: #A52a2a;
width: 30px; width: 30px;
height: 15px; height: 15px;
border: 1px solid #A52a2a; border: 1px solid #A52a2a;
float: left; float: left;
margin-top: 2px; margin-top: 2px;
" "
></el-tag> ></el-tag>
<span style="color: #A52a2a; font-weight: 400; float: left">&nbsp&nbsp在线<60% &nbsp&nbsp</span> <span style="color: #A52a2a; font-weight: 400; float: left">&nbsp&nbsp合格<60% &nbsp&nbsp</span>
<el-tag <el-tag
size="small" size="small"
style=" style="
background: #ffcc33; background: #ffcc33;
width: 30px; width: 30px;
height: 15px; height: 15px;
border: 1px solid #ffcc33; border: 1px solid #ffcc33;
float: left; float: left;
margin-top: 2px; margin-top: 2px;
" "
></el-tag> ></el-tag>
<span style="color: #ffcc33; font-weight: 400; float: left">&nbsp&nbsp60%在线<90% &nbsp&nbsp</span> <span style="color: #ffcc33; font-weight: 400; float: left">&nbsp&nbsp60%合格<90% &nbsp&nbsp</span>
<el-tag <el-tag
style=" style="
background: #339966; background: #339966;
width: 30px; width: 30px;
height: 15px; height: 15px;
border: 1px solid #339966; border: 1px solid #339966;
float: left; float: left;
margin-top: 2px; margin-top: 2px;
" "
></el-tag> ></el-tag>
<span style="color: #339966; font-weight: 400; float: left">&nbsp&nbsp在线90%</span> <span style="color: #339966; font-weight: 400; float: left">&nbsp&nbsp合格90%</span>
</div> </div>
<my-echart <my-echart
v-loading="loading" v-loading="loading"
class="mt10" class="mt10"
:style="`height: calc(${tableStore.table.height} - 135px)`" :style="`height: calc(${tableStore.table.height} - 135px)`"
:options="options" :options="options"
/> />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, provide, nextTick } from 'vue' import { ref, onMounted, provide, nextTick } from 'vue'
import TableStore from '@/utils/tableStore' import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue' import Table from '@/components/table/index.vue'
import MyEchart from '@/components/echarts/MyEchart.vue' import MyEchart from '@/components/echarts/MyEchart.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import * as echarts from 'echarts/core' import * as echarts from 'echarts/core'
const dictData = useDictData() const dictData = useDictData()
const options = ref({}) const options = ref({})
const TableHeaderRef = ref() const TableHeaderRef = ref()
const tableStoreParams: any = ref({}) const tableStoreParams: any = ref({})
const loading = ref(false) const loading = ref(false)
const getTableStoreParams = async (val: any) => { const getTableStoreParams = async (val: any) => {
tableStoreParams.value = val tableStoreParams.value = val
loading.value = true loading.value = true
setTimeout(() => { setTimeout(() => {
tableStore.index() tableStore.index()
}, 1500) }, 1500)
} }
const itemStyle = { const itemStyle = {
normal: { normal: {
// 随机显示 // 随机显示
//color:function(d){return "#"+Math.floor(Math.random()*(256*256*256-1)).toString(16);} //color:function(d){return "#"+Math.floor(Math.random()*(256*256*256-1)).toString(16);}
// 定制显示(按顺序) // 定制显示(按顺序)
color: function (params) { color: function (params) {
if (params.value >= 90) { if (params.value >= 90) {
return new echarts.graphic.LinearGradient( return new echarts.graphic.LinearGradient(
0, 0,
1, 1,
0, 0,
0, 0,
[ [
{ {
offset: 1, offset: 1,
color: '#339966' color: '#339966'
} }
], ],
false false
) )
} else if (params.value >= 60 && params.value <= 90) { } else if (params.value >= 60 && params.value <= 90) {
return new echarts.graphic.LinearGradient( return new echarts.graphic.LinearGradient(
0, 0,
1, 1,
0, 0,
0, 0,
[ [
{ {
offset: 1, offset: 1,
color: '#FFCC33' color: '#FFCC33'
} }
], ],
false false
) )
} else if (params.value <= 60 && params.value !== 3.14159) { } else if (params.value <= 60 && params.value !== 3.14159) {
return new echarts.graphic.LinearGradient( return new echarts.graphic.LinearGradient(
0, 0,
1, 1,
0, 0,
0, 0,
[ [
{ {
offset: 1, offset: 1,
color: '#A52a2a' color: '#A52a2a'
} }
], ],
false false
) )
} else if (params.value == 3.14159) { } else if (params.value == 3.14159) {
return new echarts.graphic.LinearGradient( return new echarts.graphic.LinearGradient(
0, 0,
1, 1,
0, 0,
0, 0,
[ [
{ {
offset: 1, offset: 1,
color: '#cccccc' color: '#cccccc'
} }
], ],
false false
) )
} }
} }
} }
} }
const tableStore = new TableStore({ const tableStore = new TableStore({
url: '/harmonic-boot/steadyQualify/getSteadyQualifyCensus', url: '/harmonic-boot/steadyQualify/getSteadyQualifyCensus',
showPage: false, showPage: false,
method: 'POST', method: 'POST',
// publicHeight: 10, // publicHeight: 10,
column: [], column: [],
beforeSearchFun: () => { beforeSearchFun: () => {
tableStore.table.params = tableStoreParams.value tableStore.table.params = tableStoreParams.value
}, },
loadCallback: () => { loadCallback: () => {
let code = tableStore.table.params.statisticalType.code let code = tableStore.table.params.statisticalType.code
let title = '', let title = '',
titleX = '' titleX = ''
if (code == 'Power_Network') { if (code == 'Power_Network') {
title = '区域' title = '区域'
titleX = '区域' titleX = '区域'
} else if (code == 'Manufacturer') { } else if (code == 'Manufacturer') {
title = '终端厂家' title = '终端厂家'
titleX = '终端\n厂家' titleX = '终端\n厂家'
} else if (code == 'Voltage_Level') { } else if (code == 'Voltage_Level') {
title = '电压等级' title = '电压等级'
titleX = '电压\n等级' titleX = '电压\n等级'
} else if (code == 'Load_Type') { } else if (code == 'Load_Type') {
title = '干扰源类型' title = '干扰源类型'
titleX = '干扰\n源类型' titleX = '干扰\n源类型'
} else if (code == 'Report_Type') { } else if (code == 'Report_Type') {
title = '上报类型' title = '上报类型'
titleX = '上报\n类型' titleX = '上报\n类型'
} }
options.value = { options.value = {
title: { title: {
text: title text: title
}, },
legend: { legend: {
show: false show: false
}, },
tooltip: { tooltip: {
formatter: function (params: any) { formatter: function (params: any) {
let tips = `<strong>${params[0]?.name}</strong></br>` // 标题加粗 let tips = `<strong>${params[0]?.name}</strong></br>` // 标题加粗
params.forEach((item: any) => { params.forEach((item: any) => {
const value = item.value === 3.14159 ? '暂无数据' : item.value // 处理特殊值 const value = item.value === 3.14159 ? '暂无数据' : item.value // 处理特殊值
tips += `<div style=" display: flex;justify-content: space-between;"> tips += `<div style=" display: flex;justify-content: space-between;">
<span>${item.marker} <span>${item.marker}
${item.seriesName}: ${item.seriesName}:
</span> ${value} </span> ${value}
</div>` // 统一格式 </div>` // 统一格式
}) })
return tips return tips
} }
}, },
xAxis: { xAxis: {
name: titleX, name: titleX,
data: tableStore.table.data.type data: tableStore.table.data.type
}, },
yAxis: { yAxis: {
name: '%', name: '%',
max: 100 max: 100
}, },
series: [ series: [
{ {
name: '频率偏差', name: '频率偏差',
type: 'bar', type: 'bar',
itemStyle: itemStyle, itemStyle: itemStyle,
data: tableStore.table.data.freqOffset, data: tableStore.table.data.freqOffset,
markLine: { markLine: {
silent: false, silent: false,
symbol: 'circle', symbol: 'circle',
data: [ data: [
{ {
name: '', name: '',
yAxis: 100, yAxis: 100,
lineStyle: { lineStyle: {
color: '#339966' color: '#339966'
}, },
label: { label: {
// position: "middle", // position: "middle",
formatter: '{b}', formatter: '{b}',
textStyle: { textStyle: {
color: '#339966' color: '#339966'
} }
} }
}, },
{ {
name: '', name: '',
yAxis: 90, yAxis: 90,
lineStyle: { lineStyle: {
color: '#FFCC33' color: '#FFCC33'
}, },
label: { label: {
// position: "middle", // position: "middle",
formatter: '{b}', formatter: '{b}',
textStyle: { textStyle: {
color: '#FFCC33' color: '#FFCC33'
} }
} }
}, },
{ {
name: '', name: '',
yAxis: 60, yAxis: 60,
lineStyle: { lineStyle: {
color: '#A52a2a' color: '#A52a2a'
}, },
label: { label: {
// position: "middle", // position: "middle",
formatter: '{b}', formatter: '{b}',
textStyle: { textStyle: {
color: '#A52a2a' color: '#A52a2a'
} }
} }
} }
] ]
} }
}, },
{ {
name: '闪变', name: '闪变',
type: 'bar', type: 'bar',
itemStyle: itemStyle, itemStyle: itemStyle,
data: tableStore.table.data.flicker data: tableStore.table.data.flicker
}, },
{ {
name: '三相电压不平衡', name: '三相电压不平衡',
type: 'bar', type: 'bar',
itemStyle: itemStyle, itemStyle: itemStyle,
data: tableStore.table.data.voltageUnbalance data: tableStore.table.data.voltageUnbalance
}, },
{ {
name: '谐波电压', name: '谐波电压',
type: 'bar', type: 'bar',
itemStyle: itemStyle, itemStyle: itemStyle,
data: tableStore.table.data.harmonicVoltage data: tableStore.table.data.harmonicVoltage
}, },
{ {
name: '电压偏差', name: '电压偏差',
type: 'bar', type: 'bar',
itemStyle: itemStyle, itemStyle: itemStyle,
data: tableStore.table.data.voltageOffset data: tableStore.table.data.voltageOffset
}, },
{ {
name: '谐波电流', name: '谐波电流',
type: 'bar', type: 'bar',
itemStyle: itemStyle, itemStyle: itemStyle,
data: tableStore.table.data.harmonicCurrent data: tableStore.table.data.harmonicCurrent
}, },
{ {
name: '负序电流', name: '负序电流',
type: 'bar', type: 'bar',
itemStyle: itemStyle, itemStyle: itemStyle,
data: tableStore.table.data.negativeCurrent data: tableStore.table.data.negativeCurrent
}, },
{ {
name: '间谐波电压含有率', name: '间谐波电压含有率',
type: 'bar', type: 'bar',
itemStyle: itemStyle, itemStyle: itemStyle,
data: tableStore.table.data.interHarmonic data: tableStore.table.data.interHarmonic
} }
] ]
} }
loading.value = false loading.value = false
} }
}) })
provide('tableStore', tableStore) provide('tableStore', tableStore)
onMounted(() => {}) onMounted(() => {})
defineExpose({ getTableStoreParams }) defineExpose({ getTableStoreParams })
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@@ -3,7 +3,7 @@
<div class="online_header"> <div class="online_header">
<TableHeader date-picker area ref="tableHeaderRef"> <TableHeader date-picker area ref="tableHeaderRef">
<template #select> <template #select>
<el-form-item label="统计类型:"> <el-form-item label="统计类型">
<el-select <el-select
v-model="tableStore.table.params.statisticalType" v-model="tableStore.table.params.statisticalType"
placeholder="请选择统计类型" placeholder="请选择统计类型"
@@ -19,7 +19,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="电压等级:"> <el-form-item label="电压等级">
<el-select <el-select
v-model="tableStore.table.params.scale" v-model="tableStore.table.params.scale"
multiple multiple
@@ -37,7 +37,7 @@
></el-option> ></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="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
multiple multiple
@@ -55,7 +55,7 @@
></el-option> ></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="tableStore.table.params.loadType" v-model="tableStore.table.params.loadType"
multiple multiple
@@ -83,6 +83,14 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="筛选数据">
<el-input
v-model.trim="tableStore.table.params.searchValue"
clearable
style="width: 200px"
placeholder="请输入关键字筛选"
/>
</el-form-item>
</template> </template>
</TableHeader> </TableHeader>
</div> </div>
@@ -113,6 +121,7 @@ import TableHeader from '@/components/table/header/index.vue'
import TableStore from '@/utils/tableStore' 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 { filterTree } from '@/utils/tree'
defineOptions({ defineOptions({
name: 'harmonic-boot/area/qualifiedRate' name: 'harmonic-boot/area/qualifiedRate'
}) })
@@ -272,7 +281,13 @@ const tableStore = new TableStore({
], ],
loadCallback: () => { loadCallback: () => {
tableStore.table.data = tree2List(tableStore.table.data, Math.random() * 1000) tableStore.table.data = tree2List(
filterTree(tableStore.table.data, node => {
// 筛选条件name 包含关键词
return node.name.includes(tableStore.table.params.searchValue)
}),
Math.random() * 1000
)
tableStore.table.column[0].title = tableStore.table.params.statisticalType.name tableStore.table.column[0].title = tableStore.table.params.statisticalType.name
chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params) chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params)
@@ -288,6 +303,7 @@ tableStore.table.params.manufacturer = []
tableStore.table.params.loadType = [] tableStore.table.params.loadType = []
tableStore.table.params.serverName = 'harmonicBoot' tableStore.table.params.serverName = 'harmonicBoot'
tableStore.table.params.powerFlag = sign[0]?.algoDescribe || 0 tableStore.table.params.powerFlag = sign[0]?.algoDescribe || 0
tableStore.table.params.searchValue = ''
provide('tableStore', tableStore) provide('tableStore', tableStore)
// const tree2List = (list: any, pid?: string) => { // const tree2List = (list: any, pid?: string) => {
// //存储结果的数组 // //存储结果的数组

View File

@@ -1,365 +1,379 @@
<template> <template>
<div class="default-main online"> <div class="default-main online">
<div class="online_header"> <div class="online_header">
<TableHeader date-picker area ref="tableHeaderRef"> <TableHeader date-picker area ref="tableHeaderRef">
<template #select> <template #select>
<el-form-item label="统计类型:"> <el-form-item label="统计类型">
<el-select <el-select
v-model="tableStore.table.params.statisticalType" v-model="tableStore.table.params.statisticalType"
placeholder="请选择统计类型" placeholder="请选择统计类型"
value-key="id" value-key="id"
style="width: 100%" style="width: 100%"
> >
<el-option <el-option
v-for="item in classificationData" v-for="item in classificationData"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></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="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
multiple multiple
collapse-tags collapse-tags
clearable clearable
placeholder="请选择终端厂家" placeholder="请选择终端厂家"
style="width: 100%" style="width: 100%"
value-key="id" value-key="id"
> >
<el-option <el-option
v-for="(item, index) in terminaloption" v-for="(item, index) in terminaloption"
:key="index" :key="index"
:label="item.name" :label="item.name"
:value="item" :value="item"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</template> <el-form-item label="筛选数据">
</TableHeader> <el-input
</div> v-model.trim="tableStore.table.params.searchValue"
<div class="online_main"> clearable
<el-tabs v-model="activeName" type="border-card" @tab-click="handleClick"> style="width: 200px"
<el-tab-pane :name="0" :lazy="true" label="终端状态统计表"> placeholder="请输入关键字筛选"
<div class="table_legend"> />
<ul> </el-form-item>
<li> </template>
<p style="background: #339966"> </TableHeader>
<svg </div>
t="1722910570852" <div class="online_main">
class="icon" <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
viewBox="0 0 1336 1024" <el-tab-pane :name="0" :lazy="true" label="终端状态统计表">
version="1.1" <div class="table_legend">
xmlns="http://www.w3.org/2000/svg" <ul>
p-id="6243" <li>
width="16" <p style="background: #339966">
height="16" <svg
> t="1722910570852"
<path class="icon"
d="M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024" viewBox="0 0 1336 1024"
fill="#ffffff" version="1.1"
p-id="6244" xmlns="http://www.w3.org/2000/svg"
></path> p-id="6243"
</svg> width="16"
</p> height="16"
<span style="color: #339966">投运状态</span> >
</li> <path
<li> d="M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024"
<p style="background: #ffcc33"> fill="#ffffff"
<svg p-id="6244"
t="1722910570852" ></path>
class="icon" </svg>
viewBox="0 0 1336 1024" </p>
version="1.1" <span style="color: #339966">投运状态</span>
xmlns="http://www.w3.org/2000/svg" </li>
p-id="6243" <li>
width="16" <p style="background: #ffcc33">
height="16" <svg
> t="1722910570852"
<path class="icon"
d="M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024" viewBox="0 0 1336 1024"
fill="#ffffff" version="1.1"
p-id="6244" xmlns="http://www.w3.org/2000/svg"
></path> p-id="6243"
</svg> width="16"
</p> height="16"
<span style="color: #ffcc33">检修状态</span> >
</li> <path
<li> d="M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024"
<p style="background: #A52a2a"> fill="#ffffff"
<svg p-id="6244"
t="1722910570852" ></path>
class="icon" </svg>
viewBox="0 0 1336 1024" </p>
version="1.1" <span style="color: #ffcc33">检修状态</span>
xmlns="http://www.w3.org/2000/svg" </li>
p-id="6243" <li>
width="16" <p style="background: #a52a2a">
height="16" <svg
> t="1722910570852"
<path class="icon"
d="M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024" viewBox="0 0 1336 1024"
fill="#ffffff" version="1.1"
p-id="6244" xmlns="http://www.w3.org/2000/svg"
></path> p-id="6243"
</svg> width="16"
</p> height="16"
<span style="color: #A52a2a">停运状态</span> >
</li> <path
</ul> d="M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024"
</div> fill="#ffffff"
<Table p-id="6244"
ref="tableRef" ></path>
:tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }" </svg>
:scroll-y="{ enabled: true }" </p>
v-if="activeName == 0" <span style="color: #a52a2a">停运状态</span>
/> </li>
</el-tab-pane> </ul>
<el-tab-pane :name="1" :lazy="true" label="终端状态统计图"> </div>
<charts v-if="activeName == 1" ref="chartsRef" /> <Table
</el-tab-pane> ref="tableRef"
</el-tabs> :tree-config="{ transform: true, parentField: 'uPid', rowField: 'uId' }"
</div> :scroll-y="{ enabled: true }"
</div> v-if="activeName == 0"
</template> />
<script lang="ts" setup> </el-tab-pane>
import { ref, onMounted, watch } from 'vue' <el-tab-pane :name="1" :lazy="true" label="终端状态统计图">
import { useDictData } from '@/stores/dictData' <charts v-if="activeName == 1" ref="chartsRef" />
import DatePicker from '@/components/form/datePicker/index.vue' </el-tab-pane>
import { getAreaDept } from '@/api/harmonic-boot/area' </el-tabs>
import TableHeader from '@/components/table/header/index.vue' </div>
import TableStore from '@/utils/tableStore' </div>
import Table from '@/components/table/index.vue' </template>
import charts from './components/charts.vue' <script lang="ts" setup>
defineOptions({ import { ref, onMounted, watch } from 'vue'
name: 'harmonic-boot/area/terminalonlinerate' import { useDictData } from '@/stores/dictData'
}) import DatePicker from '@/components/form/datePicker/index.vue'
const tableRef = ref() import { getAreaDept } from '@/api/harmonic-boot/area'
const chartsRef = ref() import TableHeader from '@/components/table/header/index.vue'
const dictData = useDictData() import TableStore from '@/utils/tableStore'
//字典获取电压等级 import Table from '@/components/table/index.vue'
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand') import charts from './components/charts.vue'
//字典获取终端厂家 import { filterTree } from '@/utils/tree'
const terminaloption = dictData.getBasicData('Dev_Manufacturers') defineOptions({
//字典获取干扰源类型 name: 'harmonic-boot/area/terminalonlinerate'
const interfereoption = dictData.getBasicData('Interference_Source') })
//字典获取统计类型 const tableRef = ref()
const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type', 'Voltage_Level', 'Load_Type']) const chartsRef = ref()
//调用区域接口获取区域 const dictData = useDictData()
const treeData = ref([]) //字典获取电压等级
const idArr = ref([]) const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const activeName = ref(0) //字典获取终端厂家
const getTreeData = async () => { const terminaloption = dictData.getBasicData('Dev_Manufacturers')
await getAreaDept().then(res => { //字典获取干扰源类型
var data = res.data const interfereoption = dictData.getBasicData('Interference_Source')
data.forEach(element => { //字典获取统计类型
idArr.value.push(element.id) const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type', 'Voltage_Level', 'Load_Type'])
}) //调用区域接口获取区域
treeData.value = JSON.parse(JSON.stringify(res.data)) const treeData = ref([])
}) const idArr = ref([])
} const activeName = ref(0)
getTreeData() const getTreeData = async () => {
await getAreaDept().then(res => {
const formData = ref({ var data = res.data
statisticalType: classificationData[0], //统计类型 data.forEach(element => {
deptIndex: treeData.value[0]?.id, //区域选择 idArr.value.push(element.id)
scale: voltageleveloption, //电压等级 })
manufacturer: terminaloption, //终端厂家 treeData.value = JSON.parse(JSON.stringify(res.data))
loadType: interfereoption //干扰源类型 })
// searchBeginTime: '', }
// searchEndTime: '' getTreeData()
})
formData.value.deptIndex = treeData.value[0]?.id const formData = ref({
const defaultProps = ref({ statisticalType: classificationData[0], //统计类型
label: 'name', deptIndex: treeData.value[0]?.id, //区域选择
value: 'id', scale: voltageleveloption, //电压等级
checkStrictly: true, manufacturer: terminaloption, //终端厂家
emitPath: false, loadType: interfereoption //干扰源类型
expandTrigger: 'click' as const // searchBeginTime: '',
}) // searchEndTime: ''
const handleClick = (tab: any, e: any) => { })
// if(activeName.value===1){ formData.value.deptIndex = treeData.value[0]?.id
tableStore.index() const defaultProps = ref({
// } label: 'name',
} value: 'id',
checkStrictly: true,
// const datePickerRef = ref() emitPath: false,
const tableHeaderRef = ref() expandTrigger: 'click' as const
const tableStore = new TableStore({ })
publicHeight: 100, const handleClick = (tab: any, e: any) => {
showPage: false, // if(activeName.value===1){
url: '/harmonic-boot/terminal/getTerminalData', tableStore.index()
method: 'POST', // }
}
column: [
{ // const datePickerRef = ref()
title: formData.value.statisticalType.name, const tableHeaderRef = ref()
field: 'name', const tableStore = new TableStore({
align: 'left', publicHeight: 100,
width: 350, showPage: false,
treeNode: true url: '/harmonic-boot/terminal/getTerminalData',
}, method: 'POST',
{
title: '终端个数(台)', column: [
field: 'number', {
align: 'center', title: formData.value.statisticalType.name,
formatter: function (row) { field: 'name',
return row.cellValue != 0 ? row.cellValue : '/' align: 'left',
} width: 350,
}, treeNode: true
{ },
title: '投运(台)', {
field: 'runFlag', title: '终端个数(台)',
type: 'html', field: 'number',
align: 'center', align: 'center',
formatter: function (row) { formatter: function (row) {
return row.cellValue == 0 return row.cellValue != 0 ? row.cellValue : '/'
? '/' }
: row.cellValue !== 0 && row.row.level !== 4 },
? row.cellValue {
: row.cellValue !== 0 && row.row.level == 4 && row.row.reaFlag == 0 && row.row.stopFlag == 0 title: '投运(台)',
? "<p class='table_icon' style='width: 18px;height: 18px;margin: 0 auto;display: flex;align-items: center;justify-content: center;border-radius: 50%;background: #339966'><svg t='1722910570852' class='icon' viewBox='0 0 1336 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='6243' width='16' height='16'><path d='M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024' fill='#ffffff' p-id='6244'></path></svg> </p>" field: 'runFlag',
: '/' type: 'html',
} align: 'center',
}, formatter: function (row) {
{ return row.cellValue == 0
title: '检修(台)', ? '/'
field: 'reaFlag', : row.cellValue !== 0 && row.row.level !== 4
type: 'html', ? row.cellValue
align: 'center', : row.cellValue !== 0 && row.row.level == 4 && row.row.reaFlag == 0 && row.row.stopFlag == 0
formatter: function (row) { ? "<p class='table_icon' style='width: 18px;height: 18px;margin: 0 auto;display: flex;align-items: center;justify-content: center;border-radius: 50%;background: #339966'><svg t='1722910570852' class='icon' viewBox='0 0 1336 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='6243' width='16' height='16'><path d='M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024' fill='#ffffff' p-id='6244'></path></svg> </p>"
return row.cellValue == 0 : '/'
? '/' }
: row.cellValue !== 0 && row.row.level !== 4 },
? row.cellValue {
: row.cellValue !== 0 && row.row.level == 4 && row.row.runFlag == 0 && row.row.stopFlag == 0 title: '检修(台)',
? "<p class='table_icon' style='width: 18px;height: 18px;margin: 0 auto;display: flex;align-items: center;justify-content: center;border-radius: 50%;background: #ffcc33'><svg t='1722910570852' class='icon' viewBox='0 0 1336 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='6243' width='16' height='16'><path d='M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024' fill='#ffffff' p-id='6244'></path></svg> </p>" field: 'reaFlag',
: '/' type: 'html',
} align: 'center',
}, formatter: function (row) {
{ return row.cellValue == 0
title: '停运(台)', ? '/'
field: 'stopFlag', : row.cellValue !== 0 && row.row.level !== 4
type: 'html', ? row.cellValue
align: 'center', : row.cellValue !== 0 && row.row.level == 4 && row.row.runFlag == 0 && row.row.stopFlag == 0
formatter: function (row) { ? "<p class='table_icon' style='width: 18px;height: 18px;margin: 0 auto;display: flex;align-items: center;justify-content: center;border-radius: 50%;background: #ffcc33'><svg t='1722910570852' class='icon' viewBox='0 0 1336 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='6243' width='16' height='16'><path d='M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024' fill='#ffffff' p-id='6244'></path></svg> </p>"
return row.cellValue == 0 : '/'
? '/' }
: row.cellValue !== 0 && row.row.level !== 4 },
? row.cellValue {
: row.cellValue !== 0 && row.row.level == 4 && row.row.runFlag == 0 && row.row.reaFlag == 0 title: '停运(台)',
? "<p class='table_icon' style='width: 18px;height: 18px;margin: 0 auto;display: flex;align-items: center;justify-content: center;border-radius: 50%;background: #A52a2a'><svg t='1722910570852' class='icon' viewBox='0 0 1336 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='6243' width='16' height='16'><path d='M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024' fill='#ffffff' p-id='6244'></path></svg> </p>" field: 'stopFlag',
: '/' type: 'html',
} align: 'center',
}, formatter: function (row) {
{ return row.cellValue == 0
title: '在线率(%)', ? '/'
field: 'onlineRateData', : row.cellValue !== 0 && row.row.level !== 4
align: 'center', ? row.cellValue
formatter: function (row) { : row.cellValue !== 0 && row.row.level == 4 && row.row.runFlag == 0 && row.row.reaFlag == 0
return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue.toFixed(2) ? "<p class='table_icon' style='width: 18px;height: 18px;margin: 0 auto;display: flex;align-items: center;justify-content: center;border-radius: 50%;background: #A52a2a'><svg t='1722910570852' class='icon' viewBox='0 0 1336 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='6243' width='16' height='16'><path d='M49.588224 883.816448M1139.531776 883.816448M86.939648 862.977024M538.459136 960.381952c109.876224-153.544704 223.55968-289.842176 308.03968-385.787904 49.87392-56.639488 96.715776-108.155904 141.549568-154.500096 40.576-41.945088 80.805888-80.405504 119.478272-116.59264 65.92-61.693952 142.984192-130.034688 191.446016-159.30368l-61.891584-82.050048c-89.732096 56.139776-176.10752 116.103168-242.799616 162.18112-38.863872 26.855424-74.928128 52.667392-108.915712 77.252608-33.668096 24.356864-68.429824 51.106816-105.081856 79.166464-63.633408 48.712704-145.388544 114.194432-224.555008 181.860352L357.07904 374.989824 123.885568 558.770176 538.459136 960.381952zM1335.92064 862.977024' fill='#ffffff' p-id='6244'></path></svg> </p>"
} : '/'
} }
], },
// beforeSearchFun: () => { {
// tableStore.table.params.deptIndex = formData.value.deptIndex title: '在线率(%)',
// tableStore.table.params.statisticalType = formData.value.statisticalType field: 'onlineRateData',
// tableStore.table.params.scale = formData.value.scale align: 'center',
// tableStore.table.params.manufacturer = formData.value.manufacturer formatter: function (row) {
// tableStore.table.params.loadType = formData.value.loadType return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue.toFixed(2)
// tableStore.table.params.serverName = 'harmonicBoot' }
// // delete tableStore.table.params.timeFlag }
// // delete tableStore.table.params.startTime ],
// // delete tableStore.table.params.endTime // beforeSearchFun: () => {
// // delete tableStore.table.params.pageNum // tableStore.table.params.deptIndex = formData.value.deptIndex
// // delete tableStore.table.params.pageSize // tableStore.table.params.statisticalType = formData.value.statisticalType
// // tableStore.table.params.searchBeginTime = tableHeaderRef.value.datePickerRef.timeValue[0] // tableStore.table.params.scale = formData.value.scale
// // tableStore.table.params.searchEndTime = tableHeaderRef.value.datePickerRef.timeValue[1] // tableStore.table.params.manufacturer = formData.value.manufacturer
// }, // tableStore.table.params.loadType = formData.value.loadType
loadCallback: () => { // tableStore.table.params.serverName = 'harmonicBoot'
tableStore.table.data = tree2List(tableStore.table.data, Math.random() * 1000) // // delete tableStore.table.params.timeFlag
tableStore.table.column[0].title = formData.value.statisticalType.name // // delete tableStore.table.params.startTime
// // delete tableStore.table.params.endTime
chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params) // // delete tableStore.table.params.pageNum
setTimeout(() => { // // delete tableStore.table.params.pageSize
activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true) // // tableStore.table.params.searchBeginTime = tableHeaderRef.value.datePickerRef.timeValue[0]
}, 0) // // tableStore.table.params.searchEndTime = tableHeaderRef.value.datePickerRef.timeValue[1]
} // },
}) loadCallback: () => {
tableStore.table.params.deptIndex = treeData.value[0]?.id tableStore.table.data = tree2List(
tableStore.table.params.statisticalType = classificationData[0] filterTree(tableStore.table.data, node => {
tableStore.table.params.scale = voltageleveloption return node.name.includes(tableStore.table.params.searchValue)
tableStore.table.params.manufacturer = terminaloption }),
tableStore.table.params.loadType = interfereoption Math.random() * 1000
tableStore.table.params.serverName = 'harmonicBoot' )
tableStore.table.column[0].title = formData.value.statisticalType.name
provide('tableStore', tableStore) chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params)
const tree2List = (list: any, id?: string) => { setTimeout(() => {
//存储结果的数组 activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true)
let arr: any = [] }, 0)
// 遍历 tree 数组 }
list.forEach((item: any) => { })
item.uPid = id tableStore.table.params.deptIndex = treeData.value[0]?.id
item.uId = Math.random() * 1000 tableStore.table.params.statisticalType = classificationData[0]
item.valueOver == 3.14159 ? 0 : item.valueOver >= 90 ? 1 : item.valueOver && item.valueOver < 90 ? 2 : 3 tableStore.table.params.scale = voltageleveloption
// 判断item是否存在children tableStore.table.params.manufacturer = terminaloption
if (!item.children) return arr.push(item) tableStore.table.params.loadType = interfereoption
// 函数递归对children数组进行tree2List的转换 tableStore.table.params.serverName = 'harmonicBoot'
const children = tree2List(item.children, item.uId) tableStore.table.params.searchValue = ''
// 删除item的children属性
delete item.children provide('tableStore', tableStore)
// 把item和children数组添加至结果数组 const tree2List = (list: any, id?: string) => {
//..children: 意思是把children数组展开 //存储结果的数组
arr.push(item, ...children) let arr: any = []
}) // 遍历 tree 数组
// 返回结果数组 list.forEach((item: any) => {
return arr item.uPid = id
} item.uId = Math.random() * 1000
item.valueOver == 3.14159 ? 0 : item.valueOver >= 90 ? 1 : item.valueOver && item.valueOver < 90 ? 2 : 3
onMounted(() => {}) // 判断item是否存在children
if (!item.children) return arr.push(item)
watch( // 函数递归对children数组进行tree2List的转换
() => treeData.value, const children = tree2List(item.children, item.uId)
(val, oldVal) => { // 删除item的children属性
if (val && val.length != 0) { delete item.children
formData.value.deptIndex = val[0].id // 把item和children数组添加至结果数组
tableStore.index() //..children: 意思是把children数组展开
} arr.push(item, ...children)
}, })
{ // 返回结果数组
immediate: true, return arr
deep: true }
}
) onMounted(() => {})
</script>
<style lang="scss" scoped> watch(
.table_legend { () => treeData.value,
width: 100%; (val, oldVal) => {
height: 40px; if (val && val.length != 0) {
display: flex; formData.value.deptIndex = val[0].id
align-items: center; tableStore.index()
justify-content: flex-end; }
align-items: center; },
ul { {
width: 280px; immediate: true,
height: 30px; deep: true
display: flex; }
justify-content: space-between; )
li { </script>
flex: 1; <style lang="scss" scoped>
list-style-type: none; .table_legend {
display: flex; width: 100%;
align-items: center; height: 40px;
justify-content: space-around; display: flex;
p { align-items: center;
width: 18px; justify-content: flex-end;
height: 18px; align-items: center;
border-radius: 50%; ul {
} width: 280px;
} height: 30px;
} display: flex;
} justify-content: space-between;
</style> li {
flex: 1;
list-style-type: none;
display: flex;
align-items: center;
justify-content: space-around;
p {
width: 18px;
height: 18px;
border-radius: 50%;
}
}
}
}
</style>

View File

@@ -9,21 +9,21 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item label="电压等级:"> <el-form-item label="电压等级">
<el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable <el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable
placeholder="请选择电压等级" value-key="id"> placeholder="请选择电压等级" value-key="id">
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="item">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家">
<el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags <el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags
clearable placeholder="请选择终端厂家" value-key="id"> clearable placeholder="请选择终端厂家" value-key="id">
<el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="item">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="干扰源类型:"> <el-form-item label="干扰源类型">
<el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable <el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable
placeholder="请选择干扰源类型" value-key="id"> placeholder="请选择干扰源类型" value-key="id">
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="item">

View File

@@ -7,7 +7,7 @@
</div> </div>
<TableHeader :showReset="false" ref="TableHeaderRef"> <TableHeader :showReset="false" ref="TableHeaderRef">
<template #select> <template #select>
<el-form-item label="关键字"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" maxlength="32" show-word-limit/> <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" maxlength="32" show-word-limit/>
</el-form-item> </el-form-item>
</template> </template>

View File

@@ -2,7 +2,7 @@
<el-dialog v-model="dialogVisible" draggable title="完整性不足详情" width="1000"> <el-dialog v-model="dialogVisible" draggable title="完整性不足详情" width="1000">
<TableHeader :showReset="false" ref="TableHeaderRef"> <TableHeader :showReset="false" ref="TableHeaderRef">
<template #select> <template #select>
<el-form-item label="关键字"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" /> <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" />
</el-form-item> </el-form-item>
</template> </template>

View File

@@ -3,7 +3,7 @@
<!-- 模版 --> <!-- 模版 -->
<TableHeader datePicker showExport :showReset="false" ref="TableHeaderRef"> <TableHeader datePicker showExport :showReset="false" ref="TableHeaderRef">
<template #select> <template #select>
<!-- <el-form-item label="关键字"> <!-- <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" /> <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" />
</el-form-item> --> </el-form-item> -->
</template> </template>

View File

@@ -9,26 +9,31 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item label="电压等级:"> <el-form-item label="电压等级">
<el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable <el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable
placeholder="请选择电压等级" value-key="id"> placeholder="请选择电压等级" value-key="id">
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="item">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家">
<el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags <el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags
clearable placeholder="请选择终端厂家" value-key="id"> clearable placeholder="请选择终端厂家" value-key="id">
<el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="item">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="干扰源类型:"> <el-form-item label="干扰源类型">
<el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable <el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable
placeholder="请选择干扰源类型" value-key="id"> placeholder="请选择干扰源类型" value-key="id">
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="item">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item>
<el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable style="width: 240px;"
placeholder="请输入变电站、监测点、监测对象" />
</el-form-item> </el-form-item>
</template> </template>
@@ -68,14 +73,14 @@ const tableStore = new TableStore({
{ field: 'lineScale', title: '电压等级', minWidth: "120px", }, { field: 'lineScale', title: '电压等级', minWidth: "120px", },
{ field: 'lineName', title: '监测点名称', minWidth: "150px", }, { field: 'lineName', title: '监测点名称', minWidth: "150px", },
{ field: 'loadType', title: '干扰源类型', minWidth: "150px", }, { field: 'loadType', title: '干扰源类型', minWidth: "150px", },
{ field: 'lineObjectName', title: '监测点对象名称', minWidth: "150px", formatter: (row: any) => { return row.cellValue == null ? '/' : row.cellValue } }, { field: 'lineObjectName', title: '监测点对象名称', minWidth: "180px", formatter: (row: any) => { return row.cellValue == null ? '/' : row.cellValue } },
{ field: 'overDay', title: '超标天数', minWidth: "80px", }, { field: 'overDay', title: '超标天数', minWidth: "80px", },
{ field: 'freqOverDay', title: '频率偏差超标天数', minWidth: "100px", }, { field: 'freqOverDay', title: '频率偏差', minWidth: "100px", },
{ field: 'volDevOverDay', title: '电压偏差超标天数', minWidth: "100px", }, { field: 'volDevOverDay', title: '电压偏差', minWidth: "100px", },
{ field: 'volDisOverDay', title: '电压总畸变率超标天数', minWidth: "100px", }, { field: 'volDisOverDay', title: '电压总畸变率', minWidth: "100px", },
{ field: 'volContainOverDay', title: '谐波电压含有率超标天数', minWidth: "110px", }, { field: 'volContainOverDay', title: '谐波电压含有率', minWidth: "100px", },
{ field: 'harmVolOverDay', title: '谐波电压超标天数', minWidth: "100px", }, { field: 'harmVolOverDay', title: '谐波电压', minWidth: "100px", },
{ field: 'harmCurOverDay', title: '谐波电流超标天数', minWidth: "100px", }, { field: 'harmCurOverDay', title: '谐波电流', minWidth: "100px", },
{ {
title: '各次谐波电压含有率超标天数', title: '各次谐波电压含有率超标天数',
children: [ children: [
@@ -104,10 +109,11 @@ const tableStore = new TableStore({
], ],
}, },
{ field: 'threeUnbalance', title: '三相电压不平衡度超标天数', minWidth: "110px", }, { field: 'intHarmOverDay', title: '间谐波电压含有率', minWidth: "100px", },
{ field: 'negativeOverDay', title: '负序电流超标天数', minWidth: "100px", }, { field: 'threeUnbalance', title: '三相电压不平衡度', minWidth: "100px", },
{ field: 'flickerOverDay', title: '闪变超标天数', minWidth: "100px", }, { field: 'negativeOverDay', title: '负序电流', minWidth: "100px", },
{ field: 'monitorNumber', title: '监测点编号', minWidth: "180px", formatter: (row: any) => { return row.cellValue == null ? '/' : row.cellValue } }, { field: 'flickerOverDay', title: '闪变', minWidth: "100px", },
{ field: 'monitorNumber', title: '监测点编号', minWidth: "100px", formatter: (row: any) => { return row.cellValue == null ? '/' : row.cellValue } },
@@ -125,6 +131,7 @@ tableStore.table.params.monitorFlag = 2
tableStore.table.params.scale = [] tableStore.table.params.scale = []
tableStore.table.params.manufacturer = [] tableStore.table.params.manufacturer = []
tableStore.table.params.loadType = [] tableStore.table.params.loadType = []
tableStore.table.params.searchValue = ''
const wp = ref({}) const wp = ref({})
provide('tableStore', tableStore) provide('tableStore', tableStore)

View File

@@ -2,7 +2,7 @@
<div class="default-main"> <div class="default-main">
<TableHeader datePicker area showExport> <TableHeader datePicker area showExport>
<template #select> <template #select>
<el-form-item label="统计类型:"> <el-form-item label="统计类型">
<el-select <el-select
v-model="tableStore.table.params.statisticalType" v-model="tableStore.table.params.statisticalType"
placeholder="请选择统计类型" placeholder="请选择统计类型"
@@ -16,7 +16,7 @@
></el-option> ></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="tableStore.table.params.scale" v-model="tableStore.table.params.scale"
filterable filterable
@@ -34,7 +34,7 @@
></el-option> ></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="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
filterable filterable
@@ -52,7 +52,7 @@
></el-option> ></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="tableStore.table.params.loadType" v-model="tableStore.table.params.loadType"
filterable filterable

View File

@@ -13,7 +13,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="筛选数据"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入监测点名称" /> <el-input v-model="tableStore.table.params.searchValue" clearable style="width: 240px;" placeholder="请输入变电站、监测点、监测对象" />
</el-form-item> </el-form-item>
</template> </template>
@@ -162,14 +162,15 @@
<vxe-column field="company" title="供电公司" minWidth="110px"></vxe-column> <vxe-column field="company" title="供电公司" minWidth="110px"></vxe-column>
<vxe-column field="subStation" title="变电站" minWidth="110px"></vxe-column> <vxe-column field="subStation" title="变电站" minWidth="110px"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家" minWidth="110px"></vxe-column> <vxe-column field="manufacturer" title="终端厂家" minWidth="110px"></vxe-column>
<vxe-column field="deviceName" title="终端名称" minWidth="110px"></vxe-column> <vxe-column field="deviceName" title="终端名称" minWidth="130px"></vxe-column>
<vxe-column field="ip" title="终端IP" :formatter="formatter" width="120px"></vxe-column> <vxe-column field="ip" title="终端IP" :formatter="formatter" width="120px"></vxe-column>
<vxe-column <vxe-column
field="lineName" field="lineName"
title="监测点名称" title="监测点名称"
:formatter="formatter" :formatter="formatter"
minWidth="110px" minWidth="130px"
></vxe-column> ></vxe-column>
<vxe-column v-if="VITE_FLAG" field="objName" title="监测对象" minWidth="130px"></vxe-column>
<vxe-column field="runFlag" title="运行状态" width="90px"> <vxe-column field="runFlag" title="运行状态" width="90px">
<template #default="{ row }"> <template #default="{ row }">
<el-tag <el-tag
@@ -222,6 +223,7 @@ defineOptions({
name: 'harmonic-boot/harmonic/getIntegrityData' name: 'harmonic-boot/harmonic/getIntegrityData'
}) })
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const VITE_FLAG = import.meta.env.VITE_NAME != 'jibei'
const route = useRoute() const route = useRoute()
const dictData = useDictData() const dictData = useDictData()
//字典获取监督对象类型 //字典获取监督对象类型

View File

@@ -160,8 +160,9 @@
<vxe-column field="company" title="供电公司" minWidth="110px"></vxe-column> <vxe-column field="company" title="供电公司" minWidth="110px"></vxe-column>
<vxe-column field="subStation" title="变电站" minWidth="110px"></vxe-column> <vxe-column field="subStation" title="变电站" minWidth="110px"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家" minWidth="110px"></vxe-column> <vxe-column field="manufacturer" title="终端厂家" minWidth="110px"></vxe-column>
<vxe-column field="deviceName" title="终端名称" minWidth="110px"></vxe-column> <vxe-column field="deviceName" title="终端名称" minWidth="130px"></vxe-column>
<vxe-column field="ip" title="终端IP" :formatter="formatter" width="120px"></vxe-column> <vxe-column field="ip" title="终端IP" :formatter="formatter" width="120px"></vxe-column>
<vxe-column field="runFlag" title="运行状态" width="90px"> <vxe-column field="runFlag" title="运行状态" width="90px">
<template #default="{ row }"> <template #default="{ row }">
<el-tag <el-tag
@@ -214,6 +215,7 @@ defineOptions({
name: 'harmonic-boot/harmonic/getIntegrityData' name: 'harmonic-boot/harmonic/getIntegrityData'
}) })
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const VITE_FLAG = import.meta.env.VITE_NAME != 'jibei'
const route = useRoute() const route = useRoute()
const dictData = useDictData() const dictData = useDictData()
//字典获取监督对象类型 //字典获取监督对象类型

View File

@@ -744,16 +744,6 @@ const initEcharts = (color: string, key: number, name: string) => {
} }
//渲染echarts //渲染echarts
const init = () => { const init = () => {
loading.value = true
const url = localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/'
echartsDataV1.value = initEcharts('#DAA520', 0, 'A相')
echartsDataV2.value = initEcharts('#2E8B57', 0, 'B相')
echartsDataV3.value = initEcharts('#A52a2a', 0, 'C相')
echartsDataA1.value = initEcharts('#DAA520', 1, 'A相')
echartsDataA2.value = initEcharts('#2E8B57', 1, 'B相')
echartsDataA3.value = initEcharts('#A52a2a', 1, 'C相')
if (!dataSocket.socketServe) { if (!dataSocket.socketServe) {
console.error('WebSocket 客户端实例不存在') console.error('WebSocket 客户端实例不存在')
return return
@@ -765,9 +755,22 @@ const init = () => {
type: 'warning' type: 'warning'
}) })
} }
loading.value = true
const url = localStorage.getItem('WebSocketUrl') || 'null' //'ws://192.168.1.68:10407/api/pushMessage/'
echartsDataV1.value = initEcharts('#DAA520', 0, 'A相')
echartsDataV2.value = initEcharts('#2E8B57', 0, 'B相')
echartsDataV3.value = initEcharts('#A52a2a', 0, 'C相')
echartsDataA1.value = initEcharts('#DAA520', 1, 'A相')
echartsDataA2.value = initEcharts('#2E8B57', 1, 'B相')
echartsDataA3.value = initEcharts('#A52a2a', 1, 'C相')
let pids = monitoringPoint.state.pid.split(',') let pids = monitoringPoint.state.pid.split(',')
dataSocket.socketServe.connect(`${url}${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) => {
if (res.Flag === false) {
return (loading.value = false)
}
txtContent.value = res.value txtContent.value = res.value
let data = JSON.parse(res.value) let data = JSON.parse(res.value)
time.value = data.TIME - 0 time.value = data.TIME - 0
@@ -779,12 +782,12 @@ const init = () => {
iRmsA: data.I.A?.IRMS, //A相电流 iRmsA: data.I.A?.IRMS, //A相电流
iRmsB: data.I.B?.IRMS, //B相电流 iRmsB: data.I.B?.IRMS, //B相电流
iRmsC: data.I.C?.IRMS, //C相电流 iRmsC: data.I.C?.IRMS, //C相电流
v1AngA: data.V.A?.VFUND_ANGLE, //A相基波电压相位 v1AngA: steAngle(data.V.A?.VFUND_ANGLE), //A相基波电压相位
v1AngB: data.V.B?.VFUND_ANGLE, //B相基波电压相位 v1AngB: steAngle(data.V.B?.VFUND_ANGLE), //B相基波电压相位
v1AngC: data.V.C?.VFUND_ANGLE, //C相基波电压相位 v1AngC: steAngle(data.V.C?.VFUND_ANGLE), //C相基波电压相位
i1AngA: data.I.A?.I_ANGLE, //A相基波电流相位 i1AngA: steAngle(data.I.A?.I_ANGLE), //A相基波电流相位
i1AngB: data.I.B?.I_ANGLE, //B相基波电流相位 i1AngB: steAngle(data.I.B?.I_ANGLE), //B相基波电流相位
i1AngC: data.I.C?.I_ANGLE, //C相基波电流相位 i1AngC: steAngle(data.I.C?.I_ANGLE), //C相基波电流相位
freq: data.V.T?.FREQ, //频率 freq: data.V.T?.FREQ, //频率
freqDev: data.V.T?.DELTA_FREQ, //频率偏差 freqDev: data.V.T?.DELTA_FREQ, //频率偏差
vUnbalance: data.V.T?.V_UNBAN, //电压不平衡度 vUnbalance: data.V.T?.V_UNBAN, //电压不平衡度
@@ -950,6 +953,20 @@ const setRealData = () => {
] ]
pieChart6.value.initChart() pieChart6.value.initChart()
} }
const steAngle = (phase: any) => {
// 空值判断
if (phase === null || phase === undefined) {
return null
}
let normalizedPhase = phase % 360
if (normalizedPhase > 180) {
normalizedPhase -= 360
} else if (normalizedPhase < -180) {
normalizedPhase += 360
}
return normalizedPhase
}
defineExpose({ setRealData }) defineExpose({ setRealData })
onMounted(() => { onMounted(() => {
init() init()

View File

@@ -9,7 +9,7 @@
clearable clearable
maxlength="32" maxlength="32"
show-word-limit show-word-limit
placeholder="筛选数据" placeholder="请输入关键字"
/> />
</el-form-item> </el-form-item>
</template> </template>

View File

@@ -3,101 +3,47 @@
<TableHeader area ref="TableHeaderRef" showExport> <TableHeader area ref="TableHeaderRef" showExport>
<template #select> <template #select>
<el-form-item label="运行状态"> <el-form-item label="运行状态">
<el-select <el-select filterable multiple collapse-tags v-model="tableStore.table.params.runFlag" clearable
filterable placeholder="请选择运行状态">
multiple <el-option v-for="item in runFlagList" :key="item.id" :label="item.name"
collapse-tags :value="item.id"></el-option>
v-model="tableStore.table.params.runFlag" clearable placeholder="请选择运行状态">
<el-option
v-for="item in runFlagList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据筛选">
<el-input
style="width: 240px"
placeholder="电站名称,终端编号,监测点名称、电压等级、终端厂家、干扰源类型"
v-model="tableStore.table.params.searchValue"
clearable
maxlength="32"
show-word-limit
></el-input>
</el-form-item>
<el-form-item label="通讯状态:">
<el-select
v-model="tableStore.table.params.comFlag"
filterable
multiple
collapse-tags
clearable
placeholder="请选择通讯状态"
>
<el-option
v-for="item in communicationstatus"
:key="item.value"
:label="item.label"
:value="item.value"
></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="tableStore.table.params.comFlag" filterable multiple collapse-tags clearable
v-model="tableStore.table.params.scale" placeholder="请选择通讯状态">
filterable <el-option v-for="item in communicationstatus" :key="item.value" :label="item.label"
multiple :value="item.value"></el-option>
collapse-tags
clearable
placeholder="请选择电压等级"
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-select <el-form-item label="电压等级">
v-model="tableStore.table.params.manufacturer" <el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable
filterable placeholder="请选择电压等级" 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="请选择终端厂家"
value-key="id"
>
<el-option
v-for="item in terminaloption"
: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="tableStore.table.params.manufacturer" filterable multiple collapse-tags
v-model="tableStore.table.params.loadType" clearable placeholder="请选择终端厂家" value-key="id">
filterable <el-option v-for="item in terminaloption" :key="item.id" :label="item.name"
multiple :value="item"></el-option>
collapse-tags
clearable
placeholder="请选择干扰源类型"
value-key="id"
>
<el-option
v-for="item in interfereoption"
: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-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable
placeholder="请选择干扰源类型" value-key="id">
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name"
:value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据筛选">
<el-input style="width: 240px" placeholder="电站名称,终端编号,监测点名称、电压等级、终端厂家、干扰源类型"
v-model="tableStore.table.params.searchValue" clearable maxlength="32"
show-word-limit></el-input>
</el-form-item>
</template> </template>
<template #operation> <template #operation>

View File

@@ -3,7 +3,7 @@
<TableHeader area> <TableHeader area>
<template #select> <template #select>
<el-form-item label="监测点性质:"> <el-form-item label="监测点性质">
<el-select v-model="tableStore.table.params.powerFlag" filterable collapse-tags <el-select v-model="tableStore.table.params.powerFlag" filterable collapse-tags
placeholder="请选择监测点性质"> placeholder="请选择监测点性质">
<el-option v-for="item in terminalstatus" :key="item.value" :label="item.label" <el-option v-for="item in terminalstatus" :key="item.value" :label="item.label"
@@ -11,7 +11,7 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="电压等级:"> <el-form-item label="电压等级">
<el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable <el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable
placeholder="请选择电压等级" value-key="id"> placeholder="请选择电压等级" value-key="id">
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="item">
@@ -19,14 +19,14 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家">
<el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags <el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags
clearable placeholder="请选择终端厂家" value-key="id"> clearable placeholder="请选择终端厂家" value-key="id">
<el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="item">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="干扰源类型:"> <el-form-item label="干扰源类型">
<el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable <el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable
placeholder="请选择干扰源类型" value-key="id"> placeholder="请选择干扰源类型" value-key="id">
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="item">
@@ -37,7 +37,7 @@
<el-form-item label="上报类型:"> <el-form-item label="上报类型">
<el-select v-model="tableStore.table.params.monitorFlag" <el-select v-model="tableStore.table.params.monitorFlag"
placeholder="请选择上报类型"> placeholder="请选择上报类型">
<el-option v-for="item in communicationstatus" :key="item.value" :label="item.label" <el-option v-for="item in communicationstatus" :key="item.value" :label="item.label"

View File

@@ -10,7 +10,7 @@
</el-form-item> --> </el-form-item> -->
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家">
<el-select <el-select
v-model="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
filterable filterable
@@ -29,10 +29,14 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="数据筛选"> <el-form-item label="数据筛选">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="输入市公司、变电站、用户" /> <el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="输入市公司、变电站、用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="通讯状态:"> <el-form-item label="通讯状态">
<el-select <el-select
v-model="tableStore.table.params.comF" v-model="tableStore.table.params.comF"
filterable filterable
@@ -49,7 +53,7 @@
></el-option> ></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="tableStore.table.params.runF" v-model="tableStore.table.params.runF"
filterable filterable
@@ -66,7 +70,7 @@
></el-option> ></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="tableStore.table.params.loadType" v-model="tableStore.table.params.loadType"
filterable filterable
@@ -84,7 +88,7 @@
></el-option> ></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="tableStore.table.params.scale" v-model="tableStore.table.params.scale"
filterable filterable
@@ -102,8 +106,6 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</template> </template>
</TableHeader> </TableHeader>
<Table ref="tableRef" /> <Table ref="tableRef" />
@@ -115,6 +117,10 @@ import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue' import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
defineOptions({
name: 'harmonic-boot/run/terminalmessage'
})
const dictData = useDictData() const dictData = useDictData()
const view = ref(true) const view = ref(true)
@@ -159,7 +165,7 @@ const tableStore = new TableStore({
{ field: 'manufacturer', title: '厂家', minWidth: 100 }, { field: 'manufacturer', title: '厂家', minWidth: 100 },
{ field: 'devName', title: '终端名称', minWidth: 100 }, { field: 'devName', title: '终端名称', minWidth: 100 },
{ field: 'ip', title: '网络参数' ,width:110 }, { field: 'ip', title: '网络参数', width: 110 },
{ field: 'loginTime', title: '投运时间', minWidth: 90 }, { field: 'loginTime', title: '投运时间', minWidth: 90 },
{ field: 'devType', title: '终端型号', minWidth: 100 }, { field: 'devType', title: '终端型号', minWidth: 100 },
{ field: 'port', title: '端口', minWidth: 60 }, { field: 'port', title: '端口', minWidth: 60 },
@@ -186,8 +192,7 @@ const tableStore = new TableStore({
正常: 'success', 正常: 'success',
中断: 'danger' 中断: 'danger'
} }
}, }
], ],
beforeSearchFun: () => { beforeSearchFun: () => {
@@ -199,11 +204,11 @@ const tableStore = new TableStore({
tableStore.table.params.runFlag = [] tableStore.table.params.runFlag = []
if (tableStore.table.params.runF != null && tableStore.table.params.runF != '') { if (tableStore.table.params.runF != null && tableStore.table.params.runF != '') {
tableStore.table.params.runFlag = [tableStore.table.params.runF] tableStore.table.params.runFlag = tableStore.table.params.runF
} }
tableStore.table.params.comFlag = [] tableStore.table.params.comFlag = []
if (tableStore.table.params.comF != null&&tableStore.table.params.comF != '') { if (tableStore.table.params.comF != null && tableStore.table.params.comF != '') {
tableStore.table.params.comFlag = [tableStore.table.params.comF] tableStore.table.params.comFlag = tableStore.table.params.comF
} }
} }
}) })
@@ -220,7 +225,6 @@ tableStore.table.params.scale = []
tableStore.table.params.manufacturer = [] tableStore.table.params.manufacturer = []
tableStore.table.params.loadType = [] tableStore.table.params.loadType = []
provide('tableStore', tableStore) provide('tableStore', tableStore)
onMounted(() => { onMounted(() => {
tableStore.index() tableStore.index()

View File

@@ -27,7 +27,7 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家">
<el-select v-model="tableStore.table.params.manufacturer" clearable placeholder="请选择终端厂家"> <el-select v-model="tableStore.table.params.manufacturer" clearable placeholder="请选择终端厂家">
<el-option <el-option
v-for="item in terminaloption" v-for="item in terminaloption"

View File

@@ -27,7 +27,7 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家">
<el-select v-model="tableStore.table.params.manufacturer" clearable placeholder="请选择终端厂家"> <el-select v-model="tableStore.table.params.manufacturer" clearable placeholder="请选择终端厂家">
<el-option <el-option
v-for="item in terminaloption" v-for="item in terminaloption"

View File

@@ -10,81 +10,39 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="筛选数据"> <el-form-item label="筛选数据">
<el-input <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="输入关键字筛选"
v-model="tableStore.table.params.searchValue" style="width: 200px" maxlength="32" show-word-limit />
clearable
placeholder="输入关键字筛选"
style="width: 200px"
maxlength="32"
show-word-limit
/>
</el-form-item> </el-form-item>
<el-form-item label="触发类型:"> <el-form-item label="触发类型">
<el-select <el-select v-model="tableStore.table.params.waveType" placeholder="请选择触发类型" clearable multiple
v-model="tableStore.table.params.waveType" collapse-tags style="width: 100%">
placeholder="请选择触发类型" <el-option v-for="item in triggeroptions" :key="item.id" :label="item.name"
clearable :value="item.id"></el-option>
multiple
collapse-tags
style="width: 100%"
>
<el-option
v-for="item in triggeroptions"
:key="item.id"
:label="item.name"
:value="item.id"
></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="tableStore.table.params.fileFlag" placeholder="请选择是否存在波形" clearable
v-model="tableStore.table.params.fileFlag" style="width: 100%">
placeholder="请选择是否存在波形" <el-option v-for="item in wareaoptions" :key="item.id" :label="item.label"
clearable :value="item.id"></el-option>
style="width: 100%"
>
<el-option
v-for="item in wareaoptions"
:key="item.id"
:label="item.label"
:value="item.id"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="暂态持续时间(s):"> <el-form-item label="暂态持续时间(s)">
<el-input <el-input v-model="tableStore.table.params.persistMin" placeholder="请输入X秒"
v-model="tableStore.table.params.persistMin" onkeyup="value=value.replace(/[^\d.]/g,'')" clearable style="width: 94px"></el-input>
placeholder="请输入X秒"
onkeyup="value=value.replace(/[^\d.]/g,'')"
clearable
style="width: 94px"
></el-input>
<el-tag style="margin-left: 5px">&lt; 时间数 &lt;</el-tag> <el-tag style="margin-left: 5px">&lt; 时间数 &lt;</el-tag>
<el-input <el-input v-model="tableStore.table.params.persistMax" placeholder="请输入X秒"
v-model="tableStore.table.params.persistMax" onkeyup="value=value.replace(/[^\d.]/g,'')" clearable
placeholder="请输入X秒" style="margin-left: 5px; width: 94px"></el-input>
onkeyup="value=value.replace(/[^\d.]/g,'')"
clearable
style="margin-left: 5px; width: 94px"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="事件严重度:"> <el-form-item label="事件严重度">
<el-input <el-input v-model="tableStore.table.params.severityMin" placeholder="请输入正负数"
v-model="tableStore.table.params.severityMin" onkeyup="value=value.replace(/[^\d\.-]/g,'')" clearable style="width: 94px"></el-input>
placeholder="请输入正负数"
onkeyup="value=value.replace(/[^\d\.-]/g,'')"
clearable
style="width: 94px"
></el-input>
<el-tag style="margin-left: 5px">&lt; 严重度 &lt;</el-tag> <el-tag style="margin-left: 5px">&lt; 严重度 &lt;</el-tag>
<el-input <el-input v-model="tableStore.table.params.severityMax" placeholder="请输入正负数"
v-model="tableStore.table.params.severityMax" onkeyup="value=value.replace(/[^\d\.-]/g,'')" clearable
placeholder="请输入正负数" style="margin-left: 5px; width: 94px"></el-input>
onkeyup="value=value.replace(/[^\d\.-]/g,'')"
clearable
style="margin-left: 5px; width: 94px"
></el-input>
</el-form-item> </el-form-item>
<!-- <el-form-item label="触发类型:"> <!-- <el-form-item label="触发类型:">
@@ -94,53 +52,24 @@
:value="item.id"></el-option> :value="item.id"></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="tableStore.table.params.eventReason" placeholder="请选择暂态原因" clearable
v-model="tableStore.table.params.eventReason" multiple collapse-tags style="width: 100%">
placeholder="请选择暂态原因" <el-option v-for="item in reasonoptions" :key="item.id" :label="item.name"
clearable :value="item.id"></el-option>
multiple
collapse-tags
style="width: 100%"
>
<el-option
v-for="item in reasonoptions"
:key="item.id"
:label="item.name"
:value="item.id"
></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="tableStore.table.params.verifyReason" placeholder="请选择暂态核实原因" clearable
v-model="tableStore.table.params.verifyReason" multiple collapse-tags collapse-tags-tooltip>
placeholder="请选择暂态核实原因" <el-option v-for="item in verifyReasonList" :key="item.id" :label="item.name"
clearable :value="item.id"></el-option>
multiple
collapse-tags
collapse-tags-tooltip
>
<el-option
v-for="item in verifyReasonList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="变电站(监测点):"> <el-form-item label="变电站(监测点)">
<el-cascader <el-cascader v-model="tableStore.table.params.lineIds" :options="options" :props="defaultProps"
v-model="tableStore.table.params.lineIds" collapse-tags-tooltip style="width: 257px" filterable clearable collapse-tags
:options="options" placeholder="请选择变电站(监测点)" :show-all-levels="true" />
:props="defaultProps"
collapse-tags-tooltip
style="width: 257px"
filterable
clearable
collapse-tags
placeholder="请选择变电站(监测点)"
:show-all-levels="true"
/>
</el-form-item> </el-form-item>
</template> </template>
<template #operation> <template #operation>
@@ -272,10 +201,10 @@ const tableStore = new TableStore({
}, },
{ {
title: '操作',fixed: 'right', title: '操作', fixed: 'right',
width: '150', width: '150',
render: 'buttons', render: 'buttons',
buttons: [ buttons: [
{ {
name: 'edit', name: 'edit',
@@ -330,7 +259,7 @@ const tableStore = new TableStore({
} }
], ],
loadCallback: () => {} loadCallback: () => { }
}) })
const options = ref([]) const options = ref([])
const defaultProps = { const defaultProps = {

View File

@@ -2,7 +2,7 @@
<div class="default-main"> <div class="default-main">
<TableHeader datePicker ref="TableHeaderRef"> <TableHeader datePicker ref="TableHeaderRef">
<template #select> <template #select>
<el-form-item label="关键字"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="输入事件关联分析描述" maxlength="32" show-word-limit/> <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="输入事件关联分析描述" maxlength="32" show-word-limit/>
</el-form-item> </el-form-item>
</template> </template>

View File

@@ -3,7 +3,7 @@
<div v-show="view"> <div v-show="view">
<TableHeader datePicker ref="TableHeaderRef" > <TableHeader datePicker ref="TableHeaderRef" >
<template #select> <template #select>
<el-form-item label="关键字"> <el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="输入事件关联分析描述" <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="输入事件关联分析描述"
maxlength="32" show-word-limit /> maxlength="32" show-word-limit />
</el-form-item> </el-form-item>

View File

@@ -68,7 +68,7 @@
></bm-marker> ></bm-marker>
</template> </template>
<!-- --> <!-- -->
<BmlMarkerClusterer maxZoom="12"> <BmlMarkerClusterer maxZoom="12" :styles="styles">
<bm-marker <bm-marker
:position="path" :position="path"
v-for="path in areaLineInfo" v-for="path in areaLineInfo"
@@ -163,6 +163,44 @@ const areaLineInfo = ref<any>([])
const siteList = ref<any>([]) const siteList = ref<any>([])
const polyline = ref<any>([]) const polyline = ref<any>([])
const lineId = ref('') const lineId = ref('')
const imageUrl = new URL('@/assets/imgs/m0.png', import.meta.url).href
const imageUrl1 = new URL('@/assets/imgs/m1.png', import.meta.url).href
const imageUrl2 = new URL('@/assets/imgs/m3.png', import.meta.url).href
const imageUrl3 = new URL('@/assets/imgs/m4.png', import.meta.url).href
const styles = [
{
url: imageUrl,
size: {
width: 53,
height: 52
},
opt_textSize: 10
},
{
url: imageUrl1,
size: {
width: 56,
height: 55
},
opt_textSize: 12
},
{
url: imageUrl2,
size: {
width: 78,
height: 77
},
opt_textSize: 14
},
{
url: imageUrl3,
size: {
width: 90,
height: 89
},
opt_textSize: 14
},
]
const handler = async ({ BMap, map }: any) => { const handler = async ({ BMap, map }: any) => {
let data = props.mapList let data = props.mapList
let r = 0.0035 let r = 0.0035

View File

@@ -82,7 +82,7 @@
></bm-marker> ></bm-marker>
</template> </template>
<!-- --> <!-- -->
<BmlMarkerClusterer maxZoom="12"> <BmlMarkerClusterer maxZoom="12" :styles="styles">
<bm-marker <bm-marker
:position="path" :position="path"
v-for="path in areaLineInfo" v-for="path in areaLineInfo"
@@ -196,13 +196,51 @@ const areaLineInfo = ref<any>([])
const siteList = ref<any>([]) const siteList = ref<any>([])
const polyline = ref<any>([]) const polyline = ref<any>([])
const lineId = ref('') const lineId = ref('')
const imageUrl = new URL('@/assets/imgs/m0.png', import.meta.url).href
const imageUrl1 = new URL('@/assets/imgs/m1.png', import.meta.url).href
const imageUrl2 = new URL('@/assets/imgs/m3.png', import.meta.url).href
const imageUrl3 = new URL('@/assets/imgs/m4.png', import.meta.url).href
const styles = [
{
url: imageUrl,
size: {
width: 53,
height: 52
},
opt_textSize: 10
},
{
url: imageUrl1,
size: {
width: 56,
height: 55
},
opt_textSize: 12
},
{
url: imageUrl2,
size: {
width: 78,
height: 77
},
opt_textSize: 14
},
{
url: imageUrl3,
size: {
width: 90,
height: 89
},
opt_textSize: 14
},
]
const handler = async ({ BMap, map }: any) => { const handler = async ({ BMap, map }: any) => {
params.value.deptIndex = adminInfo.$state.deptId params.value.deptIndex = adminInfo.$state.deptId
params.value.searchBeginTime = datePickerRef.value.timeValue[0] params.value.searchBeginTime = datePickerRef.value.timeValue[0]
params.value.searchEndTime = datePickerRef.value.timeValue[1] params.value.searchEndTime = datePickerRef.value.timeValue[1]
let { data } = await getAreaLineInfo(params.value) let { data } = await getAreaLineInfo(params.value)
let r = 0.0035 let r = 0.0035
let list = data.filter((item: any) => item.lng != 0) let list = data//.filter((item: any) => item.lng != 0)
list.forEach((item: any) => { list.forEach((item: any) => {
// 变电站图标 // 变电站图标
item.icon = { item.icon = {

View File

@@ -27,7 +27,7 @@
<vxe-column field="lineName" title="监测点" width="120"></vxe-column> <vxe-column field="lineName" title="监测点" width="120"></vxe-column>
<vxe-column field="featureAmplitude" title="暂降(骤升)幅值(%)"> <vxe-column field="featureAmplitude" title="暂降(骤升)幅值(%)">
<template #default="{ row }"> <template #default="{ row }">
{{ (row.featureAmplitude * 100).toFixed(2) }} {{ row.featureAmplitude.toFixed(2) }}
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="duration" title="持续时间(s)"></vxe-column> <vxe-column field="duration" title="持续时间(s)"></vxe-column>

View File

@@ -3,7 +3,7 @@
<div class='default-main'> <div class='default-main'>
<TableHeader> <TableHeader>
<template #select> <template #select>
<el-form-item label='关键词'> <el-form-item label='筛选数据'>
<el-input <el-input
v-model='tableStore.table.params.searchValue' v-model='tableStore.table.params.searchValue'
clearable clearable

View File

@@ -12,12 +12,12 @@
</template> </template>
</el-page-header> </el-page-header>
</el-form-item> </el-form-item>
<el-form-item label="过滤筛选"> <el-form-item label="筛选数据">
<el-input <el-input
style="width: 240px" style="width: 240px"
v-model="tableStore.table.params.searchValue" v-model="tableStore.table.params.searchValue"
clearable clearable
placeholder="请输入筛选数据" placeholder="请输入关键字筛选"
maxlength="32" maxlength="32"
show-word-limit show-word-limit
/> />