添加打包命令 区分项目
This commit is contained in:
@@ -1,2 +1,3 @@
|
|||||||
NODE_ENV = 'development'
|
NODE_ENV = 'development'
|
||||||
|
VITE_NAME = "development"
|
||||||
VITE_APP_BASE_API = http://120.24.64.5:8088/mall-admin
|
VITE_APP_BASE_API = http://120.24.64.5:8088/mall-admin
|
||||||
3
auto-imports.d.ts
vendored
3
auto-imports.d.ts
vendored
@@ -4,6 +4,5 @@
|
|||||||
// Generated by unplugin-auto-import
|
// Generated by unplugin-auto-import
|
||||||
export {}
|
export {}
|
||||||
declare global {
|
declare global {
|
||||||
const ElMessage: typeof import('element-plus/es')['ElMessage']
|
|
||||||
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,11 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --host",
|
"dev": "vite --host",
|
||||||
|
"dev:BJ": "vite --host --mode BJ",
|
||||||
|
"dev:WX": "vite --host --mode WX",
|
||||||
"build": "vue-tsc && vite build",
|
"build": "vue-tsc && vite build",
|
||||||
|
"build:BJ": "vue-tsc && vite build --mode BJ",
|
||||||
|
"build:WX": "vue-tsc && vite build --mode WX",
|
||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
13
src/App.vue
13
src/App.vue
@@ -23,10 +23,14 @@ window.addEventListener("message", (event) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// setTimeout(() => {
|
// setTimeout(() => {
|
||||||
store.dispatch("loginAction", {
|
console.log("🚀 ~ import.meta.env.VITE_NAME:", import.meta.env.VITE_NAME)
|
||||||
username: "cdf",
|
if (import.meta.env.VITE_NAME == 'wuxi') {
|
||||||
password: "@#001njcnpqs",
|
store.dispatch("loginAction", {
|
||||||
});
|
username: "cdf",
|
||||||
|
password: "@#001njcnpqs",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// }, 100);
|
// }, 100);
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
window.sessionStorage.setItem("token", "");
|
window.sessionStorage.setItem("token", "");
|
||||||
@@ -36,6 +40,7 @@ onBeforeMount(() => {
|
|||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
@import "@/assets/scss/element.scss";
|
@import "@/assets/scss/element.scss";
|
||||||
|
|
||||||
.app {
|
.app {
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
|
|||||||
@@ -201,6 +201,14 @@ export function eventPage(data: object) {
|
|||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// 导出暂降事件列表
|
||||||
|
export function eventPageExport(data: object) {
|
||||||
|
return service({
|
||||||
|
url: "largescreen/eventPageExport",
|
||||||
|
method: "post",
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
// 电压暂降告警统计
|
// 电压暂降告警统计
|
||||||
export function rightImportUser(data: object) {
|
export function rightImportUser(data: object) {
|
||||||
return service({
|
return service({
|
||||||
|
|||||||
@@ -3,7 +3,13 @@ const routes: Array<RouteRecordRaw> = [
|
|||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
name: "Index",
|
name: "Index",
|
||||||
component: () => import("@/views/SagTraceResult_WX/index.vue"), // 懒加载组件
|
// component: () => import("@/views/VoltageSag_BJ/index.vue"), // 懒加载组件
|
||||||
|
component: () =>
|
||||||
|
import(
|
||||||
|
import.meta.env.VITE_NAME == "wuxi"
|
||||||
|
? "@/views/SagTraceResult_WX/index.vue"
|
||||||
|
: "@/views/VoltageSag_BJ/index.vue"
|
||||||
|
), // 懒加载组件
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/VoltageSag", //电压暂降监测平台_北京
|
path: "/VoltageSag", //电压暂降监测平台_北京
|
||||||
|
|||||||
@@ -45,9 +45,13 @@ export default class SocketService {
|
|||||||
console.log("您的浏览器不支持WebSocket");
|
console.log("您的浏览器不支持WebSocket");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let response = null;
|
||||||
|
if (import.meta.env.VITE_NAME == "beijing") {
|
||||||
|
response = await fetch("/vue/");
|
||||||
|
} else if (import.meta.env.VITE_NAME == "wuxi") {
|
||||||
|
response = await fetch("");
|
||||||
|
}
|
||||||
// const response = await fetch("/vue/");
|
// const response = await fetch("/vue/");
|
||||||
const response = await fetch("");
|
|
||||||
|
|
||||||
const mqttUrl = response.headers.get("X-Mqtt-Url");
|
const mqttUrl = response.headers.get("X-Mqtt-Url");
|
||||||
console.log("🚀 ~ SocketService ~ connect ~ mqttUrl:", mqttUrl);
|
console.log("🚀 ~ SocketService ~ connect ~ mqttUrl:", mqttUrl);
|
||||||
|
|||||||
@@ -3,289 +3,139 @@
|
|||||||
|
|
||||||
<el-form inline="true" class="positioning">
|
<el-form inline="true" class="positioning">
|
||||||
<el-form-item label="关键字筛选" style="margin-right: 10px">
|
<el-form-item label="关键字筛选" style="margin-right: 10px">
|
||||||
<el-input
|
<el-input clearable style="width: 150px" v-model="searchValue" size="small" placeholder="电站、测点、用户信息"></el-input>
|
||||||
clearable
|
|
||||||
style="width: 150px"
|
|
||||||
v-model="searchValue"
|
|
||||||
size="small"
|
|
||||||
placeholder="电站、测点、用户信息"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item style="margin-right: 10px">
|
<el-form-item style="margin-right: 10px">
|
||||||
<el-popover placement="bottom" :width="550" trigger="click">
|
<el-popover placement="bottom" :width="550" trigger="click">
|
||||||
<template #reference>
|
<template #reference>
|
||||||
<el-button
|
<el-button size="small" :icon="DArrowRight" type="primary" style="margin-right: 10px">更多</el-button>
|
||||||
size="small"
|
|
||||||
:icon="DArrowRight"
|
|
||||||
type="primary"
|
|
||||||
style="margin-right: 10px"
|
|
||||||
>更多</el-button
|
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-form label-width="auto">
|
<el-form label-width="auto">
|
||||||
<el-form-item label="关键字筛选">
|
<el-form-item label="关键字筛选">
|
||||||
<el-input
|
<el-input clearable style="width: 150px" v-model="searchValue" size="small"
|
||||||
clearable
|
placeholder="电站、测点、用户信息"></el-input>
|
||||||
style="width: 150px"
|
|
||||||
v-model="searchValue"
|
|
||||||
size="small"
|
|
||||||
placeholder="电站、测点、用户信息"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="运维单位">
|
<el-form-item label="运维单位">
|
||||||
<el-select
|
<el-select v-model="deptsIndex" placeholder="请选择运维单位" clearable size="small" :teleported="false"
|
||||||
v-model="deptsIndex"
|
style="width: 150px">
|
||||||
placeholder="请选择运维单位"
|
<el-option v-for="item in deptsList" :label="item.deptsname" :value="item.deptsIndex"
|
||||||
clearable
|
:key="item.deptsIndex"></el-option>
|
||||||
size="small"
|
|
||||||
:teleported="false"
|
|
||||||
style="width: 150px"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in deptsList"
|
|
||||||
:label="item.deptsname"
|
|
||||||
:value="item.deptsIndex"
|
|
||||||
:key="item.deptsIndex"
|
|
||||||
></el-option>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="触发类型">
|
<el-form-item label="触发类型">
|
||||||
<el-select
|
<el-select clearable size="small" :teleported="false" v-model="eventForm.eventtype" placeholder="请选择触发类型"
|
||||||
clearable
|
style="width: 150px">
|
||||||
size="small"
|
<el-option v-for="item in eventTypeList" :label="item.label" :value="item.value"
|
||||||
:teleported="false"
|
:key="item.value"></el-option>
|
||||||
v-model="eventForm.eventtype"
|
|
||||||
placeholder="请选择触发类型"
|
|
||||||
style="width: 150px"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in eventTypeList"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value"
|
|
||||||
:key="item.value"
|
|
||||||
></el-option>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="残余电压百分比">
|
<el-form-item label="残余电压百分比">
|
||||||
<el-input-number
|
<el-input-number v-model="eventForm.eventValueMin" :min="0" style="width: 150px" size="small" :max="100"
|
||||||
v-model="eventForm.eventValueMin"
|
:precision="1" :step="1" @change="
|
||||||
:min="0"
|
|
||||||
style="width: 150px"
|
|
||||||
size="small"
|
|
||||||
:max="100"
|
|
||||||
:precision="1"
|
|
||||||
:step="1"
|
|
||||||
@change="
|
|
||||||
(e) => (e == null ? (eventForm.eventValueMin = 1) : null)
|
(e) => (e == null ? (eventForm.eventValueMin = 1) : null)
|
||||||
"
|
"><template #suffix>
|
||||||
><template #suffix>
|
|
||||||
<span>%</span>
|
<span>%</span>
|
||||||
</template></el-input-number
|
</template></el-input-number>
|
||||||
>
|
|
||||||
<span> < 残余电压 < </span>
|
<span> < 残余电压 < </span>
|
||||||
|
|
||||||
<el-input-number
|
<el-input-number v-model="eventForm.eventValueMax" :min="0" style="width: 150px" size="small" :max="100"
|
||||||
v-model="eventForm.eventValueMax"
|
:precision="1" :step="1" @change="
|
||||||
:min="0"
|
(e) => (e == null ? (eventForm.eventValueMax = 1) : null)
|
||||||
style="width: 150px"
|
"><template #suffix>
|
||||||
size="small"
|
<span>%</span>
|
||||||
:max="100"
|
</template></el-input-number>
|
||||||
:precision="1"
|
|
||||||
:step="1"
|
|
||||||
@change="
|
|
||||||
(e) => (e == null ? (eventForm.eventValueMax = 1) : null)
|
|
||||||
"
|
|
||||||
><template #suffix>
|
|
||||||
<span>%</span>
|
|
||||||
</template></el-input-number
|
|
||||||
>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="暂降持续事时间">
|
<el-form-item label="暂降持续事时间">
|
||||||
<el-input-number
|
<el-input-number v-model="eventForm.eventDurationMin" :min="0" style="width: 150px" size="small"
|
||||||
v-model="eventForm.eventDurationMin"
|
:max="1000000" :precision="1" :step="1" @change="
|
||||||
:min="0"
|
|
||||||
style="width: 150px"
|
|
||||||
size="small"
|
|
||||||
:max="1000000"
|
|
||||||
:precision="1"
|
|
||||||
:step="1"
|
|
||||||
@change="
|
|
||||||
(e) => (e == null ? (eventForm.eventDurationMin = 1) : null)
|
(e) => (e == null ? (eventForm.eventDurationMin = 1) : null)
|
||||||
"
|
"><template #suffix>
|
||||||
><template #suffix>
|
|
||||||
<span>ms</span>
|
<span>ms</span>
|
||||||
</template></el-input-number
|
</template></el-input-number>
|
||||||
>
|
|
||||||
<span> < 持续时间 < </span>
|
<span> < 持续时间 < </span>
|
||||||
|
|
||||||
<el-input-number
|
<el-input-number v-model="eventForm.eventDurationMax" :min="0" style="width: 150px" size="small"
|
||||||
v-model="eventForm.eventDurationMax"
|
:max="1000000" :precision="1" :step="1" @change="
|
||||||
:min="0"
|
(e) => (e == null ? (eventForm.eventDurationMax = 1) : null)
|
||||||
style="width: 150px"
|
"><template #suffix>
|
||||||
size="small"
|
<span>ms</span>
|
||||||
:max="1000000"
|
</template></el-input-number>
|
||||||
:precision="1"
|
|
||||||
:step="1"
|
|
||||||
@change="
|
|
||||||
(e) => (e == null ? (eventForm.eventDurationMax = 1) : null)
|
|
||||||
"
|
|
||||||
><template #suffix>
|
|
||||||
<span>ms</span>
|
|
||||||
</template></el-input-number
|
|
||||||
>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-popover>
|
</el-popover>
|
||||||
<el-button
|
<el-button style="margin-right: 10px" size="small" :icon="Search" type="primary"
|
||||||
style="margin-right: 10px"
|
@click="init(true)">查询</el-button>
|
||||||
size="small"
|
<el-button size="small" type="warn" style="margin-right: 10px" :icon="RefreshLeft"
|
||||||
:icon="Search"
|
@click="clearInit()">重置</el-button>
|
||||||
type="primary"
|
<el-button type="primary" :icon="Download" @click=" exportVisible = true;" size="small">导出
|
||||||
@click="init(true)"
|
</el-button>
|
||||||
>查询</el-button
|
|
||||||
>
|
|
||||||
<el-button size="small" type="warn" :icon="RefreshLeft" @click="clearInit()">重置</el-button>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div
|
<div class="tableBox" v-loading="loading" element-loading-background="#343849c7">
|
||||||
class="tableBox"
|
<el-table :scrollbar-always-on="true" :data="dropList" height="270px" stripe highlight-current-row size="small"
|
||||||
v-loading="loading"
|
:header-cell-style="{ textAlign: 'center' }" border @current-change="handleCurrentChange">
|
||||||
element-loading-background="#343849c7"
|
|
||||||
>
|
|
||||||
<el-table
|
|
||||||
:scrollbar-always-on="true" :data="dropList"
|
|
||||||
height="270px"
|
|
||||||
stripe
|
|
||||||
highlight-current-row
|
|
||||||
size="small"
|
|
||||||
:header-cell-style="{ textAlign: 'center' }"
|
|
||||||
border
|
|
||||||
|
|
||||||
@current-change="handleCurrentChange"
|
|
||||||
>
|
|
||||||
<el-table-column type="index" width="60" align="center" label="序号">
|
<el-table-column type="index" width="60" align="center" label="序号">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ (pageNum - 1) * pageSize + scope.$index + 1 }}
|
{{ (pageNum - 1) * pageSize + scope.$index + 1 }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column prop="timeid" align="center" label="发生时间" width="160" sortable>
|
||||||
prop="timeid"
|
<template #default="scope">{{ scope.row.timeid }}.{{ scope.row.ms }}
|
||||||
align="center"
|
|
||||||
label="发生时间"
|
|
||||||
width="160"
|
|
||||||
sortable
|
|
||||||
>
|
|
||||||
<template #default="scope"
|
|
||||||
>{{ scope.row.timeid }}.{{ scope.row.ms }}
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column prop="bdname" align="center" label="变电站" show-overflow-tooltip sortable />
|
||||||
prop="bdname"
|
<el-table-column prop="busName" align="center" label="母线" show-overflow-tooltip>
|
||||||
align="center"
|
</el-table-column>
|
||||||
label="变电站"
|
<el-table-column prop="pointname" align="center" label="监测点" show-overflow-tooltip />
|
||||||
show-overflow-tooltip
|
<el-table-column prop="objName" align="center" label="用户" show-overflow-tooltip>
|
||||||
sortable
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
prop="pointname"
|
|
||||||
align="center"
|
|
||||||
label="监测点"
|
|
||||||
show-overflow-tooltip
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
prop="objName"
|
|
||||||
align="center"
|
|
||||||
label="用户"
|
|
||||||
show-overflow-tooltip
|
|
||||||
>
|
|
||||||
<template #default="scope">{{ scope.row.objName || "/" }}</template>
|
<template #default="scope">{{ scope.row.objName || "/" }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
|
||||||
prop="wavetype"
|
<el-table-column prop="wavetype" align="center" width="70" label="触发类型">
|
||||||
align="center"
|
|
||||||
width="70"
|
|
||||||
label="触发类型"
|
|
||||||
>
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
|
|
||||||
{{ filteWavetype(scope.row.wavetype) }}
|
{{ filteWavetype(scope.row.wavetype) }}
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column prop="eventvalue" align="center" label="残余电压" width="90" sortable>
|
||||||
prop="eventvalue"
|
|
||||||
align="center"
|
|
||||||
label="残余电压"
|
|
||||||
width="90"
|
|
||||||
sortable
|
|
||||||
>
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ Math.floor(scope.row.eventvalue * 10000) / 100 }}%
|
{{ Math.floor(scope.row.eventvalue * 10000) / 100 }}%
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column prop="persisttime" align="center" label="持续时间" width="90" sortable>
|
||||||
prop="persisttime"
|
|
||||||
align="center"
|
|
||||||
label="持续时间"
|
|
||||||
width="90"
|
|
||||||
sortable
|
|
||||||
>
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ Math.floor(scope.row.persisttime * 1000) / 1000 }}s</template
|
{{ Math.floor(scope.row.persisttime * 1000) / 1000 }}s</template>
|
||||||
>
|
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="address" align="center" label="操作" width="80">
|
<el-table-column prop="address" align="center" label="操作" width="80">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
|
|
||||||
<el-button
|
<el-button size="small" type="primary" link @click.stop="trendCharts(scope.row)">
|
||||||
size="small"
|
|
||||||
type="primary"
|
|
||||||
link
|
|
||||||
@click.stop="trendCharts(scope.row)"
|
|
||||||
>
|
|
||||||
波形
|
波形
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-pagination
|
<el-pagination style="margin-top: 10px" :currentPage="pageNum" :page-size="pageSize"
|
||||||
style="margin-top: 10px"
|
:page-sizes="[10, 20, 50, 100, 200]" size="small" background
|
||||||
:currentPage="pageNum"
|
:layout="'sizes,total, ->, prev, pager, next, jumper'" :total="total" @size-change="onTableSizeChange"
|
||||||
:page-size="pageSize"
|
@current-change="onTableCurrentChange" />
|
||||||
:page-sizes="[10, 20, 50, 100, 200]"
|
|
||||||
size="small"
|
|
||||||
background
|
|
||||||
:layout="'sizes,total, ->, prev, pager, next, jumper'"
|
|
||||||
:total="total"
|
|
||||||
@size-change="onTableSizeChange"
|
|
||||||
@current-change="onTableCurrentChange"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 详情 -->
|
<!-- 详情 -->
|
||||||
<el-dialog :close-on-click-modal="false" draggable v-model="dialogVisible" title="详情" width="950">
|
<el-dialog :close-on-click-modal="false" draggable v-model="dialogVisible" title="详情" width="950">
|
||||||
<div class="titleBox1">暂降事件信息</div>
|
<div class="titleBox1">暂降事件信息</div>
|
||||||
<el-descriptions
|
<el-descriptions :column="3" size="small" style="margin-bottom: 10px" label-width="120px" border>
|
||||||
:column="3"
|
<el-descriptions-item label="发生时间">{{ dataRow.timeid + "." + dataRow.ms }}
|
||||||
size="small"
|
|
||||||
style="margin-bottom: 10px"
|
|
||||||
label-width="120px"
|
|
||||||
border
|
|
||||||
>
|
|
||||||
<el-descriptions-item label="发生时间"
|
|
||||||
>{{ dataRow.timeid + "." + dataRow.ms }}
|
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="变电站"
|
<el-descriptions-item label="变电站">{{ dataRow.bdname }}
|
||||||
>{{ dataRow.bdname }}
|
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="监测点"
|
<el-descriptions-item label="监测点">{{ dataRow.pointname }}
|
||||||
>{{ dataRow.pointname }}
|
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="用户"
|
<el-descriptions-item label="用户">{{ dataRow.objName || "/" }}
|
||||||
>{{ dataRow.objName || "/" }}
|
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="残余电压">
|
<el-descriptions-item label="残余电压">
|
||||||
{{ Math.floor(dataRow.eventvalue * 10000) / 100 }}%
|
{{ Math.floor(dataRow.eventvalue * 10000) / 100 }}%
|
||||||
@@ -295,87 +145,86 @@
|
|||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
<div class="titleBox1 mt20">反馈信息</div>
|
<div class="titleBox1 mt20">反馈信息</div>
|
||||||
<el-descriptions
|
<el-descriptions :column="3" size="small" style="margin-bottom: 10px" label-width="120px" border>
|
||||||
:column="3"
|
|
||||||
size="small"
|
|
||||||
style="margin-bottom: 10px"
|
|
||||||
label-width="120px"
|
|
||||||
border
|
|
||||||
>
|
|
||||||
<el-descriptions-item label="是否影响敏感用户">
|
<el-descriptions-item label="是否影响敏感用户">
|
||||||
<el-tag
|
<el-tag type="primary" v-if="detailList.isSensitive == 1" size="small" effect="dark">是
|
||||||
type="primary"
|
|
||||||
v-if="detailList.isSensitive == 1"
|
|
||||||
size="small"
|
|
||||||
effect="dark"
|
|
||||||
>是
|
|
||||||
</el-tag>
|
</el-tag>
|
||||||
<el-tag type="primary" v-else effect="dark">否</el-tag>
|
<el-tag type="primary" v-else effect="dark">否</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item
|
<el-descriptions-item label="影响敏感用户名称" v-if="detailList.isSensitive == 1">{{ detailList.objName || "/" }}
|
||||||
label="影响敏感用户名称"
|
|
||||||
v-if="detailList.isSensitive == 1"
|
|
||||||
>{{ detailList.objName || "/" }}
|
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="影响原因" v-if="detailList.isSensitive == 1">
|
<el-descriptions-item label="影响原因" v-if="detailList.isSensitive == 1">
|
||||||
{{ detailList.influenceFactors || "/" }}
|
{{ detailList.influenceFactors || "/" }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="处理时间"
|
<el-descriptions-item label="处理时间">{{ detailList.dealDate || "/" }}
|
||||||
>{{ detailList.dealDate || "/" }}
|
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="处理方案"
|
<el-descriptions-item label="处理方案">{{ detailList.dealScheme || "/" }}
|
||||||
>{{ detailList.dealScheme || "/" }}
|
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="备注"
|
<el-descriptions-item label="备注">{{ detailList.remark || "/" }}
|
||||||
>{{ detailList.remark || "/" }}
|
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
<div class="titleBox1 mt20">短信发送信息</div>
|
<div class="titleBox1 mt20">短信发送信息</div>
|
||||||
<div class="tableBox" style="padding: 0">
|
<div class="tableBox" style="padding: 0">
|
||||||
<el-table
|
<el-table :scrollbar-always-on="true" :data="detailList.msgList" height="300px" size="small" stripe
|
||||||
:scrollbar-always-on="true" :data="detailList.msgList"
|
:header-cell-style="{ textAlign: 'center' }" border>
|
||||||
height="300px"
|
<el-table-column prop="sendTime" align="center" label="发送时间" width="160" sortable />
|
||||||
size="small"
|
<el-table-column prop="userName" align="center" label="接收人" width="100" sortable />
|
||||||
stripe
|
<el-table-column prop="phone" align="center" label="手机号" width="100" sortable />
|
||||||
:header-cell-style="{ textAlign: 'center' }"
|
|
||||||
border
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
prop="sendTime"
|
|
||||||
align="center"
|
|
||||||
label="发送时间"
|
|
||||||
width="160"
|
|
||||||
sortable
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
prop="userName"
|
|
||||||
align="center"
|
|
||||||
label="接收人"
|
|
||||||
width="100"
|
|
||||||
sortable
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
prop="phone"
|
|
||||||
align="center"
|
|
||||||
label="手机号"
|
|
||||||
width="100"
|
|
||||||
sortable
|
|
||||||
/>
|
|
||||||
|
|
||||||
<el-table-column prop="msgContent" label="发送内容" />
|
<el-table-column prop="msgContent" label="发送内容" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
<!-- 趋势图 -->
|
<!-- 趋势图 -->
|
||||||
<el-dialog :close-on-click-modal="false"
|
<el-dialog :close-on-click-modal="false" draggable v-model="trendVisible" v-if="trendVisible" title="波形" width="70%">
|
||||||
draggable
|
|
||||||
v-model="trendVisible"
|
|
||||||
v-if="trendVisible"
|
|
||||||
title="波形"
|
|
||||||
width="70%"
|
|
||||||
>
|
|
||||||
<waveForm ref="waveFormRef" />
|
<waveForm ref="waveFormRef" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
<!-- 导出 -->
|
||||||
|
<el-dialog :close-on-click-modal="false" draggable v-model="exportVisible" title="导出" width="500"
|
||||||
|
@close="exportClose">
|
||||||
|
<el-radio-group v-model="exportRadio" size="small">
|
||||||
|
<el-radio-button label="默认导出" value="0" />
|
||||||
|
<el-radio-button label="按时间段导出" value="1" />
|
||||||
|
<el-radio-button label="按时间点导出" value="2" />
|
||||||
|
</el-radio-group>
|
||||||
|
|
||||||
|
<div class="mt10" v-if="exportRadio == '1'">
|
||||||
|
|
||||||
|
<el-form-item label="时间段:" style="width: 400px;">
|
||||||
|
<el-date-picker v-model="timePeriod" type="datetimerange" range-separator="至" start-placeholder="开始时间"
|
||||||
|
size="small" end-placeholder="结束时间" :disabled-date="disabledDate" value-format="YYYY-MM-DD HH:mm:ss" />
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="mt10" v-if="exportRadio == '2'">
|
||||||
|
|
||||||
|
<el-form label-width="auto">
|
||||||
|
<el-form-item label="时间点:">
|
||||||
|
<el-date-picker v-model="timePoint" type="datetime" placeholder="请选择时间" :disabled-date="disabledDate"
|
||||||
|
size="small" style="width: 200px;" value-format="YYYY-MM-DD HH:mm:ss" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="聚合精度(秒):">
|
||||||
|
<el-input-number v-model="timeInterval" :min="0" :step="1" size="small" style="width: 200px;" />
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #footer>
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<el-button size="small" class="mr10" @click="exportClose">取消</el-button>
|
||||||
|
<el-button type="primary" size="small" @click="exportRadio == '0' ? exportTable() : exportTable2()"
|
||||||
|
:loading="exportLoading">
|
||||||
|
确定
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
@@ -384,14 +233,16 @@ import { onMounted, ref, getCurrentInstance, reactive, computed } from "vue";
|
|||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { useStore } from "vuex";
|
import { useStore } from "vuex";
|
||||||
import waveForm from "@/components/BX/waveForm.vue";
|
import waveForm from "@/components/BX/waveForm.vue";
|
||||||
import { DArrowRight, Search,RefreshLeft } from "@element-plus/icons-vue";
|
import { DArrowRight, Search, RefreshLeft, Download } from "@element-plus/icons-vue";
|
||||||
import { getDateRange } from "@/utils/index"; //引入封装好的
|
import { getDateRange } from "@/utils/index"; //引入封装好的
|
||||||
|
import * as XLSX from "xlsx";
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
import {
|
import {
|
||||||
eventPage,
|
eventPage,
|
||||||
eventMsgDetail,
|
eventMsgDetail,
|
||||||
msgHandle,
|
msgHandle,
|
||||||
regionDevCount,
|
regionDevCount,
|
||||||
|
eventPageExport
|
||||||
} from "@/api/statistics/index";
|
} from "@/api/statistics/index";
|
||||||
const emit = defineEmits(["handleCurrentChange"]);
|
const emit = defineEmits(["handleCurrentChange"]);
|
||||||
const dropList = ref([]);
|
const dropList = ref([]);
|
||||||
@@ -411,9 +262,15 @@ const pageNum = ref(1);
|
|||||||
const pageSize = ref(20);
|
const pageSize = ref(20);
|
||||||
const formRef = ref();
|
const formRef = ref();
|
||||||
const searchValue = ref("");
|
const searchValue = ref("");
|
||||||
|
const exportRadio = ref('0');
|
||||||
|
const timePeriod = ref([]);
|
||||||
|
const timePoint = ref('');
|
||||||
|
const timeInterval = ref(60);
|
||||||
|
|
||||||
const feedbackVisible = ref(false); //反馈
|
const feedbackVisible = ref(false); //反馈
|
||||||
const dialogVisible = ref(false);
|
const dialogVisible = ref(false);
|
||||||
|
const exportVisible = ref(false);
|
||||||
|
const exportLoading = ref(false);
|
||||||
const flag = ref(0);
|
const flag = ref(0);
|
||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
|
|
||||||
@@ -424,6 +281,11 @@ const eventForm: any = reactive({
|
|||||||
eventDurationMax: null,
|
eventDurationMax: null,
|
||||||
eventtype: null,
|
eventtype: null,
|
||||||
});
|
});
|
||||||
|
// 禁用未来时间的函数
|
||||||
|
const disabledDate = (time) => {
|
||||||
|
// 禁用当前时间之后的所有时间
|
||||||
|
return time.getTime() > Date.now();
|
||||||
|
};
|
||||||
const typeMap = {
|
const typeMap = {
|
||||||
"0": "扰动",
|
"0": "扰动",
|
||||||
"1": "暂降",
|
"1": "暂降",
|
||||||
@@ -569,6 +431,164 @@ const init = async (flag?: boolean) => {
|
|||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
const exportClose = () => {
|
||||||
|
timePeriod.value = [];
|
||||||
|
timePoint.value = '';
|
||||||
|
exportRadio.value = '0';
|
||||||
|
exportVisible.value = false;
|
||||||
|
}
|
||||||
|
// 导出
|
||||||
|
const exportTable = async () => {
|
||||||
|
|
||||||
|
|
||||||
|
// 示例数据
|
||||||
|
exportLoading.value = true;
|
||||||
|
let columnExpor: any = [
|
||||||
|
["发生时间", "变电站", "母线", "监测点", "用户", "触发类型", "残余电压", '持续时间'],
|
||||||
|
];
|
||||||
|
|
||||||
|
let list = [];
|
||||||
|
|
||||||
|
await eventPage({
|
||||||
|
deptId: deptsIndex.value || store.state.deptId,
|
||||||
|
type: store.state.timeType,
|
||||||
|
startTime: store.state.timeValue[0],
|
||||||
|
endTime: store.state.timeValue[1],
|
||||||
|
eventtype: null,
|
||||||
|
searchValue: searchValue.value,
|
||||||
|
...eventForm,
|
||||||
|
eventValueMin:
|
||||||
|
eventForm.eventValueMin == null ? null : eventForm.eventValueMin / 100,
|
||||||
|
eventValueMax:
|
||||||
|
eventForm.eventValueMax == null ? null : eventForm.eventValueMax / 100,
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: total.value,
|
||||||
|
}).then((res) => {
|
||||||
|
let data = res.data.records.map((item) => {
|
||||||
|
return [
|
||||||
|
item.timeid + '.' + item.ms,
|
||||||
|
item.bdname,
|
||||||
|
item.busName,
|
||||||
|
item.pointname,
|
||||||
|
item.objName || "/",
|
||||||
|
filteWavetype(item.wavetype),
|
||||||
|
Math.floor(item.eventvalue * 10000) / 100 + '%',
|
||||||
|
Math.floor(item.persisttime * 1000) / 1000 + 's'
|
||||||
|
];
|
||||||
|
});
|
||||||
|
list = [...columnExpor, ...data];
|
||||||
|
// 创建工作表
|
||||||
|
const worksheet = XLSX.utils.aoa_to_sheet(list);
|
||||||
|
|
||||||
|
worksheet["!cols"] = list.map((col) => ({ wch: 20 }));
|
||||||
|
|
||||||
|
// 创建工作簿
|
||||||
|
const workbook = XLSX.utils.book_new();
|
||||||
|
XLSX.utils.book_append_sheet(workbook, worksheet, '暂降事件列表');
|
||||||
|
|
||||||
|
// 写出文件
|
||||||
|
XLSX.writeFile(workbook, '暂降事件列表' + ".xlsx");
|
||||||
|
});
|
||||||
|
exportLoading.value = false;
|
||||||
|
exportClose()
|
||||||
|
}
|
||||||
|
const exportTable2 = async () => {
|
||||||
|
let searchBeginTime = ''
|
||||||
|
let searchEndTime = ''
|
||||||
|
if (exportRadio.value == '1') {
|
||||||
|
if (timePeriod.value.length == 0) {
|
||||||
|
return ElMessage({
|
||||||
|
message: "请选择时间段",
|
||||||
|
type: "warning",
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
searchBeginTime = timePeriod.value[0]
|
||||||
|
searchEndTime = timePeriod.value[1]
|
||||||
|
}
|
||||||
|
} else if (exportRadio.value == '2') {
|
||||||
|
if (timePoint.value == '') {
|
||||||
|
return ElMessage({
|
||||||
|
message: "请选择时间点",
|
||||||
|
type: "warning",
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const result = calculateTimeOffsets(timePoint.value);
|
||||||
|
searchBeginTime = result.before
|
||||||
|
searchEndTime = result.after
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exportLoading.value = true;
|
||||||
|
|
||||||
|
|
||||||
|
// 示例数据
|
||||||
|
let columnExpor: any = [
|
||||||
|
["暂态事件发生时刻", "供电公司", "变电站", "母线", "电压等级", "残余电压", '持续时间', '所带重要敏感用户'],
|
||||||
|
];
|
||||||
|
|
||||||
|
let list = [];
|
||||||
|
|
||||||
|
await eventPageExport({
|
||||||
|
deptId: deptsIndex.value || store.state.deptId,
|
||||||
|
searchBeginTime: searchBeginTime,
|
||||||
|
searchEndTime: searchEndTime,
|
||||||
|
}).then((res) => {
|
||||||
|
let data = res.data.map((item) => {
|
||||||
|
return [
|
||||||
|
item.timeid + '.' + item.ms,
|
||||||
|
item.gdName,
|
||||||
|
item.bdname,
|
||||||
|
item.busName,
|
||||||
|
item.busName,
|
||||||
|
Math.floor(item.eventvalue * 10000) / 100 + '%',
|
||||||
|
Math.floor(item.persisttime * 1000) / 1000 + 's',
|
||||||
|
item.objName || "/",
|
||||||
|
];
|
||||||
|
});
|
||||||
|
list = [...columnExpor, ...data];
|
||||||
|
// 创建工作表
|
||||||
|
const worksheet = XLSX.utils.aoa_to_sheet(list);
|
||||||
|
|
||||||
|
worksheet["!cols"] = list.map((col) => ({ wch: 20 }));
|
||||||
|
|
||||||
|
// 创建工作簿
|
||||||
|
const workbook = XLSX.utils.book_new();
|
||||||
|
XLSX.utils.book_append_sheet(workbook, worksheet, '暂降事件列表');
|
||||||
|
|
||||||
|
// 写出文件
|
||||||
|
XLSX.writeFile(workbook, '暂降事件列表' + ".xlsx");
|
||||||
|
});
|
||||||
|
exportLoading.value = false;
|
||||||
|
exportClose()
|
||||||
|
}
|
||||||
|
// 计算时间
|
||||||
|
function calculateTimeOffsets(inputTime) {
|
||||||
|
// 解析输入时间字符串
|
||||||
|
const date = new Date(inputTime);
|
||||||
|
// 计算时间偏移(1秒 = 1000毫秒,30秒 = 30000毫秒)
|
||||||
|
const originalTime = date.getTime();
|
||||||
|
const before = new Date(originalTime - timeInterval.value * 1000);
|
||||||
|
const after = new Date(originalTime + timeInterval.value * 1000);
|
||||||
|
|
||||||
|
// 格式化时间为 "yyyy-MM-dd HH:mm:ss" 格式
|
||||||
|
const formatTime = (date) => {
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||||
|
const day = String(date.getDate()).padStart(2, '0');
|
||||||
|
const hours = String(date.getHours()).padStart(2, '0');
|
||||||
|
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||||||
|
const seconds = String(date.getSeconds()).padStart(2, '0');
|
||||||
|
|
||||||
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 返回结果
|
||||||
|
return {
|
||||||
|
before: formatTime(before),
|
||||||
|
after: formatTime(after)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// renderChart();
|
// renderChart();
|
||||||
@@ -607,16 +627,18 @@ defineExpose({
|
|||||||
:deep(.el-button + .el-button) {
|
:deep(.el-button + .el-button) {
|
||||||
margin-left: 2px !important;
|
margin-left: 2px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.el-table__body tr.current-row > td.el-table__cell) {
|
:deep(.el-table__body tr.current-row > td.el-table__cell) {
|
||||||
background-color: #456a91de !important;
|
background-color: #456a91de !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.positioning {
|
.positioning {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 1px;
|
top: 1px;
|
||||||
right: 10px;
|
right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.el-form-item) {
|
:deep(.el-form-item) {
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
@@ -55,9 +55,9 @@ export default ({ command, mode }) => {
|
|||||||
// target: "http://192.168.1.63/api/",
|
// target: "http://192.168.1.63/api/",
|
||||||
// target: "http://192.168.1.133:4000/api/",
|
// target: "http://192.168.1.133:4000/api/",
|
||||||
//target: "http://192.168.1.62:10215",
|
//target: "http://192.168.1.62:10215",
|
||||||
// target: 'http://192.168.1.127:19001', //cdf
|
target: 'http://192.168.1.127:18093', //cdf
|
||||||
//target: 'http://192.168.1.133:19001', //cdf
|
// target: 'http://192.168.1.63/api', //cdf
|
||||||
target: 'http://192.168.1.127:19001', //cdf
|
// target: 'http://192.168.1.130:18093', //cdf
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
secure: false,
|
secure: false,
|
||||||
rewrite: (path) => path.replace(/^\/api/, ""),
|
rewrite: (path) => path.replace(/^\/api/, ""),
|
||||||
|
|||||||
Reference in New Issue
Block a user