From f008bf77342a93c13d1e42399dd175c9c941d3ef Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期五, 03 十一月 2023 21:05:16 +0800
Subject: [PATCH] 工艺参数地址表从文件里获取改成从数据库查询

---
 nsq/msg_handler.go                 |   35 +++++
 service/problem/check.go           |   10 +
 model/common/common.go             |    5 
 model/process_model_plc_address.go |  225 +++++++++++++++++++++++++++++++++++++
 service/process_model.go           |   18 +++
 main.go                            |    3 
 api/v1/task.go                     |    7 
 7 files changed, 295 insertions(+), 8 deletions(-)

diff --git a/api/v1/task.go b/api/v1/task.go
index 0b1c769..553b76d 100644
--- a/api/v1/task.go
+++ b/api/v1/task.go
@@ -10,7 +10,6 @@
 	"apsClient/pkg/ecode"
 	"apsClient/pkg/logx"
 	"apsClient/service"
-	"apsClient/service/plc_address"
 	"errors"
 	"github.com/gin-gonic/gin"
 	"github.com/jinzhu/gorm"
@@ -392,8 +391,12 @@
 		logx.Info("----------------寮�濮嬩笅鍙戝伐鑹哄弬鏁�-----------------")
 	}
 	var failedNumbers int
+	processModelAddress, err := service.GetProcessModelAddress(conf.Conf.CurrentDeviceID)
+	if err != nil {
+		return err
+	}
 	for k, v := range paramsMap {
-		address, ok := plc_address.Get(k)
+		address, ok := processModelAddress[k]
 		if !ok {
 			logx.Errorf("miss param address, k:%v, v:%v", k, v)
 			continue
diff --git a/main.go b/main.go
index a12f0f4..8393009 100644
--- a/main.go
+++ b/main.go
@@ -11,7 +11,6 @@
 	"apsClient/router"
 	"apsClient/serf"
 	"apsClient/service"
-	"apsClient/service/plc_address"
 	"fmt"
 	"log"
 	"net/http"
@@ -29,7 +28,7 @@
 	}
 
 	//鍔犺浇plc鍐欏叆鍦板潃
-	plc_address.LoadAddressFromFile()
+	//plc_address.LoadAddressFromFile()
 
 	// 鍚姩鏁版嵁鍚屾
 	var serfStartChan = make(chan bool)
diff --git a/model/common/common.go b/model/common/common.go
index 72326e7..c84e16d 100644
--- a/model/common/common.go
+++ b/model/common/common.go
@@ -145,8 +145,9 @@
 type PullDataType string
 
 const (
-	PullDataTypeProcessModel = "process_model"
-	PullDataTypeDevice       = "device"
+	PullDataTypeProcessModel           = "process_model"
+	PullDataTypeDevice                 = "device"
+	PullDataTypeProcessModelPlcAddress = "process_model_plc_address"
 )
 
 // MsgPullDataRequest 鎷夊彇浜戠鏁版嵁
diff --git a/model/process_model_plc_address.go b/model/process_model_plc_address.go
new file mode 100644
index 0000000..a037c85
--- /dev/null
+++ b/model/process_model_plc_address.go
@@ -0,0 +1,225 @@
+package model
+
+import (
+	"apsClient/pkg/sqlitex"
+	"encoding/json"
+	"fmt"
+	"github.com/jinzhu/gorm"
+)
+
+type (
+	ProcessModelAddress struct {
+		Name    string `json:"name,omitempty"`
+		Address int    `json:"address,omitempty"`
+	}
+
+	// ProcessModelPlcAddress 宸ヨ壓鍙傛暟plc璇诲啓鍦板潃
+	ProcessModelPlcAddress struct {
+		ID          uint                   `gorm:"primaryKey;" json:"id"`
+		AddressList []*ProcessModelAddress `json:"addressList" gorm:"-"`
+		Address     string                 `json:"-" gorm:"address"`
+		DeviceID    string                 `json:"deviceId" gorm:"column:deviceId;index;type:varchar(255)"`
+	}
+
+	ProcessModelPlcAddressSearch struct {
+		ProcessModelPlcAddress
+		Order     string
+		PageNum   int
+		PageSize  int
+		Keyword   string
+		Orm       *gorm.DB
+		DeviceIDs []string
+	}
+)
+
+func (slf *ProcessModelPlcAddress) TableName() string {
+	return "process_model"
+}
+
+func (slf *ProcessModelPlcAddress) AfterFind(*gorm.DB) error {
+	if slf.Address != "" {
+		return json.Unmarshal([]byte(slf.Address), &slf.AddressList)
+	}
+	return nil
+}
+
+func NewProcessModelPlcAddressSearch() *ProcessModelPlcAddressSearch {
+	return &ProcessModelPlcAddressSearch{Orm: sqlitex.GetDB()}
+}
+
+func (slf *ProcessModelPlcAddressSearch) SetOrm(tx *gorm.DB) *ProcessModelPlcAddressSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *ProcessModelPlcAddressSearch) SetOrder(order string) *ProcessModelPlcAddressSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *ProcessModelPlcAddressSearch) SetID(id uint) *ProcessModelPlcAddressSearch {
+	slf.ID = id
+	return slf
+}
+
+func (slf *ProcessModelPlcAddressSearch) SetDeviceID(id string) *ProcessModelPlcAddressSearch {
+	slf.DeviceID = id
+	return slf
+}
+
+func (slf *ProcessModelPlcAddressSearch) SetDeviceIDs(ids []string) *ProcessModelPlcAddressSearch {
+	slf.DeviceIDs = ids
+	return slf
+}
+
+func (slf *ProcessModelPlcAddressSearch) build() *gorm.DB {
+	var db = slf.Orm.Table(slf.TableName())
+
+	if slf.ID != 0 {
+		db = db.Where("id = ?", slf.ID)
+	}
+
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	if slf.DeviceID != "" {
+		db = db.Where("device_id = ?", slf.DeviceID)
+	}
+
+	if len(slf.DeviceIDs) > 0 {
+		db = db.Where("device_id in (?)", slf.DeviceIDs)
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *ProcessModelPlcAddressSearch) Create(record *ProcessModelPlcAddress) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return fmt.Errorf("create err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *ProcessModelPlcAddressSearch) Save(record *ProcessModelPlcAddress) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *ProcessModelPlcAddressSearch) UpdateByMap(upMap map[string]interface{}) error {
+	var (
+		db = slf.build()
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+	}
+
+	return nil
+}
+
+func (slf *ProcessModelPlcAddressSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+	var (
+		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+	}
+
+	return nil
+}
+
+func (slf *ProcessModelPlcAddressSearch) Delete() error {
+	var db = slf.build()
+
+	if err := db.Unscoped().Delete(&ProcessModelPlcAddress{}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (slf *ProcessModelPlcAddressSearch) First() (*ProcessModelPlcAddress, error) {
+	var (
+		record = new(ProcessModelPlcAddress)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+func (slf *ProcessModelPlcAddressSearch) Find() ([]*ProcessModelPlcAddress, int64, error) {
+	var (
+		records = make([]*ProcessModelPlcAddress, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+func (slf *ProcessModelPlcAddressSearch) FindNotTotal() ([]*ProcessModelPlcAddress, error) {
+	var (
+		records = make([]*ProcessModelPlcAddress, 0)
+		db      = slf.build()
+	)
+
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ.
+func (slf *ProcessModelPlcAddressSearch) FindByQuery(query string, args []interface{}) ([]*ProcessModelPlcAddress, int64, error) {
+	var (
+		records = make([]*ProcessModelPlcAddress, 0)
+		total   int64
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find by query count err: %v", err)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *ProcessModelPlcAddressSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*ProcessModelPlcAddress, error) {
+	var (
+		records = make([]*ProcessModelPlcAddress, 0)
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, nil
+}
diff --git a/nsq/msg_handler.go b/nsq/msg_handler.go
index e791fff..dea2aca 100644
--- a/nsq/msg_handler.go
+++ b/nsq/msg_handler.go
@@ -345,6 +345,8 @@
 		err = slf.DealProcessModelData(pullDataResponse.Data)
 	case common.PullDataTypeDevice:
 		err = slf.DealDeviceData(pullDataResponse.Data)
+	case common.PullDataTypeProcessModelPlcAddress:
+		err = slf.DealProcessModelPlcAddressData(pullDataResponse.Data)
 	}
 	if err != nil {
 		logx.Infof("process pull data  err :%s", err)
@@ -393,5 +395,38 @@
 }
 
 func (slf *PullDataResponse) DealDeviceData(data interface{}) error {
+	//宸插湪鍒殑topic澶勭悊
+	return nil
+}
+
+func (slf *PullDataResponse) DealProcessModelPlcAddressData(data interface{}) error {
+	var addressList []*model.ProcessModelPlcAddress
+	err := mapstructure.Decode(data, &addressList)
+	if err != nil {
+		return err
+	}
+	deviceIDs := make([]string, 0, len(addressList))
+	for _, item := range addressList {
+		deviceIDs = append(deviceIDs, item.DeviceID)
+	}
+	existsRecords, err := model.NewProcessModelPlcAddressSearch().SetDeviceIDs(deviceIDs).FindNotTotal()
+	if err != nil {
+		return err
+	}
+
+	existsRecordsMap := make(map[string]*model.ProcessModelPlcAddress, len(existsRecords))
+	for _, item := range existsRecords {
+		existsRecordsMap[item.DeviceID] = item
+	}
+
+	for _, item := range addressList {
+		if v, exists := existsRecordsMap[item.DeviceID]; !exists {
+			item.ID = 0
+			err = model.NewProcessModelPlcAddressSearch().Create(item)
+		} else if v.Address != item.Address {
+			v.Address = item.Address
+			err = model.NewProcessModelPlcAddressSearch().Save(v)
+		}
+	}
 	return nil
 }
diff --git a/service/problem/check.go b/service/problem/check.go
index 17b76f3..e91272c 100644
--- a/service/problem/check.go
+++ b/service/problem/check.go
@@ -6,7 +6,6 @@
 	"apsClient/model"
 	"apsClient/pkg/sqlitex"
 	"apsClient/service"
-	"apsClient/service/plc_address"
 	"fmt"
 	"net"
 	"sync"
@@ -197,7 +196,14 @@
 type PlcProcessModelAddressList struct{}
 
 func (slf *PlcProcessModelAddressList) Check() bool {
-	return plc_address.IsLoad()
+	record, err := model.NewProcessModelPlcAddressSearch().SetDeviceID(conf.Conf.CurrentDeviceID).First()
+	if err != nil {
+		return false
+	}
+	if len(record.AddressList) == 0 {
+		return false
+	}
+	return true
 }
 
 type PlcConnect struct{}
diff --git a/service/process_model.go b/service/process_model.go
index d1154a3..1922fce 100644
--- a/service/process_model.go
+++ b/service/process_model.go
@@ -3,6 +3,8 @@
 import (
 	"apsClient/conf"
 	"apsClient/model"
+	"apsClient/pkg/logx"
+	"errors"
 )
 
 func GetProcessModelList(offset, limit int, currentNumber string) (list []*model.ProcessModel, total int64, err error) {
@@ -19,3 +21,19 @@
 func GetProcessModelByNumber(num string) (record *model.ProcessModel, err error) {
 	return model.NewProcessModelSearch().SetNumber(num).First()
 }
+
+func GetProcessModelAddress(deviceID string) (addressMap map[string]int, err error) {
+	record, err := model.NewProcessModelPlcAddressSearch().SetDeviceID(deviceID).First()
+	if err != nil {
+		logx.Errorf("find process model plc address for device:%v, err:%v", deviceID, err)
+		return nil, err
+	}
+	if record.AddressList == nil {
+		return nil, errors.New("empty process model address list")
+	}
+	addressMap = make(map[string]int, len(record.AddressList))
+	for _, item := range record.AddressList {
+		addressMap[item.Name] = item.Address
+	}
+	return addressMap, nil
+}

--
Gitblit v1.8.0