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

工单计算占用逻辑调整。

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

+ 2 - 2
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -690,7 +690,7 @@ namespace Business.ResourceExamineManagement
                     List<mo_mes_mooccupy> mooccupylist = new List<mo_mes_mooccupy>();
                     if (param.checkflag || param.checkPlan)
                     {
-                        mooccupylist = _morderAppService.CheckMorder(item.item_number, item.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item, bangid);
+                        mooccupylist = _morderAppService.CheckMorder(item.item_number, item.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item, bangid, mes_morder);
                     }  
                     decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
                     item.mo_qty = moo_qty;
@@ -1214,7 +1214,7 @@ namespace Business.ResourceExamineManagement
                             List<mo_mes_mooccupy> mooccupylist = new List<mo_mes_mooccupy>();
                             if (param.checkflag || param.checkPlan)
                             {
-                                mooccupylist = _morderAppService.CheckMorder(sct.item_number, sct.lack_qty, dateTime, sentrys, ic_item, bangid);
+                                mooccupylist = _morderAppService.CheckMorder(sct.item_number, sct.lack_qty, dateTime, sentrys, ic_item, bangid, mes_morder);
                             }
                             decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
                             sct.mo_qty = moo_qty;

+ 30 - 139
MicroServices/Business/Business.Application/ResourceExamineManagement/MorderAppService.cs

@@ -221,7 +221,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="DeliverDate">交付日期</param>
         /// <param name="seorderentry_id">销售订单子表ID</param>
         /// <returns></returns>
-        public List<mo_mes_mooccupy> CheckMorder(string itemNumber, decimal Quantity, DateTime DeliverDate, crm_seorderentry seorderentry, mo_ic_item ic_Item, long bang_id)
+        public List<mo_mes_mooccupy> CheckMorder(string itemNumber, decimal Quantity, DateTime DeliverDate, crm_seorderentry seorderentry, mo_ic_item ic_Item, long bang_id, mes_morder mes_morder=null)
         {
             //获取销售订单信息
             //var seorder = await _crm_seorder.FindAsync(x => x.Id == OrderId);
@@ -242,22 +242,34 @@ namespace Business.ResourceExamineManagement
             //&& x.fitem_number == ic_Item.number && x.bang_id == bang_id);
 
             var mes_mooccupyList = mo_Mes_Mooccupies.Where(x => x.fitem_number == ic_Item.number);
-            DateTime totime = DateTime.Now;
+            DateTime totime = DateTime.Now.Date;
             //首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
             //当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
-            var moentrys = mo_Mes_Moentry.Where(s => s.soentry_id == seorderentry.Id);
-            //找到当前订单行生成的主工单
-            var toMid = moentrys.Select(s => s.moentry_moid).ToList();
-            var morderDataList = mo_Mes_Morders.Where(x => x.product_code == itemNumber && x.morder_type == MorderEnum.JhMorder && totime < x.moentry_sys_etime.GetValueOrDefault() && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate &&
-            (x.morder_production_number - x.inventory_number - mes_mooccupyList.Where(p => p.moo_moid.GetValueOrDefault() == x.mysql_id)?.Sum(m => m.moo_qty)) > Quantity)
-             .OrderByDescending(x => x.planner_end_date).ToList();
-
+            List<mo_mes_morder> morderDataList = new List<mo_mes_morder>();
             List<mo_mes_mooccupy> mes_Mooccupies = new List<mo_mes_mooccupy>();
-            //当数量或日期不满足的时候,寻找最早日期的工单
-            if (morderDataList.Count == 0)
+            if (mes_morder != null)
             {
-                morderDataList = mo_Mes_Morders.Where(x => x.product_code == itemNumber && (x.morder_type == MorderEnum.JhMorder || toMid.Contains(x.mysql_id)) && totime < x.moentry_sys_etime.GetValueOrDefault() && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
+                //半成品检查进入
+                //只找父级的子工单
+                morderDataList = mo_Mes_Morders.Where(x => x.product_code == itemNumber && x.parent_id == mes_morder.Id).ToList();
+                //如果当前父级产生的子工单,数量不够时
+                if (morderDataList.Sum(x => x.morder_production_number.GetValueOrDefault()) - morderDataList.Sum(x => x.inventory_number.GetValueOrDefault()) < Quantity)
+                {
+                    //再找没有被计划占用的子工单
+                    morderDataList.AddRange(mo_Mes_Morders.Where(x => x.product_code == itemNumber && x.parent_id.GetValueOrDefault() == 0 && x.morder_type == MorderEnum.JhMorder && totime < x.moentry_sys_etime.GetValueOrDefault() && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate &&
+            (x.morder_production_number - x.inventory_number - mes_mooccupyList.Where(p => p.moo_moid.GetValueOrDefault() == x.mysql_id)?.Sum(m => m.moo_qty)) > Quantity)
+             .OrderByDescending(x => x.planner_end_date).ToList());
+                }
             }
+            else
+            {
+                //成品进入,只找没有父级的工单,并且是计划工单
+                morderDataList = mo_Mes_Morders.Where(x => x.product_code == itemNumber && x.parent_id.GetValueOrDefault() == 0 && x.morder_type == MorderEnum.JhMorder && totime < x.moentry_sys_etime.GetValueOrDefault() && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate &&
+            (x.morder_production_number - x.inventory_number - mes_mooccupyList.Where(p => p.moo_moid.GetValueOrDefault() == x.mysql_id)?.Sum(m => m.moo_qty)) > Quantity)
+             .OrderByDescending(x => x.planner_end_date).ToList();
+            }
+            
+
             var QuantityNumber = 0.00m;
             //存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。
             foreach (var item in morderDataList)
@@ -270,48 +282,6 @@ namespace Business.ResourceExamineManagement
                 var Sum = item.morder_production_number.GetValueOrDefault() - item.inventory_number.GetValueOrDefault() - Sumqty.GetValueOrDefault();
                 if (Sum > 0)
                 {
-                    #region 注释
-                    //if (Sumqty > 0 || item.inventory_number > 0)
-                    //{
-                    //    ProdExamineParamDto prodExamine = new ProdExamineParamDto()
-                    //    {
-                    //        bom_number = item.bom_number,
-                    //        version = version,
-                    //        packages = (int)(item.inventory_number + Sumqty).GetValueOrDefault(),
-                    //        tenantId = item.tenant_id,
-                    //        factoryId = item.factory_id.GetValueOrDefault()
-
-                    //    };
-                    //    //获取入库和已占用的数据的生产时长
-                    //    var ProductiveDate = _productExamineAppService.ProductiveExamine(prodExamine);
-                    //    var Day = ProductiveDate.Result / (60 * 10);
-                    //    //工单被完全占用结束日期为工单结束时间
-                    //    if (Quantity - (item.morder_production_number - item.inventory_number - Sumqty) == 0)
-                    //    {
-
-                    //        var date = item.moentry_sys_stime.GetValueOrDefault().AddDays((double)Day);
-                    //        var endDate = item.moentry_sys_etime;
-                    //    }
-                    //    //工单未被完成占用计算结束日期
-                    //    else if (item.morder_production_number - item.inventory_number - Sumqty - Quantity > 0)
-                    //    {
-                    //        var date = item.moentry_sys_stime.GetValueOrDefault().AddDays((double)Day);
-                    //        ProdExamineParamDto EndprodExamine = new ProdExamineParamDto()
-                    //        {
-                    //            bom_number = item.bom_number,
-                    //            version = version,
-                    //            packages = (int)Quantity,
-                    //            tenantId = item.tenant_id,
-                    //            factoryId = item.factory_id.GetValueOrDefault()
-                    //        };
-                    //        var EndProductiveDate = _productExamineAppService.ProductiveExamine(EndprodExamine);
-                    //        var EndDay = ProductiveDate.Result / (60 * 10);
-                    //        var endDate = date.AddDays((double)EndDay);
-                    //    }
-
-                    //}
-
-                    #endregion
                     //工单可占用数量-需求数量小于0时 占用工单全部可占用数量
                     if (Sum - Quantity <= 0)
                     {
@@ -333,91 +303,12 @@ namespace Business.ResourceExamineManagement
                 }
 
             }
-            #region 注释
-            //  if (morderDataList.Count > 0)
-            //  {
-            //      //存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。
-            //      var morder = morderDataList.OrderByDescending(x => x.planner_end_date);
-            //      foreach (var item in morder)
-            //      {
-            //          var mooccupies = mes_mooccupyList.Where(x => x.moo_moid == item.Id).ToList();
-            //          if (mooccupies.Count > 0)
-            //          {
-            //              var Sumqty = mooccupies.Sum(x => x.moo_qty);
-            //              //判断此工单剩下数量是否还有
-            //              if (item.morder_production_number - item.inventory_number - Sumqty > 0)
-            //              {
-            //                  var Sum = item.morder_production_number - item.inventory_number - Sumqty;
-            //                  //需要数量-(计划数量-入库数量-已占用量)
-            //                  Quantity = Quantity - (item.morder_production_number - item.inventory_number - Sumqty);
-            //                  if (Quantity > 0)
-            //                  {
-            //                      var mes_Mooccupy = GetMooccupies(seorderentry, ic_Item, item, Sum);
-            //                      mes_Mooccupies.Add(mes_Mooccupy);
-            //                  }
-            //                  else
-            //                  {
-            //                      break;
-            //                  }
-            //              }
-            //          }
-            //      }
-            //      await _mes_mooccupy.InsertMany(mes_Mooccupies);
-            //      Number = 1;
-            //  }
-            //  else
-            //  {
-            //      // 寻找最早日期工单 &&  计算生产数量-入库数据并且大于需求产品数量后累加直到满足需求产品数量
-            //      var morderListData = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
-
-            //      decimal? number = Quantity;
-            //      foreach (var item in morderListData)
-            //      {
-            //          //查询出工单已占用总数量
-            //          var mooccupies = mes_mooccupyList.Where(x => x.moo_moid == item.Id).ToList();
-
-            //          var Sumqty = mooccupies.Count > 0 ? mooccupies.Sum(x => x.moo_qty) : 0.00m;
-            //          //判断此工单剩下数量是否还有
-            //          if (item.morder_production_number - item.inventory_number - Sumqty > 0)
-            //          {
-            //              var Sum = item.morder_production_number - item.inventory_number - Sumqty;
-            //              //需要数量-(计划数量-入库数量-已占用量)
-            //              Quantity = Quantity - (item.morder_production_number - item.inventory_number - Sumqty);
-            //              if (Quantity > 0)
-            //              {
-            //                  var mes_Mooccupy = GetMooccupies(seorderentry, ic_Item, item, Sum);
-            //                  mes_Mooccupies.Add(mes_Mooccupy);
-            //              }
-            //              else
-            //              {
-            //                  break;
-            //              }
-            //          }
-
-            //          //var mes_Mooccupy = GetMooccupies(seorderentry, ic_Item, item, mooccupies);
-            //          //mes_Mooccupies.Add(mes_Mooccupy);
-            //          //需求数量-占用量后小于或等于0 停止循环占用工单
-            //          //if (number - mes_Mooccupy.moo_qty <= 0)
-            //          //{
-            //          //    break;
-            //          //}
-            //      }
-            //      var morderDatas = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) > DeliverDate &&
-            //(x.morder_production_number - x.inventory_number) > Quantity).ToList();
-            //      if (number > 0)
-            //      {
-            //          Number = 3;
-            //      }
-            //      if (morderDatas.Count > 0)
-            //      {
-            //          Number = 2;
-            //      }
-            //      else
-            //      {
-            //          Number = 1;
-            //      }
-            //  }
-            #endregion
+            if (mes_morder != null) {
+                mes_Mooccupies.ForEach(me =>
+                {
+                    me.moo_id = mes_morder.Id;
+                });
+            }
             //TODO:返回占用数据,外层每个BOM根据占用工单数据判断是否满足。
             return mes_Mooccupies.OrderByDescending(s => s.moo_etime).ToList();
         }

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

@@ -2434,6 +2434,13 @@ namespace Business.ResourceExamineManagement
                 {
                     _businessDbContext.BulkDelete(dellist);
                 }*/
+
+                //清理工单占用
+                List<mes_mooccupy> mooccupy = await _mysql_mes_mooccupy.GetListAsync(s => Mes_Morders.Select(c => c.Id).Contains(s.moo_id.GetValueOrDefault()));
+                if (mooccupy.Any())
+                {
+                    _businessDbContext.BulkDelete(mooccupy);
+                }
                 //清理掉库存占用
                 var itemstockoccupy = _mysql_ic_item_stockoccupy.GetListAsync(s => monolist.Contains(s.morder_mo)).Result;
                 if (itemstockoccupy.Any())
@@ -3284,8 +3291,8 @@ namespace Business.ResourceExamineManagement
             holidays = _holidayMaster.Select(p => p.Dated >= DateTime.Now.Date);
 
             //主工单
-            List<mo_mes_morder> mo_Mes_Morders = _mes_morder.GetListAsync(x => boms.Select(p => p.bom_number).Contains(x.bom_number) && (x.morder_state != MorderEnum.Accomplish_state || x.morder_state != MorderEnum.Close_state
-          && x.morder_icitem_type != MorderEnum.XgwyMorder) && x.company_id == param.company_id && x.bang_id == bangid).Result;
+            List<mo_mes_morder> mo_Mes_Morders = _mes_morder.GetListAsync(x => boms.Select(p => p.item_number).Contains(x.product_code) && (x.morder_state != MorderEnum.Accomplish_state || x.morder_state != MorderEnum.Close_state
+          && x.morder_icitem_type != MorderEnum.XgwyMorder) && x.company_id == param.company_id && x.factory_id == param.factoryId && x.bang_id == bangid).Result;
             List<long> moids = mo_Mes_Morders.Select(p => p.mysql_id).ToList();
             List<mo_mes_moentry> mo_Mes_Moentry = _mes_moentry.GetListAsync(x => moids.Contains(x.moentry_moid)).Result;
             //工单占用表

+ 6 - 7
MicroServices/Business/Business.Domain/MongoDB/Production/mo_mes_mooccupy.cs

@@ -13,12 +13,11 @@ namespace Business.Domain
     [Comment("在制工单占用记录表")]
     public class mo_mes_mooccupy : MoBaseEntity
     {
-        ///// <summary>
-        ///// 工单占用ID
-        ///// </summary>
-        //[Key]
-        //[Comment("工单占用ID")]
-        //public long moo_id { get; set; }
+        /// <summary>
+        /// 工单占用ID
+        /// </summary>
+        [Comment("工单占用ID")]
+        public long? moo_id { get; set; }
 
         /// <summary>
         /// 类型--原始,分配
@@ -70,7 +69,7 @@ namespace Business.Domain
         public string? fmodel { get; set; }
 
         /// <summary>
-        /// 工单id
+        /// 被占用工单id
         /// </summary>
         [Comment("工单id")]
         public long? moo_moid { get; set; }

+ 6 - 7
MicroServices/Business/Business.Domain/StructuredDB/Production/mes_mooccupy.cs

@@ -14,12 +14,11 @@ namespace Business.Domain
     [Comment("在制工单占用记录表")]
     public class mes_mooccupy : BaseEntity
     {
-        ///// <summary>
-        ///// 工单占用ID
-        ///// </summary>
-        //[Key]
-        //[Comment("工单占用ID")]
-        //public long moo_id { get; set; }
+        /// <summary>
+        /// 工单占用ID
+        /// </summary>
+        [Comment("工单占用ID")]
+        public long? moo_id { get; set; }
 
         /// <summary>
         /// 类型--原始,分配
@@ -71,7 +70,7 @@ namespace Business.Domain
         public string fmodel { get; set; }
 
         /// <summary>
-        /// 工单id
+        /// 被占用工单id
         /// </summary>
         [Comment("工单id")]
         public long? moo_moid { get; set; }