Explorar el Código

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

Murphy hace 2 años
padre
commit
2b999014fc

+ 13 - 1
MicroServices/Business/Business.Application/ResourceExamineManagement/MorderAppService.cs

@@ -94,6 +94,7 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         public List<mo_mes_mooccupy> mo_Mes_Mooccupies = new List<mo_mes_mooccupy>();
 
+        private readonly SerialNumberAppService _serialNumberAppService;
 
         private readonly ISqlRepository<rf_serialnumber> _rf_serialnumber;
         #endregion
@@ -110,6 +111,7 @@ namespace Business.ResourceExamineManagement
             //IRepository<crm_seorder, long> mysql_crm_seorder,
             //IRepository<crm_seorderentry, long> mysql_crm_seorderentry,
             ProductExamineAppService productExamineAppService,
+            SerialNumberAppService serialNumberAppService,
             ISqlRepository<rf_serialnumber> rf_serialnumber
             )
         {
@@ -121,6 +123,7 @@ namespace Business.ResourceExamineManagement
             //_mysql_crm_seorderentry = mysql_crm_seorderentry;
             _productExamineAppService = productExamineAppService;
             _rf_serialnumber = rf_serialnumber;
+            _serialNumberAppService = serialNumberAppService;
         }
         #endregion
 
@@ -149,7 +152,16 @@ namespace Business.ResourceExamineManagement
             //mes_Morder.morder_icitem_type
             mes_Morder.work_order_type = generateMorderDto.work_order_type;
             mes_Morder.morder_state = generateMorderDto.morder_state;
-            mes_Morder.morder_no = GetMaxSerialNumber(418022612537413);//WWPO
+            
+            var nbrlistDto = _serialNumberAppService.GetBillNo(param.factoryId.ToString(), "M5", 1, "", 1);
+            if (nbrlistDto.Any())
+            {
+                mes_Morder.morder_no = nbrlistDto[0].NbrResult;
+            }
+            else {
+                //补救
+                mes_Morder.morder_no = GetMaxSerialNumber(418022612537413);//WWPO
+            }
             mes_Morder.fms_number = generateMorderDto.ic_Item.fms_number;
             mes_Morder.bom_number = generateMorderDto.BomNumber;
             mes_Morder.fmodel = generateMorderDto.ic_Item.model;

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

@@ -21,6 +21,7 @@ using IdentityModel.Client;
 using Amazon.Runtime;
 using Magicodes.ExporterAndImporter.Core.Extension;
 using Volo.Abp.Domain.Repositories;
+using System.Runtime.CompilerServices;
 
 namespace Business.ResourceExamineManagement
 {
@@ -349,22 +350,70 @@ namespace Business.ResourceExamineManagement
             List<WorkOrdMstDto> workDtos = new List<WorkOrdMstDto>();
             foreach (var item in notSchedules)
             {
+                //注:特殊工单暂时只考虑连续生产,不考虑暂停
+                //特殊工单工序
                 var curOp = tsWoRoutings.Where(p => p.WorkOrd == item.WorkOrd).OrderByDescending(p => p.OP).First();
-                //剩余排产数量
-                decimal qtyNeed = item.QtyOrded - curOp.QtyComplete;
-                //剩余工作时长(分钟)
-                decimal usedTime = Math.Ceiling(qtyNeed / item.QtyOrded * item.LbrVar * 60);
                 //特殊工单排产开始时间
                 DateTime tStartTime = item.OrdDate.GetValueOrDefault();
-                //如果当前特殊工单正在生产,则开工日期为当天的下一个工作日
-                if (item.Status.ToLower() == "w" && item.JointTyped.ToUpper() != "B")
+                //获取特殊工单开始排产时间记录
+                var curRecord = timeRecords.FirstOrDefault(p=>p.WorkOrd == item.WorkOrd && p.Op == curOp.OP);
+                if (curRecord == null)
+                {
+                    //添加记录
+                    inserts.Add(new WorkOrdSetupTimeRecord
+                    {
+                        Domain = item.Domain,
+                        WorkOrd = item.WorkOrd,
+                        ItemNum = item.ItemNum,
+                        Op = curOp.OP,
+                        Line = item.ProdLine,
+                        StartTime = tStartTime,
+                        CreateTime = DateTime.Now
+                    });
+                    //记录工序开始准备时间记录
+                    timeRecords.Add(new WorkOrdSetupTimeRecord
+                    {
+                        Domain = item.Domain,
+                        WorkOrd = item.WorkOrd,
+                        ItemNum = item.ItemNum,
+                        Op = curOp.OP,
+                        Line = item.ProdLine,
+                        StartTime = tStartTime,
+                        CreateTime = DateTime.Now
+                    });
+                }
+                //如果产线有准备时间记录且准备开始时间在当前时间之前,说明已在排产中,此时开始排产日期为当前时间
+                else if (curRecord != null && curRecord.StartTime < scheTime)
                 {
-                    DateTime nowDate = DateTime.Now.Date;
-                    //当前产线的工作日历
-                    var mLCalendars = calendars.Where(p => p.ProdLine == item.ProdLine || string.IsNullOrEmpty(p.ProdLine)).ToList();
-                    //获取下一个工作日
-                    startTime = GetNextWorkDay((int)nowDate.DayOfWeek, nowDate, mLCalendars);
+                    tStartTime = scheTime;
                 }
+                //计算开始排产时间或者上次报工时间到当前时间点的预估产能
+                decimal sumTimes = 0m;
+                //工单没有报工记录
+                if (curOp.Last == null)
+                {
+                    if (curRecord == null)
+                    {
+                        //工单没有开始时间记录,取预计开工时间到当前时间的有效时长
+                        sumTimes = CalcTimeMins(tStartTime, scheTime, item.ProdLine);
+                    }
+                    else
+                    {
+                        //工单有开始时间记录,取开始时间到当前时间的有效时长
+                        sumTimes = CalcTimeMins(curRecord.StartTime, scheTime, item.ProdLine);
+                    }
+                }
+                else {
+                    //工单有报工记录,取最新报工时间到当前时间的有效时长
+                    sumTimes = CalcTimeMins(curOp.Last.GetValueOrDefault(), scheTime, item.ProdLine);
+                }
+                //计算预估数量
+                decimal planQty = Math.Ceiling(sumTimes / (item.LbrVar * 60) * item.QtyOrded);
+                //剩余排产数量 = 工单数量 - 已报工数量 - 计划数量
+                decimal qtyNeed = item.QtyOrded - curOp.QtyComplete - planQty;
+                //剩余工作时长(分钟)
+                decimal usedTime = Math.Ceiling(qtyNeed / item.QtyOrded * item.LbrVar * 60);
+                
                 workDtos.Add(new WorkOrdMstDto
                 {
                     WorkOrd = item.WorkOrd,
@@ -669,8 +718,8 @@ namespace Business.ResourceExamineManagement
             List<ScheduleResultOpMaster> curScheduleRsts = new List<ScheduleResultOpMaster>();
             //记录上一产线排产开始时间
             LineStartDto lineStart = new LineStartDto();
-            //产线开工时间默认为当前日期的下一天
-            lineStart.StartTime = DateTime.Now.Date.AddDays(1);
+            //产线开工时间默认为当前时间
+            lineStart.StartTime = scheTime;
             TimeSpan span = TimeSpan.Zero;
             //第一层级工序有几个关键工序,就有几条产线
             for (int i = 0; i < workOrdRoutings.Count; i++)
@@ -695,7 +744,7 @@ namespace Business.ResourceExamineManagement
                 //当前产线的休息时间设置
                 var mlqtyWorkDtls = qualityLines.Where(p => p.ProdLine == lineStart.Line).ToList();
                 //产线排产开始时间
-                DateTime workStartTime = lineStart.StartTime;
+                DateTime workStartTime = scheTime;
                 //记录特殊工单:获取第一天是否有特殊工单
                 List<WorkOrdMaster> fstWOMasters = tsWorkOrds.Where(p => p.ProdLine == lineStart.Line && p.OrdDate.Value.Date == workStartTime.Date).OrderBy(p => p.Priority).ToList();
                 List<WorkOrdMstDto> workDtos = new List<WorkOrdMstDto>();
@@ -713,7 +762,38 @@ namespace Business.ResourceExamineManagement
                 {
                     foreach (var item in fstWOMasters)
                     {
+                        //注:特殊工单暂时只考虑连续生产,不考虑暂停
+                        //特殊工单工序
                         var curOp = tsWoRoutings.Where(p => p.WorkOrd == item.WorkOrd).OrderByDescending(p => p.OP).First();
+                        //获取特殊工单开始排产时间记录
+                        var curRecord = timeRecords.FirstOrDefault(p => p.WorkOrd == item.WorkOrd && p.Op == curOp.OP);
+                        //if (curRecord == null)
+                        //{
+                        //    //添加记录
+                        //    inserts.Add(new WorkOrdSetupTimeRecord
+                        //    {
+                        //        Domain = item.Domain,
+                        //        WorkOrd = item.WorkOrd,
+                        //        ItemNum = item.ItemNum,
+                        //        Op = curOp.OP,
+                        //        Line = item.ProdLine,
+                        //        StartTime = tStartTime,
+                        //        CreateTime = DateTime.Now
+                        //    });
+                        //    //记录工序开始准备时间记录
+                        //    timeRecords.Add(new WorkOrdSetupTimeRecord
+                        //    {
+                        //        Domain = item.Domain,
+                        //        WorkOrd = item.WorkOrd,
+                        //        ItemNum = item.ItemNum,
+                        //        Op = curOp.OP,
+                        //        Line = item.ProdLine,
+                        //        StartTime = tStartTime,
+                        //        CreateTime = DateTime.Now
+                        //    });
+                        //}
+
+
                         //剩余排产数量
                         decimal qtyNeed = item.QtyOrded - curOp.QtyComplete;
                         //剩余工作时长(分钟)