浏览代码

add:设备管理列表

zoie 2 年之前
父节点
当前提交
8df48dd923

+ 80 - 2
controllers/Device.go

@@ -553,6 +553,7 @@ func (c *DeviceController) DeviceSensor_List() {
 	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
@@ -670,7 +671,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_DeviceSensorParameter_List(Sn, Id, 2, 10)
+	DeviceSensorParameter_lite := Device.Read_DeviceSensorParameter_List(Sn, Id, 1, 10)
 	if len(DeviceSensorParameter_lite) == 0 {
 		NatsServer.Read_DeviceSensorParameter(Sn)
 		c.Data["json"] = lib.JSONS{Code: 203, Msg: "未同步参数,请检查设备是否正常!"}
@@ -858,6 +859,83 @@ func (c *DeviceController) UpDeviceSensor_T_datashow() {
 	return
 }
 
+// 传感器管理列表
+func (c *DeviceController) DeviceSensor_Manage_List() {
+	// 验证登录
+	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 R_JSONS struct {
+		//必须的大写开头
+		Data      []Device.DeviceSensor_P
+		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_pid := admin_r.T_pid
+	if T_pid == 0 {
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
+	}
+
+	T_name := c.GetString("T_name") //  包含 T_name、T_sn
+	T_calss_id, _ := c.GetInt("T_calssid")
+	if T_calss_id > 0 {
+		R_DeviceClass, err := Company.Read_CompanyClass_ById(T_calss_id)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 205, Msg: "T_class_id Err!"}
+			c.ServeJSON()
+			return
+		}
+		if R_DeviceClass.T_pid != T_pid {
+			c.Data["json"] = lib.JSONS{Code: 205, Msg: "CompanyClass.T_pid != T_pid Err!"}
+			c.ServeJSON()
+			return
+		}
+	}
+
+	T_en, T_en_err := c.GetInt("T_en") //启用停用 0 停用  1 启用  空 所有
+	if T_en_err != nil {
+		T_en = -1
+	}
+	T_free, T_free_err := c.GetInt("T_free") // 空库 0 正常  1 空库 空 所有
+	if T_free_err != nil {
+		T_free = -1
+	}
+	T_datashow, T_datashow_err := c.GetInt("T_datashow") //数据展示 空 全部  0 屏蔽数据展示  1 正常数据展示
+	if T_datashow_err != nil {
+		T_datashow = -1
+	}
+
+	T_sort, T_sort_err := c.GetInt("T_sort") //排序 空 升序 1 降序
+	if T_sort_err != nil {
+		T_sort = -1
+	}
+
+	r_jsons.Data, r_jsons.Num = Device.Read_DeviceSensorManageList(T_pid, T_name, T_calss_id, T_en, T_free, T_datashow, T_sort, 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
+}
+
 // 设备任务 ------------------------------------------
 
 // 任务列表
@@ -1975,7 +2053,7 @@ func (c *DeviceController) NoticeBind_Add() {
 		return
 	}
 
-	if err = Device.DeviceSensor_T_Notice_Add(T_sn, T_id, T_notice_id); err != nil {
+	if err = Device.DeviceSensor_Bind_T_Notice_Add(T_sn, T_id, T_notice_id); err != nil {
 		c.Data["json"] = lib.JSONS{Code: 200, Msg: "通知绑定失败"}
 		c.ServeJSON()
 		return

+ 179 - 37
controllers/User.go

@@ -12,6 +12,7 @@ import (
 	uuid "github.com/satori/go.uuid"
 	"math"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -38,7 +39,7 @@ func (c *UserController) User_WxQRCode() {
 }
 
 // 公司管理
-func (c *UserController) Company_List() {
+func (c *UserController) Company_Tree() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
 	if !b_ {
@@ -50,18 +51,29 @@ func (c *UserController) Company_List() {
 	var r_jsons lib.R_JSONS
 
 	T_name := c.GetString("T_name")
-	r_jsons.Data, r_jsons.Num = Account.Read_Company_List(admin_r, T_name)
+	r_jsons.Data, r_jsons.Num = Account.Read_Company_Tree(admin_r, T_name)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
 	c.ServeJSON()
 	return
 }
 
-func (c *UserController) Company_All() {
+func (c *UserController) Company_List() {
 
 	var r_jsons lib.R_JSONS
 
-	r_jsons.Data = Account.Read_Company_All()
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	r_jsons.Data, r_jsons.Num = Account.Read_Company_List(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()
@@ -214,6 +226,7 @@ func (c *UserController) User_List() {
 		return
 	}
 
+	Account.Read_Power_All_Map()
 	r_jsons.Data, r_jsons.Num = Account.Read_Admin_List(T_pid, T_name, page, page_z)
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
@@ -290,11 +303,15 @@ func (c *UserController) User_Post() {
 	T_phone := c.GetString("T_phone")
 	T_mail := c.GetString("T_mail")
 	T_wx := c.GetString("T_wx")
-
+	if len(T_pass) < 8 && len(T_pass) > 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "密码异常!"}
+		c.ServeJSON()
+		return
+	}
 	if len(T_name) > 0 {
 		admin_r.T_name = T_name
 	}
-	if len(T_pass) > 0 {
+	if len(T_pass) >= 8 {
 		admin_r.T_pass = T_pass
 	}
 	if len(T_phone) > 0 {
@@ -307,12 +324,6 @@ func (c *UserController) User_Post() {
 		admin_r.T_wx = T_wx
 	}
 
-	if len(T_pass) < 8 {
-		c.Data["json"] = lib.JSONS{Code: 203, Msg: "Admin_pass Err!"}
-		c.ServeJSON()
-		return
-	}
-
 	is := Account.Update_Admin(admin_r, "T_name", "T_pass", "T_phone", "T_mail", "T_wx")
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 204, Msg: "修改失败!"}
@@ -420,10 +431,17 @@ func (c *UserController) User_Edit() {
 	if T_power_err == nil {
 		r.T_power = T_power
 	}
+
+	if len(T_pass) < 8 && len(T_pass) > 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "密码异常!"}
+		c.ServeJSON()
+		return
+	}
+
 	if len(T_name) > 0 {
 		r.T_name = T_name
 	}
-	if len(T_pass) > 0 {
+	if len(T_pass) >= 8 {
 		r.T_pass = T_pass
 	}
 	if len(T_phone) > 0 {
@@ -436,12 +454,6 @@ func (c *UserController) User_Edit() {
 		r.T_wx = T_wx
 	}
 
-	if len(T_pass) < 8 {
-		c.Data["json"] = lib.JSONS{Code: 203, Msg: "Admin_pass Err!"}
-		c.ServeJSON()
-		return
-	}
-
 	is := Account.Update_Admin(r, "T_power", "T_pid", "T_name", "T_pass", "T_phone", "T_mail", "T_wx")
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 204, Msg: "修改失败!"}
@@ -516,7 +528,12 @@ func (c *UserController) User_Home() {
 		power, _ := Account.Read_Power_ById(admin_r.T_power)
 		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_pid)
+		AdminList := Account.Read_Admin_List_T_pids(admin_r.T_pid)
+		var Admin_ []Account.Admin_
+		for _, v := range AdminList {
+			Admin_ = append(Admin_, Account.Admin_RToAdmin_(v))
+		}
+		info.Admin = Admin_
 		info.WarningNum = Warning.Read_Warning_ALL_T_State_Count(admin_r.T_pid, 1, power.T_warning)
 		info.UntreatedWarningNum = Warning.Read_Warning_ALL_T_State_Count(admin_r.T_pid, 3, power.T_warning)
 	}
@@ -543,7 +560,6 @@ func (c *UserController) Admin_List() {
 	var r_jsons lib.R_JSONS
 
 	page, _ := c.GetInt("page")
-	println(page)
 	if page < 1 {
 		page = 1
 	}
@@ -555,6 +571,7 @@ func (c *UserController) Admin_List() {
 	T_name := c.GetString("T_name")
 	T_pid := 0
 
+	Account.Read_Power_All_Map()
 	r_jsons.Data, r_jsons.Num = Account.Read_Admin_List(T_pid, T_name, page, page_z)
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
@@ -680,10 +697,17 @@ func (c *UserController) Admin_Edit() {
 	if T_power_err == nil {
 		r.T_power = T_power
 	}
+
+	if len(T_pass) < 8 && len(T_pass) > 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "密码异常!"}
+		c.ServeJSON()
+		return
+	}
+
 	if len(T_name) > 0 {
 		r.T_name = T_name
 	}
-	if len(T_pass) > 0 {
+	if len(T_pass) >= 8 {
 		r.T_pass = T_pass
 	}
 	if len(T_phone) > 0 {
@@ -696,19 +720,13 @@ func (c *UserController) Admin_Edit() {
 		r.T_wx = T_wx
 	}
 
-	if len(T_pass) < 8 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "密码异常!"}
-		c.ServeJSON()
-		return
-	}
-
 	is := Account.Update_Admin(r, "T_power", "T_name", "T_pass", "T_phone", "T_mail", "T_wx")
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 204, Msg: "修改失败!"}
 		c.ServeJSON()
 		return
 	}
-	r.T_pass = "******"
+	r.T_pass = "********"
 	System.Add_UserLogs_T(admin_r.T_uuid, "用户管理", "编辑", r)
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -749,8 +767,8 @@ func (c *UserController) Admin_Del() {
 
 }
 
-// 绑定公司
-func (c *UserController) Admin_Bind_Company() {
+// 报警通知的用户列表
+func (c *UserController) User_Notice_List() {
 	// 验证登录
 	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
 	if !b_ {
@@ -758,13 +776,49 @@ func (c *UserController) Admin_Bind_Company() {
 		c.ServeJSON()
 		return
 	}
+
+	type R_JSONS struct {
+		//必须的大写开头
+		AdminList []Account.Admin_R
+		UserList  []Account.Admin_R
+	}
+
+	var r_jsons R_JSONS
+
+	T_pid := admin_r.T_pid
+	if T_pid == 0 {
+		T_pid, _ = strconv.Atoi(c.Ctx.Request.Header.Get("T_pid"))
+	}
+
+	// 绑定公司id的内部用户列表
+	r_jsons.AdminList = Account.Read_Admin_List_T_pids(T_pid)
+	// 绑定公司id的公司用户列表
+	r_jsons.UserList = Account.Read_Admin_List_T_pid(T_pid)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+// 管理员绑定公司
+func (c *UserController) AdminCompanyBind_List() {
+
+	var r_jsons lib.R_JSONS
+
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
 	T_uuid := c.GetString("T_uuid")
 	if len(T_uuid) < 8 {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid Err!"}
 		c.ServeJSON()
 		return
 	}
-	T_pids := c.GetString("T_pids")
 
 	r, err := Account.Read_Admin_ByUuid(T_uuid)
 	if err != nil {
@@ -772,21 +826,109 @@ func (c *UserController) Admin_Bind_Company() {
 		c.ServeJSON()
 		return
 	}
-	if len(T_pids) > 0 {
-		r.T_pids = T_pids
+
+	var cnt int64
+	Company_lite, cnt := Account.Read_Company_List_ByT_pids(r.T_pids, page, page_z)
+
+	r_jsons.Data = Company_lite
+
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+	r_jsons.Num = cnt
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+func (c *UserController) AdminCompanyBind_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_uuid := c.GetString("T_uuid")
+	if len(T_uuid) < 8 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid Err!"}
+		c.ServeJSON()
+		return
+	}
+	T_pid, _ := c.GetInt("T_pid")
+	if T_pid == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_pid Err!"}
+		c.ServeJSON()
+		return
 	}
 
-	if is := Account.Update_Admin(r, "T_pids"); !is {
-		c.Data["json"] = lib.JSONS{Code: 200, Msg: "绑定失败!"}
+	r, err := Account.Read_Admin_ByUuid(T_uuid)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid Err!"}
+		c.ServeJSON()
+		return
+	}
+	if strings.Contains(r.T_pids, "P"+strconv.Itoa(T_pid)+"|") {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "重复绑定!"}
 		c.ServeJSON()
 		return
 	}
 
-	System.Add_UserLogs_T(admin_r.T_uuid, "用户管理", "绑定公司", T_uuid)
+	if err = Account.Add_Company_bind(r.Id, T_pid); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "公司绑定失败"}
+		c.ServeJSON()
+		return
+	}
+
+	System.Add_UserLogs(admin_r.T_uuid, "内部用户管理", "公司绑定添加", T_uuid+"-"+strconv.Itoa(T_pid))
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
 	return
+}
+func (c *UserController) AdminCompanyBind_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
+	}
 
+	T_uuid := c.GetString("T_uuid")
+	if len(T_uuid) < 8 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid Err!"}
+		c.ServeJSON()
+		return
+	}
+	T_pid, _ := c.GetInt("T_pid")
+	if T_pid == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_pid Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	r, err := Account.Read_Admin_ByUuid(T_uuid)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid Err!"}
+		c.ServeJSON()
+		return
+	}
+	if !strings.Contains(r.T_pids, "P"+strconv.Itoa(T_pid)+"|") {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+		c.ServeJSON()
+		return
+	}
+
+	if err = Account.Delete_Company_bind(r.Id, T_pid); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "公司绑定失败"}
+		c.ServeJSON()
+		return
+	}
+
+	System.Add_UserLogs(admin_r.T_uuid, "内部用户管理", "公司绑定删除", T_uuid+"-"+strconv.Itoa(T_pid))
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
 }
 
 // 权限管理

+ 1 - 0
controllers/lib/lib.go

@@ -26,6 +26,7 @@ type Cl_ struct {
 var CountrySnMap map[string]Cl_    /*创建集合 */
 var DeviceRealSnMap map[string]int /*创建集合 */
 var Nats *nats.Conn
+var Admin_r Account.Admin
 
 func init() {
 	CountrySnMap = make(map[string]Cl_)

+ 73 - 12
models/Account/Admin.go

@@ -10,6 +10,7 @@ import (
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -33,15 +34,17 @@ type Admin struct {
 }
 
 type Admin_R struct {
-	T_uuid  string // 用户编号
-	T_pid   int    // 绑定公司 ( 只有创建公司用户时添加,内部人员 为0)
-	T_pids  string //  绑定公司管理 Pid| 如 P1|P2
-	T_power int    // 权限 (关联权限表)
-	T_user  string // 用户名 (唯一)
-	T_name  string // 姓名
-	T_phone string // 电话
-	T_mail  string // 邮箱
-	T_wx    string // 微信
+	T_uuid       string // 用户编号
+	T_pid        int    // 绑定公司 ( 只有创建公司用户时添加,内部人员 为0)
+	T_pids       string //  绑定公司管理 Pid| 如 P1|P2
+	T_power      int    // 权限 (关联权限表)
+	T_power_name string // 权限名称
+	T_user       string // 用户名 (唯一)
+	T_pass       string // MD5,密码
+	T_name       string // 姓名
+	T_phone      string // 电话
+	T_mail       string // 邮箱
+	T_wx         string // 微信
 }
 
 type Admin_ struct {
@@ -54,7 +57,9 @@ func AdminToAdmin_R(r Admin) (v Admin_R) {
 	v.T_pid = r.T_pid
 	v.T_pids = r.T_pids
 	v.T_power = r.T_power
+	v.T_power_name = Read_Power_Get(r.T_power)
 	v.T_user = r.T_user
+	v.T_pass = ""
 	v.T_name = r.T_name
 	v.T_phone = r.T_phone
 	v.T_mail = r.T_mail
@@ -63,7 +68,7 @@ func AdminToAdmin_R(r Admin) (v Admin_R) {
 	return v
 }
 
-func AdminToAdmin_(r Admin) (v Admin_) {
+func Admin_RToAdmin_(r Admin_R) (v Admin_) {
 	v.T_name = r.T_name
 	v.T_phone = r.T_phone
 	return v
@@ -272,7 +277,7 @@ 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_pid int) (AdminList []Admin_) {
+func Read_Admin_List_T_pids(T_pid int) (AdminList []Admin_R) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -286,7 +291,27 @@ func Read_Admin_List_T_pids(T_pid int) (AdminList []Admin_) {
 	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
 
 	for _, v := range maps {
-		AdminList = append(AdminList, AdminToAdmin_(v))
+		AdminList = append(AdminList, AdminToAdmin_R(v))
+	}
+
+	return AdminList
+}
+
+func Read_Admin_List_T_pid(T_pid int) (AdminList []Admin_R) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+
+	qs := o.QueryTable(new(Admin))
+	var maps []Admin
+	cond := orm.NewCondition()
+
+	cond1 := cond.And("T_State", 1).And("T_pid", T_pid)
+
+	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
+
+	for _, v := range maps {
+		AdminList = append(AdminList, AdminToAdmin_R(v))
 	}
 
 	return AdminList
@@ -307,3 +332,39 @@ func Read_Admin_List_All() (AdminList []Admin_R) {
 	}
 	return AdminList
 }
+
+func Add_Company_bind(Admin_id, T_pid int) (err error) {
+
+	o := orm.NewOrm()
+	v := Admin{Id: Admin_id}
+	T_Pid_bind := "P" + strconv.Itoa(T_pid) + "|"
+	if err = o.Read(&v, "Id"); err == nil {
+		v.T_pids = strings.Replace(v.T_pids, T_Pid_bind, "", -1)
+		v.T_pids = v.T_pids + T_Pid_bind
+
+		if num, err := o.Update(&v, "T_pids"); err == nil {
+			fmt.Println("Number of records updated in database:", num)
+			Redis_Admin_Set(v) // Redis 更新缓存
+			return err
+		}
+	}
+
+	return err
+}
+
+func Delete_Company_bind(Admin_id, T_pid int) (err error) {
+
+	o := orm.NewOrm()
+	v := Admin{Id: Admin_id}
+	T_Pid_bind := "P" + strconv.Itoa(T_pid) + "|"
+	if err = o.Read(&v, "Id"); err == nil {
+		v.T_pids = strings.Replace(v.T_pids, T_Pid_bind, "", -1)
+		if num, err := o.Update(&v, "T_pids"); err == nil {
+			fmt.Println("Number of records updated in database:", num)
+			Redis_Admin_Set(v) // Redis 更新缓存
+			return err
+		}
+	}
+	return err
+
+}

+ 56 - 5
models/Account/Company.go

@@ -152,7 +152,7 @@ func Read_Company_ById(Id int) (r Company, e error) {
 }
 
 // 获取列表
-func Read_Company_List(admin_r Admin, Company_name string) (CompanyList []Company_R, cnt int64) {
+func Read_Company_Tree(admin_r Admin, Company_name string) (CompanyList []Company_R, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -167,7 +167,13 @@ func Read_Company_List(admin_r Admin, Company_name string) (CompanyList []Compan
 		cond1 = cond1.And("Id", admin_r.T_pid)
 	}
 
-	if len(admin_r.T_pids) > 0 {
+	// 内部用户未绑定公司
+	if admin_r.T_pid == 0 && len(admin_r.T_pids) == 0 {
+		return CompanyList, cnt
+	}
+
+	// 内部用户已绑定公司,* 绑定所有公司
+	if len(admin_r.T_pids) > 0 && admin_r.T_pids != "*" {
 		T_pids := models.SplitStringIds(admin_r.T_pids, "P")
 		cond1 = cond1.AndCond(cond.Or("Id__in", T_pids).Or("T_mid__in", T_pids))
 	}
@@ -209,8 +215,15 @@ func Read_Company_List(admin_r Admin, Company_name string) (CompanyList []Compan
 
 	return CompanyList, cnt
 }
-func Read_Company_All() (CompanyList []Company_R) {
 
+func Read_Company_List(page, page_z int) (CompanyList []Company_R, cnt int64) {
+
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 
@@ -220,9 +233,13 @@ func Read_Company_All() (CompanyList []Company_R) {
 	cond := orm.NewCondition()
 	cond1 := cond.And("T_State", 1)
 
-	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
 
-	return CompanyTree(maps, 0)
+	for _, v := range maps {
+		CompanyList = append(CompanyList, CompanyToCompany_R(v))
+	}
+	return CompanyList, cnt
 }
 
 func CompanyTree(list []Company, parentId int) []Company_R {
@@ -291,3 +308,37 @@ func Read_Company_List_All_ByT_name(T_name string) (maps []Company) {
 	qs.All(&maps)
 	return maps
 }
+
+// 获取列表
+func Read_Company_List_ByT_pids(T_pids string, page int, page_z int) (Company_r []Company_R, cnt int64) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+
+	qs := o.QueryTable(new(Company))
+	var offset int64
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	var r []Company
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State", 1)
+	if len(T_pids) >= 0 {
+		list := models.SplitStringIds(T_pids, "P")
+		cond1 = cond1.And("Id__in", list)
+	}
+
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("Id").All(&r)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	for _, v := range r {
+		Company_r = append(Company_r, CompanyToCompany_R(v))
+	}
+	return Company_r, cnt
+}

+ 3 - 4
models/Account/Menu.go

@@ -19,9 +19,8 @@ type Menu struct {
 	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:"-"`                   // 是否选中
+	T_sort       int    `orm:"size(11);default(0)"` // 排序 越小的越靠前,可以为负数
+	T_pid        int    `orm:"size(2);default(0)"`  // 1 进入公司后才能访问的菜单 0 公共菜单
 	Children     []Menu `orm:"-"`
 }
 
@@ -163,7 +162,7 @@ func Read_Menu_Bind_List(Bind_Menu string, T_pid int) (maps []Menu) {
 		cond = cond.And("Id__in", list)
 	}
 
-	qs.SetCond((*orm2.Condition)(cond)).OrderBy("Id", "-T_sort").All(&maps)
+	qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_sort").All(&maps)
 
 	m := Menu_Call(maps, 0)
 	return m

+ 25 - 0
models/Account/Power.go

@@ -60,9 +60,12 @@ func PowerToPower_(r Power) (v Power_) {
 
 var redisCache_Power cache.Cache
 
+var Power_list map[int]string // 泛型
+
 func init() {
 	//注册模型
 	orm.RegisterModel(new(Power))
+	Power_list = make(map[int]string)
 
 	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
 		"redis_Cold_User_Power", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
@@ -280,3 +283,25 @@ func GetRandString(length int, char string, rand_x int64) string {
 	rchar := charArr[:length]
 	return strings.Join(rchar, "")
 }
+
+// 获取全部
+func Read_Power_All_Map() {
+	o := orm.NewOrm()
+	var r []Power
+	qs := o.QueryTable(new(Power))
+	qs.All(&r)
+
+	for _, v := range r {
+		Power_list[v.Id] = v.T_name
+	}
+
+}
+func Read_Power_Get(Id int) string {
+	// 有先加入 给全部人发消息
+	v, ok := Power_list[Id] /*如果确定是真实的,则存在,否则不存在 */
+	if ok {
+		return v
+	} else {
+		return ""
+	}
+}

+ 98 - 6
models/Device/DeviceSensor.go

@@ -71,6 +71,25 @@ type DeviceSensor_R struct {
 
 }
 
+// 传感器管理
+type DeviceSensor_P struct {
+	T_sn   string // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
+	T_id   int    // 传感器编号
+	T_name string // 标题
+
+	T_sort     int // 排序
+	T_datashow int // 0 屏蔽数据展示  1 正常数据展示
+
+	// DeviceSensorParameter
+	T_Tlower  float32 //  温度下限
+	T_Tupper  float32 //  温度上限
+	T_RHlower float32 //  湿度下限
+	T_RHupper float32 //  湿度上限
+
+	T_en   int // en:是否启用传感器,
+	T_free int // free:监测点是否为闲置状态(空库,只监测不报警)
+}
+
 var redisCache_DeviceSensor cache.Cache
 
 func init() {
@@ -248,8 +267,6 @@ func Read_DeviceSensorList(admin_r Account.Admin, T_pid int, T_sn string, T_name
 	//return r, cnt
 }
 
-// ----------------------------------- v1 -------------------------------------------------------------
-
 // 获取
 func Read_DeviceSensor_ByT_sn(T_sn string, T_id int) (r DeviceSensor, is bool) {
 	key := r.T_sn + "|" + strconv.Itoa(r.T_id)
@@ -578,7 +595,7 @@ func DELETE_DeviceSensor(SN string) bool {
 	return true
 }
 
-// 通知 -------------------
+// 报警策略 -------------------
 
 // 通过T_sn T_id T_Notice_id 获取全部列表
 func Read_DeviceSensor_ALL_T_sn_T_id_T_Notice(T_sn string, T_id int, T_Notice_id int) (r []DeviceSensor) {
@@ -600,21 +617,25 @@ func DeviceSensor_Bind_T_Notice_Del(T_sn string, T_id int, T_Notice_id int) (err
 	T_Notice := "N" + strconv.Itoa(T_Notice_id) + "|"
 	if err = o.Read(&v, "T_sn", "T_id"); err == nil {
 		v.T_Notice = strings.Replace(v.T_Notice, T_Notice, "", -1)
-		o.Update(&v, "T_Notice")
+		if _, err = o.Update(&v, "T_Notice"); err == nil {
+			Redis_DeviceSensor_Set(v)
+		}
 	}
 	return err
 
 }
 
 // 修改T_Notice,追加
-func DeviceSensor_T_Notice_Add(T_sn string, T_id int, T_Notice_id int) (err error) {
+func DeviceSensor_Bind_T_Notice_Add(T_sn string, T_id int, T_Notice_id int) (err error) {
 	o := orm.NewOrm()
 	v := DeviceSensor{T_sn: T_sn, T_id: T_id}
 	T_Notice := "N" + strconv.Itoa(T_Notice_id) + "|"
 	if err = o.Read(&v, "T_sn", "T_id"); err == nil {
 		v.T_Notice = strings.Replace(v.T_Notice, T_Notice, "", -1)
 		v.T_Notice = v.T_Notice + T_Notice
-		o.Update(&v, "T_Notice")
+		if _, err = o.Update(&v, "T_Notice"); err == nil {
+			Redis_DeviceSensor_Set(v)
+		}
 	}
 	return err
 }
@@ -691,3 +712,74 @@ func Update_Device_To_DeviceSensor(r_Device Device) bool {
 
 	return true
 }
+
+// 传感器管理列列表 -------------------
+func Read_DeviceSensorManageList(T_pid int, T_name string, T_calss_id, T_en, T_free, T_datashow, T_sort, page, page_z int) (DeviceSensor_p []DeviceSensor_P, cnt int64) {
+	o := orm.NewOrm()
+	var maps []DeviceSensor_P
+	var maps_z []orm2.ParamsList
+
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	sql_WHERE := "t_pid = " + strconv.Itoa(T_pid)
+
+	if len(T_name) > 0 {
+		sql_WHERE += " AND (ds.t_sn like '%" + T_name + "%' OR t_name like '%" + T_name + "%')"
+	}
+	if T_calss_id > 0 {
+		T_calss := "C" + strconv.Itoa(T_calss_id) + "|"
+		sql_WHERE += " AND t__class like '%" + T_calss + "%'"
+	}
+
+	if T_en != -1 {
+		sql_WHERE += " AND t_en = " + strconv.Itoa(T_en)
+	}
+	if T_free != -1 {
+		sql_WHERE += " AND t_free = " + strconv.Itoa(T_free)
+	}
+	if T_datashow != -1 {
+		sql_WHERE += " AND t_datashow =" + strconv.Itoa(T_datashow)
+	}
+
+	sql_ORDER := " ORDER BY t_sort ASC"
+	if T_sort == 1 {
+		sql_ORDER = " ORDER BY t_sort DESC"
+	}
+
+	// -------------
+
+	sql := "SELECT COUNT(ds.ID) FROM " + "device_sensor ds " +
+		"LEFT JOIN ( SELECT tsn,tid,t_en,t_free,t__tlower,t__tupper,t__r_hlower,t__r_hupper " +
+		"FROM (SELECT DISTINCT t_sn AS tsn,t_id AS tid,t_en,t_free,t__tlower,t__tupper,t__r_hlower,t__r_hupper FROM `device_sensor_parameter` ORDER BY id DESC) f GROUP BY tsn,tid) AS dsp " +
+		"ON ds.t_sn = dsp.tsn AND ds.t_id = dsp.tid" + " WHERE " + sql_WHERE
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		return DeviceSensor_p, 0
+	}
+	if len(maps_z) == 0 {
+		return DeviceSensor_p, 0
+	}
+	//fmt.Println("maps_z;",maps_z[0][0])
+	sql = "SELECT * FROM device_sensor ds " +
+		"LEFT JOIN ( SELECT tsn,tid,t_en,t_free,t__tlower,t__tupper,t__r_hlower,t__r_hupper " +
+		"FROM (SELECT DISTINCT t_sn AS tsn,t_id AS tid,t_en,t_free,t__tlower,t__tupper,t__r_hlower,t__r_hupper FROM `device_sensor_parameter` ORDER BY id DESC) f GROUP BY tsn,tid) AS dsp " +
+		"ON ds.t_sn = dsp.tsn AND ds.t_id = dsp.tid " +
+		"WHERE " + sql_WHERE + sql_ORDER
+
+	if page_z != 9999 {
+		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+	}
+
+	fmt.Println(sql)
+	_, err = o.Raw(sql).QueryRows(&maps)
+
+	key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
+
+	return maps, key
+}

+ 11 - 11
models/Device/DeviceSensorParameter.go

@@ -27,20 +27,20 @@ type DeviceSensorParameter struct {
 	T_RHlower float32 `orm:"size(200);null"` //  湿度下限
 	T_RHupper float32 `orm:"size(200);null"` //  湿度上限
 	// 预警
-	T_enprel int     `orm:"size(2);1"`      // 是否启用预警
-	T_tprel  float32 `orm:"size(200);null"` //  温度预警下限
-	T_tpreu  float32 `orm:"size(200);null"` //  温度预警上限
-	T_hprel  float32 `orm:"size(200);null"` //  湿度预警下限
-	T_hpreu  float32 `orm:"size(200);null"` //  温度预警上限
+	T_enprel int     `orm:"size(2);default(1)"` //  是否启用预警
+	T_tprel  float32 `orm:"size(200);null"`     //  温度预警下限
+	T_tpreu  float32 `orm:"size(200);null"`     //  温度预警上限
+	T_hprel  float32 `orm:"size(200);null"`     //  湿度预警下限
+	T_hpreu  float32 `orm:"size(200);null"`     //  温度预警上限
 
-	T_en   int `orm:"size(2);1"` // en:是否启用传感器,
-	T_free int `orm:"size(2);1"` // free:监测点是否为闲置状态(空库,只监测不报警)
+	T_en   int `orm:"size(2);default(1)"` // en:是否启用传感器,   0 停用   1 启用
+	T_free int `orm:"size(2);default(1)"` // free:监测点是否为闲置状态(空库,只监测不报警)    0 正常   1 空库
 
 	// 逻辑字段
-	T_uuid      string `orm:"size(256);null"` //处理 人员
-	T_Msid      int64  `orm:"size(50);0"`     // 消息识别ID
-	T_SendState int    `orm:"size(2);0"`      // 发送状态  0 待发送   1 发送成功  2 失败  3 覆盖
-	T_State     int    `orm:"size(2);1"`      //  1 系统获取   2 用户提交
+	T_uuid      string `orm:"size(256);null"`      // 处理 人员
+	T_Msid      int64  `orm:"size(50);default(0)"` // 消息识别ID
+	T_SendState int    `orm:"size(2);default(0)"`  // 发送状态  0 待发送   1 发送成功  2 失败  3 覆盖
+	T_State     int    `orm:"size(2);default(1)"`  // 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 保存时都会对时间自动更新

+ 11 - 8
routers/User.go

@@ -22,12 +22,15 @@ func init() {
 	beego.Router(version+"/User/Del", &controllers.UserController{}, "*:User_Del")           // 删除用户
 	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")                   // 获取内部用户信息
-	beego.Router(version+"/Admin/Add", &controllers.UserController{}, "*:Admin_Add")                   // 增加内部用户
-	beego.Router(version+"/Admin/Edit", &controllers.UserController{}, "*:Admin_Edit")                 // 编辑内部用户
-	beego.Router(version+"/Admin/Del", &controllers.UserController{}, "*:Admin_Del")                   // 删除内部用户
-	beego.Router(version+"/Admin/Bind_Company", &controllers.UserController{}, "*:Admin_Bind_Company") // 内部用户绑定公司
+	beego.Router(version+"/Admin/List", &controllers.UserController{}, "*:Admin_List") // 内部用户列表
+	beego.Router(version+"/Admin/Get", &controllers.UserController{}, "*:Admin_Get")   // 获取内部用户信息
+	beego.Router(version+"/Admin/Add", &controllers.UserController{}, "*:Admin_Add")   // 增加内部用户
+	beego.Router(version+"/Admin/Edit", &controllers.UserController{}, "*:Admin_Edit") // 编辑内部用户
+	beego.Router(version+"/Admin/Del", &controllers.UserController{}, "*:Admin_Del")   // 删除内部用户
+	// 内部用户公司绑定
+	beego.Router(version+"/Admin/CompanyBind_List", &controllers.UserController{}, "*:AdminCompanyBind_List") // 内部用户公司绑定列表
+	beego.Router(version+"/Admin/CompanyBind_Add", &controllers.UserController{}, "*:AdminCompanyBind_Add")   // 添加内部用户公司绑定
+	beego.Router(version+"/Admin/CompanyBind_Del", &controllers.UserController{}, "*:AdminCompanyBind_Del")   // 删除内部用户公司绑定
 
 	// 权限
 	beego.Router(version+"/Power/List", &controllers.UserController{}, "*:Power_List")         // 权限列表
@@ -42,8 +45,8 @@ func init() {
 	beego.Router(version+"/Menu/List_All", &controllers.UserController{}, "*:Menu_List_All") // 权限管理-菜单列表
 
 	// 公司管理
-	beego.Router(version+"/Company/List", &controllers.UserController{}, "*:Company_List") // 公司列表
-	beego.Router(version+"/Company/All", &controllers.UserController{}, "*:Company_All")   // 所有公司列表
+	beego.Router(version+"/Company/Tree", &controllers.UserController{}, "*:Company_Tree") // 公司列表
+	beego.Router(version+"/Company/List", &controllers.UserController{}, "*:Company_List") // 所有公司列表
 	beego.Router(version+"/Company/Add", &controllers.UserController{}, "*:Company_Add")   // 添加公司
 	beego.Router(version+"/Company/Edit", &controllers.UserController{}, "*:Company_Edit") // 修改公司
 	beego.Router(version+"/Company/Del", &controllers.UserController{}, "*:Company_Del")   // 删除公司

+ 4 - 4
routers/filter.go

@@ -40,8 +40,8 @@ func FilterRBAC(ctx *context.Context) {
 	if _, ok := filterExcludeURLMap[ctx.Request.URL.Path]; ok {
 		return
 	}
-
-	b_, admin := lib.Verification(ctx.GetCookie("User_tokey"), ctx.Input.Query("User_tokey"))
+	var b_ bool
+	b_, lib.Admin_r = lib.Verification(ctx.GetCookie("User_tokey"), ctx.Input.Query("User_tokey"))
 	if !b_ {
 		ctx.Output.JSON(lib.JSONS{Code: 201, Msg: "请重新登陆!"}, true, false)
 
@@ -51,7 +51,7 @@ func FilterRBAC(ctx *context.Context) {
 		return
 	}
 
-	power, _ := Account.Read_Power_ById(admin.T_power)
+	power, _ := Account.Read_Power_ById(lib.Admin_r.T_power)
 
 	if power.T_menu == "*" {
 		return
@@ -66,7 +66,7 @@ func FilterRBAC(ctx *context.Context) {
 		}
 	}
 	if !flag {
-		data := lib.JSONS{Code: 201, Msg: "无权访问!"}
+		data := lib.JSONS{Code: 202, Msg: "无权访问!"}
 		ctx.Output.JSON(data, true, false)
 	}
 

+ 9 - 7
routers/v3.go

@@ -34,6 +34,9 @@ func init() {
 	beego.Router(version+"/DeviceSensor/Parameter_List", &controllers.DeviceController{}, "*:DeviceSensor_Parameter_List") // 传感器参数列表
 	beego.Router(version+"/DeviceSensor/Parameter_Pu", &controllers.DeviceController{}, "*:DeviceSensor_Parameter_Pu")     // 修改传感器参数
 
+	// 传感器管理列表
+	beego.Router(version+"/DeviceSensor/Manage_List", &controllers.DeviceController{}, "*:DeviceSensor_Manage_List") // 传感器管理列表
+
 	beego.Router(version+"/Device/UpDeviceSensor_Tsort", &controllers.DeviceController{}, "*:UpDeviceSensor_Tsort")           // 传感器排序
 	beego.Router(version+"/Device/UpDeviceSensor_T3dview", &controllers.DeviceController{}, "*:UpDeviceSensor_T3dview")       // 传感器3D视图
 	beego.Router(version+"/Device/UpDeviceSensor_T_datashow", &controllers.DeviceController{}, "*:UpDeviceSensor_T_datashow") // 传感器屏蔽数据展示
@@ -73,13 +76,12 @@ func init() {
 	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") // 设置 设备参数
+	// 报警通知用户列表
+	beego.Router(version+"/Notice/User_List", &controllers.UserController{}, "*:User_Notice_List") // 报警通知用户列表
 
 	beego.Router(version+"/Data/Device_Sensor", &controllers.DataController{}, "*:Device_Sensor_Get")                       // 获取传感器
 	beego.Router(version+"/Data/Device_Sensor_List", &controllers.DataController{}, "*:Device_Sensor_List")                 // 传感器列表
@@ -87,9 +89,9 @@ 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/Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel") // 导出传感器设备数据excel
-	beego.Router(version+"/Data/PDF", &controllers.DataController{}, "*:Device_Sensor_Data_PDF")     // 传感器设备数据pdf
+	beego.Router(version+"/Data/List", &controllers.DataController{}, "*:Device_Sensor_Data_More")   // 设备数据列表
+	beego.Router(version+"/Data/Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel") // 导出设备数据列表excel
+	beego.Router(version+"/Data/PDF", &controllers.DataController{}, "*:Device_Sensor_Data_PDF")     // 设备数据列表pdf
 	// 执行 SQL
 	beego.Router(version+"/Data/Raw", &controllers.RawSqlController{}, "*:Raw") // 执行 SQL