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

---
 core/Monitor.cs |  189 ++++++++++++++++++++++++++++++++++------------
 1 files changed, 138 insertions(+), 51 deletions(-)

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));

--
Gitblit v1.9.1