37 Commits

Author SHA1 Message Date
zhangsz
45a0ab1707 chore: service fix 2025-08-08 11:44:39 +08:00
zhangsz
4dfea691d1 chore: release 1.2508.1 2025-08-08 10:41:54 +08:00
zhangsz
758fa02f7f fix: ne ssh issu 2025-08-08 10:41:32 +08:00
zhangsz
4da891c883 fix: cb message issue 2025-08-08 10:41:03 +08:00
zhangsz
5beae56881 fix: renew sys_menu and dict_data sql 2025-07-23 10:51:30 +08:00
zhangsz
cfe01734f0 fix: shell script renew 2025-07-22 11:41:02 +08:00
zhangsz
88c92eebf2 fix: ... 2025-07-22 10:08:33 +08:00
zhangsz
6c8c17c4f4 fix: export cdr msd issue 2025-07-22 09:54:00 +08:00
zhangsz
3e345e9e11 fix: restagent service update 2025-07-21 14:06:52 +08:00
zhangsz
a3950e5dc0 fix: mf cdr event adjust 2025-07-18 16:26:43 +08:00
zhangsz
f57c528c82 fix: dict data sql rename and update 2025-07-18 16:26:09 +08:00
zhangsz
74003786a9 feat: menu display follow NE installed 2025-07-17 17:43:35 +08:00
zhangsz
990070df2c fix: sql update 2025-07-16 11:06:13 +08:00
zhangsz
28a09d7b5b fix: cbs state white list 2025-07-16 09:44:57 +08:00
zhangsz
33b937c83d fix: whitelist for cbsState 2025-07-15 17:05:53 +08:00
zhangsz
81177be0ca feat: cbs message enhance 2025-07-15 16:26:21 +08:00
zhangsz
f43adfdf6f fix: enhance service for restagent 2025-07-14 11:56:16 +08:00
zhangsz
f969fbbb38 fix: admin cannot add role 2025-07-11 17:52:33 +08:00
zhangsz
53283b0669 fix: ticket update based on review meeting 2025-07-11 17:25:47 +08:00
zhangsz
6e9765ceaa feat: cbc message update 2025-07-11 17:25:00 +08:00
zhangsz
130f0a5ac7 feat: support duplicate event name filter 2025-07-09 15:24:54 +08:00
zhangsz
546f7ac5f0 fix: default restconf yaml 2025-07-09 14:56:11 +08:00
zhangsz
7d0eafc304 fix: ... 2025-07-09 14:21:47 +08:00
zhangsz
acc8ce32e8 fix: rename calling info to calling information 2025-07-09 11:41:12 +08:00
zhangsz
6cc47389c0 release 1.2506.2 2025-07-08 17:19:17 +08:00
zhangsz
2ff5cd42a7 feat: omc config update 2025-07-08 17:14:01 +08:00
zhangsz
a2286e1ee2 fix: psap.yaml 2025-07-08 17:06:45 +08:00
zhangsz
a7a4efdcb2 feat: cb message eventName 2025-07-08 14:46:32 +08:00
zhangsz
8d76d68b96 feat: support ticket settings in OMC 2025-07-08 14:45:46 +08:00
zhangsz
39ae16cf42 feat: cb message json lengthen 2025-07-04 16:03:52 +08:00
zhangsz
2a8690b247 feat: menu for cbc 2025-07-03 16:01:09 +08:00
zhangsz
fdb3b420f2 feat: add menu for psap mf/cbc 2025-07-03 15:50:29 +08:00
zhangsz
1bf8e1aff8 fix: ... 2025-07-02 18:26:32 +08:00
zhangsz
6865eceebe fix: mf_callback_ticket table 2025-07-02 18:23:32 +08:00
zhangsz
58bcc8f5be fix: default psap.yaml 2025-07-02 17:25:09 +08:00
zhangsz
574c39f748 feat: cb message 2025-07-02 17:23:47 +08:00
zhangsz
758276ecfc feat: ticket enhancemnet 2025-07-02 17:22:35 +08:00
59 changed files with 2497 additions and 1968 deletions

View File

@@ -0,0 +1,22 @@
ticket:
ticketNotification:
enabled: false
host: mail.smtp.com
port: 25
username: smtpext@smtp.com
# 注意:密码中如果包含特殊字符(如@、#、$等),
# 需要使用双引号括起来,避免解析错误
# 例如password: "1000smtp@omc!"
password: 123456
tlsSkipVerify: true
from: omc@psap
to: "" # 注意:可以是多个收件人,使用逗号分隔
ticketTimeout: # 超时设置
# 这些时间单位是分钟
# 注意:这些时间是相对于工单创建时间的
# 例如new: 60分钟inProgress: 60分钟
new: 60
inProgress: 60
noAnswer1: 240
noAnswer2: 480
nearlyTimeout: 20

View File

@@ -186,4 +186,9 @@ params:
testConfig:
enabled: false
file: /usr/local/omc/etc/testconfig.yaml
file: /usr/local/omc/etc/testconfig.yaml
# PSAP RESTCONF配置
psapConfig:
enabled: true
file: /usr/local/omc/etc/psap.yaml

View File

@@ -56,12 +56,12 @@ omc:
display: "Alarm SMS Forward Interface"
sort: 4
list:
- name: "enable"
- name: "enabled"
type: "bool"
value: "true"
access: "rw"
filter: "true;false"
display: "Enable"
display: "Enabled"
comment: "Is it enabled forward alarm with SMS interface"
- name: "mobileList"
type: "string"
@@ -111,4 +111,103 @@ omc:
access: "rw"
filter: "3~20"
display: "Service Number"
comment: "It is the source address, the length is between 3 and 20"
comment: "It is the source address, the length is between 3 and 20"
ticketNotification:
display: "Ticket Notification Settings"
sort: 5
list:
- name: "enabled"
type: "bool"
value: "true"
access: "rw"
filter: "true;false"
display: "Enabled"
comment: "Is it enabled notifcation ticket with Email interface"
- name: "host"
type: "string"
value: ""
access: "rw"
filter: ""
display: "SMTP Host Server"
comment: "Email SMTP server"
- name: "port"
type: "int"
value: ""
access: "rw"
filter: "0~65535"
display: "Port"
comment: ""
- name: "username"
type: "string"
value: ""
access: "rw"
filter: ""
display: "Username"
comment: ""
- name: "password"
type: "string"
value: ""
access: "rw"
filter: ""
display: "Password"
comment: ""
- name: "tlsSkipVerify"
type: "bool"
value: "true"
access: "rw"
filter: "true;false"
display: "TLS Skip Verify"
comment: "If skip TLS verify (true/false)"
- name: "from"
type: "string"
value: "omc@psap"
access: "rw"
filter: ""
display: "From"
comment: "The sender email address, default is omc@psap"
- name: "to"
type: "string"
value: ""
access: "rw"
filter: ""
display: "To"
comment: "The addition receiver email address, multiple addresses separated by commas"
ticketTimeout:
display: "Ticket Timeout Settings"
sort: 7
list:
- name: "new"
type: int
value: 60
access: "rw"
filter: "0~1440"
display: "New Ticket Timeout (min)"
comment: "New ticket timeout in minutes, default is 60 minutes"
- name: "inProgress"
type: int
value: 60
access: "rw"
filter: "0~1440"
display: "In Progress Timeout (min)"
comment: "In progress ticket timeout in minutes, default is 60 minutes"
- name: "noAnswer1"
type: int
value: 240
access: "rw"
filter: "0~1440"
display: "No Answer 1 Timeout (min)"
comment: "No answer 1 ticket timeout in minutes, default is 240 minutes"
- name: "noAnswer2"
type: int
value: 480
access: "rw"
filter: "0~1440"
display: "No Answer 2 Timeout (min)"
comment: "No answer 2 ticket timeout in minutes, default is 480 minutes"
- name: "nearlyTimeout"
type: int
value: 20
access: "rw"
filter: "0~1440"
display: "Nearly Timeout (min)"
comment: "Nearly timeout in minutes, default is 20 minutes"

View File

@@ -1,6 +1,8 @@
[Unit]
Description=OMC Service
After=network-online.target mysql.service kvdb.service
Wants=network-online.target
RequiresMountsFor=/usr/local/omc
[Service]
Type=simple
@@ -8,8 +10,9 @@ LimitNOFILE=65535
LimitNPROC=65535
Restart=always
RestartSec=10
StartLimitBurst=3
ExecStart=/usr/local/omc/bin/restagent -c /usr/local/omc/etc/restconf.yaml
RestartSec=2
RestartPreventExitStatus=SIGTERM SIGKILL
ExecReload=/bin/kill -HUP $MAINPID

View File

@@ -1,6 +1,8 @@
[Unit]
Description=PSAP rest agent daemon
Description=PSAP rest agent daemon
After=network-online.target mysql.service kvdb.service
Wants=network-online.target
RequiresMountsFor=/usr/local/omc
[Service]
Type=simple
@@ -8,8 +10,9 @@ LimitNOFILE=65535
LimitNPROC=65535
Restart=always
RestartSec=10
StartLimitBurst=3
ExecStart=/usr/local/omc/bin/restagent -c /usr/local/omc/etc/restconf.yaml
RestartSec=2
RestartPreventExitStatus=SIGTERM SIGKILL
ExecReload=/bin/kill -HUP $MAINPID

38
database/install/cb_message.sql Executable file
View File

@@ -0,0 +1,38 @@
/*
Navicat Premium Data Transfer
Source Server : omc@192.168.2.223-psap
Source Server Type : MariaDB
Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
Source Host : 192.168.2.223:33066
Source Schema : psap_db
Target Server Type : MariaDB
Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
File Encoding : 65001
Date: 14/07/2025 17:48:34
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for cb_message
-- ----------------------------
DROP TABLE IF EXISTS `cb_message`;
CREATE TABLE `cb_message` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`message_json` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`status` enum('ACTIVE','INACTIVE') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'INACTIVE',
`detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`created_at` bigint(20) NULL DEFAULT current_timestamp(),
`updated_at` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `id`(`id`) USING BTREE,
INDEX `idx_ne_time`(`ne_type`, `ne_id`, `created_at`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 57 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'CDR事件_MF' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -5,13 +5,13 @@
Source Server Type : MariaDB
Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
Source Host : 192.168.2.223:33066
Source Schema : omc_db
Source Schema : psap_db
Target Server Type : MariaDB
Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
File Encoding : 65001
Date: 16/06/2025 11:52:26
Date: 11/07/2025 17:20:50
*/
SET NAMES utf8mb4;
@@ -27,14 +27,17 @@ CREATE TABLE `mf_callback_ticket` (
`callee_number` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'callee number',
`status` enum('NEW','IN_PROGRESS','NO_ANSWER_1','NO_ANSWER_2','TIMEOUT','PENDING','CLOSED') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'NEW' COMMENT '1:NEW/新建,2:IN_PROGRESS/处理中,3:NO_ANSWER_1/未应答1,3:NO_ANSWER_2/未应答2,4:TIMEOUT/超时,5:PENDING/挂起,6:CLOSED/关闭',
`agent_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'agent name',
`agent_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`agent_mobile` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`comment` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'comment for callback',
`msd_data` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT 'MSD data',
`rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'MF Resource UID',
`created_at` bigint(20) NULL DEFAULT NULL COMMENT 'created at time',
`created_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`updated_at` bigint(20) NULL DEFAULT NULL COMMENT 'updated at time',
`updated_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`ticket_id`) USING BTREE,
INDEX `idx_caller_agent`(`caller_number`, `agent_name`) USING BTREE,
INDEX `idx_created`(`created_at`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 108 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
INDEX `idx_created`(`created_at`, `ticket_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 94 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -5,13 +5,13 @@
Source Server Type : MariaDB
Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
Source Host : 192.168.2.223:33066
Source Schema : omc_db
Source Schema : psap_db
Target Server Type : MariaDB
Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
File Encoding : 65001
Date: 16/06/2025 17:59:06
Date: 08/07/2025 17:10:04
*/
SET NAMES utf8mb4;
@@ -34,17 +34,19 @@ CREATE TABLE `ne_config` (
`visible` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'public' COMMENT '可见性默认public 单独网元self 隐藏hide',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_netype_paramname`(`ne_type`, `param_name`) USING BTREE COMMENT '网元_可选值'
) ENGINE = InnoDB AUTO_INCREMENT = 307 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元_参数配置可用属性值' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元_参数配置可用属性值' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of ne_config
-- ----------------------------
INSERT INTO `ne_config` VALUES (1, 'OMC', 'alarmEmailForward', 'Alarm Email Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with Email interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Email List\",\"filter\":\"\",\"name\":\"emailList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Server\",\"filter\":\"\",\"name\":\"smtp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"User\",\"filter\":\"\",\"name\":\"user\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"}]', 3, '', 1725505025649, 'public');
INSERT INTO `ne_config` VALUES (2, 'OMC', 'alarmSMSForward', 'Alarm SMS Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with SMS interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Multiple mobile separated by commas\",\"display\":\"Mobile List\",\"filter\":\"\",\"name\":\"mobileList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"The SMSC SMPP Address\",\"display\":\"SMSC Address\",\"filter\":\"\",\"name\":\"smscAddr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Short message coding type\",\"display\":\"Data Coding\",\"filter\":\"{\\\"0\\\":\\\"GSM7BIT\\\",\\\"1\\\":\\\"ASCII\\\",\\\"2\\\":\\\"BINARY8BIT1\\\",\\\"3\\\":\\\"LATIN1\\\",\\\"4\\\":\\\"BINARY8BIT2\\\",\\\"6\\\":\\\"CYRILLIC\\\",\\\"7\\\":\\\"HEBREW\\\",\\\"8\\\":\\\"UCS2\\\"}\",\"name\":\"dataCoding\",\"type\":\"enum\",\"value\":\"GSM7BIT\"},{\"access\":\"rw\",\"comment\":\"It is the source address, the length is between 3 and 20\",\"display\":\"Service Number\",\"filter\":\"3~20\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"OMC\"}]', 4, '', 1727664057261, 'public');
INSERT INTO `ne_config` VALUES (1, 'OMC', 'alarmEmailForward', 'Alarm Email Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with Email interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Email List\",\"filter\":\"\",\"name\":\"emailList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Server\",\"filter\":\"\",\"name\":\"smtp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"User\",\"filter\":\"\",\"name\":\"user\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"}]', 3, '', 1751945000199, 'public');
INSERT INTO `ne_config` VALUES (2, 'OMC', 'alarmSMSForward', 'Alarm SMS Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with SMS interface\",\"display\":\"Enabled\",\"filter\":\"true;false\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Multiple mobile separated by commas\",\"display\":\"Mobile List\",\"filter\":\"\",\"name\":\"mobileList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"The SMSC SMPP Address\",\"display\":\"SMSC Address\",\"filter\":\"\",\"name\":\"smscAddr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Short message coding type\",\"display\":\"Data Coding\",\"filter\":\"{\\\"0\\\":\\\"GSM7BIT\\\",\\\"1\\\":\\\"ASCII\\\",\\\"2\\\":\\\"BINARY8BIT1\\\",\\\"3\\\":\\\"LATIN1\\\",\\\"4\\\":\\\"BINARY8BIT2\\\",\\\"6\\\":\\\"CYRILLIC\\\",\\\"7\\\":\\\"HEBREW\\\",\\\"8\\\":\\\"UCS2\\\"}\",\"name\":\"dataCoding\",\"type\":\"enum\",\"value\":\"GSM7BIT\"},{\"access\":\"rw\",\"comment\":\"It is the source address, the length is between 3 and 20\",\"display\":\"Service Number\",\"filter\":\"3~20\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"OMC\"}]', 4, '', 1751945000201, 'public');
INSERT INTO `ne_config` VALUES (3, 'CBC', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CBC Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"CBC\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Instance\",\"filter\":\"0~64\",\"name\":\"instance\",\"type\":\"string\",\"value\":\"CBC-001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiIp\",\"type\":\"string\",\"value\":\"127.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"9090\"},{\"access\":\"read-write\",\"comment\":\"http or https\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, '', 1724327154483, 'public');
INSERT INTO `ne_config` VALUES (4, 'CBC', 'amfProfile', 'AMF Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 3, '', 1724327154499, 'public');
INSERT INTO `ne_config` VALUES (5, 'CBC', 'mmeProfile', 'MME Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"MME\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MME URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"sctp://192.168.1.1:9090\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 5, '', 1724327154504, 'public');
INSERT INTO `ne_config` VALUES (6, 'MF', 'system', 'System', 'list', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"mf-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"}]', 1, '', 1749800019447, 'public');
INSERT INTO `ne_config` VALUES (7, 'MF', 'agents', 'Agent List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~10000\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^[0-9]{4,8}$\",\"name\":\"name\",\"type\":\"regex\",\"value\":\"1000\"},{\"access\":\"read-only\",\"comment\":\"Online Status\",\"display\":\"Online Status\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"online\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"email\",\"display\":\"Email\",\"filter\":\"\",\"name\":\"email\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"mobile\",\"display\":\"Mobile\",\"filter\":\"^[0-9]{4,20}$\",\"name\":\"mobile\",\"type\":\"regex\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"ip:port\",\"display\":\"Domain\",\"filter\":\"\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"do not display\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"}]', 3, '', 1749800019449, 'public');
INSERT INTO `ne_config` VALUES (8, 'OMC', 'ticketTimeout', 'Ticket Timeout Settings', 'list', '[{\"access\":\"rw\",\"comment\":\"New ticket timeout in minutes, default is 60 minutes\",\"display\":\"New Ticket Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"new\",\"type\":\"int\",\"value\":60},{\"access\":\"rw\",\"comment\":\"In progress ticket timeout in minutes, default is 60 minutes\",\"display\":\"In Progress Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"inProgress\",\"type\":\"int\",\"value\":60},{\"access\":\"rw\",\"comment\":\"No answer 1 ticket timeout in minutes, default is 240 minutes\",\"display\":\"No Answer 1 Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"noAnswer1\",\"type\":\"int\",\"value\":240},{\"access\":\"rw\",\"comment\":\"No answer 2 ticket timeout in minutes, default is 480 minutes\",\"display\":\"No Answer 2 Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"noAnswer2\",\"type\":\"int\",\"value\":480},{\"access\":\"rw\",\"comment\":\"Nearly timeout in minutes, default is 20 minutes\",\"display\":\"Nearly Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"nearlyTimeout\",\"type\":\"int\",\"value\":20}]', 7, '', 1751945000203, 'public');
INSERT INTO `ne_config` VALUES (9, 'OMC', 'ticketNotification', 'Ticket Notification Settings', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled notifcation ticket with Email interface\",\"display\":\"Enabled\",\"filter\":\"true;false\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Host Server\",\"filter\":\"\",\"name\":\"host\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Username\",\"filter\":\"\",\"name\":\"username\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"The sender email address, default is omc@psap\",\"display\":\"From\",\"filter\":\"\",\"name\":\"from\",\"type\":\"string\",\"value\":\"omc@psap\"},{\"access\":\"rw\",\"comment\":\"The addition receiver email address, multiple addresses separated by commas\",\"display\":\"To\",\"filter\":\"\",\"name\":\"to\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1751945000202, 'public');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -32,33 +32,5 @@ CREATE TABLE `ne_host` (
-- 初始数据对应网元
INSERT INTO `ne_host` VALUES (1, 'ssh', '1', 'OMC_001_22', '127.0.0.1', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (2, 'telnet', '1', 'OMC_001_4100', '127.0.0.1', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (3, 'ssh', '1', 'IMS_001_22', '172.16.5.110', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (4, 'telnet', '1', 'IMS_001_4100', '172.16.5.110', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (5, 'ssh', '1', 'AMF_001_22', '172.16.5.120', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (6, 'telnet', '1', 'AMF_001_4100', '172.16.5.120', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (7, 'ssh', '1', 'AUSF_001_22', '172.16.5.130', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (8, 'telnet', '1', 'AUSF_001_4100', '172.16.5.130', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (9, 'ssh', '1', 'UDM_001_22', '172.16.5.140', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (10, 'telnet', '1', 'UDM_001_4100', '172.16.5.140', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (11, 'redis', '1', 'UDM_001_6379', '172.16.5.140', 6379, 'udmdb', '0', 'nO3fEhtuKuBkQE5ozsUhNfzn02vhnyxYTEiPn2CIlr4=', '', '', '0', '', 'supervisor', 1728989383529, 'supervisor', 1729065073516);
INSERT INTO `ne_host` VALUES (12, 'ssh', '1', 'SMF_001_22', '172.16.5.150', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (13, 'telnet', '1', 'SMF_001_4100', '172.16.5.150', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (14, 'ssh', '1', 'PCF_001_22', '172.16.5.160', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (15, 'telnet', '1', 'PCF_001_4100', '172.16.5.160', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (16, 'ssh', '1', 'NSSF_001_22', '172.16.5.170', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (17, 'telnet', '1', 'NSSF_001_4100', '172.16.5.170', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (18, 'ssh', '1', 'NRF_001_22', '172.16.5.180', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (19, 'telnet', '1', 'NRF_001_4100', '172.16.5.180', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (20, 'ssh', '1', 'UPF_001_22', '172.16.5.190', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (21, 'telnet', '1', 'UPF_001_4100', '172.16.5.190', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (22, 'telnet', '1', 'UPF_001_5002', '172.16.5.190', 5002, 'admin', '0', '', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (23, 'ssh', '1', 'LMF_001_22', '172.16.5.200', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (24, 'telnet', '1', 'LMF_001_4100', '172.16.5.200', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (25, 'ssh', '1', 'NEF_001_22', '172.16.5.210', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (26, 'telnet', '1', 'NEF_001_4100', '172.16.5.210', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (27, 'ssh', '1', 'MME_001_22', '172.16.5.220', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (28, 'telnet', '1', 'MME_001_4100', '172.16.5.220', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
INSERT INTO `ne_host` VALUES (29, 'ssh', '1', 'N3IWF_001_22', '172.16.5.230', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT INTO `ne_host` VALUES (30, 'telnet', '1', 'N3IWF_001_4100', '172.16.5.230', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -33,7 +33,5 @@ CREATE TABLE `ne_info` (
-- 初始网元数据
INSERT INTO `ne_info` VALUES (1, 'OMC', '001', '4400PSAPOMC001', 'PSAP门户管理中心', '172.16.5.100', 33030, 'PNF', '-', '-', '-', '-', '1,2', 0, '', '', 0, '', 0);
INSERT INTO `ne_info` VALUES (2, 'MF', '001', '4400PSAPMF0001', 'PSAP紧急呼叫中心', '172.16.5.110', 33030, 'PNF', '-', '-', '-', '-', '3,4', 0, '', '', 0, '', 0);
INSERT INTO `ne_info` VALUES (3, 'CBC', '001', '4400PSAPCBC001', 'PSAP小区广播中心', '172.16.5.120', 33030, 'PNF', '-', '-', '-', '-', '3,4', 0, '', '', 0, '', 0);
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -27,9 +27,5 @@ CREATE TABLE `ne_license` (
-- 初始数据对应网元
INSERT INTO `ne_license` VALUES (1, 'OMC', '001', '', '', '', '', '0', '', 'supervisor', (UNIX_TIMESTAMP(NOW(3)) * 1000), '', 0);
INSERT INTO `ne_license` VALUES (2, 'CBC', '001', '', '', '', '', '0', '', 'supervisor', (UNIX_TIMESTAMP(NOW(3)) * 1000), '', 0);
INSERT INTO `ne_license` VALUES (3, 'MF', '001', '', '', '', '', '0', '', 'supervisor', (UNIX_TIMESTAMP(NOW(3)) * 1000), '', 0);
INSERT INTO `ne_license` VALUES (4, 'IMS', '001', '', '', '', '', '0', '', 'supervisor', (UNIX_TIMESTAMP(NOW(3)) * 1000), '', 0);
INSERT INTO `ne_license` VALUES (5, 'SMSC', '001', '', '', '', '', '0', '', 'supervisor', (UNIX_TIMESTAMP(NOW(3)) * 1000), '', 0);
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -31,7 +31,5 @@ CREATE TABLE `ne_version` (
-- 初始数据对应网元
INSERT INTO `ne_version` VALUES (1, 'OMC', '001', '', '', '', '', '', '', '', '', '', '0', 'supervisor', 1713928436957, '', 0);
INSERT INTO `ne_version` VALUES (2, 'CBC', '001', '', '', '', '', '', '', '', '', '', '0', 'supervisor', 1713928436957, '', 0);
INSERT INTO `ne_version` VALUES (3, 'MF', '001', '', '', '', '', '', '', '', '', '', '0', 'supervisor', 1713928436957, '', 0);
SET FOREIGN_KEY_CHECKS=1;

File diff suppressed because it is too large Load Diff

View File

@@ -717,14 +717,19 @@ INSERT INTO `sys_dict_data` VALUES (2204, 2204, 'table.u_ims_user', 'IMS签约
INSERT INTO `sys_dict_data` VALUES (20000, 20000, 'menu.psap.agent', '座席', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (20001, 20001, 'menu.psap.agent.callings', '并行话务', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (20002, 20002, 'menu.psap.agent.callback', '回拨管理', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (20003, 20003, 'callback.status.NEW', '新建', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20004, 20004, 'callback.status.IN_PROGRESS', '处理中', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20005, 20005, 'callback.status.NO_ANSWER_1', '未应答1', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20006, 20006, 'callback.status.NO_ANSWER_2', '未应答2', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20007, 20007, 'callback.status.TIMEOUT', '超时', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20008, 20008, 'callback.status.PENDING', '挂起', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20009, 20009, 'callback.status.CLOSED', '关闭', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20003, 20003, 'callback.status.NEW', '新建', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20004, 20004, 'callback.status.IN_PROGRESS', '处理中', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20005, 20005, 'callback.status.NO_ANSWER_1', '未应答1', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20006, 20006, 'callback.status.NO_ANSWER_2', '未应答2', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20007, 20007, 'callback.status.TIMEOUT', '超时', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20008, 20008, 'callback.status.PENDING', '挂起', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20009, 20009, 'callback.status.CLOSED', '关闭', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20010, 20010, 'job.export.cdr.mf', '定期导出MF话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (20011, 20011, 'job.psap.ticket.monitor', '回拨工单监控', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (20012, 20012, 'menu.psap.cdr', '话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20013, 20013, 'menu.psap.cdr.mf', '紧急呼叫话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20014, 20014, 'menu.psap.cdr.crbt', '彩铃话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20015, 20015, 'menu.psap.cdr.mms', '彩信话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (20016, 20016, 'menu.psap.cbc.cbe', '广播', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -33,8 +33,8 @@ INSERT INTO `sys_dict_data` VALUES (3025, 3025, 'menu.security.onlineUser', 'Onl
INSERT INTO `sys_dict_data` VALUES (3026, 3026, 'menu.system.job', 'Scheduling Tasks', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3027, 3027, 'menu.system.jobLog', 'Scheduling Logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3028, 3028, 'menu.tools.help', 'Help Documentation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3029, 3029, 'menu.log.operat', 'Operation logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3030, 3030, 'menu.log.login', 'Security logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3029, 3029, 'menu.log.operat', 'Operation Logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3030, 3030, 'menu.log.login', 'Security Logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3031, 3031, 'menu.security.userRemark', 'User Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3032, 3032, 'menu.security.roleRemark', 'Role Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3033, 3033, 'menu.security.roleUserRemark', 'Assign Roles Embedded Hidden Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
@@ -108,7 +108,7 @@ INSERT INTO `sys_dict_data` VALUES (3100, 3100, 'menu.fault.activemRemark', 'Act
INSERT INTO `sys_dict_data` VALUES (3101, 3101, 'menu.logRemark', 'Log Management Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3102, 3102, 'menu.log.operatOldRemark', 'Operation log old layui menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3103, 3103, 'menu.log.mmlRemark', 'Operation MML Log', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3104, 3104, 'menu.log.alarmRemark', 'Alarm Log Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3104, 3104, 'menu.log.alarmRemark', 'Alarm Logs Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3105, 3105, 'menu.log.securityOldRemark', 'Security Log Old Layui Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3106, 3106, 'menu.log.forwardingRemark', 'Alarm forward log menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (3107, 3107, 'menu.log.setRemark', 'Log Settings menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
@@ -521,7 +521,7 @@ INSERT INTO `sys_dict_data` VALUES (4010, 4010, 'dictType.index_status', 'Home S
INSERT INTO `sys_dict_data` VALUES (4011, 4011, 'dictType.index_status_remark', 'Network element status colors on the home page', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (4012, 4012, 'dictType.index_status.normal', 'Normal', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (4013, 4013, 'dictType.index_status.abnormal', 'Abnormal', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (4014, 4014, 'menu.log.neFile', 'NE Log File', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (4014, 4014, 'menu.log.neFile', 'NE Log Files', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (4015, 4015, 'job.deleteExpiredNeStateRecord', 'Delete Expired NE State Record', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (4016, 4016, 'job.deleteExpiredNeStateRecordRemark', 'Delete expired NE state records regularly and keep them for {duration} days by default.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
INSERT INTO `sys_dict_data` VALUES (4017, 4017, 'job.getStateFromNE', 'Get state from NEs', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, '');
@@ -715,16 +715,21 @@ INSERT INTO `sys_dict_data` VALUES (4204, 4204, 'table.u_ims_user', 'IMS Subscri
-- PSAP Menu and Data Dictionary
INSERT INTO `sys_dict_data` VALUES (25000, 25000, 'menu.psap.agent', 'Agent', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (25001, 25001, 'menu.psap.agent.callings', 'Calling Info', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (25001, 25001, 'menu.psap.agent.callings', 'Calling Information', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (25002, 25002, 'menu.psap.agent.callback', 'CallBack Management', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (25003, 25003, 'callback.status.NEW', 'NEW', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25004, 25004, 'callback.status.IN_PROGRESS', 'IN_PROGRESS', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25005, 25005, 'callback.status.NO_ANSWER_1', 'NO_ANSWER_1', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25006, 25006, 'callback.status.NO_ANSWER_2', 'NO_ANSWER_2', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25007, 25007, 'callback.status.TIMEOUT', 'TIMEOUT', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25008, 25008, 'callback.status.PENDING', 'PENDING', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25009, 25009, 'callback.status.CLOSED', 'CLOSED', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25003, 25003, 'callback.status.NEW', 'NEW', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25004, 25004, 'callback.status.IN_PROGRESS', 'IN_PROGRESS', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25005, 25005, 'callback.status.NO_ANSWER_1', 'NO_ANSWER_1', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25006, 25006, 'callback.status.NO_ANSWER_2', 'NO_ANSWER_2', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25007, 25007, 'callback.status.TIMEOUT', 'TIMEOUT', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25008, 25008, 'callback.status.PENDING', 'PENDING', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25009, 25009, 'callback.status.CLOSED', 'CLOSED', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25010, 25010, 'job.export.cdr.mf', 'Regularly Export MF CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (25011, 25011, 'job.psap.ticket.monitor', 'Callback Ticket Monitor', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (25012, 25012, 'menu.psap.cdr', 'CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25013, 25013, 'menu.psap.cdr.mf', 'PSAP CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25014, 25014, 'menu.psap.cdr.crbt', 'CRBT CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25015, 25015, 'menu.psap.cdr.mms', 'MMS CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
INSERT INTO `sys_dict_data` VALUES (25016, 25016, 'menu.psap.cbc.cbe', 'Broadcast', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -5,13 +5,13 @@
Source Server Type : MariaDB
Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
Source Host : 192.168.2.223:33066
Source Schema : omc_db
Source Schema : psap_db
Target Server Type : MariaDB
Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
File Encoding : 65001
Date: 16/06/2025 16:49:43
Date: 03/07/2025 15:57:43
*/
SET NAMES utf8mb4;
@@ -41,7 +41,7 @@ CREATE TABLE `sys_menu` (
`update_time` bigint(20) NULL DEFAULT 0 COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
PRIMARY KEY (`menu_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 20003 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 20010 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_menu
@@ -183,15 +183,15 @@ INSERT INTO `sys_menu` VALUES (2129, 'menu.alarm', 0, 3, 'alarm', '', '1', '0',
INSERT INTO `sys_menu` VALUES (2130, 'menu.topology', 2087, 10, 'topology', '', '1', '0', 'D', '0', '1', '', 'icon-anzhuo', 'supervisor', 1704800000000, 'admin', 1744620817586, '');
INSERT INTO `sys_menu` VALUES (2131, 'menu.dashboard', 2087, 15, 'dashboard', NULL, '1', '0', 'D', '1', '0', NULL, 'icon-soutubiao', 'supervisor', 1705550000000, 'supervisor', 1705550000000, NULL);
INSERT INTO `sys_menu` VALUES (2132, 'menu.dashboard', 2087, 1, 'overview', 'dashboard/overview/index', '1', '0', 'M', '1', '1', 'dashboard:overview:index', 'icon-paixu', 'supervisor', 1705550000000, 'supervisor', 1745405131717, '');
INSERT INTO `sys_menu` VALUES (2133, 'menu.dashboard.imsCDR', 0, 4, 'mfCDR', 'dashboard/mfCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1705550000000, 'supervisor', 1744706214818, '');
INSERT INTO `sys_menu` VALUES (2133, 'menu.dashboard.imsCDR', 0, 4, 'mfCDR', 'dashboard/mfCDR/index', '1', '0', 'M', '0', '1', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1705550000000, 'supervisor', 1744706214818, '');
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', 'supervisor', 1708583596871, '', 0, '');
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', 'supervisor', 1708583596871, '', 0, '');
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', 'supervisor', 1708583596871, '', 0, '');
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', 'supervisor', 1705550000000, 'supervisor', 1711354049893, '');
INSERT INTO `sys_menu` VALUES (2140, 'menu.psap.cdr', 0, 10, 'psapCDR', '', '1', '0', 'D', '0', '1', '', 'icon-tubiaoku', 'supervisor', 1711352709786, 'admin', 1744623120667, '');
INSERT INTO `sys_menu` VALUES (2140, 'menu.monitor.cdr', 0, 10, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', 'supervisor', 1711352709786, 'admin', 1744623120667, '');
INSERT INTO `sys_menu` VALUES (2141, 'menu.monitor.event', 2089, 20, 'event', '', '1', '0', 'D', '0', '1', '', 'icon-gengduo', 'supervisor', 1711352768797, 'supervisor', 1744622372405, '');
INSERT INTO `sys_menu` VALUES (2142, 'menu.ne.neQuickSetup', 4, 40, 'neQuickSetup', 'ne/neQuickSetup/index', '1', '1', 'M', '0', '1', 'ne:neQuickSetup:list', 'icon-wofaqi', 'supervisor', 1708580000000, 'admin', 1744622558904, '');
INSERT INTO `sys_menu` VALUES (2143, 'menu.ne.neLicense', 4, 20, 'neLicense', 'ne/neLicense/index', '1', '0', 'M', '0', '1', 'ne:neLicense:list', 'icon-fuzhidaima', 'supervisor', 1708580000000, 'admin', 1744622786798, '');
INSERT INTO `sys_menu` VALUES (2143, 'menu.ne.neLicense', 4, 20, 'neLicense', 'ne/neLicense/index', '1', '0', 'M', '1', '1', 'ne:neLicense:list', 'icon-fuzhidaima', 'supervisor', 1708580000000, 'admin', 1744622786798, '');
INSERT INTO `sys_menu` VALUES (2144, 'menu.ne.neSoftware', 4, 23, 'neSoftware', 'ne/neSoftware/index', '1', '0', 'M', '1', '1', 'ne:neSoftware:list', 'icon-fuzhidaima', 'supervisor', 1708580000000, '', 0, '');
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', 'supervisor', 1708580000000, '', 0, '');
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', 'supervisor', 1708580000000, '', 0, '');
@@ -218,8 +218,13 @@ INSERT INTO `sys_menu` VALUES (2166, 'menu.dashboard.overview.smfUeNum', 2087, 2
INSERT INTO `sys_menu` VALUES (2167, 'menu.dashboard.overview.imsUeNum', 2087, 4, '#', '', '1', '1', 'B', '1', '1', 'dashboard:overview:imsUeNum', '#', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_menu` VALUES (2168, 'menu.dashboard.overview.gnbBase', 2087, 6, '#', '', '1', '1', 'B', '1', '1', 'dashboard:overview:gnbBase', '#', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_menu` VALUES (2169, 'menu.dashboard.overview.enbBase', 2087, 8, '#', '', '1', '1', 'B', '1', '1', 'dashboard:overview:enbBase', '#', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_menu` VALUES (20000, 'menu.psap.agent', 0, 5, 'psapAgent', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', 'supervisor', 1711352709786, 'admin', 1744623120667, '');
INSERT INTO `sys_menu` VALUES (20001, 'menu.psap.agent.callings', 20000, 1, 'callings', 'agentManage/callings/index', '1', '0', 'M', '1', '1', 'agentManage:callings:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747795951448, '');
INSERT INTO `sys_menu` VALUES (20002, 'menu.psap.agent.callback', 20000, 4, 'callback', 'agentManage/callback/index', '1', '0', 'M', '1', '1', 'agentManage:callback:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
INSERT INTO `sys_menu` VALUES (20000, 'menu.psap.agent', 0, 5, 'psapAgent', '', '1', '0', 'D', '1', '1', 'mf#agentManage', 'icon-tubiaoku', 'supervisor', 1711352709786, 'admin', 1744623120667, '');
INSERT INTO `sys_menu` VALUES (20001, 'menu.psap.agent.callings', 20000, 1, 'callings', 'agentManage/callings/index', '1', '0', 'M', '1', '1', 'mf#agentManage:callings:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747795951448, '');
INSERT INTO `sys_menu` VALUES (20002, 'menu.psap.agent.callback', 20000, 4, 'callback', 'agentManage/callback/index', '1', '0', 'M', '1', '1', 'mf#agentManage:callback:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
INSERT INTO `sys_menu` VALUES (20003, 'menu.psap.cdr', 0, 7, 'psapCDR', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', 'supervisor', 1711352709786, 'admin', 1744623120667, '');
INSERT INTO `sys_menu` VALUES (20004, 'menu.psap.cdr.mf', 20003, 1, 'mfCDR', 'dashboard/mfCDR/index', '1', '0', 'M', '1', '1', 'mf#dashboard:cdr:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
INSERT INTO `sys_menu` VALUES (20005, 'menu.psap.cdr.crbt', 20003, 5, 'imsCDR', 'dashboard/imsCDR/index', '1', '0', 'M', '1', '1', 'ims#dashboard:cdr:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
INSERT INTO `sys_menu` VALUES (20006, 'menu.psap.cdr.mms', 20003, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'smsc#dashboard:cdr:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
INSERT INTO `sys_menu` VALUES (20007, 'menu.psap.cbc.cbe', 0, 6, 'cbe', 'cbc/cbe/index', '1', '0', 'M', '1', '1', 'cbc#dashboard:cdr:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -5,13 +5,13 @@
Source Server Type : MariaDB
Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
Source Host : 192.168.2.223:33066
Source Schema : omc_db
Source Schema : psap_db
Target Server Type : MariaDB
Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
File Encoding : 65001
Date: 16/06/2025 16:49:53
Date: 03/07/2025 15:58:14
*/
SET NAMES utf8mb4;
@@ -31,6 +31,7 @@ CREATE TABLE `sys_role_menu` (
-- Records of sys_role_menu
-- ----------------------------
INSERT INTO `sys_role_menu` VALUES (2, 1);
INSERT INTO `sys_role_menu` VALUES (2, 2);
INSERT INTO `sys_role_menu` VALUES (2, 4);
INSERT INTO `sys_role_menu` VALUES (2, 100);
INSERT INTO `sys_role_menu` VALUES (2, 101);
@@ -81,6 +82,7 @@ INSERT INTO `sys_role_menu` VALUES (2, 2129);
INSERT INTO `sys_role_menu` VALUES (2, 2132);
INSERT INTO `sys_role_menu` VALUES (2, 2133);
INSERT INTO `sys_role_menu` VALUES (2, 2137);
INSERT INTO `sys_role_menu` VALUES (2, 2143);
INSERT INTO `sys_role_menu` VALUES (2, 2145);
INSERT INTO `sys_role_menu` VALUES (2, 2146);
INSERT INTO `sys_role_menu` VALUES (2, 2147);
@@ -88,6 +90,11 @@ INSERT INTO `sys_role_menu` VALUES (2, 2150);
INSERT INTO `sys_role_menu` VALUES (2, 20000);
INSERT INTO `sys_role_menu` VALUES (2, 20001);
INSERT INTO `sys_role_menu` VALUES (2, 20002);
INSERT INTO `sys_role_menu` VALUES (2, 20003);
INSERT INTO `sys_role_menu` VALUES (2, 20004);
INSERT INTO `sys_role_menu` VALUES (2, 20005);
INSERT INTO `sys_role_menu` VALUES (2, 20006);
INSERT INTO `sys_role_menu` VALUES (2, 20007);
INSERT INTO `sys_role_menu` VALUES (3, 1);
INSERT INTO `sys_role_menu` VALUES (3, 4);
INSERT INTO `sys_role_menu` VALUES (3, 108);
@@ -147,7 +154,6 @@ INSERT INTO `sys_role_menu` VALUES (4, 2126);
INSERT INTO `sys_role_menu` VALUES (4, 2128);
INSERT INTO `sys_role_menu` VALUES (4, 2129);
INSERT INTO `sys_role_menu` VALUES (4, 2130);
INSERT INTO `sys_role_menu` VALUES (4, 2133);
INSERT INTO `sys_role_menu` VALUES (4, 2138);
INSERT INTO `sys_role_menu` VALUES (4, 2140);
INSERT INTO `sys_role_menu` VALUES (4, 2141);

View File

@@ -1,17 +0,0 @@
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_dict_data
-- ----------------------------
-- psap callback status
INSERT IGNORE INTO `sys_dict_data` VALUES (500, 500, 'callback.status.NEW', 'NEW', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (501, 501, 'callback.status.IN_PROGRESS', 'IN_PROGRESS', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (502, 502, 'callback.status.NO_ANSWER_1', 'NO_ANSWER_1', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (503, 503, 'callback.status.NO_ANSWER_2', 'NO_ANSWER_2', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (504, 504, 'callback.status.TIMEOUT', 'TIMEOUT', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (505, 505, 'callback.status.PENDING', 'PENDING', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (506, 506, 'callback.status.CLOSED', 'CLOSED', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -11,7 +11,7 @@
Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
File Encoding : 65001
Date: 30/06/2025 16:39:13
Date: 14/07/2025 17:49:03
*/
SET NAMES utf8mb4;
@@ -24,13 +24,17 @@ CREATE TABLE IF NOT EXISTS `cb_message` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`message_json` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`message_json` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`status` enum('ACTIVE','INACTIVE') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'INACTIVE',
`detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`created_at` bigint(20) NULL DEFAULT current_timestamp(),
`updated_at` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `id`(`id`) USING BTREE,
INDEX `idx_ne_time`(`ne_type`, `ne_id`, `created_at`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'CDR事件_MF' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 57 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'CDR事件_MF' ROW_FORMAT = Dynamic;
ALTER TABLE `cb_message`
ADD COLUMN IF NOT EXISTS `detail` varchar(255) NULL AFTER `status`;
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,54 @@
/*
Navicat Premium Data Transfer
Source Server : omc@192.168.2.223-psap
Source Server Type : MariaDB
Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
Source Host : 192.168.2.223:33066
Source Schema : psap_db
Target Server Type : MariaDB
Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
File Encoding : 65001
Date: 02/07/2025 17:49:21
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for mf_callback_ticket
-- ----------------------------
CREATE TABLE IF NOT EXISTS `mf_callback_ticket` (
`ticket_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Ticket ID',
`caller_number` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT 'caller number',
`callee_number` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'callee number',
`status` enum('NEW','IN_PROGRESS','NO_ANSWER_1','NO_ANSWER_2','TIMEOUT','PENDING','CLOSED') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'NEW' COMMENT '1:NEW/新建,2:IN_PROGRESS/处理中,3:NO_ANSWER_1/未应答1,3:NO_ANSWER_2/未应答2,4:TIMEOUT/超时,5:PENDING/挂起,6:CLOSED/关闭',
`agent_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'agent name',
`agent_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`agent_mobile` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`comment` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'comment for callback',
`rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'MF Resource UID',
`created_at` bigint(20) NULL DEFAULT NULL COMMENT 'created at time',
`updated_at` bigint(20) NULL DEFAULT NULL COMMENT 'updated at time',
PRIMARY KEY (`ticket_id`) USING BTREE,
INDEX `idx_caller_agent`(`caller_number`, `agent_name`) USING BTREE,
INDEX `idx_created`(`created_at`, `ticket_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3440 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
ALTER TABLE `mf_callback_ticket` DROP INDEX IF EXISTS `idx_created`;
ALTER TABLE `mf_callback_ticket` ADD COLUMN IF NOT EXISTS `agent_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `agent_name`;
ALTER TABLE `mf_callback_ticket` ADD COLUMN IF NOT EXISTS `agent_mobile` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `agent_email`;
ALTER TABLE `mf_callback_ticket` ADD INDEX IF NOT EXISTS `idx_created`(`created_at`, `ticket_id`) USING BTREE;
ALTER TABLE `mf_callback_ticket` DROP COLUMN IF EXISTS `msd_data`;
ALTER TABLE `mf_callback_ticket`
ADD COLUMN IF NOT EXISTS `created_by` varchar(32) NULL AFTER `created_at`,
ADD COLUMN IF NOT EXISTS `updated_by` varchar(32) NULL AFTER `updated_at`;
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,51 @@
/*
Navicat Premium Data Transfer
Source Server : omc@192.168.2.223-psap
Source Server Type : MariaDB
Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
Source Host : 192.168.2.223:33066
Source Schema : psap_db
Target Server Type : MariaDB
Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1)
File Encoding : 65001
Date: 08/07/2025 17:11:50
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for ne_config
-- ----------------------------
CREATE TABLE IF NOT EXISTS `ne_config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型',
`param_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '参数名',
`param_display` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数显示名',
`param_type` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数类型 list列表单层 array数组多层',
`param_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'accesss属性控制: 只读read-only/read/ro 读写read-write',
`param_sort` int(11) NULL DEFAULT 0 COMMENT '参数排序',
`param_perms` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作权限 get只读 put可编辑 delete可删除 post可新增',
`update_time` bigint(20) NULL DEFAULT 0 COMMENT '更新时间',
`visible` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'public' COMMENT '可见性默认public 单独网元self 隐藏hide',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_netype_paramname`(`ne_type`, `param_name`) USING BTREE COMMENT '网元_可选值'
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元_参数配置可用属性值' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of ne_config
-- ----------------------------
INSERT IGNORE INTO `ne_config` VALUES (1, 'OMC', 'alarmEmailForward', 'Alarm Email Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with Email interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Email List\",\"filter\":\"\",\"name\":\"emailList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Server\",\"filter\":\"\",\"name\":\"smtp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"User\",\"filter\":\"\",\"name\":\"user\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"}]', 3, '', 1751945000199, 'public');
INSERT IGNORE INTO `ne_config` VALUES (2, 'OMC', 'alarmSMSForward', 'Alarm SMS Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with SMS interface\",\"display\":\"Enabled\",\"filter\":\"true;false\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Multiple mobile separated by commas\",\"display\":\"Mobile List\",\"filter\":\"\",\"name\":\"mobileList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"The SMSC SMPP Address\",\"display\":\"SMSC Address\",\"filter\":\"\",\"name\":\"smscAddr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Short message coding type\",\"display\":\"Data Coding\",\"filter\":\"{\\\"0\\\":\\\"GSM7BIT\\\",\\\"1\\\":\\\"ASCII\\\",\\\"2\\\":\\\"BINARY8BIT1\\\",\\\"3\\\":\\\"LATIN1\\\",\\\"4\\\":\\\"BINARY8BIT2\\\",\\\"6\\\":\\\"CYRILLIC\\\",\\\"7\\\":\\\"HEBREW\\\",\\\"8\\\":\\\"UCS2\\\"}\",\"name\":\"dataCoding\",\"type\":\"enum\",\"value\":\"GSM7BIT\"},{\"access\":\"rw\",\"comment\":\"It is the source address, the length is between 3 and 20\",\"display\":\"Service Number\",\"filter\":\"3~20\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"OMC\"}]', 4, '', 1751945000201, 'public');
INSERT IGNORE INTO `ne_config` VALUES (3, 'CBC', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CBC Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"CBC\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Instance\",\"filter\":\"0~64\",\"name\":\"instance\",\"type\":\"string\",\"value\":\"CBC-001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiIp\",\"type\":\"string\",\"value\":\"127.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"9090\"},{\"access\":\"read-write\",\"comment\":\"http or https\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, '', 1724327154483, 'public');
INSERT IGNORE INTO `ne_config` VALUES (4, 'CBC', 'amfProfile', 'AMF Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 3, '', 1724327154499, 'public');
INSERT IGNORE INTO `ne_config` VALUES (5, 'CBC', 'mmeProfile', 'MME Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"MME\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MME URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"sctp://192.168.1.1:9090\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 5, '', 1724327154504, 'public');
INSERT IGNORE INTO `ne_config` VALUES (6, 'MF', 'system', 'System', 'list', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"mf-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"}]', 1, '', 1749800019447, 'public');
INSERT IGNORE INTO `ne_config` VALUES (7, 'MF', 'agents', 'Agent List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~10000\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^[0-9]{4,8}$\",\"name\":\"name\",\"type\":\"regex\",\"value\":\"1000\"},{\"access\":\"read-only\",\"comment\":\"Online Status\",\"display\":\"Online Status\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"online\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"email\",\"display\":\"Email\",\"filter\":\"\",\"name\":\"email\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"mobile\",\"display\":\"Mobile\",\"filter\":\"^[0-9]{4,20}$\",\"name\":\"mobile\",\"type\":\"regex\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"ip:port\",\"display\":\"Domain\",\"filter\":\"\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"do not display\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"}]', 3, '', 1749800019449, 'public');
INSERT IGNORE INTO `ne_config` VALUES (8, 'OMC', 'ticketTimeout', 'Ticket Timeout Settings', 'list', '[{\"access\":\"rw\",\"comment\":\"New ticket timeout in minutes, default is 60 minutes\",\"display\":\"New Ticket Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"new\",\"type\":\"int\",\"value\":60},{\"access\":\"rw\",\"comment\":\"In progress ticket timeout in minutes, default is 60 minutes\",\"display\":\"In Progress Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"inProgress\",\"type\":\"int\",\"value\":60},{\"access\":\"rw\",\"comment\":\"No answer 1 ticket timeout in minutes, default is 240 minutes\",\"display\":\"No Answer 1 Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"noAnswer1\",\"type\":\"int\",\"value\":240},{\"access\":\"rw\",\"comment\":\"No answer 2 ticket timeout in minutes, default is 480 minutes\",\"display\":\"No Answer 2 Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"noAnswer2\",\"type\":\"int\",\"value\":480},{\"access\":\"rw\",\"comment\":\"Nearly timeout in minutes, default is 20 minutes\",\"display\":\"Nearly Timeout (min)\",\"filter\":\"0~1440\",\"name\":\"nearlyTimeout\",\"type\":\"int\",\"value\":20}]', 7, '', 1751945000203, 'public');
INSERT IGNORE INTO `ne_config` VALUES (9, 'OMC', 'ticketNotification', 'Ticket Notification Settings', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled notifcation ticket with Email interface\",\"display\":\"Enabled\",\"filter\":\"true;false\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Host Server\",\"filter\":\"\",\"name\":\"host\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Username\",\"filter\":\"\",\"name\":\"username\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"The sender email address, default is omc@psap\",\"display\":\"From\",\"filter\":\"\",\"name\":\"from\",\"type\":\"string\",\"value\":\"omc@psap\"},{\"access\":\"rw\",\"comment\":\"The addition receiver email address, multiple addresses separated by commas\",\"display\":\"To\",\"filter\":\"\",\"name\":\"to\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1751945000202, 'public');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,34 @@
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
--
-- Table structure for table `ne_host`
--
CREATE TABLE IF NOT EXISTS `ne_host` (
`host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键',
`host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '连接类型 ssh telnet redis',
`group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '分组0默认 1网元 2系统',
`title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '标题名称',
`addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址',
`port` int DEFAULT '22' COMMENT '端口 22 4100 6379',
`user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证用户名',
`auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '认证模式0密码 1主机私钥 2已免密',
`password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证密码',
`private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥',
`pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥密码',
`db_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '数据库名称',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',
`create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` bigint DEFAULT '0' COMMENT '创建时间',
`update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
`update_time` bigint DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`host_id`) USING BTREE,
UNIQUE KEY `uk_type_group_title` (`host_type`,`group_id`,`title`) USING BTREE COMMENT '同组内名称唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元主机表';
-- 初始数据对应网元
INSERT IGNORE INTO `ne_host` VALUES (1, 'ssh', '1', 'OMC_001_22', '127.0.0.1', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372);
INSERT IGNORE INTO `ne_host` VALUES (2, 'telnet', '1', 'OMC_001_4100', '127.0.0.1', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375);
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -32,9 +32,5 @@ CREATE TABLE IF NOT EXISTS `ne_info` (
-- 初始网元数据
INSERT IGNORE INTO `ne_info` VALUES (1, 'OMC', '001', '4400PSAPOMC001', 'PSAP门户管理中心', '172.16.5.100', 33030, 'PNF', '-', '-', '-', '-', '1,2', 0, '', '', 0, '', 0);
INSERT IGNORE INTO `ne_info` VALUES (2, 'MF', '001', '4400PSAPMF0001', 'PSAP紧急呼叫中心', '172.16.5.110', 33030, 'PNF', '-', '-', '-', '-', '3,4', 0, '', '', 0, '', 0);
INSERT IGNORE INTO `ne_info` VALUES (3, 'CBC', '001', '4400PSAPCBC001', 'PSAP小区广播中心', '172.16.5.120', 33030, 'PNF', '-', '-', '-', '-', '3,4', 0, '', '', 0, '', 0);
INSERT IGNORE INTO `ne_info` VALUES (4, 'IMS', '001', '4400PSAPIMS001', 'PSAP彩铃中心', '172.16.5.130', 33030, 'PNF', '-', '-', '-', '-', '3,4', 0, '', '', 0, '', 0);
INSERT IGNORE INTO `ne_info` VALUES (5, 'SMSC', '001', '4400PSAPSMSC01', 'PSAP彩信中心', '172.16.5.140', 33030, 'PNF', '-', '-', '-', '-', '3,4', 0, '', '', 0, '', 0);
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -0,0 +1,17 @@
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_dict_data
-- ----------------------------
-- psap callback status
REPLACE INTO `sys_dict_data` VALUES (500, 500, 'callback.status.NEW', 'NEW', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (501, 501, 'callback.status.IN_PROGRESS', 'IN_PROGRESS', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (502, 502, 'callback.status.NO_ANSWER_1', 'NO_ANSWER_1', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (503, 503, 'callback.status.NO_ANSWER_2', 'NO_ANSWER_2', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (504, 504, 'callback.status.TIMEOUT', 'TIMEOUT', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (505, 505, 'callback.status.PENDING', 'PENDING', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (506, 506, 'callback.status.CLOSED', 'CLOSED', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,29 @@
SET FOREIGN_KEY_CHECKS=0;
REPLACE INTO `sys_dict_data` VALUES (1029, 1029, 'menu.log.operat', '操作日志', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (1030, 1030, 'menu.log.login', '安全日志', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (1092, 1092, 'menu.log.alarm', '告警日志', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (1094, 1094, 'menu.log.forwarding', '告警前转日志', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (1104, 1104, 'menu.log.alarmRemark', '告警日志菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (2014, 2014, 'menu.log.neFile', '网元日志文件', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
-- psap 座席相关字典数据
REPLACE INTO `sys_dict_data` VALUES (20000, 20000, 'menu.psap.agent', '座席', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (20001, 20001, 'menu.psap.agent.callings', '并行话务', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (20002, 20002, 'menu.psap.agent.callback', '回拨管理', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (20003, 20003, 'callback.status.NEW', '新建', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20004, 20004, 'callback.status.IN_PROGRESS', '处理中', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20005, 20005, 'callback.status.NO_ANSWER_1', '未应答1', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20006, 20006, 'callback.status.NO_ANSWER_2', '未应答2', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20007, 20007, 'callback.status.TIMEOUT', '超时', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20008, 20008, 'callback.status.PENDING', '挂起', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20009, 20009, 'callback.status.CLOSED', '关闭', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20010, 20010, 'job.export.cdr.mf', '定期导出MF话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (20011, 20011, 'job.psap.ticket.monitor', '回拨工单监控', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (20012, 20012, 'menu.psap.cdr', '话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20013, 20013, 'menu.psap.cdr.mf', '紧急呼叫话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20014, 20014, 'menu.psap.cdr.crbt', '彩铃话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20015, 20015, 'menu.psap.cdr.mms', '彩信话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (20016, 20016, 'menu.psap.cbc.cbe', '广播', 'i18n_zh', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -0,0 +1,29 @@
SET FOREIGN_KEY_CHECKS=0;
REPLACE INTO `sys_dict_data` VALUES (3029, 3029, 'menu.log.operat', 'Operation Logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (3030, 3030, 'menu.log.login', 'Security Logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (3092, 3092, 'menu.log.alarm', 'Alarm Logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (3094, 3094, 'menu.log.forwarding', 'Alarm Forwarding Logs', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (3104, 3104, 'menu.log.alarmRemark', 'Alarm Logs Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (4014, 4014, 'menu.log.neFile', 'NE Log Files', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
-- PSAP Menu and Data Dictionary
REPLACE INTO `sys_dict_data` VALUES (25000, 25000, 'menu.psap.agent', 'Agent', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (25001, 25001, 'menu.psap.agent.callings', 'Calling Information', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (25002, 25002, 'menu.psap.agent.callback', 'CallBack Management', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (25003, 25003, 'callback.status.NEW', 'NEW', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25004, 25004, 'callback.status.IN_PROGRESS', 'IN_PROGRESS', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25005, 25005, 'callback.status.NO_ANSWER_1', 'NO_ANSWER_1', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25006, 25006, 'callback.status.NO_ANSWER_2', 'NO_ANSWER_2', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25007, 25007, 'callback.status.TIMEOUT', 'TIMEOUT', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25008, 25008, 'callback.status.PENDING', 'PENDING', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25009, 25009, 'callback.status.CLOSED', 'CLOSED', 'i18n_en', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25010, 25010, 'job.export.cdr.mf', 'Regularly Export MF CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (25011, 25011, 'job.psap.ticket.monitor', 'Callback Ticket Monitor', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (25012, 25012, 'menu.psap.cdr', 'CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25013, 25013, 'menu.psap.cdr.mf', 'PSAP CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25014, 25014, 'menu.psap.cdr.crbt', 'CRBT CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25015, 25015, 'menu.psap.cdr.mms', 'MMS CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
REPLACE INTO `sys_dict_data` VALUES (25016, 25016, 'menu.psap.cbc.cbe', 'Broadcast', 'i18n_en', NULL, NULL, '1', 'supervisor', NULL, '', 0, NULL);
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -1,17 +0,0 @@
SET FOREIGN_KEY_CHECKS=0;
-- PSAP Menu and Data Dictionary
INSERT IGNORE INTO `sys_dict_data` VALUES (25000, 25000, 'menu.psap.agent', 'Agent', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT IGNORE INTO `sys_dict_data` VALUES (25001, 25001, 'menu.psap.agent.callings', 'Calling Info', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT IGNORE INTO `sys_dict_data` VALUES (25002, 25002, 'menu.psap.agent.callback', 'CallBack Management', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT IGNORE INTO `sys_dict_data` VALUES (25003, 25003, 'callback.status.NEW', 'NEW', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (25004, 25004, 'callback.status.IN_PROGRESS', 'IN_PROGRESS', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (25005, 25005, 'callback.status.NO_ANSWER_1', 'NO_ANSWER_1', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (25006, 25006, 'callback.status.NO_ANSWER_2', 'NO_ANSWER_2', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (25007, 25007, 'callback.status.TIMEOUT', 'TIMEOUT', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (25008, 25008, 'callback.status.PENDING', 'PENDING', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (25009, 25009, 'callback.status.CLOSED', 'CLOSED', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (25010, 25010, 'job.export.cdr.mf', 'Regularly Export MF CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT IGNORE INTO `sys_dict_data` VALUES (25011, 25011, 'job.psap.ticket.monitor', 'Callback Ticket Monitor', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -1,17 +0,0 @@
SET FOREIGN_KEY_CHECKS=0;
-- psap 座席相关字典数据
INSERT IGNORE INTO `sys_dict_data` VALUES (20000, 20000, 'menu.psap.agent', '座席', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT IGNORE INTO `sys_dict_data` VALUES (20001, 20001, 'menu.psap.agent.callings', '并行话务', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT IGNORE INTO `sys_dict_data` VALUES (20002, 20002, 'menu.psap.agent.callback', '回拨管理', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT IGNORE INTO `sys_dict_data` VALUES (20003, 20003, 'callback.status.NEW', '新建', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784015598, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (20004, 20004, 'callback.status.IN_PROGRESS', '处理中', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784045911, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (20005, 20005, 'callback.status.NO_ANSWER_1', '未应答1', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784070706, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (20006, 20006, 'callback.status.NO_ANSWER_2', '未应答2', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784078301, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (20007, 20007, 'callback.status.TIMEOUT', '超时', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784100809, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (20008, 20008, 'callback.status.PENDING', '挂起', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784115379, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (20009, 20009, 'callback.status.CLOSED', '关闭', 'callback_status', NULL, NULL, '1', 'supervisor', 1749784127612, '', 0, NULL);
INSERT IGNORE INTO `sys_dict_data` VALUES (20010, 20010, 'job.export.cdr.mf', '定期导出MF话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT IGNORE INTO `sys_dict_data` VALUES (20011, 20011, 'job.psap.ticket.monitor', '回拨工单监控', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -1,5 +1,19 @@
SET FOREIGN_KEY_CHECKS=0;
UPDATE `sys_menu` SET `visible` = '1', `status` = '1', `update_by` = 'supervisor', `update_time` = (UNIX_TIMESTAMP(NOW(3)) * 1000) WHERE `menu_id` = 2143;
REPLACE INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1752564026249, 'menu.toolsRemark');
REPLACE INTO `sys_menu` VALUES (115, 'menu.security.onlineUser', 1, 2, 'online', 'monitor/online/index', '1', '1', 'M', '1', '1', 'monitor:online:list', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, 'supervisor', 1744626398804, 'menu.security.onlineUserRemark');
REPLACE INTO `sys_menu` VALUES (501, 'menu.log.login', 2089, 26, 'login', 'system/log/login/index', '1', '1', 'M', '1', '1', 'system:log:login:list', 'icon-fuzhidaima', 'supervisor', 1700000000000, 'supervisor', 1752477698857, 'menu.log.loginRemark');
REPLACE INTO `sys_menu` VALUES (2133, 'menu.dashboard.imsCDR', 0, 4, 'mfCDR', 'dashboard/mfCDR/index', '1', '0', 'M', '0', '1', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1705550000000, 'supervisor', 1744706214818, '');
REPLACE INTO `sys_menu` VALUES (2140, 'menu.monitor.cdr', 0, 10, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', 'supervisor', 1711352709786, 'admin', 1744623120667, '');
REPLACE INTO `sys_menu` VALUES (2143, 'menu.ne.neLicense', 4, 20, 'neLicense', 'ne/neLicense/index', '1', '0', 'M', '1', '1', 'ne:neLicense:list', 'icon-fuzhidaima', 'supervisor', 1708580000000, 'supervisor', (UNIX_TIMESTAMP(NOW(3)) * 1000), '');
REPLACE INTO `sys_menu` VALUES (20000, 'menu.psap.agent', 0, 5, 'psapAgent', '', '1', '0', 'D', '1', '1', 'mf#agentManage', 'icon-tubiaoku', 'supervisor', 1711352709786, 'admin', 1744623120667, '');
REPLACE INTO `sys_menu` VALUES (20001, 'menu.psap.agent.callings', 20000, 1, 'callings', 'agentManage/callings/index', '1', '0', 'M', '1', '1', 'mf#agentManage:callings:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747795951448, '');
REPLACE INTO `sys_menu` VALUES (20002, 'menu.psap.agent.callback', 20000, 4, 'callback', 'agentManage/callback/index', '1', '0', 'M', '1', '1', 'mf#agentManage:callback:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
REPLACE INTO `sys_menu` VALUES (20003, 'menu.psap.cdr', 0, 7, 'psapCDR', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', 'supervisor', 1711352709786, 'admin', 1744623120667, '');
REPLACE INTO `sys_menu` VALUES (20004, 'menu.psap.cdr.mf', 20003, 1, 'mfCDR', 'dashboard/mfCDR/index', '1', '0', 'M', '1', '1', 'mf#dashboard:cdr:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
REPLACE INTO `sys_menu` VALUES (20005, 'menu.psap.cdr.crbt', 20003, 5, 'imsCDR', 'dashboard/imsCDR/index', '1', '0', 'M', '1', '1', 'ims#dashboard:cdr:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
REPLACE INTO `sys_menu` VALUES (20006, 'menu.psap.cdr.mms', 20003, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'smsc#dashboard:cdr:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
REPLACE INTO `sys_menu` VALUES (20007, 'menu.psap.cbc.cbe', 0, 6, 'cbe', 'cbc/cbe/index', '1', '0', 'M', '1', '1', 'cbc#dashboard:cdr:index', 'icon-tubiaoku', 'supervisor', 1711352709786, 'supervisor', 1747796007372, '');
SET FOREIGN_KEY_CHECKS=1;

View File

@@ -9,4 +9,22 @@ INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1055);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1056);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 2143);
DELETE FROM `sys_role_menu` WHERE `role_id` = 4 AND `menu_id` = 2133;
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 20000);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 20001);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 20002);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 20003);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 20004);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 20005);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 20006);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 20007);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 501);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1042);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1043);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1044);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1045);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 2159);
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -79,129 +79,153 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
// MF网元类型特殊处理, 未接电话的回拨工单流转处理
if neTypeLower == "mf" && cdrEvent.CDR["recordType"] == "MOC" && cdrEvent.CDR["agentName"] == "" {
// 发送到MF网元
// 构造网元MF的API地址
url := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/agents",
neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType))
// 发送HTTP请求获取座席列表
resp, err := http.Get(url)
if err != nil {
log.Error("Failed to get MF agents", err)
if err := handleMFMissedCallCDR(url, cdrEvent); err != nil {
log.Error("Failed to handle MF missed call CDR", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
defer resp.Body.Close()
// 解析座席列表响应
var agentResp struct {
Code int `json:"code"`
Data []ueCallBackTicket.AgentInfo `json:"data"`
Msg string `json:"msg"`
}
if err := json.NewDecoder(resp.Body).Decode(&agentResp); err != nil {
log.Error("Failed to decode MF agents response", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
// 调用服务获取最新一个被分配工单的座席和下一个要分配的座席
mfService := ueCallBackTicket.NewCallbackTicketService()
lastAgentName, err := mfService.GetLastAssignedAgent()
if err != nil {
log.Error("Failed to get last assigned agent", err)
// 可以继续执行,不返回错误
}
// 选择下一个要分配的座席
selectedAgent := mfService.SelectNextAgent(agentResp.Data, lastAgentName)
if selectedAgent != nil {
// 创建回调工单
var updatedAt *int64 = nil
ticket := ueCallBackTicket.CallbackTicket{
CallerNumber: cdrEvent.CDR["callerParty"].(string),
CalleeNumber: cdrEvent.CDR["calledParty"].(string),
Status: ueCallBackTicket.TicketStatusNew.Enum(),
AgentName: selectedAgent.Name,
AgentEmail: selectedAgent.Email,
AgentMobile: selectedAgent.Mobile,
Comment: "",
MsdData: cdrEvent.CDR["msdData"].(string),
RmUid: cdrEvent.RmUID,
CreatedAt: time.Now().UnixMicro(),
UpdatedAt: updatedAt,
}
if err := mfService.InsertCallbackTicket(ticket); err != nil {
log.Error("Failed to insert MF callback ticket", err)
// services.ResponseInternalServerError500ProcessError(w, err)
// return
}
// 新工单分配后发送邮件通知
if selectedAgent.Email != "" {
subject := "新工单分配通知"
body := fmt.Sprintf("您被分配了一个新的回拨工单,主叫号码:%s", ticket.CallerNumber)
go email.SendEmail(selectedAgent.Email, subject, body) // 异步发送
}
}
log.Warn("No available agents found for callback ticket")
}
// MF网元类型特殊处理, 处理座席回拨的工单流转
if neTypeLower == "mf" && cdrEvent.CDR["recordType"] == "MTC" {
// 获取座席号码(主叫)和被叫号码
agentNumber, ok1 := cdrEvent.CDR["callerParty"].(string)
callerNumber, ok2 := cdrEvent.CDR["calledParty"].(string)
if !ok1 || !ok2 {
log.Error("Invalid CDR format: missing callerParty or calledParty")
services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("invalid CDR format"))
return
}
// 获取通话时长
callDuration, ok := cdrEvent.CDR["callDuration"].(float64)
if !ok {
// 尝试其他可能的类型
if durationInt, ok := cdrEvent.CDR["callDuration"].(int); ok {
callDuration = float64(durationInt)
} else {
log.Error("Invalid CDR format: callDuration is not a number")
services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("invalid CDR format"))
return
}
}
// 通过座席号码和主叫号码查找符合条件的工单
mfService := ueCallBackTicket.NewCallbackTicketService()
ticket, err := mfService.FindCallbackTicketByAgentAndCaller(agentNumber, callerNumber)
if err != nil {
log.Error("Failed to find callback ticket", err)
if err := handleMFCDRCallBack(cdrEvent); err != nil {
log.Error("Failed to handle MF CDR callback", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
if ticket == nil {
// 没有找到对应的工单,可能是手动呼叫,不处理
log.Warn(fmt.Sprintf("No callback ticket found for agent %s and caller %s", agentNumber, callerNumber))
services.ResponseStatusOK204NoContent(w)
return
}
// 获取通话信息
seizureTime, _ := cdrEvent.CDR["seizureTime"].(string)
releaseTime, _ := cdrEvent.CDR["releaseTime"].(string)
cause, _ := cdrEvent.CDR["cause"].(string)
// 处理回拨结果并更新工单
if err := mfService.ProcessCallbackResult(ticket, callDuration, seizureTime, releaseTime, cause); err != nil {
log.Error("Failed to process callback result", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
log.Info(fmt.Sprintf("Successfully processed callback for ticket %d", ticket.TicketId))
}
services.ResponseStatusOK204NoContent(w)
}
// MF网元类型特殊处理, 未接电话的回拨工单流转处理
func handleMFMissedCallCDR(url string, cdrEvent CDREvent) error {
// 发送HTTP请求获取座席列表
resp, err := http.Get(url)
if err != nil {
return fmt.Errorf("failed to get MF agents: %w", err)
}
defer resp.Body.Close()
// 解析座席列表响应
var agentResp struct {
Code int `json:"code"`
Data []ueCallBackTicket.AgentInfo `json:"data"`
Msg string `json:"msg"`
}
if err := json.NewDecoder(resp.Body).Decode(&agentResp); err != nil {
return fmt.Errorf("failed to decode MF agent response: %w", err)
}
// 调用服务获取最新一个被分配工单的座席和下一个要分配的座席
mfService := ueCallBackTicket.NewCallbackTicketService()
lastAgentName, err := mfService.GetLastAssignedAgent()
if err != nil {
return fmt.Errorf("failed to get last assigned agent: %w", err)
}
// 选择下一个要分配的座席
selectedAgent := mfService.SelectNextAgent(agentResp.Data, lastAgentName)
if selectedAgent != nil {
// 创建回调工单
var updatedAt *int64 = nil
ticket := ueCallBackTicket.CallbackTicket{
CallerNumber: cdrEvent.CDR["callerParty"].(string),
CalleeNumber: cdrEvent.CDR["calledParty"].(string),
Status: ueCallBackTicket.TicketStatusNew.Enum(),
AgentName: selectedAgent.Name,
AgentEmail: selectedAgent.Email,
AgentMobile: selectedAgent.Mobile,
Comment: "",
RmUid: cdrEvent.RmUID,
CreatedAt: time.Now().UnixMicro(),
UpdatedAt: updatedAt,
}
if err := mfService.InsertCallbackTicket(&ticket); err != nil {
return fmt.Errorf("failed to insert MF callback ticket: %w", err)
}
// 新工单分配后发送邮件通知
if selectedAgent.Email != "" {
// 发送邮件通知
emailConfig := config.GetSMTPConfig()
if emailConfig != nil && emailConfig.Enabled {
// 创建配置副本,避免修改全局配置
emailCopy := *emailConfig // 浅拷贝结构体
// 合并配置中的To地址和当前工单的座席邮箱
var recipients []string
// 添加配置中的原始收件人(如管理员、监控人员等)
if len(emailConfig.To) > 0 {
recipients = append(recipients, strings.Split(emailConfig.To, ",")...)
}
// 添加当前工单的座席邮箱
recipients = append(recipients, ticket.AgentEmail)
// 去重处理(避免重复邮箱)
emailCopy.To = strings.Join(email.RemoveDuplicateEmails(recipients), ",")
// 设置邮件主题和内容
emailCopy.Subject = "新工单分配通知"
emailCopy.Body = fmt.Sprintf("您被分配了一个新的回拨工单(编号:%d, 主叫号码:%s), 请及时处理.",
ticket.TicketId, ticket.CallerNumber)
go email.SendEmailWithGomail(emailCopy) // 异步发送
}
}
}
log.Warn("No available agents found for callback ticket")
return nil
}
func handleMFCDRCallBack(cdrEvent CDREvent) error {
// 获取座席号码(主叫)和被叫号码
agentNumber, ok1 := cdrEvent.CDR["callerParty"].(string)
callerNumber, ok2 := cdrEvent.CDR["calledParty"].(string)
if !ok1 || !ok2 {
return fmt.Errorf("invalid CDR format: missing callerParty or calledParty")
}
// 获取通话时长
callDuration, ok := cdrEvent.CDR["callDuration"].(float64)
if !ok {
// 尝试其他可能的类型
if durationInt, ok := cdrEvent.CDR["callDuration"].(int); ok {
callDuration = float64(durationInt)
} else {
return fmt.Errorf("invalid CDR format: callDuration is not a number")
}
}
// 通过座席号码和主叫号码查找符合条件的工单
mfService := ueCallBackTicket.NewCallbackTicketService()
ticket, err := mfService.FindCallbackTicketByAgentAndCaller(agentNumber, callerNumber)
if err != nil {
return fmt.Errorf("failed to find callback ticket: %w", err)
}
if ticket == nil {
// 没有找到对应的工单,可能是手动呼叫,不处理
return fmt.Errorf("no callback ticket found for agent %s and caller %s", agentNumber, callerNumber)
}
// 获取通话信息
seizureTime, _ := cdrEvent.CDR["seizureTime"].(string)
releaseTime, _ := cdrEvent.CDR["releaseTime"].(string)
cause, _ := cdrEvent.CDR["cause"].(string)
// 处理回拨结果并更新工单
if err := mfService.ProcessCallbackResult(ticket, callDuration, seizureTime, releaseTime, cause); err != nil {
return fmt.Errorf("failed to process callback result: %w", err)
}
log.Info(fmt.Sprintf("Successfully processed callback for ticket %d", ticket.TicketId))
return nil
}

View File

@@ -22,6 +22,13 @@ func (o *ConfigOMC) Query(paramName string) (any, error) {
result := config.GetYamlConfig().Alarm.SMSCForward
result.Password = PASSWORD_MASK
results = append(results, result)
case "ticketNotification":
result := config.GetPsapConfig().Ticket.TicketNotification
result.Password = PASSWORD_MASK
results = append(results, result)
case "ticketTimeout":
result := config.GetPsapConfig().Ticket.TicketTimeout
results = append(results, result)
default:
return nil, fmt.Errorf("invalid source parameter")
}
@@ -57,6 +64,26 @@ func (o *ConfigOMC) Modify(paramName string, paramData map[string]any) (any, err
fmt.Println("failed to write config yaml file:", err)
return results, err
}
case "ticketNotification":
param := &(config.GetPsapConfig().Ticket.TicketNotification)
config.UpdatePsapStructFromMap(param, paramData)
result := *param
results = append(results, result)
err := config.WritePsapOriginalConfig(config.PsapYamlConfigInfo.FilePath, paramName, paramData)
if err != nil {
fmt.Println("failed to write config yaml file:", err)
return results, err
}
case "ticketTimeout":
param := &(config.GetPsapConfig().Ticket.TicketTimeout)
config.UpdatePsapStructFromMap(param, paramData)
result := *param
results = append(results, result)
err := config.WritePsapOriginalConfig(config.PsapYamlConfigInfo.FilePath, paramName, paramData)
if err != nil {
fmt.Println("failed to write config yaml file:", err)
return results, err
}
default:
return nil, fmt.Errorf("invalid source parameter")
}

View File

@@ -3,18 +3,42 @@
package ue
import (
"be.ems/features/ue/cb_message"
"be.ems/features/ue/mf_callback_ticket"
"be.ems/features/ue/mf_calling"
"be.ems/lib/log"
"be.ems/src/framework/middleware"
"github.com/gin-gonic/gin"
)
// Register registers the UE management routes
// @Description Register UE management routes
// @Tags UE Management
// @Router /api/ue/v1 [get]
func Register(r *gin.RouterGroup) {
log.Info("======init UE management group gin.Engine")
cbGroup := r.Group("/:neType")
{
cbGroup.POST("/:cbsState",
middleware.PreAuthorize(nil),
PostCBSState,
)
}
}
func InitSubServiceRoute(r *gin.Engine) {
log.Info("======init UE management group gin.Engine")
mfGroup := r.Group("/psap/v1/mf")
cbeGroup := r.Group("/psap/v1/cbc")
cbsGroup := r.Group("/api/ue/v1")
mf_calling.Register(mfGroup)
mf_callback_ticket.Register(mfGroup)
cb_message.Register(cbeGroup)
Register(cbsGroup)
// register other sub modules routes
log.Info("======init UE management group gin.Engine end")
}

View File

@@ -0,0 +1,286 @@
package cb_message
import (
"encoding/json"
"io"
"strconv"
"time"
"be.ems/src/framework/i18n"
"be.ems/src/framework/middleware"
"be.ems/src/framework/utils/ctx"
"be.ems/src/framework/vo/result"
"github.com/gin-gonic/gin"
)
// @Description Register Routes for mf calling
func Register(r *gin.RouterGroup) {
cbGroup := r.Group("/:neId")
{
var m *CBMessage
cbGroup.GET("/message/list",
middleware.PreAuthorize(nil),
m.List,
)
cbGroup.GET("/message/:id",
middleware.PreAuthorize(nil),
m.GetById,
)
cbGroup.POST("/message",
middleware.PreAuthorize(nil),
m.Insert,
)
cbGroup.PUT("/message/:id/:status",
middleware.PreAuthorize(nil),
m.UpdateStatus,
)
cbGroup.PUT("/message/:id",
middleware.PreAuthorize(nil),
m.Update,
)
cbGroup.DELETE("/message/:id",
middleware.PreAuthorize(nil),
m.Delete,
)
}
}
func (m *CBMessage) List(c *gin.Context) {
language := ctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
var query CBMessageQuery
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
query.NeType = "CBC"
query.NeId = neId
service := NewCBMessageService()
data, total, err := service.SelectCBMessage(query)
if err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
// 转换数据格式,确保 MessageJson 正确序列化
processedData := make([]map[string]interface{}, len(data))
for i, msg := range data {
var messageJson interface{}
if len(msg.MessageJson) > 0 {
// 尝试解析为 JSON 对象
if err := json.Unmarshal(msg.MessageJson, &messageJson); err != nil {
// 如果解析失败,就作为字符串
messageJson = string(msg.MessageJson)
}
}
processedData[i] = map[string]interface{}{
"id": msg.Id,
"neType": msg.NeType,
"neId": msg.NeId,
"messageJson": messageJson, // 这里是解析后的 JSON 对象
"status": msg.Status.Enum(),
"detail": msg.Detail,
"createdAt": msg.CreatedAt,
"updatedAt": msg.UpdatedAt,
}
}
c.JSON(200, result.Ok(gin.H{
"total": total,
"data": processedData,
}))
}
// Update 更新CB消息
func (m *CBMessage) Insert(c *gin.Context) {
language := ctx.AcceptLanguage(c)
// 绑定请求体
var msg CBMessage
msg.NeType = "CBC"
msg.NeId = c.Param("neId")
msg.Status = CBEventStatusInactive // 默认状态为 INACTIVE
if msg.NeId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
msg.CreatedAt = time.Now().Local().UnixMicro()
msg.UpdatedAt = nil // 新增时更新时间为nil
// 直接读取body为json.RawMessage
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
msg.MessageJson = json.RawMessage(body)
service := NewCBMessageService()
if err := service.InsertCBMessage(msg); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// Update 更新CB消息
func (m *CBMessage) Update(c *gin.Context) {
language := ctx.AcceptLanguage(c)
// 获取路径参数
messageId := c.Param("id")
if messageId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
id, err := strconv.ParseInt(messageId, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
// 直接读取body为json.RawMessage
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
messageJson := json.RawMessage(body)
service := NewCBMessageService()
if err := service.UpdateCBMessage(id, messageJson); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// UpdateStatus 更新CB消息状态
// 这里的 neId 参数是为了兼容性,实际更新状态时不需要使用它
// 但为了保持与原有接口一致,仍然保留该参数
// 如果需要根据 neId 进行特定的逻辑处理,可以在服务层实现
// 但在当前实现中neId 仅用于验证请求的有效性
// 实际的状态更新逻辑不依赖于 neId
// 该接口用于更新 CB 消息的状态,状态值通过查询参数传递
// 例如PUT /:neId/message/status?status=ACTIVE
func (m *CBMessage) UpdateStatus(c *gin.Context) {
language := ctx.AcceptLanguage(c)
neId := c.Param("neId")
status := c.Param("status")
if neId == "" || status == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
messageId := c.Param("id")
if messageId != "" {
id, err := strconv.ParseInt(messageId, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
// 如果提供了 messageId则更新特定消息的状态
service := NewCBMessageService()
if err := service.UpdateCBMessageStatus(id, status); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
return
}
// 如果没有提供 messageId则更新所有消息的状态
service := NewCBMessageService()
if err := service.UpdateCBMessageStatusByNeId(neId, status); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// Delete 删除CB消息
func (m *CBMessage) Delete(c *gin.Context) {
language := ctx.AcceptLanguage(c)
// 获取路径参数
messageId := c.Param("id")
if messageId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
id, err := strconv.ParseInt(messageId, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
service := NewCBMessageService()
if err := service.DeleteCBMessage(id); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// GetById 根据ID获取CB消息
func (m *CBMessage) GetById(c *gin.Context) {
language := ctx.AcceptLanguage(c)
// 获取路径参数
idStr := c.Param("id")
if idStr == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
id, err := strconv.ParseInt(idStr, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
service := NewCBMessageService()
data, err := service.SelectCBMessageById(id)
if err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
if data == nil {
c.JSON(404, result.CodeMsg(404, i18n.TKey(language, "app.common.err404")))
return
}
// 转换数据格式,确保 MessageJson 正确序列化
var messageJson interface{}
if len(data.MessageJson) > 0 {
// 尝试解析为 JSON 对象
if err := json.Unmarshal(data.MessageJson, &messageJson); err != nil {
// 如果解析失败,就作为字符串
messageJson = string(data.MessageJson)
}
}
processedData := map[string]interface{}{
"id": data.Id,
"neType": data.NeType,
"neId": data.NeId,
"messageJson": messageJson, // 这里是解析后的 JSON 对象
"status": data.Status.Enum(),
"detail": data.Detail,
"createdAt": data.CreatedAt,
"updatedAt": data.UpdatedAt,
}
c.JSON(200, result.Ok(gin.H{
"data": processedData,
}))
}

View File

@@ -0,0 +1,112 @@
package cb_message
import (
"database/sql/driver"
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
)
type CBEventStatus int
// CBEventStatus CB事件状态枚举
const (
CBEventStatusNull CBEventStatus = iota // 未知状态
CBEventStatusActive
CBEventStatusInactive
)
func (status CBEventStatus) Enum() string {
switch status {
case CBEventStatusNull:
return "NULL"
case CBEventStatusActive:
return "ACTIVE"
case CBEventStatusInactive:
return "INACTIVE"
default:
return "UNKNOWN"
}
}
func (status CBEventStatus) String() string {
return fmt.Sprintf("%d", status)
}
// ParseCBEventStatus 将字符串转换为 枚举类型
func ParseCBEventStatus(s string) CBEventStatus {
if i, err := strconv.Atoi(s); err == nil {
return CBEventStatus(i)
}
// 如果转换失败,则按名称匹配(忽略大小写)
switch strings.ToUpper(s) {
case "NULL":
return CBEventStatusNull
case "ACTIVE":
return CBEventStatusActive
case "INACTIVE":
return CBEventStatusInactive
case "":
// 如果字符串为空,则返回未知状态
return CBEventStatusNull
default:
// 默认返回未知状态
return CBEventStatusNull
}
}
// CBMessageQuery 查询条件结构体
type CBMessageQuery struct {
NeType string `form:"neType"` // 网元类型
NeId string `form:"neId"` // 网元ID
EventName string `form:"eventName"` // 事件名称
Status string `form:"status"` // 消息状态
StartTime string `form:"startTime"` // 创建时间范围-起始
EndTime string `form:"endTime"` // 创建时间范围-结束
PageNum int `form:"pageNum" binding:"required"`
PageSize int `form:"pageSize" binding:"required"`
}
// @Description CBMessage CB消息
type CBMessage struct {
Id int64 `json:"id" gorm:"column:id"` // CB消息ID
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
NeId string `json:"neId" gorm:"column:ne_id"` // 网元ID
MessageJson json.RawMessage `json:"messageJson" gorm:"column:message_json"` // 消息内容JSON
Status CBEventStatus `json:"status" gorm:"column:status"` // 消息状态
Detail string `json:"detail" gorm:"column:detail"` // 详情
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间
UpdatedAt *int64 `json:"updatedAt" gorm:"column:updated_at;autoUpdateTime:false"` // 更新时间
}
// TableName 表名称
func (*CBMessage) TableName() string {
return "cb_message"
}
// Scan 实现 sql.Scanner 接口,支持从数据库字符串转为 CBEventStatus
func (s *CBEventStatus) Scan(value interface{}) error {
switch v := value.(type) {
case string:
*s = ParseCBEventStatus(v)
return nil
case []byte:
*s = ParseCBEventStatus(string(v))
return nil
case int64:
*s = CBEventStatus(v)
return nil
case int:
*s = CBEventStatus(v)
return nil
default:
return errors.New("unsupported Scan type for CBEventStatus")
}
}
// Value 实现 driver.Valuer 接口,支持将 CBEventStatus 存为字符串
func (s CBEventStatus) Value() (driver.Value, error) {
return s.Enum(), nil
}

View File

@@ -0,0 +1,541 @@
package cb_message
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"time"
"be.ems/lib/dborm"
timelib "be.ems/lib/time"
neService "be.ems/src/modules/network_element/service"
"gorm.io/gorm"
)
type CBMessageService struct {
db *gorm.DB
}
// 构造函数示例
func NewCBMessageService() *CBMessageService {
db := dborm.DefaultDB()
return &CBMessageService{db: db}
}
// SelectCBMessage 根据条件分页查询CB消息
func (s *CBMessageService) SelectCBMessage(query CBMessageQuery) ([]CBMessage, int, error) {
var msg []CBMessage
var total int64
db := s.db.Table("cb_message")
if query.NeType != "" {
db = db.Where("ne_type = ?", query.NeType)
}
if query.NeId != "" {
db = db.Where("ne_id = ?", query.NeId)
}
if query.EventName != "" {
db = db.Where("JSON_EXTRACT(message_json, '$.eventName') = ?", query.EventName)
}
if query.Status != "" {
db = db.Where("status = ?", query.Status)
}
var startMicro, endMicro int64
var err error
if query.StartTime != "" {
startMicro, err = timelib.ParseTimeToMicro(query.StartTime)
if err != nil {
return nil, 0, fmt.Errorf("invalid start time: %w", err)
}
}
if query.EndTime != "" {
endMicro, err = timelib.ParseTimeToMicro(query.EndTime)
if err != nil {
return nil, 0, fmt.Errorf("invalid end time: %w", err)
}
}
if startMicro > 0 && endMicro > 0 {
db = db.Where("created_at BETWEEN ? AND ?", startMicro, endMicro)
} else if startMicro > 0 {
db = db.Where("created_at >= ?", startMicro)
} else if endMicro > 0 {
db = db.Where("created_at <= ?", endMicro)
}
// 统计总数
if err := db.Count(&total).Error; err != nil {
return nil, 0, fmt.Errorf("failed to count CB message: %w", err)
}
// 分页查询
offset := (query.PageNum - 1) * query.PageSize
if err := db.Limit(query.PageSize).Offset(offset).Order("created_at desc").Find(&msg).Error; err != nil {
return nil, 0, fmt.Errorf("failed to select CB message: %w", err)
}
return msg, int(total), nil
}
// SelectCBMessageByPage 分页查询CB消息
// @Description 分页查询CB消息
// @param page 页码
// @param pageSize 每页大小
// @return []CBMessage CB消息列表
// @return int 总记录数
// @return error 错误信息
// @example
// mfCBMessageService.SelectCBMessageByPage(1, 10)
func (s *CBMessageService) SelectCBMessageByPage(pageNum int, pageSize int) ([]CBMessage, int, error) {
var tickets []CBMessage
var total int64
// 统计总数
if err := s.db.Table("cb_message").Count(&total).Error; err != nil {
return nil, 0, fmt.Errorf("failed to count CB message: %w", err)
}
// 分页查询
offset := (pageNum - 1) * pageSize
if err := s.db.Table("cb_message").
Limit(pageSize).
Offset(offset).
Find(&tickets).Error; err != nil {
return nil, 0, fmt.Errorf("failed to select CB message: %w", err)
}
return tickets, int(total), nil
}
// InsertCBMessage 插入CB消息
// @Description 插入CB消息
// @param msg CB消息对象
// @return error 错误信息
// @example
// CBMessageService.InsertCBMessage(msg)
func (s *CBMessageService) InsertCBMessage(msg CBMessage) error {
// 解析messageJson获取eventName
var messageData map[string]interface{}
if err := json.Unmarshal(msg.MessageJson, &messageData); err != nil {
return fmt.Errorf("failed to parse message_json: %w", err)
}
// 提取eventName
eventName, ok := messageData["eventName"].(string)
if !ok || eventName == "" {
return fmt.Errorf("eventName is required in message_json")
}
// 检查是否已存在相同的eventName
var existingCount int64
if err := s.db.Table("cb_message").
Where("ne_type = ? AND ne_id = ? AND JSON_EXTRACT(message_json, '$.eventName') = ?",
msg.NeType, msg.NeId, eventName).
Count(&existingCount).Error; err != nil {
return fmt.Errorf("failed to check existing CB message: %w", err)
}
if existingCount > 0 {
return fmt.Errorf("CB message with eventName '%s' already exists for neType '%s' and neId '%s'",
eventName, msg.NeType, msg.NeId)
}
// 这里可以使用ORM或其他方式将ticket插入到数据库中
if err := s.db.Table("cb_message").Create(&msg).Error; err != nil {
return fmt.Errorf("failed to insert CB message: %w", err)
}
return nil
}
// SelectCBMessageById 根据工单ID查询CB消息
// @Description 根据工单ID查询CB消息
// @param id 工单ID
// @return *CBMessage CB消息对象
// @return error 错误信息
// @example
// CBMessageService.SelectCBMessageById(12345)
func (s *CBMessageService) SelectCBMessageById(id int64) (*CBMessage, error) {
var msg CBMessage
if err := s.db.Table("cb_message").
Where("id = ?", id).
First(&msg).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return nil, fmt.Errorf("CB message with ID %d not found", id)
}
return nil, fmt.Errorf("failed to select CB message: %w", err)
}
return &msg, nil
}
// UpdateCBMessage 更新CB消息
// @Description 更新CB消息
// @param msg CB消息对象
// @return error 错误信息
// @example
// mfCBMessageService.UpdateCBMessage(msg)
func (s *CBMessageService) UpdateCBMessage(id int64, messageJson json.RawMessage) error {
// 解析messageJson获取eventName
var messageData map[string]interface{}
if err := json.Unmarshal(messageJson, &messageData); err != nil {
return fmt.Errorf("failed to parse message_json: %w", err)
}
// 提取eventName
eventName, ok := messageData["eventName"].(string)
if !ok || eventName == "" {
return fmt.Errorf("eventName is required in message_json")
}
// 检查是否已存在相同的eventName
var msg CBMessage
if err := s.db.Table("cb_message").
Where("id = ? AND JSON_EXTRACT(message_json, '$.eventName') = ?", id, eventName).
First(&msg).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("CB message with eventName '%s' not found for ID %d", eventName, id)
}
return fmt.Errorf("failed to query CB message: %w", err)
}
now := time.Now().UnixMicro()
err := s.db.Transaction(func(tx *gorm.DB) error {
// 在事务中更新
if err := tx.Table("cb_message").
Where("id = ?", id).
Updates(map[string]any{
"message_json": messageJson,
"updated_at": now,
}).Error; err != nil {
return fmt.Errorf("failed to update CBC message: %w", err)
}
// 在事务中查询更新后的记录
if err := tx.Table("cb_message").
Where("id = ?", id).
First(&msg).Error; err != nil {
return fmt.Errorf("failed to fetch updated CBC message: %w", err)
}
return nil
})
if err != nil {
return fmt.Errorf("failed to update CB message: %w", err)
}
// 如果状态是ACTIVE发送更新请求
if msg.Status == CBEventStatusActive {
if err := s.sendUpdateRequest(msg); err != nil {
return fmt.Errorf("failed to send update request: %w", err)
}
}
return nil
}
// DeleteCBMessage 删除CB消息
// @Description 删除CB消息
// @param id 工单ID
// @return error 错误信息
// @example
// mfCBMessageService.DeleteCBMessage(12345)
func (s *CBMessageService) DeleteCBMessage(id int64) error {
// 先查询记录状态
var msg CBMessage
if err := s.db.Table("cb_message").
Where("id = ?", id).
First(&msg).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("not found CB message (ID: %d)", id)
}
return fmt.Errorf("failed to query CB message: %w", err)
}
// 检查状态是否为ACTIVE
if msg.Status == CBEventStatusActive {
return fmt.Errorf("cannot delete an active CB message (ID: %d)", id)
}
// 执行删除操作
if err := s.db.Table("cb_message").
Where("id = ?", id).
Delete(&CBMessage{}).Error; err != nil {
return fmt.Errorf("failed to delete CB message: %w", err)
}
return nil
}
// UpdateCBMessageStatus 更新CB消息状态
// @Description 更新CB消息状态并根据状态变化发送相应的HTTP请求
// @param status 新状态
// @return error 错误信息
func (s *CBMessageService) UpdateCBMessageStatus(id int64, status string) error {
newStatus := ParseCBEventStatus(status)
// 查询所有需要更新的记录
var msg CBMessage
if err := s.db.Table("cb_message").Where("id = ?", id).First(&msg).Error; err != nil {
return fmt.Errorf("failed to query CB messages: %w", err)
}
oldStatus := msg.Status
// 检查状态是否发生变化
if oldStatus == newStatus {
return fmt.Errorf("CB message status is already %s", newStatus.Enum())
}
// 更新数据库状态
now := time.Now().UnixMicro()
if err := s.db.Table("cb_message").
Where("id = ?", msg.Id).
Updates(map[string]interface{}{
"status": newStatus,
"updated_at": now,
}).Error; err != nil {
return fmt.Errorf("failed to update CB message status: %w", err)
}
// 根据状态变化发送HTTP请求
if err := s.handleStatusChange(msg, oldStatus, newStatus); err != nil {
// 记录错误但不中断处理其他消息
fmt.Printf("Failed to handle status change for message %d: %v\n", msg.Id, err)
}
return nil
}
// UpdateCBMessageStatus 更新CB消息状态
// @Description 更新CB消息状态并根据状态变化发送相应的HTTP请求
// @param status 新状态
// @return error 错误信息
func (s *CBMessageService) UpdateCBMessageStatusByNeId(neId string, status string) error {
newStatus := ParseCBEventStatus(status)
// 查询所有需要更新的记录
var messages []CBMessage
if err := s.db.Table("cb_message").Where("ne_id = ?", neId).Find(&messages).Error; err != nil {
return fmt.Errorf("failed to query CB messages: %w", err)
}
for _, msg := range messages {
oldStatus := msg.Status
// 检查状态是否发生变化
if oldStatus == newStatus {
continue // 状态没有变化,跳过
}
// 更新数据库状态
now := time.Now().UnixMicro()
if err := s.db.Table("cb_message").
Where("id = ?", msg.Id).
Updates(map[string]interface{}{
"status": newStatus,
"updated_at": now,
}).Error; err != nil {
return fmt.Errorf("failed to update CB message status: %w", err)
}
// 根据状态变化发送HTTP请求
if err := s.handleStatusChange(msg, oldStatus, newStatus); err != nil {
// 记录错误但不中断处理其他消息
fmt.Printf("Failed to handle status change for message %d: %v\n", msg.Id, err)
}
}
return nil
}
// UpdateCBMessageStatus 更新CB消息状态
// @Description 更新CB消息状态并根据状态变化发送相应的HTTP请求
// @param status 新状态
// @return error 错误信息
func (s *CBMessageService) UpdateAllCBMessageStatus(status string) error {
newStatus := ParseCBEventStatus(status)
// 查询所有需要更新的记录
var messages []CBMessage
if err := s.db.Table("cb_message").Find(&messages).Error; err != nil {
return fmt.Errorf("failed to query CB messages: %w", err)
}
for _, msg := range messages {
oldStatus := msg.Status
// 检查状态是否发生变化
if oldStatus == newStatus {
continue // 状态没有变化,跳过
}
// 更新数据库状态
now := time.Now().UnixMicro()
if err := s.db.Table("cb_message").
Where("id = ?", msg.Id).
Updates(map[string]interface{}{
"status": newStatus,
"updated_at": now,
}).Error; err != nil {
return fmt.Errorf("failed to update CB message status: %w", err)
}
// 根据状态变化发送HTTP请求
if err := s.handleStatusChange(msg, oldStatus, newStatus); err != nil {
// 记录错误但不中断处理其他消息
fmt.Printf("Failed to handle status change for message %d: %v\n", msg.Id, err)
}
}
return nil
}
// handleStatusChange 处理状态变化时的HTTP请求
func (s *CBMessageService) handleStatusChange(msg CBMessage, oldStatus, newStatus CBEventStatus) error {
// 从NULL/INACTIVE状态修改为ACTIVE
if (oldStatus == CBEventStatusNull || oldStatus == CBEventStatusInactive) &&
newStatus == CBEventStatusActive {
return s.sendActivateRequest(msg)
}
// 从ACTIVE更改为INACTIVE状态
if oldStatus == CBEventStatusActive && newStatus == CBEventStatusInactive {
return s.sendDeactivateRequest(msg)
}
return nil
}
// getCBCNetworkElement 获取CBC网元的IP和端口信息
// 这个方法需要根据你的实际网元管理系统来实现
func (s *CBMessageService) getCBCNetworkElement(neId string) (string, int64, error) {
// 查询网元信息
neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID("CBC", neId)
if neInfo.IP == "" {
return "", 0, fmt.Errorf("CBC network element not found for neId: %s", neId)
}
return neInfo.IP, neInfo.Port, nil
}
// CBCHTTPClient CBC网元HTTP客户端
type CBCHTTPClient struct {
client *http.Client
baseURL string
}
// NewCBCHTTPClient 创建CBC HTTP客户端
func NewCBCHTTPClient(baseURL string) *CBCHTTPClient {
return &CBCHTTPClient{
client: &http.Client{
Timeout: 10 * time.Second,
},
baseURL: baseURL,
}
}
// PostMessage 发送POST请求创建消息
func (c *CBCHTTPClient) PostMessage(messageData []byte) error {
url := fmt.Sprintf("%s/api/v1/cbe/message", c.baseURL)
return c.sendRequest("POST", url, messageData)
}
// PutMessage 发送PUT请求更新消息
func (c *CBCHTTPClient) PutMessage(messageData []byte) error {
url := fmt.Sprintf("%s/api/v1/cbe/message", c.baseURL)
return c.sendRequest("PUT", url, messageData)
}
// DeleteMessage 发送DELETE请求删除消息
func (c *CBCHTTPClient) DeleteMessage(eventName string, deletePayload []byte) error {
url := fmt.Sprintf("%s/api/v1/cbe/message/%s", c.baseURL, eventName)
return c.sendRequest("DELETE", url, deletePayload)
}
// sendRequest 发送HTTP请求
func (c *CBCHTTPClient) sendRequest(method, url string, body []byte) error {
req, err := http.NewRequest(method, url, bytes.NewReader(body))
if err != nil {
return fmt.Errorf("failed to create %s request: %w", method, err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := c.client.Do(req)
if err != nil {
return fmt.Errorf("failed to send %s request: %w", method, err)
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
body, _ := io.ReadAll(resp.Body)
return fmt.Errorf("%s request failed with status: %d, body: %s",
method, resp.StatusCode, string(body))
}
return nil
}
// 在CBMessageService中添加方法
func (s *CBMessageService) getCBCHTTPClient(neId string) (*CBCHTTPClient, error) {
cbcIP, cbcPort, err := s.getCBCNetworkElement(neId)
if err != nil {
return nil, fmt.Errorf("failed to get CBC network element info: %w", err)
}
baseURL := fmt.Sprintf("http://%s:%d", cbcIP, cbcPort)
return NewCBCHTTPClient(baseURL), nil
}
// 重构后的激活请求
func (s *CBMessageService) sendActivateRequest(msg CBMessage) error {
client, err := s.getCBCHTTPClient(msg.NeId)
if err != nil {
return err
}
return client.PostMessage(msg.MessageJson)
}
// 重构后的更新请求
func (s *CBMessageService) sendUpdateRequest(msg CBMessage) error {
client, err := s.getCBCHTTPClient(msg.NeId)
if err != nil {
return err
}
return client.PostMessage(msg.MessageJson)
}
// 重构后的停用请求
func (s *CBMessageService) sendDeactivateRequest(msg CBMessage) error {
client, err := s.getCBCHTTPClient(msg.NeId)
if err != nil {
return err
}
// 解析和构造删除载荷的逻辑保持不变
var messageData map[string]interface{}
if err := json.Unmarshal(msg.MessageJson, &messageData); err != nil {
return fmt.Errorf("failed to parse message_json: %w", err)
}
eventName, ok := messageData["eventName"].(string)
if !ok || eventName == "" {
return fmt.Errorf("eventName not found in message_json")
}
deletePayload := make(map[string]interface{})
if messageIdProfile, exists := messageData["messageIdProfile"]; exists {
deletePayload["messageIdProfile"] = messageIdProfile
}
if warningAreaList, exists := messageData["warningAreaList"]; exists {
deletePayload["warningAreaList"] = warningAreaList
}
payloadBytes, err := json.Marshal(deletePayload)
if err != nil {
return fmt.Errorf("failed to marshal delete payload: %w", err)
}
return client.DeleteMessage(eventName, payloadBytes)
}

View File

@@ -24,6 +24,10 @@ func Register(r *gin.RouterGroup) {
middleware.PreAuthorize(nil),
m.Update,
)
mfCallingGroup.PATCH("/:ticketId/status",
middleware.PreAuthorize(nil),
m.StartProcessingTicket,
)
mfCallingGroup.DELETE("/:ticketId",
middleware.PreAuthorize(nil),
m.Delete,
@@ -94,6 +98,69 @@ func (m *CallbackTicket) Update(c *gin.Context) {
c.JSON(200, result.Ok(nil))
}
func (m *CallbackTicket) UpdateTicketStatus(c *gin.Context) {
language := ctx.AcceptLanguage(c)
username := ctx.LoginUserToUserName(c)
// 获取路径参数
ticketId := c.Param("ticketId")
if ticketId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
id, err := strconv.ParseInt(ticketId, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
// 绑定请求体
var statusUpdate struct {
Status string `json:"status" binding:"required"`
UpdatedBy string `json:"updatedBy"`
}
if err := c.ShouldBindJSON(&statusUpdate); err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
statusUpdate.UpdatedBy = username
service := NewCallbackTicketService()
if err := service.UpdateCallbackTicketStatus(id, statusUpdate.Status, statusUpdate.UpdatedBy); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
func (m *CallbackTicket) StartProcessingTicket(c *gin.Context) {
language := ctx.AcceptLanguage(c)
username := ctx.LoginUserToUserName(c)
// 获取路径参数
ticketId := c.Param("ticketId")
if ticketId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
id, err := strconv.ParseInt(ticketId, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
service := NewCallbackTicketService()
if err := service.StartProcessingTicket(id, username); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// Delete 删除回调工单
func (m *CallbackTicket) Delete(c *gin.Context) {
language := ctx.AcceptLanguage(c)

View File

@@ -98,18 +98,17 @@ type CallbackTicketQuery struct {
// @Description VoLTE用户信息
type CallbackTicket struct {
TicketId int64 `json:"ticketId" gorm:"column:ticket_id"` // 工单ID
CallerNumber string `json:"callerNumber" gorm:"column:caller_number"` // 主叫号码
CalleeNumber string `json:"calleeNumber" gorm:"column:callee_number"` // 被叫号码
Status string `json:"status" gorm:"column:status"` // 工单状态
AgentName string `json:"agentName" gorm:"column:agent_name"` // 座席名称
AgentEmail string `json:"agentEmail" gorm:"column:agent_email"` // 座席邮箱
AgentMobile string `json:"agentMobile" gorm:"column:agent_mobile"` // 座席手机号码
Comment string `json:"comment" gorm:"column:comment"` // 工单备注
MsdData string `json:"msdData" gorm:"column:msd_data"` // MSD数据
RmUid string `json:"rmUid" gorm:"column:rm_uid"` // RM用户ID
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间
UpdatedAt *int64 `json:"updatedAt" gorm:"column:updated_at;autoUpdateTime:false"` // 更新时间
TicketId int64 `json:"ticketId" gorm:"column:ticket_id;primaryKey;autoIncrement"` // 工单ID
CallerNumber string `json:"callerNumber" gorm:"column:caller_number"` // 主叫号码
CalleeNumber string `json:"calleeNumber" gorm:"column:callee_number"` // 被叫号码
Status string `json:"status" gorm:"column:status"` // 工单状态
AgentName string `json:"agentName" gorm:"column:agent_name"` // 座席名称
AgentEmail string `json:"agentEmail" gorm:"column:agent_email"` // 座席邮箱
AgentMobile string `json:"agentMobile" gorm:"column:agent_mobile"` // 座席手机号码
Comment string `json:"comment" gorm:"column:comment"` // 工单备注
RmUid string `json:"rmUid" gorm:"column:rm_uid"` // RM用户ID
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间
UpdatedAt *int64 `json:"updatedAt" gorm:"column:updated_at;autoUpdateTime:false"` // 更新时间
}
type AgentInfo struct {

View File

@@ -2,10 +2,13 @@ package mf_callback_ticket
import (
"fmt"
"strings"
"time"
"be.ems/lib/config"
"be.ems/lib/dborm"
"be.ems/lib/email"
"be.ems/lib/log"
"gorm.io/gorm"
)
@@ -13,6 +16,15 @@ type CallbackTicketService struct {
db *gorm.DB
}
func contains(slice []string, item string) bool {
for _, s := range slice {
if s == item {
return true
}
}
return false
}
// 构造函数改为私有初始化方法
func NewCallbackTicketService() *CallbackTicketService {
return &CallbackTicketService{db: nil} // 先不初始化数据库连接
@@ -97,7 +109,7 @@ func (s *CallbackTicketService) SelectCallbackTicketByPage(pageNum int, pageSize
return tickets, int(total), nil
}
func (s *CallbackTicketService) InsertCallbackTicket(ticket CallbackTicket) error {
func (s *CallbackTicketService) InsertCallbackTicket(ticket *CallbackTicket) error {
// 判断主叫号码是否已存在未处理完的工单
var existingCount int64
if err := s.getDB().Table("mf_callback_ticket").
@@ -110,7 +122,7 @@ func (s *CallbackTicketService) InsertCallbackTicket(ticket CallbackTicket) erro
return fmt.Errorf("caller %s already has a pending ticket", ticket.CallerNumber)
}
// 这里可以使用ORM或其他方式将ticket插入到数据库中
if err := s.getDB().Table("mf_callback_ticket").Create(&ticket).Error; err != nil {
if err := s.getDB().Table("mf_callback_ticket").Create(ticket).Error; err != nil {
return fmt.Errorf("failed to insert callback ticket: %w", err)
}
return nil
@@ -151,6 +163,48 @@ func (s *CallbackTicketService) UpdateCallbackTicket(ticket CallbackTicket) erro
return nil
}
func (s *CallbackTicketService) UpdateCallbackTicketStatus(ticketId int64, status string, updatedBy string) error {
if status == "" {
return fmt.Errorf("status cannot be empty")
}
// 检查状态是否合法
validStatuses := []string{"IN_PROGRESS", "PENDING", "CLOSED"}
if !contains(validStatuses, status) {
return fmt.Errorf("invalid status: %s", status)
}
// 获取工单当前状态
var currentTicket CallbackTicket
if err := s.getDB().Table("mf_callback_ticket").
Where("ticket_id = ?", ticketId).
First(&currentTicket).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("callback ticket with ID %d not found", ticketId)
}
return fmt.Errorf("failed to find callback ticket: %w", err)
}
// 如果状态没有变化,则不更新
if currentTicket.Status == status || currentTicket.Status == "CLOSED" {
return nil
}
// 更新工单状态
now := time.Now().UnixMicro()
if err := s.getDB().Table("mf_callback_ticket").
Where("ticket_id = ?", ticketId).
Updates(map[string]interface{}{
"status": status,
"comment": fmt.Sprintf("工单状态从 %s 更新为 %s", currentTicket.Status, status),
"updated_at": &now,
"updated_by": updatedBy,
}).Error; err != nil {
return fmt.Errorf("failed to update callback ticket status: %w", err)
}
return nil
}
// DeleteCallbackTicket 删除回调工单
// @Description 删除回调工单
// @param ticketId 工单ID
@@ -174,7 +228,7 @@ func (s *CallbackTicketService) GetLastAssignedAgent() (string, error) {
var lastTicket CallbackTicket
if err := s.getDB().Table("mf_callback_ticket").
Where("agent_name <> ''").
Order("created_at DESC").
Order("created_at DESC, ticket_id DESC").
First(&lastTicket).Error; err != nil {
if err == gorm.ErrRecordNotFound {
// 没有记录属于正常情况,返回空字符串
@@ -366,7 +420,6 @@ func (s *CallbackTicketService) UpdateTicketToTimeout(ticket *CallbackTicket, or
AgentEmail: newAgent.Email,
AgentMobile: newAgent.Mobile,
Comment: fmt.Sprintf("由超时工单 %d 自动重建", ticket.TicketId),
MsdData: ticket.MsdData,
RmUid: ticket.RmUid,
CreatedAt: now,
UpdatedAt: nil,
@@ -377,14 +430,136 @@ func (s *CallbackTicketService) UpdateTicketToTimeout(ticket *CallbackTicket, or
// 新工单分配后发送邮件通知
if newAgent.Email != "" {
subject := "新工单自动重建通知"
body := fmt.Sprintf("您被分配了一个自动重建的回拨工单,主叫号码:%s", newTicket.CallerNumber)
go email.SendEmail(newAgent.Email, subject, body)
// 发送邮件通知
// 获取SMTP配置
emailConfig := config.GetSMTPConfig()
if emailConfig != nil && emailConfig.Enabled {
// 创建配置副本,避免修改全局配置
emailCopy := *emailConfig // 浅拷贝结构体
// 合并配置中的To地址和当前工单的座席邮箱
var recipients []string
// 添加配置中的原始收件人(如管理员、监控人员等)
if len(emailConfig.To) > 0 {
recipients = append(recipients, strings.Split(emailConfig.To, ",")...)
}
// 添加当前工单的座席邮箱
recipients = append(recipients, ticket.AgentEmail)
// 去重处理(避免重复邮箱)
emailCopy.To = strings.Join(email.RemoveDuplicateEmails(recipients), ",")
// 设置邮件主题和内容
emailCopy.Subject = "新工单自动重建通知"
emailCopy.Body = fmt.Sprintf("您被分配了一个自动重建的回拨工单ID: %d, 主叫号码:%s, 请及时处理。",
newTicket.TicketId, newTicket.CallerNumber)
go email.SendEmailWithGomail(emailCopy)
}
}
}
return nil
}
// BatchUpdateTimeoutTickets 批量处理超时工单
func (s *CallbackTicketService) BatchUpdateTimeoutTickets(tickets []CallbackTicket, originalStatus string, agents []AgentInfo) error {
if len(tickets) == 0 {
return nil
}
// 获取当前最后分配的座席
lastAssignedAgent, err := s.GetLastAssignedAgent()
if err != nil {
log.Errorf("获取最后分配座席失败: %v", err)
lastAssignedAgent = ""
}
now := time.Now().UnixMicro()
var successCount int
for i, ticket := range tickets {
// 1. 更新原工单为超时
updatedTicket := CallbackTicket{
TicketId: ticket.TicketId,
Status: TicketStatusTimeout.Enum(),
Comment: fmt.Sprintf("%s - 工单状态为 %s 处理超时,系统自动更新为超时状态", ticket.Comment, originalStatus),
UpdatedAt: &now,
}
if err := s.getDB().Table("mf_callback_ticket").
Where("ticket_id = ?", ticket.TicketId).
Updates(updatedTicket).Error; err != nil {
log.Errorf("更新工单 %d 状态失败: %v", ticket.TicketId, err)
continue
}
// 2. 选择下一个座席使用批处理中维护的lastAssignedAgent
newAgent := s.SelectNextAgent(agents, lastAssignedAgent)
if newAgent == nil {
log.Errorf("没有可用的座席分配给工单 %d", ticket.TicketId)
continue
}
// 3. 创建新工单
newTicket := CallbackTicket{
CallerNumber: ticket.CallerNumber,
CalleeNumber: ticket.CalleeNumber,
Status: TicketStatusNew.Enum(),
AgentName: newAgent.Name,
AgentEmail: newAgent.Email,
AgentMobile: newAgent.Mobile,
Comment: fmt.Sprintf("由超时工单 %d 自动重建", ticket.TicketId),
RmUid: ticket.RmUid,
CreatedAt: now + int64(i), // 确保每个工单的创建时间不同,
UpdatedAt: nil,
}
if err := s.getDB().Table("mf_callback_ticket").Create(&newTicket).Error; err != nil {
log.Errorf("创建新工单失败: %v", err)
continue
}
// 4. 更新最后分配的座席
lastAssignedAgent = newAgent.Name
// 5. 发送邮件通知
if newAgent.Email != "" {
// 发送邮件通知
// 获取SMTP配置
emailConfig := config.GetSMTPConfig()
if emailConfig != nil && emailConfig.Enabled {
// 创建配置副本,避免修改全局配置
emailCopy := *emailConfig // 浅拷贝结构体
// 合并配置中的To地址和当前工单的座席邮箱
var recipients []string
// 添加配置中的原始收件人(如管理员、监控人员等)
if len(emailConfig.To) > 0 {
recipients = append(recipients, strings.Split(emailConfig.To, ",")...)
}
// 添加当前工单的座席邮箱
recipients = append(recipients, ticket.AgentEmail)
// 去重处理(避免重复邮箱)
emailCopy.To = strings.Join(email.RemoveDuplicateEmails(recipients), ",")
// 设置邮件主题和内容
emailCopy.Subject = "新工单自动重建通知"
emailCopy.Body = fmt.Sprintf("您被分配了一个自动重建的回拨工单ID: %d, 主叫号码:%s, 请及时处理。",
newTicket.TicketId, newTicket.CallerNumber)
go email.SendEmailWithGomail(emailCopy)
}
}
successCount++
log.Infof("工单 %d 已重建为新工单 %d分配给座席 %s (第%d个处理)",
ticket.TicketId, newTicket.TicketId, newAgent.Name, i+1)
}
log.Infof("批量处理完成,成功处理 %d/%d 个超时工单", successCount, len(tickets))
return nil
}
// FindNearlyTimeoutTickets 查询即将超时的工单
func (s *CallbackTicketService) FindNearlyTimeoutTickets(status string, timeoutMicros int64, aheadMicros int64) ([]CallbackTicket, error) {
nowMicros := time.Now().UnixMicro()
@@ -401,15 +576,34 @@ func (s *CallbackTicketService) FindNearlyTimeoutTickets(status string, timeoutM
return tickets, nil
}
// 新增方法:席开始处理工单
func (s *CallbackTicketService) StartProcessingTicket(ticketId int64) error {
// 新增方法:席开始处理工单
// StartProcessingTicket 将工单状态更新为正在处理,并记录开始处理的时间和座席信息
// @Description 座席开始处理工单
// @param ticketId 工单ID
// @param updatedBy 更新人
// @return error 错误信息
// @example
// mfCallbackTicketService.StartProcessingTicket(12345, "agent1")
// @note 该方法会将工单状态从 NEW 更新为 IN_PROGRESS并记录处理开始时间和座席信息
// @note 如果工单状态不是 NEW则返回错误
// @note 该方法通常在座席开始处理工单时调用
// @note 该方法会更新工单的 updated_at 和 updated_by 字段
// @note 如果更新失败,则返回错误信息
// @note 该方法会记录处理开始的时间戳,单位为微秒
// @note 如果工单不存在或状态不正确,则返回错误信息
// @note 该方法会在更新成功后返回 nil表示操作成功
// @note 该方法适用于座席开始处理工单的场景
// @note 该方法会在更新成功后返回 nil表示操作成功
// @note 该方法会在更新失败时返回错误信息,便于调用方处理异常情况
func (s *CallbackTicketService) StartProcessingTicket(ticketId int64, updatedBy string) error {
now := time.Now().UnixMicro()
if err := s.getDB().Table("mf_callback_ticket").
Where("ticket_id = ? AND status = ?", ticketId, TicketStatusNew.Enum()).
Updates(map[string]interface{}{
"status": TicketStatusInProgress.Enum(),
"comment": "座席开始处理工单",
"updated_at": now,
"comment": "坐席开始处理工单",
"updated_by": updatedBy,
}).Error; err != nil {
return fmt.Errorf("failed to update ticket to IN_PROGRESS: %w", err)
}

View File

@@ -18,6 +18,7 @@ import (
neDataModel "be.ems/src/modules/network_data/model"
neDataService "be.ems/src/modules/network_data/service"
neService "be.ems/src/modules/network_element/service"
"github.com/gin-gonic/gin"
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
)
@@ -830,3 +831,61 @@ func GetUEInfoFileExportNF(w http.ResponseWriter, r *http.Request) {
return
}
}
var (
// 走Gin
UriCBSStateG = "/api/ue/v1/:neType/:objectType"
// 走Mux
UriCBSState = config.DefaultUriPrefix + "/ueManagement/v1/elementType/{elementTypeValue}/objectType/cbsState"
CustomUriCBSState = config.UriPrefix + "/ueManagement/v1/elementType/{elementTypeValue}/objectType/cbsState"
)
// @Description CBSManagement CB消息
type CBSState struct {
NeName string `json:"neName"` // 网元名称
RmUID string `json:"rmUID"` // 网元唯一标识
EventData []struct {
EventName string `json:"eventName"` // 事件名称
MessageId int64 `json:"messageId"` // 消息ID
Detail string `json:"detail"` // 详情
} `json:"eventData"` // 事件数据
}
// PostCBSState 接收来自CBC的CBS状态信息
// @Summary Post CBS State
// @Description 接收来自CBC的CBS状态信息
func PostCBSState(c *gin.Context) {
PostCBSStateFromCBC(c.Writer, c.Request)
}
// PostCBSStateFromCBC 接收来自CBC的CBS状态信息
// @Summary Post CBS State from CBC
// @Description 接收来自CBC的CBS状态信息
// @Tags UE Management
// @Accept json
// @Produce json
func PostCBSStateFromCBC(w http.ResponseWriter, r *http.Request) {
log.Info("PostStateFromCBC processing... ")
var state CBSState
if err := ctx.ShouldBindJSON(r, &state); err != nil {
log.Error("Failed to Unmarshal CBSState:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
now := time.Now().UnixMicro()
for _, eventData := range state.EventData {
if err := dborm.DefaultDB().Table("cb_message").
Where("JSON_EXTRACT(message_json, '$.eventName') = ?", eventData.EventName).
Updates(map[string]any{
"detail": eventData.Detail,
"updated_at": now,
}).Error; err != nil {
services.ResponseInternalServerError500ProcessError(w, err)
return
}
}
services.ResponseStatusOK204NoContent(w)
}

View File

@@ -126,6 +126,11 @@ type YamlConfig struct {
Enabled bool `yaml:"enabled"`
File string `yaml:"file"`
} `yaml:"testConfig"`
PsapConfig struct {
Enabled bool `yaml:"enabled"`
File string `yaml:"file"`
} `yaml:"psapConfig"`
}
type RestParam struct {
@@ -253,6 +258,22 @@ func NewYamlConfig() YamlConfig {
}
}
// InitPsapConfig 初始化PSAP配置
func InitPsapConfig() error {
if !yamlConfig.PsapConfig.Enabled {
return nil
}
// 确保使用正确的配置文件路径
configFile := yamlConfig.PsapConfig.File
if configFile == "" {
configFile = "./etc/psap.yaml" // 默认路径
}
_, err := ReadPsapConfig(configFile)
return err
}
func ReadConfig(configFile string) {
YamlConfigInfo.FilePath = configFile
@@ -270,6 +291,11 @@ func ReadConfig(configFile string) {
}
yamlConfig = YamlConfigInfo.ConfigLines
// 初始化PSAP配置
if err := InitPsapConfig(); err != nil {
fmt.Printf("Failed to load PSAP config: %v\n", err)
}
ReadOriginalConfig(configFile)
}
@@ -300,6 +326,12 @@ func WriteOrignalConfig(configFile string, paramName string, paramData map[strin
for k, v := range paramData {
// find the first line nearby the paramName
for j := i + 1; j < len(lines); j++ {
// ignore comment lines
trimmedLine := strings.TrimSpace(lines[j])
if strings.HasPrefix(trimmedLine, "#") {
continue
}
if strings.Contains(lines[j], k+":") {
index := strings.Index(lines[j], k)
// Determine the type of v

285
lib/config/psap.go Normal file
View File

@@ -0,0 +1,285 @@
package config
import (
"bufio"
"fmt"
"os"
"reflect"
"strings"
"be.ems/lib/email"
"gopkg.in/yaml.v3"
)
// PsapConfig PSAP配置结构体
type PsapConfig struct {
Ticket struct {
TicketNotification email.EmailConfig `yaml:"ticketNotification" json:"ticketNotification"` // 注意:配置文件中是 "ticketNotification",保持一致
TicketTimeout TicketTimeout `yaml:"ticketTimeout" json:"ticketTimeout"` // 注意:配置文件中是 "ticketTimeout",保持一致{
} `yaml:"ticket" json:"ticket"` // PSAP工单相关配置
}
type TicketTimeout struct {
New int `yaml:"new" json:"new"` // NEW状态超时时间分钟
InProgress int `yaml:"inProgress" json:"inProgress"` // IN_PROGRESS状态超时时间分钟
NoAnswer1 int `yaml:"noAnswer1" json:"noAnswer1"` // NO_ANSWER_1状态超时时间分钟
NoAnswer2 int `yaml:"noAnswer2" json:"noAnswer2"` // NO_ANSWER_2状态超时时间分钟
NearlyTimeout int `yaml:"nearlyTimeout" json:"nearlyTimeout"` // 提前提醒时间(分钟)
}
var psapConfig *PsapConfig
var PsapYamlConfigInfo YamlConfigFile = YamlConfigFile{}
// ReadPsapConfig 读取PSAP配置文件
func ReadPsapConfig(configFile string) (*PsapConfig, error) {
PsapYamlConfigInfo.FilePath = configFile
yamlFile, err := os.ReadFile(configFile)
if err != nil {
return nil, fmt.Errorf("read psap config file error: %w", err)
}
var config PsapConfig
err = yaml.Unmarshal(yamlFile, &config)
if err != nil {
return nil, fmt.Errorf("unmarshal psap config error: %w", err)
}
psapConfig = &config
// PsapYamlConfigInfo.ConfigLines = config
// 读取原始文件行
err = ReadPsapOriginalConfig(configFile)
if err != nil {
return nil, fmt.Errorf("read psap original config error: %w", err)
}
return &config, nil
}
// ReadPsapOriginalConfig 读取PSAP原始配置文件行
func ReadPsapOriginalConfig(configFile string) error {
inputFile, err := os.Open(configFile)
if err != nil {
return fmt.Errorf("failed to open psap config file: %w", err)
}
defer inputFile.Close()
// 清空之前的内容
PsapYamlConfigInfo.OrignalLines = nil
scanner := bufio.NewScanner(inputFile)
for scanner.Scan() {
PsapYamlConfigInfo.OrignalLines = append(PsapYamlConfigInfo.OrignalLines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("failed to scan psap config file: %w", err)
}
return nil
}
// WritePsapOriginalConfig 写回PSAP原始配置文件
func WritePsapOriginalConfig(configFile string, paramName string, paramData map[string]any) error {
lines := PsapYamlConfigInfo.OrignalLines
for i, line := range lines {
if strings.Contains(line, paramName) {
for k, v := range paramData {
// 在paramName附近查找对应的字段
for j := i + 1; j < len(lines); j++ {
// 跳过注释行
trimmedLine := strings.TrimSpace(lines[j])
if strings.HasPrefix(trimmedLine, "#") {
continue
}
if strings.Contains(lines[j], k+":") {
index := strings.Index(lines[j], k)
// 根据v的类型确定格式
switch v := v.(type) {
case string:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: \"%s\"", k, v)
case bool:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: %t", k, v)
default:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: %v", k, v)
}
break
}
}
}
break
}
}
// 写回yaml文件
outputFile, err := os.Create(configFile)
if err != nil {
return fmt.Errorf("failed to create psap config file: %w", err)
}
defer outputFile.Close()
writer := bufio.NewWriter(outputFile)
for _, line := range PsapYamlConfigInfo.OrignalLines {
writer.WriteString(line + "\n")
}
return writer.Flush()
}
// UpdatePsapStructFromMap 更新PSAP结构体字段
func UpdatePsapStructFromMap(s any, updates map[string]any) {
v := reflect.ValueOf(s).Elem()
t := v.Type()
for key, value := range updates {
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
if field.Tag.Get("json") == key {
structField := v.FieldByName(field.Name)
if structField.IsValid() && structField.CanSet() {
// 转换值为适当的类型
convertedValue := reflect.ValueOf(value).Convert(structField.Type())
if structField.Type() == convertedValue.Type() {
structField.Set(convertedValue)
}
}
break
}
}
}
}
// GetPsapConfig 获取PSAP配置
func GetPsapConfig() *PsapConfig {
if psapConfig == nil {
// 如果配置未加载,尝试从默认位置加载
config, err := ReadPsapConfig("./etc/psap.yaml")
if err != nil {
fmt.Printf("Failed to load PSAP config: %v\n", err)
return nil
}
psapConfig = config
}
return psapConfig
}
// GetSMTPConfig 获取SMTP配置
func GetSMTPConfig() *email.EmailConfig {
config := GetPsapConfig()
if config == nil {
return nil
}
return &config.Ticket.TicketNotification
}
// GetTimeoutConfig 获取超时配置
func GetTimeoutConfig() *TicketTimeout {
config := GetPsapConfig()
if config == nil {
return nil
}
return &config.Ticket.TicketTimeout
}
// 以下是具体的配置获取方法
// GetNewTicketTimeoutMicros 获取NEW状态超时时间微秒
func GetNewTicketTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 60 * 60 * 1000000 // 默认60分钟
}
return int64(config.New) * 60 * 1000000 // 分钟转微秒
}
// GetInProgressTicketTimeoutMicros 获取IN_PROGRESS状态超时时间微秒
func GetInProgressTicketTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 60 * 60 * 1000000 // 默认60分钟
}
return int64(config.InProgress) * 60 * 1000000
}
// GetNoAnswer1TicketTimeoutMicros 获取NO_ANSWER_1状态超时时间微秒
func GetNoAnswer1TicketTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 4 * 60 * 60 * 1000000 // 默认4小时
}
return int64(config.NoAnswer1) * 60 * 1000000
}
// GetNoAnswer2TicketTimeoutMicros 获取NO_ANSWER_2状态超时时间微秒
func GetNoAnswer2TicketTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 8 * 60 * 60 * 1000000 // 默认8小时
}
return int64(config.NoAnswer2) * 60 * 1000000
}
// GetNearlyTimeoutMicros 获取提前提醒时间(微秒)
func GetNearlyTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 20 * 60 * 1000000 // 默认20分钟
}
return int64(config.NearlyTimeout) * 60 * 1000000
}
// IsSMTPEnabled 检查SMTP是否启用
func IsSMTPEnabled() bool {
config := GetSMTPConfig()
if config == nil {
return false
}
return config.Enabled
}
// GetSMTPHost 获取SMTP主机
func GetSMTPHost() string {
config := GetSMTPConfig()
if config == nil {
return ""
}
return config.Host
}
// GetSMTPPort 获取SMTP端口
func GetSMTPPort() int {
config := GetSMTPConfig()
if config == nil {
return 25
}
return config.Port
}
// GetSMTPUser 获取SMTP用户名
func GetSMTPUsername() string {
config := GetSMTPConfig()
if config == nil {
return ""
}
return config.Username
}
// GetSMTPPassword 获取SMTP密码
func GetSMTPPassword() string {
config := GetSMTPConfig()
if config == nil {
return ""
}
return config.Password
}
// GetSMTPFrom 获取SMTP发件人
func GetSMTPFrom() string {
config := GetSMTPConfig()
if config == nil {
return ""
}
return config.From
}

View File

@@ -1,19 +1,83 @@
package email
import "net/smtp"
import (
"crypto/tls"
"fmt"
"net/smtp"
"strconv"
"strings"
"gopkg.in/gomail.v2"
)
type EmailConfig struct {
Enabled bool `yaml:"enabled" json:"enabled"` // 是否启用邮件发送
Host string `yaml:"host" json:"host"` // SMTP服务器地址
Port int `yaml:"port" json:"port"` // SMTP服务器端口
Username string `yaml:"username" json:"username"` // SMTP用户名
Password string `yaml:"password" json:"password"` // SMTP密码
TLSSkipVerify bool `yaml:"tlsSkipVerify" json:"tlsSkipVerify"` // 是否跳过TLS证书验证
From string `yaml:"from" json:"from"` // 发件人邮箱地址
To string `yaml:"to" json:"to"` // 收件人邮箱地址列表
Subject string `yaml:"subject" json:"subject"` // 邮件主题
Body string `yaml:"body" json:"body"` // 邮件正文内容
}
// 简单邮件发送函数
func SendEmail(to, subject, body string) error {
from := "your@email.com"
password := "your_password"
smtpHost := "smtp.yourserver.com"
smtpPort := "587"
// 该函数使用标准库的 smtp 包发送邮件
// 注意:此函数不支持 TLS 加密,建议使用 gomail 包发送邮件以支持 TLS 和其他高级功能
// gomail 包的使用示例见 SendEmailWithGomail 函数
func SendEmail(email EmailConfig) error {
username := email.Username
from := email.From
password := email.Password
to := email.To
subject := email.Subject
body := email.Body
smtpHost := email.Host
smtpPort := email.Port
msg := "From: " + from + "\n" +
"To: " + to + "\n" +
"Subject: " + subject + "\n\n" +
body
auth := smtp.PlainAuth("", from, password, smtpHost)
return smtp.SendMail(smtpHost+":"+smtpPort, auth, from, []string{to}, []byte(msg))
auth := smtp.PlainAuth(from, username, password, smtpHost)
return smtp.SendMail(smtpHost+":"+strconv.Itoa(smtpPort), auth, from, []string{to}, []byte(msg))
}
func SendEmailWithGomail(email EmailConfig) error {
m := gomail.NewMessage()
m.SetHeader("From", email.From)
m.SetHeader("To", strings.Split(email.To, ",")...) // 支持多个收件人
m.SetHeader("Subject", email.Subject)
m.SetBody("text/plain", email.Body)
d := gomail.NewDialer(email.Host, email.Port, email.Username, email.Password)
// 配置 TLS
d.TLSConfig = &tls.Config{
InsecureSkipVerify: email.TLSSkipVerify,
}
// gomail 会自动处理 STARTTLS
if err := d.DialAndSend(m); err != nil {
fmt.Printf("Failed to DialAndSend:%v", err)
return err
}
return nil
}
// RemoveDuplicateEmails 去除重复的邮箱地址
func RemoveDuplicateEmails(emails []string) []string {
emailMap := make(map[string]struct{})
var uniqueEmails []string
for _, email := range emails {
if _, exists := emailMap[email]; !exists {
emailMap[email] = struct{}{}
uniqueEmails = append(uniqueEmails, email)
}
}
return uniqueEmails
}

View File

@@ -293,6 +293,9 @@ func init() {
Register("POST", lm.ExtBackupDataUri, lm.ExtDatabaseBackupData, nil)
Register("POST", lm.CustomExtBackupDataUri, lm.ExtDatabaseBackupData, nil)
// CBS management
Register("POST", ue.UriCBSState, ue.PostCBSStateFromCBC, nil)
Register("POST", ue.CustomUriCBSState, ue.PostCBSStateFromCBC, nil)
}
// To resolv rest POST/PUT/DELETE/PATCH cross domain

15
lib/time/time.go Normal file
View File

@@ -0,0 +1,15 @@
package time
import "time"
// 假设 query.StartTime 和 query.EndTime 是 "2006-01-02 15:04:05" 格式字符串
func ParseTimeToMicro(ts string) (int64, error) {
if ts == "" {
return 0, nil
}
t, err := time.ParseInLocation("2006-01-02 15:04:05", ts, time.Local)
if err != nil {
return 0, err
}
return t.UnixMicro(), nil
}

View File

@@ -3,7 +3,7 @@
ProjectL = omc
ProjectU = OMC
PROJECT = $(ProjectL)
VERSION = 1.2506.2
VERSION = 1.2508.1
RelDate = `date +%Y%m%d`
Release = $(RelDate)
RelVer = $(VERSION)-$(RelDate)

View File

@@ -6,7 +6,6 @@ HOST="127.0.0.1"
PORT="33066"
DBNAME="psap_db"
UpgradeSQLDir=/usr/local/omc/etc/db/upgrade
Upgvue3SQLDir=/usr/local/omc/etc/db/upgvue3
InstallSQLDir=/usr/local/omc/etc/db/install
drop_db_sql="drop database IF EXISTS ${DBNAME}"
@@ -24,17 +23,6 @@ case "$1" in
done
;;
upgvue3)
echo "Upgrade to vue3 database ${DBNAME}"
for SQL in ${Upgvue3SQLDir}/*.sql; do
echo -n "Execute SQL script: ${SQL} ..."
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} < ${SQL};
if [ $? = 0 ]; then
echo "done"
fi
done
;;
install)
echo "Drop database ${DBNAME} ...!!!"
mysql -u${USER} -p${PASSWORD} -P $PORT -h ${HOST} --protocol tcp -e "${drop_db_sql}"
@@ -52,7 +40,7 @@ case "$1" in
*)
while true
do
read -r -p "Do you upgrade or upgrade from layui to vue3 or fresh install database ${DBNAME}? [Upgrade/upgVue3/Install/Quit] " input
read -r -p "Do you upgrade or fresh install database ${DBNAME}? [Upgrade/Install/Quit] " input
case $input in
[uU][pP][gG][rR][aA][dD][eE]|[uU])
@@ -70,21 +58,6 @@ case "$1" in
break
;;
[uU][pP][gG][vV][uU][eE][3]|[vV]])
echo "Skip to drop database ${DBNAME}"
echo "Upgrade to vue3 database ${DBNAME}"
for SQL in ${Upgvue3SQLDir}/*.sql; do
echo -n "Execute SQL script: ${SQL} ..."
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} < ${SQL};
if [ $? = 0 ]; then
echo "done"
fi
done
break
;;
[iI][nN][sS][tT][aA][lL][lL]|[iI])
echo "Drop database ${DBNAME} ...!!!"

View File

@@ -79,7 +79,7 @@ case "${M_ARG}" in
fi
fi
;;
upgrade | upgvue3)
upgrade)
${OMCBinDir}/importdb.sh ${M_ARG}
;;
skip)

View File

@@ -2,7 +2,7 @@
ProcList="restagent sshsvc"
ProjectL=omc
VERSION=1.2506.2
VERSION=1.2508.1
RelDate=`date +%Y%m%d`
Release=${RelDate}
RelVer=${VERSION}-${RelDate}

View File

@@ -1,25 +1,22 @@
ticket:
notifcation:
enabled: true
type: [smtp, sms]
smtp:
host: mail.smtp.com
port: 25
user: smtpext@smtp.com
password: "1000smtp@omc!"
tlsSkipVerify: true
from: restagent@localhost
to: support@localhost
subject: "Ticket Notification"
body: "A new ticket has been created with ID: {{.ID}} and Subject: {{.Subject}}"
sms:
ticketNotification:
enabled: false
provider: twilio
account: "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
token: "your_auth_token"
from: "+1234567890"
to: "+0987654321"
timeout:
create: 60
update: 60
close: 60
host: mail.agrandtech.com
port: 25
username: smtpext@agrandtech.com
# 注意:密码中如果包含特殊字符(如@、#、$等),
# 需要使用双引号括起来,避免解析错误
# 例如password: "123456"
password: Smtp123@agt
tlsSkipVerify: true
from: omc@psap
to: ""
ticketTimeout: # 超时设置
# 这些时间单位是分钟
# 注意:这些时间是相对于工单创建时间的
# 例如new: 60分钟inProgress: 60分钟
new: 60
inProgress: 60
noAnswer1: 240
noAnswer2: 480
nearlyTimeout: 20

View File

@@ -203,3 +203,8 @@ staticFile:
upload:
prefix: "/upload"
dir: "./upload"
# PSAP RESTCONF配置
psapConfig:
enabled: true
file: ./etc/psap.yaml

View File

@@ -1,7 +1,7 @@
# Makefile for rest agent project
PROJECT = OMC
VERSION = 1.2506.2
VERSION = 1.2508.1
PLATFORM = amd64
ARMPLATFORM = aarch64
BUILDDIR = ../../build

View File

@@ -25,6 +25,7 @@ var URL_WHITE_LIST = []string{
"/objectType/nbState",
"/upload-ue",
"/oauth/token",
"/cbsState",
}
// PreAuthorize 用户身份授权认证校验

View File

@@ -13,5 +13,6 @@ type RouterMeta struct {
// 在菜单中隐藏子节点
HideChildInMenu bool `json:"hideChildInMenu"`
// 在菜单中隐藏自己和子节点
HideInMenu bool `json:"hideInMenu"`
HideInMenu bool `json:"hideInMenu"`
NeType []string `json:"neType,omitempty"` // 网元类型,默认全部,有指定类型的,需要添加网元才会显示
}

View File

@@ -7,6 +7,7 @@ import (
"strings"
ueCallBackTicket "be.ems/features/ue/mf_callback_ticket"
"be.ems/lib/config"
"be.ems/lib/email"
"be.ems/lib/log"
"be.ems/src/framework/cron"
@@ -35,40 +36,40 @@ func (s *PsapTicketMonitor) Execute(data any) (any, error) {
"count": s.count,
}
// 处理超时的NEW状态工单 (60分钟)
// 处理超时的NEW状态工单
newTicketsUpdated, err := s.handleTimeoutTickets(
ueCallBackTicket.TicketStatusNew.Enum(),
1*60*1000000, // 1分钟(微秒)
config.GetNewTicketTimeoutMicros(),
)
if err != nil {
log.Errorf("处理NEW状态超时工单失败: %v", err)
}
result["newTicketsUpdated"] = newTicketsUpdated
// 处理超时的IN_PROGRESS状态工单 (60分钟)
// 处理超时的IN_PROGRESS状态工单
inProgressTicketsUpdated, err := s.handleTimeoutTickets(
ueCallBackTicket.TicketStatusInProgress.Enum(),
60*60*1000000, // 60分钟(微秒)
config.GetInProgressTicketTimeoutMicros(),
)
if err != nil {
log.Errorf("处理IN_PROGRESS状态超时工单失败: %v", err)
}
result["inProgressTicketsUpdated"] = inProgressTicketsUpdated
// 处理超时的NO_ANSWER_1状态工单 (4小时)
// 处理超时的NO_ANSWER_1状态工单
noAnswer1TicketsUpdated, err := s.handleTimeoutTickets(
ueCallBackTicket.TicketStatusNoAnswer1.Enum(),
4*60*60*1000000, // 4小时(微秒)
config.GetNoAnswer1TicketTimeoutMicros(),
)
if err != nil {
log.Errorf("处理NO_ANSWER_1状态超时工单失败: %v", err)
}
result["noAnswer1TicketsUpdated"] = noAnswer1TicketsUpdated
// 处理超时的NO_ANSWER_2状态工单 (8小时)
// 处理超时的NO_ANSWER_2状态工单
noAnswer2TicketsUpdated, err := s.handleTimeoutTickets(
ueCallBackTicket.TicketStatusNoAnswer2.Enum(),
8*60*60*1000000, // 8小时(微秒)
config.GetNoAnswer2TicketTimeoutMicros(),
)
if err != nil {
log.Errorf("处理NO_ANSWER_2状态超时工单失败: %v", err)
@@ -82,44 +83,44 @@ func (s *PsapTicketMonitor) Execute(data any) (any, error) {
log.Infof("工单监控任务完成,共处理 %d 个超时工单", totalUpdated)
// 处理超时的NEW状态工单 (60分钟)
// 处理超时的NEW状态工单
newTicketsNearlyTimeout, err := s.handleNearlyTimeoutTickets(
ueCallBackTicket.TicketStatusNew.Enum(),
60*60*1000000, // 60分钟(微秒)
10*60*1000000, // 提前10分钟提醒(微秒)
config.GetNewTicketTimeoutMicros(),
config.GetNearlyTimeoutMicros(),
)
if err != nil {
log.Errorf("处理NEW状态超时工单失败: %v", err)
}
result["newTicketsNearlyTimeout"] = newTicketsNearlyTimeout
// 处理超时的IN_PROGRESS状态工单 (60分钟)
// 处理超时的IN_PROGRESS状态工单
inProgressTicketsNearlyTimeout, err := s.handleNearlyTimeoutTickets(
ueCallBackTicket.TicketStatusInProgress.Enum(),
60*60*1000000, // 60分钟(微秒)
10*60*1000000, // 提前10分钟提醒(微秒)
config.GetInProgressTicketTimeoutMicros(),
config.GetNearlyTimeoutMicros(),
)
if err != nil {
log.Errorf("处理IN_PROGRESS状态超时工单失败: %v", err)
}
result["inProgressTicketsNearlyTimeout"] = inProgressTicketsNearlyTimeout
// 处理超时的NO_ANSWER_1状态工单 (4小时)
// 处理超时的NO_ANSWER_1状态工单
noAnswer1TicketsNearlyTimeout, err := s.handleNearlyTimeoutTickets(
ueCallBackTicket.TicketStatusNoAnswer1.Enum(),
4*60*60*1000000, // 4小时(微秒)
10*60*1000000, // 提前10分钟提醒(微秒)
config.GetNoAnswer1TicketTimeoutMicros(),
config.GetNearlyTimeoutMicros(),
)
if err != nil {
log.Errorf("处理NO_ANSWER_1状态超时工单失败: %v", err)
}
result["noAnswer1TicketsNearlyTimeout"] = noAnswer1TicketsNearlyTimeout
// 处理超时的NO_ANSWER_2状态工单 (8小时)
// 处理超时的NO_ANSWER_2状态工单
noAnswer2TicketsNearlyTimeout, err := s.handleNearlyTimeoutTickets(
ueCallBackTicket.TicketStatusNoAnswer2.Enum(),
8*60*60*1000000, // 8小时(微秒)
10*60*1000000, // 提前10分钟提醒(微秒)
config.GetNoAnswer2TicketTimeoutMicros(),
config.GetNearlyTimeoutMicros(),
)
if err != nil {
log.Errorf("处理NO_ANSWER_2状态即将超时工单失败: %v", err)
@@ -149,43 +150,37 @@ func (s *PsapTicketMonitor) handleTimeoutTickets(status string, timeoutMicros in
return 0, nil // 没有超时工单
}
// 更新超时工单状态
var updatedCount int
for _, ticket := range tickets {
// 获取网元信息
neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(ticket.RmUid)
// 构造网元MF的API地址
url := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/agents",
neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType))
// 发送HTTP请求获取座席列表
resp, err := http.Get(url)
if err != nil {
log.Error("Failed to get MF agents", err)
continue
}
defer resp.Body.Close()
// 获取网元信息
neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(tickets[0].RmUid)
// 构造网元MF的API地址
url := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/agents",
neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType))
// 发送HTTP请求获取座席列表
resp, err := http.Get(url)
if err != nil {
log.Error("Failed to get MF agents", err)
return 0, err
}
defer resp.Body.Close()
// 解析座席列表响应
var agentResp struct {
Code int `json:"code"`
Data []ueCallBackTicket.AgentInfo `json:"data"`
Msg string `json:"msg"`
}
if err := json.NewDecoder(resp.Body).Decode(&agentResp); err != nil {
log.Error("Failed to decode MF agents response", err)
continue
}
if err := s.callbackTicketService.UpdateTicketToTimeout(&ticket, status, agentResp.Data); err != nil {
log.Errorf("更新工单 %d 状态失败: %v", ticket.TicketId, err)
continue
}
updatedCount++
log.Infof("工单 %d 已更新为超时状态 (原状态: %s)", ticket.TicketId, status)
// 解析座席列表响应
var agentResp struct {
Code int `json:"code"`
Data []ueCallBackTicket.AgentInfo `json:"data"`
Msg string `json:"msg"`
}
return updatedCount, nil
if err := json.NewDecoder(resp.Body).Decode(&agentResp); err != nil {
log.Error("Failed to decode MF agents response", err)
return 0, err
}
if err := s.callbackTicketService.BatchUpdateTimeoutTickets(tickets, status, agentResp.Data); err != nil {
log.Errorf("Faild to batch update tickets: %v", err)
return 0, err
}
return len(tickets), nil
}
// handleTimeoutTickets 处理指定状态的超时工单
@@ -204,10 +199,33 @@ func (s *PsapTicketMonitor) handleNearlyTimeoutTickets(status string, timeoutMic
var updatedCount int
for _, ticket := range tickets {
if ticket.AgentEmail != "" {
subject := "工单即将超时提醒"
body := fmt.Sprintf("您负责的回拨工单(主叫号码:%s即将超时请及时处理。", ticket.CallerNumber)
go email.SendEmail(ticket.AgentEmail, subject, body)
emailConfig := config.GetSMTPConfig()
if emailConfig != nil && emailConfig.Enabled {
// 创建配置副本,避免修改全局配置
emailCopy := *emailConfig // 浅拷贝结构体
// 合并配置中的To地址和当前工单的座席邮箱
var recipients []string
// 添加配置中的原始收件人(如管理员、监控人员等)
if len(emailConfig.To) > 0 {
recipients = append(recipients, strings.Split(emailConfig.To, ",")...)
}
// 添加当前工单的座席邮箱
recipients = append(recipients, ticket.AgentEmail)
// 去重处理(避免重复邮箱)
emailCopy.To = strings.Join(email.RemoveDuplicateEmails(recipients), ",")
// 设置邮件主题和内容
emailCopy.Subject = "工单即将超时提醒"
emailCopy.Body = fmt.Sprintf("您负责的回拨工单(编号:%d, 主叫号码:%s即将在(%d分钟)超时,请及时处理。",
ticket.TicketId, ticket.CallerNumber, aheadMicros/1000/1000/60)
go email.SendEmailWithGomail(emailCopy)
}
}
updatedCount++
}
return updatedCount, nil

View File

@@ -145,8 +145,17 @@ func (r CDREventMF) ExportXlsx(rows []model.CDREventMF, fileName, language strin
}
// MSD-最小数据集
msd := ""
if v, ok := cdrJSON["msd"]; ok && v != nil {
msd = v.(string)
if v, ok := cdrJSON["msdData"]; ok && v != nil && v != "" {
switch vv := v.(type) {
case string:
msd = vv
case json.RawMessage:
msd = string(vv)
case map[string]interface{}:
// 如果是对象序列化为json
b, _ := json.Marshal(vv)
msd = string(b)
}
}
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,

View File

@@ -283,6 +283,12 @@ func (r *SysMenuImpl) 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

@@ -209,7 +209,7 @@ func Setup(router *gin.Engine) {
controller.NewSysMenu.Remove,
)
sysMenuGroup.GET("/treeSelect",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:menu:list", "system:dept:list"}}),
middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:menu:list", "system:dept:list"}, "hasRoles": {"admin"}}),
controller.NewSysMenu.TreeSelect,
)
sysMenuGroup.GET("/roleMenuTreeSelect/:roleId",

View File

@@ -1,7 +1,7 @@
# Makefile for OMC-OMC-crontask project
PROJECT = OMC
VERSION = 1.2506.2
VERSION = 1.2508.1
LIBDIR = be.ems/lib
BINNAME = sshsvc