Compare commits
37 Commits
24ed4e874a
...
psap
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45a0ab1707 | ||
|
|
4dfea691d1 | ||
|
|
758fa02f7f | ||
|
|
4da891c883 | ||
|
|
5beae56881 | ||
|
|
cfe01734f0 | ||
|
|
88c92eebf2 | ||
|
|
6c8c17c4f4 | ||
|
|
3e345e9e11 | ||
|
|
a3950e5dc0 | ||
|
|
f57c528c82 | ||
|
|
74003786a9 | ||
|
|
990070df2c | ||
|
|
28a09d7b5b | ||
|
|
33b937c83d | ||
|
|
81177be0ca | ||
|
|
f43adfdf6f | ||
|
|
f969fbbb38 | ||
|
|
53283b0669 | ||
|
|
6e9765ceaa | ||
|
|
130f0a5ac7 | ||
|
|
546f7ac5f0 | ||
|
|
7d0eafc304 | ||
|
|
acc8ce32e8 | ||
|
|
6cc47389c0 | ||
|
|
2ff5cd42a7 | ||
|
|
a2286e1ee2 | ||
|
|
a7a4efdcb2 | ||
|
|
8d76d68b96 | ||
|
|
39ae16cf42 | ||
|
|
2a8690b247 | ||
|
|
fdb3b420f2 | ||
|
|
1bf8e1aff8 | ||
|
|
6865eceebe | ||
|
|
58bcc8f5be | ||
|
|
574c39f748 | ||
|
|
758276ecfc |
22
config/etc/default/psap.yaml
Normal file
22
config/etc/default/psap.yaml
Normal 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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
38
database/install/cb_message.sql
Executable 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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
54
database/upgrade/upg_mf_callback_ticket.sql
Executable file
54
database/upgrade/upg_mf_callback_ticket.sql
Executable 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;
|
||||
51
database/upgrade/upg_ne_config.sql
Executable file
51
database/upgrade/upg_ne_config.sql
Executable 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;
|
||||
34
database/upgrade/upg_ne_host.sql
Normal file
34
database/upgrade/upg_ne_host.sql
Normal 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;
|
||||
@@ -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;
|
||||
|
||||
17
database/upgrade/upg_sys_dict_data0.sql
Normal file
17
database/upgrade/upg_sys_dict_data0.sql
Normal 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;
|
||||
29
database/upgrade/upg_sys_dict_data1_zh.sql
Normal file
29
database/upgrade/upg_sys_dict_data1_zh.sql
Normal 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;
|
||||
29
database/upgrade/upg_sys_dict_data2_en.sql
Normal file
29
database/upgrade/upg_sys_dict_data2_en.sql
Normal 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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
286
features/ue/cb_message/controller.go
Normal file
286
features/ue/cb_message/controller.go
Normal 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,
|
||||
}))
|
||||
}
|
||||
112
features/ue/cb_message/model.go
Normal file
112
features/ue/cb_message/model.go
Normal 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
|
||||
}
|
||||
541
features/ue/cb_message/service.go
Normal file
541
features/ue/cb_message/service.go
Normal 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)
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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(¤tTicket).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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
285
lib/config/psap.go
Normal 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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
15
lib/time/time.go
Normal 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
|
||||
}
|
||||
2
makefile
2
makefile
@@ -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)
|
||||
|
||||
@@ -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} ...!!!"
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ case "${M_ARG}" in
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
upgrade | upgvue3)
|
||||
upgrade)
|
||||
${OMCBinDir}/importdb.sh ${M_ARG}
|
||||
;;
|
||||
skip)
|
||||
|
||||
2
mkpkg.sh
2
mkpkg.sh
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -203,3 +203,8 @@ staticFile:
|
||||
upload:
|
||||
prefix: "/upload"
|
||||
dir: "./upload"
|
||||
|
||||
# PSAP RESTCONF配置
|
||||
psapConfig:
|
||||
enabled: true
|
||||
file: ./etc/psap.yaml
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -25,6 +25,7 @@ var URL_WHITE_LIST = []string{
|
||||
"/objectType/nbState",
|
||||
"/upload-ue",
|
||||
"/oauth/token",
|
||||
"/cbsState",
|
||||
}
|
||||
|
||||
// PreAuthorize 用户身份授权认证校验
|
||||
|
||||
@@ -13,5 +13,6 @@ type RouterMeta struct {
|
||||
// 在菜单中隐藏子节点
|
||||
HideChildInMenu bool `json:"hideChildInMenu"`
|
||||
// 在菜单中隐藏自己和子节点
|
||||
HideInMenu bool `json:"hideInMenu"`
|
||||
HideInMenu bool `json:"hideInMenu"`
|
||||
NeType []string `json:"neType,omitempty"` // 网元类型,默认全部,有指定类型的,需要添加网元才会显示
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user