Device.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. package Device
  2. import (
  3. "AIOTCOER/conf"
  4. "AIOTCOER/lib"
  5. "AIOTCOER/logs"
  6. "AIOTCOER/models"
  7. "AIOTCOER/models/Product"
  8. "encoding/json"
  9. "fmt"
  10. "github.com/astaxie/beego/cache"
  11. _ "github.com/astaxie/beego/cache/redis"
  12. "github.com/beego/beego/v2/adapter/orm"
  13. orm2 "github.com/beego/beego/v2/client/orm"
  14. _ "github.com/go-sql-driver/mysql"
  15. "github.com/vmihailenco/msgpack/v5"
  16. "time"
  17. )
  18. // 设备
  19. type Device struct {
  20. T_sn string `orm:"size(64);pk" json:"T_sn" msgpack:"T_sn" form:"T_sn"` // Sn
  21. T_password string `orm:"size(128);" json:"T_password" msgpack:"T_password" form:"T_password"` // 设备密钥
  22. T_ckey string `orm:"size(32);" json:"-" msgpack:"T_ckey" form:"T_ckey" ` // 控制密钥 (业务系统自动生成 < 64位)
  23. T_online int `orm:"size(1);index;default(3)" json:"T_online" msgpack:"T_online" form:"T_online"` // 在线状态 1 在线 2 离线 3 未激活
  24. T_ProductID string `orm:"size(32);index" json:"T_ProductID" msgpack:"T_ProductID" form:"T_ProductID"` // 产品类型
  25. T_ProductJson Product.ProductType `orm:"-" json:"T_ProductJson" msgpack:"T_ProductJson"` // 产品类型 json
  26. T_data string `orm:"column(t_data);type(text);default('')" json:"T_data" msgpack:"T_data" ` // 设备数据
  27. T_dataJson map[string]interface{} `orm:"-" json:"T_dataJson" msgpack:"T_dataJson"` // 设备数据
  28. T_RelayData string `orm:"type(text);default('[]')" json:"T_RelayData" msgpack:"T_RelayData" form:"T_RelayData"` // 消息转发
  29. T_RelayDataJson []map[string]interface{} `orm:"-" json:"T_RelayDataJson" msgpack:"T_RelayDataJson"` // 消息转发 json
  30. CreateTime models.Time `orm:"column(create_time);type(timestamp);auto_now_add" json:"CreateTime" msgpack:"CreateTime"`
  31. UpdateTime models.Time `orm:"column(update_time);type(timestamp);auto_now" json:"UpdateTime" msgpack:"UpdateTime"`
  32. }
  33. /*
  34. 消息转发 T_RelayData \ T_RelayDataJson
  35. [
  36. {
  37. "T_tabs": "AAAA.AAAA",
  38. "T_name": "推送报警",
  39. "T_pushid": 0,
  40. "T_pub": "/aaa/{$sn}/AAAA"
  41. },
  42. {
  43. "T_tabs": "AAAA.BBBB",
  44. "T_name": "推送报警",
  45. "T_pushid": 0,
  46. "T_pub": "/aaa/{$sn}/BBBB"
  47. }, {
  48. "T_tabs": "AAAA.CCCC",
  49. "T_name": "推送报警",
  50. "T_pushid": 0,
  51. "T_pub": "/aaa/{$sn}/CCCC"
  52. }
  53. ]
  54. -----------------
  55. // {KEY} 监听 TAB 标识 拼接:AAAA.BBBB 对象后面加点
  56. // T_name 名称
  57. // T_mode 推送服务 0:Nats 1:API 2:MQTT
  58. // T_pub 发布号 /aaa/{$sn}/bbb
  59. */
  60. // 设备 - 列表
  61. type Device_List struct {
  62. T_sn string `orm:"size(64);pk" json:"T_sn" form:"T_sn"` // Sn
  63. T_online int `orm:"size(1);index;default(3)" json:"T_online" form:"T_online"` // 在线状态 1 在线 2 离线 3 未激活
  64. CreateTime models.Time `orm:"column(create_time);type(timestamp);auto_now_add" json:"CreateTime"`
  65. UpdateTime models.Time `orm:"column(update_time);type(timestamp);auto_now" json:"UpdateTime"`
  66. }
  67. func (t *Device) TableName() string {
  68. return "Device" // 数据库名称 // ************** 替换 FormulaList **************
  69. }
  70. var redis_Device cache.Cache
  71. func init() {
  72. //注册模型
  73. orm.RegisterModel(new(Device))
  74. config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
  75. "redis_Device", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
  76. var err error
  77. redis_Device, err = cache.NewCache("redis", config)
  78. if err != nil || redis_Device == nil {
  79. logs.PrintlnError(config, err)
  80. panic(any(err))
  81. }
  82. }
  83. // ---------------- Redis -------------------
  84. func (t *Device) Redis_Set() (err error) {
  85. if len(t.T_data) > 5 {
  86. var T_datajson map[string]interface{}
  87. json.Unmarshal([]byte(t.T_data), &T_datajson)
  88. t.T_dataJson = T_datajson
  89. }
  90. if len(t.T_ProductID) > 0 {
  91. t.T_ProductJson.T_ProductID = t.T_ProductID
  92. t.T_ProductJson.Read()
  93. }
  94. if len(t.T_RelayData) > 0 {
  95. var T_datajson []map[string]interface{}
  96. json.Unmarshal([]byte(t.T_RelayData), &T_datajson)
  97. t.T_RelayDataJson = T_datajson
  98. }
  99. //json序列化
  100. str, err := msgpack.Marshal(t)
  101. if err != nil {
  102. logs.PrintlnError("Redis_Set", err)
  103. return
  104. }
  105. err = redis_Device.Put(t.T_sn, str, 24*time.Hour)
  106. if err != nil {
  107. logs.Println("set key:", t.T_sn, ",value:", str, err)
  108. }
  109. return
  110. }
  111. func (t *Device) Redis_Get(key string) (is bool) {
  112. if redis_Device.IsExist(key) {
  113. //println("找到key:",key)
  114. v := redis_Device.Get(key)
  115. if v == nil {
  116. return false
  117. }
  118. msgpack.Unmarshal(v.([]byte), t)
  119. return true
  120. }
  121. //println("没有 找到key:",key)
  122. return false
  123. }
  124. func (t *Device) Redis_DelK() (err error) {
  125. err = redis_Device.Delete(t.T_sn)
  126. return
  127. }
  128. // ---------------- 方法 -------------------
  129. // 获取(不带缓存查询)
  130. func (t *Device) Read() (is bool) {
  131. o := orm.NewOrm()
  132. err := o.Read(t) // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
  133. if err != nil {
  134. return false
  135. }
  136. return true
  137. }
  138. // 获取-高效的
  139. func (t *Device) Read_Tidy() (bool bool) {
  140. if t.Redis_Get(t.T_sn) {
  141. return true
  142. }
  143. o := orm.NewOrm()
  144. err := o.Read(t) // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
  145. if err != nil {
  146. return false
  147. }
  148. t.Redis_Set() // Redis 更新缓存
  149. return true
  150. }
  151. func (Device_r *Device) CreateSn(GetRandstringI int) bool {
  152. GetRandstringI += GetRandstringI * 100
  153. if len(Device_r.T_sn) < 10 {
  154. for true {
  155. Device_r.T_sn = lib.WeekByDate() + lib.GetRandstring(10, "0123456789123456789", int64(GetRandstringI))
  156. Device_is := Device{T_sn: Device_r.T_sn}
  157. if !Device_is.Read() {
  158. break
  159. }
  160. GetRandstringI += 1
  161. }
  162. } else {
  163. Device_is := Device{T_sn: Device_r.T_sn}
  164. if Device_is.Read() {
  165. return false
  166. }
  167. Device_r.Add()
  168. }
  169. GetRandstringI += 1
  170. // mysql 秘钥
  171. if len(Device_r.T_password) == 0 {
  172. Device_r.T_password = lib.GetRandstring(16, "", int64(GetRandstringI))
  173. }
  174. //println(Device_r.T_password)
  175. //Device_r.T_password = lib.Sha256(Device_r.T_password)
  176. Device_r.Add()
  177. return true
  178. }
  179. // 添加
  180. func (t *Device) Add() (is bool) {
  181. o := orm.NewOrm()
  182. id, err := o.Insert(t)
  183. if err != nil {
  184. return false
  185. }
  186. println(id)
  187. t.Redis_Set()
  188. return true
  189. }
  190. // 修改
  191. func (t *Device) Update(cols ...string) bool {
  192. data, _ := json.Marshal(t.T_dataJson)
  193. t.T_data = string(data)
  194. // 更新时间
  195. t.UpdateTime.NowDbTime()
  196. cols = append(cols, "UpdateTime")
  197. o := orm.NewOrm()
  198. if num, err := o.Update(t, cols...); err == nil {
  199. logs.Println("Number of records updated in database:", num)
  200. t.Redis_Set() // Redis 更新缓存
  201. return true
  202. }
  203. return false
  204. }
  205. // 删除
  206. func (t *Device) Delete() bool {
  207. o := orm.NewOrm()
  208. if num, err := o.Delete(t); err == nil {
  209. logs.Println("Number of records deleted in database:", num)
  210. } else {
  211. return false
  212. }
  213. t.Redis_DelK()
  214. return true
  215. }
  216. // 获取列表
  217. func (t *Device) Lists(PageIndex int, PageSize int) ([]Device_List, int64) {
  218. o := orm.NewOrm()
  219. // 也可以直接使用 Model 结构体作为表名
  220. qs := o.QueryTable(new(Device))
  221. var offset int64
  222. if PageIndex <= 1 {
  223. offset = 0
  224. } else {
  225. offset = int64((PageIndex - 1) * PageSize)
  226. }
  227. // 筛选参数
  228. cond := orm.NewCondition().And("T_ProductID", t.T_ProductID)
  229. if len(t.T_sn) > 0 {
  230. cond = cond.And("T_sn__icontains", t.T_sn) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
  231. }
  232. if t.T_online > 0 {
  233. cond = cond.And("T_online", t.T_online) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
  234. }
  235. var r []Device
  236. // 执行
  237. qs.Limit(PageSize, offset).SetCond((*orm2.Condition)(cond)).OrderBy("-CreateTime").All(&r)
  238. Total, _ := qs.SetCond((*orm2.Condition)(cond)).Count()
  239. var Device_List_r []Device_List
  240. for _, v := range r {
  241. Device_List_r = append(Device_List_r, Device_List{
  242. T_sn: v.T_sn,
  243. T_online: v.T_online,
  244. CreateTime: v.CreateTime,
  245. UpdateTime: v.UpdateTime,
  246. })
  247. }
  248. // if len(r[i].T_ProductID) > 0 {
  249. // r[i].T_ProductJson.T_ProductID = r[i].T_ProductID
  250. // r[i].T_ProductJson.Read()
  251. // }
  252. // if len(r[i].T_data) > 5 {
  253. // var T_datajson map[string]interface{}
  254. // json.Unmarshal([]byte(r[i].T_data), &T_datajson)
  255. // r[i].T_dataJson = T_datajson
  256. // }
  257. // if len(r[i].T_RelayData) > 0 {
  258. // var T_datajson []map[string]interface{}
  259. // json.Unmarshal([]byte(r[i].T_RelayData), &T_datajson)
  260. // r[i].T_RelayDataJson = T_datajson
  261. // //logs.Println("T_RelayData", r[i].T_RelayDataJson)
  262. // }
  263. //}
  264. return Device_List_r, Total
  265. }
  266. //// 获取列表
  267. //func (t *Device) Lists(PageIndex int, PageSize int) (r []Device, Total int64) {
  268. //
  269. // o := orm.NewOrm()
  270. //
  271. // // 也可以直接使用 Model 结构体作为表名
  272. // qs := o.QueryTable(new(Device))
  273. // var offset int64
  274. // if PageIndex <= 1 {
  275. // offset = 0
  276. // } else {
  277. // offset = int64((PageIndex - 1) * PageSize)
  278. // }
  279. //
  280. // // 筛选参数
  281. // cond := orm.NewCondition()
  282. // if len(t.T_ProductID) > 0 {
  283. // cond = cond.And("T_ProductID", t.T_ProductID) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
  284. // }
  285. // if len(t.T_sn) > 0 {
  286. // cond = cond.And("T_sn__icontains", t.T_sn) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
  287. // }
  288. // if t.T_online > 0 {
  289. // cond = cond.And("T_online", t.T_online) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
  290. // }
  291. //
  292. // // 执行
  293. // qs.Limit(PageSize, offset).SetCond((*orm2.Condition)(cond)).OrderBy("-UpdateTime").All(&r)
  294. // Total, _ = qs.SetCond((*orm2.Condition)(cond)).Count()
  295. // for i, _ := range r {
  296. // if len(r[i].T_ProductID) > 0 {
  297. // r[i].T_ProductJson.T_ProductID = r[i].T_ProductID
  298. // r[i].T_ProductJson.Read()
  299. // }
  300. // if len(t.T_data) > 5 {
  301. // var T_datajson map[string]interface{}
  302. // json.Unmarshal([]byte(t.T_data), &T_datajson)
  303. // t.T_dataJson = T_datajson
  304. // }
  305. // }
  306. // return r, Total
  307. //}
  308. // 获取列表
  309. func (t *Device) Lists_All() (r []Device) {
  310. o := orm.NewOrm()
  311. // 也可以直接使用 Model 结构体作为表名
  312. qs := o.QueryTable(new(Device))
  313. // 筛选参数
  314. cond := orm.NewCondition()
  315. if len(t.T_ProductID) > 0 {
  316. cond = cond.And("T_ProductID", t.T_ProductID) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
  317. }
  318. // 执行
  319. qs.SetCond((*orm2.Condition)(cond)).All(&r)
  320. for i, _ := range r {
  321. if len(r[i].T_ProductID) > 0 {
  322. r[i].T_ProductJson.T_ProductID = r[i].T_ProductID
  323. r[i].T_ProductJson.Read()
  324. }
  325. if len(t.T_data) > 5 {
  326. var T_datajson map[string]interface{}
  327. json.Unmarshal([]byte(t.T_data), &T_datajson)
  328. t.T_dataJson = T_datajson
  329. }
  330. }
  331. return r
  332. }
  333. // 删除 关联设备缓存
  334. func Device_CacheDelK_All(T_ProductID string) {
  335. o := orm.NewOrm()
  336. // 也可以直接使用 Model 结构体作为表名
  337. qs := o.QueryTable(new(Device))
  338. // 筛选参数
  339. cond := orm.NewCondition()
  340. cond = cond.And("T_ProductID", T_ProductID) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
  341. // 执行
  342. var r []Device
  343. qs.SetCond((*orm2.Condition)(cond)).All(&r)
  344. for _, v := range r {
  345. v.Redis_DelK()
  346. }
  347. return
  348. }