| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- package scene
- import (
- "context"
- "github.com/gogf/gf/database/gredis"
- "time"
- )
- const (
- timerScenePrefix = "scene:timer:*"
- deviceScenePrefix = "scene:device_status:*"
- weatherScenePrefix = "scene:weather:*"
- scenePrefix = "scene:*"
- dataExpires = 7200
- )
- type GetSceneParams struct {
- Type string `json:"type"`
- Name string `json:"name"`
- DeviceCode string `json:"device_code"`
- }
- type InfoScene struct {
- Key string `json:"key"`
- Name string `json:"name"`
- ConditionDesc string `json:"condition_desc"`
- ActionDesc string `json:"action_desc"`git
- SceneId string `json:"scene_id"`
- Config string `json:"config"`
- }
- type AllSceneResult struct {
- Total int `json:"total"`
- Data []*InfoScene `json:"data"`
- }
- type Info struct {
- Key string `json:"key"`
- Name string `json:"name"`
- ActionDesc string `json:"action_desc"`
- ConditionDesc string `json:"condition_desc"`
- SceneId string `json:"scene_id"`
- Config string `json:"config"`
- Time time.Time `json:"time"`
- }
- type Manager struct {
- redisClient *gredis.Redis
- ctx context.Context
- }
- func NewSceneManager(host string, port int) *Manager {
- red := gredis.New(&gredis.Config{
- Host: host,
- Port: port,
- Db: 2,
- MaxActive: 100,
- })
- ctx := context.Background()
- helper := &Manager{
- redisClient: red,
- ctx: ctx,
- }
- return helper
- }
- func (a *Manager) SaveScene(info *Info) error {
- _, err := a.redisClient.DoVar("SET", info.Key, info)
- if err != nil {
- return err
- }
- //_, err = a.redisClient.Do("EXPIRE", info.Key, -1)
- //if err != nil {
- // return err
- //}
- return nil
- }
- func (a *Manager) GetScene(key string) (string, error) {
- // get status from redis
- result, err := a.redisClient.DoVar("GET", key)
- if err != nil {
- return "", err
- }
- return result.String(), nil
- }
- func (a *Manager) DeleteScene(key string) error {
- // get status from redis
- _, err := a.redisClient.Do("DEL", key)
- if err != nil {
- return err
- }
- return nil
- }
- // GetAllScenesPage 查询定时场景
- func (a *Manager) GetAllScenesPage(code string, pi, ps int) (AllSceneResult, error) {
- var key string
- switch code {
- case "timer":
- key = timerScenePrefix
- case "device":
- key = deviceScenePrefix
- case "weather":
- key = weatherScenePrefix
- default:
- key = scenePrefix
- }
- var result AllSceneResult
- // 使用KEYS命令获取所有匹配前缀的键s
- keys, err := a.redisClient.DoVar("KEYS", key)
- if err != nil {
- return result, err
- }
- // 检查是否有数据
- if keys.IsEmpty() {
- return result, nil
- }
- var start, end int
- // 转换为字符串切片
- keyList := keys.Strings()
- result.Total = len(keyList)
- if len(keyList) > 0 {
- start = (pi - 1) * ps
- end = pi*ps - 1
- if end > len(keyList)-1 {
- end = len(keyList) - 1
- }
- }
- // 存储所有结果
- for i := start; i <= end; i++ {
- scene := new(InfoScene)
- r, err := a.redisClient.DoVar("GET", keyList[i])
- if err != nil {
- return result, err
- }
- err = r.Struct(&scene)
- if err != nil {
- return result, err
- }
- result.Data = append(result.Data, scene)
- }
- return result, nil
- }
- // GetAllScenes 查询定时场景
- func (a *Manager) GetAllScenes(code string) ([]*InfoScene, error) {
- var key string
- switch code {
- case "time":
- key = timerScenePrefix
- case "device":
- key = deviceScenePrefix
- case "weather":
- key = weatherScenePrefix
- default:
- key = scenePrefix
- }
- // 使用KEYS命令获取所有匹配前缀的键s
- keys, err := a.redisClient.DoVar("KEYS", key)
- if err != nil {
- return nil, err
- }
- // 检查是否有数据
- if keys.IsEmpty() {
- return nil, nil
- }
- // 转换为字符串切片
- keyList := keys.Strings()
- // 存储所有结果
- scenes := make([]*InfoScene, 0)
- var scene InfoScene
- for _, v := range keyList {
- r, err := a.redisClient.DoVar("GET", v)
- if err != nil {
- return nil, err
- }
- err = r.Struct(&scene)
- if err != nil {
- return nil, err
- }
- scenes = append(scenes, &scene)
- }
- return scenes, nil
- }
|