From 942f3416b333304bde50f0dca5581595f397eafa Mon Sep 17 00:00:00 2001
From: gigibox <gigibox@163.com>
Date: 星期一, 19 六月 2023 16:27:26 +0800
Subject: [PATCH] 完善功能,添加日志,添加nsq tcp上报
---
config.json | 6
report/report.go | 6
.gitignore | 5
kingdee/icInventory.go | 8
go.mod | 1
kingdee/query.go | 8 +
kingdee/db.go | 5
config/config.go | 12 +
go.sum | 2
logger/logger.go | 79 +++++++++++++
report/task.go | 107 +++++++++++++----
gui/gui.go | 28 +---
main.go | 19 ++
nsqclient/client.go | 38 ++++-
14 files changed, 245 insertions(+), 79 deletions(-)
diff --git a/.gitignore b/.gitignore
index aae17bd..3be0811 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,5 @@
.idea
.vscode
kingdee-dbapi.exe
-invert.txt
-kingdee-api.db
-order.txt
\ No newline at end of file
+*.tmp
+kingdee-api.db
\ No newline at end of file
diff --git a/config.json b/config.json
index 651c0c1..9c1ddc8 100644
--- a/config.json
+++ b/config.json
@@ -4,7 +4,11 @@
"sql_db_name": "LZGS",
"sql_username": "webapi",
"sql_password": "api2023",
+ "nsq_server": "fai365.com:4150",
+ "nsq_webapi": "http://121.31.232.83:9080/api/nsq/pub?topic=your_topic",
"order_topic": "aps.wangpengfei.erp.seorder",
"inventory_topic": "aps.wangpengfei.erp.inventory",
- "interval": 60
+ "query_topic": "aps.wangpengfei.erp.k3resource",
+ "interval": 60,
+ "debug": false
}
\ No newline at end of file
diff --git a/config/config.go b/config/config.go
index b50fcf5..4d731e0 100644
--- a/config/config.go
+++ b/config/config.go
@@ -15,10 +15,12 @@
SqlUsername string `json:"sql_username"` // 鏁版嵁搴撶敤鎴�
SqlPassword string `json:"sql_password"` // 鏁版嵁搴撳瘑鐮�
NsqServer string `json:"nsq_server"` // nsq TCP鏈嶅姟绔湴鍧�
- NsqWebApi string `json:"nsq_server"` // nsq HTTP鎺ュ彛鍦板潃
+ NsqWebApi string `json:"nsq_webapi"` // nsq HTTP鎺ュ彛鍦板潃
OrderTopic string `json:"order_topic"` // 璁㈠崟涓婃姤鐨則opic
InventoryTopic string `json:"inventory_topic"` // 搴撳瓨涓婃姤鐨則opic
+ QueryTopic string `json:"query_topic"` // 閲戣澏鏌ヨ鎺ュ彛鐨則opic
SyncInterval int `json:"interval"` // 鍚屾鐨勬椂闂撮棿闅�, 鍗曚綅/绉�
+ Debug bool `json:"debug"` // 鏈湴璋冭瘯, 鍙栨湰鍦版暟鎹�
}
const configPath = "config.json"
@@ -33,9 +35,11 @@
Options.SqlPassword = "123456"
Options.NsqServer = "fai365.com:4150"
Options.NsqWebApi = "http://121.31.232.83:9080/api/nsq/pub?topic=your_topic"
- Options.OrderTopic = "/province/city/factoryNo/kingdee_seOrder"
- Options.InventoryTopic = "/province/city/factoryNo/kingdee_inventory"
+ Options.OrderTopic = "aps.factory.erp.seorder"
+ Options.InventoryTopic = "aps.factory.erp.inventory"
+ Options.QueryTopic = "aps.factory.erp.k3resource"
Options.SyncInterval = 60
+ Options.Debug = false
}
func Load() {
@@ -49,8 +53,6 @@
fd := json.NewDecoder(file)
fd.Decode(&Options)
-
- fmt.Printf("%v\n", Options)
}
}
diff --git a/go.mod b/go.mod
index 5123a17..356a1dc 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@
require (
fyne.io/fyne v1.4.3 // indirect
fyne.io/fyne/v2 v2.3.4
+ github.com/fatedier/beego v1.7.2 // indirect
github.com/flopp/go-findfont v0.1.0 // indirect
github.com/gin-gonic/gin v1.7.0 // indirect
github.com/jinzhu/gorm v1.9.16 // indirect
diff --git a/go.sum b/go.sum
index afda856..ffda01b 100644
--- a/go.sum
+++ b/go.sum
@@ -84,6 +84,8 @@
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
+github.com/fatedier/beego v1.7.2 h1:kVw3oKiXccInqG+Z/7l8zyRQXrsCQEfcUxgzfGK+R8g=
+github.com/fatedier/beego v1.7.2/go.mod h1:wx3gB6dbIfBRcucp94PI9Bt3I0F2c/MyNEWuhzpWiwk=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/flopp/go-findfont v0.1.0 h1:lPn0BymDUtJo+ZkV01VS3661HL6F4qFlkhcJN55u6mU=
github.com/flopp/go-findfont v0.1.0/go.mod h1:wKKxRDjD024Rh7VMwoU90i6ikQRCr+JTHB5n4Ejkqvw=
diff --git a/gui/gui.go b/gui/gui.go
index abbe701..1dfdb39 100644
--- a/gui/gui.go
+++ b/gui/gui.go
@@ -1,7 +1,7 @@
package gui
import (
- "fmt"
+ "kingdee-dbapi/logger"
"strings"
"kingdee-dbapi/config"
@@ -12,11 +12,9 @@
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
- "fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/layout"
- "fyne.io/fyne/v2/storage"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
@@ -79,9 +77,12 @@
// 杩炴帴鏁版嵁搴�
err := kingdee.Init(config.Options.SqlUsername, config.Options.SqlPassword, config.Options.SqlAddr, config.Options.SqlDBName)
if err != nil {
- fmt.Println("db init error:", err.Error())
+ logger.Error("db init error:%s", err.Error())
dialog.ShowError(err, w)
- return
+
+ if !config.Options.Debug {
+ return
+ }
}
form.Disable()
@@ -114,21 +115,4 @@
})
d.Window.ShowAndRun()
-}
-
-func (d *Display) DrawImage(imgUri string) {
- uri, err := storage.ParseURI(imgUri)
- if err != nil {
- fmt.Println("parse uri error:", err)
- }
-
- image := canvas.NewImageFromURI(uri)
- //image := canvas.NewImageFromImage(src)
- // image := canvas.NewImageFromReader(reader, name)
- //image := canvas.NewImageFromFile("./a.png")
- //image.FillMode = canvas.ImageFillContain
- //image.FillMode = canvas.ImageFillOriginal
- image.FillMode = canvas.ImageFillStretch
-
- d.Window.SetContent(image)
}
diff --git a/kingdee/db.go b/kingdee/db.go
index e504eca..5637219 100644
--- a/kingdee/db.go
+++ b/kingdee/db.go
@@ -14,11 +14,10 @@
func Init(username, password, addr, dbName string) error {
var err error
- sqlServer := fmt.Sprintf("sqlserver://%s:%s@%s:1433?database=%s",
+ sqlServer := fmt.Sprintf("sqlserver://%s:%s@%s:1433?database=%s;encrypt=disable;",
username, password, addr, dbName)
- fmt.Println(sqlServer)
+
// 鎵撳紑鏁版嵁搴撹繛鎺�
- //db, err = gorm.Open("mssql", "sqlserver://sa:LZdba@)@)@10.6.201.7:1433?database=LZGS")
db, err = gorm.Open("mssql", sqlServer)
if err != nil {
return err
diff --git a/kingdee/icInventory.go b/kingdee/icInventory.go
index bd824a5..b60a7a2 100644
--- a/kingdee/icInventory.go
+++ b/kingdee/icInventory.go
@@ -25,7 +25,7 @@
ti.FName AS FUnit,
CONVERT (FLOAT, i.FQty) AS FUnitQty,
ti2.FName AS FSec,
- i.FQty AS FQty
+ i.FQty AS FQty
FROM
ICInventory AS i
LEFT OUTER JOIN t_ICItem AS item ON i.FItemID = item.FItemID
@@ -34,10 +34,10 @@
LEFT OUTER JOIN t_Item AS ti2 ON item.FStoreUnitID = ti2.FItemID
LEFT OUTER JOIN t_Item AS ti3 ON LEFT (item.FNumber, 5) = ti3.FNumber
AND ti3.FItemClassID = 4
- WHERE
- (i.FQty <> 0)
+ --WHERE
+ -- (i.FQty <> 0)
ORDER BY
- item.FNumber
+ item.FNumber
`
var result []Inventory
diff --git a/kingdee/query.go b/kingdee/query.go
new file mode 100644
index 0000000..9242abf
--- /dev/null
+++ b/kingdee/query.go
@@ -0,0 +1,8 @@
+package kingdee
+
+import "fmt"
+
+func QueryMsgHandle(data []byte) error {
+ fmt.Println("recv msg ", string(data))
+ return nil
+}
diff --git a/logger/logger.go b/logger/logger.go
new file mode 100644
index 0000000..0daa208
--- /dev/null
+++ b/logger/logger.go
@@ -0,0 +1,79 @@
+package logger
+
+import (
+ "fmt"
+
+ "github.com/fatedier/beego/logs"
+)
+
+// Log is the under log object
+var Log *logs.BeeLogger
+
+func init() {
+ Log = logs.NewLogger(10000)
+ Log.EnableFuncCallDepth(true)
+ Log.SetLogFuncCallDepth(Log.GetLogFuncCallDepth() + 1)
+}
+
+func InitLog(logFile string, logLevel string, maxdays int64, disableLogColor bool) {
+ SetLogFile("", logFile, maxdays, disableLogColor)
+ SetLogLevel(logLevel)
+}
+
+// SetLogFile to configure log params
+// logWay: file or console
+func SetLogFile(logWay string, logFile string, maxdays int64, disableLogColor bool) {
+ if logWay == "console" {
+ params := ""
+ if disableLogColor {
+ params = `{"color": false}`
+ }
+ _ = Log.SetLogger("console", params)
+ } else {
+ params := fmt.Sprintf(`{"filename": "%s", "maxdays": %d, "maxlines":0, "maxsize":0, "daily":true}`, logFile, maxdays)
+ _ = Log.SetLogger("file", params)
+ }
+}
+
+// SetLogLevel set log level, default is warning
+// value: error, warning, info, debug, trace
+func SetLogLevel(logLevel string) {
+ var level int
+ switch logLevel {
+ case "error":
+ level = 3
+ case "warn":
+ level = 4
+ case "info":
+ level = 6
+ case "debug":
+ level = 7
+ case "trace":
+ level = 8
+ default:
+ level = 4 // warning
+ }
+ Log.SetLevel(level)
+}
+
+// wrap log
+
+func Error(format string, v ...interface{}) {
+ Log.Error(format, v...)
+}
+
+func Warn(format string, v ...interface{}) {
+ Log.Warn(format, v...)
+}
+
+func Info(format string, v ...interface{}) {
+ Log.Info(format, v...)
+}
+
+func Debug(format string, v ...interface{}) {
+ Log.Debug(format, v...)
+}
+
+func Trace(format string, v ...interface{}) {
+ Log.Trace(format, v...)
+}
diff --git a/main.go b/main.go
index fa399aa..5f73f19 100644
--- a/main.go
+++ b/main.go
@@ -1,23 +1,38 @@
package main
import (
- "kingdee-dbapi/kingdee"
- "kingdee-dbapi/models"
"os"
"strings"
+ "kingdee-dbapi/cache"
"kingdee-dbapi/config"
"kingdee-dbapi/gui"
+ "kingdee-dbapi/kingdee"
+ "kingdee-dbapi/logger"
+ "kingdee-dbapi/models"
+ "kingdee-dbapi/nsqclient"
"github.com/flopp/go-findfont"
)
func main() {
+ logger.InitLog("kdingdee-dbapi.log", "debug", 15, false)
+ logger.Info("playletServer start!")
+
config.Load()
// sqlite3鏁版嵁搴�
models.Init()
+ // 鍒濆鍖栫紦瀛�, 璁板綍浜嗗凡缁忎笂鎶ョ殑璁㈠崟鍙�
+ cache.InitCache()
+
+ // 鍒濆鍖杗sq
+ nsqclient.InitNsqProducer()
+
+ // 寮�鍚闃�
+ go nsqclient.InitNsqConsumer(config.Options.QueryTopic, "sensor01", kingdee.QueryMsgHandle)
+
// 璁剧疆涓枃瀛椾綋
setFont()
defer os.Unsetenv("FYNE_FONT")
diff --git a/nsqclient/client.go b/nsqclient/client.go
index 1b27d18..46f5911 100644
--- a/nsqclient/client.go
+++ b/nsqclient/client.go
@@ -1,17 +1,18 @@
package nsqclient
import (
+ "context"
"fmt"
+
"kingdee-dbapi/config"
)
-var nsqClient Producer
+var producerCli Producer
+var consumeCli NsqConsumer
-const plcTopic = "plcTopic"
-
-func InitNsqClient() error {
+func InitNsqProducer() error {
var err error
- nsqClient, err = NewProducer(config.Options.NsqServer)
+ producerCli, err = NewProducer(config.Options.NsqServer)
if err != nil {
fmt.Println(err.Error())
}
@@ -19,17 +20,32 @@
return err
}
-func Produce(msg []byte) (err error) {
- if nsqClient == nil {
- err = InitNsqClient()
+func Produce(topic string, msg []byte) bool {
+ if producerCli == nil {
+ err := InitNsqProducer()
if err != nil {
- return err
+ fmt.Println("Init Nsq Client error:" + err.Error())
+ return false
}
}
- if err = nsqClient.Publish(plcTopic, msg); err != nil {
+ err := producerCli.Publish(topic, msg)
+ if err != nil {
fmt.Println("Publish error:" + err.Error())
}
- return
+ return err == nil
+}
+
+func InitNsqConsumer(topic, channel string, handle func(data []byte) error) {
+ if c, err := NewNsqConsumer(context.Background(), topic, channel); err != nil {
+ fmt.Println("NewNsqConsumer failed", err)
+ return
+ } else {
+ c.AddHandler(handle)
+ if err := c.Run(config.Options.NsqServer, 1); err != nil {
+ fmt.Println("run consumer failed", err)
+ }
+
+ }
}
diff --git a/report/report.go b/report/report.go
index 9d7e2b1..583732e 100644
--- a/report/report.go
+++ b/report/report.go
@@ -2,7 +2,7 @@
import (
"context"
- "fmt"
+ "kingdee-dbapi/logger"
"time"
"kingdee-dbapi/config"
@@ -23,11 +23,11 @@
}
func Loop(c context.Context) {
- fmt.Println("start report")
+ logger.Debug("鍚姩鏁版嵁涓婃姤浠诲姟")
for {
select {
case <-c.Done():
- fmt.Println("loop break")
+ logger.Debug("鍋滄涓婃姤")
return
default:
// 涓婃姤璁㈠崟
diff --git a/report/task.go b/report/task.go
index 40f0ac4..96380e2 100644
--- a/report/task.go
+++ b/report/task.go
@@ -2,6 +2,8 @@
import (
"encoding/json"
+ "io/ioutil"
+ "kingdee-dbapi/logger"
"kingdee-dbapi/cache"
"kingdee-dbapi/config"
@@ -10,21 +12,55 @@
"kingdee-dbapi/nsqclient"
)
-func SendOrder() {
- var completedOrderNo = make(map[string]struct{})
- list := kingdee.SeOrderList()
+const orderLocalStore = "order.tmp"
+const inventoryLocalStore = "inventory.tmp"
- for i := 0; i < len(list); i++ {
+func SendOrder() {
+ var list []kingdee.SEOrder
+
+ if config.Options.Debug {
+ data, err := ioutil.ReadFile(orderLocalStore)
+ if err != nil {
+ logger.Error("鏂囦欢璇诲彇澶辫触, %s", err.Error())
+ return
+ }
+ err = json.Unmarshal(data, &list)
+ if err != nil {
+ logger.Error("鏂囦欢鍐呭瑙f瀽澶辫触, %s", err.Error())
+ return
+ }
+ } else {
+ list = kingdee.SeOrderList()
+ logger.Debug("鏌ヨ鍒�%d鏉¤鍗曚俊鎭�", len(list))
+ }
+
+ var completedOrderNo = make(map[string]struct{})
+
+ for i := 0; i < len(list); {
if cache.Exists(list[i].FBillNo) {
list = append(list[:i], list[i+1:]...)
} else {
completedOrderNo[list[i].FBillNo] = struct{}{}
+ i++
}
}
b, _ := json.Marshal(list)
- ok := nsqclient.HttpPost(config.Options.OrderTopic, b)
+ if !config.Options.Debug {
+ ioutil.WriteFile(orderLocalStore, b, 0644)
+ }
+
+ // http鍗忚涓婃姤, 宸蹭慨鏀逛负TCP
+ //ok := nsqclient.HttpPost(config.Options.OrderTopic, b)
+
+ if len(list) == 0 {
+ logger.Debug("娌℃湁鏂扮殑璁㈠崟闇�瑕佷笂鎶�")
+ return
+ }
+
+ // TCP鍗忚涓婃姤
+ ok := nsqclient.Produce(config.Options.OrderTopic, b)
if ok {
// 鍐欏叆鏁版嵁搴�, 鏍囪宸茬粡涓婃姤杩囦簡,閬垮厤閲嶅涓婃姤
for orderNo, _ := range completedOrderNo {
@@ -35,36 +71,57 @@
cursor.Insert()
cache.WriteCache(orderNo)
}
- }
- // 閫愭潯鍙戦��
- //for idx, _ := range list {
- // // 宸茬粡鎺ㄩ�佽繃鐨勮鍗�
- // if cache.Exists(list[idx].FBillNo) {
- // continue
- // }
- //
- // b, _ := json.Marshal(list[idx])
- //
- // ok := nsqclient.HttpPost(config.Options.OrderTopic, b)
- // if ok {
- // completedOrderNo[list[idx].FBillNo] = struct{}{}
- // }
- //}
+ logger.Debug("宸蹭笂鎶�%d涓鍗曚俊鎭�", len(list))
+ } else {
+ logger.Warn("璁㈠崟鏁版嵁涓婃姤澶辫触")
+ }
}
func SendInventory() {
- list := kingdee.ICInventory()
+ var list []kingdee.Inventory
- // 姣忔鍙� 300 鏉�
- for i := 0; i < len(list); i += 300 {
- end := i + 300
+ if config.Options.Debug {
+ data, err := ioutil.ReadFile(inventoryLocalStore)
+ if err != nil {
+ logger.Error("鏂囦欢璇诲彇澶辫触, %s", err.Error())
+ return
+ }
+
+ err = json.Unmarshal(data, &list)
+ if err != nil {
+ logger.Error("鏂囦欢鍐呭瑙f瀽澶辫触, %s", err.Error())
+ return
+ }
+ } else {
+ list = kingdee.ICInventory()
+ logger.Debug("鏌ヨ鍒�%d鏉″簱瀛樻暟鎹�", len(list))
+ }
+
+ // 姣忔鍙� 100 鏉�
+ successCnt := 0
+ for i := 0; i < len(list); i += 1000 {
+ end := i + 1000
if end > len(list) {
end = len(list)
}
b, _ := json.Marshal(list[i:end])
- nsqclient.HttpPost(config.Options.InventoryTopic, b)
+ if !config.Options.Debug {
+ ioutil.WriteFile(inventoryLocalStore, b, 0644)
+ }
+
+ // HTTP鍗忚涓婃姤,宸蹭慨鏀逛负TCP
+ //nsqclient.HttpPost(config.Options.InventoryTopic, b)
+
+ // TCP鍗忚涓婃姤
+ ok := nsqclient.Produce(config.Options.InventoryTopic, b)
+ if !ok {
+ logger.Warn("搴撳瓨鏁版嵁涓婃姤澶辫触")
+ } else {
+ successCnt += end
+ }
}
+ logger.Debug("宸蹭笂鎶�%d鏉″簱瀛樻暟鎹�", successCnt)
}
--
Gitblit v1.8.0