package Device import ( "Cold_Api/conf" "Cold_Api/models/Admin" "encoding/json" "fmt" "github.com/astaxie/beego/cache" _ "github.com/astaxie/beego/cache/redis" "github.com/beego/beego/v2/adapter/orm" orm2 "github.com/beego/beego/v2/client/orm" beego "github.com/beego/beego/v2/server/web" _ "github.com/go-sql-driver/mysql" "strconv" "strings" "time" ) // 模板 type DeviceSensor struct { Id int `orm:"column(ID);size(11);auto;pk"` T_sn string `orm:"size(256);null"` // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机 T_id int `orm:"size(11);null"` // 传感器编号 T_name string `orm:"size(256);null"` // 标题 T_t float32 `orm:"size(10);null"` // 温度 T_rh float32 `orm:"size(10);null"` // 湿度 T_Tlower float32 `orm:"size(200);null"` // 温度下限 T_Tupper float32 `orm:"size(200);null"` // 温度上限 T_RHlower float32 `orm:"size(200);null"` // 湿度下限 T_RHupper float32 `orm:"size(200);null"` // 湿度上限 T_en int `orm:"size(2);1"` // en:是否启用传感器, T_free int `orm:"size(2);1"` // free:监测点是否为闲置状态(空库,只监测不报警) //T_del int `orm:"size(2);1"` // 0 删除 1 正常 //T_err int `orm:"size(2);1"` // 0 正常 1 异常 T_time time.Time `orm:"type(timestamp);null;"` // 采集时间 T_Bind string `orm:"size(256);null"` //设备绑定 Uid (这里单独改没有,要在 设备里面加入) T_Site string `orm:"size(256);null"` //GPS T_Dattery int `orm:"size(256);null"` //电量 T_monitor int `orm:"size(256);null"` // 记录状态 T_Calss string `orm:"size(256);null"` //设备分类 T_l_p int `orm:"size(22);null"` // 1物流端 2药店端 T_give int `orm:"size(2);1"` // 0 丢弃 1 正常 T_datashow int `orm:"size(2);1"` // 0 屏蔽数据展示 1 正常数据展示 T_Visit int `orm:"size(200);1"` // 浏览量 T_sort int `orm:"size(200);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 第一次保存时才设置时间 UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"` //auto_now 每次 model 保存时都会对时间自动更新 } type DeviceSensor_Del struct { T_sn string T_id int } func (t *DeviceSensor) TableName() string { return "DeviceSensor" // 数据库名称 // ************** 替换 FormulaList ************** } // 模板 type DeviceSensor_R struct { T_sn string // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机 T_id int // 传感器编号 T_name string // 标题 T_t float32 // 温度 T_rh float32 // 湿度 T_Tlower float32 // 温度下限 T_Tupper float32 // 温度上限 T_RHlower float32 // 湿度下限 T_RHupper float32 // 湿度上限 T_time string // 采集时间 T_Site string //GPS T_Dattery int //电量 T_monitor int // 记录状态 T_datashow int // 0 屏蔽数据展示 1 正常数据展示 } var redisCache_DeviceSensor cache.Cache var HTTPPort_int = 0 func init() { //注册模型 orm.RegisterModel(new(DeviceSensor)) config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`, "redis_DeviceSensor", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password) fmt.Println(config) var err error redisCache_DeviceSensor, err = cache.NewCache("redis", config) if err != nil || redisCache_DeviceSensor == nil { errMsg := "failed to init redis" fmt.Println(errMsg, err) } HTTPPort, _ := beego.AppConfig.String("HTTPPort") HTTPPort_int, _ = strconv.Atoi(HTTPPort) } // ---------------- Redis ------------------- //Redis_Set(m.T_sn,m) // Redis 更新缓存 func Redis_DeviceSensor_Set(r DeviceSensor) (err error) { key := r.T_sn + "|" + strconv.Itoa(r.T_id) //json序列化 str, err := json.Marshal(r) if err != nil { fmt.Print(err) return } err = redisCache_DeviceSensor.Put(key, str, 24*time.Hour) if err != nil { fmt.Println("set key:", key, ",value:", str, err) } return } //if r,is :=Redis_Get(T_sn);is{ //return r,nil //} func Redis_DeviceSensor_Get(key string) (r DeviceSensor, is bool) { if redisCache_DeviceSensor.IsExist(key) { //println("找到key:",key) v := redisCache_DeviceSensor.Get(key) json.Unmarshal(v.([]byte), &r) return r, true } //println("没有 找到key:",key) return DeviceSensor{}, false } func Redis_DeviceSensor_DelK(r DeviceSensor) (err error) { key := r.T_sn + "|" + strconv.Itoa(r.T_id) err = redisCache_DeviceSensor.Delete(key) return } func DeviceSensorToDeviceSensor_R(DeviceSensor_ DeviceSensor) (DeviceSensor_r DeviceSensor_R) { DeviceSensor_r.T_sn = DeviceSensor_.T_sn DeviceSensor_r.T_id = DeviceSensor_.T_id DeviceSensor_r.T_name = DeviceSensor_.T_name DeviceSensor_r.T_t = DeviceSensor_.T_t DeviceSensor_r.T_rh = DeviceSensor_.T_rh DeviceSensor_r.T_Tlower = DeviceSensor_.T_Tlower DeviceSensor_r.T_Tupper = DeviceSensor_.T_Tupper DeviceSensor_r.T_RHlower = DeviceSensor_.T_RHlower DeviceSensor_r.T_RHupper = DeviceSensor_.T_RHupper DeviceSensor_r.T_time = DeviceSensor_.T_time.Format("2006-01-02 15:04:05") DeviceSensor_r.T_Site = DeviceSensor_.T_Site DeviceSensor_r.T_Dattery = DeviceSensor_.T_Dattery DeviceSensor_r.T_monitor = DeviceSensor_.T_monitor DeviceSensor_r.T_datashow = DeviceSensor_.T_datashow // 最新设备数据 d_r, d_r_err := Read_Device_ByT_sn(DeviceSensor_.T_sn) if d_r_err == nil { DeviceSensor_r.T_monitor = d_r.T_monitor } // 最新数据 key_data := DeviceSensor_.T_sn + "|" + strconv.Itoa(DeviceSensor_.T_id) r, is := RedisDeviceData_Get_(key_data) if is { if DeviceSensor_.T_time.Unix() < r.T_time.Unix() { DeviceSensor_r.T_t = r.T_t DeviceSensor_r.T_rh = r.T_rh DeviceSensor_r.T_time = r.T_time.Format("2006-01-02 15:04:05") DeviceSensor_r.T_Site = r.T_Site DeviceSensor_r.T_Dattery = r.T_Dattery } } return } // ---------------- 特殊方法 ------------------- // 获取 func Read_DeviceSensor_ByT_sn(T_sn string, T_id int) (r DeviceSensor, is bool) { key := r.T_sn + "|" + strconv.Itoa(r.T_id) if r, is := Redis_DeviceSensor_Get(key); is { return r, true } o := orm.NewOrm() r = DeviceSensor{T_sn: T_sn, T_id: T_id} err := o.Read(&r, "T_sn", "T_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名 if err != nil { fmt.Println("Delete_DeviceSensor_ById", err) return r, false } Redis_DeviceSensor_Set(r) return r, true } // 删除 func Delete_DeviceSensor_ById(T_sn string, T_id int) (err error) { fmt.Println("Delete_DeviceSensor : T_sn", T_sn, "T_id", T_id) o := orm.NewOrm() r := DeviceSensor{T_sn: T_sn, T_id: T_id} err = o.Read(&r, "T_sn", "T_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名 if err != nil { fmt.Println("Delete_DeviceSensor_ById", err) return err } // ascertain id exists in the database var num int64 if num, err = o.Delete(&DeviceSensor{Id: r.Id}); err == nil { fmt.Println("Number of records deleted in database:", num) } Redis_DeviceSensor_DelK(r) return } // 添加 func Add_DeviceSensor(Devicesensor DeviceSensor) int { //if(conf.Test_server) {return } o := orm.NewOrm() r := Devicesensor r.T_give = 1 r.T_datashow = 1 // 三个返回参数依次为:是否新创建的,对象 Id 值,错误 _, id, err := o.ReadOrCreate(&r, "T_sn", "T_id") if err != nil { return 0 } //if !is { // //fmt.Println(Devicesensor.T_id," ReadOrCreate ",id) // Devicesensor.Id = int(id) // if Devicesensor.T_name == "*" || len(Devicesensor.T_name) == 0 { // //fmt.Println("Add_DeviceSensor:",Devicesensor.T_sn,Devicesensor.T_id,Devicesensor.T_Bind) // o.Update(&Devicesensor, "T_Bind", "T_t", "T_rh", "T_Tlower", "T_Tupper", "T_RHlower", "T_RHupper", "T_Site", "T_Dattery", "T_time") // // } else { // //fmt.Println("Add_DeviceSensor:",Devicesensor.T_sn,Devicesensor.T_id,Devicesensor.T_Bind) // o.Update(&Devicesensor, "T_Bind", "T_name", "T_t", "T_rh", "T_Tlower", "T_Tupper", "T_RHlower", "T_RHupper", "T_Site", "T_Dattery", "T_time") // // } //} Redis_DeviceSensor_Set(Devicesensor) return int(id) } // 修改 func Update_DeviceSensor(r DeviceSensor, cols ...string) bool { o := orm.NewOrm() if num, err := o.Update(&r, cols...); err == nil { fmt.Println("Number of records updated in database:", num) Redis_DeviceSensor_Set(r) return true } return false } // 修改 func Update_DeviceSensor_ByTsn_T_Tx_T_RHx(T_sn string, T_id int, T_Tlower float32, T_Tupper float32, T_RHlower float32, T_RHupper float32) (err error) { o := orm.NewOrm() v := DeviceSensor{T_sn: T_sn, T_id: T_id} // ascertain id exists in the database if err = o.Read(&v, "T_sn", "T_id"); err == nil { v.T_Tlower = T_Tlower v.T_Tupper = T_Tupper v.T_RHlower = T_RHlower v.T_RHupper = T_RHupper o.Update(&v, "T_en", "T_free", "T_del") } return err } // 修改 func Update_DeviceSensor_ByTsn_T_en_T_free_T_del(T_sn string, T_id int, T_en int, T_free int, T_del int) (err error) { o := orm.NewOrm() v := DeviceSensor{T_sn: T_sn, T_id: T_id} // ascertain id exists in the database if err = o.Read(&v, "T_sn", "T_id"); err == nil { v.T_en = T_en //v.T_del = T_del v.T_free = T_free o.Update(&v, "T_en", "T_free", "T_del") } return err } //// 修改 //func Update_DeviceSensor_ByTsn_T_err(T_sn string, T_id int, T_err int) (err error) { // o := orm.NewOrm() // v := DeviceSensor{T_sn: T_sn, T_id: T_id} // // ascertain id exists in the database // if err = o.Read(&v, "T_sn", "T_id"); err == nil { // // v.T_err = T_err // // o.Update(&v, "T_err") // } // return err //} // 修改 func DeviceSensor_Bind_Del(T_sn string, T_id int, T_Calss_id int) (err error) { o := orm.NewOrm() v := DeviceSensor{T_sn: T_sn, T_id: T_id} T_Calss := "C" + strconv.Itoa(T_Calss_id) + "|" if err = o.Read(&v, "T_sn", "T_id"); err == nil { v.T_Calss = strings.Replace(v.T_Calss, T_Calss, "", -1) o.Update(&v, "T_Calss") } return err } // 修改 func DeviceSensor_T_Calss_Add(T_sn string, T_id int, T_Calss_id int) (err error) { o := orm.NewOrm() v := DeviceSensor{T_sn: T_sn, T_id: T_id} T_Calss := "C" + strconv.Itoa(T_Calss_id) + "|" if err = o.Read(&v, "T_sn", "T_id"); err == nil { v.T_Calss = strings.Replace(v.T_Calss, T_Calss, "", -1) v.T_Calss = v.T_Calss + T_Calss o.Update(&v, "T_Calss") } return err } // 修改 func DeviceSensor_T_Calss_ALL_Del(T_Calss_id int) { o := orm.NewOrm() qs := o.QueryTable(new(DeviceSensor)) var r []DeviceSensor T_Calss := "C" + strconv.Itoa(T_Calss_id) + "|" qs.Filter("T_Calss__icontains", T_Calss).All(&r) for _, v := range r { v.T_Calss = strings.Replace(v.T_Calss, T_Calss, "", -1) o.Update(&v, "T_Calss") } } // 修改 //func DeviceSensor_T_Bind_ALL_Del(admin_r Admin.Admin) { // o := orm.NewOrm() // qs := o.QueryTable(new(DeviceSensor)) // var r []DeviceSensor // T_Bind := "U" + strconv.Itoa(admin_r.Id) + "|" // qs.Filter("T_Bind__icontains", T_Bind).All(&r) // for _, v := range r { // v.T_Bind = strings.Replace(v.T_Bind, T_Bind, "", -1) // o.Update(&v, "T_Bind") // } //} // 修改 func DeviceSensor_T_Bind_Add(T_sn string, T_id int, admin_r Admin.Admin) (err error) { o := orm.NewOrm() v := DeviceSensor{T_sn: T_sn, T_id: T_id} T_Bind := "U" + strconv.Itoa(admin_r.Id) + "|" if err = o.Read(&v, "T_sn", "T_id"); err == nil { v.T_Bind = strings.Replace(v.T_Bind, T_Bind, "", -1) v.T_Bind = v.T_Bind + T_Bind o.Update(&v, "T_Bind") } return err } // //// 修改 //func Update_DeviceSensor_ByTsn_All_T_Bind(T_sn string, T_Bind string) (err error) { // o := orm.NewOrm() // var r_l []DeviceSensor // qs := o.QueryTable(new(DeviceSensor)) // // qs.Filter("T_sn", T_sn).OrderBy("T_id").All(&r_l) // for _, v := range r_l { // v.T_Bind = T_Bind // // o.Update(&v, "T_Bind") // } // // return err //} // 获取最新数据 func DeviceSensor_T_Bind_ALL(T_sn string, T_Bind string) { o := orm.NewOrm() res, err := o.Raw("UPDATE DeviceSensor SET `t__bind` = '" + T_Bind + "' WHERE `t_sn` = '" + T_sn + "' ").Exec() if err == nil { num, _ := res.RowsAffected() fmt.Println("mysql row affected nums: ", num) } } // 获取最新数据 func DeviceSensor_T_l_p_ALL(T_sn string, T_l_p int) { o := orm.NewOrm() res, err := o.Raw("UPDATE DeviceSensor SET `t_l_p` = " + strconv.Itoa(T_l_p) + " WHERE `t_sn` = '" + T_sn + "' ").Exec() if err == nil { num, _ := res.RowsAffected() fmt.Println("mysql row affected nums: ", num) } } // 获取最新数据 func DeviceSensor_t_give_ALL(T_sn string, t_give int) { o := orm.NewOrm() res, err := o.Raw("UPDATE DeviceSensor SET `t_give` = " + strconv.Itoa(t_give) + " WHERE `t_sn` = '" + T_sn + "' ").Exec() if err == nil { num, _ := res.RowsAffected() fmt.Println("mysql row affected nums: ", num) } } // 获取 ById func Read_DeviceSensor_ByTsn_Tid(T_sn string, T_id int) (r DeviceSensor, err error) { o := orm.NewOrm() r = DeviceSensor{T_sn: T_sn, T_id: T_id} err = o.Read(&r, "T_sn", "T_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名 return r, err } // 获取列表 func Read_DeviceSensor_ByTsn(T_sn string) ([]DeviceSensor_R, int) { o := orm.NewOrm() // 也可以直接使用 Model 结构体作为表名 qs := o.QueryTable(new(DeviceSensor)) var r []DeviceSensor qs.Filter("T_sn", T_sn).OrderBy("T_id").All(&r) cnt, _ := qs.Filter("T_sn", T_sn).Count() var DeviceSensor_r []DeviceSensor_R for _, v := range r { DeviceSensor_r = append(DeviceSensor_r, DeviceSensorToDeviceSensor_R(v)) //DeviceSensorData, is := Read_DeviceSensorData_ById_New(v.T_sn, v.T_id) //if !is { // continue //} ////fmt.Println(v.T_sn, v.T_id, DeviceSensorData.T_time) //r[i].T_t = DeviceSensorData.T_t //r[i].T_rh = DeviceSensorData.T_rh //r[i].T_time = DeviceSensorData.T_time } return DeviceSensor_r, int(cnt) } // 获取列表 func Read_DeviceSensor_ALL_1(page int, T_sn string) (r []DeviceSensor, cnt int64) { o := orm.NewOrm() // 也可以直接使用 Model 结构体作为表名 qs := o.QueryTable(new(DeviceSensor)) var offset int64 if page <= 1 { offset = 0 } else { offset = int64((page - 1) * conf.Page_size) } qs.Limit(conf.Page_size, offset).Filter("T_sn", T_sn).OrderBy("T_id").Filter("T_del", 1).All(&r) cnt, _ = qs.Filter("T_sn", T_sn).Filter("T_del", 1).Count() return r, cnt } // 获取列表 func Read_DeviceSensor_ALL_T_del_x(page int, T_sn string) (r []DeviceSensor, cnt int64) { o := orm.NewOrm() // 也可以直接使用 Model 结构体作为表名 qs := o.QueryTable(new(DeviceSensor)) var offset int64 if page <= 1 { offset = 0 } else { offset = int64((page - 1) * conf.Page_size) } qs.Limit(conf.Page_size, offset).Filter("T_sn", T_sn).OrderBy("T_id").All(&r) cnt, _ = qs.Filter("T_sn", T_sn).Count() for i, v := range r { DeviceSensorData, is := Read_DeviceSensorData_ById_New(v.T_sn, v.T_id) if !is { continue } //fmt.Println(v.T_sn, v.T_id, DeviceSensorData.T_time) r[i].T_t = DeviceSensorData.T_t r[i].T_rh = DeviceSensorData.T_rh r[i].T_time = DeviceSensorData.T_time } return r, cnt } // 获取列表 func Read_DeviceSensor_class_ALL_1(user_ Admin.Admin, T_Calss_id int, page int, page_z int, T_sn string, T_name string, SN_type string) (r []DeviceSensor, cnt int64) { o := orm.NewOrm() // 也可以直接使用 Model 结构体作为表名 qs := o.QueryTable(new(DeviceSensor)) var offset int64 if page_z == 0 { page_z = conf.Page_size } if page <= 1 { offset = 0 } else { offset = int64((page - 1) * page_z) } T_Calss := "" if T_Calss_id != 0 { T_Calss = "C" + strconv.Itoa(T_Calss_id) + "|" } T_Bind := "U" + strconv.Itoa(user_.Id) + "|" if user_.Admin_master <= 1 { T_Bind = "" } fmt.Println("T_Bind:", T_Bind) fmt.Println("T_Calss:", T_Calss) 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) // 非内部权限 println("user_.Admin_power:", user_.Admin_power) if len(T_sn) < 6 { cond1 = cond.AndCond(cond1).AndCond(cond.And("T_give", 1)) } qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r) cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count() // //qs.Limit(page_z, offset).Filter("T_Bind__icontains", T_Bind).Filter("T_Calss__icontains", T_Calss).Filter("T_sn__icontains", SN_type).Filter("T_sn__icontains", T_sn).Filter("T_name__icontains", T_name).OrderBy("T_sort").All(&r) //cnt, _ = qs.Filter("T_Bind__icontains", T_Bind).Filter("T_Calss__icontains", T_Calss).Filter("T_sn__icontains", T_sn).Filter("T_sn__icontains", SN_type).Filter("T_name__icontains", T_name).Count() for i, v := range r { // 提前最新数据 DeviceSensorData, is := Read_DeviceSensorData_ById_New(v.T_sn, v.T_id) if !is { continue } if DeviceSensorData.T_time.After(v.T_time) { //fmt.Println(v.T_sn, v.T_id, DeviceSensorData.T_time) r[i].T_t = DeviceSensorData.T_t r[i].T_rh = DeviceSensorData.T_rh r[i].T_time = DeviceSensorData.T_time } } return r, cnt } // 获取列表 func Read_DeviceSensor_Map_ALL_1(user_ Admin.Admin, T_Calss_id int, T_sn string, T_name string, SN_type string) (r []DeviceSensor) { o := orm.NewOrm() // 也可以直接使用 Model 结构体作为表名 qs := o.QueryTable(new(DeviceSensor)) //now := time.Now() //// 一天前 //d, _ := time.ParseDuration("-1h") //now = now.Add(d) T_Calss := "" if T_Calss_id != 0 { T_Calss = "C" + strconv.Itoa(T_Calss_id) + "|" } T_Bind := "U" + strconv.Itoa(user_.Id) + "|" if user_.Admin_master <= 1 { T_Bind = "" } fmt.Println("T_Bind:", T_Bind) fmt.Println("T_Calss:", T_Calss) qs.Filter("T_Bind__icontains", T_Bind).Filter("T_Calss__icontains", T_Calss).Filter("T_sn__icontains", SN_type).Filter("T_sn__icontains", T_sn).Filter("T_name__icontains", T_name).OrderBy("-UpdateTime").All(&r) //.Filter("UpdateTime__gte", now) return r } // 获取列表 func Read_DeviceSensor_ALL_T_sn_T_id_class_1(T_sn string, T_id int, T_Calss_id int) (r []DeviceSensor) { o := orm.NewOrm() // 也可以直接使用 Model 结构体作为表名 qs := o.QueryTable(new(DeviceSensor)) T_Calss := "C" + strconv.Itoa(T_Calss_id) + "|" qs.Filter("T_Calss__icontains", T_Calss).Filter("T_id", T_id).Filter("T_sn", T_sn).All(&r) return r } // 获取列表 func Read_DeviceSensor_ALL_class_1(T_Calss_id int) (r []DeviceSensor) { o := orm.NewOrm() // 也可以直接使用 Model 结构体作为表名 qs := o.QueryTable(new(DeviceSensor)) T_Calss := "C" + strconv.Itoa(T_Calss_id) + "|" qs.Filter("T_Calss__icontains", T_Calss).All(&r) return r } func DELETE_DeviceSensor(SN string) bool { sql := "DELETE FROM `culd`.`DeviceSensor` WHERE `t_sn` = '" + SN + "' " o := orm.NewOrm() _, err := o.Raw(sql).Exec() if err != nil { return false } return true }