Browse Source

2023-09-27 报警统计存入redis

zoie 1 year ago
parent
commit
a61cc6518d

+ 42 - 44
controllers/Warning.go

@@ -49,16 +49,21 @@ func (c *DeviceController) DeviceWarning_List() {
 
 	T_admin, _ := c.GetInt("T_admin")
 	T_history, _ := c.GetInt("T_history")
+	tpCount := Warning.Read_WarningType_Count()
 	var tpList []string
 	if len(T_tp) > 0 {
 		tpList = lib.SplitStringIds(T_tp, "T")
+		if len(tpList) == int(tpCount) {
+			// 类型全选,替换为空,不进行查询筛选(查询全部)
+			tpList = []string{}
+		}
 	} else {
 		power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
 		if power.T_warning != "*" {
 			tpList = lib.SplitStringIds(power.T_warning, "W")
 		}
 	}
-
+	countRedisKey := fmt.Sprintf("Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, T_admin, T_history)
 	bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
@@ -81,10 +86,10 @@ func (c *DeviceController) DeviceWarning_List() {
 	if T_admin == 1 {
 		if T_history == 1 {
 			// 获取备份
-			r_jsons.Data, r_jsons.Num = Warning.Read_Admin_Warning_Backups(c.Admin_r.T_pids, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z)
+			r_jsons.Data, r_jsons.Num = Warning.Read_Admin_Warning_Backups(*c.Admin_r, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, countRedisKey)
 		} else {
 			// 获取最新
-			r_jsons.Data, r_jsons.Num = Warning.Read_Admin_Warning_List(c.Admin_r.T_pids, tpList, T_name, T_handle, Time_start, Time_end, page, page_z)
+			r_jsons.Data, r_jsons.Num = Warning.Read_Admin_Warning_List(*c.Admin_r, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, countRedisKey)
 		}
 		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
 		c.ServeJSON()
@@ -93,10 +98,10 @@ func (c *DeviceController) DeviceWarning_List() {
 
 	// 公司报警界面
 	if T_history == 1 {
-		r_jsons.Data, r_jsons.Num = Warning.Read_Warning_Backups(c.T_pid, bindSN, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z)
+		r_jsons.Data, r_jsons.Num = Warning.Read_Warning_Backups(c.T_pid, bindSN, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, countRedisKey)
 	} else {
 		// 获取最新
-		r_jsons.Data, r_jsons.Num = Warning.Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, page, page_z)
+		r_jsons.Data, r_jsons.Num = Warning.Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, countRedisKey)
 	}
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
@@ -125,15 +130,21 @@ func (c *DeviceController) CompanyWarning_List() {
 	T_handle, _ := c.GetInt("T_handle")
 
 	T_history, _ := c.GetInt("T_history")
+	tpCount := Warning.Read_WarningType_Count()
 	var tpList []string
 	if len(T_tp) > 0 {
 		tpList = lib.SplitStringIds(T_tp, "T")
+		if len(tpList) == int(tpCount) {
+			// 类型全选,替换为空,不进行查询筛选(查询全部)
+			tpList = []string{}
+		}
 	} else {
 		power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
 		if power.T_warning != "*" {
 			tpList = lib.SplitStringIds(power.T_warning, "W")
 		}
 	}
+	countRedisKey := fmt.Sprintf("Company_Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, 0, T_history)
 
 	Company_r, err := Account.Read_Company_ById(c.T_pid)
 	if err != nil {
@@ -156,10 +167,10 @@ func (c *DeviceController) CompanyWarning_List() {
 	}
 	Account.Read_Company_All_Maps()
 	if T_history == 1 {
-		r_jsons.Data, r_jsons.Num = Warning.Read_Company_Warning_Backups(T_pids, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z)
+		r_jsons.Data, r_jsons.Num = Warning.Read_Company_Warning_Backups(T_pids, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, c.T_pid, countRedisKey)
 	} else {
 		// 获取最新
-		r_jsons.Data, r_jsons.Num = Warning.Read_Company_Warning_List(T_pids, tpList, T_name, T_handle, Time_start, Time_end, page, page_z)
+		r_jsons.Data, r_jsons.Num = Warning.Read_Company_Warning_List(T_pids, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, c.T_pid, countRedisKey)
 	}
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
@@ -229,6 +240,10 @@ func (c *DeviceController) DeviceWarning_Post() {
 		}
 	}
 
+	// 删除报警列表统计的缓存
+	Warning.Redis_WarningCount_DelK(c.T_pid)
+	Warning.Redis_WarningCount_DelK(c.Admin_r.Id)
+
 	System.Add_UserLogs(c.Admin_r.T_uuid, "设备管理", "报警处理操作", Wtab+":"+strconv.Itoa(id)+"->"+T_Text)
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -281,7 +296,9 @@ func (c *DeviceController) DeviceWarning_Del() {
 			return
 		}
 	}
-
+	// 删除报警列表统计的缓存
+	Warning.Redis_WarningCount_DelK(c.T_pid)
+	Warning.Redis_WarningCount_DelK(c.Admin_r.Id)
 	System.Add_UserLogs(c.Admin_r.T_uuid, "设备管理", "报警删除操作", Wtab+":"+strconv.Itoa(id))
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -296,13 +313,19 @@ func (c *DeviceController) DeviceWarning_Data_Excel() {
 	Time_end := c.GetString("Time_end")
 	T_handle, _ := c.GetInt("T_handle")
 	T_history, _ := c.GetInt("T_history")
+	tpCount := Warning.Read_WarningType_Count()
 	var tpList []string
 	if len(T_tp) > 0 {
 		tpList = lib.SplitStringIds(T_tp, "T")
+		if len(tpList) == int(tpCount) {
+			// 类型全选,替换为空,不进行查询筛选(查询全部)
+			tpList = []string{}
+		}
 	} else {
 		power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
 		tpList = lib.SplitStringIds(power.T_warning, "W")
 	}
+	countRedisKey := fmt.Sprintf("Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, 0, T_history)
 
 	var T_year, T_month string
 	if T_history == 1 {
@@ -325,10 +348,10 @@ func (c *DeviceController) DeviceWarning_Data_Excel() {
 	var Device_data []Warning.Warning_R
 	if T_history == 1 {
 		// 获取备份
-		Device_data, _ = Warning.Read_Warning_Backups(c.T_pid, bindSN, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999)
+		Device_data, _ = Warning.Read_Warning_Backups(c.T_pid, bindSN, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
 	} else {
 		// 获取最新
-		Device_data, _ = Warning.Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999)
+		Device_data, _ = Warning.Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
 	}
 
 	f := excelize.NewFile() // 设置单元格的值
@@ -398,15 +421,22 @@ func (c *DeviceController) CompanyWarning_Data_Excel() {
 	Time_end := c.GetString("Time_end")
 	T_handle, _ := c.GetInt("T_handle")
 	T_history, _ := c.GetInt("T_history")
+	tpCount := Warning.Read_WarningType_Count()
 	var tpList []string
 	if len(T_tp) > 0 {
 		tpList = lib.SplitStringIds(T_tp, "T")
+		if len(tpList) == int(tpCount) {
+			// 类型全选,替换为空,不进行查询筛选(查询全部)
+			tpList = []string{}
+		}
 	} else {
 		power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
 		if power.T_warning != "*" {
 			tpList = lib.SplitStringIds(power.T_warning, "W")
 		}
 	}
+	countRedisKey := fmt.Sprintf("Company_Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, 0, T_history)
+
 	Account.Read_Company_All_Maps()
 	Company_r, err := Account.Read_Company_ById(c.T_pid)
 	if err != nil {
@@ -431,10 +461,10 @@ func (c *DeviceController) CompanyWarning_Data_Excel() {
 	var Device_data []Warning.CompanyWarning_R
 	if T_history == 1 {
 		// 获取备份
-		Device_data, _ = Warning.Read_Company_Warning_Backups(T_pids, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999)
+		Device_data, _ = Warning.Read_Company_Warning_Backups(T_pids, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, c.T_pid, countRedisKey)
 	} else {
 		// 获取最新
-		Device_data, _ = Warning.Read_Company_Warning_List(T_pids, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999)
+		Device_data, _ = Warning.Read_Company_Warning_List(T_pids, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, c.T_pid, countRedisKey)
 	}
 
 	f := excelize.NewFile() // 设置单元格的值
@@ -671,9 +701,6 @@ func Cron_WarningRateDay_Add() {
 	// 获取管理员用户列表
 	adminList := Account.Read_Admin_List_All()
 
-	// 获取排除的pid及其子id
-	//Exclude_Pids := Get_Exclude_Pids()
-
 	// 获取内部用户关联的pid
 	for _, admin := range adminList {
 		// 内部用户已绑定公司,* 绑定所有公司
@@ -744,32 +771,3 @@ func Cron_WarningRateMonth_Add() {
 	}
 
 }
-
-// 获取排除的pids
-func Get_Exclude_Pids() map[int]struct{} {
-	ColdExcludePidList := lib.SplitStringToIntIds(conf.WarningRateExcludePid, ",")
-	// 获取排除的pid
-	ExcludeList := Account.ReadCompanyIds_T_pids(ColdExcludePidList)
-	ExcludeListMap := make(map[int]struct{})
-	for _, v := range ExcludeList {
-		ExcludeListMap[v] = struct{}{}
-	}
-	return ExcludeListMap
-}
-
-// 获取用户排除后的pids
-func Get_AfterExclude_Pids(excludePids map[int]struct{}, adminPids string) []int {
-	var list []int
-	T_pids := lib.SplitStringToIntIds(adminPids, "P")
-	userPids := Account.ReadCompanyIds_T_pids(T_pids)
-	if len(T_pids) == 0 {
-		return userPids
-	}
-	for _, v := range userPids {
-		if _, ok := excludePids[v]; ok {
-			continue
-		}
-		list = append(list, v)
-	}
-	return list
-}

+ 3 - 0
controllers/lib/libString.go

@@ -65,6 +65,9 @@ func DateStrToDate(T_date string) (time.Time, bool) {
 }
 
 func SplitStringIds(str string, prefix string) (r []string) {
+	if len(str) == 0 {
+		return
+	}
 	Ids_str := strings.TrimRight(str, "|")
 	Ids := strings.Split(Ids_str, "|")
 	for _, v := range Ids {

+ 4 - 1
models/Device/DeviceData.go

@@ -59,7 +59,7 @@ type DeviceData_R struct {
 }
 
 type DeviceData_Pdf struct {
-	T_time string  // sn
+	T_time string   // sn
 	T_id1  *float32 // 传感器id1温度
 	T_id2  *float32 // 传感器id2温度
 
@@ -126,6 +126,8 @@ func DeviceDataToDeviceData_R2(d Device, sp DeviceSensorParameter_R, r DeviceDat
 	t.T_rh = r.T_rh
 	t.T_site = r.T_site
 	t.T_time = r.T_time.Format("2006-01-02 15:04:05")
+
+	// 传感器参数信息
 	t.T_sp = r.T_sp
 	t.T_name = sp.T_name
 	t.T_tl = sp.T_Tlower
@@ -133,6 +135,7 @@ func DeviceDataToDeviceData_R2(d Device, sp DeviceSensorParameter_R, r DeviceDat
 	t.T_rhl = sp.T_RHlower
 	t.T_rhu = sp.T_RHupper
 
+	// 设备信息
 	t.T_ist = d.T_ist
 	t.T_ish = d.T_ish
 

+ 2 - 3
models/Device/DeviceSensorType.go

@@ -28,9 +28,8 @@ type DeviceSensorType_R struct {
 	T_img  string // 图片连接
 }
 
-func DeviceSensorTypeToDeviceSensorType_R(t DeviceSensorType) (r DeviceSensorType_R) {
-	//r.T_name = t.T_name
-	//r.T_text = t.T_text
+func DeviceSensorTypeToDeviceSensorType_R(T_type int) (r DeviceSensorType_R) {
+	t := Read_DeviceSensorType_Get(T_type)
 	r.T_view = t.T_view
 	r.T_img = t.T_img
 	return r

+ 248 - 104
models/Warning/Warning.go

@@ -5,10 +5,14 @@ import (
 	"Cold_Api/controllers/lib"
 	"Cold_Api/logs"
 	"Cold_Api/models/Account"
+	"encoding/json"
 	"fmt"
+	"github.com/astaxie/beego/cache"
+	_ "github.com/astaxie/beego/cache/redis"
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
+	"github.com/gomodule/redigo/redis"
 	"strconv"
 	"strings"
 	"time"
@@ -117,13 +121,104 @@ type Warning_Applet struct {
 	CreateTime     string   // 创建时间
 }
 
+type Warning_Count struct {
+	Key   string
+	Count int64
+}
+
 func (t *Warning) TableName() string {
 	return "warning" // 数据库名称   // ************** 替换 FormulaList **************
 }
 
+var redis_Warning_Count cache.Cache
+
 func init() {
 	//注册模型
 	orm.RegisterModel(new(Warning))
+
+	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
+		"redis_Warning_Count", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
+	fmt.Println(config)
+	var err error
+	redis_Warning_Count, err = cache.NewCache("redis", config)
+	if err != nil || redis_Warning_Count == nil {
+		errMsg := "failed to init redis"
+		logs.Error(errMsg, err)
+		panic(errMsg)
+	}
+}
+
+func Redis_WarningCount_Set(id int, key string, count int64) (err error) {
+	//json序列化
+	idKey := strconv.Itoa(id)
+
+	warningCount, err := Redis_WarningCount_Get(idKey)
+	warningCount = append(warningCount, Warning_Count{
+		Key:   key,
+		Count: count,
+	})
+
+	str, err := json.Marshal(warningCount)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	err = redis_Warning_Count.Put(idKey, str, 30*time.Minute)
+	if err != nil {
+		logs.Error("Redis_Admin_Set", "set key:", idKey, ",value:", str, err)
+	}
+	return
+}
+
+// if r,is :=Redis_Get(T_sn);is{
+// return r,nil
+// }
+func Redis_WarningCount_Get(userId string) (count []Warning_Count, err error) {
+	if redis_Warning_Count.IsExist(userId) {
+		//println("找到key:",key)
+		v := redis_Warning_Count.Get(userId)
+
+		err = json.Unmarshal(v.([]byte), &count)
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return count, err
+		}
+		return count, nil
+	}
+	return count, redis.ErrNil
+}
+func Redis_WarningCount_GetOne(id int, key string) (count int64, err error) {
+	countList := []Warning_Count{}
+	idKey := strconv.Itoa(id)
+	if !redis_Warning_Count.IsExist(idKey) {
+		return count, redis.ErrNil
+	}
+	//println("找到key:",key)
+	v := redis_Warning_Count.Get(idKey)
+
+	err = json.Unmarshal(v.([]byte), &countList)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return count, err
+	}
+
+	for _, c := range countList {
+		if c.Key == key {
+			return c.Count, nil
+		}
+	}
+	return count, redis.ErrNil
+
+}
+
+func Redis_WarningCount_DelK(id int) (err error) {
+	idKey := strconv.Itoa(id)
+	err = redis_Warning_Count.Delete(idKey)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return
 }
 
 // ---------------- 特殊方法 -------------------
@@ -283,7 +378,8 @@ func Update_Warning_Backups(r Warning, T_year string, T_month string) bool {
 }
 
 // 获取列表
-func Read_Warning_List(T_pid int, bindSN, tpList []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
+func Read_Warning_List(T_pid int, bindSN, tpList []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int,
+	countRedisKey string) (r []Warning_R, cnt int64) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 	var map_r []Warning
@@ -331,15 +427,28 @@ func Read_Warning_List(T_pid int, bindSN, tpList []string, T_name string, T_hand
 	// T_handle  1:默认 2:全部记录 3 未处理
 	if T_handle == 1 {
 		cond1 = cond1.And("T_State__gt", 1)
-	}
-	if T_handle == 2 {
-		cond1 = cond1.And("T_State__gt", 0)
-	}
-	if T_handle == 3 {
+	} else if T_handle == 3 {
 		cond1 = cond1.And("T_State", 3)
+	} else {
+		cond1 = cond1.And("T_State__gt", 0)
 	}
 
 	var err error
+
+	// 从redis获取报警统计数量
+	cnt, err = Redis_WarningCount_GetOne(T_pid, countRedisKey)
+	if err != nil {
+		cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return
+		}
+		Redis_WarningCount_Set(T_pid, countRedisKey, cnt)
+	}
+	if cnt == 0 {
+		return r, 0
+	}
+
 	if page_z == 9999 {
 		// 获取全部
 		_, err = qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
@@ -351,12 +460,6 @@ func Read_Warning_List(T_pid int, bindSN, tpList []string, T_name string, T_hand
 		return
 	}
 
-	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
-	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return
-	}
-
 	for _, v := range map_r {
 		r = append(r, WarningToWarning_R(0, v))
 	}
@@ -366,9 +469,10 @@ func Read_Warning_List(T_pid int, bindSN, tpList []string, T_name string, T_hand
 }
 
 // 管理员报警列表
-func Read_Admin_Warning_List(T_pids string, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
+func Read_Admin_Warning_List(admin Account.Admin, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int,
+	countRedisKey string) (r []Warning_R, cnt int64) {
 
-	if len(T_pids) == 0 {
+	if len(admin.T_pids) == 0 {
 		return r, cnt
 	}
 
@@ -389,13 +493,12 @@ func Read_Admin_Warning_List(T_pids string, T_tp []string, T_name string, T_hand
 	cond := orm.NewCondition()
 	cond1 := orm.NewCondition()
 
-	if T_pids != "*" && len(T_pids) > 0 {
-		list := lib.SplitStringIds(T_pids, "P")
+	if admin.T_pids != "*" && len(admin.T_pids) > 0 {
+		list := lib.SplitStringIds(admin.T_pids, "P")
 		cond1 = cond1.And("T_pid__in", list)
 	}
 	if len(T_tp) > 0 {
 		cond1 = cond1.And("T_tp__in", T_tp)
-
 	}
 	if len(T_name) > 0 {
 		if len(T_name) == 16 {
@@ -417,22 +520,29 @@ func Read_Admin_Warning_List(T_pids string, T_tp []string, T_name string, T_hand
 	//1:默认 2:全部记录 3 未处理
 	if T_handle == 1 {
 		cond1 = cond1.And("T_State__gt", 1)
-	}
-	if T_handle == 2 {
-		cond1 = cond1.And("T_State__gt", 0)
-	}
-	if T_handle == 3 {
+	} else if T_handle == 3 {
 		cond1 = cond1.And("T_State", 3)
+	} else {
+		cond1 = cond1.And("T_State__gt", 0)
 	}
-
-	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
+	var err error
+	// 从redis获取报警统计数量
+	cnt, err = Redis_WarningCount_GetOne(admin.Id, countRedisKey)
 	if err != nil {
-		logs.Error(lib.FuncName(), err)
+		cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return
+		}
+		Redis_WarningCount_Set(admin.Id, countRedisKey, cnt)
 	}
-	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
+	if cnt == 0 {
+		return r, 0
+	}
+
+	_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
-		return
 	}
 
 	for _, v := range map_r {
@@ -444,7 +554,8 @@ func Read_Admin_Warning_List(T_pids string, T_tp []string, T_name string, T_hand
 }
 
 // 获取列表备份
-func Read_Warning_Backups(T_pid int, bindSN []string, T_year string, T_month string, tpList []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
+func Read_Warning_Backups(T_pid int, bindSN []string, T_year string, T_month string, tpList []string, T_name string, T_handle int, Time_start_ string,
+	Time_end_ string, page int, page_z int, countRedisKey string) (r []Warning_R, cnt int64) {
 
 	o := orm.NewOrm()
 	var maps []Warning
@@ -462,11 +573,6 @@ func Read_Warning_Backups(T_pid int, bindSN []string, T_year string, T_month str
 
 	sql_WHERE := ""
 
-	//cond := orm.NewCondition()
-	//
-	//cond1 := cond.And("T_State__gt", 0)
-	sql_WHERE += " t__state > 0"
-
 	if len(bindSN) > 0 {
 		sql_WHERE += fmt.Sprintf(" AND t_sn in (%s)", lib.StringListToQuotesDotStr(bindSN))
 	}
@@ -494,30 +600,40 @@ func Read_Warning_Backups(T_pid int, bindSN []string, T_year string, T_month str
 		Time_end_ = lib.ReplaceSQL(Time_end_)
 		sql_WHERE += fmt.Sprintf(" AND t__ut <= '%s'", Time_end_)
 	}
-	//不填或0:所有      1:已处理     2:未处理
+	//1:默认 2:全部记录 3 未处理
 	if T_handle == 1 {
-		//cond1 = cond1.And("T_Text__isnull", true)
 		sql_WHERE += " AND t__state > 1"
-	}
-	if T_handle == 3 {
-		//cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
+	} else if T_handle == 3 {
 		sql_WHERE += " AND t__state = 3"
+	} else {
+		sql_WHERE += " AND t__state > 0"
 	}
 
 	// -------------
 
-	sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE " + sql_WHERE
-	fmt.Println(sql)
-	_, err := o.Raw(sql).ValuesList(&maps_z)
+	// 从redis获取报警统计数量
+	cnt, err := Redis_WarningCount_GetOne(T_pid, countRedisKey)
 	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return r, 0
+		sql := "SELECT COUNT(*) FROM " + Wtab + " WHERE " + sql_WHERE
+		fmt.Println(sql)
+		_, err = o.Raw(sql).ValuesList(&maps_z)
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return r, 0
+		}
+		if len(maps_z) == 0 {
+			return r, 0
+		}
+		cnt, _ = strconv.ParseInt(maps_z[0][0].(string), 10, 64)
+
+		Redis_WarningCount_Set(T_pid, countRedisKey, cnt)
 	}
-	if len(maps_z) == 0 {
+	if cnt == 0 {
 		return r, 0
 	}
+
 	//fmt.Println("maps_z;",maps_z[0][0])
-	sql = "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
+	sql := "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
 		"FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY t__ut DESC"
 	if page_z != 9999 {
 		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
@@ -530,20 +646,19 @@ func Read_Warning_Backups(T_pid int, bindSN []string, T_year string, T_month str
 		return
 	}
 
-	key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
-
 	for _, v := range maps {
 		r = append(r, WarningToWarning_R(1, v))
 	}
 
-	return r, key
+	return r, cnt
 
 }
 
 // 获取管理员列表备份
-func Read_Admin_Warning_Backups(T_pids string, T_year string, T_month string, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
+func Read_Admin_Warning_Backups(admin Account.Admin, T_year string, T_month string, T_tp []string, T_name string, T_handle int,
+	Time_start_ string, Time_end_ string, page int, page_z int, countRedisKey string) (r []Warning_R, cnt int64) {
 
-	if len(T_pids) == 0 {
+	if len(admin.T_pids) == 0 {
 		return r, cnt
 	}
 
@@ -566,10 +681,8 @@ func Read_Admin_Warning_Backups(T_pids string, T_year string, T_month string, T_
 
 	sql_WHERE := ""
 
-	sql_WHERE += " t__state > 0"
-
-	if T_pids != "*" {
-		list := lib.SplitStringToDotStr(T_pids, "P")
+	if admin.T_pids != "*" {
+		list := lib.SplitStringToDotStr(admin.T_pids, "P")
 		sql_WHERE += fmt.Sprintf(" AND t_pid in (%s)", list)
 	}
 
@@ -594,29 +707,38 @@ func Read_Admin_Warning_Backups(T_pids string, T_year string, T_month string, T_
 	}
 	//1:默认 2:全部记录 3 未处理
 	if T_handle == 1 {
-		//cond1 = cond1.And("T_Text__isnull", true)
 		sql_WHERE += " AND t__state > 1"
-	}
-	if T_handle == 3 {
-		//cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
+	} else if T_handle == 3 {
 		sql_WHERE += " AND t__state = 3"
+	} else {
+		sql_WHERE += " AND t__state > 0"
 	}
+	sql_WHERE = strings.TrimLeft(sql_WHERE, " AND")
 
-	// -------------
-
-	sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE" + sql_WHERE
-	fmt.Println(sql)
-	_, err := o.Raw(sql).ValuesList(&maps_z)
+	// 从redis获取报警统计数量
+	cnt, err := Redis_WarningCount_GetOne(admin.Id, countRedisKey)
 	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return r, 0
+		sql := "SELECT COUNT(*) FROM " + Wtab + " WHERE " + sql_WHERE
+		fmt.Println(sql)
+		_, err = o.Raw(sql).ValuesList(&maps_z)
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return r, 0
+		}
+		if len(maps_z) == 0 {
+			return r, 0
+		}
+		cnt, _ = strconv.ParseInt(maps_z[0][0].(string), 10, 64)
+
+		Redis_WarningCount_Set(admin.Id, countRedisKey, cnt)
 	}
-	if len(maps_z) == 0 {
+	if cnt == 0 {
 		return r, 0
 	}
+
 	//fmt.Println("maps_z;",maps_z[0][0])
-	sql = "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
-		"FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY t__ut DESC"
+	sql := "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
+		"FROM " + Wtab + " WHERE " + sql_WHERE + " ORDER BY t__ut DESC"
 	if page_z != 9999 {
 		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
 	}
@@ -804,8 +926,12 @@ func Read_WarningCount_byDay(T_pids []int) (cnt int64) {
 	qs := o.QueryTable(new(Warning))
 	cond := orm.NewCondition()
 	yesterday := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
-	cond = cond.And("T_State__gt", 0).And("T_pid__in", T_pids).And("T_tp__in", RateType).And("CreateTime__gte", yesterday+" 00:00:00").And("CreateTime__lte", yesterday+" 23:59:59")
-
+	cond = cond.And("T_State__gt", 0).And("T_tp__in", RateType).And("CreateTime__gte", yesterday+" 00:00:00").And("CreateTime__lte", yesterday+" 23:59:59")
+	if len(T_pids) == 1 {
+		cond = cond.And("T_pid", T_pids[0])
+	} else if len(T_pids) > 1 {
+		cond = cond.And("T_pid__in", T_pids)
+	}
 	cnt, err := qs.SetCond((*orm2.Condition)(cond)).Count()
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
@@ -816,7 +942,8 @@ func Read_WarningCount_byDay(T_pids []int) (cnt int64) {
 }
 
 // 公司管理报警列表
-func Read_Company_Warning_List(T_pids []int, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []CompanyWarning_R, cnt int64) {
+func Read_Company_Warning_List(T_pids []int, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int,
+	T_pid int, countRedisKey string) (r []CompanyWarning_R, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -834,7 +961,11 @@ func Read_Company_Warning_List(T_pids []int, T_tp []string, T_name string, T_han
 
 	cond := orm.NewCondition()
 	cond1 := orm.NewCondition()
-	cond1 = cond1.And("T_pid__in", T_pids)
+	if len(T_pids) == 1 {
+		cond1 = cond1.And("T_pid", T_pids[0])
+	} else if len(T_pids) > 1 {
+		cond1 = cond1.And("T_pid__in", T_pids)
+	}
 
 	if len(T_tp) > 0 {
 		cond1 = cond1.And("T_tp__in", T_tp)
@@ -859,22 +990,30 @@ func Read_Company_Warning_List(T_pids []int, T_tp []string, T_name string, T_han
 	//1:默认 2:全部记录 3 未处理
 	if T_handle == 1 {
 		cond1 = cond1.And("T_State__gt", 1)
-	}
-	if T_handle == 2 {
-		cond1 = cond1.And("T_State__gt", 0)
-	}
-	if T_handle == 3 {
+	} else if T_handle == 3 {
 		cond1 = cond1.And("T_State", 3)
+	} else {
+		cond1 = cond1.And("T_State__gt", 0)
 	}
 
-	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
+	var err error
+	// 从redis获取报警统计数量
+	cnt, err = Redis_WarningCount_GetOne(T_pid, countRedisKey)
 	if err != nil {
-		logs.Error(lib.FuncName(), err)
+		cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return
+		}
+		Redis_WarningCount_Set(T_pid, countRedisKey, cnt)
+	}
+	if cnt == 0 {
+		return r, 0
 	}
-	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
-		return
 	}
 
 	for _, v := range map_r {
@@ -886,7 +1025,8 @@ func Read_Company_Warning_List(T_pids []int, T_tp []string, T_name string, T_han
 }
 
 // 获取公司管理列表备份
-func Read_Company_Warning_Backups(T_pids []int, T_year string, T_month string, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []CompanyWarning_R, cnt int64) {
+func Read_Company_Warning_Backups(T_pids []int, T_year string, T_month string, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string,
+	page int, page_z int, T_pid int, countRedisKey string) (r []CompanyWarning_R, cnt int64) {
 
 	if len(T_pids) == 0 {
 		return r, cnt
@@ -910,10 +1050,9 @@ func Read_Company_Warning_Backups(T_pids []int, T_year string, T_month string, T
 	}
 
 	sql_WHERE := ""
-
-	sql_WHERE += " t__state > 0"
-
-	if len(T_pids) > 0 {
+	if len(T_pids) == 1 {
+		sql_WHERE += fmt.Sprintf(" AND t_pid = %d", T_pids[0])
+	} else if len(T_pids) > 1 {
 		sql_WHERE += fmt.Sprintf(" AND t_pid in (%s)", lib.IntListToDotStr(T_pids))
 	}
 
@@ -938,29 +1077,36 @@ func Read_Company_Warning_Backups(T_pids []int, T_year string, T_month string, T
 	}
 	//1:默认 2:全部记录 3 未处理
 	if T_handle == 1 {
-		//cond1 = cond1.And("T_Text__isnull", true)
 		sql_WHERE += " AND t__state > 1"
-	}
-	if T_handle == 3 {
-		//cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
+	} else if T_handle == 3 {
 		sql_WHERE += " AND t__state = 3"
+	} else {
+		sql_WHERE += " AND t__state > 0"
 	}
+	sql_WHERE = strings.TrimLeft(sql_WHERE, " AND")
 
-	// -------------
-
-	sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE" + sql_WHERE
-	fmt.Println(sql)
-	_, err := o.Raw(sql).ValuesList(&maps_z)
+	// 从redis获取报警统计数量
+	cnt, err := Redis_WarningCount_GetOne(T_pid, countRedisKey)
 	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return r, 0
+		sql := "SELECT COUNT(*) FROM " + Wtab + " WHERE " + sql_WHERE
+		fmt.Println(sql)
+		_, err = o.Raw(sql).ValuesList(&maps_z)
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return r, 0
+		}
+		if len(maps_z) == 0 {
+			return r, 0
+		}
+		cnt, _ = strconv.ParseInt(maps_z[0][0].(string), 10, 64)
+
+		Redis_WarningCount_Set(T_pid, countRedisKey, cnt)
 	}
-	if len(maps_z) == 0 {
+	if cnt == 0 {
 		return r, 0
 	}
-	//fmt.Println("maps_z;",maps_z[0][0])
-	sql = "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
-		"FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY t__ut DESC"
+	sql := "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
+		"FROM " + Wtab + " WHERE " + sql_WHERE + " ORDER BY t__ut DESC"
 	if page_z != 9999 {
 		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
 	}
@@ -972,12 +1118,10 @@ func Read_Company_Warning_Backups(T_pids []int, T_year string, T_month string, T
 		return
 	}
 
-	key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
-
 	for _, v := range maps {
 		r = append(r, WarningToCompanyWarning_R(1, v))
 	}
 
-	return r, key
+	return r, cnt
 
 }

+ 12 - 0
models/Warning/WarningType.go

@@ -216,3 +216,15 @@ func Read_WarningType_Get(id int) string {
 		return "未知类型"
 	}
 }
+
+func Read_WarningType_Count() int64 {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(WarningType))
+	num, err := qs.Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return 0
+	}
+
+	return num
+}