check_sysmodel_ied_func.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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. func (c *SysCheckModelIedFuncMgr) Delete() (err error) {
  162. dblog := new(SystemLog)
  163. dblog.SetUserInfo(c.GetUserInfo())
  164. dblog.Audittype = enum.AuditType_check_model
  165. dblog.Logtype = enum.LogType_Delete
  166. dblog.Eventtype = enum.OptEventType_Bus
  167. dblog.Eventlevel = enum.OptEventLevel_Hight
  168. db := orm.NewOrm()
  169. funcLst := []orm.Params{}
  170. if c.Model.Id > 0 {
  171. _, err = db.Raw("delete from t_data_model_func_def where id=?", c.Model.Id).Exec()
  172. } else if c.Model.IedType != "" {
  173. //删除指定装置类型的数据
  174. db.Raw("select id from t_data_model_func_def where model_id=? and ied_type=?", c.Model.ModelId, c.Model.IedType).Values(&funcLst)
  175. _, err = db.Raw("delete from t_data_model_func_def where model_id=? and ied_type=?", c.Model.ModelId, c.Model.IedType).Exec()
  176. } else {
  177. _, err = db.Raw("delete from t_data_model_func_def where model_id=?", c.Model.ModelId).Exec()
  178. }
  179. if err != nil {
  180. logger.Logger.Error(err)
  181. dblog.Description = fmt.Sprintf("删除%s(%d)失败:%s", sysCheckModel_iedFuncDesc, c.Model.ModelId, err.Error())
  182. dblog.Fail2()
  183. } else {
  184. fcdaMgr := new(SysCheckModelIedFuncFcdaMgr)
  185. fcdaMgr.Model = T_data_model_func_fcda{ModelId: c.Model.ModelId}
  186. if c.Model.Id > 0 {
  187. fcdaMgr.Model.FuncId = c.Model.Id
  188. }
  189. if c.Model.IedType != "" {
  190. //删除所有功能的相关数据
  191. for _, row := range funcLst {
  192. fcdaMgr.Model.FuncId, _ = strconv.Atoi(tools.IsEmpty(row["id"]))
  193. fcdaMgr.Delete()
  194. }
  195. } else {
  196. fcdaMgr.Delete()
  197. }
  198. dblog.Description = fmt.Sprintf("删除%s(%d)成功", sysCheckModel_iedFuncDesc, c.Model.ModelId)
  199. dblog.Success2()
  200. }
  201. return err
  202. }
  203. func (c *SysCheckModelIedFuncMgr) GetList(modelid int, iedType string) ([]orm.Params, error) {
  204. o := orm.NewOrm()
  205. sqlParamters := []interface{}{modelid, iedType}
  206. sql := "select t.* from t_data_model_func_def t where t.model_id=? and ied_type=?"
  207. rowset := []orm.Params{}
  208. _, err := o.Raw(sql, sqlParamters).Values(&rowset)
  209. if err != nil {
  210. logger.Logger.Error(err)
  211. }
  212. return rowset, err
  213. }
  214. //从excel中导入
  215. func (c *SysCheckModelIedFuncMgr) Imp(param map[string]interface{}) (bool, error) {
  216. modelId, _ := strconv.Atoi(tools.IsEmpty(param["model_id"]))
  217. if modelId == 0 {
  218. return false, errors.New("模型编号不能为空")
  219. }
  220. datalist := param["datalist"].([]map[int]string)
  221. logObj := new(SystemLog)
  222. logObj.SetUserInfo(c.GetUserInfo())
  223. logObj.Audittype = enum.AuditType_check_model
  224. logObj.Eventtype = enum.OptEventType_Bus
  225. logObj.Eventlevel = enum.OptEventLevel_Hight
  226. logObj.Logtype = enum.LogType_imp
  227. logObj.Description = "装置功能及端子导入"
  228. //模型信息
  229. modelObj := new(SysCheckModelMgr)
  230. modelObj.Model.Id = modelId
  231. modelInfo, dberr := modelObj.One()
  232. if modelInfo.Id == 0 || dberr != nil {
  233. return false, errors.New(fmt.Sprintf("无效的模型编号:%d", modelId))
  234. }
  235. modelInfoIedTypes := "," + tools.IsEmpty(modelInfo.IedTypes) + ","
  236. i := 2
  237. func_id := 0
  238. fcda_id := 0
  239. funcMap := map[string]int{} //已处理的功能
  240. fcdaMap := map[string]int{}
  241. fcdaMgr := new(SysCheckModelIedFuncFcdaMgr)
  242. fcdaMgr.Model.ModelId = modelId
  243. for _, row := range datalist {
  244. ied_type := tools.IsEmpty(row[2])
  245. if ied_type == "" {
  246. return false, errors.New(fmt.Sprintf("第%d行:装置类型编码不能为空", i))
  247. }
  248. if !strings.Contains(modelInfoIedTypes, ","+ied_type+",") {
  249. //模型中未发现该装置类型
  250. continue
  251. }
  252. func_name := tools.IsEmpty(row[3])
  253. if func_name == "" {
  254. return false, errors.New(fmt.Sprintf("第%d行:功能名称不能为空", i))
  255. }
  256. fcda_name := strings.ReplaceAll(strings.ReplaceAll(tools.IsEmpty(row[4]), "(", "("), ")", ")")
  257. if fcda_name == "" {
  258. return false, errors.New(fmt.Sprintf("第%d行:端子设计名称不能为空", i))
  259. }
  260. fcda_match_exp := strings.ReplaceAll(strings.ReplaceAll(tools.IsEmpty(row[5]), "(", "("), ")", ")")
  261. if fcda_match_exp == "" {
  262. return false, errors.New(fmt.Sprintf("第%d行:端子关键词不能为空", i))
  263. }
  264. svorgoose := tools.IsEmpty(row[6])
  265. if svorgoose == "" {
  266. return false, errors.New(fmt.Sprintf("第%d行:信号类型不能为空", i))
  267. }
  268. inorout := tools.IsEmpty(row[7])
  269. if inorout == "" {
  270. return false, errors.New(fmt.Sprintf("第%d行:信号方向不能为空", i))
  271. }
  272. func_id = funcMap[func_name]
  273. if func_id == 0 {
  274. //获取功能id
  275. func_id, _ = c.GetFuncId(modelId, ied_type, func_name)
  276. funcMap[func_name] = func_id
  277. }
  278. if func_id > 0 {
  279. fcdaKey := fmt.Sprintf("%d%s", func_id, fcda_name)
  280. fcda_id = fcdaMap[fcdaKey]
  281. if fcda_id == 0 {
  282. fcdaMgr.Model.FuncId = func_id
  283. fcdaMgr.Model.FcdaName = fcda_name
  284. _, fcda_id, _ := fcdaMgr.Exist()
  285. fcdaMap[fcdaKey] = fcda_id
  286. }
  287. }
  288. mod := T_data_model_func_def{}
  289. mod.Id = func_id
  290. mod.ModelId = modelId
  291. mod.IedType = ied_type
  292. mod.FuncFcdaId = fcda_id
  293. mod.FuncName = func_name
  294. mod.FcdaName = fcda_name
  295. mod.FcdaMatchExp = fcda_match_exp
  296. mod.Svorgoose = svorgoose
  297. mod.Inorout = inorout
  298. c.Model = mod
  299. err := c.Save()
  300. if err != nil {
  301. return false, errors.New(fmt.Sprintf("第%d行:%s", i, err.Error()))
  302. }
  303. i = i + 1
  304. }
  305. return true, nil
  306. }