Sfoglia il codice sorgente

添加传感器功能

NECionpy 6 anni fa
parent
commit
c1e18bad32

+ 2 - 0
.gitignore

@@ -1,6 +1,8 @@
 # ---> VisualStudioCode
 .settings
 
+# Goland
+.idea
 
 # ---> Go
 # Compiled Object files, Static and Dynamic libs (Shared Objects)

+ 5 - 0
pkg/models/protocal.go

@@ -16,12 +16,17 @@ type Protocal struct {
 	UnitSymbol    string //单位
 	Description   string //备注
 	ProductID     uint   //所属产品
+	SensorID      uint   //所属传感器
 }
 
 // Validate 验证
 func (a *Protocal) Validate() error {
 	if a.Name == "" || a.Label == "" {
 		return errors.New("非法参数[Name, Label]")
+	} else if a.ProductID == 0 {
+		return errors.New("缺少产品信息")
+	} else if a.SensorID == 0 {
+		return errors.New("缺少传感器信息")
 	}
 	return nil
 }

+ 28 - 0
pkg/models/sensor.go

@@ -0,0 +1,28 @@
+package models
+
+import (
+	"errors"
+	"github.com/jinzhu/gorm"
+)
+
+// Sensor 传感器
+type Sensor struct {
+	gorm.Model
+	Name      string `gorm:"size:30;not null;"` //名称
+	Label     uint   // 标签
+	ProductID uint   //所属产品
+}
+
+// Validate 验证
+func (a *Sensor) Validate() error {
+	if a.Name == "" {
+		return errors.New("非法参数[Name]")
+	} else if a.Label < 1 {
+		return errors.New("编号不能小于1")
+	} else if a.Label > 255 {
+		return errors.New("编号不能大于255")
+	} else if a.ProductID == 0 {
+		return errors.New("缺少产品信息")
+	}
+	return nil
+}

+ 1 - 0
pkg/mysql/migrate.go

@@ -35,6 +35,7 @@ func MigrateDatabase(dbhost, dbport, dbname, dbuser, dbpass string) error {
 	err = db.Set("gorm:table_options", "ENGINE=MyISAM").AutoMigrate(
 		&models.Device{},
 		&models.Product{},
+		&models.Sensor{},
 		&models.Vendor{},
 		&models.Application{},
 		&models.Rule{},

+ 0 - 0
services/knowoapi/controllers/produdct.go → services/knowoapi/controllers/product.go


+ 1 - 2
services/knowoapi/controllers/protocal.go

@@ -1,10 +1,9 @@
 package controllers
 
 import (
+	"github.com/kataras/iris"
 	"sparrow/pkg/models"
 	"sparrow/services/knowoapi/services"
-
-	"github.com/kataras/iris"
 )
 
 // ProtocalController api

+ 102 - 0
services/knowoapi/controllers/sensor.go

@@ -0,0 +1,102 @@
+package controllers
+
+import (
+	"github.com/kataras/iris"
+	"sparrow/pkg/models"
+	"sparrow/services/knowoapi/services"
+)
+
+// SensorController api
+type SensorController struct {
+	Ctx     iris.Context
+	Service services.SensorService
+	Token   Token
+}
+
+// Post 创建
+// POST /Sensor
+func (a *SensorController) Post() {
+	ptl := new(models.Sensor)
+	if err := parseBody(a.Ctx, ptl); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	err := a.Service.Create(ptl)
+	if err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, ptl)
+}
+
+// Delete 删除
+// DELETE /sensor
+func (a *SensorController) Delete() {
+	ptl := new(models.Sensor)
+	if err := parseBody(a.Ctx, ptl); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	err := a.Service.Delete(ptl)
+	if err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, "删除成功")
+}
+
+// Put 更新
+// PUT /sensor
+func (a *SensorController) Put() {
+	ptl := new(models.Sensor)
+	if err := parseBody(a.Ctx, ptl); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	p, err := a.Service.Update(ptl)
+	if err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, p)
+}
+
+// GetBy 根据id查询协议的内容
+// GET /sensor/{pid}
+func (a *SensorController) GetBy(pid int) {
+	p, err := a.Service.GetSensorInfo(uint(pid))
+	if err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, p)
+}
+
+// Get 获取某个产品的协议列表
+// GET /sensor?proid=1&pi&ps&name&label
+func (a *SensorController) 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
+	}
+	proid, err := a.Ctx.URLParamInt("proid")
+	name := a.Ctx.URLParam("name")
+	label := a.Ctx.URLParam("label")
+
+	ds, total, err := a.Service.GetProductSensors(uint(proid), pi, ps, name, label)
+	if err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, map[string]interface{}{
+		"list":  ds,
+		"total": total,
+	})
+}

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

@@ -9,6 +9,7 @@ type All struct {
 	User        *User
 	Application *Application
 	Protocal    *Protocal
+	Sensor      *Sensor
 	Alert       *Alert
 	Device      *Device
 	Role        *Role
@@ -21,6 +22,7 @@ func (a *All) Init(db *gorm.DB) *All {
 	a.User = new(User).Init(db)
 	a.Application = new(Application).Init(db)
 	a.Protocal = new(Protocal).Init(db)
+	a.Sensor = new(Sensor).Init(db)
 	a.Alert = new(Alert).Init(db)
 	a.Device = new(Device).Init(db)
 	a.Role = new(Role).Init(db)

+ 82 - 0
services/knowoapi/model/sensor.go

@@ -0,0 +1,82 @@
+package model
+
+import (
+	"fmt"
+	"sparrow/pkg/models"
+
+	"github.com/jinzhu/gorm"
+)
+
+// Sensor ``
+type Sensor struct {
+	db *gorm.DB
+}
+
+// Init 初始化
+func (a *Sensor) Init(db *gorm.DB) *Sensor {
+	a.db = db
+	return a
+}
+
+// Create 创建
+func (a *Sensor) Create(ptl *models.Sensor) error {
+	cache := getCache()
+	key := fmt.Sprintf("Sensor:%d", ptl.ID)
+	err := a.db.Save(ptl).Error
+	if err != nil {
+		return err
+	}
+	cache.Set(key, ptl)
+	return nil
+}
+
+// Delete 删除
+func (a *Sensor) Delete(ptl *models.Sensor) error {
+	cache := getCache()
+	key := fmt.Sprintf("Sensor:%d", ptl.ID)
+	if _, ok := cache.Get(key); ok {
+		cache.Delete(key)
+	}
+	return a.db.Delete(ptl).Error
+}
+
+// Update 更新
+func (a *Sensor) Update(ptl *models.Sensor) (data models.Sensor, err error) {
+	cache := getCache()
+	key := fmt.Sprintf("Sensor:%d", ptl.ID)
+	if _, ok := cache.Get(key); ok {
+		cache.Delete(key)
+	}
+	err = a.db.Model(&data).Update(ptl).Error
+	return
+}
+
+// GetProductSensors 获取产品的传感器列表
+func (a *Sensor) GetProductSensors(productid uint, pi, ps int, name, label string) (datas []models.Sensor, total int, err error) {
+	tx := a.db.Where("product_id = ? and 1 = 1", productid)
+	if name != "" {
+		tx = tx.Where("name like ? ", "%"+name+"%")
+	}
+	if label != "" {
+		tx = tx.Where("label = ?", label)
+	}
+
+	err = tx.Limit(ps).Offset((pi - 1) * ps).Find(&datas).Error
+	tx.Model(&models.Sensor{}).Count(&total)
+	return
+}
+
+// GetSensorInfo 获取数据点内容
+func (a *Sensor) GetSensorInfo(sid uint) (data models.Sensor, err error) {
+	cache := getCache()
+	key := fmt.Sprintf("Sensor:%d", sid)
+	if v, ok := cache.Get(key); ok {
+		data = *(v.(*models.Sensor))
+	} else {
+		err = a.db.Where("id = ?", sid).First(&data).Error
+		if err == nil {
+			cache.Set(key, &data)
+		}
+	}
+	return
+}

+ 4 - 0
services/knowoapi/router.go

@@ -45,6 +45,7 @@ func registerRouters(srv *iris.Application, models *model.All, gen *generator.Ke
 	pService := services.NewProductService(models, gen)
 	userService := services.NewUserService(models, gen)
 	appService := services.NewAppService(models, gen)
+	sensorService := services.NewSensorService(models)
 	protocalService := services.NewProtocalService(models)
 	alertService := services.NewAlertService(models)
 	deviceService := services.NewDeviceService(models)
@@ -67,6 +68,9 @@ func registerRouters(srv *iris.Application, models *model.All, gen *generator.Ke
 	//application api
 	appAPI := mvc.New(userRouter.Party("/application"))
 	appAPI.Register(appService).Handle(new(controllers.AppController))
+	// sensor api
+	sensorAPI := mvc.New(userRouter.Party("/sensor"))
+	sensorAPI.Register(sensorService).Handle(new(controllers.SensorController))
 	// protocal api
 	protocalAPI := mvc.New(userRouter.Party("/protocal"))
 	protocalAPI.Register(protocalService).Handle(new(controllers.ProtocalController))

+ 44 - 0
services/knowoapi/services/sensor.go

@@ -0,0 +1,44 @@
+package services
+
+import (
+	"sparrow/pkg/models"
+	"sparrow/services/knowoapi/model"
+)
+
+// SensorService 业务接口
+type SensorService interface {
+	Create(*models.Sensor) error
+	Update(*models.Sensor) (models.Sensor, error)
+	Delete(*models.Sensor) error
+	GetSensorInfo(pid uint) (models.Sensor, error)
+	// 获取产品的传感器列表
+	// 参数 : 产品id, pi, ps, 名称,标签
+	GetProductSensors(productid uint, pi, ps int, name, label string) ([]models.Sensor, int, error)
+}
+
+type sensorService struct {
+	model *model.All
+}
+
+// NewSensorService new sensor service
+func NewSensorService(model *model.All) SensorService {
+	return sensorService{
+		model: model,
+	}
+}
+
+func (a sensorService) Create(sensor *models.Sensor) error {
+	return a.model.Sensor.Create(sensor)
+}
+func (a sensorService) Delete(sensor *models.Sensor) error {
+	return a.model.Sensor.Delete(sensor)
+}
+func (a sensorService) Update(sensor *models.Sensor) (models.Sensor, error) {
+	return a.model.Sensor.Update(sensor)
+}
+func (a sensorService) GetProductSensors(proid uint, pi, ps int, name, label string) ([]models.Sensor, int, error) {
+	return a.model.Sensor.GetProductSensors(proid, pi, ps, name, label)
+}
+func (a sensorService) GetSensorInfo(sid uint) (models.Sensor, error) {
+	return a.model.Sensor.GetSensorInfo(sid)
+}