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 }