Bläddra i källkod

总对总需求对齐调整。

tangdi 2 år sedan
förälder
incheckning
4214454788

+ 87 - 52
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -64,6 +64,9 @@ namespace Business.Replenishment
         /// 采购单表
         /// </summary>
         private readonly ISqlRepository<PurOrdMaster> _PurOrdMaster;
+
+        private ISqlRepository<NbrMaster> _nbrMaster;
+        private ISqlRepository<NbrDetail> _nbrDetail;
         /// <summary>
         /// 交货单异常记录表
         /// </summary>
@@ -322,7 +325,8 @@ namespace Business.Replenishment
             IRepository<b_examine_result, long> mysql_examine_result,
             IRepository<b_bom_child_examine, long> mysql_bom_child_examine,
             IRepository<ReplenishmentServiceLevel, long> replenishmentServiceLevel,
-
+            ISqlRepository<NbrMaster> nbrMaster,
+            ISqlRepository<NbrDetail> nbrDetail,
             IExtSqlRepository<DMS_IN_ITEMMAPPING> DMS_IN_ITEMMAPPING,
             IExtSqlRepository<DMS_IN_LOCDETAIL> DMS_IN_LOCDETAIL,
             IExtSqlRepository<DMS_IN_SHIPPINGDETAIL> DMS_IN_SHIPPINGDETAIL,
@@ -353,6 +357,8 @@ namespace Business.Replenishment
             _generalizedCodeMaster = generalizedCodeMaster;
             _invMaster = invMaster;
             _SAPInv=SAPInv;
+            _nbrMaster = nbrMaster;
+            _nbrDetail = nbrDetail;
             _ic_item = ic_item;
             _mysql_ic_item = mysql_ic_item;
             _itemMaster = itemMaster;
@@ -4744,6 +4750,7 @@ namespace Business.Replenishment
                 }
             }
             _CalcBomViewAppService.GenerateMoList = GenerateMoList;
+            _CalcBomViewAppService.newStockOccList = new List<mo_ic_item_stockoccupy>();
             foreach (var item in mo_Mes_Morders)
             {
                 var moentry = mo_Mes_Moentries.Find(s => s.moentry_moid == item.Id);
@@ -4778,7 +4785,6 @@ namespace Business.Replenishment
                     dtl.sentry_id = sentry.Id;
                     getBomList.ForEach(s => s.sentry_id = item.Id);
                 }
-                _CalcBomViewAppService.newStockOccList = new List<mo_ic_item_stockoccupy>();
                 _CalcBomViewAppService.mes_morder = item;
                 _CalcBomViewAppService.morder_type = item.morder_type;
                
@@ -5257,39 +5263,47 @@ namespace Business.Replenishment
             if (workordmsters.Any())
             {
                 //根据工单表找到工单明细,然后根据DOP工单占用记录,对比工单明细发货数量,来做冲销。
-                var workdetails = _workOrdDetail.Select(s => workordmsters.Select(c => c.WorkOrd).Contains(s.WorkOrd));
-
-                //物料库存占用记录表
-                var item_occupy = _mysql_ic_item_stockoccupy.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id) && workordmsters.Select(c => c.WorkOrd).Contains(p.morder_mo)).Result;
-                if (item_occupy.Any())
+                //var workdetails = _workOrdDetail.Select(s => workordmsters.Select(c => c.WorkOrd).Contains(s.WorkOrd));
+                List<ic_item_stockoccupy> item_occupy = new List<ic_item_stockoccupy>();
+                /*if (!param.checkPlan)
                 {
-                    item_occupy.ForEach(s =>
+                    //在库检,只计算下达工单的占用。
+                    var pwork = workordmsters.Where(x => x.Status.ToLower() == "r").ToList();
+                    item_occupy = _mysql_ic_item_stockoccupy.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id) && pwork.Select(c => c.WorkOrd).Contains(p.morder_mo)).Result;
+                }
+                else {
+                    //物料库存占用记录表
+                    item_occupy = _mysql_ic_item_stockoccupy.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id) && workordmsters.Select(c => c.WorkOrd).Contains(p.morder_mo)).Result;
+                }*/
+                //不论计划还是在库检,都是按全量跑工单,所以每次计算已占用库存,只算下达工单的占用。
+                var pwork = workordmsters.Where(x => x.Status.ToLower() == "r").ToList();
+                item_occupy = _mysql_ic_item_stockoccupy.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id) && pwork.Select(c => c.WorkOrd).Contains(p.morder_mo)).Result;
+                var nbrList = _nbrMaster.Select(x => pwork.Select(c => c.WorkOrd).Contains(x.WorkOrd) && x.Status.ToUpper() != "C").ToList();
+                if (nbrList.Any())
+                {
+                    var nbrDtlList = _nbrDetail.Select(x => nbrList.Select(c => c.RecID).Contains(x.NbrRecID) && x.Status.ToUpper() != "C").ToList();
+                    if (nbrDtlList.Any())
                     {
-                        //TODO:对发布数量和占用数量进行对冲,因为目前没有处理不同层级下使用相同物料的占用的问题。dop占用有项次号,而wms的发布数量明细没有项次号
-                        var wdtl = workdetails.Where(x => x.WorkOrd == s.morder_mo && x.ItemNum == s.icitem_number).ToList();
-                        if (wdtl.Any())
+                        if (item_occupy.Any())
                         {
-                            foreach (var dtl in wdtl)
+                            item_occupy.ForEach(s =>
                             {
-                                if (s.quantity - dtl.QtyPosted > 0)
-                                {
-                                    s.quantity -= dtl.QtyPosted;
-                                    dtl.QtyPosted = 0;
-                                }
-                                else
+                                //TODO:对发布数量和占用数量进行对冲,因为目前没有处理不同层级下使用相同物料的占用的问题。dop占用有项次号,而wms的发布数量明细没有项次号
+                                var wdtl = nbrDtlList.Find(x => x.WorkOrd == s.morder_mo && x.ItemNum == s.icitem_number);
+                                if (wdtl != null)
                                 {
-                                    dtl.QtyPosted -= s.quantity;
-                                    s.quantity = 0;
+                                    s.quantity = wdtl.QtyOrd - wdtl.QtyRec;
+                                    s.quantity = s.quantity < 0 ? 0 : s.quantity;
                                 }
+                            });
+                            item_occupy = item_occupy.Where(s => s.quantity > 0).ToList();
+                            if (item_occupy.Count > 0)
+                            {
+                                var mo_item_occupy = ObjectMapper.Map<List<ic_item_stockoccupy>, List<mo_ic_item_stockoccupy>>(item_occupy);
+                                mo_item_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
+                                await MongoHelper<mo_ic_item_stockoccupy>.InsertManyAsync(mo_item_occupy);
                             }
                         }
-                    });
-                    item_occupy = item_occupy.Where(s => s.quantity > 0).ToList();
-                    if (item_occupy.Count > 0)
-                    {
-                        var mo_item_occupy = ObjectMapper.Map<List<ic_item_stockoccupy>, List<mo_ic_item_stockoccupy>>(item_occupy);
-                        mo_item_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
-                        await MongoHelper<mo_ic_item_stockoccupy>.InsertManyAsync(mo_item_occupy);
                     }
                 }
 
@@ -6207,46 +6221,67 @@ namespace Business.Replenishment
             {
                 return;
             }
-            List<string> locationList = new List<string> { "1000", "1001", "5008", "8000", "8001" };
-            //取出WMS物料记录
-            var stockList = _invMaster.Select(a => a.Domain == param.factoryId.ToString() && locationList.Contains(a.Location) && a.IsActive && itemChildList.Distinct().Contains(a.ItemNum));
-            //WMS物料记录汇总
-            var groupList = stockList.
-                GroupBy(m => new { m.ItemNum }).
-                Select(a => new { ItemNum = a.Key.ItemNum, Qty = a.Sum(c => c.AvailStatusQty.GetValueOrDefault() + c.Assay.GetValueOrDefault()) }).ToList();
+            //List<string> locationList = new List<string> { "1000", "1001", "5008", "8000", "8001" };
+            var locationRange = _configurationItem.Select(x => x.FldName == "MRPLocationRange" && x.Domain == param.factoryId.ToString()).FirstOrDefault();
 
+            List<string> locationList = new List<string> { "1000", "1001", "5008", "8000", "8001" };
+            if (locationRange != null && locationRange.Val != null)
+            {
+                locationList = locationRange.Val.SplitToArray(",").ToList();
+            }
+            if (!param.checkPlan)
+            {
+                if (locationList.Contains("1000"))
+                {
+                    locationList.Remove("1000");
+                }
+            }
+            var locStock = _invMaster.Select(a => itemChildList.Contains(a.ItemNum) && a.IsActive && a.Domain == param.factoryId.ToString() && locationList.Contains(a.Location));
+            var sapInvList = _SAPInv.Select(a => a.WERKS == param.factoryId.ToString() && itemChildList.Contains(a.MATNR) && (a.SOBKZ.ToUpper() == "O" || locationList.Contains(a.LGORT)));
 
-            var itemNums = groupList.Select(b => b.ItemNum).ToList();//需要处理的dop物料编码集合
             //根据WMS物料,取出DOP物料数据
-            var items = _mysql_ic_item.GetListAsync(a => itemNums.Contains(a.number) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
-
+            var items = _mysql_ic_item.GetListAsync(a => itemChildList.Contains(a.number) && a.factory_id == param.factoryId).Result;
 
             var itemIds = items.Select(b => b.Id).ToList();//需要处理的dop物料id集合
-            List<ic_item_stock> mysqlStock = _mysql_ic_item_stock.GetListAsync(a => itemIds.Contains(a.icitem_id) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
+            List<ic_item_stock> mysqlStock = _mysql_ic_item_stock.GetListAsync(a => itemIds.Contains(a.icitem_id) && a.factory_id == param.factoryId).Result;
             List<ic_item_stock> needAddList = new List<ic_item_stock>();
+            List<ic_item_stock> needupdList = new List<ic_item_stock>();
 
-            foreach (var stockWMS in groupList)
+            foreach (var stockWMS in itemChildList)
             {
-                var num = items.Find(x => x.number == stockWMS.ItemNum);
+                var num = items.Find(x => x.number == stockWMS);
                 if (num != null)
                 {
                     var item = mysqlStock.Find(a => a.icitem_id == num.Id);
                     if (item != null)
                     {
-                        item.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
+                        needupdList.Add(item);
                     }
                     else
                     {
-                        ic_item_stock stock = new ic_item_stock();
-                        stock.GenerateNewId(help.NextId());
-                        stock.tenant_id = param.company_id;
-                        stock.factory_id = param.factoryId;
-                        stock.company_id = param.company_id;
-                        stock.icitem_id = num.Id;
-                        stock.icitem_number = num.number;
-                        stock.icitem_name = num.name;
-                        stock.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
-                        needAddList.Add(stock);
+                        item = new ic_item_stock();
+                        item.GenerateNewId(help.NextId());
+                        item.tenant_id = param.company_id;
+                        item.factory_id = param.factoryId;
+                        item.company_id = param.company_id;
+                        item.icitem_id = num.Id;
+                        item.icitem_number = num.number;
+                        item.icitem_name = num.name;
+                        needAddList.Add(item);
+                    }
+                    item.sqty = 0;
+                    foreach (var lct in locationList)
+                    {
+                        var lctQty = locStock.Where(s => s.ItemNum == item.icitem_number && s.Location == lct).Sum(p => p.AvailStatusQty.GetValueOrDefault() + p.Assay.GetValueOrDefault());
+                        if (lctQty == 0)
+                        {
+                            lctQty = sapInvList.Where(x => x.MATNR == item.icitem_number && x.LGORT == lct).Sum(p => p.LABST + p.INSME);
+                        }
+                        item.sqty += lctQty;
+                    }
+                    if (param.checkPlan)
+                    {
+                        item.sqty += sapInvList.Where(x => x.MATNR == item.icitem_number && x.SOBKZ.ToUpper() == "O").Sum(p => p.LABST + p.INSME);
                     }
                 }
             }
@@ -6254,7 +6289,7 @@ namespace Business.Replenishment
             {
                 _businessDbContext.BulkInsert(needAddList);
             }
-            _businessDbContext.BulkUpdate(mysqlStock);
+            _businessDbContext.BulkUpdate(needupdList);
         }
 
         public async Task<string> DeleteWeekPlan(long weekplanid,string productorder, long factory_id)

+ 117 - 79
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -18,6 +18,7 @@ using MongoDB.Driver;
 using MongoDB.Driver.Linq;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
+using SixLabors.ImageSharp;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -1450,47 +1451,53 @@ namespace Business.ResourceExamineManagement
             }
             return prWeekDtos;
         }
-/*
-        int getDateWeekRang(DateTime tmpDate)
-        {
-            var startDateStr = tmpDate.Date.AddDays(-(int)(tmpDate.DayOfWeek) + 1).ToString("yyyy-MM-dd");//当前周的开始日期
-            var endDateStr = tmpDate.Date.AddDays(7 - (int)(tmpDate.DayOfWeek)).ToString("yyyy-MM-dd");//当前周的结束日期   
-            GregorianCalendar gc = new System.Globalization.GregorianCalendar();
-            int weekOfYear = gc.GetWeekOfYear(tmpDate, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);
-            return weekOfYear;
-        }*/
+        /*
+                int getDateWeekRang(DateTime tmpDate)
+                {
+                    var startDateStr = tmpDate.Date.AddDays(-(int)(tmpDate.DayOfWeek) + 1).ToString("yyyy-MM-dd");//当前周的开始日期
+                    var endDateStr = tmpDate.Date.AddDays(7 - (int)(tmpDate.DayOfWeek)).ToString("yyyy-MM-dd");//当前周的结束日期   
+                    GregorianCalendar gc = new System.Globalization.GregorianCalendar();
+                    int weekOfYear = gc.GetWeekOfYear(tmpDate, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);
+                    return weekOfYear;
+                }*/
 
         //PR自动审核
         public async Task<string> PrAutoApprove(string companyid)
         {
-            //按要求改成发布四周任务
-            DateTime toTime = DateTime.Now.Date;
-            DateTime starttime = toTime.AddDays(1);
-            DateTime endtime = toTime.AddDays(28);
-            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.IsRequireGoods == 1 && s.pr_ssend_date >= starttime &&
+            //直接按间隔多少天一次来处理数据,定时任务按周四来考虑
+            DateTime toTime = DateTime.Now;//new DateTime(2023, 12, 3);
+            DateTime starttime = toTime.Date.AddDays(1);
+            DateTime endtime = toTime.Date.AddDays(28);
+            List<srm_pr_main> alllist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.IsRequireGoods == 1 && s.pr_ssend_date >= starttime &&
             s.pr_ssend_date <= endtime && s.state == 1 && string.IsNullOrEmpty(s.analogcalcversion) == true).Result;
 
-            if (prlist.Any())
+            if (alllist.Any())
             {
-                List<srm_purchase> purchaselist = _mysql_srm_purchase.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.icitem_id).Contains(s.icitem_id) && prlist.Select(c => c.pr_purchaseid).Contains(s.supplier_id)).Result;
-                List<srm_supplier> itemsupplierList = _mysql_srm_supplier.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.pr_purchaseid).Contains(s.Id)).Result;
-                List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.icitem_id).Contains(s.Id)).Result;
+                List<srm_purchase> purchaselist = _mysql_srm_purchase.GetListAsync(s => s.company_id.ToString() == companyid && alllist.Select(c => c.icitem_id).Contains(s.icitem_id) && alllist.Select(c => c.pr_purchaseid).Contains(s.supplier_id)).Result;
+                List<srm_supplier> itemsupplierList = _mysql_srm_supplier.GetListAsync(s => s.company_id.ToString() == companyid && alllist.Select(c => c.pr_purchaseid).Contains(s.Id)).Result;
+                List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && alllist.Select(c => c.icitem_id).Contains(s.Id)).Result;
                 PoActionListDto poaction = new PoActionListDto();
-                param.company_id = prlist[0].company_id;
-                param.factoryId = prlist[0].factory_id.GetValueOrDefault();
-                AutoCreatePOFromPR(prlist, ic_Items, itemsupplierList, purchaselist, poaction);
+                param.company_id = alllist[0].company_id;
+                param.factoryId = alllist[0].factory_id.GetValueOrDefault();
+                for (int i = 0; i < 4; i++)
+                {
+                    starttime = toTime.Date.AddDays(i * 7 + 1);
+                    endtime = toTime.Date.AddDays((i + 1) * 7);
+                    List<srm_pr_main> prlist = alllist.Where(s => s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime).ToList();
+                    AutoCreatePOFromPR(prlist, ic_Items, itemsupplierList, purchaselist, poaction);
+                }
                 using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
                 {
                     try
                     {
                         if (poaction.poMain.Any())
                         {
-                            _businessDbContext.BulkUpdate(prlist);
+                            _businessDbContext.BulkUpdate(alllist);
                             _businessDbContext.BulkInsert(poaction.poMain);
                         }
                         if (poaction.polist.Any())
                         {
-                            _businessDbContext.BulkInsert(poaction.polist); 
+                            _businessDbContext.BulkInsert(poaction.polist);
                         }
                         if (poaction.poOccupiesList.Any())
                         {
@@ -2070,9 +2077,9 @@ namespace Business.ResourceExamineManagement
             if (workordmsters.Any())
             {
                 //根据工单表找到工单明细,然后根据DOP工单占用记录,对比工单明细发货数量,来做冲销。
-                var workdetails = _workOrdDetail.Select(s => workordmsters.Select(c => c.WorkOrd).Contains(s.WorkOrd));
+                //var workdetails = _workOrdDetail.Select(s => workordmsters.Select(c => c.WorkOrd).Contains(s.WorkOrd));
                 List<ic_item_stockoccupy> item_occupy = new List<ic_item_stockoccupy>();
-                if (!param.checkPlan)
+                /*if (!param.checkPlan)
                 {
                     //在库检,只计算下达工单的占用。
                     var pwork = workordmsters.Where(x => x.Status.ToLower() == "r").ToList();
@@ -2081,40 +2088,40 @@ namespace Business.ResourceExamineManagement
                 else {
                     //物料库存占用记录表
                     item_occupy = _mysql_ic_item_stockoccupy.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id) && workordmsters.Select(c => c.WorkOrd).Contains(p.morder_mo)).Result;
-                }
-
-                if (item_occupy.Any())
+                }*/
+                //不论计划还是在库检,都是按全量跑工单,所以每次计算已占用库存,只算下达工单的占用。
+                var pwork = workordmsters.Where(x => x.Status.ToLower() == "r").ToList();
+                item_occupy = _mysql_ic_item_stockoccupy.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id) && pwork.Select(c => c.WorkOrd).Contains(p.morder_mo)).Result;
+                var nbrList = _nbrMaster.Select(x => pwork.Select(c => c.WorkOrd).Contains(x.WorkOrd) && x.Status.ToUpper() != "C").ToList();
+                if (nbrList.Any())
                 {
-                    item_occupy.ForEach(s =>
+                    var nbrDtlList = _nbrDetail.Select(x => nbrList.Select(c => c.RecID).Contains(x.NbrRecID) && x.Status.ToUpper() != "C").ToList();
+                    if (nbrDtlList.Any())
                     {
-                        //TODO:对发布数量和占用数量进行对冲,因为目前没有处理不同层级下使用相同物料的占用的问题。dop占用有项次号,而wms的发布数量明细没有项次号
-                        var wdtl = workdetails.Where(x => x.WorkOrd == s.morder_mo && x.ItemNum == s.icitem_number).ToList();
-                        if (wdtl.Any())
+                        if (item_occupy.Any())
                         {
-                            foreach (var dtl in wdtl)
+                            item_occupy.ForEach(s =>
                             {
-                                if (s.quantity - dtl.QtyPosted > 0)
-                                {
-                                    s.quantity -= dtl.QtyPosted;
-                                    dtl.QtyPosted = 0;
-                                }
-                                else
+                                //TODO:对发布数量和占用数量进行对冲,因为目前没有处理不同层级下使用相同物料的占用的问题。dop占用有项次号,而wms的发布数量明细没有项次号
+                                var wdtl = nbrDtlList.Find(x => x.WorkOrd == s.morder_mo && x.ItemNum == s.icitem_number);
+                                if (wdtl != null)
                                 {
-                                    dtl.QtyPosted -= s.quantity;
-                                    s.quantity = 0;
+                                    s.quantity = wdtl.QtyOrd - wdtl.QtyRec;
+                                    s.quantity = s.quantity < 0 ? 0 : s.quantity;
                                 }
+                            });
+                            item_occupy = item_occupy.Where(s => s.quantity > 0).ToList();
+                            if (item_occupy.Count > 0)
+                            {
+
+                                var mo_item_occupy = ObjectMapper.Map<List<ic_item_stockoccupy>, List<mo_ic_item_stockoccupy>>(item_occupy);
+                                mo_item_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
+                                await MongoHelper<mo_ic_item_stockoccupy>.InsertManyAsync(mo_item_occupy);
                             }
                         }
-                    });
-                    item_occupy = item_occupy.Where(s => s.quantity > 0).ToList();
-                    if (item_occupy.Count > 0)
-                    {
-                        var mo_item_occupy = ObjectMapper.Map<List<ic_item_stockoccupy>, List<mo_ic_item_stockoccupy>>(item_occupy);
-                        mo_item_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
-                        await MongoHelper<mo_ic_item_stockoccupy>.InsertManyAsync(mo_item_occupy);
                     }
                 }
-
+                
                 //工单主表
                 var mes_morder = _mysql_mes_morder.GetListAsync(x => string.IsNullOrEmpty(x.morder_state) == false && x.morder_state != "完成" && x.company_id == companyId && x.factory_id == factoryId && string.IsNullOrEmpty(x.analogcalcversion) == true && workordmsters.Select(c => c.WorkOrd).Contains(x.morder_no)).Result;
                 if (mes_morder.Count > 0)
@@ -2629,7 +2636,7 @@ namespace Business.ResourceExamineManagement
                 return "当前任务工厂编号为空,请检查。";
             }
             List<string> tsWork = new List<string> { "test", "tcn", "rw" };
-            var ordlist = _workOrdMaster.Select(x => x.Domain == domain && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && x.Status.ToLower() == "p").ToList();
+            var ordlist = _workOrdMaster.Select(x => x.Domain == domain && x.WorkOrd== "M500413982" && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && x.Status.ToLower() == "p").ToList();
             List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => ordlist.Select(c=>c.WorkOrd).Contains(x.morder_no) && x.factory_id.ToString() == domain).Result;
 
             /*//先排除锁定期内的工单 //优先级排序
@@ -3466,7 +3473,7 @@ namespace Business.ResourceExamineManagement
                 }
             }*/
             _CalcBomViewAppService.GenerateMoList = GenerateMoList;
-
+            _CalcBomViewAppService.newStockOccList = new List<mo_ic_item_stockoccupy>();
             foreach (var item in priorityMorderList)
             {
                 var moentry = mo_Mes_Moentries.Find(s => s.moentry_moid == item.Id);
@@ -3513,7 +3520,7 @@ namespace Business.ResourceExamineManagement
                     dtl.sentry_id = sentry.Id;
                     getBomList.ForEach(s => s.sentry_id = item.Id);
                 }
-                _CalcBomViewAppService.newStockOccList = new List<mo_ic_item_stockoccupy>();
+                
                 _CalcBomViewAppService.morder_type = item.morder_type;
                 _CalcBomViewAppService.mes_morder = item;
                 //库存初始化
@@ -3534,9 +3541,7 @@ namespace Business.ResourceExamineManagement
             rtn.examines = examines;
             List<WorkOrdDetail> mainWorkOrdDetails = new List<WorkOrdDetail>();
             if (moentryList == null)
-            {
-                //暂时屏蔽重新生成工单物料明细
-                
+            {                
                 //成品虚拟件对应关系
                 var productOpList = _productStructureOp.Select(x => priorityMorderList.Select(c => c.product_code).Contains(x.ProductItem) && x.Domain == param.factoryId.ToString());
                 foreach (var workord in priorityMorderList)
@@ -3740,6 +3745,16 @@ namespace Business.ResourceExamineManagement
             return rtn;
         }
 
+        public void XdWorkOrdCalc(string domain)
+        {
+            var nbrList = _nbrMaster.Select(x => !string.IsNullOrEmpty(x.Status) && x.Status.ToUpper() != "C").ToList();
+            if (nbrList.Any())
+            { 
+                
+            }
+        }
+
+
         /// <summary>
         /// 物料数据计算前准备
         /// </summary>
@@ -4191,44 +4206,67 @@ namespace Business.ResourceExamineManagement
             {
                 return;
             }
+            //List<string> locationList = new List<string> { "1000", "1001", "5008", "8000", "8001" };
+            var locationRange = _configurationItem.Select(x => x.FldName == "MRPLocationRange" && x.Domain == param.factoryId.ToString()).FirstOrDefault();
+
             List<string> locationList = new List<string> { "1000", "1001", "5008", "8000", "8001" };
-            //取出WMS物料记录
-            var stockList = _invMaster.Select(a => a.Domain == param.factoryId.ToString() && locationList.Contains(a.Location) && a.IsActive && itemChildList.Distinct().Contains(a.ItemNum));
-            //WMS物料记录汇总
-            var groupList = stockList.
-                GroupBy(m => new { m.ItemNum }).
-                Select(a => new { ItemNum = a.Key.ItemNum, Qty = a.Sum(c => c.AvailStatusQty.GetValueOrDefault() + c.Assay.GetValueOrDefault()) }).ToList();
-           
-            var itemNums = groupList.Select(b => b.ItemNum).ToList();//需要处理的dop物料编码集合
+            if (locationRange != null && locationRange.Val != null)
+            {
+                locationList = locationRange.Val.SplitToArray(",").ToList();
+            }
+            if (!param.checkPlan)
+            {
+                if (locationList.Contains("1000"))
+                {
+                    locationList.Remove("1000");
+                }
+            }
+            var locStock = _invMaster.Select(a => itemChildList.Contains(a.ItemNum) && a.IsActive && a.Domain == param.factoryId.ToString() && locationList.Contains(a.Location));
+            var sapInvList = _SAPInv.Select(a => a.WERKS == param.factoryId.ToString() && itemChildList.Contains(a.MATNR) && (a.SOBKZ.ToUpper() == "O" || locationList.Contains(a.LGORT)));
+
             //根据WMS物料,取出DOP物料数据
-            var items = _mysql_ic_item.GetListAsync(a => itemNums.Contains(a.number) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
+            var items = _mysql_ic_item.GetListAsync(a => itemChildList.Contains(a.number) && a.factory_id == param.factoryId).Result;
 
             var itemIds = items.Select(b => b.Id).ToList();//需要处理的dop物料id集合
-            List<ic_item_stock> mysqlStock = _mysql_ic_item_stock.GetListAsync(a => itemIds.Contains(a.icitem_id) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
+            List<ic_item_stock> mysqlStock = _mysql_ic_item_stock.GetListAsync(a => itemIds.Contains(a.icitem_id) && a.factory_id == param.factoryId).Result;
             List<ic_item_stock> needAddList = new List<ic_item_stock>();
+            List<ic_item_stock> needupdList = new List<ic_item_stock>();
 
-            foreach (var stockWMS in groupList)
+            foreach (var stockWMS in itemChildList)
             {
-                var num = items.Find(x => x.number == stockWMS.ItemNum);
+                var num = items.Find(x => x.number == stockWMS);
                 if (num != null)
                 {
                     var item = mysqlStock.Find(a => a.icitem_id == num.Id);
                     if (item != null)
                     {
-                        item.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
+                        needupdList.Add(item);
                     }
                     else
                     {
-                        ic_item_stock stock = new ic_item_stock();
-                        stock.GenerateNewId(help.NextId());
-                        stock.tenant_id = param.company_id;
-                        stock.factory_id = param.factoryId;
-                        stock.company_id = param.company_id;
-                        stock.icitem_id = num.Id;
-                        stock.icitem_number = num.number;
-                        stock.icitem_name = num.name;
-                        stock.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
-                        needAddList.Add(stock);
+                        item = new ic_item_stock();
+                        item.GenerateNewId(help.NextId());
+                        item.tenant_id = param.company_id;
+                        item.factory_id = param.factoryId;
+                        item.company_id = param.company_id;
+                        item.icitem_id = num.Id;
+                        item.icitem_number = num.number;
+                        item.icitem_name = num.name;
+                        needAddList.Add(item);
+                    }
+                    item.sqty = 0;
+                    foreach (var lct in locationList)
+                    {
+                        var lctQty = locStock.Where(s => s.ItemNum == item.icitem_number && s.Location == lct).Sum(p => p.AvailStatusQty.GetValueOrDefault() + p.Assay.GetValueOrDefault());
+                        if (lctQty == 0)
+                        {
+                            lctQty = sapInvList.Where(x => x.MATNR == item.icitem_number && x.LGORT == lct).Sum(p => p.LABST + p.INSME);
+                        }
+                        item.sqty += lctQty;
+                    }
+                    if (param.checkPlan)
+                    {
+                        item.sqty += sapInvList.Where(x => x.MATNR == item.icitem_number && x.SOBKZ.ToUpper() == "O").Sum(p => p.LABST + p.INSME);
                     }
                 }
             }
@@ -4236,7 +4274,7 @@ namespace Business.ResourceExamineManagement
             {
                 _businessDbContext.BulkInsert(needAddList);
             }
-            _businessDbContext.BulkUpdate(mysqlStock);
+            _businessDbContext.BulkUpdate(needupdList);
         }
 
         /// <summary>

+ 1 - 2
MicroServices/Business/Business.Application/SystemJobManagement/SystemJobAppService.cs

@@ -1331,8 +1331,7 @@ namespace Business.SystemJobManagement
                         var occ = occupy.Find(x => x.icitem_number == dtl.ItemNum);
                         if (occ != null)
                         {
-                            occ.quantity = dtl.QtyOrd;
-                            decimal differ = occ.quantity - dtl.QtyFrom.GetValueOrDefault();
+                            decimal differ = dtl.QtyOrd - dtl.QtyRec;
                             if (differ > 0)
                             {
                                 occ.quantity = differ;

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

@@ -150,5 +150,11 @@ namespace Business.Domain
         /// </summary>
         [Comment("物料名称")]
         public string ItemName { get; set; }
+
+        /// <summary>
+        /// 状态:C为已下架、出库
+        /// </summary>
+        [Comment("状态")]
+        public string Status { get; set; }
     }
 }