Просмотр исходного кода

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

tangdi 2 лет назад
Родитель
Сommit
ed4f3b2995

+ 24 - 0
MicroServices/Business/Business.Application.Contracts/Dto/WorkPriorityDto.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.Dto
+{
+    /// <summary>
+    /// 工单优先级Dto
+    /// </summary>
+    public class WorkPriorityDto
+    {
+        // <summary>
+        /// 工单编号
+        /// </summary>
+        public string WorkOrd { get; set; }
+
+        // <summary>
+        /// 优先级
+        /// </summary>
+        public decimal Priority { get; set; }
+    }
+}

+ 11 - 4
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -6352,7 +6352,7 @@ namespace Business.Replenishment
             //获取已发布且净需求数量大于0的交货计划数据
             var demandplans = _icdemandschedule.GetListAsync(p=>p.factory_id.ToString() == domain && p.status.ToUpper() == "P" && p.tosechedqty > 0 && !p.IsDeleted).Result;
             //获取已以生成交货单的交货计划
-            var alreadys = _srmpolistds.Select(p => p.domain == domain && demandplans.Select(m => m.Id).Contains(p.icdsid)).ToList();
+            var alreadys = _srmpolistds.Select(p => p.domain == domain && demandplans.Select(m => m.Id).Contains(p.icdsid) && p.isactive == 1).ToList();
             if (alreadys.Any())
             {
                 //交货计划存在已发布或者已关闭状态的交货单
@@ -6361,8 +6361,9 @@ namespace Business.Replenishment
                 var wfbDs = alreadys.Where(p => !yfbIds.Contains(p.icdsid)).ToList();
                 if (wfbDs.Any())
                 {
+                    wfbDs.ForEach(p => p.isactive = 0);
                     //删除未发布的交货单
-                    _srmpolistds.Delete(wfbDs);
+                    _srmpolistds.Update(wfbDs);
                 }
                 //过滤掉存在已发布或者已关闭交货单的交货计划
                 demandplans = demandplans.Where(p => !yfbIds.Contains(p.Id)).ToList();
@@ -6390,7 +6391,7 @@ namespace Business.Replenishment
             //获取采购单数据
             List<PurOrdMaster> purOrdMasters = _PurOrdMaster.Select(p => p.Domain == domain && purOrdDetails.Select(m => m.PurOrd).Distinct().Contains(p.PurOrd)).ToList();
             //获取占用可用PO明细的交货单
-            List<srm_polist_ds> dbPolistds = _srmpolistds.Select(p => purOrdDetails.Select(m => m.PurOrd).Contains(p.ponumber)).ToList();
+            List<srm_polist_ds> dbPolistds = _srmpolistds.Select(p => purOrdDetails.Select(m => m.PurOrd).Contains(p.ponumber) && p.isactive == 1).ToList();
 
             //生成交货单
             srm_polist_ds entity;
@@ -6634,6 +6635,7 @@ namespace Business.Replenishment
                         entity.createtime = DateTime.Now;
                         entity.createuser = user;
                         entity.remarks = "";
+                        entity.isactive = 1;
                         curInserts.Add(entity);
 
                         //当前交货计划已分配数量累加
@@ -6645,7 +6647,7 @@ namespace Business.Replenishment
                 //标志位为true,则当前交货计划无法转交货单
                 if (flag)
                 {
-                    break;
+                    continue;
                 }
                 inserts.AddRange(curInserts);
             }
@@ -6663,6 +6665,11 @@ namespace Business.Replenishment
                 inserts = inserts.OrderBy(p => p.createtime).ToList();
                 for (int i = 0; i < inserts.Count; i++)
                 {
+                    if (string.IsNullOrEmpty(nbrlist[i].NbrResult))
+                    {
+                        Msg = "NO|交货单号生成失败";
+                        return Msg;
+                    }
                     inserts[i].dsnum = nbrlist[i].NbrResult;
                 }
             }

+ 131 - 80
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -244,8 +244,8 @@ namespace Business.ResourceExamineManagement
             //取数开始时间为当前时间
             DateTime startTime = DateTime.Now;
             scheTime = startTime;
-            //尚未开始生产的工单+正在生产的工单
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && p.Status !="C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID >0 ))).ToList();
+            //尚未开始生产的工单+正在生产的工单(工单需求数量>已完成数量)
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && (p.QtyOrded - p.QtyCompleted) > 0 && p.Status !="C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID >0 ))).ToList();
             if (workOrds.Any())
             {
                 await DoProductSchedule(startTime, workOrds, domain, 1);
@@ -266,13 +266,43 @@ namespace Business.ResourceExamineManagement
             domain = factoryid;
             //记录排产开始时间
             scheTime = startTime;
-
-            //记录正在投产工单的优先级
-            var dbWorkOrds = workOrds.Where(p => p.Status.ToUpper() == "W").ToList();
-            //正在投产工单的优先级设为负数,确保重新排产时,正在投产的工单优先级最高
-            workOrds.ForEach(p => {
-                p.Priority = p.Status.ToUpper() == "W" ? -1 : p.Priority;
-            });
+            //获取工单领料单
+            var nbrMasterList = _nbrMaster.Select(x => x.Domain == domain && x.Type.ToUpper() == "SM" && workOrds.Select(s => s.WorkOrd).Contains(x.WorkOrd)).ToList();
+            workOrds = workOrds.OrderBy(p => p.Priority).ToList();
+            //记录工单数据
+            List<WorkPriorityDto> dbWorkOrds = workOrds.Select(p => new WorkPriorityDto { 
+                WorkOrd = p.WorkOrd,
+                Priority = p.Priority
+            }).ToList();
+            //处理工单优先级:正常投产工单优先级最高,其次是前处理状态为部分完成/全部完成,其他按照工单优先级排
+            decimal ytc = 1m;
+            decimal ktc = 10000m;
+            decimal bktc = 20000m;
+            for (int i = 0; i < workOrds.Count; i++)
+            {
+                //正在投产
+                if (workOrds[i].Status.ToUpper() == "W")
+                {
+                    workOrds[i].Priority = ytc;
+                    ytc++;
+                    continue;
+                }
+                var curNbrs = nbrMasterList.Where(p => p.WorkOrd == workOrds[i].WorkOrd).ToList();
+                //存在领料单:不需要前处理-领料单已关闭,需要前处理-状态为部分完成或者全部完成
+                if (curNbrs.Any() && !curNbrs.Exists(p => (p.TransType != "PrevProcess" && p.Status.ToUpper() != "C") || (p.TransType == "PrevProcess" && p.Ufld1 != "completed" && p.Ufld1 != "50")))
+                {
+                    workOrds[i].Priority = ktc;
+                    ktc++;
+                    continue;
+                }
+                //不存在领料单或者领料单未关闭或者前处理状态不为部分完成/全部完成
+                if (!curNbrs.Any() || curNbrs.Exists(p => (p.TransType != "PrevProcess" && p.Status.ToUpper() != "C") || (p.TransType == "PrevProcess" && p.Ufld1 != "completed" && p.Ufld1 != "50")))
+                {
+                    workOrds[i].Priority = bktc;
+                    bktc++;
+                    continue;
+                }
+            }
             //特殊工单指定时间开工,不需要计算产能,只需要计算时长即可
             var tsWorkOrds = workOrds.Where(p => !string.IsNullOrEmpty(p.Typed)).ToList();
             //正常工单
@@ -333,16 +363,16 @@ namespace Business.ResourceExamineManagement
             List<string> ypcWorkOrds = new List<string>();
             //按照优先级排序
             zcWorkOrds = zcWorkOrds.OrderBy(p=>p.Priority).ToList();
-            foreach (var item in zcWorkOrds)
+            for (int i = 0; i < zcWorkOrds.Count; i++)
             {
                 //记录产线占用情况
                 allResults.AddRange(scheduleMasters);
                 //当前工单工艺路线主产线的关键工序
-                var curRoutings = workOrdRoutings.Where(p =>p.WorkOrd == item.WorkOrd && p.ItemNum == item.ItemNum && p.ParentOp == 0 && p.MilestoneOp).OrderBy(p=>p.OP).ToList();
+                var curRoutings = workOrdRoutings.Where(p => p.WorkOrd == zcWorkOrds[i].WorkOrd && p.ItemNum == zcWorkOrds[i].ItemNum && p.ParentOp == 0 && p.MilestoneOp).OrderBy(p => p.OP).ToList();
                 //当前工单的产线明细
-                var curProdLines = prodLines.Where(p => p.Part == item.ItemNum).ToList();
+                var curProdLines = prodLines.Where(p => p.Part == zcWorkOrds[i].ItemNum).ToList();
                 //产线排产
-                LineSchedule(item, curRoutings, curProdLines, periodSequenceDtls, scheduleMasters, allResults, tsWorkOrds, ypcWorkOrds, tsWoRoutings);
+                LineSchedule(zcWorkOrds[i], curRoutings, curProdLines, periodSequenceDtls, scheduleMasters, allResults, tsWorkOrds, ypcWorkOrds, tsWoRoutings);
             }
             //判断是否有特殊工单没有排产,如果有,则对剩余特殊工单排产
             var notSchedules = tsWorkOrds.Where(p => !ypcWorkOrds.Contains(p.WorkOrd)).ToList();
@@ -430,47 +460,23 @@ namespace Business.ResourceExamineManagement
                 });
             }
             TsLineSchedule(workDtos, periodSequenceDtls, scheduleMasters);
-            //处理工单计划开始日期、计划结束日期
+            //回写工单优先级
             foreach (var item in workOrds)
             {
-                //2024-01-02调整:不回写工单计划开工日期,计划结束日期
-                //List<ScheduleResultOpMaster> scheduleList = scheduleMasters.Where(s => s.WorkOrd == item.WorkOrd).ToList();
-                //if (scheduleList.Any())
-                //{
-                //    item.OrdDate = scheduleList.Min(s => s.WorkStartTime);
-                //    item.DueDate = scheduleList.Max(s => s.WorkEndTime);
-                //}
-                //当前工单正在投产,则需要回写优先级
-                if (!string.IsNullOrEmpty(item.Status) && item.Status.ToUpper() == "W")
+                var curInfo = dbWorkOrds.FirstOrDefault(p => p.WorkOrd == item.WorkOrd);
+                if (curInfo != null)
                 {
-                    var curInfo = dbWorkOrds.FirstOrDefault(p => p.WorkOrd == item.WorkOrd);
-                    if (curInfo != null)
-                    {
-                        item.Priority = curInfo.Priority;
-                    }
+                    item.Priority = curInfo.Priority;
                 }
             }
-            //2024-01-02调整:不回写工单计划开工日期,计划结束日期
-            //var mesMorder = _mysql_mes_morder.GetListAsync(s => workOrds.Select(x => x.WorkOrd).Contains(s.morder_no) && s.factory_id.ToString() == domain).Result;
-            //if(mesMorder.Any()) {
-            //    foreach (var mo in mesMorder)
-            //    {
-            //        var wo = workOrds.Find(s => s.WorkOrd == mo.morder_no);
-            //        if (wo != null)
-            //        {
-            //            mo.moentry_sys_stime = wo.OrdDate;
-            //            mo.moentry_sys_etime = wo.DueDate;
-            //        }
-            //    }
-            //}
-
+            
             //取数开始时间为当前日期
             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();
+            var workordList = workOrds.Where(x => (x.Status.ToLower() == "r" || x.Status.ToLower() == "w") && thePeriods.Select(s => s.WorkOrds).Contains(x.WorkOrd)).ToList();
+            var theNbrMasters = nbrMasterList.Where(p => thePeriods.Select(s => s.WorkOrds).Contains(p.WorkOrd));
 
             //更新当天日计划的计划数量,排产数量
             foreach (var item in periodSequenceDtls)
@@ -483,42 +489,14 @@ namespace Business.ResourceExamineManagement
                 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")))
+                    var curNbrs = theNbrMasters.Where(p => p.WorkOrd == item.WorkOrds).ToList();
+                    if (curNbrs.Any() && !curNbrs.Exists(p=>(p.TransType != "PrevProcess" && p.Status.ToLower() != "c") || (p.TransType == "PrevProcess" && p.Ufld1 != "completed" && p.Ufld1 !="50")))
                     {
                         item.Status = "r";
                     }
                 }
             }
 
-            //获取计划日期在当前日期之前且报工数量为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
@@ -530,12 +508,6 @@ namespace Business.ResourceExamineManagement
                     }
                     //更新工单优先级
                     _workOrdMaster.Update(workOrds);
-                    //2024-01-02调整:不回写工单计划开工日期,计划结束日期
-                    //if (mesMorder.Any())
-                    //{
-                    //    await _mysql_mes_morder.UpdateManyAsync(mesMorder);
-                    //}
-
                     //添加工单工序准备开始时间记录
                     if (inserts.Any())
                     {
@@ -550,6 +522,55 @@ namespace Business.ResourceExamineManagement
                     List<string> sczWorkords = workOrds.Where(p => p.Status.ToUpper() == "W").Select(p=>p.WorkOrd).ToList();
                     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>();
+                        if (wlSequenceDets.Any())
+                        {
+                            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 curSche = _scheduleResultOpMaster.Select(p => p.Domain == domain && p.WorkOrd == wlItem.WorkOrds && p.WorkDate == wlItem.PlanDate && p.Op == wlItem.Op).FirstOrDefault();
+                                if (curSche != null)
+                                {
+                                    wlSchedules.Add(curSche);
+                                }
+                                //更新日期
+                                wlItem.PlanDate = scheTime.Date;
+                                //更新数量
+                                var info = periodSequenceDtls.FirstOrDefault(p=>p.WorkOrds == wlItem.WorkOrds && p.PlanDate == scheTime.Date && p.Op == wlItem.Op);
+                                if (info != null)
+                                {
+                                    wlItem.OrdQty = info.OrdQty;
+                                }
+                            }
+                            string strScheTime = scheTime.Date.ToString("yyyy-MM-dd");
+                            foreach (var wlItem in wlSchedules)
+                            {
+                                wlItem.WorkDate = scheTime.Date;
+                                wlItem.WorkStartTime = Convert.ToDateTime(wlItem.WorkStartTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(wlItem.WorkStartTime.ToString("yyyy-MM-dd"), strScheTime));
+                                wlItem.WorkEndTime = Convert.ToDateTime(wlItem.WorkEndTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(wlItem.WorkEndTime.ToString("yyyy-MM-dd"), strScheTime));
+                                //更新数量
+                                var info = scheduleMasters.FirstOrDefault(p => p.WorkOrd == wlItem.WorkOrd && p.WorkDate == scheTime.Date && p.Op == wlItem.Op);
+                                if (info != null)
+                                {
+                                    wlItem.WorkQty = info.WorkQty;
+                                }
+                            }
+                            //更新过期日计划的计划开工日期
+                            if (wlSequenceDets.Any())
+                            {
+                                _periodSequenceDet.Update(wlSequenceDets);
+                            }
+                            if (wlSchedules.Any())
+                            {
+                                _scheduleResultOpMaster.Update(wlSchedules);
+                            }
+                        }
                         //删除当前日期下一天开始的工单排产记录
                         _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);
@@ -567,9 +588,39 @@ namespace Business.ResourceExamineManagement
                         _scheduleResultOpMaster.Delete(p => wscWorkords.Contains(p.WorkOrd) && p.WorkDate >= scheTime.Date && p.Domain == domain);
 
                         //保存当前日期及以后的日计划数据
+                        var ins1 = periodSequenceDtls.Where(p => wscWorkords.Contains(p.WorkOrds) && p.PlanDate >= scheTime.Date).ToList();
                         _periodSequenceDet.Insert(periodSequenceDtls.Where(p => wscWorkords.Contains(p.WorkOrds) && p.PlanDate >= scheTime.Date).ToList());
+                        var ins2 = scheduleMasters.Where(p => wscWorkords.Contains(p.WorkOrd) && p.WorkDate >= scheTime.Date).ToList();
                         _scheduleResultOpMaster.Insert(scheduleMasters.Where(p => wscWorkords.Contains(p.WorkOrd) && p.WorkDate >= scheTime.Date).ToList());
                     }
+
+                    //获取计划日期在当前日期之前且报工数量为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));
+                        }
+                    }
                     //更新过期日计划的计划开工日期
                     if (oldSequenceDets.Any())
                     {

+ 107 - 33
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1,3 +1,4 @@
+using Amazon.Runtime.Internal;
 using Business.Core.Enum;
 using Business.Core.Utilities;
 using Business.Domain;
@@ -5055,7 +5056,7 @@ namespace Business.ResourceExamineManagement
             //DateTime endDate = DateTime.Now.Date.AddDays(28).AddDays(1);
             ////尚未开始生产的工单+正在生产的工单
             //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();
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && p.Status != "C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0))).ToList();
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && (p.QtyOrded - p.QtyCompleted) > 0 && p.Status != "C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0))).ToList();
             if (workOrds.Any())
             {
                 await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, domain, 2);
@@ -5076,7 +5077,7 @@ namespace Business.ResourceExamineManagement
             //取数开始时间为当前天的下一天
             DateTime startTime = DateTime.Now;
             //尚未开始生产的工单+正在生产的工单
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.domain && p.Status != "C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (p.WorkOrd == input.workord || (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0)))).ToList();
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.domain && (p.QtyOrded - p.QtyCompleted) > 0 && p.Status != "C" && p.Status != "c" && !string.IsNullOrEmpty(p.Status) && (p.WorkOrd == input.workord || (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0)))).ToList();
             if (!workOrds.Exists(p=>p.WorkOrd == input.workord))
             {
                 return "NO|工单【" + input.workord + "】不存在,请联系系统管理员!";
@@ -5740,9 +5741,18 @@ namespace Business.ResourceExamineManagement
                 var weekday = (int)DateTime.Now.DayOfWeek;
                 int adddays = weekday==0?1:8-weekday;
                 DateTime beginTime = Convert.ToDateTime(DateTime.Now.AddDays(adddays).ToString("yyyy-MM-dd 00:00:00.000"));
-                DateTime endTime = Convert.ToDateTime(DateTime.Now.AddDays(adddays+21+6).ToString("yyyy-MM-dd 23:59:59.999"));
-                var workords=_workOrdMaster.Select(a => a.OrdDate >= beginTime && a.OrdDate <= endTime && a.Domain == domain);
-                var workordList = workords.Select(x => x.WorkOrd).Distinct().ToList();       
+                DateTime endTime = Convert.ToDateTime(DateTime.Now.AddDays(adddays+21+28+6).ToString("yyyy-MM-dd 23:59:59.999"));
+                var workords=_workOrdMaster.Select(a => a.OrdDate >= beginTime && a.OrdDate <= endTime && a.Domain == domain && a.Status!="C");
+                var workordList = workords.Select(x => x.WorkOrd).Distinct().ToList();
+
+                //存在提前开工的情况
+                var workordsPickBill = _workOrdMaster.Select(a => a.OrdDate < beginTime && (a.Status=="R"|| a.Status=="W") && a.Domain == domain);
+                var workordListPickBill = workordsPickBill.Select(x => x.WorkOrd).Distinct().ToList();
+                if(workordList.Count>0)
+                {
+                    workordListPickBill.AddRange(workordList);
+                }
+
                 var workExamineResult=_businessBangDbContext.b_examine_result.Where(a => workordList.Contains(a.morder_no) && a.factory_id.ToString()==domain).GroupBy(i => i.morder_no).Select(g => new
                 {
                     workOrd = g.Key,
@@ -5750,10 +5760,14 @@ namespace Business.ResourceExamineManagement
                 }).ToList();
                 //需要测试工单没有做资源检查会不会报错
                 var examineIds = workExamineResult.Select(s => s.examineId).ToList();
-                var examines=_mysql_bom_child_examine.GetListAsync(a => examineIds.Contains(a.examine_id.Value) && a.erp_cls==3 && a.is_use && a.factory_id.ToString() == domain).Result;
-                var pickBills = _nbrDetail.Select(a => workordList.Contains(a.WorkOrd) && a.Type.ToUpper()=="SM" && a.Domain == domain);
-                var dsList=_srm_polist_ds.Select(a => a.requestdate <= endTime && a.domain==domain);
-                var itemList = _itemMaster.Select(a => examines.Select(e=>e.item_number).Distinct().ToList().Contains(a.ItemNum) && a.Domain == domain);
+                var examines=_mysql_bom_child_examine.GetListAsync(a => examineIds.Contains(a.examine_id.Value) && (a.erp_cls==3 || a.erp_cls==2) && a.is_use && a.factory_id.ToString() == domain).Result;
+                var pickBills = _nbrDetail.Select(a => workordListPickBill.Contains(a.WorkOrd) && a.Type.ToUpper()=="SM" && (a.QtyOrd - a.QtyRec)>0 && a.Domain == domain);
+                var dsList=_srm_polist_ds.Select(a => a.requestdate <= endTime && a.domain==domain && a.isactive==1);
+                var items = examines.Select(e => e.item_number).Distinct().ToList();
+                var itempickbills=pickBills.Select(s => s.ItemNum);
+                items.AddRange(itempickbills);
+                items = items.Distinct().ToList();
+                var itemList = _itemMaster.Select(a => items.Contains(a.ItemNum) && a.Domain == domain);
                 var locationRange = _configurationItem.Select(x => x.FldName == "MRPLocationRange" && x.Domain == domain).FirstOrDefault();
 
                 List<string> locationList = new List<string> { "1000", "1001", "5007", "5008"};
@@ -5761,10 +5775,10 @@ namespace Business.ResourceExamineManagement
                 {
                     locationList = locationRange.Val.SplitToArray(",").ToList();
                 }
-                var itemListStock = _SAPInv.Select(a => examines.Select(e => e.item_number).Distinct().ToList().Contains(a.MATNR) && locationList.Contains(a.LGORT) && a.WERKS == domain);
+                var itemListStock = _SAPInv.Select(a => items.Contains(a.MATNR) && locationList.Contains(a.LGORT) && a.WERKS == domain);
                 List<ic_demandschedule> ds = new List<ic_demandschedule>();
                 Dictionary<string, decimal> weekStockQty = new Dictionary<string, decimal>();
-                foreach(var item in itemListStock)
+                foreach (var item in itemListStock)
                 {
                     if(!weekStockQty.ContainsKey(item.MATNR))
                     {
@@ -5774,35 +5788,42 @@ namespace Business.ResourceExamineManagement
                         weekStockQty[item.MATNR] += (item.LABST + item.INSME);
                     }
                 }
-                for (int i=0;i<4;i++)
+                for (int i=0;i<8;i++)
                 {
                     var itemBegin = beginTime.AddDays(i*7);
-                    var itemEnd = endTime.AddDays(7 * i-21);
+                    var itemEnd = endTime.AddDays(7 * i-21-28);
                     var workItem = workords.Where(a => a.OrdDate >= itemBegin && a.OrdDate <= itemEnd).ToList();
                     List<DemandscheduleDto> itemQty = new List<DemandscheduleDto>();
                     if (workItem.Count>0)
                     {
                         foreach (var item in workItem)
                         {
-                            var examids = workExamineResult.First(a => item.WorkOrd==a.workOrd);
-                            if(examids!=null && examids.examineId>0)
+                            //存在提前开工,提前下达的已经算在待发料里面了
+                            if(item.Status.ToUpper()!="R")
                             {
-                                var itemLackList=examines.Where(a => a.examine_id == examids.examineId).ToList();
-                                itemLackList?.ForEach(a =>
+                                var examids = workExamineResult.Find(a => item.WorkOrd == a.workOrd);
+                                if (examids != null && examids.examineId > 0)
                                 {
-                                    if(itemQty.Any(s=>s.ItemNum==a.item_number))
+                                    var itemLackList = examines.Where(a => a.examine_id == examids.examineId).ToList();
+                                    itemLackList?.ForEach(a =>
                                     {
-                                        itemQty.Find(s=>s.ItemNum==a.item_number).LackQty+= a.lack_qty.GetValueOrDefault();
-                                        itemQty.Find(s => s.ItemNum == a.item_number).NeedQty += a.needCount.GetValueOrDefault();
-                                    }
-                                    else
-                                    {
-                                        DemandscheduleDto demandscheduleDto = new DemandscheduleDto() { ItemNum = a.item_number,LackQty= a.lack_qty.GetValueOrDefault(),NeedQty = a.needCount.GetValueOrDefault()};
-                                        itemQty.Add(demandscheduleDto);
-                                    }
-                                });
+                                        if (itemQty.Any(s => s.ItemNum == a.item_number))
+                                        {
+                                            itemQty.Find(s => s.ItemNum == a.item_number).LackQty += a.lack_qty.GetValueOrDefault();
+                                            itemQty.Find(s => s.ItemNum == a.item_number).NeedQty += a.needCount.GetValueOrDefault();
+                                        }
+                                        else
+                                        {
+                                            DemandscheduleDto demandscheduleDto = new DemandscheduleDto() { ItemNum = a.item_number, LackQty = a.lack_qty.GetValueOrDefault(), NeedQty = a.needCount.GetValueOrDefault() };
+                                            itemQty.Add(demandscheduleDto);
+                                        }
+                                    });
+                                }
+                                else
+                                {
+                                    new NLogHelper("ResourceExamineAppService").WriteLog("CreateDemandSchedule", "生成交货计划:" + item.WorkOrd + "找不到资源检查记录", _currentTenant.Id.ToString());
+                                }
                             }
-
                         }
                         var requestdate = workItem.Min(a => a.OrdDate);
  
@@ -5819,8 +5840,16 @@ namespace Business.ResourceExamineManagement
                                 itemds.requestdate = requestdate.GetValueOrDefault();
                                 itemds.arrivaldate = requestdate.GetValueOrDefault().AddDays(-1).AddDays(-itemNum.InsLT).AddDays(-(int)Math.Ceiling(itemNum.MFGMTTR));
                                 itemds.shortqty =d.LackQty;
-                                //工单需求+已下达工单领料单待发料
-                                itemds.mesqty =d.NeedQty + pickBills.Where(a=> workItem.Select(s=>s.WorkOrd).Contains(a.WorkOrd) && a.ItemNum== d.ItemNum).Sum(q=>q.QtyOrd-q.QtyRec);
+                                //工单需求+已下达工单领料单待发料(只算第一次)
+                                if(i==0)
+                                {
+                                    itemds.mesqty = d.NeedQty + pickBills.Where(a => a.ItemNum == d.ItemNum).Sum(q => q.QtyOrd - q.QtyRec);
+                                    pickBills.RemoveAll(a => a.ItemNum == d.ItemNum);
+                                }
+                                else
+                                {
+                                    itemds.mesqty = d.NeedQty;
+                                }
                                 //库存需要做扣减
                                 if(weekStockQty.ContainsKey(d.ItemNum))
                                 {
@@ -5841,15 +5870,60 @@ namespace Business.ResourceExamineManagement
                                 itemds.tosechedqty = itemds.mesqty-(itemds.locqty + itemds.sechedqty);
                                 itemds.status = "";
                                 itemds.remarks = "";
-                                itemds.tenant_id = examines[0].tenant_id;
-                                itemds.company_id = examines[0].company_id;
-                                itemds.factory_id = examines[0].factory_id;
+                                itemds.tenant_id = examines.Count>0?examines[0].tenant_id:1000;
+                                itemds.company_id = examines.Count > 0 ? examines[0].company_id:1000;
+                                itemds.factory_id = examines.Count > 0 ? examines[0].factory_id:8010;
                                 itemds.create_time = DateTime.Now;
                                 itemds.update_time= DateTime.Now;
                                 ds.Add(itemds);
                             }
                         }
                     }
+                    if(i==0)
+                    {
+                        var pickbillItems= pickBills.Select(a=>a.ItemNum).Distinct().ToList();
+                        foreach(var item in pickbillItems)
+                        {
+                            var itemNum = itemList.Find(a => a.ItemNum == item);
+                            ic_demandschedule itemds = new ic_demandschedule();
+                            itemds.GenerateNewId(help.NextId());
+                            itemds.itemnum = item;
+                            itemds.fversion = itemNum.Rev;
+                            itemds.drawing = itemNum.Drawing;
+                            itemds.requestdate = itemBegin;
+                            itemds.arrivaldate = itemBegin.AddDays(-1).AddDays(-itemNum.InsLT).AddDays(-(int)Math.Ceiling(itemNum.MFGMTTR));
+                            itemds.shortqty = 0;
+                            itemds.mesqty = pickBills.Where(a => a.ItemNum == item).Sum(q => q.QtyOrd - q.QtyRec);
+                            //库存需要做扣减
+                            if (weekStockQty.ContainsKey(item))
+                            {
+                                itemds.locqty = weekStockQty[item];
+                                if (itemds.mesqty >= itemds.locqty)
+                                {
+                                    weekStockQty[item] = 0;
+                                }
+                                else
+                                {
+                                    weekStockQty[item] -= itemds.mesqty;
+                                }
+                            }
+                            else
+                            {
+                                itemds.locqty = 0;
+                            }
+                            //累计在途数量
+                            itemds.sechedqty = dsList.Where(a => a.requestdate < itemds.arrivaldate && a.itemnum == item).Sum(a => a.schedqty - a.sentqty);
+                            itemds.tosechedqty = itemds.mesqty - (itemds.locqty + itemds.sechedqty);
+                            itemds.status = "";
+                            itemds.remarks = "";
+                            itemds.tenant_id = examines.Count > 0 ? examines[0].tenant_id : 1000;
+                            itemds.company_id = examines.Count > 0 ? examines[0].company_id : 1000;
+                            itemds.factory_id = examines.Count > 0 ? examines[0].factory_id : 8010;
+                            itemds.create_time = DateTime.Now;
+                            itemds.update_time = DateTime.Now;
+                            ds.Add(itemds);
+                        }
+                    }
                 }
                 await _mysql_ic_demandschedule.HardDeleteAsync(a => a.status != "P");
                 _srm_polist_ds.Delete(a=>a.status=="N");

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/srm_polist_ds.cs

@@ -163,5 +163,11 @@ namespace Business.Domain
         /// </summary>
         [Comment("备注")]
         public string remarks { get; set; }
+
+        /// <summary>
+        /// 是否有效:1-有效;0-无效
+        /// </summary>
+        [Comment("是否有效")]
+        public int isactive { get; set; }
     }
 }