check_sysmodel_ied_func.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. package bo
  2. import (
  3. "errors"
  4. "fmt"
  5. "scd_check_tools/logger"
  6. "scd_check_tools/models/enum"
  7. "scd_check_tools/tools"
  8. "strconv"
  9. "strings"
  10. "github.com/astaxie/beego/orm"
  11. )
  12. //系统内置模型-装置功能管理
  13. type T_data_model_func_def struct {
  14. Id int `orm:"pk"`
  15. ModelId int // '模型ID' ,
  16. IedType string // '装置类型;关联代码:device_type',
  17. FuncName string // '功能名称',
  18. FuncFcdaId int `orm:"-"`
  19. FcdaName string `orm:"-"` // 端子设计名称
  20. FcdaMatchExp string `orm:"-"` // 端子匹配表达式
  21. Svorgoose string `orm:"-"`
  22. Inorout string `orm:"-"`
  23. Cr int // '创建人' ,
  24. Ct string `orm:"-"` // '创建时间' ,
  25. Ur int // '更新人' ,
  26. Ut string `orm:"-"` // '更新时间'
  27. }
  28. //内置检测模型-装置功能管理对象
  29. type SysCheckModelIedFuncMgr struct {
  30. Model T_data_model_func_def
  31. DeviceBaseModel
  32. }
  33. var sysCheckModel_iedFuncDesc = "内置检测模型-装置功能管理"
  34. func init() {
  35. orm.RegisterModel(new(T_data_model_func_def))
  36. }
  37. //保存检测模型装置功能信息
  38. func (c *SysCheckModelIedFuncMgr) Save() (err error) {
  39. dblog := new(SystemLog)
  40. dblog.SetUserInfo(c.GetUserInfo())
  41. dblog.Audittype = enum.AuditType_check_model
  42. dblog.Logtype = enum.LogType_Insert
  43. dblog.Eventtype = enum.OptEventType_Bus
  44. dblog.Eventlevel = enum.OptEventLevel_Hight
  45. db := orm.NewOrm()
  46. hasName, err := c.Exist()
  47. if err != nil {
  48. return err
  49. }
  50. if c.Model.Svorgoose != "SV" && c.Model.Svorgoose != "GOOSE" {
  51. return errors.New("端子信号类型值无效,仅支持SV或GOOSE")
  52. }
  53. if c.Model.Inorout != "接收" && c.Model.Inorout != "输出" {
  54. return errors.New("端子信号方向值无效,仅支持'接收'或'输出'")
  55. }
  56. db.Begin()
  57. if c.Model.Id > 0 {
  58. //编辑
  59. if hasName > 0 && c.Model.Id != hasName {
  60. db.Rollback()
  61. return errors.New("功能名称已存在")
  62. }
  63. _, err = db.Update(&c.Model)
  64. } else {
  65. //新增
  66. if hasName > 0 {
  67. db.Rollback()
  68. return errors.New("功能名称已存在")
  69. }
  70. newid, err2 := db.Insert(&c.Model)
  71. err = err2
  72. c.Model.Id = int(newid)
  73. }
  74. if err != nil {
  75. logger.Logger.Error(err)
  76. dblog.Description = fmt.Sprintf("保存%s信息失败:%s,操作数据:%+v", sysCheckModel_iedFuncDesc, err.Error(), c.Model)
  77. dblog.Fail2()
  78. } else {
  79. //保存功能-端子定义
  80. fcdaMgr := new(SysCheckModelIedFuncFcdaMgr)
  81. fcdaMgr.Model = T_data_model_func_fcda{ModelId: c.Model.ModelId}
  82. fcdaMgr.Model.Id = c.Model.FuncFcdaId
  83. fcdaMgr.Model.FcdaMatchExp = c.Model.FcdaMatchExp
  84. fcdaMgr.Model.FcdaName = c.Model.FcdaName
  85. fcdaMgr.Model.FuncId = c.Model.Id
  86. fcdaMgr.Model.Svorgoose = c.Model.Svorgoose
  87. fcdaMgr.Model.Inorout = c.Model.Inorout
  88. err = fcdaMgr.Save()
  89. if err != nil {
  90. db.Rollback()
  91. logger.Logger.Error(err)
  92. dblog.Description = fmt.Sprintf("保存%s信息失败:%s,操作数据:%+v", sysCheckModel_iedFuncDesc, err.Error(), c.Model)
  93. dblog.Fail2()
  94. return
  95. }
  96. db.Commit()
  97. dblog.Description = fmt.Sprintf("保存%s信息成功,操作数据:%+v", sysCheckModel_iedFuncDesc, c.Model)
  98. dblog.Success2()
  99. }
  100. return err
  101. }
  102. func (c *SysCheckModelIedFuncMgr) Exist() (int, error) {
  103. db := orm.NewOrm()
  104. if c.Model.FuncName == "" {
  105. return 0, errors.New("功能名称不能为空")
  106. }
  107. rowset := []orm.Params{}
  108. _, 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)
  109. if len(rowset) > 0 {
  110. id, _ := strconv.Atoi(tools.IsEmpty(rowset[0]["id"]))
  111. return id, nil
  112. }
  113. return 0, err
  114. }
  115. func (c *SysCheckModelIedFuncMgr) GetFuncId(modid int, iedtpye, name string) (int, error) {
  116. rowset := []orm.Params{}
  117. db := orm.NewOrm()
  118. _, 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)
  119. if len(rowset) > 0 {
  120. id, _ := strconv.Atoi(tools.IsEmpty(rowset[0]["id"]))
  121. return id, nil
  122. }
  123. return 0, err
  124. }
  125. func (c *SysCheckModelIedFuncMgr) Copy(oldModelid, newModelId int) error {
  126. db := orm.NewOrm()
  127. //将原端子关联数据复制到新模型
  128. _, 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()
  129. if err != nil {
  130. logger.Logger.Error(err)
  131. return err
  132. }
  133. rowset := []orm.Params{}
  134. db.Raw("select * from t_data_model_func_def where model_id=?", oldModelid).Values(&rowset)
  135. for _, row := range rowset {
  136. oldFuncId, _ := strconv.Atoi(tools.IsEmpty(row["id"]))
  137. //复制功能数据
  138. newFunc := T_data_model_func_def{
  139. ModelId: newModelId,
  140. IedType: tools.IsEmpty(row["ied_type"]),
  141. FuncName: tools.IsEmpty(row["func_name"]),
  142. }
  143. newid, err := db.Insert(&newFunc)
  144. if err != nil {
  145. logger.Logger.Error(err)
  146. return err
  147. }
  148. //复制功能下的端子信息
  149. m1 := new(SysCheckModelIedFuncFcdaMgr)
  150. m1.Model = T_data_model_func_fcda{ModelId: oldModelid}
  151. err = m1.Copy(oldFuncId, newModelId, int(newid))
  152. if err != nil {
  153. newFunc.Id = int(newid)
  154. db.Delete(&newFunc)
  155. return err
  156. }
  157. }
  158. return nil
  159. }
  160. //根据model中指定的id删除
  161. //onlyFunc: true表示只删除功能数据,不进行关联端子删除;false表示需要关联删除端子。默认为关联删除端子
  162. func (c *SysCheckModelIedFuncMgr) Delete(onlyFunc ...bool) (err error) {
  163. dblog := new(SystemLog)
  164. dblog.SetUserInfo(c.GetUserInfo())
  165. dblog.Audittype = enum.AuditType_check_model
  166. dblog.Logtype = enum.LogType_Delete
  167. dblog.Eventtype = enum.OptEventType_Bus
  168. dblog.Eventlevel = enum.OptEventLevel_Hight
  169. db := orm.NewOrm()
  170. funcLst := []orm.Params{}
  171. if c.Model.Id > 0 {
  172. _, err = db.Raw("delete from t_data_model_func_def where id=?", c.Model.Id).Exec()
  173. } else if c.Model.IedType != "" {
  174. //删除指定装置类型的数据
  175. db.Raw("select id from t_data_model_func_def where model_id=? and ied_type=?", c.Model.ModelId, c.Model.IedType).Values(&funcLst)
  176. _, err = db.Raw("delete from t_data_model_func_def where model_id=? and ied_type=?", c.Model.ModelId, c.Model.IedType).Exec()
  177. } else {
  178. _, err = db.Raw("delete from t_data_model_func_def where model_id=?", c.Model.ModelId).Exec()
  179. }
  180. if err != nil {
  181. logger.Logger.Error(err)
  182. dblog.Description = fmt.Sprintf("删除%s(%d)失败:%s", sysCheckModel_iedFuncDesc, c.Model.ModelId, err.Error())
  183. dblog.Fail2()
  184. } else {
  185. isnotdelFcda := false
  186. if len(onlyFunc) > 0 {
  187. isnotdelFcda = onlyFunc[0]
  188. }
  189. if !isnotdelFcda {
  190. fcdaMgr := new(SysCheckModelIedFuncFcdaMgr)
  191. fcdaMgr.Model = T_data_model_func_fcda{ModelId: c.Model.ModelId}
  192. if c.Model.Id > 0 {
  193. fcdaMgr.Model.FuncId = c.Model.Id
  194. }
  195. if c.Model.IedType != "" {
  196. //删除所有功能的相关数据
  197. for _, row := range funcLst {
  198. fcdaMgr.Model.FuncId, _ = strconv.Atoi(tools.IsEmpty(row["id"]))
  199. fcdaMgr.Delete()
  200. }
  201. } else {
  202. fcdaMgr.Delete()
  203. }
  204. }
  205. dblog.Description = fmt.Sprintf("删除%s(%d)成功", sysCheckModel_iedFuncDesc, c.Model.ModelId)
  206. dblog.Success2()
  207. }
  208. return err
  209. }
  210. func (c *SysCheckModelIedFuncMgr) GetList(modelid int, iedType string) ([]orm.Params, error) {
  211. o := orm.NewOrm()
  212. sqlParamters := []interface{}{modelid, iedType}
  213. sql := "select t.* from t_data_model_func_def t where t.model_id=? and ied_type=?"
  214. rowset := []orm.Params{}
  215. _, err := o.Raw(sql, sqlParamters).Values(&rowset)
  216. if err != nil {
  217. logger.Logger.Error(err)
  218. }
  219. return rowset, err
  220. }
  221. //从excel中导入
  222. func (c *SysCheckModelIedFuncMgr) Imp(param map[string]interface{}) (bool, error) {
  223. modelId, _ := strconv.Atoi(tools.IsEmpty(param["model_id"]))
  224. if modelId == 0 {
  225. return false, errors.New("模型编号不能为空")
  226. }
  227. datalist := param["datalist"].([]map[int]string)
  228. logObj := new(SystemLog)
  229. logObj.SetUserInfo(c.GetUserInfo())
  230. logObj.Audittype = enum.AuditType_check_model
  231. logObj.Eventtype = enum.OptEventType_Bus
  232. logObj.Eventlevel = enum.OptEventLevel_Hight
  233. logObj.Logtype = enum.LogType_imp
  234. logObj.Description = "装置功能及端子导入"
  235. //模型信息
  236. modelObj := new(SysCheckModelMgr)
  237. modelObj.Model.Id = modelId
  238. modelInfo, dberr := modelObj.One()
  239. if modelInfo.Id == 0 || dberr != nil {
  240. return false, errors.New(fmt.Sprintf("无效的模型编号:%d", modelId))
  241. }
  242. modelInfoIedTypes := "," + tools.IsEmpty(modelInfo.IedTypes) + ","
  243. i := 2
  244. func_id := 0
  245. fcda_id := 0
  246. funcMap := map[string]int{} //已处理的功能
  247. fcdaMap := map[string]int{}
  248. fcdaMgr := new(SysCheckModelIedFuncFcdaMgr)
  249. fcdaMgr.Model.ModelId = modelId
  250. for _, row := range datalist {
  251. ied_type := tools.IsEmpty(row[2])
  252. if ied_type == "" {
  253. return false, errors.New(fmt.Sprintf("第%d行:装置类型编码不能为空", i))
  254. }
  255. if !strings.Contains(modelInfoIedTypes, ","+ied_type+",") {
  256. //模型中未发现该装置类型
  257. continue
  258. }
  259. func_name := tools.IsEmpty(row[3])
  260. if func_name == "" {
  261. return false, errors.New(fmt.Sprintf("第%d行:功能名称不能为空", i))
  262. }
  263. fcda_name := strings.ReplaceAll(strings.ReplaceAll(tools.IsEmpty(row[4]), "(", "("), ")", ")")
  264. if fcda_name == "" {
  265. return false, errors.New(fmt.Sprintf("第%d行:端子设计名称不能为空", i))
  266. }
  267. fcda_match_exp := strings.ReplaceAll(strings.ReplaceAll(tools.IsEmpty(row[5]), "(", "("), ")", ")")
  268. if fcda_match_exp == "" {
  269. return false, errors.New(fmt.Sprintf("第%d行:端子关键词不能为空", i))
  270. }
  271. svorgoose := tools.IsEmpty(row[6])
  272. if svorgoose == "" {
  273. return false, errors.New(fmt.Sprintf("第%d行:信号类型不能为空", i))
  274. }
  275. inorout := tools.IsEmpty(row[7])
  276. if inorout == "" {
  277. return false, errors.New(fmt.Sprintf("第%d行:信号方向不能为空", i))
  278. }
  279. funckey := fmt.Sprintf("%d%s%s", modelId, ied_type, func_name)
  280. func_id = funcMap[funckey]
  281. if func_id == 0 {
  282. //获取功能id
  283. func_id, _ = c.GetFuncId(modelId, ied_type, func_name)
  284. funcMap[funckey] = func_id
  285. }
  286. if func_id > 0 {
  287. fcdaKey := fmt.Sprintf("%d%s", func_id, fcda_name)
  288. fcda_id = fcdaMap[fcdaKey]
  289. if fcda_id == 0 {
  290. fcdaMgr.Model.FuncId = func_id
  291. fcdaMgr.Model.FcdaName = fcda_name
  292. _, fcda_id, _ := fcdaMgr.Exist()
  293. fcdaMap[fcdaKey] = fcda_id
  294. }
  295. }
  296. mod := T_data_model_func_def{}
  297. mod.Id = func_id
  298. mod.ModelId = modelId
  299. mod.IedType = ied_type
  300. mod.FuncFcdaId = fcda_id
  301. mod.FuncName = func_name
  302. mod.FcdaName = fcda_name
  303. mod.FcdaMatchExp = fcda_match_exp
  304. mod.Svorgoose = svorgoose
  305. mod.Inorout = inorout
  306. c.Model = mod
  307. err := c.Save()
  308. if err != nil {
  309. return false, errors.New(fmt.Sprintf("第%d行:%s", i, err.Error()))
  310. }
  311. i = i + 1
  312. }
  313. return true, nil
  314. }