package models import ( "basic.com/pubsub/protomsg.git" "basic.com/valib/logger.git" "encoding/json" "regexp" ) type CameraPolygon struct { Id string `gorm:"primary_key;column:id" json:"id"` CameraId string `gorm:"column:camera_id" json:"camera_id"` //摄像机id 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" //面 CAMERAPOLYGON_AREA_ALL = "全部区域" ) //坐标定义 //type Point struct { // X float32 `json:"x"` // Y float32 `json:"y"` //} func (CameraPolygon) TableName() string { return "camera_polygon" } func (cp *CameraPolygon) FindAll() (polygons []CameraPolygon) { 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) polygons := cp.FindAll() 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) FindAllByCameraId(cameraId string) (polygons []CameraPolygon, err error) { if err := db.Table("camera_polygon").Where("camera_id = ?", cameraId).Scan(&polygons).Error;err !=nil { return nil, err } return polygons,nil } //FindByCameraId 根据摄像机id查找在规则中使用的多边形 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 { return nil, err } 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 } 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) 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 { return false } var crg CameraRuleGroup groups := crg.FindGroupByPolygonId(id) if groups != nil { for _,g :=range groups { //将groupText中的已删除的多边形名称替换为NULL reg := regexp.MustCompile(`(`+name+`于)`) newGText := reg.ReplaceAllString(g.GroupText, `NULL于`) 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) } 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{ return false } 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{ return false } if result.RowsAffected>0{ return true } else { return false } }