From 47878f10e573eb05c2041e497aae0c7d2c5bac7a Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期四, 29 六月 2023 19:06:44 +0800
Subject: [PATCH] 添加生产任务单接口

---
 config.json             |   19 ++-
 config/config.go        |   13 +
 webserver/controller.go |   17 +++
 gui/gui.go              |    5 
 report/loop.go          |    2 
 webserver/router.go     |    1 
 kingdee/query.go        |    8 
 kingdee/cst.go          |  190 ++++++++++++++++++++++++++++++++++++++
 8 files changed, 236 insertions(+), 19 deletions(-)

diff --git a/config.json b/config.json
index 401eb49..b04f638 100644
--- a/config.json
+++ b/config.json
@@ -1,15 +1,18 @@
 {
     "web_port": "10210",
-    "sql_addr": "10.6.201.7",
+    "sql_addr": "192.168.20.249",
     "sql_db_name": "LZGS",
-    "sql_username": "webapi",
-    "sql_password": "api2023",
+    "sql_username": "sa",
+    "sql_password": "basic@2023",
     "nsq_server": "fai365.com:4150",
-    "nsq_webapi": "http://121.31.232.83:9080/api/nsq/pub",
-    "order_topic": "aps.wangpengfei.erp.seorder",
-    "inventory_topic": "aps.wangpengfei.erp.inventory",
-    "query_topic": "aps.wangpengfei.erp.k3resource",
-    "reply_topic": "aps.wangpengfei.erp.k3repley",
+    "nsq_webapi": "http://121.31.232.83:9080/api/nsq/pub?topic=your_topic",
+    "order_topic": "aps.factory.erp.seorder",
+    "inventory_topic": "aps.factory.erp.inventory",
+    "query_topic": "aps.factory.erp.k3resource",
+    "reply_topic": "aps.factory.erp.k3reply",
+    "cst_webapi": "http://192.168.20.249/cst/local_post.ashx",
+    "cst_query_topic": "aps.factory.erp.cstApply",
+    "cst_reply_topic": "aps.factory.erp.cstReply",
     "interval": 60,
     "debug": false
 }
\ No newline at end of file
diff --git a/config/config.go b/config/config.go
index 1627c5b..fbeb267 100644
--- a/config/config.go
+++ b/config/config.go
@@ -18,8 +18,11 @@
 	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
-	ReplyTopic     string `json:"reply_topic"`     // 閲戣澏鍝嶅簲鏌ヨ鎺ュ彛鐨則opic
+	SqlQueryTopic  string `json:"query_topic"`     // 閲戣澏鏌ヨ鎺ュ彛鐨則opic
+	SqlReplyTopic  string `json:"reply_topic"`     // 閲戣澏鍝嶅簲鏌ヨ鎺ュ彛鐨則opic
+	CSTWebApi      string `json:"cst_webapi"`      // 鐢熶骇浠诲姟鍗曟彁浜ゅ湴鍧�
+	CSTQueryTopic  string `json:"cst_query_topic"` // 鎻愪氦鐢熶骇浠诲姟鍗曚富棰�
+	CSTReplyTopic  string `json:"cst_reply_topic"` // 鍝嶅簲鐢熶骇浠诲姟鍗曚富棰�
 	SyncInterval   int    `json:"interval"`        // 鍚屾鐨勬椂闂撮棿闅�, 鍗曚綅/绉�
 	Debug          bool   `json:"debug"`           // 鏈湴璋冭瘯, 鍙栨湰鍦版暟鎹�
 }
@@ -38,8 +41,10 @@
 	Options.NsqWebApi = "http://121.31.232.83:9080/api/nsq/pub?topic=your_topic"
 	Options.OrderTopic = "aps.factory.erp.seorder"
 	Options.InventoryTopic = "aps.factory.erp.inventory"
-	Options.QueryTopic = "aps.factory.erp.k3resource"
-	Options.ReplyTopic = "aps.factory.erp.k3reply"
+	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
 }
diff --git a/gui/gui.go b/gui/gui.go
index 8276e0c..fcaa3b5 100644
--- a/gui/gui.go
+++ b/gui/gui.go
@@ -93,8 +93,9 @@
 
 		report.StartReport()
 
-		// 寮�鍚闃�
-		go nsqclient.InitNsqConsumer(config.Options.QueryTopic, "sensor01", kingdee.QueryMsgHandle)
+		// 寮�鍚闃匰QL鏌ヨ
+		go nsqclient.InitNsqConsumer(config.Options.SqlQueryTopic, "sensor01", kingdee.SqlQueryHandle)
+		go nsqclient.InitNsqConsumer(config.Options.CSTQueryTopic, "sensor01", kingdee.CSTQueryHandle)
 
 		go webserver.Serve(serverPort.Text)
 	})
diff --git a/kingdee/cst.go b/kingdee/cst.go
new file mode 100644
index 0000000..076286a
--- /dev/null
+++ b/kingdee/cst.go
@@ -0,0 +1,190 @@
+package kingdee
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"kingdee-dbapi/config"
+	"kingdee-dbapi/logger"
+	"kingdee-dbapi/nsqclient"
+	"mime/multipart"
+	"net/http"
+	"strconv"
+	"time"
+)
+
+var JoHeadTemplate = `
+	{
+		"fdate": "%s",  //鏃ユ湡 褰撳ぉ鏃ユ湡
+		"ftype": 1054, //鍥哄畾鍊�
+		"forderinterid": 0, //鍥哄畾鍊�
+		"fpporderinterid": 0, //鍥哄畾鍊�
+		"fparentinterid": 0, //鍥哄畾鍊�
+		"fsupplyid": 0, //鍥哄畾鍊�
+		"fplanconfirmed": 0, //璁″垝纭
+		"fplanmode": 14036,  //璁″垝妯″紡
+		"fworktypeid": 55, //鐢熶骇绫诲瀷
+		"fmrp": 1052, //鍗曟嵁鏉ユ簮
+		"fbomcategory": 36820, //BOM 绫诲埆
+		"fcardclosed": 1059, //娴佽浆鍗″叧鑱斿叧闂�
+		"fprintcount": 0, //鎵撳嵃娆℃暟
+		"ffinclosed": 0, //璐㈠姟缁撶畻鏍囧織
+		"ffinclosedate": "", //璐㈠姟缁撶畻鏃ユ湡
+		"ffincloseer": 0, //璐㈠姟缁撶畻浜�
+		"fmtono": " ", //璁″垝璺熻釜鍙�:
+		"fauxqtyforitem": 0, //鍥犳枡鎶ュ簾鏁伴噺
+		"funitid": 0, //鍗曚綅 鎺ュ彛鑷姩鑾峰彇, 璁剧疆鎴�0灏卞彲浠�
+		"fcostobjid": 0, //鎴愭湰瀵硅薄 , 鎺ュ彛鑷姩鑾峰彇, 璁剧疆鎴�0灏卞彲浠�
+		"fbominterid": 0, //BOM缂栧彿 鎺ュ彛鑷姩鑾峰彇, 璁剧疆鎴�0灏卞彲浠�
+		"fbillerid": 16394, //涓庡埗鍗曚汉涓�鑷�
+		"fplancategory": 2, //璁″垝绫诲埆
+		"fcheckdate": "%s", //鍒跺崟鏃ユ湡
+		"fstartdate": "%s", //寮�宸ユ棩鏈�
+		"ffinishdate": "%s", //瀹屽伐鏃ユ湡
+		"fplancommitdate": "%s",  //璁″垝寮�宸ユ棩鏈�
+		"fplanfinishdate": "%s", //璁″垝瀹屽伐鏃ユ湡
+		"fitemid": "%s->", //鐗╂枡缂栫爜 *
+		"fworkshop": "%s->", //鐢熶骇杞﹂棿缂栧彿
+		"fauxqty": %d,  //璁″垝鐢熶骇鏁伴噺
+		"fauxinhighlimitqty": %d, //瀹屽伐鍏ュ簱涓婇檺
+		"fauxinlowlimitqty": %d, //瀹屽伐鍏ュ簱涓嬮檺
+		"finhighlimit": 0, //瀹屽伐鍏ュ簱瓒呮敹姣斾緥
+		"finlowlimit": 0 //瀹屽伐鍏ュ簱娆犳敹姣斾緥
+	}
+`
+
+type CSTNsqQuery struct {
+	FBillNo     string  `json:"FBillNo"`     // 璁㈠崟缂栧彿
+	FNumber     string  `json:"FNumber"`     // 鐗╂枡浠g爜
+	FSource     string  `json:"FSource"`     // 鐢熶骇杞﹂棿浠g爜
+	FStartDate  string  `json:"FStartDate"`  // 寮�宸ユ棩鏈�
+	FFinishDate string  `json:"FFinishDate"` // 瀹屽伐鏃ユ湡
+	UseAmount   float64 `json:"UseAmount"`   // 浣跨敤鏁伴噺
+}
+
+type CSTNsqReply struct {
+	FBillNo string `json:"fBillNo"` // 璁㈠崟缂栧彿
+	Code    int    `json:"code"`    // CST鎺ュ彛杩斿洖鐨刢ode
+	Message string `json:"message"` // 鎴愬姛鍒欒繑鍥炲崟鍙�, 澶辫触杩斿洖
+}
+
+type CSTServiceResponse struct {
+	ErrCode int    `json:"errcode"`
+	ErrMsg  string `json:"errmsg"`
+	Data    struct {
+		FBillNo      string `json:"fbillno"`
+		FBillId      string `json:"fbillid"`
+		FTranType    string `json:"ftrantype"`
+		FClassTypeId int    `json:"fclasstypeid"`
+	} `json:"data"`
+}
+
+func CSTQueryHandle(msg []byte) error {
+	var query []CSTNsqQuery
+	var reply []CSTNsqReply
+
+	if err := json.Unmarshal(msg, &query); err != nil {
+		logger.Warn("瑙f瀽璇锋眰澶辫触, %s", err.Error())
+		return err
+	}
+
+	for _, q := range query {
+		ret := Commit2CSTService(q)
+		reply = append(reply, ret)
+	}
+
+	replyData, _ := json.Marshal(reply)
+	ok := nsqclient.Produce(config.Options.CSTReplyTopic, replyData)
+	logger.Warn("搴旂瓟鏌ヨ璇锋眰缁撴灉:%t, key:%s", ok, replyData)
+
+	return nil
+}
+
+func Commit2CSTService(order CSTNsqQuery) (result CSTNsqReply) {
+	fmt.Println(order)
+	result.Code = -1
+
+	today := time.Now().Format("2006-01-02")
+	joHead := fmt.Sprintf(JoHeadTemplate,
+		today,                // 鏃ユ湡
+		today,                // 鍒跺崟鏃ユ湡
+		order.FStartDate,     // 寮�宸ユ棩鏈�
+		order.FFinishDate,    // 瀹屽伐鏃ユ湡
+		order.FStartDate,     // 璁″垝寮�宸ユ棩鏈�
+		order.FFinishDate,    // 璁″垝瀹屽伐鏃ユ湡
+		order.FNumber,        // 鐗╂枡缂栫爜
+		order.FSource,        // 鐢熶骇杞﹂棿缂栫爜
+		int(order.UseAmount), // 鐢熶骇鏁伴噺
+		int(order.UseAmount), // 瀹屽伐鍏ュ簱涓婇檺
+		int(order.UseAmount), // 瀹屽伐鍏ュ簱涓嬮檺
+	)
+	fmt.Println(joHead)
+	params := map[string]string{
+		"action":  "鐢熶骇浠诲姟鍗�.鏂板",
+		"fuserid": "16394",
+		"jo_head": joHead,
+		"ja_body": "[{}]",
+	}
+
+	request, err := newMultipartRequest(config.Options.CSTWebApi, params)
+	if err != nil {
+		result.Message = err.Error()
+		return
+	}
+
+	client := &http.Client{}
+	resp, err := client.Do(request)
+	if err != nil {
+		result.Message = err.Error()
+		return
+	}
+
+	defer resp.Body.Close()
+
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		result.Message = err.Error()
+		return
+	}
+
+	var rspMsg CSTServiceResponse
+	err = json.Unmarshal(body, &rspMsg)
+	if err != nil {
+		result.Message = err.Error()
+		return
+	}
+
+	if rspMsg.ErrCode == 0 {
+		result.Code = 0
+		result.Message = rspMsg.Data.FBillNo
+	} else {
+		result.Code = rspMsg.ErrCode
+		result.Message = rspMsg.ErrMsg
+	}
+
+	return
+}
+
+func newMultipartRequest(url string, params map[string]string) (*http.Request, error) {
+	body := &bytes.Buffer{}
+	writer := multipart.NewWriter(body)
+	// 璁剧疆Boundary, 鎺ュ彛楠岃瘉浜嗗叚涓�-
+	err := writer.SetBoundary("------basicHttpClient" + strconv.Itoa(int(time.Now().Unix())))
+	if err != nil {
+		fmt.Println(err.Error())
+	}
+	for key, val := range params {
+		_ = writer.WriteField(key, val)
+	}
+
+	writer.Close()
+
+	req, err := http.NewRequest("POST", url, body)
+	req.Header.Set("Content-Type", writer.FormDataContentType())
+	req.Header.Set("User-Agent", "basicHttpClient/0.0.1")
+	req.Header.Set("Connection", "keep-alive")
+	req.Header.Set("Accept", "*/*")
+
+	return req, err
+}
diff --git a/kingdee/query.go b/kingdee/query.go
index 2da57a5..37e75c0 100644
--- a/kingdee/query.go
+++ b/kingdee/query.go
@@ -10,7 +10,7 @@
 	"kingdee-dbapi/nsqclient"
 )
 
-type QueryMsg struct {
+type SqlQueryMsg struct {
 	Key     string // 璇锋眰
 	Command string
 	Success bool
@@ -18,8 +18,8 @@
 	Result  []byte
 }
 
-func QueryMsgHandle(msg []byte) error {
-	var query QueryMsg
+func SqlQueryHandle(msg []byte) error {
+	var query SqlQueryMsg
 
 	if err := json.Unmarshal(msg, &query); err != nil {
 		logger.Warn("瑙f瀽璇锋眰澶辫触, %s", err.Error())
@@ -45,7 +45,7 @@
 	}
 
 	replyData, _ := json.Marshal(query)
-	ok := nsqclient.Produce(config.Options.ReplyTopic, replyData)
+	ok := nsqclient.Produce(config.Options.SqlReplyTopic, replyData)
 	logger.Warn("搴旂瓟鏌ヨ璇锋眰缁撴灉:%t, key:%s", ok, query.Key)
 
 	return nil
diff --git a/report/loop.go b/report/loop.go
index be026dc..4fddf91 100644
--- a/report/loop.go
+++ b/report/loop.go
@@ -38,7 +38,7 @@
 
 			// 娴嬭瘯鏌ヨ璇锋眰
 			//sql := []byte("select * from t_icitem where FItemID=3316")
-			//ok := nsqclient.Produce(config.Options.QueryTopic, sql)
+			//ok := nsqclient.Produce(config.Options.SqlQueryTopic, sql)
 			//logger.Debug("娴嬭瘯璇锋眰鎺ュ彛, %v", ok)
 
 			time.Sleep(time.Duration(config.Options.SyncInterval) * time.Second)
diff --git a/webserver/controller.go b/webserver/controller.go
index 503e96f..171e757 100644
--- a/webserver/controller.go
+++ b/webserver/controller.go
@@ -1,6 +1,7 @@
 package webserver
 
 import (
+	"fmt"
 	"kingdee-dbapi/kingdee"
 
 	"github.com/gin-gonic/gin"
@@ -25,3 +26,19 @@
 		"total":   len(rspData),
 	})
 }
+
+func CSTCommit(c *gin.Context) {
+	var req kingdee.CSTNsqQuery
+	if err := c.ShouldBind(&req); err != nil {
+		c.JSON(401, gin.H{"msg": err.Error()})
+		return
+	}
+	fmt.Println(req)
+	rsp := kingdee.Commit2CSTService(req)
+
+	c.JSON(200, gin.H{
+		"success": true,
+		"message": "",
+		"data":    rsp,
+	})
+}
diff --git a/webserver/router.go b/webserver/router.go
index d991e38..e26a0ff 100644
--- a/webserver/router.go
+++ b/webserver/router.go
@@ -8,6 +8,7 @@
 	r := gin.Default()
 	r.GET("/order", OrderList)
 	r.GET("/inventory", InventoryList)
+	r.POST("/cst", CSTCommit)
 
 	r.Run(":" + port)
 }

--
Gitblit v1.8.0