mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-23 02:48:34 +08:00
优化
This commit is contained in:
@@ -7,7 +7,6 @@ package api
|
||||
// ==========================================================================
|
||||
import (
|
||||
"fmt"
|
||||
"pandax/apps/device/util"
|
||||
"pandax/kit/biz"
|
||||
"pandax/kit/model"
|
||||
"pandax/kit/restfulx"
|
||||
@@ -131,6 +130,18 @@ func (p *DeviceApi) GetDeviceStatus(rc *restfulx.ReqCtx) {
|
||||
rc.ResData = res
|
||||
}
|
||||
|
||||
func (p *DeviceApi) GetDeviceEvents(rc *restfulx.ReqCtx) {
|
||||
pageNum := restfulx.QueryInt(rc, "pageNum", 1)
|
||||
pageSize := restfulx.QueryInt(rc, "pageSize", 10)
|
||||
deviceId := restfulx.PathParam(rc, "id")
|
||||
ty := restfulx.QueryParam(rc, "type")
|
||||
offset := pageSize * (pageNum - 1)
|
||||
sql := `select * from ? where deviceId = ? and type = ? DESC LIMIT ?,? `
|
||||
list, err := global.TdDb.GetAllEvents(sql, deviceId, ty, offset, pageSize)
|
||||
biz.ErrIsNilAppendErr(err, "查询设备事件历史失败")
|
||||
rc.ResData = list
|
||||
}
|
||||
|
||||
// GetDeviceTelemetryHistory 获取Device属性的遥测历史
|
||||
func (p *DeviceApi) GetDeviceTelemetryHistory(rc *restfulx.ReqCtx) {
|
||||
id := restfulx.PathParam(rc, "id")
|
||||
@@ -146,21 +157,6 @@ func (p *DeviceApi) GetDeviceTelemetryHistory(rc *restfulx.ReqCtx) {
|
||||
rc.ResData = rs
|
||||
}
|
||||
|
||||
// 下发设备属性
|
||||
func (p *DeviceApi) DownAttribute(rc *restfulx.ReqCtx) {
|
||||
id := restfulx.PathParam(rc, "id")
|
||||
key := restfulx.QueryParam(rc, "key")
|
||||
value := restfulx.QueryParam(rc, "value")
|
||||
biz.NotEmpty(value, "请设置属性值")
|
||||
err := util.BuildRunDeviceRpc(id, "single", map[string]interface{}{
|
||||
"method": "setAttributes",
|
||||
"params": map[string]interface{}{
|
||||
key: value,
|
||||
},
|
||||
})
|
||||
biz.ErrIsNilAppendErr(err, "下发失败:")
|
||||
}
|
||||
|
||||
// InsertDevice 添加Device
|
||||
func (p *DeviceApi) InsertDevice(rc *restfulx.ReqCtx) {
|
||||
var data entity.Device
|
||||
|
||||
@@ -3,17 +3,15 @@ package api
|
||||
// ==========================================================================
|
||||
import (
|
||||
"encoding/json"
|
||||
"pandax/apps/device/util"
|
||||
"pandax/kit/biz"
|
||||
"pandax/kit/model"
|
||||
"pandax/kit/restfulx"
|
||||
"pandax/kit/utils"
|
||||
"pandax/pkg/global"
|
||||
devicerpc "pandax/pkg/device_rpc"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"pandax/apps/device/entity"
|
||||
"pandax/apps/device/services"
|
||||
"pandax/apps/device/util"
|
||||
)
|
||||
|
||||
type DeviceCmdLogApi struct {
|
||||
@@ -50,22 +48,12 @@ func (p *DeviceCmdLogApi) InsertDeviceCmdLog(rc *restfulx.ReqCtx) {
|
||||
err := json.Unmarshal([]byte(data.CmdContent), &ms)
|
||||
biz.ErrIsNil(err, "指令格式不正确")
|
||||
biz.IsTrue(len(ms) > 0, "指令格式不正确")
|
||||
data.Id = utils.GenerateID()
|
||||
data.State = "2"
|
||||
data.RequestTime = time.Now().Format("2006-01-02 15:04:05")
|
||||
go func() {
|
||||
err := util.BuildRunDeviceRpc(data.DeviceId, data.Mode, map[string]interface{}{
|
||||
"method": data.CmdName,
|
||||
"params": ms,
|
||||
})
|
||||
if err != nil {
|
||||
global.Log.Error("规则链执行失败", err)
|
||||
data.State = "1"
|
||||
} else {
|
||||
data.State = "0"
|
||||
rpc := devicerpc.RpcPayload{
|
||||
Method: data.CmdName,
|
||||
Params: ms,
|
||||
}
|
||||
data.ResponseTime = time.Now().Format("2006-01-02 15:04:05.000")
|
||||
err = p.DeviceCmdLogApp.Insert(data)
|
||||
err := util.BuildRunDeviceRpc(data.DeviceId, data.Mode, rpc)
|
||||
biz.ErrIsNil(err, "添加指令记录失败")
|
||||
}()
|
||||
}
|
||||
|
||||
@@ -80,6 +80,18 @@ func InitDeviceRouter(container *restful.Container) {
|
||||
Returns(200, "OK", []entity.DeviceStatusVo{}).
|
||||
Returns(404, "Not Found", nil))
|
||||
|
||||
ws.Route(ws.GET("/{id}/event").To(func(request *restful.Request, response *restful.Response) {
|
||||
restfulx.NewReqCtx(request, response).WithLog("获取设备事件历史").Handle(s.GetDeviceEvents)
|
||||
}).
|
||||
Doc("获取设备事件历史").
|
||||
Param(ws.QueryParameter("pageNum", "页数").Required(true).DataType("int")).
|
||||
Param(ws.QueryParameter("pageSize", "每页条数").Required(true).DataType("int")).
|
||||
Param(ws.PathParameter("id", "设备ID").Required(true).DataType("string")).
|
||||
Param(ws.QueryParameter("type", "事件类型").Required(true).DataType("string")).
|
||||
Metadata(restfulspec.KeyOpenAPITags, tags). // on the response
|
||||
Returns(200, "OK", []map[string]any{}).
|
||||
Returns(404, "Not Found", nil))
|
||||
|
||||
ws.Route(ws.GET("/{id}/property/history").To(func(request *restful.Request, response *restful.Response) {
|
||||
restfulx.NewReqCtx(request, response).WithLog("获取设备属性的遥测历史").Handle(s.GetDeviceTelemetryHistory)
|
||||
}).
|
||||
@@ -93,15 +105,6 @@ func InitDeviceRouter(container *restful.Container) {
|
||||
Returns(200, "OK", []map[string]any{}).
|
||||
Returns(404, "Not Found", nil))
|
||||
|
||||
ws.Route(ws.GET("/{id}/attribute/down").To(func(request *restful.Request, response *restful.Response) {
|
||||
restfulx.NewReqCtx(request, response).WithLog("获取Device属性下发").Handle(s.DownAttribute)
|
||||
}).
|
||||
Doc("获取Device属性下发").
|
||||
Param(ws.PathParameter("id", "Id").DataType("string")).
|
||||
Param(ws.QueryParameter("key", "属性KEY").Required(false).DataType("string")).
|
||||
Param(ws.QueryParameter("value", "属性Value").Required(false).DataType("string")).
|
||||
Metadata(restfulspec.KeyOpenAPITags, tags))
|
||||
|
||||
ws.Route(ws.POST("").To(func(request *restful.Request, response *restful.Response) {
|
||||
restfulx.NewReqCtx(request, response).WithLog("添加Device信息").Handle(s.InsertDevice)
|
||||
}).
|
||||
|
||||
@@ -10,6 +10,7 @@ type (
|
||||
ProductTemplateModel interface {
|
||||
Insert(data entity.ProductTemplate) (*entity.ProductTemplate, error)
|
||||
FindOne(id string) (*entity.ProductTemplate, error)
|
||||
FindOneByKey(deviceId, key string) (*entity.ProductTemplate, error)
|
||||
FindListPage(page, pageSize int, data entity.ProductTemplate) (*[]entity.ProductTemplate, int64, error)
|
||||
FindListAttrs(data entity.ProductTemplate) (*[]entity.ProductTemplate, error)
|
||||
FindList(data entity.ProductTemplate) (*[]entity.ProductTemplate, error)
|
||||
@@ -38,6 +39,13 @@ func (m *templateModelImpl) FindOne(id string) (*entity.ProductTemplate, error)
|
||||
return resData, err
|
||||
}
|
||||
|
||||
func (m *templateModelImpl) FindOneByKey(deviceId, key string) (*entity.ProductTemplate, error) {
|
||||
resData := new(entity.ProductTemplate)
|
||||
db := global.Db.Table(m.table).Where("pid = ?", deviceId).Where("key = ?", key)
|
||||
err := db.First(resData).Error
|
||||
return resData, err
|
||||
}
|
||||
|
||||
func (m *templateModelImpl) FindListPage(page, pageSize int, data entity.ProductTemplate) (*[]entity.ProductTemplate, int64, error) {
|
||||
list := make([]entity.ProductTemplate, 0)
|
||||
var total int64 = 0
|
||||
|
||||
@@ -7,13 +7,15 @@ import (
|
||||
"pandax/apps/device/services"
|
||||
ruleEntity "pandax/apps/rule/entity"
|
||||
ruleService "pandax/apps/rule/services"
|
||||
"pandax/pkg/cache"
|
||||
devicerpc "pandax/pkg/device_rpc"
|
||||
"pandax/pkg/global"
|
||||
"pandax/pkg/rule_engine"
|
||||
"pandax/pkg/rule_engine/message"
|
||||
"pandax/pkg/tool"
|
||||
)
|
||||
|
||||
func BuildRunDeviceRpc(deviceId, mode string, msgData map[string]interface{}) error {
|
||||
func BuildRunDeviceRpc(deviceId, mode string, rp devicerpc.RpcPayload) error {
|
||||
device, err := services.DeviceModelDao.FindOne(deviceId)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -35,10 +37,21 @@ func BuildRunDeviceRpc(deviceId, mode string, msgData map[string]interface{}) er
|
||||
dataCode := ruleData.LfData.DataCode
|
||||
code, _ := json.Marshal(dataCode)
|
||||
//新建规则链实体
|
||||
instance, errs := rule_engine.NewRuleChainInstance(findOne.Id, code)
|
||||
if err != nil {
|
||||
return errs
|
||||
instance := &rule_engine.RuleChainInstance{}
|
||||
ruleInstance, bo := cache.GetProductRule(device.Product.Id)
|
||||
if !bo {
|
||||
instance, err = rule_engine.NewRuleChainInstance(findOne.Id, code)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if data, ok := ruleInstance.(*rule_engine.RuleChainInstance); ok {
|
||||
instance = data
|
||||
} else {
|
||||
return errors.New("规则实体解析错误")
|
||||
}
|
||||
}
|
||||
|
||||
metadataVals := map[string]interface{}{
|
||||
"deviceId": device.Id,
|
||||
"mode": mode,
|
||||
@@ -49,10 +62,11 @@ func BuildRunDeviceRpc(deviceId, mode string, msgData map[string]interface{}) er
|
||||
"orgId": device.OrgId,
|
||||
"owner": device.Owner,
|
||||
}
|
||||
msg := message.NewMessage(device.Owner, message.RpcRequestToDevice, msgData, metadataVals)
|
||||
|
||||
msg := message.NewMessage(device.Owner, message.RpcRequestToDevice, rp.ToMap(), metadataVals)
|
||||
err = instance.StartRuleChain(context.Background(), msg)
|
||||
if err != nil {
|
||||
global.Log.Error("规则链执行失败", errs)
|
||||
global.Log.Error("规则链执行失败", err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user