Просмотр исходного кода

Merge branch 'dev' of http://123.60.180.165:4647/ZZYDOP/DOPCore into dev

Murphy 2 лет назад
Родитель
Сommit
c5fcd11683

+ 18 - 1
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/BomChildExamineDto.cs

@@ -252,10 +252,15 @@ namespace Business.ResourceExamineManagement.Dto
         public int stock_state { get; set; }
 
         /// <summary>
-        /// 单个产品总需要用量
+        /// 单个产品总需要用量(含损耗率+固定损耗量)
         /// </summary>
         public decimal needCount { get; set; }
 
+        /// <summary>
+        /// 单个产品总需要用量(不含损耗率和固定损耗量)
+        /// </summary>
+        public decimal? needCountNoloss { get; set; }
+
         /// <summary>
         /// 是否使用此物料
         /// </summary>
@@ -275,6 +280,18 @@ namespace Business.ResourceExamineManagement.Dto
         /// 供应提前期
         /// </summary>
         public int PurLT { get; set; }
+
+        /// <summary>
+        /// 损耗率
+        /// </summary>
+        [Comment("损耗率")]
+        public decimal? Scrap { get; set; }
+
+        /// <summary>
+        /// 固定损耗量
+        /// </summary>
+        [Comment("固定损耗量")]
+        public decimal? wastage { get; set; }
     }
 
     /// <summary>

+ 64 - 2
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -1502,7 +1502,8 @@ namespace Business.Replenishment
                 //循环平铺整个资源检查的物料库存情况、缺料情况,子集缺料需要用父级缺料*子集使用数量-
                 var parent = returnlist.Find(s => s.fid == item.parent_id);
                 //当前物料总共需要数量
-                item.needCount = parent.needCount * item.qty;
+                item.needCount = Math.Ceiling(parent.needCount * item.qty * (1 + (item.Scrap.GetValueOrDefault() / 100)) + item.wastage.GetValueOrDefault());
+                item.needCountNoloss = parent.needCount * item.qty;
             }
         }
 
@@ -3202,10 +3203,11 @@ namespace Business.Replenishment
                 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);
-
+            
             DataInitialization(boms, bangid, icitemlist, stocklist, pretreatments, sklist);
             if (!planCheck)
             {
@@ -4372,5 +4374,65 @@ namespace Business.Replenishment
             }
             return result;
         }
+
+        public void AsyncItemStockFromWMS(List<b_bom_pretreatment> bom_Pretreatments)
+        {
+            //产品编码
+            var itemList = bom_Pretreatments.Select(a => a.item_number).Distinct().ToList();
+            List<string> itemChildList = new List<string>();
+            itemChildList.AddRange(itemList);
+            if (!itemChildList.Any())
+            {
+                return;
+            }
+            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)
+            {
+                var num = items.Find(x => x.number == stockWMS.ItemNum);
+                if (num != 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.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)
+            {
+                _businessDbContext.BulkInsert(needAddList);
+            }
+            _businessDbContext.BulkUpdate(mysqlStock);
+        }
     }
 }

+ 3 - 2
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -543,7 +543,8 @@ namespace Business.ResourceExamineManagement
                 //循环平铺整个资源检查的物料库存情况、缺料情况,子集缺料需要用父级缺料*子集使用数量-
                 var parent = returnlist.Find(s => s.fid == item.parent_id);
                 //当前物料总共需要数量
-                item.needCount = parent.needCount * item.qty;
+                item.needCount = Math.Ceiling(parent.needCount * item.qty * (1 + (item.Scrap.GetValueOrDefault() / 100)) + item.wastage.GetValueOrDefault());
+                item.needCountNoloss = parent.needCount * item.qty;
             }
         }
 
@@ -590,7 +591,7 @@ namespace Business.ResourceExamineManagement
             else
             {
                 //判断缺料数量
-                item.self_lack_qty = parent.lack_qty * item.qty;
+                item.self_lack_qty = Math.Ceiling(parent.lack_qty * item.qty * (1 + (item.Scrap.GetValueOrDefault() / 100)) + item.wastage.GetValueOrDefault());
                 item.lack_qty = item.self_lack_qty - item.sqty;
                 item.lack_qty = item.lack_qty < 0 ? 0 : item.lack_qty;
                 //判断状态

+ 5 - 3
MicroServices/Business/Business.Application/ResourceExamineManagement/PretreatmentAppService.cs

@@ -130,6 +130,8 @@ namespace Business.ResourceExamineManagement
                     cdto.Op = c.Op;
                     cdto.clean_leadtime = icitem.clean_leadtime;
                     cdto.PurLT = icitem.PurLT;
+                    cdto.Scrap = c.scrap.GetValueOrDefault();
+                    cdto.wastage = c.wastage.GetValueOrDefault();
                     //递归寻找子级
                     GetBomList(bomlist, bomchildlist, icitemlist, cdto, returnlist, type, orderNum);
                 }
@@ -164,9 +166,12 @@ namespace Business.ResourceExamineManagement
                         childDto.item_number = icitem.number;
                         childDto.Op = c.Op;
                         childDto.clean_leadtime = icitem.clean_leadtime;
+                        childDto.Scrap = c.scrap.GetValueOrDefault();
+                        childDto.wastage = c.wastage.GetValueOrDefault();
                         returnlist.Add(childDto);
                     }
                 }
+                idx++;
             }
 
         }
@@ -222,9 +227,6 @@ namespace Business.ResourceExamineManagement
                                 dtlitem.haveicsubs = 1;
                             }
                         }
-
-
-
                     }
                 }
             }

+ 11 - 4
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -474,7 +474,7 @@ namespace Business.ResourceExamineManagement
                         await _mysql_mes_morder.UpdateManyAsync(mesMorder);
                     }
                     //删除当前日期下一天开始的工单排产记录
-                    _periodSequenceDet.Delete(p=>p.PlanDate >scheTime.Date && p.Domain == domain);
+                    _periodSequenceDet.Delete(p=>p.PlanDate >scheTime.Date && p.Domain == domain && p.OrdQty != 0);
                     _scheduleResultOpMaster.Delete(p=>p.WorkDate > scheTime.Date && p.Domain == domain);
 
                     //添加工单工序准备开始时间记录
@@ -493,7 +493,7 @@ namespace Business.ResourceExamineManagement
                     var tdSeqDtls = periodSequenceDtls.Where(p => p.PlanDate == scheTime.Date).ToList();
                     var tdSchMsts = scheduleMasters.Where(p => p.WorkDate == scheTime.Date).ToList();
                     //删除数据库中的已存在的当天日计划
-                    _periodSequenceDet.Delete(p=>p.Domain == domain && tdSeqDtls.Select(m => m.Op).Contains(p.Op) && tdSeqDtls.Select(m => m.WorkOrds).Contains(p.WorkOrds) && p.PlanDate == scheTime.Date);
+                    _periodSequenceDet.Delete(p=>p.Domain == domain && tdSeqDtls.Select(m => m.Op).Contains(p.Op) && tdSeqDtls.Select(m => m.WorkOrds).Contains(p.WorkOrds) && p.PlanDate == scheTime.Date && p.OrdQty != 0);
                     _scheduleResultOpMaster.Delete(p=>p.Domain == domain && tdSchMsts.Select(m => m.Op).Contains(p.Op) && tdSchMsts.Select(m => m.WorkOrd).Contains(p.WorkOrd) && p.WorkDate == scheTime.Date);
                     //更新当天日计划的计划数量,排产数量
                     foreach (var item in periodSequenceDtls)
@@ -3830,6 +3830,9 @@ namespace Business.ResourceExamineManagement
                 var mLCalendars = calendars.Where(p => p.ProdLine == item.ProdLine || string.IsNullOrEmpty(p.ProdLine)).ToList();
                 //当前产线的休息时间设置
                 var mlqtyWorkDtls = qualityLines.Where(p => p.ProdLine == item.ProdLine).ToList();
+                //计算产线实际开始时间
+                workStartTime = CalcActStartTime(item.ProdLine, workStartTime, mLCalendars, mlqtyWorkDtls);
+
                 LineStartDto lineStart = new LineStartDto();
                 lineStart.RecID = 0;
                 lineStart.Line = item.ProdLine;
@@ -4015,12 +4018,16 @@ namespace Business.ResourceExamineManagement
             //当天排产结束时间
             scheduledDto.EndTime = workPoints.Last().EndPoint;
             //计算starttime处于那个工作时间段
-            var curPoint = workPoints.Where(p => startTime >= p.StartPoint && startTime <= p.EndPoint).First();
+            var curPoint = workPoints.Where(p => startTime >= p.StartPoint && startTime <= p.EndPoint).FirstOrDefault();
             //开始时间不在工作时间段
             if (curPoint == null)
             {
                 //获取离开始时间最近的时间段
-                curPoint = workPoints.Where(p => p.EndPoint < startTime).OrderBy(p => p.Level).Last();
+                curPoint = workPoints.Where(p => p.EndPoint < startTime).OrderBy(p => p.Level).LastOrDefault();
+                if (curPoint == null)
+                {
+                    curPoint = workPoints.Where(p => startTime < p.StartPoint).OrderBy(p => p.Level).FirstOrDefault();
+                }
                 startTime = curPoint.EndPoint;
             }
             TimeSpan span = curPoint.EndPoint - startTime;

+ 46 - 57
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);
@@ -994,7 +995,8 @@ namespace Business.ResourceExamineManagement
                     }
                     if (bomExamineList.Any())
                     {
-                        _businessBangDbContext.BulkInsert(bomExamineList.OrderBy(s => s.num_order).ToList());
+                        await _mysql_bom_child_examine.InsertManyAsync(bomExamineList);
+                        //_businessBangDbContext.BulkInsert(bomExamineList.OrderBy(s => s.num_order).ToList());
                     }
                     if (mooccupyList.Any())
                     {
@@ -1555,7 +1557,7 @@ namespace Business.ResourceExamineManagement
             }
 
             //获取订单行数据  progress == "2"已做检查但是未评审的订单行
-            //sentrys = sentrys.Where(s => s.progress == "2").ToList();
+            sentrys = sentrys.Where(s => s.progress == "2").ToList();
             if (!sentrys.Any())
             {
                 new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "订单行数据不存在", _currentTenant.Id.ToString());
@@ -2858,7 +2860,7 @@ namespace Business.ResourceExamineManagement
                             mo.morder_state = MorderEnum.Xd_state;
                         }
                     }
-                    await _mysql_mes_morder.UpdateManyAsync(morders);
+                    
                     if (workords.Length > 0)
                     {
                         workords = workords.Substring(1, workords.Length - 1);
@@ -2866,8 +2868,10 @@ namespace Business.ResourceExamineManagement
                         var pickRst = await CreatePickBill(workords, domain, userAccount);
                         if (pickRst != "ok")
                         {
+                            new NLogHelper("ResourceExamineAppService").WriteLog("CreatePickBill", "生成领料单相关数据更新失败:" + pickRst, _currentTenant.Id.ToString());
                             return pickRst;
                         }
+                        await _mysql_mes_morder.UpdateManyAsync(morders);
                         var insertList = GetCopyOP(workords, domain);
                         if (insertList.Any())
                         {
@@ -2912,6 +2916,7 @@ namespace Business.ResourceExamineManagement
                             var pickRst = await CreatePickBill(morders[0].morder_no, domain, userAccount);
                             if (pickRst != "ok")
                             {
+                                new NLogHelper("ResourceExamineAppService").WriteLog("CreatePickBill", "生成领料单相关数据更新失败:" + pickRst, _currentTenant.Id.ToString());
                                 return pickRst;
                             }
                             morders[0].morder_state = MorderEnum.Xd_state;
@@ -3196,6 +3201,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 +3905,58 @@ 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(itemList);
+            if (!itemChildList.Any())
             {
-                itemChildList.AddRange(GetChildItemNumber(a, new List<string>()));
-            });
+                return;
+            }
             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 +3964,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>
         /// 生成领料单
@@ -4073,7 +4071,6 @@ namespace Business.ResourceExamineManagement
                     }
                 }
 
-
                 //清理掉库存占用  这里考虑的是资源检查的占用没有完全占用备料单数据,而其他数据再进行齐套检查时,无法考虑到备料单的占用。
                 var itemstockoccupy = _mysql_ic_item_stockoccupy.GetListAsync(s => workOrdMasters.Select(x => x.WorkOrd).Contains(s.morder_mo) && s.factory_id.ToString() == domain).Result;
                 var icitem = _mysql_ic_item.GetListAsync(s => s.factory_id.ToString() == domain && nbrDetailList.Select(c => c.ItemNum).Contains(s.number)).Result;
@@ -4255,20 +4252,12 @@ namespace Business.ResourceExamineManagement
                             woDetail.Status = "";
                             woDetail.IsActive = true;
                             woDetail.CreateTime = DateTime.Now;
-                            decimal needCount = caleList.Sum(c => c.needCount.GetValueOrDefault());
-                            foreach (var structure in caleList)
-                            {
-                                if (woDetail.Op > structure.Op)
-                                {
-                                    woDetail.Op = structure.Op;
-                                }
-                                var psm = productStructureMs.Find(x => x.ParentItem == item.morder_no && x.ComponentItem == structure.item_number);
-                                woDetail.Yield = psm == null ? 0 : psm.Scrap / 100;
-                                woDetail.QtyRequired += structure.needCount.GetValueOrDefault() * (1 + woDetail.Yield);
-                            }
+                            woDetail.QtyRequired= caleList.Sum(c => c.needCount.GetValueOrDefault());
+                            woDetail.Yield = caleList.Max(x => x.Scrap.GetValueOrDefault());
+                            decimal needCount = caleList.Sum(c => c.needCountNoloss.GetValueOrDefault());
                             if (needCount != 0)
                             {
-                                woDetail.FrozenBOMQty = woDetail.QtyRequired / needCount;
+                                woDetail.FrozenBOMQty = Math.Round(woDetail.QtyRequired / needCount, 8);
                             }
                             workOrdDetails.Add(woDetail);
                         }

+ 10 - 32
MicroServices/Business/Business.Application/SystemJobManagement/SystemJobAppService.cs

@@ -599,19 +599,10 @@ namespace Business.SystemJobManagement
         //同步物料
         public void SyncItemMaster()
         {
-            bool isAll = true;//是否同步所有物料
+            //bool isAll = true;//是否同步所有物料
             var ic_itemList = _mysql_ic_item.GetListAsync().Result;
             List<ItemMaster> custList = new List<ItemMaster>();
-            if (isAll)
-            {
-                custList = _itemMaster.Select(a => a.IsActive);
-            }
-            else
-            {
-                //格努产品编码同步子级物料
-                List<string> childItems = GetChildItemNumber("", new List<string>());
-                custList = _itemMaster.Select(a => a.IsActive && childItems.Distinct().Contains(a.ItemNum));
-            }
+            custList = _itemMaster.Select(a => a.IsActive);
             List<ic_item> ItemsAdd = new List<ic_item>();
             List<ic_item_stock> stockAdd = new List<ic_item_stock>();
             List<ic_item> ItemsUpd = new List<ic_item>();
@@ -791,8 +782,8 @@ namespace Business.SystemJobManagement
                     if (icbom == null)
                     {
                         long domain = Convert.ToInt64(ItemList.First().Domain);
-                        long factory_id = domain % 1000;
-                        long tenant_id = domain - factory_id;
+                        long factory_id = domain % 8010;
+                        //long tenant_id = domain - factory_id;
                         var bom = new ic_bom(help.NextId())
                         {
                             bom_number = c,
@@ -832,7 +823,8 @@ namespace Business.SystemJobManagement
                                 IsDeleted = false,
                                 Op = child.Op,
                                 use_status = 1,
-                                scrap = child.Scrap
+                                scrap = child.Scrap,
+                                wastage = child.QtyConsumed
                             };
                             childItemsAdd.Add(bomchild);
                         }
@@ -867,7 +859,8 @@ namespace Business.SystemJobManagement
                                     IsDeleted = false,
                                     Op = child.Op,
                                     use_status = 1,
-                                    scrap = child.Scrap
+                                    scrap = child.Scrap,
+                                    wastage = child.QtyConsumed
                                 };
                                 childItemsAdd.Add(bomchild);
                             }
@@ -883,12 +876,11 @@ namespace Business.SystemJobManagement
                                 icbomchild.tenant_id = item.company_id;
                                 icbomchild.Op = child.Op;
                                 icbomchild.scrap = child.Scrap;
+                                icbomchild.wastage = child.QtyConsumed;
                                 childItemsUpd.Add(icbomchild);
                             }
                         }
                     }
-
-
                 }
                 _businessDbContext.BulkInsert(ItemsAdd);
                 _businessDbContext.BulkInsert(childItemsAdd);
@@ -896,21 +888,7 @@ namespace Business.SystemJobManagement
             }
         }
 
-        //循环获取子级物料编码,包括产品本身,有重复的结果去重即可
-        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;
-        }
+        
 
         public string DoProductScheduleJob()
         {

+ 6 - 0
MicroServices/Business/Business.Domain/MongoDB/MES/IC/mo_ic_bom_child.cs

@@ -67,6 +67,12 @@ namespace Business.Domain
         [Comment("损耗率")]
         public decimal? scrap { get; set; }
         /// <summary>
+        /// 固定损耗量
+        /// </summary>
+        [Precision(23, 10)]
+        [Comment("固定损耗量")]
+        public decimal? wastage { get; set; }
+        /// <summary>
         /// 是否倒冲
         /// </summary>
         [Comment("是否倒冲")]

+ 22 - 1
MicroServices/Business/Business.Domain/StructuredDB/Bang/b_bom_child_examine.cs

@@ -278,12 +278,19 @@ namespace Business.Domain
         public int? stock_state { get; set; }
 
         /// <summary>
-        /// 单个产品总需要用量
+        /// 单个产品总需要用量(含损耗率和固定损耗量)
         /// </summary>
         [Comment("单个产品总需要用量")]
         [Precision(23, 10)]
         public decimal? needCount { get; set; }
 
+        /// <summary>
+        /// 单个产品总需要用量(不含损耗率和固定损耗量)
+        /// </summary>
+        [Comment("总需要用量")]
+        [Precision(23, 10)]
+        public decimal? needCountNoloss { get; set; }
+
         /// <summary>
         /// 是否使用此物料
         /// </summary>
@@ -295,5 +302,19 @@ namespace Business.Domain
         /// </summary>
         [Comment("工序")]
         public int Op { get; set; }
+
+        /// <summary>
+        /// 损耗率
+        /// </summary>
+        [Comment("损耗率")]
+        [Precision(23, 10)]
+        public decimal? Scrap { get; set; }
+
+        /// <summary>
+        /// 固定损耗量
+        /// </summary>
+        [Comment("固定损耗量")]
+        [Precision(12, 5)]
+        public decimal? wastage { get; set; }
     }
 }

+ 12 - 0
MicroServices/Business/Business.Domain/StructuredDB/Bang/b_bom_pretreatment.cs

@@ -188,5 +188,17 @@ namespace Business.Domain
         [StringLength(80)]
         [Comment("供应提前期")]
         public int PurLT { get; set; }
+
+        /// <summary>
+        /// 损耗率
+        /// </summary>
+        [Comment("损耗率")]
+        public decimal? Scrap { get; set; }
+
+        /// <summary>
+        /// 固定损耗量
+        /// </summary>
+        [Comment("固定损耗量")]
+        public decimal? wastage { get; set; }
     }
 }

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ProductStructureMaster.cs

@@ -81,6 +81,12 @@ namespace Business.Domain
         [Comment("损耗率")]
         public decimal Scrap { get; set; }
 
+        /// <summary>
+        /// 固定损耗量
+        /// </summary>
+        [Comment("固定损耗量")]
+        public decimal QtyConsumed { get; set; }
+
         /// <summary>
         /// 版本
         /// </summary>

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ic_bom_child.cs

@@ -70,6 +70,12 @@ namespace Business.Domain
         [Comment("损耗率")]
         public decimal? scrap { get; set; }
         /// <summary>
+        /// 固定损耗量
+        /// </summary>
+        [Precision(12, 5)]
+        [Comment("固定损耗量")]
+        public decimal? wastage { get; set; }
+        /// <summary>
         /// 是否倒冲
         /// </summary>
         [Comment("是否倒冲")]