Jelajahi Sumber

add:数据源管理

zoie 2 tahun lalu
induk
melakukan
98f8bbc9a1

+ 8 - 1
Nats/Nats.go

@@ -243,7 +243,14 @@ func NatsInit() {
 			return
 		}
 
-		power, _ := Account.Read_Power_ById(t_Req.Power_Id)
+		power, err := Account.Read_Power_ById(t_Req.Power_Id)
+
+		if err != nil {
+			t_R.Code = 202
+			t_R.Msg = err.Error()
+			b, _ := msgpack.Marshal(&t_R)
+			_ = lib.Nats.Publish(m.Reply, b)
+		}
 
 		flag := false
 		if power.T_menu == "*" {

+ 7 - 5
conf/app.conf

@@ -26,9 +26,10 @@ MysqlServer_Debug = true
 
 # Redis
 # Redis
-Redis_address = "127.0.0.1:43379"
+# Redis_address = "127.0.0.1:43379"
+Redis_address = "175.178.229.79:30379"
 Redis_password = ""
-Redis_dbNum = "1"
+Redis_dbNum = "5"
 
 # 静态资源
 Qiniu_AccessKey = "-8ezB_d-8-eUFTMvhOGbGzgeQRPeKQnaQ3DBcUxo"
@@ -39,6 +40,7 @@ Qiniu_Url = "https://coldoss.coldbaozhida.com/"
 # Panel
 Panel_url = "http://127.0.0.1:6204/Cold_Panel"
 
-FilterExcludeURL = /Login_verification
-# 小程序接口 /DeviceWarning/DeviceSensor_List,/DeviceSensor/Stat,/DeviceSensor/Stat_List,/DeviceSensorType/List
-FilterOnlyLoginCheckURL = /Menu/List,/User/Info,/User/Home,/User/Post,/UpFileToken,/User/WxQRCode,/Company/Get,/DeviceWarning/DeviceSensor_List,/DeviceSensor/Stat,/DeviceSensor/Stat_List,/DeviceSensorType/List
+FilterExcludeURL = /Login_verification,/Data/List
+# 小程序 冷链验证 /Data/List
+# 小程序接口 /DeviceWarning/DeviceSensor_List,/Device/Applet_Stat_View2,/DeviceSensor/Applet_List_View1,/DeviceSensor/Applet_List_View2,/DeviceSensorType/List,/Device/DeviceTask_Post
+FilterOnlyLoginCheckURL = /Menu/List,/User/Info,/User/Home,/User/Post,/UpFileToken,/User/WxQRCode,/Company/Get,/DeviceWarning/DeviceSensor_List,/Device/Applet_Stat_View2,/DeviceSensor/Applet_List_View1,/DeviceSensor/Applet_List_View2,/DeviceSensorType/List,/Device/DeviceTask_Post,/Data/DeviceSensor_Data_Print

+ 84 - 29
controllers/Data.go

@@ -31,11 +31,14 @@ func (c *DataController) Prepare() {
 	if len(User_tokey) == 0 {
 		User_tokey = GetString
 	}
-
+	if Account.Admin_r == nil {
+		return
+	}
 	c.Admin_r = *Account.Admin_r
 	T_pid := c.Admin_r.T_pid
-	if T_pid == 0 {
-		T_pid, _ = Account.Redis_Tokey_T_pid_Get(User_tokey)
+	EntryPid, _ := Account.Redis_Tokey_T_pid_Get(User_tokey)
+	if EntryPid > 0 {
+		T_pid = EntryPid
 	}
 	c.T_pid = T_pid
 }
@@ -104,7 +107,7 @@ func (c *DataController) Device_Sensor_List() {
 	r_jsons.DeviceSensor_lite, cnt = Device.Read_DeviceSensor_List_For_Data(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 = int(page)
+	r_jsons.Page = page
 	r_jsons.Page_size = int(page_size)
 	r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
 	r_jsons.Num = int(cnt)
@@ -241,19 +244,19 @@ func (c *DataController) Device_Sensor_Data_Excel() {
 
 		if v.T_ist == 1 {
 			f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_t)
+			f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), strconv.FormatFloat(float64(v.T_tl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_tu), 'f', 2, 64))
 			if v.T_t < v.T_tl || v.T_t > v.T_tu {
 				f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleLower)
 			}
 		}
 		if v.T_ish == 1 {
 			f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_rh)
+			f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), strconv.FormatFloat(float64(v.T_rhl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_rhu), 'f', 2, 64))
 			if v.T_rh < v.T_rhl || v.T_rh > v.T_rhu {
 				f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleUpper)
 			}
 		}
 
-		f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), strconv.FormatFloat(float64(v.T_tl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_tu), 'f', 2, 64))
-		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), strconv.FormatFloat(float64(v.T_rhl), 'f', 2, 64)+"~"+strconv.FormatFloat(float64(v.T_rhu), 'f', 2, 64))
 		f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_time)
 		//if v.T_ist == 1 && (v.T_t < v.T_tl || v.T_t > v.T_tu) {
 		//	f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("G%d", line), headStyleLower)
@@ -406,11 +409,10 @@ func (c *DataController) Device_Sensor_Data_Excel_m() {
 	return
 }
 
-// 列表 - 接口
+// 小程序 - 打印
 func (c *DataController) DeviceSensor_Data_Print() {
 
 	SN := c.GetString("T_sn")
-	T_id, _ := c.GetInt("T_id")
 	Time_start := c.GetString("Time_start")
 	Time_end := c.GetString("Time_end")
 
@@ -425,25 +427,58 @@ func (c *DataController) DeviceSensor_Data_Print() {
 
 	r_jsons := make(map[string]R_JSONS)
 
+	type JSONS struct {
+		//必须的大写开头
+		Code            int16
+		Msg             string
+		DeviceSensorNum int
+		DeviceSensor    Device.DeviceSensor_Applet
+		AdminNane       string
+		Data            interface{} // 泛型
+	}
+
 	GROUP_BY_t_time := Device.Read_DeviceData_List_GROUP_BY_t_time(SN, Time_start, Time_end)
 	// 时间 MAP
 	for _, vt := range GROUP_BY_t_time {
-		tt := lib.To_string(vt[0])
-		r_jsons[tt] = R_JSONS{T_time: tt, T1: nil, T2: nil, T3: nil, T4: nil}
+		stamp, _ := time.Parse("2006-1-02 15:04:05", lib.To_string(vt[0]))
+		T_time := stamp.Format("2006-01-02 15:04:05")
+		r_jsons[T_time] = R_JSONS{T_time: T_time, T1: nil, T2: nil, T3: nil, T4: nil}
 	}
-	// 记录传感器
-	Device.Read_DeviceSensorParameter_All_Map(SN, T_id)
-	maps, num := Device.Read_DeviceData_ById_List(SN, T_id, Time_start, Time_end, 1, 9999)
-	if num > 0 {
-		for _, v_map := range maps {
-			ws, ok := r_jsons[v_map.T_time] /*如果确定是真实的,则存在,否则不存在 */
-			if ok {
-				ws.T1 = v_map
-				r_jsons[v_map.T_time] = ws
+
+	dsList := Device.Read_DeviceSensor_List_T_sn_T_datashow(SN)
+	if len(dsList) == 0 {
+		c.Data["json"] = JSONS{Code: 200, Msg: "ok!", DeviceSensorNum: len(dsList), Data: r_jsons}
+		c.ServeJSON()
+		return
+	}
+
+	company, _ := Account.Read_Company_ById(c.T_pid)
+	for i, v := range dsList {
+		if i >= 4 {
+			break
+		}
+		// 记录传感器
+		maps, num := Device.Read_DeviceData_ById_List(SN, v.T_id, Time_start, Time_end, 1, 9999)
+		if num > 0 {
+			for _, v_map := range maps {
+				ws, ok := r_jsons[v_map.T_time]
+				if ok {
+					switch i {
+					case 0:
+						ws.T1 = v_map
+					case 1:
+						ws.T2 = v_map
+					case 2:
+						ws.T3 = v_map
+					case 3:
+						ws.T4 = v_map
+					}
+					r_jsons[v_map.T_time] = ws
+				}
 			}
 		}
 	}
-	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.Data["json"] = JSONS{Code: 200, Msg: "ok!", DeviceSensorNum: len(dsList), DeviceSensor: Device.DeviceSensorToDeviceSensor_Applet(dsList[0]), AdminNane: company.T_name, Data: r_jsons}
 	c.ServeJSON()
 	return
 }
@@ -520,8 +555,14 @@ func (c *DataController) Device_Sensor_Data_PDF() {
 		c.ServeJSON()
 		return
 	}
+
+	var s_time, e_time string
+	if len(DeviceSensor_data) > 0 {
+		s_time = fmt.Sprintf("%s", DeviceSensor_data[0].T_time)
+		e_time = fmt.Sprintf("%s", DeviceSensor_data[len(DeviceSensor_data)-1].T_time)
+	}
 	//fmt.Sprintf(" %.1f ", v.T_t)
-	lib.RectFillColor(pdf, "历史数据["+Time_start+" / "+Time_end+"]", 14, 22, 80, 550, 40, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	lib.RectFillColor(pdf, "历史数据["+e_time+" / "+s_time+"]", 14, 22, 80, 550, 40, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 
 	lib.RectFillColor(pdf, "序号", 12, 22, 120, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 	lib.RectFillColor(pdf, "传感器名称", 12, 52, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
@@ -562,14 +603,23 @@ func (c *DataController) Device_Sensor_Data_PDF() {
 		//	T_Rlu = "-"
 		//}
 
+		if v.T_ist == 1 {
+			lib.RectFillColor(pdf, T_t, 10, 152, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			lib.RectFillColor(pdf, T_Tlu, 10, 272, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		} else {
+			lib.RectFillColor(pdf, "", 10, 152, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			lib.RectFillColor(pdf, "", 10, 272, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		}
+		if v.T_ish == 1 {
+			lib.RectFillColor(pdf, T_rh, 10, 212, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			lib.RectFillColor(pdf, T_Rlu, 10, 362, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		} else {
+			lib.RectFillColor(pdf, "", 10, 212, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			lib.RectFillColor(pdf, "", 10, 362, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		}
+
 		lib.RectFillColor(pdf, text, 10, 22, y, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 		lib.RectFillColor(pdf, v.T_name, 10, 52, y, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
-		lib.RectFillColor(pdf, T_t, 10, 152, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
-		lib.RectFillColor(pdf, T_rh, 10, 212, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
-
-		lib.RectFillColor(pdf, T_Tlu, 10, 272, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
-
-		lib.RectFillColor(pdf, T_Rlu, 10, 362, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 
 		lib.RectFillColor(pdf, T_time, 10, 452, y, 120, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 		y += 20
@@ -728,8 +778,13 @@ func (c *DataController) Device_Sensor_Data_BackUp_PDF() {
 		c.ServeJSON()
 		return
 	}
+	var s_time, e_time string
+	if len(DeviceSensor_data) > 0 {
+		s_time = fmt.Sprintf("%s", DeviceSensor_data[0].T_time)
+		e_time = fmt.Sprintf("%s", DeviceSensor_data[len(DeviceSensor_data)-1].T_time)
+	}
 	//fmt.Sprintf(" %.1f ", v.T_t)
-	lib.RectFillColor(pdf, "历史数据["+Time_start+" / "+Time_end+"]", 14, 22, 80, 550, 40, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	lib.RectFillColor(pdf, "历史数据["+e_time+" / "+s_time+"]", 14, 22, 80, 550, 40, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 
 	lib.RectFillColor(pdf, "序号", 12, 22, 120, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 	lib.RectFillColor(pdf, "传感器名称", 12, 52, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
@@ -785,7 +840,7 @@ func (c *DataController) Device_Sensor_Data_BackUp_PDF() {
 
 	deviceSensor, _ := Device.Read_DeviceSensor_ByT_sn(T_sn, T_id)
 	rand_x := int64(lib.Random(0, 10000))
-	filenameStr := fmt.Sprintf("backup/sn/%s_%s_%s.pdf", lib.GetRandstring(8, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", rand_x), date.Format("2006_01_02"), deviceSensor.T_name)
+	filenameStr := fmt.Sprintf("backup/sn/%s_%s(%s).pdf", lib.GetRandstring(8, "0123456789", rand_x), deviceSensor.T_name, date.Format("2006-01-02"))
 
 	err = pdf.WritePdf(filenameStr)
 	if err != nil {

+ 221 - 0
controllers/DataSource.go

@@ -0,0 +1,221 @@
+package controllers
+
+import (
+	"Cold_Api/conf"
+	"Cold_Api/controllers/lib"
+	"Cold_Api/models/Account"
+	"Cold_Api/models/DataSource"
+	"Cold_Api/models/System"
+	"fmt"
+	beego "github.com/beego/beego/v2/server/web"
+	"math"
+	"strconv"
+	"strings"
+)
+
+type DataSourceController struct {
+	beego.Controller
+	Admin_r Account.Admin // 登陆的用户
+}
+
+func (c *DataSourceController) Prepare() {
+	GetCookie := c.Ctx.GetCookie("User_tokey")
+	GetString := c.GetString("User_tokey")
+
+	User_tokey := GetCookie
+	if len(User_tokey) == 0 {
+		User_tokey = GetString
+	}
+
+	c.Admin_r = *Account.Admin_r
+}
+
+func (c *DataSourceController) DataSource_Exec() {
+
+	type R_JSONS struct {
+		//必须的大写开头
+		Data interface{}
+	}
+
+	var r_jsons R_JSONS
+	var T_data_list []string
+
+	T_dataSource_id := c.GetString("T_dataSource_id")
+
+	T_data := c.GetString("T_data")
+	T_pid, _ := c.GetInt("T_pid")
+	T_data = strings.TrimLeft(T_data, "[")
+	T_data = strings.TrimRight(T_data, "]")
+	if len(T_data) > 0 {
+		T_data_list = strings.Split(T_data, ",")
+	}
+
+	// 操作pid
+	company_r, err := Account.Read_Company_ById(T_pid)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	visit := false
+	if c.Admin_r.T_pid > 0 && (c.Admin_r.T_pid == T_pid || strings.Contains(company_r.T_path, fmt.Sprintf("/%d/", c.Admin_r.T_pid))) {
+		visit = true
+	}
+
+	if c.Admin_r.T_pid == 0 {
+		if c.Admin_r.T_pids == "*" {
+			visit = true
+		}
+		pids := lib.SplitStringToIntIds(c.Admin_r.T_pids, "P")
+
+		for _, v := range pids {
+			if T_pid == v {
+				visit = true
+				break
+			}
+		}
+	}
+
+	if !visit {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权查看!"}
+		c.ServeJSON()
+		return
+	}
+
+	var data []interface{}
+
+	for _, v := range T_data_list {
+		data = append(data, v)
+	}
+
+	dataSource, err := DataSource.Read_DataSource_ByT_id(T_dataSource_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_dataSource_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_data_list) != strings.Count(dataSource.T_sql, "?") {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sql: expected %d arguments, got %d!", strings.Count(dataSource.T_sql, "?"), len(T_data_list))}
+		c.ServeJSON()
+		return
+	}
+
+	sql := strings.Replace(dataSource.T_sql, "@pid", fmt.Sprintf("t_pid = %d", T_pid), -1)
+
+	r_jsons.Data = DataSource.Exec_DataSource_Sql(sql, data)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+func (c *DataSourceController) DataSource_List() {
+	type R_JSONS struct {
+		//必须的大写开头
+		Data      []DataSource.DataSource_R
+		Num       int64
+		Page      int
+		Page_size int
+	}
+
+	var r_jsons R_JSONS
+
+	T_name := c.GetString("T_name")
+	page, _ := c.GetInt("page")
+
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	r_jsons.Data, r_jsons.Num = DataSource.Read_DataSource_List(T_name, page, page_z)
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+func (c *DataSourceController) DataSource_Add() {
+
+	T_name := c.GetString("T_name")
+	T_sql := c.GetString("T_sql")
+
+	var_ := DataSource.DataSource{
+		T_name: T_name,
+		T_sql:  T_sql,
+	}
+
+	Id, err := DataSource.Add_DataSource(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	System.Add_UserLogs_T(c.Admin_r.T_uuid, "数据源管理", "添加", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
+	c.ServeJSON()
+	return
+}
+
+func (c *DataSourceController) DataSource_Edit() {
+	id, _ := c.GetInt("T_id")
+	T_name := c.GetString("T_name")
+	T_sql := c.GetString("T_sql")
+
+	dataSource, err := DataSource.Read_DataSource_ById(id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_name) > 0 {
+		dataSource.T_name = T_name
+	}
+
+	if len(T_sql) > 0 {
+		dataSource.T_sql = T_sql
+	}
+
+	if err = DataSource.Update_DataSource(dataSource, "T_name", "T_sql"); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	System.Add_UserLogs(c.Admin_r.T_uuid, "数据源管理", "修改", strconv.Itoa(id))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+func (c *DataSourceController) DataSource_Del() {
+	id, _ := c.GetInt("T_id")
+
+	_, err := DataSource.Read_DataSource_ById(id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if err = DataSource.Delete_DataSource_ById(id); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	System.Add_UserLogs(c.Admin_r.T_uuid, "数据源管理", "删除", strconv.Itoa(id))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}

+ 140 - 29
controllers/Device.go

@@ -36,8 +36,9 @@ func (c *DeviceController) Prepare() {
 
 	c.Admin_r = Account.Admin_r
 	T_pid := c.Admin_r.T_pid
-	if T_pid == 0 {
-		T_pid, _ = Account.Redis_Tokey_T_pid_Get(User_tokey)
+	EntryPid, _ := Account.Redis_Tokey_T_pid_Get(User_tokey)
+	if EntryPid > 0 {
+		T_pid = EntryPid
 	}
 	c.T_pid = T_pid
 }
@@ -556,10 +557,8 @@ func (c *DeviceController) DeviceSensor_List() {
 	T_sn := c.GetString("T_sn")
 	T_name := c.GetString("T_name") //  包含 T_name、T_sn
 	T_class_id, _ := c.GetInt("T_calssid")
-	T_type, T_type_err := c.GetInt("T_type")
-	if T_type_err != nil {
-		T_type = -1
-	}
+	T_type := c.GetString("T_type")
+
 	T_State, T_State_err := c.GetInt("T_state")
 	if T_State_err != nil {
 		T_State = -1
@@ -765,19 +764,19 @@ func (c *DeviceController) DeviceSensor_Parameter_Pu() {
 		T_enprel = v
 	}
 	T_tprel := DeviceSensorParameter.T_tprel
-	if v, T_tprel_err := c.GetInt("T_tprel_err"); T_tprel_err == nil {
+	if v, T_tprel_err := c.GetFloat("T_tprel"); T_tprel_err == nil {
 		T_tprel = float32(v)
 	}
 	T_tpreu := DeviceSensorParameter.T_tpreu
-	if v, T_tpreu_err := c.GetInt("T_tpreu"); T_tpreu_err == nil {
+	if v, T_tpreu_err := c.GetFloat("T_tpreu"); T_tpreu_err == nil {
 		T_tpreu = float32(v)
 	}
 	T_hprel := DeviceSensorParameter.T_hprel
-	if v, T_hprel_err := c.GetInt("T_hprel"); T_hprel_err == nil {
+	if v, T_hprel_err := c.GetFloat("T_hprel"); T_hprel_err == nil {
 		T_hprel = float32(v)
 	}
 	T_hpreu := DeviceSensorParameter.T_hpreu
-	if v, T_hpreu_err := c.GetInt("T_hpreu"); T_hpreu_err == nil {
+	if v, T_hpreu_err := c.GetFloat("T_hpreu"); T_hpreu_err == nil {
 		T_hpreu = float32(v)
 	}
 
@@ -793,7 +792,7 @@ func (c *DeviceController) DeviceSensor_Parameter_Pu() {
 	if v, T_free_err := c.GetInt("T_free"); T_free_err == nil {
 		T_free = v
 	}
-	Devicesensorparameter := Device.DeviceSensorParameter{
+	dsp := Device.DeviceSensorParameter{
 		T_sn:      T_SN,
 		T_id:      T_id,
 		T_name:    T_name,
@@ -816,13 +815,13 @@ func (c *DeviceController) DeviceSensor_Parameter_Pu() {
 		T_State:     2, // 用户提交
 	}
 
-	Devicesensorparameter, is = Device.Add_DeviceSensorParameter(Devicesensorparameter)
+	dsp, is = Device.Add_DeviceSensorParameter(dsp)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Add_DeviceSensorParameter Err!"}
 		c.ServeJSON()
 		return
 	}
-	System.Add_UserLogs_T(c.Admin_r.T_uuid, "设备管理", "传感器参数操作", Devicesensorparameter)
+	System.Add_UserLogs_T(c.Admin_r.T_uuid, "设备管理", "传感器参数操作", dsp)
 
 	// 更新名称
 	if len(T_name) > 0 {
@@ -835,7 +834,7 @@ func (c *DeviceController) DeviceSensor_Parameter_Pu() {
 		System.Add_UserLogs_T(c.Admin_r.T_uuid, "设备管理", "修改传感器名称", DeviceSensor)
 	}
 
-	NatsServer.Pu_DeviceParameter_Sensor(Devicesensorparameter)
+	NatsServer.Pu_DeviceParameter_Sensor(dsp)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -949,6 +948,25 @@ func (c *DeviceController) DeviceTask_List() {
 
 }
 
+func (c *DeviceController) DeviceTask_All() {
+	var r_jsons lib.R_JSONS
+
+	T_sn := c.GetString("T_sn")
+
+	if len(T_sn) < 6 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_sn!!!"}
+		c.ServeJSON()
+		return
+	}
+
+	r_jsons.Data, r_jsons.Num = Device.Read_DeviceTask_All(T_sn)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+
+}
+
 // 任务启停
 func (c *DeviceController) DeviceTask_Post() {
 	T_sn := c.GetString("T_sn")
@@ -1501,7 +1519,7 @@ func (c *DeviceController) ClassBind_Add() {
 	T_sn := c.GetString("T_sn")
 	T_id, _ := c.GetInt("T_id")
 
-	if T_class_id == 0 || T_id == 0 || len(T_sn) == 0 {
+	if T_class_id == 0 || len(T_sn) == 0 {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_sn T_id T_class_id Err!"}
 		c.ServeJSON()
 		return
@@ -1545,7 +1563,7 @@ func (c *DeviceController) ClassBind_Del() {
 	T_sn := c.GetString("T_sn")
 	T_id, _ := c.GetInt("T_id")
 
-	if T_class_id == 0 || T_id == 0 || len(T_sn) == 0 {
+	if T_class_id == 0 || len(T_sn) == 0 {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_sn T_id T_class_id Err!"}
 		c.ServeJSON()
 		return
@@ -1860,7 +1878,7 @@ func (c *DeviceController) NoticeBind_Add() {
 	T_sn := c.GetString("T_sn")
 	T_id, _ := c.GetInt("T_id")
 
-	if T_notice_id == 0 || T_id == 0 || len(T_sn) == 0 {
+	if T_notice_id == 0 || len(T_sn) == 0 {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_sn T_id T_class_id Err!"}
 		c.ServeJSON()
 		return
@@ -1911,7 +1929,7 @@ func (c *DeviceController) NoticeBind_Del() {
 	T_sn := c.GetString("T_sn")
 	T_id, _ := c.GetInt("T_id")
 
-	if T_notice_id == 0 || T_id == 0 || len(T_sn) == 0 {
+	if T_notice_id == 0 || len(T_sn) == 0 {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_sn T_id T_class_id Err!"}
 		c.ServeJSON()
 		return
@@ -1989,6 +2007,12 @@ func (c *DeviceController) DeviceSensorType_List() {
 		return
 	}
 
+	if len(list) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+		c.ServeJSON()
+		return
+	}
+
 	var ids []int
 	for _, v := range list {
 		id, _ := strconv.Atoi(v.(string))
@@ -2000,10 +2024,11 @@ func (c *DeviceController) DeviceSensorType_List() {
 	return
 }
 
-// 传感器统计 - 小程序
-func (c *DeviceController) DeviceSensor_Stat() {
+// 设备统计 - 小程序
+func (c *DeviceController) Device_Applet_Stat() {
 
 	type Online struct {
+		T_type     int
 		Count      int64
 		Online     int64 // 监控
 		NoNetwork  int64 // 无网络
@@ -2016,25 +2041,64 @@ func (c *DeviceController) DeviceSensor_Stat() {
 	}
 
 	T_type, T_type_err := c.GetInt("T_type")
-	if T_type_err != nil {
-		T_type = -1
+	if T_type_err != nil || T_type == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_type Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	snList, err := Device.Read_DeviceSensor_T_sn_ByT_type(c.T_pid, T_type)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
 	}
 
 	var r_jsons R_JSONS
 
+	r_jsons.Data.T_type = T_type
 	// 0 未启用  1 在线  2 离线
-	r_jsons.Data.Count = Device.Read_DeviceSensor_Count_ByT_online(c.T_pid, T_type, "")
-	r_jsons.Data.Online = Device.Read_DeviceSensor_Count_ByT_online(c.T_pid, T_type, "1")
-	r_jsons.Data.NoNetwork = Device.Read_DeviceSensor_Count_ByT_online(c.T_pid, T_type, "2")
-	r_jsons.Data.NotEnabled = Device.Read_DeviceSensor_Count_ByT_online(c.T_pid, T_type, "0")
+	r_jsons.Data.Count = Device.Read_Device_Count_ByT_online(c.T_pid, snList, "")
+	r_jsons.Data.Online = Device.Read_Device_Count_ByT_online(c.T_pid, snList, "1")
+	r_jsons.Data.NoNetwork = Device.Read_Device_Count_ByT_online(c.T_pid, snList, "2")
+	r_jsons.Data.NotEnabled = Device.Read_Device_Count_ByT_online(c.T_pid, snList, "0")
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+// 传感器列表 - 小程序 View==1
+func (c *DeviceController) DeviceSensor_Applet_List_View1() {
+
+	var r_jsons lib.R_JSONS
+
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	T_name := c.GetString("T_name")
+	//T_online := c.GetString("T_online")
+	T_type, T_type_err := c.GetInt("T_type")
+	if T_type_err != nil {
+		T_type = -1
+	}
+	r_jsons.Data, r_jsons.Num = Device.Read_DeviceSensor_List_For_Applet(c.T_pid, T_name, "3", 1, T_type, page, page_z)
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
 	c.ServeJSON()
 	return
 }
 
-// 传感器列表 - 小程序
-func (c *DeviceController) DeviceSensor_Stat_List() {
+// 传感器列表 - 小程序 View==2
+func (c *DeviceController) DeviceSensor_Applet_List_View2() {
 
 	var r_jsons lib.R_JSONS
 
@@ -2053,7 +2117,54 @@ func (c *DeviceController) DeviceSensor_Stat_List() {
 	if T_type_err != nil {
 		T_type = -1
 	}
-	r_jsons.Data, r_jsons.Num = Device.Read_DeviceSensor_List_For_Stat(c.T_pid, T_name, T_online, 1, T_type, page, page_z)
+	dsList, _ := Device.Read_DeviceSensor_List_For_Applet(c.T_pid, T_name, T_online, 1, T_type, page, 9999)
+
+	var deviceMap = make(map[string][]Device.DeviceSensor_Applet)
+	var num int64
+	for _, ds := range dsList {
+		_, ok := deviceMap[ds.T_sn]
+		if !ok {
+			num += 1
+			var list []Device.DeviceSensor_Applet
+			list = append(list, ds)
+			deviceMap[ds.T_sn] = list
+		} else {
+			deviceMap[ds.T_sn] = append(deviceMap[ds.T_sn], ds)
+		}
+	}
+
+	type DeviceList struct {
+		T_sn             string
+		DeviceSensorList []Device.DeviceSensor_Applet
+	}
+
+	var deviceList []DeviceList
+
+	for k, v := range deviceMap {
+		device := DeviceList{
+			T_sn:             k,
+			DeviceSensorList: v,
+		}
+		deviceList = append(deviceList, device)
+	}
+
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	offset_z := offset + page_z
+	if num < int64(offset_z) {
+		offset_z = int(num)
+	}
+	if offset > offset_z {
+		offset = offset_z
+	}
+
+	r_jsons.Data = deviceList[offset:offset_z]
+	r_jsons.Num = num
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
 

+ 0 - 6
controllers/Logs.go

@@ -13,7 +13,6 @@ import (
 type LogsController struct {
 	beego.Controller
 	Admin_r Account.Admin // 登陆的用户
-	T_pid   int           // 公司id
 }
 
 func (c *LogsController) Prepare() {
@@ -27,11 +26,6 @@ func (c *LogsController) Prepare() {
 	}
 
 	c.Admin_r = *Account.Admin_r
-	T_pid := c.Admin_r.T_pid
-	if T_pid == 0 {
-		T_pid, _ = Account.Redis_Tokey_T_pid_Get(User_tokey)
-	}
-	c.T_pid = T_pid
 }
 
 // 列表 -

+ 0 - 6
controllers/Product.go

@@ -16,7 +16,6 @@ import (
 type ProductController struct {
 	beego.Controller
 	Admin_r Account.Admin // 登陆的用户
-	T_pid   int           // 公司id
 }
 
 func (c *ProductController) Prepare() {
@@ -29,11 +28,6 @@ func (c *ProductController) Prepare() {
 	}
 
 	c.Admin_r = *Account.Admin_r
-	T_pid := c.Admin_r.T_pid
-	if T_pid == 0 {
-		T_pid, _ = Account.Redis_Tokey_T_pid_Get(User_tokey)
-	}
-	c.T_pid = T_pid
 }
 
 func (c *ProductController) ProductUpgrade_List() {

+ 0 - 6
controllers/RawSql.go

@@ -14,7 +14,6 @@ import (
 type RawSqlController struct {
 	beego.Controller
 	Admin_r Account.Admin // 登陆的用户
-	T_pid   int           // 公司id
 }
 
 func (c *RawSqlController) Prepare() {
@@ -28,11 +27,6 @@ func (c *RawSqlController) Prepare() {
 	}
 
 	c.Admin_r = *Account.Admin_r
-	T_pid := c.Admin_r.T_pid
-	if T_pid == 0 {
-		T_pid, _ = Account.Redis_Tokey_T_pid_Get(User_tokey)
-	}
-	c.T_pid = T_pid
 }
 
 func (c *RawSqlController) List_Post() {

+ 38 - 4
controllers/User.go

@@ -9,11 +9,13 @@ import (
 	"Cold_Api/models/Company"
 	"Cold_Api/models/System"
 	"Cold_Api/models/Warning"
+	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
 	beego "github.com/beego/beego/v2/server/web"
 	uuid "github.com/satori/go.uuid"
 	"math"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -35,8 +37,9 @@ func (c *UserController) Prepare() {
 
 	c.Admin_r = *Account.Admin_r
 	T_pid := c.Admin_r.T_pid
-	if T_pid == 0 {
-		T_pid, _ = Account.Redis_Tokey_T_pid_Get(User_tokey)
+	EntryPid, _ := Account.Redis_Tokey_T_pid_Get(User_tokey)
+	if EntryPid > 0 {
+		T_pid = EntryPid
 	}
 	c.T_pid = T_pid
 }
@@ -65,6 +68,7 @@ func (c *UserController) Company_Tree() {
 	return
 }
 
+// 所有公司树
 func (c *UserController) Company_List() {
 
 	var r_jsons lib.R_JSONS
@@ -233,8 +237,38 @@ func (c *UserController) Company_Entry() {
 	}
 
 	T_pid, _ := c.GetInt("T_pid")
-	if T_pid < 0 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_pid Err!"}
+	// 操作pid
+	company_r, err := Account.Read_Company_ById(T_pid)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	visit := false
+	if c.Admin_r.T_pid > 0 && strings.Contains(company_r.T_path, fmt.Sprintf("/%d/", c.Admin_r.T_pid)) {
+		visit = true
+	}
+
+	if c.Admin_r.T_pid == 0 {
+		if c.Admin_r.T_pids == "*" {
+			visit = true
+		} else {
+			pids := lib.SplitStringToIntIds(c.Admin_r.T_pids, "P")
+
+			list := Account.ReadCompanyIds_T_pids(pids)
+
+			for _, v := range list {
+				if T_pid == v {
+					visit = true
+					break
+				}
+			}
+		}
+	}
+
+	if !visit {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "没有权限!"}
 		c.ServeJSON()
 		return
 	}

+ 1 - 1
main.go

@@ -57,7 +57,7 @@ func main() {
 		// 可选参数"GET", "POST", "PUT", "DELETE", "OPTIONS" (*为所有)
 		AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
 		// 指的是允许的Header的种类
-		AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type", "T_pid"},
+		AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
 		// 公开的HTTP标头列表
 		ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Access-Control-Allow-Headers", "Content-Type"},
 		// 如果设置,则允许共享身份验证凭据,例如cookie

+ 4 - 4
models/Account/Company.go

@@ -210,7 +210,7 @@ func Read_Company_ById(Id int) (r Company, e error) {
 	qs := o.QueryTable(new(Company))
 	e = qs.Filter("Id", Id).Filter("T_State", 1).One(&r)
 	if e != nil {
-		logs.Error("Read_Company_ById", e)
+		logs.Error(lib.FuncName(), e)
 		return
 	}
 	Redis_Company_Set(r) // Redis 更新缓存
@@ -221,7 +221,7 @@ func Read_Company_ById(Id int) (r Company, e error) {
 func Read_Company_Tree(admin_r Admin, T_name string) (CompanyList []Company_R) {
 
 	// 内部用户未绑定公司
-	if admin_r.T_pid > 0 || len(admin_r.T_pids) == 0 {
+	if admin_r.T_pid == 0 && len(admin_r.T_pids) == 0 {
 		return CompanyList
 	}
 
@@ -235,11 +235,11 @@ func Read_Company_Tree(admin_r Admin, T_name string) (CompanyList []Company_R) {
 	cond1 := cond.And("T_State", 1)
 
 	if admin_r.T_pid > 0 {
-		cond1 = cond1.And("Id", admin_r.T_pid)
+		cond1 = cond1.And("T_path__icontains", fmt.Sprintf("/%d/", admin_r.T_pid))
 	}
 
 	// 内部用户已绑定公司,* 绑定所有公司
-	if admin_r.T_pids != "*" {
+	if len(admin_r.T_pids) > 0 && admin_r.T_pids != "*" {
 		T_pids := lib.SplitStringToIntIds(admin_r.T_pids, "P")
 		cond1 = cond1.And("Id__in", ReadCompanyIds_T_pids(T_pids))
 	}

+ 7 - 7
models/Account/Power.go

@@ -18,9 +18,9 @@ type Power struct {
 	Id         int       `orm:"column(ID);size(11);auto;pk"`
 	T_code     string    `orm:"size(256);null"`                                        //  唯一编码
 	T_name     string    `orm:"size(256);null"`                                        //  权限名称
-	T_select   string    `orm:"size(256);null"`                                        //  Account.Power.Id S1|S2|
-	T_warning  string    `orm:"size(256);null"`                                        //  Warning.WarningType.Id W1|W2|W3|W4|W5|
-	T_menu     string    `orm:"size(256);null"`                                        //  Account.Menu.Id 设备通知策略  M1|M2|
+	T_select   string    `orm:"size(1024);null"`                                       //  Account.Power.Id S1|S2|
+	T_warning  string    `orm:"size(1024);null"`                                       //  Warning.WarningType.Id W1|W2|W3|W4|W5|
+	T_menu     string    `orm:"size(1024);null"`                                       //  Account.Menu.Id 设备通知策略  M1|M2|
 	T_State    int       `orm:"size(2);default(1)"`                                    //  0删除  1 正常
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now 每次 model 保存时都会对时间自动更新
 	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now_add 第一次保存时才设置时间
@@ -146,7 +146,6 @@ func Add_Power(m Power) (id int64, err error) {
 		logs.Error(lib.FuncName(), err)
 		return id, err
 	}
-	Redis_API_Set(int(id), Read_API_List_By_Menu_Bind(m.T_menu))
 	Redis_Power_Set(m)
 
 	return id, err
@@ -166,6 +165,7 @@ func Read_Power_ById(Id int) (r Power, err error) {
 		logs.Error(lib.FuncName(), err)
 		return
 	}
+	fmt.Println(len("M1|M2|M4|M5|M6|M7|M8|M9|M10|M11|M12|M13|M14|M15|M16|M17|M18|M19|M207|M20|M21|M22|M23|M24|M25|M26|M27|M28|M29|M30|M31|M32|M33|M34|M101|M35|M102|M103|M118|M36|M37|M38|M45|M39|M119|M46|M47|M106|M113|M114|M108|M109|M110|M111|M112|M120|M48|M49|M50|M51|M52|M53|M"))
 	Redis_Power_Set(r)
 
 	return r, err
@@ -254,9 +254,9 @@ func Update_Power(v Power, cols ...string) bool {
 		return false
 	}
 	fmt.Println("Number of records updated in database:", num)
-	Redis_API_Set(v.Id, Read_API_List_By_Menu_Bind(v.T_menu))
-	Redis_Power_Set(v)    // Redis 更新缓存
-	Redis_Menu_DelK(v.Id) // 删除菜单缓存
+	Redis_Power_Set(v)                 // Redis 更新缓存
+	Redis_Menu_DelK(v.Id)              // 删除菜单缓存
+	Redis_API_DelK(strconv.Itoa(v.Id)) // 删除API缓存
 	return true
 }
 

+ 167 - 0
models/DataSource/DataSource.go

@@ -0,0 +1,167 @@
+package DataSource
+
+import (
+	"Cold_Api/controllers/lib"
+	"Cold_Api/logs"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// 产品类型
+type DataSource struct {
+	Id         int       `orm:"column(ID);size(11);auto;pk"`
+	T_id       string    `orm:"size(256);null"`                                        // 数据源id
+	T_name     string    `orm:"size(256);null"`                                        // 数据源名称
+	T_sql      string    `orm:"size(256);null"`                                        // sql语句
+	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 保存时都会对时间自动更新
+}
+
+type DataSource_R struct {
+	Id         int
+	T_id       string
+	T_name     string
+	T_sql      string
+	CreateTime string
+	UpdateTime string
+}
+
+func (t *DataSource) TableName() string {
+	return "data_source" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(DataSource))
+}
+
+// ---------------- 特殊方法 -------------------
+func DataSourceToDataSource_R(t DataSource) (r DataSource_R) {
+	r.Id = t.Id
+	r.T_id = t.T_id
+	r.T_name = t.T_name
+	r.T_sql = t.T_sql
+	r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
+	r.UpdateTime = t.UpdateTime.Format("2006-01-02 15:04:05")
+	return r
+}
+
+// 获取 ById
+func Read_DataSource_ById(id int) (r DataSource, err error) {
+	o := orm.NewOrm()
+	r = DataSource{Id: id}
+	err = o.Read(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return r, err
+	}
+	return r, err
+}
+
+func Read_DataSource_ByT_id(T_id string) (r DataSource, err error) {
+	o := orm.NewOrm()
+	r = DataSource{T_id: T_id}
+	err = o.Read(&r, "T_id")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return r, err
+	}
+	return r, err
+}
+
+// 添加
+func Add_DataSource(r DataSource) (id int, err error) {
+
+	o := orm.NewOrm()
+
+	// 生成编号
+	rand_x := 0
+	for true {
+		r.T_id = lib.GetRandstring(6, "", int64(rand_x)) // 1,336,336
+		err = o.Read(&r, "T_id")                         // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+		if err != nil {
+			break
+		}
+		rand_x += 1
+	}
+
+	_, err = o.Insert(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	id = r.Id
+	return
+}
+
+func Update_DataSource(r DataSource, cols ...string) error {
+	o := orm.NewOrm()
+	_, err := o.Update(&r, cols...)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	return nil
+}
+
+// 删除
+func Delete_DataSource_ById(id int) (err error) {
+	o := orm.NewOrm()
+	v := DataSource{Id: id}
+	_, err = o.Delete(&v)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	return nil
+}
+
+func Exec_DataSource_Sql(sql string, data []interface{}) (lists []orm2.Params) {
+	o := orm.NewOrm()
+	var pl_lists []orm2.Params
+	_, err := o.Raw(sql).SetArgs(data...).Values(&pl_lists)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	return pl_lists
+}
+
+// 获取列表
+func Read_DataSource_List(T_name string, page int, page_z int) (r []DataSource_R, cnt int64) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	var map_r []DataSource
+	qs := o.QueryTable(new(DataSource))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	cond := orm.NewCondition()
+	if len(T_name) > 0 {
+		cond = cond.And("T_name__icontains", T_name)
+	}
+
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&map_r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range map_r {
+		r = append(r, DataSourceToDataSource_R(v))
+	}
+
+	return r, cnt
+
+}

+ 35 - 0
models/Device/Device.go

@@ -347,3 +347,38 @@ func Read_Device_List_ByT_model(T_model string) (r []Device) {
 
 	return r
 }
+
+// 数据展示菜单下 传感器参数列表
+func Read_Device_Count_ByT_online(T_pid int, snList []interface{}, T_online string) (cnt int64) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+
+	qs := o.QueryTable(new(Device))
+
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_pid", T_pid).And("T_State", 1)
+
+	if len(snList) > 0 {
+		cond1 = cond1.And("T_sn__in", snList)
+
+	}
+
+	//0 未启用  1 在线  2 离线
+	if T_online == "1" {
+		cond1 = cond1.AndCond(cond.Or("T_online", 1).Or("T_online_s", 1))
+	} else if T_online == "2" {
+		cond1 = cond1.AndCond(cond.AndCond(cond.And("T_online", 2).And("T_online_s", 0)).
+			OrCond(cond.And("T_online", 0).And("T_online_s", 2)))
+	} else if T_online == "0" {
+		cond1 = cond1.And("T_online", 0).And("T_online_s", 0)
+	}
+
+	cnt, err := qs.SetCond((*orm2.Condition)(cond1)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	return cnt
+}

+ 27 - 30
models/Device/DeviceData.go

@@ -11,6 +11,7 @@ import (
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -40,6 +41,7 @@ type DeviceData_ struct {
 
 // 模板
 type DeviceData_R struct {
+	T_sn   string  // sn
 	T_id   int     // 传感器id
 	T_name string  // 传感器名称
 	T_t    float32 // 温度
@@ -84,7 +86,6 @@ func init() {
 }
 
 func DeviceData_ToDeviceData_R(d Device, r DeviceData_) (t DeviceData_R) {
-
 	t.T_id = r.T_id
 	t.T_t = r.T_t
 	t.T_rh = r.T_rh
@@ -98,6 +99,7 @@ func DeviceData_ToDeviceData_R(d Device, r DeviceData_) (t DeviceData_R) {
 	t.T_rhl = sp.T_RHlower
 	t.T_rhu = sp.T_RHupper
 
+	t.T_sn = d.T_sn
 	t.T_ist = d.T_ist
 	t.T_ish = d.T_ish
 
@@ -347,6 +349,18 @@ func Read_DeviceData_By_T_snid_List(T_snid string, Time_start_ string, Time_end_
 			fmt.Println("加载数据:", sn_id[0], sn_id[1], r_maps_num)
 		}
 	}
+
+	if maps_num == 0 {
+		return maps, maps_num
+	}
+
+	sort.Slice(maps, func(i, j int) bool {
+		if maps[i].T_time > maps[j].T_time {
+			return true
+		}
+		return false
+	})
+
 	if page <= 1 {
 		offset = 0
 	} else {
@@ -358,6 +372,9 @@ func Read_DeviceData_By_T_snid_List(T_snid string, Time_start_ string, Time_end_
 	if maps_num < int64(offset_z) {
 		offset_z = int(maps_num)
 	}
+	if offset > offset_z {
+		offset = offset_z
+	}
 
 	if page_z == 9999 {
 		fmt.Println("总数据:", maps_num, " 导出")
@@ -475,7 +492,9 @@ func Read_DeviceData_BackUp_List(T_snid string, Time_start_ string, Time_end_ st
 		sn_id := strings.Split(v, ",")
 
 		if len(sn_id) == 2 {
-			r_maps, r_maps_num := Read_DeviceData_BackUp(sn_id[0], lib.To_int(sn_id[1]), Time_start_, Time_end_, 0, 9999)
+
+			r_maps, r_maps_num := Read_DeviceData_BackUp(sn_id[0], lib.To_int(sn_id[1]), Time_start_, Time_end_)
+
 			maps = append(maps, r_maps...)
 			maps_num = maps_num + int64(r_maps_num)
 
@@ -493,6 +512,9 @@ func Read_DeviceData_BackUp_List(T_snid string, Time_start_ string, Time_end_ st
 	if maps_num < int64(offset_z) {
 		offset_z = int(maps_num)
 	}
+	if offset > offset_z {
+		offset = offset_z
+	}
 
 	if page_z == 9999 {
 		fmt.Println("总数据:", maps_num, " 导出")
@@ -502,20 +524,10 @@ func Read_DeviceData_BackUp_List(T_snid string, Time_start_ string, Time_end_ st
 	return maps[offset:offset_z], maps_num
 }
 
-func Read_DeviceData_BackUp(T_sn string, T_id int, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_BackUp, int) {
+func Read_DeviceData_BackUp(T_sn string, T_id int, Time_start_ string, Time_end_ string) ([]DeviceData_BackUp, int) {
 	o := orm.NewOrm()
 	var maps []DeviceData_BackUp
-	var maps_z []orm2.ParamsList
-	var offset int
-	if page_z == 0 {
-		page_z = conf.Page_size
-	}
 
-	if page <= 1 {
-		offset = 0
-	} else {
-		offset = (page - 1) * page_z
-	}
 	sql_time := ""
 
 	if len(Time_start_) > 0 {
@@ -529,27 +541,12 @@ func Read_DeviceData_BackUp(T_sn string, T_id int, Time_start_ string, Time_end_
 	sql := "SELECT t_id,date_format(t_time, '%Y-%m-%d') t_date, count(*) t_num FROM z_device_data_" + T_sn + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id) + " GROUP BY t_date ORDER BY t_time DESC "
 
 	fmt.Println(sql)
-	_, err := o.Raw(sql).ValuesList(&maps_z)
-	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return maps, 0
-	}
-	if len(maps_z) == 0 {
-		return maps, 0
-	}
-	if page_z != 9999 {
-		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
-	}
-
-	fmt.Println(sql)
-	_, err = o.Raw(sql).QueryRows(&maps)
+	_, err := o.Raw(sql).QueryRows(&maps)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 		return maps, 0
 	}
 
-	key, _ := strconv.Atoi(maps_z[0][0].(string))
-
 	deviceSensor, _ := Read_DeviceSensor_ByT_sn(T_sn, T_id)
 
 	for i := 0; i < len(maps); i++ {
@@ -557,5 +554,5 @@ func Read_DeviceData_BackUp(T_sn string, T_id int, Time_start_ string, Time_end_
 		maps[i].T_name = deviceSensor.T_name
 	}
 
-	return maps, key
+	return maps, len(maps)
 }

+ 107 - 31
models/Device/DeviceSensor.go

@@ -67,12 +67,32 @@ type DeviceSensor_R struct {
 	T_online   int    // 在线状态 1 在线  0 离线
 	T_online_s int    // 在线状态-备用  0 未启用  1 在线  2 离线
 	T_datashow int    // 0 屏蔽数据展示  1 正常数据展示
+	T_type     int    // 类型
+
+	T_DeviceSensorData      DeviceData_R            // 传感器最新数据
+	T_DeviceSensorParameter DeviceSensorParameter_R //  设备参数
+	T_DeviceSensorType      DeviceSensorType_R      //  传感器类型
+
+}
+type DeviceSensor_Applet struct {
+	T_sn   string // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
+	T_id   int    // 传感器编号
+	T_name string // 标题
+
+	T_3dview   string // 3D 视图ID
+	T_sort     int    // 排序
+	T_Dattery  int    // 电量
+	T_Site     string // GPS
+	T_monitor  int    // 记录状态
+	T_online   int    // 在线状态 1 在线  0 离线
+	T_online_s int    // 在线状态-备用  0 未启用  1 在线  2 离线
+	T_datashow int    // 0 屏蔽数据展示  1 正常数据展示
 	T_type     int    // 1库房   2移动
 
 	T_DeviceSensorData      DeviceData_R            // 传感器最新数据
 	T_DeviceSensorParameter DeviceSensorParameter_R //  设备参数
 	T_DeviceSensorType      DeviceSensorType_R      //  传感器类型
-	T_Device                Device                  //  传感器类型
+	T_Device                Device_R                //  传感器类型
 
 }
 
@@ -208,7 +228,45 @@ func DeviceSensorToDeviceSensor_R(DeviceSensor_ DeviceSensor) (DeviceSensor_r De
 
 	deviceSensorType := Read_DeviceSensorType_Get(DeviceSensor_.T_type)
 	DeviceSensor_r.T_DeviceSensorType = DeviceSensorTypeToDeviceSensorType_R(deviceSensorType)
-	DeviceSensor_r.T_Device = device
+	return
+}
+
+func DeviceSensorToDeviceSensor_Applet(DeviceSensor_ DeviceSensor) (DeviceSensor_r DeviceSensor_Applet) {
+	//lib.DeviceRealSnMap[DeviceSensor_.T_sn] = 3 // 连续请求 实时数据
+	lib.DeviceRealSnMap.Store(DeviceSensor_.T_sn, 3) // 连续请求 实时数据
+
+	DeviceSensor_r.T_sn = DeviceSensor_.T_sn
+	DeviceSensor_r.T_id = DeviceSensor_.T_id
+	DeviceSensor_r.T_name = DeviceSensor_.T_name
+	DeviceSensor_r.T_Site = DeviceSensor_.T_Site
+	DeviceSensor_r.T_Dattery = DeviceSensor_.T_Dattery
+	DeviceSensor_r.T_monitor = DeviceSensor_.T_monitor
+	DeviceSensor_r.T_3dview = DeviceSensor_.T_3dview
+	DeviceSensor_r.T_type = DeviceSensor_.T_type
+	DeviceSensor_r.T_sort = DeviceSensor_.T_sort
+
+	DeviceSensor_r.T_datashow = DeviceSensor_.T_datashow
+
+	DeviceSensor_r.T_Dattery = DeviceSensor_.T_Dattery
+	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)
+
+	// 最新数据
+	DeviceData := Read_DeviceData(DeviceSensor_.T_sn, DeviceSensor_.T_id)
+
+	device, _ := Read_Device_ByT_sn(DeviceSensor_.T_sn)
+	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_Device = DeviceToDevice_R(device)
 	return
 }
 
@@ -235,7 +293,7 @@ func Read_DeviceSensor_Num_ByT_sn(T_sn string) int {
 }
 
 // 获取列表
-func Read_DeviceSensorList(admin_r *Account.Admin, T_pid int, T_sn string, T_name string, T_Class_id, T_datashow, T_type, T_State int, page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
+func Read_DeviceSensorList(admin_r *Account.Admin, T_pid int, T_sn string, T_name string, T_Class_id, T_datashow int, T_type string, T_State int, page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -258,8 +316,9 @@ func Read_DeviceSensorList(admin_r *Account.Admin, T_pid int, T_sn string, T_nam
 		cond1 = cond1.And("T_Class__icontains", T_Class)
 	}
 
-	if T_type > 0 {
-		cond1 = cond1.And("T_type", T_type)
+	if len(T_type) > 0 {
+		list := strings.Split(T_type, ",")
+		cond1 = cond1.And("T_type__in", list)
 	}
 
 	if len(T_sn) > 0 {
@@ -279,7 +338,13 @@ func Read_DeviceSensorList(admin_r *Account.Admin, T_pid int, T_sn string, T_nam
 		cond1 = cond1.And("T_datashow", 1)
 	}
 
-	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)
+	var err error
+	if page_z == 9999 {
+		_, err = qs.SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)
+	} else {
+		_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)
+
+	}
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 		return
@@ -506,6 +571,22 @@ func Read_DeviceSensor_ALL_List_T_sn(T_sn string) (r []DeviceSensor) {
 	return r
 }
 
+func Read_DeviceSensor_List_T_sn_T_datashow(T_sn string) (r []DeviceSensor) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+
+	qs := o.QueryTable(new(DeviceSensor))
+
+	_, err := qs.Filter("T_sn", T_sn).Filter("T_State", 1).Filter("T_datashow", 1).All(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	return r
+}
+
 // 获取列表
 func Read_DeviceSensor_ALL_Class_Id(T_Class_id int) (r []DeviceSensor) {
 
@@ -808,6 +889,9 @@ func Read_DeviceSensor_List_For_Data(T_pid int, T_name string, T_Class_id, T_typ
 		if cnt < int64(offset_z) {
 			offset_z = int(cnt)
 		}
+		if offset > offset_z {
+			offset = offset_z
+		}
 		_, err = qs.SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)
 		if err != nil {
 			logs.Error(lib.FuncName(), err)
@@ -844,7 +928,7 @@ func Read_DeviceSensor_List_For_Data(T_pid int, T_name string, T_Class_id, T_typ
 func Read_DeviceSensor_T_type(T_pid int) (lists orm2.ParamsList, err error) {
 	o := orm.NewOrm()
 	var pl_lists orm2.ParamsList
-	_, err = o.Raw("SELECT DISTINCT t_type FROM device_sensor WHERE t_pid=? LIMIT 0,1000", T_pid).ValuesFlat(&pl_lists)
+	_, err = o.Raw("SELECT DISTINCT t_type FROM device_sensor WHERE t_pid=? AND t_datashow=1 LIMIT 0,1000", T_pid).ValuesFlat(&pl_lists)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 		return
@@ -854,7 +938,7 @@ func Read_DeviceSensor_T_type(T_pid int) (lists orm2.ParamsList, err error) {
 }
 
 // 数据展示菜单下 传感器参数列表
-func Read_DeviceSensor_List_For_Stat(T_pid int, T_name, T_online string, T_RealTime, T_type, page, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
+func Read_DeviceSensor_List_For_Applet(T_pid int, T_name, T_online string, T_RealTime, T_type, page, page_z int) (DeviceSensor_r []DeviceSensor_Applet, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -880,6 +964,8 @@ func Read_DeviceSensor_List_For_Stat(T_pid int, T_name, T_online string, T_RealT
 		cond1 = cond1.And("T_sn", T_name)
 	} else if len(T_name) > 0 {
 		cond1 = cond1.And("T_name__icontains", T_name).And("T_datashow", 1)
+	} else {
+		cond1 = cond1.And("T_datashow", 1)
 	}
 
 	if T_online == "1" {
@@ -891,7 +977,13 @@ func Read_DeviceSensor_List_For_Stat(T_pid int, T_name, T_online string, T_RealT
 		cond1 = cond1.And("T_online", 0).And("T_online_s", 0)
 	}
 
-	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)
+	var err error
+	if page_z == 9999 {
+		_, err = qs.SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)
+	} else {
+		_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)
+
+	}
 
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
@@ -904,40 +996,24 @@ func Read_DeviceSensor_List_For_Stat(T_pid int, T_name, T_online string, T_RealT
 	}
 
 	for _, v := range r {
-		DeviceSensor_r = append(DeviceSensor_r, DeviceSensorToDeviceSensor_R(v))
+		DeviceSensor_r = append(DeviceSensor_r, DeviceSensorToDeviceSensor_Applet(v))
 	}
 	return DeviceSensor_r, cnt
 }
 
 // 数据展示菜单下 传感器参数列表
-func Read_DeviceSensor_Count_ByT_online(T_pid, T_type int, T_online string) (cnt int64) {
+func Read_DeviceSensor_T_sn_ByT_type(T_pid, T_type int) (lists orm2.ParamsList, err error) {
 
 	o := orm.NewOrm()
-	// 也可以直接使用 Model 结构体作为表名
-
-	qs := o.QueryTable(new(DeviceSensor))
-
-	cond := orm.NewCondition()
-	cond1 := cond.And("T_pid", T_pid).And("T_State", 1)
-	if T_type > 0 {
-		cond1 = cond1.And("T_type", T_type)
-	}
 
-	//0 未启用  1 在线  2 离线
-	if T_online == "1" {
-		cond1 = cond1.AndCond(cond.Or("T_online", 1).Or("T_online_s", 1))
-	} else if T_online == "2" {
-		cond1 = cond1.AndCond(cond.AndCond(cond.And("T_online", 2).And("T_online_s", 0)).
-			OrCond(cond.And("T_online", 0).And("T_online_s", 2)))
-	} else if T_online == "0" {
-		cond1 = cond1.And("T_online", 0).And("T_online_s", 0)
-	}
+	sql := "t_pid=? AND t__state=1 AND t_datashow=1 AND t_type = " + strconv.Itoa(T_type)
 
-	cnt, err := qs.SetCond((*orm2.Condition)(cond1)).Count()
+	var pl_lists orm2.ParamsList
+	_, err = o.Raw("SELECT DISTINCT T_sn FROM device_sensor WHERE "+sql+" LIMIT 0,1000", T_pid).ValuesFlat(&pl_lists)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 		return
 	}
 
-	return cnt
+	return pl_lists, nil
 }

+ 10 - 10
models/Device/DeviceSensorParameter.go

@@ -123,16 +123,16 @@ func DeviceSensorParameter_T_text(r DeviceSensorParameter) string {
 	s := ""
 	s += "操作人UUID:" + r.T_uuid
 	s += " 设备名称:" + r.T_name
-	s += fmt.Sprintf(" 温度下限:%f", r.T_Tlower)
-	s += fmt.Sprintf(" 温度上限:%f", r.T_Tupper)
-	s += fmt.Sprintf(" 湿度下限:%f", r.T_RHlower)
-	s += fmt.Sprintf(" 湿度上限:%f", r.T_RHupper)
-
-	s += fmt.Sprintf(" 是否启用预警:%d", r.T_enprel)
-	s += fmt.Sprintf(" 温度预警下限:%f", r.T_tprel)
-	s += fmt.Sprintf(" 温度预警上限:%f", r.T_tpreu)
-	s += fmt.Sprintf(" 湿度预警下限:%f", r.T_hprel)
-	s += fmt.Sprintf(" 温度预警上限:%f", r.T_hpreu)
+	s += fmt.Sprintf(" 温度下限:%.2f", r.T_Tlower)
+	s += fmt.Sprintf(" 温度上限:%.2f", r.T_Tupper)
+	s += fmt.Sprintf(" 湿度下限:%.2f", r.T_RHlower)
+	s += fmt.Sprintf(" 湿度上限:%.2f", r.T_RHupper)
+
+	s += fmt.Sprintf(" 是否启用预警:%.2d", r.T_enprel)
+	s += fmt.Sprintf(" 温度预警下限:%.2f", r.T_tprel)
+	s += fmt.Sprintf(" 温度预警上限:%.2f", r.T_tpreu)
+	s += fmt.Sprintf(" 湿度预警下限:%.2f", r.T_hprel)
+	s += fmt.Sprintf(" 温度预警上限:%.2f", r.T_hpreu)
 
 	s += fmt.Sprintf(" 传感器采样率:%d", r.T_speed)
 	s += fmt.Sprintf(" 是否启用传感器:%d", r.T_en)

+ 49 - 1
models/Device/DeviceTask.go

@@ -17,12 +17,37 @@ type DeviceTask struct {
 	T_Ut_end   time.Time `orm:"type(timestamp);null;"` // 采集时间
 
 	T_Ut    time.Time `orm:"type(timestamp);null;"` // 采集时间
-	T_State int       `orm:"size(2);1"`
+	T_State int       `orm:"size(2);default(1)"`
 	//  1   start:开始监测任务,
 	//  2   stop:结束监测任务,
 	//  3   print:中途打印任务
 }
 
+type DeviceTask_R struct {
+	Id         int
+	T_sn       string // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
+	T_Ut_start string // 采集时间
+	T_Ut_end   string // 采集时间
+	T_Ut       string // 采集时间
+	T_State    int
+}
+
+func DeviceTaskToDeviceTask_R(r DeviceTask) (t DeviceTask_R) {
+	t.Id = r.Id
+	t.T_sn = r.T_sn
+	t.T_State = r.T_State
+	if !r.T_Ut_start.IsZero() {
+		t.T_Ut_start = r.T_Ut_start.Format("2006-01-02 15:04:05")
+	}
+	if !r.T_Ut_end.IsZero() {
+		t.T_Ut_end = r.T_Ut_end.Format("2006-01-02 15:04:05")
+	}
+	if !r.T_Ut.IsZero() {
+		t.T_Ut = r.T_Ut.Format("2006-01-02 15:04:05")
+	}
+	return
+}
+
 func (t *DeviceTask) TableName() string {
 	return "device_task" // 数据库名称   // ************** 替换 FormulaList **************
 }
@@ -50,6 +75,29 @@ func Read_DeviceTask_All_Limit_1(T_sn string) (DeviceTask, bool) {
 }
 
 // 获取全部
+func Read_DeviceTask_All(T_sn string) (r_l []DeviceTask_R, cnt int64) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(DeviceTask))
+
+	var maps []DeviceTask
+
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_sn", T_sn)
+
+	cnt, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range maps {
+		r_l = append(r_l, DeviceTaskToDeviceTask_R(v))
+	}
+
+	return
+}
+
+// 获取全部
 func Read_DeviceTask_List(T_sn string, Time_start string, Time_end string, page int, page_z int) (r_l []DeviceTask, cnt int64) {
 	o := orm.NewOrm()
 	qs := o.QueryTable(new(DeviceTask))

+ 49 - 2
models/Warning/Warning.go

@@ -4,6 +4,7 @@ import (
 	"Cold_Api/conf"
 	"Cold_Api/controllers/lib"
 	"Cold_Api/logs"
+	"Cold_Api/models/Account"
 	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
@@ -64,6 +65,25 @@ type Warning_R struct {
 	T_history  int      // 0 40天 1 历史数据
 	CreateTime string   // 创建时间
 }
+type Warning_Applet struct {
+	Id             int64
+	T_pid          int      // Account.Company 绑定公司
+	T_company_name string   // 公司名称
+	T_tp           int      // 报警类型   ->WarningList
+	T_tp_name      string   // 报警类型名称
+	T_sn           string   // 设备序列号
+	T_D_name       string   // 设备名称
+	T_id           int      // 传感器 ID
+	T_DS_name      string   // 传感器名称
+	T_Remark       string   // 采集内容
+	T_Ut           string   // 采集时间
+	T_fUt          string   // 首次采集时间
+	T_Text         string   // 处理备注
+	T_Log          []string // 处理日志
+	T_Msid         int64    // 消息ID
+	T_State        int      // 0 删除   1 未处理   2 已处理
+	CreateTime     string   // 创建时间
+}
 
 func (t *Warning) TableName() string {
 	return "warning" // 数据库名称   // ************** 替换 FormulaList **************
@@ -102,6 +122,33 @@ func WarningToWarning_R(T_history int, t Warning) (r Warning_R) {
 	return r
 }
 
+func WarningToWarning_Applet(t Warning) (r Warning_Applet) {
+	r.Id = t.Id
+	r.T_pid = t.T_pid
+	company, _ := Account.Read_Company_ById(t.T_pid)
+	r.T_company_name = company.T_name
+	r.T_tp = t.T_tp
+	r.T_tp_name = Read_WarningType_Get(t.T_tp)
+	r.T_sn = t.T_sn
+	r.T_D_name = t.T_D_name
+	r.T_id = t.T_id
+	r.T_DS_name = t.T_DS_name
+	r.T_Remark = t.T_Remark
+	r.T_Ut = t.T_Ut.Format("2006-01-02 15:04:05")
+	if !t.T_fUt.IsZero() {
+		r.T_fUt = t.T_fUt.Format("2006-01-02 15:04:05")
+	}
+	r.T_Text = t.T_Text
+	if len(t.T_Log) > 0 {
+		r.T_Log = strings.Split(strings.TrimRight(t.T_Log, "\n"), "\n")
+	}
+
+	r.T_Msid = t.T_Msid
+	r.T_State = t.T_State
+	r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
+	return r
+}
+
 // 获取 ById
 func Read_Warning_ById(id int64) (r Warning) {
 	o := orm.NewOrm()
@@ -590,7 +637,7 @@ func Read_DeviceLogs_List(T_sn string, page, page_z int) (r []DeviceLogs, cnt in
 }
 
 // 通过传感器类型获取报警列表
-func Read_Warning_List_By_DS_T_type(T_pid, DS_T_type int, T_name string, page int, page_z int) (r []Warning_R, cnt int64) {
+func Read_Warning_List_By_DS_T_type(T_pid, DS_T_type int, T_name string, page int, page_z int) (r []Warning_Applet, cnt int64) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 	var maps []Warning
@@ -644,7 +691,7 @@ func Read_Warning_List_By_DS_T_type(T_pid, DS_T_type int, T_name string, page in
 	}
 
 	for _, v := range maps {
-		r = append(r, WarningToWarning_R(0, v))
+		r = append(r, WarningToWarning_Applet(v))
 	}
 
 	cnt, _ = strconv.ParseInt(maps_z[0][0].(string), 10, 64)

+ 2 - 0
routers/Data.go

@@ -22,6 +22,8 @@ func init() {
 			beego.NSRouter("/BackUp", &controllers.DataController{}, "*:Device_Sensor_Data_BackUp"),         // 设备数据备份列表
 			beego.NSRouter("/BackUp_PDF", &controllers.DataController{}, "*:Device_Sensor_Data_BackUp_PDF"), // 设备数据备份列表PDF
 
+			beego.NSRouter("/DeviceSensor_Data_Print", &controllers.DataController{}, "*:DeviceSensor_Data_Print"), // 小程序 打印
+
 			// 执行 SQL
 			beego.NSRouter("/Raw", &controllers.RawSqlController{}, "*:Raw"), // 执行 SQL
 		),

+ 18 - 0
routers/DataSource.go

@@ -0,0 +1,18 @@
+package routers
+
+import (
+	"Cold_Api/conf"
+	"Cold_Api/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	ns := beego.NewNamespace(conf.Version,
+		beego.NSRouter("/DataSource", &controllers.DataSourceController{}, "*:DataSource_Exec"),      // 执行sql
+		beego.NSRouter("/DataSource/List", &controllers.DataSourceController{}, "*:DataSource_List"), // 数据源列表
+		beego.NSRouter("/DataSource/Add", &controllers.DataSourceController{}, "*:DataSource_Add"),   // 添加数据源
+		beego.NSRouter("/DataSource/Edit", &controllers.DataSourceController{}, "*:DataSource_Edit"), // 编辑数据源
+		beego.NSRouter("/DataSource/Del", &controllers.DataSourceController{}, "*:DataSource_Del"),   // 删除数据源
+	)
+	beego.AddNamespace(ns)
+}

+ 6 - 3
routers/Device.go

@@ -27,7 +27,8 @@ func init() {
 			beego.NSRouter("/Log", &controllers.DeviceController{}, "*:DeviceLogs"), // 日志
 
 			// 设备任务
-			beego.NSRouter("/DeviceTask_List", &controllers.DeviceController{}, "*:DeviceTask_List"), // 任务列表
+			//beego.NSRouter("/DeviceTask_List", &controllers.DeviceController{}, "*:DeviceTask_List"), // 任务列表
+			beego.NSRouter("/DeviceTask_List", &controllers.DeviceController{}, "*:DeviceTask_All"),  // 任务列表
 			beego.NSRouter("/DeviceTask_Post", &controllers.DeviceController{}, "*:DeviceTask_Post"), // 远程启停
 
 			// 分类绑定
@@ -35,6 +36,7 @@ func init() {
 			// 报警策略绑定
 			beego.NSRouter("/DeviceNoticeBind_List", &controllers.DeviceController{}, "*:DeviceNoticeBind_List"), // 设备传感器绑定的报警策略列表
 
+			beego.NSRouter("/Applet_Stat_View2", &controllers.DeviceController{}, "*:Device_Applet_Stat"), // 设备统计 - 小程序
 		),
 
 		// 传感器
@@ -49,8 +51,9 @@ func init() {
 			beego.NSRouter("/Parameter_Pu", &controllers.DeviceController{}, "*:DeviceSensor_Parameter_Pu"),     // 修改传感器参数
 			// 传感器管理列表
 			beego.NSRouter("/Manage_List", &controllers.DeviceController{}, "*:DeviceSensor_Manage_List"), // 传感器管理列表
-			beego.NSRouter("/Stat", &controllers.DeviceController{}, "*:DeviceSensor_Stat"),               // 传感器统计 - 小程序
-			beego.NSRouter("/Stat_List", &controllers.DeviceController{}, "*:DeviceSensor_Stat_List"),     // 传感器列表统计 - 小程序
+
+			beego.NSRouter("/Applet_List_View1", &controllers.DeviceController{}, "*:DeviceSensor_Applet_List_View1"), // 传感器列表 - 小程序
+			beego.NSRouter("/Applet_List_View2", &controllers.DeviceController{}, "*:DeviceSensor_Applet_List_View2"), // 设备列表 - 小程序
 
 		),
 		// 传感器类型

+ 7 - 8
routers/Product.go

@@ -7,12 +7,11 @@ import (
 )
 
 func init() {
-	var version = conf.Version
-
-	// 系统日志
-	beego.Router(version+"/ProductUpgrade/List", &controllers.ProductController{}, "*:ProductUpgrade_List")                 // 设备版本升级列表
-	beego.Router(version+"/ProductUpgrade/Add", &controllers.ProductController{}, "*:ProductUpgrade_Add")                   // 添加设备版本升级
-	beego.Router(version+"/ProductUpgrade/Del", &controllers.ProductController{}, "*:ProductUpgrade_Del")                   // 删除设备版本升级
-	beego.Router(version+"/ProductUpgrade/T_model_List", &controllers.ProductController{}, "*:ProductUpgrade_T_model_List") // 设备版本升级-产品型号列表
-
+	ns := beego.NewNamespace(conf.Version,
+		beego.NSRouter("/ProductUpgrade/List", &controllers.ProductController{}, "*:ProductUpgrade_List"),                 // 设备版本升级列表
+		beego.NSRouter("/ProductUpgrade/Add", &controllers.ProductController{}, "*:ProductUpgrade_Add"),                   // 添加设备版本升级
+		beego.NSRouter("/ProductUpgrade/Del", &controllers.ProductController{}, "*:ProductUpgrade_Del"),                   // 删除设备版本升级
+		beego.NSRouter("/ProductUpgrade/T_model_List", &controllers.ProductController{}, "*:ProductUpgrade_T_model_List"), // 设备版本升级-产品型号列表
+	)
+	beego.AddNamespace(ns)
 }

+ 4 - 0
routers/filter.go

@@ -80,6 +80,10 @@ func RBACFilter(ctx *context.Context) {
 // 验证需要T_pid访问的接口
 func T_pidFilter(ctx *context.Context) {
 
+	//判断URL是否排除
+	if _, ok := filterExcludeURLMap[ctx.Request.URL.Path]; ok {
+		return
+	}
 	//判断是否只验证登录的URL
 	if _, ok := filterOnlyLoginCheckURLMap[ctx.Request.URL.Path]; ok {
 		return