Bläddra i källkod

解决设备状态异常

baozhensong 6 år sedan
förälder
incheckning
bcc8236159

+ 6 - 0
pkg/models/device.go

@@ -32,6 +32,12 @@ type DeviceQuery struct {
 	ProductName string
 }
 
+// Devices
+type Devices struct {
+	Device
+	Status int
+}
+
 // DeviceChartData 设备数据图表
 type DeviceChartData struct {
 	Dt    string

+ 23 - 4
services/knowoapi/controllers/device.go

@@ -9,6 +9,7 @@ import (
 	"strconv"
 	"time"
 
+	"github.com/garyburd/redigo/redis"
 	"github.com/kataras/iris"
 )
 
@@ -49,6 +50,22 @@ func (a *DeviceController) Get() {
 	})
 }
 
+//设备数量,包含在线数量,离线数量,总数量
+//GET /devicecount
+func (a *DeviceController) GetDevicecount() {
+	vid := a.getVendorID(a.Ctx)
+	data, err := a.Service.GetDevicesCountByVenderId(vid)
+
+	if err != nil && err.Error() != "redigo: nil returned" {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+
+	done(a.Ctx, map[string]interface{}{
+		"data": data,
+	})
+}
+
 //获取设备在线状态
 // GET /devicestatus?device_id=
 func (a *DeviceController) GetDevicestatus() {
@@ -58,19 +75,21 @@ func (a *DeviceController) GetDevicestatus() {
 		deviceid = 0
 	}
 
+	var status int
+
 	onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
 		Id: uint64(deviceid),
 	}
 
 	onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
 	err = server.RPCCallByName(nil, "devicemanager", "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
-	if err != nil {
+	if err != nil && err.Error() != "redigo: nil returned" {
 		server.Log.Errorf("get devie online status error: %v", err)
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
 	}
 
-	var status int
-
-	if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 {
+	if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 && err != redis.ErrNil {
 		status = 1
 	}
 

+ 6 - 0
services/knowoapi/model/device.go

@@ -143,3 +143,9 @@ func (a *Device) GetDevices(vendorid uint, proid, pi, ps int, deviceid string) (
 	tx.Model(&models.Device{}).Count(&total)
 	return
 }
+
+//GetDevicesByVenderId 获取用户设备
+func (a *Device) GetDevicesByVenderId(vendorid uint) (datas []models.Device, err error) {
+	a.db.Where("vendor_id = ?", vendorid).Find(&datas)
+	return
+}

+ 76 - 3
services/knowoapi/services/device.go

@@ -2,6 +2,8 @@ package services
 
 import (
 	"sparrow/pkg/models"
+	"sparrow/pkg/rpcs"
+	"sparrow/pkg/server"
 	"sparrow/services/knowoapi/model"
 )
 
@@ -18,7 +20,9 @@ type DeviceService interface {
 	//获取近N日活跃设备数据
 	GetLivelyOfNumDays(uint, int) ([]map[string]interface{}, error)
 	//获取已经激活的设备列表
-	GetDevices(vendorid uint, proid, pi, ps int, deviceid string) ([]models.Device, int, error)
+	GetDevices(vendorid uint, proid, pi, ps int, deviceid string) ([]*models.Devices, int, error)
+	//获取用户下所有设备的数量,在线设备的数量,离线设备的数量
+	GetDevicesCountByVenderId(vendorid uint) (map[string]interface{}, error)
 }
 
 type deviceservice struct {
@@ -31,9 +35,42 @@ func NewDeviceService(models *model.All) DeviceService {
 		models: models,
 	}
 }
-func (a deviceservice) GetDevices(vendorid uint, proid, pi, ps int, deviceid string) ([]models.Device, int, error) {
+func (a deviceservice) GetDevices(vendorid uint, proid, pi, ps int, deviceid string) ([]*models.Devices, int, error) {
 
-	return a.models.Device.GetDevices(vendorid, proid, pi, ps, deviceid)
+	data, total, err := a.models.Device.GetDevices(vendorid, proid, pi, ps, deviceid)
+
+	if err != nil {
+		return nil, 0, err
+	}
+
+	dataMap := make([]*models.Devices, 0)
+
+	for _, device := range data {
+
+		onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
+			Id: uint64(device.ID),
+		}
+
+		onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
+		err = server.RPCCallByName(nil, "devicemanager", "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
+		if err != nil && err.Error() != "redigo: nil returned" {
+			server.Log.Errorf("get devie online status error: %v", err)
+
+			return nil, 0, err
+		}
+
+		devices := new(models.Devices)
+
+		devices.Device = device
+
+		if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 && err.Error() != "redigo: nil returned" {
+			devices.Status = 1
+		}
+
+		dataMap = append(dataMap, devices)
+	}
+
+	return dataMap, total, nil
 }
 
 func (a deviceservice) GetDeviceCount(vendorid uint) (int, error) {
@@ -51,3 +88,39 @@ func (a deviceservice) GetActiveOfNumDays(vendorid uint, days int) ([]map[string
 func (a deviceservice) GetLivelyOfNumDays(vendorid uint, days int) ([]map[string]interface{}, error) {
 	return a.models.Device.GetLivelyOfNumDays(vendorid, days)
 }
+func (a deviceservice) GetDevicesCountByVenderId(vendorid uint) (map[string]interface{}, error) {
+	data, err := a.models.Device.GetDevicesByVenderId(vendorid)
+
+	if err != nil {
+		return nil, err
+	}
+
+	var onlineCount int
+
+	var offlineCount int
+	for _, device := range data {
+		onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
+			Id: uint64(device.ID),
+		}
+		onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
+		err = server.RPCCallByName(nil, "devicemanager", "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
+		if err != nil && err.Error() != "redigo: nil returned" {
+			server.Log.Errorf("get devie online status error: %v", err)
+			return nil, err
+		}
+
+		if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 {
+			onlineCount += 1
+		} else {
+			offlineCount += 1
+		}
+	}
+
+	deviceCount := map[string]interface{}{
+		"totaldata":    len(data),
+		"onlineCount":  onlineCount,
+		"offlineCount": offlineCount,
+	}
+
+	return deviceCount, nil
+}