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