From fc368fb7f97cebd5808fc89dc65be1211c105ad1 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 12 May 2025 19:06:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E5=AD=97=E6=AE=B5=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=B7=9F=E8=B8=AA=E4=BB=BB=E5=8A=A1=E7=9A=84=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=92=8C=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/trace_task.sql | 2 +- database/upgrade/upg_trace_task.sql | 18 +------- src/modules/trace/model/trace_task.go | 1 + src/modules/trace/repository/trace_task.go | 17 +++++++ src/modules/trace/service/trace_task.go | 54 +++++++++++++++++----- 5 files changed, 64 insertions(+), 28 deletions(-) diff --git a/database/install/trace_task.sql b/database/install/trace_task.sql index ea5ca574..17f05400 100644 --- a/database/install/trace_task.sql +++ b/database/install/trace_task.sql @@ -16,10 +16,10 @@ CREATE TABLE `trace_task` ( `dst_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '目标地址IP', `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '任务标题', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '备注', `ne_list` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元列表 neType_neId 例如 UDM_001,AMF_001', `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信息数据通知回调地址UDP 例如udp:192.168.5.58:33033', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='跟踪_任务'; - -- Dump completed on 2025-04-14 14:26:59 diff --git a/database/upgrade/upg_trace_task.sql b/database/upgrade/upg_trace_task.sql index 7984c88d..b18bd020 100644 --- a/database/upgrade/upg_trace_task.sql +++ b/database/upgrade/upg_trace_task.sql @@ -15,31 +15,17 @@ CREATE TABLE IF NOT EXISTS `trace_task` ( `dst_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '目标地址IP', `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '任务标题', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '备注', `ne_list` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元列表 neType_neId 例如 UDM_001,AMF_001', `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信息数据通知回调地址UDP 例如udp:192.168.5.58:33033', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='跟踪_任务'; - -- Dump completed on 2025-04-14 14:26:59 ALTER TABLE `trace_task` COMMENT = '跟踪_任务'; ALTER TABLE `trace_task` ADD COLUMN IF NOT EXISTS `ne_list` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元列表 neType_neId 例如 UDM_001,AMF_001' AFTER `remark`; -ALTER TABLE `trace_task` MODIFY COLUMN `id` int NOT NULL COMMENT 'ID' FIRST; -ALTER TABLE `trace_task` MODIFY COLUMN `trace_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务编号' AFTER `id`; -ALTER TABLE `trace_task` MODIFY COLUMN `trace_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '1-Interface,2-Device,3-UE' AFTER `trace_id`; -ALTER TABLE `trace_task` MODIFY COLUMN `start_time` bigint NULL DEFAULT 0 COMMENT '开始时间 毫秒' AFTER `trace_type`; -ALTER TABLE `trace_task` MODIFY COLUMN `end_time` bigint NULL DEFAULT 0 COMMENT '结束时间 毫秒' AFTER `start_time`; -ALTER TABLE `trace_task` MODIFY COLUMN `interfaces` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '接口跟踪必须 例如 N8,N10' AFTER `end_time`; -ALTER TABLE `trace_task` MODIFY COLUMN `imsi` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户跟踪必须' AFTER `interfaces`; -ALTER TABLE `trace_task` MODIFY COLUMN `msisdn` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户跟踪可选' AFTER `imsi`; -ALTER TABLE `trace_task` MODIFY COLUMN `src_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '源地址IP' AFTER `msisdn`; -ALTER TABLE `trace_task` MODIFY COLUMN `dst_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '目标地址IP' AFTER `src_ip`; -ALTER TABLE `trace_task` MODIFY COLUMN `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者' AFTER `dst_ip`; -ALTER TABLE `trace_task` MODIFY COLUMN `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `create_by`; -ALTER TABLE `trace_task` MODIFY COLUMN `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '备注' AFTER `create_time`; -ALTER TABLE `trace_task` MODIFY COLUMN `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信息数据通知回调地址UDP 例如udp:192.168.5.58:33033' AFTER `ne_list`; -ALTER TABLE `trace_task` MODIFY COLUMN `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID'; +ALTER TABLE `trace_task` ADD COLUMN IF NOT EXISTS `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务标题' AFTER `create_time`; ALTER TABLE `trace_task` DROP COLUMN IF EXISTS `ue_ip`; ALTER TABLE `trace_task` DROP COLUMN IF EXISTS `signal_port`; ALTER TABLE `trace_task` DROP COLUMN IF EXISTS `update_by`; diff --git a/src/modules/trace/model/trace_task.go b/src/modules/trace/model/trace_task.go index 29f2ce20..4a2ff489 100644 --- a/src/modules/trace/model/trace_task.go +++ b/src/modules/trace/model/trace_task.go @@ -14,6 +14,7 @@ type TraceTask struct { DstIp string `json:"dstIp" gorm:"column:dst_ip"` // 目标地址IP CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + Title string `json:"title" gorm:"column:title" binding:"required"` // 任务标题 Remark string `json:"remark" gorm:"column:remark"` // 备注 NeList string `json:"neList" gorm:"column:ne_list" binding:"required"` // 网元列表 neType_neId 例如 UDM_001,AMF_001 NotifyUrl string `json:"notifyUrl" gorm:"column:notify_url"` // 信息数据通知回调地址UDP 例如udp:192.168.5.58:33033 diff --git a/src/modules/trace/repository/trace_task.go b/src/modules/trace/repository/trace_task.go index 2233420e..6a842431 100644 --- a/src/modules/trace/repository/trace_task.go +++ b/src/modules/trace/repository/trace_task.go @@ -29,6 +29,9 @@ func (r TraceTask) SelectByPage(query map[string]string) ([]model.TraceTask, int if v, ok := query["msisdn"]; ok && v != "" { tx = tx.Where("msisdn like ?", fmt.Sprintf("%s%%", v)) } + if v, ok := query["title"]; ok && v != "" { + tx = tx.Where("title like ?", fmt.Sprintf("%s%%", v)) + } if v, ok := query["startTime"]; ok && v != "" { if len(v) == 10 { v = fmt.Sprintf("%s000", v) @@ -112,6 +115,20 @@ func (r TraceTask) SelectByIds(ids []int64) []model.TraceTask { return rows } +// SelectByUnstopped 查询未停止的任务补发 +func (r TraceTask) SelectByUnstopped() []model.TraceTask { + rows := []model.TraceTask{} + tx := db.DB("").Model(&model.TraceTask{}) + // 构建查询条件 + tx = tx.Where("end_time > ?", time.Now().UnixMilli()) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + // Insert 新增信息 返回新增数据ID func (r TraceTask) Insert(param model.TraceTask) int64 { if param.CreateBy != "" { diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go index ac75ac12..e63b5588 100644 --- a/src/modules/trace/service/trace_task.go +++ b/src/modules/trace/service/trace_task.go @@ -177,6 +177,19 @@ func (r TraceTask) FindById(id int64) model.TraceTask { // Insert 新增信息 func (r TraceTask) Insert(task model.TraceTask) error { + if err := r.createTaskToNe(&task, false); err != nil { + return err + } + // 插入数据库 + insertId := r.traceTaskRepository.Insert(task) + if insertId <= 0 { + return fmt.Errorf("insert task error") + } + return nil +} + +// CreateTaskToNe 创建任务到网元 +func (r TraceTask) createTaskToNe(task *model.TraceTask, ignoreErr bool) error { // 跟踪配置是否开启 host, port, err := r.traceNotify() if err != nil { @@ -193,6 +206,7 @@ func (r TraceTask) Insert(task model.TraceTask) error { task.TraceId = fmt.Sprint(traceId) // 发送任务给网元 + errNe := []string{} for _, neTypeID := range neList { neTypeIDArr := strings.Split(neTypeID, "_") if len(neTypeIDArr) != 2 { @@ -204,18 +218,28 @@ func (r TraceTask) Insert(task model.TraceTask) error { logger.Warnf("ne type id is not exist") continue } - if err := r.createTaskToNe(neInfo, task); err != nil { - logger.Errorf("task to %s error: %s", neTypeID, err.Error()) - return fmt.Errorf("task to %s error: %s", neTypeID, err.Error()) + if err := r.traceNeTask(neInfo, *task); err != nil { + logger.Errorf("ne type id is %s to %s error: %s", task.TraceId, neTypeID, err.Error()) + errNe = append(errNe, neTypeID) + continue } } - - // 插入数据库 - insertId := r.traceTaskRepository.Insert(task) - if insertId <= 0 { - return fmt.Errorf("insert task error") + if len(errNe) <= 0 && !ignoreErr { + return nil } - return nil + // 移除任务 + for _, neTypeID := range neList { + neTypeIDArr := strings.Split(neTypeID, "_") + if len(neTypeIDArr) != 2 { + continue + } + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neTypeIDArr[0], neTypeIDArr[1]) + if neInfo.NeType != neTypeIDArr[0] || neInfo.IP == "" { + continue + } + neFetchlink.NeTraceDelete(neInfo, task.TraceId) + } + return fmt.Errorf("task to ne error: %s", strings.Join(errNe, ",")) } // traceNotify 网元通知地址 @@ -234,8 +258,8 @@ func (r TraceTask) traceNotify() (string, int64, error) { return host, port, nil } -// createTaskToNe 网元创建任务 -func (r TraceTask) createTaskToNe(neInfo neModel.NeInfo, task model.TraceTask) error { +// traceNeTask 网元创建任务 +func (r TraceTask) traceNeTask(neInfo neModel.NeInfo, task model.TraceTask) error { data := model.TraceReq{ TraceId: parse.Number(task.TraceId), NotifyUrl: task.NotifyUrl, @@ -305,3 +329,11 @@ func (r TraceTask) DeleteByIds(ids []int64) (int64, error) { // 删除信息失败! return 0, fmt.Errorf("delete fail") } + +// RunUnstopped 启动跟踪未停止的任务 +func (r TraceTask) RunUnstopped() { + tasks := r.traceTaskRepository.SelectByUnstopped() + for _, task := range tasks { + r.createTaskToNe(&task, true) + } +}