Selaa lähdekoodia

Merge branch 'master' of http://123.60.180.165:4647/ZZYDOP/DOPCore

# Conflicts:
#	MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs
heteng 3 vuotta sitten
vanhempi
commit
01419ecc42

+ 12 - 2
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/BomChildExamineDto.cs

@@ -9,7 +9,7 @@ namespace Business.ResourceExamineManagement.Dto
 {
     public class BomChildExamineDto
     {
-        /// <summary>
+        /*/// <summary>
         /// 主键
         /// </summary>
         public long id { get; set; }
@@ -17,7 +17,17 @@ namespace Business.ResourceExamineManagement.Dto
         /// <summary>
         /// 父级
         /// </summary>
-        public long? parent_id { get; set; }
+        public long? parent_id { get; set; }*/
+
+        /// <summary>
+        /// 主键
+        /// </summary>
+        public Guid id { get; set; }
+
+        /// <summary>
+        /// 父级
+        /// </summary>
+        public Guid parent_id { get; set; }
 
         /// <summary>
         /// bom明细主键

+ 175 - 80
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -50,6 +50,7 @@ using Hangfire.Server;
 using WkHtmlToPdfDotNet;
 using Microsoft.EntityFrameworkCore.Migrations.Operations;
 using Microsoft.AspNetCore.SignalR;
+using System.Diagnostics;
 
 namespace Business.ResourceExamineManagement
 {
@@ -299,9 +300,9 @@ namespace Business.ResourceExamineManagement
             _srm_po_list = srm_po_list;
             _crm_seorder = crm_seorder;
             _crm_seorderentry = crm_seorderentry;
-            _srm_po_occupy= srm_po_occupy;
-            _ic_item_pur= ic_item_pur;
-            _ic_plan= ic_plan;
+            _srm_po_occupy = srm_po_occupy;
+            _ic_item_pur = ic_item_pur;
+            _ic_plan = ic_plan;
             _ic_substitute = ic_substitute;
             _ic_substitute_all = ic_substitute_all;
             _ic_substitute_all_dtl = ic_substitute_all_dtl;
@@ -384,6 +385,34 @@ namespace Business.ResourceExamineManagement
             //await _ic_item_stock.DeleteAll();
         }
 
+        public void GetMongoDb(ic_bom bom, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist, List<ic_item> icitemlist)
+        {
+
+            if (bom != null)
+            {
+                bomlist.Add(bom);
+                var item = _ic_item.Find(s => s.Id == bom.icitem_id).Result.FirstOrDefault();
+                if (item != null)
+                {
+                    icitemlist.Add(item);
+                }
+                List<ic_bom_child> childList = _ic_bom_child.GetManyByCondition(p => p.bom_id == bom.Id && p.IsDeleted == false).Result.ToList();
+                bomchildlist.AddRange(childList);
+                foreach (var childd in childList)
+                {
+                    List<long> itemids = childList.Select(s => s.icitem_id).ToList();
+                    var itemlist = _ic_item.GetManyByCondition(p => itemids.Contains(p.Id) && p.IsDeleted == false).Result;
+                    var childBom = _ic_bom.GetManyByCondition(p => p.icitem_id == childd.icitem_id).Result.FirstOrDefault();
+                    icitemlist.AddRange(itemlist);
+                    if (childBom != null)
+                    {
+                        GetMongoDb(childBom, bomlist, bomchildlist, icitemlist);
+                    }
+                }
+            }
+
+        }
+
         /// <summary>
         /// 资源检查
         /// </summary>
@@ -394,33 +423,40 @@ namespace Business.ResourceExamineManagement
         {
             //资源检查结果
             PschedDto rtn = new PschedDto();
-            rtn.sorderid = input.sorderId; 
+            rtn.sorderid = input.sorderId;
 
             //生成当前计算bangid
             SnowFlake snow = new SnowFlake();
             long bangid = snow.NextId();
 
             //获取订单数据
-            crm_seorder sorder = _mysql_crm_seorder.GetListAsync(p=>p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.Id == input.sorderId && p.IsDeleted ==false).Result.FirstOrDefault();
+            crm_seorder sorder = _mysql_crm_seorder.GetListAsync(p => p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.Id == input.sorderId && p.IsDeleted == false).Result.FirstOrDefault();
             if (sorder == null)
             {
                 throw new NotImplementedException("订单数据不存在!");
             }
             //获取订单行数据
             List<crm_seorderentry> sentrys = _mysql_crm_seorderentry.GetListAsync(p => p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.seorder_id == input.sorderId && p.IsDeleted == false).Result;
-            
+
             //数据库快照-同步mysql库数据到mongoDB中
-            await SyncData(input.tenantId, input.factoryId, bangid);
+            //await SyncData(input.tenantId, input.factoryId, bangid);
 
             //资源检查结果list
             List<ExamineResult> examines = new List<ExamineResult>();
             ExamineResult dtl;
             #region 
-            var bomlist = _ic_bom.GetAll().Result;
-            var bomchildlist = _ic_bom_child.GetAll().Result;
-            var icitemlist = _ic_item.GetAll().Result;
+            List<ic_bom> bomlist = new List<ic_bom>();
+            List<ic_bom_child> bomchildlist = new List<ic_bom_child>();
+            List<ic_item> icitemlist = new List<ic_item>();
+            
+            //var bomlist = _ic_bom.GetAll().Result;
+            //var bomchildlist = _ic_bom_child.GetAll().Result;
+            //var icitemlist = _ic_item.GetAll().Result;
             foreach (var o in sentrys)
             {
+                var childBom = _ic_bom.GetManyByCondition(p => p.bom_number == o.bom_number).Result.FirstOrDefault();
+                GetMongoDb(childBom, bomlist, bomchildlist, icitemlist);
+
                 //工单资源检查信息
                 dtl = new ExamineResult();
                 dtl.sentry_id = o.Id;
@@ -433,8 +469,8 @@ namespace Business.ResourceExamineManagement
                 BomSubstitute(getBomList, bomlist, bomchildlist, icitemlist);
                 //库存初始化
                 BomStock(getBomList, bangid, input.factoryId);
-                //
-                calcTest(getBomList, bangid, o.Id, o.qty.Value);
+                //计算
+                calcTest(getBomList, bangid, o.Id, o.qty.Value, input, o.plan_date);
 
                 //TODO:最晚开始时间
                 //最晚开工时间=订单行客户要求交期-采购提前期-质检提前期-入库提前期-发料提前期
@@ -445,6 +481,8 @@ namespace Business.ResourceExamineManagement
                 dtl.substitutes = getBomList;
                 //添加订单行开工信息
                 examines.Add(dtl);
+                //生成工单 TODO:0=产品数量
+                //GenerateMorder(o, 0);
             }
             #endregion
             //订单行资源检查明细list
@@ -765,7 +803,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="DeliverDate">交付日期</param>
         /// <param name="seorderentry_id">销售订单子表ID</param>
         /// <returns></returns>
-        public async Task GenerateMorder(crm_seorderentry seorderentry, decimal? Quantity)
+        public void GenerateMorder(crm_seorderentry seorderentry, decimal? Quantity)
         {
             //1.库存、在制工单检查完成后 当前BOM需要自制时 产生工单。
 
@@ -773,7 +811,7 @@ namespace Business.ResourceExamineManagement
             //查询销售订单子表数据
             //var seorderentry = await _mysql_crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
             //获取销售订单信息
-            var seorder = await _mysql_crm_seorder.FindAsync(x => x.Id == seorderentry.seorder_id);
+            var seorder = _mysql_crm_seorder.FindAsync(x => x.Id == seorderentry.seorder_id).Result;
             //物料BOM
             // var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == seorderentry.bom_number && x.factory_id == seorderentry.factory_id).Result.FirstOrDefault();
 
@@ -836,8 +874,8 @@ namespace Business.ResourceExamineManagement
             mes_Moentry.factory_id = seorderentry.factory_id;
             //using (TransactionScope scope = new TransactionScope())
             // {
-            await _mes_morder.InsertOne(mes_Morder);
-            await _mes_moentry.InsertOne(mes_Moentry);
+            _mes_morder.InsertOne(mes_Morder);
+            _mes_moentry.InsertOne(mes_Moentry);
             //scope.Complete();
             //}
         }
@@ -876,13 +914,14 @@ namespace Business.ResourceExamineManagement
         /// <param name="DeliverDate">交付日期</param>
         /// <param name="seorderentry_id">销售订单子表ID</param>
         /// <returns></returns>
-        public async Task<bool> CheckMorder(string bomNumber, decimal? Quantity, DateTime DeliverDate, crm_seorderentry seorderentry)
+        public async Task<int> CheckMorder(string bomNumber, decimal? Quantity, DateTime DeliverDate, crm_seorderentry seorderentry)
         {
             if (string.IsNullOrEmpty(bomNumber) || Quantity == null)
             {
                 //TODO:入参异常;
                 throw new NotImplementedException("BOM编码或需求数量不能为空!");
             }
+            var Number = 3; //1,满足,2数量满足,时间不满足,3不满足
             //获取销售订单信息
             //var seorder = await _crm_seorder.FindAsync(x => x.Id == OrderId);
             //var seorderentry = await _mysql_crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
@@ -901,6 +940,8 @@ namespace Business.ResourceExamineManagement
             //当前工单计划日期-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交付找到最早日期工单,则返回无需后续继续检查。
@@ -908,17 +949,12 @@ namespace Business.ResourceExamineManagement
                 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;
             }
             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("无可用在制工单!");
-                    return false;
-                }
                 List<mes_mooccupy> mes_Mooccupies = new List<mes_mooccupy>();
                 decimal? number = Quantity;
                 foreach (var item in morderListData)
@@ -933,8 +969,22 @@ namespace Business.ResourceExamineManagement
                         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 true;
+            return Number;
         }
         /// <summary>
         /// 拼接工单占用表
@@ -1000,13 +1050,13 @@ namespace Business.ResourceExamineManagement
             {
                 return returnlist;
             }
-            
+
             var dto = new BomChildExamineDto();
             dto.item_id = bom.icitem_id;
             dto.bom_id = BomId.Value;
             dto.level = 1;
-            dto.id = help.NextId();
-            dto.parent_id = help.NextId();
+            dto.id = Guid.NewGuid();
+            dto.parent_id = Guid.NewGuid();
             dto.qty = 1;
             dto.num = "1";
             dto.isbom = 1;
@@ -1038,7 +1088,8 @@ namespace Business.ResourceExamineManagement
             {
                 item = icitemlist.Where(a => a.Id == bom.icitem_id).FirstOrDefault();
             }
-            else {
+            else
+            {
                 item = icitemlist.Where(a => a.Id == dto.item_id).FirstOrDefault();
             }
             if (item == null)
@@ -1068,7 +1119,7 @@ namespace Business.ResourceExamineManagement
                 if (childBom != null)
                 {
                     var cdto = new BomChildExamineDto();
-                    cdto.id = help.NextId();
+                    cdto.id = Guid.NewGuid();
                     cdto.level = level;
                     cdto.parent_id = dto.id;
                     cdto.bom_child_id = c.Id;
@@ -1081,6 +1132,8 @@ namespace Business.ResourceExamineManagement
                     cdto.substitute_code = c.substitute_code;
                     cdto.icitem_ids = c.icitem_ids;
                     cdto.type = type;
+                    cdto.item_id = childBom.icitem_id;
+                    cdto.bom_id = childBom.Id;
                     //递归寻找子级
                     GetBomList(bomlist, bomchildlist, icitemlist, cdto, returnlist, type);
                 }
@@ -1092,7 +1145,7 @@ namespace Business.ResourceExamineManagement
                         childDto.level = level++;
                         childDto.bom_id = dto.bom_id;
                         childDto.bom_child_id = c.Id;
-                        childDto.id = help.NextId();
+                        childDto.id = Guid.NewGuid();
                         childDto.parent_id = dto.id;
                         childDto.item_id = icitem.Id;
                         childDto.item_name = icitem.name;
@@ -1124,12 +1177,20 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         public void BomSubstitute(List<BomChildExamineDto> returnlist, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist, List<ic_item> icitemlist)
         {
-            var sublist = _ic_substitute.GetManyByCondition(s => s.substitute_code.IsIn(returnlist.Select(c => c.substitute_code))).Result.ToList();
-            var suballlist = _ic_substitute_all.GetManyByCondition(s => s.substitute_id.IsIn(sublist.Select(c => c.Id))).Result.ToList();
-            var subdtllist = _ic_substitute_all_dtl.GetManyByCondition(s => s.substitute_allid.IsIn(suballlist.Select(c => c.Id))).Result.ToList();
+            List<string> codeList = returnlist.Select(c => c.substitute_code).ToList();
+            var sublist = _ic_substitute.GetManyByCondition(p => codeList.Contains(p.substitute_code) && p.IsDeleted == false).Result;
+
+            List<long> subidlist = sublist.Select(c => c.Id).ToList();
+            var suballlist = _ic_substitute_all.GetManyByCondition(p => subidlist.Contains(p.substitute_id) && p.IsDeleted == false).Result;
+
+            List<long> suballidlist = suballlist.Select(c => c.Id).ToList();
+            var subdtllist = _ic_substitute_all_dtl.GetManyByCondition(p => suballidlist.Contains(p.substitute_allid) && p.IsDeleted == false).Result;
+
             List<long> childidList = new List<long>();
             var help = new SnowFlake();
             int type = 1;
+            List<BomChildExamineDto> addlist = new List<BomChildExamineDto>();
+
             //除顶级外,其他层级关系全带出来。生成平铺
             foreach (var item in returnlist)
             {
@@ -1161,12 +1222,15 @@ namespace Business.ResourceExamineManagement
                             foreach (var sal in sall)
                             {
                                 var sadl = subdtllist.Where(s => s.substitute_allid == sal.Id).ToList();
+                                List<long> dtlItemId = sadl.Select(m => m.icitem_id).ToList();
+                                var dtlitemlist = _ic_item.GetManyByCondition(p => dtlItemId.Contains(p.Id) && p.IsDeleted == false).Result;
+                                icitemlist.AddRange(dtlitemlist);
                                 foreach (var dtl in sadl)
                                 {
                                     if (dtl.ismain != 0)//替代关系里,已经将BOM料当成主料存放于替代群组里了。
                                     {
                                         //递归将替代关系组装出来。
-                                        SubstitutePretreatment(sl, sal, dtl, item, returnlist, icitemlist, bomlist, bomchildlist, type);
+                                        SubstitutePretreatment(sl, sal, dtl, item, addlist, icitemlist, bomlist, bomchildlist, type);
                                     }
                                     else
                                     {
@@ -1180,6 +1244,7 @@ namespace Business.ResourceExamineManagement
                     }
                 }
             }
+            returnlist.AddRange(addlist);
         }
 
         /// <summary>
@@ -1205,7 +1270,7 @@ namespace Business.ResourceExamineManagement
             {
                 return;
             }
-            dto.id = help.NextId();
+            dto.id = Guid.NewGuid();
             dto.level = toDto.level;
             dto.parent_id = toDto.parent_id;
             dto.item_id = icitem.Id;
@@ -1219,20 +1284,20 @@ namespace Business.ResourceExamineManagement
             dto.backflush = toDto.backflush;
             //dto.qty = toDto.qty;
             //dto.replace_amount = dtl.replace_amount.Value;
-            dto.qty = dtl.replace_amount.Value;
+            dto.qty = dtl.replace_amount == null ? 1 : dtl.replace_amount.Value;
             dto.is_replace = 0;
             dto.haveicsubs = 0;
             dto.substitute_code = "";
             dto.icitem_ids = "";
-            dto.substitute_strategy = sl.substitute_strategy.Value;//替代策略
-            dto.substitute_mode = sl.substitute_mode.Value;//替代方式
+            dto.substitute_strategy = sl.substitute_strategy == null ? 0 : sl.substitute_strategy.Value;//替代策略
+            dto.substitute_mode = sl.substitute_mode == null ? 0 : sl.substitute_mode.Value;//替代方式
             dto.type = type;
             dto.substitute_all_num = sal.order_num;//群组优先级
             if (bom != null)
             {
                 dto.bom_id = bom.Id;
 
-                dto.qty = dtl.replace_amount.Value;
+                dto.qty = dtl.replace_amount == null ? 1 : dtl.replace_amount.Value;
                 dto.isbom = 1;
                 dto.is_replace = 0;
                 dto.haveicsubs = 0;
@@ -1279,7 +1344,8 @@ namespace Business.ResourceExamineManagement
         }
 
         //计算库存
-        public void calcTest(List<BomChildExamineDto> returnlist, long bangid, long orderid,decimal count)
+        public void calcTest(List<BomChildExamineDto> returnlist, long bangid, long orderid, decimal count, SeorderentryDto input, DateTime
+            ? plan_date)
         {
             //占用情况
             List<ic_item_stockoccupy> sklist = new List<ic_item_stockoccupy>();
@@ -1294,18 +1360,13 @@ namespace Business.ResourceExamineManagement
             List<long> calcIds = new List<long>();
             //先处理下最顶级的产品需要数量
             returnlist[0].needCount = returnlist[0].qty * count;
-            //returnlist[0].satisfyNum = returnlist[0].sqty;
             returnlist[0].lack_qty = returnlist[0].needCount - returnlist[0].sqty;
-            /*if (returnlist[0].lack_qty < 0)
+            if (returnlist[0].lack_qty > 0)
             {
-                //库存满足
-                returnlist[0].stock_state = 1;
-                returnlist[0].lack_qty = 0;
+                var seorderentry = _mysql_crm_seorderentry.FindAsync(x => x.Id == orderid).Result;
+                //生成自制工单
+                GenerateMorder(seorderentry, returnlist[0].lack_qty);
             }
-            else
-            {
-                returnlist[0].stock_state = 0;
-            }*/
             foreach (var item in returnlist)
             {
                 if (item.level == 1)
@@ -1328,11 +1389,32 @@ namespace Business.ResourceExamineManagement
                 {
                     //如果有替代关系,根据群组来明确使用哪个群组的替代料。按整批和混用逻辑来算
                     // 如果有群组替代,就移除掉被检查过的记录 item.icitem_ids
-                    CalcStrategy(item, returnlist, bangid, sklist);
+                    CalcStrategy(item, returnlist, bangid, sklist, input, plan_date);
                 }
                 else
                 {
-                    //直接占用库存,缺料就生成采购
+                    if (item.erp_cls == 1)
+                    {
+                        //走自制
+                    }
+                    else if (item.erp_cls == 2 || item.erp_cls == 3)
+                    {
+                        //直接占用库存,缺料就生成采购
+                        ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
+                        itemStockoccupyDto.bang_id = bangid;
+                        itemStockoccupyDto.icitem_id = item.item_id;
+                        itemStockoccupyDto.quantity = item.sqty;
+                        sklist.Add(itemStockoccupyDto);
+                        var leadTimeList = GetLeadTime(new List<BomChildExamineDto> { item }, input.tenantId, input.factoryId);//提前期列表
+                        var supplierList = GetSupplier(new List<BomChildExamineDto> { item }, input.tenantId, input.factoryId);//供应商列表
+                        var planList = GetICPlan(new List<BomChildExamineDto> { item }, input.tenantId, input.factoryId);//plan列表
+                        item.kitting_time = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                        if (item.erp_cls == 3)
+                        {
+                            //生成委外工单
+                            CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                        }
+                    }
                 }
             }
         }
@@ -1372,7 +1454,8 @@ namespace Business.ResourceExamineManagement
             item.stock_state = item.lack_qty > 0 ? 0 : 1;
         }
 
-        public void CalcStrategy(BomChildExamineDto item, List<BomChildExamineDto> returnlist, long bangid, List<ic_item_stockoccupy> sklist)
+        public void CalcStrategy(BomChildExamineDto item, List<BomChildExamineDto> returnlist, long bangid, List<ic_item_stockoccupy> sklist, SeorderentryDto input, DateTime
+            ? plan_date)
         {
             //提取群组关系
             var sublist = returnlist.Where(s => s.parent_id == item.parent_id && s.num == item.num && s.level == item.level).OrderBy(c => c.substitute_all_num).ToList();
@@ -1383,22 +1466,22 @@ namespace Business.ResourceExamineManagement
                 case 0://整批
                     WholeBatchCheck(sublist, returnlist, sklist, select);
                     //如果都需要采购的情况下,则默认使用优先级最高的
-                    WholeBatch(item,sublist, returnlist, sklist, select, bangid, parent);
+                    WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date);
                     break;
                 case 1://混用
-                    MixedUse(item,sublist, returnlist, sklist, bangid, parent);
+                    MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date);
                     break;
                 case 2://整批加混用
                     WholeBatchCheck(sublist, returnlist, sklist, select);
                     if (select.Count() == 0)
                     {
                         //走混用
-                        MixedUse(item,sublist, returnlist, sklist, bangid, parent);
+                        MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date);
                     }
                     else
                     {
                         //走整批
-                        WholeBatch(item,sublist, returnlist, sklist, select, bangid, parent);
+                        WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date);
                     }
                     break;
             }
@@ -1432,7 +1515,9 @@ namespace Business.ResourceExamineManagement
             }
         }
         //整批占用
-        public void WholeBatch(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sklist, List<BomChildExamineDto> select, long bangid, BomChildExamineDto parent) {
+        public void WholeBatch(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sklist, List<BomChildExamineDto> select, long bangid, BomChildExamineDto parent, SeorderentryDto input, DateTime
+            ? plan_date)
+        {
             if (select.Count() == 0)
             {
                 //如果为空,则默认使用优先级为0的集合作为替代关系
@@ -1441,7 +1526,8 @@ namespace Business.ResourceExamineManagement
                     //替代
                     select = sublist.Where(s => s.type == 0).ToList();
                 }
-                else {
+                else
+                {
                     //取代
                     select = sublist.Where(s => s.substitute_all_num == 0).ToList();
                 }
@@ -1455,27 +1541,31 @@ namespace Business.ResourceExamineManagement
                 itemStockoccupyDto.icitem_id = slt.item_id;
                 if (slt.lack_qty > 0)
                 {
+
                     itemStockoccupyDto.quantity = slt.sqty;
                     //库存不够的时候,根据属性生成采购和委外。
-                    var lack_qty = slt.lack_qty - itemStockoccupyDto.quantity;
                     if (slt.erp_cls == 1)
                     {
-                        slt.make_qty = lack_qty;
+                        slt.make_qty = slt.lack_qty;
                         /*var childList = returnlist.Where(s => s.parent_id == slt.id).ToList();
                         if (childList.Count() > 0)
                         {
                             CalcStrategy(slt, returnlist, bangid, sklist);
                         }*/
                     }
-                    else if (slt.erp_cls == 2)
-                    {
-                        //生成委外工单
-                        slt.Subcontracting_qty = lack_qty;
-                    }
-                    else if (slt.erp_cls == 3)
-                    {
-                        //生成采购订单
-                        slt.purchase_qty = lack_qty;
+                    else if (slt.erp_cls == 2 || slt.erp_cls == 3)
+                    {   //生成采购订单
+                        //slt.purchase_qty = slt.lack_qty;
+                        var leadTimeList = GetLeadTime(new List<BomChildExamineDto> { slt }, input.tenantId, input.factoryId);//提前期列表
+                        var supplierList = GetSupplier(new List<BomChildExamineDto> { slt }, input.tenantId, input.factoryId);//供应商列表
+                        var planList = GetICPlan(new List<BomChildExamineDto> { slt }, input.tenantId, input.factoryId);//plan列表
+
+                        slt.kitting_time = CreateSRMPR(slt, input.tenantId, input.factoryId, bangid, slt.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                        if (item.erp_cls == 3)
+                        {
+                            //生成委外工单
+                            CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                        }
                     }
                 }
                 else
@@ -1492,7 +1582,9 @@ namespace Business.ResourceExamineManagement
         }
 
         //混用占用数据
-        public void MixedUse(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sklist, long bangid, BomChildExamineDto parent) {
+        public void MixedUse(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sklist, long bangid, BomChildExamineDto parent, SeorderentryDto input, DateTime
+            ? plan_date)
+        {
 
             decimal parent_lack = 0;
             if (parent != null)
@@ -1554,7 +1646,8 @@ namespace Business.ResourceExamineManagement
                     //替代
                     select = sublist.Where(s => s.type == 0).ToList();
                 }
-                else {
+                else
+                {
                     //取代
                     select = sublist.Where(s => s.substitute_all_num == 0).ToList();
                 }
@@ -1569,15 +1662,17 @@ namespace Business.ResourceExamineManagement
                         //自制
                         //GenerateMorder()
                     }
-                    else if (sct.erp_cls == 2)
-                    {
-                        //委外
-                        //CreateMesOOder(returnlist,)
-                    }
-                    else if (sct.erp_cls == 3)
+                    else if (sct.erp_cls == 2 || sct.erp_cls == 3)
                     {
-                        //外购
-                        //CreateSRMPR(returnlist,)
+                        var leadTimeList = GetLeadTime(new List<BomChildExamineDto> { sct }, input.tenantId, input.factoryId);//提前期列表
+                        var supplierList = GetSupplier(new List<BomChildExamineDto> { sct }, input.tenantId, input.factoryId);//供应商列表
+                        var planList = GetICPlan(new List<BomChildExamineDto> { sct }, input.tenantId, input.factoryId);//plan列表
+                        sct.kitting_time = CreateSRMPR(sct, input.tenantId, input.factoryId, bangid, sct.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                        if (item.erp_cls == 3)
+                        {
+                            //生成委外工单
+                            CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                        }
                     }
                 }
             }
@@ -2084,7 +2179,7 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         /// <param name="returnlist"></param>
         /// <param name="factoryid"></param>
-        /// <param name="orderType">1委外采购申请单,2采购申请单</param>
+        /// <param name="orderType">2委外采购申请单,3采购申请单</param>
         private DateTime CreateSRMPR(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<ic_item_pur> supplierList, List<ic_plan> planList, DateTime deliveryDate)
         {
             var leadTime = iCItemLeadTimes.Find(x => x.item_id == returnlist.item_id);