siked 2 jaren geleden
bovenliggende
commit
2554063744

BIN
Cold_Api6200


BIN
Cold_Api6201


+ 14 - 0
conf/app.conf

@@ -3,6 +3,12 @@ HTTPPort = 6200
 runmode = dev
 runmode = dev
 EnableDocs = true
 EnableDocs = true
 copyrequestbody = true
 copyrequestbody = true
+#热更新
+# Graceful = true
+#进程内监控
+# EnableAdmin = true
+# AdminAddr = "localhost"
+# AdminPort = 8088
 
 
 # Nats
 # Nats
 NatsServer_Url = "192.168.192.63:4222"
 NatsServer_Url = "192.168.192.63:4222"
@@ -16,6 +22,14 @@ MysqlServer_Password = "j6WXwyEckZS7bJFM"
 MysqlServer_MaxIdleConnections = 100
 MysqlServer_MaxIdleConnections = 100
 MysqlServer_MaxOpenConnections = 200
 MysqlServer_MaxOpenConnections = 200
 
 
+# # Mysql
+# MysqlServer_UrlPort = "192.168.192.250:3306"
+# MysqlServer_Database = "culd"
+# MysqlServer_Username = "cold"
+# MysqlServer_Password = "j6WXwyEckZS7bJFM"
+# MysqlServer_MaxIdleConnections = 100
+# MysqlServer_MaxOpenConnections = 200
+
 
 
 # Redis
 # Redis
 Redis_address = "192.168.192.63:6379"
 Redis_address = "192.168.192.63:6379"

+ 4 - 4
controllers/Data.go

@@ -622,10 +622,10 @@ func (c *DataController) Device_Sensor_Data_Excel_m() {
 	}
 	}
 
 
 	//删除目录
 	//删除目录
-	err := os.Remove("ofile/" + timeStr + ".xlsx")
-	if err != nil {
-		fmt.Println(err)
-	}
+	//err := os.Remove("ofile/" + timeStr + ".xlsx")
+	//if err != nil {
+	//	fmt.Println(err)
+	//}
 
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
 	c.ServeJSON()
 	c.ServeJSON()

+ 62 - 0
controllers/Device.go

@@ -60,6 +60,7 @@ func (c *DeviceController) Device_html() {
 		r_Device.T_devName = v.T_devName
 		r_Device.T_devName = v.T_devName
 		r_Device.T_give = v.T_give
 		r_Device.T_give = v.T_give
 		r_Device.T_online = v.T_online
 		r_Device.T_online = v.T_online
+		r_Device.T_online_4g = v.T_online_4g
 		r_Device.T_monitor = v.T_monitor
 		r_Device.T_monitor = v.T_monitor
 		r_Device.T_Dattery = v.T_Dattery
 		r_Device.T_Dattery = v.T_Dattery
 
 
@@ -1136,6 +1137,16 @@ func (c *DeviceController) DeviceWarning_() {
 
 
 	c.TplName = "Device/DeviceWarning-.html"
 	c.TplName = "Device/DeviceWarning-.html"
 }
 }
+func (c *DeviceController) DeviceWarning_log() {
+	id, _ := c.GetInt("id")
+
+	T_Log := Device.Read_DeviceWarning_ById(id).T_Log
+
+	T_Log = strings.Replace(T_Log, "\n", "<hr>", -1)
+
+	c.Data["T_Log"] = T_Log
+	c.TplName = "Device/DeviceWarning-log.html"
+}
 func (c *DeviceController) DeviceWarning_M() {
 func (c *DeviceController) DeviceWarning_M() {
 	id := c.GetString("id")
 	id := c.GetString("id")
 	c.Data["id"] = id
 	c.Data["id"] = id
@@ -1996,6 +2007,57 @@ func (c *DeviceController) Get_DeviceClassId_QRCode() {
 	return
 	return
 }
 }
 
 
+func (c *DeviceController) DeviceData_Add() {
+	// 验证登录
+	if c.GetString("Tokey") != "1f9db553" {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "Tokey Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_sn := c.GetString("T_sn")
+	T_name := c.GetString("T_name")
+	T_id, _ := c.GetInt("T_id")
+	T_t, _ := c.GetFloat("T_t")
+	T_rh, _ := c.GetFloat("T_rh")
+	T_Tlower, _ := c.GetFloat("T_Tlower")
+	T_Tupper, _ := c.GetFloat("T_Tupper")
+	T_RHlower, _ := c.GetFloat("T_RHlower")
+	T_RHupper, _ := c.GetFloat("T_RHupper")
+	T_Site := c.GetString("T_Site")
+	T_Dattery, _ := c.GetInt("T_Dattery")
+	T_time, err := time.Parse("2006-01-02 15:04:05", c.GetString("T_time"))
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "T_time Err!"}
+		c.ServeJSON()
+		return
+	}
+	//// 更新记录 - 缓存
+	DeviceData_t := Device.DeviceData_T{
+		T_name:    T_name,
+		T_id:      T_id,
+		T_t:       float32(T_t),
+		T_rh:      float32(T_rh),
+		T_Tlower:  float32(T_Tlower),
+		T_Tupper:  float32(T_Tupper),
+		T_RHlower: float32(T_RHlower),
+		T_RHupper: float32(T_RHupper),
+		T_Site:    T_Site,
+		T_Dattery: T_Dattery,
+		T_time:    T_time,
+	}
+
+	if !Device.Add_DeviceData(T_sn, DeviceData_t) {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
 // 列表 - 设备日志
 // 列表 - 设备日志
 func (c *DeviceController) DeviceLogs() {
 func (c *DeviceController) DeviceLogs() {
 	page, _ := c.GetInt("page")
 	page, _ := c.GetInt("page")

+ 20 - 0
controllers/lib/WritePid.go

@@ -0,0 +1,20 @@
+package lib
+
+import (
+	"bufio"
+	"os"
+	"strconv"
+)
+
+func WritePid() {
+	fileName := "./server.pid"
+	file, _ := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0666)
+	defer file.Close()
+
+	writer := bufio.NewWriter(file)
+
+	pid := strconv.Itoa(os.Getpid())
+	println("server_pid:", pid)
+	writer.Write([]byte(pid))
+	writer.Flush()
+}

+ 71 - 0
go.sh

@@ -0,0 +1,71 @@
+#!/bin/bash
+#这里可替换为你自己的执行程序,其他代码无需更改
+APP_NAME=Cold_Api6200
+#使用说明,用来提示输入参数
+usage() {
+  echo "Usage: sh 脚本名.sh [start|stop|restart|status]"
+  exit 1
+}
+#检查程序是否在运行
+is_exist() {
+  pid=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}')
+  #如果不存在返回1,存在返回0
+  if [ -z "${pid}" ]; then
+    return 1
+  else
+    return 0
+  fi
+}
+#启动方法
+start() {
+  is_exist
+  if [ $? -eq "0" ]; then
+    echo "${APP_NAME} is already running. pid=${pid} ."
+  else
+    mkdir -p logs
+    export GO111MODULE=off
+    nohup ./${APP_NAME} >> ./logs/nohup.out 2>&1 &
+    echo "${APP_NAME} start success"
+  fi
+}
+#停止方法
+stop() {
+  is_exist
+  if [ $? -eq "0" ]; then
+    kill -9 $pid
+  else
+    echo "${APP_NAME} is not running"
+  fi
+}
+#输出运行状态
+status() {
+  is_exist
+  if [ $? -eq "0" ]; then
+    echo "${APP_NAME} is running. Pid is ${pid}"
+  else
+    echo "${APP_NAME} is NOT running."
+  fi
+}
+#重启
+restart() {
+  stop
+  start
+}
+#根据输入参数,选择执行对应方法,不输入则执行使用说明
+case "$1" in
+"start")
+  start
+  ;;
+"stop")
+  stop
+  ;;
+"status")
+  status
+  ;;
+"restart")
+  restart
+  ;;
+*)
+  usage
+  ;;
+esac

+ 1 - 1
lastupdate.tmp

@@ -1 +1 @@
-{"C:\\BZD\\Cold\\Cold_Api\\controllers":1658904582455047900}
+{"C:\\BZD\\Cold\\Cold_Api\\controllers":1659515790364846300}

+ 39 - 0
logs/logx/logx.log

@@ -0,0 +1,39 @@
+2022/07/28 09:12:50.128 [I]  2022-07-28 09:12:50>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/28 09:12:50.251 [I]  2022-07-28 09:12:50>%!(EXTRA []interface {}=[nats OK!])
+2022/07/28 09:37:28.450 [I]  2022-07-28 09:37:28>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/28 09:37:28.564 [I]  2022-07-28 09:37:28>%!(EXTRA []interface {}=[nats OK!])
+2022/07/28 09:56:10.428 [I]  2022-07-28 09:56:10>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/28 09:56:10.546 [I]  2022-07-28 09:56:10>%!(EXTRA []interface {}=[nats OK!])
+2022/07/28 10:08:44.098 [I]  2022-07-28 10:08:44>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/28 10:08:44.211 [I]  2022-07-28 10:08:44>%!(EXTRA []interface {}=[nats OK!])
+2022/07/28 10:53:19.635 [I]  2022-07-28 10:53:19>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728105319.xlsx ofile/20220728105319.xlsx])
+2022/07/28 10:53:53.035 [I]  2022-07-28 10:53:53>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728105352.xlsx ofile/20220728105352.xlsx])
+2022/07/28 10:54:31.011 [I]  2022-07-28 10:54:31>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728105430.xlsx ofile/20220728105430.xlsx])
+2022/07/28 10:55:11.469 [I]  2022-07-28 10:55:11>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728105511.xlsx ofile/20220728105511.xlsx])
+2022/07/28 10:56:25.794 [I]  2022-07-28 10:56:25>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/28 10:56:25.910 [I]  2022-07-28 10:56:25>%!(EXTRA []interface {}=[nats OK!])
+2022/07/28 10:56:53.151 [I]  2022-07-28 10:56:53>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728105653.xlsx ofile/20220728105653.xlsx])
+2022/07/28 10:57:44.594 [I]  2022-07-28 10:57:44>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728105744.xlsx ofile/20220728105744.xlsx])
+2022/07/28 10:59:45.963 [I]  2022-07-28 10:59:45>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728105945.xlsx ofile/20220728105945.xlsx])
+2022/07/28 11:01:15.508 [I]  2022-07-28 11:01:15>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728110115.xlsx ofile/20220728110115.xlsx])
+2022/07/28 15:09:17.236 [I]  2022-07-28 15:09:17>%!(EXTRA []interface {}=[ => Nats Cold_Api/Nats/NatsServer.Wx_GenerateQRCode -|k89VXy/9K3m7RyAFLY6kow==|- @宝智达 微信公众号通知])
+2022/07/28 15:13:13.023 [I]  2022-07-28 15:13:13>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728151313.xlsx ofile/20220728151313.xlsx])
+2022/07/28 15:16:44.602 [I]  2022-07-28 15:16:44>%!(EXTRA []interface {}=[Nats => Cold_Api/Nats/NatsServer.Qiniu_UploadFile C:/Users/SIKED/AppData/Local/Temp/GoLand/ofile/20220728151644.xlsx ofile/20220728151644.xlsx])
+2022/07/29 09:33:18.124 [I]  2022-07-29 09:33:18>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/29 09:33:18.258 [I]  2022-07-29 09:33:18>%!(EXTRA []interface {}=[nats OK!])
+2022/07/29 10:41:19.609 [I]  2022-07-29 10:41:19>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/29 10:41:19.735 [I]  2022-07-29 10:41:19>%!(EXTRA []interface {}=[nats OK!])
+2022/07/29 10:46:37.630 [I]  2022-07-29 10:46:37>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/29 10:46:37.754 [I]  2022-07-29 10:46:37>%!(EXTRA []interface {}=[nats OK!])
+2022/07/29 10:47:27.545 [I]  2022-07-29 10:47:27>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/29 10:47:27.667 [I]  2022-07-29 10:47:27>%!(EXTRA []interface {}=[nats OK!])
+2022/07/29 15:36:58.280 [I]  2022-07-29 15:36:58>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/29 15:36:58.418 [I]  2022-07-29 15:36:58>%!(EXTRA []interface {}=[nats OK!])
+2022/07/29 15:53:01.559 [I]  2022-07-29 15:53:01>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/29 15:53:01.685 [I]  2022-07-29 15:53:01>%!(EXTRA []interface {}=[nats OK!])
+2022/07/29 15:53:54.938 [I]  2022-07-29 15:53:54>%!(EXTRA []interface {}=[============Nats init============])
+2022/07/29 15:53:55.066 [I]  2022-07-29 15:53:55>%!(EXTRA []interface {}=[nats OK!])
+2022/08/01 11:50:58.724 [I]  2022-08-01 11:50:58>%!(EXTRA []interface {}=[============Nats init============])
+2022/08/01 11:50:58.851 [I]  2022-08-01 11:50:58>%!(EXTRA []interface {}=[nats OK!])
+2022/08/05 15:14:29.743 [I]  2022-08-05 15:14:29>%!(EXTRA []interface {}=[============Nats init============])
+2022/08/05 15:14:29.874 [I]  2022-08-05 15:14:29>%!(EXTRA []interface {}=[nats OK!])

+ 4 - 0
main.go

@@ -3,6 +3,7 @@ package main
 import (
 import (
 	_ "Cold_Api/Nats"
 	_ "Cold_Api/Nats"
 	"Cold_Api/conf"
 	"Cold_Api/conf"
+	"Cold_Api/controllers/lib"
 	"Cold_Api/models/Device"
 	"Cold_Api/models/Device"
 	_ "Cold_Api/routers"
 	_ "Cold_Api/routers"
 	"fmt"
 	"fmt"
@@ -17,6 +18,9 @@ import (
 )
 )
 
 
 func init() {
 func init() {
+
+	lib.WritePid()
+
 	fmt.Println(runtime.GOOS)
 	fmt.Println(runtime.GOOS)
 	orm.RegisterDriver("mysql", orm.DRMySQL)
 	orm.RegisterDriver("mysql", orm.DRMySQL)
 	//orm.RegisterDataBase("default", "mysql", "zdxq:7e5853d9178edfcc@tcp(47.108.133.234:3306)/zdxq?charset=utf8",100,200)
 	//orm.RegisterDataBase("default", "mysql", "zdxq:7e5853d9178edfcc@tcp(47.108.133.234:3306)/zdxq?charset=utf8",100,200)

+ 1 - 0
models/Admin/Admin.go

@@ -219,6 +219,7 @@ func Update_Admin_ById_Basics(m Admin) (err error) {
 		if num, err = o.Update(&v, "Admin_name", "Admin_telephone", "Admin_mail", "Admin_text", "Admin_gender", "Admin_power", "Admin_pass"); err == nil {
 		if num, err = o.Update(&v, "Admin_name", "Admin_telephone", "Admin_mail", "Admin_text", "Admin_gender", "Admin_power", "Admin_pass"); err == nil {
 			fmt.Println("Number of records updated in database:", num)
 			fmt.Println("Number of records updated in database:", num)
 		}
 		}
+		Redis_Admin_Set(m) // Redis 更新缓存
 	}
 	}
 	return err
 	return err
 }
 }

+ 8 - 5
models/Device/Device.go

@@ -31,10 +31,11 @@ type Device struct {
 	T_Putime_Parameter time.Time `orm:"type(timestamp);null;"` // 参数时间
 	T_Putime_Parameter time.Time `orm:"type(timestamp);null;"` // 参数时间
 	T_Bind             string    `orm:"size(256);null"`        //设备绑定  Uid
 	T_Bind             string    `orm:"size(256);null"`        //设备绑定  Uid
 
 
-	T_monitor int `orm:"size(22);null"`  //  监控状态 1 监控  0 未监控
-	T_online  int `orm:"size(22);1"`     //  在线状态 1 在线  0 离线
-	T_Dattery int `orm:"size(256);null"` //电量
-	T_err     int `orm:"size(2);1"`      // 0 正常  1 异常
+	T_monitor   int `orm:"size(22);null"`  //  监控状态 1 监控  0 未监控
+	T_online    int `orm:"size(22);1"`     //  在线状态 1 在线  0 离线
+	T_online_4g int `orm:"size(22);0"`     // 在线状态4G  0 包含(2 离线 3 异常断开)  1 在线  2 离线   3 异常断开
+	T_Dattery   int `orm:"size(256);null"` //电量
+	T_err       int `orm:"size(2);1"`      // 0 正常  1 异常
 
 
 	T_State    int       `orm:"size(2);1"`                                             // 0 删除   1 正常
 	T_State    int       `orm:"size(2);1"`                                             // 0 删除   1 正常
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
@@ -47,11 +48,13 @@ type R_Device struct {
 	T_monitor     int              //  监控状态 1 监控  0 未监控
 	T_monitor     int              //  监控状态 1 监控  0 未监控
 	T_give        int              // 0 丢弃  1 正常
 	T_give        int              // 0 丢弃  1 正常
 	T_online      int              //  在线状态 1 在线  0 离线
 	T_online      int              //  在线状态 1 在线  0 离线
+	T_online_4g   int              //  在线状态4G 1 在线  0 离线
 	T_Dattery     int              //电量
 	T_Dattery     int              //电量
 	T_sensor_list []DeviceSensor_R //  传感器List
 	T_sensor_list []DeviceSensor_R //  传感器List
-	T_MSISDN      string           //设备名称
+	T_MSISDN      string           //MSISDN
 	UpdateTime    time.Time        //auto_now 每次 model 保存时都会对时间自动更新
 	UpdateTime    time.Time        //auto_now 每次 model 保存时都会对时间自动更新
 }
 }
+
 type Device_task struct {
 type Device_task struct {
 	T_sn   string
 	T_sn   string
 	T_task string
 	T_task string

+ 86 - 9
models/Device/DeviceData.go

@@ -3,6 +3,7 @@ package Device
 import (
 import (
 	"Cold_Api/conf"
 	"Cold_Api/conf"
 	"Cold_Api/controllers/lib"
 	"Cold_Api/controllers/lib"
+	"Cold_Api/logs"
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
 	"github.com/astaxie/beego/cache"
 	"github.com/astaxie/beego/cache"
@@ -92,6 +93,15 @@ func RedisDeviceData_Get_(key string) (r DeviceData_New, is bool) {
 	return DeviceData_New{}, false
 	return DeviceData_New{}, false
 }
 }
 
 
+func Redis_Set_DeviceData_Time(key string) (err error) {
+
+	err = redisCache_DeviceData.Put(key, "", 40*time.Minute)
+	if err != nil {
+		fmt.Println("set key:", key, err)
+	}
+	return
+}
+
 //创建数据库  Device.CREATE_DeviceData("")
 //创建数据库  Device.CREATE_DeviceData("")
 func CREATE_DeviceData(SN string) bool {
 func CREATE_DeviceData(SN string) bool {
 
 
@@ -120,8 +130,10 @@ func CREATE_DeviceData(SN string) bool {
 }
 }
 
 
 func DELETE_DeviceDatar(SN string) bool {
 func DELETE_DeviceDatar(SN string) bool {
-
-	sql := "DROP TABLE Z_DeviceData_" + SN
+	timeStr := time.Now().Format("2006_01_02_15_04_05")
+	//sql := "DROP TABLE Z_DeviceData_" + SN
+	sql := "ALTER TABLE Z_DeviceData_" + SN + " RENAME TO " + "Z_DeviceData_" + SN + "_dle_" + timeStr + ";"
+	logs.Println("DELETE_DeviceDatar:", sql)
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	_, err := o.Raw(sql).Exec()
 	_, err := o.Raw(sql).Exec()
 	if err != nil {
 	if err != nil {
@@ -130,14 +142,79 @@ func DELETE_DeviceDatar(SN string) bool {
 	return true
 	return true
 }
 }
 
 
-// ---------------- 特殊方法 -------------------
-// 获取 ById
-//func Read_List_ById(id int) (r DeviceData) {
-//	o := orm.NewOrm()
-//
-//	return r
-//}
+// ---------------- 特殊方法 ------------------
+type DeviceData_T struct {
+	T_name    string    // 标题
+	T_id      int       // ID
+	T_t       float32   // 温度
+	T_rh      float32   // 湿度
+	T_Tlower  float32   // 湿度
+	T_Tupper  float32   // 湿度
+	T_RHlower float32   // 湿度
+	T_RHupper float32   // 湿度
+	T_Site    string    // GPS
+	T_Dattery int       // 电量
+	T_time    time.Time // 采集时间
+}
+
+// 添加
+func Add_DeviceData(SN string, v DeviceData_T) bool {
+	//if(conf.Test_server){
+	//	fmt.Println("Add_DeviceData:",SN , t_name , t_id , t_t , t_rh , t_tl , t_tu , t_rhl , t_rhu , t_site , t_battery , t_time)
+	//	return true
+	//}
+
+	key_time := SN + "|" + strconv.Itoa(v.T_id) + "|" + v.T_time.Format("2006-01-02 15:04:05")
+	fmt.Println(key_time)
+	if redisCache_DeviceData.IsExist(key_time) {
+		//println("找到key:",key)
+		return true
+	}
+
+	o := orm.NewOrm()
+
+	// 检查 超过时间,查询 数据库
+	logs.Println("Add_DeviceData 时间差s:", time.Now().Unix()-v.T_time.Unix())
+	if time.Now().Unix()-v.T_time.Unix() >= 60*40 {
+		// 查看是否 有记录
+		var maps_z []orm2.ParamsList
+		sql_c := "SELECT COUNT(ID) FROM Z_DeviceData_" + SN + " WHERE t_time = '" + v.T_time.Format("2006-01-02 15:04:05") + "' AND t_id = " + strconv.Itoa(v.T_id)
+		logs.Println("检查 超过时间,查询 数据库 SQL:", sql_c)
+		_, err := o.Raw(sql_c).ValuesList(&maps_z)
+		if err != nil {
+			logs.Println(err)
+			return false
+		}
+		//fmt.Println("maps_z[0][0]:",maps_z[0][0])
+		if lib.To_int(maps_z[0][0]) > 0 {
+			logs.Println("存在记录,跳过!")
+			return true
+		}
+	}
+
+	T_Tlower := strconv.FormatFloat(float64(v.T_Tlower), 'f', -1, 64)
+	T_Tupper := strconv.FormatFloat(float64(v.T_Tupper), 'f', -1, 64)
+	T_RHlower := strconv.FormatFloat(float64(v.T_RHlower), 'f', -1, 64)
+	T_RHupper := strconv.FormatFloat(float64(v.T_RHupper), 'f', -1, 64)
+
+	// 开始插入数据
+	sql := "INSERT INTO Z_DeviceData_" + SN + " (`t_name`, `t_id`, `t_t`, `t_rh`, `t_tl`,`t_tu`,`t_rhl`,`t_rhu`, `t_site`,`t_battery`, `t_time`) " +
+		"VALUES ('" + v.T_name + "'," + strconv.Itoa(v.T_id) + ", " + lib.To_string(v.T_t) + ", " + lib.To_string(v.T_rh) + "," + T_Tlower + "," + T_Tupper + "," + T_RHlower + "," + T_RHupper + ", '" + v.T_Site + "'," + strconv.Itoa(v.T_Dattery) + ", '" + v.T_time.Format("2006-01-02 15:04:05") + "')"
+	//  这里有时间优化  用于一次 prepare 多次 exec,以提高批量执行的速度
+	fmt.Println(sql)
+	res, err := o.Raw(sql).Exec()
+	if err != nil {
+		fmt.Println(err)
+		return false
+	}
+	res.RowsAffected()
+	// 存在 写入 redis
+	Redis_Set_DeviceData_Time(key_time)
+
+	return true
+}
 
 
+///---------------
 type DeviceData_ struct {
 type DeviceData_ struct {
 	T_name    string  `orm:"column(t_name);size(256);null"`        // 标题
 	T_name    string  `orm:"column(t_name);size(256);null"`        // 标题
 	T_sn      string  `orm:"column(t_sn);size(256);null"`          // 标题
 	T_sn      string  `orm:"column(t_sn);size(256);null"`          // 标题

+ 3 - 1
models/Device/DeviceSensor.go

@@ -455,7 +455,9 @@ func Read_DeviceSensor_class_ALL_1(user_ Admin.Admin, T_Calss_id int, page int,
 	var r []DeviceSensor
 	var r []DeviceSensor
 	cond := orm.NewCondition()
 	cond := orm.NewCondition()
 	cond1 := cond.And("T_Bind__icontains", T_Bind).And("T_Calss__icontains", T_Calss).And("T_sn__icontains", SN_type).And("T_sn__icontains", T_sn).And("T_name__icontains", T_name).And("T_datashow", 1) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
 	cond1 := cond.And("T_Bind__icontains", T_Bind).And("T_Calss__icontains", T_Calss).And("T_sn__icontains", SN_type).And("T_sn__icontains", T_sn).And("T_name__icontains", T_name).And("T_datashow", 1) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
-
+	if len(T_sn) < 6 {
+		cond1 = cond.AndCond(cond1).AndCond(cond.And("T_give", 1))
+	}
 	// 非内部权限
 	// 非内部权限
 	println("user_.Admin_power:", user_.Admin_power)
 	println("user_.Admin_power:", user_.Admin_power)
 	if len(T_sn) < 6 {
 	if len(T_sn) < 6 {

+ 20 - 5
models/Device/DeviceWarning.go

@@ -32,6 +32,7 @@ type DeviceWarning struct {
 
 
 	T_Ut   time.Time `orm:"type(timestamp);null;"` // 采集时间
 	T_Ut   time.Time `orm:"type(timestamp);null;"` // 采集时间
 	T_Text string    `orm:"size(256);null"`        // 备注
 	T_Text string    `orm:"size(256);null"`        // 备注
+	T_Log  string    `orm:"type(text);null"`       // 处理日志
 
 
 	T_State    int       `orm:"size(2);1"`                                             // 0 删除   1 正常
 	T_State    int       `orm:"size(2);1"`                                             // 0 删除   1 正常
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
@@ -73,6 +74,16 @@ func Add_DeviceWarning(m DeviceWarning) (id int64, err error) {
 }
 }
 
 
 // 修改
 // 修改
+func Update_DeviceWarning(r DeviceWarning, cols ...string) bool {
+	o := orm.NewOrm()
+	if num, err := o.Update(&r, cols...); err == nil {
+		fmt.Println("Number of records updated in database:", num)
+		return true
+	}
+	return false
+}
+
+// 修改
 func Update_DeviceWarning_ById(m DeviceWarning) (err error) {
 func Update_DeviceWarning_ById(m DeviceWarning) (err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	v := DeviceWarning{Id: m.Id}
 	v := DeviceWarning{Id: m.Id}
@@ -80,7 +91,7 @@ func Update_DeviceWarning_ById(m DeviceWarning) (err error) {
 	if err = o.Read(&v); err == nil {
 	if err = o.Read(&v); err == nil {
 		var num int64
 		var num int64
 		m.T_State = 2
 		m.T_State = 2
-		if num, err = o.Update(&m, "T_Text", "T_State"); err == nil {
+		if num, err = o.Update(&m, "T_Text"); err == nil {
 			fmt.Println("Number of records updated in database:", num)
 			fmt.Println("Number of records updated in database:", num)
 		}
 		}
 	}
 	}
@@ -93,8 +104,8 @@ func Update_DeviceWarning_Delete(m DeviceWarning) (err error) {
 	v := DeviceWarning{Id: m.Id}
 	v := DeviceWarning{Id: m.Id}
 	// ascertain id exists in the database
 	// ascertain id exists in the database
 	if err = o.Read(&v); err == nil {
 	if err = o.Read(&v); err == nil {
-		var num int64
-		if num, err = o.Delete(&m); err == nil {
+		v.T_State = 0
+		if num, err := o.Update(&v, "T_State"); err == nil {
 			fmt.Println("Number of records updated in database:", num)
 			fmt.Println("Number of records updated in database:", num)
 		}
 		}
 	}
 	}
@@ -128,10 +139,14 @@ func Read_DeviceWarning_1(user_ Admin.Admin, page int, T_sn string, T_Name strin
 	fmt.Println("T_Bind:", T_Bind)
 	fmt.Println("T_Bind:", T_Bind)
 
 
 	cond := orm.NewCondition()
 	cond := orm.NewCondition()
-	cond1 := cond.And("T_Bind__icontains", T_Bind)
 
 
+	cond1 := cond.And("T_State__gt", 0)
+
+	if len(T_Bind) > 1 {
+		cond1 = cond.AndCond(cond1).And("T_Bind__icontains", T_Bind)
+	}
 	if len(T_Name) > 1 {
 	if len(T_Name) > 1 {
-		cond1 = cond.AndCond(cond.Or("T_Name__icontains", T_Name).Or("T_Title__icontains", T_Name).Or("T_Addr__icontains", T_Name).Or("T_sn__icontains", T_Name))
+		cond1 = cond.AndCond(cond1).AndCond(cond.Or("T_Name__icontains", T_Name).Or("T_Title__icontains", T_Name).Or("T_Addr__icontains", T_Name).Or("T_sn__icontains", T_Name))
 	}
 	}
 
 
 	if len(T_sn) > 1 {
 	if len(T_sn) > 1 {

+ 13 - 12
routers/Data.go

@@ -14,18 +14,19 @@ func init() {
 	//-----------
 	//-----------
 	beego.Router("/Data/Device_Sensor", &controllers.DataController{}, "*:Device_Sensor") // 设置 设备参数
 	beego.Router("/Data/Device_Sensor", &controllers.DataController{}, "*:Device_Sensor") // 设置 设备参数
 
 
-	beego.Router("/Data/DataReal_html", &controllers.DataController{}, "*:DataReal_html")                           // 获取 基本信息
-	beego.Router("/Data/DataRealCalss_html", &controllers.DataController{}, "*:DataRealCalss_html")                 // 获取 基本信息
-	beego.Router("/Data/DataList_html", &controllers.DataController{}, "*:DataList_html")                           // 获取 基本信息
-	beego.Router("/Data/DataLine_html", &controllers.DataController{}, "*:DataLine_html")                           // 获取 基本信息
-	beego.Router("/Data/DataMap_html", &controllers.DataController{}, "*:DataMap_html")                             // 获取 基本信息
-	beego.Router("/Data/Device_Sensor_List", &controllers.DataController{}, "*:Device_Sensor_List")                 // 设置 设备参数
-	beego.Router("/Data/Device_Sensor_Data", &controllers.DataController{}, "*:Device_Sensor_Data")                 // 设置 设备参数
-	beego.Router("/Data/Device_Sensor_Data_More", &controllers.DataController{}, "*:Device_Sensor_Data_More")       // 设置 设备参数
-	beego.Router("/Data/Device_Sensor_Data_Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel")     // 设置 设备参数
-	beego.Router("/Data/Device_Sensor_Data_Excel_m", &controllers.DataController{}, "*:Device_Sensor_Data_Excel_m") // 设置 设备参数
-	beego.Router("/Data/Device_Sensor_Data_PDF", &controllers.DataController{}, "*:Device_Sensor_Data_PDF")         // 设置 设备参数
-	beego.Router("/Data/DataPlane", &controllers.DataController{}, "*:DataPlane")                                   // 设置 设备参数
+	beego.Router("/Data/DataReal_html", &controllers.DataController{}, "*:DataReal_html")                                // 获取 基本信息
+	beego.Router("/Data/DataRealCalss_html", &controllers.DataController{}, "*:DataRealCalss_html")                      // 获取 基本信息
+	beego.Router("/Data/DataList_html", &controllers.DataController{}, "*:DataList_html")                                // 获取 基本信息
+	beego.Router("/Data/DataLine_html", &controllers.DataController{}, "*:DataLine_html")                                // 获取 基本信息
+	beego.Router("/Data/DataMap_html", &controllers.DataController{}, "*:DataMap_html")                                  // 获取 基本信息
+	beego.Router("/Data/Device_Sensor_List", &controllers.DataController{}, "*:Device_Sensor_List")                      // 设置 设备参数
+	beego.Router("/Data/Device_Sensor_Data", &controllers.DataController{}, "*:Device_Sensor_Data")                      // 设置 设备参数
+	beego.Router("/Data/Device_Sensor_Data_More", &controllers.DataController{}, "*:Device_Sensor_Data_More")            // 设置 设备参数
+	beego.Router("/Data/Device_Sensor_Data_More_ColdVerify", &controllers.DataController{}, "*:Device_Sensor_Data_More") // 设置 设备参数
+	beego.Router("/Data/Device_Sensor_Data_Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel")          // 设置 设备参数
+	beego.Router("/Data/Device_Sensor_Data_Excel_m", &controllers.DataController{}, "*:Device_Sensor_Data_Excel_m")      // 设置 设备参数
+	beego.Router("/Data/Device_Sensor_Data_PDF", &controllers.DataController{}, "*:Device_Sensor_Data_PDF")              // 设置 设备参数
+	beego.Router("/Data/DataPlane", &controllers.DataController{}, "*:DataPlane")                                        // 设置 设备参数
 
 
 	beego.Router("/Data/DataScreen", &controllers.DataController{}, "*:DataScreen")                           // 设置 设备参数
 	beego.Router("/Data/DataScreen", &controllers.DataController{}, "*:DataScreen")                           // 设置 设备参数
 	beego.Router("/Data/DataScreen_Data", &controllers.DataController{}, "*:DataScreen_Data")                 // 设置 设备参数
 	beego.Router("/Data/DataScreen_Data", &controllers.DataController{}, "*:DataScreen_Data")                 // 设置 设备参数

+ 3 - 0
routers/Device.go

@@ -60,6 +60,7 @@ func init() {
 	beego.Router("/Device/DeviceWarning_List_html", &controllers.DeviceController{}, "*:DeviceWarning_List_html")         // 获取未读消息
 	beego.Router("/Device/DeviceWarning_List_html", &controllers.DeviceController{}, "*:DeviceWarning_List_html")         // 获取未读消息
 	beego.Router("/Device/DeviceWarning_List", &controllers.DeviceController{}, "*:DeviceWarning_List")                   // 获取未读消息
 	beego.Router("/Device/DeviceWarning_List", &controllers.DeviceController{}, "*:DeviceWarning_List")                   // 获取未读消息
 	beego.Router("/Device/DeviceWarning_", &controllers.DeviceController{}, "*:DeviceWarning_")                           // 获取未读消息
 	beego.Router("/Device/DeviceWarning_", &controllers.DeviceController{}, "*:DeviceWarning_")                           // 获取未读消息
+	beego.Router("/Device/DeviceWarning_log", &controllers.DeviceController{}, "*:DeviceWarning_log")                     // 获取未读消息
 	beego.Router("/Device/DeviceWarning_M", &controllers.DeviceController{}, "*:DeviceWarning_M")                         // 获取未读消息
 	beego.Router("/Device/DeviceWarning_M", &controllers.DeviceController{}, "*:DeviceWarning_M")                         // 获取未读消息
 	beego.Router("/Device/DeviceWarning_Post", &controllers.DeviceController{}, "*:DeviceWarning_Post")                   // 获取未读消息
 	beego.Router("/Device/DeviceWarning_Post", &controllers.DeviceController{}, "*:DeviceWarning_Post")                   // 获取未读消息
 	beego.Router("/Device/DeviceWarning_Data_Excel", &controllers.DeviceController{}, "*:DeviceWarning_Data_Excel")       // 获取未读消息
 	beego.Router("/Device/DeviceWarning_Data_Excel", &controllers.DeviceController{}, "*:DeviceWarning_Data_Excel")       // 获取未读消息
@@ -72,4 +73,6 @@ func init() {
 	beego.Router("/Device/DeviceTask_List", &controllers.DeviceController{}, "*:DeviceTask_List") // 设置 设备参数
 	beego.Router("/Device/DeviceTask_List", &controllers.DeviceController{}, "*:DeviceTask_List") // 设置 设备参数
 	beego.Router("/Device/DeviceTask_Post", &controllers.DeviceController{}, "*:DeviceTask_Post") // 设置 设备参数
 	beego.Router("/Device/DeviceTask_Post", &controllers.DeviceController{}, "*:DeviceTask_Post") // 设置 设备参数
 
 
+	beego.Router("/Device/DeviceData_Add", &controllers.DeviceController{}, "*:DeviceData_Add") // 设置 设备参数
+
 }
 }

+ 1 - 0
server.pid

@@ -0,0 +1 @@
+15104

+ 4 - 0
tests/default_test.go

@@ -1,10 +1,14 @@
 package test
 package test
 
 
 import (
 import (
+	"fmt"
+	"strings"
 	"testing"
 	"testing"
 )
 )
 
 
 // TestBeego is a sample to run an endpoint test
 // TestBeego is a sample to run an endpoint test
 func TestBeego(t *testing.T) {
 func TestBeego(t *testing.T) {
 
 
+	fmt.Println(strings.Split("HG324234234", "_")) //打印结果:2017-04-11 13:24:04
+
 }
 }

+ 5 - 1
views/Device/Device-.html

@@ -81,7 +81,10 @@
                         function(data) {
                         function(data) {
                             console.log("=== submit(add) ==");
                             console.log("=== submit(add) ==");
                             console.log(data);
                             console.log(data);
-
+                            var loading = layer.load(0, {
+                                shade: false,
+                                time: 99*1000
+                            });
                             $.ajax({
                             $.ajax({
                                 type: 'POST',
                                 type: 'POST',
                                 url: 'Device_Add',//发送请求
                                 url: 'Device_Add',//发送请求
@@ -91,6 +94,7 @@
                                 },
                                 },
                                 success: function(result) {
                                 success: function(result) {
                                     console.log(result)
                                     console.log(result)
+                                    layer.close(loading)
                                     if(result.Code == 200){
                                     if(result.Code == 200){
                                         layer.msg("操作成功", {
                                         layer.msg("操作成功", {
                                             icon: 1,
                                             icon: 1,

+ 16 - 3
views/Device/Device.html

@@ -71,7 +71,16 @@
                                             {{else}}
                                             {{else}}
                                             <span style="color: #ff7d7d">设备无网络</span>
                                             <span style="color: #ff7d7d">设备无网络</span>
                                             {{end}}
                                             {{end}}
-
+                                        {{end}}
+                                        {{$elem.T_online_4g }}
+                                        {{if eq 1 $elem.T_online_4g }}
+                                            <span style="color: #00FF00">[4G] </span>
+                                        {{end}}
+                                        {{if eq 2 $elem.T_online_4g }}
+                                            <span style="color: #d2d2d2">[4G] </span>
+                                        {{end}}
+                                        {{if eq 3 $elem.T_online_4g }}
+                                        <span style="color: #ff7d7d">[4G] </span>
                                         {{end}}
                                         {{end}}
                                     </div>
                                     </div>
                                     <div style="float: left;margin-left: 20px;margin-top: 4px;font-size: 15px">监控状态:
                                     <div style="float: left;margin-left: 20px;margin-top: 4px;font-size: 15px">监控状态:
@@ -224,8 +233,8 @@
                 console.log(divs[i])
                 console.log(divs[i])
                 divs[i].textContent = parseFloat(divs[i].textContent).toFixed(1)
                 divs[i].textContent = parseFloat(divs[i].textContent).toFixed(1)
             }
             }
-
         }
         }
+
         layui.use(['laydate', 'form', 'layer'],
         layui.use(['laydate', 'form', 'layer'],
             function() {
             function() {
                 var laydate = layui.laydate;
                 var laydate = layui.laydate;
@@ -306,6 +315,11 @@
                 '<p>1、通讯正常</p>' +
                 '<p>1、通讯正常</p>' +
                 '<p>2、设备已关机</p>' +
                 '<p>2、设备已关机</p>' +
                 '<p>3、设备无网络(设备信号弱,或无信号)</p>' +
                 '<p>3、设备无网络(设备信号弱,或无信号)</p>' +
+                '<p>[4G]标签:</p>' +
+                '<p>[4G] 不显示,代表没有4G备用网络 </p>' +
+                '<p><span style="color: #00FF00">[4G] </span> 绿色,连接正常</p>' +
+                '<p><span style="color: #d2d2d2">[4G] </span> 灰色,连接断开</p>' +
+                '<p><span style="color: #ff7d7d">[4G] </span> 红色,连接异常</p>' +
                 '<h2>监控状态:</h2>' +
                 '<h2>监控状态:</h2>' +
                 '<p>1、监控状态</p>' +
                 '<p>1、监控状态</p>' +
                 '<p>2、未监控</p>' +
                 '<p>2、未监控</p>' +
@@ -315,7 +329,6 @@
         });
         });
     }
     }
 
 
-
     </script>
     </script>
 </html>
 </html>
 
 

+ 2 - 2
views/Device/DeviceLogs.html

@@ -26,14 +26,14 @@
                                 <thead>
                                 <thead>
                                     <tr>
                                     <tr>
                                         <th>内容</th>
                                         <th>内容</th>
-<!--                                        <th>时间</th>-->
+                                        <th>时间</th>
                                     </tr>
                                     </tr>
                                 </thead>
                                 </thead>
                                 <tbody>
                                 <tbody>
                                 {{range $index, $elem := .List}}
                                 {{range $index, $elem := .List}}
                                     <tr>
                                     <tr>
                                         <td>{{$elem.Logs_Txt}}</td>
                                         <td>{{$elem.Logs_Txt}}</td>
-<!--                                        <td>{{$elem.CreateTime}}</td>-->
+                                        <td>{{$elem.CreateTime}}</td>
                                     </tr>
                                     </tr>
 
 
                                 {{end}}
                                 {{end}}

+ 29 - 0
views/Device/DeviceWarning-log.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="x-admin-sm">
+    
+    <head>
+        <meta charset="UTF-8">
+        <meta name="renderer" content="webkit">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
+        <link rel="stylesheet" href="https://osscold.baozhida.cn/css/font.css">
+        <link rel="stylesheet" href="https://osscold.baozhida.cn/css/xadmin.css">
+        <link rel="stylesheet" href="https://osscold.baozhida.cn/lib/layui/layui.css">
+        <script type="text/javascript" src="https://osscold.baozhida.cn/lib/layui/layui.js" charset="utf-8"></script>
+        <script type="text/javascript" src="https://osscold.baozhida.cn/js/xadmin.js"></script>
+        <!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
+        <!--[if lt IE 9]>
+            <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
+            <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
+        <![endif]--></head>
+    
+    <body>
+        <div class="layui-fluid">
+            <div class="layui-row">
+                {{str2html  .T_Log}}
+            </div>
+        </div>
+
+    </body>
+
+</html>

+ 6 - 0
views/Device/DeviceWarning.html

@@ -108,6 +108,12 @@
                                                onclick="member_del('{{$elem.Id}}')" >&#xe640; 删除报警</i>
                                                onclick="member_del('{{$elem.Id}}')" >&#xe640; 删除报警</i>
                                             {{end}}
                                             {{end}}
 
 
+                                            {{if le $.Admin_r.Admin_power 6 }}
+
+                                            <i class="layui-icon" style="margin-right: 10px;float: left;color: #1E9FFF"
+                                               onclick="xadmin.open('处理记录','DeviceWarning_log?id={{$elem.Id}}',600,'')"  >&#xe60a; 处理记录</i>
+                                            {{end}}
+
                                             <div style="float: left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:120px;">{{$elem.T_Text}}</div>
                                             <div style="float: left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:120px;">{{$elem.T_Text}}</div>
 
 
 
 

+ 2 - 1
views/login.html

@@ -23,7 +23,7 @@
 </head>
 </head>
 <body class="login-bg">
 <body class="login-bg">
 
 
-<div class="login layui-anim" style="margin-left: 60%;margin-top: 15%;">
+<div class="login layui-anim" style="margin-top: 15%;">
     <div class="message">宝智达 v2.0-管理登录</div>
     <div class="message">宝智达 v2.0-管理登录</div>
     <div id="darkbannerwrap"></div>
     <div id="darkbannerwrap"></div>
 
 
@@ -35,6 +35,7 @@
         <input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit">
         <input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit">
         <hr class="hr20" >
         <hr class="hr20" >
     </form>
     </form>
+
 </div>
 </div>
 
 
 <script>
 <script>