Kaynağa Gözat

排产调整

heteng 2 yıl önce
ebeveyn
işleme
d8a451b2fe

+ 72 - 24
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -580,7 +580,7 @@ namespace Business.ResourceExamineManagement
                         //特殊工单待排产时长增加新增的特殊工单生产时长
                         sumTsTimes += secWOMasters.Sum(p => p.LbrVar) * 60;
                     }
-                    if (dto.EffTime >= sumTsTimes)//当天的可用产能满足特殊工单生产时长
+                    if (dto.EffTime >= sumTsTimes)//当天的可用生产时长满足特殊工单生产时长
                     {
                         DateTime beginTime = workStartTime;
                         DateTime endTime = dto.EndTime;
@@ -604,7 +604,7 @@ namespace Business.ResourceExamineManagement
                             else
                             {
                                 //获取后续生产时间段
-                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                 //剩余需要工作时长
                                 decimal nextMins = needTime - effMins;
                                 foreach (var p in nextPoints)
@@ -660,6 +660,7 @@ namespace Business.ResourceExamineManagement
                             beginTime = endTime;
                             //工单排产完成,排产时长=工单工作时长
                             item.Worked = item.LbrVar;
+                            item.QtyWorked = item.QtyOrded;
                             sumTsTimes -= needTime;
                         }
                         if (dto.EffTime == sumTsTimes)//当天产能完全占用
@@ -689,7 +690,7 @@ namespace Business.ResourceExamineManagement
                             //特殊工单待排产时长增加新增带排产特殊工单生产时长
                             sumTsTimes += secWOMasters.Sum(p => p.LbrVar) * 60;
                         }
-                        else {
+                        else {//当天可用生产时长大于特殊工单生产时长
                             sumTsTimes = 0;//排产完毕,特殊工单时长置0
                             //处理workStartTime
                             workStartTime = endTime;
@@ -697,11 +698,14 @@ namespace Business.ResourceExamineManagement
                             if (endTime == curPoint.EndPoint)
                             {
                                 var nextPoint = workPoints.Find(p => p.Level == curPoint.Level + 1);
-                                workStartTime = nextPoint.StartPoint;
+                                if (nextPoint != null)
+                                {
+                                    workStartTime = nextPoint.StartPoint;
+                                }
                             }
                         }
                     }
-                    else//当天的可用产能不满足特殊工单生产时长
+                    else//当天的可用产能不满足特殊工单生产时长,则当天产能全部排特殊工单
                     {
                         decimal residueTime = dto.EffTime;//当天产能剩余产能(分钟)
                         DateTime beginTime = workStartTime;//排产开始时间
@@ -728,7 +732,7 @@ namespace Business.ResourceExamineManagement
                                 else
                                 {
                                     //获取后续生产时间段
-                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                     //剩余需要工作时长
                                     decimal nextMins = needTime - effMins;
                                     foreach (var p in nextPoints)
@@ -771,6 +775,15 @@ namespace Business.ResourceExamineManagement
                                     CreateTime = DateTime.Now
                                 });
                                 beginTime = 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)
+                                    {
+                                        beginTime = nextPoint.StartPoint;
+                                    }
+                                }
                                 //当前工单已排产完成,已排产时间=工单生产时长,已排产数量=工单数量
                                 item.Worked = item.LbrVar;
                                 item.QtyWorked = item.QtyWorked;
@@ -828,6 +841,7 @@ namespace Business.ResourceExamineManagement
                 }
                 //记录已排产特殊工单
                 ypcWorkOrds.AddRange(workDtos.Select(p => p.WorkOrd).ToList());
+
                 //正常工单排产
                 //正常工单产线已排产数量
                 decimal sumQty = 0m;
@@ -915,7 +929,7 @@ namespace Business.ResourceExamineManagement
                                             else
                                             {
                                                 //获取后续生产时间段
-                                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                                 //剩余需要工作时长
                                                 decimal nextMins = needTime - effMins;
                                                 foreach (var p in nextPoints)
@@ -980,12 +994,15 @@ namespace Business.ResourceExamineManagement
                                         var point = workPoints.Find(p => p.StartPoint <= endTime && endTime <= p.EndPoint);
                                         if (endTime == point.EndPoint)
                                         {
-                                            var nextPoint = workPoints.Find(p => p.Level == point.Level + 1);
-                                            workStartTime = nextPoint.StartPoint;
+                                            var nextPoint = workPoints.FirstOrDefault(p => p.Level == point.Level + 1);
+                                            if (nextPoint != null)
+                                            {
+                                                workStartTime = nextPoint.StartPoint;
+                                            }
                                         }
 
                                         //剩余产能继续排正常工单
-                                        sumAmount = dto.ProductQty - Math.Floor(dto.Rate * (lineStart.setupTime - sumTimes / 60 - sumTsTimes / 60));
+                                        sumAmount = dto.ProductQty - Math.Floor(dto.Rate * (lineStart.setupTime - (sumTimes + sumTsTimes) / 60));
                                         //记录生产周期
                                         curSequences.Add(new PeriodSequenceDet
                                         {
@@ -1048,7 +1065,7 @@ namespace Business.ResourceExamineManagement
                                                 else
                                                 {
                                                     //获取后续生产时间段
-                                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                                     //剩余需要工作时长
                                                     decimal nextMins = needTime - effMins;
                                                     foreach (var p in nextPoints)
@@ -1090,6 +1107,15 @@ namespace Business.ResourceExamineManagement
                                                     WorkEndTime = endTime,
                                                     CreateTime = DateTime.Now
                                                 });
+                                                curPoint = workPoints.Find(p => p.StartPoint <= endTime && endTime <= p.EndPoint);
+                                                if (endTime == curPoint.EndPoint)
+                                                {
+                                                    var nextPoint = workPoints.FirstOrDefault(p => p.Level == curPoint.Level + 1);
+                                                    if (nextPoint != null)
+                                                    {
+                                                        endTime = nextPoint.StartPoint;
+                                                    }
+                                                }
                                                 beginTime = endTime;
                                                 //当前工单已排产完成,已排产时间=工单生产时长,已排产数量=工单数量
                                                 item.Worked = item.LbrVar;
@@ -1211,7 +1237,7 @@ namespace Business.ResourceExamineManagement
                                 else
                                 {
                                     //获取后续生产时间段
-                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                     //剩余需要工作时长
                                     decimal nextMins = workTime - effMins;
                                     foreach (var p in nextPoints)
@@ -1285,7 +1311,7 @@ namespace Business.ResourceExamineManagement
                                             else
                                             {
                                                 //获取后续生产时间段
-                                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                                 //剩余需要工作时长
                                                 decimal nextMins = needTime - effMins;
                                                 foreach (var p in nextPoints)
@@ -1370,7 +1396,7 @@ namespace Business.ResourceExamineManagement
                                                 else
                                                 {
                                                     //获取后续生产时间段
-                                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                                     //剩余需要工作时长
                                                     decimal nextMins = needTime - effMins;
                                                     foreach (var p in nextPoints)
@@ -1523,7 +1549,7 @@ namespace Business.ResourceExamineManagement
                                         else
                                         {
                                             //获取后续生产时间段
-                                            var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                            var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                             //剩余需要工作时长
                                             decimal nextMins = needTime - effMins;
                                             foreach (var p in nextPoints)
@@ -1588,8 +1614,11 @@ namespace Business.ResourceExamineManagement
                                     var point = workPoints.Find(p => p.StartPoint <= endTime && endTime <= p.EndPoint);
                                     if (endTime == point.EndPoint)
                                     {
-                                        var nextPoint = workPoints.Find(p => p.Level == point.Level + 1);
-                                        workStartTime = nextPoint.StartPoint;
+                                        var nextPoint = workPoints.FirstOrDefault(p => p.Level == point.Level + 1);
+                                        if (nextPoint != null)
+                                        {
+                                            workStartTime = nextPoint.StartPoint;
+                                        }
                                     }
 
                                     //剩余产能继续排正常工单
@@ -1656,7 +1685,7 @@ namespace Business.ResourceExamineManagement
                                             else
                                             {
                                                 //获取后续生产时间段
-                                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                                 //剩余需要工作时长
                                                 decimal nextMins = needTime - effMins;
                                                 foreach (var p in nextPoints)
@@ -1698,6 +1727,15 @@ namespace Business.ResourceExamineManagement
                                                 WorkEndTime = endTime,
                                                 CreateTime = DateTime.Now
                                             });
+                                            curPoint = workPoints.Find(p => p.StartPoint <= endTime && endTime <= p.EndPoint);
+                                            if (endTime == curPoint.EndPoint)
+                                            {
+                                                var nextPoint = workPoints.FirstOrDefault(p => p.Level == curPoint.Level + 1);
+                                                if (nextPoint != null)
+                                                {
+                                                    endTime = nextPoint.StartPoint;
+                                                }
+                                            }
                                             beginTime = endTime;
                                             //当前工单已排产完成,已排产时间=工单生产时长,已排产数量=工单数量
                                             item.Worked = item.LbrVar;
@@ -1820,7 +1858,7 @@ namespace Business.ResourceExamineManagement
                                 else
                                 {
                                     //获取后续生产时间段
-                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                    var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                     //剩余需要工作时长
                                     decimal nextMins = workTime - effMins;
                                     foreach (var p in nextPoints)
@@ -1895,7 +1933,7 @@ namespace Business.ResourceExamineManagement
                                         else
                                         {
                                             //获取后续生产时间段
-                                            var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                            var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                             //剩余需要工作时长
                                             decimal nextMins = needTime - effMins;
                                             foreach (var p in nextPoints)
@@ -1980,7 +2018,7 @@ namespace Business.ResourceExamineManagement
                                             else
                                             {
                                                 //获取后续生产时间段
-                                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                                                var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                                                 //剩余需要工作时长
                                                 decimal nextMins = needTime - effMins;
                                                 foreach (var p in nextPoints)
@@ -2022,6 +2060,15 @@ namespace Business.ResourceExamineManagement
                                                 WorkEndTime = endTime,
                                                 CreateTime = DateTime.Now
                                             });
+                                            curPoint = workPoints.Find(p => p.StartPoint <= endTime && endTime <= p.EndPoint);
+                                            if (endTime == curPoint.EndPoint) 
+                                            {
+                                                var nextPoint = workPoints.FirstOrDefault(p=>p.Level == curPoint.Level +1);
+                                                if (nextPoint != null)
+                                                {
+                                                    endTime = nextPoint.StartPoint;
+                                                }
+                                            }
                                             beginTime = endTime;
                                             //当前工单已排产完成,已排产时间=工单生产时长,已排产数量=工单数量
                                             item.Worked = item.LbrVar;
@@ -2109,6 +2156,7 @@ namespace Business.ResourceExamineManagement
                 //当前产线的休息时间设置
                 var mlqtyWorkDtls = qualityLines.Where(p => p.ProdLine == item.ProdLine).ToList();
                 LineStartDto lineStart = new LineStartDto();
+                lineStart.RecID = 0;
                 lineStart.Line = item.ProdLine;
                 lineStart.Op = item.Op;
                 lineStart.StartTime = workStartTime;
@@ -2180,7 +2228,7 @@ namespace Business.ResourceExamineManagement
                         else
                         {
                             //获取后续生产时间段
-                            var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+                            var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
                             //剩余需要工作时长
                             decimal nextMins = workTime - effMins;
                             foreach (var p in nextPoints)
@@ -2260,7 +2308,7 @@ namespace Business.ResourceExamineManagement
             TimeSpan span = curPoint.EndPoint - startTime;
             scheduledDto.EffTime = (decimal)span.TotalMinutes;
             //获取后续工作时间段的有效工作时间
-            var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
+            var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).OrderBy(p => p.Level).ToList();
             foreach (var item in nextPoints)
             {
                 span = item.EndPoint - item.StartPoint;
@@ -2507,7 +2555,7 @@ namespace Business.ResourceExamineManagement
                     startDto.Line = lines[i].Line;
                     startDto.setupTime = lines[i].SetupTime;
                     startDto.StartTime = startTime;
-                    startDto.Rate = lines[0].Rate;
+                    startDto.Rate = lines[i].Rate;
                     startDto.Op = op;
                 }
             }