From 8f750b461a4f442825e516016bf78d05ed66afcb Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期一, 14 八月 2023 18:14:50 +0800 Subject: [PATCH] 添加bom查询 --- config.json | 6 /dev/null | 177 ---------------------- config/config.go | 8 kingdee/icInventory.go | 2 report/send.go | 185 +++++++++++++++++++++++ report/task.go | 24 +- kingdee/bom.go | 63 +++++++ gui/gui.go | 6 kingdee/query.go | 2 main.go | 2 kingdee/cst.go | 4 11 files changed, 282 insertions(+), 197 deletions(-) diff --git a/config.json b/config.json index 36ab7dc..c3c3482 100644 --- a/config.json +++ b/config.json @@ -7,12 +7,14 @@ "nsq_server": "121.31.232.83:4150", "nsq_webapi": "http://121.31.232.83:9080/api/nsq/pub?topic=your_topic", "order_topic": "aps.wangpengfei.erp.seorder", + "bom_topic": "aps.wangpengfei.erp.icBom", + "bom_query_topic": "", + "bom_child_topic": "", "inventory_topic": "aps.wangpengfei.erp.inventory", "query_topic": "aps.wangpengfei.erp.k3resource", "reply_topic": "aps.wangpengfei.erp.k3reply", "cst_webapi": "http://192.168.20.249/cst/local_post.ashx", "cst_query_topic": "aps.wangpengfei.erp.cstApply", "cst_reply_topic": "aps.wangpengfei.erp.cstReply", - "interval": 60, - "debug": false + "interval": 60 } \ No newline at end of file diff --git a/config/config.go b/config/config.go index fbeb267..3994d37 100644 --- a/config/config.go +++ b/config/config.go @@ -17,6 +17,9 @@ NsqServer string `json:"nsq_server"` // nsq TCP鏈嶅姟绔湴鍧� NsqWebApi string `json:"nsq_webapi"` // nsq HTTP鎺ュ彛鍦板潃 OrderTopic string `json:"order_topic"` // 璁㈠崟涓婃姤鐨則opic + BomTopic string `json:"bom_topic"` // bom涓婃姤鐨則opic + BomQueryTopic string `json:"bom_query_topic"` // bom涓婃姤鐨則opic + BomChildTopic string `json:"bom_child_topic"` // bom瀛愰」涓婃姤鐨則opic InventoryTopic string `json:"inventory_topic"` // 搴撳瓨涓婃姤鐨則opic SqlQueryTopic string `json:"query_topic"` // 閲戣澏鏌ヨ鎺ュ彛鐨則opic SqlReplyTopic string `json:"reply_topic"` // 閲戣澏鍝嶅簲鏌ヨ鎺ュ彛鐨則opic @@ -24,7 +27,6 @@ CSTQueryTopic string `json:"cst_query_topic"` // 鎻愪氦鐢熶骇浠诲姟鍗曚富棰� CSTReplyTopic string `json:"cst_reply_topic"` // 鍝嶅簲鐢熶骇浠诲姟鍗曚富棰� SyncInterval int `json:"interval"` // 鍚屾鐨勬椂闂撮棿闅�, 鍗曚綅/绉� - Debug bool `json:"debug"` // 鏈湴璋冭瘯, 鍙栨湰鍦版暟鎹� } const configPath = "config.json" @@ -40,13 +42,15 @@ Options.NsqServer = "fai365.com:4150" Options.NsqWebApi = "http://121.31.232.83:9080/api/nsq/pub?topic=your_topic" Options.OrderTopic = "aps.factory.erp.seorder" + Options.BomTopic = "aps.factory.erp.icBom" + Options.BomChildTopic = "aps.factory.erp.icBomChild" + Options.BomQueryTopic = "aps.factory.erp.icBomQuery" Options.InventoryTopic = "aps.factory.erp.inventory" Options.SqlQueryTopic = "aps.factory.erp.k3resource" Options.SqlReplyTopic = "aps.factory.erp.k3reply" Options.CSTQueryTopic = "aps.factory.erp.cstApply" Options.CSTReplyTopic = "aps.factory.erp.cstReply" Options.SyncInterval = 60 - Options.Debug = false } func Load() { diff --git a/gui/gui.go b/gui/gui.go index fcaa3b5..94048e8 100644 --- a/gui/gui.go +++ b/gui/gui.go @@ -81,17 +81,13 @@ if err != nil { logger.Error("db init error:%s", err.Error()) dialog.ShowError(err, w) - - if !config.Options.Debug { - return - } } form.Disable() submitBtn.Text = "宸插惎鍔�" submitBtn.Disable() - report.StartReport() + report.Start() // 寮�鍚闃匰QL鏌ヨ go nsqclient.InitNsqConsumer(config.Options.SqlQueryTopic, "sensor01", kingdee.SqlQueryHandle) diff --git a/kingdee/bom.go b/kingdee/bom.go new file mode 100644 index 0000000..9b276bf --- /dev/null +++ b/kingdee/bom.go @@ -0,0 +1,63 @@ +package kingdee + +type ICBom struct { + FInterID int // 鍐呯爜 + FBOMNumber string // BOM鍗曠紪鍙� + FUseStatus int // 浣跨敤鐘舵�佺爜 + FUseStatusName string // 浣跨敤鐘舵�� + FItemIDNumber string // 鐗╂枡浠g爜 + FItemIDName string // 鐗╂枡鍚嶇О + FModel string // 瑙勬牸鍨嬪彿 + FErpClsID string // 鐗╂枡灞炴�� + FQty float64 // 鏁伴噺 + FUnitName string // 鍗曚綅 + FYield float64 // 鎴愬搧鐜� + FRoutingIDNumber string // 宸ヨ壓璺嚎浠g爜 + FRoutingIDName string // 宸ヨ壓璺嚎鍚嶇О + FNote string // 澶囨敞 + FBomType int // BOM绫诲瀷 + FAudDate string // 鏇存柊鏃堕棿 + FPDMImportDate string // 瀵煎叆鏃堕棿 + FStatus int // 鐘舵�� +} + +func BomList(fData bool) []ICBom { + sql := ` + SELECT + ICBom.FInterID, + ICBom.FBOMNumber, + ICBom.FUseStatus, + t_SubMessage.FName as FUseStatusName, + t_ICItem.FNumber as FItemIDNumber, + t_ICItem.FName as FItemIDName, + t_ICItem.FModel as FModel, + (SELECT FName FROM t_SubMessage WHERE t_ICItem.FErpClsID=FInterID) as FErpClsID, + ICBom.FQty, + t_MeasureUnit.FName as FUnitName, + ICBom.FYield, + t_Routing.FBillNO as FRoutingIDNumber, + t_Routing.FRoutingName as FRoutingIDName, + ICBom.FNote, + ICBom.FBomType, + ICBom.FAudDate, + ICBom.FPDMImportDate, + ICBom.FStatus + FROM ICBom + left join t_SubMessage on ICBom.FUseStatus = t_SubMessage.FInterID AND t_SubMessage.FInterID <> 0 + join t_ICItem on ICBom.FItemID= t_ICItem.FItemID AND t_ICItem.FItemID <> 0 + left join t_MeasureUnit on ICBom.FUnitID = t_MeasureUnit.FItemID AND t_MeasureUnit.FItemID <> 0 + left join t_Routing on ICBom.FRoutingID = t_Routing.FInterID AND t_Routing.FInterID <> 0 + ` + + // 濡傛灉涓嶆槸璇锋眰鍏ㄩ儴鏁版嵁, 浠呮煡璇㈠綋澶╂洿鏂扮殑, 榛樿鏌ュ綋澶� + if !fData { + sql = sql + " Where DateDiff(dd,FAudDate,getdate())=1" + } + + var result []ICBom + + db.Raw(sql).Scan(&result) + //db.Raw(sql).Debug().Scan(&result) + + return result +} diff --git a/kingdee/cst.go b/kingdee/cst.go index 9d9e1ab..17621bb 100644 --- a/kingdee/cst.go +++ b/kingdee/cst.go @@ -1,5 +1,9 @@ package kingdee +/* +璇锋眰鍐欏叆鐢熶骇浠诲姟鍗曠殑鎺ュ彛 +鎺ユ敹aps鐨勮姹�, 璋冪敤鏈湴鐨勭敓浜т换鍔″崟鏈嶅姟, 骞跺搷搴旂粨鏋� +*/ import ( "bytes" "encoding/json" diff --git a/kingdee/icInventory.go b/kingdee/icInventory.go index eb1129b..14f35cf 100644 --- a/kingdee/icInventory.go +++ b/kingdee/icInventory.go @@ -1,5 +1,7 @@ package kingdee +// 搴撳瓨鏌ヨ + type Inventory struct { FNumber string `gorm:"column:FNumber" json:"FNumber"` // 鐗╂枡浠g爜 FName string `gorm:"column:FName" json:"FName"` // 鐗╂枡鍚嶇О diff --git a/kingdee/query.go b/kingdee/query.go index 37e75c0..e905a4a 100644 --- a/kingdee/query.go +++ b/kingdee/query.go @@ -10,6 +10,8 @@ "kingdee-dbapi/nsqclient" ) +// 閫氱敤sql鏌ヨ鎺ュ彛 + type SqlQueryMsg struct { Key string // 璇锋眰 Command string diff --git a/main.go b/main.go index a98858d..8e31c56 100644 --- a/main.go +++ b/main.go @@ -16,7 +16,7 @@ ) func main() { - logger.InitLog("kingdee-dbapi.log", "debug", 15, false) + logger.InitLog("log/kingdee-dbapi.log", "debug", 15, false) logger.Info("kingdee-dbapi start!") config.Load() diff --git a/report/send.go b/report/send.go new file mode 100644 index 0000000..770f53c --- /dev/null +++ b/report/send.go @@ -0,0 +1,185 @@ +package report + +import ( + "encoding/json" + "time" + + "kingdee-dbapi/cache" + "kingdee-dbapi/config" + "kingdee-dbapi/kingdee" + "kingdee-dbapi/logger" + "kingdee-dbapi/models" + "kingdee-dbapi/nsqclient" +) + +// 涓婃姤閿�鍞鍗�, 澧為噺, 鏈湴浼氬瓨鍌ㄥ凡缁忎笂鎶ヨ繃鐨�. 璁㈠崟涓嶅瓨鍦ㄤ慨鏀� +func SendOrder() { + 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) + + // 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 { + cursor := models.Order{ + OrderNo: orderNo, + } + + cursor.Insert() + cache.WriteCache(orderNo) + } + + logger.Debug("宸蹭笂鎶�%d涓鍗曚俊鎭�", len(list)) + } else { + logger.Warn("璁㈠崟鏁版嵁涓婃姤澶辫触") + } +} + +var invReportedCache = make(map[string]float64, 0) +var bomReportedCache = make(map[string]struct{}, 0) +var fullInvData bool + +// 涓婃姤搴撳瓨 +func SendInventory() { + // 璁剧疆姣忓ぉ鍑屾櫒1鐐逛笂鎶ヤ竴娆″叏閲忔暟鎹� + hour := time.Now().Hour() + if hour == 1 { + if fullInvData == false { + invReportedCache = make(map[string]float64, 0) + // 椤轰究娓呯悊涓媌om鐨勫綋澶╃紦瀛� + bomReportedCache = make(map[string]struct{}) + fullInvData = true + } + } else { + fullInvData = false + } + + list := kingdee.ICInventory() + + logger.Debug("鏌ヨ鍒�%d鏉″簱瀛樻暟鎹�", len(list)) + + // 鍏堣繃婊や竴閬嶆暟鎹�, 鏍肩憺绫冲彂鐜版湁鍚屼竴涓骇鍝佸悓鎵瑰彿鍚屼粨搴�, 鏈夊鏉″簱瀛樿褰曠殑鎯呭喌 + // 灏嗙被浼肩殑鏁版嵁搴撳瓨鏁扮疮璁″埌涓�璧� + var filterMap = make(map[string]float64, 0) + for i := 0; i < len(list); { + cacheKey := list[i].FNumber + list[i].FBatchNo + list[i].FStockNo + if qty, ok := filterMap[cacheKey]; ok { + filterMap[cacheKey] = list[i].FUnitQty + qty + list = append(list[:i], list[i+1:]...) + } else { + filterMap[cacheKey] = list[i].FUnitQty + i++ + } + } + + // 杩囨护鏁版嵁, 鍒ゆ柇鏄惁宸茬粡涓婃姤杩� + for i := 0; i < len(list); { + cacheKey := list[i].FNumber + list[i].FBatchNo + list[i].FStockNo + if qty, ok := invReportedCache[cacheKey]; ok && qty == list[i].FUnitQty { + list = append(list[:i], list[i+1:]...) + } else { + invReportedCache[cacheKey] = list[i].FUnitQty + i++ + } + } + + if len(list) == 0 { + logger.Debug("娌℃湁瑕佹洿鏂扮殑搴撳瓨鏁版嵁.") + return + } + + // 姣忔鍙� 1000 鏉� + 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]) + + // HTTP鍗忚涓婃姤,宸蹭慨鏀逛负TCP + //nsqclient.HttpPost(config.Options.InventoryTopic, b) + + // TCP鍗忚涓婃姤 + ok := nsqclient.Produce(config.Options.InventoryTopic, b) + if !ok { + logger.Warn("搴撳瓨鏁版嵁涓婃姤澶辫触") + + //涓婃姤澶辫触, 缂撳瓨娓呯┖ + invReportedCache = make(map[string]float64, 0) + } else { + successCnt = end + } + } + + logger.Debug("宸蹭笂鎶�%d鏉″簱瀛樻暟鎹�", successCnt) +} + +func SendBom(fData bool) { + // 涓婃姤bom + bomList := kingdee.BomList(fData) + // 杩囨护鏁版嵁, 鍒ゆ柇鏄惁宸茬粡涓婃姤杩�, 璇锋眰鍏ㄩ噺鏁版嵁涓嶈繃婊�, 鐩存帴涓婃姤 + if fData { + for i := 0; i < len(bomList); { + cacheKey := bomList[i].FBOMNumber + bomList[i].FAudDate + if _, ok := bomReportedCache[cacheKey]; ok { + bomList = append(bomList[:i], bomList[i+1:]...) + } else { + bomReportedCache[cacheKey] = struct{}{} + i++ + } + } + } + + if len(bomList) == 0 { + logger.Debug("娌℃湁瑕佹洿鏂扮殑Bom鏁版嵁.") + } else { + // 姣忔鍙� 1000 鏉� + successCnt := 0 + for i := 0; i < len(bomList); i += 1000 { + end := i + 1000 + if end > len(bomList) { + end = len(bomList) + } + + b, _ := json.Marshal(bomList[i:end]) + + // TCP鍗忚涓婃姤 + ok := nsqclient.Produce(config.Options.BomTopic, b) + if !ok { + logger.Warn("BOM鏁版嵁涓婃姤澶辫触") + + //涓婃姤澶辫触, 缂撳瓨娓呯┖ + bomReportedCache = make(map[string]struct{}, 0) + } else { + successCnt = end + } + } + logger.Debug("宸蹭笂鎶�%d鏉OM鏁版嵁", successCnt) + } + + // 涓婃姤bom瀛愰」 +} diff --git a/report/loop.go b/report/task.go similarity index 61% rename from report/loop.go rename to report/task.go index 4fddf91..f0011d1 100644 --- a/report/loop.go +++ b/report/task.go @@ -11,18 +11,18 @@ var ctx context.Context var cancel context.CancelFunc -func StartReport() { +func Start() { ctx, cancel = context.WithCancel(context.Background()) - go Loop(ctx) + go queryTasks(ctx) } func RestartReport() { cancel() - StartReport() + Start() } -func Loop(c context.Context) { +func queryTasks(c context.Context) { logger.Debug("鍚姩鏁版嵁涓婃姤浠诲姟") for { select { @@ -31,15 +31,19 @@ return default: // 涓婃姤璁㈠崟 - SendOrder() + if config.Options.OrderTopic != "" { + SendOrder() + } // 涓婃姤鍗虫椂搴撳瓨 - SendInventory() + if config.Options.InventoryTopic != "" { + SendInventory() + } - // 娴嬭瘯鏌ヨ璇锋眰 - //sql := []byte("select * from t_icitem where FItemID=3316") - //ok := nsqclient.Produce(config.Options.SqlQueryTopic, sql) - //logger.Debug("娴嬭瘯璇锋眰鎺ュ彛, %v", ok) + // 涓婃姤bom + if config.Options.BomTopic != "" { + SendBom(true) + } time.Sleep(time.Duration(config.Options.SyncInterval) * time.Second) } diff --git a/report/tasks.go b/report/tasks.go deleted file mode 100644 index f735c2d..0000000 --- a/report/tasks.go +++ /dev/null @@ -1,177 +0,0 @@ -package report - -import ( - "encoding/json" - "io/ioutil" - "time" - - "kingdee-dbapi/cache" - "kingdee-dbapi/config" - "kingdee-dbapi/kingdee" - "kingdee-dbapi/logger" - "kingdee-dbapi/models" - "kingdee-dbapi/nsqclient" -) - -const orderLocalStore = "order.tmp" -const inventoryLocalStore = "inventory.tmp" - -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) - - 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 { - cursor := models.Order{ - OrderNo: orderNo, - } - - cursor.Insert() - cache.WriteCache(orderNo) - } - - logger.Debug("宸蹭笂鎶�%d涓鍗曚俊鎭�", len(list)) - } else { - logger.Warn("璁㈠崟鏁版嵁涓婃姤澶辫触") - } -} - -var invReportedCache = make(map[string]float64, 0) -var fullLoad bool - -func SendInventory() { - var list []kingdee.Inventory - - // 璁剧疆姣忓ぉ鍑屾櫒1鐐逛笂鎶ヤ竴娆″叏閲忔暟鎹� - hour := time.Now().Hour() - if hour == 1 { - if fullLoad == false { - invReportedCache = make(map[string]float64, 0) - fullLoad = true - } - } else { - fullLoad = false - } - - 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)) - - // 鍏堣繃婊や竴閬嶆暟鎹�, 鏍肩憺绫冲彂鐜版湁鍚屼竴涓骇鍝佸悓鎵瑰彿鍚屼粨搴�, 鏈夊鏉″簱瀛樿褰曠殑鎯呭喌 - // 灏嗙被浼肩殑鏁版嵁搴撳瓨鏁扮疮璁″埌涓�璧� - var filterMap = make(map[string]float64, 0) - for i := 0; i < len(list); { - cacheKey := list[i].FNumber + list[i].FBatchNo + list[i].FStockNo - if qty, ok := filterMap[cacheKey]; ok { - filterMap[cacheKey] = list[i].FUnitQty + qty - list = append(list[:i], list[i+1:]...) - } else { - filterMap[cacheKey] = list[i].FUnitQty - i++ - } - } - - // 杩囨护鏁版嵁, 鍒ゆ柇鏄惁宸茬粡涓婃姤杩� - for i := 0; i < len(list); { - cacheKey := list[i].FNumber + list[i].FBatchNo + list[i].FStockNo - if qty, ok := invReportedCache[cacheKey]; ok && qty == list[i].FUnitQty { - list = append(list[:i], list[i+1:]...) - } else { - invReportedCache[cacheKey] = list[i].FUnitQty - i++ - } - } - - if len(list) == 0 { - logger.Debug("娌℃湁瑕佹洿鏂扮殑搴撳瓨鏁版嵁.") - return - } - } - - // 姣忔鍙� 1000 鏉� - 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]) - - 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("搴撳瓨鏁版嵁涓婃姤澶辫触") - - //涓婃姤澶辫触, 缂撳瓨娓呯┖ - invReportedCache = make(map[string]float64, 0) - } else { - successCnt = end - } - } - - logger.Debug("宸蹭笂鎶�%d鏉″簱瀛樻暟鎹�", successCnt) -} -- Gitblit v1.8.0