فهرست منبع

Merge branch 'dev' of http://123.60.180.165:4647/ZZYDOP/DOPCore into dev

heteng 2 سال پیش
والد
کامیت
7b2e324566

+ 213 - 10
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -3117,7 +3117,7 @@ namespace Business.Replenishment
                 weekPlan[i].ProductionOrder = morder_noList[i].NbrResult;
                 weekPlan[i].OrderNO = OrderNOList[i].NbrResult;
             }
-            await PlanOrderResourceCheck(moList.OrderBy(a=>a.moentry_sys_stime).ToList(), moentryList, bang_id,"", input);
+            await PlanOrderResourceCheck(moList.OrderBy(a=>a.moentry_sys_stime).ToList(), moentryList, bang_id,"",false);
 
             var examine_resultList = _mysql_examine_result.GetListAsync(a => a.bangid == bang_id).Result;
             await _businessDbContext.BulkInsertAsync(moList);
@@ -3272,7 +3272,7 @@ namespace Business.Replenishment
                 moentryList[i].moentry_mono = morder_noList[i].NbrResult;
                 weekplans[i].ProductionOrder = morder_noList[i].NbrResult;
             }
-            await PlanOrderResourceCheck(moList.OrderBy(a => a.moentry_sys_stime).ToList(), moentryList, bang_id, "", input);
+            await PlanOrderResourceCheck(moList.OrderBy(a => a.moentry_sys_stime).ToList(), moentryList, bang_id, "",false);
 
             var examine_resultList = _mysql_examine_result.GetListAsync(a => a.bangid == bang_id).Result;
             await _businessDbContext.BulkInsertAsync(moList);
@@ -4004,6 +4004,40 @@ namespace Business.Replenishment
             }
         }
 
+
+        /// <summary>
+        /// 获取虚拟件明细
+        /// </summary>
+        /// <param name="dtl"></param>
+        /// <param name="returnList"></param>
+        /// <param name="childs"></param>
+        public void GetWorkDetalis(List<BomChildExamineDto> dtl, List<BomChildExamineDto> returnList, List<BomChildExamineDto> childs, List<ProductStructureOp> productOps)
+        {
+            returnList.AddRange(dtl.Where(x => x.erp_cls != 4).ToList());
+            var rst = childs.Where(s => dtl.Where(x => x.erp_cls == 4).Select(c => c.fid).Contains(s.parent_id.GetValueOrDefault())).ToList();
+            if (rst.Any())
+            {
+                if (productOps.Any())
+                {
+                    //rst  虚拟件的子物料
+                    foreach (var item in rst)
+                    {
+                        var parent = childs.Find(x => x.fid == item.parent_id);
+                        if (parent != null)
+                        {
+                            var proOp = productOps.Find(x => x.ParentItem == parent.item_number && x.ComponentItem == item.item_number);
+                            if (proOp != null)
+                            {
+                                item.Op = proOp.Op;
+                            }
+                        }
+                    }
+                }
+                GetWorkDetalis(rst, returnList, childs, productOps);
+            }
+            return;
+        }
+
         /// <summary>
         /// 获取虚拟件明细
         /// </summary>
@@ -4259,10 +4293,88 @@ namespace Business.Replenishment
                 var isExistSamePriority= _replenishmentWeekPlan.FindAsync(a => a.Id != id && a.Week == weekPlan.Week && a.Priority == newpriority).Result;
                 if(isExistSamePriority!=null)
                     return "优先级重复,请重新调整。";
+
                 weekPlan.Priority= newpriority;
                 weekPlan.Qty= newqty;
-                weekPlan.InStockDate= newinstockdate;
-                await _replenishmentWeekPlan.UpdateAsync(weekPlan);
+                //newinstockdate其实传的的工单开工日期
+                weekPlan.PlanStartDate= newinstockdate;
+
+                if(!string.IsNullOrEmpty(weekPlan.ProductionOrder))
+                {
+                    long bang_id = help.NextId();
+                    var moList = _mysql_mes_morder.GetListAsync(a => a.morder_no == weekPlan.ProductionOrder && a.factory_id == factoryid).Result;
+                    var moentryList = _mysql_mes_moentry.GetListAsync(a => a.moentry_mono == weekPlan.ProductionOrder && a.factory_id == factoryid).Result;
+                    var workmasterList = _workOrdMaster.Select(a => a.WorkOrd == weekPlan.ProductionOrder && a.Domain == factory_id);
+                    var workRoutings = _workOrdRouting.Select(a => a.WorkOrd == weekPlan.ProductionOrder && a.Domain == factory_id);
+                    //判断
+                    if (moList.Count > 0 && (moList[0].morder_state == MorderEnum.Initial_state || string.IsNullOrEmpty(moList[0].morder_state)) 
+                        && workmasterList.Count > 0 && (string.IsNullOrEmpty(workmasterList[0].Status) || workmasterList[0].Status == "p"))
+                    {
+                        moList[0].moentry_sys_stime = newinstockdate;
+                        moList[0].need_number = newqty;
+                        moList[0].morder_production_number = newqty;
+
+                        moentryList[0].need_number = newqty;
+                        moentryList[0].morder_production_number = newqty;
+
+                        workmasterList[0].OrdDate = newinstockdate;
+                        workmasterList[0].Priority = newpriority;
+                        workmasterList[0].QtyOrded = newqty;
+
+                        workRoutings?.ForEach(a =>
+                        {
+                            a.QtyOrded = newqty;
+                        });
+
+                        await PlanOrderResourceCheck(moList.OrderBy(a => a.moentry_sys_stime).ToList(), moentryList, bang_id, "", true);
+
+                        var examine_resultList = _mysql_examine_result.GetListAsync(a => a.bangid == bang_id).Result;
+                        if (weekPlan.IsReplenishmentModel == "N")
+                        {
+                            var moItem = examine_resultList.Find(b => b.morder_no == weekPlan.ProductionOrder);
+                            List<RoutingOpDetail> routingOp = routingOps.Where(x => x.RoutingCode == weekPlan.ItemNumber).ToList();
+                            //组装标准工时
+                            var Assembly = routingOp.Where(x => x.Ufld1 == "组装" && x.MilestoneOp).FirstOrDefault();
+                            //热封标准工时
+                            var HeatSealing = routingOp.Where(x => x.Ufld1 == "热封" && x.MilestoneOp).FirstOrDefault();
+                            //包装标准工时
+                            var Packaging = routingOp.Where(x => x.Descr == "包装" && x.MilestoneOp).FirstOrDefault();
+                            if (moItem != null && moItem.kitting_times < weekPlan.PlanStartDate)
+                            {
+                                weekPlan.ItemStatus = "齐套";
+                                weekPlan.PlanKittingDate = moItem.kitting_times;
+                                weekPlan.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * weekPlan.Qty;
+                                weekPlan.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * weekPlan.Qty;
+                                weekPlan.PackageHours = Packaging == null ? 0 : Packaging.RunTime * weekPlan.Qty;
+                                weekPlan.TotalHours = weekPlan.AssembleHours + weekPlan.HeatSealHours + weekPlan.PackageHours;
+                            }
+                            else
+                            {
+                                weekPlan.ItemStatus = "欠料";
+                                weekPlan.PlanKittingDate = moItem.kitting_times;
+                                weekPlan.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * weekPlan.Qty;
+                                weekPlan.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * weekPlan.Qty;
+                                weekPlan.PackageHours = Packaging == null ? 0 : Packaging.RunTime * weekPlan.Qty;
+                                weekPlan.TotalHours = weekPlan.AssembleHours + weekPlan.HeatSealHours + weekPlan.PackageHours;
+                            }
+                        }
+                        await _replenishmentWeekPlan.UpdateAsync(weekPlan);
+                        await _mysql_mes_morder.UpdateManyAsync(moList);
+                        await _mysql_mes_moentry.UpdateManyAsync(moentryList);
+                        _workOrdMaster.Update(workmasterList);
+                        _workOrdRouting.Update(workRoutings);
+                    }
+                    else
+                    {
+                        return "工单不是初始状态,不允许调整。";
+                    }
+                }
+                else
+                {
+                    await _replenishmentWeekPlan.UpdateAsync(weekPlan);
+                    return "ok";
+                }
+
             }
             catch(Exception e)
             {
@@ -4313,7 +4425,7 @@ namespace Business.Replenishment
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        public async Task<string> PlanOrderResourceCheck(List<mes_morder> Mes_Morders, List<mes_moentry> moentryList,long bangid,string analogCalcVersion, InputDto input)
+        public async Task<string> PlanOrderResourceCheck(List<mes_morder> Mes_Morders, List<mes_moentry> moentryList,long bangid,string analogCalcVersion,bool isChangePriority)
         {
             if (Mes_Morders.Any())
             {
@@ -4373,7 +4485,7 @@ namespace Business.Replenishment
                 //    _scheduleResultOpMaster.Delete(s => monolist.Contains(s.WorkOrd));
                 //}
                 //只走计划工单
-                var rtn = await OrderKittingCheck(Mes_Morders, moentryList, bangid,analogCalcVersion, true);
+                var rtn = await OrderKittingCheck(Mes_Morders, moentryList, bangid,analogCalcVersion,isChangePriority, true);
             }
             else
             {
@@ -4423,7 +4535,7 @@ namespace Business.Replenishment
         /// 工单检查物料齐套
         /// </summary>
         /// <param name="input"></param>
-        public async Task<PschedDto> OrderKittingCheck(List<mes_morder> mo_Mes_Morders, List<mes_moentry> moentryList,long bangid,string analogCalcVersion, bool planCheck = false)
+        public async Task<PschedDto> OrderKittingCheck(List<mes_morder> mo_Mes_Morders, List<mes_moentry> moentryList,long bangid,string analogCalcVersion, bool isChangePriority, bool planCheck = false)
         {
             //资源检查结果
             PschedDto rtn = new PschedDto();
@@ -4610,7 +4722,76 @@ namespace Business.Replenishment
                         }
                     }
                 }
+                //暂时屏蔽重新生成工单物料明细
+                List<WorkOrdDetail> mainWorkOrdDetails = new List<WorkOrdDetail>();
+                List<WorkOrdDetail> delWorkOrddetails = new List<WorkOrdDetail>();
+                if (isChangePriority)
+                {
+                    //成品虚拟件对应关系
+                    var productOpList = _productStructureOp.Select(x => mo_Mes_Morders.Select(c => c.product_code).Contains(x.ProductItem) && x.Domain == param.factoryId.ToString());
+                    var workOrds = CalcPriority(mo_Mes_Morders.Select(p => p.morder_no).ToList(), param.factoryId.ToString());
+                    delWorkOrddetails = _workOrdDetail.Select(x => workOrds.Select(c => c.RecID).Contains((int)x.WorkOrdMasterRecID) && x.Domain == param.factoryId.ToString());
+                    foreach (var workord in mo_Mes_Morders)
+                    {
+                        long fid = GetParentMo(mo_Mes_Morders, workord);
+                        var exm = examines.Find(s => s.morder_id == fid);
+                        //var exm = examines.Find(s => s.morder_no == workord.morder_no);
+                        if (exm != null)
+                        {
+                            var childs = exm.BomChildExamineList.Where(s => s.is_use == true).ToList();
 
+                            var child = childs.Find(s => s.item_number == workord.product_code);
+                            if (child == null)
+                            {
+                                continue;
+                            }
+                            List<BomChildExamineDto> returnList = new List<BomChildExamineDto>();
+                            var productOps = productOpList.Where(x => x.ProductItem == workord.product_code).ToList();
+                            GetWorkDetalis(childs.Where(s => s.parent_id == child.fid).ToList(), returnList, childs, productOps);
+                            if (returnList.Any())
+                            {
+                                WorkOrdDetail woDetail = null;
+                                var calereturnList = returnList.OrderBy(c => c.item_number).Select(x => x.item_number).Distinct().ToList();
+                                var work = workOrds.Find(x => x.WorkOrd == workord.morder_no);
+                                if (work == null)
+                                {
+                                    continue;
+                                }
+                                short num = 1;
+                                foreach (var caleNumber in calereturnList)
+                                {
+                                    var caleList = returnList.Where(x => x.item_number == caleNumber).ToList();
+
+                                    //添加工单的物料信息
+                                    woDetail = new WorkOrdDetail();
+                                    woDetail.Domain = workord.factory_id.ToString();
+                                    woDetail.WorkOrd = workord.morder_no;
+                                    var oplist = caleList.Where(x => x.Op > 0).ToList();
+                                    woDetail.Op = 0;
+                                    if (oplist.Any())
+                                    {
+                                        woDetail.Op = oplist.Min(f => f.Op);
+                                    }
+                                    woDetail.ItemNum = caleNumber;
+                                    woDetail.QtyPosted = 0m;
+                                    woDetail.QtyReturned = 0m;
+                                    woDetail.Status = "";
+                                    woDetail.IsActive = true;
+                                    woDetail.CreateTime = DateTime.Now;
+                                    woDetail.Line = num;
+                                    woDetail.QtyRequired = caleList.Sum(c => c.needCount);
+                                    woDetail.WorkOrdMasterRecID = work.RecID;
+                                    if (workord.need_number != 0)
+                                    {
+                                        woDetail.FrozenBOMQty = Math.Round(woDetail.QtyRequired / workord.need_number.GetValueOrDefault(), 10);
+                                    }
+                                    mainWorkOrdDetails.Add(woDetail);
+                                    num++;
+                                }
+                            }
+                        }
+                    }
+                }
                 //获取工单数据
                 var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c => c.morder_no).Contains(p.WorkOrd));
                 workOrdMasters.ForEach(s => {
@@ -4693,6 +4874,17 @@ namespace Business.Replenishment
                             srmpooccupyInsert.ForEach(x => { x.GenerateNewId(help.NextId()); });
                             _businessDbContext.BulkInsert(srmpooccupyInsert);
                         }
+                        if(isChangePriority)
+                        {
+                            if (delWorkOrddetails.Any())
+                            {
+                                _businessDbContext.BulkDelete(delWorkOrddetails);
+                            }
+                            if (mainWorkOrdDetails.Any())
+                            {
+                                _businessDbContext.BulkInsert(mainWorkOrdDetails);
+                            }
+                        }
                         await unitOfWork.CompleteAsync();
                     }
                     catch (Exception e)
@@ -4972,7 +5164,7 @@ namespace Business.Replenishment
                 }
 
                 //工单主表
-                var mes_morder = _mysql_mes_morder.GetListAsync(x => string.IsNullOrEmpty(x.morder_state) == false && x.morder_state != "完成" && x.company_id == companyId && x.factory_id == factoryId && workordmsters.Select(c => c.WorkOrd).Contains(x.morder_no)).Result;
+                var mes_morder = _mysql_mes_morder.GetListAsync(x => string.IsNullOrEmpty(x.morder_state) == false && x.morder_state != "完成" && x.company_id == companyId && string.IsNullOrEmpty(x.analogcalcversion) == true && x.factory_id == factoryId && workordmsters.Select(c => c.WorkOrd).Contains(x.morder_no)).Result;
                 if (mes_morder.Count > 0)
                 {
                     mes_morder.ForEach(item => { item.bang_id = bangid; });
@@ -5029,7 +5221,7 @@ namespace Business.Replenishment
             }
 
             //pr
-            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;
+            var srm_pr_main = _mysql_srm_pr_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && x.state != 0 && string.IsNullOrEmpty(x.analogcalcversion) == true && 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);
@@ -5052,6 +5244,17 @@ namespace Business.Replenishment
                     await MongoHelper<mo_srm_po_occupy>.InsertManyAsync(moSrm_pr_occupy);
                 }
             }
+
+            var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "ScheduleAgreement" && s.Domain == factoryId.ToString()).ToList();
+            int ScheduleAgreement = 0;//计划协议
+            if (sysSet.Any())
+            {
+                if (!string.IsNullOrEmpty(sysSet[0].Ufld1))
+                {
+                    int.TryParse(sysSet[0].Ufld1, out ScheduleAgreement);
+                }
+            }
+            _CalcBomViewAppService.ScheduleAgreement = ScheduleAgreement == 1;
         }
 
         /// <summary>
@@ -5550,7 +5753,7 @@ namespace Business.Replenishment
             //await _mysql_mes_morder.InsertManyAsync(moList);
             //await _mysql_mes_moentry.InsertManyAsync(moentryList);
             moList = moList.OrderBy(a => a.moentry_sys_stime).ToList();
-            await PlanOrderResourceCheck(moList,moentryList, bangid, $"V{DateTime.Now.ToString("yyyyMMddHHmm")}", input);
+            await PlanOrderResourceCheck(moList,moentryList, bangid, $"V{DateTime.Now.ToString("yyyyMMddHHmm")}",false);
             return "OK";
         }
 

+ 180 - 76
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -112,6 +112,8 @@ namespace Business.ResourceExamineManagement
         public decimal ProductionTimeDay;
         //是否虚拟计算
         public bool LongPeriod = false;
+        //是否虚拟计算
+        public bool ScheduleAgreement = false;
 
         /// <summary>
         /// 构造函数
@@ -279,7 +281,7 @@ namespace Business.ResourceExamineManagement
                 else
                 {
                     //占用不够,占用后减少缺料数量
-                    level1Dto.lack_qty -= moo_qty;
+                    //level1Dto.lack_qty -= moo_qty;
                     //level1Dto.needCount = level1Dto.lack_qty;
                     //平铺需要数量
                     CaclMaterialShortage(returnlist);
@@ -288,25 +290,19 @@ namespace Business.ResourceExamineManagement
                     level1Dto.stock_state = 0;
                     if (param.checkflag || (!param.checkflag && param.checkPlan))
                     {
-                        ProdExamineParamDto prodExamine = new ProdExamineParamDto()
-                        {
-                            ItemNum = level1Dto.item_number,
-                            PlanStart = plan_date.GetValueOrDefault(),
-                            QtyOrd = level1Dto.lack_qty,
-                            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)
                         {
+                            level1Dto.make_qty = level1Dto.lack_qty - level1Dto.mo_qty;
+                            ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                            {
+                                ItemNum = level1Dto.item_number,
+                                PlanStart = plan_date.GetValueOrDefault(),
+                                QtyOrd = level1Dto.make_qty,
+                                Domain = param.factoryId.ToString()
+                            };
+                            int make_time = _productExamineAppService.ProductTime(prodExamine);
                             //设置成品的生产时长为子物料的提前准备期
-                            //param.checkflag=true 销售订单产生工单
-                            level1Dto.make_qty = level1Dto.lack_qty;
                             string order_mo = "";
                             if (GenerateMoList.Any())
                             {
@@ -322,7 +318,7 @@ namespace Business.ResourceExamineManagement
                                 BomNumber = level1Dto.bom_number,
                                 version = level1Dto.version,
                                 number = level1Dto.item_number,
-                                Quantity = level1Dto.lack_qty,
+                                Quantity = level1Dto.make_qty,
                                 morder_type = morder_type,
                                 work_order_type = MorderEnum.CgMorder,
                                 morder_state = MorderEnum.Initial_state,
@@ -334,7 +330,7 @@ namespace Business.ResourceExamineManagement
                         else if (level1Dto.erp_cls == 3)
                         {
                             //先找在途
-                            decimal occqty = CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault());
+                            decimal occqty = CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault(), level1Dto.lack_qty, null);
                             if (level1Dto.lack_qty - occqty > 0)
                             {
                                 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());
@@ -343,21 +339,21 @@ namespace Business.ResourceExamineManagement
                                     //level1Dto.lack_qty = level1Dto.lack_qty - itemPRQty;
                                     decimal lack_qty = level1Dto.lack_qty - itemPRQty;
                                     //采购申请
-                                    PackageSRMPR(level1Dto, bangid, sentrys, plan_date, lack_qty);
+                                    PackageSRMPR(level1Dto, bangid, sentrys, plan_date, lack_qty, null);
                                 }
                             }
                         }
                         else if (level1Dto.erp_cls == 2)
                         {
                             //先找在途
-                            decimal occqty = CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault());
+                            decimal occqty = CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault(), level1Dto.lack_qty, null);
                             decimal lack_qty = level1Dto.lack_qty - occqty;
                             if (lack_qty > 0)
                             {
                                 //1.先生成委外工单。
                                 var mesorder = CreateMesOOder(level1Dto, lack_qty, 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, lack_qty);
+                                var srmprDto = PackageSRMPR(level1Dto, bangid, sentrys, plan_date, lack_qty, null);
                                 mesorder.ooentry_stime = plan_date.GetValueOrDefault().AddDays(-srmprDto.totalLeadTime.GetValueOrDefault());
 
                                 //先计算末级数据的齐套时间。
@@ -619,7 +615,7 @@ namespace Business.ResourceExamineManagement
             else
             {
                 //判断缺料数量
-                item.self_lack_qty = Math.Ceiling(parent.lack_qty * item.qty * (1 + (item.scrap.GetValueOrDefault() / 100)) + item.wastage.GetValueOrDefault());
+                item.self_lack_qty = Math.Ceiling((parent.lack_qty - parent.mo_qty - parent.purchase_occupy_qty) * item.qty * (1 + (item.scrap.GetValueOrDefault() / 100)) + item.wastage.GetValueOrDefault());
                 item.lack_qty = item.self_lack_qty - item.sqty;
                 item.lack_qty = item.lack_qty < 0 ? 0 : item.lack_qty;
                 //判断状态
@@ -756,17 +752,18 @@ namespace Business.ResourceExamineManagement
                     }
                     else if (!LongPeriod)
                     {
-                        item.lack_qty -= moo_qty;
+                        //item.lack_qty -= moo_qty;
                         item.stock_state = 0;
                         item.kitting_time = plan_date.GetValueOrDefault();
                     }
                     else
                     {
-                        item.lack_qty -= moo_qty;
+                        //item.lack_qty -= moo_qty;
                         List<string> tsWork = new List<string> { "试制工单", "TCN工单", "返工工单" };
                         //如果是特殊工单,只判断自制件的库存和在制,而不生成自制
                         if (!tsWork.Contains(mes_morder.morder_type))
                         {
+                            item.make_qty = item.lack_qty - item.mo_qty;
                             string order_mo = "";
                             if (GenerateMoList.Any())
                             {
@@ -781,7 +778,7 @@ namespace Business.ResourceExamineManagement
                                 BomNumber = item.bom_number,
                                 version = item.version,
                                 number = item.item_number,
-                                Quantity = item.lack_qty,
+                                Quantity = item.make_qty,
                                 morder_type = morder_type,
                                 work_order_type = MorderEnum.CgMorder,
                                 morder_state = MorderEnum.Initial_state,
@@ -795,7 +792,7 @@ namespace Business.ResourceExamineManagement
                             {
                                 ItemNum = item.item_number,
                                 PlanStart = plan_date.GetValueOrDefault(),
-                                QtyOrd = item.lack_qty,
+                                QtyOrd = item.make_qty,
                                 Domain = param.factoryId.ToString()
                             };
                             int make = _productExamineAppService.ProductTime(prodExamine);
@@ -804,14 +801,14 @@ namespace Business.ResourceExamineManagement
                                 //如果生产时长小于供应提前期,则按供应提前期算
                                 make = item.PurLT;
                             }*/
-                            item.make_qty = item.lack_qty;
+                            
                             if (mes_MorderDto != null)
                             {
                                 //主工单最后计算满足日期
                                 var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
                                 if (mes_Morders != null)
                                 {
-                                    var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, item.lack_qty, bangid);
+                                    var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, item.make_qty, bangid);
                                     mooccupyAllList.Add(generateMooccupy);
                                     mooccupyAllInsertList.Add(generateMooccupy);
 
@@ -864,24 +861,69 @@ namespace Business.ResourceExamineManagement
                                 }
                             }
                         }
-
                     }
                 }
-                else if (item.erp_cls == 3)
+                else if (item.erp_cls == 3 || item.erp_cls == 2)
                 {
                     if (param.checkflag || param.checkPlan)
                     {
-                        //先找在途
-                        decimal occqty = CalcInTransit(sentrys, item, bangid, plan_date.GetValueOrDefault());
-                        decimal lack_qty = item.lack_qty - occqty;
-                        if (lack_qty > 0)
+                        var supplist = supplierList.Where(s => s.icitem_id == item.item_id && s.quota_rate.GetValueOrDefault() > 0).ToList();
+                        if (!supplist.Any())
                         {
-                            //采购申请
-                            PackageSRMPR(item, bangid, sentrys, plan_date, lack_qty);
+                            item.stock_state = 99;
+                            item.kitting_time = plan_date.GetValueOrDefault().AddDays(-1);
+                            return;
+                        }
+                        var maxLeadTime = supplist.Max(x => x.lead_time.GetValueOrDefault());
+
+                        var wwPlan_data =  plan_date.GetValueOrDefault().AddDays(-(int)maxLeadTime);
+                        decimal wwCount = 0;
+                        foreach (var sup in supplist)
+                        {
+                            decimal suplack_qty = Math.Ceiling(item.lack_qty * sup.quota_rate.GetValueOrDefault() / 100);
+                            //先找在途
+                            decimal occqty = CalcInTransit(sentrys, item, bangid, plan_date.GetValueOrDefault(), suplack_qty, sup.supplier_id.GetValueOrDefault());
+                            decimal lack_qty = suplack_qty - occqty;
+                            if (lack_qty > 0)
+                            {
+                                wwCount += lack_qty;//记录缺料数量
+                                if (item.erp_cls == 3)
+                                {
+                                    //采购申请
+                                    PackageSRMPR(item, bangid, sentrys, plan_date, lack_qty, sup.supplier_id.GetValueOrDefault());
+                                }
+                                else
+                                {
+                                    //1.先生成委外工单。
+                                    var mesorder = CreateMesOOder(item, lack_qty, 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, lack_qty, sup.supplier_id.GetValueOrDefault());
+                                    mesorder.ooentry_stime = mesorder.ooentry_etime.GetValueOrDefault().AddDays(-(srmprDto.totalLeadTime.GetValueOrDefault() - 1));
+                                }
+                            }
+                        }
+                        if (item.erp_cls == 2 && wwCount > 0)
+                        {
+                            //先计算末级数据的齐套时间。
+                            if (cilList.Count > 0)
+                            {
+                                CalcIcitem(cilList, returnlist, bangid, sklist, wwPlan_data, icitemlist, sentrys, childidList);
+                                var itemTime = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays((int)maxLeadTime);//加上物料的采购提前期
+                                if (LongPeriod)
+                                {
+                                    item.kitting_time = itemTime;
+                                }
+                                else if (itemTime > item.kitting_time)
+                                {
+                                    item.kitting_time = itemTime;
+                                }
+                            }
+                            item.subcontracting_qty = wwCount;
+                            item.subcontracting_list = new List<ooder>();
                         }
                     }
                 }
-                else if (item.erp_cls == 2)
+                /*else if (item.erp_cls == 2)
                 {
 
                     if (param.checkflag || param.checkPlan)
@@ -932,7 +974,7 @@ namespace Business.ResourceExamineManagement
                             
                         }
                     }
-                }
+                }*/
                 else
                 {
                     item.kitting_time = DateTime.Now;
@@ -1072,7 +1114,7 @@ namespace Business.ResourceExamineManagement
             //占用库存
             foreach (var slt in select)
             {
-                slt.self_lack_qty = parent.lack_qty * slt.qty;
+                slt.self_lack_qty = (parent.lack_qty- parent.mo_qty - parent.purchase_occupy_qty) * slt.qty;
                 mo_ic_item_stockoccupy itemStockoccupyDto = new mo_ic_item_stockoccupy();
                 itemStockoccupyDto.bang_id = bangid;
                 itemStockoccupyDto.icitem_id = slt.item_id;
@@ -1112,7 +1154,7 @@ namespace Business.ResourceExamineManagement
             decimal parent_lack = 0;
             if (parent != null)
             {
-                parent_lack = parent.lack_qty;
+                parent_lack = parent.lack_qty - parent.mo_qty - parent.purchase_occupy_qty;
             }
 
             List<int> orderNum = sublist.Select(s => s.substitute_all_num.GetValueOrDefault()).ToList();
@@ -1327,18 +1369,19 @@ namespace Business.ResourceExamineManagement
                             }
                             else if (!LongPeriod)
                             {
-                                sct.lack_qty -= moo_qty;
+                                //sct.lack_qty -= moo_qty;
                                 sct.stock_state = 0;
                                 sct.kitting_time = dateTime;
                             }
                             else {
-                                sct.lack_qty -= moo_qty;
+                                //sct.lack_qty -= moo_qty;
                                 List<string> tsWork = new List<string> { "试制工单", "TCN工单", "返工工单" };
                                 //如果是特殊工单,只判断自制件的库存和在制,而不生成自制
                                 if (!tsWork.Contains(mes_morder.morder_type))
                                 {
                                     //TODO:需要按标准UPH来计算生产时长
                                     //生成主工单
+                                    sct.make_qty = sct.lack_qty - sct.mo_qty;
                                     string order_mo = "";
                                     if (GenerateMoList.Any())
                                     {
@@ -1353,7 +1396,7 @@ namespace Business.ResourceExamineManagement
                                         BomNumber = sct.bom_number,
                                         version = sct.version,
                                         number = sct.item_number,
-                                        Quantity = sct.lack_qty,
+                                        Quantity = sct.make_qty,
                                         morder_type = morder_type,
                                         work_order_type = MorderEnum.CgMorder,
                                         morder_state = MorderEnum.Initial_state,
@@ -1366,23 +1409,18 @@ namespace Business.ResourceExamineManagement
                                     {
                                         ItemNum = sct.item_number,
                                         PlanStart = dateTime,
-                                        QtyOrd = sct.lack_qty,
+                                        QtyOrd = sct.make_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)
                                     {
                                         //主工单最后计算满足日期
                                         var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
                                         if (mes_Morders != null)
                                         {
-                                            var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, sct.lack_qty, bangid);
+                                            var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, sct.make_qty, bangid);
                                             mooccupyAllList.Add(generateMooccupy);
                                             mooccupyAllInsertList.Add(generateMooccupy);
 
@@ -1442,17 +1480,62 @@ namespace Business.ResourceExamineManagement
                         {
                             if (param.checkflag || param.checkPlan)
                             {
-                                //先找在途
-                                decimal occqty = CalcInTransit(sentrys, sct, bangid, plan_date.GetValueOrDefault());
-                                decimal lack_qty = sct.lack_qty - occqty;
-                                if (lack_qty > 0)
+                                var supplist = supplierList.Where(s => s.icitem_id == sct.item_id && s.quota_rate.GetValueOrDefault() > 0).ToList();
+                                if (!supplist.Any())
                                 {
-                                    //采购申请
-                                    PackageSRMPR(sct, bangid, sentrys, plan_date, lack_qty);
+                                    sct.stock_state = 99;
+                                    sct.kitting_time = plan_date.GetValueOrDefault().AddDays(-1);
+                                    return;
+                                }
+                                var maxLeadTime = supplist.Max(x => x.lead_time.GetValueOrDefault());
+                                var wwPlan_data = plan_date.GetValueOrDefault().AddDays(-(int)maxLeadTime);
+                                decimal wwCount = 0;
+
+                                foreach (var sup in supplist)
+                                {
+                                    decimal suplack_qty = Math.Ceiling(sct.lack_qty * sup.quota_rate.GetValueOrDefault() / 100);
+                                    //先找在途
+                                    decimal occqty = CalcInTransit(sentrys, sct, bangid, plan_date.GetValueOrDefault(), suplack_qty, sup.supplier_id.GetValueOrDefault());
+                                    decimal lack_qty = suplack_qty - occqty;
+                                    if (lack_qty > 0)
+                                    {
+                                        wwCount += lack_qty;//记录缺料数量
+                                        if (sct.erp_cls == 3)
+                                        {
+                                            //采购申请
+                                            PackageSRMPR(sct, bangid, sentrys, plan_date, lack_qty, sup.supplier_id.GetValueOrDefault());
+                                        }
+                                        else {
+                                            //1.先生成委外工单。
+                                            var mesorder = CreateMesOOder(sct, lack_qty, 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, lack_qty, sup.supplier_id);
+                                            mesorder.ooentry_stime = mesorder.ooentry_etime.GetValueOrDefault().AddDays(-(srmprDto.totalLeadTime.GetValueOrDefault() - 1));
+                                        }
+                                    }
+                                }
+                                if (sct.erp_cls == 2 && wwCount > 0)
+                                {
+                                    //先计算末级数据的齐套时间。
+                                    if (cilList.Count > 0)
+                                    {
+                                        CalcIcitem(cilList, returnlist, bangid, sklist, wwPlan_data, icitemlist, sentrys, childidList);
+                                        var itemTime = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays((int)maxLeadTime);//加上物料的采购提前期
+                                        if (LongPeriod)
+                                        {
+                                            sct.kitting_time = itemTime;
+                                        }
+                                        else if (itemTime > sct.kitting_time)
+                                        {
+                                            sct.kitting_time = itemTime;
+                                        }
+                                    }
+                                    sct.subcontracting_qty = wwCount;
+                                    sct.subcontracting_list = new List<ooder>();
                                 }
                             }
                         }
-                        else if (sct.erp_cls == 2)
+                        /*else if (sct.erp_cls == 2)
                         {
                             if (param.checkflag || param.checkPlan)
                             {
@@ -1503,7 +1586,7 @@ namespace Business.ResourceExamineManagement
                                     orderList.Add(mesorder);
                                 }
                             }
-                        }
+                        }*/
                         else
                         {
                             if (cilList.Count > 0)
@@ -1540,7 +1623,7 @@ namespace Business.ResourceExamineManagement
             decimal stockQty = sklist.Where(s => s.icitem_id == item.item_id && s.bang_id == bangid).Sum(p => p.quantity);
             item.sqty -= stockQty;
             item.sqty = item.sqty < 0 ? 0 : item.sqty;
-            item.lack_qty = parent.lack_qty * item.qty - item.sqty;
+            item.lack_qty = (parent.lack_qty - parent.mo_qty- parent.purchase_occupy_qty) * item.qty - item.sqty;
             item.lack_qty = item.lack_qty > 0 ? item.lack_qty : 0;
             item.self_lack_qty = item.lack_qty;
             item.stock_state = item.lack_qty > 0 ? 0 : 1;
@@ -1553,12 +1636,16 @@ namespace Business.ResourceExamineManagement
         /// <param name="returnlist"></param>
         /// <param name="factoryid"></param>
         /// <param name="orderType">2委外采购申请单,3采购申请单</param>
-        private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, decimal lack_qty, 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)
+        private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, decimal lack_qty, 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, long? supplier_id)
         {
             SRMPRDto sRMPR = new SRMPRDto();
             //mo_srm_purchase supplier = null;
             var plan = planList.Find(x => x.mysql_id == returnlist.item_id);
             var supplist = supplierList.Where(s => s.icitem_id == returnlist.item_id && s.quota_rate.GetValueOrDefault() > 0).ToList();
+            if (supplier_id != null)
+            {
+                supplist = supplist.Where(s => s.supplier_id == supplier_id).ToList();
+            }
             if (!supplist.Any() || plan == null)
             {
                 returnlist.stock_state = 99;
@@ -1591,18 +1678,26 @@ namespace Business.ResourceExamineManagement
                 srm_Pr.pr_purchaser = supplier.order_rector_name;//采购员
                 srm_Pr.pr_purchaser_num = supplier.order_rector_num;//采购员工号(采购信息表)
 
-
-                srm_Pr.pr_rqty = Math.Ceiling(lack_qty * supplier.quota_rate.GetValueOrDefault() / 100);//需求数量
-
+                if (supplier_id != null)
+                {
+                    srm_Pr.pr_rqty = Math.Ceiling(lack_qty);//需求数量
+                }
+                else {
+                    srm_Pr.pr_rqty = Math.Ceiling(lack_qty * supplier.quota_rate.GetValueOrDefault() / 100);//需求数量
+                }
                 srm_Pr.pr_aqty = srm_Pr.pr_rqty;//申请数量
                 srm_Pr.pr_sqty = srm_Pr.pr_rqty;//建议数量
                 srm_Pr.icitem_id = returnlist.item_id;//物料id
                 srm_Pr.icitem_name = returnlist.item_name;//物料名称
                 srm_Pr.num = returnlist.num;
+                if (ScheduleAgreement)
+                {
+                    supplier.lead_time = 7;//启用计划协议时,默认为7天。
+                }
                 if (plan_date != null)
                 {
                     //-1为提前一天准备
-                    srm_Pr.pr_sarrive_date = plan_date.GetValueOrDefault().AddDays(-1 - (int)(Math.Ceiling(plan.clean_leadtime.GetValueOrDefault())));
+                    srm_Pr.pr_sarrive_date = plan_date.GetValueOrDefault().AddDays(-1 - (int)(Math.Ceiling(plan.clean_leadtime.GetValueOrDefault() + plan.self_inspection_date.GetValueOrDefault())));
                     /*if (LongPeriod)
                     {
                         //提前一个月
@@ -1978,9 +2073,9 @@ namespace Business.ResourceExamineManagement
         /// <summary>
         /// 计算在途
         /// </summary>
-        public decimal CalcInTransit(crm_seorderentry sentrys, BomChildExamineDto item, long bangid, DateTime plan_date)
+        public decimal CalcInTransit(crm_seorderentry sentrys, BomChildExamineDto item, long bangid, DateTime plan_date,decimal suplack_qty,long? supplier_id)
         {
-            if (!LongPeriod)
+            if (LongPeriod)
             {
                 return 0;
             }
@@ -1988,16 +2083,25 @@ namespace Business.ResourceExamineManagement
             _purchaseOrderAppService.srm_Po_Occupies = srm_Po_Occupies; //采购明细
             _purchaseOrderAppService.srm_Pr_Mains = srm_Pr_Mains;//在途PR
             _purchaseOrderAppService.mes_morder = mes_morder;//当前工单传递进去。
-
-            var occupylist = _purchaseOrderAppService.CheckPurchaseOrder(sentrys, item.item_id, item.lack_qty, plan_date, ic_item_List, bangid);
+            DateTime endTime = plan_date;
+            if (ScheduleAgreement)
+            {
+                //启用计划协议时,默认修改时间为最大
+                endTime = plan_date.AddYears(100);
+            }
+            var occupylist = _purchaseOrderAppService.CheckPurchaseOrder(sentrys, item.item_id, suplack_qty, endTime, ic_item_List, supplier_id, bangid);
             decimal occqty = 0;
             if (occupylist.Any())
             {
                 occqty = occupylist.Sum(s => s.qty.GetValueOrDefault());
-                item.purchase_occupy_qty = occqty;
+                item.purchase_occupy_qty += occqty;
                 //item.lack_qty -= occqty;
-                item.purchase_occupy_list = new List<purchase_occupy>();
-                item.kitting_time = occupylist[0].etime;
+                //item.kitting_time = occupylist[0].etime;
+                if (occupylist[0].etime > item.kitting_time)
+                {
+                    item.kitting_time = occupylist[0].etime;
+                }
+                /*item.purchase_occupy_list = new List<purchase_occupy>();
                 occupylist.ForEach(s => {
                     if (mes_morder != null)
                     {
@@ -2016,17 +2120,17 @@ namespace Business.ResourceExamineManagement
                         ocp.po_billno = polist.po_billno;
                     }
                     item.purchase_occupy_list.Add(ocp);
-                });
+                });*/
                 srm_Po_Occupies.AddRange(occupylist);
                 srm_Po_OccupiesInsert.AddRange(occupylist);
             }
             return occqty;
         }
 
-        public SRMPRDto PackageSRMPR(BomChildExamineDto item,long bangid, crm_seorderentry sentrys, DateTime? plan_date, decimal lack_qty)
+        public SRMPRDto PackageSRMPR(BomChildExamineDto item,long bangid, crm_seorderentry sentrys, DateTime? plan_date, decimal lack_qty, long? supplier_id)
         {
             //采购申请
-            var SRMPRDto = CreateSRMPR(item, lack_qty, param.company_id, param.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, ic_item_List, sentrys, plan_date);
+            var SRMPRDto = CreateSRMPR(item, lack_qty, param.company_id, param.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, ic_item_List, sentrys, plan_date, supplier_id);
             item.purchase_list = new List<purchase>();
             if (SRMPRDto.srm_Pr_Main != null)
             {
@@ -2053,7 +2157,7 @@ namespace Business.ResourceExamineManagement
             }
             if (item.erp_cls == 3)
             {
-                item.purchase_qty = lack_qty;
+                item.purchase_qty += lack_qty;
                 item.purchase_list = new List<purchase>();
             }
             if (LongPeriod)//虚拟计算不调整齐套时间

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

@@ -77,13 +77,18 @@ namespace Business.ResourceExamineManagement
         /// <summary>
         /// 检查在途订单
         /// </summary>
-        public List<mo_srm_po_occupy> CheckPurchaseOrder(crm_seorderentry seorderentry, long icitem_id, decimal Quantity, DateTime DeliverDate, List<mo_ic_item> ic_PlanList, long bang_id)
+        public List<mo_srm_po_occupy> CheckPurchaseOrder(crm_seorderentry seorderentry, long icitem_id, decimal Quantity, DateTime DeliverDate, List<mo_ic_item> ic_PlanList, long? supplier_id, long bang_id)
         {
             List<mo_srm_po_occupy> occupyList = new List<mo_srm_po_occupy>();
 
             var ic_Plan = ic_PlanList.Where(x => x.mysql_id == icitem_id).FirstOrDefault();
             //查询出对应物料采购订单明细  --数据未被停用 && 评审通过后
             var poDetailList = mo_Srm_Po_Lists.Where(x => x.icitem_id == icitem_id);
+            if (supplier_id != null)
+            {
+                poDetailList = poDetailList.Where(x => x.pr_purchase_id == supplier_id);
+            }
+            
             //采购订单占用数据
             var poOccupys = srm_Po_Occupies.Where(x => poDetailList.Select(p => p.mysql_id).ToList().Contains(x.polist_id));
 
@@ -130,9 +135,19 @@ namespace Business.ResourceExamineManagement
             if (Quantity > 0)
             {
                 var prlist  = srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && toTime < x.pr_sarrive_date && x.pr_sarrive_date < DeliverDate && x.pr_mono != mes_morder.morder_no).OrderByDescending(f => f.pr_sarrive_date).ToList();
+                if (supplier_id != null)
+                {
+                    prlist = prlist.Where(x => x.pr_purchaseid == supplier_id).ToList();
+                }
                 if (mes_morder != null)
                 {
-                    prlist.AddRange(srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_mono == mes_morder.morder_no).OrderByDescending(f => f.pr_sarrive_date).ToList());
+                    if (supplier_id != null)
+                    {
+                        prlist.AddRange(srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_purchaseid == supplier_id && x.pr_mono == mes_morder.morder_no).OrderByDescending(f => f.pr_sarrive_date).ToList());
+                    }
+                    else {
+                        prlist.AddRange(srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_mono == mes_morder.morder_no).OrderByDescending(f => f.pr_sarrive_date).ToList());
+                    }
                 }
                 foreach (var pr in prlist)
                 {

+ 20 - 5
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -86,6 +86,8 @@ namespace Business.ResourceExamineManagement
         private readonly IRepository<mo_ic_item,long> _ic_item;
         private IRepository<ic_item, long> _mysql_ic_item;
 
+        private IRepository<ic_demandschedule, long> __mysql_ic_demandschedule;
+
         /// <summary>
         /// 物料BOM
         /// </summary>
@@ -425,6 +427,7 @@ namespace Business.ResourceExamineManagement
             IRepository<mo_ic_item_stockoccupy,long> ic_item_stockoccupy,
             IRepository<mo_srm_supplier,long> srm_supplier,
             IRepository<ic_item, long> mysql_ic_item,
+            IRepository<ic_demandschedule, long> mysql_ic_demandschedule,
             IRepository<ic_bom, long> mysql_ic_bom,
             IRepository<ic_bom_child, long> mysql_ic_bom_child,
             IRepository<mes_technique, long> mysql_mes_technique,
@@ -533,6 +536,7 @@ namespace Business.ResourceExamineManagement
             _ic_item_stockoccupy = ic_item_stockoccupy;
             _srm_supplier = srm_supplier;
             _mysql_ic_item = mysql_ic_item;
+            __mysql_ic_demandschedule= mysql_ic_demandschedule;
             _mysql_ic_bom = mysql_ic_bom;
             _mysql_ic_bom_child = mysql_ic_bom_child;
             _mysql_crm_seorder = mysql_crm_seorder;
@@ -2059,7 +2063,7 @@ namespace Business.ResourceExamineManagement
                 await MongoHelper<mo_ic_item_stock>.InsertManyAsync(moIcitemStokc);
             }
 
-            var workordmsters = _workOrdMaster.Select(s => s.Domain == factoryId.ToString() && string.IsNullOrEmpty(s.Status) != true && s.Status.ToLower() != "c");
+            var workordmsters = _workOrdMaster.Select(s => s.Domain == factoryId.ToString() && string.IsNullOrEmpty(s.Status) != true && s.Status.ToLower() != "c" && string.IsNullOrEmpty(s.AnalogCalcVersion) == true);
             if (workordmsters.Any())
             {
                 //根据工单表找到工单明细,然后根据DOP工单占用记录,对比工单明细发货数量,来做冲销。
@@ -2100,7 +2104,7 @@ namespace Business.ResourceExamineManagement
                 }
 
                 //工单主表
-                var mes_morder = _mysql_mes_morder.GetListAsync(x => string.IsNullOrEmpty(x.morder_state) == false && x.morder_state != "完成" && x.company_id == companyId && x.factory_id == factoryId && workordmsters.Select(c => c.WorkOrd).Contains(x.morder_no)).Result;
+                var mes_morder = _mysql_mes_morder.GetListAsync(x => string.IsNullOrEmpty(x.morder_state) == false && x.morder_state != "完成" && x.company_id == companyId && x.factory_id == factoryId && string.IsNullOrEmpty(x.analogcalcversion) == true && workordmsters.Select(c => c.WorkOrd).Contains(x.morder_no)).Result;
                 if (mes_morder.Count > 0)
                 {
                     mes_morder.ForEach(item => { item.bang_id = bangid; });
@@ -2158,7 +2162,7 @@ namespace Business.ResourceExamineManagement
             }
 
             //pr
-            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;
+            var srm_pr_main = _mysql_srm_pr_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && x.state != 0 && string.IsNullOrEmpty(x.analogcalcversion) == true && 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);
@@ -2182,6 +2186,17 @@ namespace Business.ResourceExamineManagement
                     await MongoHelper<mo_srm_po_occupy>.InsertManyAsync(moSrm_pr_occupy);
                 }
             }
+
+            var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "ScheduleAgreement" && s.Domain == factoryId.ToString()).ToList();
+            int ScheduleAgreement = 0;//计划协议
+            if (sysSet.Any())
+            {
+                if (!string.IsNullOrEmpty(sysSet[0].Ufld1))
+                {
+                    int.TryParse(sysSet[0].Ufld1, out ScheduleAgreement);
+                }
+            }
+            _CalcBomViewAppService.ScheduleAgreement = ScheduleAgreement == 1;
         }
 
         /// <summary>
@@ -3524,7 +3539,7 @@ namespace Business.ResourceExamineManagement
                         }
                     }
                 }
-                if (_CalcBomViewAppService.mordersInsertList.Any())
+                /*if (_CalcBomViewAppService.mordersInsertList.Any())
                 {
                     var molist = ObjectMapper.Map<List<mo_mes_morder>, List<mes_morder>>(_CalcBomViewAppService.mordersInsertList);
                     _businessDbContext.BulkInsert(molist);
@@ -3553,7 +3568,7 @@ namespace Business.ResourceExamineManagement
                         }
                         priorityMorderList.AddRange(molist);
                     }
-                }
+                }*/
 
                 //暂时屏蔽重新生成工单物料明细
                 /*List<WorkOrdDetail> mainWorkOrdDetails = new List<WorkOrdDetail>();

+ 96 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ic_demandschedule.cs

@@ -0,0 +1,96 @@
+using Business.Core.Attributes;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Business.Domain
+{
+    /// <summary>
+    /// 交货计划表
+    /// </summary>
+    [Comment("交货计划表")]
+    public class ic_demandschedule : BaseEntity
+    {
+        /// <summary>
+        /// 物料编码
+        /// </summary>
+        [Required]
+        [Comment("物料编码")]
+        [StringLength(80)]
+        public string itemnum { get; set; }
+
+
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        [Comment("版本号")]
+        [StringLength(80)]
+        public string fversion { get; set; }
+
+
+        /// <summary>
+        /// 图号
+        /// </summary>
+        [Comment("图号")]
+        [StringLength(24)]
+        public string drawing { get; set; }
+
+
+        /// <summary>
+        /// 需求日期
+        /// </summary>
+        [Comment("需求日期")]
+        public DateTime requestdate { get; set; }
+
+        /// <summary>
+        /// 建议到货日期
+        /// </summary>
+        [Comment("建议到货日期")]
+        public DateTime arrivaldate { get; set; }
+
+
+        /// <summary>
+        /// 缺料数量
+        /// </summary>
+        [Precision(23, 10)]
+        [Comment("缺料数量")]
+        public decimal shortqty { get; set; }
+
+        /// <summary>
+        /// 车间需求数量=工单需求+已下达工单领料单待发料
+        /// </summary>
+        [Precision(23, 10)]
+        [Comment("车间需求数量=工单需求+已下达工单领料单待发料")]
+        public decimal mesqty { get; set; }
+
+        /// <summary>
+        /// 起初库存数量=1000库+1001库+5007+5008(实时数量)
+        /// </summary>
+        [Precision(23, 10)]
+        [Comment("起初库存数量=1000库+1001库+5007+5008(实时数量)")]
+        public decimal locqty { get; set; }
+
+        /// <summary>
+        /// 在途数量=该物料累计在途(交货单数量-对应此交货单的收货数量1000库)
+        /// </summary>
+        [Precision(23, 10)]
+        [Comment("起初库存数量=1000库+1001库+5007+5008(实时数量)")]
+        public decimal sechedqty { get; set; }
+
+
+        /// <summary>
+        /// 物料净需求数量=H起初库存数量+I在途数量-G车间需求数量
+        /// </summary>
+        [Precision(23, 10)]
+        [Comment("物料净需求数量=H起初库存数量+I在途数量-G车间需求数量")]
+        public decimal tosechedqty { get; set; }
+
+        /// <summary>
+        /// 发布状态(P已发布,其他为未发布)
+        /// </summary>
+        [Comment("发布状态(P已发布,其他为未发布)")]
+        [StringLength(2)]
+        public string status { get; set; }
+    }
+}

+ 7 - 0
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/BusinessDbContextModelCreatingExtensions.cs

@@ -36,6 +36,13 @@ namespace Business.EntityFrameworkCore
                 b.Property(x => x.Id).ValueGeneratedNever();//迁移sqlserver默认是自增,需要配置一下
             });
 
+            builder.Entity<ic_demandschedule>(b =>
+            {
+                b.ToTable("ic_demandschedule");
+                b.ConfigureByConvention();
+                b.Property(x => x.Id).ValueGeneratedNever();//迁移sqlserver默认是自增,需要配置一下
+            });
+
             builder.Entity<ic_item_stock>(b =>
             {
                 b.ToTable("ic_item_stock");

+ 1 - 0
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/DOP/BusinessDbContext.cs

@@ -22,6 +22,7 @@ namespace Business.EntityFrameworkCore
         public DbSet<ic_bom> ic_bom { get; set; }
         public DbSet<ic_bom_child> ic_bom_child { get; set; }
         public DbSet<ic_item> ic_item { get; set; }
+        public DbSet<ic_demandschedule> ic_demandschedule { get; set; }
         public DbSet<ic_item_stock> ic_item_stock { get; set; }
         public DbSet<ic_item_stockoccupy> ic_item_stockoccupy { get; set; }
         public DbSet<ic_substitute> ic_substitute { get; set; }