liuxiulin hace 1 mes
padre
commit
5e5e64de09

+ 4 - 3
pkg/rpcs/devicemanager.go

@@ -79,9 +79,9 @@ type ArgsScene struct {
 }
 
 type ArgsGetAllScene struct {
-	SceneId string
-	TaskId  string
-	Config  string
+	Code string
+	Pi   int
+	Ps   int
 }
 
 type ReplyScene struct {
@@ -89,5 +89,6 @@ type ReplyScene struct {
 }
 
 type ReplyScenes struct {
+	Total  int
 	Result []*scene.InfoScene
 }

+ 124 - 22
pkg/scene/scene.go

@@ -2,13 +2,15 @@ package scene
 
 import (
 	"context"
-	"fmt"
 	"github.com/gogf/gf/database/gredis"
 )
 
 const (
-	scenePrefix = "scene:"
-	dataExpires = 7200
+	timerScenePrefix   = "scene:timer:*"
+	deviceScenePrefix  = "scene:device_status:*"
+	weatherScenePrefix = "scene:weather:*"
+	scenePrefix        = "scene:*"
+	dataExpires        = 7200
 )
 
 type GetSceneParams struct {
@@ -18,17 +20,53 @@ type GetSceneParams struct {
 }
 
 type InfoScene struct {
-	Id         string `json:"id"`
-	Name       string `json:"name"`
-	Status     int    `json:"status"`
-	Action     string `json:"action"`
-	Desc       string `json:"desc"`
-	SceneType  string `json:"scene_type"`
-	DeviceType string `json:"device_type"`
-	Config     string `json:"config"`
-	Time       string `json:"time"`
+	SceneId    string        `json:"scene_id"`
+	Conditions []*Conditions `json:"conditions"`
+	Actions    []*Action     `json:"actions"`
+}
+
+type Conditions struct {
+	TaskId string `json:"task_id"`
+	Times  int    `json:"times"` // 执行次数 -1 表示无限次
+	Cron   string `json:"cron"`
+
+	Key         string `json:"key"`           // redis key
+	DeviceType  string `json:"device_type"`   // 设备类型
+	DeviceId    string `json:"device_id"`     // 设备id
+	SubDeviceId string `json:"sub_device_id"` // 子设备id
+	FieldType   int    `json:"field_type"`    // 字段类型 1字符串 2数值
+	Field       string `json:"field"`         // 字段名
+	TargetValue string `json:"target_value"`  // 值
+	Operator    int    `json:"operator"`      // 比较类型  数值比较 1 >  2 >= 3 = 4 <= 5 < 6 !=
+
+	Location string `json:"location"` // 地点
+
+}
+
+type Action struct {
+	DeviceID         string                `json:"device_id"`         // 设备ID
+	SubDeviceId      string                `json:"sub_device_id"`     // 实体子设备Id,如果需要
+	ActionExecutor   string                `json:"action_executor"`   // 动作对象类型
+	ExecutorProperty *TaskExecutorProperty `json:"executor_property"` // 动作执行明细
+	PlcPubMessage    *PlcPubMessage        `json:"plc_pub_message"`   // PLC消息
+}
+
+// TaskExecutorProperty 定时任务执行动作执行参数
+type TaskExecutorProperty struct {
+	FunctionCode  string                 `json:"function_code"`
+	FunctionValue map[string]interface{} `json:"function_value"`
+	DelaySeconds  int64                  `json:"delay_seconds"`
+}
+
+type PlcPubMessage struct {
+	Topic   string `json:"topic"`
+	Payload []byte `json:"payload"`
 }
 
+type AllSceneResult struct {
+	Total int          `json:"total"`
+	Data  []*InfoScene `json:"data"`
+}
 type Info struct {
 	Key     string `json:"key"`
 	SceneId string `json:"scene_id"`
@@ -61,7 +99,7 @@ func (a *Manager) SaveScene(info *Info) error {
 	if err != nil {
 		return err
 	}
-	_, err = a.redisClient.Do("EXPIRE", info.Key, 0)
+	_, err = a.redisClient.Do("EXPIRE", info.Key, -1)
 	if err != nil {
 		return err
 	}
@@ -86,11 +124,77 @@ func (a *Manager) DeleteScene(key string) error {
 	return nil
 }
 
-// GetAllScenes 查询所有场景信息s
-func (a *Manager) GetAllScenes() ([]*InfoScene, error) {
+// GetAllScenesPage 查询定时场景
+func (a *Manager) GetAllScenesPage(code string, pi, ps int) (AllSceneResult, error) {
+	var key string
+	switch code {
+	case "time":
+		key = timerScenePrefix
+	case "device":
+		key = deviceScenePrefix
+	case "weather":
+		key = weatherScenePrefix
+	default:
+		key = scenePrefix
+	}
+
+	var result AllSceneResult
 	// 使用KEYS命令获取所有匹配前缀的键s
-	keys, err := a.redisClient.DoVar("KEYS", scenePrefix+"*")
-	fmt.Printf("使用KEYS命令获取所有匹配前缀的键%v", keys)
+	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
+		}
+	}
+
+	// 存储所有结果
+	scenes := make([]*InfoScene, 0)
+	var scene InfoScene
+	for i := start; i <= end; i++ {
+		r, err := a.redisClient.DoVar("GET", keyList[i])
+		if err != nil {
+			return result, err
+		}
+		err = r.Struct(&scene)
+		if err != nil {
+			return result, err
+		}
+		scenes = append(scenes, &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
 	}
@@ -106,18 +210,16 @@ func (a *Manager) GetAllScenes() ([]*InfoScene, error) {
 	// 存储所有结果
 	scenes := make([]*InfoScene, 0)
 	var scene InfoScene
-	for _, key := range keyList {
-
-		result, err := a.redisClient.DoVar("GET", key)
+	for _, v := range keyList {
+		r, err := a.redisClient.DoVar("GET", v)
 		if err != nil {
 			return nil, err
 		}
-		err = result.Struct(&scene)
+		err = r.Struct(&scene)
 		if err != nil {
 			return nil, err
 		}
 		scenes = append(scenes, &scene)
 	}
-
 	return scenes, nil
 }

+ 14 - 2
services/devicemanager/manager.go

@@ -209,8 +209,20 @@ func (dm *DeviceManager) DelAlarm(args rpcs.ArgsGetAlarm, reply *rpcs.ReplayAlar
 	return dm.alarmManager.DeleteAlarm(args.DeviceCode)
 }
 
-func (dm *DeviceManager) GetAllScenes(args rpcs.ArgsScene, reply *rpcs.ReplyScenes) error {
-	result, err := dm.sceneManager.GetAllScenes()
+func (dm *DeviceManager) GetAllScenesPage(args rpcs.ArgsGetAllScene, reply *rpcs.ReplyScenes) error {
+	result, err := dm.sceneManager.GetAllScenesPage(args.Code, args.Pi, args.Ps)
+	if err != nil {
+		return err
+	}
+	if len(result.Data) > 0 {
+		reply.Total = result.Total
+		reply.Result = result.Data
+	}
+	return nil
+}
+
+func (dm *DeviceManager) GetAllScenes(args rpcs.ArgsGetAllScene, reply *rpcs.ReplyScenes) error {
+	result, err := dm.sceneManager.GetAllScenes(args.Code)
 	if err != nil {
 		return err
 	}

+ 14 - 3
services/knowoapi/controllers/device.go

@@ -533,15 +533,26 @@ func (a *DeviceController) PostSendcommand() {
 }
 
 // GetScene 获取场景
-// GET /device/scene?code=
+// GET /device/scene?code=&pi=&ps=
 func (a *DeviceController) GetScene() {
+	pi, err := a.Ctx.URLParamInt("pi")
+	if err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	ps, err := a.Ctx.URLParamInt("ps")
+	if err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
 	code := a.Ctx.URLParam("code")
-	data, err := a.Service.GetScenes(code)
+	datas, total, err := a.Service.GetScenes(code, pi, ps)
 	if err != nil {
 		responseError(a.Ctx, ErrNormal, err.Error())
 		return
 	}
 	done(a.Ctx, map[string]interface{}{
-		"data": data.MustToJsonString(),
+		"list":  datas,
+		"total": total,
 	})
 }

+ 10 - 8
services/knowoapi/services/device.go

@@ -1,11 +1,11 @@
 package services
 
 import (
-	"fmt"
 	"github.com/gogf/gf/encoding/gjson"
 	"math/rand"
 	"sparrow/pkg/models"
 	"sparrow/pkg/rpcs"
+	"sparrow/pkg/scene"
 	"sparrow/pkg/server"
 	"sparrow/services/knowoapi/model"
 )
@@ -63,7 +63,7 @@ type DeviceService interface {
 	// SendCommand 下发指令
 	SendCommand(args rpcs.ArgsSendCommand) error
 	// GetScenes 获取场景
-	GetScenes(code string) (*gjson.Json, error)
+	GetScenes(code string, pi, ps int) ([]*scene.InfoScene, int, error)
 }
 
 type deviceservice struct {
@@ -408,14 +408,16 @@ func (a deviceservice) SendCommand(args rpcs.ArgsSendCommand) error {
 }
 
 // GetScenes 获取场景
-func (a deviceservice) GetScenes(code string) (*gjson.Json, error) {
-	fmt.Println("1111111111111111")
-	var newArgs rpcs.ArgsScene
+func (a deviceservice) GetScenes(code string, pi, ps int) ([]*scene.InfoScene, int, error) {
+	var args rpcs.ArgsGetAllScene
+	args.Code = code
+	args.Pi = pi
+	args.Ps = ps
 	var reply rpcs.ReplyScenes
-	err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetAllScenes", newArgs, &reply)
+	err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetAllScenesPage", args, &reply)
 	if err != nil {
 		server.Log.Errorf("设备状态数据获取失败:%v", err)
-		return nil, err
+		return nil, 0, err
 	}
-	return gjson.New(reply.Result), nil
+	return reply.Result, reply.Total, nil
 }