Prechádzať zdrojové kódy

add: 设备产品升级,设备日志,报警优化,主页

zoie 2 rokov pred
rodič
commit
83c765648a

+ 1 - 0
.gitignore

@@ -34,3 +34,4 @@ lastupdate.tmp
 main
 Cold_Api6200
 Makefile
+ofile

+ 6 - 0
Makefile

@@ -0,0 +1,6 @@
+build:
+	@echo "+ build"
+	go build -o Cold_Api6200 main.go
+build-linux:
+	@echo "+ build linux"
+	GOOS=linux GOARCH=amd64 go build -o Cold_Api6200 main.go

+ 0 - 3
Nats/Nats.go

@@ -5,7 +5,6 @@ import (
 	"Cold_Api/controllers/lib"
 	"Cold_Api/logs"
 	"Cold_Api/models/Account"
-	"Cold_Api/models/Company"
 	"Cold_Api/models/Device"
 	"Cold_Api/models/System"
 	"encoding/xml"
@@ -13,9 +12,7 @@ import (
 	"github.com/astaxie/beego/cache"
 	"github.com/nats-io/nats.go"
 	"github.com/vmihailenco/msgpack/v5"
-	"strconv"
 	"strings"
-	"time"
 )
 
 var redisCache_NatsServer cache.Cache

+ 14 - 0
Nats/NatsServer/NatsMqtt.go

@@ -62,6 +62,20 @@ func Set_DeviceTask(v Device.Device_task) {
 
 }
 
+func Set_RestartShutdown(v Device.Device_task) {
+	logs.Println("Nats =>", lib.FuncName(), v)
+	b, err := msgpack.Marshal(&v)
+	if err != nil {
+		panic(err)
+	}
+
+	err = lib.Nats.Publish("Set_RestartShutdown", b)
+	if err != nil {
+		logs.Println("Nats =>", lib.FuncName(), err)
+	}
+
+}
+
 func Del_DeviceSensor(v Device.DeviceSensor_Del) {
 	logs.Println("Nats =>", lib.FuncName(), v)
 	b, err := msgpack.Marshal(&v)

+ 23 - 0
Nats/NatsServer/NatsProduct.go

@@ -0,0 +1,23 @@
+package NatsServer
+
+import (
+	"Cold_Api/controllers/lib"
+	"Cold_Api/logs"
+	"Cold_Api/models/Product"
+	"github.com/vmihailenco/msgpack/v5"
+)
+
+func Up_ProductUpgrade(T_sn, T_version, T_file string) {
+	t_Req := Product.ProductUpgrade_T{
+		T_sn:      T_sn,
+		T_version: T_version,
+		T_file:    T_file,
+	}
+	b, _ := msgpack.Marshal(&t_Req)
+
+	err := lib.Nats.Publish("Up_ProductUpgrade", b)
+	if err != nil {
+		logs.Println("Nats =>", lib.FuncName(), err)
+	}
+
+}

+ 32 - 0
Nats/NatsServer/NatsWorkOrder.go

@@ -0,0 +1,32 @@
+package NatsServer
+
+import (
+	"Cold_Api/controllers/lib"
+	"fmt"
+	"github.com/vmihailenco/msgpack/v5"
+	"time"
+)
+
+func Read_WorkOrderT_State_Count(T_pids string) (int64, int64) {
+	msg, err := lib.Nats.Request("Cold_WorkOrder_Read_WorkOrderT_State_Count", []byte(T_pids), 3*time.Second)
+	if err != nil {
+		return 0, 0
+	}
+
+	fmt.Printf("UserListAll: %v\n", string(msg.Data))
+	type T_R struct {
+		Code                  int16  `xml:"Code"`
+		Msg                   string `xml:"Msg"`
+		WorkOrderNum          int64  // 工单数量
+		UntreatedWorkOrderNum int64  // 未处理工单数量
+	}
+	var t_R T_R
+
+	err = msgpack.Unmarshal(msg.Data, &t_R)
+	if err != nil {
+		return 0, 0
+	}
+
+	return t_R.WorkOrderNum, t_R.UntreatedWorkOrderNum
+
+}

+ 5 - 2
conf/app.conf

@@ -31,11 +31,14 @@ Redis_dbNum = "1"
 
 # 静态资源
 # Oss = "https://osscold.baozhida.cn/"
-Oss = "../../../static"
+Qiniu_AccessKey = "-8ezB_d-8-eUFTMvhOGbGzgeQRPeKQnaQ3DBcUxo"
+Qiniu_SecretKey = "KFhkYxTAJ2ZPN3ZS3euTsfWk8-C92rKgkhAMkDRN"
+Qiniu_BUCKET = "bzdcoldverify"
+Oss = "https://bzdcoldverifyoss.baozhida.cn"
 Oss_file = "C:\\Users\\Administrator\\Pictures\\oss"
 
 # Panel
 Panel_url = "http://127.0.0.1:6204/Cold_Panel"
 
 FilterExcludeURL = /Login_verification
-FilterOnlyLoginCheckURL = /Menu/List,/User/Info
+FilterOnlyLoginCheckURL = /Menu/List,/User/Info,/User/Home

+ 4 - 0
conf/config.go

@@ -28,6 +28,10 @@ var Redis_password, _ = beego.AppConfig.String("Redis_password")
 var Redis_dbNum, _ = beego.AppConfig.String("Redis_dbNum")
 
 // Qiniu
+var Qiniu_AccessKey, _ = beego.AppConfig.String("Qiniu_AccessKey")
+var Qiniu_SecretKey, _ = beego.AppConfig.String("Qiniu_SecretKey")
+var Qiniu_BUCKET, _ = beego.AppConfig.String("Qiniu_BUCKET")
+var OssQiniu = "https://bzdcoldverifyoss.baozhida.cn"
 var Oss, _ = beego.AppConfig.String("Oss")
 var Oss_file, _ = beego.AppConfig.String("Oss_file")
 

+ 7 - 7
controllers/Data.go

@@ -96,11 +96,11 @@ func (c *DataController) Device_Sensor_List() {
 	SN_type := c.GetString("SN_type")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	var cnt int64
-	r_jsons.DeviceSensor_lite, cnt = Device.Read_DeviceSensor_class_ALL_1(T_pid, T_Calss_id, page, page_z, T_sn, T_name, SN_type)
+	r_jsons.DeviceSensor_lite, cnt = Device.Read_DeviceSensor_class_ALL_1(admin_r, T_pid, T_Calss_id, page, page_z, T_sn, T_name, SN_type)
 
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.Page = int(page)
@@ -133,8 +133,8 @@ func (c *DataController) Device_Sensor_Data() {
 	}
 	var r_jsons R_JSONS
 	var cnt int
-	SParamMap := Device.Read_DeviceSensorParameter_Map_All(SN, T_id)
-	r_jsons.DeviceSensor_data, cnt = Device.Read_DeviceData_ById_List(SN, T_id, Time_start, Time_end, page, page_z, SParamMap)
+	Device.Read_DeviceSensorParameter_Map_All(SN, T_id)
+	r_jsons.DeviceSensor_data, cnt = Device.Read_DeviceData_ById_List(SN, T_id, Time_start, Time_end, page, page_z)
 
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.Page = page
@@ -147,7 +147,7 @@ func (c *DataController) Device_Sensor_Data() {
 	return
 }
 
-// 列表 - 接口
+// 设备数据
 func (c *DataController) Device_Sensor_Data_More() {
 	// 验证登录
 	b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
@@ -445,8 +445,8 @@ func (c *DataController) DeviceSensor_Data_Print() {
 		r_jsons[tt] = R_JSONS{T_time: tt, T1: nil, T2: nil, T3: nil, T4: nil}
 	}
 	// 记录传感器
-	SParamMap := Device.Read_DeviceSensorParameter_Map_All(SN, T_id)
-	maps, num := Device.Read_DeviceData_ById_List(SN, T_id, Time_start, Time_end, 1, 9999, SParamMap)
+	Device.Read_DeviceSensorParameter_Map_All(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] /*如果确定是真实的,则存在,否则不存在 */

+ 167 - 54
controllers/Device.go

@@ -4,6 +4,7 @@ import (
 	"Cold_Api/Nats/NatsServer"
 	"Cold_Api/conf"
 	"Cold_Api/controllers/lib"
+	"Cold_Api/models/Account"
 	"Cold_Api/models/Company"
 	"Cold_Api/models/Device"
 	"Cold_Api/models/Product"
@@ -59,10 +60,10 @@ func (c *DeviceController) Device_List() {
 
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	Product.Read_ProductType_All()
-	r_jsons.Device_lite, r_jsons.Num = Device.Read_Device_List(T_pid, Name, T_monitor, T_online, T_type, page, page_z)
+	r_jsons.Device_lite, r_jsons.Num = Device.Read_Device_List(admin_r, T_pid, Name, T_monitor, T_online, T_type, page, page_z)
 
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
@@ -88,7 +89,7 @@ func (c *DeviceController) Device_Add() {
 	T_type, _ := c.GetInt("T_type")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	var_ := Device.Device{
 		T_pid:     T_pid,
@@ -186,6 +187,31 @@ func (c *DeviceController) Device_Edit() {
 	return
 
 }
+
+// 重启/关机
+func (c *DeviceController) Device_RestartShutdown() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_sn := c.GetString("T_sn")
+	T_task := c.GetString("T_task")
+
+	NatsServer.Set_RestartShutdown(Device.Device_task{
+		T_sn:   T_sn,
+		T_task: T_task,
+	})
+	System.Add_UserLogs(admin_r.T_uuid, "设备管理", "重启/关机", T_sn+"-"+T_task)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+
+}
 func (c *DeviceController) Device_Del() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
@@ -226,6 +252,40 @@ func (c *DeviceController) Device_Del() {
 
 }
 
+// 设备日志
+func (c *DeviceController) DeviceLogs() {
+
+	type R_JSONS struct {
+		//必须的大写开头
+		DeviceLogs []Warning.DeviceLogs
+		Num        int64
+		Page       int
+		Page_size  int
+	}
+	var r_jsons R_JSONS
+
+	page, _ := c.GetInt("page")
+	println(page)
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	T_sn := c.GetString("T_sn")
+	c.Data["T_sn"] = T_sn
+
+	r_jsons.DeviceLogs, r_jsons.Num = Warning.Read_DeviceLogs_ALL(T_sn, 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()
+}
+
 // 设备参数 ------------------------------------------
 
 // 设备参数列表
@@ -334,6 +394,7 @@ func (c *DeviceController) Device_Parameter_Pu() {
 }
 
 // 删除设备 传感器
+// fixme 没有检查
 func (c *DeviceController) Device_Parameter_Del_Device() {
 
 	// 验证登录
@@ -361,6 +422,7 @@ func (c *DeviceController) Device_Parameter_Del_Device() {
 }
 
 // 设备参数 1库房 2移动
+// fixme 没有检查
 func (c *DeviceController) Pu_DeviceParameter_T_type() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
@@ -392,6 +454,7 @@ func (c *DeviceController) Pu_DeviceParameter_T_type() {
 }
 
 // 设备是否弃用 0屏蔽 1正常
+// fixme 没有检查
 func (c *DeviceController) Pu_DeviceParameter_T_give() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
@@ -424,6 +487,7 @@ func (c *DeviceController) Pu_DeviceParameter_T_give() {
 }
 
 // 获取传感器参数
+// fixme 没有检查
 func (c *DeviceController) Read_DeviceSensorParameter() {
 	// 验证登录
 	b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
@@ -480,9 +544,15 @@ func (c *DeviceController) DeviceSensor_List() {
 		page_z = conf.Page_size
 	}
 
+	T_pid := admin_r.T_pid
+	if T_pid == 0 {
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
+	}
+
 	T_sn := c.GetString("T_sn")
 	Name := c.GetString("T_name") //  包含 T_name、T_sn
 	T_calss_id, _ := c.GetInt("T_calssid")
+	T_notice_id, _ := c.GetInt("T_noticeid")
 	T_give, T_give_err := c.GetInt("T_give") //0 :丢弃  1:正常    空:所有
 	if T_give_err != nil {
 		T_give = -1
@@ -491,10 +561,6 @@ func (c *DeviceController) DeviceSensor_List() {
 	if T_datashow_err != nil {
 		T_datashow = -1
 	}
-	var T_pid int
-	if admin_r.T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
-	}
 	if T_calss_id > 0 {
 		R_DeviceClass, err := Company.Read_CompanyNotice_ById(T_calss_id)
 		if err != nil {
@@ -509,7 +575,7 @@ func (c *DeviceController) DeviceSensor_List() {
 		}
 	}
 
-	r_jsons.Data, r_jsons.Num = Device.Read_DeviceSensorList(T_pid, T_sn, Name, T_calss_id, T_give, T_datashow, page, page_z)
+	r_jsons.Data, r_jsons.Num = Device.Read_DeviceSensorList(admin_r, T_pid, T_sn, Name, T_calss_id, T_notice_id, T_give, T_datashow, page, page_z)
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
 
@@ -604,7 +670,7 @@ func (c *DeviceController) DeviceSensor_Parameter_List() {
 	Id, _ := c.GetInt("T_id")
 
 	//c.Data["DeviceSensor"], _ = Device.Read_DeviceSensor_ByTsn_Tid(Sn, Id)
-	DeviceSensorParameter_lite := Device.Read_V2DeviceSensorParameter_List(Sn, Id, 2, 10)
+	DeviceSensorParameter_lite := Device.Read_DeviceSensorParameter_List(Sn, Id, 2, 10)
 	if len(DeviceSensorParameter_lite) == 0 {
 		NatsServer.Read_DeviceSensorParameter(Sn)
 		c.Data["json"] = lib.JSONS{Code: 203, Msg: "未同步参数,请检查设备是否正常!"}
@@ -700,6 +766,7 @@ func (c *DeviceController) DeviceSensor_Parameter_Pu() {
 }
 
 // 传感器 实时数据显示排序
+// fixme 没有检查
 func (c *DeviceController) UpDeviceSensor_Tsort() {
 
 	// 验证登录
@@ -730,6 +797,7 @@ func (c *DeviceController) UpDeviceSensor_Tsort() {
 }
 
 // 传感器 3D视图
+// fixme 没有检查
 func (c *DeviceController) UpDeviceSensor_T3dview() {
 
 	// 验证登录
@@ -760,6 +828,7 @@ func (c *DeviceController) UpDeviceSensor_T3dview() {
 }
 
 // 传感器 屏蔽数据展示 0 屏蔽数据展示  1 正常数据展示
+// fixme 没有检查
 func (c *DeviceController) UpDeviceSensor_T_datashow() {
 
 	// 验证登录
@@ -895,26 +964,50 @@ func (c *DeviceController) DeviceWarning_List() {
 		page_z = conf.Page_size
 	}
 
-	T_sn := c.GetString("T_sn")
-	T_id := c.GetString("T_id")
-	T_title := c.GetString("T_title")
+	T_name := c.GetString("T_name")
+	T_tp := c.GetString("T_tp")
 	Time_start := c.GetString("Time_start")
 	Time_end := c.GetString("Time_end")
 	T_handle, _ := c.GetInt("T_handle")
 
-	T_year, _ := c.GetInt("T_year")
-	T_month, _ := c.GetInt("T_month")
+	T_admin, _ := c.GetInt("T_admin")
+	T_history, _ := c.GetInt("T_history")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
+	var T_year, T_month string
+	if T_history == 1 {
+		date, err := time.Parse("2006-01-02 15:04:05", Time_start)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 200, Msg: "时间格式错误"}
+			c.ServeJSON()
+			return
+		}
+		T_year, T_month = date.Format("2006"), date.Format("01")
+	}
+
+	Warning.Read_WarningType_All_Maps()
 
-	if T_year > 0 && T_month > 0 {
+	if T_admin == 1 {
+		if T_history == 1 {
+			// 获取备份
+			r_jsons.Data, r_jsons.Num = Warning.Read_Admin_Warning_Backups(admin_r.T_pids, T_year, T_month, T_tp, T_name, T_handle, Time_start, Time_end, page, page_z)
+		} else {
+			// 获取最新
+			r_jsons.Data, r_jsons.Num = Warning.Read_Admin_Warning(admin_r.T_pids, T_tp, T_name, T_handle, Time_start, Time_end, page, page_z)
+		}
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+		c.ServeJSON()
+		return
+	}
+
+	if T_history == 1 {
 		// 获取备份
-		r_jsons.Data, r_jsons.Num = Warning.Read_Warning_Backups(T_pid, strconv.Itoa(T_year), strconv.Itoa(T_month), T_sn, T_id, T_title, T_handle, Time_start, Time_end, page, page_z)
+		r_jsons.Data, r_jsons.Num = Warning.Read_Warning_Backups(T_pid, T_year, T_month, T_tp, T_name, T_handle, Time_start, Time_end, page, page_z)
 	} else {
 		// 获取最新
-		r_jsons.Data, r_jsons.Num = Warning.Read_Warning(T_pid, T_sn, T_id, T_title, T_handle, Time_start, Time_end, page, page_z)
+		r_jsons.Data, r_jsons.Num = Warning.Read_Warning(T_pid, T_tp, T_name, T_handle, Time_start, Time_end, page, page_z)
 	}
 
 	r_jsons.Page = page
@@ -963,7 +1056,7 @@ func (c *DeviceController) DeviceWarning_Post() {
 		return
 	}
 	T.T_Text = T_Text
-	T.T_State = 1
+	T.T_State = 2
 
 	Warning.Update_Warning(T, "T_Text", "T_State")
 
@@ -1010,19 +1103,17 @@ func (c *DeviceController) DeviceWarning_Data_Excel() {
 		return
 	}
 
-	//T_sn := c.GetString("T_sn")
-	T_sn := c.GetString("T_sn")
-	T_id := c.GetString("T_id")
-	T_title := c.GetString("T_title")
+	T_name := c.GetString("T_name")
+	T_tp := c.GetString("T_tp")
 	Time_start := c.GetString("Time_start")
 	Time_end := c.GetString("Time_end")
 	T_handle, _ := c.GetInt("T_handle")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
-	Device_data, _ := Warning.Read_Warning(T_pid, T_sn, T_id, T_title, T_handle, Time_start, Time_end, 0, 9999)
+	Device_data, _ := Warning.Read_Warning(T_pid, T_tp, T_name, T_handle, Time_start, Time_end, 0, 9999)
 
 	f := excelize.NewFile() // 设置单元格的值
 	// 这里设置表头
@@ -1113,6 +1204,28 @@ func (c *DeviceController) WarningType_List_All() {
 	return
 }
 
+// 告警类型列表
+func (c *DeviceController) WarningType_Power_List_All() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	power, err := Account.Read_Power_ById(admin_r.T_power)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "获取菜单失败"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningType_Power_All(power.T_warning)}
+	c.ServeJSON()
+	return
+}
+
 // 设备分类 ------------------------------------------
 func (c *DeviceController) CompanyClass_List() {
 	// 验证登录
@@ -1145,7 +1258,7 @@ func (c *DeviceController) CompanyClass_List() {
 	T_name := c.GetString("T_name")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	r_jsons.Data, r_jsons.Num = Company.Read_CompanyClass_List(T_pid, T_name, page, page_z)
@@ -1177,7 +1290,7 @@ func (c *DeviceController) CompanyClass_All() {
 	T_name := c.GetString("T_name")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	r_jsons.Data = Company.Read_CompanyClass_All(T_pid, T_name)
@@ -1198,7 +1311,7 @@ func (c *DeviceController) CompanyClass_Get() {
 	id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	R_DeviceClass, err := Company.Read_CompanyClass_ById(id)
 	if err != nil {
@@ -1227,7 +1340,7 @@ func (c *DeviceController) CompanyClass_Add() {
 	T_name := c.GetString("T_name")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	t_c := Company.CompanyClass{
 		T_pid:   T_pid,
@@ -1260,7 +1373,7 @@ func (c *DeviceController) CompanyClass_Edit() {
 	id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	R_DeviceClass, err := Company.Read_CompanyClass_ById(id)
 	if err != nil {
@@ -1302,7 +1415,7 @@ func (c *DeviceController) CompanyClass_Del() {
 	id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	R_DeviceClass, err := Company.Read_CompanyClass_ById(id)
 	if err != nil {
@@ -1358,7 +1471,7 @@ func (c *DeviceController) DeviceClassBind_List() {
 	page_z, _ := c.GetInt("page_z")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	R_DeviceClass, err := Company.Read_CompanyClass_ById(T_class_id)
 	if err != nil {
@@ -1372,7 +1485,7 @@ func (c *DeviceController) DeviceClassBind_List() {
 		return
 	}
 	var cnt int64
-	Device_lite, cnt := Device.Read_DeviceSensor_class_ALL_1(T_pid, T_class_id, page, page_z, T_sn, Name, "")
+	Device_lite, cnt := Device.Read_DeviceSensor_class_ALL_1(admin_r, T_pid, T_class_id, page, page_z, T_sn, Name, "")
 
 	r_jsons.DeviceSensor_lite = Device_lite
 
@@ -1400,7 +1513,7 @@ func (c *DeviceController) ClassBind_Add() {
 	T_id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	if T_class_id == 0 || T_id == 0 || len(T_sn) == 0 {
@@ -1413,7 +1526,7 @@ func (c *DeviceController) ClassBind_Add() {
 		c.ServeJSON()
 		return
 	}
-	R_DeviceClass, err := Company.Read_CompanyNotice_ById(T_class_id)
+	R_DeviceClass, err := Company.Read_CompanyClass_ById(T_class_id)
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 205, Msg: "T_class_id Err!"}
 		c.ServeJSON()
@@ -1456,7 +1569,7 @@ func (c *DeviceController) ClassBind_Del() {
 	T_id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	if T_class_id == 0 || T_id == 0 || len(T_sn) == 0 {
@@ -1469,7 +1582,7 @@ func (c *DeviceController) ClassBind_Del() {
 		c.ServeJSON()
 		return
 	}
-	R_DeviceClass, err := Company.Read_CompanyNotice_ById(T_class_id)
+	R_DeviceClass, err := Company.Read_CompanyClass_ById(T_class_id)
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 205, Msg: "T_class_id Err!"}
 		c.ServeJSON()
@@ -1500,7 +1613,7 @@ func (c *DeviceController) ClassBind_Del() {
 	return
 }
 
-// 设备通知 ------------------------------------------
+// 报警策略 ------------------------------------------
 func (c *DeviceController) CompanyNotice_List() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
@@ -1532,7 +1645,7 @@ func (c *DeviceController) CompanyNotice_List() {
 	T_name := c.GetString("T_name")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	r_jsons.Data, r_jsons.Num = Company.Read_CompanyNotice_List(T_pid, T_name, page, page_z)
@@ -1564,7 +1677,7 @@ func (c *DeviceController) CompanyNotice_All() {
 	T_name := c.GetString("T_name")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	r_jsons.Data = Company.Read_CompanyNotice_All(T_pid, T_name)
@@ -1585,7 +1698,7 @@ func (c *DeviceController) CompanyNotice_Get() {
 	id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	R_DeviceNotice, err := Company.Read_CompanyNotice_ById(id)
 	if err != nil {
@@ -1620,7 +1733,7 @@ func (c *DeviceController) CompanyNotice_Add() {
 	T_Notice_mechanism := c.GetString("T_Notice_mechanism")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	t_c := Company.CompanyNotice{
 		T_pid:              T_pid,
@@ -1640,7 +1753,7 @@ func (c *DeviceController) CompanyNotice_Add() {
 		c.ServeJSON()
 		return
 	}
-	System.Add_UserLogs_T(admin_r.T_uuid, "设备管理", "通知添加", t_c)
+	System.Add_UserLogs_T(admin_r.T_uuid, "设备管理", "报警策略添加", t_c)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
 	c.ServeJSON()
@@ -1665,7 +1778,7 @@ func (c *DeviceController) CompanyNotice_Edit() {
 	T_Notice_mechanism := c.GetString("T_Notice_mechanism")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	R_DeviceNotice, err := Company.Read_CompanyNotice_ById(id)
@@ -1709,7 +1822,7 @@ func (c *DeviceController) CompanyNotice_Edit() {
 		return
 	}
 
-	System.Add_UserLogs_T(admin_r.T_uuid, "设备管理", "通知修改", R_DeviceNotice)
+	System.Add_UserLogs_T(admin_r.T_uuid, "设备管理", "报警策略修改", R_DeviceNotice)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -1727,7 +1840,7 @@ func (c *DeviceController) CompanyNotice_Del() {
 	id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	R_DeviceNotice, err := Company.Read_CompanyNotice_ById(id)
 	if err != nil {
@@ -1749,7 +1862,7 @@ func (c *DeviceController) CompanyNotice_Del() {
 	for _, v := range DeviceSensor_class_list {
 		Device.DeviceSensor_Bind_T_Notice_Del(v.T_sn, v.T_id, id)
 	}
-	System.Add_UserLogs(admin_r.T_uuid, "设备管理", "通知删除", strconv.Itoa(id))
+	System.Add_UserLogs(admin_r.T_uuid, "设备管理", "报警策略删除", strconv.Itoa(id))
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -1776,13 +1889,13 @@ func (c *DeviceController) DeviceNoticeBind_List() {
 	}
 	var r_jsons R_JSONS
 	page, _ := c.GetInt("page")
-	Name := c.GetString("Name")
+	T_name := c.GetString("T_name")
 	T_sn := c.GetString("T_sn")
 	T_notice_id, _ := c.GetInt("T_notice_id")
 	page_z, _ := c.GetInt("page_z")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	R_DeviceNotice, err := Company.Read_CompanyNotice_ById(T_notice_id)
 	if err != nil {
@@ -1796,7 +1909,7 @@ func (c *DeviceController) DeviceNoticeBind_List() {
 		return
 	}
 	var cnt int64
-	Device_lite, cnt := Device.Read_DeviceSensor_Notice_ALL_1(T_pid, T_notice_id, page, page_z, T_sn, Name, "")
+	Device_lite, cnt := Device.Read_DeviceSensor_Notice_ALL_1(T_pid, T_notice_id, page, page_z, T_sn, T_name, "")
 
 	r_jsons.DeviceSensor_lite = Device_lite
 
@@ -1824,7 +1937,7 @@ func (c *DeviceController) NoticeBind_Add() {
 	T_id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	if T_notice_id == 0 || T_id == 0 || len(T_sn) == 0 {
@@ -1867,7 +1980,7 @@ func (c *DeviceController) NoticeBind_Add() {
 		c.ServeJSON()
 		return
 	}
-	System.Add_UserLogs(admin_r.T_uuid, "设备管理", "通知绑定操作", strconv.Itoa(T_notice_id)+"+>"+T_sn+"-"+strconv.Itoa(T_id))
+	System.Add_UserLogs(admin_r.T_uuid, "设备管理", "报警策略绑定添加", strconv.Itoa(T_notice_id)+"+>"+T_sn+"-"+strconv.Itoa(T_id))
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
 	return
@@ -1886,7 +1999,7 @@ func (c *DeviceController) NoticeBind_Del() {
 	T_id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	if T_notice_id == 0 || T_id == 0 || len(T_sn) == 0 {
@@ -1929,7 +2042,7 @@ func (c *DeviceController) NoticeBind_Del() {
 		c.ServeJSON()
 		return
 	}
-	System.Add_UserLogs(admin_r.T_uuid, "设备管理", "通知删除绑定操作", strconv.Itoa(T_notice_id)+"->"+T_sn+"-"+strconv.Itoa(T_id))
+	System.Add_UserLogs(admin_r.T_uuid, "设备管理", "通知删除绑定删除", strconv.Itoa(T_notice_id)+"->"+T_sn+"-"+strconv.Itoa(T_id))
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()

+ 5 - 5
controllers/GoodsOrder.go

@@ -51,7 +51,7 @@ func (c *GoodsOrderController) GoodsOrder_List() {
 
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	Name := c.GetString("T_name")
@@ -76,7 +76,7 @@ func (c *GoodsOrderController) GoodsOrder_Get() {
 	Id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	r := Function.Read_GoodsOrder_ById(Id)
 
@@ -122,7 +122,7 @@ func (c *GoodsOrderController) GoodsOrder_Add() {
 	}
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 
 	T_start_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_time_s[0], time.Local)
@@ -188,7 +188,7 @@ func (c *GoodsOrderController) GoodsOrder_Edit() {
 	}
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	println("T_time_s:", T_time_s)
 	T_start_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_time_s[0], time.Local)
@@ -241,7 +241,7 @@ func (c *GoodsOrderController) GoodsOrder_Del() {
 	Id, _ := c.GetInt("T_id")
 	T_pid := admin_r.T_pid
 	if T_pid == 0 {
-		T_pid, _ = c.GetInt("T_pid")
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
 	}
 	r := Function.Read_GoodsOrder_ById(Id)
 

+ 141 - 0
controllers/Product.go

@@ -0,0 +1,141 @@
+package controllers
+
+import (
+	"Cold_Api/Nats/NatsServer"
+	"Cold_Api/conf"
+	"Cold_Api/controllers/lib"
+	"Cold_Api/models/Device"
+	"Cold_Api/models/Product"
+	"Cold_Api/models/System"
+	beego "github.com/beego/beego/v2/server/web"
+	"math"
+	"strconv"
+)
+
+type ProductController struct {
+	beego.Controller
+}
+
+func (c *ProductController) ProductUpgrade_List() {
+	// 验证登录
+	//b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	//if !b_ {
+	//	c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+	//	c.ServeJSON()
+	//	return
+	//}
+	type R_JSONS struct {
+		//必须的大写开头
+		Data      []Product.ProductUpgrade_R
+		Num       int64
+		Page      int
+		Page_size int
+	}
+
+	var r_jsons R_JSONS
+
+	page, _ := c.GetInt("page")
+	println(page)
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	T_model := c.GetString("T_model")
+	r_jsons.Data, r_jsons.Num = Product.Read_ProductUpgrade_List(T_model, 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 *ProductController) ProductUpgrade_T_model_List() {
+	// 验证登录
+	b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Product.Read_ProductUpgrade_T_model()}
+	c.ServeJSON()
+	return
+}
+func (c *ProductController) ProductUpgrade_Add() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_model := c.GetString("T_model")
+	T_version := c.GetString("T_version")
+	T_file := c.GetString("T_file")
+	T_remarks := c.GetString("T_remarks")
+	T_carryout, _ := c.GetInt("T_carryout")
+
+	var_ := Product.ProductUpgrade{
+		T_model:    T_model,
+		T_version:  T_version,
+		T_file:     T_file,
+		T_remarks:  T_remarks,
+		T_carryout: T_carryout,
+	}
+
+	Id, err := Product.Add_ProductUpgrade(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	deviceList := Device.Read_Device_List_T_model(T_model)
+
+	for _, v := range deviceList {
+		NatsServer.Up_ProductUpgrade(v.T_sn, T_version, T_file)
+		System.Add_UserLogs_T(admin_r.T_uuid, "设备版本升级", "同步", "SN:"+v.T_sn+T_version+T_file)
+	}
+
+	System.Add_UserLogs_T(admin_r.T_uuid, "设备版本升级管理", "添加", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
+	c.ServeJSON()
+	return
+}
+func (c *ProductController) ProductUpgrade_Del() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	id, _ := c.GetInt("T_id")
+
+	_, err := Product.Read_ProductUpgrade_ById(id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if is := Product.Delete_ProductUpgrade_ById(id); !is {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	System.Add_UserLogs(admin_r.T_uuid, "设备版本升级管理", "删除", strconv.Itoa(id))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}

+ 3 - 72
controllers/RawSql.go

@@ -1,88 +1,19 @@
 package controllers
 
 import (
-	"Cold_Api/conf"
 	"Cold_Api/controllers/lib"
 	"Cold_Api/models/Device"
 	"Cold_Api/models/RawSql"
 	"fmt"
 	beego "github.com/beego/beego/v2/server/web"
-	"math"
 	"strings"
 )
 
-//Handle
+// Handle
 type RawSqlController struct {
 	beego.Controller
 }
 
-func (c *RawSqlController) RawSql_html() {
-	// 验证登录
-	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
-	if !b_ {
-		c.Ctx.Redirect(302, "Login")
-		return
-	}
-
-	if admin_r.Id != 1 {
-		c.Data["json"] = lib.JSONS{Code: 201, Msg: "e!"}
-		c.ServeJSON()
-		return
-
-	}
-
-	page, _ := c.GetInt("page")
-
-	println(page)
-	if page < 1 {
-		page = 1
-	}
-
-	page_z, _ := c.GetInt("Page_size")
-	if page_z == 0 {
-		page_z = conf.Page_size
-	}
-
-	List, cnt := RawSql.Read_RawSql_List(page, page_z)
-
-	page_size := math.Ceil(float64(cnt) / float64(conf.Page_size))
-
-	c.Data["List"] = List
-	c.Data["Page"] = page
-	c.Data["Page_size"] = page_size
-	c.Data["Pages"] = lib.Func_page(int64(page), int64(page_size))
-	c.Data["cnt"] = cnt
-
-	c.TplName = "RawSql/RawSql.html"
-}
-
-func (c *RawSqlController) RawSql__html() {
-	// 验证登录
-	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
-	if !b_ {
-		c.Ctx.Redirect(302, "Login")
-		return
-	}
-	if admin_r.Id != 1 {
-		c.Data["json"] = lib.JSONS{Code: 201, Msg: "e!"}
-		c.ServeJSON()
-		return
-
-	}
-
-	//c.Data["Device_lite"] = Device.Read_Device_ALL_bind(admin_r)
-
-	//c.Data["Admin_Power"], _ = Admin.Read_AdminPower_ById(admin_r.T_power)
-	id, _ := c.GetInt("id")
-	c.Data["id"] = id
-	if id > 0 {
-		rs := RawSql.Read_RawSql_ById(id)
-		c.Data["Date"] = rs
-	}
-
-	c.TplName = "RawSql/RawSql-.html"
-}
-
 func (c *RawSqlController) List_Post() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
@@ -176,8 +107,8 @@ func (c *RawSqlController) List_Del() {
 
 }
 
-//  执行 SQL
-func (c *RawSqlController) Rawv3() {
+// 执行 SQL
+func (c *RawSqlController) Raw() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
 	if !b_ {

+ 5 - 5
controllers/UpFile.go

@@ -2,6 +2,7 @@ package controllers
 
 import (
 	"Cold_Api/conf"
+	"Cold_Api/controllers/lib"
 	"crypto/md5"
 	"fmt"
 	beego "github.com/beego/beego/v2/server/web"
@@ -24,6 +25,7 @@ func (c *UpFileController) UpFile() {
 		".jpg":  true,
 		".jpeg": true,
 		".png":  true,
+		".pdf":  true,
 	}
 	if _, ok := AllowExtMap[ext]; !ok {
 		c.Ctx.WriteString("后缀名不符合上传要求")
@@ -54,8 +56,6 @@ func (c *UpFileController) UpFile() {
 	c.Ctx.WriteString("{\n  \"code\": 0\n  ,\"msg\": \"ok!\"\n  ,\"data\": {\n    \"src\": \"" + conf.Oss + fileName + "\"\n  }\n}       ")
 }
 
-
-
 // 列表 -
 func (c *UpFileController) ConfigUpFileToken() {
 	// 验证登录 User_r, User_x
@@ -66,7 +66,7 @@ func (c *UpFileController) ConfigUpFileToken() {
 	//	return
 	//}
 	//
-	//c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: lib.UploadToken(c.GetString("T_suffix"))}
-	//c.ServeJSON()
-	//return
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: lib.UploadToken(c.GetString("T_suffix"))}
+	c.ServeJSON()
+	return
 }

+ 72 - 9
controllers/User.go

@@ -4,6 +4,7 @@ import (
 	"Cold_Api/Nats/NatsServer"
 	"Cold_Api/conf"
 	"Cold_Api/controllers/lib"
+	"Cold_Api/models"
 	"Cold_Api/models/Account"
 	"Cold_Api/models/System"
 	"Cold_Api/models/Warning"
@@ -11,6 +12,7 @@ import (
 	uuid "github.com/satori/go.uuid"
 	"math"
 	"strconv"
+	"time"
 )
 
 type UserController struct {
@@ -18,7 +20,7 @@ type UserController struct {
 }
 
 // 获取微信二维码  ( 扫描后 ,Nats 自动绑定在 Admin->T_wx )
-func (c *DeviceController) User_WxQRCode() {
+func (c *UserController) User_WxQRCode() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
 	if !b_ {
@@ -487,6 +489,46 @@ func (c *UserController) User_Del() {
 
 }
 
+// 管理员
+func (c *UserController) User_Home() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	type Info struct {
+		T_name                string           // 姓名
+		T_pid                 int              // 公司id
+		T_Days                int              // 服务天输
+		Admin                 []Account.Admin_ // 专属管理员
+		WarningNum            int64            // 报警数量
+		UntreatedWarningNum   int64            // 未处理报警数量
+		WorkOrderNum          int64            // 工单数量
+		UntreatedWorkOrderNum int64            // 未处理工单数量
+	}
+	var info Info
+	info.T_name = admin_r.T_name
+	info.T_pid = admin_r.T_pid
+	if admin_r.T_pid > 0 {
+		company, _ := Account.Read_Company_ById(admin_r.T_pid)
+		info.T_Days = int(time.Now().Sub(company.CreateTime).Hours() / 24)
+		info.Admin = Account.Read_Admin_List_T_pids(admin_r.T_pids)
+		info.WarningNum = Warning.Read_Warning_ALL_T_State_Count(admin_r.T_pid, 0)
+		info.UntreatedWarningNum = Warning.Read_Warning_ALL_T_State_Count(admin_r.T_pid, 2)
+	}
+	if admin_r.T_pid == 0 {
+		info.WorkOrderNum, info.UntreatedWorkOrderNum = NatsServer.Read_WorkOrderT_State_Count(admin_r.T_pids)
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: info}
+	c.ServeJSON()
+	return
+
+}
+
 // 内部用户管理
 func (c *UserController) Admin_List() {
 	// 验证登录
@@ -814,10 +856,11 @@ func (c *UserController) Power_Get() {
 		return
 	}
 	type Data struct {
-		Power   Account.Power_
-		Menu    []Account.Menu
-		Select  []Account.Power_R
-		Warning []Warning.WarningType_R
+		Power        Account.Power_
+		Menu         []Account.Menu
+		Menu_checked []int
+		Select       []Account.Power_R
+		Warning      []Warning.WarningType_R
 	}
 
 	var data Data
@@ -837,7 +880,17 @@ func (c *UserController) Power_Get() {
 		return
 	}
 	data.Power = Account.PowerToPower_(power)
-	data.Menu = Account.Read_Menu_List_All_T_Menu(power.T_menu)
+	data.Menu, data.Menu_checked = Account.Read_Menu_List_All()
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_menu Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if power.T_menu != "*" {
+		data.Menu_checked = models.SplitStringToIntIds(power.T_menu, "M")
+	}
+
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_menu Err!"}
 		c.ServeJSON()
@@ -851,7 +904,7 @@ func (c *UserController) Power_Get() {
 		return
 	}
 
-	data.Warning = Warning.Read_WarningType_All_T_Warning(power.T_warning)
+	data.Warning = Warning.Read_WarningType_All_Power_T_Warning(power.T_warning)
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_warning Err!"}
 		c.ServeJSON()
@@ -912,6 +965,11 @@ func (c *UserController) Power_Edit() {
 		c.ServeJSON()
 		return
 	}
+	if Id == 1 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权修改!"}
+		c.ServeJSON()
+		return
+	}
 	r, err := Account.Read_Power_ById(Id)
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
@@ -992,6 +1050,11 @@ func (c *UserController) User_Menu_List() {
 		return
 	}
 
+	T_pid := admin_r.T_pid
+	if T_pid == 0 {
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
+	}
+
 	var r_jsons lib.R_JSONS
 	power, err := Account.Read_Power_ById(admin_r.T_power)
 	if err != nil {
@@ -1000,7 +1063,7 @@ func (c *UserController) User_Menu_List() {
 		return
 	}
 
-	r_jsons.Data = Account.Read_Menu_Bind_List(power.T_menu)
+	r_jsons.Data = Account.Read_Menu_Bind_List(power.T_menu, T_pid)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
 	c.ServeJSON()
@@ -1019,7 +1082,7 @@ func (c *UserController) Menu_List_All() {
 
 	var r_jsons lib.R_JSONS
 
-	r_jsons.Data = Account.Read_Menu_List_All()
+	r_jsons.Data, _ = Account.Read_Menu_List_All()
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
 	c.ServeJSON()

+ 93 - 0
controllers/lib/Qiniu.go

@@ -0,0 +1,93 @@
+package lib
+
+// 存储相关功能的引入包只有这两个,后面不再赘述
+import (
+	"Cold_Api/conf"
+	"Cold_Api/logs"
+	"Cold_Api/models/System"
+	"context"
+	"github.com/qiniu/go-sdk/v7/auth/qbox"
+	"github.com/qiniu/go-sdk/v7/storage"
+	uuid "github.com/satori/go.uuid"
+	"strconv"
+	"time"
+)
+
+var Qiniu *qbox.Mac
+
+// var (
+//
+//	//BUCKET是你在存储空间的名称
+//	accessKey = "-8ezB_d-8-eUFTMvhOGbGzgeQRPeKQnaQ3DBcUxo"
+//	secretKey = "KFhkYxTAJ2ZPN3ZS3euTsfWk8-C92rKgkhAMkDRN"
+//	BUCKET    = "bzdcoldoss"
+//
+// )
+func init() {
+	Qiniu = qbox.NewMac(conf.Qiniu_AccessKey, conf.Qiniu_SecretKey)
+}
+
+// if !lib.Pload_qiniu("ofile/"+timeStr+".xlsx","ofile/"+timeStr+".xlsx"){
+// c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
+// c.ServeJSON()
+// return
+// }
+func Pload_qiniu(localFile string, name string) bool {
+	//localFile := "C:\\Users\\Administrator\\Downloads\\kodo-browser-Windows-x64-v1.0.15.zip"
+	//key := "kodo-browser-Windows-x64-v1.0.15.zip"
+	// 自定义返回值结构体
+	type MyPutRet struct {
+		Key    string
+		Hash   string
+		Fsize  int
+		Bucket string
+		Name   string
+	}
+
+	//key := "your file save key"
+	// 使用 returnBody 自定义回复格式
+	putPolicy := storage.PutPolicy{
+		Scope:      conf.Qiniu_BUCKET,
+		ReturnBody: `{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}`,
+	}
+
+	upToken := putPolicy.UploadToken(Qiniu)
+	cfg := storage.Config{}
+	formUploader := storage.NewFormUploader(&cfg)
+	ret := MyPutRet{}
+	putExtra := storage.PutExtra{
+		Params: map[string]string{
+			"x:name": "github logo",
+		},
+	}
+	err := formUploader.PutFile(context.Background(), &ret, upToken, name, localFile, &putExtra)
+	if err != nil {
+		logs.Println(err)
+		System.Add_Logs("七牛云", "上传文件失败"+localFile, err.Error())
+		return false
+	}
+	logs.Println(ret.Bucket, ret.Key, ret.Fsize, ret.Hash, ret.Name)
+	return true
+}
+
+func UploadToken(T_suffix string) string {
+	Tokey := strconv.FormatInt(time.Now().Unix(), 10) + uuid.NewV4().String()
+	if len(T_suffix) == 0 {
+		T_suffix = ".png"
+	}
+	putPolicy := storage.PutPolicy{
+		Scope:      conf.Qiniu_BUCKET,
+		InsertOnly: 1,    // 仅能以新增模式上传文件。
+		Expires:    7200, //示例2小时有效期
+		ReturnBody: `{"key":"` + conf.OssQiniu + `/$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)"}`,
+		//{"key":"github-x.png","hash":"FqKXVdTvIx_mPjOYdjDyUSy_H1jr","fsize":6091,"bucket":"if-pbl","name":"github logo"}
+		//{"key":"` + conf.Oss + `/$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}
+		ForceSaveKey: true,
+		SaveKey:      "UpImage/" + Tokey + "." + T_suffix,
+		//FsizeLimit:   1024 * 1024 * 1,
+		MimeLimit: "image/*;application/pdf",
+	}
+
+	upToken := putPolicy.UploadToken(Qiniu)
+	return upToken
+}

+ 2 - 0
go.mod

@@ -7,6 +7,7 @@ require (
 	github.com/beego/beego/v2 v2.0.7
 	github.com/go-sql-driver/mysql v1.7.0
 	github.com/nats-io/nats.go v1.22.1
+	github.com/qiniu/go-sdk/v7 v7.14.0
 	github.com/satori/go.uuid v1.2.0
 	github.com/signintech/gopdf v0.15.1
 	github.com/vmihailenco/msgpack/v5 v5.3.5
@@ -39,6 +40,7 @@ require (
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
 	golang.org/x/crypto v0.5.0 // indirect
 	golang.org/x/net v0.5.0 // indirect
+	golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
 	golang.org/x/sys v0.4.0 // indirect
 	golang.org/x/text v0.6.0 // indirect
 	google.golang.org/protobuf v1.28.1 // indirect

+ 28 - 3
go.sum

@@ -66,6 +66,7 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
 github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
 github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
 github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -91,6 +92,12 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
+github.com/go-playground/validator/v10 v10.8.0/go.mod h1:9JhgTzTaE31GZDpH/HSvHiRJrJ3iKAgqqH0Bl/Ocjdk=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
@@ -175,10 +182,15 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
+github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
@@ -206,7 +218,6 @@ github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8=
 github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4=
 github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
@@ -216,6 +227,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9
 github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
 github.com/phpdave11/gofpdi v1.0.11 h1:wsBNx+3S0wy1dEp6fzv281S74ogZGgIdYWV2PugWgho=
 github.com/phpdave11/gofpdi v1.0.11/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -249,12 +261,19 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
+github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk=
+github.com/qiniu/go-sdk/v7 v7.14.0 h1:6icihMTKHoKMmeU1mqtIoHUv7c1LrLjYm8wTQaYDqmw=
+github.com/qiniu/go-sdk/v7 v7.14.0/go.mod h1:btsaOc8CA3hdVloULfFdDgDc+g4f3TDZEFsDY0BLE+w=
+github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs=
 github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
 github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
 github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
 github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
 github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
+github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
 github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
@@ -310,6 +329,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
 golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
@@ -398,6 +418,7 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -437,6 +458,8 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -585,8 +608,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
@@ -600,6 +624,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 2 - 0
logs/logx/logx.log

@@ -131,3 +131,5 @@
 2023/01/09 16:03:30.542 [I]  2023-01-09 16:03:30>%!(EXTRA []interface {}=[nats OK!])
 2023/01/09 16:04:24.546 [I]  2023-01-09 16:04:24>%!(EXTRA []interface {}=[============Nats init============])
 2023/01/09 16:04:25.751 [I]  2023-01-09 16:04:25>%!(EXTRA []interface {}=[nats OK!])
+2023/01/18 16:04:58.471 [I]  2023-01-18 16:04:58>%!(EXTRA []interface {}=[============Nats init============])
+2023/01/18 16:04:58.501 [I]  2023-01-18 16:04:58>%!(EXTRA []interface {}=[nats OK!])

+ 1 - 1
main.go

@@ -41,7 +41,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"},
+		AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type", "T_pid"},
 		// 公开的HTTP标头列表
 		ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Access-Control-Allow-Headers", "Content-Type"},
 		// 如果设置,则允许共享身份验证凭据,例如cookie

+ 36 - 0
models/Account/Admin.go

@@ -2,6 +2,7 @@ package Account
 
 import (
 	"Cold_Api/conf"
+	"Cold_Api/models"
 	"encoding/json"
 	"fmt"
 	"github.com/astaxie/beego/cache"
@@ -43,6 +44,11 @@ type Admin_R struct {
 	T_wx    string // 微信
 }
 
+type Admin_ struct {
+	T_name  string // 姓名
+	T_phone string // 电话
+}
+
 func AdminToAdmin_R(r Admin) (v Admin_R) {
 	v.T_uuid = r.T_uuid
 	v.T_pid = r.T_pid
@@ -57,6 +63,12 @@ func AdminToAdmin_R(r Admin) (v Admin_R) {
 	return v
 }
 
+func AdminToAdmin_(r Admin) (v Admin_) {
+	v.T_name = r.T_name
+	v.T_phone = r.T_phone
+	return v
+}
+
 func (t *Admin) TableName() string {
 	return "admin" // 数据库名称   // ************** 替换 FormulaList **************
 }
@@ -260,6 +272,30 @@ func Read_Admin_List(T_pid int, T_name string, page int, page_z int) (AdminList
 	return AdminList, cnt
 }
 
+func Read_Admin_List_T_pids(T_pids string) (AdminList []Admin_) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+
+	qs := o.QueryTable(new(Admin))
+	var maps []Admin
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State", 1)
+
+	if len(T_pids) > 0 {
+		list := models.SplitStringIds(T_pids, "P")
+		cond1 = cond1.And("T_pid__in", list)
+	}
+
+	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
+
+	for _, v := range maps {
+		AdminList = append(AdminList, AdminToAdmin_(v))
+	}
+
+	return AdminList
+}
+
 // 获取列表
 func Read_Admin_List_All() (AdminList []Admin_R) {
 

+ 61 - 79
models/Account/Menu.go

@@ -10,18 +10,18 @@ import (
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	"strconv"
-	"strings"
 	"time"
 )
 
 type Menu struct {
 	Id           int    `orm:"column(ID);size(11);auto;pk"`
-	T_mid        int    `orm:"size(200);null"`     // 上一级 ID
-	T_name       string `orm:"size(256);null"`     // 菜单标题
-	T_permission string `orm:"size(256);null"`     // 权限表示
-	T_sort       int    `orm:"size(11);null"`      // 排序
-	T_pid        int    `orm:"size(2);default(0)"` // 1 进入公司后才能访问的菜单1,0 公共菜单
-	T_check      bool   `orm:"-"`                  // 是否选中
+	T_mid        int    `orm:"size(200);null"`      // 上一级 ID
+	T_name       string `orm:"size(256);null"`      // 菜单标题
+	T_permission string `orm:"size(256);null"`      // 权限表示
+	T_icon       string `orm:"size(256);null"`      // 图标
+	T_sort       int    `orm:"size(11);default(0)"` // 排序
+	T_pid        int    `orm:"size(2);default(0)"`  // 1 进入公司后才能访问的菜单1,0 公共菜单
+	T_check      bool   `orm:"-"`                   // 是否选中
 	Children     []Menu `orm:"-"`
 }
 
@@ -147,100 +147,82 @@ func Read_Menu_ById(Id int) (r Menu, e error) {
 }
 
 // 获取列表
-func Read_Menu_Bind_List(Bind_Menu string) (maps []Menu) {
+func Read_Menu_Bind_List(Bind_Menu string, T_pid int) (maps []Menu) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 
 	qs := o.QueryTable(new(Menu))
-	if Bind_Menu == "*" {
-		qs.OrderBy("-T_sort").All(&maps)
-	} else {
+	cond := orm.NewCondition()
+	// fixme 测试先不屏蔽
+	//if T_pid == 0 {
+	//	cond = cond.And("T_pid", 0)
+	//}
+	if Bind_Menu != "*" {
 		list := models.SplitStringIds(Bind_Menu, "M")
-		qs.Filter("Id__in", list).OrderBy("-T_sort").All(&maps)
+		cond = cond.And("Id__in", list)
 	}
-	m := Menu_Call(maps, 0)
-	return m
-}
-
-func Read_Menu_List_All() (maps []Menu) {
 
-	o := orm.NewOrm()
-	// 也可以直接使用 Model 结构体作为表名
+	qs.SetCond((*orm2.Condition)(cond)).OrderBy("Id", "-T_sort").All(&maps)
 
-	qs := o.QueryTable(new(Menu))
-	qs.OrderBy("-T_sort").All(&maps)
 	m := Menu_Call(maps, 0)
-
 	return m
 }
 
-func Read_Menu_List_All_T_Menu(T_Menu string) (maps []Menu) {
+func Read_Menu_List_All() (maps []Menu, menu_ids []int) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 
 	qs := o.QueryTable(new(Menu))
-	qs.OrderBy("-T_sort").All(&maps)
-	m := Bind_Menu_Call(maps, 0, T_Menu)
+	qs.OrderBy("Id", "-T_sort").All(&maps)
+	for _, v := range maps {
+		menu_ids = append(menu_ids, v.Id)
+	}
+	m := Menu_Call(maps, 0)
 
-	return m
+	return m, menu_ids
 }
 
 // 获取左侧菜单树
-func Read_Menu_Tree(Menu_Bind string, T_pid int) (MenuList []Menu) {
-
-	o := orm.NewOrm()
-	// 也可以直接使用 Model 结构体作为表名
-
-	qs := o.QueryTable(new(Menu))
-	cond := orm.NewCondition()
-	T_pid_list := []int{0}
-	if T_pid > 0 {
-		T_pid_list = append(T_pid_list, 1)
-	}
-	cond1 := cond.And("T_pid__in", T_pid_list)
-	var maps []Menu
-	if Menu_Bind != "*" {
-		list := models.SplitStringIds(Menu_Bind, "M")
-		cond1 = cond1.And("Id__in", list)
-	}
-	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-T_sort").All(&maps)
-
-	//m := Menu_Tree(maps, 0)
-	MenuList = Menu_Call(maps, 0)
-	//parentMap, flag := getMenuParent(maps)
-	//if flag {
-	//	for i := 0; i < len(maps); i++ {
-	//		if parentMap[maps[i].T_mid] {
-	//			continue
-	//		}
-	//		info := MenuCall(maps, maps[i])
-	//		MenuList = append(MenuList, info)
-	//	}
-	//} else {
-	//	for i := 0; i < len(maps); i++ {
-	//		info := MenuCall(maps, maps[i])
-	//		MenuList = append(MenuList, info)
-	//	}
-	//}
-	return MenuList
-}
-
-// Bind_Menu_Call 构建菜单树,包含是否绑定
-func Bind_Menu_Call(list []Menu, parentId int, Bind_Menu string) []Menu {
-	res := make([]Menu, 0)
-	for _, v := range list {
-		if v.T_mid == parentId {
-			if strings.Contains(Bind_Menu, strconv.Itoa(v.Id)+"|") || Bind_Menu == "*" {
-				v.T_check = true
-			}
-			v.Children = Bind_Menu_Call(list, v.Id, Bind_Menu)
-			res = append(res, v)
-		}
-	}
-	return res
-}
+//func Read_Menu_Tree(Menu_Bind string, T_pid int) (MenuList []Menu) {
+//
+//	o := orm.NewOrm()
+//	// 也可以直接使用 Model 结构体作为表名
+//
+//	qs := o.QueryTable(new(Menu))
+//	cond := orm.NewCondition()
+//	T_pid_list := []int{0}
+//	if T_pid > 0 {
+//		T_pid_list = append(T_pid_list, 1)
+//	}
+//	cond1 := cond.And("T_pid__in", T_pid_list)
+//	var maps []Menu
+//	if Menu_Bind != "*" {
+//		list := models.SplitStringIds(Menu_Bind, "M")
+//		cond1 = cond1.And("Id__in", list)
+//	}
+//	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-T_sort").All(&maps)
+//
+//	//m := Menu_Tree(maps, 0)
+//	MenuList = Menu_Call(maps, 0)
+//	//parentMap, flag := getMenuParent(maps)
+//	//if flag {
+//	//	for i := 0; i < len(maps); i++ {
+//	//		if parentMap[maps[i].T_mid] {
+//	//			continue
+//	//		}
+//	//		info := MenuCall(maps, maps[i])
+//	//		MenuList = append(MenuList, info)
+//	//	}
+//	//} else {
+//	//	for i := 0; i < len(maps); i++ {
+//	//		info := MenuCall(maps, maps[i])
+//	//		MenuList = append(MenuList, info)
+//	//	}
+//	//}
+//	return MenuList
+//}
 
 // Menu_Call 构建菜单树
 // [{"Id":70,"T_mid":0,"T_name":"工单管理","T_permission":"workorder","T_sort":0,"T_pid":1,"T_bind":false,"Children":[{"Id":71,"T_mid":70,"T_name":"工单列表","T_permission":"workorder:list","T_sort":0,"T_pid":1,"T_bind":false,"Children":[]}]}]

+ 11 - 17
models/Account/Power.go

@@ -37,14 +37,15 @@ type Power_R struct {
 }
 
 type Power_ struct {
-	Id     int
-	T_name string //  权限名称
+	Id         int
+	T_name     string // 权限名称
+	UpdateTime string // 修改时间
 }
 
 func PowerToPower_R(r Power, T_select string) (v Power_R) {
 	v.Id = r.Id
 	v.T_name = r.T_name
-	if strings.Contains(T_select, strconv.Itoa(v.Id)+"|") || T_select == "*" {
+	if strings.Contains(T_select, "S"+strconv.Itoa(v.Id)+"|") || T_select == "*" {
 		v.T_check = true
 	}
 	return v
@@ -53,6 +54,7 @@ func PowerToPower_R(r Power, T_select string) (v Power_R) {
 func PowerToPower_(r Power) (v Power_) {
 	v.Id = r.Id
 	v.T_name = r.T_name
+	v.UpdateTime = r.UpdateTime.Format("2006-01-02 15:04:05")
 	return v
 }
 
@@ -175,23 +177,13 @@ func Read_Power_ById(Id int) (r Power, err error) {
 }
 
 // 获取列表
-func Read_Power_List_ALL_Power_Administration(Power_Administration int) (maps []Power) {
-
-	o := orm.NewOrm()
-	qs := o.QueryTable(new(Power))
-
-	qs.Filter("T_State", 1).OrderBy("Id").All(&maps)
-
-	return maps
-}
-
-// 获取列表
-func Read_Power_List(T_name string, page int, page_z int) (maps []Power, cnt int64) {
+func Read_Power_List(T_name string, page int, page_z int) (r []Power_, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 
 	qs := o.QueryTable(new(Power))
+	var maps []Power
 	var offset int64
 	if page <= 1 {
 		offset = 0
@@ -201,8 +193,10 @@ func Read_Power_List(T_name string, page int, page_z int) (maps []Power, cnt int
 
 	qs.Limit(page_z, offset).Filter("T_name__icontains", T_name).Filter("T_State", 1).OrderBy("Id").All(&maps)
 	cnt, _ = qs.Filter("T_name__icontains", T_name).Filter("T_State", 1).Count()
-
-	return maps, cnt
+	for _, v := range maps {
+		r = append(r, PowerToPower_(v))
+	}
+	return r, cnt
 }
 
 // 添加用户 - 权限选择列表

+ 13 - 1
models/Company/CompanyClass.go

@@ -38,6 +38,17 @@ var redisCache_CompanyClass cache.Cache
 func init() {
 	//注册模型
 	orm.RegisterModel(new(CompanyClass))
+
+	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
+		"redis_CompanyClass", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
+	fmt.Println(config)
+	var err error
+	redisCache_CompanyClass, err = cache.NewCache("redis", config)
+	if err != nil || redisCache_CompanyClass == nil {
+		errMsg := "failed to init redis"
+		fmt.Println(errMsg, err)
+		panic(errMsg)
+	}
 }
 
 // Redis_Set(m.T_sn,m) // Redis 更新缓存
@@ -54,6 +65,7 @@ func Redis_CompanyClass_Set(r CompanyClass) (err error) {
 	err = redisCache_CompanyClass.Put(key, str, 2*time.Hour)
 	if err != nil {
 		fmt.Println("set key:", key, ",value:", str, err)
+		fmt.Println("set key:", key, ",value:", str, err)
 	}
 	return
 }
@@ -95,7 +107,7 @@ func Read_CompanyClass_ById(id int) (r CompanyClass, err error) {
 	}
 	o := orm.NewOrm()
 	r = CompanyClass{Id: id, T_State: 1}
-	err = o.Read(&r, "Id", "T_pid", "T_State")
+	err = o.Read(&r, "Id", "T_State")
 	if err != nil {
 		fmt.Println(err)
 		return r, err

+ 18 - 2
models/Device/Device.go

@@ -2,6 +2,7 @@ package Device
 
 import (
 	"Cold_Api/conf"
+	"Cold_Api/models/Account"
 	"Cold_Api/models/Product"
 	"encoding/json"
 	"fmt"
@@ -221,7 +222,7 @@ func Update_Device(r Device, cols ...string) bool {
 }
 
 // 获取列表
-func Read_Device_List(T_pid int, T_name string, T_monitor string, T_online string, T_type int, page int, page_z int) (r []Device_R, cnt int64) {
+func Read_Device_List(admin Account.Admin, T_pid int, T_name string, T_monitor string, T_online string, T_type int, page int, page_z int) (r []Device_R, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -254,9 +255,9 @@ func Read_Device_List(T_pid int, T_name string, T_monitor string, T_online strin
 
 	if T_type > 0 {
 		cond1 = cond1.AndCond(cond.And("T_type", T_type))
-
 	}
 
+	//0 未启用  1 在线  2 离线
 	if T_online == "1" {
 		cond1 = cond1.AndCond(cond.And("T_online", 1))
 	} else if T_online == "2" {
@@ -265,6 +266,11 @@ func Read_Device_List(T_pid int, T_name string, T_monitor string, T_online strin
 		cond1 = cond1.AndCond(cond.And("T_online", 0).Or("T_online", 2))
 	}
 
+	// 非内部权限 - 丢弃
+	if admin.T_pid > 0 {
+		cond1 = cond1.AndCond(cond.And("T_give", 1))
+	}
+
 	var rx []Device
 
 	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("Id").OrderBy("-T_give").All(&rx)
@@ -283,3 +289,13 @@ func Read_Device_ALL_T_Type_Count(T_pid int, T_type int) (cnt int64) {
 	cnt, _ = qs.Filter("T_pid", T_pid).Filter("T_type", T_type).Filter("T_State", 1).Count()
 	return cnt
 }
+
+func Read_Device_List_T_model(T_model string) (r []Device) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	qs := o.QueryTable(new(Device))
+	qs.Filter("T_State", 1).Filter("T_model", T_model).All(&r)
+
+	return r
+}

+ 13 - 13
models/Device/DeviceData.go

@@ -71,19 +71,19 @@ func init() {
 	}
 }
 
-func DeviceData_ToDeviceData_R(r DeviceData_, maps map[int]DeviceSensorParameter_M) (t DeviceData_R) {
+func DeviceData_ToDeviceData_R(r DeviceData_) (t DeviceData_R) {
 	t.T_id = r.T_id
 	t.T_t = r.T_t
 	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")
-	if sp, ok := maps[r.T_sp]; ok {
-		t.T_name = sp.T_name
-		t.T_tl = sp.T_Tlower
-		t.T_tu = sp.T_Tupper
-		t.T_rhl = sp.T_RHlower
-		t.T_rhu = sp.T_Tupper
-	}
+	sp := Read_DeviceSensorParameter_Map_Get(r.T_sp)
+	t.T_name = sp.T_name
+	t.T_tl = sp.T_Tlower
+	t.T_tu = sp.T_Tupper
+	t.T_rhl = sp.T_RHlower
+	t.T_rhu = sp.T_Tupper
+
 	return
 }
 
@@ -232,7 +232,7 @@ func Add_DeviceData(SN string, v DeviceData_T) bool {
 //	T_time    time.Time `orm:"column(t_time);type(timestamp);null;"` // 采集时间
 //}
 
-func Read_DeviceData_ById_List(SN string, T_id int, Time_start_ string, Time_end_ string, page int, page_z int, SParamMap map[int]DeviceSensorParameter_M) ([]DeviceData_R, int) {
+func Read_DeviceData_ById_List(SN string, T_id int, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_R, int) {
 	o := orm.NewOrm()
 	var maps []DeviceData_
 	var maps_z []orm2.ParamsList
@@ -257,7 +257,7 @@ func Read_DeviceData_ById_List(SN string, T_id int, Time_start_ string, Time_end
 		sql_time += " t_time <= '" + Time_end_ + "' AND "
 	}
 
-	sql := "SELECT COUNT(ID) FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id)
+	sql := "SELECT COUNT(t_id) FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id)
 	fmt.Println(sql)
 	_, err := o.Raw(sql).ValuesList(&maps_z)
 	if err != nil {
@@ -280,7 +280,7 @@ func Read_DeviceData_ById_List(SN string, T_id int, Time_start_ string, Time_end
 	key, _ := strconv.Atoi(maps_z[0][0].(string))
 
 	for _, v := range maps {
-		r = append(r, DeviceData_ToDeviceData_R(v, SParamMap))
+		r = append(r, DeviceData_ToDeviceData_R(v))
 	}
 
 	return r, key
@@ -319,8 +319,8 @@ func Read_DeviceData_By_T_snid_List(T_snid string, Time_start_ string, Time_end_
 		sn_id := strings.Split(v, ",")
 
 		if len(sn_id) == 2 {
-			SParamMap := Read_DeviceSensorParameter_Map_All(sn_id[0], lib.To_int(sn_id[1]))
-			r_maps, r_maps_num := Read_DeviceData_ById_List(sn_id[0], lib.To_int(sn_id[1]), Time_start_, Time_end_, 0, 9999, SParamMap)
+			Read_DeviceSensorParameter_Map_All(sn_id[0], lib.To_int(sn_id[1]))
+			r_maps, r_maps_num := Read_DeviceData_ById_List(sn_id[0], lib.To_int(sn_id[1]), Time_start_, Time_end_, 0, 9999)
 			//for i, _ := range r_maps {
 			//	r_maps[i].T_sn = sn_id[0]
 			//}

+ 68 - 31
models/Device/DeviceSensor.go

@@ -3,6 +3,7 @@ package Device
 import (
 	"Cold_Api/conf"
 	"Cold_Api/controllers/lib"
+	"Cold_Api/models/Account"
 	"encoding/json"
 	"fmt"
 	"github.com/astaxie/beego/cache"
@@ -17,25 +18,26 @@ import (
 
 // 模板
 type DeviceSensor struct {
-	T_sn   string `orm:"pk;size(256);null"` // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
-	T_id   int    `orm:"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"`       // Device.DeviceNotice.Id 设备通知策略  N1|N2|
-	T_datashow int    `orm:"index;size(2);1"`      // 0 屏蔽数据展示  1 正常数据展示
-	T_sort     int    `orm:"index;size(200);1"`    // 排序
-	T_3dview   string `orm:"size(256);null"`       // 3D 视图ID
+	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"`           // Device.DeviceNotice.Id 设备通知策略  N1|N2|
+	T_datashow int    `orm:"index;size(2);default(1)"` // 0 屏蔽数据展示  1 正常数据展示
+	T_sort     int    `orm:"index;size(200);1"`        // 排序
+	T_3dview   string `orm:"size(256);null"`           // 3D 视图ID
 
 	// 设备同步参数
-	T_Dattery  int    `orm:"size(4);null"`       // 电量
-	T_Site     string `orm:"size(200);null"`     // GPS
-	T_type     int    `orm:"index;size(4);null"` // Device.DeviceType  1库房   2移动
-	T_give     int    `orm:"index;size(2);1"`    // 屏蔽状态 0 屏蔽  1 正常
-	T_monitor  int    `orm:"index;size(2);null"` // 监控状态 0 未监控 1 监控
-	T_online   int    `orm:"index;size(2);1"`    // 在线状态 0 未启用  1 在线  2 离线
-	T_online_s int    `orm:"index;size(2);0"`    // 在线状态-备用  0 未启用  1 在线  2 离线
+	T_Dattery  int    `orm:"size(4);null"`             // 电量
+	T_Site     string `orm:"size(200);null"`           // GPS
+	T_type     int    `orm:"index;size(4);null"`       // Device.DeviceType  1库房   2移动
+	T_give     int    `orm:"index;size(2);default(1)"` // 屏蔽状态 0 屏蔽  1 正常
+	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 离线
 
 	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 保存时都会对时间自动更新
@@ -138,8 +140,11 @@ func DeviceSensorToDeviceSensor_R(DeviceSensor_ DeviceSensor) (DeviceSensor_r De
 	DeviceSensor_r.T_datashow = DeviceSensor_.T_datashow
 
 	// 最新系统参数
-	DeviceSensor_r.T_DeviceSensorParameter, _ = Read_V2DeviceSensorParameter(DeviceSensor_.T_sn, DeviceSensor_.T_id)
+	DeviceSensor_r.T_DeviceSensorParameter, _ = Read_DeviceSensorParameter(DeviceSensor_.T_sn, DeviceSensor_.T_id)
 
+	// 最新数据
+	key_data := DeviceSensor_.T_sn + "|" + strconv.Itoa(DeviceSensor_.T_id)
+	DeviceSensor_r.T_DeviceSensorData, _ = RedisDeviceData_Get(key_data)
 	return
 }
 
@@ -157,7 +162,7 @@ func Read_V2_DeviceSensor_ByTsn_num(T_sn string) int {
 }
 
 // 获取列表
-func Read_DeviceSensorList(T_pid int, T_sn string, T_name string, T_Class_id int, T_give int, T_datashow 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_Notice_id int, T_give int, T_datashow int, page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -183,6 +188,12 @@ func Read_DeviceSensorList(T_pid int, T_sn string, T_name string, T_Class_id int
 		cond1 = cond1.And("T_Class__icontains", T_Class)
 	}
 
+	if T_Notice_id > 0 {
+		T_Notice := "N" + strconv.Itoa(T_Notice_id) + "|"
+		fmt.Println("T_Class:", T_Notice)
+		cond1 = cond1.And("T_Notice__icontains", T_Notice)
+	}
+
 	if len(T_sn) > 0 {
 		cond1 = cond1.And("T_sn__icontains", T_sn)
 	}
@@ -191,10 +202,11 @@ func Read_DeviceSensorList(T_pid int, T_sn string, T_name string, T_Class_id int
 		cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_sn__icontains", T_name))
 	}
 
-	if T_give != -1 { // 0 :丢弃  1:正常    空:所有
-		cond1 = cond1.And("T_give", T_give)
-	} else if T_pid > 0 {
+	// 不是内部权限(T_pid>0),只显示T_give=1 0 屏蔽  1 正常
+	if admin_r.T_pid > 0 {
 		cond1 = cond1.And("T_give", 1)
+	} else if T_give != -1 {
+		cond1 = cond1.And("T_give", T_give)
 	}
 
 	if T_datashow != -1 { // 空:正常显示   1:强制显示 屏蔽数据展示
@@ -262,7 +274,7 @@ func Delete_DeviceSensor_ById(T_sn string, T_id int) (err error) {
 	}
 	// ascertain id exists in the database
 	var num int64
-	if num, err = o.Delete(&DeviceSensor{T_id: r.T_id}); err == nil {
+	if num, err = o.Delete(&DeviceSensor{Id: r.Id}); err == nil {
 		fmt.Println("Number of records deleted in database:", num)
 	}
 	Redis_DeviceSensor_DelK(r)
@@ -383,7 +395,7 @@ func Read_DeviceSensor_ByTsn_Tid(T_sn string, T_id int) (r DeviceSensor, err err
 }
 
 // 获取列表
-func Read_DeviceSensor_ByTsn(T_sn string) ([]DeviceSensor_R, int) {
+func Read_DeviceSensor_ByTsn(T_sn string) ([]DeviceSensor, int) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -392,12 +404,13 @@ func Read_DeviceSensor_ByTsn(T_sn string) ([]DeviceSensor_R, int) {
 	var r []DeviceSensor
 	qs.Filter("T_sn", T_sn).OrderBy("T_id").All(&r)
 	cnt, _ := qs.Filter("T_sn", T_sn).Count()
-	var DeviceSensor_r []DeviceSensor_R
-	for _, v := range r {
-		DeviceSensor_r = append(DeviceSensor_r, DeviceSensorToDeviceSensor_R(v))
-	}
-
-	return DeviceSensor_r, int(cnt)
+	//var DeviceSensor_r []DeviceSensor_R
+	//for _, v := range r {
+	//	DeviceSensor_r = append(DeviceSensor_r, DeviceSensorToDeviceSensor_R(v))
+	//}
+	//
+	//return DeviceSensor_r, int(cnt)
+	return r, int(cnt)
 }
 
 // 获取列表
@@ -424,7 +437,7 @@ func Read_DeviceSensor_ALL_T_sn(T_sn string, page int, page_z int) (DeviceSensor
 }
 
 // 获取列表
-func Read_DeviceSensor_class_ALL_1(T_pid int, T_Class_id int, page int, page_z int, T_sn string, T_name string, SN_type string) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
+func Read_DeviceSensor_class_ALL_1(admin Account.Admin, T_pid int, T_Class_id int, page int, page_z int, T_sn string, T_name string, SN_type string) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -454,6 +467,10 @@ func Read_DeviceSensor_class_ALL_1(T_pid int, T_Class_id int, page int, page_z i
 		cond1 = cond1.AndCond(cond.And("T_give", 1))
 	}
 
+	if admin.T_pid > 0 {
+		cond1 = cond1.AndCond(cond.And("T_give", 1))
+	}
+
 	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)
 	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
 
@@ -648,3 +665,23 @@ func Read_DeviceSensor_Notice_ALL_1(T_pid int, T_Notice_id int, page int, page_z
 	}
 	return DeviceSensor_r, cnt
 }
+
+// 设备同步参数
+func Update_Device_To_DeviceSensor(r_Device Device) bool {
+	DeviceSensor_list, _ := Read_DeviceSensor_ByTsn(r_Device.T_sn)
+	for _, v := range DeviceSensor_list {
+
+		// 设备同步参数
+		v.T_Dattery = r_Device.T_Dattery   // 电量
+		v.T_Site = r_Device.T_Site         // GPS
+		v.T_type = r_Device.T_type         // 1库房   2移动
+		v.T_give = r_Device.T_give         // 屏蔽状态 0 屏蔽  1 正常
+		v.T_monitor = r_Device.T_monitor   // 监控状态 0 未监控 1 监控
+		v.T_online = r_Device.T_online     // 在线状态 0 未启用  1 在线  2 离线
+		v.T_online_s = r_Device.T_online_s // 在线状态-备用  0 未启用  1 在线  2 离线
+
+		Update_DeviceSensor(v, "T_Dattery", "T_Site", "T_type", "T_give", "T_monitor", "T_online", "T_online_s")
+	}
+
+	return true
+}

+ 33 - 16
models/Device/DeviceSensorParameter.go

@@ -75,7 +75,7 @@ type DeviceSensorParameter_M struct {
 	T_RHupper float32 //  湿度上限
 }
 
-func DeviceSensorParameterTo_DeviceSensorParameter_R(r DeviceSensorParameter) (t DeviceSensorParameter_R) {
+func DeviceSensorParameterToDeviceSensorParameter_R(r DeviceSensorParameter) (t DeviceSensorParameter_R) {
 	t.T_Tlower = r.T_Tlower
 	t.T_Tupper = r.T_Tupper
 	t.T_RHlower = r.T_RHlower
@@ -91,15 +91,27 @@ func DeviceSensorParameterTo_DeviceSensorParameter_R(r DeviceSensorParameter) (t
 
 	return t
 }
+
+func DeviceSensorParameterToDeviceSensorParameter_M(r DeviceSensorParameter) (t DeviceSensorParameter_M) {
+	t.T_name = r.T_name
+	t.T_Tlower = r.T_Tlower
+	t.T_Tupper = r.T_Tupper
+	t.T_RHlower = r.T_RHlower
+	t.T_RHupper = r.T_RHupper
+	return t
+}
 func (t *DeviceSensorParameter) TableName() string {
 	return "device_sensor_parameter" // 数据库名称   // ************** 替换 FormulaList **************
 }
 
 var redisCache_DeviceSensorParameter cache.Cache
-
+var DeviceSensorParameter_list map[int]DeviceSensorParameter_M // 泛型
 func init() {
 	//注册模型
 	orm.RegisterModel(new(DeviceSensorParameter))
+
+	DeviceSensorParameter_list = make(map[int]DeviceSensorParameter_M)
+
 	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
 		"redis_DeviceSensorParameter", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
 	fmt.Println(config)
@@ -146,7 +158,7 @@ func Redis_DeviceSensorParameter_Get(key string) (r DeviceSensorParameter_R, is
 
 // ---------------- 特殊方法 -------------------
 // 获取设备参数
-func Read_V2DeviceSensorParameter(T_sn string, T_id int) (t DeviceSensorParameter_R, bool bool) {
+func Read_DeviceSensorParameter(T_sn string, T_id int) (t DeviceSensorParameter_R, bool bool) {
 	key := T_sn + "|" + strconv.Itoa(T_id)
 	if t, is := Redis_DeviceSensorParameter_Get(key); is {
 		return t, true
@@ -156,7 +168,8 @@ func Read_V2DeviceSensorParameter(T_sn string, T_id int) (t DeviceSensorParamete
 	qs := o.QueryTable(new(DeviceSensorParameter))
 	var r []DeviceSensorParameter
 	cond := orm.NewCondition()
-	cond = cond.And("T_sn", T_sn).And("T_id", T_id).AndCond(cond.And("T_State", 1).OrCond(cond.And("T_State", 2).And("T_SendState", 1)))
+	//cond = cond.And("T_sn", T_sn).And("T_id", T_id).AndCond(cond.And("T_State", 1).OrCond(cond.And("T_State", 2).And("T_SendState", 1)))
+	cond = cond.And("T_sn", T_sn).And("T_id", T_id).And("T_State", 1)
 
 	qs.Limit(1, 0).SetCond((*orm2.Condition)(cond)).OrderBy("-UpdateTime").All(&r)
 	// 判断是否有数据
@@ -164,11 +177,11 @@ func Read_V2DeviceSensorParameter(T_sn string, T_id int) (t DeviceSensorParamete
 		return t, false
 	}
 
-	return DeviceSensorParameterTo_DeviceSensorParameter_R(r[0]), true
+	return DeviceSensorParameterToDeviceSensorParameter_R(r[0]), true
 }
 
 // 获取列表  T_State  1 系统获取   2 用户提交
-func Read_V2DeviceSensorParameter_List(T_sn string, T_id int, T_State int, page_z int) (r []DeviceSensorParameter) {
+func Read_DeviceSensorParameter_List(T_sn string, T_id int, T_State int, page_z int) (r []DeviceSensorParameter) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 
@@ -218,26 +231,30 @@ func DELETE_DeviceSensorParameter(SN string) bool {
 }
 
 // 获取列表  T_State  1 系统获取   2 用户提交
-func Read_DeviceSensorParameter_Map_All(T_sn string, T_id int) (maps map[int]DeviceSensorParameter_M) {
+func Read_DeviceSensorParameter_Map_All(T_sn string, T_id int) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 	var list []DeviceSensorParameter
 	qs := o.QueryTable(new(DeviceSensorParameter))
 	cond := orm.NewCondition()
 
-	cond = cond.And("T_sn", T_sn).And("T_id", T_id).AndCond(cond.And("T_State", 1).OrCond(cond.And("T_State", 2).And("T_SendState", 1)))
+	//cond = cond.And("T_sn", T_sn).And("T_id", T_id).AndCond(cond.And("T_State", 1).OrCond(cond.And("T_State", 2).And("T_SendState", 1)))
+	cond = cond.And("T_sn", T_sn).And("T_id", T_id).And("T_State", 1)
 
 	qs.SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&list)
 
 	for _, v := range list {
-		maps[v.Id] = DeviceSensorParameter_M{
-			T_name:    v.T_name,
-			T_Tlower:  v.T_Tlower,
-			T_Tupper:  v.T_Tupper,
-			T_RHlower: v.T_RHlower,
-			T_RHupper: v.T_RHupper,
-		}
+		DeviceSensorParameter_list[v.Id] = DeviceSensorParameterToDeviceSensorParameter_M(v)
 	}
 
-	return maps
+}
+
+func Read_DeviceSensorParameter_Map_Get(id int) DeviceSensorParameter_M {
+	// 有先加入 给全部人发消息
+	v, ok := DeviceSensorParameter_list[id] /*如果确定是真实的,则存在,否则不存在 */
+	if ok {
+		return v
+	} else {
+		return DeviceSensorParameter_M{}
+	}
 }

+ 2 - 2
models/Function/GoodsOrder.go

@@ -159,10 +159,10 @@ func Read_GoodsOrder_List(T_pid int, page int, page_z int, Name string) (t []Goo
 	cond1 := cond.And("T_pid", T_pid).And("T_State", 1)
 
 	if len(Name) > 0 {
-		cond1 = cond.AndCond(cond1).AndCond(cond.Or("T_sn__icontains", Name).Or("T_orderid__icontains", Name).Or("T_outorderid__icontains", Name))
+		cond1 = cond1.AndCond(cond.Or("T_sn__icontains", Name).Or("T_orderid__icontains", Name).Or("T_outorderid__icontains", Name))
 	}
 
-	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("Id").All(&r)
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
 	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
 
 	for _, v := range r {

+ 183 - 0
models/Product/ProductUpgrade.go

@@ -1,9 +1,15 @@
 package Product
 
 import (
+	"Cold_Api/conf"
+	"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"
+	"strconv"
 	"time"
 )
 
@@ -19,12 +25,189 @@ type ProductUpgrade struct {
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 }
 
+type ProductUpgrade_T struct {
+	T_sn      string `orm:"size(256);null"` // 设备编号
+	T_version string `orm:"size(256);null"` // 版本
+	T_file    string `orm:"size(256);null"` // 文件
+}
+
+type ProductUpgrade_R struct {
+	Id         int
+	T_model    string
+	T_version  string
+	T_file     string
+	T_remarks  string
+	T_carryout int
+
+	CreateTime string
+}
+
 func (t *ProductUpgrade) TableName() string {
 	return "product_upgrade" // 数据库名称   // ************** 替换 FormulaList **************
 }
 
+var redisCache_ProductUpgrade cache.Cache
+
 func init() {
 	//注册模型
 	orm.RegisterModel(new(ProductUpgrade))
 
+	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
+		"redis_ProductUpgrade", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
+	fmt.Println(config)
+	var err error
+	redisCache_ProductUpgrade, err = cache.NewCache("redis", config)
+	if err != nil || redisCache_ProductUpgrade == nil {
+		errMsg := "failed to init redis"
+		fmt.Println(errMsg, err)
+		panic(errMsg)
+	}
+}
+
+// Redis_Set(m.T_sn,m) // Redis 更新缓存
+func Redis_ProductUpgrade_Set(r ProductUpgrade) (err error) {
+	key := strconv.Itoa(r.Id)
+
+	//json序列化
+	str, err := json.Marshal(r)
+	if err != nil {
+		fmt.Print(err)
+		return
+	}
+
+	err = redisCache_ProductUpgrade.Put(key, str, 2*time.Hour)
+	if err != nil {
+		fmt.Println("set key:", key, ",value:", str, err)
+		fmt.Println("set key:", key, ",value:", str, err)
+	}
+	return
+}
+
+// if r,is :=Redis_Get(T_sn);is{
+// return r,nil
+// }
+func Redis_ProductUpgrade_Get(key string) (ProductUpgrade, bool) {
+	println("找到key:", key)
+	if redisCache_ProductUpgrade.IsExist(key) {
+		//println("找到key:",key)
+		v := redisCache_ProductUpgrade.Get(key)
+		var r ProductUpgrade
+		json.Unmarshal(v.([]byte), &r)
+
+		return r, true
+	}
+
+	return ProductUpgrade{}, false
+}
+func Redis_ProductUpgrade_DelK(key string) (err error) {
+	err = redisCache_ProductUpgrade.Delete(key)
+	return
+}
+
+// ---------------- 特殊方法 -------------------
+func ProductUpgradeToProductUpgrade_R(t ProductUpgrade) (r ProductUpgrade_R) {
+	r.Id = t.Id
+	r.T_model = t.T_model
+	r.T_version = t.T_version
+	r.T_file = t.T_file
+	r.T_remarks = t.T_remarks
+	r.T_carryout = t.T_carryout
+	r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
+	return r
+}
+
+// 获取 ById
+func Read_ProductUpgrade_ById(id int) (r ProductUpgrade, err error) {
+	key := strconv.Itoa(id)
+	if r, is := Redis_ProductUpgrade_Get(key); is {
+		return r, nil
+	}
+	o := orm.NewOrm()
+	r = ProductUpgrade{Id: id}
+	err = o.Read(&r)
+	if err != nil {
+		fmt.Println(err)
+		return r, err
+	}
+	//Redis_ProductUpgrade_Set(r)
+	return r, err
+}
+
+// 添加
+func Add_ProductUpgrade(m ProductUpgrade) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(&m)
+	if err != nil {
+		fmt.Println(err)
+	}
+	//Redis_ProductUpgrade_Set(m)
+	return
+}
+
+// 修改
+func Update_ProductUpgrade(r ProductUpgrade, cols ...string) bool {
+	o := orm.NewOrm()
+	if num, err := o.Update(&r, cols...); err == nil {
+		fmt.Println("Number of records updated in database:", num)
+		//Redis_ProductUpgrade_Set(r)
+		return true
+	}
+	return false
+}
+
+// 删除
+func Delete_ProductUpgrade_ById(id int) bool {
+	o := orm.NewOrm()
+	v := ProductUpgrade{Id: id}
+	if _, err := o.Delete(&v); err == nil {
+		return true
+	}
+	return false
+}
+
+// 获取列表
+func Read_ProductUpgrade_List(T_model string, page int, page_z int) (r []ProductUpgrade_R, cnt int64) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	var map_r []ProductUpgrade
+	qs := o.QueryTable(new(ProductUpgrade))
+	var offset int64
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	cond := orm.NewCondition()
+
+	if len(T_model) > 0 {
+		cond = cond.And("T_model", T_model)
+	}
+
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&map_r)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond)).Count()
+
+	for _, v := range map_r {
+		r = append(r, ProductUpgradeToProductUpgrade_R(v))
+	}
+
+	return r, cnt
+
+}
+
+// 获取列表
+func Read_ProductUpgrade_T_model() (lists orm2.ParamsList) {
+	o := orm.NewOrm()
+	var pl_lists orm2.ParamsList
+	num, err := o.Raw("SELECT DISTINCT t_model FROM product_upgrade LIMIT 0,1000").ValuesFlat(&pl_lists)
+	if err == nil {
+		fmt.Println("user nums: ", num)
+	}
+	fmt.Println(len(pl_lists))
+
+	return pl_lists
 }

+ 25 - 2
models/SplitString.go

@@ -1,6 +1,9 @@
 package models
 
-import "strings"
+import (
+	"strconv"
+	"strings"
+)
 
 func SplitStringIds(str string, prefix string) (r []string) {
 	Ids_str := strings.TrimRight(str, "|")
@@ -8,5 +11,25 @@ func SplitStringIds(str string, prefix string) (r []string) {
 	for _, v := range Ids {
 		r = append(r, strings.TrimLeft(v, prefix))
 	}
-	return Ids
+	return r
+}
+
+func SplitStringToDotStr(str string, prefix string) (r string) {
+	Ids_str := strings.TrimRight(str, "|")
+	Ids := strings.Split(Ids_str, "|")
+	for _, v := range Ids {
+		r += strings.TrimLeft(v, prefix) + ","
+	}
+	r = strings.TrimRight(r, ",")
+	return r
+}
+
+func SplitStringToIntIds(str string, prefix string) (r []int) {
+	Ids_str := strings.TrimRight(str, "|")
+	Ids := strings.Split(Ids_str, "|")
+	for _, v := range Ids {
+		id, _ := strconv.Atoi(strings.TrimLeft(v, prefix))
+		r = append(r, id)
+	}
+	return r
 }

+ 274 - 57
models/Warning/Warning.go

@@ -3,11 +3,13 @@ package Warning
 import (
 	"Cold_Api/conf"
 	"Cold_Api/controllers/lib"
+	"Cold_Api/models"
 	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -27,7 +29,7 @@ type Warning struct {
 	T_Log  string `orm:"type(text);null"` // 通知日志
 	T_Msid int64  `orm:"size(256);null"`  // 消息ID
 
-	T_State    int       `orm:"size(2);1"`                                             // 0 删除   1 正常   2 未处理
+	T_State    int       `orm:"size(2);default(2)"`                                    // 0 删除   1 不处理   2 已处理   3 未处理
 	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 保存时都会对时间自动更新
 }
@@ -44,19 +46,20 @@ type Warning struct {
 // 模板
 type Warning_R struct {
 	Id         int
-	T_pid      int    // Account.Company 绑定公司
-	T_tp       int    // 报警类型   ->WarningList
-	T_sn       string // 设备序列号
-	T_D_name   string // 设备名称
-	T_id       int    // 传感器 ID
-	T_DS_name  string // 传感器名称
-	T_Remark   string // 采集内容
-	T_Ut       string // 采集时间
-	T_Text     string // 处理备注
-	T_Log      string // 通知日志
-	T_Msid     int64  // 消息ID
-	T_State    int    // 0 删除   1 未处理   2 已处理
-	CreateTime string // 创建时间
+	T_pid      int      // Account.Company 绑定公司
+	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_Text     string   // 处理备注
+	T_Log      []string // 处理日志
+	T_Msid     int64    // 消息ID
+	T_State    int      // 0 删除   1 未处理   2 已处理
+	CreateTime string   // 创建时间
 }
 
 func (t *Warning) TableName() string {
@@ -74,6 +77,7 @@ func WarningToWarning_R(t Warning) (r Warning_R) {
 	r.Id = t.Id
 	r.T_pid = t.T_pid
 	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
@@ -81,7 +85,10 @@ func WarningToWarning_R(t Warning) (r Warning_R) {
 	r.T_Remark = t.T_Remark
 	r.T_Ut = t.T_Ut.Format("2006-01-02 15:04:05")
 	r.T_Text = t.T_Text
-	r.T_Log = t.T_Log
+	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")
@@ -216,8 +223,7 @@ func Read_Warning_1(T_pid int, page int, T_sn string, T_Name string, Time_start_
 }
 
 // 获取列表
-func Read_Warning(T_pid int, T_sn string, T_id string, T_title string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
-
+func Read_Warning(T_pid int, T_tp, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 	var map_r []Warning
@@ -239,15 +245,77 @@ func Read_Warning(T_pid int, T_sn string, T_id string, T_title string, T_handle
 	if T_pid > 0 {
 		cond1 = cond.AndCond(cond1).And("T_pid", T_pid)
 	}
-	if len(T_title) > 0 {
-		cond1 = cond1.And("T_Title", T_title)
+	if len(T_tp) > 0 {
+		list := models.SplitStringIds(T_tp, "T")
+		cond1 = cond1.And("T_tp__in", list)
+
+	}
+	if len(T_name) > 0 {
+		cond1 = cond1.AndCond(cond.Or("T_sn__icontains", T_name).Or("T_D_name__icontains", T_name).Or("T_id__icontains", T_name).Or("T_DS_name", T_name))
+	}
+
+	if len(Time_start_) > 0 {
+		cond1 = cond1.And("T_Ut__gte", Time_start_)
+	}
+	if len(Time_end_) > 0 {
+		cond1 = cond1.And("T_Ut__lte", Time_end_)
+	}
+	// T_State 0 删除   1 不处理   2 已处理   3 未处理
+	//不填或0:所有  1:默认 2:全部记录 3 未处理
+	if T_handle == 1 {
+		cond1 = cond1.And("T_State__gt", 1)
+	}
+	if T_handle == 3 {
+		cond1 = cond1.And("T_State", 3)
+	}
+
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	for _, v := range map_r {
+		r = append(r, WarningToWarning_R(v))
+	}
+
+	return r, cnt
+
+}
+
+// 管理员报警列表
+func Read_Admin_Warning(T_pids, T_tp, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
+
+	if len(T_pids) == 0 {
+		return r, cnt
 	}
 
-	if len(T_sn) > 0 {
-		cond1 = cond1.And("T_sn", T_sn)
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	var map_r []Warning
+	qs := o.QueryTable(new(Warning))
+	var offset int64
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
 	}
-	if len(T_id) > 0 {
-		cond1 = cond1.And("T_Id", T_id)
+
+	cond := orm.NewCondition()
+
+	cond1 := cond.And("T_State__gt", 0)
+
+	if T_pids != "*" {
+		list := models.SplitStringIds(T_pids, "P")
+		cond1 = cond1.And("T_pid__in", list)
+	}
+	if len(T_tp) > 0 {
+		list := models.SplitStringIds(T_tp, "T")
+		cond1 = cond1.And("T_tp__in", list)
+
+	}
+	if len(T_name) > 0 {
+		cond1 = cond1.AndCond(cond.Or("T_sn__icontains", T_name).Or("T_D_name__icontains", T_name).Or("T_id__icontains", T_name).Or("T_DS_name", T_name))
 	}
 
 	if len(Time_start_) > 0 {
@@ -256,12 +324,12 @@ func Read_Warning(T_pid int, T_sn string, T_id string, T_title string, T_handle
 	if len(Time_end_) > 0 {
 		cond1 = cond1.And("T_Ut__lte", Time_end_)
 	}
-	//不填或0:所有      1:已处理     2:未处理
+	//1:默认 2:全部记录 3 未处理
 	if T_handle == 1 {
-		cond1 = cond1.And("T_Text__isnull", true)
+		cond1 = cond1.And("T_State__gt", 1)
 	}
-	if T_handle == 2 {
-		cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
+	if T_handle == 3 {
+		cond1 = cond1.And("T_State", 3)
 	}
 
 	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
@@ -275,17 +343,14 @@ func Read_Warning(T_pid int, T_sn string, T_id string, T_title string, T_handle
 
 }
 
-// 获取列表
-func Read_Warning_Backups(T_pid int, T_year string, T_month string, T_sn string, T_id string, T_title 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, T_year string, T_month string, T_tp, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
 
 	o := orm.NewOrm()
 	var maps []Warning
 	var maps_z []orm2.ParamsList
 	// 也可以直接使用 Model 结构体作为表名
 	// Warning_2022_07
-	if len(T_month) == 1 {
-		T_month = "0" + T_month
-	}
 	Wtab := "warning_" + T_year + "_" + T_month
 
 	var offset int
@@ -300,49 +365,42 @@ func Read_Warning_Backups(T_pid int, T_year string, T_month string, T_sn string,
 
 	sql_WHERE := ""
 
-	cond := orm.NewCondition()
-
-	cond1 := cond.And("T_State__gt", 0)
-	sql_WHERE += " t__state > 0 "
+	//cond := orm.NewCondition()
+	//
+	//cond1 := cond.And("T_State__gt", 0)
+	sql_WHERE += " t__state > 0"
 
 	if T_pid > 0 {
 		sql_WHERE += " AND t_pid = " + strconv.Itoa(T_pid)
 	}
-	if len(T_title) > 0 {
-		//cond1 = cond1.And("T_Title", T_title)
-		T_title = lib.ReplaceSQL(T_title)
-		sql_WHERE += " AND t__title = '" + T_title + "'"
-	}
 
-	if len(T_sn) > 0 {
-		//cond1 = cond1.And("T_sn", T_sn)
-		T_sn = lib.ReplaceSQL(T_sn)
-		sql_WHERE += " AND t_sn = '" + T_sn + "'"
+	if len(T_tp) > 0 {
+		list := models.SplitStringToDotStr(T_tp, "T")
+		sql_WHERE += fmt.Sprintf(" AND t_tp in (%s)", list)
+
 	}
-	if len(T_id) > 0 {
-		//cond1 = cond1.And("T_Id", T_id)
-		T_id = lib.ReplaceSQL(T_id)
-		sql_WHERE += " AND t__id = " + T_id
+	if len(T_name) > 0 {
+		sql_WHERE += " AND (t_sn like '%" + T_name + "%' OR t__d_name like '%" + T_name + "%' OR t_id like '%" + T_name + "%' OR t__d_s_name like '%" + T_name + "%')"
 	}
 
 	if len(Time_start_) > 0 {
 		//cond1 = cond1.And("T_Ut__gte", Time_start_)
 		Time_start_ = lib.ReplaceSQL(Time_start_)
-		sql_WHERE += " AND t__ut >= " + Time_start_
+		sql_WHERE += fmt.Sprintf(" AND t__ut >= '%s'", Time_start_)
 	}
 	if len(Time_end_) > 0 {
 		//cond1 = cond1.And("T_Ut__lte", Time_end_)
 		Time_end_ = lib.ReplaceSQL(Time_end_)
-		sql_WHERE += " AND t__ut <= " + Time_end_
+		sql_WHERE += fmt.Sprintf(" AND t__ut <= '%s'", Time_end_)
 	}
 	//不填或0:所有      1:已处理     2:未处理
 	if T_handle == 1 {
 		//cond1 = cond1.And("T_Text__isnull", true)
-		sql_WHERE += " AND t__text IS NULL"
+		sql_WHERE += " AND t__tstate > 1"
 	}
-	if T_handle == 2 {
-		cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
-		sql_WHERE += " AND t__text IS NOT NULL AND t__state = 2 "
+	if T_handle == 3 {
+		//cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
+		sql_WHERE += " AND t__state = 3"
 	}
 
 	// -------------
@@ -357,8 +415,103 @@ func Read_Warning_Backups(T_pid int, T_year string, T_month string, T_sn string,
 		return r, 0
 	}
 	//fmt.Println("maps_z;",maps_z[0][0])
-	sql = "SELECT ID ,t_sn ,t__id ,t__name ,t__msid ,t__t ,t__r_h ,t__title ,t__addr ,t__remark ,t__ut ,t__state ,create_time ,update_time ,t__bind ,t__text ,t__handel ,t__log " +
-		"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)
+	}
+
+	fmt.Println(sql)
+	_, err = o.Raw(sql).QueryRows(&maps)
+
+	//value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
+	//key, _ := strconv.Atoi(maps_z[0][0].(string))
+	key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
+
+	for _, v := range maps {
+		r = append(r, WarningToWarning_R(v))
+	}
+
+	return r, key
+
+}
+
+// 获取管理员列表备份
+func Read_Admin_Warning_Backups(T_pids string, T_year string, T_month string, T_tp, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
+
+	if len(T_pids) == 0 {
+		return r, cnt
+	}
+
+	o := orm.NewOrm()
+	var maps []Warning
+	var maps_z []orm2.ParamsList
+	// 也可以直接使用 Model 结构体作为表名
+	// Warning_2022_07
+	Wtab := "warning_" + T_year + "_" + T_month
+
+	var offset int
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	sql_WHERE := ""
+
+	sql_WHERE += " t__state > 0"
+
+	if T_pids != "*" {
+		list := models.SplitStringToDotStr(T_pids, "P")
+		sql_WHERE += fmt.Sprintf(" AND t_pid in (%s)", list)
+	}
+
+	if len(T_tp) > 0 {
+		list := models.SplitStringToDotStr(T_tp, "T")
+		sql_WHERE += fmt.Sprintf(" AND t_tp in (%s)", list)
+
+	}
+	if len(T_name) > 0 {
+		sql_WHERE += " AND (t_sn like '%" + T_name + "%' OR t__d_name like '%" + T_name + "%' OR t_id like '%" + T_name + "%' OR t__d_s_name like '%" + T_name + "%')"
+	}
+
+	if len(Time_start_) > 0 {
+		//cond1 = cond1.And("T_Ut__gte", Time_start_)
+		Time_start_ = lib.ReplaceSQL(Time_start_)
+		sql_WHERE += fmt.Sprintf(" AND t__ut >= '%s'", Time_start_)
+	}
+	if len(Time_end_) > 0 {
+		//cond1 = cond1.And("T_Ut__lte", Time_end_)
+		Time_end_ = lib.ReplaceSQL(Time_end_)
+		sql_WHERE += fmt.Sprintf(" AND t__ut <= '%s'", Time_end_)
+	}
+	//1:默认 2:全部记录 3 未处理
+	if T_handle == 1 {
+		//cond1 = cond1.And("T_Text__isnull", true)
+		sql_WHERE += " AND t__tstate > 1"
+	}
+	if T_handle == 3 {
+		//cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
+		sql_WHERE += " AND t__state = 3"
+	}
+
+	// -------------
+
+	sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE" + sql_WHERE
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		return r, 0
+	}
+	if len(maps_z) == 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"
 	if page_z != 9999 {
 		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
 	}
@@ -404,3 +557,67 @@ func Read_Warning_ALL_T_Bind_TIME_1d_Count(T_pid int, T_sn string) int {
 
 	return len(maps_z)
 }
+
+func Read_Warning_ALL_T_State_Count(T_pid, T_handle int) (cnt int64) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(Warning))
+	cond := orm.NewCondition()
+
+	cond1 := cond.And("T_State__gt", 0)
+
+	if T_pid > 0 {
+		cond1 = cond.AndCond(cond1).And("T_pid", T_pid)
+	}
+
+	//不填或0:所有      1:已处理     2:未处理
+	if T_handle == 1 {
+		cond1 = cond1.And("T_State", 1)
+	}
+	if T_handle == 2 {
+		cond1 = cond1.And("T_State", 2)
+	}
+
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
+	return cnt
+}
+
+// 设备日志
+type DeviceLogs struct {
+	Id         int
+	T_sn       string //
+	Logs_Txt   string // 详情
+	CreateTime string
+}
+
+func WarningToDeviceLogs(t Warning) (r DeviceLogs) {
+	r.Id = t.Id
+	r.T_sn = t.T_sn
+	r.Logs_Txt = t.T_Remark
+	r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
+	return r
+}
+
+// 获取列表
+func Read_DeviceLogs_ALL(T_sn string, page, page_z int) (r []DeviceLogs, cnt int64) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+
+	qs := o.QueryTable(new(Warning))
+	var maps []Warning
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	qs.Limit(page_z, offset).Filter("T_sn", T_sn).Filter("T_tp__lte", 10).OrderBy("-Id").All(&maps)
+	cnt, _ = qs.Filter("T_sn", T_sn).Count()
+
+	for _, v := range maps {
+		r = append(r, WarningToDeviceLogs(v))
+	}
+
+	return r, cnt
+}

+ 8 - 20
models/Warning/WarningSand.go

@@ -11,29 +11,17 @@ import (
 )
 
 // 模板
+// 报警发送统计
 type WarningSand struct {
-	Id   int    `orm:"column(ID);size(11);auto;pk"`
-	T_sn string `orm:"size(256);null"` // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
+	Id int `orm:"column(ID);size(11);auto;pk"`
 
-	T_Id   int    `orm:"size(200);null"` //  传感器 ID
-	T_Name string `orm:"size(256);null"` // 传感器  温度探头1
-	T_Msid int    `orm:"size(256);null"` //
+	T_pid    int    `orm:"index;size(100);null"` // Account.Company 绑定公司, -1:未知   0:管理员  >0 :绑定公司
+	T_tp     int    `orm:"index;size(20);null"`  // 报警类型   ->WarningList
+	T_Notice string `orm:"size(256);null"`       // 18888888888
+	T_type   int    `orm:"index;size(4);null"`   // 1 短信   2 电话
+	T_Remark string `orm:"size(256);null"`       // 备注
 
-	T_T  float32 `orm:"size(20);null"` //  湿度下限
-	T_RH float32 `orm:"size(20);null"` //  湿度上限
-
-	T_Title  string `orm:"size(256);null"` // 报警标题 温度超上限报警
-	T_Addr   string `orm:"size(256);null"` //  地址    车载环境监测仪
-	T_Remark string `orm:"size(256);null"` // 备注
-
-	T_Ut   time.Time `orm:"type(timestamp);null;"` // 采集时间
-	T_Bind string    `orm:"size(256);null"`        //设备绑定 Uid  (这里单独改没有,要在 设备里面加入)
-
-	T_Filter   int       `orm:"size(200);null"`                                        // 过滤次数
-	T_Send_x   int       `orm:"type(text);size(256);null"`                             // 发送记录
-	T_State    int       `orm:"size(2);1"`                                             // 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 保存时都会对时间自动更新
 }
 
 func (t *WarningSand) TableName() string {
@@ -89,7 +77,7 @@ func Read_DeviceWarning(Warning WarningSand) (r []WarningSand) {
 	dd, _ := time.ParseDuration("-1m") //"s", "m", "h".
 	currentTime := now.Add(dd)
 
-	qs.Filter("T_sn", Warning.T_sn).Filter("T_Id", Warning.T_Id).Filter("T_Title", Warning.T_Title).Filter("CreateTime__gte", currentTime.Format("2006-01-02 15:04:05")).OrderBy("-Id").All(&r)
+	qs.Filter("T_pid", Warning.T_pid).Filter("T_tp", Warning.T_tp).Filter("T_Notice", Warning.T_Notice).Filter("T_type", Warning.T_type).Filter("CreateTime__gte", currentTime.Format("2006-01-02 15:04:05")).OrderBy("-Id").All(&r)
 	// 记录 ++
 	if len(r) > 0 {
 		ColAdd_DeviceWarningBy_ID(r[0].Id)

+ 88 - 4
models/Warning/WarningType.go

@@ -2,6 +2,7 @@ package Warning
 
 import (
 	"Cold_Api/logs"
+	"Cold_Api/models"
 	_ "github.com/astaxie/beego/cache/redis"
 	"github.com/beego/beego/v2/adapter/orm"
 	_ "github.com/go-sql-driver/mysql"
@@ -17,14 +18,53 @@ type WarningType struct {
 	T_Tips string `orm:"type(text);size(256);null"` // 提示
 }
 
+//3
+//tp   报警类型
+// 1  温度超上限报警
+// 2  温度超下限报警
+// 3  温度超上限预警
+// 4  温度超下限预警
+// 5  温度恢复正常
+// 6  湿度超上限报警
+// 7  湿度超下限报警
+// 8  湿度超上限预警
+// 9  湿度超下限预警
+// 10 湿度恢复正常
+
+//12
+//tp   报警类型
+// 101 主机报警
+// 102 时间报警
+// 103 闪存报警
+// 104 SD卡报警
+// 105 网络报警
+// 106  普通日志
+// 107 升级固件报警
+// 108 系统故障报警
+// 109 市电断电报警
+// 110 市电已恢复
+// 111 电池电量低报警
+// 112 电池电量恢复
+// 113 传感器故障报警
+// 114 传感器恢复
+// 115 开始任务(移动端)
+// 116 中途打印任务(移动端)
+// 117 结束任务(移动端)
+
+// 预警系统
+// 1001 设备状态异常
+// 1002 传感器数据异常
+// 1011    报警策略异常
+
 func (t *WarningType) TableName() string {
 	return "warning_type" // 数据库名称   // ************** 替换 FormulaList **************
 }
 
-//var redisCache_WarningType cache.Cache
-
+// var redisCache_WarningType cache.Cache
+var WarningType_list map[int]string // 泛型
 func init() {
 	//注册模型
+	WarningType_list = make(map[int]string)
 	orm.RegisterModel(new(WarningType))
 
 }
@@ -84,8 +124,26 @@ func Read_WarningType_All() (r []WarningType_) {
 	return r
 }
 
-// 获取全部
-func Read_WarningType_All_T_Warning(T_warning string) (r []WarningType_R) {
+// 报警列表 返回权限拥有的报警类型列表
+func Read_WarningType_Power_All(T_warning string) (r []WarningType_) {
+	o := orm.NewOrm()
+	var maps []WarningType
+	qs := o.QueryTable(new(WarningType))
+	if T_warning == "*" {
+		qs.All(&maps)
+	} else {
+		list := models.SplitStringIds(T_warning, "W")
+		qs.Filter("Id__in", list).All(&maps)
+	}
+
+	for _, v := range maps {
+		r = append(r, WarningTypeToWarningType_(v))
+	}
+	return r
+}
+
+// 权限修改 返回全部,已勾选的T_check=true
+func Read_WarningType_All_Power_T_Warning(T_warning string) (r []WarningType_R) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 	var maps []WarningType
@@ -96,3 +154,29 @@ func Read_WarningType_All_T_Warning(T_warning string) (r []WarningType_R) {
 	}
 	return r
 }
+
+// 获取全部
+func Read_WarningType_All_Maps() {
+	time.Sleep(time.Second)
+
+	logs.Println("=========== 初始化报警类型 =========")
+
+	o := orm.NewOrm()
+	var r []WarningType
+	qs := o.QueryTable(new(WarningType))
+	qs.All(&r)
+
+	for _, v := range r {
+		WarningType_list[v.Id] = v.T_name
+	}
+
+}
+func Read_WarningType_Get(id int) string {
+	// 有先加入 给全部人发消息
+	v, ok := WarningType_list[id] /*如果确定是真实的,则存在,否则不存在 */
+	if ok {
+		return v
+	} else {
+		return "未知类型"
+	}
+}

+ 18 - 0
routers/Product.go

@@ -0,0 +1,18 @@
+package routers
+
+import (
+	"Cold_Api/conf"
+	"Cold_Api/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+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") // 设备版本升级-产品型号列表
+
+}

+ 2 - 1
routers/User.go

@@ -13,13 +13,14 @@ func init() {
 	// 用户
 	beego.Router(version+"/Login_verification", &controllers.AdminController{}, "*:Login_verification")
 	beego.Router(version+"/User/List", &controllers.UserController{}, "*:User_List")         // 用户列表
+	beego.Router(version+"/User/Home", &controllers.UserController{}, "*:User_Home")         // 主页
 	beego.Router(version+"/User/Info", &controllers.UserController{}, "*:User_Info")         // 个人信息
 	beego.Router(version+"/User/Post", &controllers.UserController{}, "*:User_Post")         // 修改个人信息
 	beego.Router(version+"/User/Get", &controllers.UserController{}, "*:User_Get")           // 获取用户信息
 	beego.Router(version+"/User/Add", &controllers.UserController{}, "*:User_Add")           // 增加用户
 	beego.Router(version+"/User/Edit", &controllers.UserController{}, "*:User_Edit")         // 编辑用户
 	beego.Router(version+"/User/Del", &controllers.UserController{}, "*:User_Del")           // 删除用户
-	beego.Router(version+"/User/WxQRCode", &controllers.UserController{}, "*:User_WxQRCode") // 删除用户
+	beego.Router(version+"/User/WxQRCode", &controllers.UserController{}, "*:User_WxQRCode") // 获取微信二维码
 
 	beego.Router(version+"/Admin/List", &controllers.UserController{}, "*:Admin_List")                 // 内部用户列表
 	beego.Router(version+"/Admin/Get", &controllers.UserController{}, "*:Admin_Get")                   // 获取内部用户信息

+ 1 - 0
routers/router.go

@@ -11,6 +11,7 @@ func init() {
 
 	// 公共
 	beego.Router(version+"/UpFile", &controllers.UpFileController{}, "*:UpFile")
+	beego.Router(version+"/UpFileToken", &controllers.UpFileController{}, "*:ConfigUpFileToken")
 
 	// 系统日志
 	beego.Router(version+"/System/LogsClass", &controllers.LogsController{}, "*:LogsClass") // 获取未读消息

+ 32 - 27
routers/v3.go

@@ -13,16 +13,18 @@ func init() {
 	beego.Router(version+"/Device/Add", &controllers.DeviceController{}, "*:Device_Add")                                          // 添加设备
 	beego.Router(version+"/Device/Del", &controllers.DeviceController{}, "*:Device_Del")                                          // 删除设备
 	beego.Router(version+"/Device/Edit", &controllers.DeviceController{}, "*:Device_Edit")                                        // 修改设备
+	beego.Router(version+"/Device/RestartShutdown", &controllers.DeviceController{}, "*:Device_RestartShutdown")                  // 重启/关机
 	beego.Router(version+"/Device/Parameter_List", &controllers.DeviceController{}, "*:Device_Parameter_List")                    // 设备参数列表
 	beego.Router(version+"/Device/Parameter_Pu", &controllers.DeviceController{}, "*:Device_Parameter_Pu")                        // 修改设备参数
 	beego.Router(version+"/Device/Device_Parameter_Del_Device", &controllers.DeviceController{}, "*:Device_Parameter_Del_Device") // 删除此设备
+	// 设备日志
+	beego.Router(version+"/Device/Log", &controllers.DeviceController{}, "*:DeviceLogs") // 获取未读消息
 
 	// 修改设备参数
 	beego.Router(version+"/Device/Pu_DeviceParameter_T_l_p", &controllers.DeviceController{}, "*:Pu_DeviceParameter_T_type")  // 设置设备参数
 	beego.Router(version+"/Device/Pu_DeviceParameter_T_give", &controllers.DeviceController{}, "*:Pu_DeviceParameter_T_give") // 设备是否弃用
 
 	// 同步传感器
-	//beego.Router(version+"/Device/Pu_DeviceParameter_Sensor", &controllers.DeviceController{}, "*:Pu_DeviceParameter_Sensor")   // 设置传感器参数
 	beego.Router(version+"/Device/Read_DeviceSensorParameter", &controllers.DeviceController{}, "*:Read_DeviceSensorParameter") // 获取传感器参数
 
 	// 设备-传感器
@@ -37,45 +39,44 @@ func init() {
 	beego.Router(version+"/Device/UpDeviceSensor_T_datashow", &controllers.DeviceController{}, "*:UpDeviceSensor_T_datashow") // 传感器屏蔽数据展示
 
 	// 设备任务
-	beego.Router(version+"/DeviceTask/List", &controllers.DeviceController{}, "*:DeviceTask_List")        // 任务列表
-	beego.Router(version+"/Device/DeviceTask_Post", &controllers.DeviceController{}, "*:DeviceTask_Post") // 添加任务
+	beego.Router(version+"/Device/DeviceTask_List", &controllers.DeviceController{}, "*:DeviceTask_List") // 任务列表
+	beego.Router(version+"/Device/DeviceTask_Post", &controllers.DeviceController{}, "*:DeviceTask_Post") // 远程启停
 
-	// 设备
+	// 设备
 	beego.Router(version+"/DeviceWarning/List", &controllers.DeviceController{}, "*:DeviceWarning_List")                   // 告警列表
 	beego.Router(version+"/DeviceWarning/Get", &controllers.DeviceController{}, "*:DeviceWarning_Get")                     // 获取告警
-	beego.Router(version+"/DeviceWarning/Edit", &controllers.DeviceController{}, "*:DeviceWarning_Post")                   // 修改告警
+	beego.Router(version+"/DeviceWarning/Edit", &controllers.DeviceController{}, "*:DeviceWarning_Post")                   // 修改告警 报警处理
 	beego.Router(version+"/DeviceWarning/Del", &controllers.DeviceController{}, "*:DeviceWarning_Del")                     // 删除告警
 	beego.Router(version+"/DeviceWarning/ToExcel", &controllers.DeviceController{}, "*:DeviceWarning_Data_Excel")          // 导出excel
 	beego.Router(version+"/Device/DeviceWarningListT_Tips", &controllers.DeviceController{}, "*:DeviceWarningList_T_Tips") // 获取未读消息
 
-	// 告警类型
-	beego.Router(version+"/WarningType/List_All", &controllers.DeviceController{}, "*:WarningType_List_All") // 告警类型列表
+	// 报警类型
+	beego.Router(version+"/WarningType/List_All", &controllers.DeviceController{}, "*:WarningType_List_All")         // 添加权限-告警类型列表
+	beego.Router(version+"/WarningType/Power_List", &controllers.DeviceController{}, "*:WarningType_Power_List_All") // 报警搜索-告警类型列表
 
 	//分类管理
-	beego.Router(version+"/CompanyClass/List", &controllers.DeviceController{}, "*:CompanyClass_List") // 分类列表
-	beego.Router(version+"/CompanyClass/All", &controllers.DeviceController{}, "*:CompanyClass_All")   // 所有分类列表
-	beego.Router(version+"/CompanyClass/Get", &controllers.DeviceController{}, "*:CompanyClass_Get")   // 获取分类
-	beego.Router(version+"/CompanyClass/Add", &controllers.DeviceController{}, "*:CompanyClass_Add")   // 添加分类
-	beego.Router(version+"/CompanyClass/Edit", &controllers.DeviceController{}, "*:CompanyClass_Edit") // 修改分类
-	beego.Router(version+"/CompanyClass/Del", &controllers.DeviceController{}, "*:CompanyClass_Del")   // 删除分类
+	beego.Router(version+"/Class/List", &controllers.DeviceController{}, "*:CompanyClass_List") // 分类列表
+	beego.Router(version+"/Class/All", &controllers.DeviceController{}, "*:CompanyClass_All")   // 所有分类列表
+	beego.Router(version+"/Class/Get", &controllers.DeviceController{}, "*:CompanyClass_Get")   // 获取分类
+	beego.Router(version+"/Class/Add", &controllers.DeviceController{}, "*:CompanyClass_Add")   // 添加分类
+	beego.Router(version+"/Class/Edit", &controllers.DeviceController{}, "*:CompanyClass_Edit") // 修改分类
+	beego.Router(version+"/Class/Del", &controllers.DeviceController{}, "*:CompanyClass_Del")   // 删除分类
 	// 分类绑定
 	beego.Router(version+"/Device/DeviceClassBind_List", &controllers.DeviceController{}, "*:DeviceClassBind_List") // 设备分类绑定列表
 	beego.Router(version+"/Class/Bind_Add", &controllers.DeviceController{}, "*:ClassBind_Add")                     // 添加分类设备绑定
 	beego.Router(version+"/Class/Bind_Del", &controllers.DeviceController{}, "*:ClassBind_Del")                     // 删除分类设备绑定
-	//// 分类二维码 (不用)
-	//beego.Router(version+"/Device/Get_DeviceClassId_QRCode", &controllers.DeviceController{}, "*:Get_DeviceClassId_QRCode")   // 获取未读消息
-	//beego.Router(version+"/Device/Get_DeviceClassId_QRCode2", &controllers.DeviceController{}, "*:Get_DeviceClassId_QRCode2") // 获取未读消息
 
-	//通知管理
-	beego.Router(version+"/CompanyNotice/List", &controllers.DeviceController{}, "*:CompanyNotice_List")            // 分类通知
-	beego.Router(version+"/CompanyNotice/All", &controllers.DeviceController{}, "*:CompanyNotice_All")              // 所有通知列表
-	beego.Router(version+"/CompanyNotice/Get", &controllers.DeviceController{}, "*:CompanyNotice_Get")              // 获取通知
-	beego.Router(version+"/CompanyNotice/Add", &controllers.DeviceController{}, "*:CompanyNotice_Add")              // 添加通知
-	beego.Router(version+"/CompanyNotice/Edit", &controllers.DeviceController{}, "*:CompanyNotice_Edit")            // 修改通知
-	beego.Router(version+"/CompanyNotice/Del", &controllers.DeviceController{}, "*:CompanyNotice_Del")              // 删除通知
-	beego.Router(version+"/Device/DeviceClassBind_List", &controllers.DeviceController{}, "*:DeviceClassBind_List") // 设备通知绑定列表
-	beego.Router(version+"/Notice/Bind_Add", &controllers.DeviceController{}, "*:NoticeBind_Add")                   // 添加通知设备绑定
-	beego.Router(version+"/Notice/Bind_Del", &controllers.DeviceController{}, "*:NoticeBind_Del")                   // 删除通知设备绑定
+	//报警策略
+	beego.Router(version+"/Notice/List", &controllers.DeviceController{}, "*:CompanyNotice_List") // 报警策略列表
+	beego.Router(version+"/Notice/All", &controllers.DeviceController{}, "*:CompanyNotice_All")   // 所有报警策略列表
+	beego.Router(version+"/Notice/Get", &controllers.DeviceController{}, "*:CompanyNotice_Get")   // 获取报警策略
+	beego.Router(version+"/Notice/Add", &controllers.DeviceController{}, "*:CompanyNotice_Add")   // 添加报警策略
+	beego.Router(version+"/Notice/Edit", &controllers.DeviceController{}, "*:CompanyNotice_Edit") // 修改报警策略
+	beego.Router(version+"/Notice/Del", &controllers.DeviceController{}, "*:CompanyNotice_Del")   // 删除报警策略
+	// 通知绑定
+	beego.Router(version+"/Device/DeviceNoticeBind_List", &controllers.DeviceController{}, "*:DeviceNoticeBind_List") // 报警策略绑定列表
+	beego.Router(version+"/Notice/Bind_Add", &controllers.DeviceController{}, "*:NoticeBind_Add")                     // 添加报警策略绑定
+	beego.Router(version+"/Notice/Bind_Del", &controllers.DeviceController{}, "*:NoticeBind_Del")                     // 删除报警策略绑定
 
 	// 添加设备数据 由mqtt服务添加
 	//beego.Router(version+"/Device/DeviceData_Add", &controllers.DeviceController{}, "*:DeviceData_Add") // 设置 设备参数
@@ -86,7 +87,11 @@ func init() {
 	beego.Router(version+"/Data/Device_Sensor_Data_Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel")     // 导出传感器数据
 	beego.Router(version+"/Data/Device_Sensor_Data_Excel_m", &controllers.DataController{}, "*:Device_Sensor_Data_Excel_m") // 导出传感器数据
 
-	beego.Router(version+"/Data/List", &controllers.DataController{}, "*:Device_Sensor_Data_More") // 传感器设备列表
+	beego.Router(version+"/Data/List", &controllers.DataController{}, "*:Device_Sensor_Data_More")   // 传感器设备列表
+	beego.Router(version+"/Data/Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel") // 传感器设备列表
+	beego.Router(version+"/Data/PDF", &controllers.DataController{}, "*:Device_Sensor_Data_PDF")     // 传感器设备列表
+	// 执行 SQL
+	beego.Router(version+"/Data/Raw", &controllers.RawSqlController{}, "*:Raw") // 执行 SQL
 
 	beego.Router(version+"/DeviceType/List_All", &controllers.DeviceController{}, "*:DeviceType_List_All") // 传感器设备列表
 }