소스 검색

2023-10-12

zoie 1 년 전
부모
커밋
48e968a3ff
3개의 변경된 파일398개의 추가작업 그리고 90개의 파일을 삭제
  1. 2 3
      controllers/Data.go
  2. 1 1
      models/Account/Company.go
  3. 395 86
      models/Device/DeviceSensor.go

+ 2 - 3
controllers/Data.go

@@ -113,7 +113,7 @@ func (c *DataController) Device_Sensor_List() {
 		c.ServeJSON()
 		return
 	}
-	r_jsons.DeviceSensor_lite, cnt = Device.Read_DeviceSensor_List_For_Data(c.Admin_r, bindSN, c.T_pid, T_name, T_Class_id, T_type, T_RealTime, T_MapShow, page, page_z)
+	r_jsons.DeviceSensor_lite, cnt = Device.Read_DeviceSensor_List_For_Data(bindSN, c.T_pid, T_name, T_Class_id, T_type, T_RealTime, T_MapShow, page, page_z)
 
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.Page = page
@@ -166,9 +166,8 @@ func (c *DataController) Company_Device_Sensor_List() {
 	// 查询公司下面所有子公司id
 	T_pids := Account.ReadCompanyIds_T_path(Company_r.T_path)
 	var cnt int64
-	Device.Read_DeviceSensorParameter_All_Map("", 0)
 	Account.Read_Company_All_Maps()
-	r_jsons.Data, cnt = Device.Read_CompanyDeviceSensor_List_For_Data(&c.Admin_r, T_pids, T_name, T_Class_id, T_type, T_RealTime, T_MapShow, page, page_z)
+	r_jsons.Data, cnt = Device.Read_CompanyDeviceSensor_List_For_Data(T_pids, T_name, T_Class_id, T_type, T_RealTime, T_MapShow, page, page_z)
 
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.Page = page

+ 1 - 1
models/Account/Company.go

@@ -597,6 +597,6 @@ func Read_Company_Get(id int) string {
 	if ok {
 		return v.(string)
 	} else {
-		return "未知公司名称"
+		return ""
 	}
 }

+ 395 - 86
models/Device/DeviceSensor.go

@@ -19,27 +19,29 @@ import (
 
 // 模板
 type DeviceSensor struct {
-	Id     int    `orm:"column(ID);size(11);auto;pk"`
-	T_sn   string `orm:"index;size(256);null"` // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
-	T_id   int    `orm:"index;size(11);null"`  // 传感器编号
-	T_name string `orm:"size(256);null"`       // 标题
-
-	T_pid      int    `orm:"index;size(256);null"`       // Account.Company 绑定公司
-	T_Class    string `orm:"size(256);null"`             // Device.DeviceClass.Id 设备分类  C1|C2|
-	T_Notice   string `orm:"size(256);null"`             // 通知绑定
-	T_datashow int    `orm:"index;size(2);default(1)"`   // 0 屏蔽数据展示  1 正常数据展示   (屏蔽后 数据展示无法看到,设备管理中 不受影响)
-	T_sort     int    `orm:"index;size(200);default(1)"` // 排序
-	T_3dview   string `orm:"size(256);null"`             // 3D 视图ID
-	T_type     int    `orm:"index;size(4);null"`         // Device.DeviceSensorType  1库房   2移动
-	T_link     int    `orm:"index;size(4):default(1)"`   // 0:断开/故障 1连接 实时数据
-	T_State    int    `orm:"index;size(2);default(1)"`   // 0 屏蔽   1 正常  (屏蔽后 只有内部管理员才能看到,用户 输入SN\名称 搜索时 也能看到)
+	Id   int    `orm:"column(ID);size(11);auto;pk"`
+	T_sn string `orm:"index;size(256);null"` // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
+	T_id int    `orm:"index;size(11);null"`  // 传感器编号
+	T_sp int    `orm:"size(11);null"`        // 传感器参数id
+
+	T_name string `orm:"size(256);null"` // 标题
+
+	T_pid      int    `orm:"index;size(256);null"`     // Account.Company 绑定公司
+	T_Class    string `orm:"size(256);null"`           // Device.DeviceClass.Id 设备分类  C1|C2|
+	T_Notice   string `orm:"size(256);null"`           // 通知绑定
+	T_datashow int    `orm:"size(2);default(1)"`       // 0 屏蔽数据展示  1 正常数据展示   (屏蔽后 数据展示无法看到,设备管理中 不受影响)
+	T_sort     int    `orm:"size(200);default(1)"`     // 排序
+	T_3dview   string `orm:"size(256);null"`           // 3D 视图ID
+	T_type     int    `orm:"size(4);null"`             // Device.DeviceSensorType  1库房   2移动
+	T_link     int    `orm:"size(4);default(1)"`       // 0:断开/故障 1连接 实时数据
+	T_State    int    `orm:"index;size(2);default(1)"` // 0 屏蔽   1 正常  (屏蔽后 只有内部管理员才能看到,用户 输入SN\名称 搜索时 也能看到)
 
 	// 设备同步参数
-	T_Dattery  int    `orm:"size(4);null"`             // 电量
-	T_Site     string `orm:"size(200);null"`           // GPS
-	T_monitor  int    `orm:"index;size(2);null"`       // 监控状态 0 未监控 1 监控
-	T_online   int    `orm:"index;size(2);default(1)"` // 在线状态 0 未启用  1 在线  2 离线
-	T_online_s int    `orm:"index;size(2);default(0)"` // 在线状态-备用  0 未启用  1 在线  2 离线
+	T_Dattery  int    `orm:"size(4);null"`       // 电量
+	T_Site     string `orm:"size(200);null"`     // GPS
+	T_monitor  int    `orm:"size(2);null"`       // 监控状态 0 未监控 1 监控
+	T_online   int    `orm:"size(2);default(1)"` // 在线状态 0 未启用  1 在线  2 离线
+	T_online_s int    `orm:"size(2);default(0)"` // 在线状态-备用  0 未启用  1 在线  2 离线
 
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
@@ -60,6 +62,9 @@ type DeviceSensor_R struct {
 	T_id   int    // 传感器编号
 	T_name string // 标题
 
+	T_pid      int    // 公司id
+	T_pid_name string // 公司名称
+
 	T_3dview   string // 3D 视图ID
 	T_sort     int    // 排序
 	T_Dattery  int    // 电量
@@ -101,7 +106,7 @@ type DeviceSensor_Applet struct {
 
 }
 
-type DeviceSensor_Company struct {
+type DeviceSensor_RealTime struct {
 	T_sn   string // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
 	T_id   int    // 传感器编号
 	T_name string // 标题
@@ -121,9 +126,14 @@ type DeviceSensor_Company struct {
 	T_link     int    // 0:断开/故障 1连接 实时数据
 	T_State    int    // 0 屏蔽   1 正常  (屏蔽后 只有内部管理员才能看到,用户 输入SN\名称 搜索时 也能看到)
 
-	T_DeviceSensorData      DeviceData_R            // 传感器最新数据
-	T_DeviceSensorParameter DeviceSensorParameter_R //  设备参数
-	T_DeviceSensorType      DeviceSensorType_R      //  传感器类型
+	// 传感器参数
+	// 报警
+	T_Tlower  float32 //  温度下限
+	T_Tupper  float32 //  温度上限
+	T_RHlower float32 //  湿度下限
+	T_RHupper float32 //  湿度上限
+	T_en      int     // en:是否启用传感器,
+	T_free    int     // free:监测点是否为闲置状态(空库,只监测不报警)
 
 }
 
@@ -233,6 +243,9 @@ func DeviceSensorToDeviceSensor_R(DeviceSensor_ DeviceSensor) (DeviceSensor_r De
 	DeviceSensor_r.T_sn = DeviceSensor_.T_sn
 	DeviceSensor_r.T_id = DeviceSensor_.T_id
 	DeviceSensor_r.T_name = DeviceSensor_.T_name
+	DeviceSensor_r.T_pid = DeviceSensor_.T_pid
+	DeviceSensor_r.T_pid_name = Account.Read_Company_Get(DeviceSensor_.T_pid)
+
 	DeviceSensor_r.T_Site = DeviceSensor_.T_Site
 	DeviceSensor_r.T_Dattery = DeviceSensor_.T_Dattery
 	DeviceSensor_r.T_monitor = DeviceSensor_.T_monitor
@@ -259,15 +272,15 @@ func DeviceSensorToDeviceSensor_R(DeviceSensor_ DeviceSensor) (DeviceSensor_r De
 	//key_data := DeviceSensor_.T_sn + "|" + strconv.Itoa(DeviceSensor_.T_id)
 	//DeviceSensor_r.T_DeviceSensorData, _ = RedisDeviceData_Get(key_data)
 	DeviceData := Read_DeviceData(DeviceSensor_.T_sn, DeviceSensor_.T_id)
-	//DeviceData, _ := RedisDeviceData_Get(DeviceSensor_.T_sn + "|" + strconv.Itoa(DeviceSensor_.T_id))
 
+	// 获取传感器数据
 	DeviceSensor_r.T_DeviceSensorData = DeviceDataToDeviceData_R2(device, DeviceSensor_r.T_DeviceSensorParameter, DeviceData)
 
-	deviceSensorType := Read_DeviceSensorType_Get(DeviceSensor_.T_type)
-	DeviceSensor_r.T_DeviceSensorType = DeviceSensorTypeToDeviceSensorType_R(deviceSensorType)
+	// 获取传感器类型数据
+	DeviceSensor_r.T_DeviceSensorType = DeviceSensorTypeToDeviceSensorType_R(DeviceSensor_.T_type)
 	return
 }
-func DeviceSensorToDeviceSensor_Company(DeviceSensor_ DeviceSensor) (DeviceSensor_r DeviceSensor_Company) {
+func DeviceSensorRealTimeToDeviceSensor_R(DeviceSensor_ DeviceSensor_RealTime) (DeviceSensor_r DeviceSensor_R) {
 
 	device, _ := Read_Device_ByT_sn(DeviceSensor_.T_sn)
 
@@ -295,23 +308,20 @@ func DeviceSensorToDeviceSensor_Company(DeviceSensor_ DeviceSensor) (DeviceSenso
 	DeviceSensor_r.T_online = DeviceSensor_.T_online
 	DeviceSensor_r.T_online_s = DeviceSensor_.T_online_s
 	DeviceSensor_r.T_monitor = DeviceSensor_.T_monitor
-	//if DeviceSensor_.T_online == 2 && (DeviceSensor_.T_online_s == 0 || DeviceSensor_.T_online_s == 2) && DeviceSensor_.T_monitor == 1 {
-	//	DeviceSensor_r.T_monitor = 2
-	//}
 
-	// 最新系统参数
-	DeviceSensor_r.T_DeviceSensorParameter, _ = Read_DeviceSensorParameter(DeviceSensor_.T_sn, DeviceSensor_.T_id)
+	// 传感器参数
+	DeviceSensor_r.T_DeviceSensorParameter.T_Tlower = DeviceSensor_.T_Tlower
+	DeviceSensor_r.T_DeviceSensorParameter.T_Tupper = DeviceSensor_.T_Tupper
+	DeviceSensor_r.T_DeviceSensorParameter.T_RHlower = DeviceSensor_.T_RHlower
+	DeviceSensor_r.T_DeviceSensorParameter.T_RHupper = DeviceSensor_.T_RHupper
+	DeviceSensor_r.T_DeviceSensorParameter.T_en = DeviceSensor_.T_en
+	DeviceSensor_r.T_DeviceSensorParameter.T_free = DeviceSensor_.T_free
 
-	// 最新数据
-	//key_data := DeviceSensor_.T_sn + "|" + strconv.Itoa(DeviceSensor_.T_id)
-	//DeviceSensor_r.T_DeviceSensorData, _ = RedisDeviceData_Get(key_data)
 	DeviceData := Read_DeviceData(DeviceSensor_.T_sn, DeviceSensor_.T_id)
-	//DeviceData, _ := RedisDeviceData_Get(DeviceSensor_.T_sn + "|" + strconv.Itoa(DeviceSensor_.T_id))
 
 	DeviceSensor_r.T_DeviceSensorData = DeviceDataToDeviceData_R2(device, DeviceSensor_r.T_DeviceSensorParameter, DeviceData)
 
-	deviceSensorType := Read_DeviceSensorType_Get(DeviceSensor_.T_type)
-	DeviceSensor_r.T_DeviceSensorType = DeviceSensorTypeToDeviceSensorType_R(deviceSensorType)
+	DeviceSensor_r.T_DeviceSensorType = DeviceSensorTypeToDeviceSensorType_R(DeviceSensor_.T_type)
 	return
 }
 
@@ -351,8 +361,7 @@ func DeviceSensorToDeviceSensor_Applet(DeviceSensor_ DeviceSensor) (DeviceSensor
 
 	DeviceSensor_r.T_DeviceSensorData = DeviceDataToDeviceData_R2(device, DeviceSensor_r.T_DeviceSensorParameter, DeviceData)
 
-	deviceSensorType := Read_DeviceSensorType_Get(DeviceSensor_.T_type)
-	DeviceSensor_r.T_DeviceSensorType = DeviceSensorTypeToDeviceSensorType_R(deviceSensorType)
+	DeviceSensor_r.T_DeviceSensorType = DeviceSensorTypeToDeviceSensorType_R(DeviceSensor_.T_type)
 	DeviceSensor_r.T_Device = DeviceToDevice_R(device)
 	return
 }
@@ -864,7 +873,8 @@ func Update_Device_To_DeviceSensor(r_Device Device) bool {
 }
 
 // 传感器管理列列表 -------------------
-func Read_DeviceSensorManageList(admin_r *Account.Admin, bindSN []string, T_pid int, T_name string, T_calss_id, T_en, T_free, T_datashow, T_sort, page, page_z int) (DeviceSensor_p []DeviceSensor_P, cnt int64) {
+// 与Read_DeviceSensorManageList功能一样(优化前)
+func Read_DeviceSensorManageList1(admin_r *Account.Admin, bindSN []string, T_pid int, T_name string, T_calss_id, T_en, T_free, T_datashow, T_sort, page, page_z int) (DeviceSensor_p []DeviceSensor_P, cnt int64) {
 	o := orm.NewOrm()
 	var maps []DeviceSensor_P
 	var maps_z []orm2.ParamsList
@@ -887,7 +897,7 @@ func Read_DeviceSensorManageList(admin_r *Account.Admin, bindSN []string, T_pid
 	}
 
 	if len(T_name) > 0 {
-		sql_WHERE += " AND (ds.t_sn like '%" + T_name + "%' OR t_name like '%" + T_name + "%')"
+		sql_WHERE += " AND (ds.t_sn like '%" + T_name + "%' OR ds.t_name like '%" + T_name + "%')"
 	}
 	if T_calss_id > 0 {
 		T_calss := "C" + strconv.Itoa(T_calss_id) + "|"
@@ -910,10 +920,7 @@ func Read_DeviceSensorManageList(admin_r *Account.Admin, bindSN []string, T_pid
 	}
 
 	// -------------
-	sql := "SELECT COUNT(ds.ID) FROM " + "device_sensor ds " +
-		"LEFT JOIN ( SELECT t_sn AS tsn,t_id AS tid,t_en,t_free " +
-		"FROM device_sensor_parameter WHERE id IN (SELECT MAX(id) FROM device_sensor_parameter WHERE t__state=1 GROUP BY t_sn,t_id)) AS dsp " +
-		"ON ds.t_sn = dsp.tsn AND ds.t_id = dsp.tid" + " WHERE " + sql_WHERE
+	sql := "SELECT COUNT(ds.ID) FROM " + "device_sensor ds WHERE " + sql_WHERE
 	fmt.Println(sql)
 	_, err := o.Raw(sql).ValuesList(&maps_z)
 	if err != nil {
@@ -950,11 +957,95 @@ func Read_DeviceSensorManageList(admin_r *Account.Admin, bindSN []string, T_pid
 	return DeviceSensor_p, key
 }
 
+// 使用联表查询
+func Read_DeviceSensorManageList(admin_r *Account.Admin, bindSN []string, T_pid int, T_name string, T_calss_id, T_en, T_free, T_datashow, T_sort, page, page_z int) (DeviceSensor_p []DeviceSensor_P, cnt int64) {
+	o := orm.NewOrm()
+	var maps []DeviceSensor_P
+	var maps_z []orm2.ParamsList
+
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	sql_WHERE := "t_pid = " + strconv.Itoa(T_pid)
+
+	if len(bindSN) > 0 {
+		sql_WHERE += fmt.Sprintf(" AND ds.t_sn in (%s)", lib.StringListToQuotesDotStr(bindSN))
+	}
+
+	if admin_r.T_pid > 0 {
+		sql_WHERE += " AND ds.t__state = 1"
+	}
+
+	if len(T_name) > 0 {
+		sql_WHERE += " AND (ds.t_sn like '%" + T_name + "%' OR ds.t_name like '%" + T_name + "%')"
+	}
+	if T_calss_id > 0 {
+		T_calss := "C" + strconv.Itoa(T_calss_id) + "|"
+		sql_WHERE += " AND t__class like '%" + T_calss + "%'"
+	}
+
+	if T_en != -1 {
+		sql_WHERE += " AND t_en = " + strconv.Itoa(T_en)
+	}
+	if T_free != -1 {
+		sql_WHERE += " AND t_free = " + strconv.Itoa(T_free)
+	}
+	if T_datashow != -1 {
+		sql_WHERE += " AND t_datashow =" + strconv.Itoa(T_datashow)
+	}
+
+	sql_ORDER := " ORDER BY t_sort ASC"
+	if T_sort == 1 {
+		sql_ORDER = " ORDER BY t_sort DESC"
+	}
+
+	// -------------
+	sql := "SELECT COUNT(ds.ID) FROM " + "device_sensor ds WHERE " + sql_WHERE
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return DeviceSensor_p, 0
+	}
+	if len(maps_z) == 0 {
+		return DeviceSensor_p, 0
+	}
+	//fmt.Println("maps_z;",maps_z[0][0])
+	//"LEFT JOIN (SELECT id,t_en,t_free,t__tlower,t__tupper,t__r_hlower,t__r_hupper,t_enprel,t_tprel,t_tpreu,t_hprel,t_hpreu " +
+	//"FROM device_sensor_parameter) dsp " +
+	sql = "SELECT ds.t_sn,ds.t_id,ds.t_name,t_type,t_sort,t_datashow,ds.t__state,t_en,t_free,t__tlower,t__tupper,t__r_hlower,t__r_hupper,t_enprel,t_tprel,t_tpreu,t_hprel,t_hpreu FROM device_sensor ds " +
+		"LEFT JOIN device_sensor_parameter dsp " +
+		"ON ds.t_sp=dsp.id " +
+		"WHERE " + sql_WHERE + sql_ORDER
+
+	if page_z != 9999 {
+		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+	}
+
+	fmt.Println(sql)
+	_, err = o.Raw(sql).QueryRows(&maps)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
+
+	for _, v := range maps {
+		DeviceSensor_p = append(DeviceSensor_p, DeviceSensorToDeviceSensor_P(v))
+	}
+
+	return DeviceSensor_p, key
+}
+
 // 数据展示菜单下 传感器参数列表
 // 实时数据页面 温湿度异常数据往前排
 // 轨迹展示页面
-func Read_DeviceSensor_List_For_Data(admin Account.Admin, bindSN []string, T_pid int, T_name string, T_Class_id, T_type, T_RealTime, T_MapShow int, page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
-
+func Read_DeviceSensor_List_For_Data(bindSN []string, T_pid int, T_name string, T_Class_id, T_type, T_RealTime, T_MapShow int, page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 
@@ -976,29 +1067,19 @@ func Read_DeviceSensor_List_For_Data(admin Account.Admin, bindSN []string, T_pid
 
 	if T_Class_id > 0 {
 		T_Class := "C" + strconv.Itoa(T_Class_id) + "|"
-		fmt.Println("T_Class:", T_Class)
 		cond1 = cond1.And("T_Class__icontains", T_Class)
 	}
 
 	if T_type > 0 {
 		cond1 = cond1.And("T_type", T_type)
 	}
-	if admin.T_pid > 0 {
-		if len(T_name) >= 16 {
-			cond1 = cond1.And("T_sn", T_name)
-		} else if len(T_name) > 0 && len(T_name) < 16 {
-			cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_sn__icontains", T_name)).And("T_State", 1).And("T_datashow", 1)
-		} else {
-			cond1 = cond1.And("T_State", 1).And("T_datashow", 1)
-		}
+
+	if len(T_name) >= 16 {
+		cond1 = cond1.And("T_sn", T_name)
+	} else if len(T_name) > 0 && len(T_name) < 16 {
+		cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_sn__icontains", T_name)).And("T_State", 1).And("T_datashow", 1)
 	} else {
-		if len(T_name) >= 16 {
-			cond1 = cond1.And("T_sn", T_name)
-		} else if len(T_name) > 0 && len(T_name) < 16 {
-			cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_sn__icontains", T_name)).And("T_State", 1).And("T_datashow", 1)
-		} else {
-			cond1 = cond1.And("T_State", 1).And("T_datashow", 1)
-		}
+		cond1 = cond1.And("T_State", 1).And("T_datashow", 1)
 	}
 
 	if T_MapShow == 1 {
@@ -1028,8 +1109,8 @@ func Read_DeviceSensor_List_For_Data(admin Account.Admin, bindSN []string, T_pid
 		for _, v := range r {
 			v_r := DeviceSensorToDeviceSensor_R(v)
 			data := v_r.T_DeviceSensorData
-			// 温度或者湿度不在正常区间,排在最前面
-			if data.T_t > data.T_tu || data.T_t < data.T_tl || data.T_rh > data.T_rhu || data.T_rh < data.T_rhl {
+			// 状态在监控中,温度或者湿度不在正常区间,排在最前面
+			if (data.T_t > data.T_tu || data.T_t < data.T_tl || data.T_rh > data.T_rhu || data.T_rh < data.T_rhl) && v.T_monitor == 1 && v_r.T_DeviceSensorParameter.T_free == 0 {
 				DeviceSensor_unusual = append(DeviceSensor_unusual, v_r)
 			} else {
 				DeviceSensor_r = append(DeviceSensor_r, v_r)
@@ -1051,9 +1132,119 @@ func Read_DeviceSensor_List_For_Data(admin Account.Admin, bindSN []string, T_pid
 	return DeviceSensor_r, cnt
 }
 
+// 与Read_DeviceSensor_List_For_Data功能一样(优化前)
+func Read_DeviceSensor_List_For_Data1(bindSN []string, T_pid int, T_name string, T_Class_id, T_type, T_RealTime, T_MapShow int,
+	page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
+
+	o := orm.NewOrm()
+	var maps_z []orm2.ParamsList
+
+	// 也可以直接使用 Model 结构体作为表名
+
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	var r []DeviceSensor_RealTime
+	sql_WHERE := "t_pid = " + strconv.Itoa(T_pid)
+	if len(bindSN) > 0 {
+		sql_WHERE += fmt.Sprintf(" AND t_sn in (%s) ", lib.StringListToDotStr(bindSN))
+
+	}
+
+	if T_Class_id > 0 {
+		T_calss := "C" + strconv.Itoa(T_Class_id) + "|"
+		sql_WHERE += " AND t__class like '%" + T_calss + "%'"
+	}
+
+	if T_type > 0 {
+		sql_WHERE += " AND t_type = " + strconv.Itoa(T_type)
+	}
+
+	if len(T_name) >= 16 {
+		sql_WHERE += " AND t_sn = '" + T_name + "'"
+	} else if len(T_name) > 0 && len(T_name) < 16 {
+		sql_WHERE += " AND (ds.t_sn like '%" + T_name + "%' OR ds.t_name like '%" + T_name + "%') AND ds.t__state = 1 AND t_datashow = 1"
+
+	} else {
+		sql_WHERE += " AND ds.t__state = 1 AND t_datashow = 1"
+	}
+
+	if T_MapShow == 1 {
+		sql_WHERE += " AND t__site is not null"
+	}
+	// -------------
+	sql := "SELECT COUNT(*) FROM " + "device_sensor ds WHERE " + sql_WHERE
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return DeviceSensor_r, 0
+	}
+	if len(maps_z) == 0 {
+		return DeviceSensor_r, 0
+	}
+	cnt, _ = strconv.ParseInt(maps_z[0][0].(string), 10, 64)
+
+	sql = "SELECT *,ds.t_sn as t_sn,ds.t_id as t_id,ds.t_name as t_name,ds.t__state as t__state FROM device_sensor ds " +
+		"LEFT JOIN device_sensor_parameter dsp " +
+		"ON ds.t_sp=dsp.id " +
+		"WHERE " + sql_WHERE + " ORDER BY ds.t_sort, ds.id  ASC"
+	realTimeSql := sql
+	if page_z != 9999 {
+		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+	}
+
+	fmt.Println(sql)
+	_, err = o.Raw(sql).QueryRows(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	if T_RealTime == 1 {
+		offset_z := offset + page_z
+		if cnt < int64(offset_z) {
+			offset_z = int(cnt)
+		}
+		if offset > offset_z {
+			offset = offset_z
+		}
+		_, err = o.Raw(realTimeSql).QueryRows(&r)
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return
+		}
+		var DeviceSensor_unusual []DeviceSensor_R
+		stime := time.Now()
+		for _, v := range r {
+			v_r := DeviceSensorRealTimeToDeviceSensor_R(v)
+			data := v_r.T_DeviceSensorData
+			// 温度或者湿度不在正常区间,排在最前面
+			if (data.T_t > data.T_tu || data.T_t < data.T_tl || data.T_rh > data.T_rhu || data.T_rh < data.T_rhl) && v.T_monitor == 1 && v_r.T_DeviceSensorParameter.T_free == 0 {
+				DeviceSensor_unusual = append(DeviceSensor_unusual, v_r)
+			} else {
+				DeviceSensor_r = append(DeviceSensor_r, v_r)
+			}
+		}
+		DeviceSensor_unusual = append(DeviceSensor_unusual, DeviceSensor_r...)
+		fmt.Println("================", time.Now().Sub(stime).Seconds())
+		return DeviceSensor_unusual[offset:offset_z], cnt
+	}
+
+	for _, v := range r {
+		DeviceSensor_r = append(DeviceSensor_r, DeviceSensorRealTimeToDeviceSensor_R(v))
+	}
+
+	return DeviceSensor_r, cnt
+}
+
 // 公司管理 实时数据
 // 查询当前公司及其下面所有子公司的传感器列表
-func Read_CompanyDeviceSensor_List_For_Data(admin *Account.Admin, T_pids []int, T_name string, T_Class_id, T_type, T_RealTime, T_MapShow int, page int, page_z int) (DeviceSensor_r []DeviceSensor_Company, cnt int64) {
+func Read_CompanyDeviceSensor_List_For_Data(T_pids []int, T_name string, T_Class_id, T_type, T_RealTime, T_MapShow int, page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -1080,22 +1271,12 @@ func Read_CompanyDeviceSensor_List_For_Data(admin *Account.Admin, T_pids []int,
 		cond1 = cond1.And("T_type", T_type)
 	}
 
-	if admin.T_pid > 0 {
-		if len(T_name) >= 16 {
-			cond1 = cond1.And("T_sn", T_name)
-		} else if len(T_name) > 0 && len(T_name) < 16 {
-			cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_sn__icontains", T_name)).And("T_State", 1).And("T_datashow", 1)
-		} else {
-			cond1 = cond1.And("T_State", 1).And("T_datashow", 1)
-		}
+	if len(T_name) >= 16 {
+		cond1 = cond1.And("T_sn", T_name)
+	} else if len(T_name) > 0 && len(T_name) < 16 {
+		cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_sn__icontains", T_name)).And("T_State", 1).And("T_datashow", 1)
 	} else {
-		if len(T_name) >= 16 {
-			cond1 = cond1.And("T_sn", T_name)
-		} else if len(T_name) > 0 && len(T_name) < 16 {
-			cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_sn__icontains", T_name)).And("T_State", 1).And("T_datashow", 1)
-		} else {
-			cond1 = cond1.And("T_State", 1).And("T_datashow", 1)
-		}
+		cond1 = cond1.And("T_State", 1).And("T_datashow", 1)
 	}
 
 	if T_MapShow == 1 {
@@ -1121,18 +1302,21 @@ func Read_CompanyDeviceSensor_List_For_Data(admin *Account.Admin, T_pids []int,
 			logs.Error(lib.FuncName(), err)
 			return
 		}
-		var DeviceSensor_unusual []DeviceSensor_Company
+		var DeviceSensor_unusual []DeviceSensor_R
+		stime := time.Now()
 		for _, v := range r {
-			v_r := DeviceSensorToDeviceSensor_Company(v)
+			v_r := DeviceSensorToDeviceSensor_R(v)
 			data := v_r.T_DeviceSensorData
 			// 温度或者湿度不在正常区间,排在最前面
-			if data.T_t > data.T_tu || data.T_t < data.T_tl || data.T_rh > data.T_rhu || data.T_rh < data.T_rhl {
+			if (data.T_t > data.T_tu || data.T_t < data.T_tl || data.T_rh > data.T_rhu || data.T_rh < data.T_rhl) && v.T_monitor == 1 && v_r.T_DeviceSensorParameter.T_free == 0 {
 				DeviceSensor_unusual = append(DeviceSensor_unusual, v_r)
 			} else {
 				DeviceSensor_r = append(DeviceSensor_r, v_r)
 			}
 		}
 		DeviceSensor_unusual = append(DeviceSensor_unusual, DeviceSensor_r...)
+		fmt.Println("================", time.Now().Sub(stime).Seconds())
+
 		return DeviceSensor_unusual[offset:offset_z], cnt
 	}
 
@@ -1143,10 +1327,121 @@ func Read_CompanyDeviceSensor_List_For_Data(admin *Account.Admin, T_pids []int,
 	}
 
 	for _, v := range r {
-		DeviceSensor_r = append(DeviceSensor_r, DeviceSensorToDeviceSensor_Company(v))
+		DeviceSensor_r = append(DeviceSensor_r, DeviceSensorToDeviceSensor_R(v))
 	}
 	return DeviceSensor_r, cnt
 }
+func Read_CompanyDeviceSensor_List_For_Data1(T_pids []int, T_name string, T_Class_id, T_type, T_RealTime, T_MapShow int,
+	page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
+
+	o := orm.NewOrm()
+	var maps_z []orm2.ParamsList
+
+	// 也可以直接使用 Model 结构体作为表名
+
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	var r []DeviceSensor_RealTime
+	sql_WHERE := ""
+	if len(T_pids) == 1 {
+		sql_WHERE += " AND t_pid = " + strconv.Itoa(T_pids[0])
+	} else if len(T_pids) > 1 {
+		sql_WHERE += fmt.Sprintf(" AND t_pid in (%s) ", lib.IntListToDotStr(T_pids))
+
+	}
+
+	if T_Class_id > 0 {
+		T_calss := "C" + strconv.Itoa(T_Class_id) + "|"
+		sql_WHERE += " AND t__class like '%" + T_calss + "%'"
+	}
+
+	if T_type > 0 {
+		sql_WHERE += " AND t_type = " + strconv.Itoa(T_type)
+	}
+
+	if len(T_name) >= 16 {
+		sql_WHERE += " AND t_sn = '" + T_name + "'"
+	} else if len(T_name) > 0 && len(T_name) < 16 {
+		sql_WHERE += " AND (ds.t_sn like '%" + T_name + "%' OR ds.t_name like '%" + T_name + "%') AND ds.t__state = 1 AND t_datashow = 1"
+
+	} else {
+		sql_WHERE += " AND ds.t__state = 1 AND t_datashow = 1"
+	}
+
+	if T_MapShow == 1 {
+		sql_WHERE += " AND t__site is not null"
+	}
+	sql_WHERE = strings.TrimLeft(sql_WHERE, " AND")
+	// -------------
+	sql := "SELECT COUNT(*) FROM " + "device_sensor ds WHERE " + sql_WHERE
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return DeviceSensor_r, 0
+	}
+	if len(maps_z) == 0 {
+		return DeviceSensor_r, 0
+	}
+	cnt, _ = strconv.ParseInt(maps_z[0][0].(string), 10, 64)
+
+	sql = "SELECT *,ds.t_sn as t_sn,ds.t_id as t_id,ds.t_name as t_name,ds.t__state as t__state FROM device_sensor ds " +
+		"LEFT JOIN device_sensor_parameter dsp " +
+		"ON ds.t_sp=dsp.id " +
+		"WHERE " + sql_WHERE + " ORDER BY ds.t_sort, ds.id  ASC"
+	realTimeSql := sql
+	if page_z != 9999 {
+		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+	}
+
+	fmt.Println(sql)
+	_, err = o.Raw(sql).QueryRows(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	if T_RealTime == 1 {
+		offset_z := offset + page_z
+		if cnt < int64(offset_z) {
+			offset_z = int(cnt)
+		}
+		if offset > offset_z {
+			offset = offset_z
+		}
+		_, err = o.Raw(realTimeSql).QueryRows(&r)
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return
+		}
+		var DeviceSensor_unusual []DeviceSensor_R
+		stime := time.Now()
+		for _, v := range r {
+			v_r := DeviceSensorRealTimeToDeviceSensor_R(v)
+			data := v_r.T_DeviceSensorData
+			// 温度或者湿度不在正常区间,排在最前面
+			if (data.T_t > data.T_tu || data.T_t < data.T_tl || data.T_rh > data.T_rhu || data.T_rh < data.T_rhl) && v.T_monitor == 1 && v_r.T_DeviceSensorParameter.T_free == 0 {
+				DeviceSensor_unusual = append(DeviceSensor_unusual, v_r)
+			} else {
+				DeviceSensor_r = append(DeviceSensor_r, v_r)
+			}
+		}
+		DeviceSensor_unusual = append(DeviceSensor_unusual, DeviceSensor_r...)
+		fmt.Println("================", time.Now().Sub(stime).Seconds())
+		return DeviceSensor_unusual[offset:offset_z], cnt
+	}
+
+	for _, v := range r {
+		DeviceSensor_r = append(DeviceSensor_r, DeviceSensorRealTimeToDeviceSensor_R(v))
+	}
+
+	return DeviceSensor_r, cnt
+}
 
 // 获取列表
 func Read_DeviceSensor_T_type(T_pid int, bindSN []string) (lists orm2.ParamsList, err error) {
@@ -1286,3 +1581,17 @@ func Read_DeviceSensorCount_ByT_pids(T_pids []int) (cnt int64) {
 
 	return cnt
 }
+
+func Read_DeviceSensor_All() (DeviceSensor_r []DeviceSensor) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+
+	qs := o.QueryTable(new(DeviceSensor))
+	_, err := qs.All(&DeviceSensor_r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	return DeviceSensor_r
+}