Kaynağa Gözat

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

heteng 3 yıl önce
ebeveyn
işleme
f7d1966386

+ 5 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/BomChildExamineDto.cs

@@ -264,6 +264,11 @@ namespace Business.ResourceExamineManagement.Dto
         /// </summary>
         public decimal use_qty { get; set; }
 
+        /// <summary>
+        /// 在制占用数量
+        /// </summary>
+        public decimal mo_qty { get; set; }
+
         /// <summary>
         /// 被父级可制占用,为了实现占用计算
         /// </summary>

+ 1 - 1
MicroServices/Business/Business.Application/ResourceExamineManagement/MorderAppService.cs

@@ -183,7 +183,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="DeliverDate">交付日期</param>
         /// <param name="seorderentry_id">销售订单子表ID</param>
         /// <returns></returns>
-        public async Task<List<mes_mooccupy>> CheckMorder(string bomNumber, decimal? Quantity, DateTime DeliverDate, crm_seorderentry seorderentry, ic_item ic_Item, string version)
+        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)
             {

+ 9 - 3
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductExamineAppService.cs

@@ -79,21 +79,27 @@ namespace Business.ResourceExamineManagement
         {
             if (param.packages <= 0)
             {
-                throw new NotImplementedException("产能计算参数有误!");
+                var rtn = 10 * param.packages;
+                return rtn;
+                //throw new NotImplementedException("产能计算参数有误!");
             }
             #region 1、数据准备
             //1.1、获取工艺路径数据
             mes_technique tech = _mes_technique.Find(p => p.bom == param.bom_number && p.bomver == param.version && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted).Result.FirstOrDefault();
             if (tech == null)
             {
-                throw new NotImplementedException("请先配置工艺路径!");
+                var rtn = 10 * param.packages;
+                return rtn;
+                //throw new NotImplementedException("请先配置工艺路径!");
             }
 
             //1.2、获取工艺路径关联工序数据
             List<mes_tech_process> tech_Processes = await _mes_tech_process.GetManyByCondition(p => p.tech_id == tech.Id && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted);
             if (tech_Processes.Count == 0)
             {
-                throw new NotImplementedException("请先配置工序!");
+                var rtn = 10 * param.packages;
+                return rtn;
+                //throw new NotImplementedException("请先配置工序!");
             }
 
             //1.3、获取当前工艺路径下的工序数据

+ 245 - 208
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -211,6 +211,10 @@ namespace Business.ResourceExamineManagement
         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 构造函数
@@ -396,7 +400,7 @@ namespace Business.ResourceExamineManagement
                 //库存初始化
                 BomStock(getBomList);
                 //计算
-                calcTest(getBomList, bangid, item.Id, item.qty.Value, input, item.plan_date, sklist);
+                calcTest(getBomList, bangid, item.Id, item.qty.Value, input, item.plan_date, sklist, item, icitemlist);
 
                 //TODO:最晚开始时间
                 var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
@@ -412,6 +416,8 @@ namespace Business.ResourceExamineManagement
                 //GenerateMorder(o, 0);
             }
             //订单行资源检查明细list
+            rtn.srm_pr_list = SRMPRDtoList;
+            rtn.order_list = orderList;
             rtn.examines = examines;
             rtn.sklist = sklist;
             return JsonConvert.SerializeObject(rtn);
@@ -708,12 +714,12 @@ 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()))
                 {
                     continue;
                 }
                 //有替代关系
-                if (item.haveicsubs == 1)
+                if (item.haveicsubs != 1)
                 {
                     continue;
                 }
@@ -868,11 +874,11 @@ namespace Business.ResourceExamineManagement
         /// <param name="input"></param>
         /// <param name="plan_date"></param>
         public void calcTest(List<BomChildExamineDto> returnlist, long bangid, long orderid, decimal count, SeorderentryDto input, DateTime
-            ? plan_date, List<ic_item_stockoccupy> sklist)
+            ? plan_date, List<ic_item_stockoccupy> sklist, crm_seorderentry sentrys,List<ic_item> icitemlist)
         {
             //第一级
             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列表
 
@@ -895,32 +901,55 @@ namespace Business.ResourceExamineManagement
             Mes_MorderDto mes_MorderDto = new Mes_MorderDto();
             if (returnlist[0].lack_qty > 0)
             {
-                var seorderentry = _mysql_crm_seorderentry.FindAsync(x => x.Id == orderid).Result;
-
                 //获取物料详情
-                var ic_item = _ic_item.GetManyByCondition(x => x.number == seorderentry.item_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
-                GenerateMorderDto generateMorderDto = new GenerateMorderDto()
+                var ic_item = icitemlist.Find(s => s.Id == returnlist[0].item_id);
+                var mooccupylist = _morderAppService.CheckMorder(returnlist[0].bom_number, returnlist[0].lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item).Result;
+                decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
+                returnlist[0].mo_qty = moo_qty;
+                if (moo_qty == returnlist[0].lack_qty)
+                {
+                    //在制完全足够
+                    returnlist[0].lack_qty = 0;
+                    returnlist[0].satisfy_time = mooccupylist[0].moo_etime;
+                    returnlist[0].stock_state = 1;
+                    return;
+                }
+                else
                 {
-                    seorderentry = seorderentry,
-                    ic_Item = ic_item,
-                    BomNumber = returnlist[0].bom_number,
-                    version = returnlist[0].version,
-                    number = returnlist[0].item_number,
-                    Quantity = returnlist[0].lack_qty,
-                    morder_type = "销售工单",
-                    work_order_type = "常规工单",
-                    morder_state = "初始",
-
-                };
-                //生成主工单
-                mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
+                    //占用不够,占用后减少缺料数量
+                    returnlist[0].lack_qty -= moo_qty;
+                    //先设定在制的齐套时间
+                    returnlist[0].satisfy_time = mooccupylist[0]?.moo_etime;
+                    returnlist[0].stock_state = 0;
+                    //生成主工单
+                    GenerateMorderDto generateMorderDto = new GenerateMorderDto()
+                    {
+                        seorderentry = sentrys,
+                        ic_Item = ic_item,
+                        BomNumber = returnlist[0].bom_number,
+                        version = returnlist[0].version,
+                        number = returnlist[0].item_number,
+                        Quantity = returnlist[0].lack_qty,
+                        morder_type = "销售工单",
+                        work_order_type = "常规工单",
+                        morder_state = "初始",
+
+                    };
+                    //生成主工单
+                    mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
+                }
+            }
+            else {
+                returnlist[0].satisfy_time = DateTime.Now;
+                returnlist[0].stock_state = 1;
+                return;
             }
 
             //这是从上往下展开计算缺料和可制
             calcTest2(returnlist[0], childList, returnlist, sklist);
             //returnlist[0].kz = childList.Min(s => s.kz);//得到最小可制数量。
             //再加个循环,来根据替代关系里的检查结果,根据规则明确使用和生成占用关系。
-            CalcIcitem(childList, returnlist, bangid, orderid, input, sklist, plan_date);
+            CalcIcitem(childList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
             returnlist[0].kitting_time = childList.Max(s => s.kitting_time);
             //这里更新产品得满足时间。
             if (mes_MorderDto != null)
@@ -969,104 +998,137 @@ namespace Business.ResourceExamineManagement
         /// <param name="input"></param>
         /// <param name="sklist"></param>
         /// <param name="plan_date"></param>
-        public void CalcIcitem(List<BomChildExamineDto> childList, List<BomChildExamineDto> returnlist, long bangid, long orderid, SeorderentryDto input, List<ic_item_stockoccupy> sklist, DateTime
-            ? plan_date)
+        public void CalcIcitem(List<BomChildExamineDto> childList, List<BomChildExamineDto> returnlist, long bangid, SeorderentryDto input, List<ic_item_stockoccupy> sklist, DateTime
+            ? plan_date, List<ic_item> icitemlist, crm_seorderentry sentrys)
         {
             foreach (var item in childList)
             {
-                var cilList = returnlist.Where(s => s.parent_id == item.id && s.type == 0).ToList();
+                var parent = returnlist.Find(s => s.id == item.parent_id);
+                if (parent.stock_state == 0)
+                {
+                    if (item.haveicsubs == 1)
+                    {
+                        //如果有替代关系,根据群组来明确使用哪个群组的替代料。按整批和混用逻辑来算
+                        // 如果有群组替代,就移除掉被检查过的记录 item.icitem_ids
+                        CalcStrategy(item, returnlist, bangid, sklist, input, plan_date, icitemlist, sentrys);
+                    }
+                    else
+                    {
+                        Calczykc(item, parent, sklist);
 
-                if (item.haveicsubs == 1)
+                        //直接占用库存,缺料就生成采购
+                        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;
+                        item.is_use = true;
+                        StartProcessing(item,icitemlist,returnlist,plan_date,sentrys,sklist,itemStockoccupyDto,bangid,input);
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 针对缺料开始进行处理
+        /// </summary>
+        /// <param name="item"></param>
+        /// <param name="icitemlist"></param>
+        /// <param name="returnlist"></param>
+        /// <param name="plan_date"></param>
+        /// <param name="sentrys"></param>
+        /// <param name="sklist"></param>
+        /// <param name="itemStockoccupyDto"></param>
+        /// <param name="bangid"></param>
+        /// <param name="input"></param>
+        public void StartProcessing(BomChildExamineDto item, List<ic_item> icitemlist, List<BomChildExamineDto> returnlist, DateTime
+            ? plan_date, crm_seorderentry sentrys, List<ic_item_stockoccupy> sklist, ic_item_stockoccupy itemStockoccupyDto, long bangid, SeorderentryDto input)
+        {
+            var parent = returnlist.Find(s => s.id == item.parent_id);
+            if (item.lack_qty > 0)
+            {
+                var cilList = returnlist.Where(s => s.parent_id == item.id && s.type == item.type).OrderBy(k => k.num).ToList();
+                //如果缺料,占用库存,然后走采购或自制
+                if (item.sqty > 0)
                 {
-                    //如果有替代关系,根据群组来明确使用哪个群组的替代料。按整批和混用逻辑来算
-                    // 如果有群组替代,就移除掉被检查过的记录 item.icitem_ids
-                    CalcStrategy(item, returnlist, bangid, sklist, input, plan_date);
+                    itemStockoccupyDto.quantity = item.sqty;
+                    sklist.Add(itemStockoccupyDto);
                 }
-                else
+                item.use_qty = item.sqty;
+                if (item.erp_cls == 1)
                 {
-                    var parent = returnlist.Find(s => s.id == item.parent_id);
-                    Calczykc(item, parent, sklist);
-
-                    //直接占用库存,缺料就生成采购
-                    ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
-                    itemStockoccupyDto.bang_id = bangid;
-                    itemStockoccupyDto.icitem_id = item.item_id;
-                    item.kitting_time = DateTime.Now;
-                    if (cilList.Count() > 0)
+                    var ic_item = icitemlist.Find(s => s.Id == item.item_id);
+                    var mooccupylist = _morderAppService.CheckMorder(item.bom_number, item.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item).Result;
+                    decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
+                    item.mo_qty = moo_qty;
+                    if (moo_qty == returnlist[0].lack_qty)
                     {
-                        CalcIcitem(cilList, returnlist, bangid, orderid, input, sklist, plan_date);
-                        item.kitting_time = cilList.Max(s => s.kitting_time);
+                        //在制完全足够
+                        item.lack_qty = 0;
+                        item.kitting_time = mooccupylist[0].moo_etime;
+                        item.stock_state = 1;
                     }
-
-                    if (item.lack_qty > 0)
+                    else
                     {
-                        //如果缺料,占用库存,然后走采购或自制
-                        itemStockoccupyDto.quantity = item.sqty;
-                        item.use_qty = item.sqty;
-                        sklist.Add(itemStockoccupyDto);
-                        if (item.erp_cls == 1)
+                        item.lack_qty -= moo_qty;
+                        item.kitting_time=DateTime.Now;
+                        //先计算末级数据的齐套时间。
+                        if (cilList.Count() > 0)
                         {
-                            //走自制
-                            //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(),
-                                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);
+                            CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
+                            item.kitting_time = cilList.Max(s => s.kitting_time);
                         }
-                        else if (item.erp_cls == 2)
-                        {
-                            //采购申请
-                            var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
-                            item.kitting_time = SRMPRDto.lastStartTmie;
-                        }
-                        else if (item.erp_cls == 3)
+
+                        //走自制
+                        //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
 
-                            if (item.erp_cls == 3)
-                            {
-                                //1.先生成委外工单。
-                                CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
-                                //2.再根据委外工单需要检查库存材料,然后提供给第三方组装(委外生产)。
-                                //3.如果委外工单的物料库存不够,先生成物料采购申请单,再生成物料的采购订单,到货后再走委外流程。
-                                /*foreach (var cl in cilList)
-                                {
-                                    if (cl.stock_state == 0 || cl.stock_state == 2)
-                                    {
-                                        //采购申请
-                                        var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
-                                        item.kitting_time = SRMPRDto.lastStartTmie;
-                                    }
-                                }*/
-                                //4.再生成委外的采购申请单。
-                            }
-                        }
+                        };
+                        var minute = _productExamineAppService.ProductiveExamine(prodExamine);
+                        //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
+                        //系统建议完工日期为 开工日期+产能检查时间=完工日期
+                        var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
+                        var ktime = item.kitting_time.Value.AddDays((double)Day);
+                        item.kitting_time = ktime > mooccupylist[0].moo_etime ? ktime : mooccupylist[0].moo_etime;
                     }
-                    else
+                }
+                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)
+                {
+                    //先计算末级数据的齐套时间。
+                    if (cilList.Count() > 0)
                     {
-                        item.use_qty = 0;
-                        if (parent.stock_state == 1)
-                        {
-                            //如果父级缺料,则本级等于父级缺料*本级使用数量
-                            item.use_qty = parent.lack_qty * item.qty;
-                            itemStockoccupyDto.quantity = item.use_qty;
-                            sklist.Add(itemStockoccupyDto);
-                        }
+                        CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
+                        item.kitting_time = cilList.Max(s => s.kitting_time);
                     }
-                    item.is_use = true;
-
-
+                    //1.先生成委外工单。
+                    var mesorder = CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                    item.kitting_time = mesorder.ooentry_etime;
+                    orderList.Add(mesorder);
                 }
             }
+            else
+            {
+                //如果父级缺料,则本级等于父级缺料*本级使用数量
+                if (parent != null)
+                {
+                    item.use_qty = parent.lack_qty * item.qty;
+                    itemStockoccupyDto.quantity = item.use_qty;
+                }
+                sklist.Add(itemStockoccupyDto);
+            }
         }
 
 
@@ -1125,7 +1187,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="input"></param>
         /// <param name="plan_date"></param>
         public void CalcStrategy(BomChildExamineDto item, List<BomChildExamineDto> returnlist, long bangid, List<ic_item_stockoccupy> sklist, SeorderentryDto input, DateTime
-            ? plan_date)
+            ? plan_date, List<ic_item> icitemlist, crm_seorderentry sentrys)
         {
             //提取群组关系
             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();
@@ -1136,22 +1198,22 @@ namespace Business.ResourceExamineManagement
                 case 0://整批
                     WholeBatchCheck(sublist, returnlist, sklist, select);
                     //如果都需要采购的情况下,则默认使用优先级最高的
-                    WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date);
+                    WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys);
                     break;
                 case 1://混用
-                    MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date);
+                    MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys);
                     break;
                 case 2://整批加混用
                     WholeBatchCheck(sublist, returnlist, sklist, select);
                     if (select.Count() == 0)
                     {
                         //走混用
-                        MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date);
+                        MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys);
                     }
                     else
                     {
                         //走整批
-                        WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date);
+                        WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys);
                     }
                     break;
             }
@@ -1204,7 +1266,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="input"></param>
         /// <param name="plan_date"></param>
         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)
+            ? plan_date, List<ic_item> icitemlist, crm_seorderentry sentrys)
         {
             if (select.Count() == 0)
             {
@@ -1227,61 +1289,9 @@ 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)
-                {
-                    itemStockoccupyDto.quantity = slt.sqty;
-                    //库存不够的时候,根据属性生成采购和委外。
-                    if (slt.erp_cls == 1)
-                    {
-                        slt.make_qty = slt.lack_qty;
-                        //走自制
-                        //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(),
-                            tenantId = param.tenantId,
-                            factoryId = param.factoryId
-
-                        };
-                        var minute = _productExamineAppService.ProductiveExamine(prodExamine);
-                        //系统建议完工日期为 开工日期+产能检查时间=完工日期
-                        var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                        slt.kitting_time = slt.kitting_time.Value.AddDays((double)Day);
-                        /*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.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
-                {
-                    slt.kitting_time = DateTime.Now;
-                    itemStockoccupyDto.quantity = slt.needCount;
-                    if (parent != null)
-                    {   //如果不缺料的情况下,则占用掉父级缺料乘以当前子集使用料数量
-                        //itemStockoccupyDto.quantity = parent.lack_qty * slt.qty - slt.sqty;
-                        itemStockoccupyDto.quantity = parent.lack_qty * slt.qty;
-                    }
-                }
-                sklist.Add(itemStockoccupyDto);
+                StartProcessing(slt, icitemlist, returnlist, plan_date, sentrys, sklist, itemStockoccupyDto, bangid, input);
             }
 
         }
@@ -1298,7 +1308,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="input"></param>
         /// <param name="plan_date"></param>
         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)
+            ? plan_date, List<ic_item> icitemlist, crm_seorderentry sentrys)
         {
 
             decimal parent_lack = 0;
@@ -1320,12 +1330,21 @@ namespace Business.ResourceExamineManagement
                     {
                         RecalculationStock(s, returnlist, sklist);
                     }
-                    decimal minMake = 9999999;
+                    decimal minMake = 99999999;
                     foreach (var hy in list)
                     {
                         //混用先使用掉当前要用的数量
                         //得到库存最小数量,去占用,然后剩余的丢第二个循环里去占用。
-                        decimal make = hy.sqty / hy.qty;
+                        //获取物料详情
+                        var ic_item = icitemlist.Find(s => s.Id == hy.item_id);
+                        var mooccupylist = _morderAppService.CheckMorder(hy.bom_number, hy.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item).Result;
+                        decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
+                        decimal make = (hy.sqty + moo_qty) / hy.qty;
+                        if (Math.Floor(hy.qty) == hy.qty)
+                        {
+                            //如果物料的使用数量是小数,则按小数计算。
+                            make = Math.Floor(make);
+                        }
                         if (minMake > make)
                         {
                             minMake = make;
@@ -1346,10 +1365,28 @@ namespace Business.ResourceExamineManagement
                     foreach (var zy in list)
                     {
                         zy.is_use = true;
+                        zy.kitting_time = DateTime.Now;
+                        if (parent_lack <= 0)
+                        {
+                            zy.stock_state = 1;
+                        }
                         ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
                         itemStockoccupyDto.bang_id = bangid;
                         itemStockoccupyDto.icitem_id = zy.item_id;
-                        itemStockoccupyDto.quantity = use_p_num * zy.qty; ;
+                        decimal moo_qty = use_p_num * zy.qty - zy.sqty;
+                        if (moo_qty > 0)
+                        {
+                            var ic_item = icitemlist.Find(s => s.Id == zy.item_id);
+                            var mooccupylist = _morderAppService.CheckMorder(zy.bom_number, moo_qty, plan_date.GetValueOrDefault(), sentrys, ic_item).Result;
+                            itemStockoccupyDto.quantity = zy.sqty;
+                            zy.use_qty = zy.sqty;
+                            zy.mo_qty = moo_qty;
+                        }
+                        else {
+                            zy.use_qty = use_p_num * zy.qty;
+                            itemStockoccupyDto.quantity = zy.use_qty;
+                        }
+                        itemStockoccupyDto.item_no = zy.num;
                         sklist.Add(itemStockoccupyDto);
                     }
                     idx++;
@@ -1376,20 +1413,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);
                     }
                 }
             }
@@ -1450,37 +1503,15 @@ namespace Business.ResourceExamineManagement
             {
                 var childList = returnlist.Where(s => s.parent_id == item.id && s.type == 0).ToList();
 
-                //存在替代关系
-                if (item.haveicsubs == 1)
-                {
-                    //提取群组关系
-                    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();
-                    //循环计算群组,看哪个群组满足要求,然后使用此群组,将群组的库存和子物料占用掉。
-                    //计算此次群组是否有符合
-                    MaterialCalc(sublist, returnlist, sockoccupyList);
-                }
-                else
-                {
-                    //根据占用情况计算库存
-                    Calczykc(item, parent, sockoccupyList);
-
-                    //如果有子集,则丢入循环,判断下库存可制等信息。
-                    calcTest2(item, childList, returnlist, sockoccupyList);
-                    /*item.kz = childList.Min(s => s.kz);
-                    if (item.kz >= item.lack_qty)
-                    {
-                        item.stock_state = 3;
-                    }
-                    else
-                    {
-                        item.stock_state = 0;
-                    }*/
-                }
+                //根据占用情况计算库存
+                Calczykc(item, parent, sockoccupyList);
+                //如果有子集,则丢入循环,判断下库存可制等信息。
+                calcTest2(item, childList, returnlist, sockoccupyList);
             }
         }
 
         /// <summary>
-        /// 递归计算物料信息
+        /// 递归计算物料信息--暂未使用
         /// </summary>
         /// <param name="sublist"></param>
         public void MaterialCalc(List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sockoccupyList)
@@ -1573,6 +1604,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;
             }
@@ -2035,14 +2067,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 = "";//关联工单号
@@ -2078,7 +2115,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;