Merge remote-tracking branch 'origin/lichang' into lite

This commit is contained in:
TsMask
2025-05-09 14:30:43 +08:00
45 changed files with 3659 additions and 725 deletions

View File

@@ -1,5 +1,60 @@
# 版本发布日志
## 2.2504.4-20250430
- 修复 捕获数据时跳过延迟超过1毫秒的包
- 修复 网元配置新增函数命名
- 新增 新增终端策略规则接口
- 新增 新增客户端授权管理和开放接口
- 更新 更新omc自定义版权信息和系统名称
- 新增 增加获取服务器时间接口
- 修复 修复IMS导出中呼叫结果的处理逻辑
- 修复 网元首圈状态检查离线时获取更新激活码
- 新增 IMS导出功能增加呼叫结果和原因字段
- 修复 首次引导tokan未记录
- 更新 更新多语言表中的版权信息和系统名称为2025年版本
- 重构 server configuration and update certificate handling
- 重构 error handling in system and trace controllers
- 新增 Implement Oauth2 login log service and repository
- 修复 UDMVolte用户特殊VoIP数据
- 修复 调度日志消息长度限制至2000字符
- 更新 更新数据库初始语句
- 重构 添加定时导出UDM数据备份任务优化CDR导出删除任务
- 优化 UDM数据导出代码格式
- 新增 统一备份数据发送ftp配置功能接口
- 移除 无用go-cache封装
- 新增 添加对本地文件的操作接口
- 修复 移除网元备份文件ftp改用统一ftp配置
- 新增 添加udm-voip/volte功能接口
- 修复 网元主机title唯一导致冲突5002修改失败
- 修复 更新日志文件路径修正sshsvc配置
- 修复 更新Deb和Rpm安装部分说明
- 新增 更新依赖并重构应用引擎初始化逻辑, 支持Grafana
- 新增 新增告警导出接口
- 更新 依赖库版本指定go mod 1.24.0
- 修复 IMS-CDR原因码字典补充
- 修复 ws连接异常中断问题
- 修复 网元主机title唯一导致冲突5002修改失败
- 新增 配置控制首次登录密码修改
- 修复 接口相应Err错误信息输出
- 新增 信令跟踪功能接口定义
- 更新 重构网元跟踪任务功能
- 重构 网元跟踪任务功能
- 重构 packet跟踪解析
- 修复 网元重启命令改用systemctl
- 修复 注释掉测量数据插入逻辑
- 新增 添加网元配置文件备份的FTP配置管理功能
- 新增 mml补充UDM特殊命令处理
- 修复 增加密码策略最小长度验证
- 修复 超管账号跳过强制改密码
- 修复 更新restagent为omc
- 更新 用户初始化admin属性设置错误
- 更新 网元初始化默认只放OMC
- 新增 添加UDM融合AUSF的鉴权成功和请求次数指标
- 修复 网元巡检告警检查创建时间不为0的
- 更新 密码不允许使用最近修改的密码数据参数
- 新增 密码不允许使用最近修改的密码功能
## 2.2503.4-20250331
- 重构 项目目录结构
@@ -18,515 +73,3 @@
- 新增 密码强度校验/密码过期时间功能
- 新增 密码不允许使用最近修改的密码功能
- 修复 网元巡检告警检查创建时间不为0的
## 2.2503.2-20250314
- 更新 SMSC CDR原因值字典翻译
- 修复 用户新增部门parentId必填问题
- 更新 自定义指标title的状态字段
- 更新 AMF参数配置systemFeatOpt
- 优化 生产环境关闭GORM日志输出
- 更新 配置文件数据库地址
## 2.2503.1-20250308
- 重构 优化UPF流量统计逻辑
- 新增 字典数据重新加载附加多语言缓存
- 新增 更新程序 --sqlPath 配置选项支持添加SQL导入功能
- 修复 移除sys_dict_type表中的冗余唯一索引
- 修复 网元状态更新带时间变化
- 修复 网元安装Para5G参数读取nil和终端终止符判断
- 修复 调整批量添加操作的批次大小为500避免内存占用过大兼容轻量版本的操作
- 修复 UDM数据IMSI勾选导出参数处理问题
- 修复 读取kvdb数据截取IMSI数据验证逻辑确保正确处理前缀和长度
- 优化 修改ne_alarm_state_check任务的执行间隔为30秒
- 优化 告警转发邮件优化
- 优化 更新WebSocket组ID格式移除冗余下划线
- 优化 看板菜单权限控制部分显示
- 优化 默认配置文件调整
- 优化 查询like使用字符串拼接替代concat
## 2.2502.4-20250228
- 重构 轻量化适配
## 2.2502.3-20250221
- 重构 数据库表结构变更
- 重构 删除冗余常量文件并整合常量定义
- 重构 更新多个模块以支持新的数据结构
- 重构 更新依赖项,移除过时的库并添加新库
- 重构 更新表索引命名
- 修复 兼容3G的SGWC字段
## 2.2502.1-20250208
- 新增 基站状态记录上报和导出功能
- 修复 IMS-CDR导出表头字段信息调整
- 优化 监控接口/load和/system-info和/cache去除权限标识限制
- 修复 本地免密认证端口去除限制22
- 更新 swagger注释信息
## 2.2501.4-20250124
- 新增 日志备份文件同步FTP功能
- 新增 调度任务-日志备份文件同步FTP功能
- 新增 swagger接口文档版本1.0.8
- 修复 网元主机title命名_随机4位
- 修复 SSH工具远程复制文件夹创建
- 修复 CDR网元数据查询结构体限定neType范围
- 修复 网元直连SMF会话pageNum类型转换
- 新增 MME参数配置项enbList补充MME基站状态接口
- 优化 自定义指标title公式菜单基站在线页面隐藏
- 优化 关闭接口加密功能
## 2.2501.3-20250117
- 优化 自定义指标数据查询值float64保留3为小数
- 优化 网元状态字典映射Online改为Active
- 优化 暴露参数cryptoApi-用户接口加密
- 更新 AMF配置可选属性gnbList隐藏
- 新增 SMF-CDR搜索条件添加DNN
## 2.2501.2-20250111
- 新增 角色admin添加基站状态菜单
- 新增 接入swagger功能
- 新增 网元状态3待机判断standby,类型字典数据
- 更新 MME参数配置可选属性
- 优化 配置文件加载,配置序列结构体到be.ems/lib/config
- 移除 captrace/data2html/crontask程序
- 移除 upgvue3脚本文件,旧代码lib/core,旧代码假系统数据库备份
## 2.2501.1-20250103
- 新增 菜单-基站状态页面路由,定义接口功能
- 更新 AMF/MME参数配置映射文件
- 修复 网元安装MME补充hss域名到hosts
## 2.2412.4-20241228
- 新增 菜单页面-SMF 用户使用数据流量报表
- 新增 CDR 删除权限标识 cdr:ne:remove
- 新增 初始自定义指标 title
- 新增 AMF 基站状态查询接口,更新 AMF 配置项 gnbList
- 修复 SMF-CDR/SGWC-CDR 导出表格流量进行累加不分组显示
- 修复 UDM 签约用户备注信息对应 IMSI 唯一
- 修复 omc 升级日志输出文件权限写入问题
- 修复 网元配置数据查询无 data 时默认返回空数组占位
- 优化 配置文件读取错误显示中文问题
- 优化 OMC 网元状态默认参数空时用“-”表示
- 优化 AMF-UE 上报数据格式统一结构UE 事件 AMF/MME 区分网元查询
## 2.2412.3-20241220
- 新增 直连网元请求带 UA 标识 OMC/version
- 新增 网元直连接口补充 AMF/SMF/MME/IMS
- 新增 CDR-SGWC 表定义SGWC 参数配置可选属性
- 新增 CDR 接收 SGWC 并推送, 数据功能接口, 菜单命名 SGWC-漫游数据
- 优化 网元配置可选参数接口
## 2.2412.2-20241213
- 新增 网元信息通过 neType 查询函数
- 新增 网元类型 HLR 跟踪查询类型 HLR添加 HLR KPI 指标项数据
- 修复 网元安装 redis 依赖包 bind 为 0.0.0.0
- 修复 UDM 签约 cag 参数允许为空
- 修复 custom indicator exist issue
## 2.2412.1-20241209
- 修复 GetHashBatch 检查索引是否越界
- 修复 网元备份 SMSC 配置文件
- 修复 UDM 签约批量添加 msisdn 和 start_msisdn 识别导致数据一致
## 2.2411.4-20241130
- 新增 系统用户免登录认证,默认为 admin 操作所有接口
- 新增 Para5G 参数 UPF 新增填写 N3 N6 网卡名
## 2.2411.3-20241123
- 修复 SMSC 安装 host 重复
- 修复 字典多语言翻译 Multi-language - Chinese
## 2.2411.2-20241115
- 新增 支持 aarch64 平台软件包 iperf v2
- 新增 定时 UDM 数据加载每 12 小时一次
- 修复 网元软件包升级时 rpm 同版本号强制安装
- 更新 初始系统用户默认信息,手机号长度 32 位,系统菜单显示指标报表
## 2.2411.1-20241108
- 新增 iperf 支持 v2 的版本操作
- 新增 网元主机添加 redis 连接终端控制
- 更新 UDM 用户数据表索引更新
- 更新 网元快速安装配置 UPF 网卡名和驱动类型参数
## 2.2410.4-20241102
- 新增 直连网元信息取得 hostname/os 属性值
- 新增 UDM 鉴权签约 imsi 多查询
- 更新 更新系统菜单新增关键指标概览
- 更新 定时任务周期同步更新 UDM 用户数据
- 更新 AMF/SMF 参数配置项数据
- 修复 SMSC 安装时关联修改 IMS 和 UDM 配置
## 2.2410.3-20241018
- 新增 网元主机支持 redis 配置项
- 新增 菜单功能 iperf3/ping 网络测试工具
- 更新 抓包文件支持查看内容
- 更新 初始网元相关表字段数据变更
- 更新 UDM 用户数据按查询条件导出
## 2.2410.1-20241012
- 新增 系统菜单新增工具栏目,网元 SSH,网络测试,网络探针
- 更新 UDM 签约数据表,同步数据支持 MICO 和 RAT 操作修改
- 优化 MML 命令连接改为网元信息配置 telnet
- 更新 SMSC、AMF 参数配置数据
- 更新 定时清除到导出文件缓存
## 2.2409.4-20240927
- 新增 跟踪任务 pcap 文件获取接口
- 优化 socket 消息接收,跟踪任务推送 ws
- 修复 历史告警同步判断存在错误
- 优化 redis 数据 scan 数调整 1000
- 修复 SMF 在线订阅用户列表接口地址错误
- 修复 多语言 SMSC 原因 0 表示未知
- 新增 网元版本列表主动检查服务状态的版本
- 更新 UDM 用户数据表字段
## 2.2409.3-20240920
- 修复 字典多语言序号重复问题
- 更新 UDM 用户数据表SMSC 参数配置属性,字典数据和跟踪相关表
- 新增 跟踪任务 HLR 免登录接口
- 新增 跟踪任务相关接口初始化,跟踪任务新增非 201/400 时接收信息
- 修复 抓包文件下载 zip 时目录同名导致删除压缩无内容
## 2.2409.1-20240909
- 新增 告警前转的两个接口 email 前转和短信前转的系统参数,采用了和网元统一的参数配置方式,
- 优化 修改了 dpkg 和 rpm 包安装后的运行脚本,支持通过环境变量传入参数,并判断传入参数调用 setomc.sh 安装/升级数据库命令格式M_PARAM=upgrade C_PARAM=ba dpkg -I xxxx.deb如果不传入参数则和以前相同
- 调整的 dpkg 和 rpm 包安装的运行脚本中停止 omc 服务的顺序,解决了 omc 安装包在前端界面自升级时出现无法自动刷新的问题
## 2.2408.5-20240831
- 修复 系统信息读取磁盘获取超时导致返回空数组
- 优化 缓存信息安全清理排除登录用户身份和验证码信息
- 新增 KPI 自定义指标功能接口
- 新增 日志数据导出文件查看功能接口
## 2.2408.4-20240823
- 优化 网元端文件目录/tmp/omc 上传 push 下载 pull
- 新增 网元文件操作可删除本地临时文件
- 新增 系统菜单-信令抓包文件
- 新增 KPI 添加 CBC
- 更新 CBC 参数配置可选属性
## 2.2408.3-20240816
- 新增 中间件-接口加解密,配合前端 CryptoJS 加解密
- 新增 KPI 添加 SMSC
- 更新 IMS 参数配置可选属性
## 2.2408.2-20240809
- 新增 SMSC-CDR 功能接口
- 新增 文件内容实时查看功能接口
- 修复 WS 模块连接断开,存在 goroutenue 逃逸问题
## 2.2408.1-20240802
- 修复 菜单网元公共配置移除
- 修复 关闭启动时默认 127.0.0..1 的 IP 绑定
- 移除 kvdb 相关信息
- 优化 导出数据根据查询条件导出 Execl
## 2.2407.4-20240727
- 新增 网元配置备份功能
- 新增 UDM 鉴权文件导入 K4 文件支持
- 更新 对使用手册/官网进行按钮级限制
- 修复 KPI 上报推送到对应网元,查询改用时间戳
- 修复 IMS CDR RecordType 查询语法处理,兼容 mariadb 数据库
## 2.2407.3-20240716
- 更新 参数配置 AMF 参数配置 system
- 更新 参数配置 UPF 参数属性 dataForwarderCommon
- 修复 移除 omc 脚本命令前的 sudo
## 2.2407.2-20240712
- 修复 网元版本安装 MME 写入 host 文件 ip 错误
- 修复 支持 kvdb 依赖包安装,默认带的 adb 改为 kvdb
- 修复 网元版本安装命令终止符判断#$
- 更新 CNType0 表示禁止接入 NA
- 修复 文件复制到本地时创建文件目录避免路径错误
## 2.2407.1-20240704
- 修复 网元版本安装 MME 修改 S6A 地址为 MME_IP
- 修复 网元公共参数 n3/n6IP 不携带/子网掩码处理异常
- 更新 初始网元主机用 omcuser/a9tU53r 用密码登录方式
- 更新 omc/log/内的 level 为 warn
- 更新 MML-OMC 隐藏 NBI 配置项
- 更新 多语言 UE 事件改为终端事件/CNType 改 5G&4G
- 更新 多语言 CDR 翻译命名 Voice CDR / Data CDR
## 2.2406.4-20240627
- 更新 关闭 crontask 任务异常 TaskHandShakeToNF
- 更新 参数配置 IMS 参数 DS System
- 更新 参数配置 MME 默认参数属性
- 更新 字典多语言翻译,部门/系统名/初始密码备注
- 修复 网元许可检查状态响应 nil 字符串
- 修复 MML-UPF 标准版 5002 数据行约有 400+
- 优化 UDM CN Type 可选类型字典数据
- 移除 ims 命令执行的 sudo 前缀
## 2.2406.3-20240619
- 更新 参数配置 MME 参数默认值
- 修复 角色数据权限范围配置示例系统日志区分
- 优化 接口操作日志敏感属性掩码 token 头
- 优化 用户岗位编辑权限
- 优化 UE 事件 MME 类型结果保持和 AMF 一致
- 移除 mmeUE 事件类型的字典数据
## 2.2406.2-20240617
- 修复 总览仪表盘用户活动数据不显示问题
- 修复 旧 Session 过期查询 CPU 占用率过高
- 优化 SMF 参数配置支持 cdr 相关配置
- 优化 UDM 鉴权签约数据获取和重加载的速度
- 修复 抓包操作失败 ssh 异常问题
## 2.2406.1-20240612
- 新增 快速开站和网元快速安装功能
- 新增 SMF CDR 数据列表查询展示
- 新增 IMS CDR 和 AMF UE 数据支持导出到表格文件
- 优化 UPF、MME、IMS、SMF 参数配置项
- 优化 软件管理和许可证管理功能页面
- 修复 网元日志文件读取下载失败问题
## 2.2405.1-20240511
- 优化 使用新的黄金指标数据表查询统计 kpi
- 新增 支持网元 SMSC包含状态参数配置
- 优化 SMF 参数配置增加新的项
- 优化 删除残留的老的菜单项
## 2.2404.6-20240430
- 优化 网元状态信息表的记录修改为只保留一天 duration=1
- 优化 删除过期记录的调度任务增加参数 sessFlagtrue:使用 session 模式进行删除false 或者不带该参数:不使用 session 模式删除(可加快速度)
## 2.2404.5-20240426
- 优化 adb 升级目录切换,安装升级时替换/usr/local/etc/adb/adb.conf 的 replica-read-only 只读属性为 no增加 masterauth 密码行
- 修复 网元状态异常时如果网元的状态记录被完全清空导致无法产生 10000 的网元状态异常告警
- 优化 后端增加 SMF 在线用户状态 Up State 的处理,修改查询接口,增加查询参数 upstate={Inactive/Active}
- 优化 告警短信前转,增加短信方式选择配置项,可使用短信云服务和短信中心模式,告警前转日志增加前转接口字段
- 优化 重构黄金指标存储表,优化为将所有 kpiid 存储在一条记录,同时分网元存储不同的表如 kpi_report_amf上周发布的版本黄金指标发送到原表和新的表前端还未实现从新表获取统计数据
## 2.2404.4-20240419
- 优化 隐藏性能统计和跟踪的任务和数据菜单项
- 修复 网管上 OMC 自升级数据库后重启 OMC 服务进程
- 修复 OMC 网元操作重启失败
- 优化 产品化共性问题adb(redis)增加密码保护
- 修复 调度任务获取网元状态任务失败
- 优化 UPF 标准版的 MML 输出内容完整性, restconf.yaml 配置文件增加了 MML 配置项
- 新增 合入 PCF 和 UDM 的参数配置,新增 plmn list 参数配置项
- 修复 网元 license 上传时如果遇到网元没有 system.ini 文件时失败的问题
- 优化 adb 安装目录变化1. 判断/usr/local/bin/adb-server 存在时,则 OMC 不安装 adb 2.判断/usr/local/bin/adb-server 不存在时,安装 adb 至新的路径,并判断老的 adb 是否存在,如果存在则拷贝/usr/local/db/bin/conf/dump.rdb 至/usr/local/etc/adb修改/usr/local/db 目录为/usr/local/adb.old
- 优化 安装过程会将/usr/local/omc/etc 目录下的配置文件备份为.bak, 然后将/usr/local/omc/etc/default 目录下的配置文件拷贝至/usr/local/omc/etc 目录
- 新增 支持告警通过短信中心的短信前转功能需求,配置项是 restconf.yaml 的 alarm.smsc
## 2.2404.3-20240412
- 新增 IMS 参数配置增加 plmn 和 dialplan
- 新增 IMS KPI 黄金指标项支持
- 优化 网元 UDM/AMF/MME/MOCNGW 的默认 plmn 和 dnn 的值
- 新增 monitor 菜单项下增加话单CDR和事件Event)
- 优化 restconf.yaml 和 capconf.yaml 的 gtp 默认端口统一改为 32152
- 修复 部分修复 upf 标准版的 MML 命令输出内容,输出的内容和一般控制台窗口输出有差异,内容较多时会有--more--,后续需进一步优化
## 2.2404.1-20240402
- 新增 网元安装软包管理相关接口
- 优化 网元安装授权流程相关接口操作
- 优化 操作日志旧接口的网元参数配置多语言翻译
- 修复 多语言翻译值转化 key 进行查询
- 增加 MOCNGW 网元 KPI 和参数配置
- 修复 时区问题,西半球时区出现时区格式转换错误,增加 database 配置项 connParam 用于配置数据库连接参数
- 修复 配置文件配置多个指定 IP 地址时启动时会导致绑定 127.0.0.1 地址失败
- 优化 升级脚本不再覆盖原有调度任务 2.2404.1-20240402
- 新增 网元安装软包管理相关接口
- 优化 网元安装授权流程相关接口操作
- 优化 操作日志旧接口的网元参数配置多语言翻译
- 修复 多语言翻译值转化 key 进行查询
- 增加 MOCNGW 网元 KPI 和参数配置
- 修复 时区问题,西半球时区出现时区格式转换错误,增加 database 配置项 connParam 用于配置数据库连接参数
- 修复 配置文件配置多个指定 IP 地址时启动时会导致绑定 127.0.0.1 地址失败
- 优化 升级脚本不再覆盖原有调度任务
## 2.2403.2-20240327
- 修复 OMC MML 翻译错误
- 优化 判断 redis 数据库是否安装,如果已安装不再安装且不会提示错误
## 2.2403.1-20240321
- 新增 telnet 连接包工具
- 新增 终端主机配置接口
- 新增 终端主机命令接口
- 新增 网元信息相关绑定主机接口,支持网元信息查询带主机信息查询
- 新增 网元主机命令多语言字典接口提示和相关枚举翻译
- 新增 ws 模块新增 ssh 和 telnet 类型连接
- 新增 网元直连接口声明-网元配置对端网管信息
- 新增 网元软件包信息/网元版本信息接口
- 新增 网元主机 SSH 方式检查服务器环境接口
- 新增 网元数据 CDR 和 UE 事件接口新增查询和删除,补充翻译
- 新增 多处字典数据和页面菜单多语言翻译
- 新增 网元信息接口对应页面菜单添加数据库脚本信息
- 新增 网元版本基础接口/网元软件包基础接口
- 修复 查询 SQL 结果 map 属性值转换导致的空字符
- 修复 OMC 网元配置 omcNeConfig 接口覆盖
- 修复 网元列表查询同步更新网元状态,操作同步更新/删除主机记录
- 修复 SSH 对象序列化属性值不匹配
- 修复 移除网元状态过滤判断 status in ('0','3')
- 修复 UE-PCF 接口超时时间 1m
- 优化 操作日志私钥 passPhrase 字段掩码\*
- 优化 ssh 包移除写入命令回车补位,移除读取等待 300s
- 优化 网元状态直连查询超时时间 250ms
- 优化 请求工具 PUT、POST 的超时时间设为 3s
- 优化 日志记录多层结构敏感属性字段进行掩码\*
- 优化 网元信息缓存 redisUPF 总流量缓存数据小于 2 分钟重新缓存
- 优化 网元列表状态在线时下发配置检查更新状态(3-待下发)
- 优化 网元版本表注释/网元软件包表注释
- 修复告警手工同步问题
- 修复增加网元时网元偶发丢失问题
- 增加 upf 5002 的 telnet mml 接口,不过由于 UPF 只支持 localhost 登录,所以目前暂不可用
- 修改默认侦听端口 33030
## 2.2402.6-20240222
- 删除 删除网元功能模块内性能指标控制路由函数
- 优化 网元文件上传都放到 tmp 目录下
- 优化 移动 cmd 包
- 新增 加密 AES 包和 ssh 连接包
- 优化 日志文件命名格式 log.2006-01-02
- License 上传不再重启网元服务进程
- MML 多条命令遇到执行失败时不再直接中断返回
- UE 的所有功能菜单不再进行缓存
- 发布的安装包清除了历史编译产生的前端 index.xxxx.js 文件
## 2.2402.5-20240205
- 新增 获取接口 UPF 总流量数 N3 上行 N6 下行数据
- 优化 黄金指标 5s 数据获取
- 优化 KPI 对 SMF5G 实时 PDU 会话数取最后一项不累加求和
- 修复 ws 客户端读写保护/GroupID 调整,消息无消费 chan 溢出自动关闭
- 新增 ws 支持 upf_tf 类型信息获取 UPF-总流量数
- 新增 ws 支持网元状态查询
- 修复 ws 处理接收发送 CDR 呼叫类型 MTC 推送
- 新增 字典用户事件类型多语言翻译补充
- 新增 支持 HTTP 2.0 服务请求
- 修复 OMC 数据脚本,更新字典数据、拓扑数据
- 优化 更新 gold_kpi 索引
- 新增 系统菜单开启缓存信息和管理列表
- 优化 参数配置表升级 sql
- 优化 网元类型缓存,缓存 10 分钟 UPF 总流量查询
- 修复 CDR 事件推送类型 MOC/MOSM
- 优化 字典多语言补充 calltype sip202
- 优化 CDR 事件推送类型 MOC/MTSM查询支持 RecordType
## 2.2401.4-20240130
- 调整数据库表升级脚本,字典和菜单目录的表在升级时不再全表重置,修复升级时会重置版权信息的中英文系统配置项
- 更新了 UDM 的参数配置,修改了 ambr 速率默认值,加了空格。并且不限制中间有空格
## 2.2401.3-20240124
- OMC 自升级脚本增加执行 setomc.sh 的动作,修复 OMC 在网管升级时只解包没有升级数据库的过程
- 黄金指标的数据表增加字段 granularity用于计算颗粒度granularity=endtime-starttime (s), 网元发送指标数据计算出的颗粒度值不一定是 5 或者 60
- 由于 5 秒上报黄金指标,数据量增加,调度任务保留黄金指标的时长缩短至 3 天
- 增加接收 IMS 上报的 CDR event 记录并保存到数据库表 cdr_event
- 增加接收 AMF 上报的 UE event 记录并保存至表 ue_event
- 此版本包含 2.2401.3-20240120 的修改2.2401.3-20240120 版本废弃
## 2.2401.3-20240120 (discard)
- 重构 抓包功能接口,支持开始到结束的控制,忽略抓包任务默认超时 30 分钟
- 新增 配置参数验证码类型,字典数据补充多语言翻译
- 优化 OMC 网元状态接口响应数据,兼容其他网元转发响应
- IMS 软件升级安装通过脚本 expect 进行交互控制,默认输入 n
- 增加 OMC 软件自升级的功能,该版本的升级仍需在 ssh 控制台进行,在该版本的网管可对当前版本和后续版本进行升级安装
- 增加两个脚本文件:/usr/local/omc/bin/actpkg.sh 和 rbkpkg.sh, 用于所有网元的升级和回退过程控制,修改激活和回退过程,实现所有网元包含 OMC 通过脚本进行,网元需要安装 expect 软件,否则会返回 99 错误码,在脚本文件中可控制交互输入(y/n)和超时时长
- 修改终端(UE)菜单的 N3IWF Online User/NSSF Subscription Info/NSSF Available AMFs 默认为隐藏状态,即新安装/从无该项功能升级时为隐藏状态,对已有该菜单项的环境不做修改,如果需要显示或隐藏,可以在 System->Menu Management-UE 里边编辑菜单项为显示或隐藏
## 2.2401.2-20240112
- 修改 OMC 发布包 dpkg 安装脚本,不再覆盖已存在的 logo
- 增加 NSSF 的在线订阅数和注册 AMF 的功能
- 整理菜单项和新增菜单项trace 移到 monitormonitor 分出 alam/topology/trace 三个菜单子目录
- https 增加 clientAuthType 配置参数,更新 omc-ca.crt, omc-server.crt, omc-server.key 的根密钥,公钥,私钥
- 修复 UDM 系统 MML 命令 help 输出信息过长导致乱码的问题,增加配置项 deadLine用于配置 MML 操作时读写的超时时长
- 导入 AMF,SMF,NSSF,MME 的自定义黄金指标项
- 更新 amfsmfupfnssf 网元的参数配置的 comment 提示
- 新增 拓扑图组数据新增 5gc 组网图排列展示
- 优化 多语言数据在更新情况下改变原字典数据,后续放弃维护 csv 文件
- 修复 调度任务日志在多语言情况下查询无数据问题
- 修复 UPF 抓包异常提示
## 2.2401.1-20240105
- 新增 拓扑图组菜单,对应多语言字典数据补充
- 新增 拓扑关系图数据表
- 新增 拓扑关系数据相关接口
- 优化 拓扑网元状态数据结构体调整,直连超时 200 毫秒
- 定制化步骤只在 install 模式下执行, 新增-m skip 模式和-c agt 的定制化过程skip 模式可跳过数据库安装或者升级过程进行定制化过程agt 定制化将初始化为 AGrandTech 界面信息
- 修复 OMC 网元修改自身信息时打开同步开关失败问题
- 修复网元状态巡检任务产生的告警编号为 0 的问题,修复周期获取网元状态信息任务失效问题
- 网元启动时将上报告警编号 9000 的事件告警(部分网元已实现)
- MML 部分 UDM 操作 bad authdat 修改为 baa authdat, bad udmuser 修改为 baa udmuser
- SMF, UDM, PCF, NRF, AUSF 网元的参数配置文件 comment 字段提示信息进行整改
## 2.2312.10-20231229
- 增加 OMC 与 NSSF 的 Available AMFs 和 Subscription 的查询接口代码, NSSF 的代码未完成,暂未联调,菜单未开放
- 确定序列号(SN)方案,增加网元状态在异常情况下可显示序列号和版本号(通过保存在 ne_state 的网元状态信息获取,且 ne_state 表中必须有 3 天内的网元状态数据)
- 调整优化获取网元状态命令的超时时长,优化网元状态主页的等待时间
- BA 需求:增加网元在新增和修改时配置数据同步至网元的开关功能
- 增加调度任务:删除过期网元状态信息
- 移植调度任务:原有 crontask 的周期获取网元状态信息
- 移植调度任务:原有 crontask 的检测网元状态异常并产生和消除告警的定时任务
- 开放 IMS 的 MML 命令
- 移除 installOMC.sh 脚本
- 新增 支持 UDM 用户数据删除多个 imsi
- 修复 调度任务日志查询记录数据重复问题
- 修复 角色状态变更导致菜单管理删除问题
## 2.2312.9-20231222
- 新增 性能 KPI 统计数据获取接口
- 新增 网元日志列表获取接口
- 新增 PCF 用户策略控制交互接口
- 修复 UDM 用户数据导入 imsi 空值异常错误
- 修复 列表数据分页最大页面数导致的读取数据不全问题
- 修复 调度任务日志查询全部数据接口异常
- 优化 UDM 用户数据同步信息及时更新
- 优化 获取网元状态接口请求耗时过长
- 优化 用户管理导入支持预先分别角色权限
- 增加 setomc.sh 脚本命令行格式setomc.sh -m {install/upgrade/upgvue3} -c {BA/...}, -m 参数调用了 importdb.sh, -c 参数加"BA"表示设置 BA 的定制化 OMC 配置, 默认不执行定制化过程
- 暂时屏蔽 IMS 网元的 MML 命令
- UDM 签约用户数据增加/批量增加 MML 的字段 4G static IP 改为非必选

View File

@@ -8,14 +8,15 @@ CREATE TABLE "ne_license" (
"ne_id" text(32) NOT NULL,
"activation_request_code" text(255) NOT NULL,
"license_path" text(255),
"capability" integer,
"serial_num" text(32),
"expiry_date" text(32),
"status" text(32),
"remark" text(255),
"create_by" text(50),
"create_time" integer(20),
"create_time" integer,
"update_by" text(50),
"update_time" integer(20),
"update_time" integer,
PRIMARY KEY ("id")
);

View File

@@ -7,13 +7,15 @@ CREATE TABLE "ne_state" (
"ne_type" text(16),
"ne_id" text(32),
"version" text(16),
"capability" text(64),
"capability" integer,
"serial_num" text(16),
"expiry_date" text(10),
"cpu_usage" text,
"mem_usage" text,
"disk_space" text,
"timestamp" integer(20),
"sys_cpu_usage" integer,
"sys_mem_usage" integer,
"sys_disk_usage" integer,
"nf_cpu_usage" integer,
"nf_mem_used" integer,
"create_time" integer,
PRIMARY KEY ("id")
);
@@ -24,7 +26,7 @@ CREATE INDEX "idx_type_id_time"
ON "ne_state" (
"ne_type" ASC,
"ne_id" ASC,
"timestamp" ASC
"create_time" ASC
);
-- ----------------------------

View File

@@ -17,9 +17,9 @@ CREATE TABLE "ne_version" (
"new_path" text(255),
"status" text(16),
"create_by" text(50),
"create_time" integer(20),
"create_time" integer,
"update_by" text(50),
"update_time" integer(20),
"update_time" integer,
PRIMARY KEY ("id")
);

View File

@@ -5,8 +5,8 @@ DROP TABLE IF EXISTS "sys_i18n";
CREATE TABLE "sys_i18n" (
"id" integer NOT NULL,
"key_lable" text(255) NOT NULL,
"value_zh" text(255),
"value_en" text(255),
"value_zh" text(2048),
"value_en" text(2048),
PRIMARY KEY ("id")
);
@@ -710,6 +710,12 @@ INSERT INTO "sys_i18n" VALUES (638, 'job.backup_export_table_cdr_event_ims', '
INSERT INTO "sys_i18n" VALUES (639, 'job.backup_export_table_cdr_event_smf', '备份-数据话单表定期导出', 'Backup-Regular Export of data sheet tables');
INSERT INTO "sys_i18n" VALUES (640, 'cache.name.oauth2_codes', '客户端授权码', 'Oauth2 Client Code');
INSERT INTO "sys_i18n" VALUES (641, 'cache.name.oauth2_devices', '客户端令牌', 'Oauth2 Token');
INSERT INTO "sys_i18n" VALUES (642, 'job.backup_export_cdr', '备份-CDR数据定期导出', 'Backup-Periodic export of CDR Data');
INSERT INTO "sys_i18n" VALUES (643, 'job.backup_export_cdr_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc
fileType: 文件类型 csv/xlsx
hour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support ims/smf/sgwc/smsc
fileType: file type csv/xlsx
hour: data time from the hour before the task execution time');
INSERT INTO "sys_i18n" VALUES (644, 'menu.log.exportFile', '导出文件', 'Exported File');
INSERT INTO "sys_i18n" VALUES (645, 'menu.perf.kpiCReport', '自定义指标数据', 'Custom Indicator Data');
INSERT INTO "sys_i18n" VALUES (646, 'menu.trace.taskHLR', 'HLR 跟踪任务', 'HLR Trace Task');
@@ -754,6 +760,7 @@ INSERT INTO "sys_i18n" VALUES (674, 'config.sys.user.passwdNotAllowedHistory', '
INSERT INTO "sys_i18n" VALUES (675, 'config.sys.user.passwdNotAllowedHistoryRemark', '创建新密码不等于之前使用的x次中的密码', 'Creating a new password that is not equal to the previously used password in x times');
INSERT INTO "sys_i18n" VALUES (676, 'login.errPasswdHistory', '不允许使用最近密码', 'Recent passwords not allowed');
INSERT INTO "sys_i18n" VALUES (677, 'log.operate.title.oauth2client', 'Oauth2客户端授权', 'Oauth2 Client Authorization');
INSERT INTO "sys_i18n" VALUES (678, 'log.operate.title.pcfRule', '终端策略规则', 'UE PCC Rule');
INSERT INTO "sys_i18n" VALUES (679, 'dictType.trace_msg_type', '跟踪消息类型', 'Trace Message Type');
INSERT INTO "sys_i18n" VALUES (680, 'dictData.trace_msg_type.0', '请求', 'Request');
INSERT INTO "sys_i18n" VALUES (681, 'dictData.trace_msg_type.1', '响应', 'Response');
@@ -820,7 +827,7 @@ storeNum: retention number, default retention 7');
INSERT INTO "sys_i18n" VALUES (726, 'job.backup_export_udm', '备份-UDM数据定期导出', 'Backup-Periodic export of UDM Data');
INSERT INTO "sys_i18n" VALUES (727, 'job.backup_export_udm_remark', 'dataType: 类型支持 auth/sub/voip/volte
fileType: 文件类型 csv/txt', 'Backup-Periodic export of dataType: type support auth/sub/voip/volte
fileType: file type csv/txtUDM Data');
fileType: file type csv/txt');
INSERT INTO "sys_i18n" VALUES (728, 'dictData.cdr_sip_code_cause.0', '因其他原因呼叫失败', 'Call failure for other reason');
INSERT INTO "sys_i18n" VALUES (729, 'dictData.cdr_sip_code_cause.200', '正常通话清除', 'Normal Call Clearing');
INSERT INTO "sys_i18n" VALUES (730, 'dictData.cdr_sip_code_cause.202', '申请已被接受处理,但尚未完成 ', 'The request has been accepted for processing, but it hasn it completed yet');
@@ -843,3 +850,81 @@ INSERT INTO "sys_i18n" VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其
INSERT INTO "sys_i18n" VALUES (747, 'dictData.cdr_sip_code_cause.603', 'MT 明确拒绝通话', 'MT explicitly rejected the call');
INSERT INTO "sys_i18n" VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the users device, but some parts of the session setup weren it acceptable');
INSERT INTO "sys_i18n" VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause');
INSERT INTO "sys_i18n" VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data');
INSERT INTO "sys_i18n" VALUES (751, 'job.backup_export_log_remark', 'dataType: 类型支持 operate/login
fileType: 文件类型 csv/xlsx
hour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support operate/login
fileType: file type csv/xlsx
hour: data time from the hour before the task execution time');
INSERT INTO "sys_i18n" VALUES (752, 'job.ne_alarm_state_check_cmd', '网元告警-内存/CPU/磁盘检查', 'NE Alarm-Memory/CPU/Disk Checks');
INSERT INTO "sys_i18n" VALUES (753, 'job.ne_alarm_state_check_cmd_remark', '检查网元的内存/CPU/磁盘检查健康状况,在出现过阈值时发出警报。
Alarm type:
CommunicationAlarm=1
EquipmentAlarm=2
ProcessingFailure=3
EnvironmentalAlarm=4
QualityOfServiceAlarm=5
Severity:
Critical=1
Major=2
Minor=3
Warning=4
AddInfo: 告警补充信息
cpuUseGt: CPU使用率大于 范围0~100%
memUseGt: 内存使用率大于, 范围0~100%
diskUseGt: 磁盘使用率大于, 范围0~100%', 'Checks the memory/CPU/disk check health of the network element and sends alerts when thresholds are crossed.
Alarm type:
CommunicationAlarm=1
EquipmentAlarm=2
ProcessingFailure=3
EnvironmentalAlarm=4
QualityOfServiceAlarm=5
Severity:
Critical=1
Major=2
Minor=3
Warning=4
AddInfo: Additional information on alarms
cpuUseGt: CPU utilization greater than, range 0 to 100%
memUseGt: Memory utilization greater than, range 0 to 100%
diskUseGt: Disk utilization greater than, range 0 to 100%');
INSERT INTO "sys_i18n" VALUES (754, 'job.ne_alarm_state_check_license', '网元告警-License到期检查', 'NE Alarm-License Expire Check');
INSERT INTO "sys_i18n" VALUES (755, 'job.ne_alarm_state_check_license_remark', '检查网元的License是否即将到期在出现过阈值时发出警报。
Alarm type:
CommunicationAlarm=1
EquipmentAlarm=2
ProcessingFailure=3
EnvironmentalAlarm=4
QualityOfServiceAlarm=5
Severity:
Critical=1
Major=2
Minor=3
Warning=4
AddInfo: 告警补充信息
dayLt: 天数小于默认30天', 'Checks if the network element is License is about to expire and sends an alert if a threshold is crossed.
Alarm type:
CommunicationAlarm=1
EquipmentAlarm=2
ProcessingFailure=3
EnvironmentalAlarm=4
QualityOfServiceAlarm=5
Severity:
Critical=1
Major=2
Minor=3
Warning=4
AddInfo: Additional information on alarms
dayLt: Days less than, default 30 days');

View File

@@ -34,16 +34,18 @@ ON "sys_job" (
-- Records of sys_job
-- ----------------------------
INSERT INTO "sys_job" VALUES (1, 'job.monitor_sys_resource', 'SYSTEM', 'monitor_sys_resource', '{"interval":5}', '0 0/5 * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.monitor_sys_resource_remark');
INSERT INTO "sys_job" VALUES (2, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_config_backup_remark');
INSERT INTO "sys_job" VALUES (3, 'job.ne_data_udm', 'SYSTEM', 'ne_data_udm', '', '0 0 0/12 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, '');
INSERT INTO "sys_job" VALUES (4, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{"alarmTitle":"NE State Check Alarm","alarmType":"2","origSeverity":"2","specificProblem":"alarm cause: the system state of target NE has not been received","specificProblemId":"AC10000","addInfo":""}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark');
INSERT INTO "sys_job" VALUES (5, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{"storeDays":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark');
INSERT INTO "sys_job" VALUES (6, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{"storeDays":7,"neList":["IMS","AMF","UDM","UPF","MME","SMSC","SMF","MME"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark');
INSERT INTO "sys_job" VALUES (7, 'job.delete_ne_config_backup', 'SYSTEM', 'delete_ne_config_backup', '{"storeDays":7,"storeNum":7}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_ne_config_backup_remark');
INSERT INTO "sys_job" VALUES (21, 'job.backup_export_table_sys_log_operate', 'SYSTEM', 'backup_export_table', '{"hour":1,"columns":["id","title","business_type","opera_by","opera_url_method","opera_url","opera_ip","status","opera_time","cost_time"],"tableName":"sys_log_operate","backupPath":"/log/operate_log"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_sys_log_operate_remark');
INSERT INTO "sys_job" VALUES (22, 'job.backup_export_table_cdr_event_ims', 'SYSTEM', 'backup_export_table', '{"hour":1,"columns":["id","record_type","call_type","caller_party","called_party","call_duration","cause","seizure_time","release_time"],"tableName":"cdr_event_ims","backupPath":"/cdr/ims_cdr"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_ims_remark');
INSERT INTO "sys_job" VALUES (23, 'job.backup_export_table_cdr_event_smf', 'SYSTEM', 'backup_export_table', '{"hour":1,"columns":["id","charging_id","subscription_id_data","subscription_id_type","data_volume_uplink","data_volume_downlink","data_total_volume","invocation_timestamp","user_identifier","ssc_mode","dnn_id","pdu_type","rat_type","pdu_ipv4","pdu_ipv6","network_function_ipv4_address","record_nfId","record_type","record_opening_time"],"tableName":"cdr_event_smf","backupPath":"/cdr/smf_cdr"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_smf_remark');
INSERT INTO "sys_job" VALUES (24, 'job.backup_export_table_cdr_event_smsc', 'SYSTEM', 'backup_export_table', '{"hour":1,"columns":["id","record_type","service_type","caller_party","called_party","result","update_time"],"tableName":"cdr_event_smsc","backupPath":"/cdr/smsc_cdr"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_smsc_remark');
INSERT INTO "sys_job" VALUES (25, 'job.backup_export_table_cdr_event_sgwc', 'SYSTEM', 'backup_export_table', '{"hour":1,"columns":["charging_id","served_imsi","served_msisdn","data_volume_gprs_uplink","data_volume_gprs_downlink","duration","invocation_timestamp","pgw_address_used","sgw_address","rat_type","pdp_pdn_type","served_pdppdn_address","serving_node_address","serving_node_type","access_point_name_ni","cause_for_rec_closing","record_sequence_number","local_record_sequence_number","record_type","record_opening_time"],"tableName":"cdr_event_sgwc","backupPath":"/cdr/sgwc_cdr"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_sgwc_remark');
INSERT INTO "sys_job" VALUES (26, 'job.backup_remove_file', 'SYSTEM', 'backup_remove_file', '[{"backupPath":"/log/operate_log","storeDays":30,"storeNum":7},{"backupPath":"/cdr/ims_cdr","storeDays":30},{"backupPath":"/cdr/smf_cdr","storeDays":30},{"backupPath":"/cdr/smsc_cdr","storeDays":30},{"backupPath":"/cdr/sgwc_cdr","storeDays":30},{"backupPath":"/udm_data/auth","storeDays":30},{"backupPath":"/udm_data/sub","storeDays":30},{"backupPath":"/udm_data/voip","storeDays":30},{"backupPath":"/udm_data/volte","storeDays":30}]', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_remove_file_remark');
INSERT INTO "sys_job" VALUES (27, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{"dataType":["auth","sub","voip","volte"],"fileType":"txt"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark');
INSERT INTO "sys_job" VALUES (6, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_config_backup_remark');
INSERT INTO "sys_job" VALUES (10, 'job.delete_ne_config_backup', 'SYSTEM', 'delete_ne_config_backup', '{"storeDays":7,"storeNum":7}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_ne_config_backup_remark');
INSERT INTO "sys_job" VALUES (11, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{"storeDays":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark');
INSERT INTO "sys_job" VALUES (12, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{"storeDays":7,"neList":["IMS","AMF","UDM","UPF","MME","SMSC","SMF","MME"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark');
INSERT INTO "sys_job" VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{"alarmTitle":"NE State Check Alarm","alarmType":"2","origSeverity":"2","specificProblem":"alarm cause: the system state of target NE has not been received","specificProblemId":"AC10000","addInfo":""}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark');
INSERT INTO "sys_job" VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{"alarmTitle":"NE State Check Alarm CPU/Menory/Disk","alarmType":"2","origSeverity":"2","specificProblem":"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold","specificProblemId":"AC10100","addInfo":"","cpuUseGt":70,"memUseGt":70,"diskUseGt":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark');
INSERT INTO "sys_job" VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{"alarmTitle":"NE State Check Alarm License","alarmType":"2","origSeverity":"2","specificProblem":"Alarm Cause: License received from target NE is about to expire","specificProblemId":"AC10200","addInfo":"","dayLt":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark');
INSERT INTO "sys_job" VALUES (30, 'job.backup_remove_file', 'SYSTEM', 'backup_remove_file', '[{"backupPath":"/udm_data/auth","storeDays":30},{"backupPath":"/udm_data/sub","storeDays":30},{"backupPath":"/udm_data/voip","storeDays":30},{"backupPath":"/udm_data/volte","storeDays":30},{"backupPath":"/cdr/ims_cdr_event","storeDays":30},{"backupPath":"/cdr/smsc_cdr_event","storeDays":30},{"backupPath":"/cdr/smf_cdr_event","storeDays":30},{"backupPath":"/cdr/sgwc_cdr_event","storeDays":30},{"backupPath":"/log/sys_log_operate","storeDays":30,"storeNum":7},{"backupPath":"/log/sys_log_login","storeDays":30,"storeNum":7}]', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_remove_file_remark');
INSERT INTO "sys_job" VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{"dataType":["auth","sub","voip","volte"],"fileType":"txt"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark');
INSERT INTO "sys_job" VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{"dataType":["ims","smf","sgwc","smsc"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark');
INSERT INTO "sys_job" VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{"dataType":["operate","login"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark');

View File

@@ -109,18 +109,18 @@ INSERT INTO "sys_menu" VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', '
INSERT INTO "sys_menu" VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm:auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm:voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2003, 'menu.neData.udmVolte', 5, 7, 'udm-volte', 'neData/udm-volte/index', '1', '0', 'M', '1', '1', 'udm:volte:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2004, 'menu.neData.imsSub', 5, 9, 'ims-sub', 'neData/ims-sub/index', '1', '0', 'M', '1', '1', 'ims:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2005, 'menu.neData.smfSub', 5, 12, 'smf-sub', 'neData/smf-sub/index', '1', '0', 'M', '1', '1', 'smf:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2006, 'menu.neData.baseOnline', 5, 15, 'base-online', 'neData/base-online/index', '1', '0', 'M', '0', '1', 'amf,mme:base-online:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2007, 'menu.neData.baseStation', 5, 18, 'base-station', 'neData/base-station/index', '1', '0', 'M', '1', '1', 'amf,mme:base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2008, 'menu.ueUser.n3iwf', 5, 20, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2009, 'menu.neData.pcfSub', 5, 24, 'pcf-sub', 'neData/pcf-sub/index', '1', '0', 'M', '1', '1', 'pcf:sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2010, 'menu.neUser.nssf', 5, 26, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'neUser:nssf:index', 'icon-daimayingyong', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2011, 'menu.neUser.nssfAmf', 5, 28, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'neUser:nssfAmf:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2003, 'menu.neData.udmVolte', 5, 7, 'udm-volte', 'neData/udm-volte/index', '1', '0', 'M', '1', '1', 'udm+ims#volte:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2004, 'menu.neData.imsSub', 5, 9, 'ims-sub', 'neData/ims-sub/index', '1', '0', 'M', '1', '1', 'ims#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2005, 'menu.neData.smfSub', 5, 12, 'smf-sub', 'neData/smf-sub/index', '1', '0', 'M', '1', '1', 'smf#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2006, 'menu.neData.baseOnline', 5, 15, 'base-online', 'neData/base-online/index', '1', '0', 'M', '0', '1', 'amf,mme#base-online:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2007, 'menu.neData.baseStation', 5, 18, 'base-station', 'neData/base-station/index', '1', '0', 'M', '1', '1', 'amf,mme#base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2008, 'menu.ueUser.n3iwf', 5, 20, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'n3iwf#sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2009, 'menu.neData.pcfSub', 5, 24, 'pcf-sub', 'neData/pcf-sub/index', '1', '0', 'M', '1', '1', 'pcf#sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2010, 'menu.neUser.nssf', 5, 26, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'nssf#sub:index', 'icon-daimayingyong', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2011, 'menu.neUser.nssfAmf', 5, 28, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'nssf#sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2083, 'menu.trace', 2087, 30, 'traceManage', '', '1', '0', 'D', '1', '1', '', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.traceRemark');
INSERT INTO "sys_menu" VALUES (2084, 'menu.trace.task', 2083, 1, 'task', 'traceManage/task/index', '1', '0', 'M', '1', '1', 'traceManage:task:index', 'icon-chexiao', '0', 'system', 1728641403588, 'system', 1744453890548, 'menu.trace.taskRemark');
INSERT INTO "sys_menu" VALUES (2085, 'menu.trace.taskData', 2083, 4, 'task/inline/data', 'traceManage/task/data', '1', '0', 'M', '0', '1', 'traceManage:task:data', '#', '0', 'system', 1728641403588, 'system', 1744453921381, '');
@@ -148,13 +148,13 @@ INSERT INTO "sys_menu" VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlMa
INSERT INTO "sys_menu" VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.udmRemark');
INSERT INTO "sys_menu" VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '1', '1', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.setRemark');
INSERT INTO "sys_menu" VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.omcRemark');
INSERT INTO "sys_menu" VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'sgwc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2113, 'menu.security', 0, 14, 'security', '', '1', '0', 'D', '1', '1', '', 'icon-suofang', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.securityRemark');
INSERT INTO "sys_menu" VALUES (2114, 'menu.system.systemSet', 1, 60, 'setting', 'system/setting/index', '1', '1', 'M', '1', '1', 'system:setting:index', 'icon-piliang', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemSetRemark');
INSERT INTO "sys_menu" VALUES (2115, 'menu.system.systemResource', 1, 6, 'monitor', 'monitor/monitor/index', '1', '1', 'M', '1', '1', 'monitor:monitor:info', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemResourceRemark');
INSERT INTO "sys_menu" VALUES (2116, 'menu.dashboard.smscCDR.content', 2157, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:smsc:content', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2117, 'menu.common.delete', 2140, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:ne:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2121, 'menu.system.user.editRole', 100, 8, '', '', '1', '1', 'B', '1', '1', 'system:user:editRole', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2122, 'menu.system.setting.i18n', 2114, 1, '', '', '1', '1', 'B', '1', '1', 'system:setting:i18n', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.setting.i18nRemark');
INSERT INTO "sys_menu" VALUES (2123, 'menu.log.neFile', 2089, 9, 'neFile', 'ne/neFile/index', '1', '0', 'M', '1', '1', 'ne:neFile:index', 'icon-tubiaohuizhi', '0', 'system', 1728641403588, 'system', 1728641403588, '');
@@ -169,7 +169,7 @@ INSERT INTO "sys_menu" VALUES (2133, 'menu.dashboard.imsCDR', 2140, 3, 'imsCDR',
INSERT INTO "sys_menu" VALUES (2135, 'menu.ne.neHost', 4, 15, 'neHost', 'ne/neHost/index', '1', '1', 'M', '1', '0', 'ne:neHost:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2136, 'menu.ne.neHostCommand', 4, 18, 'neHostCommand', 'ne/neHostCommand/index', '1', '0', 'M', '1', '0', 'ne:neHostCommand:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2137, 'menu.ne.neInfo', 4, 10, 'neInfo', 'ne/neInfo/index', '1', '0', 'M', '1', '1', 'ne:neInfo:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2138, 'menu.dashboard.amfUE', 2141, 1, 'amfUE', 'dashboard/amfUE/index', '1', '0', 'M', '1', '1', 'dashboard:amfUE:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2138, 'menu.dashboard.amfUE', 2141, 1, 'amfUE', 'dashboard/amfUE/index', '1', '0', 'M', '1', '1', 'amf#ue:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2140, 'menu.monitor.cdr', 2089, 10, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2141, 'menu.monitor.event', 2089, 20, 'event', '', '1', '0', 'D', '1', '1', '', 'icon-gengduo', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2142, 'menu.ne.neQuickSetup', 4, 40, 'neQuickSetup', 'ne/neQuickSetup/index', '1', '1', 'M', '1', '1', 'ne:neQuickSetup:list', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, '');
@@ -178,8 +178,8 @@ INSERT INTO "sys_menu" VALUES (2144, 'menu.ne.neSoftware', 4, 23, 'neSoftware',
INSERT INTO "sys_menu" VALUES (2145, 'menu.ne.neVersion', 4, 26, 'neVersion', 'ne/neVersion/index', '1', '0', 'M', '1', '1', 'ne:neVersion:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2146, 'menu.ne.neConfig', 4, 28, 'neConfig', 'ne/neConfig/index', '1', '0', 'M', '1', '1', 'ne:neConfig:list', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2147, 'menu.fault.event', 2129, 3, 'event', 'faultManage/event/index', '1', '0', 'M', '1', '1', 'faultManage:event:index', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2148, 'menu.dashboard.smfCDR', 2140, 6, 'smfCDR', 'dashboard/smfCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2149, 'menu.dashboard.mmeUE', 2141, 5, 'mmeUE', 'dashboard/mmeUE/index', '1', '0', 'M', '1', '1', 'dashboard:mmeUE:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2148, 'menu.dashboard.smfCDR', 2140, 6, 'smfCDR', 'dashboard/smfCDR/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2149, 'menu.dashboard.mmeUE', 2141, 5, 'mmeUE', 'dashboard/mmeUE/index', '1', '0', 'M', '1', '1', 'mme#ue:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2150, 'menu.system.user.editPost', 100, 9, '', '', '1', '1', 'B', '1', '1', 'system:user:editPost', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2151, 'menu.system.setting.doc', 2114, 2, '', '', '1', '1', 'B', '1', '1', 'system:setting:doc', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2152, 'menu.system.setting.official', 2114, 3, '', '', '1', '1', 'B', '1', '1', 'system:setting:official', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
@@ -187,7 +187,7 @@ INSERT INTO "sys_menu" VALUES (2153, 'menu.system.setting.lock', 2114, 4, '', ''
INSERT INTO "sys_menu" VALUES (2154, 'menu.ne.neConfigBackup', 4, 29, 'neConfigBackup', 'ne/neConfigBackup/index', '1', '0', 'M', '1', '1', 'ne:neConfigBackup:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2155, 'menu.common.delete', 2154, 1, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2156, 'menu.common.edit', 2154, 2, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'smsc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2158, 'menu.trace.pcapFile', 2083, 12, 'pcap/inline/file', 'traceManage/pcap/file', '1', '0', 'M', '0', '1', 'traceManage:pcap:index', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2159, 'menu.log.exportFile', 2089, 100, 'exportFile', 'logManage/exportFile/index', '1', '0', 'M', '1', '1', 'logManage:exportFile:index', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2160, 'menu.perf.kpiCReport', 2099, 100, 'kpiCReport', 'perfManage/kpiCReport/index', '1', '0', 'M', '1', '1', 'perfManage:kpiCReport:index', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, '');

View File

@@ -13,6 +13,7 @@ CREATE TABLE `ne_license` (
`ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID',
`activation_request_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '激活申请代码',
`license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '激活授权文件',
`capability` bigint DEFAULT '0' COMMENT '用户容量',
`serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '序列号',
`expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '许可证到期日期',
`status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态 0无效 1有效',

View File

@@ -5,21 +5,22 @@ SET FOREIGN_KEY_CHECKS = 0;
-- Table structure for table `ne_state`
--
DROP TABLE IF EXISTS `ne_state`;
CREATE TABLE `ne_state` (
`id` int NOT NULL AUTO_INCREMENT,
`ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`version` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`capability` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`expiry_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`cpu_usage` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息',
`mem_usage` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息',
`disk_space` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息',
`timestamp` bigint DEFAULT '0' COMMENT '创建时间',
`version` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '版本',
`capability` bigint DEFAULT '0' COMMENT '用户容量',
`serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '序列号',
`expiry_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '许可证到期日期',
`sys_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-sys',
`sys_mem_usage` float DEFAULT '0' COMMENT '内存使用率-sys',
`sys_disk_usage` float DEFAULT '0' COMMENT '磁盘使用率-sys',
`nf_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-nf',
`nf_mem_used` bigint DEFAULT '0' COMMENT '内存使用KB-nf',
`create_time` bigint DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_type_id_time` (`ne_type`,`ne_id`,`timestamp`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_状态记录';
KEY `idx_type_id_time` (`ne_type`,`ne_id`,`create_time`) USING BTREE COMMENT 'idx_state_ne_type_id_at'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_状态记录内存/CPU/磁盘';
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -6,8 +6,8 @@ DROP TABLE IF EXISTS `sys_i18n`;
CREATE TABLE `sys_i18n` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
`key_lable` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '多语言属性名',
`value_zh` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '中文',
`value_en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '英文',
`value_zh` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '中文',
`value_en` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '英文',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统_多语言';
@@ -295,7 +295,7 @@ INSERT INTO `sys_i18n` VALUES (277, 'config..export.key', '参数键名', 'Confi
INSERT INTO `sys_i18n` VALUES (278, 'config..export.value', '参数键值', 'Config Value');
INSERT INTO `sys_i18n` VALUES (279, 'config..export.type', '系统内置', 'Built In');
INSERT INTO `sys_i18n` VALUES (280, 'config..export.remark', '参数说明', 'Config Description');
INSERT INTO `sys_i18n` VALUES (281, 'config.sys.titleValue', '5G Core Network', 'Core Network');
INSERT INTO `sys_i18n` VALUES (281, 'config.sys.titleValue', 'Core Network', 'Core Network');
INSERT INTO `sys_i18n` VALUES (282, 'config.sys.copyrightValue', 'Copyright ©2025 Core Network', 'Copyright ©2025 Core Network');
INSERT INTO `sys_i18n` VALUES (283, 'config.noData', '没有可访问参数配置数据!', 'No parameter configuration data is accessible!');
INSERT INTO `sys_i18n` VALUES (284, 'config.errKey', '无效 key', 'Invalid key');
@@ -656,8 +656,8 @@ INSERT INTO `sys_i18n` VALUES (638, 'job.backup_export_table_cdr_event_ims', '
INSERT INTO `sys_i18n` VALUES (639, 'job.backup_export_table_cdr_event_smf', '备份-数据话单表定期导出', 'Backup-Regular Export of data sheet tables');
INSERT INTO `sys_i18n` VALUES (640, 'cache.name.oauth2_codes', '客户端授权码', 'Oauth2 Client Code');
INSERT INTO `sys_i18n` VALUES (641, 'cache.name.oauth2_devices', '客户端令牌', 'Oauth2 Token');
-- INSERT INTO `sys_i18n` VALUES (642, 'table.cdr_event_smf', '数据话单', 'Data CDR');
-- INSERT INTO `sys_i18n` VALUES (643, 'table.cdr_event_smsc', '短信话单', 'SMS CDR');
INSERT INTO `sys_i18n` VALUES (642, 'job.backup_export_cdr', '备份-CDR数据定期导出', 'Backup-Periodic export of CDR Data');
INSERT INTO `sys_i18n` VALUES (643, 'job.backup_export_cdr_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support ims/smf/sgwc/smsc\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time');
INSERT INTO `sys_i18n` VALUES (644, 'menu.log.exportFile', '导出文件', 'Exported File');
INSERT INTO `sys_i18n` VALUES (645, 'menu.perf.kpiCReport', '自定义指标数据', 'Custom Indicator Data');
INSERT INTO `sys_i18n` VALUES (646, 'menu.trace.taskHLR', 'HLR 跟踪任务', 'HLR Trace Task');
@@ -692,7 +692,7 @@ INSERT INTO `sys_i18n` VALUES (674, 'config.sys.user.passwdNotAllowedHistory', '
INSERT INTO `sys_i18n` VALUES (675, 'config.sys.user.passwdNotAllowedHistoryRemark', '创建新密码不等于之前使用的x次中的密码', 'Creating a new password that is not equal to the previously used password in x times');
INSERT INTO `sys_i18n` VALUES (676, 'login.errPasswdHistory', '不允许使用最近密码', 'Recent passwords not allowed');
INSERT INTO `sys_i18n` VALUES (677, 'log.operate.title.oauth2client', 'Oauth2客户端授权', 'Oauth2 Client Authorization');
-- INSERT INTO `sys_i18n` VALUES (678, 'config.ne.neConfigBackupFTPRemark', '请通过配置文件备份页面进行设置FTP信息', 'Please set the FTP information through the configuration file backup page.');
INSERT INTO `sys_i18n` VALUES (678, 'log.operate.title.pcfRule', '终端策略规则', 'UE PCC Rule');
INSERT INTO `sys_i18n` VALUES (679, 'dictType.trace_msg_type', '跟踪消息类型', 'Trace Message Type');
INSERT INTO `sys_i18n` VALUES (680, 'dictData.trace_msg_type.0', '请求', 'Request');
INSERT INTO `sys_i18n` VALUES (681, 'dictData.trace_msg_type.1', '响应', 'Response');
@@ -741,7 +741,7 @@ INSERT INTO `sys_i18n` VALUES (723, 'job.backup_export_table_cdr_event_smsc_rema
INSERT INTO `sys_i18n` VALUES (724, 'job.backup_export_table_cdr_event_sgwc_remark', 'hour: 数据时间从任务执行时间前的小时数\ntableName: 数据表名\ncolumns: 支持字段\nbackupPath: 备份输出路径 /usr/local/omc/backup/{backupPath}', 'hour: data time from the hour before the task execution time \ntableName: data table name \ncolumns: support fields \nbackupPath: backup output path /usr/local/omc/backup/{backupPath}');
INSERT INTO `sys_i18n` VALUES (725, 'job.backup_remove_file_remark', 'backupPath: 备份路径 /usr/local/omc/backup/{backupPath}\nstoreDays: 保留天数\nstoreNum: 保留数量默认保留7', 'backupPath: backup path /usr/local/omc/backup/{backupPath}\nstoreDays: retention days\nstoreNum: retention number, default retention 7');
INSERT INTO `sys_i18n` VALUES (726, 'job.backup_export_udm', '备份-UDM数据定期导出', 'Backup-Periodic export of UDM Data');
INSERT INTO `sys_i18n` VALUES (727, 'job.backup_export_udm_remark', 'dataType: 类型支持 auth/sub/voip/volte\nfileType: 文件类型 csv/txt', 'Backup-Periodic export of dataType: type support auth/sub/voip/volte\nfileType: file type csv/txtUDM Data');
INSERT INTO `sys_i18n` VALUES (727, 'job.backup_export_udm_remark', 'dataType: 类型支持 auth/sub/voip/volte\nfileType: 文件类型 csv/txt', 'Backup-Periodic export of dataType: type support auth/sub/voip/volte\nfileType: file type csv/txt');
INSERT INTO `sys_i18n` VALUES (728, 'dictData.cdr_sip_code_cause.0', '因其他原因呼叫失败', 'Call failure for other reason');
INSERT INTO `sys_i18n` VALUES (729, 'dictData.cdr_sip_code_cause.200', '正常通话清除', 'Normal Call Clearing');
INSERT INTO `sys_i18n` VALUES (730, 'dictData.cdr_sip_code_cause.202', '申请已被接受处理,但尚未完成 ', 'The request has been accepted for processing, but it hasn it completed yet');
@@ -764,5 +764,11 @@ INSERT INTO `sys_i18n` VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其
INSERT INTO `sys_i18n` VALUES (747, 'dictData.cdr_sip_code_cause.603', 'MT 明确拒绝通话', 'MT explicitly rejected the call');
INSERT INTO `sys_i18n` VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the users device, but some parts of the session setup weren it acceptable');
INSERT INTO `sys_i18n` VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause');
INSERT INTO `sys_i18n` VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data');
INSERT INTO `sys_i18n` VALUES (751, 'job.backup_export_log_remark', 'dataType: 类型支持 operate/login\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support operate/login\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time');
INSERT INTO `sys_i18n` VALUES (752, 'job.ne_alarm_state_check_cmd', '网元告警-内存/CPU/磁盘检查', 'NE Alarm-Memory/CPU/Disk Checks');
INSERT INTO `sys_i18n` VALUES (753, 'job.ne_alarm_state_check_cmd_remark', '检查网元的内存/CPU/磁盘检查健康状况,在出现过阈值时发出警报。\r\n\r\nAlarm type:\r\nCommunicationAlarm=1\r\nEquipmentAlarm=2\r\nProcessingFailure=3\r\nEnvironmentalAlarm=4\r\nQualityOfServiceAlarm=5\r\n\r\nSeverity:\r\nCritical=1\r\nMajor=2\r\nMinor=3\r\nWarning=4\r\n\r\nAddInfo: 告警补充信息\r\ncpuUseGt: CPU使用率大于 范围0~100%\r\nmemUseGt: 内存使用率大于, 范围0~100%\r\ndiskUseGt: 磁盘使用率大于, 范围0~100%', 'Checks the memory/CPU/disk check health of the network element and sends alerts when thresholds are crossed.\n\nAlarm type:\nCommunicationAlarm=1\nEquipmentAlarm=2\nProcessingFailure=3\nEnvironmentalAlarm=4\nQualityOfServiceAlarm=5\n\nSeverity:\nCritical=1\nMajor=2\nMinor=3\nWarning=4\r\n\r\nAddInfo: Additional information on alarms\r\ncpuUseGt: CPU utilization greater than, range 0 to 100%\r\nmemUseGt: Memory utilization greater than, range 0 to 100%\r\ndiskUseGt: Disk utilization greater than, range 0 to 100%');
INSERT INTO `sys_i18n` VALUES (754, 'job.ne_alarm_state_check_license', '网元告警-License到期检查', 'NE Alarm-License Expire Check');
INSERT INTO `sys_i18n` VALUES (755, 'job.ne_alarm_state_check_license_remark', '检查网元的License是否即将到期在出现过阈值时发出警报。\r\n\r\nAlarm type:\r\nCommunicationAlarm=1\r\nEquipmentAlarm=2\r\nProcessingFailure=3\r\nEnvironmentalAlarm=4\r\nQualityOfServiceAlarm=5\r\n\r\nSeverity:\r\nCritical=1\r\nMajor=2\r\nMinor=3\r\nWarning=4\r\n\r\nAddInfo: 告警补充信息\r\ndayLt: 天数小于默认30天', 'Checks if the network element is License is about to expire and sends an alert if a threshold is crossed.\n\nAlarm type:\nCommunicationAlarm=1\nEquipmentAlarm=2\nProcessingFailure=3\nEnvironmentalAlarm=4\nQualityOfServiceAlarm=5\n\nSeverity:\nCritical=1\nMajor=2\nMinor=3\nWarning=4\r\n\r\nAddInfo: Additional information on alarms\r\ndayLt: Days less than, default 30 days');
-- Dump completed on 2025-02-14 15:26:56

View File

@@ -29,20 +29,26 @@ CREATE TABLE `sys_job` (
-- Records of sys_job
-- ----------------------------
INSERT INTO `sys_job` VALUES (1, 'job.monitor_sys_resource', 'SYSTEM', 'monitor_sys_resource', '{\"interval\":5}', '0 0/5 * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.monitor_sys_resource_remark');
INSERT INTO `sys_job` VALUES (2, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_config_backup_remark');
INSERT INTO `sys_job` VALUES (3, 'job.ne_data_udm', 'SYSTEM', 'ne_data_udm', '', '0 0 0/12 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, '');
INSERT INTO `sys_job` VALUES (4, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{\"alarmTitle\":\"NE State Check Alarm\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"alarm cause: the system state of target NE has not been received\",\"specificProblemId\":\"AC10000\",\"addInfo\":\"\"}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark');
INSERT INTO `sys_job` VALUES (5, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{\"storeDays\":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark');
INSERT INTO `sys_job` VALUES (6, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{\"storeDays\":7,\"neList\":[\"IMS\",\"AMF\",\"UDM\",\"UPF\",\"MME\",\"SMSC\",\"SMF\",\"MME\"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark');
INSERT INTO `sys_job` VALUES (7, 'job.delete_ne_config_backup', 'SYSTEM', 'delete_ne_config_backup', '{\"storeDays\":7,\"storeNum\":7}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_ne_config_backup_remark');
INSERT INTO `sys_job` VALUES (6, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_config_backup_remark');
INSERT INTO `sys_job` VALUES (21, 'job.backup_export_table_sys_log_operate', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"title\",\"business_type\",\"opera_by\",\"opera_url_method\",\"opera_url\",\"opera_ip\",\"status\",\"opera_time\",\"cost_time\"],\"tableName\":\"sys_log_operate\",\"backupPath\":\"/log/operate_log\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_sys_log_operate_remark');
INSERT INTO `sys_job` VALUES (22, 'job.backup_export_table_cdr_event_ims', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"record_type\",\"call_type\",\"caller_party\",\"called_party\",\"call_duration\",\"cause\",\"seizure_time\",\"release_time\"],\"tableName\":\"cdr_event_ims\",\"backupPath\":\"/cdr/ims_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_ims_remark');
INSERT INTO `sys_job` VALUES (23, 'job.backup_export_table_cdr_event_smf', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"charging_id\",\"subscription_id_data\",\"subscription_id_type\",\"data_volume_uplink\",\"data_volume_downlink\",\"data_total_volume\",\"invocation_timestamp\",\"user_identifier\",\"ssc_mode\",\"dnn_id\",\"pdu_type\",\"rat_type\",\"pdu_ipv4\",\"pdu_ipv6\",\"network_function_ipv4_address\",\"record_nfId\",\"record_type\",\"record_opening_time\"],\"tableName\":\"cdr_event_smf\",\"backupPath\":\"/cdr/smf_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_smf_remark');
INSERT INTO `sys_job` VALUES (24, 'job.backup_export_table_cdr_event_smsc', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"record_type\",\"service_type\",\"caller_party\",\"called_party\",\"result\",\"update_time\"],\"tableName\":\"cdr_event_smsc\",\"backupPath\":\"/cdr/smsc_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_smsc_remark');
INSERT INTO `sys_job` VALUES (25, 'job.backup_export_table_cdr_event_sgwc', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"charging_id\",\"served_imsi\",\"served_msisdn\",\"data_volume_gprs_uplink\",\"data_volume_gprs_downlink\",\"duration\",\"invocation_timestamp\",\"pgw_address_used\",\"sgw_address\",\"rat_type\",\"pdp_pdn_type\",\"served_pdppdn_address\",\"serving_node_address\",\"serving_node_type\",\"access_point_name_ni\",\"cause_for_rec_closing\",\"record_sequence_number\",\"local_record_sequence_number\",\"record_type\",\"record_opening_time\"],\"tableName\":\"cdr_event_sgwc\",\"backupPath\":\"/cdr/sgwc_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_sgwc_remark');
INSERT INTO `sys_job` VALUES (26, 'job.backup_remove_file', 'SYSTEM', 'backup_remove_file', '[{\"backupPath\":\"/log/operate_log\",\"storeDays\":30,\"storeNum\":7},{\"backupPath\":\"/cdr/ims_cdr\",\"storeDays\":30},{\"backupPath\":\"/cdr/smf_cdr\",\"storeDays\":30},{\"backupPath\":\"/cdr/smsc_cdr\",\"storeDays\":30},{\"backupPath\":\"/cdr/sgwc_cdr\",\"storeDays\":30},{\"backupPath\":\"/udm_data/auth\",\"storeDays\":30},{\"backupPath\":\"/udm_data/sub\",\"storeDays\":30},{\"backupPath\":\"/udm_data/voip\",\"storeDays\":30},{\"backupPath\":\"/udm_data/volte\",\"storeDays\":30}]', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839,'job.backup_remove_file_remark');
INSERT INTO `sys_job` VALUES (27, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{\"dataType\":[\"auth\",\"sub\",\"voip\",\"volte\"],\"fileType\":\"txt\"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark');
INSERT INTO `sys_job` VALUES (10, 'job.delete_ne_config_backup', 'SYSTEM', 'delete_ne_config_backup', '{\"storeDays\":7,\"storeNum\":7}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_ne_config_backup_remark');
INSERT INTO `sys_job` VALUES (11, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{\"storeDays\":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark');
INSERT INTO `sys_job` VALUES (12, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{\"storeDays\":7,\"neList\":[\"IMS\",\"AMF\",\"UDM\",\"UPF\",\"MME\",\"SMSC\",\"SMF\",\"MME\"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark');
INSERT INTO `sys_job` VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{\"alarmTitle\":\"NE State Check Alarm\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"alarm cause: the system state of target NE has not been received\",\"specificProblemId\":\"AC10000\",\"addInfo\":\"\"}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark');
INSERT INTO `sys_job` VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{\"alarmTitle\":\"NE State Check Alarm CPU/Menory/Disk\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold\",\"specificProblemId\":\"AC10100\",\"addInfo\":\"\",\"cpuUseGt\":70,\"memUseGt\":70,\"diskUseGt\":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark');
INSERT INTO `sys_job` VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{\"alarmTitle\":\"NE State Check Alarm License\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"Alarm Cause: License received from target NE is about to expire\",\"specificProblemId\":\"AC10200\",\"addInfo\":\"\",\"dayLt\":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark');
INSERT INTO `sys_job` VALUES (30, 'job.backup_remove_file', 'SYSTEM', 'backup_remove_file', '[{\"backupPath\":\"/udm_data/auth\",\"storeDays\":30},{\"backupPath\":\"/udm_data/sub\",\"storeDays\":30},{\"backupPath\":\"/udm_data/voip\",\"storeDays\":30},{\"backupPath\":\"/udm_data/volte\",\"storeDays\":30},{\"backupPath\":\"/cdr/ims_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/smsc_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/smf_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/sgwc_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/log/sys_log_operate\",\"storeDays\":30,\"storeNum\":7},{\"backupPath\":\"/log/sys_log_login\",\"storeDays\":30,\"storeNum\":7}]', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_remove_file_remark');
INSERT INTO `sys_job` VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{\"dataType\":[\"auth\",\"sub\",\"voip\",\"volte\"],\"fileType\":\"txt\"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark');
INSERT INTO `sys_job` VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{\"dataType\":[\"ims\",\"smf\",\"sgwc\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark');
INSERT INTO `sys_job` VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{\"dataType\":[\"operate\",\"login\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark');
-- INSERT INTO `sys_job` VALUES (34, 'job.backup_export_table_sys_log_operate', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"title\",\"business_type\",\"opera_by\",\"opera_url_method\",\"opera_url\",\"opera_ip\",\"status\",\"opera_time\",\"cost_time\"],\"tableName\":\"sys_log_operate\",\"backupPath\":\"/log/operate_log\"}', '0 0 0/1 * * ?', '3', '0', '0', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_sys_log_operate_remark');
-- INSERT INTO `sys_job` VALUES (35, 'job.backup_export_table_cdr_event_ims', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"record_type\",\"call_type\",\"caller_party\",\"called_party\",\"call_duration\",\"cause\",\"seizure_time\",\"release_time\"],\"tableName\":\"cdr_event_ims\",\"backupPath\":\"/cdr/ims_cdr\"}', '0 0 0/1 * * ?', '3', '0', '0', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_ims_remark');
-- INSERT INTO `sys_job` VALUES (36, 'job.backup_export_table_cdr_event_smf', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"charging_id\",\"subscription_id_data\",\"subscription_id_type\",\"data_volume_uplink\",\"data_volume_downlink\",\"data_total_volume\",\"invocation_timestamp\",\"user_identifier\",\"ssc_mode\",\"dnn_id\",\"pdu_type\",\"rat_type\",\"pdu_ipv4\",\"pdu_ipv6\",\"network_function_ipv4_address\",\"record_nfId\",\"record_type\",\"record_opening_time\"],\"tableName\":\"cdr_event_smf\",\"backupPath\":\"/cdr/smf_cdr\"}', '0 0 0/1 * * ?', '3', '0', '0', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_smf_remark');
-- INSERT INTO `sys_job` VALUES (37, 'job.backup_export_table_cdr_event_smsc', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"record_type\",\"service_type\",\"caller_party\",\"called_party\",\"result\",\"update_time\"],\"tableName\":\"cdr_event_smsc\",\"backupPath\":\"/cdr/smsc_cdr\"}', '0 0 0/1 * * ?', '3', '0', '0', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_smsc_remark');
-- INSERT INTO `sys_job` VALUES (38, 'job.backup_export_table_cdr_event_sgwc', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"charging_id\",\"served_imsi\",\"served_msisdn\",\"data_volume_gprs_uplink\",\"data_volume_gprs_downlink\",\"duration\",\"invocation_timestamp\",\"pgw_address_used\",\"sgw_address\",\"rat_type\",\"pdp_pdn_type\",\"served_pdppdn_address\",\"serving_node_address\",\"serving_node_type\",\"access_point_name_ni\",\"cause_for_rec_closing\",\"record_sequence_number\",\"local_record_sequence_number\",\"record_type\",\"record_opening_time\"],\"tableName\":\"cdr_event_sgwc\",\"backupPath\":\"/cdr/sgwc_cdr\"}', '0 0 0/1 * * ?', '3', '0', '0', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_cdr_event_sgwc_remark');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -112,18 +112,18 @@ INSERT INTO `sys_menu` VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', '
INSERT INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm:auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm:voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2003, 'menu.neData.udmVolte', 5, 7, 'udm-volte', 'neData/udm-volte/index', '1', '0', 'M', '1', '1', 'udm:volte:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2004, 'menu.neData.imsSub', 5, 9, 'ims-sub', 'neData/ims-sub/index', '1', '0', 'M', '1', '1', 'ims:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2005, 'menu.neData.smfSub', 5, 12, 'smf-sub', 'neData/smf-sub/index', '1', '0', 'M', '1', '1', 'smf:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2006, 'menu.neData.baseOnline', 5, 15, 'base-online', 'neData/base-online/index', '1', '0', 'M', '0', '1', 'amf,mme:base-online:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2007, 'menu.neData.baseStation', 5, 18, 'base-station', 'neData/base-station/index', '1', '0', 'M', '1', '1', 'amf,mme:base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2008, 'menu.ueUser.n3iwf', 5, 20, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2009, 'menu.neData.pcfSub', 5, 24, 'pcf-sub', 'neData/pcf-sub/index', '1', '0', 'M', '1', '1', 'pcf:sub:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2010, 'menu.neUser.nssf', 5, 26, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'neUser:nssf:index', 'icon-daimayingyong', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2011, 'menu.neUser.nssfAmf', 5, 28, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'neUser:nssfAmf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2003, 'menu.neData.udmVolte', 5, 7, 'udm-volte', 'neData/udm-volte/index', '1', '0', 'M', '1', '1', 'udm+ims#volte:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2004, 'menu.neData.imsSub', 5, 9, 'ims-sub', 'neData/ims-sub/index', '1', '0', 'M', '1', '1', 'ims#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2005, 'menu.neData.smfSub', 5, 12, 'smf-sub', 'neData/smf-sub/index', '1', '0', 'M', '1', '1', 'smf#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2006, 'menu.neData.baseOnline', 5, 15, 'base-online', 'neData/base-online/index', '1', '0', 'M', '0', '1', 'amf,mme#base-online:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2007, 'menu.neData.baseStation', 5, 18, 'base-station', 'neData/base-station/index', '1', '0', 'M', '1', '1', 'amf,mme#base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2008, 'menu.ueUser.n3iwf', 5, 20, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'n3iwf#sub:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2009, 'menu.neData.pcfSub', 5, 24, 'pcf-sub', 'neData/pcf-sub/index', '1', '0', 'M', '1', '1', 'pcf#sub:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2010, 'menu.neUser.nssf', 5, 26, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'nssf#sub:index', 'icon-daimayingyong', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2011, 'menu.neUser.nssfAmf', 5, 28, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'nssf#sub:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2083, 'menu.trace', 2087, 30, 'traceManage', '', '1', '0', 'D', '1', '1', '', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.traceRemark');
INSERT INTO `sys_menu` VALUES (2084, 'menu.trace.task', 2083, 1, 'task', 'traceManage/task/index', '1', '0', 'M', '1', '1', 'traceManage:task:index', 'icon-chexiao', '0', 'system', 1728641403588, 'system', 1744453890548, 'menu.trace.taskRemark');
INSERT INTO `sys_menu` VALUES (2085, 'menu.trace.taskData', 2083, 4, 'task/inline/data', 'traceManage/task/data', '1', '0', 'M', '0', '1', 'traceManage:task:data', '#', '0', 'system', 1728641403588, 'system', 1744453921381, '');
@@ -151,13 +151,13 @@ INSERT INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlMa
INSERT INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.udmRemark');
INSERT INTO `sys_menu` VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '1', '1', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.setRemark');
INSERT INTO `sys_menu` VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.omcRemark');
INSERT INTO `sys_menu` VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'sgwc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2113, 'menu.security', 0, 14, 'security', '', '1', '0', 'D', '1', '1', '', 'icon-suofang', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.securityRemark');
INSERT INTO `sys_menu` VALUES (2114, 'menu.system.systemSet', 1, 60, 'setting', 'system/setting/index', '1', '1', 'M', '1', '1', 'system:setting:index', 'icon-piliang', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.systemSetRemark');
INSERT INTO `sys_menu` VALUES (2115, 'menu.system.systemResource', 1, 6, 'monitor', 'monitor/monitor/index', '1', '1', 'M', '1', '1', 'monitor:monitor:info', 'icon-soutubiao', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.systemResourceRemark');
INSERT INTO `sys_menu` VALUES (2116, 'menu.dashboard.smscCDR.content', 2157, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:smsc:content', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2117, 'menu.common.delete', 2140, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:ne:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588,'system', 1728641403588, '');
-- INSERT INTO `sys_menu` VALUES (2119, 'menu.ueUser.n3iwf', 5, 8, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
-- INSERT INTO `sys_menu` VALUES (2120, 'menu.ueUser.pcf', 5, 9, 'pcf', 'neUser/pcf/index', '1', '0', 'M', '1', '1', 'neUser:pcf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2121, 'menu.system.user.editRole', 100, 8, '', '', '1', '1', 'B', '1', '1', 'system:user:editRole', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
@@ -176,7 +176,7 @@ INSERT INTO `sys_menu` VALUES (2133, 'menu.dashboard.imsCDR', 2140, 3, 'imsCDR',
INSERT INTO `sys_menu` VALUES (2135, 'menu.ne.neHost', 4, 15, 'neHost', 'ne/neHost/index', '1', '1', 'M', '1', '0', 'ne:neHost:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2136, 'menu.ne.neHostCommand', 4, 18, 'neHostCommand', 'ne/neHostCommand/index', '1', '0', 'M', '1', '0', 'ne:neHostCommand:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2137, 'menu.ne.neInfo', 4, 10, 'neInfo', 'ne/neInfo/index', '1', '0', 'M', '1', '1', 'ne:neInfo:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2138, 'menu.dashboard.amfUE', 2141, 1, 'amfUE', 'dashboard/amfUE/index', '1', '0', 'M', '1', '1', 'dashboard:amfUE:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2138, 'menu.dashboard.amfUE', 2141, 1, 'amfUE', 'dashboard/amfUE/index', '1', '0', 'M', '1', '1', 'amf#ue:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2140, 'menu.monitor.cdr', 2089, 10, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2141, 'menu.monitor.event', 2089, 20, 'event', '', '1', '0', 'D', '1', '1', '', 'icon-gengduo', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2142, 'menu.ne.neQuickSetup', 4, 40, 'neQuickSetup', 'ne/neQuickSetup/index', '1', '1', 'M', '1', '1', 'ne:neQuickSetup:list', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, '');
@@ -185,8 +185,8 @@ INSERT INTO `sys_menu` VALUES (2144, 'menu.ne.neSoftware', 4, 23, 'neSoftware',
INSERT INTO `sys_menu` VALUES (2145, 'menu.ne.neVersion', 4, 26, 'neVersion', 'ne/neVersion/index', '1', '0', 'M', '1', '1', 'ne:neVersion:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2146, 'menu.ne.neConfig', 4, 28, 'neConfig', 'ne/neConfig/index', '1', '0', 'M', '1', '1', 'ne:neConfig:list', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2147, 'menu.fault.event', 2129, 3, 'event', 'faultManage/event/index', '1', '0', 'M', '1', '1', 'faultManage:event:index', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2148, 'menu.dashboard.smfCDR', 2140, 6, 'smfCDR', 'dashboard/smfCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2149, 'menu.dashboard.mmeUE', 2141, 5, 'mmeUE', 'dashboard/mmeUE/index', '1', '0', 'M', '1', '1', 'dashboard:mmeUE:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2148, 'menu.dashboard.smfCDR', 2140, 6, 'smfCDR', 'dashboard/smfCDR/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2149, 'menu.dashboard.mmeUE', 2141, 5, 'mmeUE', 'dashboard/mmeUE/index', '1', '0', 'M', '1', '1', 'mme#ue:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2150, 'menu.system.user.editPost', 100, 9, '', '', '1', '1', 'B', '1', '1', 'system:user:editPost', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2151, 'menu.system.setting.doc', 2114, 2, '', '', '1', '1', 'B', '1', '1', 'system:setting:doc', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2152, 'menu.system.setting.official', 2114, 3,'', '', '1', '1', 'B', '1', '1', 'system:setting:official', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
@@ -194,7 +194,7 @@ INSERT INTO `sys_menu` VALUES (2153, 'menu.system.setting.lock', 2114, 4, '', ''
INSERT INTO `sys_menu` VALUES (2154, 'menu.ne.neConfigBackup', 4, 29, 'neConfigBackup', 'ne/neConfigBackup/index', '1', '0', 'M', '1', '1', 'ne:neConfigBackup:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2155, 'menu.common.delete', 2154, 1, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2156, 'menu.common.edit', 2154, 2, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'smsc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2158, 'menu.trace.pcapFile', 2083, 12, 'pcap/inline/file', 'traceManage/pcap/file', '1', '0', 'M', '0', '1', 'traceManage:pcap:index', '#', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2159, 'menu.log.exportFile', 2089, 100, 'exportFile', 'logManage/exportFile/index', '1', '0', 'M', '1', '1', 'logManage:exportFile:index', 'icon-wenjian', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2160, 'menu.perf.kpiCReport', 2099, 100, 'kpiCReport', 'perfManage/kpiCReport/index', '1', '0', 'M', '1', '1', 'perfManage:kpiCReport:index', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, '');

View File

@@ -932,7 +932,7 @@ func GetEMSState(ip string) *SysState {
DbInfo: dbInfo,
IpAddr: ipAddrs,
Port: port,
Version: global.Version,
Version: cfg.Version,
Capability: CapabilityInt,
SerialNum: snStr,
ExpiryDate: expiryDateStr,

View File

@@ -73,6 +73,10 @@ var wg sync.WaitGroup
// @tag.description network data udm authentication interface
// @tag.name network_data/udm/sub
// @tag.description network data udm subscriber interface
// @tag.name network_data/udm/voip
// @tag.description network data udm voip interface
// @tag.name network_data/udm/volte-ims
// @tag.description network data udm volte interface
// @tag.name network_data/upf
// @tag.description network data upf interface
//

View File

@@ -2,8 +2,12 @@ package constants
// 告警 alarmCode 常量
const (
// ALARM_STATE_CHECK 告警-状态检查
ALARM_STATE_CHECK = 10000
// ALARM_EVENT_REBOOT 事件-网元重启
ALARM_EVENT_REBOOT = 9000
// ALARM_STATE_CHECK 告警-状态检查
ALARM_STATE_CHECK = 10000
// ALARM_RAM_CPU_CHECK 告警-内存/CPU/磁盘检查
ALARM_CMD_CHECK = 10001
// ALARM_LICENSE_CHECK 告警-网元License到期检查
ALARM_LICENSE_CHECK = 10002
)

View File

@@ -37,55 +37,6 @@ func TransferExeclUploadFile(file *multipart.FileHeader) (string, error) {
return filepath.ToSlash(writePathFile), nil
}
// 表格读取数据
//
// filePath 文件路径地址
//
// sheetName 工作簿名称, 空字符默认Sheet1
func ReadSheet(filePath, sheetName string) ([]map[string]string, error) {
data := make([]map[string]string, 0)
// 打开 Excel 文件
f, err := excelize.OpenFile(filePath)
if err != nil {
return data, err
}
defer func() {
if err := f.Close(); err != nil {
logger.Errorf("ReadSheet to close worksheet file : %v", err)
}
}()
// 检查工作簿是否存在
if sheetName == "" {
sheetName = "Sheet1"
}
if visible, _ := f.GetSheetVisible(sheetName); !visible {
return data, fmt.Errorf("failed to read workbook %s", sheetName)
}
// 获取工作簿记录
rows, err := f.GetRows(sheetName)
if err != nil {
return data, err
}
for i, row := range rows {
// 跳过第一行
if i == 0 {
continue
}
// 遍历每个单元格
rowData := map[string]string{}
for columnIndex, cellValue := range row {
columnName, _ := excelize.ColumnNumberToName(columnIndex + 1)
rowData[columnName] = cellValue
}
data = append(data, rowData)
}
return data, nil
}
// 表格写入数据
//
// headerCells 第一行表头标题 "A1":"?"
@@ -152,3 +103,112 @@ func WriteSheet(headerCells map[string]string, dataCells []map[string]any, fileN
}
return saveFilePath, nil
}
// WriterFileExecl 写入xlsx文件
//
// 例如:
// headerCells := map[string]string{"A1": "姓名", "B1": "年龄", "C1": "城市"}
//
// dataCells := []map[string]any{
// {"A2": "1", "B2": "2", "C2": "3"},
// }
//
// filePath := "example.xlsx"
// err := file.WriterFileExecl(headerCells, dataCells, filePath, "Sheet1")
func WriterFileExecl(headerCells map[string]string, dataCells []map[string]any, filePath, sheetName string) error {
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
logger.Errorf("WriterFileExecl to close worksheet file: %v", err)
}
}()
// 创建一个工作表
if sheetName == "" {
sheetName = "Sheet1"
}
index, err := f.NewSheet(sheetName)
if err != nil {
return fmt.Errorf("failed to create worksheet %v", err)
}
// 设置工作簿的默认工作表
f.SetActiveSheet(index)
// 首个和最后key名称
firstKey := "A"
lastKey := "B"
// 第一行表头标题
for key, title := range headerCells {
f.SetCellValue(sheetName, key, title)
if key[:1] > lastKey {
lastKey = key[:1]
}
}
// 设置工作表上宽度为 20
f.SetColWidth(sheetName, firstKey, lastKey, 20)
// 从第二行开始的数据
for _, cell := range dataCells {
for key, value := range cell {
f.SetCellValue(sheetName, key, value)
}
}
// 创建文件目录
if err := os.MkdirAll(filepath.Dir(filePath), 0775); err != nil {
return fmt.Errorf("failed to create save file %v", err)
}
// 根据指定路径保存文件
if err := f.SaveAs(filePath); err != nil {
return fmt.Errorf("failed to save worksheet %v", err)
}
return nil
}
// ReadFileExecl 读取xlsx文件 转换数组数据
func ReadFileExecl(filePath, sheetName string) ([]map[string]string, error) {
data := make([]map[string]string, 0)
// 打开 Excel 文件
f, err := excelize.OpenFile(filePath)
if err != nil {
return data, err
}
defer func() {
if err := f.Close(); err != nil {
logger.Errorf("ReadSheet to close worksheet file : %v", err)
}
}()
// 检查工作簿是否存在
if sheetName == "" {
sheetName = "Sheet1"
}
if visible, _ := f.GetSheetVisible(sheetName); !visible {
return data, fmt.Errorf("failed to read workbook %s", sheetName)
}
// 获取工作簿记录
rows, err := f.GetRows(sheetName)
if err != nil {
return data, err
}
for i, row := range rows {
// 跳过第一行
if i == 0 {
continue
}
// 遍历每个单元格
rowData := map[string]string{}
for columnIndex, cellValue := range row {
columnName, _ := excelize.ColumnNumberToName(columnIndex + 1)
rowData[columnName] = cellValue
}
data = append(data, rowData)
}
return data, nil
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,358 @@
package backup_export_log
import (
"encoding/json"
"fmt"
"path/filepath"
"runtime"
"strconv"
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/i18n"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/date"
"be.ems/src/framework/utils/file"
neDataService "be.ems/src/modules/network_data/service"
systemModel "be.ems/src/modules/system/model"
systemService "be.ems/src/modules/system/service"
)
var NewProcessor = &BackupExportLogProcessor{
count: 0,
backupService: neDataService.NewBackup,
sysLogLoginService: systemService.NewSysLogLogin,
sysOperateService: systemService.NewSysLogOperate,
}
// BackupExportLog 队列任务处理
type BackupExportLogProcessor struct {
count int // 执行次数
backupService *neDataService.Backup // 备份相关服务
sysLogLoginService *systemService.SysLogLogin // 系统登录日志服务
sysOperateService *systemService.SysLogOperate // 系统操作日志服务
}
func (s *BackupExportLogProcessor) Execute(data any) (any, error) {
s.count++ // 执行次数加一
options := data.(cron.JobData)
sysJob := options.SysJob
logger.Infof("重复:%v 任务ID:%d 执行次数:%d", options.Repeat, sysJob.JobId, s.count)
// 返回结果,用于记录执行结果
result := map[string]any{
"count": s.count,
}
var params struct {
DataType []string `json:"dataType"` // 类型支持 operate/login
FileType string `json:"fileType"` // 文件类型 csv/xlsx
Hour int `json:"hour"` // 数据时间从任务执行时间前的小时数
}
if err := json.Unmarshal([]byte(sysJob.TargetParams), &params); err != nil {
return nil, err
}
if !(params.FileType == "csv" || params.FileType == "xlsx") {
return nil, fmt.Errorf("file type error, only support csv,xlsx")
}
for _, v := range params.DataType {
switch v {
case "operate":
result[v] = s.exportOperate(params.Hour, params.FileType)
case "login":
result[v] = s.exportLogin(params.Hour, params.FileType)
}
}
// 返回结果,用于记录执行结果
return result, nil
}
// exportOperate 导出系统操作日志数据
func (s BackupExportLogProcessor) exportOperate(hour int, fileType string) string {
// 前 hour 小时
now := time.Now()
end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
start := end.Add(-time.Duration(hour) * time.Hour)
language := "en"
query := map[string]string{
"beginTime": fmt.Sprint(start.UnixMilli()),
"endTime": fmt.Sprint(end.UnixMilli()),
"pageNum": "1",
"pageSize": "30000",
}
rows, total := s.sysOperateService.FindByPage(query, "")
if total == 0 {
return "no data"
}
// 闭包函数处理多语言
converI18n := func(language string, arr *[]systemModel.SysLogOperate) {
for i := range *arr {
(*arr)[i].Title = i18n.TKey(language, (*arr)[i].Title)
(*arr)[i].OperaLocation = i18n.TKey(language, (*arr)[i].OperaLocation)
}
}
converI18n(language, &rows)
// 导出文件名称
fileName := fmt.Sprintf("sys_log_operate_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/log/sys_log_operate", fileName)
if runtime.GOOS == "windows" {
filePath = fmt.Sprintf("C:%s", filePath)
}
// 业务类型
businessTypeFunc := func(v string) string {
businessType := ""
switch v {
case "0":
// 业务操作类型-其它
businessType = i18n.TKey(language, "dictData.operType.other")
case "1":
// 业务操作类型-新增
businessType = i18n.TKey(language, "dictData.operType.add")
case "2":
// 业务操作类型-修改
businessType = i18n.TKey(language, "dictData.operType.edit")
case "3":
// 业务操作类型-删除
businessType = i18n.TKey(language, "dictData.operType.delete")
case "4":
// 业务操作类型-授权
businessType = i18n.TKey(language, "dictData.operType.auth")
case "5":
// 业务操作类型-导出
businessType = i18n.TKey(language, "dictData.operType.export")
case "6":
// 业务操作类型-导入
businessType = i18n.TKey(language, "dictData.operType.import")
case "7":
// 业务操作类型-强退
businessType = i18n.TKey(language, "dictData.operType.forced quit")
case "8":
// 业务操作类型-清空数据
businessType = i18n.TKey(language, "dictData.operType.clear")
}
return businessType
}
if fileType == "csv" {
// 转换数据
data := [][]string{
{
i18n.TKey(language, "log.operate.export.id"),
i18n.TKey(language, "log.operate.export.title"),
i18n.TKey(language, "log.operate.export.businessType"),
i18n.TKey(language, "log.operate.export.operName"),
i18n.TKey(language, "log.operate.export.method"),
i18n.TKey(language, "log.operate.export.ip"),
i18n.TKey(language, "log.operate.export.status"),
i18n.TKey(language, "log.operate.export.operTime"),
i18n.TKey(language, "log.operate.export.costTime"),
},
}
for _, row := range rows {
// 业务类型
businessType := businessTypeFunc(row.BusinessType)
// 状态
statusValue := i18n.TKey(language, "dictData.fail")
if row.StatusFlag == "1" {
statusValue = i18n.TKey(language, "dictData.success")
}
data = append(data, []string{
fmt.Sprint(row.ID),
row.Title,
businessType,
row.OperaBy,
row.OperaUrlMethod,
row.OperaIp,
statusValue,
date.ParseDateToStr(row.OperaTime, date.YYYY_MM_DDTHH_MM_SSZ),
fmt.Sprint(row.CostTime),
})
}
// 输出到文件
if err := file.WriterFileCSV(data, filePath); err != nil {
logger.Errorf("export operate log err => %v", err.Error())
return "export err"
}
}
if fileType == "xlsx" {
// 第一行表头标题
headerCells := map[string]string{
"A1": i18n.TKey(language, "log.operate.export.id"),
"B1": i18n.TKey(language, "log.operate.export.title"),
"C1": i18n.TKey(language, "log.operate.export.businessType"),
"D1": i18n.TKey(language, "log.operate.export.operName"),
"E1": i18n.TKey(language, "log.operate.export.method"),
"F1": i18n.TKey(language, "log.operate.export.ip"),
"G1": i18n.TKey(language, "log.operate.export.status"),
"H1": i18n.TKey(language, "log.operate.export.operTime"),
"I1": i18n.TKey(language, "log.operate.export.costTime"),
}
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
for i, row := range rows {
idx := strconv.Itoa(i + 2)
// 业务类型
businessType := businessTypeFunc(row.BusinessType)
// 状态
statusValue := i18n.TKey(language, "dictData.fail")
if row.StatusFlag == "1" {
statusValue = i18n.TKey(language, "dictData.success")
}
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: row.Title,
"C" + idx: businessType,
"D" + idx: row.OperaBy,
"E" + idx: row.OperaUrlMethod,
"F" + idx: row.OperaIp,
"G" + idx: statusValue,
"H" + idx: date.ParseDateToStr(row.OperaTime, date.YYYY_MM_DDTHH_MM_SSZ),
"I" + idx: row.CostTime,
})
}
// 导出数据表格
if err := file.WriterFileExecl(headerCells, dataCells, filePath, ""); err != nil {
logger.Errorf("export operate log err => %v", err.Error())
return "export err"
}
}
// 上传到FTP服务器
if err := s.backupService.FTPPushFile(filePath, "log"); err != nil {
return "ok, ftp err:" + err.Error()
}
return "ok"
}
// exportLogin 导出系统登录日志数据
func (s BackupExportLogProcessor) exportLogin(hour int, fileType string) string {
// 前 hour 小时
now := time.Now()
end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
start := end.Add(-time.Duration(hour) * time.Hour)
language := "en"
query := map[string]string{
"beginTime": fmt.Sprint(start.UnixMilli()),
"endTime": fmt.Sprint(end.UnixMilli()),
"pageNum": "1",
"pageSize": "30000",
}
rows, total := s.sysLogLoginService.FindByPage(query, "")
if total == 0 {
return "no data"
}
// 闭包函数处理多语言
converI18n := func(language string, arr *[]systemModel.SysLogLogin) {
for i := range *arr {
(*arr)[i].LoginLocation = i18n.TKey(language, (*arr)[i].LoginLocation)
(*arr)[i].OS = i18n.TKey(language, (*arr)[i].OS)
(*arr)[i].Browser = i18n.TKey(language, (*arr)[i].Browser)
(*arr)[i].Msg = i18n.TKey(language, (*arr)[i].Msg)
}
}
converI18n(language, &rows)
// 导出文件名称
fileName := fmt.Sprintf("sys_log_login_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/log/sys_log_login", fileName)
if runtime.GOOS == "windows" {
filePath = fmt.Sprintf("C:%s", filePath)
}
if fileType == "csv" {
// 转换数据
data := [][]string{
{
i18n.TKey(language, "log.login.export.id"),
i18n.TKey(language, "log.login.export.userName"),
i18n.TKey(language, "log.login.export.ip"),
i18n.TKey(language, "log.login.export.location"),
i18n.TKey(language, "log.login.export.os"),
i18n.TKey(language, "log.login.export.browser"),
i18n.TKey(language, "log.login.export.status"),
i18n.TKey(language, "log.login.export.time"),
i18n.TKey(language, "log.login.export.msg"),
},
}
for _, row := range rows {
// 状态
statusValue := i18n.TKey(language, "dictData.fail")
if row.StatusFlag == "1" {
statusValue = i18n.TKey(language, "dictData.success")
}
data = append(data, []string{
fmt.Sprint(row.ID),
row.UserName,
row.LoginIp,
row.LoginLocation,
row.OS,
row.Browser,
statusValue,
date.ParseDateToStr(row.LoginTime, date.YYYY_MM_DDTHH_MM_SSZ),
row.Msg,
})
}
// 输出到文件
if err := file.WriterFileCSV(data, filePath); err != nil {
logger.Errorf("export login log err => %v", err.Error())
return "export err"
}
}
if fileType == "xlsx" {
// 第一行表头标题
headerCells := map[string]string{
"A1": i18n.TKey(language, "log.login.export.id"),
"B1": i18n.TKey(language, "log.login.export.userName"),
"C1": i18n.TKey(language, "log.login.export.ip"),
"D1": i18n.TKey(language, "log.login.export.location"),
"E1": i18n.TKey(language, "log.login.export.os"),
"F1": i18n.TKey(language, "log.login.export.browser"),
"G1": i18n.TKey(language, "log.login.export.status"),
"H1": i18n.TKey(language, "log.login.export.time"),
"I1": i18n.TKey(language, "log.login.export.msg"),
}
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
for i, row := range rows {
idx := strconv.Itoa(i + 2)
// 状态
statusValue := i18n.TKey(language, "dictData.fail")
if row.StatusFlag == "1" {
statusValue = i18n.TKey(language, "dictData.success")
}
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: row.UserName,
"C" + idx: row.LoginIp,
"D" + idx: row.LoginLocation,
"E" + idx: row.OS,
"F" + idx: row.Browser,
"G" + idx: statusValue,
"H" + idx: date.ParseDateToStr(row.LoginTime, date.YYYY_MM_DDTHH_MM_SSZ),
"I" + idx: row.Msg,
})
}
// 导出数据表格
if err := file.WriterFileExecl(headerCells, dataCells, filePath, ""); err != nil {
logger.Errorf("export login log err => %v", err.Error())
return "export err"
}
}
// 上传到FTP服务器
if err := s.backupService.FTPPushFile(filePath, "log"); err != nil {
return "ok, ftp err:" + err.Error()
}
return "ok"
}

View File

@@ -88,13 +88,13 @@ func (s *NeAlarmStateCheckProcessor) Execute(data any) (any, error) {
// 在线且状态为活动告警
if isOnline && alarmStatus == "1" {
// 进行清除
newAlarm, err := s.alarmClear(neInfo, alarmIdArr[0])
clearAlarm, err := s.alarmClear(neInfo, alarmIdArr[0])
if err != nil {
result[neTypeAndId] = err.Error()
continue
}
groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId)
s.wsSendService.ByGroupID(groupID, newAlarm)
s.wsSendService.ByGroupID(groupID, clearAlarm)
result[neTypeAndId] = "alarm clear"
}
@@ -151,19 +151,19 @@ func (s NeAlarmStateCheckProcessor) alarmNew(neInfo neModel.NeInfo, v alarmParam
AlarmTitle: v.AlarmTitle,
AlarmCode: constants.ALARM_STATE_CHECK,
EventTime: lastTime,
AlarmType: "2",
OrigSeverity: "2",
PerceivedSeverity: "2",
AlarmType: v.AlarmType,
OrigSeverity: v.OrigSeverity,
PerceivedSeverity: v.OrigSeverity,
ObjectUid: neInfo.RmUID,
ObjectName: "SystemManagement;Heartbeat",
ObjectType: "SystemState",
LocationInfo: "SystemManagement.State: NE Heartbeat",
AlarmStatus: "1",
ObjectName: "NE State",
ObjectType: "state",
LocationInfo: "NE State: Heartbeat",
AlarmStatus: "1", // 活动告警
SpecificProblem: v.SpecificProblem,
SpecificProblemId: v.SpecificProblemID,
AddInfo: v.AddInfo,
}
insertId := s.alarmService.Insert(alarm)
insertId := s.alarmService.InsertAndForword(alarm)
if insertId > 0 {
alarm.ID = insertId
return alarm, nil

View File

@@ -0,0 +1,288 @@
package ne_alarm_state_check_cmd
import (
"encoding/json"
"fmt"
"sort"
"strconv"
"strings"
"time"
"be.ems/src/framework/constants"
"be.ems/src/framework/cron"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/parse"
neDataModel "be.ems/src/modules/network_data/model"
neDataService "be.ems/src/modules/network_data/service"
neModel "be.ems/src/modules/network_element/model"
neService "be.ems/src/modules/network_element/service"
wsService "be.ems/src/modules/ws/service"
)
var NewProcessor = &NeAlarmStateCheckCMDProcessor{
neConfigBackupService: neService.NewNeConfigBackup,
neInfoService: neService.NewNeInfo,
neStateService: neDataService.NewNEState,
alarmService: neDataService.NewAlarm,
wsSendService: wsService.NewWSSend,
count: 0,
}
// NeAlarmStateCheckCMDProcessor 网元告警内存/CPU/磁盘检查
type NeAlarmStateCheckCMDProcessor struct {
neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务
neInfoService *neService.NeInfo // 网元信息服务
neStateService *neDataService.NEState // 网元状态信息服务
alarmService *neDataService.Alarm // 告警信息服务
wsSendService *wsService.WSSend // ws发送服务
count int // 执行次数
}
// alarmParams 告警参数
type alarmParams struct {
AlarmTitle string `json:"alarmTitle"` // NE State Check Alarm CPU/Menory/Disk
AlarmType string `json:"alarmType"` // EquipmentAlarm=2
OrigSeverity string `json:"origSeverity"` // Major=2
SpecificProblem string `json:"specificProblem"` // Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold
SpecificProblemID string `json:"specificProblemId"` // AC10100
AddInfo string `json:"addInfo"` // 告警补充信息
CPUUseGt int64 `json:"cpuUseGt"` // CPU使用率大于 范围0~100%
MemUseGt int64 `json:"memUseGt"` // 内存使用率大于, 范围0~100%
DiskUseGt int64 `json:"diskUseGt"` // 磁盘使用率大于, 范围0~100%
// === 非参数字段 ===
AlarmId string // 告警ID
}
func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) {
s.count++ // 执行次数加一
options := data.(cron.JobData)
sysJob := options.SysJob
logger.Infof("重复:%v 任务ID:%d 执行次数:%d", options.Repeat, sysJob.JobId, s.count)
// 返回结果,用于记录执行结果
result := map[string]any{
"count": s.count,
}
// 读取参数值
var params alarmParams
err := json.Unmarshal([]byte(sysJob.TargetParams), &params)
if err != nil {
return nil, fmt.Errorf("json params err: %v", err)
}
// 检查使用率
if params.CPUUseGt > 100 || params.CPUUseGt < 0 {
return nil, fmt.Errorf("cpuUseGt must be between 0 and 100")
}
if params.MemUseGt > 100 || params.MemUseGt < 0 {
return nil, fmt.Errorf("memUseGt must be between 0 and 100")
}
if params.DiskUseGt > 100 || params.DiskUseGt < 0 {
return nil, fmt.Errorf("diskUseGt must be between 0 and 100")
}
neList := s.neInfoService.Find(neModel.NeInfo{}, true, false)
for _, neInfo := range neList {
if neInfo.CreateTime == 0 {
continue
}
// 网元在线状态
isOnline := parse.Boolean(neInfo.ServerState["online"])
if !isOnline {
continue
}
// 检查状态
err := s.serverState(neInfo.ServerState, params.CPUUseGt, params.MemUseGt, params.DiskUseGt)
if err == nil {
continue
}
neTypeAndId := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId)
// 告警ID
params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_CMD_CHECK, neInfo.CreateTime)
// 检查网元告警ID是否唯一
alarmIdArr := s.alarmService.Find(neDataModel.Alarm{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
AlarmId: params.AlarmId,
})
// 告警状态, 存在的需要手动清除
alarmStatus := ""
if len(alarmIdArr) > 0 {
alarmStatus = fmt.Sprint(alarmIdArr[0].AlarmStatus)
}
// 活动告警进行清除
if alarmStatus == "1" {
clearAlarm, err := s.alarmClear(neInfo, alarmIdArr[0])
if err != nil {
result[neTypeAndId] = err.Error()
continue
}
groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId)
s.wsSendService.ByGroupID(groupID, clearAlarm)
result[neTypeAndId] = "alarm clear"
alarmStatus = "" // 标记为未记录再次发起新告警
}
// 未记录
if alarmStatus == "" {
addInfo := params.AddInfo
if params.AddInfo != "" {
params.AddInfo = params.AddInfo + ", " + err.Error()
} else {
params.AddInfo = err.Error()
}
// 进行新增
newAlarm, err := s.alarmNew(neInfo, params)
params.AddInfo = addInfo // 恢复附加信息
if err != nil {
result[neTypeAndId] = err.Error()
continue
}
groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId)
s.wsSendService.ByGroupID(groupID, newAlarm)
result[neTypeAndId] = "alarm new"
}
}
// 返回结果,用于记录执行结果
return result, nil
}
// serverState 网元状态
func (s NeAlarmStateCheckCMDProcessor) serverState(state map[string]any, cpuUseGt, memUseGt, diskUseGt int64) error {
// 网元CPU使用率
var nfCpuUsage float64 = 0
// CPU使用率
var sysCpuUsage float64 = 0
if state["cpu"] != nil {
cpu := state["cpu"].(map[string]any)
v := parse.Number(cpu["sysCpuUsage"])
sysCpuUsage = float64(v) / 100
nfv := parse.Number(cpu["nfCpuUsage"])
nfCpuUsage = float64(nfv) / 100
}
// 网元内存使用KB
var nfMemUsed int64 = 0
// 内存使用率
var sysMemUsage float64 = 0
if state["mem"] != nil {
mem := state["mem"].(map[string]any)
v := parse.Number(mem["sysMemUsage"])
sysMemUsage = float64(v) / 100
nfMemUsed = parse.Number(mem["nfUsedMem"])
}
// 磁盘使用率
var sysDiskUsage float64 = 0
if state["disk"] != nil {
mem := state["disk"].(map[string]any)
disks := mem["partitionInfo"].([]any)
sort.Slice(disks, func(i, j int) bool {
iUsed := parse.Number(disks[i].(map[string]any)["used"])
jUsed := parse.Number(disks[j].(map[string]any)["used"])
return iUsed > jUsed
})
disk := disks[0].(map[string]any)
total := parse.Number(disk["total"])
used := parse.Number(disk["used"])
sysDiskUsage = (float64(used) / float64(total)) * 100
sysDiskUsage, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", sysDiskUsage), 64)
}
// 插入网元状态记录
neState := neDataModel.NEState{
NeType: fmt.Sprint(state["neType"]),
NeId: fmt.Sprint(state["neId"]),
Version: fmt.Sprint(state["version"]),
Capability: parse.Number(state["capability"]),
SerialNum: fmt.Sprint(state["sn"]),
ExpiryDate: fmt.Sprint(state["expire"]),
SysCpuUsage: sysCpuUsage,
SysMemUsage: sysMemUsage,
SysDiskUsage: sysDiskUsage,
NfCpuUsage: nfCpuUsage,
NfMemUsed: nfMemUsed,
CreateTime: parse.Number(state["refreshTime"]),
}
s.neStateService.Insert(neState)
// 删除网元状态记录7天前
s.neStateService.DeleteByTime(time.Now().UnixMilli() - 7*24*60*60*1000)
// 推送ws消息
groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_NE_STATE, neState.NeType, neState.NeId)
s.wsSendService.ByGroupID(groupID, neState)
// 检查CPU/Menory/Disk使用率
warnMsg := []string{}
if int64(sysCpuUsage) >= cpuUseGt {
warnMsg = append(warnMsg, fmt.Sprintf("cpu usage %.2f%%", sysCpuUsage))
}
if int64(sysMemUsage) >= memUseGt {
warnMsg = append(warnMsg, fmt.Sprintf("memory usage %.2f%%", sysMemUsage))
}
if int64(sysDiskUsage) >= diskUseGt {
warnMsg = append(warnMsg, fmt.Sprintf("disk usage %.2f%%", sysDiskUsage))
}
if len(warnMsg) > 0 {
return fmt.Errorf("greater than %s", strings.Join(warnMsg, ", "))
}
return nil
}
// alarmClear 清除告警
func (s NeAlarmStateCheckCMDProcessor) alarmClear(neInfo neModel.NeInfo, v neDataModel.Alarm) (neDataModel.Alarm, error) {
// 变更告警ID为告警清除ID
v.AlarmId = fmt.Sprintf("%d%d", v.AlarmCode, v.EventTime)
v.AlarmStatus = "0"
// 告警清除
v.ClearType = 1
v.ClearTime = neInfo.UpdateTime
v.ClearUser = "system"
rows := s.alarmService.Update(v)
if rows > 0 {
return v, nil
}
return neDataModel.Alarm{}, fmt.Errorf("clear alarm fail")
}
// alarmNew 新增告警
func (s NeAlarmStateCheckCMDProcessor) alarmNew(neInfo neModel.NeInfo, v alarmParams) (neDataModel.Alarm, error) {
// seq 告警序号
lastSeq := s.alarmService.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId)
lastTime := neInfo.UpdateTime // 网元最后更新时间
if lastTime < neInfo.CreateTime {
lastTime = time.Now().UnixMilli()
}
alarm := neDataModel.Alarm{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
NeName: neInfo.NeName,
Province: neInfo.Province,
PvFlag: neInfo.PvFlag,
AlarmSeq: lastSeq + 1,
AlarmId: v.AlarmId,
AlarmTitle: v.AlarmTitle,
AlarmCode: constants.ALARM_CMD_CHECK,
EventTime: lastTime,
AlarmType: v.AlarmType,
OrigSeverity: v.OrigSeverity,
PerceivedSeverity: v.OrigSeverity,
ObjectUid: neInfo.RmUID,
ObjectName: "NE CPU/Menory/Disk",
ObjectType: "cmd",
LocationInfo: "NE CPU/Menory/Disk: Heartbeat",
AlarmStatus: "1", // 活动告警
SpecificProblem: v.SpecificProblem,
SpecificProblemId: v.SpecificProblemID,
AddInfo: v.AddInfo,
}
insertId := s.alarmService.InsertAndForword(alarm)
if insertId > 0 {
alarm.ID = insertId
return alarm, nil
}
return neDataModel.Alarm{}, fmt.Errorf("new alarm fail")
}

View File

@@ -0,0 +1,213 @@
package ne_alarm_state_check_license
import (
"encoding/json"
"fmt"
"time"
"be.ems/src/framework/constants"
"be.ems/src/framework/cron"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/parse"
neDataModel "be.ems/src/modules/network_data/model"
neDataService "be.ems/src/modules/network_data/service"
neModel "be.ems/src/modules/network_element/model"
neService "be.ems/src/modules/network_element/service"
wsService "be.ems/src/modules/ws/service"
)
var NewProcessor = &NeAlarmStateCheckLicenseProcessor{
neConfigBackupService: neService.NewNeConfigBackup,
neInfoService: neService.NewNeInfo,
alarmService: neDataService.NewAlarm,
wsSendService: wsService.NewWSSend,
count: 0,
}
// NeAlarmStateCheckLicenseProcessor 网元告警License到期检查
type NeAlarmStateCheckLicenseProcessor struct {
neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务
neInfoService *neService.NeInfo // 网元信息服务
alarmService *neDataService.Alarm // 告警信息服务
wsSendService *wsService.WSSend // ws发送服务
count int // 执行次数
}
// alarmParams 告警参数
type alarmParams struct {
AlarmTitle string `json:"alarmTitle"` // NE State Check Alarm License
AlarmType string `json:"alarmType"` // EquipmentAlarm=2
OrigSeverity string `json:"origSeverity"` // Major=2
SpecificProblem string `json:"specificProblem"` // Alarm Cause: License received from target NE is about to expire
SpecificProblemID string `json:"specificProblemId"` // AC10200
AddInfo string `json:"addInfo"` // 告警补充信息
DayLt int64 `json:"dayLt"` // 天数小于默认30天
// === 非参数字段 ===
AlarmId string // 告警ID
}
func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) {
s.count++ // 执行次数加一
options := data.(cron.JobData)
sysJob := options.SysJob
logger.Infof("重复:%v 任务ID:%d 执行次数:%d", options.Repeat, sysJob.JobId, s.count)
// 返回结果,用于记录执行结果
result := map[string]any{
"count": s.count,
}
// 读取参数值
var params alarmParams
err := json.Unmarshal([]byte(sysJob.TargetParams), &params)
if err != nil {
return nil, fmt.Errorf("json params err: %v", err)
}
// 检查参数值
if params.DayLt == 0 {
params.DayLt = 30
}
neList := s.neInfoService.Find(neModel.NeInfo{}, true, false)
for _, neInfo := range neList {
if neInfo.CreateTime == 0 {
continue
}
// 网元在线状态
isOnline := parse.Boolean(neInfo.ServerState["online"])
if !isOnline {
continue
}
// 检查状态
err := s.serverState(neInfo.ServerState, params.DayLt)
if err == nil {
continue
}
if params.AddInfo != "" {
params.AddInfo = params.AddInfo + ", " + err.Error()
} else {
params.AddInfo = err.Error()
}
neTypeAndId := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId)
// 告警ID
params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_LICENSE_CHECK, neInfo.CreateTime)
// 检查网元告警ID是否唯一
alarmIdArr := s.alarmService.Find(neDataModel.Alarm{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
AlarmId: params.AlarmId,
})
// 告警状态, 存在的需要手动清除
alarmStatus := ""
if len(alarmIdArr) > 0 {
alarmStatus = fmt.Sprint(alarmIdArr[0].AlarmStatus)
}
// 活动告警进行清除
if alarmStatus == "1" {
clearAlarm, err := s.alarmClear(neInfo, alarmIdArr[0])
if err != nil {
result[neTypeAndId] = err.Error()
continue
}
groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId)
s.wsSendService.ByGroupID(groupID, clearAlarm)
result[neTypeAndId] = "alarm clear"
alarmStatus = "" // 标记为未记录再次发起新告警
}
// 未记录
if alarmStatus == "" {
// 进行新增
newAlarm, err := s.alarmNew(neInfo, params)
if err != nil {
result[neTypeAndId] = err.Error()
continue
}
groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId)
s.wsSendService.ByGroupID(groupID, newAlarm)
result[neTypeAndId] = "alarm new"
}
}
// 返回结果,用于记录执行结果
return result, nil
}
// serverState 网元状态
func (s NeAlarmStateCheckLicenseProcessor) serverState(state map[string]any, dayLt int64) error {
expire := fmt.Sprint(state["expire"])
if expire == "" || expire == "<nil>" || expire == "2099-12-31" {
return nil
}
// 解析过期时间
expireTime, err := time.Parse("2006-01-02", expire)
if err != nil {
return fmt.Errorf("parse expire time error: %v", err)
}
// 计算距离天数
daysLeft := int64(time.Since(expireTime).Hours() / 24)
if daysLeft < dayLt {
return fmt.Errorf("license will expire in %d days", daysLeft)
}
return nil
}
// alarmClear 清除告警
func (s NeAlarmStateCheckLicenseProcessor) alarmClear(neInfo neModel.NeInfo, v neDataModel.Alarm) (neDataModel.Alarm, error) {
// 变更告警ID为告警清除ID
v.AlarmId = fmt.Sprintf("%d%d", v.AlarmCode, v.EventTime)
v.AlarmStatus = "0"
// 告警清除
v.ClearType = 1
v.ClearTime = neInfo.UpdateTime
v.ClearUser = "system"
rows := s.alarmService.Update(v)
if rows > 0 {
return v, nil
}
return neDataModel.Alarm{}, fmt.Errorf("clear alarm fail")
}
// alarmNew 新增告警
func (s NeAlarmStateCheckLicenseProcessor) alarmNew(neInfo neModel.NeInfo, v alarmParams) (neDataModel.Alarm, error) {
// seq 告警序号
lastSeq := s.alarmService.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId)
lastTime := neInfo.UpdateTime // 网元最后更新时间
if lastTime < neInfo.CreateTime {
lastTime = time.Now().UnixMilli()
}
alarm := neDataModel.Alarm{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
NeName: neInfo.NeName,
Province: neInfo.Province,
PvFlag: neInfo.PvFlag,
AlarmSeq: lastSeq + 1,
AlarmId: v.AlarmId,
AlarmTitle: v.AlarmTitle,
AlarmCode: constants.ALARM_LICENSE_CHECK,
EventTime: lastTime,
AlarmType: v.AlarmType,
OrigSeverity: v.OrigSeverity,
PerceivedSeverity: v.OrigSeverity,
ObjectUid: neInfo.RmUID,
ObjectName: "NE License",
ObjectType: "license",
LocationInfo: "NE License: Heartbeat",
AlarmStatus: "1", // 活动告警
SpecificProblem: v.SpecificProblem,
SpecificProblemId: v.SpecificProblemID,
AddInfo: v.AddInfo,
}
insertId := s.alarmService.InsertAndForword(alarm)
if insertId > 0 {
alarm.ID = insertId
return alarm, nil
}
return neDataModel.Alarm{}, fmt.Errorf("new alarm fail")
}

View File

@@ -2,6 +2,8 @@ package processor
import (
"be.ems/src/framework/cron"
processorBackupExportCDR "be.ems/src/modules/crontask/processor/backup_export_cdr"
processorBackupExportLog "be.ems/src/modules/crontask/processor/backup_export_log"
processorBackupExportTable "be.ems/src/modules/crontask/processor/backup_export_table"
processorBackupExportUDM "be.ems/src/modules/crontask/processor/backup_export_udm"
processorBackupRemoveFile "be.ems/src/modules/crontask/processor/backup_remove_file"
@@ -11,6 +13,8 @@ import (
processorDeleteNeConfigBackup "be.ems/src/modules/crontask/processor/delete_ne_config_backup"
processorMonitorSysResource "be.ems/src/modules/crontask/processor/monitor_sys_resource"
processorNeAlarmStateCheck "be.ems/src/modules/crontask/processor/ne_alarm_state_check"
processorNeAlarmStateCheckCMD "be.ems/src/modules/crontask/processor/ne_alarm_state_check_cmd"
processorNeAlarmStateCheckLicense "be.ems/src/modules/crontask/processor/ne_alarm_state_check_license"
processorNeConfigBackup "be.ems/src/modules/crontask/processor/ne_config_backup"
processorNeDataUDM "be.ems/src/modules/crontask/processor/ne_data_udm"
)
@@ -23,8 +27,13 @@ func InitCronQueue() {
cron.CreateQueue("ne_config_backup", processorNeConfigBackup.NewProcessor)
// 网元数据-UDM用户数据同步
cron.CreateQueue("ne_data_udm", processorNeDataUDM.NewProcessor)
// 网元告警-状态检查
cron.CreateQueue("ne_alarm_state_check", processorNeAlarmStateCheck.NewProcessor)
// 网元告警-内存/CPU/磁盘检查
cron.CreateQueue("ne_alarm_state_check_cmd", processorNeAlarmStateCheckCMD.NewProcessor)
// 网元告警-License到期检查
cron.CreateQueue("ne_alarm_state_check_license", processorNeAlarmStateCheckLicense.NewProcessor)
// 删除-表内数据记录
cron.CreateQueue("delete_data_record", processorDeleteDataRecord.NewProcessor)
@@ -41,4 +50,8 @@ func InitCronQueue() {
cron.CreateQueue("backup_remove_file", processorBackupRemoveFile.NewProcessor)
// 备份-导出UDM用户数据
cron.CreateQueue("backup_export_udm", processorBackupExportUDM.NewProcessor)
// 备份-导出CDR数据
cron.CreateQueue("backup_export_cdr", processorBackupExportCDR.NewProcessor)
// 备份-导出Log数据
cron.CreateQueue("backup_export_log", processorBackupExportLog.NewProcessor)
}

View File

@@ -0,0 +1,59 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"be.ems/src/framework/resp"
"be.ems/src/modules/network_data/model"
neDataService "be.ems/src/modules/network_data/service"
neService "be.ems/src/modules/network_element/service"
)
// 实例化控制层 NEStateController 结构体
var NewNEState = &NEStateController{
neInfoService: neService.NewNeInfo,
neStateService: neDataService.NewNEState,
}
// 网元状态记录
//
// PATH /ne-state
type NEStateController struct {
neInfoService *neService.NeInfo // 网元信息服务
neStateService *neDataService.NEState // 网元状态服务
}
// 网元状态记录-内存/CPU/磁盘列表
//
// GET /list
//
// @Tags network_data
// @Accept json
// @Produce json
// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(AMF)
// @Param neId query string true "NE ID" default(001)
// @Param pageNum query number true "pageNum" default(1)
// @Param pageSize query number true "pageSize" default(10)
// @Param startTime query number false "Start time (timestamped milliseconds)" default(1729162507596)
// @Param endTime query number false "End time (timestamped milliseconds)" default(1729164187611)
// @Param sortField query string false "Sort fields, fill in result fields" Enums(id,create_time) default(id)
// @Param sortOrder query string false "Sort by ascending or descending order" Enums(asc,desc) default(asc)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary NE Status Record - Memory/CPU/Disk List
// @Description NE Status Record - Memory/CPU/Disk List
// @Router /ne-state/list [get]
func (s NEStateController) List(c *gin.Context) {
var query model.NEStateQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询数据
rows, total := s.neStateService.FindByPage(query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}

View File

@@ -0,0 +1,328 @@
package controller
import (
"fmt"
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
neFetchlink "be.ems/src/modules/network_element/fetch_link"
neService "be.ems/src/modules/network_element/service"
"github.com/gin-gonic/gin"
)
// 实例化控制层 PCFController 结构体
var NewPCF = &PCFController{
neInfoService: neService.NewNeInfo,
}
// 网元PCF
//
// PATH /pcf
type PCFController struct {
neInfoService *neService.NeInfo // 网元信息服务
}
// 策略配置列表
//
// GET /rule/list
//
// @Tags network_data/pcf
// @Accept json
// @Produce json
// @Param neId query string true "NE ID" default(001)
// @Param imsi query string false "IMSI"
// @Param msisdn query string false "MSISDN"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Policy Configuration List
// @Description Policy Configuration List
// @Router /neData/pcf/rule/list [get]
func (s PCFController) RuleInfoList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
NeId string `form:"neId" binding:"required"`
IMSI string `form:"imsi"`
MSISDN string `form:"msisdn"`
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询网元信息
neInfo := s.neInfoService.FindByNeTypeAndNeID("PCF", query.NeId)
if neInfo.NeId != query.NeId || neInfo.IP == "" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元直连
data, err := neFetchlink.PCFRuleInfo(neInfo, map[string]string{
"imsi": query.IMSI,
"msisdn": query.MSISDN,
})
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.OkData(data))
}
// 策略配置添加
//
// POST /rule
//
// @Tags network_data/pcf
// @Accept json
// @Produce json
// @Param data body object true "Request Param"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Policy Configuration Additions
// @Description Policy Configuration Additions
// @Router /neData/pcf/rule [post]
func (s PCFController) RuleInfoAdd(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
NeId string `json:"neId" binding:"required"` // 网元ID
Num int64 `json:"num"` // 批量添加默认0单条大于1时imsi/msisdn会累加数值
ParamData map[string]any `json:"paramData" binding:"required"` // 参数数据
// Imsi string `json:"imsi" binding:"required"`
// Msisdn string `json:"msisdn" binding:"required"`
// Sar string `json:"sar"` // 根据PCF参数配置Service Area Restriction -> Name
// PccRules string `json:"pccRules"` // 根据PCF参数配置PCC Rules -> Rule ID
// QosAudio string `json:"qosAudio"` // 根据PCF参数配置QoS Template -> QoS ID
// QosVideo string `json:"qosVideo"` // 根据PCF参数配置QoS Template -> QoS ID
// SessRules string `json:"sessRules"` // 根据PCF参数配置Session Rules -> Rule ID
// HdrEnrich string `json:"hdrEnrich"` // 根据PCF参数配置Header Enrich Template -> Template Name
// UePolicy string `json:"uePolicy"` // UE策略模板(样例: uep_001)
// Rfsp int64 `json:"rfsp"` // 无线频率选择优先级
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询网元信息
neInfo := s.neInfoService.FindByNeTypeAndNeID("PCF", body.NeId)
if neInfo.NeId != body.NeId || neInfo.IP == "" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元直连
var err error
if body.Num > 0 { // 批量添加
err = neFetchlink.PCFRuleAddBatch(neInfo, body.ParamData, body.Num)
} else { // 单条添加
err = neFetchlink.PCFRuleAdd(neInfo, body.ParamData)
}
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.Ok(nil))
}
// 策略配置更新
//
// PUT /rule
//
// @Tags network_data/pcf
// @Accept json
// @Produce json
// @Param data body object true "Request Param"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Policy Configuration Updates
// @Description Policy Configuration Updates
// @Router /neData/pcf/rule [put]
func (s PCFController) RuleInfoEdit(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
NeId string `json:"neId" binding:"required"` // 网元ID
Num int64 `json:"num"` // 更新数量
ParamData map[string]any `json:"paramData" binding:"required"` // 参数数据
// Imsi string `json:"imsi" binding:"required"`
// Msisdn string `json:"msisdn" binding:"required"`
// Sar string `json:"sar"` // 根据PCF参数配置Service Area Restriction -> Name
// PccRules string `json:"pccRules"` // 根据PCF参数配置PCC Rules -> Rule ID
// QosAudio string `json:"qosAudio"` // 根据PCF参数配置QoS Template -> QoS ID
// QosVideo string `json:"qosVideo"` // 根据PCF参数配置QoS Template -> QoS ID
// SessRules string `json:"sessRules"` // 根据PCF参数配置Session Rules -> Rule ID
// HdrEnrich string `json:"hdrEnrich"` // 根据PCF参数配置Header Enrich Template -> Template Name
// UePolicy string `json:"uePolicy"` // UE策略模板(样例: uep_001)
// Rfsp int64 `json:"rfsp"` // 无线频率选择优先级
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询网元信息
neInfo := s.neInfoService.FindByNeTypeAndNeID("PCF", body.NeId)
if neInfo.NeId != body.NeId || neInfo.IP == "" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元直连
var err error
if body.Num > 0 { // 批量更新
err = neFetchlink.PCFRuleUpdateBatch(neInfo, body.ParamData, body.Num)
} else { // 单条更新
err = neFetchlink.PCFRuleUpdate(neInfo, body.ParamData)
}
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.Ok(nil))
}
// 策略配置删除
//
// DELETE /rule
//
// @Tags network_data/pcf
// @Accept json
// @Produce json
// @Param neId query string true "NE ID" default(001)
// @Param imsi query string true "IMSi, batch deletion with quantity"
// @Param num query number false "Number of deletions"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Policy Configuration Deletion
// @Description Policy Configuration Deletion
// @Router /neData/pcf/rule [delete]
func (s PCFController) RuleInfoRemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
NeId string `form:"neId" binding:"required"` // 网元ID
IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量删除
Num int64 `form:"num"` // 删除数量
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询网元信息
neInfo := s.neInfoService.FindByNeTypeAndNeID("PCF", query.NeId)
if neInfo.NeId != query.NeId || neInfo.IP == "" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元直连
var err error
if query.Num > 0 { // 批量删除
err = neFetchlink.PCFRuleDeleteBatch(neInfo, query.IMSI, query.Num)
} else { // 单条删除
err = neFetchlink.PCFRuleDelete(neInfo, query.IMSI)
}
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.Ok(nil))
}
// 策略配置导出
//
// GET /rule/export
//
// @Tags network_data/pcf
// @Accept json
// @Produce json
// @Param neId query string true "NE ID" default(001)
// @Param fileType query string true "File Type" default(txt)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Policy Configuration Export
// @Description Policy Configuration Export
// @Router /neData/pcf/rule/export [get]
func (s PCFController) RuleInfoExport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
NeId string `form:"neId" binding:"required"`
FileType string `form:"fileType" binding:"required,oneof=txt"` // 文件类型
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询网元信息
neInfo := s.neInfoService.FindByNeTypeAndNeID("PCF", query.NeId)
if neInfo.NeId != query.NeId || neInfo.IP == "" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元直连
data, err := neFetchlink.PCFRuleExport(neInfo, map[string]string{
"fileType": query.FileType,
})
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.Writer.Header().Set("Content-Disposition", `attachment; filename="pcf_rule_export.txt"`)
c.Data(200, "application/octet-stream", data)
}
// 策略配置导入
//
// PUT /rule/import
//
// @Tags network_data/pcf
// @Accept json
// @Produce json
// @Param neId query string true "NE ID" default(001)
// @Param fileType query string true "File Type" default(txt)
// @Param filePath query string true "File Path" default(/tmp/pcfuser.txt)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Policy Configuration Import
// @Description Policy Configuration Import
// @Router /neData/pcf/rule/import [put]
func (s PCFController) RuleInfoImport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
NeId string `json:"neId" binding:"required"`
FileType string `json:"fileType" binding:"required,oneof=txt"` // 文件类型
FilePath string `json:"filePath" binding:"required"` // 网元端文件所在绝对路径
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询网元信息
neInfo := s.neInfoService.FindByNeTypeAndNeID("PCF", body.NeId)
if neInfo.NeId != body.NeId || neInfo.IP == "" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元直连
output, err := neFetchlink.PCFRuleImport(neInfo, map[string]any{
"type": body.FileType,
"filePath": body.FilePath,
})
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.OkMsg(output))
}

View File

@@ -0,0 +1,35 @@
package model
// NEState 网元状态记录表 ne_state
type NEState struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeType string `json:"neType" gorm:"column:ne_type"`
NeId string `json:"neId" gorm:"column:ne_id"`
Version string `json:"version" gorm:"column:version"` // 版本
Capability int64 `json:"capability" gorm:"column:capability"` // 用户容量
SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号
ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期
SysCpuUsage float64 `json:"sysCpuUsage" gorm:"column:sys_cpu_usage"` // cpu使用率-sys
SysMemUsage float64 `json:"sysMemUsage" gorm:"column:sys_mem_usage"` // 内存使用率-sys
SysDiskUsage float64 `json:"sysDiskUsage" gorm:"column:sys_disk_usage"` // 磁盘使用率-sys
NfCpuUsage float64 `json:"nfCpuUsage" gorm:"column:nf_cpu_usage"` // cpu使用率-nf
NfMemUsed int64 `json:"nfMemUsed" gorm:"column:nf_mem_used"` // 内存使用KB-nf
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
}
// TableName 表名称
func (*NEState) TableName() string {
return "ne_state"
}
// NEStateQuery 查询参数结构体
type NEStateQuery struct {
NeType string `json:"neType" form:"neType" binding:"required"`
NeID string `json:"neId" form:"neId" binding:"required"`
PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"`
PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"`
BeginTime string `json:"beginTime" form:"beginTime"`
EndTime string `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=id create_time"` // 排序字段,填写结果字段
SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序asc desc
}

View File

@@ -84,6 +84,15 @@ func Setup(router *gin.Engine) {
)
}
// 网元状态记录信息
neStateGroup := neDataGroup.Group("/ne-state")
{
neStateGroup.GET("/list",
middleware.AuthorizeUser(nil),
controller.NewNEState.List,
)
}
// 基站状态历史记录信息 含AMF/MME
nbStateGroup := neDataGroup.Group("/nb-state")
{
@@ -476,6 +485,40 @@ func Setup(router *gin.Engine) {
controller.NewSGWC.CDRExport,
)
}
// 网元PCF
pcfGroup := neDataGroup.Group("/pcf")
{
pcfGroup.GET("/rule/list",
middleware.AuthorizeUser(nil),
controller.NewPCF.RuleInfoList,
)
pcfGroup.POST("/rule",
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.pcfRule", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewPCF.RuleInfoAdd,
)
pcfGroup.PUT("/rule",
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.pcfRule", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewPCF.RuleInfoEdit,
)
pcfGroup.DELETE("/rule",
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.pcfRule", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewPCF.RuleInfoRemove,
)
pcfGroup.GET("/rule/export",
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.pcfRule", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewPCF.RuleInfoExport,
)
pcfGroup.PUT("/rule/import",
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.pcfRule", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewPCF.RuleInfoImport,
)
}
}
// InitLoad 初始参数

View File

@@ -26,10 +26,10 @@ func (r CDREventIMS) SelectByPage(query model.CDREventIMSQuery) ([]model.CDREven
tx = tx.Where("rm_uid = ?", query.RmUID)
}
if query.BeginTime != 0 {
tx = tx.Where("timestamp >= ?", query.BeginTime)
tx = tx.Where("created_at >= ?", query.BeginTime)
}
if query.EndTime != 0 {
tx = tx.Where("timestamp <= ?", query.EndTime)
tx = tx.Where("created_at <= ?", query.EndTime)
}
if query.CallerParty != "" {
tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", query.CallerParty)

View File

@@ -5,6 +5,7 @@ import (
"be.ems/src/framework/database/db"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/date"
"be.ems/src/modules/network_data/model"
)
@@ -35,14 +36,14 @@ func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64)
if len(startTime) == 10 {
startTime = startTime + "000"
}
tx = tx.Where("create_time >= ?", startTime)
tx = tx.Where("time >= ?", date.ParseDateToStr(startTime, date.YYYY_MM_DDTHH_MM_SSZ))
}
if query.EndTime != "" {
endTime := query.EndTime
if len(endTime) == 10 {
endTime = endTime + "999"
}
tx = tx.Where("create_time <= ?", endTime)
tx = tx.Where("time <= ?", date.ParseDateToStr(endTime, date.YYYY_MM_DDTHH_MM_SSZ))
}
// 查询结果

View File

@@ -0,0 +1,110 @@
package repository
import (
"time"
"be.ems/src/framework/database/db"
"be.ems/src/framework/logger"
"be.ems/src/modules/network_data/model"
)
// 实例化数据层 NEState 结构体
var NewNEState = &NEState{}
// NEState 网元状态记录表 数据层处理
type NEState struct{}
// SelectByPage 分页查询集合
func (r NEState) SelectByPage(query model.NEStateQuery) ([]model.NEState, int64) {
tx := db.DB("").Model(&model.NEState{})
// 查询条件拼接
if query.NeType != "" {
tx = tx.Where("ne_type = ?", query.NeType)
}
if query.NeID != "" {
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.BeginTime != "" {
startTime := query.BeginTime
if len(startTime) == 10 {
startTime = startTime + "000"
}
tx = tx.Where("create_time >= ?", startTime)
}
if query.EndTime != "" {
endTime := query.EndTime
if len(endTime) == 10 {
endTime = endTime + "999"
}
tx = tx.Where("create_time <= ?", endTime)
}
// 查询结果
var total int64 = 0
rows := []model.NEState{}
// 查询数量为0直接返回
if err := tx.Count(&total).Error; err != nil || total <= 0 {
return rows, total
}
// 排序
if query.SortField != "" {
sortField := query.SortField
if query.SortOrder == "desc" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize)
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
}
return rows, total
}
// SelectByIds 通过ID查询
func (r NEState) SelectByIds(ids []string) []model.NEState {
rows := []model.NEState{}
if len(ids) <= 0 {
return rows
}
tx := db.DB("").Model(&model.NEState{})
// 构建查询条件
tx = tx.Where("id in ?", ids)
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows
}
return rows
}
// DeleteByTime 删除信息
func (r NEState) DeleteByTime(ltTime int64) int64 {
if ltTime <= 0 {
return 0
}
tx := db.DB("").Where("create_time < ?", ltTime)
if err := tx.Delete(&model.NEState{}).Error; err != nil {
logger.Errorf("delete err => %v", err.Error())
return 0
}
return tx.RowsAffected
}
// Insert 新增信息
func (r NEState) Insert(param model.NEState) int64 {
param.CreateTime = time.Now().UnixMilli()
// 执行插入
if err := db.DB("").Create(&param).Error; err != nil {
logger.Errorf("insert err => %v", err.Error())
return 0
}
return param.ID
}

View File

@@ -77,7 +77,7 @@ func (r Alarm) AlarmClearByIds(ids []int64, clearUser string) (int64, error) {
var rows int64 = 0
for _, v := range arr {
// 状态检查AlarmCode变更告警ID
if v.AlarmCode == constants.ALARM_STATE_CHECK {
if v.AlarmCode == constants.ALARM_STATE_CHECK || v.AlarmCode == constants.ALARM_CMD_CHECK || v.AlarmCode == constants.ALARM_LICENSE_CHECK {
v.AlarmId = fmt.Sprintf("%d%d", v.AlarmCode, v.EventTime)
}
v.AlarmStatus = "0"
@@ -120,6 +120,15 @@ func (r Alarm) AlarmAckByIds(ids []int64, ackUser string, ackState bool) (int64,
return 0, fmt.Errorf("ack fail")
}
// InsertAndForword 新增信息并转发通知
func (s Alarm) InsertAndForword(param model.Alarm) int64 {
rows := s.alarmRepository.Insert(param)
if rows > 0 {
// 转发通知 TODO
}
return rows
}
// ExportXlsx 导出数据到 xlsx 文件
func (r Alarm) ExportXlsx(rows []model.Alarm, fileName, language, alarmStatus string) (string, error) {
// 第一行表头标题

View File

@@ -51,15 +51,16 @@ func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language str
// 第一行表头标题
headerCells := map[string]string{
"A1": "ID",
"B1": "Record Behavior",
"C1": "Type",
"D1": "Caller",
"E1": "Called",
"F1": "Duration",
"G1": "Result Code",
"H1": "Result Cause",
"I1": "Call Start Time",
"J1": "Hangup Time",
"B1": "NE Name",
"C1": "Record Behavior",
"D1": "Type",
"E1": "Caller",
"F1": "Called",
"G1": "Duration",
"H1": "Result Code",
"I1": "Result Cause",
"J1": "Call Start Time",
"K1": "Hangup Time",
}
// 读取字典数据 CDR SIP响应代码类别类型
dictCDRSipCode := sysService.NewSysDictData.FindByType("cdr_sip_code")
@@ -154,15 +155,16 @@ func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language str
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: recordType,
"C" + idx: callTypeLable,
"D" + idx: caller,
"E" + idx: called,
"F" + idx: duration,
"G" + idx: callResult,
"H" + idx: callCause,
"I" + idx: seizureTimeStr,
"J" + idx: releaseTimeStr,
"B" + idx: row.NeName,
"C" + idx: recordType,
"D" + idx: callTypeLable,
"E" + idx: caller,
"F" + idx: called,
"G" + idx: duration,
"H" + idx: callResult,
"I" + idx: callCause,
"J" + idx: seizureTimeStr,
"K" + idx: releaseTimeStr,
})
}

View File

@@ -72,7 +72,6 @@ func (r CDREventSMF) ExportXlsx(rows []model.CDREventSMF, fileName string) (stri
}
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
for i, row := range rows {
idx := strconv.Itoa(i + 2)
// 解析 JSON 字符串为 map

View File

@@ -51,12 +51,13 @@ func (r CDREventSMSC) ExportXlsx(rows []model.CDREventSMSC, fileName, language s
// 第一行表头标题
headerCells := map[string]string{
"A1": "ID",
"B1": "Record Behavior",
"C1": "Service Type",
"D1": "Caller",
"E1": "Called",
"F1": "Result",
"G1": "Time",
"B1": "NE Name",
"C1": "Record Behavior",
"D1": "Service Type",
"E1": "Caller",
"F1": "Called",
"G1": "Result",
"H1": "Time",
}
// 读取字典数据 CDR 原因码
dictCDRCauseCode := sysService.NewSysDictData.FindByType("cdr_cause_code")
@@ -121,12 +122,13 @@ func (r CDREventSMSC) ExportXlsx(rows []model.CDREventSMSC, fileName, language s
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: recordType,
"C" + idx: serviceType,
"D" + idx: caller,
"E" + idx: called,
"F" + idx: callResult,
"G" + idx: timeStr,
"B" + idx: row.NeName,
"C" + idx: recordType,
"D" + idx: serviceType,
"E" + idx: caller,
"F" + idx: called,
"G" + idx: callResult,
"H" + idx: timeStr,
})
}

View File

@@ -0,0 +1,31 @@
package service
import (
"be.ems/src/modules/network_data/model"
"be.ems/src/modules/network_data/repository"
)
// 实例化数据层 NEState 结构体
var NewNEState = &NEState{
neStateRepository: repository.NewNEState,
}
// NEState 网元状态记录表 服务层处理
type NEState struct {
neStateRepository *repository.NEState // 网元状态记录信息
}
// FindByPage 根据条件分页查询
func (r NEState) FindByPage(query model.NEStateQuery) ([]model.NEState, int64) {
return r.neStateRepository.SelectByPage(query)
}
// Insert 插入数据
func (r NEState) Insert(item model.NEState) int64 {
return r.neStateRepository.Insert(item)
}
// DeleteByTime 删除数据
func (r NEState) DeleteByTime(ltTime int64) int64 {
return r.neStateRepository.DeleteByTime(ltTime)
}

View File

@@ -335,7 +335,7 @@ func (s NeConfigController) DataAdd(c *gin.Context) {
}
// 网元直连
resData, err := neFetchlink.NeConfigInstall(neInfo, body.ParamName, body.Loc, body.ParamData)
resData, err := neFetchlink.NeConfigAdd(neInfo, body.ParamName, body.Loc, body.ParamData)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return

View File

@@ -397,13 +397,16 @@ func (s NeInfoController) Add(c *gin.Context) {
if v, ok := body.ServerState["version"]; ok && v != nil {
neVersion.Name = "-"
neVersion.Path = "-"
neVersion.Version = v.(string)
neVersion.Version = fmt.Sprint(v)
}
if v, ok := body.ServerState["capability"]; ok && v != nil {
neLicense.Capability = parse.Number(v)
}
if v, ok := body.ServerState["sn"]; ok && v != nil {
neLicense.SerialNum = v.(string)
neLicense.SerialNum = fmt.Sprint(v)
}
if v, ok := body.ServerState["expire"]; ok && v != nil {
neLicense.ExpiryDate = v.(string)
neLicense.ExpiryDate = fmt.Sprint(v)
neLicense.Status = "1"
}
}
@@ -495,14 +498,17 @@ func (s NeInfoController) Edit(c *gin.Context) {
if v, ok := body.ServerState["version"]; ok && v != nil {
neVersion.Name = "-"
neVersion.Path = "-"
neVersion.Version = v.(string)
neVersion.Version = fmt.Sprint(v)
neVersion.UpdateBy = loginUserName
}
if v, ok := body.ServerState["capability"]; ok && v != nil {
neLicense.Capability = parse.Number(v)
}
if v, ok := body.ServerState["sn"]; ok && v != nil {
neLicense.SerialNum = v.(string)
neLicense.SerialNum = fmt.Sprint(v)
}
if v, ok := body.ServerState["expire"]; ok && v != nil {
neLicense.ExpiryDate = v.(string)
neLicense.ExpiryDate = fmt.Sprint(v)
neLicense.Status = "1"
neLicense.UpdateBy = loginUserName
}

View File

@@ -156,6 +156,7 @@ func (s *NeLicenseController) Code(c *gin.Context) {
if licensePath != "" {
neLicense.LicensePath = licensePath
} else {
neLicense.Capability = 0
neLicense.SerialNum = ""
neLicense.ExpiryDate = ""
neLicense.Status = "0"
@@ -259,6 +260,7 @@ func (s *NeLicenseController) State(c *gin.Context) {
}
if neState, err := neFetchlink.NeState(neInfo); err == nil && neState["sn"] != nil {
neLicense.Status = "1"
neLicense.Capability = parse.Number(neState["capability"])
neLicense.SerialNum = fmt.Sprint(neState["sn"])
neLicense.ExpiryDate = fmt.Sprint(neState["expire"])
} else {
@@ -274,9 +276,10 @@ func (s *NeLicenseController) State(c *gin.Context) {
s.neLicenseService.Update(neLicense)
if neLicense.Status == "1" {
c.JSON(200, resp.OkData(map[string]string{
"sn": neLicense.SerialNum,
"expire": neLicense.ExpiryDate,
c.JSON(200, resp.OkData(map[string]any{
"capability": neLicense.Capability,
"sn": neLicense.SerialNum,
"expire": neLicense.ExpiryDate,
}))
return
}

View File

@@ -109,19 +109,19 @@ func NeConfigUpdate(neInfo model.NeInfo, paramName, loc string, data map[string]
return resData, nil
}
// NeConfigInstall 网元配置新增 array
func NeConfigInstall(neInfo model.NeInfo, paramName, loc string, data map[string]any) (map[string]any, error) {
// NeConfigAdd 网元配置新增 array
func NeConfigAdd(neInfo model.NeInfo, paramName, loc string, data map[string]any) (map[string]any, error) {
// 网元参数配置新增array
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
var resData map[string]any
if err != nil {
errStr := err.Error()
logger.Warnf("NeConfigInfoAdd Post \"%s\"", neUrl)
logger.Warnf("NeConfigAdd Post \"%s\"", neUrl)
if strings.HasPrefix(errStr, "201") || strings.HasPrefix(errStr, "204") {
return resData, nil
}
logger.Errorf("NeConfigInfoAdd %s", errStr)
logger.Errorf("NeConfigAdd %s", errStr)
return nil, fmt.Errorf("NeService Config Add API Error")
}
@@ -133,7 +133,7 @@ func NeConfigInstall(neInfo model.NeInfo, paramName, loc string, data map[string
// 序列化结果
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("NeConfigInfoAdd Unmarshal %s", err.Error())
logger.Errorf("NeConfigAdd Unmarshal %s", err.Error())
return nil, err
}
return resData, nil

View File

@@ -0,0 +1,280 @@
package fetchlink
import (
"encoding/json"
"fmt"
"strings"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/fetch"
"be.ems/src/modules/network_element/model"
)
// PCFRuleInfo PCF策略配置查询信息
func PCFRuleInfo(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IP, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["imsi"]; ok && v != "" {
query = append(query, fmt.Sprintf("imsi=%s", v))
}
if v, ok := data["msisdn"]; ok && v != "" {
query = append(query, fmt.Sprintf("msisdn=%s", v))
}
if len(query) > 0 {
neUrl = fmt.Sprintf("%s?%s", neUrl, strings.Join(query, "&"))
}
var resData map[string]any
resBytes, err := fetch.Get(neUrl, nil, 60_000)
if err != nil {
errStr := err.Error()
logger.Warnf("PCFRuleInfo Get \"%s\"", neUrl)
logger.Errorf("PCFRuleInfo %s", errStr)
return nil, fmt.Errorf("NeService PCF API Error")
}
// 序列化结果
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleInfo Unmarshal %s", err.Error())
return nil, err
}
// 固定返回字段,方便前端解析
if v, ok := resData["data"]; ok && v != nil {
if arr := v.([]any); len(arr) > 0 {
result := make([]map[string]any, len(arr))
for i, item := range arr {
result[i] = item.(map[string]any)
}
return result, nil
}
}
return []map[string]any{}, nil
}
// PCFRuleAdd PCF策略配置添加
func PCFRuleAdd(neInfo model.NeInfo, data any) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IP, neInfo.Port)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
if err != nil {
errStr := err.Error()
// 正常
if strings.HasPrefix(errStr, "201") {
return nil
}
// 错误结果
if strings.HasPrefix(errStr, "400") {
// 序列化结果
var resData map[string]any
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleAdd Unmarshal %s", err.Error())
return err
}
return fmt.Errorf("%s", resData["cause"])
}
logger.Warnf("PCFRuleAdd Put \"%s\"", neUrl)
logger.Errorf("PCFRuleAdd %s", errStr)
return fmt.Errorf("NeService PCF API Error")
}
return nil
}
// PCFRuleAddBatch PCF策略配置批量添加
func PCFRuleAddBatch(neInfo model.NeInfo, data map[string]any, num int64) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IP, neInfo.Port, num)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
if err != nil {
errStr := err.Error()
// 正常
if strings.HasPrefix(errStr, "201") {
return nil
}
// 错误结果
if strings.HasPrefix(errStr, "400") {
// 序列化结果
var resData map[string]any
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleAddBatch Unmarshal %s", err.Error())
return err
}
return fmt.Errorf("%s", resData["cause"])
}
logger.Warnf("PCFRuleAddBatch Put \"%s\"", neUrl)
logger.Errorf("PCFRuleAddBatch %s", errStr)
return fmt.Errorf("NeService PCF API Error")
}
return nil
}
// PCFRuleUpdate PCF策略配置修改
func PCFRuleUpdate(neInfo model.NeInfo, data map[string]any) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IP, neInfo.Port)
resBytes, err := fetch.PutJSON(neUrl, data, nil)
if err != nil {
errStr := err.Error()
// 错误结果
if strings.HasPrefix(errStr, "400") {
// 序列化结果
var resData map[string]any
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleUpdate Unmarshal %s", err.Error())
return err
}
return fmt.Errorf("%s", resData["cause"])
}
logger.Warnf("PCFRuleUpdate Put \"%s\"", neUrl)
logger.Errorf("PCFRuleUpdate %s", errStr)
return fmt.Errorf("NeService PCF API Error")
}
return nil
}
// PCFRuleUpdateBatch PCF策略配置批量修改
func PCFRuleUpdateBatch(neInfo model.NeInfo, data map[string]any, num int64) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IP, neInfo.Port, num)
resBytes, err := fetch.PutJSON(neUrl, data, nil)
if err != nil {
errStr := err.Error()
// 错误结果
if strings.HasPrefix(errStr, "400") {
// 序列化结果
var resData map[string]any
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleUpdateBatch Unmarshal %s", err.Error())
return err
}
return fmt.Errorf("%s", resData["cause"])
}
logger.Warnf("PCFRuleUpdateBatch Put \"%s\"", neUrl)
logger.Errorf("PCFRuleUpdateBatch %s", errStr)
return fmt.Errorf("NeService PCF API Error")
}
return nil
}
// PCFRuleDelete PCF策略配置删除
func PCFRuleDelete(neInfo model.NeInfo, imsi string) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?imsi=%s", neInfo.IP, neInfo.Port, imsi)
resBytes, err := fetch.Delete(neUrl, nil)
if err != nil {
errStr := err.Error()
// 正常
if strings.HasPrefix(errStr, "204") {
return nil
}
// 错误结果
if strings.HasPrefix(errStr, "400") {
// 序列化结果
var resData map[string]any
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleDelete Unmarshal %s", err.Error())
return err
}
return fmt.Errorf("%s", resData["cause"])
}
logger.Warnf("PCFRuleDelete Delete \"%s\"", neUrl)
logger.Errorf("PCFRuleDelete %s", errStr)
return fmt.Errorf("NeService PCF API Error")
}
return nil
}
// PCFRuleDeleteBatch PCF策略配置批量删除
func PCFRuleDeleteBatch(neInfo model.NeInfo, imsi string, num int64) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d?imsi=%s", neInfo.IP, neInfo.Port, num, imsi)
resBytes, err := fetch.Delete(neUrl, nil)
if err != nil {
errStr := err.Error()
// 正常
if strings.HasPrefix(errStr, "204") {
return nil
}
// 错误结果
if strings.HasPrefix(errStr, "400") {
// 序列化结果
var resData map[string]any
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleDeleteBatch Unmarshal %s", err.Error())
return err
}
return fmt.Errorf("%s", resData["cause"])
}
logger.Warnf("PCFRuleDeleteBatch Delete \"%s\"", neUrl)
logger.Errorf("PCFRuleDeleteBatch %s", errStr)
return fmt.Errorf("NeService PCF API Error")
}
return nil
}
// PCFRuleExport PCF策略配置导出
func PCFRuleExport(neInfo model.NeInfo, data map[string]string) ([]byte, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/export", neInfo.IP, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["fileType"]; ok && v != "" {
query = append(query, fmt.Sprintf("fileType=%s", v))
}
if len(query) > 0 {
neUrl = fmt.Sprintf("%s?%s", neUrl, strings.Join(query, "&"))
}
resBytes, err := fetch.Get(neUrl, nil, 30_000)
if err != nil {
logger.Warnf("PCFRuleExport Get \"%s\"", neUrl)
logger.Errorf("PCFRuleExport %s", err.Error())
return nil, fmt.Errorf("NeService PCF API Error")
}
return resBytes, nil
}
// PCFRuleImport PCF策略配置导入
func PCFRuleImport(neInfo model.NeInfo, data map[string]any) (string, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/import", neInfo.IP, neInfo.Port)
resBytes, err := fetch.PutJSON(neUrl, data, nil)
var resData map[string]any
if err != nil {
errStr := err.Error()
// 错误结果
if strings.HasPrefix(errStr, "400") {
// 序列化结果
var resData map[string]any
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleDeleteBatch Unmarshal %s", err.Error())
return "", err
}
return "", fmt.Errorf("%s", resData["cause"])
}
logger.Warnf("PCFRuleImport Put \"%s\"", neUrl)
logger.Errorf("PCFRuleImport %s", errStr)
return "", fmt.Errorf("NeService PCF API Error")
}
// 200 成功无数据时
if len(resBytes) == 0 {
return "", nil
}
// 序列化结果
err = json.Unmarshal(resBytes, &resData)
if err != nil {
logger.Errorf("PCFRuleImport Unmarshal %s", err.Error())
return "", err
}
return fmt.Sprint(resData["data"]), nil
}

View File

@@ -7,6 +7,7 @@ type NeLicense struct {
NeId string `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
ActivationRequestCode string `json:"activationRequestCode" gorm:"column:activation_request_code"` // 激活申请代码
LicensePath string `json:"licensePath" gorm:"column:license_path"` // 激活授权文件
Capability int64 `json:"capability" gorm:"column:capability"` // 用户容量
SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号
ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期
Status string `json:"status" gorm:"column:status"` // 状态 0无效 1有效

View File

@@ -655,7 +655,7 @@ func (s *SysUserController) Import(c *gin.Context) {
// 表格文件绝对地址
filePath := file.ParseUploadFileAbsPath(body.FilePath)
// 读取表格数据
rows, err := file.ReadSheet(filePath, "")
rows, err := file.ReadFileExecl(filePath, "")
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return

View File

@@ -12,10 +12,11 @@ type Router struct {
// RouterMeta 路由元信息对象
type RouterMeta struct {
Title string `json:"title"` // 设置该菜单在侧边栏和面包屑中展示的名字
Icon string `json:"icon"` // 设置该菜单的图标
Cache bool `json:"cache"` // 设置为true则不会被 <keep-alive>缓存
Target string `json:"target"` // 内链地址http(s)://开头), 打开目标位置 '_blank' | '_self' | ''
HideChildInMenu bool `json:"hideChildInMenu"` // 在菜单中隐藏子节点
HideInMenu bool `json:"hideInMenu"` // 在菜单中隐藏自己和子节点
Title string `json:"title"` // 设置该菜单在侧边栏和面包屑中展示的名字
Icon string `json:"icon"` // 设置该菜单的图标
Cache bool `json:"cache"` // 设置为true则不会被 <keep-alive>缓存
Target string `json:"target"` // 内链地址http(s)://开头), 打开目标位置 '_blank' | '_self' | ''
HideChildInMenu bool `json:"hideChildInMenu"` // 在菜单中隐藏子节点
HideInMenu bool `json:"hideInMenu"` // 在菜单中隐藏自己和子节点
NeType []string `json:"neType,omitempty"` // 网元类型,默认全部,有指定类型的,需要添加网元才会显示
}

View File

@@ -329,6 +329,12 @@ func (s SysMenu) getRouteMeta(sysMenu model.SysMenu) vo.RouterMeta {
meta.Target = "_blank"
}
// 网元类型菜单显示权限
if strings.Contains(sysMenu.Perms, "#") {
firstIndex := strings.Index(sysMenu.Perms, "#")
meta.NeType = strings.Split(strings.ToUpper(sysMenu.Perms[:firstIndex]), ",")
}
return meta
}

View File

@@ -203,7 +203,9 @@ func (s *Packet) capturePacketSource(taskInfo *Task) {
if packet == nil {
continue
}
if packet.Metadata().Timestamp.Before(time.Now()) {
// 如果延迟超过1秒跳过
timeDiff := time.Since(packet.Metadata().Timestamp)
if timeDiff > time.Second {
continue
}

View File

@@ -16,6 +16,8 @@ const (
GROUP_TRACE_NE = "2"
// 组号-信令跟踪Packet 4_taskNo
GROUP_TRACE_PACKET = "4"
// 组号-网元状态 8_neType_neId
GROUP_NE_STATE = "8"
// 组号-指标通用 10_neType_neId
GROUP_KPI = "10"
// 组号-自定义KPI指标 20_neType_neId
@@ -34,7 +36,7 @@ const (
GROUP_MME_UE = "1011"
// 组号-告警 2000_neType_neId
GROUP_ALARM = "2000"
// 组号-告警事件 2000_neType_neId
// 组号-告警事件 2002_neType_neId
GROUP_ALARM_EVENT = "2002"
)