Преглед изворни кода

解决物料库存计算问题。

tangdi пре 2 година
родитељ
комит
fac31ab2a1

+ 32 - 42
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -669,7 +669,7 @@ namespace Business.ResourceExamineManagement
             
             //处理销售订单优先级
             sorders = _priorityAppService.CalcOrderPriority(sorders, sentrys);
-            AsyncItemStockFromWMS(sentrys);
+            
             //处理订单行优先级
             sentrys = _priorityAppService.CalcOrderEntryPriority(sorders, sentrys);
 
@@ -699,6 +699,7 @@ namespace Business.ResourceExamineManagement
                 AutoCreateBomBill(param.company_id.ToString(), autoCreates);
                 pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
             }
+            AsyncItemStockFromWMS(pretreatments);
 
             //数据库快照-同步mysql库数据到mongoDB中
             await DbSnapShot(input.company_id, input.factoryId, bangid, pretreatments);
@@ -3196,6 +3197,7 @@ namespace Business.ResourceExamineManagement
                 AutoCreateBomBill(param.company_id.ToString(), autoCreates);
                 pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
             }
+            AsyncItemStockFromWMS(pretreatments);
 
             //增加特殊工单的预处理结果,因为特殊工单是自定义物料清单
             var specialWork = mo_Mes_Morders.Where(x => tsWork.Contains(x.morder_type)).ToList();
@@ -3899,51 +3901,54 @@ namespace Business.ResourceExamineManagement
             }
         }
 
-        public void AsyncItemStockFromWMS(List<crm_seorderentry> sentrys)
+        public void AsyncItemStockFromWMS(List<b_bom_pretreatment> bom_Pretreatments)
         {
             //产品编码
-            var itemList = sentrys.Select(a => a.item_number).Distinct().ToList();
+            var itemList = bom_Pretreatments.Select(a => a.item_number).Distinct().ToList();
             List<string> itemChildList = new List<string>();
-            itemList.ForEach(a =>
-            {
-                itemChildList.AddRange(GetChildItemNumber(a, new List<string>()));
-            });
+            itemChildList.AddRange(itemList);
             List<string> locationList = new List<string> { "1000", "1001", "5008", "8000", "8001" };
+            //取出WMS物料记录
             var stockList = _invMaster.Select(a => a.Domain == param.factoryId.ToString() && locationList.Contains(a.Location) && a.IsActive && itemChildList.Distinct().Contains(a.ItemNum));
+            //WMS物料记录汇总
             var groupList = stockList.
                 GroupBy(m => new { m.ItemNum }).
                 Select(a => new { ItemNum = a.Key.ItemNum, Qty = a.Sum(c => c.QtyOnHand) }).ToList();
+           
+
             var itemNums = groupList.Select(b => b.ItemNum).ToList();//需要处理的dop物料编码集合
+            //根据WMS物料,取出DOP物料数据
             var items = _mysql_ic_item.GetListAsync(a => itemNums.Contains(a.number) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
+
+
             var itemIds = items.Select(b => b.Id).ToList();//需要处理的dop物料id集合
             List<ic_item_stock> mysqlStock = _mysql_ic_item_stock.GetListAsync(a => itemIds.Contains(a.Id) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
             List<ic_item_stock> needAddList = new List<ic_item_stock>();
 
             foreach (var stockWMS in groupList)
             {
-                foreach (var num in items)
+                var num = items.Find(x => x.number == stockWMS.ItemNum);
+                if (num != null)
                 {
-                    if (stockWMS.ItemNum == num.number)
+                    var item = mysqlStock.Find(a => a.Id == num.Id);
+                    if (item != null)
                     {
-                        var item = mysqlStock.Find(a => a.Id == num.Id);
-                        if (item != null)
-                        {
-                            item.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
-                        }
-                        else
-                        {
-                            ic_item_stock stock = new ic_item_stock();
-                            stock.GenerateNewId(help.NextId());
-                            stock.factory_id = param.factoryId;
-                            stock.company_id = param.company_id;
-                            stock.icitem_id = num.Id;
-                            stock.icitem_name = num.name;
-                            stock.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
-                            needAddList.Add(stock);
-                        }
-                        break;
+                        item.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
                     }
-                };
+                    else
+                    {
+                        ic_item_stock stock = new ic_item_stock();
+                        stock.GenerateNewId(help.NextId());
+                        stock.tenant_id = param.company_id;
+                        stock.factory_id = param.factoryId;
+                        stock.company_id = param.company_id;
+                        stock.icitem_id = num.Id;
+                        stock.icitem_number = num.number;
+                        stock.icitem_name = num.name;
+                        stock.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
+                        needAddList.Add(stock);
+                    }
+                }
             }
             if (needAddList.Count > 0)
             {
@@ -3951,21 +3956,6 @@ namespace Business.ResourceExamineManagement
             }
             _businessDbContext.BulkUpdate(mysqlStock);
         }
-        //循环获取子级物料编码,包括产品本身,有重复的结果去重即可
-        public List<string> GetChildItemNumber(string itemNum, List<string> list)
-        {
-            list.Add(itemNum);
-            var productStructures = _productStructureMaster.Select(p => p.ParentItem == itemNum && p.Domain == "1001" && p.IsActive);
-            list.AddRange(productStructures.Select(a => a.ComponentItem));
-            foreach (var item in productStructures)
-            {
-                if (item.StructureType.ToUpper() == "X")
-                {
-                    GetChildItemNumber(item.ComponentItem, list);
-                }
-            }
-            return list;
-        }
 
         /// <summary>
         /// 生成领料单