Преглед на файлове

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

Murphy преди 2 години
родител
ревизия
4bfa4cc037

+ 7 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/IResourceExamineAppService.cs

@@ -42,6 +42,13 @@ namespace Business.ResourceExamineManagement
         /// <returns></returns>
         /// <returns></returns>
         Task<string> ReceiveResult(string ids, int type,string companyid);
         Task<string> ReceiveResult(string ids, int type,string companyid);
 
 
+        /// <summary>
+        /// 自动任务执行资源检查
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        Task<string> receiveresultControllerApi(string companyid);
+
         /// <summary>
         /// <summary>
         /// 自动下达
         /// 自动下达
         /// </summary>
         /// </summary>

+ 193 - 40
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -411,6 +411,7 @@ namespace Business.ResourceExamineManagement
                 decimal planQty = Math.Ceiling(sumTimes / (item.LbrVar * 60) * item.QtyOrded);
                 decimal planQty = Math.Ceiling(sumTimes / (item.LbrVar * 60) * item.QtyOrded);
                 //剩余排产数量 = 工单数量 - 已报工数量 - 计划数量
                 //剩余排产数量 = 工单数量 - 已报工数量 - 计划数量
                 decimal qtyNeed = item.QtyOrded - curOp.QtyComplete - planQty;
                 decimal qtyNeed = item.QtyOrded - curOp.QtyComplete - planQty;
+                qtyNeed = qtyNeed < 0 ? 0 : qtyNeed;
                 //剩余工作时长(分钟)
                 //剩余工作时长(分钟)
                 decimal usedTime = Math.Ceiling(qtyNeed / item.QtyOrded * item.LbrVar * 60);
                 decimal usedTime = Math.Ceiling(qtyNeed / item.QtyOrded * item.LbrVar * 60);
                 
                 
@@ -491,15 +492,15 @@ namespace Business.ResourceExamineManagement
                     //获取当天重新排产的工单日计划
                     //获取当天重新排产的工单日计划
                     var tdSeqDtls = periodSequenceDtls.Where(p => p.PlanDate == scheTime.Date).ToList();
                     var tdSeqDtls = periodSequenceDtls.Where(p => p.PlanDate == scheTime.Date).ToList();
                     var tdSchMsts = scheduleMasters.Where(p => p.WorkDate == scheTime.Date).ToList();
                     var tdSchMsts = scheduleMasters.Where(p => p.WorkDate == scheTime.Date).ToList();
-                    //删除数据库中的已存在的日计划
-                    _periodSequenceDet.Delete(p=>p.Domain == domain && tdSeqDtls.Select(m => m.WorkOrds).Contains(p.WorkOrds) && p.PlanDate == scheTime.Date);
-                    _scheduleResultOpMaster.Delete(p=>p.Domain == domain && tdSchMsts.Select(m => m.WorkOrd).Contains(p.WorkOrd) && p.WorkDate == scheTime.Date);
+                    //删除数据库中的已存在的当天日计划
+                    _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);
+                    _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);
                     //更新当天日计划的计划数量,排产数量
                     //更新当天日计划的计划数量,排产数量
                     foreach (var item in periodSequenceDtls)
                     foreach (var item in periodSequenceDtls)
                     {
                     {
                         item.UDeci1 = item.OrdQty.GetValueOrDefault();
                         item.UDeci1 = item.OrdQty.GetValueOrDefault();
                         //获取历史排产数据
                         //获取历史排产数据
-                        var curDtl = dbPeriodSequences.FirstOrDefault(p => p.WorkOrds == item.WorkOrds && p.Line == item.Line && p.PlanDate == scheTime.Date);
+                        var curDtl = dbPeriodSequences.FirstOrDefault(p => p.Op == item.Op && p.WorkOrds == item.WorkOrds && p.Line == item.Line && p.PlanDate == scheTime.Date);
                         item.OrdQty = curDtl == null ? item.OrdQty : curDtl.OrdQty;
                         item.OrdQty = curDtl == null ? item.OrdQty : curDtl.OrdQty;
                     }
                     }
                     //保存日计划数据
                     //保存日计划数据
@@ -724,11 +725,6 @@ namespace Business.ResourceExamineManagement
             //第一层级工序有几个关键工序,就有几条产线
             //第一层级工序有几个关键工序,就有几条产线
             for (int i = 0; i < workOrdRoutings.Count; i++)
             for (int i = 0; i < workOrdRoutings.Count; i++)
             {
             {
-                //如果当前工序已经生产完成,则跳过
-                if (workOrdRoutings[i].QtyComplete == workOrd.QtyOrded)
-                {
-                    continue;
-                }
                 //产线实际排产开始时间
                 //产线实际排产开始时间
                 if (i == 0)//第一条产线
                 if (i == 0)//第一条产线
                 {
                 {
@@ -739,12 +735,18 @@ namespace Business.ResourceExamineManagement
                     //获取前一产线排产开始时间,通过提前期计算当前产线排产开始时间
                     //获取前一产线排产开始时间,通过提前期计算当前产线排产开始时间
                     lineStart = DealNextStartTime(workOrd, lineStart, workOrdRoutings[i], prodLines, allResults);
                     lineStart = DealNextStartTime(workOrd, lineStart, workOrdRoutings[i], prodLines, allResults);
                 }
                 }
+                //如果当前工序已经生产完成,则跳过
+                if (lineStart.QtyRemain == 0)
+                {
+                    continue;
+                }
+
                 //当前产线的工作日历
                 //当前产线的工作日历
                 var mLCalendars = calendars.Where(p => p.ProdLine == lineStart.Line || string.IsNullOrEmpty(p.ProdLine)).ToList();
                 var mLCalendars = calendars.Where(p => p.ProdLine == lineStart.Line || string.IsNullOrEmpty(p.ProdLine)).ToList();
                 //当前产线的休息时间设置
                 //当前产线的休息时间设置
                 var mlqtyWorkDtls = qualityLines.Where(p => p.ProdLine == lineStart.Line).ToList();
                 var mlqtyWorkDtls = qualityLines.Where(p => p.ProdLine == lineStart.Line).ToList();
                 //产线排产开始时间
                 //产线排产开始时间
-                DateTime workStartTime = scheTime;
+                DateTime workStartTime = lineStart.StartTime;
                 //记录特殊工单:获取第一天是否有特殊工单
                 //记录特殊工单:获取第一天是否有特殊工单
                 List<WorkOrdMaster> fstWOMasters = tsWorkOrds.Where(p => p.ProdLine == lineStart.Line && p.OrdDate.Value.Date == workStartTime.Date).OrderBy(p => p.Priority).ToList();
                 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>();
                 List<WorkOrdMstDto> workDtos = new List<WorkOrdMstDto>();
@@ -763,39 +765,86 @@ namespace Business.ResourceExamineManagement
                     foreach (var item in fstWOMasters)
                     foreach (var item in fstWOMasters)
                     {
                     {
                         //注:特殊工单暂时只考虑连续生产,不考虑暂停
                         //注:特殊工单暂时只考虑连续生产,不考虑暂停
+                        DateTime tsStartTime = workStartTime;
+                        var first = fstWOMasters.First();
+                        if (item != first)
+                        {
+                            tsStartTime = item.OrdDate.GetValueOrDefault();
+                        }
                         //特殊工单工序
                         //特殊工单工序
                         var curOp = tsWoRoutings.Where(p => p.WorkOrd == item.WorkOrd).OrderByDescending(p => p.OP).First();
                         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);
                         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;
+                        //如果产线有准备时间记录且准备开始时间在当前时间之前,说明已在排产中,此时不需要重新获取产线
+                        if (curRecord != null && curRecord.StartTime < tsStartTime)
+                        {
+                            tsStartTime = workStartTime;
+                        }
+                        else
+                        {
+                            if (curRecord == null)
+                            {
+                                //添加记录
+                                inserts.Add(new WorkOrdSetupTimeRecord
+                                {
+                                    Domain = item.Domain,
+                                    WorkOrd = item.WorkOrd,
+                                    ItemNum = item.ItemNum,
+                                    Op = curOp.OP,
+                                    Line = item.ProdLine,
+                                    StartTime = tsStartTime,
+                                    CreateTime = DateTime.Now
+                                });
+                                //记录工序开始准备时间记录
+                                timeRecords.Add(new WorkOrdSetupTimeRecord
+                                {
+                                    Domain = item.Domain,
+                                    WorkOrd = item.WorkOrd,
+                                    ItemNum = item.ItemNum,
+                                    Op = curOp.OP,
+                                    Line = item.ProdLine,
+                                    StartTime = tsStartTime,
+                                    CreateTime = DateTime.Now
+                                });
+                            }
+                            else
+                            {
+                                //更新准备开始时间记录
+                                timeRecords.ForEach(p =>
+                                {
+                                    p.StartTime = p.WorkOrd == curRecord.WorkOrd && p.Op == curRecord.Op ? tsStartTime : p.StartTime;
+                                });
+                                //存在开始准备时间记录,则更新
+                                curRecord.StartTime = tsStartTime;
+                                updates.Add(curRecord);
+                            }
+                        }
+                        //计算开始排产时间或者上次报工时间到当前时间点的预估产能
+                        decimal sumWorkTimes = 0m;
+                        //工单没有报工记录
+                        if (curOp.Last == null)
+                        {
+                            if (curRecord == null)
+                            {
+                                //工单没有开始时间记录,取预计开工时间到当前时间的有效时长
+                                sumWorkTimes = 0m;
+                            }
+                            else
+                            {
+                                //工单有开始时间记录,取开始时间到当前时间的有效时长
+                                sumWorkTimes = CalcTimeMins(curRecord.StartTime, workStartTime, item.ProdLine);
+                            }
+                        }
+                        else
+                        {
+                            //工单有报工记录,取最新报工时间到当前时间的有效时长
+                            sumWorkTimes = CalcTimeMins(curOp.Last.GetValueOrDefault(), workStartTime, item.ProdLine);
+                        }
+                        //计算预估数量
+                        decimal planQty = Math.Ceiling(sumWorkTimes / (item.LbrVar * 60) * item.QtyOrded);
+                        //剩余排产数量 = 工单数量 - 已报工数量 - 计划数量
+                        decimal qtyNeed = item.QtyOrded - curOp.QtyComplete - planQty;
+                        qtyNeed = qtyNeed < 0 ? 0 : qtyNeed;
                         //剩余工作时长(分钟)
                         //剩余工作时长(分钟)
                         decimal usedTime = Math.Ceiling(qtyNeed / item.QtyOrded * item.LbrVar * 60);
                         decimal usedTime = Math.Ceiling(qtyNeed / item.QtyOrded * item.LbrVar * 60);
                         workDtos.Add(new WorkOrdMstDto
                         workDtos.Add(new WorkOrdMstDto
@@ -848,7 +897,35 @@ namespace Business.ResourceExamineManagement
                             //记录新增待排产特殊工单
                             //记录新增待排产特殊工单
                             foreach (var item in secWOMasters)
                             foreach (var item in secWOMasters)
                             {
                             {
+                                //注:特殊工单暂时只考虑连续生产,不考虑暂停
                                 var curOp = tsWoRoutings.Where(p => p.WorkOrd == item.WorkOrd).OrderByDescending(p => p.OP).First();
                                 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 = item.OrdDate.GetValueOrDefault(),
+                                        CreateTime = DateTime.Now
+                                    });
+                                    //记录工序开始准备时间记录
+                                    timeRecords.Add(new WorkOrdSetupTimeRecord
+                                    {
+                                        Domain = item.Domain,
+                                        WorkOrd = item.WorkOrd,
+                                        ItemNum = item.ItemNum,
+                                        Op = curOp.OP,
+                                        Line = item.ProdLine,
+                                        StartTime = item.OrdDate.GetValueOrDefault(),
+                                        CreateTime = DateTime.Now
+                                    });
+                                }
                                 //剩余排产数量
                                 //剩余排产数量
                                 decimal qtyNeed = item.QtyOrded - curOp.QtyComplete;
                                 decimal qtyNeed = item.QtyOrded - curOp.QtyComplete;
                                 //剩余工作时长(分钟)
                                 //剩余工作时长(分钟)
@@ -1037,6 +1114,33 @@ namespace Business.ResourceExamineManagement
                                 foreach (var item in secWOMasters)
                                 foreach (var item in secWOMasters)
                                 {
                                 {
                                     var curOp = tsWoRoutings.Where(p => p.WorkOrd == item.WorkOrd).OrderByDescending(p => p.OP).First();
                                     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 = item.OrdDate.GetValueOrDefault(),
+                                            CreateTime = DateTime.Now
+                                        });
+                                        //记录工序开始准备时间记录
+                                        timeRecords.Add(new WorkOrdSetupTimeRecord
+                                        {
+                                            Domain = item.Domain,
+                                            WorkOrd = item.WorkOrd,
+                                            ItemNum = item.ItemNum,
+                                            Op = curOp.OP,
+                                            Line = item.ProdLine,
+                                            StartTime = item.OrdDate.GetValueOrDefault(),
+                                            CreateTime = DateTime.Now
+                                        });
+                                    }
                                     //剩余排产数量
                                     //剩余排产数量
                                     decimal qtyNeed = item.QtyOrded - curOp.QtyComplete;
                                     decimal qtyNeed = item.QtyOrded - curOp.QtyComplete;
                                     //剩余工作时长(分钟)
                                     //剩余工作时长(分钟)
@@ -1302,6 +1406,33 @@ namespace Business.ResourceExamineManagement
                             foreach (var item in secWOMasters)
                             foreach (var item in secWOMasters)
                             {
                             {
                                 var curOp = tsWoRoutings.Where(p => p.WorkOrd == item.WorkOrd).OrderByDescending(p => p.OP).First();
                                 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 = item.OrdDate.GetValueOrDefault(),
+                                        CreateTime = DateTime.Now
+                                    });
+                                    //记录工序开始准备时间记录
+                                    timeRecords.Add(new WorkOrdSetupTimeRecord
+                                    {
+                                        Domain = item.Domain,
+                                        WorkOrd = item.WorkOrd,
+                                        ItemNum = item.ItemNum,
+                                        Op = curOp.OP,
+                                        Line = item.ProdLine,
+                                        StartTime = item.OrdDate.GetValueOrDefault(),
+                                        CreateTime = DateTime.Now
+                                    });
+                                }
                                 //剩余排产数量
                                 //剩余排产数量
                                 decimal qtyNeed = item.QtyOrded - curOp.QtyComplete;
                                 decimal qtyNeed = item.QtyOrded - curOp.QtyComplete;
                                 //剩余工作时长(分钟)
                                 //剩余工作时长(分钟)
@@ -3885,6 +4016,13 @@ namespace Business.ResourceExamineManagement
             scheduledDto.EndTime = workPoints.Last().EndPoint;
             scheduledDto.EndTime = workPoints.Last().EndPoint;
             //计算starttime处于那个工作时间段
             //计算starttime处于那个工作时间段
             var curPoint = workPoints.Where(p => startTime >= p.StartPoint && startTime <= p.EndPoint).First();
             var curPoint = workPoints.Where(p => startTime >= p.StartPoint && startTime <= p.EndPoint).First();
+            //开始时间不在工作时间段
+            if (curPoint == null)
+            {
+                //获取离开始时间最近的时间段
+                curPoint = workPoints.Where(p => p.EndPoint < startTime).OrderBy(p => p.Level).Last();
+                startTime = curPoint.EndPoint;
+            }
             TimeSpan span = curPoint.EndPoint - startTime;
             TimeSpan span = curPoint.EndPoint - startTime;
             scheduledDto.EffTime = (decimal)span.TotalMinutes;
             scheduledDto.EffTime = (decimal)span.TotalMinutes;
             //获取后续工作时间段的有效工作时间
             //获取后续工作时间段的有效工作时间
@@ -3900,7 +4038,15 @@ namespace Business.ResourceExamineManagement
             var curLevel = curRunCrews.FirstOrDefault(p => p.StartDate.GetValueOrDefault().Date <= startTime.Date && p.EndDate.GetValueOrDefault().Date >= startTime.Date);
             var curLevel = curRunCrews.FirstOrDefault(p => p.StartDate.GetValueOrDefault().Date <= startTime.Date && p.EndDate.GetValueOrDefault().Date >= startTime.Date);
             decimal rate = curLevel == null ? lineStart.Rate : curLevel.Rate;
             decimal rate = curLevel == null ? lineStart.Rate : curLevel.Rate;
             scheduledDto.Rate = rate;
             scheduledDto.Rate = rate;
-            //计算当天的产能(向下取整)
+            //产线当天加班设置
+            var curOccupyTimes = resourceOccupancyTimes.Where(p => p.Resource == lineStart.Line && p.StartTime.GetValueOrDefault().Date == startTime.Date).OrderBy(p => p.StartTime).ToList();
+            scheduledDto.EffTime += curOccupyTimes.Sum(p=> Convert.ToDecimal(p.Ufld1) * 60);
+            if (curOccupyTimes.Any())
+            {
+                var last = curOccupyTimes.Last();
+                scheduledDto.EndTime = last.StartTime.GetValueOrDefault().AddHours(Convert.ToDouble(last.Ufld1));
+            }
+            //计算当天的产能(向上取整)
             scheduledDto.ProductQty = Math.Ceiling(scheduledDto.EffTime / 60 * rate);
             scheduledDto.ProductQty = Math.Ceiling(scheduledDto.EffTime / 60 * rate);
             //计算班次
             //计算班次
             scheduledDto.Period = 1;//默认一班制
             scheduledDto.Period = 1;//默认一班制
@@ -3934,6 +4080,11 @@ namespace Business.ResourceExamineManagement
             if (curRecord != null && curRecord.StartTime < actStart)
             if (curRecord != null && curRecord.StartTime < actStart)
             {
             {
                 var curLine = lines.First(p=>p.Line == curRecord.Line);
                 var curLine = lines.First(p=>p.Line == curRecord.Line);
+                //计算产线实际开始时间
+                //产线工作日历:当前产线的工作日历 + 默认工作日历
+                var curCalendars = calendars.Where(p => p.ProdLine == curLine.Line || string.IsNullOrEmpty(p.ProdLine)).ToList();
+                var curQtyDtls = qualityLines.Where(p => p.ProdLine == curLine.Line).ToList();
+                actStart = CalcActStartTime(curLine.Line, actStart, curCalendars, curQtyDtls);
                 lineStart.RecID = curLine.RecID;
                 lineStart.RecID = curLine.RecID;
                 lineStart.Line = curLine.Line;
                 lineStart.Line = curLine.Line;
                 lineStart.StartTime = actStart;
                 lineStart.StartTime = actStart;
@@ -4049,6 +4200,7 @@ namespace Business.ResourceExamineManagement
             }
             }
             //剩余待排产数量=工单数量-已报工数量-预估数量
             //剩余待排产数量=工单数量-已报工数量-预估数量
             lineStart.QtyRemain = workOrd.QtyOrded - routing.QtyComplete - planQty;
             lineStart.QtyRemain = workOrd.QtyOrded - routing.QtyComplete - planQty;
+            lineStart.QtyRemain = lineStart.QtyRemain < 0 ? 0 : lineStart.QtyRemain;
             return lineStart;
             return lineStart;
         }
         }
 
 
@@ -4436,6 +4588,7 @@ namespace Business.ResourceExamineManagement
             }
             }
             //剩余待排产数量=工单数量-已报工数量-预估数量
             //剩余待排产数量=工单数量-已报工数量-预估数量
             startDto.QtyRemain = workOrd.QtyOrded - routing.QtyComplete - planQty;
             startDto.QtyRemain = workOrd.QtyOrded - routing.QtyComplete - planQty;
+            startDto.QtyRemain = startDto.QtyRemain < 0 ? 0 : startDto.QtyRemain;
             return startDto;
             return startDto;
         }
         }
 
 

+ 32 - 5
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -576,6 +576,23 @@ namespace Business.ResourceExamineManagement
         }
         }
         #endregion
         #endregion
 
 
+        /// <summary>
+        /// 自动任务执行资源检查
+        /// </summary>
+        /// <param name="companyid"></param>
+        /// <returns></returns>
+        public async Task<string> receiveresultControllerApi(string companyid)
+        {
+            var seorders = _mysql_crm_seorder.GetListAsync(s => s.company_id.ToString() == companyid).Result;
+            string ids = string.Join(',', seorders.Select(x => x.Id));
+            var rtn = await ReceiveResult(ids, 0, companyid);
+            if (rtn == "ok")
+            {
+                rtn = await ReviewExamineResult(ids, 0);
+            }
+            return rtn;
+        }
+
         /// <summary>
         /// <summary>
         /// 资源检查 -- TODO:根据客户的不同标准交货期(假如客户设定10天),如果检查交期小于标准交货期(10天),则默认把建议交期调整为10天。
         /// 资源检查 -- TODO:根据客户的不同标准交货期(假如客户设定10天),如果检查交期小于标准交货期(10天),则默认把建议交期调整为10天。
         /// </summary>
         /// </summary>
@@ -1003,7 +1020,6 @@ namespace Business.ResourceExamineManagement
             }
             }
         }
         }
 
 
-
         //PR手动合并
         //PR手动合并
         public async Task<string> PrMerge(string ids)
         public async Task<string> PrMerge(string ids)
         {
         {
@@ -3975,12 +3991,14 @@ namespace Business.ResourceExamineManagement
             if (nbrMasterList.Any())
             if (nbrMasterList.Any())
             {
             {
                 string seqSql = "";
                 string seqSql = "";
-               var weekplan = _replenishmentWeekPlan.GetListAsync(s => s.factory_id.ToString() == domain && workOrdMasters.Select(x => x.WorkOrd).Contains(s.OrderNO)).Result;
+                var weekplan = _replenishmentWeekPlan.GetListAsync(s => s.factory_id.ToString() == domain && workOrdMasters.Select(x => x.WorkOrd).Contains(s.ProductionOrder)).Result;
                 var worklistDto = _serialNumberAppService.GetBillNo(domain, "WOlot", workOrdMasters.Count, userAccount, 1);
                 var worklistDto = _serialNumberAppService.GetBillNo(domain, "WOlot", workOrdMasters.Count, userAccount, 1);
                 var rstSeqId = _serialNumberAppService.GetSeqIdList(domain, 1, 1);
                 var rstSeqId = _serialNumberAppService.GetSeqIdList(domain, 1, 1);
                 long seqId = 0;
                 long seqId = 0;
                 long.TryParse(rstSeqId, out seqId);
                 long.TryParse(rstSeqId, out seqId);
 
 
+                string strWoSql = "";
+                string strWoStuSql = "";
                 int index = 0;
                 int index = 0;
                 workOrdMasters.ForEach(p =>
                 workOrdMasters.ForEach(p =>
                 {
                 {
@@ -3998,11 +4016,13 @@ namespace Business.ResourceExamineManagement
                         }
                         }
                         index++;
                         index++;
                     }
                     }
-                    seqSql += "insert QadTracking(Ufld1,Domain,SeqID,TransType,Subject,[Order],Int1,CreateTime,CreateUser,UpdateTime,UpdateUser) " +
-                    "select 'A','" + domain + "'," + seqId.ToString() + ",'nbr-wo-mes','工单','" + p.WorkOrd + "'," + p.RecID + ",getdate(),CreateUser,getdate(),UpdateUser from WorkOrdMaster where RecID=" + p.RecID.ToString() + ";";
+                    //生成工单事务、工单下达事务
+                    strWoSql += "A,"+p.Domain+","+ seqId.ToString()+ ",nbr-wo-mes,工单," + p.WorkOrd+","+p.RecID+ "|";
+                    seqId++;
+                    strWoStuSql += "REL," + p.Domain + "," + seqId.ToString() + ",nbr-wo-stu,工单下达," + p.WorkOrd + "," + p.RecID + "|";
                     seqId++;
                     seqId++;
                 });
                 });
-                
+
                 var nbrlistDto = _serialNumberAppService.GetBillNo(workOrdMasters[0].Domain, "SM", nbrMasterList.Count, userAccount, 1);
                 var nbrlistDto = _serialNumberAppService.GetBillNo(workOrdMasters[0].Domain, "SM", nbrMasterList.Count, userAccount, 1);
                 if (nbrlistDto.Any())
                 if (nbrlistDto.Any())
                 {
                 {
@@ -4066,6 +4086,13 @@ namespace Business.ResourceExamineManagement
                             string sql =string.Format("exec pr_WMS_BPM_AddMobileTask @TaskID='{0}',@PlanDate='{1}',@ExecuterTypeID=2,@CreateUser='{2}'", a.Nbr, a.Date.Value.ToString("yyyy-MM-dd"), a.CreateUser);
                             string sql =string.Format("exec pr_WMS_BPM_AddMobileTask @TaskID='{0}',@PlanDate='{1}',@ExecuterTypeID=2,@CreateUser='{2}'", a.Nbr, a.Date.Value.ToString("yyyy-MM-dd"), a.CreateUser);
                             _businessDbContext.Database.ExecuteSqlRaw(sql);
                             _businessDbContext.Database.ExecuteSqlRaw(sql);
                         });
                         });
+                        if (!string.IsNullOrEmpty(strWoSql))
+                        {
+                            strWoSql = strWoSql.Substring(0, strWoSql.Length - 1);
+                            strWoStuSql = strWoStuSql.Substring(0, strWoStuSql.Length - 1);
+                            string sql = string.Format("exec pr_WMS_AddWorkOrdSeq @strWoSql='{0}',@strWoStuSql='{1}'", strWoSql, strWoStuSql);
+                            _businessBangDbContext.Database.ExecuteSqlRaw(sql);
+                        }
                         if (!string.IsNullOrEmpty(seqSql)) {
                         if (!string.IsNullOrEmpty(seqSql)) {
                             _businessBangDbContext.Database.ExecuteSqlRaw(seqSql);
                             _businessBangDbContext.Database.ExecuteSqlRaw(seqSql);
                         }
                         }

+ 33 - 8
MicroServices/Business/Business.Application/SystemJobManagement/SystemJobAppService.cs

@@ -621,20 +621,45 @@ namespace Business.SystemJobManagement
                 for (int i = 0; i < custList.Count; i++)
                 for (int i = 0; i < custList.Count; i++)
                 {
                 {
                     var ic_item = ic_itemList.Find(x => x.number == custList[i].ItemNum);
                     var ic_item = ic_itemList.Find(x => x.number == custList[i].ItemNum);
+                    int erpcls = 0;
+                    string erpclsText = "配置类";
+                    long itemId = help.NextId();
+                    if (custList[i].PurMfg == "P")
+                    {
+                        if (custList[i].EMTType == "50")
+                        {
+                            erpcls = 4;
+                            erpclsText = "虚拟";
+                        }
+                        else
+                        {
+                            erpcls = 3;
+                            erpclsText = "外购";
+                        }
+                    }
+                    else
+                    {
+                        if (custList[i].EMTType == "30")
+                        {
+                            erpcls = 2;
+                            erpclsText = "委外";
+                        }
+                        else
+                        {
+                            erpcls = 1;
+                            erpclsText = "自制";
+                        }
+                    }
                     if (ic_item == null)
                     if (ic_item == null)
                     {
                     {
-                        long itemId = help.NextId();
                         ItemsAdd.Add(new ic_item(itemId)
                         ItemsAdd.Add(new ic_item(itemId)
                         {
                         {
                             number = custList[i].ItemNum, //物料编码
                             number = custList[i].ItemNum, //物料编码
                             name = custList[i].Descr, //物料名称
                             name = custList[i].Descr, //物料名称
                             model = custList[i].Descr1,//规格型号
                             model = custList[i].Descr1,//规格型号
                             fversion = custList[i].Rev,//版本号
                             fversion = custList[i].Rev,//版本号
-                            //ext.FErpClsID == "配置类" ? 0 : ext.FErpClsID == "自制" ? 1 : ext.FErpClsID == "委外" ? 2 : ext.FErpClsID == "外购" ? 3 : ext.FErpClsID == "虚拟" ? 4 : ext.FErpClsID == "费用" ? 5 : ext.FErpClsID == "服务" ? 6 : -1;
-                            //erp_cls = custList[i].PurMfg == "P" ? 3 : 1,//物料属性
-                            erp_cls = custList[i].PurMfg == "P" ? 3 : 1,//物料属性
-                            //erp_cls_name = custList[i].PurMfg == "P" ? "外购" : "自制",//物料属性名称
-                            erp_cls_name = custList[i].PurMfg == "P" ? "外购" : "自制",//物料属性名称
+                            erp_cls = erpcls,//物料属性
+                            erp_cls_name = erpclsText,//物料属性名称
                             unit = custList[i].UM,//单位
                             unit = custList[i].UM,//单位
                             item_level = 0,//物料等级
                             item_level = 0,//物料等级
                             source = "",//来源
                             source = "",//来源
@@ -727,8 +752,8 @@ namespace Business.SystemJobManagement
                         ic_item.name = custList[i].Descr;
                         ic_item.name = custList[i].Descr;
                         ic_item.model = custList[i].Descr1;//规格型号
                         ic_item.model = custList[i].Descr1;//规格型号
                         ic_item.fversion = custList[i].Rev;//版本号
                         ic_item.fversion = custList[i].Rev;//版本号
-                        ic_item.erp_cls = custList[i].PurMfg == "P" ? 3 : 1;//物料属性
-                        ic_item.erp_cls_name = custList[i].PurMfg == "P" ? "外购" : "自制";//物料属性名称
+                        ic_item.erp_cls = erpcls;//物料属性
+                        ic_item.erp_cls_name = erpclsText;//物料属性名称
                         ic_item.unit = custList[i].UM;//单位
                         ic_item.unit = custList[i].UM;//单位
                         ic_item.clean_leadtime = custList[i].MFGMTTR;
                         ic_item.clean_leadtime = custList[i].MFGMTTR;
                         ic_item.PurLT = custList[i].PurLT;
                         ic_item.PurLT = custList[i].PurLT;

+ 5 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ItemMaster.cs

@@ -121,5 +121,10 @@ namespace Business.Domain
         /// </summary>
         /// </summary>
         [Comment("检验天数")]
         [Comment("检验天数")]
         public int InsLT { get; set; }
         public int InsLT { get; set; }
+
+        /// <summary>
+        /// 特殊采购类型
+        /// </summary>
+        public string EMTType { get; set; }
     }
     }
 }
 }

+ 18 - 0
MicroServices/Business/Business.Domain/StructuredDB/Production/WorkOrdMaster.cs

@@ -111,6 +111,24 @@ namespace Business.Domain
         [Comment("创建时间")]
         [Comment("创建时间")]
         public DateTime? CreateTime { get; set; }
         public DateTime? CreateTime { get; set; }
 
 
+        /// <summary>
+        /// 修改时间
+        /// </summary>
+        [Comment("修改时间")]
+        public DateTime? UpdateTime { get; set; }
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        [Comment("创建人")]
+        public string CreateUser { get; set; }
+
+        /// <summary>
+        /// 修改人
+        /// </summary>
+        [Comment("修改人")]
+        public string UpdateUser { get; set; }
+
         /// <summary>
         /// <summary>
         /// 类型:正常工单-空或者Null;反之则为特殊工单
         /// 类型:正常工单-空或者Null;反之则为特殊工单
         /// </summary>
         /// </summary>

+ 2 - 2
MicroServices/Business/Business.Domain/StructuredDB/Production/WorkOrdSetupTimeRecord.cs

@@ -52,9 +52,9 @@ namespace Business.StructuredDB.Production
         public int Op { get; set; }
         public int Op { get; set; }
 
 
         /// <summary>
         /// <summary>
-        /// 开始准备时间
+        /// 开始准备时间/开始时间
         /// </summary>
         /// </summary>
-        [Comment("开始准备时间")]
+        [Comment("开始准备时间/开始时间")]
         public DateTime StartTime { get; set; }
         public DateTime StartTime { get; set; }
 
 
         /// <summary>
         /// <summary>

+ 12 - 0
MicroServices/Business/Business.HttpApi/Controllers/ResourceExamineController.cs

@@ -80,6 +80,18 @@ namespace Business.Controllers
             return _ResourceExamineAppService.ReceiveResult(ids, type, companyid);
             return _ResourceExamineAppService.ReceiveResult(ids, type, companyid);
         }
         }
 
 
+        /// <summary>
+        /// 自动任务执行资源检查
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("receiveresultControllerApi")]
+        public Task<string> receiveresultControllerApi(string companyid)
+        {
+            return _ResourceExamineAppService.receiveresultControllerApi(companyid);
+        }
+
         /// <summary>
         /// <summary>
         /// 自动下达
         /// 自动下达
         /// </summary>
         /// </summary>