check_sysmodel_ied_func.go 9.7 KB

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