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