mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-23 02:48:34 +08:00
270 lines
8.1 KiB
Go
270 lines
8.1 KiB
Go
package api
|
||
|
||
// ==========================================================================
|
||
// 生成日期:2023-06-30 09:19:43 +0800 CST
|
||
// 生成路径: apps/device/api/devices.go
|
||
// 生成人:panda
|
||
// ==========================================================================
|
||
import (
|
||
"fmt"
|
||
"github.com/PandaXGO/PandaKit/biz"
|
||
"github.com/PandaXGO/PandaKit/model"
|
||
"github.com/PandaXGO/PandaKit/restfulx"
|
||
"pandax/apps/device/util"
|
||
"pandax/pkg/cache"
|
||
"pandax/pkg/global"
|
||
"pandax/pkg/global_model"
|
||
"pandax/pkg/shadow"
|
||
"strings"
|
||
"time"
|
||
|
||
"pandax/apps/device/entity"
|
||
"pandax/apps/device/services"
|
||
)
|
||
|
||
type DeviceApi struct {
|
||
DeviceApp services.DeviceModel
|
||
DeviceAlarmApp services.DeviceAlarmModel
|
||
ProductApp services.ProductModel
|
||
ProductTemplateApp services.ProductTemplateModel
|
||
}
|
||
|
||
func (p *DeviceApi) GetDevicePanel(rc *restfulx.ReqCtx) {
|
||
get, err := cache.PanelCache.ComputeIfAbsent("panel", func(k any) (any, error) {
|
||
var data entity.DeviceTotalOutput
|
||
data.DeviceInfo = p.DeviceApp.FindDeviceCount()
|
||
data.DeviceLinkStatusInfo = p.DeviceApp.FindDeviceCountGroupByLinkStatus()
|
||
data.DeviceCountType = p.DeviceApp.FindDeviceCountGroupByType()
|
||
data.AlarmInfo = p.DeviceAlarmApp.FindAlarmCount()
|
||
data.ProductInfo = p.ProductApp.FindProductCount()
|
||
return data, nil
|
||
})
|
||
biz.ErrIsNil(err, "获取面板数据失败")
|
||
rc.ResData = get
|
||
}
|
||
|
||
// GetDeviceList Device列表数据
|
||
func (p *DeviceApi) GetDeviceList(rc *restfulx.ReqCtx) {
|
||
data := entity.Device{}
|
||
pageNum := restfulx.QueryInt(rc, "pageNum", 1)
|
||
pageSize := restfulx.QueryInt(rc, "pageSize", 10)
|
||
data.Name = restfulx.QueryParam(rc, "name")
|
||
data.Status = restfulx.QueryParam(rc, "status")
|
||
data.Pid = restfulx.QueryParam(rc, "pid")
|
||
data.Gid = restfulx.QueryParam(rc, "gid")
|
||
data.DeviceType = restfulx.QueryParam(rc, "deviceType")
|
||
data.ParentId = restfulx.QueryParam(rc, "parentId")
|
||
data.LinkStatus = restfulx.QueryParam(rc, "linkStatus")
|
||
|
||
data.RoleId = rc.LoginAccount.RoleId
|
||
data.Owner = rc.LoginAccount.UserName
|
||
list, total := p.DeviceApp.FindListPage(pageNum, pageSize, data)
|
||
|
||
rc.ResData = model.ResultPage{
|
||
Total: total,
|
||
PageNum: int64(pageNum),
|
||
PageSize: int64(pageSize),
|
||
Data: list,
|
||
}
|
||
}
|
||
|
||
// GetDeviceListAll Device获取所有
|
||
func (p *DeviceApi) GetDeviceListAll(rc *restfulx.ReqCtx) {
|
||
data := entity.Device{}
|
||
data.Name = restfulx.QueryParam(rc, "name")
|
||
data.Status = restfulx.QueryParam(rc, "status")
|
||
data.Pid = restfulx.QueryParam(rc, "pid")
|
||
data.DeviceType = restfulx.QueryParam(rc, "deviceType")
|
||
data.RoleId = rc.LoginAccount.RoleId
|
||
data.Owner = rc.LoginAccount.UserName
|
||
|
||
list := p.DeviceApp.FindList(data)
|
||
rc.ResData = list
|
||
}
|
||
|
||
// GetDevice 获取Device
|
||
func (p *DeviceApi) GetDevice(rc *restfulx.ReqCtx) {
|
||
id := restfulx.PathParam(rc, "id")
|
||
rc.ResData = p.DeviceApp.FindOne(id)
|
||
}
|
||
|
||
// GetDeviceStatus 获取Device状态信息
|
||
func (p *DeviceApi) GetDeviceStatus(rc *restfulx.ReqCtx) {
|
||
id := restfulx.PathParam(rc, "id")
|
||
classify := restfulx.QueryParam(rc, "classify")
|
||
device := p.DeviceApp.FindOne(id)
|
||
template := p.ProductTemplateApp.FindList(entity.ProductTemplate{Classify: classify, Pid: device.Pid})
|
||
|
||
res := make([]entity.DeviceStatusVo, 0)
|
||
getDevice := shadow.InitDeviceShadow(device.Name, device.Pid)
|
||
rs := make(map[string]shadow.DevicePoint)
|
||
if classify == global.TslAttributesType {
|
||
rs = getDevice.AttributesPoints
|
||
}
|
||
if classify == global.TslTelemetryType {
|
||
rs = getDevice.TelemetryPoints
|
||
}
|
||
for _, tel := range *template {
|
||
if _, ok := rs[tel.Key]; !ok {
|
||
continue
|
||
}
|
||
sdv := entity.DeviceStatusVo{
|
||
Name: tel.Name,
|
||
Key: tel.Key,
|
||
Type: tel.Type,
|
||
Define: tel.Define,
|
||
}
|
||
if classify == global.TslTelemetryType {
|
||
value := rs[tel.Key].Value
|
||
// tsl转化
|
||
/*var tslValue tsl.ValueType
|
||
err := tool.MapToStruct(tel.Define, &tslValue)
|
||
if err != nil {
|
||
value = rs[tel.Key].Value
|
||
} else {
|
||
tslValue.Type = tel.Type
|
||
// 此处rs[tel.Key].Value 变成字符串类型了
|
||
value = tslValue.ConvertValue(rs[tel.Key].Value)
|
||
log.Println("value", value)
|
||
if value == nil {
|
||
value = rs[tel.Key]
|
||
}
|
||
}*/
|
||
sdv.Time = rs[tel.Key].UpdatedAt
|
||
sdv.Value = value
|
||
}
|
||
if classify == global.TslAttributesType {
|
||
if value, ok := tel.Define["default_value"]; ok {
|
||
sdv.Value = value
|
||
}
|
||
}
|
||
res = append(res, sdv)
|
||
}
|
||
|
||
rc.ResData = res
|
||
}
|
||
|
||
// GetDeviceTelemetryHistory 获取Device属性的遥测历史
|
||
func (p *DeviceApi) GetDeviceTelemetryHistory(rc *restfulx.ReqCtx) {
|
||
id := restfulx.PathParam(rc, "id")
|
||
key := restfulx.QueryParam(rc, "key")
|
||
startTime := restfulx.QueryParam(rc, "startTime")
|
||
endTime := restfulx.QueryParam(rc, "endTime")
|
||
limit := restfulx.QueryInt(rc, "limit", 1000)
|
||
device := p.DeviceApp.FindOne(id)
|
||
sql := `select ts,? from ? where ts > '?' and ts < '?' and ? is not null ORDER BY ts DESC LIMIT ? `
|
||
rs, err := global.TdDb.GetAll(sql, key, fmt.Sprintf("%s_telemetry", strings.ToLower(device.Name)), startTime, endTime, key, limit)
|
||
biz.ErrIsNilAppendErr(err, "查询设备属性的遥测历史失败")
|
||
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")
|
||
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
|
||
restfulx.BindJsonAndValid(rc, &data)
|
||
product := p.ProductApp.FindOne(data.Pid)
|
||
biz.NotNil(product, "未查到所属产品信息")
|
||
data.Owner = rc.LoginAccount.UserName
|
||
data.OrgId = rc.LoginAccount.OrganizationId
|
||
list := p.DeviceApp.FindList(entity.Device{Name: data.Name})
|
||
biz.IsTrue(!(list != nil && len(*list) > 0), fmt.Sprintf("名称%s已存在,设置其他命名", data.Name))
|
||
data.Id = global_model.GenerateID()
|
||
data.LinkStatus = global.INACTIVE
|
||
data.LastAt = time.Now()
|
||
data.Protocol = product.ProtocolName
|
||
|
||
p.DeviceApp.Insert(data)
|
||
}
|
||
|
||
// UpdateDevice 修改Device
|
||
func (p *DeviceApi) UpdateDevice(rc *restfulx.ReqCtx) {
|
||
var data entity.Device
|
||
restfulx.BindJsonAndValid(rc, &data)
|
||
product := p.ProductApp.FindOne(data.Pid)
|
||
biz.NotNil(product, "未查到所属产品信息")
|
||
data.Protocol = product.ProtocolName
|
||
|
||
p.DeviceApp.Update(data)
|
||
}
|
||
|
||
// DeleteDevice 删除Device
|
||
func (p *DeviceApi) DeleteDevice(rc *restfulx.ReqCtx) {
|
||
id := restfulx.PathParam(rc, "id")
|
||
ids := strings.Split(id, ",")
|
||
p.DeviceApp.Delete(ids)
|
||
}
|
||
|
||
func (p *DeviceApi) ScreenTwinData(rc *restfulx.ReqCtx) {
|
||
pageNum := restfulx.QueryInt(rc, "pageNum", 1)
|
||
pageSize := restfulx.QueryInt(rc, "pageSize", 10)
|
||
classId := restfulx.QueryParam(rc, "classId")
|
||
if classId == "" {
|
||
vp := make([]entity.VisualClass, 0)
|
||
list := p.ProductApp.FindList(entity.Product{})
|
||
for _, pro := range *list {
|
||
data := p.ProductTemplateApp.FindListAttrs(entity.ProductTemplate{Pid: pro.Id})
|
||
vta := make([]entity.VisualTwinAttr, 0)
|
||
for _, attr := range *data {
|
||
twinAttr := entity.VisualTwinAttr{
|
||
Key: attr.Key,
|
||
Name: attr.Name,
|
||
Type: attr.Type,
|
||
}
|
||
if attr.Classify == "attributes" {
|
||
if rw, ok := attr.Define["rw"].(string); ok {
|
||
twinAttr.Rw = rw
|
||
} else {
|
||
twinAttr.Rw = "r"
|
||
}
|
||
} else {
|
||
twinAttr.Rw = "r"
|
||
}
|
||
vta = append(vta, twinAttr)
|
||
}
|
||
vp = append(vp, entity.VisualClass{
|
||
ClassId: pro.Id,
|
||
Name: pro.Name,
|
||
Attrs: vta,
|
||
})
|
||
}
|
||
rc.ResData = vp
|
||
} else {
|
||
device := entity.Device{Pid: classId, RoleId: rc.LoginAccount.RoleId}
|
||
device.Owner = rc.LoginAccount.UserName
|
||
findList, _ := p.DeviceApp.FindListPage(pageNum, pageSize, device)
|
||
vt := make([]entity.VisualTwin, 0)
|
||
for _, device := range *findList {
|
||
vt = append(vt, entity.VisualTwin{
|
||
TwinId: device.Id,
|
||
Name: device.Name + "-" + device.Alias,
|
||
})
|
||
}
|
||
rc.ResData = vt
|
||
}
|
||
}
|
||
|
||
func (p *DeviceApi) DeviceAllotOrg(rc *restfulx.ReqCtx) {
|
||
id := restfulx.PathParam(rc, "id")
|
||
orgId := restfulx.QueryInt(rc, "orgId", 0)
|
||
biz.IsTrue(orgId != 0, "请选择组织")
|
||
|
||
device := entity.Device{}
|
||
device.Id = id
|
||
device.OrgId = int64(orgId)
|
||
p.DeviceApp.Update(device)
|
||
}
|