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

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

heteng 2 лет назад
Родитель
Сommit
a623075b4f

+ 104 - 30
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;
@@ -5702,9 +5703,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,
@@ -5712,10 +5722,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 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);
-                var itemList = _itemMaster.Select(a => examines.Select(e=>e.item_number).Distinct().ToList().Contains(a.ItemNum) && a.Domain == domain);
+                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"};
@@ -5723,10 +5737,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))
                     {
@@ -5736,35 +5750,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);
  
@@ -5781,8 +5802,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))
                                 {
@@ -5803,15 +5832,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");