From fe3167683576e5dd943fd5acc52e713652365def Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期一, 09 六月 2025 17:13:06 +0800
Subject: [PATCH] 优化ERP下发库存/取货信息流程,添加记录表和header判断逻辑备用

---
 models/TN_Inbound_DataRecord.cs                                                      |    9 +
 HH.WCS.Mobox3.AnGang.csproj                                                          |    4 
 api/ErpController.cs                                                                 |  167 ++++++++++++++++++++++++++++++++-
 /dev/null                                                                            |    0 
 api/ApiHelper.cs                                                                     |  102 ++++++++++++++++---
 .vs/HH.WCS.Mobox3.AnGang/FileContentIndex/cebd90f0-0f2c-46b9-a251-1039546e19c0.vsidx |    0 
 models/TN_Outbound_DataRecord.cs                                                     |    8 
 7 files changed, 258 insertions(+), 32 deletions(-)

diff --git a/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/7edb35ec-db87-44fb-92d8-217fedcfbfc4.vsidx b/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/7edb35ec-db87-44fb-92d8-217fedcfbfc4.vsidx
deleted file mode 100644
index 0a14dbd..0000000
--- a/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/7edb35ec-db87-44fb-92d8-217fedcfbfc4.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/8d71ff97-9b72-48d6-9f47-39b04040aec2.vsidx b/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/8d71ff97-9b72-48d6-9f47-39b04040aec2.vsidx
deleted file mode 100644
index c5ce0d9..0000000
--- a/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/8d71ff97-9b72-48d6-9f47-39b04040aec2.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/99373dd3-bbba-4020-a01f-9c6df7555363.vsidx b/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/99373dd3-bbba-4020-a01f-9c6df7555363.vsidx
deleted file mode 100644
index 45db594..0000000
--- a/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/99373dd3-bbba-4020-a01f-9c6df7555363.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/cebd90f0-0f2c-46b9-a251-1039546e19c0.vsidx b/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/cebd90f0-0f2c-46b9-a251-1039546e19c0.vsidx
new file mode 100644
index 0000000..a53f2cc
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/cebd90f0-0f2c-46b9-a251-1039546e19c0.vsidx
Binary files differ
diff --git a/HH.WCS.Mobox3.AnGang.csproj b/HH.WCS.Mobox3.AnGang.csproj
index d590fca..a437f8b 100644
--- a/HH.WCS.Mobox3.AnGang.csproj
+++ b/HH.WCS.Mobox3.AnGang.csproj
@@ -270,8 +270,8 @@
     <Compile Include="models\TN_Count_Diff.cs" />
     <Compile Include="models\TN_Count_Order.cs" />
     <Compile Include="models\TN_Count_Plan.cs" />
-    <Compile Include="models\TN_Inbound_Order.cs" />
-    <Compile Include="models\TN_Outbound_Order.cs" />
+    <Compile Include="models\TN_Inbound_DataRecord.cs" />
+    <Compile Include="models\TN_Outbound_DataRecord.cs" />
     <Compile Include="core\WMSCore.cs" />
     <Compile Include="models\BaseModel.cs" />
     <Compile Include="device\ModbusHelper.cs" />
diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
index 8fe1e34..5bf38d4 100644
--- a/api/ApiHelper.cs
+++ b/api/ApiHelper.cs
@@ -686,34 +686,67 @@
         }
 
         public static ErpResult InboundDataSync(InboundDataSyncInfo model) {
+            //return BuildErpResult(1, "娴嬭瘯");
+
             var db = new SqlHelper<object>().GetInstance();
             try {
                 var err = "";
                 var cgDetailList = new List<TN_CG_Detail>();
-                foreach (var inboundData in model.stockTransactions) {
+                var recordList = new List<TN_Inbound_DataRecord>();
+
+                foreach (var transaction in model.stockTransactions) {
+                    // 鍐欏叆璁板綍琛�+                    var record = new TN_Inbound_DataRecord {
+                        S_LOCATION_CODE = transaction.locationCode,
+                        S_STOCK_TRANS = transaction.stockTransactionId,
+                        S_ITEM_CODE = transaction.itemCode,
+                        S_ITEM_NAME = transaction.itemName,
+                        S_ITEM_SHORT_DESC = transaction.itemShortDesc,
+                        S_STOCK_QUANTITY = transaction.stockQuantity,
+                        S_IN_QUANTITY = transaction.inQuantity,
+                        S_TOTAL_PRICE = transaction.totalPrice,
+                        S_STOCK_IN_TIME = transaction.stockInTime,
+                        S_STORE_KEEPER = transaction.storeKeeper,
+                        S_LINE_CODE = transaction.lineCode,
+                        S_DELIVERY_ITEM_NO = transaction.deliveryItemNo,
+                        S_SUPPLIER_NAME = transaction.supplierName,
+                        S_INVENTORY_MAN = transaction.inventoryManager
+                    };
+                    recordList.Add(record);
+
+                    // 鏌ヨ瀵瑰簲鐗╂枡
                     var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
                         ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
-                        .Where(l => l.S_CODE == inboundData.locationCode)
+                        .Where(l => l.S_CODE == transaction.locationCode)
                         .Select((l, c, d) => d)
                         .First();
-                    
+
                     if (cgDetail == null) {
-                        err += $"鍌ㄤ綅鐮亄inboundData.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
+                        err += $"鍌ㄤ綅鐮亄transaction.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
                         continue;
                     }
+                    cgDetail.S_ITEM_CODE = transaction.itemCode;
+                    cgDetail.S_ITEM_NAME = transaction.itemName;
 
-                    cgDetail.S_ITEM_CODE = inboundData.itemCode;
-                    cgDetail.S_ITEM_NAME = inboundData.itemName;
-                    
                     cgDetailList.Add(cgDetail);
                 }
                 
-                if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) {
-                    return BuildErpResult(500, $"鏇存敼鐗╂枡淇℃伅澶辫触");
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable<TN_Inbound_DataRecord>(recordList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildErpResult(500, $"鍐欏叆鍏ュ簱璁板綍琛ㄥけ璐�);
+                    }
+
+                    if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildErpResult(500, $"鏇存敼鐗╂枡淇℃伅澶辫触");
+                    }
+
+                    tran.CommitTran();
                 }
 
                 if (err != "") {
-                    return BuildErpResult(2, err);
+                    return BuildErpResult(2, err + "鍏朵粬淇℃伅姝e父宸插啓鍏�);
                 }
                 return BuildErpResult(0, $"鏇存敼鐗╂枡淇℃伅鎴愬姛");
 
@@ -724,34 +757,67 @@
         }
 
         public static ErpResult OutboundDataSync(OutboundDataSyncInfo model) {
+            //return BuildErpResult(1, "娴嬭瘯");
+
             var db = new SqlHelper<object>().GetInstance();
             try {
                 var err = "";
                 var cgDetailList = new List<TN_CG_Detail>();
-                foreach (var inboundData in model.materialIssues) {
+                var recordList = new List<TN_Outbound_DataRecord>();
+
+                foreach (var issue in model.materialIssues) {
+                    // 鍐欏叆璁板綍琛�+                    var record = new TN_Outbound_DataRecord {
+                        S_LOCATION_CODE = issue.locationCode,
+                        S_ORDER_NO = issue.withdrawalOrderNo,
+                        S_ITEM_CODE = issue.itemCode,
+                        S_ITEM_NAME = issue.itemName,
+                        S_SHORT_DESC = issue.itemShortDesc,
+                        S_ACTUAL_QTY = issue.actualIssuedQty,
+                        S_ISSUED_AMOUNT = issue.issuedAmount,
+                        S_SUPPLIER_NAME = issue.supplierName,
+                        S_ISSUER = issue.issuer,
+                        S_ISSUE_DATE = issue.issueDate,
+                        S_STORE_KEEPER = issue.storeKeeper,
+                        S_LINE_CODE = issue.lineCode,
+                        S_BATCH_NO = issue.batchNo
+                    };
+                    recordList.Add(record);
+
+                    // 鏌ヨ瀵瑰簲鐗╂枡
                     var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
                         ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
-                        .Where(l => l.S_CODE == inboundData.locationCode)
+                        .Where(l => l.S_CODE == issue.locationCode)
                         .Select((l, c, d) => d)
                         .First();
 
                     if (cgDetail == null) {
-                        err += $"鍌ㄤ綅鐮亄inboundData.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
+                        err += $"鍌ㄤ綅鐮亄issue.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
                         continue;
                     }
 
-                    cgDetail.S_ITEM_CODE = inboundData.itemCode;
-                    cgDetail.S_ITEM_NAME = inboundData.itemName;
+                    cgDetail.S_ITEM_CODE = issue.itemCode;
+                    cgDetail.S_ITEM_NAME = issue.itemName;
 
                     cgDetailList.Add(cgDetail);
                 }
 
-                if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) {
-                    return BuildErpResult(500, $"鏇存敼鐗╂枡淇℃伅澶辫触");
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable<TN_Outbound_DataRecord>(recordList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildErpResult(500, $"鍐欏叆鍑哄簱璁板綍琛ㄥけ璐�);
+                    }
+
+                    if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildErpResult(500, $"鏇存敼鐗╂枡淇℃伅澶辫触");
+                    } 
+
+                    tran.CommitTran();
                 }
 
                 if (err != "") {
-                    return BuildErpResult(2, err);
+                    return BuildErpResult(2, err + "鍏朵粬淇℃伅姝e父宸插啓鍏�);
                 }
                 return BuildErpResult(0, $"鏇存敼鐗╂枡淇℃伅鎴愬姛");
 
diff --git a/api/ErpController.cs b/api/ErpController.cs
index dd038f7..5eaecc6 100644
--- a/api/ErpController.cs
+++ b/api/ErpController.cs
@@ -1,6 +1,13 @@
-锘縰sing System.Web.Http;
+锘縰sing System.Linq;
+using System.Net.Http;
+using System.Net;
+using System.Text;
+using System.Web.Http;
+
+using Newtonsoft.Json;
 
 using static HH.WCS.Mobox3.AnGang.api.OtherModel;
+using System.Threading.Tasks;
 
 namespace HH.WCS.Mobox3.AnGang.api {
     /// <summary>
@@ -15,8 +22,19 @@
         /// <returns></returns>
         [HttpPost]
         [Route("InboundDataSync")]
-        public ErpResult InboundDataSync(InboundDataSyncInfo model) {
-            return ApiHelper.InboundDataSync(model);
+        public IHttpActionResult InboundDataSync(InboundDataSyncInfo model) {
+            LogHelper.Info("瑙﹀彂API锛氬叆搴撴暟鎹悓姝� + JsonConvert.SerializeObject(model), "API");
+
+            //var headers = Request.Headers; // 鏆備笉鑰冭檻瀵硅姹侶TTP杩涜鏍¢獙锛岄粯璁ゅ彂鏉ョ殑璇锋眰鏍煎紡閮芥纭�+
+            //return new ErpResult { errCode = 1, errMsg = "娴嬭瘯" };
+            //return CreateSuccessResponse(new ErpResult { errCode = 1, errMsg = "娴嬭瘯"});
+
+            //var headers = Request.Headers;
+            //return ProcessInboundData(headers, model);
+
+            //return ApiHelper.InboundDataSync(model);
+            return NormalProcessInboundData(model); // 鏆傛椂浣跨敤鍘熸湰鐨勯�杈�         }
 
         /// <summary>
@@ -26,8 +44,147 @@
         /// <returns></returns>
         [HttpPost]
         [Route("OutboundDataSync")]
-        public ErpResult OutboundDataSync(OutboundDataSyncInfo model) {
-            return ApiHelper.OutboundDataSync(model);
+        public IHttpActionResult OutboundDataSync(OutboundDataSyncInfo model) {
+            LogHelper.Info("瑙﹀彂API锛氬嚭搴撳彂鏂欏悓姝� + JsonConvert.SerializeObject(model), "API");
+
+            //var headers = Request.Headers;
+            //return ProcessOutboundData(headers, model);
+
+            //return ApiHelper.OutboundDataSync(model);
+            return NormalProcessOutboundData(model); // 鏆傛椂浣跨敤鍘熸湰鐨勯�杈�+        }
+
+        private IHttpActionResult NormalProcessInboundData(InboundDataSyncInfo model) {
+            var data = ApiHelper.InboundDataSync(model);
+            return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) {
+                Headers = { },
+                Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")
+            });
+        }
+
+        private IHttpActionResult NormalProcessOutboundData(OutboundDataSyncInfo model) {
+            var data = ApiHelper.OutboundDataSync(model);
+            return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) {
+                Headers = { },
+                Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")
+            });
+        }
+
+        private IHttpActionResult ProcessInboundData(System.Net.Http.Headers.HttpRequestHeaders headers, InboundDataSyncInfo model) {
+            // 蹇呴』瀛楁楠岃瘉
+            if (!headers.Contains("sourceAppCode") || !headers.Contains("serviceId") || !headers.Contains("msgSendTime")) {
+                return CreateErrorResponse("2003", "缂哄皯蹇呰璇锋眰澶村弬鏁�);
+            }
+
+            var headerModel = new {
+                SourceAppCode = headers.GetValues("sourceAppCode").First(),
+                Password = headers.Contains("password") ? headers.GetValues("password").First() : null,
+                ServiceId = headers.GetValues("serviceId").First(),
+                MsgToken = headers.Contains("msgToken") ? headers.GetValues("msgToken").First() : null,
+                MsgSendTime = headers.GetValues("msgSendTime").First()
+            };
+
+            // 2. 楠岃瘉Header
+            var validationResult = ValidateHeaders(headerModel);
+            if (validationResult != null) {
+                return validationResult;
+            }
+
+            // 3. 璇诲彇Body
+            //string requestBody = await Request.Content.ReadAsStringAsync(); // 涓嶉渶瑕佸紓姝ヨ鍙栵紝鐩存帴鐢╩odel
+
+            // 4. 楠岃瘉Body
+            if (Request.Content.Headers.ContentLength > 2 * 1024 * 1024) {
+                return CreateErrorResponse("2102", "娑堟伅鍐呭杩囬暱锛岃秴杩�M");
+            }
+
+            // 5. 澶勭悊涓氬姟閫昏緫
+            var result = ApiHelper.InboundDataSync(model);
+
+            // 6. 杩斿洖鎴愬姛鍝嶅簲
+            return CreateSuccessResponse(result);
+        }
+
+        private IHttpActionResult ProcessOutboundData(System.Net.Http.Headers.HttpRequestHeaders headers, OutboundDataSyncInfo model) {
+            // 蹇呴』瀛楁楠岃瘉
+            if (!headers.Contains("sourceAppCode") || !headers.Contains("serviceId") || !headers.Contains("msgSendTime")) {
+                return CreateErrorResponse("2003", "缂哄皯蹇呰璇锋眰澶村弬鏁�);
+            }
+
+            var headerModel = new {
+                SourceAppCode = headers.GetValues("sourceAppCode").First(),
+                Password = headers.Contains("password") ? headers.GetValues("password").First() : null,
+                ServiceId = headers.GetValues("serviceId").First(),
+                MsgToken = headers.Contains("msgToken") ? headers.GetValues("msgToken").First() : null,
+                MsgSendTime = headers.GetValues("msgSendTime").First()
+            };
+
+            // 2. 楠岃瘉Header
+            var validationResult = ValidateHeaders(headerModel);
+            if (validationResult != null) {
+                return validationResult;
+            }
+
+            // 3. 璇诲彇Body
+            //string requestBody = await Request.Content.ReadAsStringAsync();
+
+            // 4. 楠岃瘉Body
+            if (Request.Content.Headers.ContentLength > 2 * 1024 * 1024) {
+                return CreateErrorResponse("2102", "娑堟伅鍐呭杩囬暱锛岃秴杩�M");
+            }
+
+            // 5. 澶勭悊涓氬姟閫昏緫
+            var result = ApiHelper.OutboundDataSync(model);
+
+            // 6. 杩斿洖鎴愬姛鍝嶅簲
+            return CreateSuccessResponse(result);
+        }
+
+        private IHttpActionResult CreateSuccessResponse(object data) {
+            return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) {
+                Headers = { { "returnCode", "0" } },
+                Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")
+            });
+        }
+
+        private IHttpActionResult CreateErrorResponse(string code, string message) {
+            return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) {
+                Headers = { { "returnCode", code } },
+                Content = new StringContent(message)
+            });
+        }
+
+        private IHttpActionResult ValidateHeaders(dynamic headers) {
+            // 瀹炵幇鎵�湁Header楠岃瘉閫昏緫
+            if (!IsRegisteredApp(headers.SourceAppCode, headers.Password)) {
+                return CreateErrorResponse("2201", "婧愯皟鐢ㄧ郴缁熸湭娉ㄥ唽");
+            }
+
+            if (!IsValidService(headers.ServiceId)) {
+                return CreateErrorResponse("2202", "浠g悊鏈嶅姟鏈敞鍐�);
+            }
+
+            if (!IsValidDateTime(headers.MsgSendTime)) {
+                return CreateErrorResponse("2101", "鏃堕棿鏍煎紡鏍¢獙澶辫触");
+            }
+
+            if (!string.IsNullOrEmpty(headers.MsgToken) && headers.MsgToken.Length > 32) {
+                return CreateErrorResponse("2104", "娑堟伅浠ょ墝杩囬暱锛岃秴杩�2浣�);
+            }
+
+            return null;
+        }
+
+        private bool IsRegisteredApp(string appId, string password) {
+            return true;
+        }
+
+        private bool IsValidService(string serviceId) {
+            return true;
+        }
+
+        private bool IsValidDateTime(string dataTime) {
+            return true;
         }
     }
 }
\ No newline at end of file
diff --git a/models/TN_Inbound_Order.cs b/models/TN_Inbound_DataRecord.cs
similarity index 89%
rename from models/TN_Inbound_Order.cs
rename to models/TN_Inbound_DataRecord.cs
index 5d3a3d7..9160201 100644
--- a/models/TN_Inbound_Order.cs
+++ b/models/TN_Inbound_DataRecord.cs
@@ -4,8 +4,11 @@
 using System.Text;
 using System.Threading.Tasks;
 
+using SqlSugar;
+
 namespace HH.WCS.Mobox3.AnGang.models {
-    public class TN_Inbound_Order : BaseModel {
+    [SugarTable("TN_Inbound_DataRecord")]
+    public class TN_Inbound_DataRecord : BaseModel {
         /// <summary>
         /// 鍌ㄤ綅鐮�         /// </summary>
@@ -14,7 +17,7 @@
         /// <summary>
         /// 搴撳瓨鏄庣粏浜ゆ槗鍙�         /// </summary>
-        public string S_STOCK_TRANSACTION_ID { get; set; }
+        public string S_STOCK_TRANS { get; set; }
 
         /// <summary>
         /// 鐗╂枡缂栫爜
@@ -74,6 +77,6 @@
         /// <summary>
         /// 搴撳瓨璐d换浜哄鍚�         /// </summary>
-        public string S_INVENTORY_MANAGER { get; set; }
+        public string S_INVENTORY_MAN { get; set; }
     }
 }
diff --git a/models/TN_Outbound_Order.cs b/models/TN_Outbound_DataRecord.cs
similarity index 87%
rename from models/TN_Outbound_Order.cs
rename to models/TN_Outbound_DataRecord.cs
index e0fee36..eba7039 100644
--- a/models/TN_Outbound_Order.cs
+++ b/models/TN_Outbound_DataRecord.cs
@@ -5,7 +5,7 @@
 using System.Threading.Tasks;
 
 namespace HH.WCS.Mobox3.AnGang.models {
-    public class TN_Outbound_Order : BaseModel {
+    public class TN_Outbound_DataRecord : BaseModel {
         /// <summary>
         /// 鍌ㄤ綅鐮�         /// </summary>
@@ -14,7 +14,7 @@
         /// <summary>
         /// 棰嗙敤鍗曞彿
         /// </summary>
-        public string S_WITHDRAWAL_ORDER_NO { get; set; }
+        public string S_ORDER_NO { get; set; }
 
         /// <summary>
         /// 鐗╂枡缂栫爜
@@ -29,12 +29,12 @@
         /// <summary>
         /// 鐗╂枡鐭弿杩�         /// </summary>
-        public string S_ITEM_SHORT_DESC { get; set; }
+        public string S_SHORT_DESC { get; set; }
 
         /// <summary>
         /// 瀹炲彂鏁伴噺
         /// </summary>
-        public string S_ACTUAL_ISSUED_QTY { get; set; }
+        public string S_ACTUAL_QTY { get; set; }
 
         /// <summary>
         /// 瀹炲彂閲戦

--
Gitblit v1.9.1