From fbb7c2253c86d58583d7e3b0a8a44d0342c43c73 Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期五, 25 七月 2025 17:20:52 +0800
Subject: [PATCH] 完善单容器多物料场景的优化重构, 优化ERP回报信息的处理

---
 api/DebugController.cs |   70 +++++++++++
 core/Monitor.cs        |  189 +++++++++++++++++++++++--------
 api/ApiHelper.cs       |   43 +++---
 api/ApiModel.cs        |    1 
 core/WCSCore.cs        |   30 ++--
 5 files changed, 243 insertions(+), 90 deletions(-)

diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
index 2466c03..54515d1 100644
--- a/api/ApiHelper.cs
+++ b/api/ApiHelper.cs
@@ -371,15 +371,15 @@
                     return BuildSimpleResult(3, $"璇ヤ换鍔″凡鏈夌粓鐐�);
                 }
 
-                var cgDetail = db.Queryable<TN_CG_Detail>()
-                    .Where(a => a.S_CNTR_CODE == task.S_CNTR_CODE).First();
+                var cgDetailList = db.Queryable<TN_CG_Detail>()
+                    .Where(a => a.S_CNTR_CODE == task.S_CNTR_CODE).ToList();
 
-                if (cgDetail == null) {
+                if (cgDetailList.Count == 0) {
                     return BuildSimpleResult(4, $"鎵樼洏鐗╂枡涓嶅瓨鍦�);
                 }
 
                 var endLoc = new TN_Location();
-                if (cgDetail.F_WEIGHT > 2000) {
+                if (task.F_WEIGHT > 2000) {
                     // 閲嶉噺瓒呰繃2t锛屾姤閿�                     if (GZRobot.TryGetInteractionInfoId(task.S_CODE, out var id1)) {
                         if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
@@ -400,9 +400,9 @@
                         //return BuildSimpleResult(8, $"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅澶辫触");
                     }
 
-                    return BuildSimpleResult(8, $"鐗╂枡閲嶉噺{cgDetail.F_WEIGHT}瓒呰繃2t");
+                    return BuildSimpleResult(8, $"鐗╂枡閲嶉噺{task.F_WEIGHT}瓒呰繃2t");
                 }
-                else if (cgDetail.F_WEIGHT > 1500) {
+                else if (task.F_WEIGHT > 1500) {
                     // 閲嶉噺瓒呰繃1.5t锛岄渶瑕侀�鎷�-2灞傝揣鏋�                     endLoc = db.Queryable<TN_Location>()
                         .Where(a => a.S_CODE == model.EndLoc)
@@ -412,7 +412,7 @@
                         .Where(a => a.N_LAYER <= 2)
                         .First();
                 }
-                else if (cgDetail.F_WEIGHT > 0) {
+                else if (task.F_WEIGHT > 0) {
                     endLoc = db.Queryable<TN_Location>()
                         .Where(a => a.S_CODE == model.EndLoc)
                         .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y")
@@ -423,7 +423,7 @@
                         .First();
                 }
                 else {
-                    return BuildSimpleResult(5, $"鐗╂枡閲嶉噺淇℃伅涓嶅悎娉曪細{cgDetail.F_WEIGHT}");
+                    return BuildSimpleResult(5, $"鐗╂枡閲嶉噺淇℃伅涓嶅悎娉曪細{task.F_WEIGHT}");
                 }
 
                 // 娌℃湁绗﹀悎鏉′欢鐨勮揣浣�@@ -645,8 +645,8 @@
                     return BuildSimpleResult(2, $"褰撳墠璐т綅{model.startLoc}娌℃湁璐т綅瀹瑰櫒缁戝畾鍏崇郴锛屾棤闇�В缁戯紒");
                 }
 
-                var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == locCntrRel.S_CNTR_CODE);
-                if (cgDetail != null) {
+                var cgDetailList = db.Queryable<TN_CG_Detail>().Where(a => a.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).ToList();
+                if (cgDetailList.Count != 0) {
                     return BuildSimpleResult(3, $"褰撳墠璐т綅{model.startLoc}瀹瑰櫒瀛樻斁鐨勭墿鏂欐暟閲忎笉涓�锛屾棤娉曡В缁戯紒");
                 }
 
@@ -855,7 +855,7 @@
                     return BuildErpResult(400, "涓嶈兘浼犲叆绌虹殑鏁版嵁鍒楄〃");
                 }
 
-                var insetRecordList = new List<TN_Inbound_DataRecord>();
+                var insertRecordList = new List<TN_Inbound_DataRecord>();
                 //var deleteRecordOldList = new List<TN_Inbound_DataRecord> ();
 
                 foreach (var transaction in model.stockTransactions) {
@@ -886,7 +886,7 @@
                         S_SUPPLIER_NAME = transaction.supplierName,
                         S_INVENTORY_MAN = transaction.inventoryManager
                     };
-                    insetRecordList.Add(record);
+                    insertRecordList.Add(record);
 
                 }
                 
@@ -896,7 +896,7 @@
                     //    return BuildErpResult(500, $"鍒犻櫎鏃у叆搴撹褰曟暟鎹け璐ワ細{JsonConvert.SerializeObject(deleteRecordOldList)}");
                     //}
 
-                    if (db.Insertable<TN_Inbound_DataRecord>(insetRecordList).ExecuteCommand() <= 0) {
+                    if (db.Insertable<TN_Inbound_DataRecord>(insertRecordList).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
                         return BuildErpResult(500, $"鍐欏叆鍏ュ簱璁板綍琛ㄥけ璐�");
                     }
@@ -919,7 +919,7 @@
                     return BuildErpResult(400, "涓嶈兘浼犲叆绌虹殑鏁版嵁鍒楄〃");
                 }
 
-                var insetRecordList = new List<TN_Outbound_DataRecord>();
+                var insertRecordList = new List<TN_Outbound_DataRecord>();
                 //var deleteRecordOldList = new List<TN_Outbound_DataRecord>();
                 foreach (var issue in model.materialIssues) {
                     //var recordOld = db.Queryable<TN_Outbound_DataRecord>()
@@ -948,7 +948,7 @@
                         S_LINE_CODE = issue.lineCode,
                         S_BATCH_NO = issue.batchNo
                     };
-                    insetRecordList.Add(record);
+                    insertRecordList.Add(record);
                 }
 
                 using (var tran = db.Ado.UseTran()) {
@@ -957,7 +957,7 @@
                     //    return BuildErpResult(500, $"鍒犻櫎鏃у嚭搴撹褰曟暟鎹け璐ワ細{JsonConvert.SerializeObject(deleteRecordOldList)}");
                     //}
 
-                    if (db.Insertable<TN_Outbound_DataRecord>(insetRecordList).ExecuteCommand() <= 0) {
+                    if (db.Insertable<TN_Outbound_DataRecord>(insertRecordList).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
                         return BuildErpResult(500, $"鍐欏叆鍑哄簱璁板綍琛ㄥけ璐�);
                     }
@@ -1220,9 +1220,9 @@
                 }
 
                 var cgDetail = db.Queryable<TN_CG_Detail>()
-                    .Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).First();
+                    .Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE && d.S_ITEM_CODE == model.itemCode).First();
                 if (cgDetail == null) {
-                    return BuildSimpleResult(3, $"褰撳墠璐т綅{model.locCode}涓婄殑瀹瑰櫒{locCntrRel.S_CNTR_CODE}娌℃湁鐗╁搧锛�);
+                    return BuildSimpleResult(3, $"褰撳墠璐т綅{model.locCode}涓婄殑瀹瑰櫒{locCntrRel.S_CNTR_CODE}娌℃湁鐗╁搧{model.itemCode}锛�);
                 }
 
                 //var countDiff = new TN_Count_Diff {
@@ -1231,11 +1231,10 @@
                 //    F_ACTUAL_QTY = model.qty
                 //};
 
-                var countDiff = db.Queryable<TN_AG_Count_Diff>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).First();
+                var countDiff = db.Queryable<TN_AG_Count_Diff>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE && d.S_ITEM_CODE == model.itemCode).First();
                 if (countDiff == null) {
-                    return BuildSimpleResult(4, $"褰撳墠鐗╂枡鎵�湪瀹瑰櫒{locCntrRel.S_CNTR_CODE}鐗╂枡淇℃伅娌℃湁鐢熸垚瀵瑰簲鐨勭洏鐐瑰樊寮傝〃锛�);
+                    return BuildSimpleResult(4, $"褰撳墠鐗╂枡鎵�湪瀹瑰櫒{locCntrRel.S_CNTR_CODE}鐗╂枡淇℃伅{model.itemCode}娌℃湁鐢熸垚瀵瑰簲鐨勭洏鐐瑰樊寮傝〃锛�);
                 }
-
 
                 countDiff.F_QTY = cgDetail.F_QTY;
                 countDiff.F_ACTUAL_QTY = model.qty;
@@ -1247,7 +1246,7 @@
                 using (var tran = db.Ado.UseTran()) {
                     if (db.Updateable<TN_AG_Count_Diff>(countDiff).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return BuildSimpleResult(5, $"鎻掑叆鐩樼偣宸紓琛ㄥけ璐�);
+                        return BuildSimpleResult(5, $"鏇存柊鐩樼偣宸紓琛ㄥけ璐�);
                     }
 
                     if (db.Updateable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
diff --git a/api/ApiModel.cs b/api/ApiModel.cs
index 567fccb..2ec251e 100644
--- a/api/ApiModel.cs
+++ b/api/ApiModel.cs
@@ -277,6 +277,7 @@
         public class CountProductInfo {
             //public string cntrCode { get; set; }
             public string locCode { get; set; }
+            public string itemCode { get; set; }
             public float qty { get; set; }
         }
 
diff --git a/api/DebugController.cs b/api/DebugController.cs
index d948cb3..f83777f 100644
--- a/api/DebugController.cs
+++ b/api/DebugController.cs
@@ -4,13 +4,15 @@
 using System.Web.Http;
 
 using HH.WCS.Mobox3.AnGang.dispatch;
-using HH.WCS.Mobox3.AnGang.wms;
 using HH.WCS.Mobox3.AnGang.models;
+using HH.WCS.Mobox3.AnGang.util;
+using HH.WCS.Mobox3.AnGang.wms;
 
 using Newtonsoft.Json;
 
+using SqlSugar;
+
 using static HH.WCS.Mobox3.AnGang.api.ApiModel;
-using HH.WCS.Mobox3.AnGang.util;
 
 namespace HH.WCS.Mobox3.AnGang.api {
     /// <summary>
@@ -170,6 +172,70 @@
                 return ex.Message;
             }
         }
+
+        [HttpPost]
+        public string AddCntrData() {
+            var db = new SqlHelper<object>().GetInstance();
+            try {
+                //var locCntrRelList = db.Queryable<TN_Loc_Container>();
+                //var result = db.Queryable<TN_CG_Detail>()
+                //    .GroupBy(d => d.S_CNTR_CODE)  // 鎸�S_CNTR_CODE 鍒嗙粍
+                //    .Select(d => new CntrCodeCountResult {
+                //        S_CNTR_CODE = d.S_CNTR_CODE,
+                //        Count = SqlFunc.AggregateCount(d.S_ITEM_CODE)  // 璁$畻姣忕粍鐨勬潯鐩暟
+                //    })
+                //    .ToList();
+
+                //var cntrList = locCntrRelList.Select(c => c.S_CNTR_CODE);
+
+                var result = db.Queryable<TN_CG_Detail>()
+                    .LeftJoin<TN_Loc_Container>((detail, container) => detail.S_CNTR_CODE == container.S_CNTR_CODE)
+                    .GroupBy(detail => detail.S_CNTR_CODE)
+                    .Select((detail, container) => new CntrCodeCountResult {
+                        S_CNTR_CODE = detail.S_CNTR_CODE,
+                        Count = SqlFunc.AggregateCount(detail.S_ITEM_CODE)
+                    })
+                    .ToList();
+
+                var cntrList = db.Queryable<TN_Container>().ToList();
+                
+                var cntrListToUpdate = new List<TN_Container>();
+                var cntrListToInsert = new List<TN_Container>();
+                foreach (var cntr in result) {
+                    var oldCntr = cntrList.Where(c => c.S_CODE == cntr.S_CNTR_CODE).First();
+                    if (oldCntr == null) {
+                        cntrListToUpdate.Add(new TN_Container { S_CODE = cntr.S_CNTR_CODE, N_DETAIL_COUNT = cntr.Count });
+                    }
+
+                    if (oldCntr.N_DETAIL_COUNT != cntr.Count) {
+                        cntrListToUpdate.Add(new TN_Container { S_CODE = cntr.S_CNTR_CODE, N_DETAIL_COUNT = cntr.Count });
+                    }
+                }
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (cntrListToUpdate.Count > 0 && db.Updateable(cntrListToUpdate).ExecuteCommand() <= 0) { 
+                        tran.RollbackTran();
+                        return "鏇存柊澶辫触";
+                    }
+                    if (cntrListToInsert.Count > 0 && db.Insertable(cntrListToInsert).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return "鎻掑叆澶辫触";
+                    }
+                    tran.CommitTran();
+                }
+            }
+            catch (Exception ex) {
+
+                return ex.Message;
+            }
+
+            return "success";
+        }
+    }
+
+    public class CntrCodeCountResult {
+        public string S_CNTR_CODE { get; set; }  // 瀹瑰櫒浠g爜
+        public int Count { get; set; }           // 璇ュ鍣ㄤ唬鐮佸搴旂殑鏉$洰鏁�     }
 
     public class ReturnResults {
diff --git a/core/Monitor.cs b/core/Monitor.cs
index 9fbbcb6..1fca4ea 100644
--- a/core/Monitor.cs
+++ b/core/Monitor.cs
@@ -37,51 +37,64 @@
                 foreach (var inboundData in inboundDataList) {
                     var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_LOC_CODE == inboundData.S_LOCATION_CODE).First();
                     // 鏆傛椂涓嶈�铏戝鏋滃綋鍓嶅叧绯昏〃锛岄攣鐘舵�涓�锛堝凡缁廍RP瑕嗙洊杩囷級鐨勬儏鍐碉紝榛樿鏈夊氨瑕嗙洊
-                    if (locCntrRel != null) {
-                        var cgDetailList = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).ToList();
-                        if (cgDetailList.Count == 0) {
-                            LogHelper.Info($"杞锛氬叆搴撲俊鎭悓姝ワ細璐т綅瀹瑰櫒琛ㄤ腑锛屽寘鍚揣浣�{locCntrRel.S_LOC_CODE}, 瀹瑰櫒={locCntrRel.S_CNTR_CODE}锛涗絾瀹瑰櫒瀵瑰簲鐨勭墿鏂欒〃锛屾病鏈夋壘鍒扮墿鏂欙紒");
-                            continue;
-                        }
-
-                        cgDetailList.ForEach(d => {
-                            if (!needDeleteCgDetailList.Contains(d)) { 
-                                needDeleteCgDetailList.Add(d);
-                            }
-                        });
-
-                        // 闂瓺S , 鐢╨inq浼樺寲
-                        var cntr = needUpdateCntrList.Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).FirstOrDefault();
-                        if (cntr != null) { 
-                            
-                        }
-
-                        // ERP 鏁版嵁 -> CG_Detail
-                        var cgDetail = cgDetailList.FirstOrDefault();
-
-                        cgDetail.S_ITEM_CODE = inboundData.S_ITEM_CODE;
-                        cgDetail.S_ITEM_SHORT_DESC = inboundData.S_ITEM_SHORT_DESC; // 鐗╂枡鐭弿杩�-                        cgDetail.S_IN_QUANTITY = inboundData.S_IN_QUANTITY; // 鍏ュ簱鏁伴噺
-                        cgDetail.S_STOCK_QUANTITY = inboundData.S_STOCK_QUANTITY; // 搴撳瓨鏁伴噺
-                        cgDetail.S_TOTAL_PRICE = inboundData.S_TOTAL_PRICE; // 搴撳瓨鎬讳环
-                        cgDetail.S_STORE_KEEPER = inboundData.S_STORE_KEEPER;
-                        cgDetail.S_LINE_CODE = inboundData.S_LINE_CODE;
-                        cgDetail.F_QTY = float.Parse(inboundData.S_IN_QUANTITY);
-                        cgDetail.T_MODIFY = DateTime.Now;
-                        //cgDetail.S_INVENTORY_MAN = inboundData.S_INVENTORY_MAN; // 搴撳瓨璐d换浜哄鍚�-
-                        locCntrRel.N_LOCK_STATE = 1;
-                        cgDetail.N_LOCK_STATE = 1;
-
-                        locCntrRel.T_MODIFY = DateTime.Now;
-                        needUpdateLocCntrRelList.Add(locCntrRel);
-                        //needUpdateCgDetailList.Add(cgDetailList);
-                        needDeleteDataList.Add(inboundData);
+                    if (locCntrRel == null) {
+                        LogHelper.Info($"杞锛氬叆搴撲俊鎭悓姝ワ細璐т綅瀹瑰櫒缁戝畾琛ㄤ腑鏆傛棤璐т綅={inboundData.S_LOCATION_CODE}");
+                        continue;
                     }
+
+                    // 瀛樺湪璐т綅瀹瑰櫒琛ㄤ絾娌℃壘鍒扮墿鏂欒〃 ( 閫氬父鎯呭喌涓嬩笉浼氬彂鐢�)
+                    var cgDetailList = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).ToList();
+                    if (cgDetailList.Count == 0) {
+                        LogHelper.Info($"杞锛氬叆搴撲俊鎭悓姝ワ細璐т綅瀹瑰櫒琛ㄤ腑锛屽寘鍚揣浣�{locCntrRel.S_LOC_CODE}, 瀹瑰櫒={locCntrRel.S_CNTR_CODE}锛涗絾瀹瑰櫒瀵瑰簲鐨勭墿鏂欒〃锛屾病鏈夋壘鍒扮墿鏂欙紒");
+                        continue;
+                    }
+
+                    // 瀵规煡鍒扮殑 cgDetailList , 寰呰鐩�, 娣诲姞鍒板緟鍒犻櫎鍒楄〃涓�+                    foreach (var cgDetal in cgDetailList) {
+                        if (!needDeleteCgDetailList.Contains(cgDetal)) {
+                            needDeleteCgDetailList.Add(cgDetal);
+                        }
+                    }
+
+                    // 鏇存柊瀹瑰櫒琛ㄧ殑璐у搧鏄庣粏鏁伴噺 , 绗竴娆¤缃负 1 , 涔嬪悗姣忔 + 1
+                    var cntr = needUpdateCntrList.Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).FirstOrDefault();
+                    if (cntr != null) {
+                        cntr.N_DETAIL_COUNT += 1;
+                        cntr.T_MODIFY = DateTime.Now;
+                    }
+                    else {
+                        needUpdateCntrList.Add(new TN_Container { S_CODE = locCntrRel.S_CNTR_CODE, N_DETAIL_COUNT = 1 });
+                    }
+
+                    // ERP 鏁版嵁 -> CG_Detail
+                    // 璐у搧鍒楄〃涓殢渚挎壘涓�釜 cgDetail 璧嬪� , 鍙渶瑕佺‘淇�F_WEIGHT 鍜�S_EXT_ATTR5 ( IMG_URL ) 涓嶅彉鍗冲彲
+                    var cgDetail = cgDetailList.FirstOrDefault();
+
+                    cgDetail.S_ITEM_CODE = inboundData.S_ITEM_CODE;
+                    cgDetail.S_ITEM_SHORT_DESC = inboundData.S_ITEM_SHORT_DESC; // 鐗╂枡鐭弿杩�+                    cgDetail.S_IN_QUANTITY = inboundData.S_IN_QUANTITY; // 鍏ュ簱鏁伴噺
+                    cgDetail.S_STOCK_QUANTITY = inboundData.S_STOCK_QUANTITY; // 搴撳瓨鏁伴噺
+                    cgDetail.S_TOTAL_PRICE = inboundData.S_TOTAL_PRICE; // 搴撳瓨鎬讳环
+                    cgDetail.S_STORE_KEEPER = inboundData.S_STORE_KEEPER;
+                    cgDetail.S_LINE_CODE = inboundData.S_LINE_CODE;
+                    cgDetail.F_QTY = float.Parse(inboundData.S_IN_QUANTITY);
+                    cgDetail.T_MODIFY = DateTime.Now;
+                    //cgDetail.S_INVENTORY_MAN = inboundData.S_INVENTORY_MAN; // 搴撳瓨璐d换浜哄鍚�+
+                    cgDetail.N_LOCK_STATE = 1;
+                    locCntrRel.N_LOCK_STATE = 1;
+                    locCntrRel.T_MODIFY = DateTime.Now;
+
+                    needUpdateLocCntrRelList.Add(locCntrRel);
+                    //needUpdateCgDetailList.Add(cgDetailList);
+
+                    // 鏈�悗 , 灏嗗鐞嗗畬鐨勫叆搴撹褰曞姞鍏ュ垹闄ら槦鍒�+                    needDeleteDataList.Add(inboundData);
                 }
 
                 if (needDeleteDataList.Count == 0) {
                     LogHelper.Info($"杞锛氬叆搴撲俊鎭悓姝ワ細寰呮洿鏂扮殑ERP鐗╂枡淇℃伅锛屾殏鏃犵墿鏂欏彲浠ヨ鐩栵紝鐩墠寰呮洿鏂版暟閲忥細{inboundDataList.Count}");
+                    return;
                 }
 
                 using (var tran = db.Ado.UseTran()) {
@@ -100,6 +113,24 @@
                     if (needUpdateLocCntrRelList.Count > 0 && db.Updateable<TN_Loc_Container>(needUpdateLocCntrRelList).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
                         LogHelper.Info($"杞锛氬叆搴撲俊鎭悓姝ワ細鏍规嵁ERP淇℃伅锛屾洿鏂拌揣浣嶅鍣ㄥ叧绯昏〃澶辫触锛� + JsonConvert.SerializeObject(needUpdateLocCntrRelList));
+                        return;
+                    }
+
+                    if (needDeleteCgDetailList.Count > 0 && db.Deleteable(needDeleteCgDetailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        LogHelper.Info($"杞: 鍏ュ簱淇℃伅鍚屾: 鏍规嵁ERP淇℃伅, 鍒犻櫎鏃х墿鏂欐槑缁嗚〃澶辫触! " + JsonConvert.SerializeObject(needDeleteCgDetailList));
+                        return;
+                    }
+
+                    if (needInsertCgDetailList.Count > 0 && db.Insertable(needInsertCgDetailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        LogHelper.Info($"杞: 鍏ュ簱淇℃伅鍚屾: 鏍规嵁ERP淇℃伅, 鎻掑叆鏂扮墿鏂欐槑缁嗚〃澶辫触! " + JsonConvert.SerializeObject(needInsertCgDetailList));
+                        return;
+                    }
+
+                    if (needUpdateCntrList.Count > 0 && db.Updateable(needUpdateCntrList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        LogHelper.Info($"杞: 鍏ュ簱淇℃伅鍚屾: 鏍规嵁ERP淇℃伅, 鏇存柊瀹瑰櫒琛ㄥけ璐� " + JsonConvert.SerializeObject(needUpdateCntrList));
                         return;
                     }
 
@@ -126,31 +157,75 @@
                 
                 var needDeleteDataList = new List<TN_Outbound_DataRecord>();
                 var needUpdateLocCntrRelList = new List<TN_Loc_Container>();
+
                 var needUpdateCgDetailList = new List<TN_CG_Detail>();
+                var needDeleteCgDetailList = new List<TN_CG_Detail>();
+                var needUpdateCntrList = new List<TN_Container>();
+
                 foreach (var outboundData in outboundDataList) {
                     var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_LOC_CODE == outboundData.S_LOCATION_CODE).First();
                     // 鏆傛椂涓嶈�铏戝鏋滃綋鍓嶅叧绯昏〃锛岄攣鐘舵�涓�锛堝凡缁廍RP瑕嗙洊杩囷級鐨勬儏鍐碉紝榛樿鏈夊氨瑕嗙洊
                     if (locCntrRel != null) {
-                        var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).First();
+                        // 鍑哄簱涓嶅儚鍏ュ簱閭f牱鐩存帴瑕嗙洊 , 鑰屾槸鏌ユ壘鍏蜂綋鐨勭墿鏂欑紪鐮�, 瀵规瘡涓繘琛屼慨鏀�+                        var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE && d.S_ITEM_CODE == outboundData.S_ITEM_CODE).First();
                         if (cgDetail == null) {
-                            LogHelper.Info($"杞锛氬嚭搴撲俊鎭悓姝ワ細璐т綅瀹瑰櫒琛ㄤ腑锛屽寘鍚揣浣�{locCntrRel.S_LOC_CODE}, 瀹瑰櫒={locCntrRel.S_CNTR_CODE}锛涗絾瀹瑰櫒瀵瑰簲鐨勭墿鏂欒〃锛屾病鏈夋壘鍒扮墿鏂欙紒");
+                            LogHelper.Info($"杞锛氬嚭搴撲俊鎭悓姝ワ細璐т綅瀹瑰櫒琛ㄤ腑锛屽寘鍚揣浣�{locCntrRel.S_LOC_CODE}, 瀹瑰櫒={locCntrRel.S_CNTR_CODE}锛涗絾瀹瑰櫒瀵瑰簲鐨勭墿鏂欒〃锛屾病鏈夋壘鍒扮墿鏂檣outboundData.S_ITEM_CODE}锛�);
                             continue;
                         }
+
                         var actualQty = float.Parse(outboundData.S_ACTUAL_QTY);
                         if (actualQty > cgDetail.F_QTY) {
                             LogHelper.Info($"瀹炲彂鏁伴噺瓒呰繃鐗╂枡鏁伴噺! 鐗╂枡缂栫爜={cgDetail.S_ITEM_CODE}, 褰撳墠鏁伴噺={cgDetail.F_QTY}, 瀹炲彂鏁伴噺='{outboundData.S_ACTUAL_QTY}'", "Error");
-                            actualQty = 0f;
                         }
 
-                        cgDetail.S_ITEM_CODE = outboundData.S_ITEM_CODE;
-                        cgDetail.S_STORE_KEEPER = outboundData.S_STORE_KEEPER;
-                        cgDetail.F_QTY = actualQty;
-                        cgDetail.T_MODIFY = DateTime.Now;
-                        locCntrRel.N_LOCK_STATE = 1;
-                        cgDetail.N_LOCK_STATE = 1;
-                        locCntrRel.T_MODIFY = DateTime.Now;
+                        var currentQty = cgDetail.F_QTY - actualQty;
+                        if (currentQty <= 0) {
+                            needDeleteCgDetailList.Add(cgDetail);
+
+                            // 鏇存柊瀹瑰櫒琛ㄧ殑璐у搧鏄庣粏鏁伴噺 , 绗竴娆℃煡鎵惧苟 - 1 , 涔嬪悗姣忔 - 1
+                            var cntr = needUpdateCntrList.Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).FirstOrDefault();
+                            if (cntr != null) {
+                                if (cntr.N_DETAIL_COUNT == 0) {
+                                    LogHelper.Info($"瀹瑰櫒鏄庣粏鏁伴噺涓�, 鏃犳硶鍐嶅噺灏�", "Error");
+                                }
+                                else {
+                                    cntr.N_DETAIL_COUNT -= 1;
+                                    cntr.T_MODIFY = DateTime.Now;
+                                }
+                            }
+                            else {
+                                var actualCntr = db.Queryable<TN_Container>().Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).First();
+                                if (actualCntr == null) {
+                                    LogHelper.Info($"瀹瑰櫒琛ㄤ腑娌℃湁瀹瑰櫒{actualCntr.S_CODE}!", "Error");
+                                }
+                                else {
+                                    if (actualCntr.N_DETAIL_COUNT == 0) {
+                                        LogHelper.Info($"瀹瑰櫒鏄庣粏鏁伴噺涓�, 鏃犳硶鍐嶅噺灏�", "Error");
+                                    }
+                                    else {
+                                        actualCntr.N_DETAIL_COUNT -= 1;
+                                        actualCntr.T_MODIFY = DateTime.Now;
+                                        needUpdateCntrList.Add(actualCntr);
+                                    }
+                                }
+                            }
+
+                        }
+                        else {
+                            cgDetail.S_ITEM_CODE = outboundData.S_ITEM_CODE;
+                            cgDetail.S_STORE_KEEPER = outboundData.S_STORE_KEEPER;
+                            cgDetail.F_QTY = currentQty;
+                            cgDetail.T_MODIFY = DateTime.Now;
+                            locCntrRel.N_LOCK_STATE = 1;
+                            cgDetail.N_LOCK_STATE = 1;
+                            cgDetail.S_STOCK_QUANTITY = currentQty.ToString();
+                            locCntrRel.T_MODIFY = DateTime.Now;
+
+                            needUpdateCgDetailList.Add(cgDetail);
+                        }
+
+                        // 灏辩畻cgDetail閮藉垹瀹屼簡, 涔熻繕鏄細淇濈暀璐т綅瀹瑰櫒淇℃伅, 涓嶄細鑷姩鍒犻櫎 ( 涓嶈繃鐞嗚涓婂彧鏈夊洖搴撲箣鍚庢墠浼氭洿鏂扮墿鏂欑殑 , 鎵�互鐗╂枡涓嶅彲鑳戒负绌�)
                         needUpdateLocCntrRelList.Add(locCntrRel);
-                        needUpdateCgDetailList.Add(cgDetail);
                         needDeleteDataList.Add(outboundData);
                     }
                 }
@@ -172,6 +247,18 @@
                         return;
                     }
 
+                    if (needDeleteCgDetailList.Count > 0 && db.Deleteable(needDeleteCgDetailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        LogHelper.Info($"杞锛氬嚭搴撲俊鎭悓姝ワ細鏍规嵁ERP淇℃伅, 鍒犻櫎鏃х墿鏂欐槑缁嗚〃澶辫触! " + JsonConvert.SerializeObject(needDeleteCgDetailList));
+                        return;
+                    }
+
+                    if (needUpdateCntrList.Count > 0 && db.Updateable(needUpdateCntrList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        LogHelper.Info($"杞锛氬嚭搴撲俊鎭悓姝ワ細鏍规嵁ERP淇℃伅, 鏇存柊瀹瑰櫒琛ㄥけ璐� " + JsonConvert.SerializeObject(needUpdateCntrList));
+                        return;
+                    }
+
                     if (needUpdateLocCntrRelList.Count > 0 && db.Updateable<TN_Loc_Container>(needUpdateLocCntrRelList).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
                         LogHelper.Info($"杞锛氬嚭搴撲俊鎭悓姝ワ細鏍规嵁ERP淇℃伅锛屾洿鏂拌揣浣嶅鍣ㄥ叧绯昏〃澶辫触锛� + JsonConvert.SerializeObject(needUpdateLocCntrRelList));
diff --git a/core/WCSCore.cs b/core/WCSCore.cs
index b243075..c1b285a 100644
--- a/core/WCSCore.cs
+++ b/core/WCSCore.cs
@@ -153,10 +153,10 @@
                     return;
                 }
 
-                var cgDetail = db.Queryable<TN_CG_Detail>()
-                    .Where(d => d.S_CNTR_CODE == tn_task.S_CNTR_CODE).First();
+                var cgDetailList = db.Queryable<TN_CG_Detail>()
+                    .Where(d => d.S_CNTR_CODE == tn_task.S_CNTR_CODE).ToList();
 
-                if (cgDetail == null) {
+                if (cgDetailList.Count == 0) {
                     LogHelper.Info("璁剧疆缁堢偣璐т綅澶辫触锛氬綋鍓嶄换鍔$殑鎵樼洏鍙峰湪鐗╂枡琛ㄤ腑涓嶅瓨鍦�);
                     return;
                 }
@@ -171,11 +171,11 @@
                     var weight_str = data[0].parameter_varchar200_up.Split(';')[1].Split('-')[1];
 
                     var weight = float.Parse(weight_str);
-                    cgDetail.F_WEIGHT = weight;
+                    cgDetailList.ForEach(d => d.F_WEIGHT = weight);
                     tn_task.F_WEIGHT = weight;
 
                     using (var tran = db.Ado.UseTran()) {
-                        if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => it.F_WEIGHT).ExecuteCommand() <= 0) {
+                        if (db.Updateable<TN_CG_Detail>(cgDetailList).UpdateColumns(it => it.F_WEIGHT).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
                             LogHelper.Info("淇敼鐗╂枡琛ㄩ噸閲忓け璐�);
                             return;
@@ -210,7 +210,7 @@
                 //row -= 100; // 111-118 => 1-8
 
                 // 鍙綋涔嬪墠鎸囧畾缁堢偣璐ф灦鍚庯紝鎵嶅皾璇曡绠楃粓鐐硅揣浣�-                if (cgDetail.F_WEIGHT > 2000) {
+                if (tn_task.F_WEIGHT > 2000) {
                     // 閲嶉噺瓒呰繃 2t 
                     endLoc = null;
                     LogHelper.Info("閲嶉噺瓒呰繃2t锛屼笉鍏佽鍏ュ簱");
@@ -234,13 +234,13 @@
 
                     return; // 瓒呴噸浼氳嚜宸眗eturn锛屽鏋滃浗鑷猘gv娌℃帴鍙楀埌涔熶笉闇�鎻愬墠return
                 }
-                else if (cgDetail.F_WEIGHT > 1500) {
+                else if (tn_task.F_WEIGHT > 1500) {
                     // 閲嶉噺瓒呰繃1.5t锛岄渶瑕侀�鎷�-2灞傝揣鏋�                     endLoc = db.Queryable<TN_Location>()
                         .First(a => a.N_ROW == row && a.N_LAYER <= 2
                         && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y");
                 }
-                else if (cgDetail.F_WEIGHT > 0) {
+                else if (tn_task.F_WEIGHT > 0) {
                     // 閲嶉噺鏈秴杩�.5t锛屽湪鎸囧畾璐ф灦闅忎究閫夋嫨1涓�                     endLoc = db.Queryable<TN_Location>().Where(a => a.N_ROW == row
                         && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y")
@@ -249,7 +249,7 @@
                 else {
                     // 娌℃湁鎺ユ敹鍒伴噸閲忥紝鎴栭噸閲忓嚭閿�                     endLoc = null;
-                    LogHelper.Info($"閿欒鐨勯噸閲忎俊鎭細{cgDetail.F_WEIGHT}");
+                    LogHelper.Info($"閿欒鐨勯噸閲忎俊鎭細{tn_task.F_WEIGHT}");
                     return;
                 }
 
@@ -332,10 +332,10 @@
 
             try {
 
-                var cgDetail = db.Queryable<TN_CG_Detail>()
-                    .Where(d => d.S_CNTR_CODE == tn_task.S_CNTR_CODE).First();
+                var cgDetailList = db.Queryable<TN_CG_Detail>()
+                    .Where(d => d.S_CNTR_CODE == tn_task.S_CNTR_CODE).ToList();
 
-                if (cgDetail == null) {
+                if (cgDetailList == null) {
                     LogHelper.Info("鏇存柊鐗╂枡閲嶉噺澶辫触锛氬綋鍓嶄换鍔$殑鎵樼洏鍙峰湪鐗╂枡琛ㄤ腑涓嶅瓨鍦�);
                     return;
                 }
@@ -349,9 +349,9 @@
                 var weight_str = data[0].parameter_varchar200_up.Split(';')[1].Split('-')[1];
 
                 var weight = float.Parse(weight_str);
-                cgDetail.F_WEIGHT = weight;
-
-                if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => it.F_WEIGHT).ExecuteCommand() <= 0) {
+                cgDetailList.ForEach(a => a.F_WEIGHT = weight);
+                
+                if (db.Updateable<TN_CG_Detail>(cgDetailList).UpdateColumns(it => it.F_WEIGHT).ExecuteCommand() <= 0) {
                     LogHelper.Info("淇敼鐗╂枡琛ㄩ噸閲忓け璐�);
                     return;
                 }

--
Gitblit v1.9.1