package models import ( "strings" "time" "basic.com/pubsub/protomsg.git" "basic.com/valib/logger.git" ) const ( RecordNotFound = "record not found" ) type Sdk struct { Id string `gorm:"column:id;primary_key" json:"id"` IpcId string `gorm:"column:ipc_id" json:"ipc_id"` //真正的算法id(对于yolo来说,只创建一个ipc) SdkType string `gorm:"column:sdk_type" json:"sdk_type"` //人脸检测:FaceDetect,人脸提取:FaceExtract,人脸比对:FaceCompare,行为:Yolo SdkName string `gorm:"column:sdk_name" json:"sdk_name" example:"人脸检测"` //算法名称 Icon string `gorm:"column:icon" json:"icon"` //算法图标 Url string `gorm:"column:url" json:"url" example:"http://ip:port/govideo/sdk/1"` //算法下载地址 CreateTime string `gorm:"column:create_time" json:"create_time"` CreateBy string `gorm:"column:create_by" json:"create_by"` UpdateTime string `gorm:"column:update_time" json:"update_time"` Enable bool `gorm:"column:enable;default:1" json:"enable"` //是否启用 DelFlag int `gorm:"column:del_flag;default:0" json:"del_flag"` //逻辑删除 IconBlob string `gorm:"column:iconBlob;type:text;" json:"iconBlob"` //图片 IconBlob2 string `gorm:"column:iconBlob2;type:text;" json:"iconBlob2"` //第二套图片 Version string `gorm:"column:version;type:varchar(50);default:'1.0.0';" json:"version"` //版本号 EnTrack bool `gorm:"column:enTrack;default:1" json:"enTrack"` //是否开启跟踪 ArgDef string `gorm:"column:argDef" json:"argDef"` //算法参数默认配置 RuleSo string `gorm:"column:rule_so" json:"rule_so"` //规则用的so名称 AuthState3rd int `gorm:"column:authState3rd;default:0" json:"authState3rd"` //第三方授权状态 0:未授权,1:已授权,2:已过期 MacCode3rd string `gorm:"column:macCode3rd" json:"macCode3rd"` //第三方生成的机器码 License3rd string `gorm:"column:license3rd" json:"license3rd"` //第三方授权码 Expire3rd string `gorm:"column:expire3rd" json:"expire3rd"` //过期时间 BaseVersion string `gorm:"column:baseVersion" json:"baseVersion"` //基础算法版本 Price float32 `json:"price"` //商城端价格 ActivateCode string `gorm:"column:activateCode" json:"activateCode"` // 激活码 } const ( AuthState3rd_UnAuth = 0 AuthState3rd_Authed = 1 AuthState3rd_expired = 2 ) func (sdk Sdk) Copy2ProtoSdk() protomsg.Sdk { return protomsg.Sdk{ Id: sdk.Id, IpcId: sdk.IpcId, SdkType: sdk.SdkType, SdkName: sdk.SdkName, Icon: sdk.Icon, Url: sdk.Url, CreateTime: sdk.CreateTime, UpdateTime: sdk.UpdateTime, CreateBy: sdk.CreateBy, Enable: sdk.Enable, DelFlag: int32(sdk.DelFlag), IconBlob: sdk.IconBlob, IconBlob2: sdk.IconBlob2, Version: sdk.Version, EnTrack: sdk.EnTrack, ArgDef: sdk.ArgDef, RuleSo: sdk.RuleSo, } } func (Sdk) TableName() string { return "sdks" } // 根据算法id查找算法信息 func (sdk *Sdk) SelectById(id string) (rows int64, err error) { dbSelect := db.Table("sdks").Where("id=?", id).First(&sdk) if dbSelect.Error != nil && dbSelect.Error.Error() != RecordNotFound { return 0, dbSelect.Error } return dbSelect.RowsAffected, nil } func (sdk *Sdk) SelectBySdkType(sdkType string) (exist bool, model Sdk) { dbSelect := db.Table("sdks").Where("sdk_type=?", sdkType).First(&model) if dbSelect.Error != nil || dbSelect.RowsAffected == 0 { return false, model } return dbSelect.RecordNotFound(), model } //查找所有算法 func (sdk *Sdk) FindAll(name string) (rows []Sdk, err error) { t := time.Now() defer func() { logger.Debugf("FindAll costTime=%v, name=%v", time.Since(t), name) }() if name != "" { if err := db.Table("sdks").Where("sdk_name like ?", name).Order("sdk_name asc").Find(&rows).Error; err != nil { logger.Debug("err: ", err) return nil, err } return rows, nil } else { if err := db.Table("sdks").Order("sdk_name asc").Find(&rows).Error; err != nil { logger.Debug("err: ", err) return nil, err } return rows, nil } } func (sdk *Sdk) FindAllMap() map[string]Sdk { m := make(map[string]Sdk) rows, e := sdk.FindAll("") if e == nil && rows != nil { for _, r := range rows { m[r.Id] = r } } return m } //根据任务id查找所有的算法 func (sdk *Sdk) FindByTaskId(taskId string) (sdks []Sdk, err error) { if err := db.Raw("select * from sdks where id in (select sdkid from task_sdks where taskid=? order by sort asc)", taskId).Scan(&sdks).Error; err != nil { return sdks, err } return sdks, nil } // 算法插入 func (sdk *Sdk) Insert() (err error) { tx := db.Table("sdks").Begin() if tx.Error != nil { return tx.Error } if err := tx.Create(&sdk).Error; err != nil { tx.Rollback() return err } err = tx.Commit().Error if err == nil { return nil } return err } //算法更新 func (sdk *Sdk) Update() (result bool, err error) { dbSdk := Sdk{} rows, err := dbSdk.SelectById(sdk.Id) if err != nil { return false, err } if rows == 0 { return false, err //数据库这条记录不存在 } if err := db.Table(sdk.TableName()).Where("id=?", sdk.Id).Update(&sdk).Error; err != nil { return false, err } return true, nil } func (sdk *Sdk) UpdateCode(sdkId, code string) (err error) { if err := db.Table(sdk.TableName()).Where("id=?", sdkId).Update("activateCode", code).Error; err != nil { return err } return nil } func (sdk *Sdk) DeleteById(id string) (result bool) { //删除算法需要关联删除所有与算法相关的任务信息 updateResult := db.Exec("delete from sdks where id=?", id) if updateResult.Error != nil || updateResult.RowsAffected == 0 { return false } return true } //根据参数范围获取算法参数列表 func (sdk *Sdk) GetSdkArgs(sdkId string, scope string) []SdkArg { var sdkArgEntity SdkArgEntity argArr := make([]SdkArg, 0) if sdkArgs, err := sdkArgEntity.FindBySdk(sdkId); err == nil { for _, argEntity := range sdkArgs { if strings.Contains(argEntity.Scope, scope) { argArr = append(argArr, SdkArg{ Alias: argEntity.Alias, Name: argEntity.Name, Type: argEntity.Type, Must: argEntity.Must, Range: argEntity.Range, DefaultValue: argEntity.DefaultValue, DefaultOperator: argEntity.DefaultOperator, Sort: argEntity.Sort, Unit: argEntity.Unit, ArgType: argEntity.ArgType, }) } } } return argArr } func (sdk *Sdk) Update3rdLicense(sdkId string, lce3rd string, state3rd int) bool { updateResult := db.Exec("update "+sdk.TableName()+" set license3rd=?,authState3rd=? where id=?", lce3rd, state3rd, sdkId) if updateResult.Error != nil || updateResult.RowsAffected == 0 { return false } return true }