修改冀北现场问题

绘制 算法库 案例库页面
联调 辽宁 有功功率页面
This commit is contained in:
GGJ
2024-09-04 20:59:57 +08:00
parent 3ac62fc98c
commit 630156f221
21 changed files with 7777 additions and 81 deletions

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1725438023954" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4376" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M904 176v112H120V176h784m0-56H120c-30.9 0-56 25.1-56 56v112c0 30.9 25.1 56 56 56h784c30.9 0 56-25.1 56-56V176c0-30.9-25.1-56-56-56z" p-id="4377"></path><path d="M820 232m-28 0a28 28 0 1 0 56 0 28 28 0 1 0-56 0Z" p-id="4378"></path><path d="M708 232m-28 0a28 28 0 1 0 56 0 28 28 0 1 0-56 0Z" p-id="4379"></path><path d="M904 456v112H120V456h784m0-56H120c-30.9 0-56 25.1-56 56v112c0 30.9 25.1 56 56 56h784c30.9 0 56-25.1 56-56V456c0-30.9-25.1-56-56-56z" p-id="4380"></path><path d="M820 512m-28 0a28 28 0 1 0 56 0 28 28 0 1 0-56 0Z" p-id="4381"></path><path d="M596 232m-28 0a28 28 0 1 0 56 0 28 28 0 1 0-56 0Z" p-id="4382"></path><path d="M596 792m-28 0a28 28 0 1 0 56 0 28 28 0 1 0-56 0Z" p-id="4383"></path><path d="M708 512m-28 0a28 28 0 1 0 56 0 28 28 0 1 0-56 0Z" p-id="4384"></path><path d="M904 736v112H120V736h784m0-56H120c-30.9 0-56 25.1-56 56v112c0 30.9 25.1 56 56 56h784c30.9 0 56-25.1 56-56V736c0-30.9-25.1-56-56-56z" p-id="4385"></path><path d="M820 792m-28 0a28 28 0 1 0 56 0 28 28 0 1 0-56 0Z" p-id="4386"></path><path d="M708 792m-28 0a28 28 0 1 0 56 0 28 28 0 1 0-56 0Z" p-id="4387"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,7 @@
<div class="bx" id="rms"></div> <div class="bx" id="rms"></div>
</div> </div>
</div> </div>
<el-button <!-- <el-button
style="position: absolute; right: 10px; top: 0px; z-index: 20000" style="position: absolute; right: 10px; top: 0px; z-index: 20000"
type="primary" type="primary"
link link
@@ -14,7 +14,7 @@
@click="download" @click="download"
> >
下载 下载
</el-button> </el-button> -->
</div> </div>
</template> </template>
<script lang="js"> <script lang="js">
@@ -916,7 +916,7 @@ export default {
enabled: true, enabled: true,
itemDistance: 5, itemDistance: 5,
textStyle: { textStyle: {
fontSize: "0.6rem", fontSize: "0.7rem",
color: _this.DColor ? "#fff" : echartsColor.WordColor, color: _this.DColor ? "#fff" : echartsColor.WordColor,
rich: { rich: {
a: { a: {
@@ -1035,7 +1035,7 @@ export default {
}, },
grid: { grid: {
left: "1%", left: "1%",
right: "2.8%", right: "45px",
bottom: "40px", bottom: "40px",
top: "15%", top: "15%",
containLabel: true, containLabel: true,
@@ -1331,7 +1331,7 @@ export default {
enabled: true, enabled: true,
itemDistance: 5, itemDistance: 5,
textStyle: { textStyle: {
fontSize: "0.6rem", fontSize: "0.7rem",
color: _this.DColor ? "#fff" : echartsColor.WordColor, color: _this.DColor ? "#fff" : echartsColor.WordColor,
rich: { rich: {
a: { a: {
@@ -1453,7 +1453,7 @@ export default {
}, },
grid: { grid: {
left: "1%", left: "1%",
right: "2.8%", right: "45px",
bottom: "40px", bottom: "40px",
top: "15%", top: "15%",
containLabel: true, containLabel: true,

View File

@@ -3,6 +3,7 @@
<el-select v-model="interval" style="min-width: 90px; width: 90px; margin-right: 10px" @change="timeChange"> <el-select v-model="interval" style="min-width: 90px; width: 90px; margin-right: 10px" @change="timeChange">
<el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
<el-date-picker <el-date-picker
v-model="timeValue" v-model="timeValue"
type="daterange" type="daterange"
@@ -306,6 +307,8 @@ const next = () => {
} }
} else { } else {
month = month + 3 month = month + 3
console.log('🚀 ~ next ~ presentM:', presentM, month)
// 季度进位后,超过当前月份是不科学的 // 季度进位后,超过当前月份是不科学的
if (year == presentY && !props.nextFlag) { if (year == presentY && !props.nextFlag) {
if (month >= presentM) { if (month >= presentM) {
@@ -319,6 +322,7 @@ const next = () => {
endTime = year + '-0' + presentM + '-' + presentD endTime = year + '-0' + presentM + '-' + presentD
} }
} else if (presentM > 3 && presentM < 7) { } else if (presentM > 3 && presentM < 7) {
console.log(123123)
// 第二季度 // 第二季度
startTime = year + '-04-01' startTime = year + '-04-01'
if (presentD < 10) { if (presentD < 10) {
@@ -354,7 +358,7 @@ const next = () => {
endTime = NowgetEndTime() endTime = NowgetEndTime()
} else { } else {
var day = getDays(year, month) var day = getDays(year, month)
endTime = year + '-' + month + '-' + day endTime = year + '-0' + month + '-' + day
} }
} }
} else { } else {
@@ -371,6 +375,7 @@ const next = () => {
} }
} }
} }
console.log(startTime, endTime)
} else if (interval.value == 5) { } else if (interval.value == 5) {
} else if (interval.value == 4) { } else if (interval.value == 4) {
//根据开始时间推 //根据开始时间推

View File

@@ -28,7 +28,7 @@
<!-- tag --> <!-- tag -->
<div v-if="field.render == 'tag' && fieldValue !== ''"> <div v-if="field.render == 'tag' && fieldValue !== ''">
<el-tag :type="getTagType(fieldValue, field.custom) || 'primary'" size="small"> <el-tag :type="getTagType(fieldValue, field.custom) || 'primary'" :effect="field.effect || ''" size="small">
{{ field.replaceValue ? field.replaceValue[fieldValue] : fieldValue }} {{ field.replaceValue ? field.replaceValue[fieldValue] : fieldValue }}
</el-tag> </el-tag>
</div> </div>

View File

@@ -162,7 +162,7 @@ const setDatePicker = (list: any) => {
} }
const onResetForm = () => { const onResetForm = () => {
//时间重置成默认值 //时间重置成默认值
datePickerRef.value?.timeChange(3) datePickerRef.value?.setInterval(3)
tableStore.onTableAction('reset', {}) tableStore.onTableAction('reset', {})
} }
const setInterval = (val: any) => { const setInterval = (val: any) => {

View File

@@ -0,0 +1,81 @@
<template>
<div class="point-tree">
<div style="flex: 1; overflow: hidden">
<Tree ref="treeRef" :data="tree" style="width: 100%; height: 100%" :canExpand="false" v-bind="$attrs" />
</div>
</div>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref, useAttrs } from 'vue'
import Tree from '../index.vue'
import { useAdminInfo } from '@/stores/adminInfo'
import { useDictData } from '@/stores/dictData'
import { getTerminalTreeForFive } from '@/api/device-boot/terminalTree'
import { useConfig } from '@/stores/config'
defineOptions({
name: 'pms/pointTree'
})
const emit = defineEmits(['init'])
const attrs = useAttrs()
const adminInfo = useAdminInfo()
const dictData = useDictData()
const config = useConfig()
const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type'])
const tree = ref()
const treeRef = ref()
const loadData = () => {
let nodeKey = ''
let res = {
data: [
{
name: '运行管理',
id: '1',
children: [
{
name: '运行指标',
id: '2'
},
{
name: '数据质量核查',
id: '3'
}
]
}
]
}
// getTerminalTreeForFive(form).then(res => {
res.data.forEach((item: any) => {
item.icon = 'el-icon-FolderOpened'
item.color = config.getColorVal('elementUiPrimary')
item.children.forEach((item2: any) => {
item2.icon = 'el-icon-Document'
item.color = config.getColorVal('elementUiPrimary')
})
})
nodeKey = res.data[0].children[0].id
emit('init', res.data[0].children[0])
tree.value = res.data
if (nodeKey) {
setTimeout(() => {
treeRef.value.treeRef.setCurrentKey(nodeKey)
}, 10)
}
// })
}
loadData()
</script>
<style lang="scss">
.point-tree {
height: 100%;
width: 100%;
display: flex;
flex-direction: column;
background: #fff;
border: 1px solid var(--el-border-color);
}
</style>

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<TableHeader datePicker area ref="header"> <TableHeader datePicker theCurrentTime area ref="header">
<!-- <template v-slot:select> <!-- <template v-slot:select>
</template> --> </template> -->
@@ -49,15 +49,17 @@
field="featureAmplitude" field="featureAmplitude"
title="暂降(骤升)幅值(%)" title="暂降(骤升)幅值(%)"
sortable sortable
min-width="150px"
></vxe-column> ></vxe-column>
<vxe-column <vxe-column
field="advanceReason" field="advanceReason"
title="暂降原因" title="暂降原因"
sortable sortable
:formatter="formFilter" :formatter="formFilter"
min-width="100px"
></vxe-column> ></vxe-column>
<vxe-column field="severity" title="严重度" sortable></vxe-column> <vxe-column field="severity" title="严重度" min-width="100px" sortable></vxe-column>
<vxe-column title="操作"> <vxe-column title="操作" width="80px">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
type="primary" type="primary"
@@ -81,6 +83,7 @@
<div v-if="wp != null"> <div v-if="wp != null">
<rmsboxi :value="1" :height="height" :boxoList="boxoList" :wp="wp" /> <rmsboxi :value="1" :height="height" :boxoList="boxoList" :wp="wp" />
</div> </div>
<el-empty v-else description="暂无数据" class="custom-empty" />
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -100,6 +103,7 @@ import { getMonitorEventAnalyseWave, getTransientDetailById } from '@/api/event-
import rmsboxi from '@/components/echarts/rmsboxi.vue' import rmsboxi from '@/components/echarts/rmsboxi.vue'
import { ref, onMounted, provide } from 'vue' import { ref, onMounted, provide } from 'vue'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { FormItem } from 'vxe-table'
defineOptions({ defineOptions({
name: 'newEnergy/highAndLowPressure' name: 'newEnergy/highAndLowPressure'
}) })
@@ -181,15 +185,17 @@ const map = (res: any) => {
}, },
viewControl: { viewControl: {
alpha: 60, alpha: 60,
distance: 120 distance: 120,
panMouseButton: 'right', //平移操作使用的鼠标按键
rotateMouseButton: 'left' //旋转操作使用的鼠标按键
}, },
label: { label: {
show: true, show: true,
color: '#000', color: '#000',
fontSize: 14, fontSize: 14,
distance: 0,
textStyle: { textStyle: {
color: '#000', color: '#000',
backgroundColor: '#000' backgroundColor: '#000'
} }
}, },
@@ -210,7 +216,7 @@ const map = (res: any) => {
show: true, show: true,
position: 'top', position: 'top',
formatter: params => { formatter: params => {
return params.value[2] || '' return params.value[2]
} }
}, },
@@ -231,8 +237,7 @@ const map = (res: any) => {
}, },
emphasis: { emphasis: {
label: { show: true } label: { show: true }
}, }
zlevel: 1
}, },
{ {
name: '高压', name: '高压',
@@ -241,9 +246,9 @@ const map = (res: any) => {
shading: 'lambert', shading: 'lambert',
label: { label: {
show: true, show: true,
position: 'top', // position: 'top',
formatter: params => { formatter: params => {
return params.value[2] || '' return params.value[2]
} }
}, },
@@ -253,7 +258,7 @@ const map = (res: any) => {
: res.map((item: any) => { : res.map((item: any) => {
return { return {
...item, ...item,
value: [item.lng - 0.07, item.lat, item.highPressure || 0] value: [item.lng - 0.1, item.lat, item.highPressure || 0]
} }
}), }),
// [ // [
@@ -296,6 +301,21 @@ const tabulation = (e: any) => {
}) })
.then(res => { .then(res => {
distributionData.value = res.data distributionData.value = res.data
for (let i = 0; i < res.data.length; i++) {
if (res.data[i].wavePath != null) {
boxi(res.data[i])
break
}
}
// res.data.forEach((item: any) => {
// if (item.wavePath != null) {
// boxi(item)
// return
// }
// })
// 。wavePath
loading.value = false loading.value = false
}) })
.catch(() => { .catch(() => {
@@ -369,4 +389,19 @@ const layout1 = mainHeight(93) as any
:deep(.el-card__body) { :deep(.el-card__body) {
padding: 10px; padding: 10px;
} }
/* 自定义 el-empty 的样式 */
:deep(.custom-empty) {
display: flex;
justify-content: center;
align-items: center;
height: 100%; /* 调整高度 */
padding: 20px; /* 调整内边距 */
.el-empty__image {
display: none; /* 隐藏默认图片 */
}
.el-empty__description {
font-size: 14px; /* 调整字体大小 */
color: var(--vxe-font-color);
}
}
</style> </style>

View File

@@ -3,14 +3,14 @@
<TableHeader :showSearch="false"> <TableHeader :showSearch="false">
<template #select> <template #select>
<el-form-item label=""> <el-form-item label="">
<span class="text-large font-600 mr-3">{{ props.timePopUpBox.num }}</span> <span class="text-large font-600 mr-3">{{ props.timePopUpBox.time }}</span>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-radio-group v-model="radio2" @change="tableStore.index()"> <el-radio-group v-model="radio2" @change="tableStore.index()">
<el-radio-button label="基础数据" value="1" /> <el-radio-button label="基础数据" value="1" />
<el-radio-button label="谐波电压" value="2" /> <el-radio-button label="谐波电压" value="2" />
<el-radio-button label="谐波电流" value="3" /> <el-radio-button label="谐波电流" value="3" />
<el-radio-button label="间谐波电压含有率" value="4" /> <el-radio-button label="间谐波电压" value="4" />
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</template> </template>
@@ -47,41 +47,54 @@ const tableStore = new TableStore({
method: 'POST', method: 'POST',
showPage: false, showPage: false,
column: [ column: [
{ title: '指标', field: 'anotherName' }, {
title: '指标',
field: 'anotherName',
formatter: row => {
row.column.title =
radio2.value == '1' ? '指标' : (row.column.title = radio2.value == '4' ? '间谐波次数' : '谐波次数')
return row.cellValue
}
},
{ title: '单位', field: 'unit' },
{ {
title: '最小值', title: '最小值',
field: 'code', field: 'min',
children: [ children: [
{ title: 'A', field: 'num' }, {
{ title: 'B', field: 'num' }, title: 'A',
{ title: 'C', field: 'num' } field: 'minphaseA',
formatter: row => formatter(row)
},
{ title: 'B', field: 'minphaseB', formatter: row => formatter(row) },
{ title: 'C', field: 'minphaseC', formatter: row => formatter(row) }
] ]
}, },
{ {
title: '最大值', title: '最大值',
field: 'sort', field: 'max',
children: [ children: [
{ title: 'A', field: 'num' }, { title: 'A', field: 'maxphaseA', formatter: row => formatter(row) },
{ title: 'B', field: 'num' }, { title: 'B', field: 'maxphaseB', formatter: row => formatter(row) },
{ title: 'C', field: 'num' } { title: 'C', field: 'maxphaseC', formatter: row => formatter(row) }
] ]
}, },
{ {
title: '平均值', title: '平均值',
field: 'value', field: 'avg',
children: [ children: [
{ title: 'A', field: 'num' }, { title: 'A', field: 'avgphaseA', formatter: row => formatter(row) },
{ title: 'B', field: 'num' }, { title: 'B', field: 'avgphaseB', formatter: row => formatter(row) },
{ title: 'C', field: 'num' } { title: 'C', field: 'avgphaseC', formatter: row => formatter(row) }
] ]
}, },
{ {
title: 'cp95值', title: 'cp95值',
field: 'levelName', field: 'cp95',
children: [ children: [
{ title: 'A', field: 'num' }, { title: 'A', field: 'cp95PhaseA', formatter: row => formatter(row) },
{ title: 'B', field: 'num' }, { title: 'B', field: 'cp95PhaseB', formatter: row => formatter(row) },
{ title: 'C', field: 'num' } { title: 'C', field: 'cp95PhaseC', formatter: row => formatter(row) }
] ]
} }
], ],
@@ -96,7 +109,9 @@ const tableStore = new TableStore({
}) })
provide('tableStore', tableStore) provide('tableStore', tableStore)
const formatter = (row: any) => {
return row.cellValue || '/'
}
onMounted(() => { onMounted(() => {
tableStore.index() tableStore.index()
}) })

View File

@@ -55,7 +55,7 @@
@click="analyseList(item.label, index + 5)" @click="analyseList(item.label, index + 5)"
> >
<div style="font-size: 24px; font-weight: 700"> <div style="font-size: 24px; font-weight: 700">
<span :style="{ color: item.crossTheLine == '1' ? 'red' : 'green' }"> <span :style="{ color: item.crossTheLine > 0 ? 'red' : 'green' }">
{{ item.quantity }} {{ item.quantity }}
</span> </span>
<span style="font-size: 14px; font-weight: 500"></span> <span style="font-size: 14px; font-weight: 500"></span>
@@ -83,7 +83,7 @@
:data="tableData" :data="tableData"
v-loading="loading" v-loading="loading"
> >
<vxe-column field="num" title="时间" width="180px"> <vxe-column field="time" title="时间" width="180px">
<template #default="{ row }"> <template #default="{ row }">
<el-link <el-link
type="primary" type="primary"
@@ -451,49 +451,39 @@ const tableStore = new TableStore({
loadCallback: () => { loadCallback: () => {
let res = tableStore.table.data let res = tableStore.table.data
let mun =
res.minsNum1 +
res.minsNum2 +
res.minsNum3 +
res.minsNum4 +
res.minsNum5 +
res.minsNum6 +
res.minsNum7 +
res.minsNum8 +
res.minsNum9
powerList1.value = [ powerList1.value = [
{ {
label: '0%~10%', label: '0%~10%',
quantity: res.minsNum0, quantity: res.minsNum0,
percentage: ((res.minsNum0 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion0 + '%',
crossTheLine: res.isOrNot0, crossTheLine: res.isOrNot0,
value: '0%~10%' value: '0%~10%'
}, },
{ {
label: '10%~20%', label: '10%~20%',
quantity: res.minsNum1, quantity: res.minsNum1,
percentage: ((res.minsNum1 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion1 + '%',
crossTheLine: res.isOrNot1, crossTheLine: res.isOrNot1,
value: '10%~10%' value: '10%~10%'
}, },
{ {
label: '20%~30%', label: '20%~30%',
quantity: res.minsNum2, quantity: res.minsNum2,
percentage: ((res.minsNum2 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion2 + '%',
crossTheLine: res.isOrNot2, crossTheLine: res.isOrNot2,
value: '10%~30%' value: '10%~30%'
}, },
{ {
label: '30%~40%', label: '30%~40%',
quantity: res.minsNum3, quantity: res.minsNum3,
percentage: ((res.minsNum3 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion3 + '%',
crossTheLine: res.isOrNot3, crossTheLine: res.isOrNot3,
value: '30%~40%' value: '30%~40%'
}, },
{ {
label: '40%~50%', label: '40%~50%',
quantity: res.minsNum4, quantity: res.minsNum4,
percentage: ((res.minsNum4 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion4 + '%',
crossTheLine: res.isOrNot4, crossTheLine: res.isOrNot4,
value: '40%~50%' value: '40%~50%'
} }
@@ -502,35 +492,35 @@ const tableStore = new TableStore({
{ {
label: '50%~60%', label: '50%~60%',
quantity: res.minsNum5, quantity: res.minsNum5,
percentage: ((res.minsNum5 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion5 + '%',
crossTheLine: res.isOrNot5, crossTheLine: res.isOrNot5,
value: '50%~60%' value: '50%~60%'
}, },
{ {
label: '60%~70%', label: '60%~70%',
quantity: res.minsNum6, quantity: res.minsNum6,
percentage: ((res.minsNum6 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion6 + '%',
crossTheLine: res.isOrNot6, crossTheLine: res.isOrNot6,
value: '60%~70%' value: '60%~70%'
}, },
{ {
label: '70%~80%', label: '70%~80%',
quantity: res.minsNum7, quantity: res.minsNum7,
percentage: ((res.minsNum7 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion7 + '%',
crossTheLine: res.isOrNot7, crossTheLine: res.isOrNot7,
value: '70%~80%' value: '70%~80%'
}, },
{ {
label: '80%~90%', label: '80%~90%',
quantity: res.minsNum8, quantity: res.minsNum8,
percentage: ((res.minsNum8 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion8 + '%',
crossTheLine: res.isOrNot8, crossTheLine: res.isOrNot8,
value: '80%~90%' value: '80%~90%'
}, },
{ {
label: '90%~100%', label: '90%~100%',
quantity: res.minsNum9, quantity: res.minsNum9,
percentage: ((res.minsNum9 / mun || 0) * 100).toFixed(2) + '%', percentage: res.proportion9 + '%',
crossTheLine: res.isOrNot9, crossTheLine: res.isOrNot9,
value: '90%~100%' value: '90%~100%'
} }
@@ -552,7 +542,7 @@ const tableStore = new TableStore({
series: [ series: [
{ {
type: 'pie', type: 'pie',
center: ['50%', '60%'], center: ['50%', '55%'],
selectedOffset: 30, selectedOffset: 30,
label: { label: {
show: true, show: true,
@@ -657,7 +647,7 @@ const exportData = () => {
ElMessage('正在下载中,请稍等...') ElMessage('正在下载中,请稍等...')
exportExcelRangTemplate({ exportExcelRangTemplate({
lineId: dotList.value.id, lineId: dotList.value.id,
searchValue: treeList.value?.name + ' 0%-100% 区间数据',
searchBeginTime: tableStore.table.params.searchBeginTime, searchBeginTime: tableStore.table.params.searchBeginTime,
searchEndTime: tableStore.table.params.searchEndTime searchEndTime: tableStore.table.params.searchEndTime
}).then((res: any) => { }).then((res: any) => {
@@ -678,6 +668,7 @@ const exportData = () => {
const generateReports = () => { const generateReports = () => {
let data: any = { let data: any = {
lineId: dotList.value.id, lineId: dotList.value.id,
searchValue: treeList.value?.name + ' 报告',
searchBeginTime: tableStore.table.params.searchBeginTime, searchBeginTime: tableStore.table.params.searchBeginTime,
searchEndTime: tableStore.table.params.searchEndTime searchEndTime: tableStore.table.params.searchEndTime
} }
@@ -693,7 +684,7 @@ const generateReports = () => {
const url = window.URL.createObjectURL(blob) const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签 const link = document.createElement('a') // 创建a标签
link.href = url link.href = url
link.download = treeList.value?.name +' 报告' // 设置下载的文件名 link.download = treeList.value?.name + ' 报告' // 设置下载的文件名
document.body.appendChild(link) document.body.appendChild(link)
link.click() //执行下载 link.click() //执行下载
document.body.removeChild(link) document.body.removeChild(link)
@@ -726,7 +717,7 @@ const analyseList = (e: string, i: number) => {
lineId: dotList.value.id, lineId: dotList.value.id,
searchBeginTime: tableStore.table.params.searchBeginTime, searchBeginTime: tableStore.table.params.searchBeginTime,
searchEndTime: tableStore.table.params.searchEndTime, searchEndTime: tableStore.table.params.searchEndTime,
statisticalId: i field: i
}) })
.then(res => { .then(res => {
loading.value = false loading.value = false
@@ -750,6 +741,7 @@ const handleNodeClick = (data: any, node: any) => {
console.log('🚀 ~ handleNodeClick ~ data:', data) console.log('🚀 ~ handleNodeClick ~ data:', data)
if (data.level == 6) { if (data.level == 6) {
dotList.value = data dotList.value = data
// dotList.value.id = '6469e77fda42db12c7ca6620a092f03c1'
tableStore.index() tableStore.index()
} }
} }

View File

@@ -13,11 +13,11 @@
</el-form-item> </el-form-item>
<el-form-item label="电压等级:" prop="scale"> <el-form-item label="电压等级:" prop="scale">
<el-select v-model="addData.scale" clearable collapse-tags placeholder="请选择干扰源类型"> <el-select v-model="addData.scale" clearable collapse-tags placeholder="请选择电压等级">
<el-option v-for="item in scaleList" :key="item.id" :label="item.name" :value="item.id"></el-option> <el-option v-for="item in scaleList" :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="额定有功功率:" prop="ratedPower"> <el-form-item label="额定有功功率(kV):" prop="ratedPower">
<el-input-number v-model="addData.ratedPower" :min="0" style="width: 100%" /> <el-input-number v-model="addData.ratedPower" :min="0" style="width: 100%" />
</el-form-item> </el-form-item>
<el-form-item label="经度:" prop="longitude"> <el-form-item label="经度:" prop="longitude">
@@ -103,7 +103,7 @@ const config = () => {
formRef.value.validate((valid: any) => { formRef.value.validate((valid: any) => {
if (valid) { if (valid) {
editNewStation(addData.value).then((res: any) => { editNewStation(addData.value).then((res: any) => {
ElMessage.success('新增成功!') ElMessage.success(title.value + '成功!')
emit('onSubmit') emit('onSubmit')
cancel() cancel()
}) })
@@ -137,6 +137,9 @@ const open = (row: any) => {
} }
} }
userAdd.value = true userAdd.value = true
setTimeout(() => {
formRef.value.clearValidate()
}, 20)
} }
defineExpose({ open }) defineExpose({ open })

View File

@@ -41,10 +41,9 @@ const tableStore = new TableStore({
method: 'POST', method: 'POST',
column: [ column: [
{ {
field: 'index',
title: '序号', title: '序号',
type: 'seq', width: '80',
align: 'center',
width: 60,
formatter: (row: any) => { formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1 return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
} }
@@ -62,9 +61,9 @@ const tableStore = new TableStore({
formatter: (row: any) => scaleList.filter(item => item.id == row.cellValue)[0]?.name formatter: (row: any) => scaleList.filter(item => item.id == row.cellValue)[0]?.name
}, },
{ field: 'ratedPower', title: '额定有功功率' }, { field: 'ratedPower', title: '额定有功功率(kV)' },
{ field: 'longitude', title: '经度' }, { field: 'longitude', title: '经度' },
{ field: 'latitude', title: '度' }, { field: 'latitude', title: '度' },
{ {
title: '操作', title: '操作',
align: 'center', align: 'center',

View File

@@ -0,0 +1,84 @@
<template>
<el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title" width="700px">
<el-scrollbar>
<el-form :inline="false" :model="form" label-width="auto" :rules="rules" ref="formRef">
<el-form-item label="算法名称">
<el-input v-model="form.name" placeholder="请输入算法名称" />
</el-form-item>
<el-form-item label="定义">
<el-input v-model="form.code" placeholder="请输入定义" />
</el-form-item>
<el-form-item label="计算公式">
<el-input v-model="form.remark" :rows="2" type="textarea" placeholder="请输入计算公式" />
</el-form-item>
<el-form-item label="计算周期">
<el-input v-model="form.code" placeholder="请输入计算周期" />
</el-form-item>
<el-form-item label="数据来源">
<el-input v-model="form.code" placeholder="请输入数据来源" />
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, inject } from 'vue'
import { reactive } from 'vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore' // 若不是列表页面弹框可删除
const dialogVisible = ref(false)
const title = ref('')
const tableStore = inject('tableStore') as TableStore
const formRef = ref()
// 注意不要和表单ref的命名冲突
const form = reactive<anyObj>({
code: '',
name: '',
remark: '',
id: ''
})
const rules = {
name: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '角色编码不能为空', trigger: 'blur' }]
}
const open = (text: string, data?: anyObj) => {
title.value = text
dialogVisible.value = true
if (data) {
// 表单赋值
for (let key in form) {
form[key] = data[key]
}
} else {
// 在此处恢复默认表单
for (let key in form) {
form[key] = ''
}
}
}
const submit = () => {
formRef.value.validate(async (valid: boolean) => {
if (valid) {
if (form.id) {
// await update(form)
} else {
// await create(form)
}
ElMessage.success('保存成功')
tableStore.index()
dialogVisible.value = false
}
})
}
defineExpose({ open })
</script>

View File

@@ -0,0 +1,188 @@
<template>
<!-- 算法库 -->
<div class="default-main" :style="height">
<splitpanes style="height: 100%" class="default-theme" id="navigation-splitpanes">
<pane :size="size">
<algorithmTree
:default-expand-all="false"
:default-expanded-keys="monitoringPoint.state.lineId ? [monitoringPoint.state.lineId] : []"
:current-node-key="monitoringPoint.state.lineId"
@node-click="handleNodeClick"
@init="handleNodeClick"
></algorithmTree>
</pane>
<pane style="background: #fff" :style="height">
<!-- <div :style="height"></div> -->
<TableHeader ref="TableHeaderRef" :show-search="false">
<template v-slot:select>
<el-radio-group v-model="tableStore.table.params.radio2" @change="tableStore.index()">
<el-radio-button label="监测覆盖率" value="1" />
<el-radio-button label="装置在线率" value="2" />
<el-radio-button label="数据完整性" value="3" />
</el-radio-group>
</template>
<template #operation>
<el-button icon="el-icon-Plus" type="primary" @click="addUser">新增</el-button>
</template>
</TableHeader>
<Table ref="tableRef"></Table>
</pane>
</splitpanes>
<!-- 弹框 -->
<PopupEdit ref="popupEditRef" />
</div>
</template>
<script setup lang="ts">
import { onMounted, ref, provide } from 'vue'
import 'splitpanes/dist/splitpanes.css'
import { Splitpanes, Pane } from 'splitpanes'
import TableStore from '@/utils/tableStore'
import algorithmTree from '@/components/tree/pqs/algorithmTree.vue'
import TableHeader from '@/components/table/header/index.vue'
import { mainHeight } from '@/utils/layout'
import Table from '@/components/table/index.vue'
import { getLineExport, getList, selectReleation } from '@/api/event-boot/report'
import PopupEdit from './components/form.vue'
import { useMonitoringPoint } from '@/stores/monitoringPoint'
import { ElMessage } from 'element-plus'
defineOptions({
name: 'database/algorithm'
})
const monitoringPoint = useMonitoringPoint()
const height = mainHeight(20)
const size = ref(0)
const popupEditRef = ref()
const TableHeaderRef = ref()
const dotList: any = ref({
name: monitoringPoint.state.lineName.split('>')[3],
id: monitoringPoint.state.lineId,
level: 6
})
const templatePolicy: any = ref([])
const tableStore = new TableStore({
url: '/user-boot/dept/deptTree',
method: 'POST',
column: [
{ title: '算法名称', field: 'name' },
{
title: '定义',
field: 'name1'
},
{
title: '计算公式',
field: 'name2'
},
{
title: '计算周期',
field: 'name3'
},
{
title: '数据来源',
field: 'name4'
},
{
title: '是否启用',
field: 'name5',
render: 'tag',
effect: 'dark',
custom: {
0: 'info',
1: 'success'
},
replaceValue: {
0: '否',
1: '是'
}
}
// {
// title: '操作',
// align: 'center',
// width: '180',
// render: 'buttons',
// buttons: [
// {
// name: 'edit',
// title: '编辑',
// type: 'primary',
// icon: 'el-icon-EditPen',
// render: 'basicButton',
// click: async row => {}
// }
// ]
// }
],
loadCallback: () => {
tableStore.table.data = [
{
name: '测试名称',
name1: 'xxx',
name2: 'XXX',
name3: '1月',
name4: '单体系统',
name5: '1'
},
{
name: '测试名称',
name1: 'xxx',
name2: 'XXX',
name3: '1月',
name4: '单体系统',
name5: '0'
}
]
}
})
tableStore.table.params.radio2 = '1'
// 弹框
const addUser = () => {
popupEditRef.value.open('新增算法')
}
provide('tableStore', tableStore)
onMounted(() => {
const dom = document.getElementById('navigation-splitpanes')
if (dom) {
size.value = Math.round((180 / dom.offsetHeight) * 100)
}
tableStore.index()
})
const handleNodeClick = (data: any, node: any) => {
dotList.value = data
}
</script>
<style lang="scss">
.splitpanes.default-theme .splitpanes__pane {
background: #eaeef1;
}
.grid-content {
text-align: center;
}
.divBox {
width: 250px;
height: 31px;
margin: auto;
line-height: 32px;
border: 1px solid #c9c9c9;
&:hover {
border: 1px solid #002255;
}
}
.box {
padding: 10px;
// margin-top: 10px;
overflow-y: auto;
font-size: 15px;
}
.el-divider--horizontal {
margin: 10px 0;
}
.mTop {
margin-top: 5px;
margin-bottom: 5px;
}
</style>

View File

@@ -0,0 +1,84 @@
<template>
<el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title" width="700px">
<el-scrollbar>
<el-form :inline="false" :model="form" label-width="auto" :rules="rules" ref="formRef">
<el-form-item label="算法名称">
<el-input v-model="form.name" placeholder="请输入算法名称" />
</el-form-item>
<el-form-item label="定义">
<el-input v-model="form.code" placeholder="请输入定义" />
</el-form-item>
<el-form-item label="计算公式">
<el-input v-model="form.remark" :rows="2" type="textarea" placeholder="请输入计算公式" />
</el-form-item>
<el-form-item label="计算周期">
<el-input v-model="form.code" placeholder="请输入计算周期" />
</el-form-item>
<el-form-item label="数据来源">
<el-input v-model="form.code" placeholder="请输入数据来源" />
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, inject } from 'vue'
import { reactive } from 'vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore' // 若不是列表页面弹框可删除
const dialogVisible = ref(false)
const title = ref('')
const tableStore = inject('tableStore') as TableStore
const formRef = ref()
// 注意不要和表单ref的命名冲突
const form = reactive<anyObj>({
code: '',
name: '',
remark: '',
id: ''
})
const rules = {
name: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '角色编码不能为空', trigger: 'blur' }]
}
const open = (text: string, data?: anyObj) => {
title.value = text
dialogVisible.value = true
if (data) {
// 表单赋值
for (let key in form) {
form[key] = data[key]
}
} else {
// 在此处恢复默认表单
for (let key in form) {
form[key] = ''
}
}
}
const submit = () => {
formRef.value.validate(async (valid: boolean) => {
if (valid) {
if (form.id) {
// await update(form)
} else {
// await create(form)
}
ElMessage.success('保存成功')
tableStore.index()
dialogVisible.value = false
}
})
}
defineExpose({ open })
</script>

View File

@@ -0,0 +1,84 @@
<template>
<!-- 案例库 -->
<div class="default-main">
<TableHeader ref="TableHeaderRef" datePicker>
<template #operation>
<el-button icon="el-icon-Plus" type="primary" @click="addUser">新增</el-button>
</template>
</TableHeader>
<Table ref="tableRef"></Table>
<!-- 弹框 -->
<PopupEdit ref="popupEditRef" />
</div>
</template>
<script setup lang="ts">
import { onMounted, ref, provide } from 'vue'
import TableStore from '@/utils/tableStore'
import TableHeader from '@/components/table/header/index.vue'
import Table from '@/components/table/index.vue'
import PopupEdit from './components/form.vue'
defineOptions({
name: 'database/case'
})
const popupEditRef = ref()
const TableHeaderRef = ref()
const tableStore = new TableStore({
url: '/user-boot/dept/deptTree',
method: 'POST',
column: [
{ title: '电能质量事件名称', field: 'name' },
{
title: '发生事件',
field: 'name1'
},
{
title: '发生地点',
field: 'name2'
},
{
title: '处理措施',
field: 'name3'
},
{
title: '治理效果',
field: 'name4'
}
],
loadCallback: () => {
tableStore.table.data = [
{
name: '测试名称',
name1: 'xxx',
name2: 'XXX',
name3: '1月',
name4: '单体系统',
name5: '1'
},
{
name: '测试名称',
name1: 'xxx',
name2: 'XXX',
name3: '1月',
name4: '单体系统',
name5: '0'
}
]
}
})
// 弹框
const addUser = () => {
popupEditRef.value.open('新增算法')
}
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
</script>
<style lang="scss"></style>

View File

@@ -0,0 +1,11 @@
<template>
<div> 标准</div>
</template>
<script setup lang='ts'>
import { ref, reactive } from 'vue'
</script>
<style lang="scss" scoped>
</style>

View File

@@ -0,0 +1,11 @@
<template>
<div> 模版</div>
</template>
<script setup lang='ts'>
import { ref, reactive } from 'vue'
</script>
<style lang="scss" scoped>
</style>

1
types/table.d.ts vendored
View File

@@ -57,6 +57,7 @@ declare global {
custom?: any custom?: any
// 值替换数据,如{open: '开'} // 值替换数据,如{open: '开'}
replaceValue?: any replaceValue?: any
effect?: any
// 时间格式化 // 时间格式化
timeFormat?: string timeFormat?: string
// 开关控制 // 开关控制

View File

@@ -24,20 +24,22 @@ export default defineConfig({
proxy: { proxy: {
'/api': { '/api': {
// target: 'http://10.95.53.49:10215', //海南服务器ip // target: 'http://10.95.53.49:10215', //海南服务器ip
target: 'http://10.118.135.128:10215', ///hsw // target: 'http://10.118.135.128:10215', ///hsw
target: 'http://192.168.1.122:10215', ///hsw
// target: 'http://108c3dfb.r18.cpolar.top', ///hsw
// target: 'http://10.119.65.152:10215', //数据中心 // target: 'http://10.119.65.152:10215', //数据中心
changeOrigin: true, changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '') //路径重写,把'/api'替换为'' rewrite: path => path.replace(/^\/api/, '') //路径重写,把'/api'替换为''
}, },
'/api-docx': { '/api-docx': {
// 文件服务器地址 // 文件服务器地址
target: 'http://10.118.135.128:9009', target: 'http://192.168.1.22:9009',
changeOrigin: true, changeOrigin: true,
rewrite: path => path.replace(/^\/api-docx/, '') rewrite: path => path.replace(/^\/api-docx/, '')
}, },
'/map': { '/map': {
// target: 'http://10.95.53.49:8088', //海南服务器ip // target: 'http://10.95.53.49:8088', //海南服务器ip
target: 'http://192.168.1.125:8088', //hsw target: 'http://192.168.1.125:9009', //hsw
// target: 'http://192.168.1.125:8088', //数据中心 // target: 'http://192.168.1.125:8088', //数据中心
changeOrigin: true changeOrigin: true
} }