فهرست منبع

增加子设备

liuxiulin 2 سال پیش
والد
کامیت
69ad5c8386

+ 21 - 0
pkg/models/sub_device.go

@@ -0,0 +1,21 @@
+package models
+
+import "github.com/jinzhu/gorm"
+
+// SubDevice sub_device model
+type SubDevice struct {
+	gorm.Model
+	RecordId string `gorm:"column:record_id;size:32;index"`
+	// which device the sub_device belongs to
+	DeviceCode string `sql:"type:varchar(200);not null;index"`
+	// sub_device_id
+	SubDeviceID string `sql:"type:varchar(200);not null;key"`
+	//sub_device name
+	Name   string `sql:"type:varchar(200);not null;"`
+	Status int    `gorm:"column:status"` // 状态(1:在线 2:离线)
+}
+
+// SubDeviceQuery sub_device query
+type SubDeviceQuery struct {
+	SubDevice
+}

+ 39 - 0
services/knowoapi/controllers/sub_device.go

@@ -0,0 +1,39 @@
+package controllers
+
+import (
+	"github.com/kataras/iris"
+	"sparrow/services/knowoapi/services"
+)
+
+// SubDeviceController api
+type SubDeviceController struct {
+	Ctx     iris.Context
+	Service services.SubDeviceService
+	Token
+}
+
+// Get 获取子设备列表
+// GET /SubDevice?pi=&ps=&device_code=
+func (a *SubDeviceController) Get() {
+	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
+	}
+	deviceCode := a.Ctx.URLParam("device_code")
+
+	data, total, err := a.Service.GetSubDevices(deviceCode, pi, ps)
+	if err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, map[string]interface{}{
+		"list":  data,
+		"total": total,
+	})
+}

+ 2 - 0
services/knowoapi/model/all.go

@@ -12,6 +12,7 @@ type All struct {
 	Sensor      *Sensor
 	Alert       *Alert
 	Device      *Device
+	SubDevice   *SubDevice
 	Role        *Role
 	Relation    *Relation
 	RuleChain   *RuleChain
@@ -28,6 +29,7 @@ func (a *All) Init(db *gorm.DB) *All {
 	a.Sensor = new(Sensor).Init(db)
 	a.Alert = new(Alert).Init(db)
 	a.Device = new(Device).Init(db)
+	a.SubDevice = new(SubDevice).Init(db)
 	a.Role = new(Role).Init(db)
 	a.Relation = new(Relation).Init(db)
 	a.RuleChain = new(RuleChain).Init(db)

+ 37 - 0
services/knowoapi/model/sub_device.go

@@ -0,0 +1,37 @@
+package model
+
+import (
+	"github.com/jinzhu/gorm"
+	"sparrow/pkg/models"
+)
+
+// SubDevice sub_devices data
+type SubDevice struct {
+	db *gorm.DB
+}
+
+// Init sub_device
+func (a *SubDevice) Init(db *gorm.DB) *SubDevice {
+	a.db = db
+	return a
+}
+
+// GetSubDeviceCount
+func (a *SubDevice) GetSubDeviceCount(deviceCode string) (count int, err error) {
+	subDevice := &models.SubDevice{
+		DeviceCode: deviceCode,
+	}
+	err = a.db.Model(subDevice).Where(subDevice).Count(&count).Error
+	return
+}
+
+// GetSubDevices 获取子设备列表
+func (a *SubDevice) GetSubDevices(deviceCode string, pi, ps int) (data []*models.SubDevice, total int, err error) {
+	tx := a.db
+	if deviceCode != "" {
+		tx = tx.Where("device_code = ?", deviceCode)
+	}
+	err = tx.Limit(ps).Offset((pi - 1) * ps).Find(&data).Error
+	tx.Model(&models.SubDevice{}).Count(&total)
+	return
+}

+ 5 - 0
services/knowoapi/router.go

@@ -53,6 +53,7 @@ func registerRouters(srv *iris.Application, models *model.All, gen *generator.Ke
 	deviceService := services.NewDeviceService(models)
 	roleService := services.NewRoleService(models)
 	ruleChainService := services.NewRuleChainService(models)
+	subDeviceService := services.NewSubDeviceService(models)
 	v1router := srv.Party("/api/v1", func(ctx iris.Context) {
 		span := opentracing.StartSpan(ctx.Path())
 		defer span.Finish()
@@ -100,4 +101,8 @@ func registerRouters(srv *iris.Application, models *model.All, gen *generator.Ke
 	// ruleChain api
 	RuleChainAPI := mvc.New(userRouter.Party("/rule_chain"))
 	RuleChainAPI.Register(ruleChainService).Handle(new(controllers.RuleChainController))
+
+	// subDevice api
+	subDeviceAPI := mvc.New(userRouter).Party("/sub_device")
+	subDeviceAPI.Register(subDeviceService).Handle(new(controllers.SubDeviceController))
 }

+ 38 - 0
services/knowoapi/services/sub_device.go

@@ -0,0 +1,38 @@
+package services
+
+import (
+	"sparrow/pkg/models"
+	"sparrow/services/knowoapi/model"
+)
+
+// SubDeviceService SubDevice service接口
+type SubDeviceService interface {
+	// GetSubDeviceCount 获取设备下子设备总数
+	GetSubDeviceCount(deviceCode string) (int, error)
+	// GetSubDevices 获取子设备列表
+	GetSubDevices(deviceCode string, pi, ps int) ([]*models.SubDevice, int, error)
+}
+
+type subDeviceService struct {
+	models *model.All
+}
+
+// NewSubDeviceService create SubDevice service
+func NewSubDeviceService(models *model.All) SubDeviceService {
+	return subDeviceService{
+		models: models,
+	}
+}
+func (a subDeviceService) GetSubDevices(deviceCode string, pi, ps int) ([]*models.SubDevice, int, error) {
+
+	data, total, err := a.models.SubDevice.GetSubDevices(deviceCode, pi, ps)
+
+	if err != nil {
+		return nil, 0, err
+	}
+
+	return data, total, nil
+}
+func (a subDeviceService) GetSubDeviceCount(vendorid string) (int, error) {
+	return a.models.SubDevice.GetSubDeviceCount(vendorid)
+}

+ 70 - 0
services/registry/registry.go

@@ -81,6 +81,15 @@ func setDevice(target *models.Device, src *models.Device) {
 	target.VendorID = src.VendorID
 }
 
+//func setSubDevice(target *models.SubDevice, src *models.SubDevice) {
+//	target.ID = src.ID
+//	target.RecordId = src.RecordId
+//	target.SubDeviceID = src.SubDeviceID
+//	target.DeviceCode = src.DeviceCode
+//	target.Status = src.Status
+//	target.Name = src.Name
+//}
+
 // SaveVendor will create a vendor if the ID field is not initialized
 // if ID field is initialized, it will update the conresponding vendor.
 func (r *Registry) SaveVendor(vendor *models.Vendor, reply *models.Vendor) error {
@@ -535,3 +544,64 @@ func (r *Registry) CheckDeviceNetConfig(args *rpcs.ArgsCheckDeviceNetConfig, rep
 	}
 	return nil
 }
+
+// SaveSubDevice try to save a sub_device
+func (r *Registry) SaveSubDevice(subDevice *models.SubDevice, reply *models.SubDevice) error {
+	db, err := getDB()
+	if err != nil {
+		return err
+	}
+	if db.Where(&models.SubDevice{SubDeviceID: subDevice.SubDeviceID}).First(reply).RecordNotFound() {
+		reply.RecordId = guid.S()
+		reply.DeviceCode = subDevice.DeviceCode
+		reply.SubDeviceID = subDevice.SubDeviceID
+		reply.Status = 1
+
+		err = db.Save(reply).Error
+		if err != nil {
+			return err
+		}
+	} else {
+		//delete cache
+		cache := getCache()
+		cacheKey := fmt.Sprintf("SubDevice:%v", subDevice.SubDeviceID)
+		if _, ok := cache.Get(cacheKey); ok {
+			cache.Delete(cacheKey)
+		}
+		// sub_device has already been saved. just update status .
+		reply.Status = 1
+		err = db.Save(reply).Error
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// UpdateSubDeviceStatus will update a sub_device status
+func (r *Registry) UpdateSubDeviceStatus(subDevice *models.SubDevice, reply *models.SubDevice) error {
+	db, err := getDB()
+	if err != nil {
+		return err
+	}
+
+	err = db.Where(&models.SubDevice{SubDeviceID: subDevice.SubDeviceID}).First(reply).Error
+	if err != nil {
+		return err
+	}
+	//delete cache
+	cache := getCache()
+	cacheKey := fmt.Sprintf("SubDevice:%v", subDevice.SubDeviceID)
+	if _, ok := cache.Get(cacheKey); ok {
+		cache.Delete(cacheKey)
+	}
+
+	reply.Status = subDevice.Status
+
+	err = db.Save(reply).Error
+	if err != nil {
+		return err
+	}
+
+	return nil
+}