zhengly 3 лет назад
Родитель
Сommit
a5349c8cfc

+ 52 - 7
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -25,6 +25,8 @@ using ZstdSharp.Unsafe;
 using System.Transactions;
 using NUglify.JavaScript.Syntax;
 using System.Linq.Expressions;
+using XCZ.Extensions;
+using System.ComponentModel.Design;
 
 namespace Business.ResourceExamineManagement
 {
@@ -185,14 +187,57 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         /// <param name="bomNumber">Bom编码</param>
         /// <param name="Quantity">需要数量</param>
+        /// <param name="EndDate">交付日期</param>
         /// <returns></returns>
-        public async Task CheckMorder(string bomNumber, decimal? Quantity, DateTime EndDate)
+        public async Task<List<mes_morder>> CheckMorder(string bomNumber, decimal? Quantity, DateTime DeliverDate)
         {
-            if (string.IsNullOrEmpty(bomNumber) || Quantity < 0)
+            if (string.IsNullOrEmpty(bomNumber) || Quantity != null)
             {
                 //TODO:入参异常;
-                //throw new NotImplementedException();
+                throw new NotImplementedException("BOM编码或需求数量不能为空!");
             }
+            //根据Bom编码查询出对应工单并且状态不为完成、关闭,非委外工单。
+            //TODO:工单类型;
+            Expression<Func<mes_morder, bool>> filter = x => x.bom_number == bomNumber && (x.morder_state != "完成" || x.morder_state != "关闭"
+            && x.morder_icitem_type != "相关委外工单") && x.IsDeleted == false;
+            var morderList = await _mes_morder.GetManyByCondition(filter);
+            //首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
+
+            //当前工单计划日期-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)
+            {
+                //存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。
+                var morder = morderDataList.OrderByDescending(x => x.planner_end_date).FirstOrDefault();
+                //生成mes_mooccupy工单占用表数据,代表此工单被某个销售订单已占用。
+            }
+            else
+            {
+                // 寻找最早日期工单 &&  计算生产数量-入库数据并且大于需求产品数量后累加直到满足需求产品数量
+                var morderListData = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
+                if (morderListData.Count == 0)
+                {
+                    //TODO:后期处理无在制工单返回内容
+                    throw new NotImplementedException("无可用在制工单!");
+                }
+                List<mes_morder> mes_Morders = new List<mes_morder>();
+                decimal? number = Quantity;
+                foreach (var item in morderListData)
+                {
+                    number = number - (item.morder_production_number - item.inventory_number);
+                    if (number < 0)
+                    {
+                        mes_Morders.Add(item);
+                    }
+                    else
+                    {
+                        break;
+                    }
+                }
+                //生成mes_mooccupy工单占用表数据,代表多个工单被某个销售订单已占用。 
+            }
+            return morderList;
             #region 注释
             /* var morderList = _mes_morder.GetAll().Result;
             //查询生产工单类型为计划工单并且工单类型为备库工单 并且BOM编码一致数据,订单状态为 初始或下达工单
@@ -219,7 +264,7 @@ namespace Business.ResourceExamineManagement
             if (orderid == null)
             {
                 //throw new bu
-            } 
+            }
             if (BomId == null)
             {
                 //throw new bu
@@ -270,7 +315,7 @@ namespace Business.ResourceExamineManagement
             dto.unit = bom.unit;
             dto.erp_cls = item.erp_cls;
             dto.erp_cls_name = item.erp_cls_name;
-            
+
 
             //var bdto = ObjectMapper.Map<ic_bom,BomChildExamineDto>(bom);
             returnlist.Add(dto);
@@ -341,11 +386,11 @@ namespace Business.ResourceExamineManagement
         public void BomStock(List<BomChildExamineDto> returnlist)
         {
             returnlist = returnlist.OrderBy(s => s.num).ToList();
-            
+
             List<long> idlist = new List<long>();
             foreach (var item in returnlist)
             {
-                
+
             }
         }
     }