package models import ( "basic.com/valib/logger.git" "regexp" "strings" ) 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, force bool) bool { var crg CameraRuleGroup groups := crg.FindGroupByPolygonId(id) if !force && len(groups) > 0 { return false } if err := db.Table("camera_polygon").Where("id=?", id).Delete(&CameraPolygon{}).Error; err != nil { return false } if len(groups) > 0 { 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_rule_group_arg set polygon_id='' where polygon_id=?", id).Error if err != nil { logger.Debug("rm polygon_id in camera_rule_group_arg 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 } } func (cp *CameraPolygon) DeleteByIds(ids []string) bool { str := "" for _, id := range ids { str += "'" + id + "'," } str = strings.TrimRight(str, ",") if str == "" { return false } result := db.Exec("delete from " + cp.TableName() + " where id in (" + str + ")") return result.RowsAffected > 0 }