From 24f44f6ecefb5e83295bab670533529c6bc81810 Mon Sep 17 00:00:00 2001
From: qixiaoning <jony.kee@outlook.com>
Date: 星期五, 18 七月 2025 18:13:16 +0800
Subject: [PATCH] 本地调试

---
 camera-common/models/task.go              |    1 
 camera-service/controllers/camera.go      |   10 +
 sync-service/models/cameraRuleGroup.go    |   91 ++++++++++
 sync-service/models/cameraPolygon.go      |   89 ++++-----
 sync-service/models/cameraRuleGroupArg.go |  108 ++++++++++++
 api-gateway/main.go                       |   21 +-
 config/pro.yaml                           |  183 +++++++++----------
 camera-service/main.go                    |   14 +
 8 files changed, 361 insertions(+), 156 deletions(-)

diff --git a/api-gateway/main.go b/api-gateway/main.go
index 332b684..03b2a1a 100644
--- a/api-gateway/main.go
+++ b/api-gateway/main.go
@@ -1,14 +1,16 @@
 package main
 
 import (
-	"basic.com/valib/logc.git"
-	"basic.com/valib/logger.git"
-	"basic.com/valib/version.git"
 	"context"
 	"flag"
+
+	"basic.com/valib/logc.git"
+	"basic.com/valib/logger.git"
+	vaversion "basic.com/valib/version.git"
 	"github.com/gin-gonic/gin"
-//	"net/http"
-//	_ "net/http/pprof"
+
+	//	"net/http"
+	//	_ "net/http/pprof"
 	"os"
 	"os/signal"
 	"syscall"
@@ -23,17 +25,18 @@
 
 var (
 	procName = service.ProcName
-	env = flag.String("e", "pro", "")
+	env      = flag.String("e", "pro", "")
 )
 
-//func init() {
+// func init() {
 func sinit() {
 	flag.Parse()
+	//鎺у埗鍙版墦鍗扮増鏈�
 	vaversion.Usage()
 
 	config.Init(*env)
 	// 鏃ュ織鍒濆鍖�
-	var logFile = config.LogConf.Path + "vamicro-"+procName+".log"
+	var logFile = config.LogConf.Path + "vamicro-" + procName + ".log"
 	logger.InitLogger(logFile, config.LogConf.Level, config.LogConf.MaxSize, config.LogConf.MaxBackups, config.LogConf.MaxAge)
 	logger.Info("log init success !")
 }
@@ -44,7 +47,7 @@
 	//	logger.Info(http.ListenAndServe("0.0.0.0:6077", nil))
 	//}()
 
-    sinit()
+	sinit()
 	models.Init()
 	defer models.CloseDB()
 
diff --git a/camera-common/models/task.go b/camera-common/models/task.go
new file mode 100644
index 0000000..2640e7f
--- /dev/null
+++ b/camera-common/models/task.go
@@ -0,0 +1 @@
+package models
diff --git a/camera-service/controllers/camera.go b/camera-service/controllers/camera.go
index 4f9c380..3effa9b 100644
--- a/camera-service/controllers/camera.go
+++ b/camera-service/controllers/camera.go
@@ -321,7 +321,7 @@
 	if sv.ChangeRunType(ccrVo) {
 		cIds := strings.Join(ccrVo.CameraIds, ",")
 		cc.addDbChangeMsg(h.Bk, protomsg.TableChanged_T_Camera, cIds, protomsg.DbAction_Update, "")
-		_, _ = service2.DoBusReq("/data/api-v/saas/syncCamera", config.Server.AnalyServerId, aiot.RequestMethod_Post, aiot.RequestContentType_ApplicationJson, map[string]interface{}{})
+		 _, _ = service2.DoBusReq("/data/api-v/saas/syncCamera", config.Server.AnalyServerId, aiot.RequestMethod_Post, aiot.RequestContentType_ApplicationJson, map[string]interface{}{})
 		return &bhomeclient.Reply{Success: true, Msg: "鏇存柊鎴愬姛"}
 	} else {
 		return &bhomeclient.Reply{Success: false, Msg: "鏇存柊澶辫触"}
@@ -1000,3 +1000,11 @@
 	_, _ = service2.DoBusReq("/data/api-v/saas/syncCamera", config.Server.AnalyServerId, aiot.RequestMethod_Post, aiot.RequestContentType_ApplicationJson, map[string]interface{}{})
 	return &bhomeclient.Reply{Success: true, Msg: "淇濆瓨鎴愬姛"}
 }
+
+/**
+ *  鏍规嵁瑙嗛id鑾峰彇浠诲姟
+ */
+func (cc CameraController) GetTaskById(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
+	tasks := "hello,world"
+	return &bhomeclient.Reply{Success: true, Msg: "鑾峰彇鎴愬姛", Data: tasks}
+}
diff --git a/camera-service/main.go b/camera-service/main.go
index 0b4b54b..845179a 100644
--- a/camera-service/main.go
+++ b/camera-service/main.go
@@ -1,10 +1,6 @@
 package main
 
 import (
-	"basic.com/valib/bhomeclient.git"
-	"basic.com/valib/bhomedbapi.git"
-	"basic.com/valib/logger.git"
-	"basic.com/valib/version.git"
 	"context"
 	"flag"
 	"os"
@@ -15,6 +11,11 @@
 	"vamicro/camera-service/models"
 	"vamicro/camera-service/service"
 	"vamicro/config"
+
+	"basic.com/valib/bhomeclient.git"
+	"basic.com/valib/bhomedbapi.git"
+	"basic.com/valib/logger.git"
+	vaversion "basic.com/valib/version.git"
 )
 
 var (
@@ -75,7 +76,7 @@
 	ms.Free()
 }
 
-//澶勭悊璁㈤槄娑堟伅
+// 澶勭悊璁㈤槄娑堟伅
 func dealSubMsg(ctx context.Context, ms *bhomeclient.MicroNode) {
 
 	for {
@@ -125,6 +126,9 @@
 	funcMap[urlPrefix+"/camera/getSyncSensorData"] = cc.GetSyncSensorData
 	funcMap[urlPrefix+"/camera/saveNotExistOrUpdate"] = cc.SaveNotExistOrUpdate
 
+	//鎽勫儚鏈哄叧鑱旂潱鏌ヤ换鍔�
+	funcMap[urlPrefix+"/camera/getTasks"] = cc.GetTaskById
+
 	var pubTopics []string
 	for key, _ := range funcMap {
 		pubTopics = append(pubTopics, key)
diff --git a/config/pro.yaml b/config/pro.yaml
index 3f68211..5bdc2d5 100644
--- a/config/pro.yaml
+++ b/config/pro.yaml
@@ -1,42 +1,32 @@
 server:
-    serverName: "SmartAI"
     runmode: debug
     jwtSecret: BASIC
     jwtExpire: 24
     url: http://127.0.0.1:8080
-    analyServerId: DSPAD010120211015235820
-    networkAdapter: eth0 
-#寰幆瑕嗙洊---------------------------------------------------------------------------------------------#
-    #es鏈嶅姟IP  浠呭湪鍏徃娴嬭瘯鐜浣跨敤锛岀嚎涓婂嬁閰嶇疆
-    esServerIp: 192.168.8.118
-    #es鏈嶅姟绔彛  浠呭湪鍏徃娴嬭瘯鐜浣跨敤锛岀嚎涓婂嬁閰嶇疆
-    esServerPort: 9200
-#---------------------------------------------------------------------------------------------寰幆瑕嗙洊#
-    #骞惰绾跨▼杩涘埗
-    coreBaseUnit: 100
-    #瓒呮椂鏃堕棿
-    timeOut: 2
+    analyServerId: DSVAD202505139F8038
+    networkAdapter: enp6s0
     #鑴氭湰鐩綍
     scriptPath: /opt/vasystem/script
     #璁惧缂栧彿
     deviceNum: 001
     #璁惧鍨嬪彿
-    deviceModel: Bsk-JS1000N
+    deviceModel: BSK-JS1000X
     #璁惧鍨嬪彿
-    deviceType: DS0104322264020416 
+    deviceType: DS0301322264020416
     deviceDesc: 鍒嗘瀽/瀛樺偍璁惧1
     #璁惧搴忓垪鍙�
     deviceSerialNum: 01
     #涓绘帶鐗堟湰
-    masterVersion: V1.0.0 
+    masterVersion: V1.0.0.0
     #web鐗堟湰
-    webVersion: 2.0 
+    webVersion: 2.0
     #閫氶亾涓暟
     channelCount: 0
     #纭洏涓暟
     diskCount: 2
     #Exec root command
-    sudoPassword: basic2021 
+    sudoPassword: 123 
+    rtspUnique: false
     sysThresholds:
     - value: 60
       color: '#13ce66'
@@ -49,34 +39,78 @@
     licensePath: /opt/vasystem/licence.inc
     lKey: flzxsqc,ysyhljt.
     lPublicKeyPath: /opt/vasystem/public.pem
+    headpics: ["none"]
+    langs:
+    - name: "绠�浣撲腑鏂�"
+      lang: "zh_CN.UTF-8"
+      language: "zh_CN:zh"
+    - name: "鑻辫"
+      lang: "en_US.UTF-8"
+      language: "en_US:en"
+    - name: "绻佷綋涓枃(棣欐腐)"
+      lang: "zh_HK.UTF-8"
+      language: "zh_HK:zh"
     voices:
     - id: 1
       name: 1.mp3
-      path: /files/voices/1.mp3
-    - id: 2 
+      path: /home/basic/files/1.mp3
+    - id: 2
       name: 2.mp3
-      path: /files/voices/2.mp3
+      path: /home/basic/files/2.mp3
     - id: 3
       name: 3.mp3
-      path: /files/voices/3.mp3
+      path: /home/basic/files/3.mp3
     - id: 4
       name: 4.mp3
-      path: /files/voices/4.mp3
+      path: /home/basic/files/4.mp3
     - id: 5
       name: 5.mp3
-      path: /files/voices/5.mp3
-    - id: lineup 
-      name: 璇锋湁搴忔帓闃�,涓嶈鎷ユ尋
-      path: /files/voices/lineup.mp3
-    - id: warningArea 
-      name: 璀︽垝鍖哄煙,灏藉揩绂诲紑 
-      path: /files/voices/warningArea.wav
-
+      path: /home/basic/files/5.mp3
+database:
+    driver: sqlite
+    name: sqlite3
+    filepath: /opt/vasystem/config/testdb.db
+cluster:
+    pwdpre: bjbasic123
+    #serf snapshot鏂囦欢鐨勫畬鏁磋矾寰�,serfSnapShot鏄釜鏂囦欢
+    serfsnapshotpath: /opt/vasystem/serfSnapShot
+    # 闆嗙兢鍐呴儴绔彛
+    port: 7081
+    # 闆嗙兢蹇冭烦闂撮殧
+    heartBeat: 15
+    # saas鏈嶅姟涓婃姤鍦板潃
+    saasReportUrl: 192.168.20.117:7081
+facedetect:
+    ip: 127.0.0.1
+    port: 4009
+dbpersoncompare:
+    ip: 127.0.0.1
+    port: 4010
+espersoncompare:
+    port: 4011
+    ips:
+    - 127.0.0.1
+weedfs:
+    port: 6333
+es:
+    port: 9200
+    shards: 1,2
+    index:
+      aiOcean:
+        index: ai_ocean
+        type: analysisModel
+    thresholdTime: 10
+    thresholdStayTime: 0
+    storePath:
+      - /data3/elasticsearch
 #寰幆瑕嗙洊---------------------------------------------------------------------------------------------#
 storage:
-    mountPoint: ["data"]
+    #鍚宎nalyServerId
+    id: DSVAD20230919AC63EC 
+    #鏂囦欢鏈嶅姟鎸傝浇鐐�
+    mountPoint: ["/data/disk1/"]
     #鏂囦欢鏈嶅姟瀛樺偍璺緞
-    volumePath: ["/data/disk2/seaweedfs/data/volume"]
+    volumePath: ["/data/disk1/seaweedfs/data/volume"]
     #娓呯悊闃堝��
     threshold: 85
     #鏂囦欢鏈嶅姟绔彛--鐢ㄥ仛鎸囧畾鏈嶅姟绔彛浠诲姟鎺у埗
@@ -93,85 +127,42 @@
         indexName: basicfs
         indexType: clearItem
 #---------------------------------------------------------------------------------------------寰幆瑕嗙洊#
-fileDb:                                                                                                                                                                                                             
-  driver: sqlite
-  name: sqlite3
-  filepath: /opt/vasystem/config/file-service.db
-file-service:
-  savePath: /opt/vasystem/files
-shop:
-  url: apps.smartai.com:7004
-database:
+fileDb:
     driver: sqlite
-    name: sqlite3
-    filepath: /opt/vasystem/config/testdb.db
-cluster:
-    pwdpre: bjbasic123
-    #serf snapshot鏂囦欢鐨勫畬鏁磋矾寰�,serfSnapShot鏄釜鏂囦欢
-    serfsnapshotpath: /opt/vasystem/serfSnapShot
-    # 鍐呴儴闆嗙兢閰嶇疆
-    # 闆嗙兢鍐呴儴绔彛
-    port: 7081
-    # 闆嗙兢蹇冭烦闂撮殧
-    heartBeat: 15
-    # saas鏈嶅姟涓婃姤鍦板潃
-    saasReportUrl: 192.168.20.117:7081
-
+    name: sqlite
+    filepath: /opt/vasystem/config/file-service.db
+file-service:
+    savePath: /opt/vasystem/files
+shop:
+    url: 127.0.0.1:7004
 saas:
-  url: 192.168.20.117:7080
-
-facedetect:
-    ip: 127.0.0.1
-    port: 4009
-dbpersoncompare:
-    ip: 127.0.0.1
-    port: 4010
-espersoncompare:
-    port: 4011
-    ips:
-    - 127.0.0.1
-redis:
-    host: 127.0.0.1
-    port: 6379
-    password: password
-    db: 1
-es:
-    shards: 1,2
-    index:
-        # 浜鸿劯鎶撴媿璁板綍
-        videopersons:
-            index: videopersons
-            type: perVideoPicture
-        # 琛屼负鎶撴媿璁板綍*
-        personaction:
-            index: personaction
-            type: perVideoAction
-        aiocean:
-            index: ai_ocean
-            type: analysisModel
-    thresholdTime: 10
-    thresholdStayTime: 0
+    url: 192.168.20.117:7080
+ruletrack:
+    timeout_seconds: 30
+    target_box: 1
+    jitter_buffer: 300
 #so閰嶇疆
 sopath:
     ip: 192.168.1.182
     port: 8008
-ruletrack:
-    timeout_seconds: 86400
-    movepos: 1
-
 #閫氱敤閰嶇疆
 LogBasePath: /opt/vasystem/valog/
-LogLevel: 5 
+LogLevel: 5
 log:
     path: /opt/vasystem/valog/
     level: -1
     maxSize: 128
     maxBackups: 30
     maxAge: 15
-
-#鎺ㄦ祦
 MaxStreamsNum: 16
+#鎺ㄦ祦
 LibFfmpegPath: /opt/vasystem/libs/libcffmpeg-capture.so
 VideoPublishWidth: 960
 VideoPublishHeight: 640
 VideoPublishPort: 10101
+
+SenderFreq: 1000 
+
+#so閰嶇疆
+trace:
+    useBlockList: 1
diff --git a/sync-service/models/cameraPolygon.go b/sync-service/models/cameraPolygon.go
index 04a4376..8e50e25 100644
--- a/sync-service/models/cameraPolygon.go
+++ b/sync-service/models/cameraPolygon.go
@@ -1,26 +1,25 @@
 package models
 
 import (
-	"basic.com/pubsub/protomsg.git"
-	"basic.com/valib/logger.git"
-	"encoding/json"
 	"regexp"
+
+	"basic.com/valib/logger.git"
 )
 
 type CameraPolygon struct {
 	Id            string `gorm:"primary_key;column:id" json:"id"`
-	CameraId      string `gorm:"column:camera_id" json:"camera_id"`      //鎽勫儚鏈篿d
-	Name          string `gorm:"column:name" json:"name"`           //褰㈢姸鍚嶇О
-	Polygon       string `gorm:"column:polygon" json:"polygon"`        //褰㈢姸缁撴瀯瀹氫箟
-	DirectionLine string `gorm:"column:direction_line" json:"direction_line"` //鏂瑰悜绾�
-	Type 		  string `gorm:"column:type" json:"type"`			 //绫诲瀷锛孾"line","rect","polygon"]
+	CameraId      string `gorm:"column:camera_id" json:"camera_id"`                   //鎽勫儚鏈篿d
+	Name          string `gorm:"column:name" json:"name"`                             //褰㈢姸鍚嶇О
+	Polygon       string `gorm:"column:polygon" json:"polygon"`                       //褰㈢姸缁撴瀯瀹氫箟
+	DirectionLine string `gorm:"column:direction_line" json:"direction_line"`         //鏂瑰悜绾�
+	Type          string `gorm:"column:type" json:"type"`                             //绫诲瀷锛孾"line","rect","polygon"]
 	DefenceState  int    `gorm:"column:defence_state;default:0" json:"defence_state"` //甯冩挙闃茬姸鎬�
 }
 
 const (
-	TYPE_LINE = "line" //绾�
-	TYPE_RECT = "rect" //鐭╁舰
-	TYPE_POLYGON = "polygon" //闈�
+	TYPE_LINE              = "line"    //绾�
+	TYPE_RECT              = "rect"    //鐭╁舰
+	TYPE_POLYGON           = "polygon" //闈�
 	CAMERAPOLYGON_AREA_ALL = "鍏ㄩ儴鍖哄煙"
 )
 
@@ -35,44 +34,44 @@
 }
 
 func (cp *CameraPolygon) FindAll() (polygons []CameraPolygon) {
-	if err := db.Table("camera_polygon").Scan(&polygons).Error;err !=nil {
+	if err := db.Table("camera_polygon").Scan(&polygons).Error; err != nil {
 		return nil
 	}
 	return polygons
 }
 
 func (cp *CameraPolygon) FindAllMap() map[string]CameraPolygon {
-	m := make(map[string]CameraPolygon,0)
+	m := make(map[string]CameraPolygon, 0)
 	polygons := cp.FindAll()
-	if polygons !=nil {
-		for _,p :=range polygons {
+	if polygons != nil {
+		for _, p := range polygons {
 			m[p.Id] = p
 		}
 	}
 	return m
 }
 
-func (cp *CameraPolygon) SelectById(id string) (model CameraPolygon,flag bool) {
-	exist := db.Table("camera_polygon").First(&model,"id=?",id).RecordNotFound()
-	return model,!exist
+func (cp *CameraPolygon) SelectById(id string) (model CameraPolygon, flag bool) {
+	exist := db.Table("camera_polygon").First(&model, "id=?", id).RecordNotFound()
+	return model, !exist
 }
 
 func (cp *CameraPolygon) FindAllByCameraId(cameraId string) (polygons []CameraPolygon, err error) {
-	if err := db.Table("camera_polygon").Where("camera_id = ?", cameraId).Scan(&polygons).Error;err !=nil {
+	if err := db.Table("camera_polygon").Where("camera_id = ?", cameraId).Scan(&polygons).Error; err != nil {
 		return nil, err
 	}
-	return polygons,nil
+	return polygons, nil
 }
 
-//FindByCameraId 鏍规嵁鎽勫儚鏈篿d鏌ユ壘鍦ㄨ鍒欎腑浣跨敤鐨勫杈瑰舰
+// FindByCameraId 鏍规嵁鎽勫儚鏈篿d鏌ユ壘鍦ㄨ鍒欎腑浣跨敤鐨勫杈瑰舰
 func (cp *CameraPolygon) FindRulePolygonsByCameraId(cameraId string) (polygons []CameraPolygon, err error) {
-	if err := db.Table("camera_polygon").Where("camera_id = ? and type !=?", cameraId, TYPE_LINE).Scan(&polygons).Error;err !=nil {
+	if err := db.Table("camera_polygon").Where("camera_id = ? and type !=?", cameraId, TYPE_LINE).Scan(&polygons).Error; err != nil {
 		return nil, err
 	}
-	return polygons,nil
+	return polygons, nil
 }
 
-//淇濆瓨鎽勫儚鏈哄尯鍩�
+// 淇濆瓨鎽勫儚鏈哄尯鍩�
 func (cp *CameraPolygon) Insert() (result bool, err error) {
 	if err = db.Table("camera_polygon").Save(&cp).Error; err != nil {
 		return false, err
@@ -80,63 +79,63 @@
 	return true, nil
 }
 
-//鏇存柊鎽勫儚鏈哄尯鍩�
-func (cp *CameraPolygon) Update() (bool,error) {
-	result := db.Exec("update camera_polygon set camera_id=?,name=?,polygon=?,direction_line=?,type=?,defence_state=? where id=?",cp.CameraId,cp.Name,cp.Polygon,cp.DirectionLine,cp.Type,cp.DefenceState,cp.Id)
+// 鏇存柊鎽勫儚鏈哄尯鍩�
+func (cp *CameraPolygon) Update() (bool, error) {
+	result := db.Exec("update camera_polygon set camera_id=?,name=?,polygon=?,direction_line=?,type=?,defence_state=? where id=?", cp.CameraId, cp.Name, cp.Polygon, cp.DirectionLine, cp.Type, cp.DefenceState, cp.Id)
 	if result.Error != nil {
 		return false, result.Error
 	}
 	return result.RowsAffected > 0, nil
 }
 
-//鍒ゆ柇鎽勫儚鏈烘湁娌℃湁閲嶅悕鐨勫尯鍩�
+// 鍒ゆ柇鎽勫儚鏈烘湁娌℃湁閲嶅悕鐨勫尯鍩�
 func (cp CameraPolygon) Exist(cameraId string, name string) (model CameraPolygon, exist bool) {
 	exist = db.Table("camera_polygon").First(&model, "camera_id=? and name=?", cameraId, name).RecordNotFound()
 	return model, !exist
 }
 
-//UnInstall 鍒犻櫎鎽勫儚鏈哄尯鍩�
-func (cp *CameraPolygon) Delete(id string,name string) bool {
-	if err := db.Table("camera_polygon").Where("id=?",id).Delete(&CameraPolygon{}).Error; err != nil {
+// UnInstall 鍒犻櫎鎽勫儚鏈哄尯鍩�
+func (cp *CameraPolygon) Delete(id string, name string) bool {
+	if err := db.Table("camera_polygon").Where("id=?", id).Delete(&CameraPolygon{}).Error; err != nil {
 		return false
 	}
 	var crg CameraRuleGroup
 	groups := crg.FindGroupByPolygonId(id)
 	if groups != nil {
-		for _,g :=range groups {
+		for _, g := range groups {
 			//灏唃roupText涓殑宸插垹闄ょ殑澶氳竟褰㈠悕绉版浛鎹负NULL
-			reg := regexp.MustCompile(`(`+name+`浜�)`)
+			reg := regexp.MustCompile(`(` + name + `浜�)`)
 			newGText := reg.ReplaceAllString(g.GroupText, `<span style="color:RGB(255,0,0);">NULL</span>浜巂)
 			crg.UpdateText(g.Id, newGText)
 		}
 	}
-	err := db.Exec("update camera_task_args set polygon_id='' where polygon_id=?",id).Error
-	if err !=nil {
-		logger.Debug("rm polygon_id in camera_task_args err:",err)
+	err := db.Exec("update camera_task_args set polygon_id='' where polygon_id=?", id).Error
+	if err != nil {
+		logger.Debug("rm polygon_id in camera_task_args err:", err)
 	}
 	return true
 }
 
-func (cp *CameraPolygon) UpdateDefenceStateByPolygonId(polygonId string,state int) bool {
-	result := db.Exec("update camera_polygon set defence_state=? where id=?",state,polygonId)
-	if result.Error!=nil{
+func (cp *CameraPolygon) UpdateDefenceStateByPolygonId(polygonId string, state int) bool {
+	result := db.Exec("update camera_polygon set defence_state=? where id=?", state, polygonId)
+	if result.Error != nil {
 		return false
 	}
-	if result.RowsAffected>0{
+	if result.RowsAffected > 0 {
 		return true
 	} else {
 		return false
 	}
 }
 
-func (cp *CameraPolygon) UpdateDefenceStateByCameraId(cameraId string,state int) bool {
-	result := db.Exec("update camera_polygon set defence_state=? where camera_id=?",state,cameraId)
-	if result.Error!=nil{
+func (cp *CameraPolygon) UpdateDefenceStateByCameraId(cameraId string, state int) bool {
+	result := db.Exec("update camera_polygon set defence_state=? where camera_id=?", state, cameraId)
+	if result.Error != nil {
 		return false
 	}
-	if result.RowsAffected>0{
+	if result.RowsAffected > 0 {
 		return true
 	} else {
 		return false
 	}
-}
\ No newline at end of file
+}
diff --git a/sync-service/models/cameraRuleGroup.go b/sync-service/models/cameraRuleGroup.go
new file mode 100644
index 0000000..5b0deb0
--- /dev/null
+++ b/sync-service/models/cameraRuleGroup.go
@@ -0,0 +1,91 @@
+package models
+
+type CameraRuleGroup struct {
+	Id         string `gorm:"primary_key;column:id" json:"id"`
+	GroupText  string `gorm:"column:group_text" json:"group_text"`
+	AlarmLevel int    `gorm:"column:alarm_level;default:1" json:"alarm_level"`
+	SetType    string `gorm:"column:set_type" json:"set_type"`
+
+	TemplateId   string `gorm:"column:template_id" json:"template_id"`     //鍦烘櫙妯℃澘id
+	TemplateRule string `gorm:"column:template_rule" json:"template_rule"` //鍦烘櫙妯℃澘鐨勯厤缃�
+	TimeRuleId   string `gorm:"column:time_rule_id" json:"time_rule_id"`   //鏃堕棿娈�
+	SceneName    string `gorm:"column:scene_name" json:"scene_name"`       //鍦烘櫙鍚嶇О锛屼粠妯℃澘鏉ワ紝淇敼鍗宠嚜瀹氫箟
+	Desc         string `gorm:"column:desc" json:"desc"`                   //鍦烘櫙鎻忚堪
+	Enable       bool   `gorm:"column:enable;default:1" json:"enable"`     //寮�鍏筹紝榛樿寮�鍚�
+
+	VoiceId string `gorm:"column:voiceId" json:"voiceId"` //浜嬩欢澹伴煶
+}
+
+const (
+	Type_SetType_Batch = "batchTask"
+	Type_SetType_Link  = "linkTask"
+	RecordNotFound     = "record not found"
+)
+
+func (CameraRuleGroup) TableName() string {
+	return "camera_rule_group"
+}
+
+func (crg *CameraRuleGroup) SelectById(id string) (rows int64, err error) {
+	result := db.Table(crg.TableName()).Where("id = ?", id).First(&crg)
+	if result.Error != nil && result.Error.Error() != RecordNotFound {
+		return 0, result.Error
+	}
+	return result.RowsAffected, nil
+}
+
+func (crg *CameraRuleGroup) FindAll() (list []CameraRuleGroup) {
+	if err := db.Table(crg.TableName()).Scan(&list).Error; err != nil {
+		return nil
+	}
+	return list
+}
+func (crg *CameraRuleGroup) Insert() (bool, error) {
+	if err := db.Table(crg.TableName()).Create(&crg).Error; err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func (crg *CameraRuleGroup) FindByCameraId(cameraId string, setType string) (arr []CameraRuleGroup, err error) {
+	sql := "select * from " + crg.TableName() + " where id in (select distinct group_id from " + CameraRuleGroupArg{}.TableName() + " where camera_id='" + cameraId + "')"
+	if setType != "" {
+		sql += " and set_type='batchTask'"
+	}
+	if err := db.Raw(sql).Scan(&arr).Error; err != nil {
+		return nil, err
+	}
+	return arr, nil
+}
+
+func (crg *CameraRuleGroup) FindGroupByPolygonId(polygonId string) (list []CameraRuleGroup) {
+	var rga CameraRuleGroupArg
+	err := db.Raw("select * from "+crg.TableName()+" where id in (select distinct group_id from "+rga.TableName()+" where polygon_id=?)", polygonId).Find(&list).Error
+	if err != nil {
+		return nil
+	}
+	return list
+}
+
+func (crg *CameraRuleGroup) UpdateText(id string, text string) bool {
+	execResult := db.Exec("update "+crg.TableName()+" set group_text=? where id=?", text, id)
+	if execResult.Error != nil {
+		return false
+	}
+	return execResult.RowsAffected > 0
+}
+
+func (crg *CameraRuleGroup) UpdateAlarmLevel(groupId string, alarmLevel int) bool {
+	execResult := db.Exec("update "+crg.TableName()+" set alarm_level=? where id=?", alarmLevel, groupId)
+	if execResult.Error != nil {
+		return false
+	}
+	return execResult.RowsAffected > 0
+}
+
+func (crg *CameraRuleGroup) FindByTimeRuleId(timeRuleId string) (list []CameraRuleGroup, e error) {
+	if err := db.Table(crg.TableName()).Where("time_rule_id=?", timeRuleId).Scan(&list).Error; err != nil {
+		return nil, err
+	}
+	return list, nil
+}
diff --git a/sync-service/models/cameraRuleGroupArg.go b/sync-service/models/cameraRuleGroupArg.go
new file mode 100644
index 0000000..2713785
--- /dev/null
+++ b/sync-service/models/cameraRuleGroupArg.go
@@ -0,0 +1,108 @@
+package models
+
+type CameraRuleBase struct {
+	CameraId     		string 			`gorm:"column:camera_id" json:"camera_id"`           //鎽勫儚鏈篿d
+	SdkId        		string 			`gorm:"column:sdk_id" json:"sdk_id"`               	 //绠楁硶id
+	PolygonId    		string 			`gorm:"column:polygon_id" json:"polygon_id"`         //澶氳竟褰d
+	SdkSet 				string 			`gorm:"column:sdk_set" json:"sdk_set"`               	 //绠楁硶id
+	RuleWithPre  		string 			`gorm:"column:rule_with_pre" json:"rule_with_pre"`   //涓庝笂涓�鏉¤褰曠殑閫昏緫杩愮畻瑙勫垯锛�&&,||锛�
+	IsSaveAnyhow 		bool 			`gorm:"column:is_save_anyhow;default:0;" json:"is_save_anyhow"` //rule_with_pre鏄Е鍙戞椂锛屾槸鍚︽棤璁鸿瑙﹀彂鐨勬潯浠舵弧涓嶆弧瓒筹紝閮戒繚鐣欐暟鎹�
+	GroupId      		string 			`gorm:"column:group_id" json:"group_id"`             //鍒嗙粍id
+	Sort         		int    			`gorm:"column:sort" json:"sort"`                   //鎺掑簭
+}
+
+type CameraRuleGroupArg struct {
+	Id           		string 			`gorm:"column:id;primary_key;type:varchar(50);unique;not null;" json:"id"`
+	CameraRuleBase
+}
+
+func (CameraRuleGroupArg) TableName() string {
+	return "camera_rule_group_arg"
+}
+
+func (rga *CameraRuleGroupArg) InsertByGroup() bool {
+	tx := db.Table(rga.TableName()).Begin()
+
+	if tx.Error != nil {
+		return false
+	}
+
+	if err := tx.Create(&rga).Error; err != nil {
+		tx.Rollback()
+		return false
+	}
+	if tx.Commit().Error == nil {
+		return true
+	}
+	return false
+}
+
+func (rga *CameraRuleGroupArg) FindAll() (args []CameraRuleGroupArg) {
+	if err := db.Table(rga.TableName()).Scan(&args).Error; err != nil {
+		return nil
+	}
+	return args
+}
+
+type DbGroupId struct {
+	GroupId string `json:"group_id"`
+}
+
+
+func (rga *CameraRuleGroupArg) FindGroupIdByCameraId(cameraId string) (groupIds []DbGroupId, err error) {
+	if err := db.Raw("select distinct group_id from "+rga.TableName()+" where camera_id=?", cameraId).Scan(&groupIds).Error; err != nil {
+		return nil, err
+	}
+	return groupIds, nil
+}
+
+//DeleteByGroup 鏍规嵁group_id鍒犻櫎瑙勫垯缁勮缃�
+func (rga CameraRuleGroupArg) DeleteByGroup(groupId string) bool {
+	var crg CameraRuleGroup
+	var err error
+	tx := db.Begin()
+	defer func() {
+		if err != nil && tx != nil {
+			tx.Rollback()
+		}
+	}()
+	if err = tx.Table(rga.TableName()).Where("group_id=?", groupId).Delete(CameraRuleGroupArg{}).Error; err != nil {
+		return false
+	}
+	if err = tx.Table(crg.TableName()).Where("group_id=?", groupId).Delete(crg).Error; err != nil {
+		return false
+	}
+	if err = tx.Commit().Error; err != nil {
+		return false
+	} else {
+		return true
+	}
+}
+
+func (rga CameraRuleGroupArg) FindByGroupId(groupId string) (rags []CameraRuleGroupArg) {
+	if err := db.Table(rga.TableName()).Where("group_id=?", groupId).Find(&rags).Error; err != nil {
+		return nil
+	}
+	return rags
+}
+
+//鍒ゆ柇澶氳竟褰㈡槸鍚﹀湪瑙勫垯璁剧疆涓鍦ㄤ娇鐢�
+func (rga CameraRuleGroupArg) IsPolygonInUse(polygonId string) bool {
+	var rules []CameraRuleGroupArg
+	if err := db.Table(rga.TableName()).Where("polygon_id=?", polygonId).Find(&rules).Error; err != nil {
+		return true
+	}
+	if len(rules) == 0 {
+		return false
+	}
+	return true
+}
+
+func (rga CameraRuleGroupArg) ExistRunningTask(cameraId string) bool {
+	var arr []CameraRuleGroupArg
+	if err = db.Raw("select a.* from "+CameraRuleGroupArg{}.TableName()+" a join "+CameraRuleGroup{}.TableName()+" g on a.group_id=g.id where a.camera_id=? and g.enable=1",cameraId).Scan(&arr).Error;err !=nil{
+		return false
+	}
+	return len(arr) >0
+
+}
\ No newline at end of file

--
Gitblit v1.8.0