alarm_info_service.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "rtzh_elec_temperature/enum"
  6. "rtzh_elec_temperature/global"
  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. "strings"
  12. "sync"
  13. "github.com/astaxie/beego/orm"
  14. )
  15. type AlarmInfoService struct {
  16. BaseService
  17. }
  18. // 用户确认告警信息
  19. func (t *AlarmInfoService) ConfirmAlrmInfo(id int64) error {
  20. db := orm.NewOrm()
  21. obj := models.T_base_alarm_his{Id: id}
  22. err := db.Read(&obj)
  23. if err != nil {
  24. logger.Logger.Error(err)
  25. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  26. return err
  27. }
  28. obj.Confirm = 1
  29. obj.Confirmtime = tools.NowTime()
  30. _, err = db.Update(&obj)
  31. if err != nil {
  32. logger.Logger.Error(err)
  33. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  34. return err
  35. }
  36. return nil
  37. }
  38. //告警总数统计.统计结果包括总数、月总数、周总数、当前日总数
  39. func (t *AlarmInfoService) GetAlarmTotal(areaid int, deviceid int64) (map[string]string, error) {
  40. total := "0"
  41. month := "0"
  42. week := "0"
  43. day := "0"
  44. sqlParas := []interface{}{}
  45. sqlWhere := []string{""}
  46. if deviceid > 0 {
  47. sqlWhere = append(sqlWhere, " deviceid=? ")
  48. sqlParas = append(sqlParas, deviceid)
  49. }
  50. if areaid > 0 {
  51. sqlWhere = append(sqlWhere, " region_id=? ")
  52. sqlParas = append(sqlParas, areaid)
  53. }
  54. dbo := orm.NewOrm()
  55. var wg = sync.WaitGroup{}
  56. wg.Add(4)
  57. //总数统计
  58. go func() {
  59. sql := "select count(1) cnt from t_base_alarm_his where 1=1 " + strings.Join(sqlWhere, " and ")
  60. rowset := []orm.Params{}
  61. _, err := dbo.Raw(sql, sqlParas).Values(&rowset)
  62. if err != nil {
  63. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
  64. } else if len(rowset) > 0 {
  65. total = tools.IsEmpty(rowset[0]["cnt"])
  66. }
  67. wg.Done()
  68. }()
  69. //当前月统计
  70. go func() {
  71. sql := "select count(1) cnt from t_base_alarm_his where create_at BETWEEN date_format(now(),'%Y-%m-01 00:00:00') and now() " + strings.Join(sqlWhere, " and ")
  72. rowset := []orm.Params{}
  73. _, err := dbo.Raw(sql, sqlParas).Values(&rowset)
  74. if err != nil {
  75. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
  76. } else if len(rowset) > 0 {
  77. month = tools.IsEmpty(rowset[0]["cnt"])
  78. }
  79. wg.Done()
  80. }()
  81. //当前周统计
  82. go func() {
  83. sql := "select count(1) cnt from t_base_alarm_his where create_at BETWEEN CONCAT(date_sub(curdate(),INTERVAL WEEKDAY(curdate()) DAY),' 00:00:00') and now() " + strings.Join(sqlWhere, " and ")
  84. rowset := []orm.Params{}
  85. _, err := dbo.Raw(sql, sqlParas).Values(&rowset)
  86. if err != nil {
  87. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
  88. } else if len(rowset) > 0 {
  89. week = tools.IsEmpty(rowset[0]["cnt"])
  90. }
  91. wg.Done()
  92. }()
  93. //当前日统计
  94. go func() {
  95. sql := "select count(1) cnt from t_base_alarm_his where create_at BETWEEN date_format(now(),'%Y-%m-%d 00:00:00') and now() " + strings.Join(sqlWhere, " and ")
  96. rowset := []orm.Params{}
  97. _, err := dbo.Raw(sql, sqlParas).Values(&rowset)
  98. if err != nil {
  99. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
  100. } else if len(rowset) > 0 {
  101. day = tools.IsEmpty(rowset[0]["cnt"])
  102. }
  103. wg.Done()
  104. }()
  105. wg.Wait()
  106. return map[string]string{
  107. "total": total,
  108. "month": month,
  109. "week": week,
  110. "day": day,
  111. }, nil
  112. }
  113. // 告警分类统计。按策略分类
  114. func (t *AlarmInfoService) GetAlarmTotalByStrategy(areaid int, deviceid int64) ([]orm.Params, error) {
  115. db := orm.NewOrm()
  116. sql := "select concat(alarm_type,'-',strategyid) strategyid, count(1) cnt from t_base_alarm_his where 1=1 "
  117. sqlParas := []interface{}{}
  118. if deviceid > 0 {
  119. sql = sql + " and deviceid=?"
  120. sqlParas = append(sqlParas, deviceid)
  121. }
  122. if areaid > 0 {
  123. sql = sql + " and region_id=?"
  124. sqlParas = append(sqlParas, areaid)
  125. }
  126. sql = sql + " group by alarm_type,strategyid"
  127. rowset := []orm.Params{}
  128. _, err := db.Raw(sql, sqlParas).Values(&rowset)
  129. if err != nil {
  130. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
  131. return nil, err
  132. }
  133. strategyilist := []orm.Params{}
  134. unbalanceList := []orm.Params{}
  135. riseList := []orm.Params{}
  136. absList := []orm.Params{}
  137. //告警类别1:绝对值,2:升温,3:温度不平衡
  138. var wg = sync.WaitGroup{}
  139. wg.Add(3)
  140. go func() {
  141. //温度不平衡告警
  142. alarmtact := new(AlarmTactics)
  143. vunbalanceList := alarmtact.GetUnbalanceList()
  144. for _, r := range vunbalanceList {
  145. unbalanceList = append(unbalanceList, orm.Params{
  146. "strategy_name": r["strategy_name"],
  147. "id": fmt.Sprintf("3-%v", r["id"]),
  148. })
  149. }
  150. wg.Done()
  151. }()
  152. go func() {
  153. //升温告警
  154. alarmtact := new(AlarmTactics)
  155. vriseList := alarmtact.GetRiseList()
  156. for _, r := range vriseList {
  157. riseList = append(riseList, orm.Params{
  158. "strategy_name": r["strategy_name"],
  159. "id": fmt.Sprintf("2-%v", r["id"]),
  160. })
  161. }
  162. wg.Done()
  163. }()
  164. go func() {
  165. //绝对值告警
  166. alarmtact := new(AlarmTactics)
  167. vabsList := alarmtact.GetAbsList()
  168. for _, r := range vabsList {
  169. absList = append(absList, orm.Params{
  170. "strategy_name": r["strategy_name"],
  171. "id": fmt.Sprintf("1-%v", r["id"]),
  172. })
  173. }
  174. wg.Done()
  175. }()
  176. wg.Wait()
  177. if len(unbalanceList) > 0 {
  178. strategyilist = append(strategyilist, unbalanceList...)
  179. }
  180. if len(riseList) > 0 {
  181. strategyilist = append(strategyilist, riseList...)
  182. }
  183. if len(absList) > 0 {
  184. strategyilist = append(strategyilist, absList...)
  185. }
  186. strategyimap := map[string]string{}
  187. for _, row := range rowset {
  188. strategyimap[tools.IsEmpty(row["strategyid"])] = tools.IsEmpty(row["cnt"])
  189. }
  190. for i, r := range strategyilist {
  191. yid := tools.IsEmpty(r["id"])
  192. strategyilist[i]["cnt"] = strategyimap[yid]
  193. }
  194. return strategyilist, nil
  195. }
  196. // 添加告警历史信息
  197. func (t *AlarmInfoService) InsertAlarmInfo(obj models.T_base_alarm_his) (int64, error) {
  198. db := orm.NewOrm()
  199. id, err := db.Insert(&obj)
  200. if err != nil {
  201. logger.Logger.Error(err, fmt.Sprintf("操作数据:%+v", obj))
  202. new(bo.SystemLog).Fail(enum.AuditType_alarmdata,
  203. enum.LogType_Insert,
  204. enum.OptEventType_Bus,
  205. enum.OptEventLevel_Hight,
  206. fmt.Sprintf("新增告警信息失败:%s", err.Error()),
  207. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  208. )
  209. return 0, err
  210. }
  211. new(bo.SystemLog).Success(enum.AuditType_alarmdata,
  212. enum.LogType_Insert,
  213. enum.OptEventType_Bus,
  214. enum.OptEventLevel_Hight,
  215. fmt.Sprintf("新增告警信息成功!新增数据为:%v", obj),
  216. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  217. )
  218. return id, nil
  219. }
  220. // 告警详情列表
  221. func (t *AlarmInfoService) QueryAlarmInfoList(mpname string, alarmLevel int, alarmDesc string, beginTime string, endTime string, pageIndex int, pageSize int) (map[string]interface{}, error) {
  222. if pageIndex == 0 {
  223. return nil, errors.New("分页页数不能为0!")
  224. }
  225. var limits = fmt.Sprintf(" ORDER BY h.create_at DESC LIMIT %d,%d", pageSize*(pageIndex-1), pageSize)
  226. db := orm.NewOrm()
  227. lst := []orm.Params{}
  228. var sqlCommondText = "select * from t_base_alarm_his h "
  229. var countSql = "select count(*) total from t_base_alarm_his h "
  230. conditionList := []string{" where 1=1 "}
  231. paramList := []interface{}{}
  232. if len(mpname) > 0 {
  233. conditionList = append(conditionList, " h.mpname like concat('%',?,'%') ")
  234. paramList = append(paramList, mpname)
  235. }
  236. if alarmLevel != 0 {
  237. conditionList = append(conditionList, " h.alarm_level = ? ")
  238. paramList = append(paramList, alarmLevel)
  239. }
  240. if len(alarmDesc) > 0 {
  241. conditionList = append(conditionList, " h.alarm_desc like concat('%',?,'%') ")
  242. paramList = append(paramList, alarmDesc)
  243. }
  244. if len(beginTime) > 0 && len(endTime) > 0 {
  245. conditionList = append(conditionList, " h.create_at BETWEEN STR_TO_DATE(?,'%Y-%m-%d %H:%i:%s') and STR_TO_DATE(?,'%Y-%m-%d %H:%i:%s') ")
  246. paramList = append(paramList, beginTime, endTime)
  247. }
  248. conditions := strings.Join(conditionList, " and ")
  249. sqlCommondText += conditions
  250. if pageSize != 0 {
  251. sqlCommondText += limits
  252. }
  253. countSql += conditions
  254. _, err := db.Raw(sqlCommondText, paramList).Values(&lst)
  255. if err != nil {
  256. logger.Logger.Error(err)
  257. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  258. return nil, err
  259. }
  260. count := []orm.Params{}
  261. _, err = db.Raw(countSql, paramList).Values(&count)
  262. if err != nil {
  263. logger.Logger.Error(err)
  264. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  265. return nil, err
  266. }
  267. res := map[string]interface{}{"list": lst}
  268. res["total"] = count[0]["total"]
  269. return res, nil
  270. }
  271. // 检测当前测点的告警数据是否已经在告警列表中
  272. func (t *AlarmInfoService) IsExsitInAlarmHis(deviceId int64, mpid int64, alarm_type int) (bool, error) {
  273. db := orm.NewOrm()
  274. var sqlCommondText = "select h.id from t_base_alarm_his h where h.deviceid=? and h.mpid=? and alarm_type=? and is_reset=0"
  275. res := []orm.Params{}
  276. _, err := db.Raw(sqlCommondText, deviceId, mpid, alarm_type).Values(&res)
  277. if err != nil {
  278. logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
  279. return false, err
  280. }
  281. if len(res) > 0 {
  282. return true, nil
  283. }
  284. return false, nil
  285. }
  286. // 获取1条告警历史记录中距离当前时间N分钟之前的最接近的记录
  287. func (t *AlarmInfoService) GetNearByUpcycle(deviceId int64, attrname string, upcycle int, receivTime string) (orm.Params, error) {
  288. tableName, err := new(DeviceService).GetTableNameByDeviceId(int32(deviceId))
  289. if err != nil {
  290. logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
  291. return nil, err
  292. }
  293. db := orm.NewOrm()
  294. var sqlCommondText = "SELECT h." + attrname + " FROM " + tableName + " h WHERE h." + attrname + " <>? and h.device_id=? AND TIMESTAMPDIFF(minute ,STR_TO_DATE(h.acquisition_time,'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(?,'%Y-%m-%d %H:%i:%s'))>? ORDER BY id DESC LIMIT 1"
  295. res := []orm.Params{}
  296. _, err = db.Raw(sqlCommondText, global.NullNumber, deviceId, receivTime, upcycle).Values(&res)
  297. if err != nil {
  298. logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
  299. return nil, err
  300. }
  301. if len(res) > 0 {
  302. return res[0], nil
  303. }
  304. return nil, nil
  305. }
  306. // 告警信息导出列表
  307. func (t *AlarmInfoService) ExprotAlarmInfoList(mpname string, alarmLevel int, alarmDesc string, beginTime string, endTime string, pageIndex int, pageSize int) ([]orm.Params, error) {
  308. if pageIndex == 0 {
  309. return nil, errors.New("分页页数不能为0!")
  310. }
  311. var limits = fmt.Sprintf(" ORDER BY h.create_at DESC")
  312. db := orm.NewOrm()
  313. lst := []orm.Params{}
  314. var sqlCommondText = "SELECT create_at,devicename,mpname,alarm_desc,(CASE is_reset WHEN 1 THEN '是' ELSE '否' end) is_reset,(CASE alarm_level WHEN 1 THEN '预警' WHEN 2 THEN '一般' WHEN 3 THEN '严重' ELSE '危级' END) alarm_level,(CASE confirm WHEN 1 THEN '已确认' ELSE '未确认' END) confirm FROM t_base_alarm_his h "
  315. conditionList := []string{" where 1=1 "}
  316. paramList := []interface{}{}
  317. if len(mpname) > 0 {
  318. conditionList = append(conditionList, " h.mpname like concat('%',?,'%') ")
  319. paramList = append(paramList, mpname)
  320. }
  321. if alarmLevel != 0 {
  322. conditionList = append(conditionList, " h.alarm_level = ? ")
  323. paramList = append(paramList, alarmLevel)
  324. }
  325. if len(alarmDesc) > 0 {
  326. conditionList = append(conditionList, " h.alarm_desc like concat('%',?,'%') ")
  327. paramList = append(paramList, alarmDesc)
  328. }
  329. if len(beginTime) > 0 && len(endTime) > 0 {
  330. conditionList = append(conditionList, " h.create_at BETWEEN STR_TO_DATE(?,'%Y-%m-%d %H:%i:%s') and STR_TO_DATE(?,'%Y-%m-%d %H:%i:%s') ")
  331. paramList = append(paramList, beginTime, endTime)
  332. }
  333. conditions := strings.Join(conditionList, " and ")
  334. sqlCommondText += conditions + limits
  335. _, err := db.Raw(sqlCommondText, paramList).Values(&lst)
  336. if err != nil {
  337. logger.Logger.Error(err)
  338. logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
  339. return nil, err
  340. }
  341. return lst, nil
  342. }