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

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

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

+ 5 - 0
MicroServices/Business/Business.Application.Contracts/Dto/WorkOrdMstDto.cs

@@ -60,5 +60,10 @@ namespace Business.Dto
         /// 工序清场时长(分钟)
         /// </summary>
         public decimal WaitTime { get; set; }
+
+        /// <summary>
+        /// 工单计划开始时间
+        /// </summary>
+        public DateTime PlanDate { get; set; }
     }
 }

+ 28 - 25
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -590,7 +590,8 @@ namespace Business.ResourceExamineManagement
                             Worked = 0,
                             QtyWorked = 0,
                             Op = curOp.OP,
-                            WaitTime = curOp.WaitTime * 60
+                            WaitTime = curOp.WaitTime * 60,
+                            PlanDate = item.OrdDate.Value
                         });
                         sumCleanTimes += curOp.WaitTime * 60;
                     }
@@ -638,7 +639,8 @@ namespace Business.ResourceExamineManagement
                                     Worked = 0,
                                     QtyWorked = 0,
                                     Op = curOp.OP,
-                                    WaitTime = curOp.WaitTime * 60
+                                    WaitTime = curOp.WaitTime * 60,
+                                    PlanDate = item.OrdDate.Value
                                 });
                                 sumCleanTimes += curOp.WaitTime * 60;
                             }
@@ -650,6 +652,8 @@ namespace Business.ResourceExamineManagement
                             lstCleanTime = secCleanTime;
                         }
                     }
+                    //特殊工单排序
+                    workDtos = workDtos.OrderBy(p => p.PlanDate).ToList();
                     //当天的可用生产时长满足特殊工单生产时长+清场时间(最后一个工单清场时间除外)
                     if (dto.EffTime >= sumTsTimes)
                     {
@@ -679,6 +683,8 @@ namespace Business.ResourceExamineManagement
                                 //剩余可用工作时长满足最后一个特殊工单的生产时长+清场时长
                                 if (remainTime >= needTime)
                                 {
+                                    //计算工单排产结束时间
+                                    curPoint = workPoints.Find(p => p.StartPoint <= beginTime && beginTime <= p.EndPoint);
                                     //获取排产结束时间所处以及之后的生产时间段
                                     var nextPoints = workPoints.Where(p => p.Level >= curPoint.Level).OrderBy(p => p.Level).ToList();
                                     //处理第一个时间段的开始时间
@@ -775,7 +781,7 @@ namespace Business.ResourceExamineManagement
                             if (curPoint != null && endTime == curPoint.EndPoint)
                             {
                                 //获取后续生产时间段
-                                curPoint = workPoints.Where(p => p.Level == curPoint.Level + 1).FirstOrDefault();
+                                curPoint = workPoints.FirstOrDefault(p => p.Level == curPoint.Level + 1);
                                 //存在后续工作区间
                                 if (curPoint != null)
                                 {
@@ -787,8 +793,8 @@ namespace Business.ResourceExamineManagement
                             item.Worked = item.LbrVar;
                             item.QtyWorked = item.QtyOrded;
                         }
-                        //当天产能完全占用,且清场时间在下班后
-                        if (curPoint == null)
+                        //当天产能完全占用,且最后一个工单的清场时间刚好下班或者在下班后
+                        if (curPoint == null || endTime == dto.EndTime)
                         {
                             sumTsTimes = 0;//排产完毕,特殊工单时长置0
                             //获取下一个工作日
@@ -814,7 +820,8 @@ namespace Business.ResourceExamineManagement
                                         Worked = 0,
                                         QtyWorked = 0,
                                         Op = curOp.OP,
-                                        WaitTime = curOp.WaitTime * 60
+                                        WaitTime = curOp.WaitTime * 60,
+                                        PlanDate = item.OrdDate.Value
                                     });
                                     sumCleanTimes += curOp.WaitTime * 60;
                                 }
@@ -826,22 +833,13 @@ namespace Business.ResourceExamineManagement
                                 lstCleanTime = secCleanTime;
                             }
                         }
-                        //当天可用生产时长大于特殊工单生产时长+清场时长
+                        //当天可用生产时长大于特殊工单生产时长+最后一个工单的清场时长
                         else
                         {
                             //排产完毕,特殊工单时长置0
                             sumTsTimes = 0;
                             //处理workStartTime
                             workStartTime = endTime;
-                            curPoint = workPoints.Find(p => p.StartPoint <= endTime && endTime <= p.EndPoint);
-                            if (endTime == curPoint.EndPoint)
-                            {
-                                var nextPoint = workPoints.Find(p => p.Level == curPoint.Level + 1);
-                                if (nextPoint != null)
-                                {
-                                    workStartTime = nextPoint.StartPoint;
-                                }
-                            }
                         }
                     }
                     //当天的可用产能不满足特殊工单生产时长,则当天产能全部排特殊工单(至少最后一个特殊工单的生产时长不能满足)
@@ -858,7 +856,7 @@ namespace Business.ResourceExamineManagement
                             }
                             //当前工单剩余待排产时长(分钟)
                             decimal needTime = item.LbrVar - item.Worked;
-                            //当天剩余产能满足当前工单的剩余待排产时长
+                            //当天剩余产能满足当前工单的剩余待排产时长(则当前工单的清场时间必定排完)
                             if (residueTime >= needTime)
                             {
                                 //计算工单排产结束时间
@@ -886,17 +884,18 @@ namespace Business.ResourceExamineManagement
                                         nextMins -= p.WorkMinutes;
                                     }
                                 }
-                                //当天剩余产能
+                                //当天剩余可用生产时长
                                 residueTime -= needTime;
                                 //处理清场时间,两种场景:
                                 //1、residueTime<=item.WaitTime,结束时间加上剩余清场时长
                                 if (residueTime <= item.WaitTime)
                                 {
+                                    //仍需排产的清场时长
                                     decimal otherTime = item.WaitTime - residueTime;
                                     endTime = dto.EndTime.AddMinutes((double)otherTime);
                                     residueTime = 0;
                                 }
-                                //2、residueTime>item.WaitTime,剩余时长大于清场时长,需要过滤休息时间
+                                //2、residueTime>item.WaitTime,剩余时长大于清场时长,需要过滤休息时间
                                 else
                                 {
                                     //清场时长
@@ -929,6 +928,8 @@ namespace Business.ResourceExamineManagement
                                     }
                                     residueTime -= needTime;
                                 }
+                                //处理特殊工单剩余时长减去当前工单待排产时长和清场时长
+                                sumTsTimes -= (item.LbrVar - item.Worked + item.WaitTime);
 
                                 //记录生产周期
                                 curSequences.Add(new PeriodSequenceDet
@@ -964,17 +965,19 @@ namespace Business.ResourceExamineManagement
                                 item.QtyWorked = item.QtyWorked;
 
                                 beginTime = endTime;
-                                //获取结束时间所处时间段
-                                curPoint = workPoints.Find(p => p.StartPoint <= endTime && endTime <= p.EndPoint);
-                                if (curPoint != null && endTime == curPoint.EndPoint)
+                                //当天可用生产时长还有剩余
+                                if (residueTime > 0)
                                 {
-                                    var nextPoint = workPoints.Find(p => p.Level == curPoint.Level + 1);
-                                    if (nextPoint != null)
+                                    //获取结束时间所处时间段
+                                    curPoint = workPoints.Find(p => p.StartPoint <= endTime && endTime <= p.EndPoint);
+                                    if (endTime == curPoint.EndPoint)
                                     {
-                                        endTime = nextPoint.StartPoint;
+                                        var nextPoint = workPoints.Find(p => p.Level == curPoint.Level + 1);
+                                        endTime = nextPoint == null ? endTime : nextPoint.StartPoint;
                                     }
                                     beginTime = endTime;
                                 }
+                                //当天可用产能已全部用完
                                 else {
                                     break;
                                 }