From 9b17a8dcbc1f94eb117a37b3b24ca9dae0d2d588 Mon Sep 17 00:00:00 2001
From: qixiaoning <jony.kee@outlook.com>
Date: 星期三, 29 十月 2025 09:40:54 +0800
Subject: [PATCH] 摄像机相关接口跳转,推送配置修改,系统权限菜单修改

---
 camera-common/models/task.go         |   26 ++
 camera-service/controllers/camera.go |   34 ++++
 system-service/service/appMenu.go    |   51 +++++--
 system-service/sys/sysinfo.go        |   39 ++++-
 version-control/main.go              |    2 
 camera-common/models/camera.go       |   35 +++++
 sysinfo-service/service/proc.go      |   63 ++++----
 camera-common/models/Record.go       |   26 ++-
 system-service/controllers/voice.go  |    2 
 system-service/service/SysService.go |   16 +-
 camera-service/models/db.go          |   10 +
 push-service/controllers/pushSet.go  |   59 +++++---
 12 files changed, 250 insertions(+), 113 deletions(-)

diff --git a/camera-common/models/Record.go b/camera-common/models/Record.go
index b950b7a..a72bfe1 100644
--- a/camera-common/models/Record.go
+++ b/camera-common/models/Record.go
@@ -503,15 +503,27 @@
 	lists := convertResultToMap(result)
 	layout := "2006-01-02 15:04:05.999999"
 
-	var temp1 time.Time
-	var temp2 time.Time
+	// var temp1 time.Time
+	// var temp2 time.Time
 
-	//鎺掑簭
+	// //鎺掑簭
+	// sort.Slice(lists, func(i, j int) bool {
+	// 	//return lists[i].DetectTime > lists[j].:DetectTime
+	// 	temp1, _ = time.Parse(layout, lists[i].DetectTime)
+	// 	temp2, _ = time.Parse(layout, lists[j].DetectTime)
+	// 	return temp1.After(temp2)
+	// })
+
 	sort.Slice(lists, func(i, j int) bool {
-		//return lists[i].DetectTime > lists[j].:DetectTime
-		temp1, _ = time.Parse(layout, lists[i].DetectTime)
-		temp2, _ = time.Parse(layout, lists[j].DetectTime)
-		return temp1.After(temp2)
+		t1, err1 := time.Parse(layout, lists[i].DetectTime)
+		t2, err2 := time.Parse(layout, lists[j].DetectTime)
+
+		// 閿欒澶勭悊锛氳В鏋愰敊璇殑鏃堕棿鎺掑湪鍚庨潰
+		if err1 != nil || err2 != nil {
+			return err1 == nil && err2 != nil
+		}
+
+		return t1.After(t2)
 	})
 
 	items := Paginate(lists, int(pageNum), int(pageSize))
diff --git a/camera-common/models/camera.go b/camera-common/models/camera.go
index 4161961..e7ff4b8 100644
--- a/camera-common/models/camera.go
+++ b/camera-common/models/camera.go
@@ -331,6 +331,41 @@
 	return result.RowsAffected > 0
 }
 
+func (camera *Camera) DelLink(id int64) (err error) {
+
+	//鍒犻櫎鍏宠仈妫�娴嬪唴瀹�
+	dbdel1 := db.Exec("delete from mal_task_check_link where task_id=?", id)
+	err = dbdel1.Error
+	if err != nil || dbdel1.RowsAffected == 0 {
+		return err
+	}
+	//鍒犻櫎鍏宠仈棰勮瑙勫垯
+	dbdel2 := db.Exec("delete from mal_task_rule_link where task_id=?", id)
+	err = dbdel2.Error
+	if err != nil || dbdel2.RowsAffected == 0 {
+		return err
+	}
+	//鍒犻櫎鍏宠仈鎽勫儚鏈轰换鍔�
+	dbdel3 := db.Exec("delete from mal_task_video_link where task_id=?", id)
+	err = dbdel3.Error
+	if err != nil || dbdel3.RowsAffected == 0 {
+		return err
+	}
+	//鍒犻櫎鍏宠仈宸ヤ綔鏃堕棿
+	dbdel4 := db.Exec("delete from mal_task_work_time_link where task_id=?", id)
+	err = dbdel4.Error
+	if err != nil || dbdel4.RowsAffected == 0 {
+		return err
+	}
+	//鍒犻櫎鍏宠仈鐭ヨ瘑搴�
+	dbdel5 := db.Exec("delete from mal_knowledge_link where task_id=?", id)
+	err = dbdel5.Error
+	if err != nil || dbdel5.RowsAffected == 0 {
+		return err
+	}
+	return
+}
+
 func (camera *Camera) Delete(cid string) (int64, error) {
 	var err error
 	tx := GetDB().Begin()
diff --git a/camera-common/models/task.go b/camera-common/models/task.go
index 5d8d915..1a75371 100644
--- a/camera-common/models/task.go
+++ b/camera-common/models/task.go
@@ -18,11 +18,25 @@
 	IsDelete int8   `json:"isDelete"`
 }
 
+type TaskIdM struct {
+	ID int64 `gorm:"column:task_id" json:"id"`
+}
+
 type TaskM struct {
 	TaskId          int64  `db:"task_id" json:"taskId"`
 	TaskName        string `db:"task_name" json:"taskName"`
 	TaskDescription string `db:"task_description" json:"taskDescription"`
 	EventName       string `db:"event_name" json:"eventName"`
+}
+
+// 璁粌妯″瀷鏍囩
+type TrainTags struct {
+	Id         int64  `gorm:"primaryKey;autoIncrement;column:id" json:"id"`
+	Createtime string `gorm:"type:varchar(50);column:create_time;default:''" json:"create_time"`
+}
+
+func (TrainTags) TableName() string {
+	return "mal_train_tags"
 }
 
 // 瑙嗛
@@ -67,11 +81,11 @@
 }
 
 // 鏍规嵁cid鏌ヨ瑙嗛
-func GetTaskTotal(cid string) (total int, err error) {
-	sql := "select count(1) as total from mal_task_video_link where video_id='" + cid + "'"
-	err = db.Raw(sql).Count(&total).Error
-	if err != nil {
-		return 0, err
+func GetTaskTotal(cid string) (items []TaskIdM, err error) {
+	sqlStr := "select task_id from mal_task_video_link where video_id='" + cid + "'"
+	if err := db.Raw(sqlStr).Scan(&items).Error; err != nil {
+		fmt.Println(err.Error())
+		return nil, err
 	}
-	return total, nil
+	return
 }
diff --git a/camera-service/controllers/camera.go b/camera-service/controllers/camera.go
index e90ed77..2029bfc 100644
--- a/camera-service/controllers/camera.go
+++ b/camera-service/controllers/camera.go
@@ -90,6 +90,7 @@
 	if b, err := sv.CameraUpdate(camVo); b {
 		//鏇存柊鍒嗚鲸鐜�
 		if ok {
+			//
 			logger.Debug("DoPostRequest:", camVo)
 			if cam.IsRunning && (cam.ResolutionWidth != camVo.ResolutionWidth && cam.ResolutionHeight != camVo.ResolutionHeight) {
 				header := map[string]string{}
@@ -99,6 +100,18 @@
 					"videoType": 0,
 				}
 				res, err := util.DoPostRequest("http://127.0.0.1:8088/v1/task/openAnalysis", util.CONTENT_TYPE_JSON, paramBody, nil, header, time.Second*10)
+				if err != nil {
+					logger.Debug("DoPostRequest err:", err)
+				}
+				logger.Debug("DoPostRequest:", res)
+			}
+			//鏇存柊鐘舵��
+			if cam.IsRunning {
+				header := map[string]string{}
+				paramBody := map[string]interface{}{
+					"state": 1,
+				}
+				res, err := util.DoPostRequest("http://127.0.0.1:8088/v1/task/updateAllStatus?state=1", util.CONTENT_TYPE_JSON, paramBody, nil, header, time.Second*10)
 				if err != nil {
 					logger.Debug("DoPostRequest err:", err)
 				}
@@ -131,15 +144,24 @@
 	}
 
 	//鍒ゆ柇鏄惁鏈夐厤缃换鍔�
-	total, _ := models.GetTaskTotal(cid)
-	if total > 0 {
-		return &bhomeclient.Reply{Success: false, Msg: "璇峰厛鍒犻櫎閰嶇疆鐨勪换鍔�"}
-	}
+	// total, _ := models.GetTaskTotal(cid)
+	// if total > 0 {
+	// 	return &bhomeclient.Reply{Success: false, Msg: "璇峰厛鍒犻櫎閰嶇疆鐨勪换鍔�"}
+	// }
 
 	rows, _ := cam.Delete(cid)
 	if rows == 0 {
 		return &bhomeclient.Reply{Success: true, Msg: "璁板綍涓嶅瓨鍦�"}
 	}
+
+	//鍒犻櫎浠诲姟
+	items, _ := models.GetTaskTotal(cid)
+	if len(items) > 0 {
+		for _, item := range items {
+			cam.DelLink(item.ID)
+		}
+	}
+
 	pMsg := protomsg.DbChangeMessage{ //闇�瑕侀噸鏂拌绠楃畻鍔涘崰鐢ㄦ儏鍐�
 		Table:  protomsg.TableChanged_T_Camera,
 		Action: protomsg.DbAction_Delete,
@@ -1125,9 +1147,9 @@
 	if len(TaskName) > 0 {
 		quotedNames := make([]string, len(TaskName))
 		for i, name := range TaskName {
-			quotedNames[i] = "'" + name + "'" // 姣忎釜鍏冪礌鍔犲崟寮曞彿
+			quotedNames[i] = " task_name like '%%" + name + "%%' " // 姣忎釜鍏冪礌鍔犲崟寮曞彿
 		}
-		filter += fmt.Sprintf(" and %s in [%s]", "task_name", strings.Join(quotedNames, ","))
+		filter += " and (" + strings.Join(quotedNames, "or") + ")"
 	} else {
 		if Warning > 0 {
 			return &bhomeclient.Reply{Success: true, Msg: "鑾峰彇鎴愬姛", Data: nil}
diff --git a/camera-service/models/db.go b/camera-service/models/db.go
index f177f0f..360f63c 100644
--- a/camera-service/models/db.go
+++ b/camera-service/models/db.go
@@ -17,14 +17,18 @@
 func Init() {
 	db, err = gorm.Open(config.DBconf.Name, "../config/camera-service.db")
 
-	
 	if err != nil {
 		logger.Debug("db open error ", err)
 	}
 	db.LogMode(true)
 	//db.SetLogger(&DbLogger{})
-	db.AutoMigrate(&commonModels.Area{}, &commonModels.Camera{}, &commonModels.CameraArea{},
-		&commonModels.Sensor{}, &commonModels.CameraSensor{})
+	// err1 := db.Debug().AutoMigrate(&commonModels.Area{}, &commonModels.Camera{}, &commonModels.CameraArea{},
+	// 	&commonModels.Sensor{}, &commonModels.CameraSensor{}, &commonModels.TrainTags{})
+	err1 := db.Debug().AutoMigrate(&commonModels.TrainTags{})
+	if err1 != nil {
+		logger.Debug("鑷姩杩佺Щ澶辫触 ", err1)
+	}
+
 	commonModels.SetDB(db)
 }
 
diff --git a/push-service/controllers/pushSet.go b/push-service/controllers/pushSet.go
index a8f967c..13a7a23 100644
--- a/push-service/controllers/pushSet.go
+++ b/push-service/controllers/pushSet.go
@@ -35,6 +35,7 @@
 			{Checked: true, Id: "camera_id", Name: "鎽勫儚鏈篒D", Alias: "camera_id"},
 			{Checked: true, Id: "camera_name", Name: "鎽勫儚鏈哄悕绉�", Alias: "camera_name"},
 			{Checked: true, Id: "camera_addr", Name: "鎽勫儚鏈哄湴鍧�", Alias: "camera_addr"},
+			{Checked: true, Id: "camera_rtsp", Name: "RTSP鍦板潃", Alias: "camera_rtsp"},
 		},
 	}
 	// sceneInfoSet := vo.PushSetMenu{
@@ -93,28 +94,40 @@
 			{Checked: true, Id: "is_warning", Name: "鏄惁棰勮", Alias: "is_warning"},
 		},
 	}
-	// detectAreaSet := vo.PushSetMenu{
-	// 	Id:      "detectAreaInfo",
-	// 	Name:    "妫�娴嬪尯鍩�",
-	// 	Alias:   "detectAreaInfo",
-	// 	Checked: true,
-	// 	Children: []vo.PushSetMenu{
-	// 		{Checked: true, Id: "targetInfo.#.areaId", Name: "妫�娴嬪尯鍩焛d", Alias: "areaId"},
-	// 		{Checked: true, Id: "targetInfo.#.areaName", Name: "妫�娴嬪尯鍩熷悕绉�", Alias: "areaName"},
-	// 	},
-	// }
-	// targetSet := vo.PushSetMenu{
-	// 	Id:      "targetInfo",
-	// 	Name:    "鐩爣",
-	// 	Alias:   "targetInfo",
-	// 	Checked: true,
-	// 	Children: []vo.PushSetMenu{
-	// 		{Checked: true, Id: "targetInfo.#.attribute", Name: "绠楁硶灞炴��", Alias: "attribute"},
-	// 		{Checked: true, Id: "targetInfo.#.targetLocation", Name: "鐩爣鍧愭爣", Alias: "targetLocation"},
-	// 		{Checked: true, Id: "targetInfo.#.targetScore", Name: "鐩爣缃俊搴�", Alias: "targetScore"},
-	// 		{Checked: true, Id: "targetInfo.#.targetType", Name: "鐩爣绫诲埆", Alias: "targetType"},
-	// 	},
-	// }
+	detectAreaSet := vo.PushSetMenu{
+		Id:      "areaInfo",
+		Name:    "妫�娴嬪尯鍩�",
+		Alias:   "areaInfo",
+		Checked: true,
+		Children: []vo.PushSetMenu{
+			{Checked: true, Id: "area_id", Name: "妫�娴嬪尯鍩焛d", Alias: "area_id"},
+			{Checked: true, Id: "area_name", Name: "妫�娴嬪尯鍩熷悕绉�", Alias: "area_name"},
+			{Checked: true, Id: "proportion", Name: "妫�娴嬪尯鍩熷崰姣�", Alias: "proportion"},
+		},
+	}
+	KnowLedgeSet := vo.PushSetMenu{
+		Id:      "knowLedgeInfo",
+		Name:    "鐭ヨ瘑搴�",
+		Alias:   "knowLedgeInfo",
+		Checked: true,
+		Children: []vo.PushSetMenu{
+			{Checked: true, Id: "knowledge_id", Name: "ID", Alias: "knowledge_id"},
+			{Checked: true, Id: "knowledge_name", Name: "鐭ヨ瘑搴撳悕绉�", Alias: "knowledge_name"},
+			{Checked: true, Id: "knowledge_doc", Name: "鐭ヨ瘑搴撴枃妗�", Alias: "knowledge_doc"},
+		},
+	}
+	targetSet := vo.PushSetMenu{
+		Id:      "targetInfo",
+		Name:    "鐩爣",
+		Alias:   "targetInfo",
+		Checked: true,
+		Children: []vo.PushSetMenu{
+			{Checked: true, Id: "attribute", Name: "灞炴��", Alias: "attribute"},
+			{Checked: true, Id: "target_location", Name: "鐩爣鍧愭爣", Alias: "target_location"},
+			{Checked: true, Id: "target_score", Name: "鐩爣缃俊搴�", Alias: "target_score"},
+			{Checked: true, Id: "target_type", Name: "鐩爣绫诲埆", Alias: "target_type"},
+		},
+	}
 	// dtSet := vo.PushSetMenu{
 	// 	Id:      "tableInfo",
 	// 	Name:    "搴曞簱淇℃伅",
@@ -144,7 +157,7 @@
 	// 	},
 	// }
 	// set = append(set, camInfoSet, sceneInfoSet, serverSet, dataSet, detectAreaSet, targetSet, dtSet, dbpInfo)
-	set = append(set, camInfoSet, taskInfoSet, serverSet, dataSet)
+	set = append(set, camInfoSet, taskInfoSet, serverSet, dataSet, detectAreaSet, KnowLedgeSet, targetSet)
 
 	return &bhomeclient.Reply{Success: true, Data: set}
 }
diff --git a/sysinfo-service/service/proc.go b/sysinfo-service/service/proc.go
index f1deff7..16350cb 100644
--- a/sysinfo-service/service/proc.go
+++ b/sysinfo-service/service/proc.go
@@ -14,20 +14,20 @@
 
 var BasicProc = map[string]string{
 	// "analysis":      "绠楁硶澶勭悊鍗曞厓",
-	"apiserver":     "basic鎺ュ彛鏈嶅姟",
-	"decoder":       "瑙嗛瑙g爜鏈嶅姟",
-	"elasticsearch": "鍒嗗竷寮忔暟鎹悳绱㈠紩鎿�",
+	"apiserver": "basic鎺ュ彛鏈嶅姟",
+	"decoder":   "瑙嗛瑙g爜鏈嶅姟",
+	// "elasticsearch": "鍒嗗竷寮忔暟鎹悳绱㈠紩鎿�",
 	// "faceDetect":    "浜鸿劯璇嗗埆鏈嶅姟",
 	"file-service": "鏂囦欢鏈嶅姟",
-	"pollcontrol":  "杞绠$悊",
-	"pushServer":   "瑙勫垯澶勭悊鍗曞厓",
+	// "pollcontrol":  "杞绠$悊",
+	"pushServer": "瑙勫垯澶勭悊鍗曞厓",
 	// "dataProcess":   "瑙勫垯澶勭悊鍗曞厓",
 	"schedule": "璋冨害杩涚▼",
 	// "sdkCompare":    "浜鸿劯姣斿鏈嶅姟",
-	"sshd":         "ssh鏈嶅姟绔�",
-	"videopublish": "瀹炴椂瑙嗛鎺ㄦ祦鏈嶅姟",
-	"videosvr.out": "鍥芥爣涓婄骇鏈嶅姟",
-	"weed":         "鍒嗗竷寮忔枃浠剁郴缁�",
+	"sshd":       "ssh鏈嶅姟绔�",
+	"zlmediaKit": "瀹炴椂瑙嗛鎺ㄦ祦鏈嶅姟",
+	"wvp":        "鍥芥爣涓婄骇鏈嶅姟",
+	"weed":       "鍒嗗竷寮忔枃浠剁郴缁�",
 }
 
 var ModleProc = map[string]string{
@@ -172,7 +172,7 @@
 	apps := dbApi.FindAppMap()
 	for k, v := range dbApi.FindAppMap() {
 		if v.ProcName != "" {
-			installedAppMap[v.ProcName] = apps[k]
+			installedAppMap[v.Id] = apps[k]
 		}
 	}
 
@@ -193,40 +193,27 @@
 			}
 		}
 	}
-
 	// 缁熻姝e湪杩愯鐨勫簲鐢ㄤ俊鎭�
 	ps, _ := process.Processes()
-	for _, p := range ps {
-		if name, err := p.Name(); err == nil {
-			if app, isExist := installedAppMap[name]; isExist {
-				proc := Proc{
-					Name: app.Name,
-					Pid:  p.Pid,
-					Desc: app.Title,
-				}
-
-				proc.Cpu, _ = p.CPUPercent()
-				proc.Mem, _ = p.MemoryPercent()
-				proc.Gpu = gpuPer.Get(int(p.Pid))
-
-				procs = append(procs, proc)
-
-				delete(installedAppMap, name)
-			}
-		}
-	}
-
-	// 杩藉姞鏈惎鍔ㄧ殑搴旂敤
 	for _, v := range installedAppMap {
 		proc := Proc{
 			Name: v.Name,
 			Pid:  0,
 			Desc: v.Title,
 		}
-
 		proc.Cpu = 0
 		proc.Mem = 0
 		proc.Gpu = 0
+		for _, p := range ps {
+			if name, err := p.Name(); err == nil {
+				if name == v.ProcName {
+					proc.Pid = p.Pid
+					proc.Cpu, _ = p.CPUPercent()
+					proc.Mem, _ = p.MemoryPercent()
+					proc.Gpu = gpuPer.Get(int(p.Pid))
+				}
+			}
+		}
 
 		procs = append(procs, proc)
 	}
@@ -252,7 +239,15 @@
 				}
 			}
 
-			if k == "elasticsearch" {
+			if k == "zlmediaKit" {
+				cmdLine, _ := p.Cmdline()
+				if strings.Contains(cmdLine, "MediaServer") {
+					proc.Pid = p.Pid
+
+					break
+				}
+			}
+			if k == "wvp" {
 				cmdLine, _ := p.Cmdline()
 				if strings.Contains(cmdLine, k) {
 					proc.Pid = p.Pid
diff --git a/system-service/controllers/voice.go b/system-service/controllers/voice.go
index fb697ba..a77cd8b 100644
--- a/system-service/controllers/voice.go
+++ b/system-service/controllers/voice.go
@@ -149,7 +149,7 @@
 		audioPath, err := sv.UploadVoice(file.Bytes, filename)
 		if err != nil {
 			if err.Error() == "audio format error" {
-				return &bhomeclient.Reply{Msg: "澹伴煶鍙厑璁竚p3,wav,wma鐨勬牸寮�"}
+				return &bhomeclient.Reply{Msg: "澹伴煶鍙厑璁竚p3,wav鐨勬牸寮�"}
 			} else {
 				return &bhomeclient.Reply{Msg: "澹伴煶涓婁紶澶辫触:" + err.Error()}
 			}
diff --git a/system-service/service/SysService.go b/system-service/service/SysService.go
index 779b65e..a3f7576 100644
--- a/system-service/service/SysService.go
+++ b/system-service/service/SysService.go
@@ -165,7 +165,7 @@
 	return true, isComplete, ""
 }
 
-//upgrade
+// upgrade
 func (sv SysService) Upgrade(identifier string, filename string) (bool, error) {
 	if !bakBeforeUpgrade() {
 		return false, errors.New("鏇存柊鍓嶅浠藉け璐�")
@@ -226,7 +226,7 @@
 	return true
 }
 
-//鏇存柊绯荤粺绋嬪簭
+// 鏇存柊绯荤粺绋嬪簭
 func updatePatch(identifier string, ext string) bool {
 	configPatchPath := ""
 	if config.Server.PatchPath != "" {
@@ -349,11 +349,11 @@
 	return cmd.Output()
 }
 
-//涓婁紶澹伴煶鏂囦欢
+// 涓婁紶澹伴煶鏂囦欢
 func (sv SysService) UploadVoice(fileBytes []byte, filename string) (string, error) {
 	fileExt := path.Ext(filename)
 	fileExt = strings.ToLower(fileExt)
-	if fileExt != ".mp3" && fileExt != ".wma" && fileExt != ".wav" {
+	if fileExt != ".mp3" && fileExt != ".wav" {
 		return "", errors.New("audio format error")
 	}
 	var sApi bhomedbapi.SysSetApi
@@ -382,18 +382,18 @@
 	return weedFilePath, err
 }
 
-//鑾峰彇鎵�鏈夐厤缃�
+// 鑾峰彇鎵�鏈夐厤缃�
 func (sv SysService) GetAllSetting() (settings []models.SysSetting, err error) {
 	settingModel := models.SysSetting{}
 	return settingModel.GetAllSetting()
 }
 
-//鏇存柊閰嶇疆
+// 鏇存柊閰嶇疆
 func (sv SysService) SaveSetting(setting models.SysSetting) (err error) {
 	return setting.SaveSetting(true)
 }
 
-//鑾峰彇纭洏鍓╀綑绌洪棿
+// 鑾峰彇纭洏鍓╀綑绌洪棿
 func (sv SysService) DiskInfo(dev string) (uint64, uint64) {
 	var stat syscall.Statfs_t
 	err := syscall.Statfs(dev, &stat)
@@ -406,7 +406,7 @@
 	return All, Free
 }
 
-//鍚屾鏇存柊璁剧疆
+// 鍚屾鏇存柊璁剧疆
 func PersistentWrapper(topic string, payloads []byte) {
 	if versionControlS.AuthorizationUpdateTopic == topic {
 		if err := json.Unmarshal(payloads, &AuthInfo); nil != err {
diff --git a/system-service/service/appMenu.go b/system-service/service/appMenu.go
index e959977..c34698f 100644
--- a/system-service/service/appMenu.go
+++ b/system-service/service/appMenu.go
@@ -1,14 +1,15 @@
 package service
 
 import (
-	"basic.com/valib/bhomedbapi.git"
-	"basic.com/valib/logger.git"
-	"github.com/satori/go.uuid"
 	"strings"
 	"vamicro/system-service/models"
+
+	"basic.com/valib/bhomedbapi.git"
+	"basic.com/valib/logger.git"
+	uuid "github.com/satori/go.uuid"
 )
 
-//鍒濆鍖栧簲鐢ㄦ潈闄�
+// 鍒濆鍖栧簲鐢ㄦ潈闄�
 func InitAppPermissions() {
 	var appApi bhomedbapi.AppApi
 	apps := appApi.FindAll("")
@@ -40,13 +41,13 @@
 				}
 				if a.Package == "search" { //缁熻鏌ヨ
 					sort = 2
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鎽勫儚鏈�', 'SEARCH', 'search:camera', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='search:camera');")
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏁版嵁鏍�', 'SEARCH', 'search:stack', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='search:stack');")
+					// sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鎽勫儚鏈�', 'SEARCH', 'search:camera', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='search:camera');")
+					// sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏁版嵁鏍�', 'SEARCH', 'search:stack', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='search:stack');")
 				} else if a.Package == "cameraAccess" { //鎽勫儚鏈洪厤缃�
 					sort = 3
 					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鎽勫儚鏈轰俊鎭�', 'CAMERAACCESS', 'cameraAccess:cameraInfo', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:cameraInfo');")
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鐙珛鍦烘櫙', 'CAMERAACCESS', 'cameraAccess:selfRule', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:selfRule');")
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鑱斿姩鍦烘櫙', 'CAMERAACCESS', 'cameraAccess:linkRule', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:linkRule');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, 'AI浠诲姟', 'CAMERAACCESS', 'cameraAccess:aiTask', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:aiTask');")
+					// sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鑱斿姩鍦烘櫙', 'CAMERAACCESS', 'cameraAccess:linkRule', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:linkRule');")
 				} else if a.Package == "analysisPower" { //绠楀姏绠$悊
 					sort = 5
 					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '璁剧疆', 'ANALYSISPOWER', 'analysisPower:set', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='analysisPower:set');")
@@ -57,9 +58,11 @@
 					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏌ョ湅', 'LIBRARY', 'library:show', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='library:show');")
 				} else if a.Package == "algorithmManage" { // 搴旂敤涓績
 					sort = 7
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '宸插畨瑁�', 'ALGORITHMMANAGE', 'algorithmManage:installed', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:installed');")
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '绂荤嚎鍗囩骇/瀹夎', 'ALGORITHMMANAGE', 'algorithmManage:insOffLine', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:insOffLine');")
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '搴旂敤涓績璐拱', 'ALGORITHMMANAGE', 'algorithmManage:buy', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:buy');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '搴旂敤涓績', 'ALGORITHMMANAGE', 'algorithmManage:main', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:main');")
+
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '宸叉縺娲�', 'ALGORITHMMANAGE', 'algorithmManage:installed', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:installed');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '绂荤嚎鍗囩骇/瀹夎', 'ALGORITHMMANAGE', 'algorithmManage:insOffLine', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:insOffLine');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏇存柊', 'ALGORITHMMANAGE', 'algorithmManage:buy', 4, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:buy');")
 				} else if a.Package == "datapush" { //鏁版嵁鎺ㄩ��
 					sort = 8
 				} else if a.Package == "settings" { //绯荤粺璁剧疆
@@ -72,14 +75,34 @@
 					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '閿洏鍜岃瑷�', 'SETTINGS', 'settings:keyboard', 5, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:keyboard');")
 					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '閫氱敤璁剧疆', 'SETTINGS', 'settings:common', 6, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:common');")
 					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '璁惧淇℃伅', 'SETTINGS', 'settings:sysInfo', 7, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:sysInfo');")
-					/*sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏉冮檺绠$悊', 'SETTINGS', 'settings:permission', 4, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:permission');")*/
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏉冮檺绠$悊', 'SETTINGS', 'settings:permission', 8, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:permission');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '璁惧绠$悊', 'SETTINGS', 'settings:device', 9, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:device');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '妫�娴嬪唴瀹�', 'SETTINGS', 'settings:content', 10, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:content');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '棰勮瑙勫垯', 'SETTINGS', 'settings:rule', 11, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:rule');")
+
 					/*sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '骞挎挱璁剧疆', 'SETTINGS', 'settings:broadcast', 5, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:broadcast');")*/
 				} else if a.Package == "vindicate" { //绯荤粺缁存姢
 					sort = 10
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '璁惧缁存姢', 'VINDICATE', 'vindicate:device', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:device');")
-					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏁版嵁搴撶淮鎶�', 'VINDICATE', 'vindicate:db', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:db');")
+					// sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '璁惧缁存姢', 'VINDICATE', 'vindicate:device', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:device');")
+					// sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏁版嵁搴撶淮鎶�', 'VINDICATE', 'vindicate:db', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:db');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏇存柊璁剧疆', 'VINDICATE', 'vindicate:update', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:update');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '绯荤粺娓呯悊', 'VINDICATE', 'vindicate:clear', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:clear');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '閲嶅惎璁剧疆', 'VINDICATE', 'vindicate:restart', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:restart');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '澶囦唤杩樺師', 'VINDICATE', 'vindicate:backup', 4, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:backup');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '绯荤粺淇℃伅', 'VINDICATE', 'vindicate:sysinfo', 5, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:sysinfo');")
+
 				} else if a.Package == "syslog" {
 					sort = 11
+				} else if a.Package == "knowledge" {
+					sort = 12
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '璁剧疆', 'KNOWLEDGE', 'knowledge:set', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='knowledge:set');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏌ョ湅', 'KNOWLEDGE', 'knowledge:show', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='knowledge:show');")
+
+				} else if a.Package == "dataStack" {
+					sort = 13
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏁版嵁鏍堥厤缃�', 'DATASTACK', 'dataStack:cameraInfo', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='dataStack:cameraInfo');")
+					sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '鏁版嵁鏍堜俊鎭�', 'DATASTACK', 'dataStack:selfRule', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='dataStack:selfRule');")
+
 				}
 
 				menu := models.SysMenu{}
diff --git a/system-service/sys/sysinfo.go b/system-service/sys/sysinfo.go
index e5ede0e..c3504ae 100644
--- a/system-service/sys/sysinfo.go
+++ b/system-service/sys/sysinfo.go
@@ -1,6 +1,7 @@
 package sys
 
 import (
+	"errors"
 	"fmt"
 	"io/ioutil"
 	"os"
@@ -12,7 +13,6 @@
 	"vamicro/extend/util"
 
 	"basic.com/valib/gogpu.git"
-	"basic.com/valib/logger.git"
 	"github.com/shirou/gopsutil/cpu"
 	"github.com/shirou/gopsutil/disk"
 	"github.com/shirou/gopsutil/host"
@@ -81,26 +81,45 @@
 	return util.Struct2Map(Stat)
 }
 
+func GetGpu(key string) (vGpu []string, err error) {
+	resultMsg, e := util.ExeCmd("dlsmi --query-gpu=" + key)
+	if e != nil {
+		return vGpu, errors.New("鏃犲彲鐢℅PU!璇锋鏌ユ槸鍚︽甯稿畨鏄惧崱鍙婃樉鍗¢┍鍔紝閫氳繃dlsmi鏌ヨ鐘舵��")
+	}
+	vGpu = strings.Split(string(resultMsg), "\n")
+	if len(vGpu) == 0 {
+		return vGpu, errors.New("鏃犲彲鐢℅PU!璇锋鏌ユ槸鍚︽甯稿畨鏄惧崱鍙婃樉鍗¢┍鍔紝閫氳繃dlsmi鏌ヨ鐘舵��")
+	}
+	return vGpu, nil
+}
+
 func GetDeviceInfo() map[string]interface{} {
 	cmd := exec.Command("/bin/sh", "-c", "lsblk -d | grep -v part | grep -v SWAP | grep -v M | grep disk | awk '{printf $4\" \"}'")
 	disks, _ := cmd.Output()
 	cpu, _ := cpu.Info()
-	gpuInfo, err := gogpu.Info()
-	var gpuMemTotal int64
-	if err == nil {
-		for _, gpu := range gpuInfo.Info {
-			gpuMemTotal = gpuMemTotal + gpu.GpuMemoryTotal
+
+	var gpuStr string
+
+	//鑾峰彇鍨嬪彿
+	gpuName, _ := GetGpu("name")
+	if len(gpuName) > 0 {
+		var gpuArr []string = []string{}
+		gpuTotal, _ := GetGpu("memory.total")
+		for i, name := range gpuName {
+			//i>0璺宠繃header
+			if i > 0 && len(name) > 0 {
+				gpuArr = append(gpuArr, fmt.Sprintf("%s %s", name, gpuTotal[i]))
+			}
 		}
-	} else {
-		logger.Debug("gpu error " + err.Error())
+		gpuStr = strings.Join(gpuArr, ",")
 	}
-	gpu := gpuMemTotal
+
 	mem, _ := mem.VirtualMemory()
 	host, _ := host.Info()
 
 	return util.Struct2Map(map[string]interface{}{
 		"cpu":  cpu,
-		"gpu":  gpu,
+		"gpu":  gpuStr,
 		"mem":  mem,
 		"host": host,
 		"disk": string(disks),
diff --git a/version-control/main.go b/version-control/main.go
index 0f3c5fe..4435491 100644
--- a/version-control/main.go
+++ b/version-control/main.go
@@ -88,7 +88,7 @@
 
 	go ms.StartServer(fm)
 
-	go service.SelfUpdateStart(ctx, ms) //鑷姩鏇存柊
+	// go service.SelfUpdateStart(ctx, ms) //鑷姩鏇存柊
 
 	go service.NoticeTick(ctx) //鏇存柊鎻愰啋
 

--
Gitblit v1.8.0