Browse Source

add: 数据展示数据备份

zoie 2 years ago
parent
commit
916fb05752

+ 1 - 0
.gitignore

@@ -35,3 +35,4 @@ main
 Cold_Api6200
 Makefile
 ofile
+backup

+ 31 - 0
Nats/Nats.go

@@ -12,6 +12,7 @@ import (
 	"github.com/astaxie/beego/cache"
 	"github.com/nats-io/nats.go"
 	"github.com/vmihailenco/msgpack/v5"
+	"strconv"
 	"strings"
 )
 
@@ -170,6 +171,36 @@ func NatsInit() {
 		b, _ := msgpack.Marshal(&t_R)
 		_ = lib.Nats.Publish(m.Reply, b)
 	})
+	// 请求-响应 获取公司
+	_, _ = lib.Nats.Subscribe("Cold_ReadCompanyByT_id", func(m *nats.Msg) {
+		fmt.Printf("Cold_ReadCompanyByT_id message: %s\n", string(m.Data))
+
+		type T_R struct {
+			Code int16           `xml:"Code"`
+			Msg  string          `xml:"Msg"`
+			Data Account.Company `xml:"Data"` // 泛型
+		}
+
+		var t_R T_R
+		id, _ := strconv.Atoi(string(m.Data))
+
+		company, err := Account.Read_Company_ById(id)
+
+		if err != nil {
+			t_R.Code = 202
+			t_R.Msg = err.Error()
+			b, _ := msgpack.Marshal(&t_R)
+			_ = lib.Nats.Publish(m.Reply, b)
+		}
+
+		t_R.Code = 200
+		t_R.Msg = "ok"
+		t_R.Data = company
+
+		b, _ := msgpack.Marshal(&t_R)
+		_ = lib.Nats.Publish(m.Reply, b)
+	})
+
 	// 请求-响应 获取所有用户列表
 	_, _ = lib.Nats.Subscribe("Cold_User_UserListAll", func(m *nats.Msg) {
 

+ 1 - 1
Nats/NatsServer/NatsQiniu.go

@@ -106,7 +106,7 @@ func Qiniu_UploadFile(localFile string, name string) (string, bool) {
 	}
 	err = formUploader.PutFile(context.Background(), &ret, upToken, name, localFile, &putExtra)
 	if err != nil {
-		logs.Println("七牛云", "上传文件失败"+localFile, err.Error())
+		logs.Println("七牛云", "上传文件失败 "+localFile, err.Error())
 		return "", false
 	}
 	fmt.Println(ret.Bucket, ret.Key, ret.Fsize, ret.Hash, ret.Name)

+ 1 - 1
conf/app.conf

@@ -39,4 +39,4 @@ Qiniu_Url = "https://coldoss.coldbaozhida.com/"
 Panel_url = "http://127.0.0.1:6204/Cold_Panel"
 
 FilterExcludeURL = /Login_verification
-FilterOnlyLoginCheckURL = /Menu/List,/User/Info,/User/Home,/User/Post,/UpFileToken,/User/WxQRCode
+FilterOnlyLoginCheckURL = /Menu/List,/User/Info,/User/Home,/User/Post,/UpFileToken,/User/WxQRCode,/Company/Get

+ 202 - 40
controllers/Data.go

@@ -4,9 +4,9 @@ import (
 	"Cold_Api/Nats/NatsServer"
 	"Cold_Api/conf"
 	"Cold_Api/controllers/lib"
+	"Cold_Api/logs"
 	"Cold_Api/models/Account"
 	"Cold_Api/models/Device"
-	"Cold_Api/models/RawSql"
 	"fmt"
 	beego "github.com/beego/beego/v2/server/web"
 	"github.com/signintech/gopdf"
@@ -14,7 +14,6 @@ import (
 	"math"
 	"os"
 	"strconv"
-	"strings"
 	"time"
 )
 
@@ -449,7 +448,7 @@ func (c *DataController) Device_Sensor_Data_PDF() {
 	Time_end := c.GetString("Time_end")
 
 	if len(T_snid) < 10 {
-		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_snid Err!"}
 		c.ServeJSON()
 		return
 	}
@@ -490,10 +489,12 @@ func (c *DataController) Device_Sensor_Data_PDF() {
 	//use path
 	//pdf.Image("logo.png", 100, 50, &gopdf.Rect{W: 50, H: 50})
 
-	textw, _ := pdf.MeasureTextWidth(c.Admin_r.T_name)
+	company, _ := Account.Read_Company_ById(c.T_pid)
+
+	textw, _ := pdf.MeasureTextWidth(company.T_name)
 	pdf.SetX((595 / 2) - (textw / 2))
 	pdf.SetY(40)
-	pdf.Text(c.Admin_r.T_name)
+	pdf.Text(company.T_name)
 
 	// 线
 	pdf.SetLineWidth(2)
@@ -594,50 +595,211 @@ func (c *DataController) Device_Sensor_Data_PDF() {
 
 }
 
-// 大数据平台
-func (c *DataController) Raw() {
-	admin_r := c.Admin_r
-
-	T_SQL := c.GetString("T_SQL")
-
-	T_SQL_ := strings.ToLower(T_SQL)
-	if strings.Contains(T_SQL_, ";") ||
-		//strings.Contains(T_SQL, "Admin")||
-		//strings.Contains(T_SQL, "Device ")||
-		//strings.Contains(T_SQL, "DeviceParameter")||
-		//strings.Contains(T_SQL, "DeviceSensor")||
-		//strings.Contains(T_SQL, "DeviceSnOld")||
-		//strings.Contains(T_SQL, "DeviceTask")||
-		//strings.Contains(T_SQL, "DeviceWarning")||
-		strings.Contains(T_SQL, "Logs") ||
-		strings.Contains(T_SQL, "SqlLogs") ||
-		strings.Contains(T_SQL, "Tokey") ||
-		strings.Contains(T_SQL, "UserLogs") ||
-		strings.Contains(T_SQL_, "show") ||
-		strings.Contains(T_SQL_, "create") ||
-		strings.Contains(T_SQL_, "drop") ||
-		strings.Contains(T_SQL_, "desc") ||
-		strings.Contains(T_SQL_, "alter") ||
-		strings.Contains(T_SQL_, "insert") ||
-		strings.Contains(T_SQL_, "update") ||
-		strings.Contains(T_SQL_, "delete") {
-		RawSql.Add_SqlLogs(admin_r.T_uuid, "Err:"+admin_r.T_user, T_SQL)
-		c.Data["json"] = lib.JSONS{Code: 201, Msg: "Err SQL!", Data: admin_r.T_name + " :你的行为 也被记录"}
+// 数据备份
+func (c *DataController) Device_Sensor_Data_BackUp() {
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	T_snid := c.GetString("T_snid")
+	Time_start := c.GetString("Time_start")
+	Time_end := c.GetString("Time_end")
+
+	if len(T_snid) < 10 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_snid Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if _, is := lib.DateStrToDate(Time_start); !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	if _, is := lib.DateStrToDate(Time_end); !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	Time_start += " 00:00:00"
+	Time_end += " 23:59:59"
+
+	var r_jsons lib.R_JSONS
+
+	r_jsons.Data, r_jsons.Num = Device.Read_DeviceData_BackUp_List(T_snid, Time_start, Time_end, 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
+}
+
+// 数据备份pdf
+func (c *DataController) Device_Sensor_Data_BackUp_PDF() {
+	T_sn := c.GetString("T_sn")
+	T_id, _ := c.GetInt("T_id")
+	T_date := c.GetString("T_date")
+
+	T_snid := fmt.Sprintf("%s,%d", T_sn, T_id)
+
+	date, is := lib.DateStrToDate(T_date)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	Time_start := T_date + " 00:00:00"
+	Time_end := T_date + " 23:59:59"
+
+	var DeviceSensor_data []Device.DeviceData_R
+
+	DeviceSensor_data, _ = Device.Read_DeviceData_By_T_snid_List(T_snid, Time_start, Time_end, 0, 9999)
+
+	var err error
+	pdf := &gopdf.GoPdf{}
+	pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}}) //595.28, 841.89 = A4
+	//err = GetFont(pdf, "LiberationSerif-Regular.ttf")
+	//if err != nil {
+	//	log.Fatalln(err)
+	//}
+	//err = pdf.SetFont("Ubuntu-L", "", 14)
+	//if err != nil {
+	//	log.Fatalln(err)
+	//}
+
+	err = pdf.AddTTFFont("simsun", "static/fonts/三极行楷简体-粗.ttf")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "ok!", Data: err}
+		c.ServeJSON()
+		return
+	}
+	err = pdf.SetFont("simsun", "", 24)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 205, Msg: "ok!", Data: err}
+		c.ServeJSON()
+		return
+	}
+
+	pdf.SetGrayFill(0.5)
+
+	pdf.SetMargins(0, 20, 0, 20)
+	pdf.AddPage()
+
+	//use path
+	//pdf.Image("logo.png", 100, 50, &gopdf.Rect{W: 50, H: 50})
+
+	company, _ := Account.Read_Company_ById(c.T_pid)
+
+	textw, _ := pdf.MeasureTextWidth(company.T_name)
+	pdf.SetX((595 / 2) - (textw / 2))
+	pdf.SetY(40)
+	pdf.Text(company.T_name)
+
+	// 线
+	pdf.SetLineWidth(2)
+	pdf.SetLineType("dashed")
+	pdf.Line(10, 60, 585, 60)
+
+	err = pdf.AddTTFFont("wts", "static/fonts/MiSans-Medium.ttf")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 206, Msg: "ok!", Data: err}
 		c.ServeJSON()
 		return
 	}
+	err = pdf.SetFont("wts", "", 12)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "ok!", Data: err}
+		c.ServeJSON()
+		return
+	}
+	//fmt.Sprintf(" %.1f ", v.T_t)
+	lib.RectFillColor(pdf, "历史数据["+Time_start+" / "+Time_end+"]", 14, 22, 80, 550, 40, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 
-	if //!strings.Contains(T_SQL, "z_device_data_") ||
-	!strings.Contains(T_SQL_, "select") {
-		RawSql.Add_SqlLogs(admin_r.T_uuid, "Err:"+admin_r.T_user, T_SQL)
-		c.Data["json"] = lib.JSONS{Code: 201, Msg: "Err SQL!", Data: admin_r.T_name + " :你的行为 也被记录"}
+	lib.RectFillColor(pdf, "序号", 12, 22, 120, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	lib.RectFillColor(pdf, "传感器名称", 12, 52, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	lib.RectFillColor(pdf, "温度℃", 12, 152, 120, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+
+	lib.RectFillColor(pdf, "湿度%", 12, 212, 120, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+
+	lib.RectFillColor(pdf, "温度范围", 12, 272, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	lib.RectFillColor(pdf, "湿度范围", 12, 362, 120, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	lib.RectFillColor(pdf, "记录时间", 12, 452, 120, 120, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+
+	var y float64 = 140
+
+	err = pdf.SetFont("wts", "", 10)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "ok!", Data: err}
 		c.ServeJSON()
 		return
 	}
+	for i, v := range DeviceSensor_data {
+		text := fmt.Sprintf(" %d ", i+1)
+		var textH float64 = 25 // if text height is 25px.
+		pdf.SetNewY(y, textH)
+		y = pdf.GetY()
+		//pdf.SetX(x) // must after pdf.SetNewY() called.
+		//err = pdf.Text(text)
+		//if err != nil {
+		//	log.Fatalln(err)
+		//}
+
+		T_t := fmt.Sprintf(" %.1f ", v.T_t)
+		T_rh := fmt.Sprintf(" %.1f ", v.T_rh)
+		T_Tlu := fmt.Sprintf(" %.1f ~ %.1f ", v.T_tl, v.T_tu)
+		T_Rlu := fmt.Sprintf(" %.1f ~ %.1f ", v.T_rhl, v.T_rhu)
+		T_time := fmt.Sprintf("%s", v.T_time)
+		//if user_r.Admin_rh == 0 && strings.Contains(v.T_sn, "YD") {
+		//	T_rh = "-"
+		//	T_Rlu = "-"
+		//}
+
+		lib.RectFillColor(pdf, text, 10, 22, y, 30, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		lib.RectFillColor(pdf, v.T_name, 10, 52, y, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		lib.RectFillColor(pdf, T_t, 10, 152, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		lib.RectFillColor(pdf, T_rh, 10, 212, y, 60, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+
+		lib.RectFillColor(pdf, T_Tlu, 10, 272, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+
+		lib.RectFillColor(pdf, T_Rlu, 10, 362, y, 90, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 
-	RawSql.Add_SqlLogs(admin_r.T_uuid, "ok", T_SQL)
+		lib.RectFillColor(pdf, T_time, 10, 452, y, 120, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		y += 20
+	}
 
-	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Device.Read_SqlRaw(T_SQL)}
+	deviceSensor, _ := Device.Read_DeviceSensor_ByT_sn(T_sn, T_id)
+	filenameStr := fmt.Sprintf("backup/sn/%s_%s_%s.pdf", lib.GetRandstring(8, "0123456789", 0), date.Format("2006_01_02"), deviceSensor.T_name)
+
+	err = pdf.WritePdf(filenameStr)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "ok!", Data: err}
+		c.ServeJSON()
+		return
+	}
+
+	// 上传 OSS
+	url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/"+filenameStr, filenameStr)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
+		c.ServeJSON()
+		return
+	}
+	//删除目录
+	err = os.Remove(filenameStr)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
 	c.ServeJSON()
 	return
 }

+ 2 - 2
controllers/Device.go

@@ -124,7 +124,7 @@ func (c *DeviceController) Device_Add() {
 		return
 	}
 
-	var_.T_devName = "等待设备上线.."
+	var_.T_devName = T_sn
 	// 创建数据库
 	if !Device.CREATE_DeviceData(T_sn) {
 		c.Data["json"] = lib.JSONS{Code: 302, Msg: "添加失败!"}
@@ -1208,7 +1208,7 @@ func (c *DeviceController) DeviceWarning_Data_Excel() {
 	// 循环写入数据
 	for _, v := range Device_data {
 		line++
-		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v.T_tp)
+		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), Warning.Read_WarningType_Get(v.T_tp))
 		f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_sn+"["+strconv.Itoa(v.Id)+"]")
 		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_D_name)
 		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_DS_name)

+ 25 - 2
controllers/User.go

@@ -76,6 +76,20 @@ func (c *UserController) Company_List() {
 	return
 }
 
+func (c *UserController) Company_Get() {
+
+	var r_jsons lib.R_JSONS
+	Company_r, err := Account.Read_Company_ById(c.T_pid)
+	if err != nil {
+		logs.Warning(lib.FuncName(), "获取公司信息失败", err)
+	}
+	r_jsons.Data = Account.CompanyToCompany_R(Company_r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
 func (c *UserController) Company_Add() {
 	T_mid, _ := c.GetInt("T_mid")
 	T_name := c.GetString("T_name")
@@ -1058,7 +1072,14 @@ func (c *UserController) Power_Del() {
 
 // 菜单列表
 func (c *UserController) User_Menu_List() {
-	var r_jsons lib.R_JSONS
+
+	type R_JSONS struct {
+		//必须的大写开头
+		Data       interface{}
+		Permission interface{}
+	}
+
+	var r_jsons R_JSONS
 	power, err := Account.Read_Power_ById(c.Admin_r.T_power)
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 200, Msg: "获取菜单失败"}
@@ -1066,7 +1087,9 @@ func (c *UserController) User_Menu_List() {
 		return
 	}
 	logs.Println("登录用户 菜单 pid 为:", c.T_pid)
-	r_jsons.Data = Account.Read_Menu_Bind_List(power.Id, power.T_menu, c.T_pid)
+	ret := Account.Read_Menu_Bind_List(power.Id, power.T_menu, c.T_pid)
+	r_jsons.Data = ret.Menu
+	r_jsons.Permission = ret.Permission
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
 	c.ServeJSON()

+ 12 - 0
controllers/lib/libString.go

@@ -50,6 +50,18 @@ func TimeStrToTime(T_time string) (time.Time, bool) {
 	return stamp, true
 }
 
+// 转化
+func DateStrToDate(T_date string) (time.Time, bool) {
+
+	stamp, err := time.Parse("2006-01-02", T_date)
+
+	if err != nil {
+		return time.Time{}, false
+	}
+
+	return stamp, true
+}
+
 func SplitStringIds(str string, prefix string) (r []string) {
 	Ids_str := strings.TrimRight(str, "|")
 	Ids := strings.Split(Ids_str, "|")

+ 7 - 1
main.go

@@ -4,7 +4,9 @@ import (
 	_ "Cold_Api/Nats"
 	"Cold_Api/conf"
 	"Cold_Api/controllers"
-	_ "Cold_Api/models/Product"
+	"Cold_Api/models/Device"
+	"Cold_Api/models/Product"
+	"Cold_Api/models/Warning"
 	"Cold_Api/routers"
 	_ "Cold_Api/routers"
 	"fmt"
@@ -56,6 +58,10 @@ func main() {
 
 	go controllers.DeviceRealTime() // 实时 数据
 
+	go Warning.Read_WarningType_All_Maps()   // 初始化报警类型
+	go Product.Read_ProductType_All_Map()    // 初始化产品类型
+	go Device.Read_DeviceSensorTypeAll_Map() // 初始化传感器类型
+
 	fmt.Println("======= beego.Run ======")
 	beego.Run()
 

+ 5 - 0
models/Account/Company.go

@@ -48,6 +48,9 @@ func CompanyToCompany_R(r Company) (v Company_R) {
 	v.Id = r.Id
 	v.T_mid = r.T_mid
 	v.T_name = r.T_name
+	v.T_plan = r.T_plan
+	v.T_data = r.T_data
+	v.T_v3d = r.T_v3d
 	return v
 }
 
@@ -205,7 +208,9 @@ func Read_Company_ById(Id int) (r Company, e error) {
 	e = qs.Filter("Id", Id).Filter("T_State", 1).One(&r)
 	if e != nil {
 		logs.Error("Read_Company_ById", e)
+		return
 	}
+	Redis_Company_Set(r) // Redis 更新缓存
 	return r, e
 }
 

+ 34 - 12
models/Account/Menu.go

@@ -11,6 +11,7 @@ import (
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -26,6 +27,11 @@ type Menu struct {
 	Children     []Menu `orm:"-"`
 }
 
+type Menu_Permission struct {
+	Menu       []Menu
+	Permission map[string]bool
+}
+
 func (t *Menu) TableName() string {
 	return "menu" // 数据库名称   // ************** 替换 FormulaList **************
 }
@@ -113,7 +119,7 @@ func Redis_API_DelK(key string) (err error) {
 	return
 }
 
-func Redis_Munu_Set(Power_Id, T_pid int, r []Menu) (err error) {
+func Redis_Munu_Set(Power_Id, T_pid int, r Menu_Permission) (err error) {
 	//json序列化
 	str, err := json.Marshal(r)
 	if err != nil {
@@ -132,7 +138,7 @@ func Redis_Munu_Set(Power_Id, T_pid int, r []Menu) (err error) {
 	return
 }
 
-func Redis_Menu_Get(Power_Id, T_pid int) (r []Menu, is bool) {
+func Redis_Menu_Get(Power_Id, T_pid int) (r Menu_Permission, is bool) {
 	key := strconv.Itoa(Power_Id) + "-Pid"
 	if T_pid == 0 {
 		key = strconv.Itoa(Power_Id)
@@ -144,12 +150,11 @@ func Redis_Menu_Get(Power_Id, T_pid int) (r []Menu, is bool) {
 		err := json.Unmarshal(v.([]byte), &r)
 		if err != nil {
 			logs.Error(lib.FuncName(), err)
-			return []Menu{}, false
+			return r, false
 		}
 		return r, true
 	}
-	//println("没有 找到key:",key)
-	return []Menu{}, false
+	return r, false
 }
 
 func Redis_Menu_DelK(Power_Id int) (err error) {
@@ -208,14 +213,14 @@ func Read_Menu_ById(Id int) (r Menu, e error) {
 }
 
 // 获取列表
-func Read_Menu_Bind_List(Power_Id int, Bind_Menu string, T_pid int) (maps []Menu) {
+func Read_Menu_Bind_List(Power_Id int, Bind_Menu string, T_pid int) (r Menu_Permission) {
 	if r, is := Redis_Menu_Get(Power_Id, T_pid); is {
 		return r
 	}
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
-
+	var maps []Menu
 	qs := o.QueryTable(new(Menu))
 	cond := orm.NewCondition()
 	cond = cond.And("T_State__gt", 0)
@@ -229,14 +234,16 @@ func Read_Menu_Bind_List(Power_Id int, Bind_Menu string, T_pid int) (maps []Menu
 			return
 		}
 		m := Menu_Call(maps, 0)
-		Redis_Munu_Set(Power_Id, T_pid, m)
-		return m
+		r.Menu = m
+		r.Permission = Get_Permission(maps)
+		Redis_Munu_Set(Power_Id, T_pid, r)
+		return r
 	}
 
 	list := lib.SplitStringToIntIds(Bind_Menu, "M")
 	AllIds := list
 	if err := recursiveMenu(T_pid, list, &AllIds); err != nil {
-		return maps
+		return
 	}
 
 	cond = cond.And("Id__in", lib.IntIdsDistinct(AllIds)).Or("T_State", 2)
@@ -249,8 +256,23 @@ func Read_Menu_Bind_List(Power_Id int, Bind_Menu string, T_pid int) (maps []Menu
 
 	m := Menu_Call(maps, 0)
 
-	Redis_Munu_Set(Power_Id, T_pid, m)
-	return m
+	r.Menu = m
+	r.Permission = Get_Permission(maps)
+
+	Redis_Munu_Set(Power_Id, T_pid, r)
+	return r
+}
+
+func Get_Permission(menu []Menu) (permission map[string]bool) {
+	permission = make(map[string]bool)
+	for _, v := range menu {
+
+		if strings.Contains(v.T_permission, ":") {
+
+			permission[v.T_permission] = true
+		}
+	}
+	return
 }
 
 // 获取MenuIds下父id

+ 106 - 17
models/Device/DeviceData.go

@@ -55,6 +55,14 @@ type DeviceData_R struct {
 	T_ish  int     // 湿度   1开启   2关闭
 }
 
+type DeviceData_BackUp struct {
+	T_sn   string
+	T_id   int    // 传感器id
+	T_name string // 传感器名称
+	T_date string // 采集日期
+	T_num  int    // 数据量
+}
+
 //func (t *DeviceData) TableName() string {
 //	return "DeviceData" // 数据库名称   // ************** 替换 FormulaList **************
 //}
@@ -285,21 +293,6 @@ func Read_DeviceData_ById_List(SN string, T_id int, Time_start_ string, Time_end
 	return r, key
 }
 
-func Read_SqlRaw(T_SQL string) []orm2.Params {
-	o := orm.NewOrm()
-	var lists []orm2.Params
-
-	fmt.Println(T_SQL)
-	_, err := o.Raw(T_SQL).Values(&lists)
-	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return lists
-	}
-
-	fmt.Println(T_SQL+":", len(lists))
-	return lists
-}
-
 func Read_SqlRawL(T_SQL string, T_data []string) (string, []orm2.Params) {
 	o := orm.NewOrm()
 	var lists []orm2.Params
@@ -432,7 +425,7 @@ func Read_DeviceData(T_sn string, T_id int) (t DeviceData_) {
 
 	o := orm.NewOrm()
 	var maps []DeviceData_
-	sql := "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + T_sn + " WHERE " + " t_id = " + strconv.Itoa(T_id) + " ORDER BY t_time1 DESC LIMIT 0,1"
+	sql := "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + T_sn + " WHERE" + " t_id = " + strconv.Itoa(T_id) + " ORDER BY t_time1 DESC LIMIT 0,1"
 
 	fmt.Println(sql)
 	_, err := o.Raw(sql).QueryRows(&maps)
@@ -448,5 +441,101 @@ func Read_DeviceData(T_sn string, T_id int) (t DeviceData_) {
 
 	RedisDeviceData_Set(key, maps[0])
 
-	return t
+	return maps[0]
+}
+
+// 获取数据备份
+func Read_DeviceData_BackUp_List(T_snid string, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_BackUp, int64) {
+	T_snid_list := strings.Split(T_snid, "|")
+	var maps []DeviceData_BackUp
+	var maps_num int64
+	var offset, offset_z int
+
+	for _, v := range T_snid_list {
+		sn_id := strings.Split(v, ",")
+
+		if len(sn_id) == 2 {
+			r_maps, r_maps_num := Read_DeviceData_BackUp(sn_id[0], lib.To_int(sn_id[1]), Time_start_, Time_end_, 0, 9999)
+			maps = append(maps, r_maps...)
+			maps_num = maps_num + int64(r_maps_num)
+
+			fmt.Println("加载数据:", sn_id[0], sn_id[1], r_maps_num)
+		}
+	}
+	if page <= 1 {
+		offset = 0
+	} else {
+		page -= 1
+		offset = page * page_z
+	}
+
+	offset_z = offset + page_z
+	if maps_num < int64(offset_z) {
+		offset_z = int(maps_num)
+	}
+
+	if page_z == 9999 {
+		fmt.Println("总数据:", maps_num, " 导出")
+		return maps, maps_num
+	}
+	fmt.Println("总数据:", maps_num, " 截取", offset, offset+page_z)
+	return maps[offset:offset_z], maps_num
+}
+
+func Read_DeviceData_BackUp(T_sn string, T_id int, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_BackUp, int) {
+	o := orm.NewOrm()
+	var maps []DeviceData_BackUp
+	var maps_z []orm2.ParamsList
+	var offset int
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+	sql_time := ""
+
+	if len(Time_start_) > 0 {
+		sql_time += " t_time >= '" + Time_start_ + "' AND"
+	}
+
+	if len(Time_end_) > 0 {
+		sql_time += " t_time <= '" + Time_end_ + "' AND"
+	}
+
+	sql := "SELECT t_id,date_format(t_time, '%Y-%m-%d') t_date, count(*) t_num FROM z_device_data_" + T_sn + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id) + " GROUP BY t_date ORDER BY t_time DESC "
+
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return maps, 0
+	}
+	if len(maps_z) == 0 {
+		return maps, 0
+	}
+	if page_z != 9999 {
+		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+	}
+
+	fmt.Println(sql)
+	_, err = o.Raw(sql).QueryRows(&maps)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return maps, 0
+	}
+
+	key, _ := strconv.Atoi(maps_z[0][0].(string))
+
+	deviceSensor, _ := Read_DeviceSensor_ByT_sn(T_sn, T_id)
+
+	for i := 0; i < len(maps); i++ {
+		maps[i].T_sn = T_sn
+		maps[i].T_name = deviceSensor.T_name
+	}
+
+	return maps, key
 }

+ 3 - 1
models/Device/DeviceSensor.go

@@ -71,6 +71,7 @@ type DeviceSensor_R struct {
 
 	T_DeviceSensorData      DeviceData_R            // 传感器最新数据
 	T_DeviceSensorParameter DeviceSensorParameter_R //  设备参数
+	T_DeviceSensorType      DeviceSensorType_R      //  传感器类型
 
 }
 
@@ -200,7 +201,8 @@ func DeviceSensorToDeviceSensor_R(DeviceSensor_ DeviceSensor) (DeviceSensor_r De
 	DeviceData := Read_DeviceData(DeviceSensor_.T_sn, DeviceSensor_.T_id)
 	device, _ := Read_Device_ByT_sn(DeviceSensor_.T_sn)
 	DeviceSensor_r.T_DeviceSensorData = DeviceData_ToDeviceData_R(device, DeviceData)
-
+	deviceSensorType := Read_DeviceSensorType_Get(DeviceSensor_.T_type)
+	DeviceSensor_r.T_DeviceSensorType = DeviceSensorTypeToDeviceSensorType_R(deviceSensorType)
 	return
 }
 

+ 52 - 0
models/Device/DeviceSensorType.go

@@ -5,6 +5,8 @@ import (
 	"Cold_Api/logs"
 	"github.com/beego/beego/v2/adapter/orm"
 	_ "github.com/go-sql-driver/mysql"
+	"sync"
+	"time"
 )
 
 // 设备类型: 1库房   2移动  。。。
@@ -14,17 +16,36 @@ type DeviceSensorType struct {
 	T_name string `orm:"size(256);null"`     // 标题
 	T_text string `orm:"type(text);null"`    // 详情
 	T_view int    `orm:"size(2);default(1)"` // 1 库房   2 移动
+	T_img  string `orm:"size(256);null"`     // 图片连接
 
 	T_State int `orm:"size(2);default(1)"` // 0 删除   1 正常
 }
 
+type DeviceSensorType_R struct {
+	//T_name string  // 标题
+	//T_text string  // 详情
+	T_view int    // 1 库房   2 移动
+	T_img  string // 图片连接
+}
+
+func DeviceSensorTypeToDeviceSensorType_R(t DeviceSensorType) (r DeviceSensorType_R) {
+	//r.T_name = t.T_name
+	//r.T_text = t.T_text
+	r.T_view = t.T_view
+	r.T_img = t.T_img
+	return r
+}
+
 func (t *DeviceSensorType) TableName() string {
 	return "device_sensor_type" // 数据库名称   // ************** 替换 FormulaList **************
 }
 
+var DeviceSensorType_list *sync.Map
+
 func init() {
 	//注册模型
 	orm.RegisterModel(new(DeviceSensorType))
+	DeviceSensorType_list = new(sync.Map)
 }
 
 func Read_DeviceSensorType_List_All() (r []DeviceSensorType) {
@@ -40,3 +61,34 @@ func Read_DeviceSensorType_List_All() (r []DeviceSensorType) {
 
 	return r
 }
+
+// 获取全部
+func Read_DeviceSensorTypeAll_Map() {
+	time.Sleep(2 * time.Second)
+
+	logs.Println("=========== 初始化传感器类型类型 =========")
+
+	o := orm.NewOrm()
+	for true {
+		var r []DeviceSensorType
+		qs := o.QueryTable(new(DeviceSensorType))
+		_, err := qs.Filter("T_State", 1).All(&r)
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+		}
+
+		for _, v := range r {
+			DeviceSensorType_list.Store(v.Id, v)
+		}
+		time.Sleep(1 * time.Hour)
+	}
+}
+func Read_DeviceSensorType_Get(Id int) (r DeviceSensorType) {
+	// 有先加入 给全部人发消息
+	v, ok := DeviceSensorType_list.Load(Id) /*如果确定是真实的,则存在,否则不存在 */
+	if ok {
+		return v.(DeviceSensorType)
+	} else {
+		return r
+	}
+}

+ 2 - 4
models/Product/ProductType.go

@@ -43,10 +43,8 @@ var ProductType_list *sync.Map
 func init() {
 	//注册模型
 	orm.RegisterModel(new(ProductType))
-
 	ProductType_list = new(sync.Map)
-
-	go Read_ProductType_All_Map()
+	//go Read_ProductType_All_Map()
 }
 
 // 获取全部
@@ -63,7 +61,7 @@ func Read_ProductType_All() (r []ProductType) {
 
 // 获取全部
 func Read_ProductType_All_Map() {
-	time.Sleep(time.Second * 3)
+	time.Sleep(2 * time.Second)
 
 	logs.Println("=========== 初始化产品类型 =========")
 

+ 5 - 4
models/Warning/Warning.go

@@ -69,6 +69,7 @@ func (t *Warning) TableName() string {
 
 func init() {
 	//注册模型
+	orm2.Debug = true
 	orm.RegisterModel(new(Warning))
 }
 
@@ -176,7 +177,7 @@ func Read_Warning_List(T_pid int, T_tp, T_name string, T_handle int, Time_start_
 	var err error
 	if page_z == 9999 {
 		// 获取全部
-		_, err = qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
+		_, err = qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-CreateTime").All(&map_r)
 	} else {
 		_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
 	}
@@ -251,7 +252,7 @@ func Read_Admin_Warning_List(T_pids, T_tp, T_name string, T_handle int, Time_sta
 		cond1 = cond1.And("T_State", 3)
 	}
 
-	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-CreateTime").All(&map_r)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 	}
@@ -340,7 +341,7 @@ func Read_Warning_Backups(T_pid int, T_year string, T_month string, T_tp, T_name
 	}
 	//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"
+		"FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY create_time DESC"
 	if page_z != 9999 {
 		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
 	}
@@ -438,7 +439,7 @@ func Read_Admin_Warning_Backups(T_pids string, T_year string, T_month string, T_
 	}
 	//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"
+		"FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY create_time DESC"
 	if page_z != 9999 {
 		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
 	}

+ 1 - 1
models/Warning/WarningType.go

@@ -70,7 +70,7 @@ func init() {
 	//注册模型
 	WarningType_list = new(sync.Map)
 	orm.RegisterModel(new(WarningType))
-	go Read_WarningType_All_Maps()
+	//go Read_WarningType_All_Maps()
 
 }
 

+ 6 - 3
routers/Data.go

@@ -16,9 +16,12 @@ func init() {
 			beego.NSRouter("/Device_Sensor_Data_Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel"),     // 导出传感器数据
 			beego.NSRouter("/Device_Sensor_Data_Excel_m", &controllers.DataController{}, "*:Device_Sensor_Data_Excel_m"), // 导出传感器数据
 
-			beego.NSRouter("/List", &controllers.DataController{}, "*:Device_Sensor_Data_More"),   // 设备数据列表
-			beego.NSRouter("/Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel"), // 导出设备数据列表excel
-			beego.NSRouter("/PDF", &controllers.DataController{}, "*:Device_Sensor_Data_PDF"),     // 设备数据列表pdf
+			beego.NSRouter("/List", &controllers.DataController{}, "*:Device_Sensor_Data_More"),             // 设备数据列表
+			beego.NSRouter("/Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel"),           // 导出设备数据列表excel
+			beego.NSRouter("/PDF", &controllers.DataController{}, "*:Device_Sensor_Data_PDF"),               // 设备数据列表pdf
+			beego.NSRouter("/BackUp", &controllers.DataController{}, "*:Device_Sensor_Data_BackUp"),         // 设备数据备份列表
+			beego.NSRouter("/BackUp_PDF", &controllers.DataController{}, "*:Device_Sensor_Data_BackUp_PDF"), // 设备数据备份列表PDF
+
 			// 执行 SQL
 			beego.NSRouter("/Raw", &controllers.RawSqlController{}, "*:Raw"), // 执行 SQL
 		),

+ 1 - 0
routers/User.go

@@ -51,6 +51,7 @@ func init() {
 		beego.NSRouter("/Company/Tree", &controllers.UserController{}, "*:Company_Tree"),   // 公司列表
 		beego.NSRouter("/Company/List", &controllers.UserController{}, "*:Company_List"),   // 所有公司列表
 		beego.NSRouter("/Company/Add", &controllers.UserController{}, "*:Company_Add"),     // 添加公司
+		beego.NSRouter("/Company/Get", &controllers.UserController{}, "*:Company_Get"),     // 添加公司
 		beego.NSRouter("/Company/Edit", &controllers.UserController{}, "*:Company_Edit"),   // 修改公司
 		beego.NSRouter("/Company/Del", &controllers.UserController{}, "*:Company_Del"),     // 删除公司
 		beego.NSRouter("/Company/Entry", &controllers.UserController{}, "*:Company_Entry"), // 删除公司