浏览代码

BOM增加损耗率计算。

tangdi 2 年之前
父节点
当前提交
e870586560

+ 18 - 24
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -3739,7 +3739,7 @@ namespace Business.Replenishment
             //工单工艺路线表
             WorkOrdRouting woRouting;
             //工单物料表
-            WorkOrdDetail woDetail;
+            var productStructureMs = _productStructureMaster.Select(x => morders.Select(c => c.morder_no).Contains(x.ParentItem) && x.Domain == param.factoryId.ToString());
             foreach (var item in morders)
             {
                 //添加工单数据
@@ -3794,29 +3794,23 @@ namespace Business.Replenishment
                     {
                         foreach (var structure in returnList)
                         {
-                            woDetail = workOrdDetails.Find(s => s.ItemNum == structure.item_number && s.WorkOrd == item.morder_no);
-                            if (woDetail == null)
-                            {
-                                //添加工单的物料信息
-                                woDetail = new WorkOrdDetail();
-                                woDetail.Domain = item.factory_id.ToString();
-                                woDetail.WorkOrd = item.morder_no;
-                                woDetail.Op = structure.Op;
-                                woDetail.ItemNum = structure.item_number;
-                                woDetail.QtyRequired = structure.needCount.GetValueOrDefault();
-                                woDetail.QtyPosted = 0m;
-                                woDetail.QtyReturned = 0m;
-                                woDetail.FrozenBOMQty = structure.qty.GetValueOrDefault();
-                                woDetail.Status = "";
-                                woDetail.IsActive = true;
-                                woDetail.CreateTime = DateTime.Now;
-                                workOrdDetails.Add(woDetail);
-                            }
-                            else
-                            {
-                                woDetail.QtyRequired += structure.needCount.GetValueOrDefault();
-                                woDetail.FrozenBOMQty += structure.qty.GetValueOrDefault();
-                            }
+                            var psm = productStructureMs.Find(x => x.ParentItem == item.morder_no && x.ComponentItem == structure.item_number);
+                            WorkOrdDetail woDetail = new WorkOrdDetail();
+                            //添加工单的物料信息
+                            woDetail = new WorkOrdDetail();
+                            woDetail.Domain = item.factory_id.ToString();
+                            woDetail.WorkOrd = item.morder_no;
+                            woDetail.Op = structure.Op;
+                            woDetail.ItemNum = structure.item_number;
+                            woDetail.QtyRequired = structure.needCount.GetValueOrDefault();
+                            woDetail.QtyPosted = 0m;
+                            woDetail.QtyReturned = 0m;
+                            woDetail.FrozenBOMQty = structure.qty.GetValueOrDefault();
+                            woDetail.Status = "";
+                            woDetail.IsActive = true;
+                            woDetail.CreateTime = DateTime.Now;
+                            woDetail.Yield = psm == null ? 0 : psm.Scrap;
+                            workOrdDetails.Add(woDetail);
                         }
                     }
                 }

+ 90 - 53
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -2407,7 +2407,7 @@ namespace Business.ResourceExamineManagement
                 return "当前任务工厂编号为空,请检查。";
             }
             List<string> tsWork = new List<string> { "test", "tcn", "rw" };
-            var ordlist = _workOrdMaster.Select(x => x.Domain == domain && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && x.Status.ToLower() == "p").ToList();
+            var ordlist = _workOrdMaster.Select(x => x.Domain == domain && x.WorkOrd == "M523101200000351" && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && x.Status.ToLower() == "p").ToList();
             List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => ordlist.Select(c=>c.WorkOrd).Contains(x.morder_no) && x.factory_id.ToString() == domain).Result;
 
             /*//先排除锁定期内的工单 //优先级排序
@@ -3166,6 +3166,10 @@ namespace Business.ResourceExamineManagement
 
             //调用优先级计算算法
             var workOrds = _replenishmentAppService.CalcPriority(mo_Mes_Morders.Select(p => p.morder_no).ToList(), param.factoryId.ToString());
+            //var recid = workOrds.Select(c => c.RecID).ToList();
+            //清理工单物料明细
+            var delWorkOrddetails = _workOrdDetail.Select(x => workOrds.Select(c => c.RecID).Contains((int)x.WorkOrdMasterRecID) && x.Domain == param.factoryId.ToString());
+            var productStructureMs = _productStructureMaster.Select(x => workOrds.Select(c => c.WorkOrd).Contains(x.ParentItem) && x.Domain == param.factoryId.ToString());
             List<mes_morder> priorityMorderList = new List<mes_morder>();
             foreach (var work in workOrds)
             {
@@ -3247,6 +3251,47 @@ namespace Business.ResourceExamineManagement
                 examines.Add(dtl);
             }
             rtn.examines = examines;
+            List<WorkOrdDetail> workOrdDetails = new List<WorkOrdDetail>();
+            foreach (var workord in workOrds)
+            {
+                var exm = examines.Find(s => s.morder_no == workord.WorkOrd);
+                if (exm != null)
+                {
+                    var childs = exm.BomChildExamineList.Where(s => s.is_use == true).ToList();
+
+                    var child = childs.Find(s => s.item_number == workord.ItemNum);
+                    if (child == null)
+                    {
+                        continue;
+                    }
+                    List<BomChildExamineDto> returnList = new List<BomChildExamineDto>();
+                    GetWorkDetalis(childs.Where(s => s.parent_id == child.fid).ToList(), returnList, childs);
+                    if (returnList.Any())
+                    {
+                        foreach (var structure in returnList)
+                        {
+                            var psm = productStructureMs.Find(x => x.ParentItem == workord.ItemNum && x.ComponentItem == structure.item_number);
+                            WorkOrdDetail woDetail = new WorkOrdDetail();
+                            woDetail = new WorkOrdDetail();
+                            woDetail.Domain = param.factoryId.ToString();
+                            woDetail.WorkOrd = workord.WorkOrd;
+                            woDetail.Op = structure.Op;
+                            woDetail.ItemNum = structure.item_number;
+                            woDetail.QtyRequired = structure.needCount;
+                            woDetail.QtyPosted = 0m;
+                            woDetail.QtyReturned = 0m;
+                            woDetail.FrozenBOMQty = structure.qty;
+                            woDetail.Status = "";
+                            woDetail.IsActive = true;
+                            woDetail.CreateTime = DateTime.Now;
+                            woDetail.WorkOrdMasterRecID = workord.RecID;
+                            woDetail.Yield = psm == null ? 0 : psm.Scrap;
+                            workOrdDetails.Add(woDetail);
+                        }
+                    }
+                }
+            }
+            
             if (planCheck)
             {
                 //如果有计划工单,则需要生成pr po oo
@@ -3350,6 +3395,14 @@ namespace Business.ResourceExamineManagement
                             var srmpooccupyInsert = ObjectMapper.Map<List<mo_srm_po_occupy>, List<srm_po_occupy>>(_CalcBomViewAppService.srm_Po_OccupiesInsert);
                             _businessDbContext.BulkInsert(srmpooccupyInsert);
                         }
+                        if (delWorkOrddetails.Any())
+                        {
+                            _businessDbContext.BulkDelete(delWorkOrddetails);
+                        }
+                        if (workOrdDetails.Any())
+                        {
+                            _businessDbContext.BulkInsert(workOrdDetails);
+                        }
                         await unitOfWork.CompleteAsync();
                     }
                     catch (Exception e)
@@ -3769,7 +3822,7 @@ namespace Business.ResourceExamineManagement
                             LocationTo = LocationTo,//现在这几条线是同一线边仓,暂时不考虑多个线边仓
                             WorkOrd = workord.WorkOrd,
                             QtyOrd = a.QtyRequired,
-                            CurrQtyOpened = a.QtyRequired,
+                            CurrQtyOpened = Math.Ceiling(a.QtyRequired * (1 + (a.Yield / 100))),
                             Line = i,
                             IsActive = true,
                             CreateTime = DateTime.Now,
@@ -4065,7 +4118,7 @@ namespace Business.ResourceExamineManagement
             //工单工艺路线表
             WorkOrdRouting woRouting;
             //工单物料表
-            WorkOrdDetail woDetail;
+            var productStructureMs = _productStructureMaster.Select(x => morders.Select(c => c.morder_no).Contains(x.ParentItem) && x.Domain == param.factoryId.ToString());
             foreach (var item in morders)
             {
                 //添加工单数据
@@ -4127,59 +4180,26 @@ namespace Business.ResourceExamineManagement
                     {
                         foreach (var structure in returnList)
                         {
-                            woDetail = workOrdDetails.Find(s => s.ItemNum == structure.item_number && s.WorkOrd == item.morder_no);
-                            if (woDetail == null)
-                            {
-                                //添加工单的物料信息
-                                woDetail = new WorkOrdDetail();
-                                woDetail.Domain = item.factory_id.ToString();
-                                woDetail.WorkOrd = item.morder_no;
-                                woDetail.Op = structure.Op;
-                                woDetail.ItemNum = structure.item_number;
-                                woDetail.QtyRequired = structure.needCount.GetValueOrDefault();
-                                woDetail.QtyPosted = 0m;
-                                woDetail.QtyReturned = 0m;
-                                woDetail.FrozenBOMQty = structure.qty.GetValueOrDefault();
-                                woDetail.Status = "";
-                                woDetail.IsActive = true;
-                                woDetail.CreateTime = DateTime.Now;
-                                workOrdDetails.Add(woDetail);
-                            }
-                            else
-                            {
-                                woDetail.QtyRequired += structure.needCount.GetValueOrDefault();
-                                woDetail.FrozenBOMQty += structure.qty.GetValueOrDefault();
-                            }
+                            var psm = productStructureMs.Find(x => x.ParentItem == item.morder_no && x.ComponentItem == structure.item_number);
+                            WorkOrdDetail woDetail = new WorkOrdDetail();
+                            //添加工单的物料信息
+                            woDetail = new WorkOrdDetail();
+                            woDetail.Domain = item.factory_id.ToString();
+                            woDetail.WorkOrd = item.morder_no;
+                            woDetail.Op = structure.Op;
+                            woDetail.ItemNum = structure.item_number;
+                            woDetail.QtyRequired = structure.needCount.GetValueOrDefault();
+                            woDetail.QtyPosted = 0m;
+                            woDetail.QtyReturned = 0m;
+                            woDetail.FrozenBOMQty = structure.qty.GetValueOrDefault();
+                            woDetail.Status = "";
+                            woDetail.IsActive = true;
+                            woDetail.CreateTime = DateTime.Now;
+                            woDetail.Yield = psm == null ? 0 : psm.Scrap;
+                            workOrdDetails.Add(woDetail);
                         }
                     }
                 }
-                /*List<ProductStructureMaster> curStructures = GetProductStructure(item.product_code, workOrd.QtyOrded, item.factory_id.ToString());
-                foreach (var structure in curStructures)
-                {
-                    woDetail = workOrdDetails.Find(s => s.ItemNum == structure.ComponentItem);
-                    if (woDetail == null)
-                    {
-                        //添加工单的物料信息
-                        woDetail = new WorkOrdDetail();
-                        woDetail.Domain = item.factory_id.ToString();
-                        woDetail.WorkOrd = item.morder_no;
-                        woDetail.Op = structure.Op;
-                        woDetail.ItemNum = structure.ComponentItem;
-                        woDetail.QtyRequired = structure.Qty;
-                        woDetail.QtyPosted = 0m;
-                        woDetail.QtyReturned = 0m;
-                        woDetail.FrozenBOMQty = structure.Qty;
-                        woDetail.Status = "";
-                        woDetail.IsActive = true;
-                        woDetail.CreateTime = DateTime.Now;
-                        workOrdDetails.Add(woDetail);
-                    }
-                    else
-                    {
-                        woDetail.QtyRequired += structure.Qty;
-                        woDetail.FrozenBOMQty += structure.Qty;
-                    }
-                }*/
             }
         }
 
@@ -4201,6 +4221,23 @@ namespace Business.ResourceExamineManagement
             }
         }
 
+        /// <summary>
+        /// 获取虚拟件明细
+        /// </summary>
+        /// <param name="dtl"></param>
+        /// <param name="returnList"></param>
+        /// <param name="childs"></param>
+        public void GetWorkDetalis(List<BomChildExamineDto> dtl, List<BomChildExamineDto> returnList, List<BomChildExamineDto> childs)
+        {
+            returnList.AddRange(dtl);
+            var rst = childs.Where(s => dtl.Where(x => x.erp_cls == 4).Select(c => c.fid).Contains(s.parent_id.GetValueOrDefault())).ToList();
+            if (rst.Any())
+            {
+                GetWorkDetalis(rst, returnList, childs);
+            }
+            return;
+        }
+
         /// <summary>
         /// 获取虚拟件明细
         /// </summary>

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

@@ -75,6 +75,11 @@ namespace Business.Domain
         [Comment("终止生效")]
         public DateTime? EndEff { get; set; }
 
+        /// <summary>
+        /// 损耗率
+        /// </summary>
+        [Comment("损耗率")]
+        public decimal Scrap { get; set; }
 
         /// <summary>
         /// 版本

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/Production/WorkOrdDetail.cs

@@ -98,5 +98,11 @@ namespace Business.Domain
         /// </summary>
         [Comment("工单主键")]
         public long WorkOrdMasterRecID { get; set; }
+
+        /// <summary>
+        /// 损耗率
+        /// </summary>
+        [Comment("损耗率")]
+        public decimal Yield { get; set; }
     }
 }