瀏覽代碼

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

Murphy 2 年之前
父節點
當前提交
ae4f716edc

+ 49 - 9
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -23,6 +23,7 @@ using Volo.Abp.Domain.Repositories;
 using Volo.Abp.MultiTenancy;
 using Volo.Abp.ObjectMapping;
 using Volo.Abp.Uow;
+using static Spire.Pdf.General.Render.Decode.Jpeg2000.j2k.codestream.HeaderInfo;
 
 namespace Business.ResourceExamineManagement
 {
@@ -2343,7 +2344,7 @@ namespace Business.ResourceExamineManagement
                 List<string> workOrds = workOrd.Split(",").ToList();
                 if (workOrds.Count == 0)
                 {
-                    return "";
+                    return "未传入工单号,请选择。";
                 }
                 mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => companyid == x.company_id.ToString() && workOrds.Contains(x.morder_no)).Result;
                 //如果工单有今天和之前的,则提示不处理
@@ -2354,7 +2355,7 @@ namespace Business.ResourceExamineManagement
             }
             else
             {
-                mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => companyid == x.company_id.ToString() && x.moentry_sys_stime > DateTime.Now.Date.AddDays(1) && x.moentry_sys_stime < DateTime.Now.Date.AddDays(day) && x.morder_state == MorderEnum.Initial_state && !x.IsDeleted).Result;
+                mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => companyid == x.company_id.ToString() && x.moentry_sys_stime > DateTime.Now.Date.AddDays(1) && x.moentry_sys_stime <= DateTime.Now.Date.AddDays(day) && x.morder_state == MorderEnum.Initial_state && !x.IsDeleted).Result;
             }
 
             List<mes_morder> checkMo = new List<mes_morder>();
@@ -2401,7 +2402,7 @@ namespace Business.ResourceExamineManagement
 
                 if (checkMo.Any())
                 {
-                    var rtn = await OrderKittingCheck(mo_Mes_Morders);
+                    var rtn = await OrderKittingCheck(checkMo);
                     if (rtn != null && rtn.examines != null)
                     {
                         var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "WorkOrderLockPeriod" && s.Domain == companyid).ToList();
@@ -2468,12 +2469,13 @@ namespace Business.ResourceExamineManagement
                 if (workords.Length > 0)
                 {
                     workords = workords.Substring(1, workords.Length - 1);
+                    //如果生成领料单,需清理掉当前工单的占用,然后根据领料单的数据,来生成工单的占用
                     await CreatePickBill(workords, mo_Mes_Morders[0].factory_id.GetValueOrDefault().ToString());
                 }
-                return JsonConvert.SerializeObject("ok");
+                return "ok";
             }
             else {
-                return JsonConvert.SerializeObject("没有需要检查的工单");
+                return "没有需要检查的工单";
             }
         }
 
@@ -3362,7 +3364,7 @@ namespace Business.ResourceExamineManagement
             List<string> workOrds = workOrd.Split(",").ToList();
             if (workOrds.Count == 0)
             {
-                return "";
+                return "没有需要排产的工单。";
             }
             //获取工单数据
             var workOrdMasters = _workOrdMaster.Select(p => workOrds.Contains(p.WorkOrd) && p.Domain == domain);
@@ -3372,12 +3374,12 @@ namespace Business.ResourceExamineManagement
             workOrdMasters = workOrdMasters.Where(p => !dbWorkOrds.Contains(p.WorkOrd)).ToList();
             if (workOrdMasters.Count == 0)
             {
-                return JsonConvert.SerializeObject("ok");
+                return "当前工单已排产,无需重新排产。";
             }
             //排产
             await _productionScheduleAppService.DoProductShcedule(workOrdMasters, workOrdMasters[0].Domain);
             //AutoCreatePickBill(workOrdMasters.Select(p => p.WorkOrd).ToList());
-            return JsonConvert.SerializeObject("ok");
+            return "ok";
         }
 
         /// <summary>
@@ -3397,7 +3399,7 @@ namespace Business.ResourceExamineManagement
                 workOrds = workOrd.Split(",").ToList();
                 if (workOrds.Count == 0)
                 {
-                    return JsonConvert.SerializeObject("没有需要下达的工单。");
+                    return "没有需要下达的工单。";
                 }
                 workOrdMasters = _workOrdMaster.Select(p => p.Domain == domain && workOrds.Contains(p.WorkOrd) && p.Status != "r" && p.Status != "c");
             }
@@ -3438,6 +3440,34 @@ namespace Business.ResourceExamineManagement
             {
                 dbPeriodSequences.ForEach(p => { p.Status = "r"; });
                 workOrdMasters.ForEach(p => { p.Status = "r"; });
+
+                //清理掉库存占用  这里考虑的是资源检查的占用没有完全占用备料单数据,而其他数据再进行齐套检查时,无法考虑到备料单的占用。
+                var itemstockoccupy = _mysql_ic_item_stockoccupy.GetListAsync(s => workOrdMasters.Select(x => x.WorkOrd).Contains(s.morder_mo) && s.factory_id.ToString() == domain).Result;
+                var icitem = _mysql_ic_item.GetListAsync(s => s.factory_id.ToString() == domain && nbrDetailList.Select(c => c.ItemNum).Contains(s.number)).Result;
+                //根据领料单生成一次工单的数据占用
+                List<ic_item_stockoccupy> insertOccuyy = new List<ic_item_stockoccupy>();
+                nbrMasterList.ForEach(s =>
+                {
+                    var nbrdtls = nbrDetailList.Where(a => a.Nbr == s.Nbr).ToList();
+                    nbrdtls.ForEach(x =>
+                    {
+                        ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
+                        itemStockoccupyDto.morder_mo = s.WorkOrd;
+                        itemStockoccupyDto.occupy_time = DateTime.Now;
+                        var nbrItem = icitem.Find(c => c.number == x.ItemNum);
+                        if(nbrItem!= null) {
+                            itemStockoccupyDto.icitem_id = nbrItem.Id;
+                            itemStockoccupyDto.icitem_number = nbrItem.number;
+                            itemStockoccupyDto.tenant_id = nbrItem.tenant_id;
+                            itemStockoccupyDto.factory_id = nbrItem.factory_id;
+                            itemStockoccupyDto.org_id = nbrItem.org_id;
+                            itemStockoccupyDto.company_id = nbrItem.company_id;
+                            itemStockoccupyDto.quantity = x.CurrQtyOpened.GetValueOrDefault();
+                            insertOccuyy.Add(itemStockoccupyDto);
+                        }
+                    });
+                });
+
                 //获取工单工艺路径数据
                 List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.Select(p => ords.Contains(p.WorkOrd) && p.MilestoneOp && p.Domain == workOrdMasters[0].Domain && p.Status != "C" && p.IsActive);
                 workOrdRoutings.ForEach(p => { p.Status = "r"; });
@@ -3451,6 +3481,16 @@ 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);
                             _businessDbContext.Database.ExecuteSqlRaw(sql);
                         });
+
+                        if (itemstockoccupy.Any())
+                        {
+                            _businessDbContext.BulkDelete(itemstockoccupy);
+                        }
+                        if (insertOccuyy.Any())
+                        { 
+                            _businessDbContext.BulkInsert(insertOccuyy);
+                        }
+
                         //快开平台用自增列RecId关联,所以需要插入后再查给明细表赋相应的值
                         List<string> nbrs = nbrMasterList.Select(a => a.Nbr).ToList();
                         var DBnbrList = _nbrMaster.Select(a => a.Domain == workOrdMasters[0].Domain && a.Type == "SM" && nbrs.Contains(a.Nbr));

+ 42 - 19
MicroServices/Business/Business.Application/SaleForecastManagement/MonthlyCapacityLoadAppService.cs

@@ -145,6 +145,11 @@ namespace Business.SaleForecastManagement
         /// </summary>
         private ISqlRepository<GeneralizedCodeMaster> _generalizedCodeMaster;
 
+        /// <summary>
+        /// SAP库存表
+        /// </summary>
+        private ISqlRepository<SAPInv> _SAPInv;
+
         /// <summary>
         /// 雪花算法
         /// </summary>
@@ -178,7 +183,8 @@ namespace Business.SaleForecastManagement
             IRepository<crm_planorder, long> crm_planorder,
             IRepository<PlatStockMonitorSetting, long> platStockMonitorSetting,
             IRepository<WMS_PlatformInventory, long> platformInventory,
-            ISqlRepository<GeneralizedCodeMaster> generalizedCodeMaster
+            ISqlRepository<GeneralizedCodeMaster> generalizedCodeMaster,
+            ISqlRepository<SAPInv> SAPInv
             )
         {
             _ic_item = ic_item;
@@ -204,6 +210,7 @@ namespace Business.SaleForecastManagement
             _platStockMonitorSetting = platStockMonitorSetting;
             _platformInventory = platformInventory;
             _generalizedCodeMaster = generalizedCodeMaster;
+            _SAPInv = SAPInv;
         }
         #endregion
 
@@ -248,15 +255,11 @@ namespace Business.SaleForecastManagement
             //1.5、获取规格型号对应的标准SKU数据:获取最小包装单位
             List<string> itemNums = standards.Select(p=>p.ItemNumber).Distinct().ToList();
             List<ic_item> items = _ic_item.GetListAsync(p=> itemNums.Contains(p.number) && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
-            //1.6、获取成品库存、灭菌库存
-            //List<LocationDetail> locations = _locationDetail.Select(p=>p.Domain == input.factory_id.ToString() && p.IsActive && itemNums.Contains(p.ItemNum));
-            //1.7、获取在制库存:计划开始时间、计划结束时间都在本月,并且未关闭的工单
-            //DateTime monStart = Convert.ToDateTime(input.year + "-" + input.month + "-01");
-            //DateTime monEnd = monStart.AddMonths(1).AddDays(-1);
-            //List<WorkOrdMaster> workOrds = _workOrdMaster.Select(p=>p.Domain);
-            //1.9、获取节假日设置
+            //1.6、获取成品库存、灭菌库存、在制库存
+            List<SAPInv> sAPInvs = _SAPInv.Select(p => p.WERKS == input.factory_id.ToString() && itemNums.Contains(p.MATNR));
+            //1.7、获取节假日设置
             List<HolidayMaster> holidays = _holidayMaster.Select(p => (p.Dated.Value.Year == input.year || p.Dated.Value.Year == (input.year + 1)) && p.Domain == input.factory_id.ToString() && p.IsActive);
-            //2.0、获取平台库存监控月份设置
+            //1.8、获取平台库存监控月份设置
             List<PlatStockMonitorSetting> monitorSettings = _platStockMonitorSetting.GetListAsync(p => p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
             #region 数据校验
             //1、校验当前年的年度生产大纲是否导入
@@ -370,19 +373,28 @@ namespace Business.SaleForecastManagement
                 var curStd = standards.FirstOrDefault(p => p.Model == gnModel);
                 decimal packQty = 1m;//最小包装单位
                 decimal cycle = 0m;//补货周期
+                //获取成品库存、在制库存、灭菌库存,参与计算
+                decimal cpQty = 0m;
+                decimal zzQty = 0m;
+                decimal mjQty = 0m;
                 if (curStd != null)
                 {
                     var curItem = items.FirstOrDefault(p => p.number == curStd.ItemNumber);
                     packQty = curItem == null ? 1 : (curItem.minpackqty.GetValueOrDefault() == 0.0m ? 1 : curItem.minpackqty.Value);
                     cycle = curStd.ReplenishCycle;
+                    //成品库存
+                    cpQty = sAPInvs.Where(p => p.MATNR == curStd.ItemNumber && p.LGORT == "8001").Sum(p => Convert.ToDecimal(p.LABST));
+                    //在制库存
+                    zzQty = sAPInvs.Where(p => p.MATNR == curStd.ItemNumber && p.LGORT == "8000").Sum(p => Convert.ToDecimal(p.LABST));
+                    //灭菌库存
+                    mjQty = sAPInvs.Where(p => p.MATNR == curStd.ItemNumber && p.LGORT == "5008").Sum(p => Convert.ToDecimal(p.LABST));
                 }
-                //TODO:获取成品库存、在制库存、灭菌库存,参与计算
                 //N+1月使用N+2月的再订货点参与计算
                 decimal rop = CalcRop(strN2+"-01", sumN2, packQty, holidays, cycle);
-                monthN1.Qty = Math.Ceiling((sumN1 / 2 + sumN2 / 2 + rop - 0 - 0 - 0) / packQty) * packQty;
+                monthN1.Qty = Math.Ceiling((sumN1 / 2 + sumN2 / 2 + rop - cpQty - zzQty - mjQty) / packQty) * packQty;
                 //N+2月使用本月的需求量,下一月的工作天数
                 rop = CalcRop(Convert.ToDateTime(strN2 + "-01").AddMonths(1).ToString("yyyy-MM-dd"), sumN2, packQty, holidays, cycle);
-                monthN2.Qty = Math.Ceiling((sumN2 + rop - 0 - 0 - 0) / packQty) * packQty;
+                monthN2.Qty = Math.Ceiling((sumN2 + rop - cpQty - zzQty - mjQty) / packQty) * packQty;
                 //负数置0
                 monthN1.Qty = monthN1.Qty < 0 ? 0m : monthN1.Qty;
                 monthN2.Qty = monthN2.Qty < 0 ? 0m : monthN2.Qty;
@@ -425,16 +437,26 @@ namespace Business.SaleForecastManagement
                 //当前规格型号对应标准SKU的最小包装单位、补货周期
                 var curStd = standards.FirstOrDefault(p => p.Model == hwModel);
                 decimal packQty = 1m;//最小包装单位
+                //获取成品库存、在制库存、灭菌库存,参与计算
+                decimal cpQty = 0m;
+                decimal zzQty = 0m;
+                decimal mjQty = 0m;
                 if (curStd != null)
                 {
                     var curItem = items.FirstOrDefault(p => p.number == curStd.ItemNumber);
                     packQty = curItem == null ? 1 : (curItem.minpackqty.GetValueOrDefault() == 0.0m ? 1 : curItem.minpackqty.Value);
+                    //成品库存
+                    cpQty = sAPInvs.Where(p => p.MATNR == curStd.ItemNumber && p.LGORT == "8001").Sum(p => Convert.ToDecimal(p.LABST));
+                    //在制库存
+                    zzQty = sAPInvs.Where(p => p.MATNR == curStd.ItemNumber && p.LGORT == "8000").Sum(p => Convert.ToDecimal(p.LABST));
+                    //灭菌库存
+                    mjQty = sAPInvs.Where(p => p.MATNR == curStd.ItemNumber && p.LGORT == "5008").Sum(p => Convert.ToDecimal(p.LABST));
                 }
                 //海外生产需求量=当月的50%+下一月的50%-成品库存-在制库存-灭菌库存
                 //TODO:获取成品库存、在制库存、灭菌库存,参与运算
                 //计算N+1月,N+2月
-                monthN1.Qty = Math.Ceiling((sumN1 / 2 + sumN2 / 2 - 0 - 0 - 0) / packQty) * packQty;
-                monthN2.Qty = Math.Ceiling((sumN2 - 0 - 0 - 0) / packQty) *packQty; ;
+                monthN1.Qty = Math.Ceiling((sumN1 / 2 + sumN2 / 2 - cpQty - zzQty - mjQty) / packQty) * packQty;
+                monthN2.Qty = Math.Ceiling((sumN2 - cpQty - zzQty - mjQty) / packQty) *packQty; ;
                 //负数置0
                 monthN1.Qty = monthN1.Qty < 0 ? 0m : monthN1.Qty;
                 monthN2.Qty = monthN2.Qty < 0 ? 0m : monthN2.Qty;
@@ -452,7 +474,7 @@ namespace Business.SaleForecastManagement
             var nextMonDFcsts = domesticFcst.Where(p => p.PlanMonth == strN2).ToList();
             var nextMonT2Fcsts = T2Fcsts.Where(p => p.PlanMonth == strN2).ToList();
             var nextMonMonitors = monitorSettings.Where(p => p.PlanMonth == strN1).ToList();
-            var replenishs = MonthlyReplenish(input,strN1, nextMonPFcsts, nextMonDFcsts, nextMonT2Fcsts, standards, items, holidays, nextMonMonitors);
+            var replenishs = MonthlyReplenish(input,strN1, nextMonPFcsts, nextMonDFcsts, nextMonT2Fcsts, standards, items, holidays, nextMonMonitors, sAPInvs);
 
             //保存数据
             using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
@@ -623,16 +645,17 @@ namespace Business.SaleForecastManagement
         /// <param name="items">物料</param>
         /// <param name="holidays">节假日</param>
         /// <param name="monitorSettings">库存监控月份设置</param>
+        /// <param name="sAPInvs">SAP库存</param>
         /// <returns></returns>
-        public List<crm_planorder> MonthlyReplenish(InputDto input,string strN1, List<PlatformFcstCollect> platformFcsts, List<DomesticTerminalFcst> domesticFcsts, List<DomesticTerminalFcst> T2Fcsts, List<StandardItemModelSet> standards, List<ic_item> items, List<HolidayMaster> holidays, List<PlatStockMonitorSetting> monitorSettings)
+        public List<crm_planorder> MonthlyReplenish(InputDto input,string strN1, List<PlatformFcstCollect> platformFcsts, List<DomesticTerminalFcst> domesticFcsts, List<DomesticTerminalFcst> T2Fcsts, List<StandardItemModelSet> standards, List<ic_item> items, List<HolidayMaster> holidays, List<PlatStockMonitorSetting> monitorSettings, List<SAPInv> sAPInvs)
         { 
             List<crm_planorder> planorders = new List<crm_planorder>();
             //获取T1中规格型号对应的不同版本的物料编码
             var T1Models = domesticFcsts.Select(p => p.Model).Distinct().ToList();
             List<SkuVersionSet> skus = _skuVersionSet.GetListAsync(p=> T1Models.Contains(p.Model) && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
             //获取T1库存
-            List<string> itemNums = skus.Select(p=>p.ItemNum).Distinct().ToList();
-            List<LocationDetail> locationDetails = _locationDetail.Select(p=> itemNums.Contains(p.ItemNum) && p.Domain == input.factory_id.ToString() && p.IsActive);
+            //List<string> itemNums = skus.Select(p=>p.ItemNum).Distinct().ToList();
+            //List<LocationDetail> locationDetails = _locationDetail.Select(p=> itemNums.Contains(p.ItemNum) && p.Domain == input.factory_id.ToString() && p.IsActive);
 
             //获取临期库存设置
             GeneralizedCodeMaster master = _generalizedCodeMaster.Select(p => p.Domain == input.factory_id.ToString() && p.IsActive && p.Val == "LongPeriodItemPlanMonth").FirstOrDefault();
@@ -653,7 +676,7 @@ namespace Business.SaleForecastManagement
                 var curSkus = skus.Where(p => p.Model == item).ToList();
                 if (curSkus.Any())
                 {
-                    sumQty = locationDetails.Where(p => curSkus.Select(p => p.ItemNum).Contains(p.ItemNum)).Sum(p => p.QtyOnHand);
+                    sumQty = sAPInvs.Where(p => curSkus.Select(p => p.ItemNum).Contains(p.MATNR)).Sum(p => Convert.ToDecimal(p.LABST));
                 }
                 //计算Rop
                 //当前规格型号对应标准SKU的最小包装单位、补货周期