Ver código fonte

日计划调整计划日期调整

heteng 2 anos atrás
pai
commit
7ba6b15d6f

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

@@ -22,6 +22,7 @@ using Amazon.Runtime;
 using Magicodes.ExporterAndImporter.Core.Extension;
 using Volo.Abp.Domain.Repositories;
 using System.Runtime.CompilerServices;
+using NUglify.JavaScript;
 
 namespace Business.ResourceExamineManagement
 {
@@ -450,6 +451,15 @@ namespace Business.ResourceExamineManagement
                     }
                 }
             }
+
+            //取数开始时间为当前日期
+            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();
+
             //更新当天日计划的计划数量,排产数量
             foreach (var item in periodSequenceDtls)
             {
@@ -457,6 +467,16 @@ namespace Business.ResourceExamineManagement
                 //获取历史排产数据
                 var curDtl = dbPeriodSequences.FirstOrDefault(p => p.Op == item.Op && p.WorkOrds == item.WorkOrds && p.Line == item.Line && p.PlanDate == item.PlanDate && p.PlanDate == scheTime.Date);
                 item.OrdQty = curDtl == null ? item.OrdQty : curDtl.OrdQty;
+                //未来三天的日计划(工单下达,且前处理完成)状态设为r
+                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")))
+                    {
+                        item.Status = "r";
+                    }
+                }
             }
             using (TransactionScope scope = new TransactionScope())
             {
@@ -4072,6 +4092,10 @@ namespace Business.ResourceExamineManagement
             int op = routing.OP;
             //排产任务执行时间
             DateTime actStart = scheTime;
+            if (workOrd.JointTyped.ToUpper() == "B")
+            {
+                actStart = workOrd.OrdDate.GetValueOrDefault();
+            }
             //获取工序对应的产线,根据优先级排序
             var lines = prodLines.Where(p => p.Part == workOrd.ItemNum && p.Op == op).OrderBy(p => p.Sequence).ToList();
             //获取工序开始准备时长记录

+ 21 - 19
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -4777,12 +4777,11 @@ namespace Business.ResourceExamineManagement
             DateTime startTime = DateTime.Now;
             //尚未开始生产的工单+正在生产的工单
             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();
-            string result = "OK";
             if (workOrds.Any())
             {
-                result = await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, domain, 2);
+                await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, domain, 2);
             }
-            return result;
+            return "OK";
         }
 
         /// <summary>
@@ -4793,31 +4792,34 @@ namespace Business.ResourceExamineManagement
         /// <exception cref="NotImplementedException"></exception>
         public async Task<string> UpdatePlanDate(UpdateDto input)
         {
-            WorkOrdMaster workOrd = _workOrdMaster.Select(p=>p.IsActive && p.Domain == input.domain && p.WorkOrd == input.workord).FirstOrDefault();
-            if (workOrd == null)
-            {
-                return "NO|工单【"+input.workord+"】不存在,请联系系统管理员!";
-            }
-            //更新工单计划开工日期,调整是否需要处理提前期状态字段为B
-            workOrd.OrdDate = input.planDate;
-            workOrd.JointTyped = "B";
-            _workOrdMaster.Update(workOrd);
-
             //获取需要排产的工单(获取四周的工单:正常工单+已审批通过的特殊工单)
             DateTime endDate = DateTime.Now.Date.AddDays(28).AddDays(1);
             //取数开始时间为当前天的下一天
             DateTime startTime = DateTime.Now;
             //尚未开始生产的工单+正在生产的工单
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.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.ToLower() == "w")).ToList();
-            //调用优先级计算算法
-            workOrds = _replenishmentAppService.CalcPriority(workOrds.Select(p=>p.WorkOrd).ToList(), input.domain);
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.domain && (p.WorkOrd == input.workord || (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.ToLower() == "w")).ToList();
+            if (!workOrds.Exists(p=>p.WorkOrd == input.workord))
+            {
+                return "NO|工单【" + input.workord + "】不存在,请联系系统管理员!";
+            }
+            //计算工单优先级
+            var workInfos = _replenishmentAppService.CalcPriority(workOrds.Select(p => p.WorkOrd).ToList(), input.domain);
+            workOrds.ForEach(p => {
+                p.OrdDate = p.WorkOrd == input.workord ? input.planDate : p.OrdDate;
+                p.JointTyped = p.WorkOrd == input.workord ? "B" : p.JointTyped;
+                p.Priority = p.WorkOrd == input.workord ? workInfos.First(p => p.WorkOrd == input.workord).Priority : p.Priority;
+            });
             //执行排产
-            string result = "OK";
             if (workOrds.Any())
             {
-                result = await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, input.domain, 2);
+                await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, input.domain, 2);
             }
-            return result;
+            //更新原工单优先级
+            WorkOrdMaster workOrd = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.domain && p.WorkOrd == input.workord).FirstOrDefault();
+            workOrd.Priority = workInfos.First(p => p.WorkOrd == workOrd.WorkOrd).Priority;
+            workOrd.JointTyped = "";
+            _workOrdMaster.Update(workOrd);
+            return "OK";
         }
 
         /// <summary>