Ver Fonte

PR在途占用

tangdi há 2 anos atrás
pai
commit
9156d479ee

+ 34 - 43
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -281,6 +281,11 @@ namespace Business.ResourceExamineManagement
                             Domain = param.factoryId.ToString()
                         };
                         int make_time = _productExamineAppService.ProductTime(prodExamine);
+                        if (make_time < level1Dto.PurLT)
+                        {
+                            //如果生产时长小于供应提前期,则按供应提前期算
+                            make_time = level1Dto.PurLT;
+                        }
                         //根据成品属性来判断是自制还是委外还是外购,需要考虑这种场景
                         if (level1Dto.erp_cls == 1 && param.checkflag)
                         {
@@ -310,7 +315,7 @@ namespace Business.ResourceExamineManagement
                             CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault());
                             if (level1Dto.lack_qty > 0)
                             {
-                                decimal itemPRQty = srm_Pr_Mains.Where(x => x.icitem_id.Value == level1Dto.item_id && x.pr_parrive_date <= plan_date).Sum(y => y.pr_aqty.GetValueOrDefault());
+                                decimal itemPRQty = srm_Pr_Mains.Where(x => x.icitem_id.Value == level1Dto.item_id && x.pr_sarrive_date <= plan_date).Sum(y => y.pr_aqty.GetValueOrDefault());
                                 if (itemPRQty < level1Dto.lack_qty)
                                 {
                                     level1Dto.lack_qty = level1Dto.lack_qty - itemPRQty;
@@ -334,21 +339,10 @@ namespace Business.ResourceExamineManagement
                                 //先计算末级数据的齐套时间。
                                 if (childList.Count > 0)
                                 {
-                                    MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, plan_date, sentrys, icitemlist);
+                                    MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, mesorder.ooentry_stime, sentrys, icitemlist);
                                     level1Dto.kitting_time = childList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());//加上物料的采购提前期
                                 }
 
-                                //2.生成采购申请
-                                //采购申请
-                                decimal itemPRQty = srm_Pr_Mains.Where(x => x.icitem_id.Value == level1Dto.item_id && x.pr_parrive_date <= plan_date).Sum(y => y.pr_aqty.GetValueOrDefault());
-                                if (itemPRQty < level1Dto.lack_qty)
-                                {
-                                    level1Dto.lack_qty = level1Dto.lack_qty - itemPRQty;
-                                    //采购申请
-                                    PackageSRMPR(level1Dto, bangid, sentrys, plan_date);
-                                }
-                                //PackageSRMPR(level1Dto, bangid, sentrys);
-
                                 level1Dto.subcontracting_qty = level1Dto.lack_qty;
                                 level1Dto.subcontracting_list = new List<ooder>();
                                 ooder oo = new ooder();
@@ -682,6 +676,11 @@ namespace Business.ResourceExamineManagement
                     newStockOccList.Add(itemStockoccupyDto);
                     sklist.Add(itemStockoccupyDto);
                 }
+                //增加前处理时间
+                if (item.clean_leadtime.GetValueOrDefault() != 0)
+                {
+                    plan_date = plan_date.GetValueOrDefault().AddDays(-(int)Math.Floor(item.clean_leadtime.GetValueOrDefault()));
+                }
                 item.use_qty = item.sqty;
                 if (item.erp_cls == 1)
                 {
@@ -748,6 +747,11 @@ namespace Business.ResourceExamineManagement
                             Domain = param.factoryId.ToString()
                         };
                         int make = _productExamineAppService.ProductTime(prodExamine);
+                        if (make < item.PurLT)
+                        {
+                            //如果生产时长小于供应提前期,则按供应提前期算
+                            make = item.PurLT;
+                        }
                         item.make_qty = item.lack_qty;
                         if (mes_MorderDto != null)
                         {
@@ -794,30 +798,6 @@ namespace Business.ResourceExamineManagement
                                 item.kitting_time = mes_Morders.mat_end_date;
                             }
                         }
-                        
-                        /*//走自制
-                        ProdExamineParamDto prodExamine = new ProdExamineParamDto()
-                        {
-                            bom_number = item.bom_number,
-                            version = item.version,
-                            packages = (int)item.lack_qty
-                        };
-                        _productExamineAppService.process = process;
-                        _productExamineAppService.techs = techs;
-                        _productExamineAppService.tech_Processes = tech_Processes;
-                        _productExamineAppService.tech_Proc_Workshops = tech_Proc_Workshops;
-
-                        *//*if (param.checkflag)
-                        {
-                            //todo:增加生成子工单后,这里需要加上生成的子工单的明细。
-                        }*//*
-                        item.make_list = new List<moorder>();
-                        var minute = _productExamineAppService.ProductiveExamine(prodExamine);
-                        //系统建议完工日期为 开工日期+产能检查时间=完工日期
-                        var Day = minute / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                        var ktime = item.kitting_time.Value.AddDays((double)Day);
-                        //item.kitting_time = ktime > mooccupylist[0].moo_etime ? ktime : mooccupylist[0].moo_etime;
-                        item.kitting_time = ktime;*/
                     }
                 }
                 else if (item.erp_cls == 3)
@@ -1214,13 +1194,19 @@ namespace Business.ResourceExamineManagement
                         sct.kitting_time = DateTime.Now;
                         sct.use_qty += sqty;
 
+                        DateTime dateTime = plan_date.GetValueOrDefault();
+                        //增加前处理时间
+                        if (item.clean_leadtime.GetValueOrDefault() != 0)
+                        {
+                            dateTime = dateTime.AddDays(-(int)Math.Floor(sct.clean_leadtime.GetValueOrDefault()));
+                        }
                         if (sct.erp_cls == 1)
                         {
                             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)
                             {
-                                mooccupylist = _morderAppService.CheckMorder(sct.bom_number, sct.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item, bangid);
+                                mooccupylist = _morderAppService.CheckMorder(sct.bom_number, sct.lack_qty, dateTime, sentrys, ic_item, bangid);
                             }
                             decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
                             sct.mo_qty = moo_qty;
@@ -1273,11 +1259,16 @@ namespace Business.ResourceExamineManagement
                                 ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                                 {
                                     ItemNum = sct.item_number,
-                                    PlanStart = plan_date.GetValueOrDefault(),
+                                    PlanStart = dateTime,
                                     QtyOrd = sct.lack_qty,
                                     Domain = param.factoryId.ToString()
                                 };
                                 int make = _productExamineAppService.ProductTime(prodExamine);
+                                if (make < sct.PurLT)
+                                {
+                                    //如果生产时长小于供应提前期,则按供应提前期算
+                                    make = sct.PurLT;
+                                }
                                 sct.make_qty = sct.lack_qty;
                                 if (mes_MorderDto != null)
                                 {
@@ -1287,7 +1278,7 @@ namespace Business.ResourceExamineManagement
                                     {
                                         //子工单生成的检查明细,还是挂接到主工单上。
                                         //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_etime = dateTime.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 =>
@@ -1438,7 +1429,7 @@ namespace Business.ResourceExamineManagement
                 //判断当前时间与交期还剩余多少天
                 var timesp = plan_date.GetValueOrDefault() - DateTime.Now.Date;
                 //交期-生产时长-物料前处理周期
-                day = Math.Floor(timesp.Days - returnlist.clean_leadtime.GetValueOrDefault());
+                day = timesp.Days;
                 if (day > 0)
                 {
                     supplist = supplist.Where(s => s.lead_time.GetValueOrDefault() < day).ToList();
@@ -1532,8 +1523,7 @@ namespace Business.ResourceExamineManagement
             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_sarrive_date = plan_date.GetValueOrDefault().AddDays(-1);
                 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))
                 {
@@ -1658,6 +1648,7 @@ namespace Business.ResourceExamineManagement
         {
             _purchaseOrderAppService.mo_Srm_Po_Lists = srm_Po_Lists; //采购明细
             _purchaseOrderAppService.srm_Po_Occupies = srm_Po_Occupies; //采购明细
+            _purchaseOrderAppService.srm_Pr_Mains = srm_Pr_Mains;//在途PR
 
             var occupylist = _purchaseOrderAppService.CheckPurchaseOrder(sentrys, item.item_id, item.lack_qty, plan_date, ic_item_List, bangid);
             if (occupylist.Any())

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

@@ -90,7 +90,7 @@ namespace Business.ResourceExamineManagement
             dto.erp_cls = item.erp_cls.GetValueOrDefault();
             dto.erp_cls_name = item.erp_cls_name;
             dto.type = type;
-
+            dto.PurLT = item.PurLT;
             //var bdto = ObjectMapper.Map<ic_bom,BomChildExamineDto>(bom);
             returnlist.Add(dto);
             var childlist = bomchildlist.Where(a => a.bom_id == bom.mysql_id).OrderBy(s=>s.child_num).ToList();

+ 44 - 7
MicroServices/Business/Business.Application/ResourceExamineManagement/PurchaseOrderAppService.cs

@@ -48,6 +48,11 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         public List<mo_srm_po_occupy> srm_Po_Occupies = new List<mo_srm_po_occupy>();
 
+        /// <summary>
+        /// 在途PR
+        /// </summary>
+        public List<mo_srm_pr_main> srm_Pr_Mains = new List<mo_srm_pr_main>();
+
         #endregion
         #region 构造函数
         /// <summary>
@@ -95,7 +100,7 @@ namespace Business.ResourceExamineManagement
                 var poOccupy = poOccupys.Where(x => x.polist_id == item.Id).ToList();
                 decimal? Qtys = poOccupy.Count > 0 ? poOccupy.Sum(x => x.qty.GetValueOrDefault()) : 0.00m;
                 //剩余可用数量
-                var PlanQty = item.plan_qty.GetValueOrDefault() - item.rqty.GetValueOrDefault() - item.esqty.GetValueOrDefault() - Qtys;
+                var PlanQty = item.qty.GetValueOrDefault() - item.rqty.GetValueOrDefault() - item.esqty.GetValueOrDefault() - Qtys;
                 if (PlanQty > 0)
                 {
                     //可占用数量-需求数量小于0时 占用全部可占用数量
@@ -108,7 +113,7 @@ namespace Business.ResourceExamineManagement
                         //可占用数量满足 需求数量时直接占用需求数量
                         QuantityNumber = Quantity;
                     }
-                    var mes_Mooccupy = GetMooccupies(seorderentry, item, QuantityNumber, bang_id);
+                    var mes_Mooccupy = GetMooccupies(seorderentry, item.mysql_id, item.create_time, item.rarrdate, QuantityNumber, bang_id);
                     occupyList.Add(mes_Mooccupy);
                     //当剩余需要数量大于0则继续寻找可占用工单,已满足需要数量停止循环查找
                     if (Quantity - PlanQty <= 0)
@@ -118,6 +123,39 @@ namespace Business.ResourceExamineManagement
                     Quantity = Quantity - PlanQty.GetValueOrDefault();
                 }
             }
+            //代表PO还未占用完
+            if (Quantity > 0)
+            {
+                var prlist  = srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_sarrive_date <= DeliverDate).ToList();
+                foreach (var pr in prlist)
+                {
+                    decimal prOccupy = srm_Po_Occupies.Where(x => x.polist_id == pr.mysql_id).Sum(c => c.qty.GetValueOrDefault());
+                    //剩余可用数量
+                    var prQty = pr.pr_aqty - prOccupy;
+                    if (prQty > 0)
+                    {
+                        //可占用数量-需求数量小于0时 占用全部可占用数量
+                        if (prQty - Quantity <= 0)
+                        {
+                            QuantityNumber = prQty.GetValueOrDefault();
+                        }
+                        else
+                        {
+                            //可占用数量满足 需求数量时直接占用需求数量
+                            QuantityNumber = Quantity;
+                        }
+                        var mes_Mooccupy = GetMooccupies(seorderentry, pr.mysql_id,pr.create_time,pr.pr_sarrive_date, QuantityNumber, bang_id);
+                        occupyList.Add(mes_Mooccupy);
+                        //当剩余需要数量大于0则继续寻找可占用,已满足需要数量停止循环查找
+                        if (Quantity - prQty <= 0)
+                        {
+                            break;
+                        }
+                        Quantity = Quantity - prQty.GetValueOrDefault();
+                    }
+
+                }
+            }
             return occupyList.OrderByDescending(s => s.etime).ToList();
         }
         /// <summary>
@@ -128,15 +166,14 @@ namespace Business.ResourceExamineManagement
         /// <param name="item">工单表</param>
         /// <param name="mes_mooccupy">占用工单表</param>
         /// <returns></returns>
-        public mo_srm_po_occupy GetMooccupies(crm_seorderentry seorderentry, mo_srm_po_list srm_po_list, decimal? number, long bang_id)
+        public mo_srm_po_occupy GetMooccupies(crm_seorderentry seorderentry, long id,DateTime? stime, DateTime? etime, decimal? number, long bang_id)
         {
             //生成mo_srm_po_occupy采购占用表数据。 
             mo_srm_po_occupy srm_Po_Occupy = new mo_srm_po_occupy();
             srm_Po_Occupy.GenerateNewId(snowFlake.NextId());
             srm_Po_Occupy.mysql_id = snowFlake.NextId();
             srm_Po_Occupy.bang_id = bang_id;
-            srm_Po_Occupy.polist_id = srm_po_list.Id;
-            srm_Po_Occupy.polist_row = srm_po_list.polist_row;
+            srm_Po_Occupy.polist_id = id;
             if (seorderentry != null)
             {
                 srm_Po_Occupy.eid = seorderentry.Id;
@@ -147,8 +184,8 @@ namespace Business.ResourceExamineManagement
             
             srm_Po_Occupy.qty = number;
             srm_Po_Occupy.type = MorderEnum.Zyjc_Type;//TODO:类型未知
-            srm_Po_Occupy.stime = srm_po_list.create_time;
-            srm_Po_Occupy.etime = srm_po_list.rarrdate;
+            srm_Po_Occupy.stime = stime;
+            srm_Po_Occupy.etime = etime;
             srm_Po_Occupy.state = 1;
             srm_Po_Occupy.company_id = param.company_id;//取销售子表企业ID
             srm_Po_Occupy.factory_id = param.factoryId;

+ 72 - 38
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1018,7 +1018,7 @@ namespace Business.ResourceExamineManagement
             else {
                 return JsonConvert.SerializeObject("所选采购申请单未找到,请刷新界面重新操作。");
             }
-
+            List<srm_po_occupy> occupylist = _mysql_srm_po_occupy.GetListAsync(s => idList.Contains(s.polist_id.GetValueOrDefault())).Result;
             srm_pr_main srm_Pr = help.DeepCopy(prlist[0]);
             srm_Pr.GenerateNewId(help.NextId());
             srm_Pr.pr_billno = prlist[0].pr_type == 2 ? _CalcBomViewAppService.getOrderNum("WWPR") : _CalcBomViewAppService.getOrderNum("PR");//pr单号
@@ -1058,12 +1058,14 @@ namespace Business.ResourceExamineManagement
             srm_Pr.tenant_id = prlist[0].tenant_id;
             srm_Pr.factory_id = prlist[0].factory_id;*/
             prlist.ForEach(s => { s.state = 0; s.refer_pr_billno = srm_Pr.pr_billno; });
+            occupylist.ForEach(s => { s.polist_id = srm_Pr.Id; });
             using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
             {
                 try
                 {
                     _businessDbContext.BulkUpdate(prlist);
                     _businessDbContext.BulkInsert(new List<srm_pr_main> { srm_Pr });
+                    _businessDbContext.BulkUpdate(occupylist);
                     await unitOfWork.CompleteAsync();
                 }
                 catch (Exception e)
@@ -1089,6 +1091,9 @@ namespace Business.ResourceExamineManagement
             DateTime endtime = toTime.Date.AddDays(14);
             List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && (s.state == 1 || s.state == 3)).Result;
             List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.icitem_id).Contains(s.Id)).Result;
+
+            var occupylist = _mysql_srm_po_occupy.GetListAsync(s => prlist.Select(c => c.Id).Contains(s.polist_id.GetValueOrDefault()) && s.company_id.ToString() == companyid && s.IsDeleted == false).Result;
+
             List<PrWeekDto> prWeekDtos = new List<PrWeekDto>();
 
             List<srm_pr_main> insetPrList = new List<srm_pr_main>();
@@ -1108,9 +1113,12 @@ namespace Business.ResourceExamineManagement
                     if (ilist.Count > 1)
                     {
                         var icitem = ic_Items.Find(s => s.Id == pr.icitem_id);
-
+                        var prRefoccupy = occupylist.Where(s => s.polist_id == pr.Id).ToList();
                         newPr = help.DeepCopy(pr);
                         newPr.GenerateNewId(help.NextId());
+                        prRefoccupy.ForEach(a => {
+                            a.polist_id = newPr.Id;
+                        });
                         newPr.pr_billno = pr.pr_type == 2 ? _CalcBomViewAppService.getOrderNum("WWPR") : _CalcBomViewAppService.getOrderNum("PR");//pr单号
                         newPr.state = pr.state;
                         newPr.pr_rqty = ilist.Sum(s => s.pr_rqty);//需求数量
@@ -1196,6 +1204,10 @@ namespace Business.ResourceExamineManagement
                     {
                         _businessDbContext.BulkUpdate(updatePrList);
                     }
+                    if (occupylist.Any())
+                    {
+                        _businessDbContext.BulkUpdate(occupylist);
+                    }
                     unitOfWork.CompleteAsync();
                 }
                 catch (Exception e)
@@ -1312,7 +1324,7 @@ namespace Business.ResourceExamineManagement
                         }
                         if (poaction.poOccupiesList.Any())
                         {
-                            _businessDbContext.BulkInsert(poaction.poOccupiesList);
+                            _businessDbContext.BulkUpdate(poaction.poOccupiesList);
                         }
 
                         if (poaction.poMasterList.Any())
@@ -1397,7 +1409,7 @@ namespace Business.ResourceExamineManagement
                     }
                     if (poaction.poOccupiesList.Any())
                     {
-                        _businessDbContext.BulkInsert(poaction.poOccupiesList);
+                        _businessDbContext.BulkUpdate(poaction.poOccupiesList);
                     }
 
                     if (poaction.poMasterList.Any())
@@ -1865,41 +1877,52 @@ namespace Business.ResourceExamineManagement
                     await _mes_mooccupy.InsertManyAsync(moMes_mooccupy);
                 }
             }
-            //TODO:要不要根据某些条件只同步有效的数据
-            //采购订单
-            var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
-            if (srm_po_main.Count > 0)
-            {
-                var moSrm_po_main = ObjectMapper.Map<List<srm_po_main>, List<mo_srm_po_main>>(srm_po_main);
-                moSrm_po_main.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
-                await _srm_po_main.InsertManyAsync(moSrm_po_main);
-            }
+            //根据物料信息,只同步在途未关闭的采购订单和采购申请
 
             //采购订单明细
-            var srm_po_list = _mysql_srm_po_list.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
+            var srm_po_list = _mysql_srm_po_list.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && itemIds.Contains(x.icitem_id.GetValueOrDefault())).Result;
             if (srm_po_list.Count > 0)
             {
-                var moSrm_po_list = ObjectMapper.Map<List<srm_po_list>, List<mo_srm_po_list>>(srm_po_list);
-                moSrm_po_list.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
-                await _srm_po_list.InsertManyAsync(moSrm_po_list);
-            }
-
-            //采购订单占用详情
-            var srm_po_occupy = _mysql_srm_po_occupy.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
-            if (srm_po_occupy.Count > 0)
-            {
-                var moSrm_po_occupy = ObjectMapper.Map<List<srm_po_occupy>, List<mo_srm_po_occupy>>(srm_po_occupy);
-                moSrm_po_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
-                await _srm_po_occupy.InsertManyAsync(moSrm_po_occupy);
+                //采购订单--取出状态为在途的PO
+                var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && srm_po_list.Select(c => c.po_id).Contains(x.Id) && (x.state == 0 || x.state == 1)).Result;
+                if (srm_po_main.Count > 0)
+                {
+                    var moSrm_po_main = ObjectMapper.Map<List<srm_po_main>, List<mo_srm_po_main>>(srm_po_main);
+                    moSrm_po_main.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
+                    await _srm_po_main.InsertManyAsync(moSrm_po_main);
+
+                    //订单明细--根据在途PO过滤出有效的Po_list
+                    srm_po_list = srm_po_list.Where(s => srm_po_main.Select(x => x.Id).Contains(s.po_id.GetValueOrDefault())).ToList();
+                    var moSrm_po_list = ObjectMapper.Map<List<srm_po_list>, List<mo_srm_po_list>>(srm_po_list);
+                    moSrm_po_list.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
+                    await _srm_po_list.InsertManyAsync(moSrm_po_list);
+                }
+                //采购订单明细占用详情
+                var srm_po_occupy = _mysql_srm_po_occupy.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && srm_po_list.Select(c => c.Id).Contains(x.polist_id.GetValueOrDefault())).Result;
+                if (srm_po_occupy.Count > 0)
+                {
+                    var moSrm_po_occupy = ObjectMapper.Map<List<srm_po_occupy>, List<mo_srm_po_occupy>>(srm_po_occupy);
+                    moSrm_po_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
+                    await _srm_po_occupy.InsertManyAsync(moSrm_po_occupy);
+                }
             }
 
             //pr
-            var srm_pr_main = _mysql_srm_pr_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && itemIds.Contains(x.icitem_id.GetValueOrDefault())).Result;
+            var srm_pr_main = _mysql_srm_pr_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && x.state != 0 && itemIds.Contains(x.icitem_id.GetValueOrDefault())).Result;
             if(srm_pr_main.Count>0)
             {
                 var moSrm_pr_main = ObjectMapper.Map<List<srm_pr_main>, List<mo_srm_pr_main>>(srm_pr_main);
                 moSrm_pr_main.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
                 await _srm_pr_main.InsertManyAsync(moSrm_pr_main);
+
+                //采购申请占用详情
+                var srm_pr_occupy = _mysql_srm_po_occupy.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && srm_pr_main.Select(c => c.Id).Contains(x.polist_id.GetValueOrDefault())).Result;
+                if (srm_pr_occupy.Count > 0)
+                {
+                    var moSrm_pr_occupy = ObjectMapper.Map<List<srm_po_occupy>, List<mo_srm_po_occupy>>(srm_pr_occupy);
+                    moSrm_pr_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
+                    await _srm_po_occupy.InsertManyAsync(moSrm_pr_occupy);
+                }
             }
         }
 
@@ -2049,7 +2072,11 @@ namespace Business.ResourceExamineManagement
         {
             List<srm_po_main> polist = new List<srm_po_main>();
             List<srm_po_list> podetaillist = new List<srm_po_list>();
+            List<srm_po_occupy> pooccupylist = new List<srm_po_occupy>();
             List<POGroupDto> pOGroupDtos = new List<POGroupDto>();
+
+            var occupyList = _mysql_srm_po_occupy.GetListAsync(s => list.Select(c => c.Id).Contains(s.polist_id.GetValueOrDefault()) && s.company_id == list[0].company_id && s.factory_id == list[0].factory_id && s.IsDeleted == false).Result;
+
             //合并条件:目前传入的数据是一周的数据,暂时不考虑多周数据合并。
             //标准类 1.销售订单产生 2.计划工单产生
             //物料属性 委外  外购
@@ -2103,11 +2130,17 @@ namespace Business.ResourceExamineManagement
                 podetail.factory_id = param.factoryId;
                 podetail.company_id = param.company_id;
                 podetail.stock_id = 1;
+                var refProccupy = occupyList.Where(s => s.polist_id == item.Id).ToList();
+                refProccupy.ForEach(f =>
+                {
+                    f.polist_id = podetail.Id;
+                });
+                poaction.poOccupiesList.AddRange(refProccupy);
                 podetaillist.Add(podetail);
                 poDto.polist.Add(podetail);
             }
-            List<srm_pr_main> referlist = new List<srm_pr_main>();
-            RecursionGetDbPr(list, referlist);
+            /*List<srm_pr_main> referlist = new List<srm_pr_main>();
+            RecursionGetDbPr(list, referlist);*/
             //组合PO
             foreach (var dto in pOGroupDtos)
             {
@@ -2148,7 +2181,7 @@ namespace Business.ResourceExamineManagement
                 {
                     var toPr = list.Find(s => s.Id == p.pr_id);
                     List<srm_pr_main> clist = new List<srm_pr_main>();
-                    RecursionPr(toPr, referlist, clist);
+                    /*RecursionPr(toPr, referlist, clist);
                     if (clist.Any())
                     {
                         clist.ForEach(c =>
@@ -2176,7 +2209,7 @@ namespace Business.ResourceExamineManagement
                                 poaction.poOccupiesList.Add(srm_Po_Occupy);
                             }
                         });
-                    }
+                    }*/
                     
                     po_Main.po_total += p.total_price;
                     p.po_id = po_Main.Id;
@@ -2187,7 +2220,6 @@ namespace Business.ResourceExamineManagement
                     row++;
                 });
             }
-
             poaction.poMain.AddRange(polist);
             poaction.polist.AddRange(podetaillist);
             List<PurOrdMaster> purOrdMasters = new List<PurOrdMaster>();
@@ -3221,12 +3253,14 @@ namespace Business.ResourceExamineManagement
             List<mo_mes_mooccupy> mes_mooccupyList = _mes_mooccupy.GetListAsync(x => x.moo_state == 1 && !x.IsDeleted && x.company_id == param.company_id
           && boms.Select(p => p.item_number).Contains(x.fitem_number) && x.bang_id == bangid).Result;
 
+            List<long> occoupyRefId = new List<long>();
             //物料采购订单明细
             var poDetailList = _srm_po_list.GetListAsync(x => icitemlist.Select(p => p.mysql_id).ToList().Contains(x.icitem_id.Value) && x.bang_id == bangid && x.state == 1 && x.rstate == 1 && !x.IsDeleted).Result;
-            //采购订单占用数据
-            var poOccupys = _srm_po_occupy.GetListAsync(x => poDetailList.Select(p => p.Id).ToList().Contains(x.polist_id) && x.bang_id == bangid && !x.IsDeleted).Result;
-
-            var srm_pr_mains = _srm_pr_main.GetListAsync(x => icitemlist.Select(p => p.mysql_id).ToList().Contains(x.icitem_id.Value) && x.bang_id == bangid && x.state == 0 && !x.IsDeleted).Result;
+            occoupyRefId.AddRange(poDetailList.Select(p => p.Id).ToList());
+            var srm_pr_mains = _srm_pr_main.GetListAsync(x => icitemlist.Select(p => p.mysql_id).ToList().Contains(x.icitem_id.Value) && x.bang_id == bangid && x.state != 0 && !x.IsDeleted).Result;
+            occoupyRefId.AddRange(srm_pr_mains.Select(p => p.Id).ToList());
+            //采购订单或采购申请占用数据
+            var poOccupys = _srm_po_occupy.GetListAsync(x => occoupyRefId.Contains(x.polist_id) && x.bang_id == bangid && !x.IsDeleted).Result;
             #endregion
 
             //处理一下已经插入得占用记录
@@ -3234,7 +3268,7 @@ namespace Business.ResourceExamineManagement
             //物料库存
             stocklist.AddRange(_ic_item_stock.GetListAsync(p => p.factory_id == param.factoryId && p.bang_id == bangid && itemIds.Contains(p.icitem_id)).Result);
             //物料库存占用表
-            sklist.AddRange(_ic_item_stockoccupy.GetListAsync(x => x.bang_id == bangid && !x.IsDeleted).Result);
+            sklist.AddRange(_ic_item_stockoccupy.GetListAsync(x => x.bang_id == bangid && !x.IsDeleted && itemIds.Contains(x.icitem_id)).Result);
 
             //物料提前期
             leadTimeList = GetLeadTime(icitemlist, param.company_id, param.factoryId);//提前期列表
@@ -3257,7 +3291,7 @@ namespace Business.ResourceExamineManagement
             _CalcBomViewAppService.srm_Po_Lists = poDetailList; //采购明细
             _CalcBomViewAppService.srm_Po_Occupies = poOccupys; //采购占用表
             _CalcBomViewAppService.ic_item_List = icitemlist; //物料表
-            _CalcBomViewAppService.srm_Pr_Mains = srm_pr_mains;//PR
+            _CalcBomViewAppService.srm_Pr_Mains = srm_pr_mains.Where(s=>s.state != 4).ToList();//PR
             DateTime dt = DateTime.Now;
             _CalcBomViewAppService.quarter_starttime = dt.AddMonths(0 - (dt.Month - 1) % 3).AddDays(1 - dt.Day).Date;
             _CalcBomViewAppService.quarter_endtime = _CalcBomViewAppService.quarter_starttime.AddMonths(3);

+ 1 - 1
MicroServices/Business/Business.Domain/MongoDB/SRM/mo_srm_pr_main.cs

@@ -172,7 +172,7 @@ namespace Business.Domain
         [Comment("单位")]
         public string? pr_unit { get; set; }
         /// <summary>
-        /// 状态
+        /// 状态 0,关闭;1,新增;    暂时不考虑这种状态,影响PR重新生成,如增加需调整PR代码。2,提交;3,未通过;4,评审通过
         /// </summary>
         [Comment("状态")]
         public int? state { get; set; }