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

+ 200 - 8
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -3117,7 +3117,7 @@ namespace Business.Replenishment
                 weekPlan[i].ProductionOrder = morder_noList[i].NbrResult;
                 weekPlan[i].OrderNO = OrderNOList[i].NbrResult;
             }
-            await PlanOrderResourceCheck(moList.OrderBy(a=>a.moentry_sys_stime).ToList(), moentryList, bang_id,"", input);
+            await PlanOrderResourceCheck(moList.OrderBy(a=>a.moentry_sys_stime).ToList(), moentryList, bang_id,"",false);
 
             var examine_resultList = _mysql_examine_result.GetListAsync(a => a.bangid == bang_id).Result;
             await _businessDbContext.BulkInsertAsync(moList);
@@ -3272,7 +3272,7 @@ namespace Business.Replenishment
                 moentryList[i].moentry_mono = morder_noList[i].NbrResult;
                 weekplans[i].ProductionOrder = morder_noList[i].NbrResult;
             }
-            await PlanOrderResourceCheck(moList.OrderBy(a => a.moentry_sys_stime).ToList(), moentryList, bang_id, "", input);
+            await PlanOrderResourceCheck(moList.OrderBy(a => a.moentry_sys_stime).ToList(), moentryList, bang_id, "",false);
 
             var examine_resultList = _mysql_examine_result.GetListAsync(a => a.bangid == bang_id).Result;
             await _businessDbContext.BulkInsertAsync(moList);
@@ -4004,6 +4004,40 @@ namespace Business.Replenishment
             }
         }
 
+
+        /// <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, List<ProductStructureOp> productOps)
+        {
+            returnList.AddRange(dtl.Where(x => x.erp_cls != 4).ToList());
+            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())
+            {
+                if (productOps.Any())
+                {
+                    //rst  虚拟件的子物料
+                    foreach (var item in rst)
+                    {
+                        var parent = childs.Find(x => x.fid == item.parent_id);
+                        if (parent != null)
+                        {
+                            var proOp = productOps.Find(x => x.ParentItem == parent.item_number && x.ComponentItem == item.item_number);
+                            if (proOp != null)
+                            {
+                                item.Op = proOp.Op;
+                            }
+                        }
+                    }
+                }
+                GetWorkDetalis(rst, returnList, childs, productOps);
+            }
+            return;
+        }
+
         /// <summary>
         /// 获取虚拟件明细
         /// </summary>
@@ -4259,10 +4293,88 @@ namespace Business.Replenishment
                 var isExistSamePriority= _replenishmentWeekPlan.FindAsync(a => a.Id != id && a.Week == weekPlan.Week && a.Priority == newpriority).Result;
                 if(isExistSamePriority!=null)
                     return "优先级重复,请重新调整。";
+
                 weekPlan.Priority= newpriority;
                 weekPlan.Qty= newqty;
-                weekPlan.InStockDate= newinstockdate;
-                await _replenishmentWeekPlan.UpdateAsync(weekPlan);
+                //newinstockdate其实传的的工单开工日期
+                weekPlan.PlanStartDate= newinstockdate;
+
+                if(!string.IsNullOrEmpty(weekPlan.ProductionOrder))
+                {
+                    long bang_id = help.NextId();
+                    var moList = _mysql_mes_morder.GetListAsync(a => a.morder_no == weekPlan.ProductionOrder && a.factory_id == factoryid).Result;
+                    var moentryList = _mysql_mes_moentry.GetListAsync(a => a.moentry_mono == weekPlan.ProductionOrder && a.factory_id == factoryid).Result;
+                    var workmasterList = _workOrdMaster.Select(a => a.WorkOrd == weekPlan.ProductionOrder && a.Domain == factory_id);
+                    var workRoutings = _workOrdRouting.Select(a => a.WorkOrd == weekPlan.ProductionOrder && a.Domain == factory_id);
+                    //判断
+                    if (moList.Count > 0 && (moList[0].morder_state == MorderEnum.Initial_state || string.IsNullOrEmpty(moList[0].morder_state)) 
+                        && workmasterList.Count > 0 && (string.IsNullOrEmpty(workmasterList[0].Status) || workmasterList[0].Status == "p"))
+                    {
+                        moList[0].moentry_sys_stime = newinstockdate;
+                        moList[0].need_number = newqty;
+                        moList[0].morder_production_number = newqty;
+
+                        moentryList[0].need_number = newqty;
+                        moentryList[0].morder_production_number = newqty;
+
+                        workmasterList[0].OrdDate = newinstockdate;
+                        workmasterList[0].Priority = newpriority;
+                        workmasterList[0].QtyOrded = newqty;
+
+                        workRoutings?.ForEach(a =>
+                        {
+                            a.QtyOrded = newqty;
+                        });
+
+                        await PlanOrderResourceCheck(moList.OrderBy(a => a.moentry_sys_stime).ToList(), moentryList, bang_id, "", true);
+
+                        var examine_resultList = _mysql_examine_result.GetListAsync(a => a.bangid == bang_id).Result;
+                        if (weekPlan.IsReplenishmentModel == "N")
+                        {
+                            var moItem = examine_resultList.Find(b => b.morder_no == weekPlan.ProductionOrder);
+                            List<RoutingOpDetail> routingOp = routingOps.Where(x => x.RoutingCode == weekPlan.ItemNumber).ToList();
+                            //组装标准工时
+                            var Assembly = routingOp.Where(x => x.Ufld1 == "组装" && x.MilestoneOp).FirstOrDefault();
+                            //热封标准工时
+                            var HeatSealing = routingOp.Where(x => x.Ufld1 == "热封" && x.MilestoneOp).FirstOrDefault();
+                            //包装标准工时
+                            var Packaging = routingOp.Where(x => x.Descr == "包装" && x.MilestoneOp).FirstOrDefault();
+                            if (moItem != null && moItem.kitting_times < weekPlan.PlanStartDate)
+                            {
+                                weekPlan.ItemStatus = "齐套";
+                                weekPlan.PlanKittingDate = moItem.kitting_times;
+                                weekPlan.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * weekPlan.Qty;
+                                weekPlan.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * weekPlan.Qty;
+                                weekPlan.PackageHours = Packaging == null ? 0 : Packaging.RunTime * weekPlan.Qty;
+                                weekPlan.TotalHours = weekPlan.AssembleHours + weekPlan.HeatSealHours + weekPlan.PackageHours;
+                            }
+                            else
+                            {
+                                weekPlan.ItemStatus = "欠料";
+                                weekPlan.PlanKittingDate = moItem.kitting_times;
+                                weekPlan.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * weekPlan.Qty;
+                                weekPlan.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * weekPlan.Qty;
+                                weekPlan.PackageHours = Packaging == null ? 0 : Packaging.RunTime * weekPlan.Qty;
+                                weekPlan.TotalHours = weekPlan.AssembleHours + weekPlan.HeatSealHours + weekPlan.PackageHours;
+                            }
+                        }
+                        await _replenishmentWeekPlan.UpdateAsync(weekPlan);
+                        await _mysql_mes_morder.UpdateManyAsync(moList);
+                        await _mysql_mes_moentry.UpdateManyAsync(moentryList);
+                        _workOrdMaster.Update(workmasterList);
+                        _workOrdRouting.Update(workRoutings);
+                    }
+                    else
+                    {
+                        return "工单不是初始状态,不允许调整。";
+                    }
+                }
+                else
+                {
+                    await _replenishmentWeekPlan.UpdateAsync(weekPlan);
+                    return "ok";
+                }
+
             }
             catch(Exception e)
             {
@@ -4313,7 +4425,7 @@ namespace Business.Replenishment
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        public async Task<string> PlanOrderResourceCheck(List<mes_morder> Mes_Morders, List<mes_moentry> moentryList,long bangid,string analogCalcVersion, InputDto input)
+        public async Task<string> PlanOrderResourceCheck(List<mes_morder> Mes_Morders, List<mes_moentry> moentryList,long bangid,string analogCalcVersion,bool isChangePriority)
         {
             if (Mes_Morders.Any())
             {
@@ -4373,7 +4485,7 @@ namespace Business.Replenishment
                 //    _scheduleResultOpMaster.Delete(s => monolist.Contains(s.WorkOrd));
                 //}
                 //只走计划工单
-                var rtn = await OrderKittingCheck(Mes_Morders, moentryList, bangid,analogCalcVersion, true);
+                var rtn = await OrderKittingCheck(Mes_Morders, moentryList, bangid,analogCalcVersion,isChangePriority, true);
             }
             else
             {
@@ -4423,7 +4535,7 @@ namespace Business.Replenishment
         /// 工单检查物料齐套
         /// </summary>
         /// <param name="input"></param>
-        public async Task<PschedDto> OrderKittingCheck(List<mes_morder> mo_Mes_Morders, List<mes_moentry> moentryList,long bangid,string analogCalcVersion, bool planCheck = false)
+        public async Task<PschedDto> OrderKittingCheck(List<mes_morder> mo_Mes_Morders, List<mes_moentry> moentryList,long bangid,string analogCalcVersion, bool isChangePriority, bool planCheck = false)
         {
             //资源检查结果
             PschedDto rtn = new PschedDto();
@@ -4610,7 +4722,76 @@ namespace Business.Replenishment
                         }
                     }
                 }
+                //暂时屏蔽重新生成工单物料明细
+                List<WorkOrdDetail> mainWorkOrdDetails = new List<WorkOrdDetail>();
+                List<WorkOrdDetail> delWorkOrddetails = new List<WorkOrdDetail>();
+                if (isChangePriority)
+                {
+                    //成品虚拟件对应关系
+                    var productOpList = _productStructureOp.Select(x => mo_Mes_Morders.Select(c => c.product_code).Contains(x.ProductItem) && x.Domain == param.factoryId.ToString());
+                    var workOrds = CalcPriority(mo_Mes_Morders.Select(p => p.morder_no).ToList(), param.factoryId.ToString());
+                    delWorkOrddetails = _workOrdDetail.Select(x => workOrds.Select(c => c.RecID).Contains((int)x.WorkOrdMasterRecID) && x.Domain == param.factoryId.ToString());
+                    foreach (var workord in mo_Mes_Morders)
+                    {
+                        long fid = GetParentMo(mo_Mes_Morders, workord);
+                        var exm = examines.Find(s => s.morder_id == fid);
+                        //var exm = examines.Find(s => s.morder_no == workord.morder_no);
+                        if (exm != null)
+                        {
+                            var childs = exm.BomChildExamineList.Where(s => s.is_use == true).ToList();
 
+                            var child = childs.Find(s => s.item_number == workord.product_code);
+                            if (child == null)
+                            {
+                                continue;
+                            }
+                            List<BomChildExamineDto> returnList = new List<BomChildExamineDto>();
+                            var productOps = productOpList.Where(x => x.ProductItem == workord.product_code).ToList();
+                            GetWorkDetalis(childs.Where(s => s.parent_id == child.fid).ToList(), returnList, childs, productOps);
+                            if (returnList.Any())
+                            {
+                                WorkOrdDetail woDetail = null;
+                                var calereturnList = returnList.OrderBy(c => c.item_number).Select(x => x.item_number).Distinct().ToList();
+                                var work = workOrds.Find(x => x.WorkOrd == workord.morder_no);
+                                if (work == null)
+                                {
+                                    continue;
+                                }
+                                short num = 1;
+                                foreach (var caleNumber in calereturnList)
+                                {
+                                    var caleList = returnList.Where(x => x.item_number == caleNumber).ToList();
+
+                                    //添加工单的物料信息
+                                    woDetail = new WorkOrdDetail();
+                                    woDetail.Domain = workord.factory_id.ToString();
+                                    woDetail.WorkOrd = workord.morder_no;
+                                    var oplist = caleList.Where(x => x.Op > 0).ToList();
+                                    woDetail.Op = 0;
+                                    if (oplist.Any())
+                                    {
+                                        woDetail.Op = oplist.Min(f => f.Op);
+                                    }
+                                    woDetail.ItemNum = caleNumber;
+                                    woDetail.QtyPosted = 0m;
+                                    woDetail.QtyReturned = 0m;
+                                    woDetail.Status = "";
+                                    woDetail.IsActive = true;
+                                    woDetail.CreateTime = DateTime.Now;
+                                    woDetail.Line = num;
+                                    woDetail.QtyRequired = caleList.Sum(c => c.needCount);
+                                    woDetail.WorkOrdMasterRecID = work.RecID;
+                                    if (workord.need_number != 0)
+                                    {
+                                        woDetail.FrozenBOMQty = Math.Round(woDetail.QtyRequired / workord.need_number.GetValueOrDefault(), 10);
+                                    }
+                                    mainWorkOrdDetails.Add(woDetail);
+                                    num++;
+                                }
+                            }
+                        }
+                    }
+                }
                 //获取工单数据
                 var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c => c.morder_no).Contains(p.WorkOrd));
                 workOrdMasters.ForEach(s => {
@@ -4693,6 +4874,17 @@ namespace Business.Replenishment
                             srmpooccupyInsert.ForEach(x => { x.GenerateNewId(help.NextId()); });
                             _businessDbContext.BulkInsert(srmpooccupyInsert);
                         }
+                        if(isChangePriority)
+                        {
+                            if (delWorkOrddetails.Any())
+                            {
+                                _businessDbContext.BulkDelete(delWorkOrddetails);
+                            }
+                            if (mainWorkOrdDetails.Any())
+                            {
+                                _businessDbContext.BulkInsert(mainWorkOrdDetails);
+                            }
+                        }
                         await unitOfWork.CompleteAsync();
                     }
                     catch (Exception e)
@@ -5550,7 +5742,7 @@ namespace Business.Replenishment
             //await _mysql_mes_morder.InsertManyAsync(moList);
             //await _mysql_mes_moentry.InsertManyAsync(moentryList);
             moList = moList.OrderBy(a => a.moentry_sys_stime).ToList();
-            await PlanOrderResourceCheck(moList,moentryList, bangid, $"V{DateTime.Now.ToString("yyyyMMddHHmm")}", input);
+            await PlanOrderResourceCheck(moList,moentryList, bangid, $"V{DateTime.Now.ToString("yyyyMMddHHmm")}",false);
             return "OK";
         }