From e77e66d681cd2676675d194211f171744e23b479 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期四, 14 九月 2023 19:05:54 +0800
Subject: [PATCH] 从云端获取plc配置和plc地址

---
 nsq/msg_handler.go     |   67 +++++++++++++++++++++------------
 model/common/common.go |   34 +++++++++++++++--
 model/device_plc.go    |    1 
 3 files changed, 73 insertions(+), 29 deletions(-)

diff --git a/model/common/common.go b/model/common/common.go
index 8a8783a..5eafc0d 100644
--- a/model/common/common.go
+++ b/model/common/common.go
@@ -1,6 +1,9 @@
 package common
 
-import "github.com/shopspring/decimal"
+import (
+	"apsClient/constvar"
+	"github.com/shopspring/decimal"
+)
 
 // 鎺掔▼浠诲姟涓嬪彂
 type (
@@ -62,9 +65,32 @@
 		DeviceId string
 	}
 	ResponsePlcAddress struct {
-		KeyData     []byte
-		AddressData []byte
-		DeviceId    string
+		KeyData        []byte
+		AddressData    []byte
+		DeviceId       string
+		PlcAddressList []*PlcAddress
+		PlcConfig      PlcConfig
+	}
+
+	PlcConfig struct {
+		Brand      string             `gorm:"type:varchar(191);comment:PLC鍝佺墝" json:"brand"`
+		Method     constvar.PlcMethod `gorm:"type:varchar(191);comment:鎺ュ彛鏂瑰紡" json:"method"`
+		Address    string             `gorm:"type:varchar(191);comment:PLC鍦板潃" json:"address"` //plc ip鍦板潃锛� method = modbusTCP鐢�
+		Port       int                `gorm:"type:int(11);comment:绔彛" json:"port"`            //plc 绔彛鍙凤紝  method =  modbusTCP鐢�
+		BaudRate   int                `gorm:"type:int(11);comment:娉㈢壒鐜�"  json:"baudRate"`      //涓插彛娉㈢壒鐜囷紝 method = serial鏃� 鐢�
+		SerialName string             `gorm:"type:int(11);comment:涓插彛鍚嶇О"  json:"serialName"`   //涓插彛鍚嶇О锛宮ethod = serial鏃� 鐢�
+		IsOpen     bool               `gorm:"type:tinyint(1);comment:鏄惁寮�鍚�" json:"isOpen"`
+		Detail     string             `gorm:"type:varchar(2048);comment:鏁版嵁璇︽儏" json:"-"`
+		Details    []*PlcAddress      `gorm:"-" json:"details"`
+	}
+
+	PlcAddress struct {
+		DeviceID     string                       `json:"deviceID"`     // 璁惧id
+		Position     int                          `json:"position"`     // 鐢熶骇浣嶇疆锛屼竴涓満鍣ㄥ彲鑳芥湁澶氫釜鏈轰綅锛岄渶瑕佸垎鍒厤缃畃lc鍦板潃
+		StartAddress int                          `json:"startAddress"` // 鏁版嵁璧峰鍦板潃
+		Length       int                          `json:"length"`       // 鏁版嵁闀垮害
+		Type         string                       `json:"type"`         // 鏁版嵁绫诲瀷
+		FieldName    constvar.PlcStartAddressType `json:"fieldName"`    // 瀵瑰簲绯荤粺瀛楁锛屽畬鎴愰噺鎴栨�婚噺
 	}
 )
 
diff --git a/model/device_plc.go b/model/device_plc.go
index e02d2a7..d2690ea 100644
--- a/model/device_plc.go
+++ b/model/device_plc.go
@@ -33,6 +33,7 @@
 	}
 
 	DevicePlcAddress struct {
+		Position     int                               `json:"position"`     // 鏁版嵁璧峰鍦板潃
 		StartAddress int                               `json:"startAddress"` // 鏁版嵁璧峰鍦板潃
 		Length       int                               `json:"length"`       // 鏁版嵁闀垮害
 		Type         constvar.PlcStartAddressValueType `json:"type"`         // 鏁版嵁绫诲瀷
diff --git a/nsq/msg_handler.go b/nsq/msg_handler.go
index 36b5b9a..5237309 100644
--- a/nsq/msg_handler.go
+++ b/nsq/msg_handler.go
@@ -11,6 +11,7 @@
 	"apsClient/utils/file"
 	"encoding/json"
 	"fmt"
+	"github.com/mitchellh/mapstructure"
 	"github.com/spf13/cast"
 	"gorm.io/gorm"
 	"strings"
@@ -123,33 +124,49 @@
 		Topic:   slf.Topic,
 		Message: data,
 	}
-	if len(resp.KeyData) == 0 || len(resp.AddressData) == 0 {
-		return nil
-	}
-	//鍐欏叆鍒版枃浠�
-	err = file.WriteFile(fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataKeyFileName), resp.KeyData)
-	if err != nil {
-		return err
-	}
-	err = file.WriteFile(fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataValueFileName), resp.AddressData)
-	if err != nil {
-		return err
-	}
-	//鍐欏叆鍒板唴瀛�
-	keyString := string(resp.KeyData)
-	addressString := string(resp.AddressData)
+	if len(resp.KeyData) != 0 && len(resp.AddressData) != 0 {
+		//鍐欏叆鍒版枃浠�
+		err = file.WriteFile(fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataKeyFileName), resp.KeyData)
+		if err != nil {
+			return err
+		}
+		err = file.WriteFile(fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataValueFileName), resp.AddressData)
+		if err != nil {
+			return err
+		}
+		//鍐欏叆鍒板唴瀛�
+		keyString := string(resp.KeyData)
+		addressString := string(resp.AddressData)
 
-	keys := strings.Split(keyString, "\n")
-	addresses := strings.Split(addressString, "\n")
-	if len(keys) != len(addresses) {
-		logx.Error("plc address message error: key length not equal address length")
-		return nil
+		keys := strings.Split(keyString, "\n")
+		addresses := strings.Split(addressString, "\n")
+		if len(keys) != len(addresses) {
+			logx.Error("plc address message error: key length not equal address length")
+			return nil
+		}
+		for i := 0; i < len(keys); i++ {
+			key := strings.ReplaceAll(keys[i], "\r", "")
+			address := cast.ToInt(strings.ReplaceAll(addresses[i], "\r", ""))
+			plc_address.Set(key, address)
+			logx.Infof("plc address set ok: key:%v, address:%v", key, address)
+		}
 	}
-	for i := 0; i < len(keys); i++ {
-		key := strings.ReplaceAll(keys[i], "\r", "")
-		address := cast.ToInt(strings.ReplaceAll(addresses[i], "\r", ""))
-		plc_address.Set(key, address)
-		logx.Infof("plc address set ok: key:%v, address:%v", key, address)
+
+	var record model.DevicePlc
+	err = mapstructure.Decode(resp.PlcConfig, &record)
+	if err != nil {
+		logx.Infof("decode from PlcAddressList to DevicePlc  Details err:%v", err)
+	}
+	err = mapstructure.Decode(resp.PlcAddressList, &record.Details)
+	if err != nil {
+		logx.Infof("decode from PlcAddressList to DevicePlc  Details err:%v", err)
+	}
+	detail, err := json.Marshal(record.Details)
+	record.Detail = string(detail)
+	record.Id = 1
+	err = model.NewDevicePlcSearch().SetId(record.Id).Save(&record)
+	if err != nil {
+		return err
 	}
 	return nil
 }

--
Gitblit v1.8.0