ソースを参照

日计划调整:前处理部分完成/全部完成的工单提前排产

heteng 2 年 前
コミット
9385195e0f

+ 52 - 52
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -244,8 +244,8 @@ namespace Business.ResourceExamineManagement
             //取数开始时间为当前时间
             DateTime startTime = DateTime.Now;
             scheTime = startTime;
-            //尚未开始生产的工单+正在生产的工单
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && p.Status !="C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID >0 ))).ToList();
+            //尚未开始生产的工单+正在生产的工单(工单需求数量>已完成数量)
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && (p.QtyOrded - p.QtyCompleted) > 0 && p.Status !="C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID >0 ))).ToList();
             if (workOrds.Any())
             {
                 await DoProductSchedule(startTime, workOrds, domain, 1);
@@ -266,13 +266,43 @@ namespace Business.ResourceExamineManagement
             domain = factoryid;
             //记录排产开始时间
             scheTime = startTime;
-
-            //记录正在投产工单的优先级
-            var dbWorkOrds = workOrds.Where(p => p.Status.ToUpper() == "W").ToList();
-            //正在投产工单的优先级设为负数,确保重新排产时,正在投产的工单优先级最高
-            workOrds.ForEach(p => {
-                p.Priority = p.Status.ToUpper() == "W" ? -1 : p.Priority;
-            });
+            //获取工单领料单
+            var nbrMasterList = _nbrMaster.Select(x => x.Domain == domain && x.Type.ToUpper() == "SM" && workOrds.Select(s => s.WorkOrd).Contains(x.WorkOrd)).ToList();
+            workOrds = workOrds.OrderBy(p => p.Priority).ToList();
+            //记录工单数据
+            List<WorkPriorityDto> dbWorkOrds = workOrds.Select(p => new WorkPriorityDto { 
+                WorkOrd = p.WorkOrd,
+                Priority = p.Priority
+            }).ToList();
+            //处理工单优先级:正常投产工单优先级最高,其次是前处理状态为部分完成/全部完成,其他按照工单优先级排
+            decimal ytc = 1m;
+            decimal ktc = 10000m;
+            decimal bktc = 20000m;
+            for (int i = 0; i < workOrds.Count; i++)
+            {
+                //正在投产
+                if (workOrds[i].Status.ToUpper() == "W")
+                {
+                    workOrds[i].Priority = ytc;
+                    ytc++;
+                    continue;
+                }
+                var curNbrs = nbrMasterList.Where(p => p.WorkOrd == workOrds[i].WorkOrd).ToList();
+                //存在领料单:不需要前处理-领料单已关闭,需要前处理-状态为部分完成或者全部完成
+                if (curNbrs.Any() && !curNbrs.Exists(p => (p.TransType != "PrevProcess" && p.Status.ToUpper() != "C") || (p.TransType == "PrevProcess" && p.Ufld1 != "completed" && p.Ufld1 != "50")))
+                {
+                    workOrds[i].Priority = ktc;
+                    ktc++;
+                    continue;
+                }
+                //不存在领料单或者领料单未关闭或者前处理状态不为部分完成/全部完成
+                if (!curNbrs.Any() || curNbrs.Exists(p => (p.TransType != "PrevProcess" && p.Status.ToUpper() != "C") || (p.TransType == "PrevProcess" && p.Ufld1 != "completed" && p.Ufld1 != "50")))
+                {
+                    workOrds[i].Priority = bktc;
+                    bktc++;
+                    continue;
+                }
+            }
             //特殊工单指定时间开工,不需要计算产能,只需要计算时长即可
             var tsWorkOrds = workOrds.Where(p => !string.IsNullOrEmpty(p.Typed)).ToList();
             //正常工单
@@ -333,16 +363,16 @@ namespace Business.ResourceExamineManagement
             List<string> ypcWorkOrds = new List<string>();
             //按照优先级排序
             zcWorkOrds = zcWorkOrds.OrderBy(p=>p.Priority).ToList();
-            foreach (var item in zcWorkOrds)
+            for (int i = 0; i < zcWorkOrds.Count; i++)
             {
                 //记录产线占用情况
                 allResults.AddRange(scheduleMasters);
                 //当前工单工艺路线主产线的关键工序
-                var curRoutings = workOrdRoutings.Where(p =>p.WorkOrd == item.WorkOrd && p.ItemNum == item.ItemNum && p.ParentOp == 0 && p.MilestoneOp).OrderBy(p=>p.OP).ToList();
+                var curRoutings = workOrdRoutings.Where(p => p.WorkOrd == zcWorkOrds[i].WorkOrd && p.ItemNum == zcWorkOrds[i].ItemNum && p.ParentOp == 0 && p.MilestoneOp).OrderBy(p => p.OP).ToList();
                 //当前工单的产线明细
-                var curProdLines = prodLines.Where(p => p.Part == item.ItemNum).ToList();
+                var curProdLines = prodLines.Where(p => p.Part == zcWorkOrds[i].ItemNum).ToList();
                 //产线排产
-                LineSchedule(item, curRoutings, curProdLines, periodSequenceDtls, scheduleMasters, allResults, tsWorkOrds, ypcWorkOrds, tsWoRoutings);
+                LineSchedule(zcWorkOrds[i], curRoutings, curProdLines, periodSequenceDtls, scheduleMasters, allResults, tsWorkOrds, ypcWorkOrds, tsWoRoutings);
             }
             //判断是否有特殊工单没有排产,如果有,则对剩余特殊工单排产
             var notSchedules = tsWorkOrds.Where(p => !ypcWorkOrds.Contains(p.WorkOrd)).ToList();
@@ -430,47 +460,23 @@ namespace Business.ResourceExamineManagement
                 });
             }
             TsLineSchedule(workDtos, periodSequenceDtls, scheduleMasters);
-            //处理工单计划开始日期、计划结束日期
+            //回写工单优先级
             foreach (var item in workOrds)
             {
-                //2024-01-02调整:不回写工单计划开工日期,计划结束日期
-                //List<ScheduleResultOpMaster> scheduleList = scheduleMasters.Where(s => s.WorkOrd == item.WorkOrd).ToList();
-                //if (scheduleList.Any())
-                //{
-                //    item.OrdDate = scheduleList.Min(s => s.WorkStartTime);
-                //    item.DueDate = scheduleList.Max(s => s.WorkEndTime);
-                //}
-                //当前工单正在投产,则需要回写优先级
-                if (!string.IsNullOrEmpty(item.Status) && item.Status.ToUpper() == "W")
+                var curInfo = dbWorkOrds.FirstOrDefault(p => p.WorkOrd == item.WorkOrd);
+                if (curInfo != null)
                 {
-                    var curInfo = dbWorkOrds.FirstOrDefault(p => p.WorkOrd == item.WorkOrd);
-                    if (curInfo != null)
-                    {
-                        item.Priority = curInfo.Priority;
-                    }
+                    item.Priority = curInfo.Priority;
                 }
             }
-            //2024-01-02调整:不回写工单计划开工日期,计划结束日期
-            //var mesMorder = _mysql_mes_morder.GetListAsync(s => workOrds.Select(x => x.WorkOrd).Contains(s.morder_no) && s.factory_id.ToString() == domain).Result;
-            //if(mesMorder.Any()) {
-            //    foreach (var mo in mesMorder)
-            //    {
-            //        var wo = workOrds.Find(s => s.WorkOrd == mo.morder_no);
-            //        if (wo != null)
-            //        {
-            //            mo.moentry_sys_stime = wo.OrdDate;
-            //            mo.moentry_sys_etime = wo.DueDate;
-            //        }
-            //    }
-            //}
-
+            
             //取数开始时间为当前日期
             DateTime beginDate = DateTime.Now.Date;
             DateTime endDate = DateTime.Now.Date.AddDays(4);
             //取三天内的日计划
             var thePeriods = periodSequenceDtls.Where(p => p.PlanDate >= beginDate && p.PlanDate <= endDate).ToList();
-            var workordList = _workOrdMaster.Select(x => x.Domain == domain && x.Status.ToLower() == "r" && thePeriods.Select(s => s.WorkOrds).Contains(x.WorkOrd)).ToList();
-            var nbrMasterList = _nbrMaster.Select(x => x.Domain == domain && x.Type == "SM" && thePeriods.Select(s => s.WorkOrds).Contains(x.WorkOrd)).ToList();
+            var workordList = workOrds.Where(x => (x.Status.ToLower() == "r" || x.Status.ToLower() == "w") && thePeriods.Select(s => s.WorkOrds).Contains(x.WorkOrd)).ToList();
+            var theNbrMasters = nbrMasterList.Where(p => thePeriods.Select(s => s.WorkOrds).Contains(p.WorkOrd));
 
             //更新当天日计划的计划数量,排产数量
             foreach (var item in periodSequenceDtls)
@@ -483,8 +489,8 @@ namespace Business.ResourceExamineManagement
                 if (item.PlanDate >= beginDate && item.PlanDate <= endDate && workordList.Exists(p => p.WorkOrd == item.WorkOrds))
                 {
                     //工单不需要前处理的领料单全部出库且工单需要前处理的领料单前处理完成,则日计划自动下达
-                    var curNbrs = nbrMasterList.Where(p => p.WorkOrd == item.WorkOrds).ToList();
-                    if (curNbrs.Any() && !curNbrs.Exists(p=>p.Status.ToLower() != "c" || (p.TransType == "PrevProcess" && p.Ufld1 != "completed")))
+                    var curNbrs = theNbrMasters.Where(p => p.WorkOrd == item.WorkOrds).ToList();
+                    if (curNbrs.Any() && !curNbrs.Exists(p=>(p.TransType != "PrevProcess" && p.Status.ToLower() != "c") || (p.TransType == "PrevProcess" && p.Ufld1 != "completed" && p.Ufld1 !="50")))
                     {
                         item.Status = "r";
                     }
@@ -530,12 +536,6 @@ namespace Business.ResourceExamineManagement
                     }
                     //更新工单优先级
                     _workOrdMaster.Update(workOrds);
-                    //2024-01-02调整:不回写工单计划开工日期,计划结束日期
-                    //if (mesMorder.Any())
-                    //{
-                    //    await _mysql_mes_morder.UpdateManyAsync(mesMorder);
-                    //}
-
                     //添加工单工序准备开始时间记录
                     if (inserts.Any())
                     {

+ 2 - 2
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -5017,7 +5017,7 @@ namespace Business.ResourceExamineManagement
             //DateTime endDate = DateTime.Now.Date.AddDays(28).AddDays(1);
             ////尚未开始生产的工单+正在生产的工单
             //var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && ((p.OrdDate < endDate && p.OrdDate >= startTime && p.Status.ToUpper() == "P" && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0))) || p.Status.ToUpper() == "W")).ToList();
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && p.Status != "C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0))).ToList();
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && (p.QtyOrded - p.QtyCompleted) > 0 && p.Status != "C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0))).ToList();
             if (workOrds.Any())
             {
                 await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, domain, 2);
@@ -5038,7 +5038,7 @@ namespace Business.ResourceExamineManagement
             //取数开始时间为当前天的下一天
             DateTime startTime = DateTime.Now;
             //尚未开始生产的工单+正在生产的工单
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.domain && p.Status != "C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (p.WorkOrd == input.workord || (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0)))).ToList();
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.domain && (p.QtyOrded - p.QtyCompleted) > 0 && p.Status != "C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (p.WorkOrd == input.workord || (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0)))).ToList();
             if (!workOrds.Exists(p=>p.WorkOrd == input.workord))
             {
                 return "NO|工单【" + input.workord + "】不存在,请联系系统管理员!";