Selaa lähdekoodia

资源检查倒排,中间件工单生成。

tangdi 2 vuotta sitten
vanhempi
commit
21827bb421

+ 13 - 3
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/BomChildExamineDto.cs

@@ -197,12 +197,12 @@ namespace Business.ResourceExamineManagement.Dto
         public DateTime? satisfy_time { get; set; }
 
         /// <summary>
-        /// 自制时长(天)
+        /// 生产准备提前期
         /// </summary>
         public int? make_time { get; set; }
 
         /// <summary>
-        /// 采购前置(需加上自制)
+        /// 供应欠缺时间
         /// </summary>
         public int? pre_time { get; set; }
 
@@ -247,7 +247,7 @@ namespace Business.ResourceExamineManagement.Dto
         public int substitute_mode { get; set; }
 
         /// <summary>
-        /// 物料状态-- -1.无需求 0.缺料 1.充足 2.可制,时间满足 3.可制,时间不满足 4.采购 5.委外
+        /// 物料状态-- -1.无需求 0.缺料 1.充足 2.可制,时间满足 3.可制,时间不满足 4.采购 5.委外 99,无货源清单
         /// </summary>
         public int stock_state { get; set; }
 
@@ -265,6 +265,16 @@ namespace Business.ResourceExamineManagement.Dto
         /// 工序
         /// </summary>
         public int Op { get; set; }
+
+        /// <summary>
+        /// 物料前处理天数
+        /// </summary>
+        public decimal? clean_leadtime { get; set; }
+
+        /// <summary>
+        /// 供应提前期
+        /// </summary>
+        public int PurLT { get; set; }
     }
 
     /// <summary>

+ 1 - 1
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/SRMPRDto.cs

@@ -28,7 +28,7 @@ namespace Business.ResourceExamineManagement.Dto
         /// <summary>
         /// 总共提前期
         /// </summary>
-        public decimal? totalLeadTime { get; set; }
+        public int? totalLeadTime { get; set; }
 
         /// <summary>
         /// 订单价格(含税)

+ 3 - 3
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -696,7 +696,7 @@ namespace Business.Replenishment
                 _CalcBomViewAppService.BomStock(getBomList, stocklist, bangid);
 
                 //计算
-                _CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.start_time, sklist, sentry, item.urgent, icitemlist);
+                _CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.start_time, sklist, sentry, icitemlist);
 
                 //TODO:最晚开始时间
                 var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
@@ -754,7 +754,7 @@ namespace Business.Replenishment
                     morder.moentry_sys_etime = wod.DueDate;
 
                     /*var exa = rtn.examines.Find(s => s.morder_no == wod.WorkOrd);
-                    exa.latest_times = morder.moentry_sys_etime.GetValueOrDefault().Date.AddDays(1);*/
+                    exa.latest_times = morder.moentry_sys_etime.GetValueOrDefault().Date.AddDays(1);
                     //根据排产后得日期,反推PR。
                     var wkordPrList = prmainlist.Where(s => s.pr_mono == wod.WorkOrd).ToList();
 
@@ -772,7 +772,7 @@ namespace Business.Replenishment
                         {
                             pr.pr_ssend_date = DateTime.Now.Date.AddDays(1);
                         }
-                    });
+                    });*/
                 }
                 using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
                 {

+ 333 - 123
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -2,11 +2,14 @@
 using Business.Core.Utilities;
 using Business.Domain;
 using Business.ResourceExamineManagement.Dto;
+using MathNet.Numerics.RootFinding;
 using MongoDB.Driver.Linq;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using Volo.Abp.Application.Services;
+using static Spire.Pdf.General.Render.Decode.Jpeg2000.j2k.codestream.HeaderInfo;
 
 namespace Business.ResourceExamineManagement
 {
@@ -40,6 +43,16 @@ namespace Business.ResourceExamineManagement
 
         public mes_morder mes_morder = new mes_morder();
 
+        /// <summary>
+        /// 是否倒排
+        /// </summary>
+        public bool IsInverted = false;
+
+        /// <summary>
+        /// 工单类型
+        /// </summary>
+        public string morder_type;
+
         SnowFlake help = new SnowFlake();
 
         /// <summary>
@@ -138,7 +151,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="plan_date"></param>
         /// <param name="checkflag">是否生成工单、委外、采购</param>
         public void CalcView(List<BomChildExamineDto> returnlist, long bangid, decimal count, DateTime
-            ? plan_date, List<mo_ic_item_stockoccupy> sklist, crm_seorderentry sentrys,int urgent, List<mo_ic_item> icitemlist)
+            ? plan_date, List<mo_ic_item_stockoccupy> sklist, crm_seorderentry sentrys, List<mo_ic_item> icitemlist)
         {
             ProductionTimeDay = 0;
             //第一级
@@ -253,12 +266,14 @@ namespace Business.ResourceExamineManagement
                     //先设定在制的齐套时间
                     //level1Dto.satisfy_time = mooccupylist[0]?.moo_etime;
                     level1Dto.stock_state = 0;
-
+                    
                     if (param.checkflag || (!param.checkflag && param.checkPlan))
                     {
                         //根据成品属性来判断是自制还是委外还是外购,需要考虑这种场景
                         if (level1Dto.erp_cls == 1 && param.checkflag)
                         {
+                            //设置成品的生产时长为子物料的提前准备期
+                            level1Dto.make_time = 7;
                             //param.checkflag=true 销售订单产生工单
                             level1Dto.make_qty = level1Dto.lack_qty;
                             //生成主工单
@@ -271,12 +286,12 @@ namespace Business.ResourceExamineManagement
                                 version = level1Dto.version,
                                 number = level1Dto.item_number,
                                 Quantity = level1Dto.lack_qty,
-                                morder_type = MorderEnum.XsMorder,
+                                morder_type = morder_type,
                                 work_order_type = MorderEnum.CgMorder,
                                 morder_state = MorderEnum.Initial_state,
                                 bang_id = bangid
                             };
-                            CreateMainOrder(generateMorderDto, level1Dto, childList, returnlist, bangid, plan_date, sklist, sentrys, urgent, icitemlist);
+                            CreateMainOrder(generateMorderDto, level1Dto, childList, returnlist, bangid, plan_date, sklist, sentrys, icitemlist);
                         }
                         else if (level1Dto.erp_cls == 3)
                         {
@@ -285,7 +300,7 @@ namespace Business.ResourceExamineManagement
                             if (level1Dto.lack_qty > 0)
                             {
                                 //采购申请
-                                PackageSRMPR(level1Dto, bangid, sentrys);
+                                PackageSRMPR(level1Dto, bangid, sentrys, plan_date);
                             }
                         }
                         else if (level1Dto.erp_cls == 2)
@@ -294,19 +309,19 @@ namespace Business.ResourceExamineManagement
                             CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault());
                             if (level1Dto.lack_qty > 0)
                             {
+                                //1.先生成委外工单。
+                                var mesorder = CreateMesOOder(level1Dto, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                                mesorder.ooentry_etime = plan_date.GetValueOrDefault().AddDays(-1);
+                                var srmprDto = PackageSRMPR(level1Dto, bangid, sentrys, plan_date);
+                                level1Dto.make_time = srmprDto.totalLeadTime;//加上物料的采购提前期
+                                mesorder.ooentry_stime = plan_date.GetValueOrDefault().AddDays(-srmprDto.totalLeadTime.GetValueOrDefault());
+
                                 //先计算末级数据的齐套时间。
                                 if (childList.Count > 0)
                                 {
                                     MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, plan_date, sentrys, icitemlist);
-                                    level1Dto.kitting_time = childList.Max(s => s.kitting_time);
+                                    level1Dto.kitting_time = childList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());//加上物料的采购提前期
                                 }
-                                //1.先生成委外工单。
-                                var mesorder = CreateMesOOder(level1Dto, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
-
-                                //2.生成采购申请
-                                //采购申请
-                                PackageSRMPR(level1Dto, bangid, sentrys);
-
                                 level1Dto.subcontracting_qty = level1Dto.lack_qty;
                                 level1Dto.subcontracting_list = new List<ooder>();
                                 ooder oo = new ooder();
@@ -316,7 +331,7 @@ namespace Business.ResourceExamineManagement
                                 oo.production_unit_code = mesorder.production_unit_code;
                                 oo.ooentry_prdname = mesorder.ooentry_prdname;
                                 oo.ooentry_stime = mesorder.ooentry_stime;
-                                oo.ooentry_etime = level1Dto.kitting_time;
+                                oo.ooentry_etime = mesorder.ooentry_etime;
                                 oo.oorder_date = mesorder.oorder_date;
                                 oo.oorder_no = mesorder.oorder_no;
                                 level1Dto.subcontracting_list.Add(oo);
@@ -325,13 +340,15 @@ namespace Business.ResourceExamineManagement
                         }
                         else
                         {
+                            level1Dto.make_time = 7;
                             MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, plan_date, sentrys, icitemlist);
                         }
                     }
                     else {
+                        level1Dto.make_time = 7;
                         MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, plan_date, sentrys, icitemlist);
                     }
-                    CalcLevelMakeTime(returnlist);
+                    //CalcLevelMakeTime(returnlist);
                 }
             }
             else
@@ -345,7 +362,7 @@ namespace Business.ResourceExamineManagement
             }
         }
 
-        //计算每层物料倒排时,需要根据半成品的工作时长倒排。
+        /*//计算每层物料倒排时,需要根据半成品的工作时长倒排。
         public void CalcLevelMakeTime(List<BomChildExamineDto> returnlist)
         {
             for (int level = 3; level <= returnlist.Max(s => s.level); level++)
@@ -359,14 +376,14 @@ namespace Business.ResourceExamineManagement
                     }
                 });
             }
-        }
+        }*/
 
 
         /// <summary>
         /// 生成主工单
         /// </summary>
         public void CreateMainOrder(GenerateMorderDto generateMorderDto, BomChildExamineDto level1Dto, List<BomChildExamineDto> childList, List<BomChildExamineDto> returnlist, long bangid, DateTime
-            ? plan_date, List<mo_ic_item_stockoccupy> sklist, crm_seorderentry sentrys,int urgent, List<mo_ic_item> icitemlist)
+            ? plan_date, List<mo_ic_item_stockoccupy> sklist, crm_seorderentry sentrys, List<mo_ic_item> icitemlist)
         {
             //生成主工单
             _morderAppService.prodLines = prodLines;
@@ -376,7 +393,7 @@ namespace Business.ResourceExamineManagement
             _morderAppService.qualityLineWorks = qualityLineWorks;
             _morderAppService.holidays = holidays;
             _morderAppService.param = param;
-            Mes_MorderDto mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto, urgent);
+            Mes_MorderDto mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
             //这里更新产品得满足时间。
             if (mes_MorderDto != null)
             {
@@ -385,12 +402,24 @@ namespace Business.ResourceExamineManagement
                 if (mes_Morders != null)
                 {
                     mes_morder = ObjectMapper.Map<mo_mes_morder, mes_morder>(mes_Morders);
-                    MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, plan_date, sentrys, icitemlist);
+                    var plan = icitemlist.Find(x => x.mysql_id == level1Dto.item_id);
+                    //结束日期=开始时间+生产时长+自检提前期+入库提前期+发运提前期;
+                    decimal LeadTime = 0;
+                    if (plan != null)
+                    {
+                        //减去提前期
+                        LeadTime = plan.self_inspection_date.GetValueOrDefault() + plan.Warehousing_date.GetValueOrDefault() + plan.Shipping_date.GetValueOrDefault();
+                    }
+                    mes_Morders.moentry_sys_etime = plan_date.GetValueOrDefault().AddDays(-(int)Math.Floor(LeadTime));
+
+                    mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(level1Dto.make_time.GetValueOrDefault() - 1));
+                    MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, mes_Morders.moentry_sys_stime, sentrys, icitemlist);
                     if (!string.IsNullOrEmpty(mes_Morders.bom_number))
                     {
-                        mes_Morders.moentry_sys_stime = childList.Max(s => s.kitting_time.GetValueOrDefault()).AddDays(1).Date;//数据齐套完成后隔天开始生产;
-                        //var ProductiveDate = ProductiveExamine(mes_Morders.bom_number, level1Dto.version, (int)mes_Morders.morder_production_number.Value);
-                        ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                        mes_Morders.mat_start_date = childList.Max(s => s.kitting_time.GetValueOrDefault()).AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                        mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(level1Dto.make_time.GetValueOrDefault());
+
+                        /*ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                         {
                             ItemNum = mes_Morders.bom_number,
                             PlanStart = mes_Morders.moentry_sys_stime.Value,
@@ -403,28 +432,15 @@ namespace Business.ResourceExamineManagement
                         _productExamineAppService.qualityLineWorks = qualityLineWorks;
                         _productExamineAppService.holidays = holidays;
 
-                        var plan = icitemlist.Find(x => x.mysql_id == level1Dto.item_id);
+                        
                         var ProductiveDate = _productExamineAppService.ProductiveExamine(prodExamine);
-                        //var Day = ProductiveDate / (60 * 10); //返回的分钟除以十个小时得出工作天数;
 
-                        //结束日期=开始时间+生产时长+自检提前期+入库提前期+发运提前期;
-                        DateTime LeadTime;
-                        if (plan != null)
-                        {
-                            var TQdate = plan.self_inspection_date.GetValueOrDefault() + plan.Warehousing_date.GetValueOrDefault()+ plan.Shipping_date.GetValueOrDefault();
-                            LeadTime = ProductiveDate.AddDays((double)TQdate);
-                        }
-                        else
-                        {
-                            LeadTime = ProductiveDate;
-                        }
-                        //ProductionTimeDay = LeadTime;
                         mes_Morders.moentry_sys_etime = LeadTime;
                         TimeSpan span = ProductiveDate - mes_Morders.moentry_sys_stime.Value;
-                        mes_Morders.morder_need_time = (decimal)span.TotalMinutes;
+                        mes_Morders.morder_need_time = (decimal)span.TotalMinutes;*/
 
                         //满足资源检查的时间需加上提前期
-                        level1Dto.satisfy_time = LeadTime;
+                        level1Dto.satisfy_time = mes_Morders.moentry_sys_etime;
                         if (sentrys != null)
                         {
                             sentrys.sys_capacity_date = level1Dto.satisfy_time;
@@ -632,6 +648,7 @@ namespace Business.ResourceExamineManagement
             var parent = returnlist.Find(s => s.fid == item.parent_id);
             if (item.lack_qty > 0)
             {
+                item.make_time = parent.make_time.GetValueOrDefault();
                 var cilList = returnlist.Where(s => s.parent_id == item.fid && s.type == item.type).OrderBy(k => k.num_order).ToList();
                 //如果缺料,占用库存,然后走采购或自制
                 if (item.sqty > 0)
@@ -643,22 +660,33 @@ namespace Business.ResourceExamineManagement
                 item.use_qty = item.sqty;
                 if (item.erp_cls == 1)
                 {
-                    /*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;
+                    var ic_item = icitemlist.Find(s => s.mysql_id == item.item_id);
+                    List<mo_mes_mooccupy> mooccupylist = new List<mo_mes_mooccupy>();
+                    if (param.checkflag)
+                    {
+                        mooccupylist = _morderAppService.CheckMorder(item.bom_number, item.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item, bangid);
+                    }  
                     decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
                     item.mo_qty = moo_qty;
-                    item.mo_occupy_list = new List<mo_occupy>();
-                    mooccupylist.ForEach(s =>
+                    
+                    if (mooccupylist.Any())
                     {
-                        mo_occupy mooc = new mo_occupy();
-                        mooc.moo_mo = s.moo_mo;
-                        mooc.moo_stime = s.moo_ctime;
-                        mooc.moo_etime = s.moo_etime;
-                        mooc.moo_qty = s.moo_qty;
-                        item.mo_occupy_list.Add(mooc);
-                    });*/
-                    decimal moo_qty = 0;
-                    if (moo_qty == returnlist[0].lack_qty)
+                        mooccupyAllList.AddRange(mooccupylist);
+                        mooccupyAllInsertList.AddRange(mooccupylist);
+                        //在制占用明细
+                        item.mo_occupy_list = new List<mo_occupy>();
+                        mooccupylist.ForEach(s =>
+                        {
+                            mo_occupy mooc = new mo_occupy();
+                            mooc.id = s.Id;
+                            mooc.moo_mo = s.moo_mo;
+                            mooc.moo_stime = s.moo_ctime;
+                            mooc.moo_etime = s.moo_etime;
+                            mooc.moo_qty = s.moo_qty;
+                            item.mo_occupy_list.Add(mooc);
+                        });
+                    }
+                    if (moo_qty == item.lack_qty)
                     {
                         //在制完全足够
                         item.lack_qty = 0;
@@ -670,17 +698,72 @@ namespace Business.ResourceExamineManagement
                     {
                         item.lack_qty -= moo_qty;
                         item.kitting_time = DateTime.Now;
-                        //先计算末级数据的齐套时间。
-                        if (cilList.Count > 0)
+                        //TODO:需要按标准UPH来计算生产时长
+                        //生成主工单
+                        GenerateMorderDto generateMorderDto = new GenerateMorderDto()
                         {
-                            CalcIcitem(cilList, returnlist, bangid, sklist, plan_date, icitemlist, sentrys, childidList);
-                            
-                            item.kitting_time = cilList.Max(s => s.kitting_time);
-                        }
+                            seorderentry = sentrys,
+                            seorder = seorder,
+                            ic_Item = ic_item,
+                            BomNumber = item.bom_number,
+                            version = item.version,
+                            number = item.item_number,
+                            Quantity = item.lack_qty,
+                            morder_type = morder_type,
+                            work_order_type = MorderEnum.CgMorder,
+                            morder_state = MorderEnum.Initial_state,
+                            bang_id = bangid
+                        };
+                        Mes_MorderDto mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
+                        int make = 7;
+                        item.make_time += make;
                         item.make_qty = item.lack_qty;
-                        //默认中间件需要1天的制造周期
-                        item.make_time = 1;
-                        item.kitting_time = item.kitting_time.Value.AddDays(1);
+                        if (mes_MorderDto != null)
+                        {
+                            //主工单最后计算满足日期
+                            var mes_Morders = mes_MorderDto.mes_Morders.Where(x => x.parent_id == null).FirstOrDefault();
+                            if (mes_Morders != null)
+                            {
+                                //子工单生成的检查明细,还是挂接到主工单上。
+                                mes_Morders.moentry_sys_etime = plan_date.GetValueOrDefault().AddDays(-1);
+                                mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(make - 1));
+                                item.make_list = new List<moorder>();
+                                mes_MorderDto.mes_Morders.ForEach(me =>
+                                {
+                                    moorder mo = new moorder();
+                                    mo.Id = me.Id;
+                                    mo.moentry_stime = me.moentry_stime;
+                                    mo.moentry_etime = me.moentry_etime;
+                                    mo.moentry_wrkcname = me.moentry_wrkcname;
+                                    mo.moentry_sys_stime = me.moentry_sys_stime;
+                                    mo.moentry_sys_etime = me.moentry_sys_etime;
+                                    mo.moentry_prdname = me.moentry_prdname;
+                                    mo.morder_need_time = me.morder_need_time;
+                                    mo.morder_no = me.morder_no;
+                                    mo.morder_production_number = me.morder_production_number;
+                                    mo.need_number = me.need_number;
+                                    mo.reality_end_time = me.reality_end_time;
+                                    mo.reality_start_time = me.reality_start_time;
+                                    item.make_list.Add(mo);
+                                });
+                                //批量保存 后期考虑子工单
+                                mordersList.AddRange(mes_MorderDto.mes_Morders);
+                                mordersInsertList.AddRange(mes_MorderDto.mes_Morders);
+                                moentriesList.AddRange(mes_MorderDto.mes_Moentries);
+                                moentriesInsertList.AddRange(mes_MorderDto.mes_Moentries);
+                                //先计算末级数据的齐套时间。
+                                if (cilList.Count > 0)
+                                {
+                                    CalcIcitem(cilList, returnlist, bangid, sklist, mes_Morders.moentry_sys_stime, icitemlist, sentrys, childidList);
+
+                                    item.kitting_time = cilList.Max(s => s.kitting_time);
+                                }
+                                mes_Morders.mat_start_date = item.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
+                                item.kitting_time = mes_Morders.mat_end_date;
+                            }
+                        }
+                        
                         /*//走自制
                         ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                         {
@@ -715,29 +798,30 @@ namespace Business.ResourceExamineManagement
                         if (item.lack_qty > 0)
                         {
                             //采购申请
-                            PackageSRMPR(item, bangid, sentrys);
+                            PackageSRMPR(item, bangid, sentrys, plan_date);
                         }
                     }
                 }
                 else if (item.erp_cls == 2)
                 {
+
                     if (param.checkflag || param.checkPlan)
                     {
                         //先找在途
                         CalcInTransit(sentrys, item, bangid, plan_date.GetValueOrDefault());
                         if (item.lack_qty > 0)
                         {
+                            //1.先生成委外工单。
+                            var mesorder = CreateMesOOder(item, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.GetValueOrDefault());
+                            mesorder.ooentry_etime = plan_date.GetValueOrDefault().AddDays(-1);
+                            var srmprDto = PackageSRMPR(item, bangid, sentrys, plan_date);
+                            mesorder.ooentry_stime = mesorder.ooentry_etime.GetValueOrDefault().AddDays(-(srmprDto.totalLeadTime.GetValueOrDefault() - 1));
                             //先计算末级数据的齐套时间。
                             if (cilList.Count > 0)
                             {
-                                CalcIcitem(cilList, returnlist, bangid, sklist, plan_date, icitemlist, sentrys, childidList);
-                                item.kitting_time = cilList.Max(s => s.kitting_time);
+                                CalcIcitem(cilList, returnlist, bangid, sklist, mesorder.ooentry_stime, icitemlist, sentrys, childidList);
+                                item.kitting_time = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());//加上物料的采购提前期
                             }
-                            //1.先生成委外工单。
-                            var mesorder = CreateMesOOder(item, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
-                            //2.生成采购申请
-                            //采购申请
-                            PackageSRMPR(item, bangid, sentrys);
                             item.subcontracting_qty = item.lack_qty;
                             item.subcontracting_list = new List<ooder>();
                             ooder oo = new ooder();
@@ -1061,6 +1145,7 @@ namespace Business.ResourceExamineManagement
                 //对select执行补充(根据属性采购、外购、自制等)
                 foreach (var sct in select)
                 {
+                    sct.make_time = parent.make_time.GetValueOrDefault();
                     decimal sqty = sct.sqty - sct.use_qty;//这里得出前面混用使用后的库存。
                     decimal lack_Count = parent_lack * sct.qty;//混用后还缺的部分。
                     mo_ic_item_stockoccupy itemStockoccupyDto = new mo_ic_item_stockoccupy();
@@ -1101,36 +1186,111 @@ namespace Business.ResourceExamineManagement
 
                         if (sct.erp_cls == 1)
                         {
-                            //先计算末级数据的齐套时间。
-                            if (cilList.Count > 0)
+                            var ic_item = icitemlist.Find(s => s.mysql_id == sct.item_id);
+                            List<mo_mes_mooccupy> mooccupylist = new List<mo_mes_mooccupy>();
+                            if (param.checkflag)
                             {
-                                CalcIcitem(cilList, returnlist, bangid, sklist, plan_date, icitemlist, sentrys, childidList);
-                                sct.kitting_time = cilList.Max(s => s.kitting_time);
+                                mooccupylist = _morderAppService.CheckMorder(sct.bom_number, sct.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item, bangid);
                             }
-                            sct.make_qty = sct.lack_qty;
-                            //默认中间件需要1天的制造周期
-                            sct.make_time = 1;
-                            sct.kitting_time = sct.kitting_time.Value.AddDays(1);
+                            decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
+                            sct.mo_qty = moo_qty;
 
-                            /*//走自制
-                            ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                            if (mooccupylist.Any())
                             {
-                                bom_number = sct.bom_number,
-                                version = sct.version,
-                                packages = (int)sct.lack_qty
-                            };
-                            _productExamineAppService.process = process;
-                            _productExamineAppService.techs = techs;
-                            _productExamineAppService.tech_Processes = tech_Processes;
-                            _productExamineAppService.tech_Proc_Workshops = tech_Proc_Workshops;
-
-                            var minute = _productExamineAppService.ProductiveExamine(prodExamine);
-                            //系统建议完工日期为 开工日期+产能检查时间=完工日期
-                            var Day = minute / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                            sct.kitting_time = sct.kitting_time.Value.AddDays((double)Day);
-                            sct.make_qty = sct.lack_qty;*/
-                            //todo:
-                            sct.make_list = new List<moorder>();
+                                mooccupyAllList.AddRange(mooccupylist);
+                                mooccupyAllInsertList.AddRange(mooccupylist);
+                                //在制占用明细
+                                sct.mo_occupy_list = new List<mo_occupy>();
+                                mooccupylist.ForEach(s =>
+                                {
+                                    mo_occupy mooc = new mo_occupy();
+                                    mooc.id = s.Id;
+                                    mooc.moo_mo = s.moo_mo;
+                                    mooc.moo_stime = s.moo_ctime;
+                                    mooc.moo_etime = s.moo_etime;
+                                    mooc.moo_qty = s.moo_qty;
+                                    sct.mo_occupy_list.Add(mooc);
+                                });
+                            }
+                            if (moo_qty == sct.lack_qty)
+                            {
+                                //在制完全足够
+                                sct.lack_qty = 0;
+                                //item.kitting_time = mooccupylist[0].moo_etime;
+                                sct.kitting_time = DateTime.Now;
+                                sct.stock_state = 1;
+                            }
+                            else {
+                                sct.lack_qty -= moo_qty;
+                                sct.kitting_time = DateTime.Now;
+                                //TODO:需要按标准UPH来计算生产时长
+                                //生成主工单
+                                GenerateMorderDto generateMorderDto = new GenerateMorderDto()
+                                {
+                                    seorderentry = sentrys,
+                                    seorder = seorder,
+                                    ic_Item = ic_item,
+                                    BomNumber = sct.bom_number,
+                                    version = sct.version,
+                                    number = sct.item_number,
+                                    Quantity = sct.lack_qty,
+                                    morder_type = morder_type,
+                                    work_order_type = MorderEnum.CgMorder,
+                                    morder_state = MorderEnum.Initial_state,
+                                    bang_id = bangid
+                                };
+                                Mes_MorderDto mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
+                                int make = 7;
+                                sct.make_time += make;
+                                sct.make_qty = sct.lack_qty;
+                                if (mes_MorderDto != null)
+                                {
+                                    //主工单最后计算满足日期
+                                    var mes_Morders = mes_MorderDto.mes_Morders.Where(x => x.parent_id == null).FirstOrDefault();
+                                    if (mes_Morders != null)
+                                    {
+                                        //子工单生成的检查明细,还是挂接到主工单上。
+                                        //mes_morder = ObjectMapper.Map<mo_mes_morder, mes_morder>(mes_Morders);
+                                        mes_Morders.moentry_sys_etime = plan_date.GetValueOrDefault().AddDays(-1);
+                                        mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(make - 1));
+                                        sct.make_list = new List<moorder>();
+                                        mes_MorderDto.mes_Morders.ForEach(me =>
+                                        {
+                                            moorder mo = new moorder();
+                                            mo.Id = me.Id;
+                                            mo.moentry_stime = me.moentry_stime;
+                                            mo.moentry_etime = me.moentry_etime;
+                                            mo.moentry_wrkcname = me.moentry_wrkcname;
+                                            mo.moentry_sys_stime = me.moentry_sys_stime;
+                                            mo.moentry_sys_etime = me.moentry_sys_etime;
+                                            mo.moentry_prdname = me.moentry_prdname;
+                                            mo.morder_need_time = me.morder_need_time;
+                                            mo.morder_no = me.morder_no;
+                                            mo.morder_production_number = me.morder_production_number;
+                                            mo.need_number = me.need_number;
+                                            mo.reality_end_time = me.reality_end_time;
+                                            mo.reality_start_time = me.reality_start_time;
+                                            sct.make_list.Add(mo);
+                                        });
+                                        //批量保存 后期考虑子工单
+                                        mordersList.AddRange(mes_MorderDto.mes_Morders);
+                                        mordersInsertList.AddRange(mes_MorderDto.mes_Morders);
+                                        moentriesList.AddRange(mes_MorderDto.mes_Moentries);
+                                        moentriesInsertList.AddRange(mes_MorderDto.mes_Moentries);
+                                        
+                                        //先计算末级数据的齐套时间。
+                                        if (cilList.Count > 0)
+                                        {
+                                            CalcIcitem(cilList, returnlist, bangid, sklist, mes_Morders.moentry_sys_stime, icitemlist, sentrys, childidList);
+                                            sct.kitting_time = cilList.Max(s => s.kitting_time);
+                                        }
+                                        mes_Morders.mat_start_date = sct.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                        mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
+                                        sct.kitting_time = mes_Morders.mat_end_date;
+                                    }
+                                }
+                                
+                            }
                         }
                         else if (sct.erp_cls == 3)
                         {
@@ -1141,7 +1301,7 @@ namespace Business.ResourceExamineManagement
                                 if (sct.lack_qty > 0)
                                 {
                                     //采购申请
-                                    PackageSRMPR(sct, bangid, sentrys);
+                                    PackageSRMPR(sct, bangid, sentrys, plan_date);
                                 }
                             }
                         }
@@ -1153,16 +1313,19 @@ namespace Business.ResourceExamineManagement
                                 CalcInTransit(sentrys, sct, bangid, plan_date.GetValueOrDefault());
                                 if (sct.lack_qty > 0)
                                 {
+                                    //1.先生成委外工单。
+                                    var mesorder = CreateMesOOder(sct, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.GetValueOrDefault());
+                                    mesorder.ooentry_etime = plan_date.GetValueOrDefault().AddDays(-1);
+                                    var srmprDto = PackageSRMPR(sct, bangid, sentrys, plan_date);
+                                    sct.make_time += srmprDto.totalLeadTime;//加上物料的采购提前期
+                                    mesorder.start_time = mesorder.ooentry_etime.GetValueOrDefault().AddDays(-(srmprDto.totalLeadTime.GetValueOrDefault() - 1));
+
                                     //先计算末级数据的齐套时间。
                                     if (cilList.Count > 0)
                                     {
-                                        CalcIcitem(cilList, returnlist, bangid, sklist, plan_date, icitemlist, sentrys, childidList);
-                                        sct.kitting_time = cilList.Max(s => s.kitting_time);
+                                        CalcIcitem(cilList, returnlist, bangid, sklist, mesorder.ooentry_stime, icitemlist, sentrys, childidList);
+                                        sct.kitting_time = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());//加上物料的采购提前期
                                     }
-                                    //1.先生成委外工单。
-                                    var mesorder = CreateMesOOder(sct, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
-                                    //采购申请
-                                    PackageSRMPR(sct, bangid, sentrys);
                                     sct.subcontracting_qty = sct.lack_qty;
                                     sct.subcontracting_list = new List<ooder>();
                                     ooder oo = new ooder();
@@ -1172,7 +1335,7 @@ namespace Business.ResourceExamineManagement
                                     oo.production_unit_code = mesorder.production_unit_code;
                                     oo.ooentry_prdname = mesorder.ooentry_prdname;
                                     oo.ooentry_stime = mesorder.ooentry_stime;
-                                    oo.ooentry_etime = sct.kitting_time;
+                                    oo.ooentry_etime = mesorder.ooentry_etime;
                                     oo.oorder_date = mesorder.oorder_date;
                                     oo.oorder_no = mesorder.oorder_no;
                                     item.subcontracting_list.Add(oo);
@@ -1214,24 +1377,58 @@ namespace Business.ResourceExamineManagement
             item.stock_state = item.lack_qty > 0 ? 0 : 1;
         }
 
+
         /// <summary>
         /// 生成采购申请单,颗粒度是一个物料一个单,没必要弄列表
         /// </summary>
         /// <param name="returnlist"></param>
         /// <param name="factoryid"></param>
         /// <param name="orderType">2委外采购申请单,3采购申请单</param>
-        private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, long? companyId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, List<mo_ic_item> planList, crm_seorderentry sentrys)
+        private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, long? companyId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, List<mo_ic_item> planList, crm_seorderentry sentrys, DateTime? plan_date)
         {
             SRMPRDto sRMPR = new SRMPRDto();
-            var supplier = supplierList.OrderBy(s => s.quota_priority).FirstOrDefault();//默认取配额优先级
+            mo_srm_purchase supplier = null;
             var plan = planList.Find(x => x.mysql_id == returnlist.item_id);
-            sRMPR.srm_Pr_Main = new List<mo_srm_pr_main>();
-            if (supplier == null || plan == null)
+            var supplist = supplierList.Where(s => s.icitem_id == returnlist.item_id).ToList();
+            decimal day = 0;
+            if (!supplist.Any() || plan == null)
             {
+                returnlist.stock_state = 99;
                 sRMPR.lastStartTmie = DateTime.Now.AddDays(7);//默认采购提前期
+                sRMPR.totalLeadTime = 7;
                 return sRMPR;
-                //throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
             }
+            if (plan_date != null && returnlist.erp_cls == 3)
+            {
+                //判断当前时间与交期还剩余多少天
+                var timesp = plan_date.GetValueOrDefault() - DateTime.Now.Date;
+                //交期-生产时长-物料前处理周期
+                day = Math.Floor(timesp.Days - returnlist.make_time.GetValueOrDefault() - returnlist.clean_leadtime.GetValueOrDefault());
+                if (day > 0)
+                {
+                    supplist = supplist.Where(s => s.lead_time.GetValueOrDefault() < day).ToList();
+                    if (supplist.Any())
+                    {
+                        //TODO:走配额管理
+                        //按配额比例,计算使用哪个供应商。
+                        supplier = supplist.OrderByDescending(s => s.quota_priority).FirstOrDefault();//默认取配额优先级
+                    }
+                    else
+                    {
+                        supplier = supplist.OrderBy(s => s.quota_priority).FirstOrDefault();//默认取配额优先级
+                    }
+                }
+                else
+                {
+                    supplier = supplist.OrderBy(s => s.quota_priority).FirstOrDefault();//默认取配额优先级
+                }
+            }
+            else
+            {
+                //委外暂时不做配额处理
+                supplier = supplist.OrderBy(s => s.quota_priority).FirstOrDefault();//默认取配额优先级
+            }
+            sRMPR.srm_Pr_Main = new List<mo_srm_pr_main>();
             mo_srm_pr_main srm_Pr = new mo_srm_pr_main();
             srm_Pr.GenerateNewId(help.NextId());
             srm_Pr.mysql_id = help.NextId();
@@ -1257,19 +1454,30 @@ namespace Business.ResourceExamineManagement
             srm_Pr.icitem_id = returnlist.item_id;//物料id
             srm_Pr.icitem_name = returnlist.item_name;//物料名称
             srm_Pr.num = returnlist.num;
-            var tomorrow = DateTime.Now.Date.AddDays(1);
+            
             srm_Pr.pr_order_type = 1;//单据类型
-            srm_Pr.pr_ssend_date = tomorrow;//系统建议下单日期
-            srm_Pr.pr_sarrive_date = DateTime.Now.AddDays((double)plan.order_leadtime).AddDays((double)plan.transportation_leadtime);//系统建议到达日期(建议到货日期)
-            srm_Pr.pr_psend_date = tomorrow;//计划下单日期
-            srm_Pr.pr_parrive_date = DateTime.Now.AddDays((double)plan.order_leadtime).AddDays((double)plan.transportation_leadtime);//计划到达日期
-            srm_Pr.pr_rarrive_date = DateTime.Now.AddDays((double)plan.order_leadtime).AddDays((double)plan.transportation_leadtime);//需求到货日期
+
+            if (plan_date != null && IsInverted)
+            {
+                //-1为提前一天准备
+                int d = ((int)Math.Floor(-1 - returnlist.clean_leadtime.GetValueOrDefault()));
+                srm_Pr.pr_sarrive_date = plan_date.GetValueOrDefault().AddDays(d);
+                srm_Pr.pr_ssend_date = srm_Pr.pr_sarrive_date.Value.AddDays(-(int)Math.Floor(supplier.lead_time.GetValueOrDefault()));//系统建议下单日期
+                if (srm_Pr.pr_ssend_date < DateTime.Now.AddDays(1))
+                {
+                    //如果建议下单日期为今天或者过去,则代表物料需求供应时间不够,则需要标记此物料时间不足。
+                    var timeSp = DateTime.Now - srm_Pr.pr_ssend_date.Value;
+                    returnlist.pre_time = timeSp.Days + 1;
+                }
+            }
+            else {
+                srm_Pr.pr_ssend_date = DateTime.Now.Date.AddDays(1);//系统建议下单日期
+                srm_Pr.pr_sarrive_date = DateTime.Now.AddDays((double)supplier.lead_time.GetValueOrDefault());//系统建议到达日期(建议到货日期)
+            }
+            sRMPR.totalLeadTime = (int)Math.Floor(supplier.lead_time.GetValueOrDefault());
             srm_Pr.pr_sysprice = supplier.order_price;//系统价格(含税)
             srm_Pr.pr_orderprice = qty * supplier.order_price;//订单价格(含税)
             srm_Pr.pr_price = supplier.netpurchase_price;//采购净价(不含税)
-            /*srm_Pr.pr_sysprice = qty * x.netpurchase_price * (1 + x.taxrate);//系统价格(含税)
-            srm_Pr.pr_orderprice = qty * x.netpurchase_price * (1 + x.taxrate);//订单价格(含税)
-            srm_Pr.pr_price = x.netpurchase_price;//采购净价(不含税)*/
             srm_Pr.pr_rate = supplier.taxrate;//税率
             srm_Pr.pr_unit = returnlist.unit;//单位
             srm_Pr.state = 1;//状态
@@ -1285,13 +1493,14 @@ namespace Business.ResourceExamineManagement
             {
                 srm_Pr.sentry_id = sentrys.Id;
             }
-            decimal? totalLeadTime = plan.transportation_leadtime + plan.stock_leadtime + plan.production_leadtime + plan.order_leadtime;
+            decimal? totalLeadTime = supplier.lead_time.GetValueOrDefault();//plan.transportation_leadtime + plan.stock_leadtime + plan.production_leadtime + plan.order_leadtime;
             srm_Pr.totalLeadTime = totalLeadTime;
             srm_Pr.create_time = DateTime.Now;
             srm_Pr.create_by_name = "admin";
             srm_Pr.update_time = DateTime.Now;
             srm_Pr.update_by_name = "admin";
             sRMPR.srm_Pr_Main.Add(srm_Pr);
+
             if (sRMPR.srm_Pr_Main.Any())
             {
                 sRMPR.srm_Pr_Main.OrderBy(x => x.totalLeadTime.GetValueOrDefault()).ThenBy(x => x.pr_orderprice.GetValueOrDefault()).First().isbestoptions = true;
@@ -1332,8 +1541,8 @@ namespace Business.ResourceExamineManagement
             oOrder.ooentry_wrkcname = "10001";//工作中心名称
             oOrder.planner_num = "wwww";//计划员工号
             oOrder.planner_name = "qqq";//计划员名称
-            oOrder.ooentry_stime = returnlist.kitting_time == null ? DateTime.Now.AddDays(1) : returnlist.kitting_time.GetValueOrDefault().AddDays(1);//计划开工日期
-            oOrder.ooentry_etime = oOrder.ooentry_stime.GetValueOrDefault().AddDays(7);//计划完工日期
+            
+            oOrder.ooentry_etime = deliveryDate.AddDays(-1);//计划完工日期
             oOrder.product_code = returnlist.item_number;//产品代码
             oOrder.ffms_number = "1000";//fms旧料号
             oOrder.product_name = returnlist.item_name;//产品名称
@@ -1377,6 +1586,7 @@ namespace Business.ResourceExamineManagement
         {
             _purchaseOrderAppService.mo_Srm_Po_Lists = srm_Po_Lists; //采购明细
             _purchaseOrderAppService.srm_Po_Occupies = srm_Po_Occupies; //采购明细
+
             var occupylist = _purchaseOrderAppService.CheckPurchaseOrder(sentrys, item.item_id, item.lack_qty, plan_date, ic_item_List, bangid);
             if (occupylist.Any())
             {
@@ -1409,10 +1619,10 @@ namespace Business.ResourceExamineManagement
             }
         }
 
-        public void PackageSRMPR(BomChildExamineDto item,long bangid, crm_seorderentry sentrys)
+        public SRMPRDto PackageSRMPR(BomChildExamineDto item,long bangid, crm_seorderentry sentrys, DateTime? plan_date)
         {
             //采购申请
-            var SRMPRDto = CreateSRMPR(item, param.company_id, param.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, ic_item_List, sentrys);
+            var SRMPRDto = CreateSRMPR(item, param.company_id, param.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, ic_item_List, sentrys, plan_date);
             item.purchase_list = new List<purchase>();
             if (SRMPRDto.srm_Pr_Main != null)
             {
@@ -1441,10 +1651,10 @@ namespace Business.ResourceExamineManagement
             {
                 item.purchase_qty = item.lack_qty;
                 item.purchase_list = new List<purchase>();
-                
             }
             item.kitting_time = SRMPRDto.lastStartTmie;
             SRMPRDtoList.Add(SRMPRDto);
+            return SRMPRDto;
         }
     }
 }

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

@@ -133,7 +133,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="number">物料编码</param>
         /// <param name="Quantity"></param>
         /// <param name="ParentId"></param>
-        public Mes_MorderDto GenerateMorder(GenerateMorderDto generateMorderDto, int urgent)
+        public Mes_MorderDto GenerateMorder(GenerateMorderDto generateMorderDto)
         {
             //1.库存、在制工单检查完成后 当前BOM需要自制时 产生工单。
 
@@ -153,7 +153,7 @@ namespace Business.ResourceExamineManagement
             mes_Morder.fms_number = generateMorderDto.ic_Item.fms_number;
             mes_Morder.bom_number = generateMorderDto.BomNumber;
             mes_Morder.fmodel = generateMorderDto.ic_Item.model;
-            mes_Morder.urgent = urgent;
+            mes_Morder.urgent = 0;//暂时不用这个字段
             if (generateMorderDto.ParentId != null && generateMorderDto.moentry_sys_stime != null)
             {
                 //最早的开工时间3天后、 最晚时间为订单承诺时间 - 采购提前期 - 质检提前期 - 入库提前期 - 发料提前期 = 最晚开工时间  最早或最晚为系统建议开工日期
@@ -182,7 +182,6 @@ namespace Business.ResourceExamineManagement
                     mes_Morder.morder_need_time = (decimal)span.TotalMinutes;
                 }
             }
-
             mes_Morder.moentry_startup_status = 0;
             mes_Morder.tenant_id = param.company_id.GetValueOrDefault();
             mes_Morder.factory_id = param.factoryId;
@@ -237,15 +236,7 @@ namespace Business.ResourceExamineManagement
                 mes_Moentry.fbill_no = generateMorderDto.seorderentry.bill_no;
                 mes_Moentry.fentry_id = generateMorderDto.seorderentry.entry_seq.Value;
             }
-
             return mes_MorderDto;
-
-            //using (TransactionScope scope = new TransactionScope())
-            // {
-            //_mes_morder.InsertOne(mes_Morder);
-            //_mes_moentry.InsertOne(mes_Moentry);
-            //scope.Complete();
-            //}
         }
 
         /// <summary>
@@ -256,7 +247,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="DeliverDate">交付日期</param>
         /// <param name="seorderentry_id">销售订单子表ID</param>
         /// <returns></returns>
-        public virtual List<mo_mes_mooccupy> CheckMorder(string bomNumber, decimal Quantity, DateTime DeliverDate, crm_seorderentry seorderentry, mo_ic_item ic_Item, long bang_id)
+        public List<mo_mes_mooccupy> CheckMorder(string bomNumber, decimal Quantity, DateTime DeliverDate, crm_seorderentry seorderentry, mo_ic_item ic_Item, long bang_id)
         {
             if (string.IsNullOrEmpty(bomNumber))
             {
@@ -288,7 +279,7 @@ namespace Business.ResourceExamineManagement
             var moentrys = mo_Mes_Moentry.Where(s => s.soentry_id == seorderentry.Id);
             //找到当前订单行生成的主工单
             var toMid = moentrys.Select(s => s.moentry_moid).ToList();
-            var morderDataList = mo_Mes_Morders.Where(x => x.bom_number == bomNumber && x.morder_type == MorderEnum.JhMorder && x.moentry_sys_etime.GetValueOrDefault().AddDays(-1) < DeliverDate &&
+            var morderDataList = mo_Mes_Morders.Where(x => x.bom_number == bomNumber && x.morder_type == MorderEnum.JhMorder && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate &&
             (x.morder_production_number - x.inventory_number - mes_mooccupyList.Where(p => p.moo_moid.GetValueOrDefault() == x.mysql_id)?.Sum(m => m.moo_qty)) > Quantity)
              .OrderByDescending(x => x.planner_end_date).ToList();
 
@@ -296,7 +287,7 @@ namespace Business.ResourceExamineManagement
             //当数量或日期不满足的时候,寻找最早日期的工单
             if (morderDataList.Count == 0)
             {
-                morderDataList = mo_Mes_Morders.Where(x => x.bom_number == bomNumber && (x.morder_type == MorderEnum.JhMorder || toMid.Contains(x.mysql_id)) && x.moentry_sys_etime.GetValueOrDefault().AddDays(-1) < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
+                morderDataList = mo_Mes_Morders.Where(x => x.bom_number == bomNumber && (x.morder_type == MorderEnum.JhMorder || toMid.Contains(x.mysql_id)) && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
             }
             var QuantityNumber = 0.00m;
             //存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。

+ 5 - 0
MicroServices/Business/Business.Application/ResourceExamineManagement/PretreatmentAppService.cs

@@ -126,6 +126,8 @@ namespace Business.ResourceExamineManagement
                     cdto.bom_id = childBom.mysql_id;
                     cdto.bom_number = childBom.bom_number;
                     cdto.Op = c.Op;
+                    cdto.clean_leadtime = icitem.clean_leadtime;
+                    cdto.PurLT = icitem.PurLT;
                     //递归寻找子级
                     GetBomList(bomlist, bomchildlist, icitemlist, cdto, returnlist, type);
                 }
@@ -159,6 +161,7 @@ namespace Business.ResourceExamineManagement
                         childDto.type = type;
                         childDto.item_number = icitem.number;
                         childDto.Op = c.Op;
+                        childDto.clean_leadtime = icitem.clean_leadtime;
                         returnlist.Add(childDto);
                     }
                 }
@@ -275,6 +278,7 @@ namespace Business.ResourceExamineManagement
             dto.substitute_all_num = sal.order_num;//群组优先级
             //先按标准料的工序给替代料赋值。
             dto.Op = toDto.Op;
+            dto.clean_leadtime = icitem.clean_leadtime;
             if (bom != null)
             {
                 dto.bom_id = bom.mysql_id;
@@ -285,6 +289,7 @@ namespace Business.ResourceExamineManagement
                 dto.haveicsubs = 0;
                 dto.substitute_code = "";
                 dto.icitem_ids = "";
+                dto.PurLT = icitem.PurLT;
                 GetBomList(bomlist, bomchildlist, icitemlist, dto, returnlist, type);
             }
             else

+ 3 - 2
MicroServices/Business/Business.Application/ResourceExamineManagement/PurchaseOrderAppService.cs

@@ -80,13 +80,14 @@ namespace Business.ResourceExamineManagement
             var poDetailList = mo_Srm_Po_Lists.Where(x => x.icitem_id == icitem_id);
             //采购订单占用数据
             var poOccupys = srm_Po_Occupies.Where(x => poDetailList.Select(p => p.Id).ToList().Contains(x.polist_id));
+
             //先查询出满足日期,并且数量可满足占用的数据
-            var poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault().AddDays(-(int)ic_Plan.self_inspection_date.GetValueOrDefault()) < DeliverDate && x.qty - x.rqty - x.esqty -
+            var poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault() < DeliverDate && x.qty - x.rqty - x.esqty -
                 poOccupys.Where(p => p.polist_id == x.mysql_id)?.Sum(m => m.qty) > Quantity).OrderByDescending(x => x.rarrdate).ToList();
             //未满足则查询出满足日期的订单
             if (poDetails.Count == 0)
             {
-                poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault().AddDays(-(int)ic_Plan.self_inspection_date.GetValueOrDefault()) < DeliverDate).OrderByDescending(x => x.rarrdate).ToList();
+                poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault() < DeliverDate).OrderByDescending(x => x.rarrdate).ToList();
             }
             var QuantityNumber = 0.00m;
             foreach (var item in poDetails)

+ 23 - 25
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -666,6 +666,8 @@ namespace Business.ResourceExamineManagement
             //记录订单行的物料齐套时间
             List<KittingTimeDto> kittingTimes = new List<KittingTimeDto>();
             DataInitialization(boms, bangid, icitemlist, stocklist, pretreatments, sklist);
+
+            _CalcBomViewAppService.morder_type = MorderEnum.XsMorder;
             foreach (var sorder in sorders)
             {
                 param.sorderId = sorder.Id;
@@ -675,13 +677,11 @@ namespace Business.ResourceExamineManagement
                 _morderAppService.param = param;
                 _purchaseOrderAppService.param = param;
                 _CalcBomViewAppService.param = param;
+                _CalcBomViewAppService.IsInverted = true;
                 _CalcBomViewAppService.seorder = sorder;//销售订单
                 var orderSentrys = sentrys.Where(s => s.seorder_id == sorder.Id).ToList();
                 foreach (var item in orderSentrys)
                 {
-                    //获取销售订单“是否加急”字段
-                    int urgent = sorder.urgent;
-
                     //工单资源检查信息
                     dtl = new ExamineResult();
                     dtl.sorderid = sorder.Id;
@@ -708,7 +708,7 @@ namespace Business.ResourceExamineManagement
                     _CalcBomViewAppService.BomStock(getBomList, stocklist, bangid);
                     _CalcBomViewAppService.newStockOccList = new List<mo_ic_item_stockoccupy>();
                     //计算
-                    _CalcBomViewAppService.CalcView(getBomList, bangid, item.qty.GetValueOrDefault(), item.plan_date, sklist, item, urgent, icitemlist);
+                    _CalcBomViewAppService.CalcView(getBomList, bangid, item.qty.GetValueOrDefault(), item.plan_date, sklist, item, icitemlist);
 
                     //TODO:最晚开始时间
                     var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
@@ -1035,9 +1035,9 @@ namespace Business.ResourceExamineManagement
             srm_Pr.pr_sqty = prlist.Sum(s => s.pr_sqty);//建议数量
             srm_Pr.pr_ssend_date= prlist.Min(s => s.pr_ssend_date);//系统建议下单日期
             srm_Pr.pr_sarrive_date = prlist.Min(s => s.pr_sarrive_date);//系统建议到达日期(建议到货日期)
-            srm_Pr.pr_psend_date = prlist.Min(s => s.pr_psend_date);//计划下单日期
+/*            srm_Pr.pr_psend_date = prlist.Min(s => s.pr_psend_date);//计划下单日期
             srm_Pr.pr_parrive_date = prlist.Min(s => s.pr_parrive_date);//计划到达日期
-            srm_Pr.pr_rarrive_date = prlist.Min(s => s.pr_rarrive_date);//需求到货日期
+            srm_Pr.pr_rarrive_date = prlist.Min(s => s.pr_rarrive_date);//需求到货日期*/
             //srm_Pr.pr_sysprice = prlist.Sum(s => s.pr_rqty) * prlist[0].pr_price * (1 + prlist[0].pr_rate);//系统价格(含税)
             srm_Pr.pr_orderprice = prlist.Sum(s => s.pr_aqty) * prlist[0].pr_sysprice;//订单价格(含税)
             /*srm_Pr.icitem_id = returnlist.item_id;//物料id
@@ -1114,18 +1114,12 @@ namespace Business.ResourceExamineManagement
                         newPr.pr_aqty = ilist.Sum(s => s.pr_aqty);//申请数量
                         newPr.pr_sqty = ilist.Sum(s => s.pr_sqty);//建议数量
 
-                        decimal day = 0;
-                        if (icitem != null)
-                        {
-                            //目前只加入了下单前置(天)
-                            day += icitem.order_leadtime.GetValueOrDefault();
-                        }
-                        newPr.pr_rarrive_date = starttime;//需求到货日期
-                        newPr.pr_ssend_date = newPr.pr_rarrive_date.Value.AddDays(-double.Parse(day.ToString()));//系统建议下单日期
-                        newPr.pr_psend_date = newPr.pr_ssend_date;//计划下单日期
-                        newPr.pr_sarrive_date = newPr.pr_rarrive_date;//系统建议到达日期(建议到货日期)
-                        newPr.pr_parrive_date = newPr.pr_rarrive_date;//计划到达日期
-                        
+                        newPr.pr_ssend_date = ilist.Min(s => s.pr_ssend_date);//系统建议下单日期
+                        newPr.pr_sarrive_date = ilist.Min(s => s.pr_sarrive_date);//系统建议到达日期(建议到货日期)
+                        /*            newPr.pr_psend_date = ilist.Min(s => s.pr_psend_date);//计划下单日期
+                                    newPr.pr_parrive_date = ilist.Min(s => s.pr_parrive_date);//计划到达日期
+                                    newPr.pr_rarrive_date = ilist.Min(s => s.pr_rarrive_date);//需求到货日期*/
+
                         //newPr.pr_sysprice = newPr.pr_rqty * pr.pr_price * (1 + pr.pr_rate);//系统价格(含税)
                         newPr.pr_orderprice = newPr.pr_aqty * pr.pr_sysprice;//订单价格(含税)
                         ilist.ForEach(s => { s.refer_pr_billno = newPr.pr_billno; });
@@ -1288,8 +1282,8 @@ namespace Business.ResourceExamineManagement
             DateTime toTime = new DateTime(2023, 7, 6);
             DateTime starttime = toTime.AddDays(1);
             DateTime endtime = toTime.AddDays(8);
-            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.IsRequireGoods == 0 && s.pr_rarrive_date >= starttime &&
-            s.pr_rarrive_date <= endtime && (s.state == 1|| s.state == 2 || s.state == 3)).Result;
+            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.IsRequireGoods == 0 && s.pr_sarrive_date >= starttime &&
+            s.pr_sarrive_date <= endtime && (s.state == 1|| s.state == 2 || s.state == 3)).Result;
 
             if (prlist.Any())
             {
@@ -2078,7 +2072,7 @@ namespace Business.ResourceExamineManagement
                 podetail.plan_qty = item.pr_aqty;
                 podetail.unit = item.pr_unit;
                 podetail.state = item.state;
-                podetail.rarrdate = item.pr_rarrive_date;
+                podetail.rarrdate = item.pr_sarrive_date;
                 podetail.rnumber = 0;
                 podetail.currencytype = item.currencytype;
                 podetail.create_time = DateTime.Now;
@@ -2996,6 +2990,7 @@ namespace Business.ResourceExamineManagement
             _morderAppService.param = param;
             _purchaseOrderAppService.param = param;
             _CalcBomViewAppService.param = param;
+            _CalcBomViewAppService.IsInverted = true;
             foreach (var item in mo_Mes_Morders)
             {
                 var moentry = mo_Mes_Moentries.Find(s => s.moentry_moid == item.Id);
@@ -3031,12 +3026,13 @@ namespace Business.ResourceExamineManagement
                     getBomList.ForEach(s => s.sentry_id = item.Id);
                 }
                 _CalcBomViewAppService.newStockOccList = new List<mo_ic_item_stockoccupy>();
+                _CalcBomViewAppService.morder_type = item.morder_type;
                 _CalcBomViewAppService.mes_morder = item;
                 //库存初始化
                 _CalcBomViewAppService.BomStock(getBomList, stocklist, bangid);
 
                 //计算
-                _CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.start_time, sklist, sentry, item.urgent, icitemlist);
+                _CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.start_time, sklist, sentry, icitemlist);
                 
                 //TODO:最晚开始时间
                 var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
@@ -3366,7 +3362,7 @@ namespace Business.ResourceExamineManagement
                 var Items = _mysql_ic_item.GetListAsync(s => workDetails.Select(c => c.ItemNum).Contains(s.number) && s.factory_id.ToString() == workOrdMasters[0].Domain).Result;
                 List<ItemMaster> itemMasterList = _itemMaster.Select(p => workDetails.Select(c => c.ItemNum).Contains(p.ItemNum) && p.Domain == workOrdMasters[0].Domain).Distinct().ToList();
 
-                //按照工单领料,一个工单一个领料单,之前是按照排产日期和产线分别领料
+                //按照工单领料,之前是按照排产日期和产线分别领料
                 foreach (var workord in workOrdMasters)
                 {
                     Dictionary<string, decimal> dictItemQty = new Dictionary<string, decimal>();
@@ -3504,6 +3500,7 @@ namespace Business.ResourceExamineManagement
             nbrMasterList.Add(newNbr);
             List<string> headAccount = new List<string>();
             int i = 1;
+            bool typed = string.IsNullOrEmpty(workord.Typed);
             detail.ForEach(a =>
             {
                 var find = itemLocList?.Find(c => c.ItemNum == a.ItemNum);
@@ -3540,7 +3537,8 @@ namespace Business.ResourceExamineManagement
                             UpdateTime = DateTime.Now,
                             CreateUser = user?.Name,
                             UpdateUser = user?.Name,
-                            UM = find.UM
+                            UM = find.UM,
+                            LotSerial = typed ? a.LotSerial : ""
                         });
                         i++;
                     }
@@ -3848,7 +3846,7 @@ namespace Business.ResourceExamineManagement
                 workOrd.IsConfirm = true;
                 workOrd.CreateTime = DateTime.Now;
                 workOrd.Batch = item.morder_no;
-                workOrd.Typed = "s";
+                workOrd.Typed = "";
                 workOrds.Add(workOrd);
 
                 //添加工单工艺路线数据

+ 7 - 0
MicroServices/Business/Business.Domain/MongoDB/MES/IC/mo_ic_item.cs

@@ -682,5 +682,12 @@ namespace Business.Domain
         [StringLength(80)]
         [Comment("物料类型")]
         public string item_type { get; set; }
+
+        /// <summary>
+        /// 供应提前期
+        /// </summary>
+        [StringLength(80)]
+        [Comment("供应提前期")]
+        public int PurLT { get; set; }
     }
 }

+ 12 - 0
MicroServices/Business/Business.Domain/StructuredDB/Bang/b_bom_pretreatment.cs

@@ -176,5 +176,17 @@ namespace Business.Domain
         /// </summary>
         [Comment("工序")]
         public int Op { get; set; }
+
+        /// <summary>
+        /// 物料前处理天数
+        /// </summary>
+        public decimal? clean_leadtime { get; set; }
+
+        /// <summary>
+        /// 供应提前期
+        /// </summary>
+        [StringLength(80)]
+        [Comment("供应提前期")]
+        public int PurLT { get; set; }
     }
 }

+ 5 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/NbrDetail.cs

@@ -133,5 +133,10 @@ namespace Business.Domain
         [Comment("修改人")]
         public string UpdateUser { get; set; }
 
+        /// <summary>
+        /// 批次序列
+        /// </summary>
+        [Comment("批次序列")]
+        public string LotSerial { get; set; }
     }
 }

+ 7 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ic_item.cs

@@ -687,5 +687,12 @@ namespace Business.Domain
         [StringLength(80)]
         [Comment("物料类型")]
         public string item_type { get; set; }
+
+        /// <summary>
+        /// 供应提前期
+        /// </summary>
+        [StringLength(80)]
+        [Comment("供应提前期")]
+        public int PurLT { get; set; }
     }
 }

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/Production/WorkOrdDetail.cs

@@ -86,5 +86,11 @@ namespace Business.Domain
         /// </summary>
         [Comment("创建时间")]
         public DateTime? CreateTime { get; set; }
+
+        /// <summary>
+        /// 批次序列
+        /// </summary>
+        [Comment("批次序列")]
+        public string LotSerial { get; set; }
     }
 }