绘制技术监督页面 联调承载能力评估

This commit is contained in:
GGJ
2024-03-13 20:33:01 +08:00
parent 88ab8c2526
commit 7429e2270b
14 changed files with 1137 additions and 159 deletions

View File

@@ -114,3 +114,12 @@ export function uploadExcel(file: any, data: any) {
data: form
})
}
// 查询用户额定容量
export function getLineDetailData(data) {
return createAxios({
url: '/device-boot/line/getLineDetailData',
method: 'POST',
params: data
})
}

File diff suppressed because one or more lines are too long

View File

@@ -1,22 +1,26 @@
<template>
<div class='nav-bar'>
<div v-if='config.layout.shrink && config.layout.menuCollapse' class='unfold'>
<Icon @click='onMenuCollapse' name='fa fa-indent' :color="config.getColorVal('menuActiveColor')"
size='18' />
<div class="nav-bar">
<div v-if="config.layout.shrink && config.layout.menuCollapse" class="unfold">
<Icon
@click="onMenuCollapse"
name="fa fa-indent"
:color="config.getColorVal('menuActiveColor')"
size="18"
/>
</div>
<span class='nav-bar-title'>电能质量数据监测云平台</span>
<span class="nav-bar-title">{{ getTheme.name }}</span>
<NavMenus />
</div>
</template>
<script setup lang='ts'>
<script setup lang="ts">
import { useConfig } from '@/stores/config'
import NavTabs from '@/layouts/admin/components/navBar/tabs.vue'
import NavMenus from '../navMenus.vue'
import { showShade } from '@/utils/pageShade'
const config = useConfig()
const getTheme = JSON.parse(window.localStorage.getItem('getTheme') as string)
const onMenuCollapse = () => {
showShade('ba-aside-menu-shade', () => {
config.setLayout('menuCollapse', true)
@@ -25,7 +29,7 @@ const onMenuCollapse = () => {
}
</script>
<style scoped lang='scss'>
<style scoped lang="scss">
.nav-bar {
display: flex;
align-items: center;
@@ -37,7 +41,7 @@ const onMenuCollapse = () => {
color: v-bind('config.getColorVal("headerBarTabColor")');
font-size: 24px;
margin-left: 10px;
font-weight: 700
font-weight: 700;
}
:deep(.nav-tabs) {
@@ -68,7 +72,7 @@ const onMenuCollapse = () => {
color: v-bind('config.getColorVal("headerBarTabActiveColor")');
.close-icon {
color: v-bind('config.getColorVal("headerBarTabActiveColor")') !important;;
color: v-bind('config.getColorVal("headerBarTabActiveColor")') !important;
}
}
@@ -77,7 +81,7 @@ const onMenuCollapse = () => {
background-color: v-bind('config.getColorVal("headerBarHoverBackground")');
.close-icon {
color: v-bind('config.getColorVal("headerBarTabActiveColor")') !important;;
color: v-bind('config.getColorVal("headerBarTabActiveColor")') !important;
}
}
}

View File

@@ -8,12 +8,34 @@
</div>
</template>
<div :style="`height: calc(${height} / 2 - 117px);overflow-y: auto`">
<el-form :model="form" label-width="auto" style="max-width: 500px; margin: auto">
<el-form-item label="变压器接线方式">
<el-input v-model="form.name" />
<el-form :model="form" label-width="150px" style="max-width: 500px; margin: auto">
<el-form-item label="接线类型">
<el-select v-model="form.ptType" collapse-tags placeholder="请选择接线类型">
<el-option
v-for="item in connection"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="连接方式" v-if="form.ptType == 0">
<el-select
v-model="form.connectionMode"
clearable
collapse-tags
placeholder="请选择连接方式"
>
<el-option v-for="item in method" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="功率因数">
<el-select v-model="form.k" clearable collapse-tags placeholder="请选择功率因数">
<el-option v-for="item in factor" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="电压等级">
<el-select v-model="form.level" clearable collapse-tags placeholder="请选择电压等级">
<el-select v-model="form.scale" clearable collapse-tags placeholder="请选择电压等级">
<el-option
v-for="item in levelList"
:key="item.id"
@@ -23,10 +45,10 @@
</el-select>
</el-form-item>
<el-form-item label="供电设备容量(MVA)">
<el-input v-model="form.name" />
<el-input-number v-model="form.deviceCapacity" style="width: 100%;" :min="0" placeholder="请填入供电设备容量" />
</el-form-item>
<el-form-item label="最小短路容量(MVA)">
<el-input v-model="form.name" />
<el-input-number v-model="form.shortCapacity" style="width: 100%;" :min="0" placeholder="请填入最小短路容量" />
</el-form-item>
</el-form>
</div>
@@ -86,6 +108,35 @@ import { mainHeight } from '@/utils/layout'
const dictData = useDictData()
const height = mainHeight(80).height
const levelList = dictData.getBasicData('Dev_Voltage_Stand')
const connection: any = dictData.getBasicData('Dev_Connect')
const method = dictData.getBasicData('Connet_Group_Way')
const factor = [
{
name: 0.95,
id: 0.95
},
{
name: 0.96,
id: 0.96
},
{
name: 0.97,
id: 0.97
},
{
name: 0.98,
id: 0.98
},
{
name: 0.99,
id: 0.99
},
{
name: 1.0,
id: 1.0
}
]
const tableData = ref([
{
name: '谐波电流幅值(A)',
@@ -231,7 +282,14 @@ const column = ref([
width: '80px'
}
])
const form: any = ref({})
const form: any = ref({
ptType: '0',
connectionMode: '',
k: '1',
scale: '',
shortCapacity: '',
deviceCapacity: ''
})
const pieCharts = ref({})
// 承载能力评估
const assess = () => {

View File

@@ -27,18 +27,11 @@
<div v-loading="loading">
<el-descriptions class="mb10" title="基础数据" :column="2" size="" border>
<el-descriptions-item label="电压等级" label-align="center" width="25%">
12
</el-descriptions-item>
<el-descriptions-item label="额定容量" label-align="center" width="25%">
12
</el-descriptions-item>
<el-descriptions-item label="待评估用户" label-align="center" width="25%">
<el-select
v-model="user"
placeholder="请选择待评估用户"
size="small"
clearable
filterable
style="width: 240px"
value-key="id"
@@ -55,24 +48,25 @@
<el-descriptions-item label="拟接入光伏容量(MVA)" label-align="center" width="25%">
{{ userData?.protocolCapacity }}
</el-descriptions-item>
<el-descriptions-item label="电压等级" label-align="center" width="25%">
{{ voltageLevelArr.filter(item => item.id === userData?.voltage)[0]?.name }}
</el-descriptions-item>
<el-descriptions-item label="额定容量(MVA)" label-align="center" width="25%">
{{ lineList?.standardCapacity }}
</el-descriptions-item>
</el-descriptions>
<el-tabs v-model="activeName" class="mb10" :style="`height: calc(${tabsHeight} / 2 + 100px)`">
<el-tab-pane label="有功功率" name="1" class="mt10">
<MyEChart v-if="activeName == '1'" :options="options1" />
<MyEChart :options="options1" />
</el-tab-pane>
<el-tab-pane label="无功功率" name="2">
<MyEChart v-if="activeName == '2'" :options="options2" />
<MyEChart :options="options2" />
</el-tab-pane>
<el-tab-pane label="谐波电流幅值" name="3">
<MyEChart v-if="activeName == '3'" :options="options3" />
<MyEChart :options="options3" />
</el-tab-pane>
<el-tab-pane label="首端电压模型参数" name="4">
<vxe-table
v-if="activeName == '4'"
height="auto"
v-bind="defaultAttribute"
:data="voltageList"
>
<vxe-table height="auto" v-bind="defaultAttribute" :data="voltageList">
<vxe-column field="name" title="项别模型参数"></vxe-column>
<vxe-column field="c" title="C"></vxe-column>
<vxe-column field="a" title="a"></vxe-column>
@@ -82,7 +76,7 @@
</el-tabs>
<div class="bottomBox">
<el-row v-if="showAssess">
<el-col :span="16" :style="`height: calc(${tabsHeight} / 2 - 105px)`">
<el-col :span="16" :style="`height: calc(${tabsHeight} / 2 - 107px)`">
<vxe-table
style="flex: 1.5"
v-bind="defaultAttribute"
@@ -124,7 +118,7 @@
</el-col>
</el-row>
<el-button type="primary" icon="el-icon-Document" @click="assess" v-show="!loading">
<el-button type="primary" icon="el-icon-Document" @click="assess" v-show="showBtn">
承载能力评估
</el-button>
</div>
@@ -153,7 +147,8 @@ import {
queryCarryCapacityQData,
queryCarryCapacityIData,
carryCapacityCal,
getExcelTemplate
getExcelTemplate,
getLineDetailData
} from '@/api/advance-boot/bearingCapacity'
import { useDictData } from '@/stores/dictData'
const monitoringPoint = useMonitoringPoint()
@@ -163,6 +158,7 @@ const dictData = useDictData()
const datePickerRef = ref()
const height = mainHeight(80).height
const tabsHeight = mainHeight(260).height
const voltageLevelArr = dictData.getBasicData('Dev_Voltage_Stand')
const tableData = ref([
{
name: '配变首端电压',
@@ -195,9 +191,12 @@ const tableData = ref([
])
const voltageList: any = ref([])
const showAssess = ref(false)
const loading = ref(false)
const showBtn = ref(false)
const flag = ref(true)
const loading = ref(true)
const user = ref('')
const userList: any = ref([])
const lineList: any = ref([])
const options1 = ref({})
const options2 = ref({})
const options3 = ref({})
@@ -233,34 +232,33 @@ const info = () => {
])[0]?.id
}).then(res => {
userList.value = res.data.records
user.value = userList.value[0] || {}
userData.value = res.data.records[0] || {}
})
setTimeout(() => {
onSubmit()
}, 100)
}
// 查询
const onSubmit = async () => {
if (dotList.value.level != 6) {
return ElMessage.error('请选择线路')
return ElMessage.warning('请选择线路')
}
loading.value = true
let data: any = []
let form = {
// endTime: datePickerRef.value.timeValue[1],
// lineId: dotList.value.id,
// startTime: datePickerRef.value.timeValue[0],
lineId: '086c7774e30839d30fdfb0544bf776de',
startTime: '2024-02-05',
endTime: '2024-02-11',
endTime: datePickerRef.value.timeValue[1],
lineId: dotList.value.id,
startTime: datePickerRef.value.timeValue[0],
userId: dictData.state.area[0].id
}
Promise.all([queryCarryCapacityData(form), queryCarryCapacityQData(form), queryCarryCapacityIData(form)]).then(
res => {
// 有功功率
options1.value = {}
options2.value = {}
options3.value = {}
voltageList.value = []
showBtn.value = false
Promise.all([queryCarryCapacityData(form), queryCarryCapacityQData(form), queryCarryCapacityIData(form)])
.then(res => {
// 有功功率
stringMap.value = res[0].data.stringMap
p_βminMap.value = res[0].data.p_βminMap
q_βminMap.value = res[1].data.q_βminMap
@@ -276,10 +274,12 @@ const onSubmit = async () => {
setEChart(1, res[0].data.data)
setEChart(2, res[1].data.data)
setEChart(3, res[2].data.data)
showBtn.value = true
loading.value = false
}
)
})
.catch(err => {
loading.value = false
})
}
// 用户变化
const userChange = e => {
@@ -348,6 +348,9 @@ const setEChart = (val: any, data: any) => {
// 承载能力评估
const assess = () => {
if (dotList.value.level != 6) {
return ElMessage.warning('请选择线路')
}
let ChartsList = [
{
name: '安全',
@@ -371,17 +374,17 @@ const assess = () => {
}
]
carryCapacityCal({
startTime: '2024-02-05', //修改
endTime: '2024-02-11', //修改
endTime: datePickerRef.value.timeValue[1],
lineId: dotList.value.id,
startTime: datePickerRef.value.timeValue[0],
userId: userData.value.userId, //dictData.state.area[0].id,
i_βmax: i_βmax.value,
lineId: '086c7774e30839d30fdfb0544bf776de', //修改
p_βminMap: p_βminMap.value,
q_βminMap: q_βminMap.value,
s_T: 200, //修改
s_pv: 200, //修改
scale: '220', //修改
stringMap: stringMap.value,
userId: '49d45dc6390690874b5df064deec56c7'
s_T: lineList.value.standardCapacity,
s_pv: userData.value.protocolCapacity,
scale: userData.value.voltage,
stringMap: stringMap.value
}).then(res => {
tableData.value[0][`level` + res.data.utlevel] = 1
tableData.value[1][`level` + res.data.pfTLevel] = 1
@@ -434,7 +437,7 @@ const assess = () => {
const exportTemplate = () => {
getExcelTemplate().then(res => {
let blob = new Blob([res], {
type: "application/vnd.ms-excel;charset=UTF-8",
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
const url = window.URL.createObjectURL(blob)
@@ -450,7 +453,7 @@ const exportTemplate = () => {
// 离线导入
const choose = (e: any) => {
if (dotList.value.level != 6) {
return ElMessage.error('请选择线路')
return ElMessage.warning('请选择线路')
}
let form = {
endTime: datePickerRef.value.timeValue[1],
@@ -463,8 +466,18 @@ const choose = (e: any) => {
})
}
const handleNodeClick = (data: any, node: any) => {
console.log('🚀 ~ handleNodeClick ~ data:', data)
lineList.value = {}
dotList.value = data
if (data.level == 6) {
getLineDetailData({ id: data.id }).then((res: any) => {
lineList.value = res.data
})
}
if (flag.value) {
onSubmit()
flag.value = false
}
}
</script>
<style lang="scss" scoped>

View File

@@ -3,11 +3,11 @@
<div v-show="addedShow">
<TableHeader datePicker ref="TableHeaderRef">
<template #select>
<el-form-item label="用户类型">
<el-form-item label="评估类型">
<el-select
v-model="tableStore.table.params.userType"
v-model="tableStore.table.params.evaluateType"
clearable
collapse-tagsplaceholder="请选择用户类型"
placeholder="请选择评估类型"
>
<el-option v-for="item in uesrList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
@@ -135,7 +135,13 @@ const tableStore = new TableStore({
}
},
{ field: 'lineName', title: '配变台区' },
{ field: 'evaluateType', title: '评估类型' },
{
field: 'evaluateType',
title: '评估类型',
formatter: (row: any) => {
return uesrList.filter(item => item.id == row.cellValue)[0].name
}
},
{ field: 'userName', title: '预评估用户' },
{
@@ -143,15 +149,16 @@ const tableStore = new TableStore({
title: '评估结果',
formatter: (row: any) => {
// 1-安全2-III级预警3-II级预警4-I 级预警,5-禁止接入
return row.reslutLevel == 1
return row.cellValue == 1
? '合格'
: row.reslutLevel == 2
: row.cellValue == 2
? 'III级预警'
: row.reslutLevel == 3
: row.cellValue == 3
? 'II级预警'
: row.reslutLevel == 4
: row.cellValue == 4
? 'I 级预警'
: row.reslutLevel == 5
: row.cellValue == 5
? '禁止接入'
: ''
}
@@ -198,7 +205,7 @@ const tableStore = new TableStore({
loadCallback: () => {}
})
tableStore.table.params.userType = ''
tableStore.table.params.evaluateType = ''
tableStore.table.params.userId = dictData.state.area[0].id
provide('tableStore', tableStore)

View File

@@ -7,7 +7,7 @@
<el-select
v-model="tableStore.table.params.userType"
clearable
collapse-tagsplaceholder="请选择用户类型"
placeholder="请选择用户类型"
>
<el-option v-for="item in uesrList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
@@ -27,7 +27,7 @@
<el-select
v-model="form.userType"
clearable
collapse-tagsplaceholder="请选择用户类型"
placeholder="请选择用户类型"
@change="useChange"
>
<el-option v-for="item in uesrList" :key="item.id" :label="item.name" :value="item.id" />
@@ -153,7 +153,7 @@ const tableStore = new TableStore({
}
},
{ field: 'Area', title: '所属区域' },
{ field: 'area', title: '所属区域' },
{
field: 'voltage',
title: '电压等级(V)',

View File

@@ -0,0 +1,486 @@
<template>
<el-dialog v-model="add" title="问题新增" width="50%" :before-close="handleClose">
<el-divider content-position="left">第一步 基本信息填报</el-divider>
<el-form :inline="true" ref="ruleForm" :rules="rules" :model="addData">
<el-form-item label="所属单位">
<Area ref="areaRef" v-model="addData.orgName" disabled />
</el-form-item>
<el-form-item label="问题来源" prop="problemSources">
<el-select v-model="addData.problemSources" clearable placeholder="请选择问题来源">
<el-option
v-for="item in problemData"
:key="item.code"
:label="item.name"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="问题名称" prop="problemName">
<el-input v-model="addData.problemName" clearable placeholder="请填写问题名称"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="nextStep">下一步</el-button>
</div>
</template>
</el-dialog>
<!-- 新增第二步(在线监测超标问题新增) -->
<el-dialog title="在线监测超标问题新增" v-model="onlineAdd" width="70%" :before-close="handleClose">
<el-divider content-position="left">第二步 选择问题测点(请选择需要生成问题的告警监测点)</el-divider>
<el-form :inline="true" class="form">
<el-form-item label="告警时间">
<DatePicker ref="DateRef" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-Search" @click="searchOnLine">查询</el-button>
</el-form-item>
</el-form>
<vxe-table v-bind="defaultAttribute" v-loading="isLoading1" height="350" ref="xTableRef" :data="onlineAddData">
<vxe-column type="checkbox" width="60"></vxe-column>
<vxe-column field="measurementPointName" title="监测点名称"></vxe-column>
<vxe-column field="alarmType" title="告警类型" :formatter="formatter"></vxe-column>
<vxe-column field="alarmLastTime" title="告警持续时间(s)"></vxe-column>
</vxe-table>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="previouStep">上一步</el-button>
<el-button type="primary" class="ml20" @click="OnlineMonitoring">生成问题</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
<!-- 新增第二步(普测超标问题新增) -->
<el-dialog title="普测超标问题新增" v-model="ordinaryAdd" width="70%" :before-close="handleClose">
<el-divider content-position="left">
第二步 选择普测计划及问题类型(请查找需要生成问题的普测计划并选择一条需要生成问题的测试线路)
</el-divider>
<el-form :model="ordinaryA" :inline="true" class="form">
<el-form-item>
<Area v-model="ordinaryA.orgNo"></Area>
</el-form-item>
<el-form-item label="普测结果上传时间">
<el-date-picker
v-model="ordinaryA.planStartTime"
type="month"
format="YYYY-MM"
value-format="YYYY-MM-DD"
placeholder="选择月"
@change="queryPlanName"
></el-date-picker>
</el-form-item>
<el-form-item label="普测计划名称">
<el-select v-model="ordinaryA.planName" clearable placeholder="请选择">
<el-option
v-for="item in planNameList"
:key="item.planName"
:label="item.planName"
:value="item.planName"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-Search" @click="searchFnExcessive">查询</el-button>
</el-form-item>
</el-form>
<vxe-table
v-bind="defaultAttribute"
v-loading="isLoading2"
height="350"
ref="xTableRef"
:data="ordinaryAddData"
>
<vxe-column type="checkbox" width="60"></vxe-column>
<vxe-column field="voltageLevel" title="变电站电压等级(kV)"></vxe-column>
<vxe-column field="subName" title="变电站名称" :formatter="formatter"></vxe-column>
</vxe-table>
<el-divider content-position="left">第三步 选择问题指标</el-divider>
<el-form :model="ordinaryA" :rules="rules" ref="GeneralSurvey" :inline="true" class="form">
<el-form-item label="稳态指标" prop="steadyState">
<el-checkbox-group v-model="ordinaryA.steadyState">
<el-checkbox v-for="(item, ind) in steadyStateList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<br />
<el-form-item label="暂态指标" prop="transientIndicators">
<el-checkbox-group v-model="ordinaryA.transientIndicators">
<el-checkbox v-for="(item, ind) in transientIndicatorsList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="previouStep">上一步</el-button>
<el-button type="primary" class="ml20" @click="GeneralSurvey">生成问题</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
<!-- 新增第二步(运维异常问题新增) -->
<el-dialog title="运维异常问题新增" v-model="operationAdd" width="70%" :before-close="handleClose">
<el-divider content-position="left">
第二步 选择普测计划及问题类型(请查找需要生成问题的普测计划并选择一条需要生成问题的测试线路)
</el-divider>
<el-form :model="operationAdddata" :inline="true" :rules="rules">
<el-form-item label="异常设备名称:" prop="abnormalDevName">
<el-input
v-model="operationAdddata.abnormalDevName"
clearable
placeholder="请填写异常设备名称"
></el-input>
</el-form-item>
<el-form-item label="发现异常时间:" prop="abnormalDevTime">
<el-date-picker
v-model="operationAdddata.abnormalDevTime"
type="date"
placeholder="请选择发现异常时间"
value-format="YYYY-MM-DD"
></el-date-picker>
</el-form-item>
<br />
<el-form-item label="设备异常描述:" style="margin-top: 10px" prop="eventDescription">
<el-input
type="textarea"
style="width: 400px"
:autosize="{ minRows: 2, maxRows: 4 }"
placeholder="请填写设备异常描述"
v-model="operationAdddata.eventDescription"
></el-input>
</el-form-item>
<el-divider content-position="left">第三步 选择问题指标</el-divider>
<el-form-item label="稳态指标:" prop="steadyState">
<el-checkbox-group v-model="operationAdddata.steadyState">
<el-checkbox v-for="(item, ind) in steadyStateList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<br />
<el-form-item label="暂态指标:" prop="transientIndicators">
<el-checkbox-group v-model="operationAdddata.transientIndicators">
<el-checkbox v-for="(item, ind) in transientIndicatorsList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="previouStep">上一步</el-button>
<el-button type="primary" class="ml20" @click="generateAbnormal">生成问题</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
<!-- 新增第二步(用户投诉问题新增) -->
<el-dialog title="用户投诉问题新增" v-model="userAdd" width="70%" :before-close="handleClose">
<el-divider content-position="left">第二步 选择投诉用户(请精确查找用户户号并选中投诉用户)</el-divider>
<el-form :model="userA" :inline="true" :rules="rules">
<el-form-item label="用户类型:">
<el-select v-model="userA.userType" placeholder="请选择用户类型">
<el-option
v-for="item in userTypeData"
:key="item.code"
:label="item.name"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户编号:">
<el-input v-model="userA.id" clearable placeholder="请输入用户编号"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-Search" @click="searchFnComplain">查询</el-button>
</el-form-item>
<vxe-table
v-bind="userAddDataList"
v-loading="isLoading3"
height="350"
ref="xTableRef"
:data="ordinaryAddData"
>
<vxe-column type="checkbox" width="60"></vxe-column>
<vxe-column field="id" title="用户编号"></vxe-column>
<vxe-column field="name" title="用户名称"></vxe-column>
<vxe-column
v-if="showUserType"
field="electricityType"
title="用电类别/电源类别"
:formatter="formatter"
></vxe-column>
<vxe-column v-else field="powerCategory" title="用电类别/电源类别" :formatter="formatter"></vxe-column>
</vxe-table>
<el-divider content-position="left">第三步 填写投诉详情</el-divider>
<el-form-item label="投诉内容:" style="margin-top: 10px" prop="complaintContent">
<el-input
type="textarea"
style="width: 400px"
:autosize="{ minRows: 2, maxRows: 4 }"
placeholder="请输入内容"
v-model="userAdddata.complaintContent"
></el-input>
</el-form-item>
<br />
<el-form-item label="投诉时间:" style="margin-top: 10px" prop="complaintTime">
<el-date-picker
v-model="userAdddata.complaintTime"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-divider content-position="left">第四步 选择问题指标</el-divider>
<el-form-item label="稳态指标:" prop="steadyState">
<el-checkbox-group v-model="userAdddata.steadyState">
<el-checkbox v-for="(item, ind) in steadyStateList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<br />
<el-form-item label="暂态指标:" prop="transientIndicators">
<el-checkbox-group v-model="userAdddata.transientIndicators">
<el-checkbox v-for="(item, ind) in transientIndicatorsList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="previouStep">上一步</el-button>
<el-button type="primary" class="ml20" @click="userAddProblem">生成问题</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { useDictData } from '@/stores/dictData'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import Area from '@/components/form/area/index.vue'
import DatePicker from '@/components/form/datePicker/index.vue'
const emit = defineEmits(['handleClose', 'onSubmit'])
const dictData = useDictData()
const problemData = dictData.getBasicData('Problem_Sources')
const alarmList = dictData.getBasicData('alarm_Type')
const Voltage = dictData.getBasicData('Dev_Voltage')
const userTypeData = dictData.getBasicData('User_Category')
// const steadyStateList = dictData.getBasicData('Steady_Indicator')
// const transientIndicatorsList = dictData.getBasicData('Transient_Indicators')
const steadyStateList = [
{
name: '负序电压不平衡度',
id: '137d08f4f29d4f781b0d2a8fabbd3c5c',
code: 'Negative_Voltage',
value: null,
sort: 5
},
{
name: '间谐波电压',
id: '218da5cb747413d4cf92e2b37651e13f',
code: 'Interhar_Voltage',
value: null,
sort: 4
},
{ name: '负序电流', id: '396c27f91281fbd41f93fe034038aa52', code: 'Neg_Current', value: null, sort: 6 },
{ name: '频率偏差', id: '74a3943e802ed7fa4252887788682818', code: 'Fre_Deviation', value: null, sort: 0 },
{ name: '电压偏差', id: '8ff1545d3bacee9c0f834901cebcbd23', code: 'Voltage_Dev', value: null, sort: 1 },
{ name: '谐波电流', id: '9177bf292f22f8c27f1ceeeceaea7000', code: 'Har_Current', value: null, sort: 3 },
{
name: '电压波动与闪变',
id: '9267dfbe8a6eac561e29d8377e159c3c',
code: 'Voltage_Fluc',
value: null,
sort: 7
},
{ name: '谐波电压', id: 'ef42e7cb71b667bb06a5c10e1bdb27de', code: 'Har_Voltage', value: null, sort: 2 }
]
const transientIndicatorsList = [
{ name: '电压暂降', id: '2eee1cb8c62b8e1bef3992e3f4d0c95b', code: 'Voltage_Sag', value: null, sort: 0 },
{ name: '短时中断', id: '9ab8c44a757f3c5e86f4ac10905496a8', code: 'Interruptions', value: null, sort: 2 },
{ name: '电压暂升', id: 'a25ff36c30155699288256960bc22eb9', code: 'Voltage_Rises', value: null, sort: 1 }
]
const add = ref(true)
const onlineAdd = ref(false)
const isLoading1 = ref(false)
const isLoading2 = ref(false)
const isLoading3 = ref(false)
const showUserType = ref(false)
const ordinaryAdd = ref(false)
const userAdd = ref(false)
const operationAdd = ref(false)
const ruleForm = ref()
const DateRef = ref()
const xTableRef = ref()
const addData = ref({
orgName: dictData.state.area[0].id,
problemSources: '',
problemName: '',
orgNo: ''
})
const ordinaryA = ref({
orgNo: '',
planName: '',
planStartTime: '',
uploadTime: '',
name: '',
steadyState: [],
transientIndicators: []
})
const operationAdddata = ref({
abnormalDevName: '',
eventDescription: '',
abnormalDevTime: '',
steadyState: [],
transientIndicators: []
})
const userA = ref({
userType: 'Elec_User',
id: ''
})
const userAdddata = ref({
complaintContent: '',
complaintTime: '',
steadyState: [],
transientIndicators: []
})
const planNameList: any = ref([])
const onlineAddData = ref([])
const userAddDataList = ref([])
const ordinaryAddData = ref([])
const rules = {
problemName: [{ required: true, message: '请输入问题名称', trigger: 'blur' }],
complaintContent: [{ required: true, message: '请输入投诉内容', trigger: 'blur' }],
complaintTime: [{ required: true, message: '请选择时间', trigger: 'change' }],
problemSources: [{ required: true, message: '情选择问题来源', trigger: 'change' }],
abnormalDevTime: [{ required: true, message: '请选择时间', trigger: 'change' }],
transientIndicators: [{ required: true, message: '请选择暂态指标', trigger: 'change' }],
steadyState: [{ required: true, message: '请选择稳态指标', trigger: 'change' }],
eventDescription: [{ required: true, message: '请输入设备异常描述', trigger: 'blur' }],
abnormalDevName: [{ required: true, message: '请输入问题名称', trigger: 'blur' }]
}
// 关闭
const handleClose = () => {
emit('handleClose')
emit('onSubmit')
}
// 下一步
const nextStep = () => {
ruleForm.value.validate((valid: any) => {
if (valid) {
if (addData.value.problemSources == 'Online') {
add.value = false
onlineAdd.value = true
setTimeout(() => {
DateRef.value.setTimeOptions([{ label: '月份', value: 3 }])
searchOnLine()
}, 0)
} else if (addData.value.problemSources == 'General') {
ordinaryA.value.orgNo = dictData.state.area[0].id
add.value = false
ordinaryAdd.value = true
ordinaryA.value.planStartTime = window.XEUtils.toDateString(new Date().getTime(), 'yyyy-MM') + '-01'
queryPlanName()
setTimeout(() => {
searchFnExcessive()
}, 0)
} else if (addData.value.problemSources == 'User_Complaints') {
add.value = false
userAdd.value = true
searchFnComplain()
} else if (addData.value.problemSources == 'Dev_Exception') {
add.value = false
operationAdd.value = true
}
}
})
}
// 上一步
const previouStep = () => {
onlineAdd.value = false
ordinaryAdd.value = false
userAdd.value = false
operationAdd.value = false
add.value = true
}
// 在线监测超标问题新增
const OnlineMonitoring = () => {
// xTableRef.value.getCheckboxRecords()
}
// 在线监测告警查询
const searchOnLine = () => {
// isLoading1.value = true
}
// 普通监测超标问题新增
const queryPlanName = () => {}
const searchFnExcessive = () => {}
// 普测超标生成问题
const GeneralSurvey = () => {}
const formatter = (row: any) => {
if (row.column.field == 'alarmType') {
return alarmList.filter((item: any) => item.id == row.cellValue)[0]?.name
} else if (row.column.field == 'voltageLevel') {
return Voltage.filter((item: any) => item.id == row.cellValue)[0]?.name
} else if (row.column.field == 'electricityType') {
return dictData.getBasicData('Ele_Class').filter((item: any) => item.id == row.cellValue)[0]?.name
} else if (row.column.field == 'powerCategory') {
return dictData.getBasicData('Power_Category').filter((item: any) => item.id == row.cellValue)[0]?.name
} else {
return row.cellValue
}
}
// 运维异常问题新增
const generateAbnormal = () => {}
//用户投诉问题
const searchFnComplain = () => {
// isLoading3.value = true
// userAddDataList.value=[]
// if (userA.value.userType == 'Elec_User') {
// // 发电用户
// showUserType.value = false
// getGenerateElectricityUserList({ id: userA.value.id }).then(res => {
// this.userAddDataList = res.data
// })
// } else {
// showUserType.value = true
// // 用电用户
// getPowerUtilizationUserList({ id: userA.value.id }).then(res => {
// this.userAddDataList = res.data
// })
// }
// this.isLoading3 = false
}
// 用户投诉新增
const userAddProblem = () => {}
onMounted(() => {})
</script>
<style lang="scss" scoped></style>

View File

@@ -43,7 +43,7 @@
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Plus" type="primary">新增</el-button>
<el-button icon="el-icon-Plus" type="primary" @click="add">新增</el-button>
<el-button icon="el-icon-EditPen" type="primary">填报</el-button>
<el-button icon="el-icon-Delete" type="primary">删除</el-button>
<el-button icon="el-icon-SuccessFilled" type="primary">归档</el-button>
@@ -51,6 +51,8 @@
</template>
</TableHeader>
<Table ref="tableRef" />
<!-- 新增 -->
<NewlyAdd v-if="showNewlyAdded" @handleClose="handleClose" @onSubmit="onSubmit" />
</template>
<script setup lang="ts">
import { ref, onMounted, provide, nextTick } from 'vue'
@@ -60,7 +62,7 @@ import TableHeader from '@/components/table/header/index.vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { mainHeight } from '@/utils/layout'
import { useDictData } from '@/stores/dictData'
import NewlyAdd from './NewlyAdd.vue'
const dictData = useDictData()
const uploadData = [
{
@@ -75,11 +77,10 @@ const uploadData = [
}
]
const dialogVisible = ref(false)
const title = ref('')
const showNewlyAdded = ref(false)
const TableHeaderRef = ref()
const ruleFormRef = ref()
const tableStore = new TableStore({
const tableStore:any = new TableStore({
url: '/system-boot/area/areaSelect',
publicHeight: 65,
method: 'POST',
@@ -141,4 +142,15 @@ provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
// 新增
const add = () => {
showNewlyAdded.value = true
}
const onSubmit = () => {
console.log(123)
}
// 关闭弹框
const handleClose = () => {
showNewlyAdded.value = false
}
</script>

View File

@@ -1,6 +1,4 @@
<template>
<div>
<div>
<TableHeader area datePicker ref="TableHeaderRef">
<template #select>
<el-form-item label=" 计划状态">
@@ -15,14 +13,106 @@
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Plus" type="primary">新增计划</el-button>
<el-button icon="el-icon-Plus" type="primary" @click="add">新增计划</el-button>
<el-button icon="el-icon-Stamp" type="primary">提交审核</el-button>
<el-button icon="el-icon-Download" type="primary">导出</el-button>
</template>
</TableHeader>
<Table ref="tableRef" />
<!-- 新增弹窗 -->
<el-dialog :title="title" v-model="planAddition" width="950px" :before-close="cancelFn">
<el-row :gutter="20">
<el-col :span="10">
<el-divider content-position="left">基本信息</el-divider>
<el-form :inline="true" :model="formdata" :disabled="viewDetails" label-width="120px">
<el-form-item label="普测负责单位:">
<el-input v-model="formdata.orgName" class="formW" disabled></el-input>
</el-form-item>
<el-form-item label="计划开始时间:">
<el-date-picker
v-model.trim="formdata.planStartTime"
type="date"
style="width: 240px"
placeholder="选择计划开始时间"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item label="计划结束时间:">
<el-date-picker
v-model.trim="formdata.planEndTime"
type="date"
style="width: 240px"
placeholder="选择计划结束时间"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item label="普测计划编号:">
<el-input
:disabled="title == '普测计划修改'"
v-model="formdata.planNo"
class="formW"
placeholder="请输入普测计划编号"
></el-input>
</el-form-item>
<el-form-item label="计划名称:">
<el-input v-model="formdata.planName" placeholder="请输入计划名称" class="formW"></el-input>
</el-form-item>
<el-form-item label="测试负责人:">
<el-input v-model="formdata.leader" placeholder="请输入测试负责人" class="formW"></el-input>
</el-form-item>
</el-form>
</el-col>
<el-col :span="14">
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">添加电站</el-divider>
<!-- <div class="mb10" style="display: flex" v-if="!viewDetails">
<el-input
v-model="input"
placeholder="请输入电站数"
class="formW"
@input="handleEdit"
class="mr10"
></el-input>
<el-button
type="primary"
:disabled="!input.length > 0"
icon="el-icon-circle-check"
size="small"
@click="Tick"
>
按配置勾选
</el-button>
</div>
<el-tree
:data="treeData"
show-checkbox
node-key="id"
style="overflow-y: auto; height: 490px"
default-expand-all
:props="defaultProps"
:check-strictly="true"
ref="tree"
></el-tree> -->
</el-col>
</el-row>
<!-- <el-divider
v-if="title == '计划详情' && formdata.status == 2 && formdata.status == 3"
content-position="left"
style="font-size: 18px; font-weight: bolder"
>
审核意见
</el-divider>
<el-input
v-if="title == '计划详情' && formdata.status == 2 && formdata.status == 3"
disabled
type="textarea"
:rows="2"
v-model="textarea"
></el-input> -->
<div slot="footer" style="display: flex; justify-content: center" v-if="!viewDetails">
<el-button type="primary" size="small" class="ml20" @click="submitFn">提交</el-button>
<el-button type="primary" size="small" class="ml20" @click="cancelFn">取消</el-button>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, onMounted, provide, nextTick } from 'vue'
@@ -57,8 +147,21 @@ const planstatus = [
label: '已发布'
}
]
const formdata = ref({
orgName: '',
orgNo: '',
planStartTime: '',
planEndTime: '',
planNo: '',
planName: '',
leader: '',
rgeneralSurveyPlanDetailAddParm: [],
subCount: '',
busCount: ''
})
const dialogVisible = ref(false)
const planAddition = ref(false)
const viewDetails = ref(false)
const TableHeaderRef = ref()
const title = ref('')
@@ -123,7 +226,26 @@ tableStore.table.params.searchValue = ''
tableStore.table.params.type = ''
provide('tableStore', tableStore)
// 新增计划
const add = () => {
title.value = '普测计划新增'
planAddition.value = true
}
// 提交
const submitFn = () => {}
// 取消
const cancelFn = () => {
planAddition.value = false
viewDetails.value = false
}
onMounted(() => {
tableStore.index()
})
</script>
<style scoped lang="scss">
.formW {
width: 240px;
}
</style>

View File

@@ -1,6 +1,4 @@
<template>
<div>
<div>
<TableHeader area ref="TableHeaderRef">
<template #select>
<el-form-item label="干扰源类型">
@@ -20,26 +18,60 @@
<el-form-item label="是否上传报告:">
<el-select v-model="tableStore.table.params.searchState" placeholder="请选择是否上传报告">
<el-option
v-for="item in process"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
<el-option v-for="item in process" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Plus" type="primary">新增</el-button>
<el-button icon="el-icon-Plus" type="primary" @click="add">新增</el-button>
<el-button icon="el-icon-Upload" type="primary">上传</el-button>
<el-button icon="el-icon-Sort" type="primary">关联</el-button>
<el-button icon="el-icon-Download" type="primary">导出</el-button>
</template>
</TableHeader>
<Table ref="tableRef" />
</div>
</div>
<!-- 新增 -->
<el-dialog title="未建档干扰用户新增" v-model="userAdd" width="50%">
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">基本信息</el-divider>
<el-form :inline="true" label-width="120px">
<el-form-item label="区域:">
<Area ref="areaRef" v-model="addData.orgNo" style="width: 240px" />
</el-form-item>
<el-form-item label="干扰源类型:">
<el-select v-model="addData.loadType" clearable collapse-tags style="width: 240px" placeholder="请选择">
<el-option
v-for="item in interferenceType"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源用户名称:">
<el-input
v-model="addData.userName"
clearable
style="width: 240px"
placeholder="请输入关键字"
></el-input>
</el-form-item>
<el-form-item label="建档时间:">
<el-date-picker
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
v-model="addData.recordTime"
type="datetime"
placeholder="选择日期时间"
></el-date-picker>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 30px">
<el-button type="primary" class="ml20" @click="config">确定</el-button>
<el-button type="primary" class="ml20" @click="userAdd = false">取消</el-button>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, onMounted, provide, nextTick } from 'vue'
@@ -47,11 +79,14 @@ import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import Area from '@/components/form/area/index.vue'
import { mainHeight } from '@/utils/layout'
import { useDictData } from '@/stores/dictData'
import { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity'
const dictData = useDictData()
const userAdd = ref(false)
const process = [
{
name: '是',
@@ -65,7 +100,13 @@ const process = [
const dialogVisible = ref(false)
const TableHeaderRef = ref()
const title = ref('')
const interferenceType = dictData.getBasicData('Interference_Source')
const addData = ref({
orgNo: dictData.state.area[0].id,
loadType: '',
userName: '',
recordTime: ''
})
const ruleFormRef = ref()
const tableStore = new TableStore({
@@ -142,6 +183,11 @@ tableStore.table.params.searchValue = ''
tableStore.table.params.type = ''
provide('tableStore', tableStore)
// 新增
const add = () => {
userAdd.value = true
}
onMounted(() => {
tableStore.index()
})

View File

@@ -0,0 +1,218 @@
<template>
<div>
<div>
<TableHeader datePicker ref="TableHeaderRef">
<template #select>
<el-form-item label="筛选数据">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择筛选数据"
></el-input>
</el-form-item>
</template>
</TableHeader>
<div class="box">
<MyEChart :options="options1" />
<MyEChart :options="options2" />
</div>
<Table ref="tableRef" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, provide, nextTick } from 'vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { mainHeight } from '@/utils/layout'
import { useDictData } from '@/stores/dictData'
import MyEChart from '@/components/echarts/MyEchart.vue'
import { info } from 'console'
const dictData = useDictData()
const dialogVisible = ref(false)
const TableHeaderRef = ref()
const title = ref('')
const options1 = ref({})
const options2 = ref({})
const ruleFormRef = ref()
const tableStore = new TableStore({
url: '/system-boot/area/areaSelect',
publicHeight: 345,
method: 'POST',
column: [
{ field: 'name', title: '事务名称' },
{ field: 'type', title: '事务类型' },
{ field: 'createUser', title: '创建人员' },
{ field: 'companyName', title: '创建部门' },
{ field: 'modifyUser', title: '处理人员' },
{ field: 'modifyTime', title: '处理时间' },
{ field: 'progressTime', title: '进行时间(天)' },
{ field: 'progress', title: '流程状态' },
{ field: 'alertType', title: '预警类型' },
{
title: '操作',
width: '180',
render: 'buttons',
buttons: [
{
name: 'edit',
title: '上传',
type: 'primary',
icon: 'el-icon-Plus',
render: 'basicButton',
click: row => {}
},
{
name: 'edit',
title: '查看',
type: '',
icon: 'el-icon-Plus',
render: 'basicButton',
click: async row => {}
}
]
}
],
loadCallback: () => {
tableStore.table.data = [
{
state: 2
}
]
}
})
tableStore.table.params.searchState = ''
tableStore.table.params.searchValue = ''
tableStore.table.params.type = ''
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
info()
})
//渲染图表
const info = () => {
options1.value = {
title: {
text: '商务类型',
x: 'center',
textStyle: {
fontWeight: 'normal'
}
},
xAxis: [
{
data: ['全部', '预警单', '告警单']
}
],
yAxis: [{}],
series: [
{
name: '数量',
type: 'bar',
barMaxWidth: 30, //最大宽度
data: [
{
value: 9,
id: ''
},
{
value: 4,
id: '0'
},
{
value: 5,
id: '1'
}
]
}
]
}
options2.value = {
title: {
text: '事务流程',
x: 'center',
textStyle: {
fontWeight: 'normal'
}
},
xAxis: [
{
data: [
'全部',
'开始',
'预/告警单下发',
'预/告警单反馈',
'现场测试',
'整改通知单下发',
'整改通知单反馈',
'完结'
]
}
],
yAxis: [{}],
series: [
{
name: '数量',
type: 'bar',
barMaxWidth: 30, //最大宽度
data: [
{
value: 9,
id: ''
},
{
value: 4,
id: '0'
},
{
value: 5,
id: '1'
},
{
value: 5,
id: '2'
},
{
value: 5,
id: '3'
},
{
value: 5,
id: '4'
},
{
value: 5,
id: '5'
},
{
value: 5,
id: '6'
}
]
}
]
}
}
// 新增
const add = () => {
title.value = '新增告警单'
dialogVisible.value = true
}
</script>
<style lang="scss" scoped>
.box {
height: 280px;
display: flex;
justify-content: space-between;
}
</style>

View File

@@ -1,7 +1,7 @@
<template>
<div class="default-main">
<el-tabs v-model="activeName" type="border-card">
<el-tab-pane label="概览" name="1"></el-tab-pane>
<el-tab-pane label="概览" name="1"><overview v-if="activeName == '1'"/></el-tab-pane>
<el-tab-pane label="技术监督管理" name="2"><technology v-if="activeName == '2'"/></el-tab-pane>
<el-tab-pane label="告警单策略管理" name="3">
<earlyWarning v-if="activeName == '3'"/>
@@ -12,6 +12,7 @@
</template>
<script setup lang="ts">
import overview from './components/overview.vue'
import technology from './components/technology.vue'
import earlyWarning from './components/earlyWarning.vue'
import { onMounted, reactive, ref, provide } from 'vue'

View File

@@ -125,6 +125,7 @@ onBeforeUnmount(() => {
})
getTheme().then(res => {
getThemeList.value = res.data
window.localStorage.setItem('getTheme', JSON.stringify(res.data))
})
const onSubmit = async (formEl: FormInstance | undefined) => {
if (!formEl) return