scene.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package scene
  2. import (
  3. "context"
  4. "github.com/gogf/gf/database/gredis"
  5. )
  6. const (
  7. timerScenePrefix = "scene:timer:*"
  8. deviceScenePrefix = "scene:device_status:*"
  9. weatherScenePrefix = "scene:weather:*"
  10. scenePrefix = "scene:*"
  11. dataExpires = 7200
  12. )
  13. type GetSceneParams struct {
  14. Type string `json:"type"`
  15. Name string `json:"name"`
  16. DeviceCode string `json:"device_code"`
  17. }
  18. type InfoScene struct {
  19. Key string `json:"key"`
  20. Name string `json:"name"`
  21. Desc string `json:"desc"`
  22. SceneId string `json:"scene_id"`
  23. Config string `json:"config"`
  24. }
  25. type AllSceneResult struct {
  26. Total int `json:"total"`
  27. Data []*InfoScene `json:"data"`
  28. }
  29. type Info struct {
  30. Key string `json:"key"`
  31. Name string `json:"name"`
  32. Desc string `json:"desc"`
  33. SceneId string `json:"scene_id"`
  34. Config string `json:"config"`
  35. }
  36. type Manager struct {
  37. redisClient *gredis.Redis
  38. ctx context.Context
  39. }
  40. func NewSceneManager(host string, port int) *Manager {
  41. red := gredis.New(&gredis.Config{
  42. Host: host,
  43. Port: port,
  44. Db: 2,
  45. MaxActive: 100,
  46. })
  47. ctx := context.Background()
  48. helper := &Manager{
  49. redisClient: red,
  50. ctx: ctx,
  51. }
  52. return helper
  53. }
  54. func (a *Manager) SaveScene(info *Info) error {
  55. _, err := a.redisClient.DoVar("SET", info.Key, info)
  56. if err != nil {
  57. return err
  58. }
  59. //_, err = a.redisClient.Do("EXPIRE", info.Key, -1)
  60. //if err != nil {
  61. // return err
  62. //}
  63. return nil
  64. }
  65. func (a *Manager) GetScene(key string) (string, error) {
  66. // get status from redis
  67. result, err := a.redisClient.DoVar("GET", key)
  68. if err != nil {
  69. return "", err
  70. }
  71. return result.String(), nil
  72. }
  73. func (a *Manager) DeleteScene(key string) error {
  74. // get status from redis
  75. _, err := a.redisClient.Do("DEL", key)
  76. if err != nil {
  77. return err
  78. }
  79. return nil
  80. }
  81. // GetAllScenesPage 查询定时场景
  82. func (a *Manager) GetAllScenesPage(code string, pi, ps int) (AllSceneResult, error) {
  83. var key string
  84. switch code {
  85. case "time":
  86. key = timerScenePrefix
  87. case "device":
  88. key = deviceScenePrefix
  89. case "weather":
  90. key = weatherScenePrefix
  91. default:
  92. key = scenePrefix
  93. }
  94. var result AllSceneResult
  95. // 使用KEYS命令获取所有匹配前缀的键s
  96. keys, err := a.redisClient.DoVar("KEYS", key)
  97. if err != nil {
  98. return result, err
  99. }
  100. // 检查是否有数据
  101. if keys.IsEmpty() {
  102. return result, nil
  103. }
  104. var start, end int
  105. // 转换为字符串切片
  106. keyList := keys.Strings()
  107. result.Total = len(keyList)
  108. if len(keyList) > 0 {
  109. start = (pi - 1) * ps
  110. end = pi*ps - 1
  111. if end > len(keyList)-1 {
  112. end = len(keyList) - 1
  113. }
  114. }
  115. // 存储所有结果
  116. for i := start; i <= end; i++ {
  117. scene := new(InfoScene)
  118. r, err := a.redisClient.DoVar("GET", keyList[i])
  119. if err != nil {
  120. return result, err
  121. }
  122. err = r.Struct(&scene)
  123. if err != nil {
  124. return result, err
  125. }
  126. result.Data = append(result.Data, scene)
  127. }
  128. return result, nil
  129. }
  130. // GetAllScenes 查询定时场景
  131. func (a *Manager) GetAllScenes(code string) ([]*InfoScene, error) {
  132. var key string
  133. switch code {
  134. case "time":
  135. key = timerScenePrefix
  136. case "device":
  137. key = deviceScenePrefix
  138. case "weather":
  139. key = weatherScenePrefix
  140. default:
  141. key = scenePrefix
  142. }
  143. // 使用KEYS命令获取所有匹配前缀的键s
  144. keys, err := a.redisClient.DoVar("KEYS", key)
  145. if err != nil {
  146. return nil, err
  147. }
  148. // 检查是否有数据
  149. if keys.IsEmpty() {
  150. return nil, nil
  151. }
  152. // 转换为字符串切片
  153. keyList := keys.Strings()
  154. // 存储所有结果
  155. scenes := make([]*InfoScene, 0)
  156. var scene InfoScene
  157. for _, v := range keyList {
  158. r, err := a.redisClient.DoVar("GET", v)
  159. if err != nil {
  160. return nil, err
  161. }
  162. err = r.Struct(&scene)
  163. if err != nil {
  164. return nil, err
  165. }
  166. scenes = append(scenes, &scene)
  167. }
  168. return scenes, nil
  169. }