| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- package service
- import (
- "errors"
- "fmt"
- "rtzh_elec_temperature/enum"
- "rtzh_elec_temperature/global"
- "rtzh_elec_temperature/logger"
- "rtzh_elec_temperature/models/bo"
- "rtzh_elec_temperature/rtelec_app_public_lib/models"
- "rtzh_elec_temperature/tools"
- "strings"
- "sync"
- "github.com/astaxie/beego/orm"
- )
- type AlarmInfoService struct {
- BaseService
- }
- // 用户确认告警信息
- func (t *AlarmInfoService) ConfirmAlrmInfo(id int64) error {
- db := orm.NewOrm()
- obj := models.T_base_alarm_his{Id: id}
- err := db.Read(&obj)
- if err != nil {
- logger.Logger.Error(err)
- logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
- return err
- }
- obj.Confirm = 1
- obj.Confirmtime = tools.NowTime()
- _, err = db.Update(&obj)
- if err != nil {
- logger.Logger.Error(err)
- logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
- return err
- }
- return nil
- }
- //告警总数统计.统计结果包括总数、月总数、周总数、当前日总数
- func (t *AlarmInfoService) GetAlarmTotal(areaid int, deviceid int64) (map[string]string, error) {
- total := "0"
- month := "0"
- week := "0"
- day := "0"
- sqlParas := []interface{}{}
- sqlWhere := []string{""}
- if deviceid > 0 {
- sqlWhere = append(sqlWhere, " deviceid=? ")
- sqlParas = append(sqlParas, deviceid)
- }
- if areaid > 0 {
- sqlWhere = append(sqlWhere, " region_id=? ")
- sqlParas = append(sqlParas, areaid)
- }
- dbo := orm.NewOrm()
- var wg = sync.WaitGroup{}
- wg.Add(4)
- //总数统计
- go func() {
- sql := "select count(1) cnt from t_base_alarm_his where 1=1 " + strings.Join(sqlWhere, " and ")
- rowset := []orm.Params{}
- _, err := dbo.Raw(sql, sqlParas).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
- } else if len(rowset) > 0 {
- total = tools.IsEmpty(rowset[0]["cnt"])
- }
- wg.Done()
- }()
- //当前月统计
- go func() {
- 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 ")
- rowset := []orm.Params{}
- _, err := dbo.Raw(sql, sqlParas).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
- } else if len(rowset) > 0 {
- month = tools.IsEmpty(rowset[0]["cnt"])
- }
- wg.Done()
- }()
- //当前周统计
- go func() {
- 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 ")
- rowset := []orm.Params{}
- _, err := dbo.Raw(sql, sqlParas).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
- } else if len(rowset) > 0 {
- week = tools.IsEmpty(rowset[0]["cnt"])
- }
- wg.Done()
- }()
- //当前日统计
- go func() {
- 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 ")
- rowset := []orm.Params{}
- _, err := dbo.Raw(sql, sqlParas).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
- } else if len(rowset) > 0 {
- day = tools.IsEmpty(rowset[0]["cnt"])
- }
- wg.Done()
- }()
- wg.Wait()
- return map[string]string{
- "total": total,
- "month": month,
- "week": week,
- "day": day,
- }, nil
- }
- // 告警分类统计。按策略分类
- func (t *AlarmInfoService) GetAlarmTotalByStrategy(areaid int, deviceid int64) ([]orm.Params, error) {
- db := orm.NewOrm()
- sql := "select concat(alarm_type,'-',strategyid) strategyid, count(1) cnt from t_base_alarm_his where 1=1 "
- sqlParas := []interface{}{}
- if deviceid > 0 {
- sql = sql + " and deviceid=?"
- sqlParas = append(sqlParas, deviceid)
- }
- if areaid > 0 {
- sql = sql + " and region_id=?"
- sqlParas = append(sqlParas, areaid)
- }
- sql = sql + " group by alarm_type,strategyid"
- rowset := []orm.Params{}
- _, err := db.Raw(sql, sqlParas).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
- return nil, err
- }
- strategyilist := []orm.Params{}
- unbalanceList := []orm.Params{}
- riseList := []orm.Params{}
- absList := []orm.Params{}
- //告警类别1:绝对值,2:升温,3:温度不平衡
- var wg = sync.WaitGroup{}
- wg.Add(3)
- go func() {
- //温度不平衡告警
- alarmtact := new(AlarmTactics)
- vunbalanceList := alarmtact.GetUnbalanceList()
- for _, r := range vunbalanceList {
- unbalanceList = append(unbalanceList, orm.Params{
- "strategy_name": r["strategy_name"],
- "id": fmt.Sprintf("3-%v", r["id"]),
- })
- }
- wg.Done()
- }()
- go func() {
- //升温告警
- alarmtact := new(AlarmTactics)
- vriseList := alarmtact.GetRiseList()
- for _, r := range vriseList {
- riseList = append(riseList, orm.Params{
- "strategy_name": r["strategy_name"],
- "id": fmt.Sprintf("2-%v", r["id"]),
- })
- }
- wg.Done()
- }()
- go func() {
- //绝对值告警
- alarmtact := new(AlarmTactics)
- vabsList := alarmtact.GetAbsList()
- for _, r := range vabsList {
- absList = append(absList, orm.Params{
- "strategy_name": r["strategy_name"],
- "id": fmt.Sprintf("1-%v", r["id"]),
- })
- }
- wg.Done()
- }()
- wg.Wait()
- if len(unbalanceList) > 0 {
- strategyilist = append(strategyilist, unbalanceList...)
- }
- if len(riseList) > 0 {
- strategyilist = append(strategyilist, riseList...)
- }
- if len(absList) > 0 {
- strategyilist = append(strategyilist, absList...)
- }
- strategyimap := map[string]string{}
- for _, row := range rowset {
- strategyimap[tools.IsEmpty(row["strategyid"])] = tools.IsEmpty(row["cnt"])
- }
- for i, r := range strategyilist {
- yid := tools.IsEmpty(r["id"])
- strategyilist[i]["cnt"] = strategyimap[yid]
- }
- return strategyilist, nil
- }
- // 添加告警历史信息
- func (t *AlarmInfoService) InsertAlarmInfo(obj models.T_base_alarm_his) (int64, error) {
- db := orm.NewOrm()
- id, err := db.Insert(&obj)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("操作数据:%+v", obj))
- new(bo.SystemLog).Fail(enum.AuditType_alarmdata,
- enum.LogType_Insert,
- enum.OptEventType_Bus,
- enum.OptEventLevel_Hight,
- fmt.Sprintf("新增告警信息失败:%s", err.Error()),
- map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
- )
- return 0, err
- }
- new(bo.SystemLog).Success(enum.AuditType_alarmdata,
- enum.LogType_Insert,
- enum.OptEventType_Bus,
- enum.OptEventLevel_Hight,
- fmt.Sprintf("新增告警信息成功!新增数据为:%v", obj),
- map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
- )
- return id, nil
- }
- // 告警详情列表
- func (t *AlarmInfoService) QueryAlarmInfoList(mpname string, alarmLevel int, alarmDesc string, beginTime string, endTime string, pageIndex int, pageSize int) (map[string]interface{}, error) {
- if pageIndex == 0 {
- return nil, errors.New("分页页数不能为0!")
- }
- var limits = fmt.Sprintf(" ORDER BY h.create_at DESC LIMIT %d,%d", pageSize*(pageIndex-1), pageSize)
- db := orm.NewOrm()
- lst := []orm.Params{}
- var sqlCommondText = "select * from t_base_alarm_his h "
- var countSql = "select count(*) total from t_base_alarm_his h "
- conditionList := []string{" where 1=1 "}
- paramList := []interface{}{}
- if len(mpname) > 0 {
- conditionList = append(conditionList, " h.mpname like concat('%',?,'%') ")
- paramList = append(paramList, mpname)
- }
- if alarmLevel != 0 {
- conditionList = append(conditionList, " h.alarm_level = ? ")
- paramList = append(paramList, alarmLevel)
- }
- if len(alarmDesc) > 0 {
- conditionList = append(conditionList, " h.alarm_desc like concat('%',?,'%') ")
- paramList = append(paramList, alarmDesc)
- }
- if len(beginTime) > 0 && len(endTime) > 0 {
- 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') ")
- paramList = append(paramList, beginTime, endTime)
- }
- conditions := strings.Join(conditionList, " and ")
- sqlCommondText += conditions
- if pageSize != 0 {
- sqlCommondText += limits
- }
- countSql += conditions
- _, err := db.Raw(sqlCommondText, paramList).Values(&lst)
- if err != nil {
- logger.Logger.Error(err)
- logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
- return nil, err
- }
- count := []orm.Params{}
- _, err = db.Raw(countSql, paramList).Values(&count)
- if err != nil {
- logger.Logger.Error(err)
- logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
- return nil, err
- }
- res := map[string]interface{}{"list": lst}
- res["total"] = count[0]["total"]
- return res, nil
- }
- // 检测当前测点的告警数据是否已经在告警列表中
- func (t *AlarmInfoService) IsExsitInAlarmHis(deviceId int64, mpid int64, alarm_type int) (bool, error) {
- db := orm.NewOrm()
- var sqlCommondText = "select h.id from t_base_alarm_his h where h.deviceid=? and h.mpid=? and alarm_type=? and is_reset=0"
- res := []orm.Params{}
- _, err := db.Raw(sqlCommondText, deviceId, mpid, alarm_type).Values(&res)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
- return false, err
- }
- if len(res) > 0 {
- return true, nil
- }
- return false, nil
- }
- // 获取1条告警历史记录中距离当前时间N分钟之前的最接近的记录
- func (t *AlarmInfoService) GetNearByUpcycle(deviceId int64, attrname string, upcycle int, receivTime string) (orm.Params, error) {
- tableName, err := new(DeviceService).GetTableNameByDeviceId(int32(deviceId))
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
- return nil, err
- }
- db := orm.NewOrm()
- 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"
- res := []orm.Params{}
- _, err = db.Raw(sqlCommondText, global.NullNumber, deviceId, receivTime, upcycle).Values(&res)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("Err is :%s", err))
- return nil, err
- }
- if len(res) > 0 {
- return res[0], nil
- }
- return nil, nil
- }
- // 告警信息导出列表
- func (t *AlarmInfoService) ExprotAlarmInfoList(mpname string, alarmLevel int, alarmDesc string, beginTime string, endTime string, pageIndex int, pageSize int) ([]orm.Params, error) {
- if pageIndex == 0 {
- return nil, errors.New("分页页数不能为0!")
- }
- var limits = fmt.Sprintf(" ORDER BY h.create_at DESC")
- db := orm.NewOrm()
- lst := []orm.Params{}
- 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 "
- conditionList := []string{" where 1=1 "}
- paramList := []interface{}{}
- if len(mpname) > 0 {
- conditionList = append(conditionList, " h.mpname like concat('%',?,'%') ")
- paramList = append(paramList, mpname)
- }
- if alarmLevel != 0 {
- conditionList = append(conditionList, " h.alarm_level = ? ")
- paramList = append(paramList, alarmLevel)
- }
- if len(alarmDesc) > 0 {
- conditionList = append(conditionList, " h.alarm_desc like concat('%',?,'%') ")
- paramList = append(paramList, alarmDesc)
- }
- if len(beginTime) > 0 && len(endTime) > 0 {
- 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') ")
- paramList = append(paramList, beginTime, endTime)
- }
- conditions := strings.Join(conditionList, " and ")
- sqlCommondText += conditions + limits
- _, err := db.Raw(sqlCommondText, paramList).Values(&lst)
- if err != nil {
- logger.Logger.Error(err)
- logger.Logger.Println(fmt.Sprintf("Err is :%s", err))
- return nil, err
- }
- return lst, nil
- }
|