check_sysmodel_ied_func.go 12 KB

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