Forráskód Böngészése

日计划调整:过期且完成数量为0的日计划,调整计划开始时间为当天;投产日计划从当天的下一天重排,未投产日计划从当天开始重排

heteng 2 éve
szülő
commit
5314e813bb

+ 65 - 14
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -23,6 +23,8 @@ using Magicodes.ExporterAndImporter.Core.Extension;
 using Volo.Abp.Domain.Repositories;
 using System.Runtime.CompilerServices;
 using NUglify.JavaScript;
+using MathNet.Numerics.Optimization.LineSearch;
+using MathNet.Numerics;
 
 namespace Business.ResourceExamineManagement
 {
@@ -487,6 +489,35 @@ namespace Business.ResourceExamineManagement
                     }
                 }
             }
+
+            //获取计划日期在当前日期之前且报工数量为0的日计划
+            List<PeriodSequenceDet> oldSequenceDets = _periodSequenceDet.Select(p =>p.Domain ==domain && p.PlanDate < scheTime.Date && p.CompQty == 0).ToList();
+            List<ScheduleResultOpMaster> oldSchedules = new List<ScheduleResultOpMaster>();
+            if (oldSequenceDets.Any())
+            {
+                var oldWorkords = oldSequenceDets.Select(p => p.WorkOrds).ToList();
+                var oldDate = oldSequenceDets.Select(p => p.PlanDate).ToList();
+                var oldOps = oldSequenceDets.Select(p => p.Op).ToList();
+                
+                //更新计划日期为当前日期
+                foreach (var oldItem in oldSequenceDets)
+                {
+                    var curSche = _scheduleResultOpMaster.Select(p => p.Domain == domain && p.WorkOrd == oldItem.WorkOrds && p.WorkDate== oldItem.PlanDate && p.Op == oldItem.Op).FirstOrDefault();
+                    if (curSche != null)
+                    {
+                        oldSchedules.Add(curSche);
+                    }
+                    oldItem.PlanDate = scheTime.Date;
+                }
+                string strScheTime = scheTime.Date.ToString("yyyy-MM-dd");
+                foreach (var oldItem in oldSchedules)
+                {
+                    oldItem.WorkDate = scheTime.Date;
+                    oldItem.WorkStartTime = Convert.ToDateTime(oldItem.WorkStartTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(oldItem.WorkStartTime.ToString("yyyy-MM-dd"), strScheTime));
+                    oldItem.WorkEndTime = Convert.ToDateTime(oldItem.WorkEndTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(oldItem.WorkEndTime.ToString("yyyy-MM-dd"), strScheTime));
+                }
+            }
+            
             using (TransactionScope scope = new TransactionScope())
             {
                 try
@@ -502,10 +533,7 @@ namespace Business.ResourceExamineManagement
                     {
                         await _mysql_mes_morder.UpdateManyAsync(mesMorder);
                     }
-                    //删除当前日期下一天开始的工单排产记录
-                    _periodSequenceDet.Delete(p=>p.PlanDate >scheTime.Date && p.Domain == domain && p.OrdQty != 0);
-                    _scheduleResultOpMaster.Delete(p=>p.WorkDate > scheTime.Date && p.Domain == domain);
-
+                    
                     //添加工单工序准备开始时间记录
                     if (inserts.Any())
                     {
@@ -516,23 +544,46 @@ namespace Business.ResourceExamineManagement
                     {
                         _workOrdSetupTimeRecord.Update(updates);
                     }
+                    //已投产的工单,只需要保存当前日期下一天的排产记录
+                    List<string> sczWorkords = workOrds.Where(p => p.Status.ToUpper() == "W").Select(p=>p.WorkOrd).ToList();
+                    if (sczWorkords.Any())
+                    {
+                        //删除当前日期下一天开始的工单排产记录
+                        _periodSequenceDet.Delete(p => sczWorkords.Contains(p.WorkOrds) && p.PlanDate > scheTime.Date && p.Domain == domain && p.OrdQty != 0);
+                        _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();
+                    if (wscWorkords.Any())
+                    {
+                        //删除当前日期及以后的工单排产记录
+                        _periodSequenceDet.Delete(p => wscWorkords.Contains(p.WorkOrds) && p.PlanDate >= scheTime.Date && p.Domain == domain && p.OrdQty != 0);
+                        _scheduleResultOpMaster.Delete(p => wscWorkords.Contains(p.WorkOrd) && p.WorkDate >= scheTime.Date && p.Domain == domain);
 
-                    //当天日计划数据调整
-                    //获取当天重新排产的工单日计划
-                    var tdSeqDtls = periodSequenceDtls.Where(p => p.PlanDate == scheTime.Date).ToList();
-                    var tdSchMsts = scheduleMasters.Where(p => p.WorkDate == scheTime.Date).ToList();
-                    ////删除数据库中的已存在的当天日计划
-                    //_periodSequenceDet.Delete(p=>p.Domain == domain && tdSeqDtls.Select(m => m.Op).Contains(p.Op) && tdSeqDtls.Select(m => m.WorkOrds).Contains(p.WorkOrds) && p.PlanDate == scheTime.Date && p.OrdQty != 0);
-                    //_scheduleResultOpMaster.Delete(p=>p.Domain == domain && tdSchMsts.Select(m => m.Op).Contains(p.Op) && tdSchMsts.Select(m => m.WorkOrd).Contains(p.WorkOrd) && p.WorkDate == scheTime.Date);
-                    //保存下一天的日计划数据
-                    _periodSequenceDet.Insert(periodSequenceDtls.Where(p=>p.PlanDate > scheTime.Date).ToList());
-                    _scheduleResultOpMaster.Insert(scheduleMasters.Where(p => p.WorkDate > scheTime.Date).ToList());
+                        //保存当前日期及以后的日计划数据
+                        _periodSequenceDet.Insert(periodSequenceDtls.Where(p => wscWorkords.Contains(p.WorkOrds) && p.PlanDate >= scheTime.Date).ToList());
+                        _scheduleResultOpMaster.Insert(scheduleMasters.Where(p => wscWorkords.Contains(p.WorkOrd) && p.WorkDate >= scheTime.Date).ToList());
+                    }
+                    //更新过期日计划的计划开工日期
+                    if (oldSequenceDets.Any())
+                    {
+                        _periodSequenceDet.Update(oldSequenceDets);
+                    }
+                    if (oldSchedules.Any())
+                    {
+                        _scheduleResultOpMaster.Update(oldSchedules);
+                    }
                     scope.Complete();
                 }
                 catch (Exception ex)
                 {
                     new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductSchedule", "保存排产数据失败:" + ex.Message, _currentTenant.Id.ToString());
                     scope.Dispose();
+                    return "NO|排产数据保存失败";
                 }
             }
 

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/Production/PeriodSequenceDet.cs

@@ -57,6 +57,12 @@ namespace Business.Domain
         [Comment("订单数量")]
         public decimal? OrdQty { get; set; }
 
+        /// <summary>
+        /// 报工数量
+        /// </summary>
+        [Comment("报工数量")]
+        public decimal CompQty { get; set; }
+
         /// <summary>
         /// 工单
         /// </summary>

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/Production/ScheduleResultOpMaster.cs

@@ -49,7 +49,7 @@ namespace Business.Domain
         /// 工序
         /// </summary>
         [Comment("工序")]
-        public int? Op { get; set; }
+        public int Op { get; set; }
 
         /// <summary>
         /// 计划日期