--添加解析execl插件,活动告警部分功能

This commit is contained in:
lai
2023-09-27 09:57:01 +08:00
parent 3b9b56fec9
commit ccf2eeef4d
23 changed files with 416 additions and 100 deletions

View File

@@ -29,7 +29,8 @@
"vue": "^3.3.4",
"vue-codemirror": "^6.1.1",
"vue-i18n": "^9.3.0",
"vue-router": "^4.2.4"
"vue-router": "^4.2.4",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@types/file-saver": "^2.0.5",

BIN
public/alarmHelp/20001.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/20002.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/20003.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/20004.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/20005.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/30001.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/30002.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/30003.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/30004.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/30005.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/30006.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/30007.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/30008.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/40001.xlsx Normal file

Binary file not shown.

BIN
public/alarmHelp/40002.xlsx Normal file

Binary file not shown.

View File

@@ -0,0 +1,75 @@
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { request } from '@/plugins/http-fetch';
import { parseObjLineToHump } from '@/utils/parse-utils';
import { toRaw } from '@vue/reactivity';
/**
* <20><>ѯ<EFBFBD>б<EFBFBD>
* @param query <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>
* @returns object
*/
export async function listAct(query: Record<string, any>) {
let filterData = '';
let totalSQL = `select count(*) as total from alarm where alarm_status='1' ${filterData} `;
let rowsSQL = `select * from alarm where alarm_status='1' ${filterData}`;
// <20><>ѯ
let querySQL = '';
if (query.alarm_code) {
querySQL += ` and alarm_code = '${query.alarm_code}' `;
}
if (query.alarm_type) {
querySQL += ` and alarm_type = ${query.alarm_type} `;
}
if (query.pv_flag) {
querySQL += ` and pv_flag = ${query.pv_flag} `;
}
if (query.orig_severity) {
querySQL += ` and orig_severity in (${query.orig_severity} )`;
}
if (query.ne_id) {
querySQL += ` and ne_id like '%${query.ne_id}%' `;
}
if (query.ne_name) {
querySQL += ` and ne_name like '%${query.ne_name}%' `;
}
if (query.ne_type) {
querySQL += ` and ne_type like '%${query.ne_type}%' `;
}
// <20><>ҳ
const pageNum = (query.pageNum - 1) * query.pageSize;
const limtSql = ` order by event_time desc limit ${pageNum},${query.pageSize} `;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const result = await request({
url: `/databaseManagement/v1/select/omc_db/alarm`,
method: 'get',
params: {
SQL: totalSQL + querySQL,
rowsSQL: rowsSQL + querySQL + limtSql,
},
});
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (result.code === RESULT_CODE_SUCCESS) {
const data: DataList = {
total: 0,
rows: [],
code: result.code,
msg: result.msg,
};
result.data.data.forEach((item: any) => {
const itemData = item['alarm'];
if (Array.isArray(itemData)) {
if (itemData.length === 1 && itemData[0]['total']) {
data.total = itemData[0]['total'];
} else {
data.rows = itemData.map(v => parseObjLineToHump(v));
}
}
});
return data;
}
return result;
}

View File

@@ -246,8 +246,9 @@ export default {
delTaskTip: 'Are you sure to delete the data item with record number {num}?',
},
},
alarm: {
alarmAct: {
faultManage: {
activeAlarm: {
all:'All',
neType: 'Alarm device type',
neName: 'Alarm network element name',
neId: 'Alarm network element identification',
@@ -263,6 +264,22 @@ export default {
exportAll: 'Export All',
disPlayFilfter: 'Display Filters',
autoConfirm: 'Automatic confirmation of configuration',
critical:'Critical',
major:'Major',
minor:'Minor',
warning:'Warning',
eventAlarm:'Event',
communicationAlarm:'CommunicationAlarm',
equipmentAlarm:'EquipmentAlarm',
processingFailure:'ProcessingFailure',
environmentalAlarm:'EnvironmentalAlarm',
qualityOfServiceAlarm:'QualityOfServiceAlarm',
alarmId:'alarm ID',
alarmTitle:'alarm Title',
clearUser:'clear User',
clearType:'clear Type',
ackState:'Alarm confirmation status',
ackUser:'Alarm confirmation user'
},
},
monitor: {

View File

@@ -246,8 +246,9 @@ export default {
delTaskTip: '确认删除记录编号为 {num} 的数据项?',
},
},
alarm: {
alarmAct: {
faultManage: {
activeAlarm: {
all:'所有',
neType: '告警设备类型',
neName: '告警网元名称',
neId: '告警网元标识',
@@ -263,6 +264,22 @@ export default {
exportAll: '导出全部',
disPlayFilfter: '显示过滤',
autoConfirm: '自动确认配置',
critical:'严重告警',
major:'主要告警',
minor:'次要告警',
warning:'警告告警',
eventAlarm:'事件告警',
communicationAlarm:'通信告警',
equipmentAlarm:'设备告警',
processingFailure:'处理错误告警',
environmentalAlarm:'环境告警',
qualityOfServiceAlarm:'服务质量告警',
alarmId:'告警唯一标识',
alarmTitle:'告警名称',
clearUser:'告警清除用户',
clearType:'告警清除类型',
ackState:'告警确认状态',
ackUser:'告警确认用户'
},
},
monitor: {

View File

@@ -27,6 +27,8 @@ type UserInfo = {
email: string;
/**用户性别 */
sex: string | undefined;
/**个人化设置 */
profile: Record<string, any>;
};
/**
@@ -56,6 +58,7 @@ const useUserStore = defineStore('user', {
phonenumber: '',
email: '',
sex: undefined,
profile: {},
}),
getters: {
/**
@@ -129,6 +132,19 @@ const useUserStore = defineStore('user', {
this.phonenumber = user.phone;
this.email = user.email;
this.sex = user.gender;
// this.profile = JSON.parse(user.profile);
try {
this.profile = JSON.parse(user.profile);
} catch (error) {
console.log(error);
this.profile = {
critical: '#FF5722',
major: '#FFB800',
minor: '#393D49',
warning: '#009688',
event: '#1E9FFF',
};
}
// 验证返回的roles是否是一个非空数组
if (Array.isArray(roles) && roles.length > 0) {

30
src/utils/execl-utils.ts Normal file
View File

@@ -0,0 +1,30 @@
import { read, utils } from 'xlsx';
/**
* <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ļ<EFBFBD>-<2D><>̬<EFBFBD><CCAC>Դ<EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
*/
const baseUrl = import.meta.env.VITE_HISTORY_BASE_URL;
export const scriptUrl = `${
baseUrl.length === 1 && baseUrl.indexOf('/') === 0
? ''
: baseUrl.indexOf('/') === -1
? '/' + baseUrl
: baseUrl
}/alarmHelp`;
/**
* <20><>ʽʱ<CABD><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
* @param dateStr ʱ<><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
* @param formatStr ʱ<><CAB1><EFBFBD><EFBFBD>ʽ Ĭ<><C4AC>YYYY-MM-DD HH:mm:ss
* @returns Date<74><65><EFBFBD><EFBFBD>
*/
export async function parseStrToDate(): Promise<Record<string, any>[]> {
const f = await (await fetch(scriptUrl+"/20001.xlsx")).arrayBuffer();
const wb = read(f);1
const data = utils.sheet_to_json< Record<string, any>>(wb.Sheets[wb.SheetNames[0]]);
console.log(data);
return data;
}

View File

@@ -1,15 +1,18 @@
<script setup lang="ts">
import { useRoute } from 'vue-router';
import dayjs, { Dayjs } from 'dayjs';
import { reactive, ref, onMounted, toRaw } from 'vue';
import { PageContainer } from '@ant-design-vue/pro-layout';
import { message } from 'ant-design-vue/lib';
import { SizeType } from 'ant-design-vue/lib/config-provider';
import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface';
import { ColumnsType } from 'ant-design-vue/lib/table';
import { listUE } from '@/api/neUser/ue';
import useUserStore from '@/store/modules/user';
import { listAct } from '@/api/faultManage/actAlarm';
import useNeInfoStore from '@/store/modules/neinfo';
import useI18n from '@/hooks/useI18n';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { parseStrToDate } from '@/utils/execl-utils';
const { t } = useI18n();
const route = useRoute();
@@ -21,12 +24,22 @@ let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */
let queryParams = reactive({
/**网元ID */
neId: undefined,
/**IMSI */
imsi: '',
/**msisdn */
msisdn: '',
/**告警设备类型 */
ne_type: '',
/**告警网元名称 */
ne_name: '',
/**告警网元标识 */
ne_id: '',
/**告警编号 */
alarm_code: '',
/**告警级别 */
orig_severity: "'Critical','Major','Minor','Warning','Event'",
/**告警产生时间 */
eventTime: '',
/**虚拟化标识 */
pv_flag: '',
/**告警类型 */
alarm_type: '',
/**当前页数 */
pageNum: 1,
/**每页条数 */
@@ -72,54 +85,104 @@ let tableState: TabeStateType = reactive({
/**表格字段列 */
let tableColumns: ColumnsType = [
{
title: 'IMSI',
dataIndex: 'imsi',
title: t('views.faultManage.activeAlarm.alarmId'),
dataIndex: 'alarmId',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.neId'),
dataIndex: 'neId',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.neName'),
dataIndex: 'neName',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.neType'),
dataIndex: 'neType',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.origLevel'),
dataIndex: 'origSeverity',
align: 'center',
customRender(opt) {
const idx = opt.value.lastIndexOf('-');
if (idx != -1) {
return opt.value.substring(idx + 1);
let levelName: any = {
Critical: '严重告警',
Major: '主要告警',
Minor: '次要告警',
Warning: '警告告警',
Event: '事件告警',
};
if (levelName[opt.value]) {
return levelName[opt.value];
}
return opt.value;
},
},
{
title: 'MSISDN',
dataIndex: 'msisdn',
title: t('views.faultManage.activeAlarm.alarmCode'),
dataIndex: 'alarmCode',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.alarmTitle'),
dataIndex: 'alarmTitle',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.eventTime'),
dataIndex: 'eventTime',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.alarmType'),
dataIndex: 'alarmType',
align: 'center',
customRender(opt) {
const idx = opt.value.lastIndexOf('-');
if (idx != -1) {
return opt.value.substring(idx + 1);
let levelName: any = {
CommunicationAlarm: '通信告警',
EquipmentAlarm: '设备告警',
ProcessingFailure: '处理错误告警',
EnvironmentalAlarm: '环境告警',
QualityOfServiceAlarm: '服务质量告警',
};
if (levelName[opt.value]) {
return levelName[opt.value];
}
return opt.value;
},
},
{
title: 'RatType',
dataIndex: 'ratType',
title: t('views.faultManage.activeAlarm.pvFlag'),
dataIndex: 'alarm_id',
align: 'center',
},
{
title: 'DnnList',
dataIndex: 'pduSessionInfo',
title: t('views.faultManage.activeAlarm.clearUser'),
dataIndex: 'clearUser',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.clearType'),
dataIndex: 'clearType',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.ackState'),
dataIndex: 'ackState',
align: 'center',
},
{
title: t('views.faultManage.activeAlarm.ackUser'),
dataIndex: 'ackUser',
align: 'center',
customRender(opt) {
if (opt.value) {
let arr = [];
for (const v of opt.value) {
if (v.dnn) {
arr.push(v.dnn);
}
}
return arr.sort().join(',');
}
return '';
},
},
{
title: t('common.operate'),
key: 'imsi',
key: 'alarm_id',
align: 'center',
},
];
@@ -157,6 +220,47 @@ function fnTableSize({ key }: MenuInfo) {
tableState.size = key as SizeType;
}
/**表格所需option */
const actAlarmOption = reactive({
pvFlag: [
{ label: 'PNF', value: "'PNF'" },
{ label: 'VNF', value: "'VNF'" },
],
alarmType: [
{
label: t('views.faultManage.activeAlarm.communicationAlarm'),
value: "'CommunicationAlarm'",
},
{
label: t('views.faultManage.activeAlarm.equipmentAlarm'),
value: "'EquipmentAlarm'",
},
{
label: t('views.faultManage.activeAlarm.processingFailure'),
value: "'ProcessingFailure'",
},
{
label: t('views.faultManage.activeAlarm.environmentalAlarm'),
value: "'EnvironmentalAlarm'",
},
{
label: t('views.faultManage.activeAlarm.qualityOfServiceAlarm'),
value: "'QualityOfServiceAlarm'",
},
],
origSeverity: [
{
label: t('views.faultManage.activeAlarm.all'),
value: "'Critical','Major','Minor','Warning','Event'",
},
{ label: t('views.faultManage.activeAlarm.critical'), value: "'Critical'" },
{ label: t('views.faultManage.activeAlarm.major'), value: "'Major'" },
{ label: t('views.faultManage.activeAlarm.minor'), value: "'Minor'" },
{ label: t('views.faultManage.activeAlarm.warning'), value: "'Warning'" },
{ label: t('views.faultManage.activeAlarm.eventAlarm'), value: "'Event'" },
],
});
/**对话框对象信息状态类型 */
type ModalStateType = {
/**详情框是否显示 */
@@ -175,12 +279,31 @@ type ModalStateType = {
let modalState: ModalStateType = reactive({
visibleByView: false,
visibleByEdit: false,
title: '在线信息',
title: '全部信息',
from: {
imsi: '',
msisdn: '',
pduSessionInfo: undefined,
ratType: '',
alarmId: '',
alarmSeq: '',
neId:'',
neName: '',
neType: '',
alarmCode: '',
alarmTitle: '',
eventTime: '',
alarmType: '',
pvFlag: '',
objectName: '',
locationInfo: '',
province: '',
alarmStatus: '',
specificProblemId: '',
specificProblem: '',
addInfo: '',
clearType: '',
clearTime: '',
ackState: '',
ackUser: '',
ackTime: '',
origSeverity: '',
},
confirmLoading: false,
});
@@ -190,10 +313,9 @@ let modalState: ModalStateType = reactive({
* @param row 单行记录信息
*/
function fnModalVisibleByVive(row: Record<string, any>) {
if (!row.imsi) {
message.error(`记录信息存在错误`, 2);
return;
}
console.log(toRaw(row))
return false;
const imsiIdx = row.imsi.lastIndexOf('-');
if (imsiIdx != -1) {
row.imsi = row.imsi.substring(imsiIdx + 1);
@@ -206,6 +328,11 @@ function fnModalVisibleByVive(row: Record<string, any>) {
modalState.title = `${row.imsi} 记录信息`;
modalState.visibleByView = true;
}
function fnModalVisibleBy() {
parseStrToDate();
}
/**
* 对话框弹出关闭执行函数
@@ -220,7 +347,7 @@ function fnModalCancel() {
function fnGetList() {
if (tableState.loading) return;
tableState.loading = true;
listUE(toRaw(queryParams)).then(res => {
listAct(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) {
// 取消勾选
if (tableState.selectedRowKeys.length > 0) {
@@ -236,8 +363,10 @@ function fnGetList() {
});
}
const profile = useUserStore().profile;
onMounted(() => {
fnGetList();
});
</script>
@@ -249,7 +378,7 @@ onMounted(() => {
:body-style="{ marginBottom: '24px', paddingBottom: 0 }"
>
<!-- 表格搜索栏 -->
<a-form :model="queryParams" name="queryParams" layout="horizontal" >
<a-form :model="queryParams" name="queryParams" layout="horizontal">
<a-row :gutter="16">
<a-col :lg="6" :md="12" :xs="24">
<!-- <a-form-item :label="t('views.neUser.ue.neType')" name="neId ">
@@ -259,34 +388,42 @@ onMounted(() => {
:placeholder="t('views.neUser.ue.neTypePlease')"
/>
</a-form-item> -->
<a-form-item :label="t('views.neUser.ue.neTypePlease')" name="imsi">
<a-form-item
:label="t('views.faultManage.activeAlarm.neType')"
name="ne_type"
>
<a-input
v-model:value="queryParams.imsi"
v-model:value="queryParams.ne_type"
allow-clear
placeholder="查询IMSI"
placeholder="查询告警设备类型"
></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="IMSI" name="imsi">
<a-form-item
:label="t('views.faultManage.activeAlarm.neName')"
name="ne_name"
>
<a-input
v-model:value="queryParams.imsi"
v-model:value="queryParams.ne_name"
allow-clear
placeholder="查询IMSI"
placeholder="查询告警网元名称"
></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="MSISDN" name="msisdn">
<a-form-item
:label="t('views.faultManage.activeAlarm.neId')"
name="ne_id"
>
<a-input
v-model:value="queryParams.msisdn"
v-model:value="queryParams.ne_id"
allow-clear
placeholder="查询MSISDN"
placeholder="查询告警网元标识"
></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item>
<a-space :size="8">
@@ -304,50 +441,67 @@ onMounted(() => {
</a-row>
<a-row :gutter="16">
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="MSISDN" name="msisdn">
<a-form-item
:label="t('views.faultManage.activeAlarm.alarmCode')"
name="alarm_code"
>
<a-input
v-model:value="queryParams.msisdn"
v-model:value="queryParams.alarm_code"
allow-clear
placeholder="查询MSISDN"
placeholder="查询告警编号"
></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="MSISDN" name="msisdn">
<a-input
v-model:value="queryParams.msisdn"
allow-clear
placeholder="查询MSISDN"
></a-input>
<a-form-item
:label="t('views.faultManage.activeAlarm.origLevel')"
name="orig_severity"
>
<a-select
v-model:value="queryParams.orig_severity"
placeholder="Select alarm Type"
show-search
:options="actAlarmOption.origSeverity"
/>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="MSISDN" name="msisdn">
<a-input
v-model:value="queryParams.msisdn"
allow-clear
placeholder="查询MSISDN"
></a-input>
<a-form-item
:label="t('views.faultManage.activeAlarm.eventTime')"
name="eventTime"
>
<a-range-picker show-time style="width: 400px" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="MSISDN" name="msisdn">
<a-input
v-model:value="queryParams.msisdn"
allow-clear
placeholder="查询MSISDN"
></a-input>
<a-form-item
:label="t('views.faultManage.activeAlarm.pvFlag')"
name="pv_flag"
>
<a-select
v-model:value="queryParams.pv_flag"
placeholder="Select a person"
show-search
:options="actAlarmOption.pvFlag"
/>
<!-- <a-select-option value="'PNF'">PNF</a-select-option>
<a-select-option value="'VNF'">VNF</a-select-option>
</a-select> -->
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="MSISDN" name="msisdn">
<a-input
v-model:value="queryParams.msisdn"
allow-clear
placeholder="查询MSISDN"
></a-input>
<a-form-item
:label="t('views.faultManage.activeAlarm.alarmType')"
name="alarm_type"
>
<a-select
v-model:value="queryParams.alarm_type"
placeholder="Select alarm Type"
show-search
:options="actAlarmOption.alarmType"
/>
</a-form-item>
</a-col>
</a-row>
@@ -415,7 +569,7 @@ onMounted(() => {
:scroll="{ x: true }"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'imsi'">
<template v-if="column.key === 'alarm_id'">
<a-space :size="8" align="center">
<a-tooltip>
<template #title>查看详情</template>
@@ -423,7 +577,16 @@ onMounted(() => {
type="link"
@click.prevent="fnModalVisibleByVive(record)"
>
<template #icon><ProfileOutlined /></template>
<template #icon><InfoCircleOutlined /></template>
</a-button>
</a-tooltip>
<a-tooltip>
<template #title>帮助文档</template>
<a-button
type="link"
@click.prevent="fnModalVisibleBy()"
>
<template #icon><QuestionCircleOutlined style="color:crimson;"/></template>
</a-button>
</a-tooltip>
</a-space>

View File

@@ -381,7 +381,7 @@ function fnBatchModalOk() {
* 对话框弹出 批量删除确认执行函数
* 进行表达规则校验
*/
function fnBatchDelModalOk() {
function fnBatchDelModalOk() {
modalStateBatchDelFrom
.validate()
.then(e => {
@@ -434,7 +434,7 @@ function fnBatchModalCancel() {
* 批量删除对话框弹出关闭执行函数
* 进行表达规则校验
*/
function fnBatchDelModalCancel() {
function fnBatchDelModalCancel() {
modalState.visibleByBatchDel = false;
modalState.visibleByView = false;
modalStateBatchDelFrom.resetFields();
@@ -859,7 +859,6 @@ onMounted(() => {
>
<a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24">
{{ modalState.from }}
<a-form-item
label="IMSI"
name="imsi"
@@ -1058,9 +1057,8 @@ onMounted(() => {
</a-form>
</a-modal>
<!-- 批量删除框 -->
<a-modal
<!-- 批量删除框 -->
<a-modal
width="1000px"
:keyboard="false"
:mask-closable="false"
@@ -1090,7 +1088,7 @@ onMounted(() => {
></a-input>
</a-form-item>
</a-col>
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
:label="t('views.neUser.sub.startIMSI')"
@@ -1115,8 +1113,7 @@ onMounted(() => {
</a-input>
</a-form-item>
</a-col>
</a-row>
</a-row>
</a-form>
</a-modal>