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