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

This commit is contained in:
GGJ
2024-03-12 11:16:54 +08:00
parent 3ba3016135
commit fd8742555f
24 changed files with 1898 additions and 242186 deletions

View File

@@ -1,5 +1,13 @@
import createAxios from '@/utils/request' import createAxios from '@/utils/request'
//承载能力评估用户查询
export function queyDetailUser(data) {
return createAxios({
url: '/advance-boot/carrycapacityuser/queyDetailUser',
method: 'post',
data
})
}
//承载能力评估用户新增 //承载能力评估用户新增
export function addUse(data) { export function addUse(data) {
return createAxios({ return createAxios({
@@ -13,7 +21,7 @@ export function updateUse(data) {
return createAxios({ return createAxios({
url: '/advance-boot/carrycapacityuser/update', url: '/advance-boot/carrycapacityuser/update',
method: 'post', method: 'post',
data data
}) })
} }
//承载能力评估用户批量删除 //承载能力评估用户批量删除
@@ -28,31 +36,81 @@ export function removeUse(data) {
export function carryCapacityTree() { export function carryCapacityTree() {
return createAxios({ return createAxios({
url: '/advance-boot/carrycapacity/carryCapacityTree', url: '/advance-boot/carrycapacity/carryCapacityTree',
method: 'get', method: 'GET'
}) })
} }
//承载能力评估策略初始化查询 //承载能力评估策略初始化查询
export function queyDetail() { export function queyDetail() {
return createAxios({ return createAxios({
url: '/advance-boot/carrycapacity/queyDetail', url: '/advance-boot/carrycapacity/queyDetail',
method: 'post', method: 'post'
}) })
} }
//承载能力评估策略初始化查询 //用户新增承载能力评估策略
export function addCarryc() { export function addCarryc(data) {
return createAxios({ return createAxios({
url: '/advance-boot/carrycapacity/add', url: '/advance-boot/carrycapacity/add',
method: 'post', method: 'post',
data
}) })
} }
//承载能力评估策略一键还原 //承载能力评估策略一键还原
export function restore() { export function restore() {
return createAxios({ return createAxios({
url: '/advance-boot/carrycapacity/restore', url: '/advance-boot/carrycapacity/restore',
method: 'post', method: 'post'
})
}
//承载能力评估数据查询-主页面
export function queryCarryCapacityData(data) {
return createAxios({
url: '/advance-boot/carrycapacity/queryCarryCapacityData',
method: 'post',
data
})
}
//承载能力评估数据查询-无功功率
export function queryCarryCapacityQData(data) {
return createAxios({
url: '/advance-boot/carrycapacity/queryCarryCapacityQData',
method: 'post',
data
})
}
//承载能力评估数据查询-谐波电流幅值
export function queryCarryCapacityIData(data) {
return createAxios({
url: '/advance-boot/carrycapacity/queryCarryCapacityIData',
method: 'post',
data
})
}
//承载能力评估
export function carryCapacityCal(data) {
return createAxios({
url: '/advance-boot/carrycapacity/carryCapacityCal',
method: 'post',
data
})
}
//导出数据集模板
export function getExcelTemplate() {
return createAxios({
url: '/advance-boot/carrycapacity/getExcelTemplate',
method: 'get',
responseType: 'blob'
})
}
//上传数据集
export function uploadExcel(file: any, data: any) {
let form = new FormData()
form.append('file', file)
form.append('lineId', data.lineId)
form.append('startTime', data.startTime)
form.append('endTime', data.endTime)
return createAxios({
url: '/advance-boot/carrycapacity/uploadExcel',
method: 'post',
data: form
}) })
} }

View File

@@ -140,3 +140,9 @@ export function checkUser(data: any) {
data: data data: data
}) })
} }
export function existMonitorDeptTree() {
return request({
url: '/user-boot/dept/existMonitorDeptTree',
method: 'post'
})
}

View File

@@ -9,11 +9,11 @@
<!-- switch --> <!-- switch -->
<el-switch <el-switch
v-if="field.render == 'switch'" v-if="field.render == 'switch'"
@change="onChangeField" @change="onChangeField(field, $event)"
:model-value="fieldValue.toString()" :model-value="fieldValue.toString()"
:loading="row.loading" :loading="row.loading"
active-value="1" :active-value="field.activeValue"
inactive-value="0" :inactive-value="field.inactiveValue"
/> />
<!-- image --> <!-- image -->
@@ -172,8 +172,10 @@ if (props.field.renderFormatter && typeof props.field.renderFormatter == 'functi
fieldValue.value = props.field.renderFormatter(props.row, props.field, fieldValue.value, props.column, props.index) fieldValue.value = props.field.renderFormatter(props.row, props.field, fieldValue.value, props.column, props.index)
} }
const onChangeField = (value: any) => { const onChangeField = (row: any, value: any) => {
TableStore.onTableAction('field-change', { value: value, ...props }) row.onChangeField && row.onChangeField(props.row, value)
// TableStore.onTableAction('field-change', { value: value, ...props })
} }
const onButtonClick = (btn: OptButton) => { const onButtonClick = (btn: OptButton) => {

View File

@@ -0,0 +1,322 @@
<template>
<div class="point-tree">
<div style="flex: 1; overflow: hidden">
<vxe-table
ref="tableRef"
:data="tree"
height="auto"
v-bind="defaultAttribute"
:tree-config="{ children: 'children', expandAll: true }"
>
<vxe-column field="name" align="left" title="部门" tree-node></vxe-column>
<vxe-column width="200" title="操作">
<template #default="{ row }">
<el-button type="primary" size="small" link @click="tactics(row.id, 0)">自动</el-button>
<el-button type="primary" size="small" link @click="tactics(row.id, 1)">手动</el-button>
<el-button type="primary" size="small" link @click="tactics(row.id, 2)">排除</el-button>
</template>
</vxe-column>
</vxe-table>
</div>
</div>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref, useAttrs } from 'vue'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { ElTree } from 'element-plus'
import { useDictData } from '@/stores/dictData'
import { existMonitorDeptTree } from '@/api/user-boot/user.ts'
import { useConfig } from '@/stores/config'
defineOptions({
name: 'pms/pointTree'
})
const emit = defineEmits(['tactics'])
const attrs = useAttrs()
const defaultProps = {
label: 'name',
value: 'id'
}
const dictData = useDictData()
const config = useConfig()
const tree = ref()
const treeRef = ref()
const loadData = () => {
let nodeKey = ''
tree.value = [
{
id: '5699e5916a18a6381e1ac92da5bd2628',
name: '国家电网公司',
pid: '0',
sort: 201,
code: '123456789',
specialType: null,
area: '0',
areaName: '中国',
state: 1,
type: 0,
remark: '国家电网公司',
children: [
{
id: '0d52f9f6e43ec0ee83013cd32da93f66',
name: '国网河北电力有限公司',
pid: '5699e5916a18a6381e1ac92da5bd2628',
sort: 200,
code: '13B9B47F1E483324E05338297A0A0595',
specialType: null,
area: '130000000000',
areaName: '河北',
state: 1,
type: 1,
remark: '国网河北省电力公司',
children: [
{
id: '3c9e6eea884a3ab5c891122f13715e4b',
name: '国网石家庄供电公司',
pid: '0d52f9f6e43ec0ee83013cd32da93f66',
sort: 0,
code: '13B9B47F1F223324E05338297A0A0595',
specialType: null,
area: '130100000000',
areaName: '石家庄',
state: 1,
type: 1,
remark: '国网石家庄供电公司',
children: [
{
id: '8590eba00eb6ab38ef2d06805602e0ce',
name: '国网石家庄供电公司本部',
pid: '3c9e6eea884a3ab5c891122f13715e4b',
sort: 80,
code: '13B9B47F1F773324E05338297A0A0595',
specialType: 1,
area: '0',
areaName: '中国',
state: 1,
type: 1,
remark: '',
children: []
}
]
},
{
id: '17439407bfee299b7e38f2e54a8f6d28',
name: '国网沧州供电公司',
pid: '0d52f9f6e43ec0ee83013cd32da93f66',
sort: 1,
code: '13B9B47F2C183324E05338297A0A0595',
specialType: null,
area: '130900000000',
areaName: '沧州',
state: 1,
type: 1,
remark: '国网沧州供电公司',
children: [
{
id: 'c8efb47ecb20fbf342eba4665f45f2f6',
name: '国网沧州供电公司本部',
pid: '17439407bfee299b7e38f2e54a8f6d28',
sort: 34,
code: '13B9B47F2C803324E05338297A0A0595',
specialType: 1,
area: '0',
areaName: '中国',
state: 1,
type: 1,
remark: '',
children: []
}
]
},
{
id: '15737b8ed8cb70602163c41918bde12d',
name: '国网邢台供电公司',
pid: '0d52f9f6e43ec0ee83013cd32da93f66',
sort: 2,
code: '13B9B47F25A73324E05338297A0A0595',
specialType: null,
area: '130500000000',
areaName: '邢台',
state: 1,
type: 1,
remark: '国网邢台供电公司',
children: [
{
id: '694288d464a23da82e42727f3d8fd432',
name: '国网邢台供电公司本部',
pid: '15737b8ed8cb70602163c41918bde12d',
sort: 7,
code: '13B9B47F27F63324E05338297A0A0595',
specialType: 1,
area: '0',
areaName: '中国',
state: 1,
type: 1,
remark: '',
children: []
}
]
},
{
id: '193980db73494188de052479c4e37d46',
name: '国网保定供电公司',
pid: '0d52f9f6e43ec0ee83013cd32da93f66',
sort: 3,
code: '13B9B47F2EEB3324E05338297A0A0595',
specialType: null,
area: '130600000000',
areaName: '保定',
state: 1,
type: 1,
remark: '国网保定供电公司',
children: [
{
id: '2d1904c1187f751e4387e3351839dc6d',
name: '国网保定供电公司本部',
pid: '193980db73494188de052479c4e37d46',
sort: 42,
code: '13B9B47F2F173324E05338297A0A0595',
specialType: 1,
area: '0',
areaName: '中国',
state: 1,
type: 1,
remark: '',
children: []
}
]
},
{
id: '2adc64baf2308725c4e91105b3186b21',
name: '国网衡水供电公司',
pid: '0d52f9f6e43ec0ee83013cd32da93f66',
sort: 4,
code: '13B9B47F23B83324E05338297A0A0595',
specialType: null,
area: '131100000000',
areaName: '衡水',
state: 1,
type: 1,
remark: '国网衡水供电公司',
children: [
{
id: 'd3d4b1c41c6115ec9aff0362f5c41930',
name: '国网衡水供电公司本部',
pid: '2adc64baf2308725c4e91105b3186b21',
sort: 65,
code: '13B9B47F251C3324E05338297A0A0595',
specialType: 1,
area: '0',
areaName: '中国',
state: 1,
type: 1,
remark: '',
children: []
}
]
},
{
id: 'dda5d903c9ad44979d3d50e9c83cf564',
name: '国网邯郸供电公司',
pid: '0d52f9f6e43ec0ee83013cd32da93f66',
sort: 5,
code: '13B9B47F28CA3324E05338297A0A0595',
specialType: null,
area: '130400000000',
areaName: '邯郸',
state: 1,
type: 1,
remark: '国网邯郸供电公司',
children: [
{
id: '33e1b89c5963a73f355713f85ad3b3c4',
name: '国网邯郸供电公司本部',
pid: 'dda5d903c9ad44979d3d50e9c83cf564',
sort: 97,
code: '13B9B47F2BAE3324E05338297A0A0595',
specialType: 1,
area: '0',
areaName: '中国',
state: 1,
type: 1,
remark: '',
children: []
}
]
},
{
id: 'a3069759b0b6072c99cf9a7af6c162e9',
name: '国网河北超高压公司',
pid: '0d52f9f6e43ec0ee83013cd32da93f66',
sort: 9,
code: '13B9B47F1E4F3324E05338297A0A0595',
specialType: 1,
area: '130000000000',
areaName: '河北',
state: 1,
type: 1,
remark: '河北超高压公司',
children: [
{
id: 'd3de780cba5813b0c089a6fe1ecdae25',
name: '国网河北超高压公司本部',
pid: 'a3069759b0b6072c99cf9a7af6c162e9',
sort: 0,
code: '13B9B47F1E813324E05338297A0A0595',
specialType: 1,
area: '130000000000',
areaName: '河北',
state: 1,
type: 1,
remark: '',
children: []
}
]
}
]
}
]
}
]
// existMonitorDeptTree().then(res => {
// console.log(res)
// // nodeKey = res.data[0].children[0].children[0].children[0].children[0].children[0].id
// // emit('init', res.data[0].children[0].children[0].children[0].children[0].children[0])
// tree.value = res.data
// if (nodeKey) {
// nextTick(() => {
// treeRef.value.treeRef.setCurrentKey(nodeKey)
// // treeRef.value.treeRef.setExpandedKeys(nodeKey)
// })
// }
// })
}
const tactics = (deptId, grade) => {
emit('tactics', deptId, grade)
}
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);
}
.custom {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding-right: 20px;
// font-size: 14px;
// padding-right: 8px;
}
</style>

View File

@@ -55,6 +55,10 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
// 请求拦截 // 请求拦截
Axios.interceptors.request.use( Axios.interceptors.request.use(
config => { config => {
if(config.url?.substring(0, 13)=='/advance-boot'){
config.url=config.url?.slice(13)
config.baseURL='/hzj'
}
// 取消重复请求 // 取消重复请求
removePending(config) removePending(config)
options.CancelDuplicateRequest && addPending(config) options.CancelDuplicateRequest && addPending(config)

View File

@@ -1,30 +1,35 @@
<template> <template>
<el-row :gutter="30" class="mb20"> <el-row :gutter="30" class="mb20">
<el-col :span="8"> <el-col :span="8">
<el-card > <el-card>
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>公共连接点参数</span> <span>公共连接点参数</span>
</div> </div>
</template> </template>
<div :style="`height: calc(${height} / 2 - 117px);overflow-y: auto`"> <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 :model="form" label-width="auto" style="max-width: 500px; margin: auto">
<el-form-item label="变压器接线方式"> <el-form-item label="变压器接线方式">
<el-input v-model="form.name" /> <el-input v-model="form.name" />
</el-form-item> </el-form-item>
<el-form-item label="电压等级"> <el-form-item label="电压等级">
<el-select v-model="form.level" clearable collapse-tags placeholder="请选择电压等级"> <el-select v-model="form.level" clearable collapse-tags placeholder="请选择电压等级">
<el-option v-for="item in levelList" :key="item.id" :label="item.name" :value="item.id" /> <el-option
</el-select> v-for="item in levelList"
</el-form-item> :key="item.id"
<el-form-item label="供电设备容量(MVA)"> :label="item.name"
<el-input v-model="form.name" /> :value="item.id"
</el-form-item> />
<el-form-item label="最小短路容量(MVA)"> </el-select>
<el-input v-model="form.name" /> </el-form-item>
</el-form-item> <el-form-item label="供电设备容量(MVA)">
</el-form> <el-input v-model="form.name" />
</div> </el-form-item>
<el-form-item label="最小短路容量(MVA)">
<el-input v-model="form.name" />
</el-form-item>
</el-form>
</div>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="16">
@@ -56,11 +61,13 @@
<el-row> <el-row>
<el-col :span="16" :style="`height: calc(${height} / 2 - 100px)`"> <el-col :span="16" :style="`height: calc(${height} / 2 - 100px)`">
<vxe-table style="flex: 1.5" v-bind="defaultAttribute" height="auto" ref="xTable" :data="tableData"> <vxe-table style="flex: 1.5" v-bind="defaultAttribute" height="auto" ref="xTable" :data="tableData">
<vxe-column field="name" title="等级"></vxe-column> <vxe-column field="name" title="谐波次数" width="180"></vxe-column>
<vxe-column field="role" title="安全"></vxe-column> <vxe-column
<vxe-column field="num6" title="III级预警"></vxe-column> v-for="item in column"
<vxe-column field="date12" title="II级预警"></vxe-column> :field="item.field"
<vxe-column field="date13" title="I级预警"></vxe-column> :title="item.title"
:width="item.width"
></vxe-column>
</vxe-table> </vxe-table>
</el-col> </el-col>
<el-col :span="8" :style="`height: calc(${height} / 2 - 100px)`"> <el-col :span="8" :style="`height: calc(${height} / 2 - 100px)`">
@@ -81,36 +88,147 @@ const height = mainHeight(80).height
const levelList = dictData.getBasicData('Dev_Voltage_Stand') const levelList = dictData.getBasicData('Dev_Voltage_Stand')
const tableData = ref([ const tableData = ref([
{ {
id: 10001, name: '谐波电流幅值(A)',
name: '配变首端电压',
role: '/', role: '/',
num6: '/', num6: '/',
date12: '/', date12: '/',
date13: '/' date13: '/'
}, },
{ {
id: 10002, name: '国标限值(A)',
name: '配变功率因素',
role: '/', role: '/',
num6: '/', num6: '/',
date12: '/', date12: '/',
date13: '/' date13: '/'
}, },
{ {
id: 10003, name: '是否允许值',
name: '等效负载率最小值',
role: '/', role: '/',
date12: '/', date12: '/',
num6: '/', num6: '/',
date13: '/' date13: '/'
}
])
const column = ref([
{
title: '2次',
field: 'role',
width: '80px'
}, },
{ {
id: 10004, title: '3次',
name: '各次谐波电流幅值', field: 'role',
role: '/', width: '80px'
date12: '/', },
num6: '/', {
date13: '/' title: '4次',
field: 'role',
width: '80px'
},
{
title: '5次',
field: 'role',
width: '80px'
},
{
title: '6次',
field: 'role',
width: '80px'
},
{
title: '7次',
field: 'role',
width: '80px'
},
{
title: '8次',
field: 'role',
width: '80px'
},
{
title: '9次',
field: 'role',
width: '80px'
},
{
title: '10次',
field: 'role',
width: '80px'
},
{
title: '11次',
field: 'role',
width: '80px'
},
{
title: '12次',
field: 'role',
width: '80px'
},
{
title: '13次',
field: 'role',
width: '80px'
},
{
title: '14次',
field: 'role',
width: '80px'
},
{
title: '15次',
field: 'role',
width: '80px'
},
{
title: '16次',
field: 'role',
width: '80px'
},
{
title: '17次',
field: 'role',
width: '80px'
},
{
title: '18次',
field: 'role',
width: '80px'
},
{
title: '19次',
field: 'role',
width: '80px'
},
{
title: '20次',
field: 'role',
width: '80px'
},
{
title: '21次',
field: 'role',
width: '80px'
},
{
title: '22次',
field: 'role',
width: '80px'
},
{
title: '23次',
field: 'role',
width: '80px'
},
{
title: '24次',
field: 'role',
width: '80px'
},
{
title: '25次',
field: 'role',
width: '80px'
} }
]) ])
const form: any = ref({}) const form: any = ref({})

View File

@@ -17,65 +17,116 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-Search" @click="onSubmit">查询</el-button> <el-button type="primary" icon="el-icon-Search" @click="onSubmit">查询</el-button>
<el-button type="primary" icon="el-icon-DocumentAdd">离线导入</el-button> <el-button type="primary" icon="el-icon-Download" @click="exportTemplate">导出模板</el-button>
<el-upload action="" :show-file-list="false" :auto-upload="false" :on-change="choose">
<el-button type="primary" class="ml10" icon="el-icon-Upload">离线导入</el-button>
</el-upload>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-descriptions class="mb10" title="基础数据" :column="2" size="" border> <div v-loading="loading">
<el-descriptions-item label="电压等级" label-align="center" width="25%">12</el-descriptions-item> <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%">
<el-descriptions-item label="待评估用户" label-align="center" width="25%"> 12
<el-select </el-descriptions-item>
v-model="user" <el-descriptions-item label="额定容量" label-align="center" width="25%">
placeholder="请选择待评估用户" 12
size="small" </el-descriptions-item>
clearable <el-descriptions-item label="待评估用户" label-align="center" width="25%">
filterable <el-select
style="width: 240px" v-model="user"
> placeholder="请选择待评估用户"
<el-option size="small"
v-for="item in userList" clearable
:key="item.value" filterable
:label="item.label" style="width: 240px"
:value="item.value" value-key="id"
/> @change="userChange"
</el-select>
</el-descriptions-item>
<el-descriptions-item label="拟接入光伏容量" label-align="center" width="25%">
12
</el-descriptions-item>
</el-descriptions>
<el-tabs v-model="activeName" class="mb10" :style="`height: calc(${tabsHeight} / 2)`">
<el-tab-pane label="有功功率" name="1" class="mt10">
<MyEChart :options="options" />
</el-tab-pane>
<el-tab-pane label="无功功率" name="2"></el-tab-pane>
<el-tab-pane label="谐波电流幅值" name="3"></el-tab-pane>
<el-tab-pane label="首端电压模型参数" name="4"></el-tab-pane>
</el-tabs>
<div class="bottomBox">
<el-row v-if="showAssess">
<el-col :span="16" :style="`height: calc(${tabsHeight} / 2)`">
<vxe-table
style="flex: 1.5"
v-bind="defaultAttribute"
height="auto"
ref="xTable"
:data="tableData"
> >
<vxe-column field="name" title="等级"></vxe-column> <el-option
<vxe-column field="role" title="安全"></vxe-column> v-for="item in userList"
<vxe-column field="num6" title="III级预警"></vxe-column> :key="item.userId"
<vxe-column field="date12" title="II级预警"></vxe-column> :label="item.userName"
<vxe-column field="date13" title="I级预警"></vxe-column> :value="item"
/>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="拟接入光伏容量(MVA)" label-align="center" width="25%">
{{ userData?.protocolCapacity }}
</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" />
</el-tab-pane>
<el-tab-pane label="无功功率" name="2">
<MyEChart v-if="activeName == '2'" :options="options2" />
</el-tab-pane>
<el-tab-pane label="谐波电流幅值" name="3">
<MyEChart v-if="activeName == '3'" :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-column field="name" title="项别模型参数"></vxe-column>
<vxe-column field="c" title="C"></vxe-column>
<vxe-column field="a" title="a"></vxe-column>
<vxe-column field="b" title="b"></vxe-column>
</vxe-table> </vxe-table>
</el-col> </el-tab-pane>
<el-col :span="8" :style="`height: calc(${tabsHeight} / 2)`"> </el-tabs>
<MyEChart style="flex: 1" :options="pieCharts" /> <div class="bottomBox">
</el-col> <el-row v-if="showAssess">
</el-row> <el-col :span="16" :style="`height: calc(${tabsHeight} / 2 - 105px)`">
<vxe-table
style="flex: 1.5"
v-bind="defaultAttribute"
height="auto"
ref="xTable"
:data="tableData"
>
<vxe-colgroup field="group0" title="等级" align="right">
<vxe-column field="name" width="180" title="结果"></vxe-column>
</vxe-colgroup>
<vxe-column field="level1" title="安全">
<template #default="{ row }">
<Select v-if="row.level1 == 1" class="SelectIcon" />
<span v-else>{{ row.level1 }}</span>
</template>
</vxe-column>
<vxe-column field="level2" title="III级预警">
<template #default="{ row }">
<Select v-if="row.level2 == 1" class="SelectIcon" />
<span v-else>{{ row.level2 }}</span>
</template>
</vxe-column>
<vxe-column field="level3" title="II级预警">
<template #default="{ row }">
<Select v-if="row.level3 == 1" class="SelectIcon" />
<span v-else>{{ row.level3 }}</span>
</template>
</vxe-column>
<vxe-column field="level4" title="I级预警">
<template #default="{ row }">
<Select v-if="row.level4 == 1" class="SelectIcon" />
<span v-else>{{ row.level4 }}</span>
</template>
</vxe-column>
</vxe-table>
</el-col>
<el-col :span="8" :style="`height: calc(${tabsHeight} / 2 - 100px)`">
<MyEChart style="flex: 1" :options="pieCharts" />
</el-col>
</el-row>
<el-button type="primary" icon="el-icon-Document" @click="assess">承载能力评估</el-button> <el-button type="primary" icon="el-icon-Document" @click="assess" v-show="!loading">
承载能力评估
</el-button>
</div>
</div> </div>
</pane> </pane>
</splitpanes> </splitpanes>
@@ -88,71 +139,74 @@ import { Splitpanes, Pane } from 'splitpanes'
import PointTree from '@/components/tree/pqs/loadBearingTree.vue' import PointTree from '@/components/tree/pqs/loadBearingTree.vue'
import DatePicker from '@/components/form/datePicker/index.vue' import DatePicker from '@/components/form/datePicker/index.vue'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { text } from '../text'
import MyEChart from '@/components/echarts/MyEchart.vue' import MyEChart from '@/components/echarts/MyEchart.vue'
import { useMonitoringPoint } from '@/stores/monitoringPoint' import { useMonitoringPoint } from '@/stores/monitoringPoint'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import { Select } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import {
queryCarryCapacityData,
uploadExcel,
queyDetailUser,
queryCarryCapacityQData,
queryCarryCapacityIData,
carryCapacityCal,
getExcelTemplate
} from '@/api/advance-boot/bearingCapacity'
import { useDictData } from '@/stores/dictData'
const monitoringPoint = useMonitoringPoint() const monitoringPoint = useMonitoringPoint()
const size = ref(0) const size = ref(0)
const dictData = useDictData()
const datePickerRef = ref() const datePickerRef = ref()
const height = mainHeight(80).height const height = mainHeight(80).height
const tabsHeight = mainHeight(260).height const tabsHeight = mainHeight(260).height
const tableData = ref([ const tableData = ref([
{ {
id: 10001,
name: '配变首端电压', name: '配变首端电压',
role: '/', level1: '/',
num6: '/', level2: '/',
date12: '/', level3: '/',
date13: '/' level4: '/'
}, },
{ {
id: 10002,
name: '配变功率因素', name: '配变功率因素',
role: '/', level1: '/',
num6: '/', level2: '/',
date12: '/', level3: '/',
date13: '/' level4: '/'
}, },
{ {
id: 10003,
name: '等效负载率最小值', name: '等效负载率最小值',
role: '/', level1: '/',
date12: '/', level2: '/',
num6: '/', level3: '/',
date13: '/' level4: '/'
}, },
{ {
id: 10004,
name: '各次谐波电流幅值', name: '各次谐波电流幅值',
role: '/', level1: '/',
date12: '/', level2: '/',
num6: '/', level3: '/',
date13: '/' level4: '/'
} }
]) ])
const voltageList: any = ref([])
const showAssess = ref(false) const showAssess = ref(false)
const loading = ref(false)
const user = ref('') const user = ref('')
const userList = [ const userList: any = ref([])
{ const options1 = ref({})
value: 'Option1', const options2 = ref({})
label: '光伏电站用户1' const options3 = ref({})
},
{
value: 'Option2',
label: '光伏电站用户2'
},
{
value: 'Option3',
label: '光伏电站用户3'
}
]
const options = ref({})
const pieCharts = ref({}) const pieCharts = ref({})
const activeName = ref('1') const activeName = ref('1')
const userData: any = ref({})
const stringMap: any = ref({})
const p_βminMap: any = ref({})
const i_βmax: any = ref({})
const q_βminMap: any = ref({})
const dotList: any = ref({ const dotList: any = ref({
name: monitoringPoint.state.lineName.split('>')[3], name: monitoringPoint.state.lineName.split('>')[3],
id: monitoringPoint.state.lineId, id: monitoringPoint.state.lineId,
@@ -165,13 +219,74 @@ onMounted(() => {
} }
datePickerRef.value.setTimeOptions([{ label: '周', value: 4 }]) datePickerRef.value.setTimeOptions([{ label: '周', value: 4 }])
datePickerRef.value.setInterval(4) datePickerRef.value.setInterval(4)
info()
}) })
const info = () => {
queyDetailUser({
pageNum: 1,
pageSize: 1000,
userType: dictData.getBasicData('CARRY_CAPCITY_USER_TYPE', [
'Electrified_Rail_Users',
'Charging_Station_Users',
'Electric_Heating_Load_Users'
])[0]?.id
}).then(res => {
userList.value = res.data.records
})
setTimeout(() => {
onSubmit()
}, 100)
}
// 查询 // 查询
const onSubmit = () => { const onSubmit = async () => {
console.log(text.data.data) if (dotList.value.level != 6) {
return ElMessage.error('请选择线路')
}
loading.value = true
let data: any = []
options.value = { 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',
userId: dictData.state.area[0].id
}
Promise.all([queryCarryCapacityData(form), queryCarryCapacityQData(form), queryCarryCapacityIData(form)]).then(
res => {
// 有功功率
voltageList.value = []
stringMap.value = res[0].data.stringMap
p_βminMap.value = res[0].data.p_βminMap
q_βminMap.value = res[1].data.q_βminMap
i_βmax.value = res[2].data.i_βmax
for (let k in res[0].data.stringMap) {
voltageList.value.push({
name: k,
c: res[0].data.stringMap[k][0],
a: res[0].data.stringMap[k][1],
b: res[0].data.stringMap[k][2]
})
}
setEChart(1, res[0].data.data)
setEChart(2, res[1].data.data)
setEChart(3, res[2].data.data)
loading.value = false
}
)
}
// 用户变化
const userChange = e => {
userData.value = e
}
const setEChart = (val: any, data: any) => {
let options = {
title: { title: {
text: '在线率统计', text: '在线率统计',
x: 'center', x: 'center',
@@ -180,15 +295,15 @@ const onSubmit = () => {
} }
}, },
xAxis: { xAxis: {
data: text.data.data.filter(item => item.phaseType == 'A').map(item => item.time), data: data.filter(item => item.phaseType == 'A').map(item => item.time),
// name: '时间', // name: '时间',
onZero: false, onZero: false,
position: 'bottom' // 设置 x 轴在底部 position: 'bottom' // 设置 x 轴在底部
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
max: Math.ceil(Math.max(...text.data.data.map(item => item.value))), max: Math.ceil(Math.max(...data.map(item => item.value))),
min: Math.floor(Math.min(...text.data.data.map(item => item.value))) min: Math.floor(Math.min(...data.map(item => item.value)))
}, },
legend: { legend: {
data: ['A', 'B', 'C'] data: ['A', 'B', 'C']
@@ -203,27 +318,78 @@ const onSubmit = () => {
type: 'line', type: 'line',
// smooth: true, // smooth: true,
symbol: 'none', symbol: 'none',
data: text.data.data.filter(item => item.phaseType == 'A').map(item => item.value.toFixed(3)) data: data.filter(item => item.phaseType == 'A').map(item => item.value.toFixed(3))
}, },
{ {
name: 'B', name: 'B',
type: 'line', type: 'line',
// smooth: true, // smooth: true,
symbol: 'none', symbol: 'none',
data: text.data.data.filter(item => item.phaseType == 'B').map(item => item.value.toFixed(3)) data: data.filter(item => item.phaseType == 'B').map(item => item.value.toFixed(3))
}, },
{ {
name: 'C', name: 'C',
type: 'line', type: 'line',
// smooth: true, // smooth: true,
symbol: 'none', symbol: 'none',
data: text.data.data.filter(item => item.phaseType == 'C').map(item => item.value.toFixed(3)) data: data.filter(item => item.phaseType == 'C').map(item => item.value.toFixed(3))
} }
] ]
} }
val == 1
? (options1.value = options)
: val == 2
? (options2.value = options)
: val == 3
? (options3.value = options)
: ''
} }
// 承载能力评估 // 承载能力评估
const assess = () => { const assess = () => {
let ChartsList = [
{
name: '安全',
value: 0
},
{
name: 'III级',
value: 0
},
{
name: 'II级',
value: 0
},
{
name: 'I级',
value: 0
},
{
name: '禁止接入',
value: 0
}
]
carryCapacityCal({
startTime: '2024-02-05', //修改
endTime: '2024-02-11', //修改
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'
}).then(res => {
tableData.value[0][`level` + res.data.utlevel] = 1
tableData.value[1][`level` + res.data.pfTLevel] = 1
tableData.value[2][`level` + res.data.btlevel] = 1
tableData.value[3][`level` + res.data.ilevel] = 1
ChartsList[res.data.reslutLevel - 1].value = 1
showAssess.value = true
})
pieCharts.value = { pieCharts.value = {
title: { title: {
text: '承载能力评估结果', text: '承载能力评估结果',
@@ -237,10 +403,7 @@ const assess = () => {
type: 'scroll', type: 'scroll',
orient: 'vertical', orient: 'vertical',
left: 10, left: 10,
top: '10%', top: '10%'
tooltip: {
show: true
}
}, },
xAxis: { xAxis: {
@@ -249,51 +412,61 @@ const assess = () => {
yAxis: { yAxis: {
show: false show: false
}, },
color: ['#77DA63', '#00BFF5', '#FFBF00', '#Ff6600'], color: ['#77DA63', '#00BFF5', '#FFBF00', '#Ff6600', '#ff0000'],
dataZoom: { show: false }, dataZoom: { show: false },
series: [ series: [
{ {
type: 'pie', type: 'pie',
center: ['50%', '50%'], center: ['50%', '50%'],
radius: ['35%', '48%'], radius: ['35%', '48%'],
selectedOffset: 30,
clockwise: true,
label: { label: {
formatter: '{b}{c}' normal: {
}, show: false
labelLine: {
length: 1,
length2: 20
},
data: [
{
name: '安全',
value: 1
},
{
name: 'III级',
value: 3
},
{
name: 'II级',
value: 3
},
{
name: 'I级',
value: 2
} }
] },
data: ChartsList
} }
] ]
} }
showAssess.value = true }
// 下载模版
const exportTemplate = () => {
getExcelTemplate().then(res => {
let blob = new Blob([res], {
type: "application/vnd.ms-excel;charset=UTF-8",
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
// link.download = "电压暂降事件分析报告"; // 设置下载的文件名
link.download = '数据模版' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.body.removeChild(link)
})
}
// 离线导入
const choose = (e: any) => {
if (dotList.value.level != 6) {
return ElMessage.error('请选择线路')
}
let form = {
endTime: datePickerRef.value.timeValue[1],
lineId: dotList.value.id,
startTime: datePickerRef.value.timeValue[0]
}
uploadExcel(e.raw, form).then(res => {
ElMessage.success('导入成功')
})
} }
const handleNodeClick = (data: any, node: any) => { const handleNodeClick = (data: any, node: any) => {
console.log('🚀 ~ handleNodeClick ~ data:', data)
dotList.value = data dotList.value = data
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.splitpanes.default-theme .splitpanes__pane { .splitpanes.default-theme .splitpanes__pane {
background: #eaeef1; background: #eaeef1;
} }
@@ -305,7 +478,42 @@ const handleNodeClick = (data: any, node: any) => {
.el-button { .el-button {
position: absolute; position: absolute;
top: 0; top: 0;
z-index: 1;
right: 10px; right: 10px;
} }
} }
::v-deep .vxe-table--header thead tr:first-of-type th:first-of-type {
background: #f8f8f9;
}
::v-deep .vxe-table--header thead tr:first-of-type th:first-of-type:before {
content: '';
position: absolute;
width: 1px;
height: 98px; /*这里需要自己调整根据td的宽度和高度*/
top: 0;
left: 0;
background-color: grey;
opacity: 0.3;
display: block;
transform: rotate(-66deg); /*这里需要自己调整,根据线的位置*/
transform-origin: top;
}
::v-deep .vxe-table--header thead tr:last-of-type th:first-of-type:before {
content: '';
position: absolute;
width: 1px;
height: 98px; /*这里需要自己调整根据td的宽度和高度*/
bottom: 0;
right: 0;
background-color: grey;
opacity: 0.3;
display: block;
transform: rotate(-66deg); /*这里需要自己调整,根据线的位置*/
transform-origin: bottom;
}
.SelectIcon {
height: 30px;
margin-top: 5px;
color: blue;
}
</style> </style>

View File

@@ -1,5 +1,5 @@
<template> <template>
<el-dialog v-model="policyView" title="承载能力评估策略" width="1400" :before-close="handleClose"> <el-dialog v-model="Views" title="承载能力评估策略" width="1400" :before-close="handleClose">
<div style="display: flex; justify-content: end"> <div style="display: flex; justify-content: end">
<el-button icon="el-icon-Refresh" type="primary" @click="restores">一键还原</el-button> <el-button icon="el-icon-Refresh" type="primary" @click="restores">一键还原</el-button>
</div> </div>
@@ -16,23 +16,35 @@
<vxe-column field="name" width="180" title="结果"></vxe-column> <vxe-column field="name" width="180" title="结果"></vxe-column>
</vxe-colgroup> </vxe-colgroup>
<vxe-column field="count1" title="安全(个)"> <vxe-column field="count1" title="安全(个)">
<template #default="{ row }"> <template #default="row">
{{ row.comparisonOperators1 }}{{ row.comparisonOperators1 == '/' ? '' : row.count1 }} <div @click="cells(row, row.row.comparisonOperators1, row.row.count1)">
{{ row.row.comparisonOperators1
}}{{ row.row.comparisonOperators1 == '/' ? '' : row.row.count1 }}
</div>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="count2" title="III级预警(个)"> <vxe-column field="count2" title="III级预警(个)">
<template #default="{ row }"> <template #default="row">
{{ row.comparisonOperators2 }}{{ row.comparisonOperators2 == '/' ? '' : row.count2 }} <div @click="cells(row, row.row.comparisonOperators2, row.row.count2)">
{{ row.row.comparisonOperators2
}}{{ row.row.comparisonOperators2 == '/' ? '' : row.row.count2 }}
</div>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="count3" title="II级预警(个)"> <vxe-column field="count3" title="II级预警(个)">
<template #default="{ row }"> <template #default="row">
{{ row.comparisonOperators3 }}{{ row.comparisonOperators3 == '/' ? '' : row.count3 }} <div @click="cells(row, row.row.comparisonOperators3, row.row.count3)">
{{ row.row.comparisonOperators3
}}{{ row.row.comparisonOperators3 == '/' ? '' : row.row.count3 }}
</div>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="count4" title="I级预警(个)"> <vxe-column field="count4" title="I级预警(个)">
<template #default="{ row }"> <template #default="row">
{{ row.comparisonOperators4 }}{{ row.comparisonOperators4 == '/' ? '' : row.count4 }} <div @click="cells(row, row.row.comparisonOperators4, row.row.count4)">
{{ row.row.comparisonOperators4
}}{{ row.row.comparisonOperators4 == '/' ? '' : row.row.count4 }}
</div>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
@@ -48,6 +60,30 @@
<vxe-column field="date12" title="畸次谐波合格个数"></vxe-column> <vxe-column field="date12" title="畸次谐波合格个数"></vxe-column>
<vxe-column field="date13" title="偶次谐波合格个数"></vxe-column> <vxe-column field="date13" title="偶次谐波合格个数"></vxe-column>
</vxe-table> </vxe-table>
<el-dialog v-model="dialogVisible" title="安全等级配置" width="500">
<el-form :model="form" label-width="auto">
<el-form-item label="运算符号:">
<el-radio-group v-model="form.comparisonOperators" @change="groupChang">
<el-radio :label="'>'">></el-radio>
<el-radio :label="'<'">&lt;</el-radio>
<el-radio :label="'>='">>=</el-radio>
<el-radio :label="'<='">&lt;=</el-radio>
<el-radio :label="'=='">==</el-radio>
<el-radio :label="'/'">/</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="用户名称:">
<el-input-number v-model="form.count" :disabled="disabled" :min="0" style="width: 100%" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="add">确定</el-button>
</div>
</template>
</el-dialog>
</el-dialog> </el-dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@@ -56,12 +92,13 @@ import { defaultAttribute } from '@/components/table/defaultAttribute'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { queyDetail, addCarryc, restore } from '@/api/advance-boot/bearingCapacity' import { queyDetail, addCarryc, restore } from '@/api/advance-boot/bearingCapacity'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
defineOptions({ defineOptions({
name: 'Advancedanalysis/eventcorrelation' name: 'Advancedanalysis/eventcorrelation'
}) })
const emit = defineEmits(['View']) const emit = defineEmits(['View'])
const view = ref(false)
const policyView = ref(true) const Views = ref(true)
const xTable = ref() const xTable = ref()
const loading = ref(false) const loading = ref(false)
@@ -100,25 +137,26 @@ const tableData = ref([
date13: '0' date13: '0'
} }
]) ])
const form = ref({ const form: any = ref({
id: '', comparisonOperators: '',
name: '', count: ''
role: '',
num6: '',
date12: '',
date13: ''
}) })
const dialogVisible = ref(false)
queyDetail().then(res => { const disabled = ref(false)
photovoltaicData.value = [] const info = () => {
let title = ['安全', 'III级预警', 'II级预警', 'I级预警'] queyDetail().then(res => {
// photovoltaicData.value = res.data photovoltaicData.value = []
for (let i: number = 1; i < 5; i++) { let title = ['安全', 'III级预警', 'II级预警', 'I级预警']
photovoltaicData.value.push({ ...setData(res.data.filter(item => item.indexResult == i)), name: title[i - 1] }) // photovoltaicData.value = res.data
} for (let i: number = 1; i < 5; i++) {
console.log('🚀 ~ queyDetail ~ res.data.filter(item=>item.indexResult==1):', photovoltaicData.value) photovoltaicData.value.push({
}) ...setData(res.data.filter(item => item.indexResult == i)),
name: title[i - 1]
})
}
})
}
// 处理返回数据
const setData = (row: any) => { const setData = (row: any) => {
let data = {} let data = {}
row.forEach((item: any) => { row.forEach((item: any) => {
@@ -127,14 +165,44 @@ const setData = (row: any) => {
}) })
return data return data
} }
// <span @click="cells(row,comparisonOperators2,count2)">
const cells = (row: any, comparisonOperators: any, count: any) => {
form.value = {
comparisonOperators: comparisonOperators,
count: count,
result: row.columnIndex,
indexResult: row.rowIndex + 1
}
groupChang(comparisonOperators)
dialogVisible.value = true
}
// 运算符变化
const groupChang = e => {
if (e == '/') {
form.value.count = 0
disabled.value = true
} else {
disabled.value = false
}
}
// 安全等级配置确认
const add = () => {
addCarryc(form.value).then(res => {
ElMessage.success('修改成功!')
dialogVisible.value = false
info()
})
}
// 还原 // 还原
const restores = () => { const restores = () => {
restore().then(res => { restore().then(res => {
ElMessage.success('还原成功!') ElMessage.success('还原成功!')
info()
}) })
} }
onMounted(() => {
info()
})
// 取消 // 取消
const handleClose = () => { const handleClose = () => {
emit('View') emit('View')

View File

@@ -121,10 +121,10 @@ const rules = {
const ruleFormRef = ref() const ruleFormRef = ref()
const tableStore = new TableStore({ const tableStore = new TableStore({
url: '/advance-boot/carrycapacity/queryCarryCapacityData', url: '/advance-boot/result/queryResultList',
method: 'POST', method: 'POST',
column: [ column: [
{ width: '60', type: 'checkbox' }, // { width: '60', type: 'checkbox' },
{ {
field: 'index', field: 'index',
@@ -134,12 +134,29 @@ const tableStore = new TableStore({
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
} }
}, },
{ field: 'name', title: '配变台区' }, { field: 'lineName', title: '配变台区' },
{ field: 'type', title: '评估类型' }, { field: 'evaluateType', title: '评估类型' },
{ field: 'Area', title: '预评估用户' }, { field: 'userName', title: '预评估用户' },
{ field: 'level', title: '评估结果' }, {
{ field: 'mav1', title: '评估日期' }, field: 'reslutLevel',
title: '评估结果',
formatter: (row: any) => {
// 1-安全2-III级预警3-II级预警4-I 级预警,5-禁止接入
return row.reslutLevel == 1
? '合格'
: row.reslutLevel == 2
? 'III级预警'
: row.reslutLevel == 3
? 'II级预警'
: row.reslutLevel == 4
? 'I 级预警'
: row.reslutLevel == 5
? '禁止接入'
: ''
}
},
{ field: 'evaluateDate', title: '评估日期' },
{ {
title: '操作', title: '操作',
@@ -179,21 +196,7 @@ const tableStore = new TableStore({
} }
], ],
loadCallback: () => { loadCallback: () => {}
tableStore.table.data = [
{
name: '光伏电站用户1',
type: '光伏电站',
Area: '中国',
level: '220',
mav1: '100',
mav2: '100',
detailed: '详情',
user: 'Admin',
time: '2024-01-03'
}
]
}
}) })
tableStore.table.params.userType = '' tableStore.table.params.userType = ''
tableStore.table.params.userId = dictData.state.area[0].id tableStore.table.params.userId = dictData.state.area[0].id

File diff suppressed because it is too large Load Diff

View File

@@ -85,7 +85,7 @@ import { mainHeight } from '@/utils/layout'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity' import { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity'
defineOptions({ defineOptions({
name: 'estimate/userManagement' name: 'estimate/photovoltaic'
}) })
const dictData = useDictData() const dictData = useDictData()
const levelList = dictData.getBasicData('Dev_Voltage_Stand') const levelList = dictData.getBasicData('Dev_Voltage_Stand')
@@ -131,6 +131,7 @@ const props = { label: 'name', value: 'id' }
const ruleFormRef = ref() const ruleFormRef = ref()
const tableStore = new TableStore({ const tableStore = new TableStore({
url: '/advance-boot/carrycapacityuser/queyDetailUser', url: '/advance-boot/carrycapacityuser/queyDetailUser',
// url: '/hzj/carrycapacityuser/queyDetailUser',
method: 'POST', method: 'POST',
column: [ column: [
// { width: '60', type: 'checkbox' }, // { width: '60', type: 'checkbox' },
@@ -164,7 +165,7 @@ const tableStore = new TableStore({
field: 'protocolCapacity', field: 'protocolCapacity',
title: '用户协议容量(MVA)', title: '用户协议容量(MVA)',
formatter: (row: any) => { formatter: (row: any) => {
return uesrList.filter(item => item.id == row.row.userType)[0].code == 'Power_Station_Users' return uesrList.filter(item => item.id == row.row.userType)[0].code != 'Power_Station_Users'
? row.cellValue ? row.cellValue
: '/' : '/'
} }
@@ -173,7 +174,7 @@ const tableStore = new TableStore({
field: 'protocolCapacity', field: 'protocolCapacity',
title: '拟接入容量(MVA)', title: '拟接入容量(MVA)',
formatter: (row: any) => { formatter: (row: any) => {
return uesrList.filter(item => item.id == row.row.userType)[0].code != 'Power_Station_Users' return uesrList.filter(item => item.id == row.row.userType)[0].code == 'Power_Station_Users'
? row.cellValue ? row.cellValue
: '/' : '/'
} }
@@ -240,7 +241,10 @@ const tableStore = new TableStore({
} }
], ],
loadCallback: () => {} loadCallback: () => {
console.log(tableStore.table.data);
}
}) })
tableStore.table.params.userType = '' tableStore.table.params.userType = ''

View File

@@ -0,0 +1,33 @@
<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="2"></el-tab-pane>
</el-tabs>
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref, provide } from 'vue'
import { mainHeight } from '@/utils/layout'
defineOptions({
name: 'Processsupervision/electricitymanagement'
})
const activeName = ref('1')
const Statistics = ref()
const compatibility = ref()
const layout = mainHeight(63) as any
</script>
<style lang="scss" scoped>
.bars_w {
width: 100%;
height: 500px;
}
::v-deep(.el-tabs__content) {
height: v-bind('layout.height');
overflow-y: auto;
}
</style>

View File

@@ -21,7 +21,7 @@ import planAudits from './components/planAudits.vue'
import planManage from './components/planManage.vue' import planManage from './components/planManage.vue'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
defineOptions({ defineOptions({
name: 'Region/overview' name: 'Processsupervision/harmonicmanagement'
}) })
const activeName = ref('1') const activeName = ref('1')
const Statistics = ref() const Statistics = ref()

View File

@@ -0,0 +1,87 @@
<template>
<div>
<div>
<TableHeader area ref="TableHeaderRef">
<template #select>
<el-form-item label="干扰源类型">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择干扰源类型"
></el-input>
</el-form-item>
<el-form-item label="干扰源用户名称">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择干扰源用户名称"
></el-input>
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Stamp" type="primary">审核</el-button>
</template>
</TableHeader>
<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 { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity'
const dictData = useDictData()
const process = [
{
name: '是',
id: '1'
},
{
name: '否',
id: '0'
}
]
const dialogVisible = ref(false)
const TableHeaderRef = ref()
const title = ref('')
const ruleFormRef = ref()
const tableStore = new TableStore({
url: '/system-boot/area/areaSelect',
publicHeight: 65,
method: 'POST',
column: [
{ width: '60', type: 'checkbox' },
{ field: 'orgName', title: '所属单位' },
{ field: 'loadType', title: '干扰源类型' },
{ field: 'userName', title: '干扰源用户名称' },
{ field: 'recordTime', title: '建档时间' },
{ field: 'iuploadTime', title: '报告提交评估时间' }
],
loadCallback: () => {
tableStore.table.data = [
{
state: 2
}
]
}
})
tableStore.table.params.searchState = ''
tableStore.table.params.searchValue = ''
tableStore.table.params.type = ''
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
</script>

View File

@@ -0,0 +1,125 @@
<template>
<div>
<div>
<TableHeader area ref="TableHeaderRef">
<template #select>
<el-form-item label="干扰源类型">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择干扰源类型"
></el-input>
</el-form-item>
<el-form-item label="干扰源用户名称">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择干扰源用户名称"
></el-input>
</el-form-item>
<el-form-item label="关联干扰源用户">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择关联干扰源用户"
></el-input>
</el-form-item>
<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-select>
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Upload" type="primary">上传</el-button>
<el-button icon="el-icon-Download" type="primary">导出</el-button>
</template>
</TableHeader>
<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 { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity'
const dictData = useDictData()
const process = [
{
name: '是',
id: '1'
},
{
name: '否',
id: '0'
}
]
const dialogVisible = ref(false)
const TableHeaderRef = ref()
const title = ref('')
const ruleFormRef = ref()
const tableStore = new TableStore({
url: '/system-boot/area/areaSelect',
publicHeight: 65,
method: 'POST',
column: [
{ width: '60', type: 'checkbox' },
{ field: 'orgName', title: '所属单位' },
{
field: 'loadType',
title: '干扰源类型'
},
{ field: 'userName', title: '干扰源用户名称' },
{ field: 'relationUserName', title: '关联干扰源用户名称' },
{ field: 'istatus', title: '实测报告状态' },
{
title: '操作',
width: '180',
render: 'buttons',
buttons: [
{
name: 'edit',
title: '查看',
type: 'primary',
icon: 'el-icon-Plus',
render: 'basicButton',
click: 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()
})
</script>

View File

@@ -0,0 +1,96 @@
<template>
<div>
<div>
<TableHeader area ref="TableHeaderRef">
<template #select>
<el-form-item label="干扰源类型">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择干扰源类型"
></el-input>
</el-form-item>
<el-form-item label="干扰源用户名称">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择干扰源用户名称"
></el-input>
</el-form-item>
<el-form-item label="关联干扰源用户">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择关联干扰源用户"
></el-input>
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Stamp" type="primary">审核</el-button>
</template>
</TableHeader>
<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 { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity'
const dictData = useDictData()
const process = [
{
name: '是',
id: '1'
},
{
name: '否',
id: '0'
}
]
const dialogVisible = ref(false)
const TableHeaderRef = ref()
const title = ref('')
const ruleFormRef = ref()
const tableStore = new TableStore({
url: '/system-boot/area/areaSelect',
publicHeight: 65,
method: 'POST',
column: [
{ width: '60', type: 'checkbox' },
{ field: 'orgName', title: '所属单位' },
{
field: 'loadType',
title: '干扰源类型'
},
{ field: 'userName', title: '干扰源用户名称' },
{ field: 'relationUserName', title: '关联干扰源用户名称' },
{ field: 'auploadTime', title: '报告提交评估时间' }
],
loadCallback: () => {
tableStore.table.data = [
{
state: 2
}
]
}
})
tableStore.table.params.searchState = ''
tableStore.table.params.searchValue = ''
tableStore.table.params.type = ''
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
</script>

View File

@@ -0,0 +1,148 @@
<template>
<div>
<div>
<TableHeader area ref="TableHeaderRef">
<template #select>
<el-form-item label="干扰源类型">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择干扰源类型"
></el-input>
</el-form-item>
<el-form-item label="干扰源用户名称">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请选择干扰源用户名称"
></el-input>
</el-form-item>
<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-select>
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Plus" type="primary">新增</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>
</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 { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity'
const dictData = useDictData()
const process = [
{
name: '是',
id: '1'
},
{
name: '否',
id: '0'
}
]
const dialogVisible = ref(false)
const TableHeaderRef = ref()
const title = ref('')
const ruleFormRef = ref()
const tableStore = new TableStore({
url: '/system-boot/area/areaSelect',
publicHeight: 65,
method: 'POST',
column: [
{ width: '60', type: 'checkbox' },
{ field: 'orgName', title: '所属单位' },
{
field: 'loadType',
title: '干扰源类型'
},
{ field: 'userName', title: '干扰源用户名称' },
{ field: 'recordTime', title: '建档时间' },
{ field: 'iisFileUpload', 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 => {}
},
{
name: 'del',
text: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除?'
},
click: row => {
removeUse({ userIds: row.userId }).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
loadCallback: () => {
tableStore.table.data = [
{
state: 2
}
]
}
})
tableStore.table.params.searchState = ''
tableStore.table.params.searchValue = ''
tableStore.table.params.type = ''
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
</script>

View File

@@ -0,0 +1,41 @@
<template>
<div class="default-main">
<el-tabs v-model="activeName" type="border-card">
<el-tab-pane label="未建档非线性用户录入及查询" name="1">
<undocumented />
</el-tab-pane>
<el-tab-pane label="入网评估报告审核" name="2"><network /></el-tab-pane>
<el-tab-pane label="干扰源用户常态化管理" name="3"><normal /></el-tab-pane>
<el-tab-pane label="实测报告审核" name="4"><report /></el-tab-pane>
</el-tabs>
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref, provide } from 'vue'
import undocumented from './components/undocumented.vue'
import network from './components/network.vue'
import normal from './components/normal.vue'
import report from './components/report.vue'
import { mainHeight } from '@/utils/layout'
defineOptions({
name: 'Processsupervision/interferencemanagement'
})
const activeName = ref('1')
const Statistics = ref()
const compatibility = ref()
const layout = mainHeight(63) as any
</script>
<style lang="scss" scoped>
.bars_w {
width: 100%;
height: 500px;
}
::v-deep(.el-tabs__content) {
height: v-bind('layout.height');
overflow-y: auto;
}
</style>

View File

@@ -0,0 +1,63 @@
<template>
<el-row :gutter="20" :style="{ height: height }">
<el-col :span="9" class="col1">
<policyTree @tactics="tactics"/>
</el-col>
<el-col :span="15" class="col1">
<div class="mb10" style="height: 32px">
<el-button type="primary" icon="el-icon-Plus">新增策略</el-button>
</div>
<div :style="`height: calc(${height} - 43px)`">
<vxe-table ref="tableRef" height="auto" :data="dataList" v-bind="defaultAttribute">
<vxe-column field="name" title="策略名称"></vxe-column>
<vxe-column field="type" title="策略类型">
<template #default="{ row }">
{{ row.type === 0 ? '预警单' : '告警单' }}
</template>
</vxe-column>
<vxe-column field="grade" title="策略等级">
<template #default="{ row }">
{{ row.grade === 0 ? '自动策略' : row.grade === 1 ? '手动策略' : '排他策略' }}
</template>
</vxe-column>
<vxe-column field="state" title="状态">
<template #default="{ row }">
<el-switch
v-model.number="row.state"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value="1"
:inactive-value="2"
@change="stateChange($event, row.id)"
></el-switch>
</template>
</vxe-column>
<vxe-column title="操作">
<template #default="{ row }">
<el-button type="primary" size="small" link>查看</el-button>
<el-button type="primary" size="small" link>修改</el-button>
<el-button type="primary" size="small" link>删除</el-button>
</template>
</vxe-column>
</vxe-table>
</div>
</el-col>
</el-row>
</template>
<script setup lang="ts">
import policyTree from '@/components/tree/pqs/policyTree.vue'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { mainHeight } from '@/utils/layout'
import { ref, reactive } from 'vue'
const height = mainHeight(80).height
const dataList = ref([{}])
const stateChange = (val: number, id: number) => {}
const tactics = (row: any, id: number) => {
console.log("🚀 ~ tactics ~ row:", row,id)
}
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,192 @@
<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>
<el-form-item label="事务类型:">
<el-select v-model="tableStore.table.params.type" clearable placeholder="请选择事务类型">
<el-option
v-for="item in affairs"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<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-select>
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Plus" type="primary" @click="add">新建</el-button>
<el-button icon="el-icon-Plus" type="primary" @click="add">上传模板</el-button>
</template>
</TableHeader>
<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 { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity'
const dictData = useDictData()
const process = [
{
name: '开始',
id: '0'
},
{
name: '预/告警单下发',
id: '1'
},
{
name: '反馈单上传',
id: '2'
},
{
name: '现场测试',
id: '3'
},
{
name: '整改通知单下发',
id: '4'
},
{
name: '整改通知单反馈',
id: '5'
},
{
name: '完结',
id: '6'
}
]
const affairs = [
{
name: '预警单',
id: '0'
},
{
name: '告警单',
id: '1'
}
]
const dialogVisible = ref(false)
const TableHeaderRef = ref()
const title = ref('')
const ruleFormRef = ref()
const tableStore = new TableStore({
url: '/system-boot/area/areaSelect',
publicHeight: 65,
method: 'POST',
column: [
{ field: 'name', title: '名称' },
{
field: 'grade',
title: '等级'
},
{ field: 'bigType', title: '策略选择' },
{ field: 'updateBy', title: '更新人员' },
{ field: 'updateTime', title: '更新时间' },
{
field: 'state',
title: '状态',
activeValue: '2',
inactiveValue: '1',
render: 'switch',
onChangeField: (row: any, value) => {
console.log('🚀 ~ row:', 444123, value)
}
},
{
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 => {}
},
{
name: 'del',
text: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除?'
},
click: row => {
removeUse({ userIds: row.userId }).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
loadCallback: () => {
tableStore.table.data = [
{
state: 2
}
]
}
})
tableStore.table.params.searchState = ''
tableStore.table.params.searchValue = ''
tableStore.table.params.type = ''
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
// 新增
const add = () => {
title.value = '新增告警单'
dialogVisible.value = true
}
</script>

View File

@@ -1,15 +1,39 @@
<template> <template>
<div class="default-main">
<div>123 <el-tabs v-model="activeName" type="border-card">
<el-tab-pane label="概览" name="1"></el-tab-pane>
<el-tab-pane label="技术监督管理" name="2"><technology /></el-tab-pane>
general <el-tab-pane label="告警单策略管理" name="3">
<earlyWarning />
</el-tab-pane>
<el-tab-pane label="预警单策略管理" name="4"><earlyWarning /></el-tab-pane>
</el-tabs>
</div> </div>
</template> </template>
<script setup lang='ts'>
import { ref, reactive } from 'vue'
</script>
<style lang="scss" scoped>
<script setup lang="ts">
import technology from './components/technology.vue'
import earlyWarning from './components/earlyWarning.vue'
import { onMounted, reactive, ref, provide } from 'vue'
import { mainHeight } from '@/utils/layout'
defineOptions({
name: 'Processsupervision/supervision/manage'
})
const activeName = ref('1')
const Statistics = ref()
const compatibility = ref()
const layout = mainHeight(63) as any
</script>
<style lang="scss" scoped>
.bars_w {
width: 100%;
height: 500px;
}
::v-deep(.el-tabs__content) {
height: v-bind('layout.height');
overflow-y: auto;
}
</style> </style>

View File

@@ -0,0 +1,33 @@
<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="2"></el-tab-pane>
</el-tabs>
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref, provide } from 'vue'
import { mainHeight } from '@/utils/layout'
defineOptions({
name: 'Processsupervision/Terminaldetection'
})
const activeName = ref('1')
const Statistics = ref()
const compatibility = ref()
const layout = mainHeight(63) as any
</script>
<style lang="scss" scoped>
.bars_w {
width: 100%;
height: 500px;
}
::v-deep(.el-tabs__content) {
height: v-bind('layout.height');
overflow-y: auto;
}
</style>

5
types/table.d.ts vendored
View File

@@ -59,6 +59,10 @@ declare global {
replaceValue?: any replaceValue?: any
// 时间格式化 // 时间格式化
timeFormat?: string timeFormat?: string
// 开关控制
onChangeField?: (row: TableRow, value: any) => void
activeValue?: string
inactiveValue?: string
// 自定义组件/函数渲染 // 自定义组件/函数渲染
customRender?: string | Component customRender?: string | Component
// 使用了 render 属性时,渲染前对字段值的预处理方法,请返回新值 // 使用了 render 属性时,渲染前对字段值的预处理方法,请返回新值
@@ -88,6 +92,7 @@ declare global {
disabledTip?: boolean disabledTip?: boolean
// 自定义点击事件 // 自定义点击事件
click?: (row: TableRow, field: TableColumn) => void click?: (row: TableRow, field: TableColumn) => void
// 按钮是否禁用,请返回布尔值 // 按钮是否禁用,请返回布尔值
disabled?: (row: TableRow, field: TableColumn) => boolean disabled?: (row: TableRow, field: TableColumn) => boolean
// 自定义el-button属性 // 自定义el-button属性

View File

@@ -11,13 +11,19 @@ export default defineConfig({
host: '0.0.0.0', host: '0.0.0.0',
proxy: { proxy: {
'/api': { '/api': {
target: 'http://192.168.1.81:10215', //数据中心 target: 'http://192.168.1.31:10215', //数据中心
// target: 'http://192.168.1.81:10215', //数据中心
changeOrigin: true, changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '') //路径重写,把'/api'替换为'' rewrite: path => path.replace(/^\/api/, '') //路径重写,把'/api'替换为''
}, },
'/map': { '/map': {
target: 'http://192.168.1.125:8088', //数据中心 target: 'http://192.168.1.125:8088', //数据中心
changeOrigin: true
},
'/hzj': {
target: 'http://13764779092.gnway.cc', //数据中心
changeOrigin: true, changeOrigin: true,
rewrite: path => path.replace(/^\/hzj/, '') //路径重写,把'/api'替换为''
} }
} }
}, },