alarm_device_service.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. package service
  2. //告警设备配置服务类
  3. import (
  4. "fmt"
  5. "github.com/astaxie/beego/orm"
  6. "rtzh_elec_temperature/enum"
  7. "rtzh_elec_temperature/logger"
  8. "rtzh_elec_temperature/models/bo"
  9. "rtzh_elec_temperature/rtelec_app_public_lib/models"
  10. "rtzh_elec_temperature/tools"
  11. "strconv"
  12. "sync"
  13. )
  14. var deviceTactics = sync.Map{}
  15. var aloneTactics = sync.Map{}
  16. type AlarmDeviceService struct {
  17. BaseService
  18. }
  19. // 根据设备id获取设备和设备的测点配置的策略
  20. func (t *AlarmDeviceService) GetDeviceTactics(deviceid int64, pageindex int, pagesize int) ([]map[string]interface{}, error) {
  21. // 通过deviceid从iss库中获取设备下的测点
  22. ds := new(DeviceService)
  23. deviceMpList, _, err := ds.DeviceMpList(int32(deviceid), pageindex, pagesize)
  24. if err != nil {
  25. logger.Logger.Error(err)
  26. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  27. return nil, err
  28. }
  29. // 根据设备的测点,查询出这个测点使用的标准策略
  30. db := orm.NewOrm()
  31. var absSql = "SELECT a.id,t.alarm_type,a.strategy_name,a.mod_id,t.attrname,a.threshold FROM t_base_alarm_mplist t,t_base_absolute_alarm a WHERE t.fk_id = a.id AND t.alarm_type = 1 AND a.mod_id = t.mod_id AND t.mod_id = ? AND t.attrname =?"
  32. var riseSql = "SELECT a.id,t.alarm_type,a.strategy_name,a.mod_id,t.attrname,a.upcycle,a.scope threshold FROM t_base_alarm_mplist t,t_base_rise_alarm a WHERE t.fk_id = a.id AND t.alarm_type = 2 AND a.mod_id = t.mod_id AND t.mod_id = ? AND t.attrname =?"
  33. lst := []map[string]interface{}{}
  34. aloneLst := []orm.Params{}
  35. for _, row := range deviceMpList {
  36. tacticsObjs := []orm.Params{}
  37. obj := map[string]interface{}{}
  38. attrname := fmt.Sprint(row["attrname"])
  39. mpname := fmt.Sprint(row["mpname"])
  40. modid, err := strconv.ParseInt(fmt.Sprint(row["modelid"]), 10, 64)
  41. mpid, err := strconv.ParseInt(fmt.Sprint(row["mpid"]), 10, 64)
  42. if err != nil {
  43. logger.Logger.Error(err)
  44. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  45. return nil, err
  46. }
  47. abs := []orm.Params{}
  48. rise := []orm.Params{}
  49. _, err = db.Raw(absSql, modid, attrname).Values(&abs)
  50. if err != nil {
  51. logger.Logger.Error(err)
  52. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  53. return nil, err
  54. }
  55. tacticsObjs = append(tacticsObjs, abs...)
  56. _, err = db.Raw(riseSql, modid, attrname).Values(&rise)
  57. if err != nil {
  58. logger.Logger.Error(err)
  59. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  60. return nil, err
  61. }
  62. tacticsObjs = append(tacticsObjs, rise...)
  63. obj["attrname"] = row["attrname"]
  64. obj["mpname"] = mpname
  65. obj["mpid"] = tools.IsEmpty(mpid)
  66. obj["mod_id"] = tools.IsEmpty(modid)
  67. obj["clientId"] = ""
  68. obj["tacticsList"] = tacticsObjs
  69. // 查询设备下这个测点的独立配置
  70. // 组装独立配置
  71. aloneAbs, err := t.GetAbsAloneList(deviceid, mpid)
  72. if err != nil {
  73. logger.Logger.Error(err)
  74. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  75. return nil, err
  76. }
  77. aloneLst = append(aloneLst, aloneAbs...)
  78. aloneRise, err := t.GetRiseAloneList(deviceid, mpid)
  79. if err != nil {
  80. logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
  81. return nil, err
  82. }
  83. aloneLst = append(aloneLst, aloneRise...)
  84. obj["aloneList"] = aloneLst
  85. lst = append(lst, obj)
  86. }
  87. return lst, nil
  88. }
  89. // 获取绝对值告警独立配置的列表
  90. func (t *AlarmDeviceService) GetAbsAloneList(deviceid int64, mpid int64) ([]orm.Params, error) {
  91. db := orm.NewOrm()
  92. var aloneAbsSql = "SELECT a.id,a.alarm_type,b.strategy_name,b.mod_id,a.attrname,a.threshold FROM t_base_absolute_alarm b,t_base_alone_alarm a WHERE a.alarm_id = b.id and a.deviceid=? and a.mpid=?"
  93. lst := []orm.Params{}
  94. _, err := db.Raw(aloneAbsSql, deviceid, mpid).Values(&lst)
  95. if err != nil {
  96. logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
  97. return nil, err
  98. }
  99. return lst, nil
  100. }
  101. // 获取升温告警独立配置的列表
  102. func (t *AlarmDeviceService) GetRiseAloneList(deviceid int64, mpid int64) ([]orm.Params, error) {
  103. db := orm.NewOrm()
  104. var aloneRiseSql = "SELECT a.id,a.alarm_type,b.strategy_name,b.mod_id,a.attrname,b.upcycle,b.scope threshold FROM t_base_rise_alarm b,t_base_alone_alarm a WHERE a.alarm_id = b.id and a.deviceid=? and a.mpid=?"
  105. lst := []orm.Params{}
  106. _, err := db.Raw(aloneRiseSql, deviceid, mpid).Values(&lst)
  107. if err != nil {
  108. logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
  109. return nil, err
  110. }
  111. return lst, nil
  112. }
  113. // 为测点的一个告警策略添加独立的告警阈值
  114. func (t *AlarmDeviceService) InsertAloneDeviceTactics(obj models.T_base_alone_alarm) error {
  115. db := orm.NewOrm()
  116. _, err := db.Insert(&obj)
  117. if err != nil {
  118. logger.Logger.Error(err)
  119. logger.Logger.Println(fmt.Sprintf("Error is:%s", err.Error()))
  120. new(bo.SystemLog).Fail(enum.Alone_Alarm_Value,
  121. enum.LogType_Insert,
  122. enum.OptEventType_Bus,
  123. enum.OptEventLevel_Hight,
  124. fmt.Sprintf("保存测点的策略独立配置阈值信息失败:%s", err.Error()),
  125. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  126. )
  127. return err
  128. }
  129. new(bo.SystemLog).Success(enum.Alone_Alarm_Value,
  130. enum.LogType_Insert,
  131. enum.OptEventType_Bus,
  132. enum.OptEventLevel_Hight,
  133. fmt.Sprintf("保存测点的策略独立配置阈值信息成功!"),
  134. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  135. )
  136. key := fmt.Sprintf("aloneTactics#%s#%s", obj.Deviceid, obj.Mpid)
  137. aloneTactics.Delete(key)
  138. return nil
  139. }
  140. // 修改测点的一个告警策略添加独立的告警阈值
  141. func (t *AlarmDeviceService) UpdateAloneDeviceTactics(obj models.T_base_alone_alarm) error {
  142. db := orm.NewOrm()
  143. _, err := db.Update(&obj)
  144. if err != nil {
  145. logger.Logger.Error(err)
  146. logger.Logger.Println(fmt.Sprintf("Error is:%s", err.Error()))
  147. new(bo.SystemLog).Fail(enum.Alone_Alarm_Value,
  148. enum.LogType_Update,
  149. enum.OptEventType_Bus,
  150. enum.OptEventLevel_Hight,
  151. fmt.Sprintf("更新测点的策略独立配置阈值信息失败:%s", err.Error()),
  152. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  153. )
  154. return err
  155. }
  156. new(bo.SystemLog).Success(enum.Alone_Alarm_Value,
  157. enum.LogType_Update,
  158. enum.OptEventType_Bus,
  159. enum.OptEventLevel_Hight,
  160. fmt.Sprintf("更新测点的策略独立配置阈值信息成功!"),
  161. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  162. )
  163. key := fmt.Sprintf("aloneTactics#%s#%s", obj.Deviceid, obj.Mpid)
  164. aloneTactics.Delete(key)
  165. return nil
  166. }
  167. // 根据deviceid删除独立配置
  168. func (t *AlarmDeviceService) DelAloneDeviceTactics(deviceid int64) error {
  169. db := orm.NewOrm()
  170. var sqlCommondText = "DELETE FROM t_base_alone_alarm WHERE deviceid=?"
  171. _, err := db.Raw(sqlCommondText, deviceid).Exec()
  172. if err != nil {
  173. logger.Logger.Error(err)
  174. logger.Logger.Println(fmt.Sprintf("Error is:%s", err.Error()))
  175. new(bo.SystemLog).Fail(enum.Alone_Alarm_Value,
  176. enum.LogType_Delete,
  177. enum.OptEventType_Bus,
  178. enum.OptEventLevel_Hight,
  179. fmt.Sprintf("删除测点的策略独立配置阈值信息失败:%s", err.Error()),
  180. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  181. )
  182. }
  183. mpidList, err := t.GetAloneByDevicId(deviceid)
  184. if err != nil {
  185. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  186. return err
  187. }
  188. for _, item := range mpidList {
  189. mpid := tools.IsEmpty(item["mpid"])
  190. key := fmt.Sprintf("aloneTactics%s#%s", deviceid, mpid)
  191. aloneTactics.Delete(key)
  192. }
  193. new(bo.SystemLog).Success(enum.Alone_Alarm_Value,
  194. enum.LogType_Delete,
  195. enum.OptEventType_Bus,
  196. enum.OptEventLevel_Hight,
  197. fmt.Sprintf("删除测点的策略独立配置阈值信息成功!"),
  198. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  199. )
  200. return nil
  201. }
  202. // 复制一个设备的策略到另外多个设备
  203. func (t *AlarmDeviceService) CopyDeviceTactics(oldDeviceId int64, otherDeviceId int64) (bool, error) {
  204. // 先从数据库中获取原有设备的独立配置
  205. db := orm.NewOrm()
  206. oldObjList := []models.T_base_alone_alarm{}
  207. _, err := db.QueryTable("t_base_alone_alarm").Filter("deviceid", oldDeviceId).All(&oldObjList)
  208. if err != nil {
  209. logger.Logger.Error(err)
  210. logger.Logger.Println(fmt.Sprintf("Error is:%s", err.Error()))
  211. return false, err
  212. }
  213. db.Begin()
  214. // 再改变deviceid的值,复制到其他设备,循环的时候需要判断每一个测点是否在另外的设备下
  215. for _, row := range oldObjList {
  216. var aloneObj models.T_base_alone_alarm
  217. aloneObj.Deviceid = otherDeviceId
  218. aloneObj.Alarm_type = row.Alarm_type
  219. aloneObj.Mpid = row.Mpid
  220. aloneObj.Mpname = row.Mpname
  221. aloneObj.Attrname = row.Attrname
  222. if row.Alarm_type == 2 {
  223. aloneObj.Upcycle = row.Upcycle
  224. }
  225. aloneObj.Threshold = row.Threshold
  226. aloneObj.Alarm_id = row.Alarm_id
  227. _, err = db.Insert(&aloneObj)
  228. if err != nil {
  229. db.Rollback()
  230. new(bo.SystemLog).Fail(enum.Alone_Alarm_Value,
  231. enum.LogType_Insert,
  232. enum.OptEventType_Bus,
  233. enum.OptEventLevel_Hight,
  234. fmt.Sprintf("复制测点的策略独立配置阈值信息失败:%s", err.Error()),
  235. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  236. )
  237. return false, err
  238. }
  239. }
  240. err = db.Commit()
  241. if err != nil {
  242. new(bo.SystemLog).Fail(enum.Alone_Alarm_Value,
  243. enum.LogType_Insert,
  244. enum.OptEventType_Bus,
  245. enum.OptEventLevel_Hight,
  246. fmt.Sprintf("复制策略批量提交新增失败:%s", err.Error()),
  247. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  248. )
  249. return false, err
  250. }
  251. return true, nil
  252. }
  253. // 根据deviceid和mpid删除独立配置
  254. func (t *AlarmDeviceService) DelByDeviceMp(deviceid int64, mpid int64, alarmId int64) error {
  255. db := orm.NewOrm()
  256. var sqlCommondText = "DELETE FROM t_base_alone_alarm WHERE deviceid=? and mpid=? and alarm_id=?"
  257. _, err := db.Raw(sqlCommondText, deviceid, mpid, alarmId).Exec()
  258. if err != nil {
  259. logger.Logger.Error(err)
  260. logger.Logger.Println(fmt.Sprintf("Error is:%s", err.Error()))
  261. new(bo.SystemLog).Fail(enum.Alone_Alarm_Value,
  262. enum.LogType_Delete,
  263. enum.OptEventType_Bus,
  264. enum.OptEventLevel_Hight,
  265. fmt.Sprintf("根据deviceid和mpid删除独立配置阈值信息失败:%s", err.Error()),
  266. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  267. )
  268. }
  269. new(bo.SystemLog).Success(enum.Alone_Alarm_Value,
  270. enum.LogType_Delete,
  271. enum.OptEventType_Bus,
  272. enum.OptEventLevel_Hight,
  273. fmt.Sprintf("根据deviceid和mpid删除独立配置阈值信息成功!"),
  274. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  275. )
  276. key := fmt.Sprintf("aloneTactics#%s#%s", deviceid, mpid)
  277. aloneTactics.Delete(key)
  278. return nil
  279. }
  280. // 根据deviceid和mpid获取mpid的独立配置信息
  281. func (t *AlarmDeviceService) GetAloneDeviceTactics(deviceid int64, mpid int64) ([]orm.Params, error) {
  282. key := fmt.Sprintf("aloneTactics#%s#%s", deviceid, mpid)
  283. if info, ok := aloneTactics.Load(key); ok {
  284. return info.([]orm.Params), nil
  285. }
  286. db := orm.NewOrm()
  287. var sqlCommondText = "select * FROM t_base_alone_alarm WHERE deviceid=? and mpid=?"
  288. lst := []orm.Params{}
  289. _, err := db.Raw(sqlCommondText, deviceid, mpid).Values(&lst)
  290. if err != nil {
  291. logger.Logger.Error(err)
  292. logger.Logger.Println(fmt.Sprintf("Error is:%s", err.Error()))
  293. return nil, err
  294. }
  295. aloneTactics.Store(key, lst)
  296. return lst, nil
  297. }
  298. // 根据deviceid获取独立配置下的mpid
  299. func (t *AlarmDeviceService) GetAloneByDevicId(deviceid int64) ([]orm.Params, error) {
  300. db := orm.NewOrm()
  301. var sql = "select mpid from t_base_alone_alarm where deviceid=?"
  302. lst := []orm.Params{}
  303. _, err := db.Raw(sql, deviceid).Values(&lst)
  304. if err != nil {
  305. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  306. return nil, err
  307. }
  308. return lst, nil
  309. }
  310. // 根据所选设备导出该设备的所有测点对应的告警策略,作为导入模版
  311. func (t *AlarmDeviceService) ImportModelsDeviceSettingData(deviceid int64) ([]orm.Params, error) {
  312. ds := new(DeviceService)
  313. deviceMpList, _, err := ds.DeviceMpList(int32(deviceid), 1, 1000)
  314. if err != nil {
  315. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  316. return nil, err
  317. }
  318. lst := []orm.Params{}
  319. if len(deviceMpList) > 0 {
  320. mod_id, err := strconv.ParseInt(tools.IsEmpty(deviceMpList[0]["modelid"]), 10, 64)
  321. if err != nil {
  322. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  323. return nil, err
  324. }
  325. db := orm.NewOrm()
  326. var sqlCommandText = "SELECT a.id alarm_id,m.attrname,m.alarm_type,m.mod_id,a.alarm_level,a.strategy_name,0 upcycle,a.threshold FROM t_base_absolute_alarm a,t_base_alarm_mplist m where a.id=m.fk_id and m.mod_id=?"
  327. sqlCommandText += " UNION "
  328. sqlCommandText += "SELECT a.id alarm_id,m.attrname,m.alarm_type,m.mod_id,a.alarm_level,a.strategy_name,a.upcycle,a.scope threshold FROM t_base_rise_alarm a,t_base_alarm_mplist m where a.id=m.fk_id and m.mod_id=?"
  329. _, err = db.Raw(sqlCommandText, mod_id, mod_id).Values(&lst)
  330. if err != nil {
  331. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  332. return nil, err
  333. }
  334. if len(lst) > 0 {
  335. for index, item := range lst {
  336. for _, row := range deviceMpList {
  337. if tools.IsEmpty(item["attrname"]) == tools.IsEmpty(row["attrname"]) {
  338. item["deviceid"] = row["deviceid"]
  339. item["mpid"] = row["mpid"]
  340. item["mpname"] = row["mpname"]
  341. lst[index] = item
  342. break
  343. }
  344. }
  345. }
  346. }
  347. }
  348. return lst, nil
  349. }
  350. // 根据excel文件导入到独立配置表中
  351. func (t *AlarmDeviceService) ImportExcelDeviceSettingData(param map[string]interface{}) error {
  352. dataList := param["datalist"].([]map[int]string)
  353. db := orm.NewOrm()
  354. var sqlCommandText = "insert into t_base_alone_alarm (alarm_id,deviceid,mpid,attrname,mpname,alarm_type,upcycle,threshold) values "
  355. feilds := ""
  356. if len(dataList) > 0 {
  357. for i := 0; i < len(dataList); i++ {
  358. feilds += "("
  359. feilds += "'" + dataList[i][1] + "',"
  360. if dataList[i][2] == "" {
  361. feilds = ""
  362. continue
  363. }
  364. feilds += "'" + dataList[i][2] + "',"
  365. feilds += "'" + dataList[i][3] + "',"
  366. feilds += "'" + dataList[i][4] + "',"
  367. feilds += "'" + dataList[i][5] + "',"
  368. feilds += "'" + dataList[i][6] + "',"
  369. feilds += "'" + dataList[i][9] + "',"
  370. if i == len(dataList)-1 {
  371. feilds += "'" + dataList[i][10] + "')"
  372. } else {
  373. feilds += "'" + dataList[i][10] + "'),"
  374. }
  375. sqlCommandText += feilds
  376. feilds = ""
  377. }
  378. _, err := db.Raw(sqlCommandText).Exec()
  379. if err != nil {
  380. new(bo.SystemLog).Fail(enum.Alone_Alarm_Value,
  381. enum.LogType_Insert,
  382. enum.OptEventType_Bus,
  383. enum.OptEventLevel_Hight,
  384. fmt.Sprintf("批量导入测点的策略独立配置阈值信息失败:%s", err.Error()),
  385. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  386. )
  387. }
  388. }
  389. return nil
  390. }
  391. // 专门用于导出的设备
  392. func (t *AlarmDeviceService) ExportExcelDeviceSettingData(deviceid int64) ([]orm.Params, error) {
  393. lst := []orm.Params{}
  394. ds := new(DeviceService)
  395. deviceMpList, _, err := ds.DeviceMpList(int32(deviceid), 1, 10000)
  396. if err != nil {
  397. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  398. return nil, err
  399. }
  400. for _, row := range deviceMpList {
  401. mpid, err := strconv.ParseInt(fmt.Sprint(row["mpid"]), 10, 64)
  402. if err != nil {
  403. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  404. return nil, err
  405. }
  406. abs, err := t.GetAbsAloneList(deviceid, mpid)
  407. if err != nil {
  408. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  409. return nil, err
  410. }
  411. lst = append(lst, abs...)
  412. rise, err := t.GetRiseAloneList(deviceid, mpid)
  413. if err != nil {
  414. logger.Logger.Error(err, fmt.Sprintf("Error is:%s", err.Error()))
  415. return nil, err
  416. }
  417. lst = append(lst, rise...)
  418. }
  419. return lst, nil
  420. }