Просмотр исходного кода

Add 增加数据日志,优化部分代码逻辑

YueYunyun 2 лет назад
Родитель
Сommit
482c999dbd
37 измененных файлов с 565 добавлено и 305 удалено
  1. 3 1
      .gitignore
  2. 6 2
      SERVER/IotAdmin/app/iot/models/device.go
  3. 1 1
      SERVER/IotAdmin/app/iot/models/meter_calc.go
  4. 11 11
      SERVER/IotAdmin/app/iot/service/device.go
  5. 5 0
      SERVER/IotAdmin/app/iot/service/dto/device.go
  6. 1 0
      SERVER/IotAdmin/config/settings.yml
  7. 7 14
      SERVER/IotAdmin/core/logger/default.go
  8. 1 0
      SERVER/IotAdmin/core/sdk/config/application.go
  9. 9 2
      SERVER/IotAdmin/core/tools/writer/file.go
  10. 11 0
      SERVER/IotAdmin/iot/constant/constant.go
  11. 52 10
      SERVER/IotAdmin/iot/db/device.go
  12. 4 4
      SERVER/IotAdmin/iot/db/init.go
  13. 2 2
      SERVER/IotAdmin/iot/db/meter_calc.go
  14. 2 2
      SERVER/IotAdmin/iot/interface/meter_calc.go
  15. 4 1
      SERVER/IotAdmin/iot/iot.go
  16. 22 27
      SERVER/IotAdmin/iot/protocol/electric/meter_adw300.go
  17. 23 29
      SERVER/IotAdmin/iot/protocol/electric/meter_pmc350b.go
  18. 48 53
      SERVER/IotAdmin/iot/protocol/electric/report_el-hj212.go
  19. 6 6
      SERVER/IotAdmin/iot/protocol/type.go
  20. 27 15
      SERVER/IotAdmin/iot/service/downService/collect.go
  21. 64 1
      SERVER/IotAdmin/iot/service/downService/report.go
  22. 35 35
      SERVER/IotAdmin/iot/service/downService/service.go
  23. 4 5
      SERVER/IotAdmin/iot/service/rtuService/rtuTcp.go
  24. 4 1
      SERVER/IotAdmin/iot/struct/data_collect.go
  25. 7 0
      SERVER/IotAdmin/iot/struct/dtu_change.go
  26. 2 0
      SERVER/IotAdmin/iot/struct/dtu_client.go
  27. 3 2
      SERVER/IotAdmin/iot/struct/dtu_config.go
  28. 3 0
      SERVER/IotAdmin/iot/struct/dtu_device.go
  29. 1 1
      SERVER/IotAdmin/iot/struct/dtu_register.go
  30. 17 11
      SERVER/IotAdmin/iot/struct/electric/adw300.go
  31. 50 39
      SERVER/IotAdmin/iot/struct/electric/meter.go
  32. 15 9
      SERVER/IotAdmin/iot/struct/electric/pmc350B.go
  33. 13 0
      SERVER/IotAdmin/iot/struct/log.go
  34. 1 0
      SERVER/IotAdmin/migration/models/iot/iot_device.go
  35. 5 0
      UI/IOTADMIN.VUE/src/api/iot/_device.ts
  36. 52 16
      UI/IOTADMIN.VUE/src/views/iot/device/_gateway.vue
  37. 44 5
      UI/IOTADMIN.VUE/src/views/iot/device/_meter.vue

+ 3 - 1
.gitignore

@@ -66,4 +66,6 @@ build/
 /UI/**/dist.rar
 
 _scripts/Dev/
-SERVER/**/_scripts/Dev/
+/SERVER/IotAdmin/_scripts/Dev/
+/SERVER/IotAdmin/_data/
+/SERVER/IotAdmin/_logs/

+ 6 - 2
SERVER/IotAdmin/app/iot/models/device.go

@@ -21,6 +21,7 @@ type IotDevice struct {
 	Type         int                       `json:"type" gorm:"type:bigint(20);comment:设备类型 1:网关 2:表计"`
 	Mode         int                       `json:"mode" gorm:"type:bigint(20);comment:设备模式 1:下发指令查询 2:表计主动上报"`
 	Cycle        int                       `json:"cycle" gorm:"type:bigint(20);comment:上报周期"`
+	Status       int                       `json:"status" gorm:"type:tinyint(1);comment:启用状态"`
 	Dsn          string                    `json:"dsn" gorm:"type:text;comment:设备Dsn"`
 	Description  string                    `json:"description" gorm:"type:varchar(255);comment:设备描述"`
 	Protocol     string                    `json:"protocol" gorm:"type:varchar(50);comment:表计协议"`
@@ -98,7 +99,9 @@ func (e *IotDevice) AfterFind(_ *gorm.DB) error {
 		configs = append(configs, cfg)
 	}
 	e.ReportConfig = &configs
-
+	if e.OtherConfig == "" {
+		e.OtherConfig = "{\"lvRef\":220,\"pvRef\":380}"
+	}
 	return nil
 }
 
@@ -108,7 +111,7 @@ func (e *IotDevice) ToDtuConfig(children *[]IotDevice) *iotStruct.DtuConfig {
 	}
 	slaveConfigs := make([]iotStruct.SlaveConfig, 0)
 	dtuConfig := &iotStruct.DtuConfig{
-		Enable:      true,
+		Enable:      e.Status == constant.IotDeviceEnabled,
 		Sn:          e.Sn,
 		Name:        e.Name,
 		Mode:        e.Mode,
@@ -118,6 +121,7 @@ func (e *IotDevice) ToDtuConfig(children *[]IotDevice) *iotStruct.DtuConfig {
 	slaveConfigs = make([]iotStruct.SlaveConfig, 0)
 	for _, device := range *children {
 		slaveConfig := iotStruct.SlaveConfig{
+			Enable:       device.Status == constant.IotDeviceEnabled,
 			No:           device.Sn,
 			Addr:         device.Address,
 			Protocol:     device.Protocol,

+ 1 - 1
SERVER/IotAdmin/app/iot/models/meter_calc.go

@@ -5,7 +5,7 @@ type IotMeterCalc struct {
 	Time int    `gorm:"type:int;not null;comment:更新时间"`
 	Data string `json:"data" gorm:"type:varchar(500);not null;comment:计算数据"`
 	//DataJson interface{} `json:"data" gorm:"type:varchar(500);not null;comment:计算数据"`
-	Device *IotDevice `json:"-" gorm:"foreignKey:Id;references:Sn"`
+	Device *IotDevice `json:"-" gorm:"foreignKey:Id;references:id"`
 }
 
 func (*IotMeterCalc) TableName() string {

+ 11 - 11
SERVER/IotAdmin/app/iot/service/device.go

@@ -33,10 +33,9 @@ func (e *IotDeviceService) GetPage(c *dto.IotDeviceGetPageReq, p *permission.Dat
 		permission.Permission(data.TableName(), p),
 	)
 	if c.Type == constant.IotDeviceTypeGateway {
-		//db = db.Joins("left join iot_group as g on g.id=iot_device.group_id").Select("iot_device.id,g.name as group_name,iot_device.name,type,group_id,sn,cycle,online_status,time_online,time_offline,iot_device.created_at")
-		db.Preload("Group").Select("iot_device.id,iot_device.name,type,group_id,sn,cycle,online_status,time_online,time_offline,iot_device.created_at")
+		db.Preload("Group").Select("id,name,type,group_id,sn,cycle,status,online_status,time_online,time_offline,iot_device.created_at")
 	} else {
-		db = db.Where("parent_id = ?", c.ParentId).Select("id,name,type,sn,protocol,mode,address,bm_yz,other_config,created_at")
+		db = db.Where("parent_id = ?", c.ParentId).Select("id,name,type,status,sn,protocol,mode,address,bm_yz,other_config,created_at")
 	}
 	err = db.Find(list).Limit(-1).Offset(-1).Count(count).Error
 	if err != nil {
@@ -92,9 +91,9 @@ func (e *IotDeviceService) Insert(c *dto.IotDeviceInsertReq, p *permission.DataP
 		return err
 	}
 	if data.Type == constant.IotDeviceTypeGateway {
-		err = updateDeviceMap(data.Id)
+		err = updateDeviceMap(data.Id, constant.IotDeviceAdd)
 	} else {
-		err = updateDeviceMap(data.ParentId)
+		err = updateDeviceMap(data.ParentId, constant.IotDeviceAdd)
 	}
 	if err != nil {
 		return err
@@ -122,9 +121,9 @@ func (e *IotDeviceService) Update(c *dto.IotDeviceUpdateReq, p *permission.DataP
 		return errors.New("无权更新该数据")
 	}
 	if data.Type == constant.IotDeviceTypeGateway {
-		err = updateDeviceMap(data.Id)
+		err = updateDeviceMap(data.Id, constant.IotDeviceUpdate)
 	} else {
-		err = updateDeviceMap(data.ParentId)
+		err = updateDeviceMap(data.ParentId, constant.IotDeviceUpdate)
 	}
 	if err != nil {
 		return err
@@ -150,9 +149,9 @@ func (e *IotDeviceService) Remove(d *dto.IotDeviceDeleteReq, p *permission.DataP
 		var err error
 		for _, device := range devices {
 			if device.Type == constant.IotDeviceTypeGateway {
-				err = updateDeviceMap(device.Id)
+				err = updateDeviceMap(device.Id, constant.IotDeviceDelete)
 			} else {
-				err = updateDeviceMap(device.ParentId)
+				err = updateDeviceMap(device.ParentId, constant.IotDeviceDelete)
 			}
 			if err != nil {
 				return err
@@ -171,14 +170,15 @@ func (e *IotDeviceService) GetReportProtocols(list *[]string) {
 }
 
 func (e *IotDeviceService) Refresh() error {
-	err := updateDeviceMap(0)
+	err := updateDeviceMap(0, constant.IotDeviceRefresh)
 	return err
 }
 
-func updateDeviceMap(deviceId int) error {
+func updateDeviceMap(deviceId int, changeType int) error {
 	q := sdk.Runtime.GetMemoryQueue("")
 	mp := make(map[string]interface{})
 	mp["id"] = deviceId
+	mp["type"] = changeType
 	message, err := sdk.Runtime.GetStreamMessage("", global.DtuDeviceChange, mp)
 	if err != nil {
 		logger.Errorf("构建更新设备列表 message [%s]失败: %v", global.DtuDeviceChange, err)

+ 5 - 0
SERVER/IotAdmin/app/iot/service/dto/device.go

@@ -20,6 +20,7 @@ type IotDeviceGetPageReq struct {
 	GroupId        int    `form:"groupId" search:"type:exact;column:group_id;table:iot_device" comment:"设备分组"`
 	Sn             string `form:"sn" search:"type:icontains;column:sn;table:iot_device" comment:"设备SN"`
 	Name           string `form:"name" search:"type:icontains;column:name;table:iot_device" comment:"设备名称"`
+	Status         int    `form:"status" search:"type:exact;column:status;table:iot_device" comment:"启用状态"`
 	Type           int    `form:"type" search:"type:exact;column:type;table:iot_device" comment:"设备类型"`
 	BeginTime      string `form:"beginTime" search:"type:gte;column:created_at;table:iot_device" comment:"创建时间"`
 	EndTime        string `form:"endTime" search:"type:lte;column:created_at;table:iot_device" comment:"创建时间"`
@@ -44,6 +45,7 @@ type IotDeviceInsertReq struct {
 	GroupId      int                       `json:"groupId" comment:"分组ID"`
 	Sn           string                    `json:"sn" comment:"设备编码"`
 	Name         string                    `json:"name" comment:"设备名称"`
+	Status       int                       `json:"status" comment:"启用状态"`
 	Type         int                       `json:"type" comment:"设备类型 1:网关 2:表计"`
 	Mode         int                       `json:"mode" comment:"设备模式 1:下发指令查询 2:表计主动上报"`
 	Cycle        int                       `json:"cycle" comment:"上报周期"`
@@ -66,6 +68,7 @@ func (s *IotDeviceInsertReq) Generate(model *models.IotDevice) {
 	model.Type = s.Type
 	model.Mode = s.Mode
 	model.Cycle = s.Cycle
+	model.Status = s.Status
 	model.Description = s.Description
 	model.Protocol = s.Protocol
 	model.Address = s.Address
@@ -127,6 +130,7 @@ type IotDeviceUpdateReq struct {
 	Sn           string                    `json:"sn" comment:"设备编码"`
 	Name         string                    `json:"name" comment:"设备名称"`
 	Type         int                       `json:"type" comment:"设备类型 1:网关 2:表计"`
+	Status       int                       `json:"status" comment:"启用状态"`
 	Mode         int                       `json:"mode" comment:"设备模式 1:下发指令查询 2:表计主动上报"`
 	Cycle        int                       `json:"cycle" comment:"上报周期"`
 	Description  string                    `json:"description" comment:"设备描述"`
@@ -148,6 +152,7 @@ func (s *IotDeviceUpdateReq) Generate(model *models.IotDevice) {
 	model.Type = s.Type
 	model.Mode = s.Mode
 	model.Cycle = s.Cycle
+	model.Status = s.Status
 	model.Description = s.Description
 	model.Protocol = s.Protocol
 	model.Address = s.Address

+ 1 - 0
SERVER/IotAdmin/config/settings.yml

@@ -13,6 +13,7 @@ settings:
     tcpPort: 14002
     readTimeout: 1
     writerTimeout: 2
+    dataLogFile: _data/iot
     # 数据权限功能开关
     enabledDp: true
   database:

+ 7 - 14
SERVER/IotAdmin/core/logger/default.go

@@ -88,7 +88,7 @@ func (l *defaultLogger) logf(level Level, format string, v ...interface{}) {
 	fields := copyFields(l.opts.Fields)
 	l.RUnlock()
 
-	fields["level"] = level.String()
+	//fields["level"] = "[" + level.String() + "]"
 
 	if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok && level.String() == "error" {
 		fields["file"] = fmt.Sprintf("%s:%d", logCallerFilePath(file), line)
@@ -121,21 +121,14 @@ func (l *defaultLogger) logf(level Level, format string, v ...interface{}) {
 		}
 	}
 
-	var name string
+	//s := "[" + rec.Timestamp.Format("2006-01-02 15:04:05.000Z0700")
+	str := "[" + rec.Timestamp.Format("2006-01-02 15:04:05.000")
 	if l.opts.Name != "" {
-		name = "[" + l.opts.Name + "]"
-	}
-	t := rec.Timestamp.Format("2006-01-02 15:04:05.000Z0700")
-	//fmt.Printf("%s\n", t)
-	//fmt.Printf("%s\n", name)
-	//fmt.Printf("%s\n", metadata)
-	//fmt.Printf("%v\n", rec.Message)
-	logStr := ""
-	if name == "" {
-		logStr = fmt.Sprintf("%s %s %v\n", t, metadata, rec.Message)
-	} else {
-		logStr = fmt.Sprintf("%s %s %s %v\n", name, t, metadata, rec.Message)
+		str += " - " + l.opts.Name
 	}
+	str += " - " + level.String() + "]"
+	logStr := fmt.Sprintf("%s %s %v\n", str, metadata, rec.Message)
+
 	_, err := l.opts.Out.Write([]byte(logStr))
 	if err != nil {
 		log.Printf("log [Logf] write error: %s \n", err.Error())

+ 1 - 0
SERVER/IotAdmin/core/sdk/config/application.go

@@ -13,5 +13,6 @@ type Application struct {
 	Description  string
 	JwtSecret    string
 	Mode         string
+	DataLogFile  string
 	EnabledDP    bool
 }

+ 9 - 2
SERVER/IotAdmin/core/tools/writer/file.go

@@ -1,6 +1,7 @@
 package writer
 
 import (
+	"IotAdmin/core/sdk/pkg"
 	"errors"
 	"fmt"
 	"log"
@@ -31,6 +32,12 @@ func NewFileWriter(opts ...Option) (*FileWriter, error) {
 	for _, o := range opts {
 		o(&p.opts)
 	}
+	if !pkg.PathExist(p.opts.path) {
+		err := pkg.PathCreate(p.opts.path)
+		if err != nil {
+			log.Fatalf("[file] create dir error: %s", err.Error())
+		}
+	}
 	var filename string
 	var err error
 	for {
@@ -119,8 +126,8 @@ func (p *FileWriter) getFilename() string {
 				p.opts.suffix))
 	}
 	return filepath.Join(p.opts.path,
-		fmt.Sprintf("%s-[%d].%s",
+		fmt.Sprintf("%s_%d.%s",
 			time.Now().Format(timeFormat),
-			p.num,
+			p.num+1,
 			p.opts.suffix))
 }

+ 11 - 0
SERVER/IotAdmin/iot/constant/constant.go

@@ -9,6 +9,11 @@ const (
 	IotDeviceTypeGateway = iota + 1
 	IotDeviceTypeMeter
 )
+const (
+	IotDeviceDisabled = iota + 1
+	IotDeviceEnabled
+)
+
 const (
 	IotDeviceModeCmd = iota + 1
 	IotDeviceModeReport
@@ -17,3 +22,9 @@ const (
 	IotDeviceOffline = iota + 1
 	IotDeviceOnline
 )
+const (
+	IotDeviceDelete = iota
+	IotDeviceAdd
+	IotDeviceUpdate
+	IotDeviceRefresh
+)

+ 52 - 10
SERVER/IotAdmin/iot/db/device.go

@@ -4,13 +4,16 @@ import (
 	"IotAdmin/app/iot/models"
 	"IotAdmin/core/logger"
 	"IotAdmin/core/sdk"
+	"IotAdmin/core/sdk/config"
 	"IotAdmin/core/storage"
+	"IotAdmin/core/tools/writer"
 	"IotAdmin/iot/constant"
 	iotMap "IotAdmin/iot/map"
 	iotStruct "IotAdmin/iot/struct"
 	"encoding/json"
 	"errors"
 	"fmt"
+	"log"
 
 	"gorm.io/gorm"
 )
@@ -22,7 +25,7 @@ func LoadDtuDeviceMap() error {
 	for _, db := range dbMap {
 		gatewayArr := make([]models.IotDevice, 0)
 		d := &models.IotDevice{}
-		err := db.Model(d).Select("id,sn,name,type,mode,cycle").Where("type = ?", constant.IotDeviceTypeGateway).Find(&gatewayArr).Error
+		err := db.Model(d).Select("id,sn,name,type,mode,status,cycle").Where("type = ? AND status = ?", constant.IotDeviceTypeGateway, constant.IotDeviceOnline).Find(&gatewayArr).Error
 		if err != nil {
 			continue
 		}
@@ -49,15 +52,12 @@ func loadDtuDeviceMap(db *gorm.DB, arr *[]models.IotDevice) error {
 }
 
 func addDtuDevice(db *gorm.DB, device models.IotDevice) error {
-	if device.Type == 0 {
-		iotMap.MapDtuDevice.Remove(device.Sn)
-		return nil
-	}
+
 	if device.Type != constant.IotDeviceTypeGateway {
 		return errors.New("type is not gateway")
 	}
 	children := make([]models.IotDevice, 0)
-	db.Model(&models.IotDevice{}).Select("id,sn,dsn,protocol,address,bm_yz,other_config").Where("parent_id = ?", device.Id).Find(&children)
+	db.Model(&models.IotDevice{}).Select("id,sn,status,dsn,protocol,address,bm_yz,other_config").Where("parent_id = ? AND status = ?", device.Id, constant.IotDeviceOnline).Find(&children)
 	if len(children) == 0 {
 		return nil
 	}
@@ -66,8 +66,10 @@ func addDtuDevice(db *gorm.DB, device models.IotDevice) error {
 		SN:     device.Sn,
 		Name:   device.Name,
 		Config: cfg,
+		Logger: logger.NewHelper(setupDeviceLogger(device.Sn)),
 	}
-	logger.Info("加载DTU设备[%s]: %v", device.Sn, dtu)
+	logger.Infof("加载DTU设备: %s %v", dtu.SN, dtu.Config)
+	dtu.Logger.Infof("加载DTU设备 %v", *dtu.Config)
 	iotMap.MapDtuDevice.Add(device.Sn, dtu)
 	return nil
 }
@@ -110,17 +112,29 @@ func DtuDeviceChange(message storage.Message) (err error) {
 		return nil
 	}
 	var rb []byte
-	val := &models.IotDevice{}
+	rb, err = json.Marshal(message.GetValues())
+	if err != nil {
+		err = fmt.Errorf("json Marshal error,%s, %v", string(rb), err.Error())
+		return err
+	}
+	val := &iotStruct.DtuChange{}
 	err = json.Unmarshal(rb, val)
 	if err != nil {
 		err = fmt.Errorf("json Unmarshal error,%s, %v", string(rb), err.Error())
 		return err
 	}
-	if val.Id == 0 {
+	if val.Type == constant.IotDeviceRefresh {
 		err = LoadDtuDeviceMap()
+	} else if val.Type == constant.IotDeviceDelete {
+		device := &models.IotDevice{}
+		err = db.Model(device).Where("id = ? ", val.Id).Find(device).Error
+		if err != nil {
+			return
+		}
+		iotMap.MapDtuDevice.Remove(device.Sn)
 	} else {
 		device := &models.IotDevice{}
-		err = db.Model(device).Where("id = ?", val.Id).Find(device).Error
+		err = db.Model(device).Where("id = ? AND status = ?", val.Id, constant.IotDeviceEnabled).Find(device).Error
 		if err != nil {
 			return
 		}
@@ -128,3 +142,31 @@ func DtuDeviceChange(message storage.Message) (err error) {
 	}
 	return
 }
+
+// setupDeviceLogger 设置设备日志组件
+func setupDeviceLogger(sn string) logger.Logger {
+	path := config.LoggerConfig.Path
+	logCap := config.LoggerConfig.Cap
+	if path == "" {
+		path = "_logs/"
+	} else if path[len(path)-1] != '/' {
+		path += "/"
+	}
+	path += "device/" + sn
+	if logCap == 0 {
+		logCap = 1024
+	}
+
+	output, err := writer.NewFileWriter(
+		writer.WithPath(path),
+		writer.WithCap(logCap<<10),
+	)
+	if err != nil {
+		log.Printf("device logger setup error: %s \r\n", err.Error())
+	}
+	level := logger.DebugLevel
+	if config.ApplicationConfig.Mode == "prod" {
+		level = logger.InfoLevel
+	}
+	return logger.NewLogger(logger.WithLevel(level), logger.WithOutput(output), logger.WithName(sn))
+}

+ 4 - 4
SERVER/IotAdmin/iot/db/init.go

@@ -14,14 +14,14 @@ func init() {
 	dbMap = sdk.Runtime.GetDb()
 }
 
-func Init() bool {
+func Init() error {
 	err := LoadMeterCalcMap()
 	if err != nil {
-		return false
+		return err
 	}
 	err = LoadDtuDeviceMap()
 	if err != nil {
-		return false
+		return err
 	}
-	return true
+	return nil
 }

+ 2 - 2
SERVER/IotAdmin/iot/db/meter_calc.go

@@ -2,7 +2,7 @@ package iotDb
 
 import (
 	"IotAdmin/app/iot/models"
-	log "IotAdmin/core/logger"
+	"IotAdmin/core/logger"
 	"IotAdmin/core/sdk"
 	"IotAdmin/core/storage"
 	iotInterface "IotAdmin/iot/interface"
@@ -87,7 +87,7 @@ func UpdateMeterCalc(message storage.Message) (err error) {
 	db := sdk.Runtime.GetDbByKey(message.GetPrefix())
 	if db == nil {
 		err = errors.New("db not exist")
-		log.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
+		logger.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
 		return nil
 	}
 	var rb []byte

+ 2 - 2
SERVER/IotAdmin/iot/interface/meter_calc.go

@@ -3,6 +3,6 @@ package iotInterface
 type MeterCalc interface {
 	GetMeterNo() string
 	GetUpdateTime() int
-	GetData() interface{}
-	SetCalc(interface{})
+	GetMeterData() interface{}
+	SetMeterData(interface{})
 }

+ 4 - 1
SERVER/IotAdmin/iot/iot.go

@@ -1,6 +1,7 @@
 package iot
 
 import (
+	"IotAdmin/core/logger"
 	iotDb "IotAdmin/iot/db"
 	iotMap "IotAdmin/iot/map"
 	iotProtocol "IotAdmin/iot/protocol"
@@ -15,7 +16,9 @@ func InitIotService() {
 	iotDownService.DtuRegisterChan = make(chan *iotStruct.DtuRegisterChanMsg, 100)
 	iotProtocol.Init()
 	iotMap.Init()
-	if iotDb.Init() {
+	if err := iotDb.Init(); err != nil {
+		logger.Errorf("IOT服务启动失败: %s", err.Error())
+	} else {
 		iotService.Init()
 	}
 }

+ 22 - 27
SERVER/IotAdmin/iot/protocol/electric/meter_adw300.go

@@ -1,13 +1,13 @@
 package iotElProtocol
 
 import (
-	"IotAdmin/core/logger"
 	"IotAdmin/core/tools/utils"
 	iotProtocol "IotAdmin/iot/protocol"
 	iotService "IotAdmin/iot/service/rtuService"
 	iotStruct "IotAdmin/iot/struct"
 	"IotAdmin/iot/struct/electric"
 	"encoding/json"
+	"fmt"
 	"reflect"
 	"runtime"
 )
@@ -31,40 +31,35 @@ var (
 )
 
 // Collect 采集数据
-func (m *adw300Meter) Collect(w iotService.RtuNetPgr, cfg *iotStruct.SlaveConfig) (*iotStruct.CollectData, error) {
-	colData := &iotStruct.CollectData{
-		//SlaveConfig: cfg,
-	}
+func (m *adw300Meter) Collect(w iotService.RtuNetPgr, colData *iotStruct.CollectData) error {
 	for _, v := range adw300Collects {
 		if adu, err := w.GetHoldingRegs(v.Origin, v.Amount); err != nil {
-			logger.Errorf("ADW300 采集失败[%s]  ERROR:%v", runtime.FuncForPC(reflect.ValueOf(v.Method).Pointer()).Name(), err)
-			return colData, err
+			colData.Logger.Errorf("ADW300 采集失败[%s]  ERROR:%v", runtime.FuncForPC(reflect.ValueOf(v.Method).Pointer()).Name(), err)
+			return err
 		} else {
-			logger.Debugf("======》ADU:%v", adu)
+			colData.Logger.Infof("======》ADU:%v", adu)
 			v.Method(adu, colData)
 		}
 	}
-	return colData, nil
+	return nil
 }
 
 // SetAddress 设置地址
-func (m *adw300Meter) SetAddress(w iotService.RtuNetPgr, addr int) (result bool) {
+func (m *adw300Meter) SetAddress(w iotService.RtuNetPgr, addr int) (err error) {
 	var buf []byte
 	buf = append(buf, utils.HfWord2byte(addr)...)
-	if _, err := w.SetHoldingRegs(0, 1, buf); err != nil {
-		logger.Errorf("ADW300 设置地址失败  ERROR:%v", err)
-		result = false
-	} else {
-		result = true
+	if _, err = w.SetHoldingRegs(0, 1, buf); err != nil {
+		err = fmt.Errorf("ADW300 设置地址失败  ERROR:%v", err)
+		return
 	}
 	return
 }
 
 // GetRatio 查询电表变比
-func (m *adw300Meter) GetRatio(w iotService.RtuNetPgr) (string, bool) {
+func (m *adw300Meter) GetRatio(w iotService.RtuNetPgr) (string, error) {
 	if adu, err := w.GetHoldingRegs(0x0E, 2); err != nil {
-		logger.Errorf("ADW300 查询电表变比失败  ERROR:%v", err)
-		return "", false
+		err = fmt.Errorf("ADW300 查询电表变比失败  ERROR:%v", err)
+		return "", err
 	} else {
 		ratio := &electric.MeterADW300Other{}
 		index := 0
@@ -75,19 +70,19 @@ func (m *adw300Meter) GetRatio(w iotService.RtuNetPgr) (string, bool) {
 		ratio.CT = int(m)
 		str, err := json.Marshal(ratio)
 		if err != nil {
-			logger.Errorf("ADW300 查询电表变比失败  ERROR:%v", err)
-			return "", false
+			err = fmt.Errorf("ADW300 查询电表变比失败  ERROR:%v", err)
+			return "", err
 		}
-		return string(str), true
+		return string(str), nil
 	}
 }
 
 // SetRatio 设置电表变比
-func (m *adw300Meter) SetRatio(w iotService.RtuNetPgr, data string) bool {
+func (m *adw300Meter) SetRatio(w iotService.RtuNetPgr, data string) error {
 	ratio := &electric.MeterADW300Other{}
 	if err := json.Unmarshal([]byte(data), ratio); err != nil {
-		logger.Errorf("ADW300 设置电表变比失败,变比数据解析失败  ERROR:%v", err)
-		return false
+		err = fmt.Errorf("ADW300 设置电表变比失败,变比数据解析失败  ERROR:%v", err)
+		return err
 	}
 	var buf []byte
 	{
@@ -99,11 +94,11 @@ func (m *adw300Meter) SetRatio(w iotService.RtuNetPgr, data string) bool {
 		buf = append(buf, k...)
 	}
 	if _, err := w.SetHoldingRegs(0x0E, 2, buf); err != nil {
-		logger.Errorf("ADW300 设置电表变比失败  ERROR:%v", err)
-		return false
+		err = fmt.Errorf("ADW300 设置电表变比失败  ERROR:%v", err)
+		return err
 	}
 
-	return true
+	return nil
 }
 
 func adw300A04C56(adu []byte, s *iotStruct.CollectData) {

+ 23 - 29
SERVER/IotAdmin/iot/protocol/electric/meter_pmc350b.go

@@ -1,13 +1,13 @@
 package iotElProtocol
 
 import (
-	"IotAdmin/core/logger"
 	"IotAdmin/core/tools/utils"
 	iotProtocol "IotAdmin/iot/protocol"
 	iotService "IotAdmin/iot/service/rtuService"
 	iotStruct "IotAdmin/iot/struct"
 	"IotAdmin/iot/struct/electric"
 	"encoding/json"
+	"fmt"
 	"math"
 	"reflect"
 	"runtime"
@@ -37,42 +37,36 @@ func NewPmc350bMeterHandler() iotProtocol.MeterHandler {
 	return &pmc350bMeter{}
 }
 
-func (m *pmc350bMeter) Collect(w iotService.RtuNetPgr, cfg *iotStruct.SlaveConfig) (*iotStruct.CollectData, error) {
-	colData := &iotStruct.CollectData{
-		//SlaveConfig: cfg,
-		PT: 1,
-		CT: 1,
-	}
+func (m *pmc350bMeter) Collect(w iotService.RtuNetPgr, colData *iotStruct.CollectData) error {
+
 	for _, v := range pmc350bCollects {
 		if adu, err := w.GetHoldingRegs(v.Origin, v.Amount); err != nil {
-			logger.Errorf("PMC-350B 采集失败[%s]  ERROR:%v", runtime.FuncForPC(reflect.ValueOf(v.Method).Pointer()).Name(), err)
-			return colData, err
+			colData.Logger.Errorf("PMC-350B 采集失败[%s]  ERROR:%v", runtime.FuncForPC(reflect.ValueOf(v.Method).Pointer()).Name(), err)
+			return err
 		} else {
-			logger.Debugf("======》ADU:%v", adu)
+			colData.Logger.Infof("======》ADU:%v", adu)
 			v.Method(adu, colData)
 		}
 	}
-	return colData, nil
+	return nil
 }
 
 // SetAddress 设置地址
-func (m *pmc350bMeter) SetAddress(w iotService.RtuNetPgr, addr int) (result bool) {
+func (m *pmc350bMeter) SetAddress(w iotService.RtuNetPgr, addr int) (err error) {
 	var buf []byte
 	buf = append(buf, utils.HfWord2byte(addr)...)
-	if _, err := w.SetHoldingRegs(6401, 1, buf); err != nil {
-		logger.Errorf("PMC-350B 设置地址失败  ERROR:%v", err)
-		result = false
-	} else {
-		result = true
+	if _, err = w.SetHoldingRegs(6401, 1, buf); err != nil {
+		err = fmt.Errorf("PMC-350B 设置地址失败  ERROR:%v", err)
+		return
 	}
 	return
 }
 
 // GetRatio 查询电表变比
-func (m *pmc350bMeter) GetRatio(w iotService.RtuNetPgr) (string, bool) {
+func (m *pmc350bMeter) GetRatio(w iotService.RtuNetPgr) (string, error) {
 	if adu, err := w.GetHoldingRegs(6000, 10); err != nil {
-		logger.Errorf("PMC-350B 查询电表变比失败  ERROR:%v", err)
-		return "", false
+		err = fmt.Errorf("PMC-350B 查询电表变比失败  ERROR:%v", err)
+		return "", err
 	} else {
 		var (
 			index = 0
@@ -96,19 +90,19 @@ func (m *pmc350bMeter) GetRatio(w iotService.RtuNetPgr) (string, bool) {
 		index += 4
 		str, err := json.Marshal(s)
 		if err != nil {
-			logger.Errorf("PMC-350B 变比序列化失败  ERROR:%v", err)
-			return "", false
+			err = fmt.Errorf("PMC-350B 变比序列化失败  ERROR:%v", err)
+			return "", err
 		}
-		return string(str), true
+		return string(str), nil
 	}
 }
 
 // SetRatio 设置电表变比
-func (m *pmc350bMeter) SetRatio(w iotService.RtuNetPgr, data string) bool {
+func (m *pmc350bMeter) SetRatio(w iotService.RtuNetPgr, data string) error {
 	ratio := &electric.MeterPMC350BOther{}
 	if err := json.Unmarshal([]byte(data), ratio); err != nil {
-		logger.Errorf("PMC-350B 设置电表变比失败,变比数据解析失败  ERROR:%v", err)
-		return false
+		err = fmt.Errorf("PMC-350B 设置电表变比失败,变比数据解析失败  ERROR:%v", err)
+		return err
 	}
 	var buf []byte
 	{
@@ -132,11 +126,11 @@ func (m *pmc350bMeter) SetRatio(w iotService.RtuNetPgr, data string) bool {
 		buf = append(buf, k...)
 	}
 	if _, err := w.SetHoldingRegs(6000, 10, buf); err != nil {
-		logger.Errorf("PMC-350B 设置电表变比失败  ERROR:%v", err)
-		return false
+		err = fmt.Errorf("PMC-350B 设置电表变比失败  ERROR:%v", err)
+		return err
 	}
 
-	return true
+	return nil
 }
 
 func pmc350bUIP(adu []byte, s *iotStruct.CollectData) {

+ 48 - 53
SERVER/IotAdmin/iot/protocol/electric/report_el-hj212.go

@@ -25,65 +25,71 @@ func NewElHj212ReportHandler() iotProtocol.ReportHandler {
 }
 
 func (*elHj212) Adapter(data *iotStruct.CollectData) {
-	processData(data)
+	cfg := data.SlaveConfig
+	// 获取电表计算参数
+	calc, today, err := getMeterElectricCalc(cfg)
+	if err != nil {
+		data.Logger.Errorf("[%s]获取计算参数失败: %s", cfg.No, err.Error())
+		return
+	}
+	mData := calc.GetMeterData()
+	elMeter := mData.(electric.MeterElectric)
+	// 计算电表数据
+	data.Logger.Debugf("[%d]计算前: [%v]", today, calc)
+	elMeter.Time = today
+	elMeter.CalcMeterData(data)
+	data.Logger.Debugf("[%d]计算后: [%v]", today, calc)
+
+	// 更新电表计算参数
+	calc.SetMeterData(elMeter)
+	updateMeterCalc(elMeter, &calc)
 }
 
-func processData(colData *iotStruct.CollectData) {
-	// 从机的配置需要保存到采集数据中,上报需要使用配置
-	cfg := colData.SlaveConfig
-	// 计算电表数据
-	logger.Debugf("计算电表数据: %s", cfg.No)
+func (*elHj212) Report(data *iotStruct.CollectData, config *iotStruct.ReportConfig) (reportStr *string) {
+	if str, ok := packHj212(data, config); ok {
+		reportStr = &str
+		if receive, err := iotReportService.UpToServer(config.Host, str); err != nil {
+			data.Logger.Errorf("[%s:%s]上报数据失败: [ %s ] %s", config.Host, str, err.Error())
+		} else {
+			data.Logger.Debugf("上报数据 SEND -> %s", str)
+			data.Logger.Infof("上报数据 RECE <- %s", receive)
+		}
+	} else {
+		data.Logger.Errorf("[-- %s --]打包数据失败 %v", data.SlaveConfig.No, data)
+	}
+	return
+}
+
+func getMeterElectricCalc(cfg *iotStruct.SlaveConfig) (calc iotInterface.MeterCalc, tms int, err error) {
 	now := time.Now()
 	today, _ := strconv.Atoi(now.Format("20060102"))
-	tms := today
-	var calc iotInterface.MeterCalc
-	//var elMeterData interface{}
-	var err error
+	tms = today
 	if x, ok := iotMap.MapMeterCalc.Get(cfg.No); ok {
 		calc = *x
-		//elMeterData = (*x).GetData()
 	} else {
-		logger.Debugf("[%s][%d] 没有查询到电表计算参数。", cfg.No, today)
 		calc = nil
 	}
-	var elMeter electric.MeterElectric
-	switch cfg.Protocol {
-	case iotProtocol.MeterAdw300:
-		if calc == nil {
-			calc, err = electric.NewMeterADW300(cfg.No, tms, "", cfg.OtherConfig)
+
+	if calc == nil {
+		switch cfg.Protocol {
+		case iotProtocol.MeterAdw300:
+			calc, err = electric.NewMeterADW300(cfg.No, today, "", cfg.OtherConfig)
 			if err != nil {
-				logger.Errorf("创建电表[%s]-[$s] 计算参数失败: %s %v", cfg.No, cfg.Protocol, err.Error())
+				err = fmt.Errorf("创建电表[%s]-[%s] 计算参数失败: %s", cfg.No, cfg.Protocol, err.Error())
 				return
 			}
-		}
-		if p, ok := (calc.GetData()).(*electric.MeterADW300); ok {
-			elMeter = (*p).MeterElectric
-		}
-	case iotProtocol.MeterPmc350b:
-		if calc == nil {
-			calc, err = electric.NewMeterPMC350B(cfg.No, tms, "", cfg.OtherConfig)
+		case iotProtocol.MeterPmc350b:
+			calc, err = electric.NewMeterPMC350B(cfg.No, today, "", cfg.OtherConfig)
 			if err != nil {
-				logger.Errorf("创建电表[%s]-[$s] 计算参数失败: %s %v", cfg.No, cfg.Protocol, err.Error())
+				err = fmt.Errorf("创建电表[%s]-[%s] 计算参数失败: %s", cfg.No, cfg.Protocol, err.Error())
 				return
 			}
+		default:
+			err = fmt.Errorf("不支持的协议: %s %s", cfg.No, cfg.Protocol)
+			return
 		}
-		if p, ok := (calc.GetData()).(*electric.MeterPMC350B); ok {
-			elMeter = (*p).MeterElectric
-		}
-	default:
-		logger.Errorf("不支持的协议: %s", cfg.Protocol)
-		return
 	}
-
-	// 计算电表数据
-	logger.Debugf("[%d]计算前: [%v]", today, calc)
-	elMeter.Time = tms
-	elMeter.CalcMeterData(colData)
-	logger.Debugf("[%d]计算后: [%v]", today, calc)
-	// 更新电表计算参数
-	calc.SetCalc(elMeter)
-	updateMeterCalc(elMeter, &calc)
-
+	return
 }
 
 func updateMeterCalc(elMeter electric.MeterElectric, calc *iotInterface.MeterCalc) {
@@ -109,17 +115,6 @@ func updateMeterCalc(elMeter electric.MeterElectric, calc *iotInterface.MeterCal
 	iotMap.MapMeterCalc.Add(elMeter.Id, calc)
 }
 
-func (*elHj212) Report(data *iotStruct.CollectData, config *iotStruct.ReportConfig) {
-	if str, ok := packHj212(data, config); ok {
-		if receive, err := iotReportService.UpToServer(config.Host, str); err != nil {
-			logger.Errorf("[%s:%s]上报数据失败: [ %s ] %s", config.Host, str, err.Error())
-		} else {
-			logger.Debugf("上报数据 SEND -> %s", str)
-			logger.Infof("上报数据 RECE <- %s", receive)
-		}
-	}
-}
-
 func packHj212(d *iotStruct.CollectData, cfg *iotStruct.ReportConfig) (string, bool) {
 	now := time.Now()
 	nt := fmt.Sprintf("%04d%02d%02d%02d%02d00", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute())

+ 6 - 6
SERVER/IotAdmin/iot/protocol/type.go

@@ -7,14 +7,14 @@ import (
 
 // MeterHandler 电表处理接口
 type MeterHandler interface {
-	Collect(w iotRtuService.RtuNetPgr, cfg *iotStruct.SlaveConfig) (*iotStruct.CollectData, error)
-	SetAddress(w iotRtuService.RtuNetPgr, addr int) (result bool)
-	GetRatio(w iotRtuService.RtuNetPgr) (string, bool)
-	SetRatio(w iotRtuService.RtuNetPgr, ratio string) bool
+	Collect(w iotRtuService.RtuNetPgr, data *iotStruct.CollectData) error
+	SetAddress(w iotRtuService.RtuNetPgr, addr int) error
+	GetRatio(w iotRtuService.RtuNetPgr) (string, error)
+	SetRatio(w iotRtuService.RtuNetPgr, ratio string) error
 }
 
 // ReportHandler 上报处理接口
 type ReportHandler interface {
-	Adapter(dataArray *iotStruct.CollectData)
-	Report(dataArray *iotStruct.CollectData, config *iotStruct.ReportConfig)
+	Adapter(data *iotStruct.CollectData)
+	Report(data *iotStruct.CollectData, config *iotStruct.ReportConfig) *string
 }

+ 27 - 15
SERVER/IotAdmin/iot/service/downService/collect.go

@@ -13,26 +13,34 @@ import (
 func collectData(sn string, config *iotStruct.DtuConfig) *[]*iotStruct.CollectData {
 	array := make([]*iotStruct.CollectData, 0)
 
-	logger.Infof("开始采集数据 【%s】", sn)
 	logger.Debugf("开始采集数据【%s】 %v", sn, config)
-
-	if !config.Enable || config.Cycle < 1 {
-		return &array
-	}
 	client, ok := iotMap.MapDtuClient.Get(sn)
 	if !ok {
-		logger.Errorf("采集数据失败,[%s]客户端不存在", sn)
+		logger.Debugf("采集数据失败,[%s]客户端不存在", sn)
+		return &array
+	}
+	if !config.Enable {
+		client.Logger.Info("网关未激活!")
+		return &array
+	}
+	if config.Cycle < 1 {
+		client.Logger.Error("网关采集周期错误!")
 		return &array
 	}
-
 	if !client.Online {
-		logger.Errorf("采集数据失败,[%s]客户端离线", sn)
+		client.Logger.Error("采集数据失败,客户端离线")
 	}
 	client.MLock.Lock()
 	defer client.MLock.Unlock()
+	client.Logger.Info("【开始采集数据】 \r\n")
 	for _, cfg := range *config.SlaveConfig {
+		if !cfg.Enable {
+			client.Logger.Infof("表计[%s]未激活 Addr: %d", cfg.No, cfg.Addr)
+			continue
+		}
+		client.Logger.Debugf("[- %s -]开始采集 Addr:%d  Protocol: %s", cfg.No, cfg.Addr, cfg.Protocol)
 		if cfg.Addr < 1 || cfg.Addr > 254 {
-			logger.Errorf("采集数据失败,[%s]客户端地址错误: %d", sn, cfg.Addr)
+			client.Logger.Errorf("[%s]采集数据失败,客户端地址错误: %d", cfg.No, cfg.Addr)
 			continue
 		}
 		bAddr := utils.IntoByte(cfg.Addr)
@@ -50,19 +58,23 @@ func collectData(sn string, config *iotStruct.DtuConfig) *[]*iotStruct.CollectDa
 		case iotProtocol.MeterPmc350b:
 			collectHandler = iotElProtocol.NewPmc350bMeterHandler()
 		default:
-			logger.Errorf("[%s]未识别采集器类型: %v", sn, cfg)
+			client.Logger.Errorf("[%s]未识别采集器类型: %s", cfg.No, cfg.Protocol)
 		}
-		colData, err := collectHandler.Collect(w, &cfg)
+		newCfg := cfg
+		colData := &iotStruct.CollectData{
+			SlaveConfig: &newCfg,
+			Logger:      client.Logger,
+		}
+		err = collectHandler.Collect(w, colData)
 		if err != nil {
-			logger.Errorf("采集数据失败, [%s][%s]客户端采集数据错误: %s", sn, cfg.Protocol, err.Error())
+			client.Logger.Errorf("[%s] 采集数据失败,[Addr:%d] %s客户端采集数据错误: %s", cfg.No, cfg.Addr, cfg.Protocol, err.Error())
 			continue
 		}
-		newCfg := cfg
-		colData.SlaveConfig = &newCfg
 		array = append(array, colData)
+		client.Logger.Debugf("[- %s -]采集完成 Addr:%d  Protocol: %s", cfg.No, cfg.Addr, cfg.Protocol)
 	}
+	client.Logger.Info(" \r\n【采集数据完成】")
 
-	logger.Infof("采集数据完成【%s】", sn)
 	logger.Debugf("采集数据完成【%s】 %v", sn, array)
 	return &array
 }

+ 64 - 1
SERVER/IotAdmin/iot/service/downService/report.go

@@ -1,11 +1,20 @@
 package iotDownService
 
 import (
+	"IotAdmin/core/sdk/config"
+	"IotAdmin/core/tools/writer"
 	iotProtocol "IotAdmin/iot/protocol"
 	iotElProtocol "IotAdmin/iot/protocol/electric"
 	iotStruct "IotAdmin/iot/struct"
+	"encoding/json"
+	"log"
+	"strings"
+	"time"
 )
 
+func init() {
+	mp = make(map[string]*writer.FileWriter)
+}
 func reportData(dataArray *[]*iotStruct.CollectData) {
 	if dataArray == nil || len(*dataArray) == 0 {
 		return
@@ -24,9 +33,63 @@ func reportData(dataArray *[]*iotStruct.CollectData) {
 			}
 			go func(d *iotStruct.CollectData, cfg *iotStruct.ReportConfig) {
 				reportHandler.Adapter(d)
-				reportHandler.Report(d, cfg)
+				str := reportHandler.Report(d, cfg)
+				go logReport(d, cfg, str)
 			}(data, &rc)
 		}
 	}
+}
 
+var mp map[string]*writer.FileWriter
+
+func logReport(data *iotStruct.CollectData, cfg *iotStruct.ReportConfig, dataStr *string) {
+	output := getWrite(data)
+	logData := &iotStruct.LogData{
+		Time:           time.Now().Format("20060102150400"),
+		No:             data.SlaveConfig.No,
+		Data:           *data,
+		ReportHost:     cfg.Host,
+		ReportProtocol: cfg.Protocol,
+		ReportMn:       cfg.MN,
+		ReportUser:     cfg.User,
+		ReportPwd:      cfg.Pwd,
+		ReportStr:      *dataStr,
+	}
+	str, err := json.Marshal(logData)
+	if err != nil {
+		log.Printf("Report Log Marshal error: %s \r\n", err.Error())
+		return
+	}
+	_, err = output.Write(str)
+	if err != nil {
+		log.Printf("Report Log Write error: %s \r\n", err.Error())
+		return
+	}
+	_, err = output.Write([]byte("\r\n"))
+}
+
+func getWrite(data *iotStruct.CollectData) *writer.FileWriter {
+	filePath := config.ApplicationConfig.DataLogFile
+	if filePath == "" {
+		filePath = "./_data/iot/"
+	} else if filePath[len(filePath)-1] != '/' {
+		filePath += "/"
+	}
+	filePath += strings.ReplaceAll(data.SlaveConfig.No, "_", "/")
+	var output *writer.FileWriter
+	var ok bool
+	if output, ok = mp[filePath]; !ok {
+		var err error
+		output, err = writer.NewFileWriter(
+			writer.WithPath(filePath),
+			// 不切割文件
+			writer.WithCap(0),
+			writer.WithSuffix(".data"),
+		)
+		if err != nil {
+			log.Printf("Report Log setup error: %s \r\n", err.Error())
+		}
+		mp[filePath] = output
+	}
+	return output
 }

+ 35 - 35
SERVER/IotAdmin/iot/service/downService/service.go

@@ -25,7 +25,6 @@ func NewDownStreamService() {
 		logger.Infof("新设备连接:%s", conn.GetClientHost())
 	})
 	server.OnNewMessage(func(conn *tcpserver.Client, msg []byte) {
-		//logger.Debugf("[%s]收到新消息:%s", conn.GetClientHost(), string(msg))
 		logger.Debugf("[%s]收到新消息[byte]:%v", conn.GetClientHost(), msg)
 		if dealDtuUpMsg(conn, msg) {
 			conn.PutRawRes(msg)
@@ -57,32 +56,35 @@ func dealDtuUpMsg(conn *tcpserver.Client, msg []byte) bool {
 // 处理DTU注册包及心跳包
 func dealDtuRegisterHeartBeat(conn *tcpserver.Client, dtuMsg *iotStruct.DTUManageCmd) {
 	if dtuMsg.Cmd == iotStruct.CmdRegister || dtuMsg.Cmd == iotStruct.CmdHeartBeat {
-		//clientState, _ := data.DtuMapState.Get(dtuMsg.SN)
-		clientState, ok := iotMap.MapDtuClient.Get(dtuMsg.SN)
+		dtuClient, ok := iotMap.MapDtuClient.Get(dtuMsg.SN)
+		if !ok {
+			dtu, ok2 := iotMap.MapDtuDevice.Get(dtuMsg.SN)
+			if !ok2 {
+				logger.Errorf("设备未注册: %s", dtu.SN)
+			}
+			dtuClient = &iotStruct.DtuClient{
+				Logger: dtu.Logger,
+				Config: dtu.Config,
+			}
+		}
 		conn.SetClientRegisterID(dtuMsg.SN)
-		clientState.FD = conn
-		clientState.Online = true
-		clientState.UpdateTime()
-
-		//data.IpSN.Add(conn.GetClientHost(), dtuMsg.SN)
-		//onlineSn, ok := data.OnlineSN.Get(dtuMsg.SN)
-		if !ok || clientState.FD.GetClientHost() != clientState.FD.GetClientHost() {
+		dtuClient.FD = conn
+		dtuClient.Online = true
+		dtuClient.UpdateTime()
+		if !ok || dtuClient.FD.GetClientHost() != dtuClient.FD.GetClientHost() {
 			msg := &iotStruct.DtuRegisterChanMsg{
-				Sn:    dtuMsg.SN,
-				Value: clientState,
+				SN:    dtuMsg.SN,
+				Value: dtuClient,
 			}
 			DtuRegisterChan <- msg
 		} else {
-			logger.Debugf("[%s]设备上线:%s", clientState.FD.GetClientHost(), dtuMsg.SN)
-			iotMap.MapDtuClient.Add(dtuMsg.SN, clientState)
+			dtuClient.Logger.Infof("== HeartBeat == %s", conn.GetClientHost())
+			iotMap.MapDtuClient.Add(dtuMsg.SN, dtuClient)
 		}
 		if dtuMsg.Cmd == iotStruct.CmdRegister {
-			// 设备上线
-			UpdateDtuStatus(dtuMsg.SN, constant.IotDeviceOnline)
-			logger.Infof("======【%s】====== Register  %s", dtuMsg.SN, conn.GetClientHost())
-		}
-		if dtuMsg.Cmd == iotStruct.CmdHeartBeat {
-			logger.Infof("======【%s】====== HeartBeat %s", dtuMsg.SN, conn.GetClientHost())
+			logger.Debugf("== Register ==  %s %s", dtuMsg.SN, conn.GetClientHost())
+		} else if dtuMsg.Cmd == iotStruct.CmdHeartBeat {
+			logger.Debugf("== HeartBeat == %s %s", dtuMsg.SN, conn.GetClientHost())
 		}
 	} else {
 		logger.Errorf("Register || HeartBeat 失败")
@@ -98,7 +100,7 @@ func dealDTUDisconnect(conn *tcpserver.Client) {
 		UpdateDtuStatus(sn, constant.IotDeviceOffline)
 		if client, ok := iotMap.MapDtuClient.Get(sn); ok && client.FD.GetClientHost() == addr {
 			iotMap.MapDtuClient.Remove(sn)
-			logger.Debugf("[%s]设备离线:%s", addr, sn)
+			client.Logger.Debugf("设备离线:%s", addr)
 		}
 	}
 }
@@ -110,8 +112,7 @@ func runTran(msg <-chan *iotStruct.DtuRegisterChanMsg) {
 	for {
 		select {
 		case msg := <-msg:
-			logger.Infof("【更新设备配置】 SN:%s", msg.Sn)
-			updateOnlineConf(msg)
+			dtuClientOnline(msg)
 		case nowTime := <-ticker.C:
 			lastMinute = collectAndReport(nowTime, lastMinute)
 		}
@@ -119,13 +120,16 @@ func runTran(msg <-chan *iotStruct.DtuRegisterChanMsg) {
 }
 
 // 设备上线更新配置
-func updateOnlineConf(msg *iotStruct.DtuRegisterChanMsg) {
-	if dtu, ok := iotMap.MapDtuDevice.Get(msg.Sn); ok {
+func dtuClientOnline(msg *iotStruct.DtuRegisterChanMsg) {
+	if dtu, ok := iotMap.MapDtuDevice.Get(msg.SN); ok {
 		msg.Value.Config = dtu.Config
-		iotMap.MapDtuClient.Add(msg.Sn, msg.Value)
-		logger.Debugf("[%s]设备上线:%s ;配置:  %v", msg.Value.FD.GetClientHost(), msg.Sn, dtu.Config)
+		msg.Value.Logger = dtu.Logger
+		iotMap.MapDtuClient.Add(msg.SN, msg.Value)
+		// 设备上线
+		UpdateDtuStatus(msg.SN, constant.IotDeviceOnline)
+		dtu.Logger.Infof("设备上线:%s ;配置:  %v 上报配置:%v", msg.Value.FD.GetClientHost(), dtu.Config, dtu.Config.SlaveConfig)
 	} else {
-		logger.Debugf("【设备上线失败】[%s]设备不存在。", msg.Sn)
+		logger.Errorf("【设备上线失败】[%s]设备不存在。", msg.SN)
 	}
 }
 
@@ -136,20 +140,16 @@ func collectAndReport(nowTime time.Time, lastMinute int) int {
 		count := 0
 		onlineDtu := make(map[string]*iotStruct.DtuClient)
 
-		//for _, v := range data.DtuMap.Map.Map {
-		//	vv := v.(*iotStruct.DTUDeviceState)
-		//	log.Println("===============", vv.Info.Name)
-		//}
 		iotMap.MapDtuClient.Map.Range(func(key, value interface{}) bool {
 			v := value.(*iotStruct.DtuClient)
 			dtuSn := key.(string)
 			dtu, ok := iotMap.MapDtuDevice.Get(dtuSn)
 			if !ok || dtu.Config == nil {
-				logger.Errorf("【在线设备更新配置】设备不存在  SN:%s", dtuSn)
+				dtu.Logger.Errorf("【在线设备更新配置】设备不存在  SN:%s", dtuSn)
 				return true
 			}
-
 			v.Config = dtu.Config
+			v.Logger = dtu.Logger
 			onlineDtu[dtuSn] = v
 			count++
 			return true
@@ -163,7 +163,7 @@ func collectAndReport(nowTime time.Time, lastMinute int) int {
 			if minute%client.Config.Cycle == 0 {
 				// 采集上报数据
 				if dataArray := collectData(dtuSn, client.Config); len(*dataArray) > 0 {
-					logger.Debugf("开始上报平台:%s", dtuSn)
+					client.Logger.Debugf("开始上报平台:%s", dtuSn)
 					reportData(dataArray)
 				}
 			}

+ 4 - 5
SERVER/IotAdmin/iot/service/rtuService/rtuTcp.go

@@ -1,7 +1,6 @@
 package iotRtuService
 
 import (
-	"IotAdmin/core/logger"
 	"IotAdmin/core/modbus"
 	"IotAdmin/core/tcpserver"
 	"IotAdmin/core/tools/utils"
@@ -51,18 +50,17 @@ func (mb *rtuNetPackager) GetHoldingRegs(address, quantity uint16) (adu []byte,
 	var result []byte
 	if mb.Sta == nil {
 		err = fmt.Errorf("读命令,客户端不存在")
-		logger.Errorf("读命令发送失败,%s", err.Error())
 		return
 	}
 	result, err = mb.Clt.PackReadHoldingRegisters(address, quantity)
 	if err != nil {
 		return
 	}
-	logger.Debugf("=====SEND CMD===== %v", result)
 	res, bok := tcpserver.SendTo(mb.Sta.FD, result)
 	if !bok {
 		if utils.TimeDiff(mb.Sta.Times, constant.TCPTimeoutTime) {
-			logger.Error("读命令发送失败,连接超时")
+			err = fmt.Errorf("读命令发送失败,连接超时")
+			return
 		}
 		err = fmt.Errorf("读命令发送失败")
 		return
@@ -85,7 +83,8 @@ func (mb *rtuNetPackager) SetHoldingRegs(address, quantity uint16, value []byte)
 	res, bok := tcpserver.SendTo(mb.Sta.FD, result)
 	if !bok {
 		if utils.TimeDiff(mb.Sta.Times, constant.TCPTimeoutTime) {
-			logger.Error("写命令发送失败,连接超时")
+			err = fmt.Errorf("写命令发送失败,连接超时")
+			return
 		}
 		err = fmt.Errorf("写命令发送失败")
 		return

+ 4 - 1
SERVER/IotAdmin/iot/struct/data_collect.go

@@ -1,7 +1,10 @@
 package iotStruct
 
+import "IotAdmin/core/logger"
+
 type CollectData struct {
-	SlaveConfig *SlaveConfig
+	Logger      *logger.Helper `json:"-"`
+	SlaveConfig *SlaveConfig   `json:"-"`
 	//MeterRef *MeterRef //电表参数
 	PT int //电压变比
 	CT int //电流变比

+ 7 - 0
SERVER/IotAdmin/iot/struct/dtu_change.go

@@ -0,0 +1,7 @@
+package iotStruct
+
+type DtuChange struct {
+	Id   int    `json:"id"`
+	SN   string `json:"sn"`
+	Type int    `json:"type"`
+}

+ 2 - 0
SERVER/IotAdmin/iot/struct/dtu_client.go

@@ -1,6 +1,7 @@
 package iotStruct
 
 import (
+	"IotAdmin/core/logger"
 	"IotAdmin/core/tcpserver"
 	"sync"
 	"time"
@@ -13,6 +14,7 @@ type DtuClient struct {
 	Online    bool  //在线状态
 	TmOnline  string
 	TmOffline string
+	Logger    *logger.Helper
 	MLock     sync.Mutex
 }
 

+ 3 - 2
SERVER/IotAdmin/iot/struct/dtu_config.go

@@ -16,8 +16,9 @@ type DtuConfig struct {
 }
 
 type SlaveConfig struct {
-	No   string `json:"no"`
-	Addr int    `json:"addr"` //表计串口地址
+	No     string `json:"no"`
+	Enable bool   `json:"enable"`
+	Addr   int    `json:"addr"` //表计串口地址
 	//LvRef    float32         `json:"lvRef"`    //表计线电压基准(220)
 	//PvRef    float32         `json:"pvRef"`    //表计相电压基准(380)
 	Protocol     string          `json:"protocol"` //表计协议

+ 3 - 0
SERVER/IotAdmin/iot/struct/dtu_device.go

@@ -1,7 +1,10 @@
 package iotStruct
 
+import "IotAdmin/core/logger"
+
 type DtuDevice struct {
 	SN     string
 	Name   string
 	Config *DtuConfig
+	Logger *logger.Helper
 }

+ 1 - 1
SERVER/IotAdmin/iot/struct/dtu_register.go

@@ -1,6 +1,6 @@
 package iotStruct
 
 type DtuRegisterChanMsg struct {
-	Sn    string
+	SN    string
 	Value *DtuClient
 }

+ 17 - 11
SERVER/IotAdmin/iot/struct/electric/adw300.go

@@ -1,9 +1,9 @@
 package electric
 
 import (
-	"IotAdmin/core/logger"
 	iotInterface "IotAdmin/iot/interface"
 	"encoding/json"
+	"fmt"
 )
 
 type MeterADW300 struct {
@@ -21,7 +21,7 @@ func NewMeterADW300(id string, time int, calc, cfg string) (iotInterface.MeterCa
 			MeterElectricBase: MeterElectricBase{
 				Id:      id,
 				Time:    time,
-				isClean: false,
+				isClean: true,
 			},
 			MeterElectricRef: MeterElectricRef{
 				PvRef: 380,
@@ -29,12 +29,17 @@ func NewMeterADW300(id string, time int, calc, cfg string) (iotInterface.MeterCa
 			},
 		},
 		MeterADW300Other: MeterADW300Other{
-			PT: 0,
-			CT: 0,
+			PT: 1,
+			CT: 1,
 		},
 	}
-	if err := json.Unmarshal([]byte(cfg), meter); err != nil {
-		logger.Errorf("ADW300配置参数解析失败", err)
+	if cfg == "" {
+		meter.MeterElectricRef = MeterElectricRef{
+			PvRef: 380,
+			LvRef: 220,
+		}
+	} else if err := json.Unmarshal([]byte(cfg), meter); err != nil {
+		err = fmt.Errorf("ADW300配置参数解析失败: %s", err)
 		return nil, err
 	}
 	if calc == "" {
@@ -57,19 +62,20 @@ func NewMeterADW300(id string, time int, calc, cfg string) (iotInterface.MeterCa
 			Fp: 0,
 		}
 	} else if err := json.Unmarshal([]byte(calc), meter); err != nil {
-		logger.Error("ADW300计算参数解析失败", err)
+		err = fmt.Errorf("ADW300计算参数解析失败: %s", err)
 		return nil, err
 	}
+	meter.ClearDayEnergy()
 	return meter, nil
 }
 
-func (m *MeterADW300) GetData() interface{} {
-	return m
+func (m *MeterADW300) GetMeterData() interface{} {
+	return m.MeterElectric
 }
 
-func (m *MeterADW300) SetCalc(data interface{}) {
+func (m *MeterADW300) SetMeterData(data interface{}) {
 	meter, ok := data.(MeterElectric)
 	if ok {
-		m.MeterElectric = meter
+		m.MeterElectricBase = meter.MeterElectricBase
 	}
 }

+ 50 - 39
SERVER/IotAdmin/iot/struct/electric/meter.go

@@ -1,7 +1,6 @@
 package electric
 
 import (
-	"IotAdmin/core/logger"
 	iotStruct "IotAdmin/iot/struct"
 	"encoding/json"
 )
@@ -41,13 +40,14 @@ type CalcDataEnergy struct {
 }
 
 // CalcAndSetPowerRate 计算负荷率
-func (m *MeterElectricBase) CalcAndSetPowerRate(colData *iotStruct.CollectData) float32 {
+func (m *MeterElectricBase) CalcAndSetPowerRate(data *iotStruct.CollectData) {
 	m.PowerRate.Count++
-	m.PowerRate.SumPower += colData.P
-	if m.PowerRate.MaxPower < colData.P {
-		m.PowerRate.MaxPower = colData.P
+	m.PowerRate.SumPower += data.P
+	if m.PowerRate.MaxPower < data.P {
+		m.PowerRate.MaxPower = data.P
 	}
-	return m.CalcRate()
+	data.Pv = m.CalcRate()
+	data.Logger.Debugf("[%s]计算负荷率:%f %v", data.SlaveConfig.No, data.Pv, m.PowerRate)
 }
 
 // CalcRate 计算负荷率
@@ -68,60 +68,60 @@ func (m *MeterElectricBase) ClearDayEnergy() {
 	m.PowerRate.Count = 0
 	m.PowerRate.MaxPower = 0
 	m.PowerRate.SumPower = 0
-	logger.Debugf("计算电表数据清零")
 	m.isClean = true
 }
 
 // CalcAndSetDayEnergy 计算并设置日电能
-func (m *MeterElectricBase) CalcAndSetDayEnergy(colData *iotStruct.CollectData) {
+func (m *MeterElectricBase) CalcAndSetDayEnergy(data *iotStruct.CollectData) {
 	if m.isClean {
 		m.isClean = false
-		logger.Debugf("当日电表日电能第一次采集 电表地址: %d", colData.SlaveConfig.Addr)
+		data.Logger.Debugf("[%s]当日电表日电能第一次采集 电表地址: %d", data.SlaveConfig.No, data.SlaveConfig.Addr)
 		return
 	}
-	m.DayTotalEnergy.Tp += colData.Tps - m.TotalEnergy.Tp
-	m.DayTotalEnergy.Tq += colData.Tqs - m.TotalEnergy.Tq
-	m.DayTotalEnergy.Fp += colData.Fps - m.TotalEnergy.Fp
-	m.DayTotalEnergy.Fq += colData.Fqs - m.TotalEnergy.Fq
+	m.DayTotalEnergy.Tp += data.Tps - m.TotalEnergy.Tp
+	m.DayTotalEnergy.Tq += data.Tqs - m.TotalEnergy.Tq
+	m.DayTotalEnergy.Fp += data.Fps - m.TotalEnergy.Fp
+	m.DayTotalEnergy.Fq += data.Fqs - m.TotalEnergy.Fq
+	data.Logger.Debugf("[%s]当日电表日电能 电表地址: %d tpe:%f tqe:%f fpe:%f fqe:%f", data.SlaveConfig.No, data.SlaveConfig.Addr, m.DayTotalEnergy.Tp, m.DayTotalEnergy.Tq, m.DayTotalEnergy.Fp, m.DayTotalEnergy.Fq)
 
 }
 
-// SetTotalEnergy 设置总电能
-func (m *MeterElectricBase) SetTotalEnergy(colData *iotStruct.CollectData) {
-	m.TotalEnergy.Tp = colData.Tps
-	m.TotalEnergy.Tq = colData.Tqs
-	m.TotalEnergy.Fp = colData.Fps
-	m.TotalEnergy.Fq = colData.Fqs
+// SetCalcTotalEnergy 设置总电能
+func (m *MeterElectricBase) SetCalcTotalEnergy(data *iotStruct.CollectData) {
+	m.TotalEnergy.Tp = data.Tps
+	m.TotalEnergy.Tq = data.Tqs
+	m.TotalEnergy.Fp = data.Fps
+	m.TotalEnergy.Fq = data.Fqs
 }
 
 // CalcDiff 计算偏差
-func (m *MeterElectricBase) CalcDiff(colData *iotStruct.CollectData) {
+func (m *MeterElectricBase) CalcDiff(data *iotStruct.CollectData) {
 	ref := &MeterElectricRef{}
-	err := json.Unmarshal([]byte(colData.SlaveConfig.OtherConfig), ref)
+	err := json.Unmarshal([]byte(data.SlaveConfig.OtherConfig), ref)
 	if err != nil {
-		logger.Errorf("计算电表偏差失败, %s", err.Error())
+		data.Logger.Errorf("计算电表偏差失败, %s", err.Error())
 		return
 	}
-	colData.Fw = colData.Freq - float32(50.0)
-	colData.Uaw = (colData.Ua - ref.LvRef) * float32(100.0) / ref.LvRef
-	colData.Ubw = (colData.Ub - ref.LvRef) * float32(100.0) / ref.LvRef
-	colData.Ucw = (colData.Uc - ref.LvRef) * float32(100.0) / ref.LvRef
-	colData.Uabw = (colData.Uab - ref.PvRef) * float32(100.0) / ref.PvRef
-	colData.Ubcw = (colData.Ubc - ref.PvRef) * float32(100.0) / ref.PvRef
-	colData.Ucaw = (colData.Uca - ref.PvRef) * float32(100.0) / ref.PvRef
+	data.Logger.Debugf("计算偏差:%v", ref)
+	data.Fw = data.Freq - float32(50.0)
+	data.Uaw = (data.Ua - ref.LvRef) * float32(100.0) / ref.LvRef
+	data.Ubw = (data.Ub - ref.LvRef) * float32(100.0) / ref.LvRef
+	data.Ucw = (data.Uc - ref.LvRef) * float32(100.0) / ref.LvRef
+	data.Uabw = (data.Uab - ref.PvRef) * float32(100.0) / ref.PvRef
+	data.Ubcw = (data.Ubc - ref.PvRef) * float32(100.0) / ref.PvRef
+	data.Ucaw = (data.Uca - ref.PvRef) * float32(100.0) / ref.PvRef
 }
 
 // CalcMeterData 计算电表部分数据
-func (m *MeterElectricBase) CalcMeterData(d *iotStruct.CollectData) {
-	m.CalcDiff(d)
-	m.CalcAndSetPowerRate(d)
-	m.CalcAndSetDayEnergy(d)
-	m.SetTotalEnergy(d)
-	d.Tpe = m.DayTotalEnergy.Tp
-	d.Tqe = m.DayTotalEnergy.Tq
-	d.Fpe = m.DayTotalEnergy.Fp
-	d.Fqe = m.DayTotalEnergy.Fq
-	d.Pv = m.CalcRate()
+func (m *MeterElectricBase) CalcMeterData(data *iotStruct.CollectData) {
+	m.CalcDiff(data)
+	m.CalcAndSetPowerRate(data)
+	m.CalcAndSetDayEnergy(data)
+	m.SetCalcTotalEnergy(data)
+	data.Tpe = m.DayTotalEnergy.Tp
+	data.Tqe = m.DayTotalEnergy.Tq
+	data.Fpe = m.DayTotalEnergy.Fp
+	data.Fqe = m.DayTotalEnergy.Fq
 }
 
 func (m *MeterElectricBase) GetMeterNo() string {
@@ -130,3 +130,14 @@ func (m *MeterElectricBase) GetMeterNo() string {
 func (m *MeterElectricBase) GetUpdateTime() int {
 	return m.Time
 }
+
+func (m *MeterElectric) GetMeterData() interface{} {
+	return m
+}
+
+func (m *MeterElectric) SetMeterData(data interface{}) {
+	meter, ok := data.(MeterElectricBase)
+	if ok {
+		m.MeterElectricBase = meter
+	}
+}

+ 15 - 9
SERVER/IotAdmin/iot/struct/electric/pmc350B.go

@@ -1,9 +1,9 @@
 package electric
 
 import (
-	"IotAdmin/core/logger"
 	iotInterface "IotAdmin/iot/interface"
 	"encoding/json"
+	"fmt"
 )
 
 type MeterPMC350B struct {
@@ -26,7 +26,7 @@ func NewMeterPMC350B(id string, time int, calc, cfg string) (iotInterface.MeterC
 			MeterElectricBase: MeterElectricBase{
 				Id:      id,
 				Time:    time,
-				isClean: false,
+				isClean: true,
 			},
 			MeterElectricRef: MeterElectricRef{
 				PvRef: 380,
@@ -41,8 +41,13 @@ func NewMeterPMC350B(id string, time int, calc, cfg string) (iotInterface.MeterC
 			SecondCurrent:  5,
 		},
 	}
-	if err := json.Unmarshal([]byte(cfg), meter); err != nil {
-		logger.Errorf("PMC350B配置参数解析失败", err)
+	if cfg == "" {
+		meter.MeterElectricRef = MeterElectricRef{
+			PvRef: 380,
+			LvRef: 220,
+		}
+	} else if err := json.Unmarshal([]byte(cfg), meter); err != nil {
+		err = fmt.Errorf("PMC350B配置参数解析失败: %s", err)
 		return nil, err
 	}
 	if calc == "" {
@@ -65,19 +70,20 @@ func NewMeterPMC350B(id string, time int, calc, cfg string) (iotInterface.MeterC
 			Fp: 0,
 		}
 	} else if err := json.Unmarshal([]byte(calc), meter); err != nil {
-		logger.Errorf("PMC350B计算参数解析失败", err)
+		err = fmt.Errorf("PMC350B计算参数解析失败: %s", err)
 		return nil, err
 	}
+	meter.ClearDayEnergy()
 	return meter, nil
 }
 
-func (m *MeterPMC350B) GetData() interface{} {
-	return m
+func (m *MeterPMC350B) GetMeterData() interface{} {
+	return m.MeterElectric
 }
 
-func (m *MeterPMC350B) SetCalc(data interface{}) {
+func (m *MeterPMC350B) SetMeterData(data interface{}) {
 	meter, ok := data.(MeterElectric)
 	if ok {
-		m.MeterElectric = meter
+		m.MeterElectricBase = meter.MeterElectricBase
 	}
 }

+ 13 - 0
SERVER/IotAdmin/iot/struct/log.go

@@ -0,0 +1,13 @@
+package iotStruct
+
+type LogData struct {
+	No             string      `json:"n"`
+	Time           string      `json:"t"`
+	ReportHost     string      `json:"h"`
+	ReportProtocol string      `json:"p"`
+	ReportMn       string      `json:"mn"`
+	ReportUser     string      `json:"u"`
+	ReportPwd      string      `json:"pw"`
+	ReportStr      string      `json:"s"`
+	Data           CollectData `json:"d"`
+}

+ 1 - 0
SERVER/IotAdmin/migration/models/iot/iot_device.go

@@ -14,6 +14,7 @@ type Device struct {
 	Type     int    `gorm:"type:tinyint(1);not null;comment:设备类型 1:网关 2:表计"`
 	Mode     int    `gorm:"type:tinyint(1);comment:设备模式 1:下发指令查询 2:表计主动上报"`
 	Cycle    int    `gorm:"type:int;comment:上报周期"`
+	Status   int    `gorm:"type:tinyint(1);comment:启用状态"`
 	// DSN 表计上报IP、端口、协议、ST、MN、用户、密码 192.168.0.104:8080@YcHj212@1@mn,192.168.0.104:8081@YcHj212@user@123456
 	DSN          string    `gorm:"type:text;comment:设备Dsn"`
 	Description  string    `gorm:"type:varchar(255);comment:设备描述"`

+ 5 - 0
UI/IOTADMIN.VUE/src/api/iot/_device.ts

@@ -39,6 +39,11 @@ class deviceApi {
 			data: { ids }
 		})
 	}
+	refresh = () => {
+		return Rs.post({
+			url: "/iot-device/refresh"
+		})
+	}
 	getDeviceProtocols = () => {
 		return Rs.get({
 			url: "/iot-device/device-protocols"

+ 52 - 16
UI/IOTADMIN.VUE/src/views/iot/device/_gateway.vue

@@ -2,12 +2,7 @@
 import apis from "@a"
 import message from "@@/utils/message"
 import dayjs from "dayjs"
-// const props = withDefaults(
-// 	defineProps<{
-// 		queryMeter: (v: number) => void
-// 	}>(),
-// 	{}
-// )
+
 const emits = defineEmits<{
 	(e: "query-meter", v: number): void
 	(e: "create-meter", v: number): void
@@ -26,34 +21,36 @@ const modalRef = ref()
 const opts = reactive<any>({
 	columns: [
 		{ field: "id", name: "ID", width: 100, visible: false, isSort: false, tooltip: true },
-		{ field: "groupName", name: "设备分组", width: "auto", isSort: true, visible: true },
-		{ field: "sn", name: "设备编码", width: "auto", isSort: true, visible: true },
-		{ field: "name", name: "设备名称", width: "auto", isSort: true, visible: true },
+		{ field: "groupName", name: "设备分组", width: 150, visible: true, tooltip: true },
+		{ field: "sn", name: "设备编码(SN)", width: 130, isSort: true, visible: true },
+		{ field: "name", name: "设备名称", width: "auto", isSort: true, visible: true, tooltip: true },
 		{ field: "type", name: "设备类型", width: 80, isSort: false, visible: true },
-		{ field: "cycle", name: "上报周期(分钟)", width: 120, isSort: false, visible: true },
+		{ field: "cycle", name: "周期", width: 50, isSort: false, visible: true },
+		{ field: "status", name: "启用状态", width: 100, isSort: true, visible: true },
 		{ field: "onlineStatus", name: "在线状态", width: 100, isSort: true, visible: true },
-		{ field: "timeOnline", name: "上线时间", width: 155, isSort: true, visible: true },
+		// { field: "timeOnline", name: "上线时间", width: 155, isSort: true, visible: true },
 		{ field: "timeOffline", name: "离线时间", width: 155, isSort: true, visible: true },
 		{ field: "createdAt", name: "创建时间", width: 155, isSort: true, visible: true },
-		{ field: "actions", name: `操作`, width: 150 }
+		{ field: "actions", name: `操作`, width: 130 }
 	],
 	queryParams: {
 		groupId: undefined,
 		sn: undefined,
 		name: undefined,
+		status: undefined,
 		type: 1
 	},
 	searchFormItems: [
 		{
 			field: "groupId",
-			label: "设备分组",
+			label: "分组",
 			class: "w-100",
 			component: "VS",
 			data: () => groupIdOptions.value,
 			props: {
 				type: "select",
 				clearable: true,
-				placeholder: "请选择分组ID",
+				placeholder: "请选择设备分组",
 				props: {
 					label: "name",
 					value: "id"
@@ -62,7 +59,7 @@ const opts = reactive<any>({
 		},
 		{
 			field: "sn",
-			label: "设备编码",
+			label: "SN",
 			class: "w-100",
 			component: "I",
 			listeners: {
@@ -75,7 +72,7 @@ const opts = reactive<any>({
 		},
 		{
 			field: "name",
-			label: "设备名称",
+			label: "名称",
 			class: "w-100",
 			component: "I",
 			listeners: {
@@ -85,10 +82,22 @@ const opts = reactive<any>({
 					}
 				}
 			}
+		},
+		{
+			field: "status",
+			label: "状态",
+			class: "w-100",
+			component: "dict",
+			props: {
+				valueIsNumber: true,
+				placeholder: "请选择设备状态",
+				dictType: "sys_normal_disable"
+			}
 		}
 	] as any,
 	permission: "iot:device",
 	handleFuns: {
+		handleRefresh,
 		handleCreate
 	},
 	customBtns: [],
@@ -153,6 +162,19 @@ const opts = reactive<any>({
 			type: "textarea",
 			required: false,
 			span: 24
+		},
+		{
+			field: "status",
+			label: "设备状态",
+			class: "w-100",
+			component: "dict",
+			props: {
+				type: "radio",
+				valueIsNumber: true,
+				placeholder: "请选择设备状态",
+				dictType: "sys_normal_disable"
+			},
+			span: 24
 		}
 	] as any,
 	resetForm: () => {
@@ -168,6 +190,7 @@ const opts = reactive<any>({
 		type: 1,
 		mode: undefined,
 		cycle: undefined,
+		status: 2,
 		description: undefined,
 		protocol: undefined,
 		address: undefined
@@ -208,6 +231,16 @@ function submitForm() {
 		})
 	}
 }
+
+function handleRefresh() {
+	message.confirm("确定要重新加载设备吗?", "重新加载").then(() => {
+		apis.iot.deviceApi.refresh().then(() => {
+			message.msgSuccess("重新加载成功")
+			handleQuery()
+		})
+	})
+}
+
 /** 查询按钮 */
 function handleQuery() {
 	addDateRange(queryParams.value, queryParams.value.dateRange)
@@ -278,6 +311,9 @@ defineExpose({ query })
 			:row-click="onRowClick"
 			:reset-search-form-fun="resetQuery"
 			:custom-search-fun="handleQuery">
+			<template #status="{ row }">
+				<DictTag valueIsNumber :value="row.status" type="sys_normal_disable"></DictTag>
+			</template>
 			<template #type="{ row }">
 				<DictTag valueIsNumber :value="row.type" type="iot_device_type"></DictTag>
 			</template>

+ 44 - 5
UI/IOTADMIN.VUE/src/views/iot/device/_meter.vue

@@ -13,12 +13,13 @@ const modalRef = ref()
 const opts = reactive<any>({
 	columns: [
 		{ field: "id", name: "ID", width: 100, visible: false, isSort: false, tooltip: true },
-		{ field: "sn", name: "设备编码", width: "auto", isSort: true, visible: true },
-		{ field: "name", name: "表计名称", width: "auto", isSort: true, visible: true },
+		{ field: "sn", name: "设备编码", width: 160, isSort: true, visible: true },
+		{ field: "name", name: "表计名称", width: "auto", isSort: true, visible: true, tooltip: true },
 		// { field: "type", name: "设备类型", width: 100, isSort: true, visible: true },
 		{ field: "protocol", name: "表计协议", width: 200, isSort: true, visible: true },
-		{ field: "address", name: "表计串口地址", width: 130, isSort: false, visible: true },
+		{ field: "address", name: "串口地址", width: 80, isSort: false, visible: true },
 		// { field: "mode", name: "设备模式", width: 180, isSort: false, visible: true },
+		{ field: "status", name: "启用状态", width: 100, isSort: true, visible: true },
 		{ field: "createdAt", name: "创建时间", width: 185, isSort: true, visible: true },
 		{ field: "actions", name: `操作`, width: 150 }
 	],
@@ -26,6 +27,7 @@ const opts = reactive<any>({
 		parentId: parentId.value,
 		sn: undefined,
 		name: undefined,
+		status: undefined,
 		type: 2,
 		dateRange: []
 	},
@@ -56,6 +58,17 @@ const opts = reactive<any>({
 				}
 			}
 		},
+		{
+			field: "status",
+			label: "设备状态",
+			class: "w-100",
+			component: "dict",
+			props: {
+				valueIsNumber: true,
+				placeholder: "请选择设备状态",
+				dictType: "sys_normal_disable"
+			}
+		},
 		{
 			field: "dateRange",
 			label: "创建时间",
@@ -118,7 +131,7 @@ const opts = reactive<any>({
 			class: "w-100",
 			component: "I",
 			required: true,
-			span: 24
+			span: 12
 		},
 		{
 			field: "protocol",
@@ -143,6 +156,19 @@ const opts = reactive<any>({
 			required: true,
 			span: 12
 		},
+		{
+			field: "status",
+			label: "设备状态",
+			class: "w-100",
+			component: "dict",
+			props: {
+				type: "radio",
+				valueIsNumber: true,
+				placeholder: "请选择设备状态",
+				dictType: "sys_normal_disable"
+			},
+			span: 12
+		},
 		{
 			field: "dsn",
 			label: "平台上报",
@@ -158,6 +184,14 @@ const opts = reactive<any>({
 			type: "textarea",
 			required: false
 		},
+		{
+			field: "otherConfig",
+			label: "其他配置",
+			class: "w-100",
+			component: "I",
+			type: "textarea",
+			required: false
+		},
 		{
 			field: "description",
 			label: "设备描述",
@@ -177,6 +211,7 @@ const opts = reactive<any>({
 		groupId: undefined,
 		sn: undefined,
 		name: undefined,
+		status: 2,
 		type: 2,
 		mode: undefined,
 		reportConfig: [
@@ -192,7 +227,8 @@ const opts = reactive<any>({
 		protocol: undefined,
 		address: undefined,
 		bmYz: undefined,
-		description: undefined
+		description: undefined,
+		otherConfig: undefined
 	}
 })
 const { queryParams, emptyFormData } = toRefs(opts)
@@ -333,6 +369,9 @@ defineExpose({
 			<template #groupId="{ row }">
 				{{ row.group?.Name }}
 			</template>
+			<template #status="{ row }">
+				<DictTag valueIsNumber :value="row.status" type="sys_normal_disable"></DictTag>
+			</template>
 			<template #type="{ row }">
 				<DictTag valueIsNumber :value="row.type" type="iot_device_type"></DictTag>
 			</template>