From 35d15855172bb559fc6817745dee672f5e9b8d80 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期五, 25 八月 2023 21:05:26 +0800
Subject: [PATCH] 2秒钟请求一次完成量并存储

---
 api/v1/plc.go         |   20 ------
 constvar/const.go     |    5 +
 service/plc.go        |   45 ++++++++++++++-
 go.sum                |    3 +
 go.mod                |    1 
 main.go               |    6 ++
 crontask/cron_task.go |   41 +++++++++++++
 7 files changed, 100 insertions(+), 21 deletions(-)

diff --git a/api/v1/plc.go b/api/v1/plc.go
index c6a98a6..69e6fda 100644
--- a/api/v1/plc.go
+++ b/api/v1/plc.go
@@ -24,24 +24,8 @@
 	if !ok {
 		return
 	}
-
-	plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
-	if code != ecode.OK {
-		ctx.FailWithMsg(ecode.UnknownErr, "璇峰厛閰嶇疆PLC")
-		return
-	}
-
-	finishNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeFinishNumber)
-	if err != nil {
-		ctx.FailWithMsg(ecode.UnknownErr, "璇诲彇鏁版嵁澶辫触锛岃妫�鏌lc閰嶇疆")
-		return
-	}
-	totalNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeTotalNumber)
-	if err != nil {
-		ctx.FailWithMsg(ecode.UnknownErr, "璇诲彇鏁版嵁澶辫触锛岃妫�鏌lc閰嶇疆")
-		return
-	}
-
+	finishNumber, _ := service.PlcCacheGet(constvar.PlcCacheKeyFinishNumber)
+	totalNumber, _ := service.PlcCacheGet(constvar.PlcCacheKeyTotalNumber)
 	resp := new(response.ProductProgress)
 	resp.FinishNumber = cast.ToInt(finishNumber)
 	resp.TotalNumber = cast.ToInt(totalNumber)
diff --git a/constvar/const.go b/constvar/const.go
index dc2f30e..2ec69ac 100644
--- a/constvar/const.go
+++ b/constvar/const.go
@@ -38,3 +38,8 @@
 func (slf PlcMethod) Valid() bool {
 	return slf == PlcMethodModbusTCP || slf == PlcMethodSerial
 }
+
+const (
+	PlcCacheKeyFinishNumber = "finish_number"
+	PlcCacheKeyTotalNumber  = "total_number"
+)
diff --git a/crontask/cron_task.go b/crontask/cron_task.go
new file mode 100644
index 0000000..c8702b8
--- /dev/null
+++ b/crontask/cron_task.go
@@ -0,0 +1,41 @@
+package crontask
+
+import (
+	"apsClient/constvar"
+	"apsClient/pkg/ecode"
+	"apsClient/service"
+	"github.com/go-co-op/gocron"
+	"time"
+)
+
+func InitTask() error {
+	s := gocron.NewScheduler(time.UTC)
+	_, err := s.Every(2).Seconds().StartImmediately().Do(func() {
+		plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
+		if code != ecode.OK {
+			return
+		}
+		finishNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeFinishNumber)
+		if err == nil {
+			service.PlcCacheSet(constvar.PlcCacheKeyFinishNumber, finishNumber)
+		}
+
+	})
+	if err != nil {
+		return err
+	}
+
+	s.Every(1).Minutes().StartImmediately().Do(func() {
+		plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
+		if code != ecode.OK {
+			return
+		}
+		totalNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeTotalNumber)
+		if err == nil {
+			service.PlcCacheSet(constvar.PlcCacheKeyTotalNumber, totalNumber)
+		}
+	})
+
+	s.StartAsync()
+	return nil
+}
diff --git a/go.mod b/go.mod
index 3260abf..1cd151b 100644
--- a/go.mod
+++ b/go.mod
@@ -45,6 +45,7 @@
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
+	github.com/go-co-op/gocron v1.32.1 // indirect
 	github.com/go-openapi/jsonpointer v0.19.6 // indirect
 	github.com/go-openapi/jsonreference v0.20.1 // indirect
 	github.com/go-openapi/spec v0.20.4 // indirect
diff --git a/go.sum b/go.sum
index 25033f8..e9b182b 100644
--- a/go.sum
+++ b/go.sum
@@ -130,6 +130,8 @@
 github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k=
 github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
 github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-co-op/gocron v1.32.1 h1:h+StA6Qzlv+ImlCaLfA26rLN9eS/l4sO7oWmPUbRVIY=
+github.com/go-co-op/gocron v1.32.1/go.mod h1:UGz2oYvVS6PsqlwuOdo5L1Djsg/cQjxJ6T5ntkhp9Bg=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -423,6 +425,7 @@
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
diff --git a/main.go b/main.go
index 54c673f..97abfeb 100644
--- a/main.go
+++ b/main.go
@@ -2,6 +2,7 @@
 
 import (
 	"apsClient/conf"
+	"apsClient/crontask"
 	"apsClient/model"
 	"apsClient/nsq"
 	"apsClient/pkg/logx"
@@ -29,6 +30,11 @@
 		return
 	}
 
+	if err := crontask.InitTask(); err != nil {
+		logx.Errorf("crontab task Init err:%v", err)
+		return
+	}
+
 	go shutdown()
 	logx.Infof("apsClient start serve...")
 	server := &http.Server{
diff --git a/service/plc.go b/service/plc.go
index 582f0f3..73e8f33 100644
--- a/service/plc.go
+++ b/service/plc.go
@@ -8,6 +8,7 @@
 	"encoding/binary"
 	"errors"
 	"fmt"
+	"sync"
 )
 
 func PlcRead(plcConfig *model.DevicePlc, fieldType constvar.PlcStartAddressType) (val interface{}, err error) {
@@ -29,13 +30,13 @@
 
 	conn, err := plc.GetModbusConnection(ipAddr)
 	if err != nil {
-		logx.Errorf("GetProductProgress 杩炴帴plc澶辫触: %v", err.Error())
+		logx.Errorf("PlcRead 杩炴帴plc澶辫触: %v", err.Error())
 		return
 	}
 
 	rawData, err := plc.ReadHoldingRegister(conn, startAddress, dataLength)
 	if err != nil {
-		logx.Errorf("GetProductProgress 鑾峰彇plc鏁版嵁澶辫触: %v", err.Error())
+		logx.Errorf("PlcRead 鑾峰彇plc鏁版嵁澶辫触: %v", err.Error())
 		return
 	}
 	switch valueType {
@@ -62,7 +63,7 @@
 
 	conn, err := plc.GetModbusConnection(ipAddr)
 	if err != nil {
-		logx.Errorf("GetProductProgress 杩炴帴plc澶辫触: %v", err.Error())
+		logx.Errorf("PlcWrite 杩炴帴plc澶辫触: %v", err.Error())
 		return
 	}
 
@@ -74,3 +75,41 @@
 	logx.Infof("plc write ok, address: %v, value: %v, result: %v", startAddress, value, result)
 	return
 }
+
+type CacheStore struct {
+	cache map[string]interface{}
+	mu    sync.Mutex
+}
+
+var defaultCacheStore *CacheStore
+
+func init() {
+	defaultCacheStore = newCacheManager()
+}
+func newCacheManager() *CacheStore {
+	return &CacheStore{
+		cache: make(map[string]interface{}),
+	}
+}
+
+func (cm *CacheStore) Get(key string) (interface{}, bool) {
+	cm.mu.Lock()
+	defer cm.mu.Unlock()
+
+	conn, ok := cm.cache[key]
+	return conn, ok
+}
+
+func (cm *CacheStore) Add(key string, value interface{}) {
+	cm.mu.Lock()
+	defer cm.mu.Unlock()
+	cm.cache[key] = value
+}
+
+func PlcCacheGet(key string) (interface{}, bool) {
+	return defaultCacheStore.Get(key)
+}
+
+func PlcCacheSet(key string, value interface{}) {
+	defaultCacheStore.Add(key, value)
+}

--
Gitblit v1.8.0