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

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

Murphy 3 лет назад
Родитель
Сommit
6ab06cd785

+ 11 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/PschedDto.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using Volo.Abp.Application.Dtos;
 using System.ComponentModel.DataAnnotations;
 using Bussiness.Model.MES.IC;
+using Bussiness.Model.Production;
 
 namespace Business.ResourceExamineManagement.Dto
 {
@@ -25,6 +26,16 @@ namespace Business.ResourceExamineManagement.Dto
         /// 物料占用记录
         /// </summary>
         public List<ic_item_stockoccupy> sklist { get; set; }
+
+        /// <summary>
+        /// 采购申请
+        /// </summary>
+        public List<SRMPRDto> srm_pr_list { get; set; }
+
+        /// <summary>
+        /// 委外订单
+        /// </summary>
+        public List<mes_oorder> order_list { get; set; }
     }
 
     /// <summary>

+ 5 - 4
MicroServices/Business/Business.Application/ResourceExamineManagement/MorderAppService.cs

@@ -183,6 +183,7 @@ namespace Business.ResourceExamineManagement
             //var seorderentry = await _mysql_crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
             //根据Bom编码查询出对应工单并且状态不为完成、关闭,非委外工单。
             //TODO:工单类型;
+            //TODO:占用时间是使用生产工单开始结束日期、还是系统建议开始结束时间。
             var morderList = await _mes_morder.GetManyByCondition(x => x.bom_number == bomNumber && (x.morder_state != "完成" || x.morder_state != "关闭"
             && x.morder_icitem_type != "相关委外工单") && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id);
 
@@ -195,13 +196,13 @@ namespace Business.ResourceExamineManagement
 
             //首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
             //当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
-            var morderDataList = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate &&
+            var morderDataList = morderList.Where(x => x.moentry_sys_etime.Value.AddDays(-1) < DeliverDate &&
             (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)
             {
-                morderDataList = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
+                morderDataList = morderList.Where(x => x.moentry_sys_etime.Value.AddDays(-1) < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
             }
             //存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。
             foreach (var item in morderDataList)
@@ -346,9 +347,9 @@ namespace Business.ResourceExamineManagement
             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_cbr = string.Empty;
             //mes_Mooccupy.moo_ctime = ;
-            mes_Mooccupy.moo_creason = string.Empty;
+            //mes_Mooccupy.moo_creason = string.Empty;
             mes_Mooccupy.tenant_id = seorderentry.tenant_id;//取销售子表企业ID
             mes_Mooccupy.factory_id = seorderentry.factory_id;
             mes_Mooccupy.org_id = seorderentry.org_id;

+ 165 - 121
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -205,6 +205,16 @@ namespace Business.ResourceExamineManagement
         /// 工单App
         /// </summary>
         private readonly MorderAppService _morderAppService;
+
+        private List<ICItemLeadTimeDto> leadTimeList;
+
+        private List<ic_item_pur> supplierList;
+
+        private List<ic_plan> planList;
+
+        private List<SRMPRDto> SRMPRDtoList = new List<SRMPRDto>();
+
+        private List<mes_oorder> orderList = new List<mes_oorder>();
         #endregion
 
         #region 构造函数
@@ -357,7 +367,7 @@ namespace Business.ResourceExamineManagement
 
             List<long> suballidlist = suballlist.Select(c => c.Id).ToList();
             var subdtllist = _ic_substitute_all_dtl.GetManyByCondition(p => suballidlist.Contains(p.substitute_allid) && !p.IsDeleted).Result;
-            
+
 
 
             //物料占用记录
@@ -365,12 +375,13 @@ namespace Business.ResourceExamineManagement
             //获取物料数据
             List<long> itemIds = bomlist.Select(p => p.icitem_id).ToList();
             itemIds.AddRange(bomchildlist.Select(p => p.icitem_id).ToList());
+            itemIds.AddRange(subdtllist.Select(p => p.icitem_id).ToList());
             List<ic_item> icitemlist = _ic_item.GetManyByCondition(p => itemIds.Contains(p.Id) && !p.IsDeleted).Result;
 
             //物料提前期
-            var leadTimeList = GetLeadTime(itemIds, input.tenantId, input.factoryId);//提前期列表
-            var supplierList = GetSupplier(itemIds, input.tenantId, input.factoryId);//供应商列表
-            var planList = GetICPlan(itemIds, input.tenantId, input.factoryId);//plan列表
+            leadTimeList = GetLeadTime(itemIds, input.tenantId, input.factoryId);//提前期列表
+            supplierList = GetSupplier(itemIds, input.tenantId, input.factoryId);//供应商列表
+            planList = GetICPlan(itemIds, input.tenantId, input.factoryId);//plan列表
 
             foreach (var item in sentrys)
             {
@@ -406,6 +417,8 @@ namespace Business.ResourceExamineManagement
             }
             //订单行资源检查明细list
             rtn.examines = examines;
+            rtn.srm_pr_list = SRMPRDtoList;
+            rtn.order_list = orderList;
             rtn.sklist = sklist;
             return JsonConvert.SerializeObject(rtn);
         }
@@ -691,7 +704,7 @@ namespace Business.ResourceExamineManagement
         /// <summary>
         /// BOM替代关系预处理
         /// </summary>
-        public void BomSubstitute(List<BomChildExamineDto> returnlist, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist, List<ic_item> icitemlist,List<ic_substitute> sublist, List<ic_substitute_all> suballlist, List<ic_substitute_all_dtl> subdtllist)
+        public void BomSubstitute(List<BomChildExamineDto> returnlist, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist, List<ic_item> icitemlist, List<ic_substitute> sublist, List<ic_substitute_all> suballlist, List<ic_substitute_all_dtl> subdtllist)
         {
             List<long> childidList = new List<long>();
             int type = 1;
@@ -701,55 +714,57 @@ namespace Business.ResourceExamineManagement
             foreach (var item in returnlist)
             {
                 //最顶级、虚拟件
-                if (item.level != 1 && item.erp_cls != 4 && !childidList.Contains(item.bom_child_id.GetValueOrDefault()))
+                if (item.level == 1 || item.erp_cls == 4 || childidList.Contains(item.bom_child_id.GetValueOrDefault()))
                 {
-                    //有替代关系
-                    if (item.haveicsubs == 1)
+                    continue;
+                }
+                //有替代关系
+                if (item.haveicsubs != 1)
+                {
+                    continue;
+                }
+                if (!string.IsNullOrEmpty(item.icitem_ids))
+                {
+                    long cid = 1;
+                    var cids = item.icitem_ids.Split(',');
+                    foreach (var c in cids)
                     {
-                        if (!string.IsNullOrEmpty(item.icitem_ids))
+                        if (long.TryParse(c, out cid))
                         {
-                            long cid = 1;
-                            var cids = item.icitem_ids.Split(',');
-                            foreach (var c in cids)
-                            {
-                                if (long.TryParse(c, out cid))
-                                {
-                                    childidList.Add(cid);
-                                }
-                            }
+                            childidList.Add(cid);
                         }
+                    }
+                }
 
 
-                        //找到当前物料的替代群组关系集
-                        var sl = sublist.Find(s => s.substitute_code == item.substitute_code);
-                        if (sl != null)
+                //找到当前物料的替代群组关系集
+                var sl = sublist.Find(s => s.substitute_code == item.substitute_code);
+                if (sl != null)
+                {
+                    var sall = suballlist.Where(s => s.substitute_id == sl.Id).ToList();
+                    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).Result;
+                        icitemlist.AddRange(dtlitemlist);
+                        foreach (var dtl in sadl)
                         {
-                            var sall = suballlist.Where(s => s.substitute_id == sl.Id).ToList();
-                            foreach (var sal in sall)
+                            if (sal.main_material.GetValueOrDefault() != 1)
                             {
-                                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).Result;
-                                icitemlist.AddRange(dtlitemlist);
-                                foreach (var dtl in sadl)
-                                {
-                                    if (sal.MainMaterial.Value != 1)
-                                    {
-                                        //递归将替代关系组装出来。
-                                        SubstitutePretreatment(sl, sal, dtl, item, addlist, icitemlist, bomlist, bomchildlist, type);
-                                    }
-                                    else
-                                    {
-                                        //将主料赋值上属性
-                                        var dtlitem = returnlist.Find(s => s.item_id == dtl.icitem_id && s.level == item.level);
-                                        dtlitem.substitute_all_num = sal.order_num;//群组优先级
-                                    }
-                                }
-                                
-                                
-                                
+                                //递归将替代关系组装出来。
+                                SubstitutePretreatment(sl, sal, dtl, item, addlist, icitemlist, bomlist, bomchildlist, type);
+                            }
+                            else
+                            {
+                                //将主料赋值上属性
+                                var dtlitem = returnlist.Find(s => s.item_id == dtl.icitem_id && s.level == item.level);
+                                dtlitem.substitute_all_num = sal.order_num;//群组优先级
                             }
                         }
+
+
+
                     }
                 }
             }
@@ -863,7 +878,9 @@ namespace Business.ResourceExamineManagement
         {
             //第一级
             returnlist = returnlist.OrderBy(s => s.num).ToList();
-            var childList = returnlist.Where(s => s.parent_id == returnlist[0].id && s.type == 0).ToList();
+            var childList = returnlist.Where(s => s.parent_id == returnlist[0].id && s.type == 0).OrderBy(s => s.num).ToList();
+
+            var planList = GetICPlan(returnlist.Select(p => p.item_id).ToList(), bangid, param.factoryId);//plan列表
 
             //1.如果主料够的时候,不需要显示替代料的平铺视图,如果主料不够,显示替代料的平铺视图。
             //2.替代策略和替代方式,影响到的是甲乙组概念,替代按主料有限,取代按组的优先级。A与B的替代,则A和B各自会存在一个组。
@@ -906,7 +923,6 @@ namespace Business.ResourceExamineManagement
                 var mes_Moentry = mes_MorderDto.mes_Moentries.FirstOrDefault();
                 if (mes_Morders != null)
                 {
-                    mes_Morders.moentry_sys_stime = returnlist[0].kitting_time;
                     if (!string.IsNullOrEmpty(mes_Morders.bom_number))
                     {
                         //var ProductiveDate = ProductiveExamine(mes_Morders.bom_number, returnlist[0].version, (int)mes_Morders.morder_production_number.Value);
@@ -919,10 +935,12 @@ namespace Business.ResourceExamineManagement
                             factoryId = param.factoryId
 
                         };
+                        var plan = planList.Find(x => x.icitem_id == returnlist[0].item_id);
                         var ProductiveDate = _productExamineAppService.ProductiveExamine(prodExamine);
-                        //系统建议完工日期为 开工日期+产能检查时间=完工日期
                         var Day = ProductiveDate.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                        mes_Morders.moentry_sys_etime = returnlist[0].kitting_time.Value.AddDays((double)Day);
+                        mes_Morders.moentry_sys_stime = returnlist[0].kitting_time.Value.AddDays(1);//数据齐套完成后隔天开始生产;
+                        var LeadTime = Day + plan.self_inspection_date.Value + plan.Shipping_date.Value + plan.Warehousing_date.Value;
+                        mes_Morders.moentry_sys_etime = returnlist[0].kitting_time.Value.AddDays((double)LeadTime);//结束日期=开始时间+生产时长+自检提前期+入库提前期+发运提前期;
                         mes_Morders.morder_need_time = ProductiveDate.Result;
                         returnlist[0].satisfy_time = mes_Morders.moentry_sys_etime;
                     }
@@ -948,7 +966,7 @@ namespace Business.ResourceExamineManagement
         {
             foreach (var item in childList)
             {
-                var cilList = returnlist.Where(s => s.parent_id == item.id && s.type == 0).ToList();
+                var cilList = returnlist.Where(s => s.parent_id == item.id && s.type == 0).OrderBy(k => k.num).ToList();
 
                 if (item.haveicsubs == 1)
                 {
@@ -965,6 +983,7 @@ namespace Business.ResourceExamineManagement
                     ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
                     itemStockoccupyDto.bang_id = bangid;
                     itemStockoccupyDto.icitem_id = item.item_id;
+                    itemStockoccupyDto.item_no = item.num;
                     item.kitting_time = DateTime.Now;
                     if (cilList.Count() > 0)
                     {
@@ -972,57 +991,58 @@ namespace Business.ResourceExamineManagement
                         item.kitting_time = cilList.Max(s => s.kitting_time);
                     }
 
-                    if (item.lack_qty > 0)
+                    if (parent.stock_state == 0)
                     {
-                        //如果缺料,占用库存,然后走采购或自制
-                        itemStockoccupyDto.quantity = item.sqty;
-                        item.use_qty = item.sqty;
-                        sklist.Add(itemStockoccupyDto);
-                        if (item.erp_cls == 1)
+                        if (item.lack_qty > 0)
                         {
-                            //走自制
-                            //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
-                            ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                            //如果缺料,占用库存,然后走采购或自制
+                            if (item.sqty > 0)
                             {
-                                bom_number = item.bom_number,
-                                version = item.version,
-                                packages = item.lack_qty.GetInt(),
-                                tenantId = param.tenantId,
-                                factoryId = param.factoryId
-
-                            };
-                            var minute = _productExamineAppService.ProductiveExamine(prodExamine);
-                            //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
-                            //系统建议完工日期为 开工日期+产能检查时间=完工日期
-                            var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                            item.kitting_time = item.kitting_time.Value.AddDays((double)Day);
-                        }
-                        else if (item.erp_cls == 2 || item.erp_cls == 3)
-                        {
-                            /*var leadTimeList = GetLeadTime(new List<long> { item.item_id }, 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)
+                                itemStockoccupyDto.quantity = item.sqty;
+                                sklist.Add(itemStockoccupyDto);
+                            }
+                            item.use_qty = item.sqty;
+                            if (item.erp_cls == 1)
+                            {
+                                //走自制
+                                //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
+                                ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                                {
+                                    bom_number = item.bom_number,
+                                    version = item.version,
+                                    packages = (int)item.lack_qty,
+                                    tenantId = param.tenantId,
+                                    factoryId = param.factoryId
+
+                                };
+                                var minute = _productExamineAppService.ProductiveExamine(prodExamine);
+                                //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
+                                //系统建议完工日期为 开工日期+产能检查时间=完工日期
+                                var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
+                                item.kitting_time = item.kitting_time.Value.AddDays((double)Day);
+                            }
+                            else if (item.erp_cls == 3)
+                            {
+                                //采购申请
+                                var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                                item.kitting_time = SRMPRDto.lastStartTmie;
+                                SRMPRDtoList.Add(SRMPRDto);
+                            }
+                            else if (item.erp_cls == 2)
                             {
-                                //生成委外工单
-                                CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
                                 //1.先生成委外工单。
-                                //2.再根据委外工单需要检查库存材料,然后提供给第三方组装。
-                                //3.如果委外工单的物料库存不够,先生成物料采购申请单,再生成物料的采购订单,到货后再走委外流程。
-                                //4.再生成委外的采购申请单。
-                            }*/
+                                var mesorder = CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                                item.kitting_time = mesorder.ooentry_etime;
+                                orderList.Add(mesorder);
+                            }
                         }
-                    }
-                    else
-                    {
-                        item.use_qty = 0;
-                        if (parent.stock_state == 1)
+                        else
                         {
                             //如果父级缺料,则本级等于父级缺料*本级使用数量
                             item.use_qty = parent.lack_qty * item.qty;
                             itemStockoccupyDto.quantity = item.use_qty;
                             sklist.Add(itemStockoccupyDto);
+
                         }
                     }
                     item.is_use = true;
@@ -1190,6 +1210,7 @@ namespace Business.ResourceExamineManagement
                 ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
                 itemStockoccupyDto.bang_id = bangid;
                 itemStockoccupyDto.icitem_id = slt.item_id;
+                itemStockoccupyDto.item_no = slt.num;
                 slt.is_use = true;
                 if (slt.lack_qty > 0)
                 {
@@ -1202,9 +1223,9 @@ namespace Business.ResourceExamineManagement
                         //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
                         ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                         {
-                            bom_number = item.bom_number,
-                            version = item.version,
-                            packages = item.lack_qty.GetInt(),
+                            bom_number = slt.bom_number,
+                            version = slt.version,
+                            packages = (int)slt.lack_qty,
                             tenantId = param.tenantId,
                             factoryId = param.factoryId
 
@@ -1219,19 +1240,19 @@ namespace Business.ResourceExamineManagement
                             CalcStrategy(slt, returnlist, bangid, sklist);
                         }*/
                     }
-                    else if (slt.erp_cls == 2 || slt.erp_cls == 3)
-                    {   /*//生成采购订单
-                        //slt.purchase_qty = slt.lack_qty;
-                        var leadTimeList = GetLeadTime(new List<long> { slt.item_id }, 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 if (slt.erp_cls == 3)
+                    {
+                        //采购申请
+                        var SRMPRDto = CreateSRMPR(slt, input.tenantId, input.factoryId, bangid, slt.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                        item.kitting_time = SRMPRDto.lastStartTmie;
+                        SRMPRDtoList.Add(SRMPRDto);
+                    }
+                    else if (slt.erp_cls == 2)
+                    {
+                        //1.先生成委外工单。
+                        var mesorder = CreateMesOOder(slt, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                        slt.kitting_time = mesorder.ooentry_etime;
+                        orderList.Add(mesorder);
                     }
                 }
                 else
@@ -1313,6 +1334,7 @@ namespace Business.ResourceExamineManagement
                         itemStockoccupyDto.bang_id = bangid;
                         itemStockoccupyDto.icitem_id = zy.item_id;
                         itemStockoccupyDto.quantity = use_p_num * zy.qty; ;
+                        itemStockoccupyDto.item_no = zy.num;
                         sklist.Add(itemStockoccupyDto);
                     }
                     idx++;
@@ -1339,20 +1361,36 @@ namespace Business.ResourceExamineManagement
                     var num = parent_lack * sct.qty - itemSockoccupy.Sum(m => m.quantity);
                     if (sct.erp_cls == 1)
                     {
-                        //自制
-                        //GenerateMorder()
+                        //走自制
+                        //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
+                        ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                        {
+                            bom_number = sct.bom_number,
+                            version = sct.version,
+                            packages = (int)sct.lack_qty,
+                            tenantId = param.tenantId,
+                            factoryId = param.factoryId
+
+                        };
+                        var minute = _productExamineAppService.ProductiveExamine(prodExamine);
+                        //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
+                        //系统建议完工日期为 开工日期+产能检查时间=完工日期
+                        var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
+                        sct.kitting_time = sct.kitting_time.Value.AddDays((double)Day);
                     }
-                    else if (sct.erp_cls == 2 || sct.erp_cls == 3)
+                    else if (sct.erp_cls == 3)
                     {
-                        /*var leadTimeList = GetLeadTime(new List<long> { sct.item_id }, 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);
-                        }*/
+                        //采购申请
+                        var SRMPRDto = CreateSRMPR(sct, input.tenantId, input.factoryId, bangid, sct.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                        sct.kitting_time = SRMPRDto.lastStartTmie;
+                        SRMPRDtoList.Add(SRMPRDto);
+                    }
+                    else if (sct.erp_cls == 2)
+                    {
+                        //1.先生成委外工单。
+                        var mesorder = CreateMesOOder(sct, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                        sct.kitting_time = mesorder.ooentry_etime;
+                        orderList.Add(mesorder);
                     }
                 }
             }
@@ -1536,6 +1574,7 @@ namespace Business.ResourceExamineManagement
             {
                 //判断缺料数量
                 item.lack_qty = parent.lack_qty * item.qty - item.sqty;
+                item.lack_qty = item.lack_qty < 0 ? 0 : item.lack_qty;
                 //判断状态
                 item.stock_state = item.lack_qty > 0 ? 0 : 1;
             }
@@ -1750,7 +1789,7 @@ namespace Business.ResourceExamineManagement
             var po_list = _srm_po_list.Find(p => returnlist.Select(x => x.item_id).Contains(p.icitem_id.Value) && p.tenant_id == tenantId && p.factory_id == factoryid && p.rarrdate >= DateTime.Now && p.rarrdate < deliveryDate && !p.IsDeleted).Result;
             var itemlist = new List<ICItemDateDto>();//需要生成采购申请单的物料信息
             var leadTimeList = GetLeadTime(returnlist.Select(p => p.item_id).ToList(), tenantId, factoryid);//提前期列表
-            var supplierList = GetSupplier(returnlist.Select(p=>p.item_id).ToList(), tenantId, factoryid);//供应商列表
+            var supplierList = GetSupplier(returnlist.Select(p => p.item_id).ToList(), tenantId, factoryid);//供应商列表
             var planList = GetICPlan(returnlist.Select(p => p.item_id).ToList(), tenantId, factoryid);//plan列表
             foreach (var item in returnlist)
             {
@@ -1998,14 +2037,19 @@ namespace Business.ResourceExamineManagement
         /// <param name="orderType">2委外采购申请单,3采购申请单</param>
         private SRMPRDto 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)
         {
+            SRMPRDto sRMPR = new SRMPRDto();
+            srm_pr_main srm_Pr = new srm_pr_main();
             var leadTime = iCItemLeadTimes.Find(x => x.item_id == returnlist.item_id);
             var supplier = supplierList.Find(x => x.icitem_id == returnlist.item_id);//默认取第一个供应商
             var plan = planList.Find(x => x.icitem_id == returnlist.item_id);
             if (leadTime == null || supplier == null || plan == null)
             {
-                throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
+                sRMPR.srm_Pr_Main = null;
+                sRMPR.lastStartTmie = deliveryDate.AddDays(7 * -1);//减去提前期
+                return sRMPR;
+                //throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
             }
-            srm_pr_main srm_Pr = new srm_pr_main();
+            
             srm_Pr.GenerateNewId();
             srm_Pr.pr_billno = getOrderNum("PR");//pr单号
             srm_Pr.pr_mono = "";//关联工单号
@@ -2041,7 +2085,7 @@ namespace Business.ResourceExamineManagement
             srm_Pr.bang_id = bangId;
             //_srm_pr_main.InsertOne(srm_Pr);
             decimal? totalLeadTime = leadTime.transportation_leadtime + leadTime.stock_leadtime + leadTime.production_leadtime + leadTime.order_leadtime;
-            SRMPRDto sRMPR = new SRMPRDto();
+            
             sRMPR.srm_Pr_Main = srm_Pr;
             sRMPR.lastStartTmie = deliveryDate.AddDays((double)totalLeadTime * -1);//减去提前期
             return sRMPR;

+ 5 - 1
MicroServices/Business/Bussiness.Model/MES/IC/ic_item_stockoccupy.cs

@@ -50,6 +50,10 @@ namespace Bussiness.Model.MES.IC
         [Comment("占用数量")]
         public decimal quantity { get; set; }
 
-
+        /// <summary>
+        /// 项次号
+        /// </summary>
+        [Comment("项次号")]
+        public string item_no { get; set; }
     }
 }

+ 18 - 0
MicroServices/Business/Bussiness.Model/MES/IC/ic_plan.cs

@@ -130,5 +130,23 @@ namespace Bussiness.Model.MES.IC
         [Comment("计算id")]
         [NotMapped]
         public long? bang_id { get; set; }
+        /// <summary>
+        /// 自检提前期
+        /// </summary>
+        [Precision(20, 8)]
+        [Comment("自检提前期")]
+        public decimal? self_inspection_date { get; set; }
+        /// <summary>
+        /// 入库提前期
+        /// </summary>
+        [Precision(20, 8)]
+        [Comment("入库提前期")]
+        public decimal? Warehousing_date { get; set; }
+        /// <summary>
+        /// 发运提前期
+        /// </summary>
+        [Precision(20, 8)]
+        [Comment("发运提前期")]
+        public decimal? Shipping_date { get; set; }
     }
 }

+ 4 - 4
MicroServices/Business/Bussiness.Model/MES/IC/ic_substitute_all.cs

@@ -61,16 +61,16 @@ namespace Bussiness.Model.MES.IC
         [Comment("使用机型")]
         public string? use_model { get; set; }
         /// <summary>
-        /// 排序
+        /// 群组优先级
         /// </summary>
-        [Comment("排序")]
+        [Comment("群组优先级")]
         public int order_num { get; set; }
 
         /// <summary>
         /// 主料/替代料
         /// </summary>
-        [Description("主料/替代料")]
-        public int? MainMaterial { get; set; }
+        [Comment("主料/替代料")]
+        public int? main_material { get; set; }
 
     }
 }