package bo import ( "fmt" "scd_check_tools/logger" "scd_check_tools/models/enum" "scd_check_tools/tools" "strconv" "sync" "github.com/astaxie/beego/orm" ) //系统内置模型-装置关系 type T_data_model_relation_def struct { Id int `orm:"pk"` ModelId int // '模型ID' , FromIedCode string // '装置类型1;关联代码:device_type', FromIedName string // '装置名称1', ToIedName string // '装置名称2', ToIedCode string // '装置类型2;关联代码:device_type', InType string // '输入端子类型;SV,GOOSE', Cr int // '创建人' , Ct string `orm:"-"` // '创建时间' , Ur int // '更新人' , Ut string `orm:"-"` // '更新时间' } //内置检测模型-装置类型关系管理对象 type SysCheckModelIedRelationMgr struct { Model T_data_model_relation_def DeviceBaseModel } var sysCheckModel_iedRelationDesc = "内置检测模型-装置类型关系" var SysModelRelationList = sync.Map{} func init() { orm.RegisterModel(new(T_data_model_relation_def)) } //保存检测模型装置关系信息 func (c *SysCheckModelIedRelationMgr) Save(nodes map[string]interface{}) (err error) { if nodes == nil { return } dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_check_model dblog.Logtype = enum.LogType_Insert dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Hight db := orm.NewOrm() oldIedTypes := []orm.Params{} //原有的装置类型 db.Raw("select from_ied_code c from t_data_model_relation_def where model_id=? UNION select to_ied_code c from t_data_model_relation_def where model_id=?", c.Model.ModelId, c.Model.ModelId).Values(&oldIedTypes) _, err = db.Raw("delete from t_data_model_relation_def where model_id=?", c.Model.ModelId).Exec() if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("保存%s信息失败:%s,操作数据:%+v", sysCheckModel_iedRelationDesc, err.Error(), c.Model) dblog.Fail2() } else { tmpMap := map[string]interface{}{} for _, item2 := range nodes["nodes"].([]interface{}) { item := item2.(map[string]interface{}) tmpMap[tools.IsEmpty(item["id"])] = item } newIedTypes := map[string]string{} for _, line2 := range nodes["edges"].([]interface{}) { line := line2.(map[string]interface{}) sourceied := tools.IsEmpty(line["sourceNodeId"]) targetied := tools.IsEmpty(line["targetNodeId"]) isSv := "" if line["properties"] != nil { isSv = tools.IsEmpty(line["properties"].(map[string]interface{})["issv"]) } newm := T_data_model_relation_def{} newm.ModelId = c.Model.ModelId newm.Cr, _ = strconv.Atoi(c.GetUserId()) item := tmpMap[sourceied].(map[string]interface{}) newm.FromIedCode = tools.IsEmpty(item["properties"].(map[string]interface{})["ied_type"]) newIedTypes[newm.FromIedCode] = newm.FromIedCode if item["text"] != nil { newm.FromIedName = tools.IsEmpty(item["text"].(map[string]interface{})["value"]) } if isSv == "" { newm.InType = "GOOSE" } else { newm.InType = isSv } item = tmpMap[targetied].(map[string]interface{}) newm.ToIedCode = tools.IsEmpty(item["properties"].(map[string]interface{})["ied_type"]) newIedTypes[newm.ToIedCode] = newm.ToIedCode if item["text"] != nil { newm.ToIedName = tools.IsEmpty(item["text"].(map[string]interface{})["value"]) } _, err = db.Insert(&newm) if err != nil { logger.Logger.Error(err) return err } } SysModelRelationList.Delete(c.Model.ModelId) if len(oldIedTypes) > 0 { s1 := new(SysCheckModelIedFuncMgr) s1.SetUserInfo(c.GetUserInfo()) s1.Model = T_data_model_func_def{ModelId: c.Model.ModelId} //找出其中进行了删除的装置类型 for _, item := range oldIedTypes { t := tools.IsEmpty(item["c"]) if newIedTypes[t] == "" { //删除当前装置类型数据 s1.Model.IedType = t s1.Delete() } } } dblog.Description = fmt.Sprintf("保存%s信息成功,操作数据:%+v", sysCheckModel_iedRelationDesc, c.Model) dblog.Success2() } return err } //根据model中指定的id删除 func (c *SysCheckModelIedRelationMgr) Delete() (err error) { dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_check_model dblog.Logtype = enum.LogType_Delete dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Hight db := orm.NewOrm() _, err = db.Raw("delete from t_data_model_relation_def where model_id=?", c.Model.ModelId).Exec() if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("删除%s(%d)失败:%s", sysCheckModel_iedRelationDesc, c.Model.ModelId, err.Error()) dblog.Fail2() } else { SysModelRelationList.Delete(c.Model.ModelId) dblog.Description = fmt.Sprintf("删除%s(%d)成功", sysCheckModel_iedRelationDesc, c.Model.ModelId) dblog.Success2() } return err } //复制模型 func (c *SysCheckModelIedRelationMgr) Copy(newModelId int) (error, int) { dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_check_model dblog.Logtype = enum.LogType_Query dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Low o := orm.NewOrm() sql := "insert into t_data_model_relation_def(model_id,custem_model_id,from_ied_code,from_ied_name,to_ied_name,to_ied_code,in_type) select ?,custem_model_id,from_ied_code,from_ied_name,to_ied_name,to_ied_code,in_type from t_data_model_relation_def where model_id=?" r, err := o.Raw(sql, newModelId, c.Model.ModelId).Exec() if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("复制%s(%d)失败:%s", sysCheckModel_iedRelationDesc, newModelId, err.Error()) dblog.Fail2() return err, 0 } else { dblog.Description = fmt.Sprintf("复制%s(%d)成功", sysCheckModel_iedRelationDesc, newModelId) dblog.Success2() id, _ := r.LastInsertId() return nil, int(id) } return nil, 0 } //获取指定电压等级下的所有模型 func (c *SysCheckModelIedRelationMgr) GetListByModelid(modelid int) ([]orm.Params, error) { if v, h := SysModelRelationList.Load(modelid); h { return v.([]orm.Params), nil } o := orm.NewOrm() sqlParamters := []interface{}{modelid} sql := "select t.* from t_data_model_relation_def t where t.model_id=?" rowset := []orm.Params{} _, err := o.Raw(sql, sqlParamters).Values(&rowset) if err != nil { logger.Logger.Error(err) } else { SysModelRelationList.Store(modelid, rowset) } return rowset, err }