Przeglądaj źródła

日计划调整:处理未来计划提前投产问题

heteng 2 lat temu
rodzic
commit
8b4168fc79

+ 64 - 43
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -25,6 +25,7 @@ using System.Runtime.CompilerServices;
 using NUglify.JavaScript;
 using MathNet.Numerics.Optimization.LineSearch;
 using MathNet.Numerics;
+using Volo.Abp.Options;
 
 namespace Business.ResourceExamineManagement
 {
@@ -523,70 +524,90 @@ namespace Business.ResourceExamineManagement
                     if (sczWorkords.Any())
                     {
                         //获取计划日期在当前日期之后且已投产的日计划,将其计划开工日期改为当天
-                        List<PeriodSequenceDet> wlSequenceDets = _periodSequenceDet.Select(p => p.Domain == domain  && sczWorkords.Contains(p.WorkOrds) && p.Status.ToUpper() == "W" && p.PlanDate > scheTime.Date).ToList();
-                        List<ScheduleResultOpMaster> wlSchedules = new List<ScheduleResultOpMaster>();
+                        List<PeriodSequenceDet> wlSequenceDets = _periodSequenceDet.Select(p => p.Domain == domain && sczWorkords.Contains(p.WorkOrds) && p.PlanDate > scheTime.Date).ToList();
+                        List<ScheduleResultOpMaster> wlSchedules = _scheduleResultOpMaster.Select(p => p.Domain == domain && sczWorkords.Contains(p.WorkOrd) && p.WorkDate > scheTime.Date).ToList();
                         //获取当天的日计划
                         List<PeriodSequenceDet> dtSequenceDets = _periodSequenceDet.Select(p => p.Domain == domain && sczWorkords.Contains(p.WorkOrds) && p.PlanDate == scheTime.Date).ToList();
                         List<ScheduleResultOpMaster> dtScheduleResults = _scheduleResultOpMaster.Select(p => p.Domain == domain && sczWorkords.Contains(p.WorkOrd) && p.WorkDate == scheTime.Date).ToList();
                         //需要更新的日计划
                         List<PeriodSequenceDet> upSequenceDets = new List<PeriodSequenceDet>();
                         List<ScheduleResultOpMaster> upScheduleResults = new List<ScheduleResultOpMaster>();
-                        if (wlSequenceDets.Any())
+                        //需要删除的日计划
+                        List<PeriodSequenceDet> delSequenceDets = new List<PeriodSequenceDet>();
+                        List<ScheduleResultOpMaster> delScheduleResults = new List<ScheduleResultOpMaster>();
+                        PeriodSequenceDet seqInfo = new PeriodSequenceDet();
+                        ScheduleResultOpMaster schInfo = new ScheduleResultOpMaster();
+                        foreach (var gdh in sczWorkords)
                         {
-                            var wlWorkords = wlSequenceDets.Select(p => p.WorkOrds).ToList();
-                            var wlDate = wlSequenceDets.Select(p => p.PlanDate).ToList();
-                            var wlOps = wlSequenceDets.Select(p => p.Op).ToList();
-                            //更新计划日期为当前日期
-                            foreach (var wlItem in wlSequenceDets)
+                            //提前投产的日计划
+                            var tcSeqs = wlSequenceDets.Where(p => p.WorkOrds == gdh && p.Status.ToUpper() == "W").ToList();
+                            //当前工单存在未来日期投产的日计划
+                            if (tcSeqs.Any())
                             {
-                                var curSche = _scheduleResultOpMaster.Select(p => p.Domain == domain && p.WorkOrd == wlItem.WorkOrds && p.WorkDate == wlItem.PlanDate && p.Op == wlItem.Op).FirstOrDefault();
-                                if (curSche != null)
+                                //获取提前投产的工序
+                                List<int> ops = tcSeqs.Select(p => p.Op).Distinct().ToList();
+                                foreach (var op in ops)
                                 {
-                                    //如果当天有日计划,则只需要更新计划数量
-                                    var cInfo = dtScheduleResults.FirstOrDefault(p => p.WorkOrd == wlItem.WorkOrds && p.WorkDate == scheTime.Date && p.Op == wlItem.Op);
-                                    if (cInfo != null)
+                                    //当前工序提前投产的日计划
+                                    var opSeqs = tcSeqs.Where(p => p.Op == op).ToList();
+                                    //获取当天的日计划
+                                    var dtSeq = dtSequenceDets.FirstOrDefault(p=>p.WorkOrds == gdh && p.Op == op);
+                                    if (dtSeq != null )
                                     {
-                                        cInfo.WorkQty = cInfo.WorkQty + curSche.WorkQty;
-                                        upScheduleResults.Add(cInfo);
+                                        delSequenceDets.Add(dtSeq);
                                     }
-                                    else {
-                                        string strScheTime = scheTime.Date.ToString("yyyy-MM-dd");
-                                        curSche.WorkDate = scheTime.Date;
-                                        curSche.WorkStartTime = Convert.ToDateTime(curSche.WorkStartTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(curSche.WorkStartTime.ToString("yyyy-MM-dd"), strScheTime));
-                                        curSche.WorkEndTime = Convert.ToDateTime(curSche.WorkEndTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(curSche.WorkEndTime.ToString("yyyy-MM-dd"), strScheTime));
-                                        upScheduleResults.Add(curSche);
+                                    seqInfo = new PeriodSequenceDet();
+                                    seqInfo = opSeqs[0];
+                                    seqInfo.PlanDate = scheTime.Date;
+                                    seqInfo.OrdQty = opSeqs.Sum(p => p.OrdQty) + (dtSeq != null ? dtSeq.OrdQty : 0m);
+                                    seqInfo.CompQty = opSeqs.Sum(p=>p.CompQty) + (dtSeq != null ? dtSeq.CompQty : 0m);
+                                    upSequenceDets.Add(seqInfo);
+
+                                    //获取提前投产的日计划
+                                    var opSchs = wlSchedules.Where(p => p.WorkOrd == gdh && p.Op == op && opSeqs.Select(m => m.PlanDate).Contains(p.WorkDate)).ToList();
+                                    schInfo = opSchs[0];
+                                    string strScheTime = scheTime.Date.ToString("yyyy-MM-dd");
+                                    schInfo.WorkDate = scheTime.Date;
+                                    schInfo.WorkQty = seqInfo.OrdQty;
+                                    schInfo.WorkStartTime = Convert.ToDateTime(schInfo.WorkStartTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(schInfo.WorkStartTime.ToString("yyyy-MM-dd"), strScheTime));
+                                    schInfo.WorkEndTime = Convert.ToDateTime(schInfo.WorkEndTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(schInfo.WorkEndTime.ToString("yyyy-MM-dd"), strScheTime));
+                                    upScheduleResults.Add(schInfo);
+                                    //获取当天的日计划
+                                    var dtSch = dtScheduleResults.FirstOrDefault(p=>p.WorkOrd == gdh && p.Op == op);
+                                    if (dtSch != null)//当天有日计划
+                                    {
+                                        delScheduleResults.Add(dtSch);
                                     }
                                 }
-                                //如果当天有日计划,则只需要更新状态和计划数量
-                                var info = dtSequenceDets.FirstOrDefault(p=>p.WorkOrds == wlItem.WorkOrds && p.PlanDate == scheTime.Date && p.Op == wlItem.Op);
-                                if (info != null)
-                                {
-                                    info.OrdQty = info.OrdQty + wlItem.OrdQty;
-                                    info.Status = wlItem.Status;
-                                    upSequenceDets.Add(info);
-                                }
-                                else { //当天没有日计划,则更新计划日期
-                                    wlItem.PlanDate = scheTime.Date;
-                                    upSequenceDets.Add(wlItem);
-                                }
-                            }
-                            //更新过期日计划的计划开工日期
-                            if (upSequenceDets.Any())
-                            {
-                                _periodSequenceDet.Update(upSequenceDets);
-                            }
-                            if (upScheduleResults.Any())
-                            {
-                                _scheduleResultOpMaster.Update(upScheduleResults);
                             }
                         }
+                        //更新提前投产的日计划
+                        if (upSequenceDets.Any())
+                        {
+                            _periodSequenceDet.Update(upSequenceDets);
+                        }
+                        if (upScheduleResults.Any())
+                        {
+                            _scheduleResultOpMaster.Update(upScheduleResults);
+                        }
+                        //删除当天的日计划
+                        if (delSequenceDets.Any())
+                        {
+                            _periodSequenceDet.Delete(delSequenceDets);
+                        }
+                        if (delScheduleResults.Any())
+                        {
+                            _scheduleResultOpMaster.Update(delScheduleResults);
+                        }
+
                         //删除当前日期下一天开始的工单排产记录
-                        _periodSequenceDet.Delete(p => sczWorkords.Contains(p.WorkOrds) && p.PlanDate > scheTime.Date && p.Domain == domain && p.OrdQty != 0);
+                        _periodSequenceDet.Delete(p => sczWorkords.Contains(p.WorkOrds) && p.PlanDate > scheTime.Date && p.Domain == domain);
                         _scheduleResultOpMaster.Delete(p => sczWorkords.Contains(p.WorkOrd) && p.WorkDate > scheTime.Date && p.Domain == domain);
 
                         //保存下一天的日计划数据
                         _periodSequenceDet.Insert(periodSequenceDtls.Where(p => sczWorkords.Contains(p.WorkOrds) && p.PlanDate > scheTime.Date).ToList());
                         _scheduleResultOpMaster.Insert(scheduleMasters.Where(p => sczWorkords.Contains(p.WorkOrd) && p.WorkDate > scheTime.Date).ToList());
+
                     }
                     //未投产的工单,当前日期及以后的排产记录全部删除
                     List<string> wscWorkords = workOrds.Where(p => p.Status.ToUpper() != "W").Select(p => p.WorkOrd).ToList();