123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- package bo
- import (
- "errors"
- "fmt"
- "scd_check_tools/logger"
- "scd_check_tools/models/enum"
- "scd_check_tools/tools"
- "strconv"
- "strings"
- "github.com/astaxie/beego/orm"
- )
- //系统内置模型-装置功能管理
- type T_data_model_func_def struct {
- Id int `orm:"pk"`
- ModelId int // '模型ID' ,
- IedType string // '装置类型;关联代码:device_type',
- FuncName string // '功能名称',
- FuncFcdaId int `orm:"-"`
- FcdaName string `orm:"-"` // 端子设计名称
- FcdaMatchExp string `orm:"-"` // 端子匹配表达式
- Svorgoose string `orm:"-"`
- Inorout string `orm:"-"`
- Cr int // '创建人' ,
- Ct string `orm:"-"` // '创建时间' ,
- Ur int // '更新人' ,
- Ut string `orm:"-"` // '更新时间'
- }
- //内置检测模型-装置功能管理对象
- type SysCheckModelIedFuncMgr struct {
- Model T_data_model_func_def
- DeviceBaseModel
- }
- var sysCheckModel_iedFuncDesc = "内置检测模型-装置功能管理"
- func init() {
- orm.RegisterModel(new(T_data_model_func_def))
- }
- //保存检测模型装置功能信息
- func (c *SysCheckModelIedFuncMgr) Save() (err error) {
- 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()
- hasName, err := c.Exist()
- if err != nil {
- return err
- }
- if c.Model.Svorgoose != "SV" && c.Model.Svorgoose != "GOOSE" {
- return errors.New("端子信号类型值无效,仅支持SV或GOOSE")
- }
- if c.Model.Inorout != "接收" && c.Model.Inorout != "输出" {
- return errors.New("端子信号方向值无效,仅支持'接收'或'输出'")
- }
- db.Begin()
- if c.Model.Id > 0 {
- //编辑
- if hasName > 0 && c.Model.Id != hasName {
- db.Rollback()
- return errors.New("功能名称已存在")
- }
- _, err = db.Update(&c.Model)
- } else {
- //新增
- if hasName > 0 {
- db.Rollback()
- return errors.New("功能名称已存在")
- }
- newid, err2 := db.Insert(&c.Model)
- err = err2
- c.Model.Id = int(newid)
- }
- if err != nil {
- logger.Logger.Error(err)
- dblog.Description = fmt.Sprintf("保存%s信息失败:%s,操作数据:%+v", sysCheckModel_iedFuncDesc, err.Error(), c.Model)
- dblog.Fail2()
- } else {
- //保存功能-端子定义
- fcdaMgr := new(SysCheckModelIedFuncFcdaMgr)
- fcdaMgr.Model = T_data_model_func_fcda{ModelId: c.Model.ModelId}
- fcdaMgr.Model.Id = c.Model.FuncFcdaId
- fcdaMgr.Model.FcdaMatchExp = c.Model.FcdaMatchExp
- fcdaMgr.Model.FcdaName = c.Model.FcdaName
- fcdaMgr.Model.FuncId = c.Model.Id
- fcdaMgr.Model.Svorgoose = c.Model.Svorgoose
- fcdaMgr.Model.Inorout = c.Model.Inorout
- err = fcdaMgr.Save()
- if err != nil {
- db.Rollback()
- logger.Logger.Error(err)
- dblog.Description = fmt.Sprintf("保存%s信息失败:%s,操作数据:%+v", sysCheckModel_iedFuncDesc, err.Error(), c.Model)
- dblog.Fail2()
- return
- }
- db.Commit()
- dblog.Description = fmt.Sprintf("保存%s信息成功,操作数据:%+v", sysCheckModel_iedFuncDesc, c.Model)
- dblog.Success2()
- }
- return err
- }
- func (c *SysCheckModelIedFuncMgr) Exist() (int, error) {
- db := orm.NewOrm()
- if c.Model.FuncName == "" {
- return 0, errors.New("功能名称不能为空")
- }
- rowset := []orm.Params{}
- _, err := db.Raw("select id from t_data_model_func_def where model_id=? and ied_type=? and func_name=?", c.Model.ModelId, c.Model.IedType, c.Model.FuncName).Values(&rowset)
- if len(rowset) > 0 {
- id, _ := strconv.Atoi(tools.IsEmpty(rowset[0]["id"]))
- return id, nil
- }
- return 0, err
- }
- func (c *SysCheckModelIedFuncMgr) GetFuncId(modid int, iedtpye, name string) (int, error) {
- rowset := []orm.Params{}
- db := orm.NewOrm()
- _, err := db.Raw("select id from t_data_model_func_def where model_id=? and ied_type=? and func_name=?", modid, iedtpye, name).Values(&rowset)
- if len(rowset) > 0 {
- id, _ := strconv.Atoi(tools.IsEmpty(rowset[0]["id"]))
- return id, nil
- }
- return 0, err
- }
- func (c *SysCheckModelIedFuncMgr) Copy(oldModelid, newModelId int) error {
- db := orm.NewOrm()
- //将原端子关联数据复制到新模型
- _, err := db.Raw("insert into t_data_model_fcda_ref(model_id,relation_ref,from_ied_code,from_func_id,from_fcda_id,to_ied_code,to_func_id,to_fcda_id,goosesv) select ?,relation_ref,from_ied_code,from_func_id,from_fcda_id,to_ied_code,to_func_id,to_fcda_id,goosesv from t_data_model_fcda_ref where model_id=?", newModelId, oldModelid).Exec()
- if err != nil {
- logger.Logger.Error(err)
- return err
- }
- rowset := []orm.Params{}
- db.Raw("select * from t_data_model_func_def where model_id=?", oldModelid).Values(&rowset)
- for _, row := range rowset {
- oldFuncId, _ := strconv.Atoi(tools.IsEmpty(row["id"]))
- //复制功能数据
- newFunc := T_data_model_func_def{
- ModelId: newModelId,
- IedType: tools.IsEmpty(row["ied_type"]),
- FuncName: tools.IsEmpty(row["func_name"]),
- }
- newid, err := db.Insert(&newFunc)
- if err != nil {
- logger.Logger.Error(err)
- return err
- }
- //复制功能下的端子信息
- m1 := new(SysCheckModelIedFuncFcdaMgr)
- m1.Model = T_data_model_func_fcda{ModelId: oldModelid}
- err = m1.Copy(oldFuncId, newModelId, int(newid))
- if err != nil {
- newFunc.Id = int(newid)
- db.Delete(&newFunc)
- return err
- }
- }
- return nil
- }
- //根据model中指定的id删除
- func (c *SysCheckModelIedFuncMgr) 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()
- funcLst := []orm.Params{}
- if c.Model.Id > 0 {
- _, err = db.Raw("delete from t_data_model_func_def where id=?", c.Model.Id).Exec()
- } else if c.Model.IedType != "" {
- //删除指定装置类型的数据
- db.Raw("select id from t_data_model_func_def where model_id=? and ied_type=?", c.Model.ModelId, c.Model.IedType).Values(&funcLst)
- _, err = db.Raw("delete from t_data_model_func_def where model_id=? and ied_type=?", c.Model.ModelId, c.Model.IedType).Exec()
- } else {
- _, err = db.Raw("delete from t_data_model_func_def where model_id=?", c.Model.ModelId).Exec()
- }
- if err != nil {
- logger.Logger.Error(err)
- dblog.Description = fmt.Sprintf("删除%s(%d)失败:%s", sysCheckModel_iedFuncDesc, c.Model.ModelId, err.Error())
- dblog.Fail2()
- } else {
- fcdaMgr := new(SysCheckModelIedFuncFcdaMgr)
- fcdaMgr.Model = T_data_model_func_fcda{ModelId: c.Model.ModelId}
- if c.Model.Id > 0 {
- fcdaMgr.Model.FuncId = c.Model.Id
- }
- if c.Model.IedType != "" {
- //删除所有功能的相关数据
- for _, row := range funcLst {
- fcdaMgr.Model.FuncId, _ = strconv.Atoi(tools.IsEmpty(row["id"]))
- fcdaMgr.Delete()
- }
- } else {
- fcdaMgr.Delete()
- }
- dblog.Description = fmt.Sprintf("删除%s(%d)成功", sysCheckModel_iedFuncDesc, c.Model.ModelId)
- dblog.Success2()
- }
- return err
- }
- func (c *SysCheckModelIedFuncMgr) GetList(modelid int, iedType string) ([]orm.Params, error) {
- o := orm.NewOrm()
- sqlParamters := []interface{}{modelid, iedType}
- sql := "select t.* from t_data_model_func_def t where t.model_id=? and ied_type=?"
- rowset := []orm.Params{}
- _, err := o.Raw(sql, sqlParamters).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err)
- }
- return rowset, err
- }
- //从excel中导入
- func (c *SysCheckModelIedFuncMgr) Imp(param map[string]interface{}) (bool, error) {
- modelId, _ := strconv.Atoi(tools.IsEmpty(param["model_id"]))
- if modelId == 0 {
- return false, errors.New("模型编号不能为空")
- }
- datalist := param["datalist"].([]map[int]string)
- logObj := new(SystemLog)
- logObj.SetUserInfo(c.GetUserInfo())
- logObj.Audittype = enum.AuditType_check_model
- logObj.Eventtype = enum.OptEventType_Bus
- logObj.Eventlevel = enum.OptEventLevel_Hight
- logObj.Logtype = enum.LogType_imp
- logObj.Description = "装置功能及端子导入"
- //模型信息
- modelObj := new(SysCheckModelMgr)
- modelObj.Model.Id = modelId
- modelInfo, dberr := modelObj.One()
- if modelInfo.Id == 0 || dberr != nil {
- return false, errors.New(fmt.Sprintf("无效的模型编号:%d", modelId))
- }
- modelInfoIedTypes := "," + tools.IsEmpty(modelInfo.IedTypes) + ","
- i := 2
- func_id := 0
- fcda_id := 0
- funcMap := map[string]int{} //已处理的功能
- fcdaMap := map[string]int{}
- fcdaMgr := new(SysCheckModelIedFuncFcdaMgr)
- fcdaMgr.Model.ModelId = modelId
- for _, row := range datalist {
- ied_type := tools.IsEmpty(row[2])
- if ied_type == "" {
- return false, errors.New(fmt.Sprintf("第%d行:装置类型编码不能为空", i))
- }
- if !strings.Contains(modelInfoIedTypes, ","+ied_type+",") {
- //模型中未发现该装置类型
- continue
- }
- func_name := tools.IsEmpty(row[3])
- if func_name == "" {
- return false, errors.New(fmt.Sprintf("第%d行:功能名称不能为空", i))
- }
- fcda_name := strings.ReplaceAll(strings.ReplaceAll(tools.IsEmpty(row[4]), "(", "("), ")", ")")
- if fcda_name == "" {
- return false, errors.New(fmt.Sprintf("第%d行:端子设计名称不能为空", i))
- }
- fcda_match_exp := strings.ReplaceAll(strings.ReplaceAll(tools.IsEmpty(row[5]), "(", "("), ")", ")")
- if fcda_match_exp == "" {
- return false, errors.New(fmt.Sprintf("第%d行:端子关键词不能为空", i))
- }
- svorgoose := tools.IsEmpty(row[6])
- if svorgoose == "" {
- return false, errors.New(fmt.Sprintf("第%d行:信号类型不能为空", i))
- }
- inorout := tools.IsEmpty(row[7])
- if inorout == "" {
- return false, errors.New(fmt.Sprintf("第%d行:信号方向不能为空", i))
- }
- func_id = funcMap[func_name]
- if func_id == 0 {
- //获取功能id
- func_id, _ = c.GetFuncId(modelId, ied_type, func_name)
- funcMap[func_name] = func_id
- }
- if func_id > 0 {
- fcdaKey := fmt.Sprintf("%d%s", func_id, fcda_name)
- fcda_id = fcdaMap[fcdaKey]
- if fcda_id == 0 {
- fcdaMgr.Model.FuncId = func_id
- fcdaMgr.Model.FcdaName = fcda_name
- _, fcda_id, _ := fcdaMgr.Exist()
- fcdaMap[fcdaKey] = fcda_id
- }
- }
- mod := T_data_model_func_def{}
- mod.Id = func_id
- mod.ModelId = modelId
- mod.IedType = ied_type
- mod.FuncFcdaId = fcda_id
- mod.FuncName = func_name
- mod.FcdaName = fcda_name
- mod.FcdaMatchExp = fcda_match_exp
- mod.Svorgoose = svorgoose
- mod.Inorout = inorout
- c.Model = mod
- err := c.Save()
- if err != nil {
- return false, errors.New(fmt.Sprintf("第%d行:%s", i, err.Error()))
- }
- i = i + 1
- }
- return true, nil
- }
|