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