zhengly 3 роки тому
батько
коміт
e4be1fd101

+ 122 - 50
MicroServices/Business/Business.Application/ResourceExamineManagement/MorderAppService.cs

@@ -170,7 +170,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="DeliverDate">交付日期</param>
         /// <param name="seorderentry_id">销售订单子表ID</param>
         /// <returns></returns>
-        public async Task<int> CheckMorder(string bomNumber, decimal? Quantity, DateTime DeliverDate, crm_seorderentry seorderentry, ic_item ic_Item)
+        public async Task<List<mes_mooccupy>> CheckMorder(string bomNumber, decimal? Quantity, DateTime DeliverDate, crm_seorderentry seorderentry, ic_item ic_Item)
         {
             if (string.IsNullOrEmpty(bomNumber) || Quantity == null)
             {
@@ -190,57 +190,134 @@ namespace Business.ResourceExamineManagement
             //var ic_item = _ic_item.GetManyByCondition(x => x.number == seorderentry.item_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
 
             //工单已被占用后要与占用表关联查询...减去占用量后 剩下生产数量可供下个销售工单使用。
-            var mes_mooccupyList = await _mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id);
+            var mes_mooccupyList = await _mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id
+            && x.fitem_number == seorderentry.item_number);
 
             //首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
             //当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
             var morderDataList = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate &&
-            (x.morder_production_number - x.inventory_number) > Quantity).ToList();
-
-
-            if (morderDataList.Count > 0)
+            (x.morder_production_number - x.inventory_number) > Quantity).OrderByDescending(x => x.planner_end_date).ToList();
+            List<mes_mooccupy> mes_Mooccupies = new List<mes_mooccupy>();
+            //当数量或日期不满足的时候,寻找最早日期的工单
+            if (morderDataList.Count == 0)
             {
-                //存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。
-                var morder = morderDataList.OrderByDescending(x => x.planner_end_date).FirstOrDefault();
-                var mooccupies = mes_mooccupyList.Where(x => x.moo_moid == morder.Id).ToList();
-                var mes_Mooccupy = GetMooccupies(seorderentry, ic_Item, morder, mooccupies);
-                await _mes_mooccupy.InsertOne(mes_Mooccupy);
-                Number = 1;
+                morderDataList = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
             }
-            else
+            //存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。
+            foreach (var item in morderDataList)
             {
-                // 寻找最早日期工单 &&  计算生产数量-入库数据并且大于需求产品数量后累加直到满足需求产品数量
-                var morderListData = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
-                List<mes_mooccupy> mes_Mooccupies = new List<mes_mooccupy>();
-                decimal? number = Quantity;
-                foreach (var item in morderListData)
+                //查询当前工单是否存在占用情况
+                var mooccupies = mes_mooccupyList.Where(x => x.moo_moid == item.Id).ToList();
+                if (mooccupies.Count > 0)
                 {
-                    //查询出工单已占用总数量
-                    var mooccupies = mes_mooccupyList.Where(x => x.moo_moid == item.Id).ToList();
-                    var mes_Mooccupy = GetMooccupies(seorderentry, ic_Item, item, mooccupies);
-                    mes_Mooccupies.Add(mes_Mooccupy);
-                    //需求数量-占用量后小于或等于0 停止循环占用工单
-                    if (number - mes_Mooccupy.moo_qty <= 0)
+                    var Sumqty = mooccupies.Count > 0 ? mooccupies.Sum(x => x.moo_qty) : 0.00m;
+                    //判断此工单剩余可占用数量
+                    if (item.morder_production_number - item.inventory_number - Sumqty > 0)
                     {
-                        break;
+                        var Sum = item.morder_production_number - item.inventory_number - Sumqty;
+                        //剩余需要数量= 需要数量 -(计划数量 - 入库数量 - 已占用量)
+                        Quantity = Quantity - (item.morder_production_number - item.inventory_number - Sumqty);
+                        //当剩余需要数量大于0则继续寻找可占用工单,已满足需要数量停止循环查找
+                        if (Quantity > 0)
+                        {
+                            var mes_Mooccupy = GetMooccupies(seorderentry, ic_Item, item, Sum);
+                            mes_Mooccupies.Add(mes_Mooccupy);
+                        }
+                        else
+                        {
+                            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;
-                }
             }
-            return Number;
+            await _mes_mooccupy.InsertMany(mes_Mooccupies);
+            #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
+            //TODO:返回占用数据,外层每个BOM根据占用工单数据判断是否满足。
+            return mes_Mooccupies;
         }
         /// <summary>
         /// 拼接工单占用表
@@ -250,13 +327,8 @@ namespace Business.ResourceExamineManagement
         /// <param name="item">工单表</param>
         /// <param name="mes_mooccupy">占用工单表</param>
         /// <returns></returns>
-        public mes_mooccupy GetMooccupies(crm_seorderentry seorderentry, ic_item ic_item, mes_morder item, List<mes_mooccupy> mes_mooccupy)
+        public mes_mooccupy GetMooccupies(crm_seorderentry seorderentry, ic_item ic_item, mes_morder item, decimal? number)
         {
-            decimal? Sumqty = 0;
-            if (mes_mooccupy.Count > 0)
-            {
-                Sumqty = mes_mooccupy.Sum(x => x.moo_qty);
-            }
             //生成mes_mooccupy工单占用表数据,代表多个工单被某个销售订单已占用。 
             mes_mooccupy mes_Mooccupy = new mes_mooccupy();
             mes_Mooccupy.GenerateNewId();
@@ -270,16 +342,16 @@ namespace Business.ResourceExamineManagement
             mes_Mooccupy.moo_moid = item.Id;
             mes_Mooccupy.moo_mo = item.morder_no;
             //占用量=生产计划数量-入库数量-已被占用数量
-            mes_Mooccupy.moo_qty = item.morder_production_number - item.inventory_number - Sumqty;
-            mes_Mooccupy.moo_stime = DateTime.Now.Date;
-            mes_Mooccupy.moo_etime = DateTime.Now;//日期来源需确定
+            mes_Mooccupy.moo_qty = number;
+            mes_Mooccupy.moo_stime = item.moentry_sys_stime;
+            mes_Mooccupy.moo_etime = item.moentry_sys_etime;
             mes_Mooccupy.moo_state = 1;
             mes_Mooccupy.moo_cbr = string.Empty;
             //mes_Mooccupy.moo_ctime = ;
             mes_Mooccupy.moo_creason = string.Empty;
             mes_Mooccupy.tenant_id = seorderentry.tenant_id;//取销售子表企业ID
             mes_Mooccupy.factory_id = seorderentry.factory_id;
-            mes_Mooccupy.factory_id = seorderentry.factory_id;
+            mes_Mooccupy.org_id = seorderentry.org_id;
             return mes_Mooccupy;
         }
     }