Переглянути джерело

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

# Conflicts:
#	MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs
heteng 2 роки тому
батько
коміт
cb898c7a77

+ 526 - 165
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -70,6 +70,7 @@ namespace Business.Replenishment
         private readonly IRepository<b_bom_pretreatment, long> _mysql_b_bom_pretreatment;
         private readonly ISqlRepository<WorkOrdMaster> _workOrdMaster;
         private readonly ISqlRepository<ProdLineDetail> _prodLineDetail;
+        private readonly ISqlRepository<LineMaster> _lineMaster;
         private readonly IRepository<mo_ic_bom, long> _ic_bom;
         private readonly IRepository<ic_bom, long> _mysql_ic_bom;
         private readonly IRepository<mo_ic_bom_child, long> _ic_bom_child;
@@ -109,11 +110,11 @@ namespace Business.Replenishment
         private readonly IRepository<b_examine_result, long> _mysql_examine_result;
         private readonly IRepository<b_bom_child_examine, long> _mysql_bom_child_examine;
         private readonly IRepository<ReplenishmentServiceLevel, long> _replenishmentServiceLevel;
-        private readonly ISqlRepository<DMS_IN_ITEMMAPPING> _DMS_IN_ITEMMAPPING;
-        private readonly ISqlRepository<DMS_IN_LOCDETAIL> _DMS_IN_LOCDETAIL;
-        private readonly ISqlRepository<DMS_IN_PODETAIL> _DMS_IN_PODETAIL;
-        private readonly ISqlRepository<DMS_IN_RETAILER> _DMS_IN_RETAILER;
-        private readonly ISqlRepository<DMS_IN_SHIPPINGDETAIL> _DMS_IN_SHIPPINGDETAIL;
+        private readonly IExtSqlRepository<DMS_IN_ITEMMAPPING> _DMS_IN_ITEMMAPPING;
+        private readonly IExtSqlRepository<DMS_IN_LOCDETAIL> _DMS_IN_LOCDETAIL;
+        private readonly IExtSqlRepository<DMS_IN_PODETAIL> _DMS_IN_PODETAIL;
+        private readonly IExtSqlRepository<DMS_IN_RETAILER> _DMS_IN_RETAILER;
+        private readonly IExtSqlRepository<DMS_IN_SHIPPINGDETAIL> _DMS_IN_SHIPPINGDETAIL;
         private readonly IRepository<ReplenishmentTurnOverSet> _ReplenishmentTurnOverSet;
 
         /// <summary>
@@ -264,6 +265,7 @@ namespace Business.Replenishment
             IRepository<b_bom_pretreatment, long> mysql_b_bom_pretreatment,
             ISqlRepository<WorkOrdMaster> workOrdMaster,
             ISqlRepository<ProdLineDetail> prodLineDetail,
+            ISqlRepository<LineMaster> lineMaster,
             IRepository<mo_ic_bom, long> ic_bom,
             IRepository<ic_bom, long> mysql_ic_bom,
             IRepository<mo_ic_bom_child, long> ic_bom_child,
@@ -314,11 +316,11 @@ namespace Business.Replenishment
             IRepository<b_bom_child_examine, long> mysql_bom_child_examine,
             IRepository<ReplenishmentServiceLevel, long> replenishmentServiceLevel,
 
-            ISqlRepository<DMS_IN_ITEMMAPPING> DMS_IN_ITEMMAPPING,
-            ISqlRepository<DMS_IN_LOCDETAIL> DMS_IN_LOCDETAIL,
-            ISqlRepository<DMS_IN_PODETAIL> DMS_IN_PODETAIL,
-            ISqlRepository<DMS_IN_RETAILER> DMS_IN_RETAILER,
-            ISqlRepository<DMS_IN_SHIPPINGDETAIL> DMS_IN_SHIPPINGDETAIL,
+            IExtSqlRepository<DMS_IN_ITEMMAPPING> DMS_IN_ITEMMAPPING,
+            IExtSqlRepository<DMS_IN_LOCDETAIL> DMS_IN_LOCDETAIL,
+            IExtSqlRepository<DMS_IN_PODETAIL> DMS_IN_PODETAIL,
+            IExtSqlRepository<DMS_IN_RETAILER> DMS_IN_RETAILER,
+            IExtSqlRepository<DMS_IN_SHIPPINGDETAIL> DMS_IN_SHIPPINGDETAIL,
             IRepository<ReplenishmentTurnOverSet> ReplenishmentTurnOverSet,
 
             SerialNumberAppService serialNumberAppService,
@@ -357,6 +359,7 @@ namespace Business.Replenishment
             _workOrdMaster = workOrdMaster;
             _custMaster=custMaster;
             _prodLineDetail = prodLineDetail;
+            _lineMaster= lineMaster;
             _ic_bom = ic_bom;
             _mysql_ic_bom = mysql_ic_bom;
             _ic_bom_child = ic_bom_child;
@@ -444,8 +447,12 @@ namespace Business.Replenishment
             var routingOpList = routingOps.Where(x => x.Ufld1 == "组装" && x.MilestoneOp).ToList();
             //生产线明细表
             List<ProdLineDetail> prodLines = _prodLineDetail.Select(p => sapItemList.Contains(p.Part) && p.Domain == input.factory_id.ToString() && p.IsActive && routingOpList.Select(m => m.Op).Contains(p.Op)).OrderBy(x => x.Sequence).ToList();
+            List<LineMaster> lineMasters = _lineMaster.Select(p => prodLines.Select(a=>a.Line).Contains(p.Line) && p.Domain == input.factory_id.ToString() && p.IsActive).ToList();
             List<LocationDetail> locations = _locationDetail.Select(x => sapItemList.Contains(x.ItemNum) && x.Domain == input.factory_id.ToString() && x.IsActive).ToList();
             //平台库存
+            var DMSItemList = _DMS_IN_ITEMMAPPING.Select(a => sapItemList.Contains(a.CfnERPCode));
+            var gkhwStock = _DMS_IN_LOCDETAIL.Select(a => (a.DealerCode == "RQ000005" || a.DealerCode == "RQ000002"));
+
             var platformInvList = _PlatformInventory.GetListAsync(a => sapItemList.Contains(a.SAPItemNumber) && a.factory_id == input.factory_id && !a.IsDeleted).Result;
             // 获取某年某月的起始日期和结束日期
             int year = input.year;
@@ -499,7 +506,26 @@ namespace Business.Replenishment
                 //5008  成品线边库  8001 成品合格库  8000成品待检 8002 不合格
                 var locationList = locations.Where(x => x.ItemNum == item.SAPItemNumber && (x.Location=="5008" || x.Location=="8000" || x.Location=="8001")).ToList();
                 //平台数据
-                var platformInvs = platformInvList.Where(x => x.SAPItemNumber == item.SAPItemNumber).ToList();
+                decimal? hwStock = 0;
+                if (DMSItemList.Find(d => d.CfnERPCode == item.SAPItemNumber) != null)
+                {
+                    var itemDMS = gkhwStock.Where(o => o.UPN == DMSItemList.Find(d => d.CfnERPCode == item.SAPItemNumber).CfnCode && o.DealerCode == "RQ000002").ToList();
+                    if (itemDMS.Count > 0)
+                    {
+                        var maxDate = itemDMS.OrderByDescending(i => i.InventoryDate).First();
+                        hwStock = itemDMS.Where(i => i.InventoryDate == maxDate.InventoryDate).Sum(q => q.Qty);
+                    }
+                }
+                decimal? gkStock = 0;
+                if (DMSItemList.Find(d => d.CfnERPCode == item.SAPItemNumber) != null)
+                {
+                    var itemDMS = gkhwStock.Where(o => o.UPN == DMSItemList.Find(d => d.CfnERPCode == item.SAPItemNumber).CfnCode && o.DealerCode == "RQ000005").ToList();
+                    if (itemDMS.Count > 0)
+                    {
+                        var maxDate = itemDMS.OrderByDescending(i => i.InventoryDate).First();
+                        gkStock = itemDMS.Where(i => i.InventoryDate == maxDate.InventoryDate).Sum(q => q.Qty);
+                    }
+                }
                 //销售预测 对应 Excel中公式 AVERAGE 如果预测为0不参与计算排产批量
                 var QtySum = yearDemands.Where(x => x.SAPItemNumber == item.SAPItemNumber && x.Qty > 0).ToList();
                 //排产批量:(AVG(1 - 12月销售预测)/ 100 )=(0.45 = 1 小数向上取整)  *100 = 100
@@ -511,7 +537,7 @@ namespace Business.Replenishment
                 {
                     itemInProduct = dictInProduction[item.SAPItemNumber];
                 }
-                var locationSum = (locationList.Count == 0 ? 0 : locationList.Sum(x => x.QtyOnHand)) + (platformInvs.Count == 0 ? 0 : platformInvs.Sum(x => x.InventoryQuantity)) + (ship.Count == 0 ? 0 : ship.Sum(x => x.RealQty)) + itemInProduct + 0;
+                var locationSum = (locationList.Count == 0 ? 0 : locationList.Sum(x => x.QtyOnHand)) + gkStock+ hwStock + (ship.Count == 0 ? 0 : ship.Sum(x => x.RealQty)) + itemInProduct + 0;
                 //前面N个月的生产数量
                 var frontQtySum = annualProductionOutlines.Sum(x => x.Qty);
                 //生产数量:3月为例子,if((库存合计和前2月生产数量)-(前2个月销售预测数据)-当月销售预测数据 / 2 < 0)
@@ -534,7 +560,15 @@ namespace Business.Replenishment
                 annualProductionOutline.Area = item.Area;
                 annualProductionOutline.ProdLine = item.ProdLine;
                 annualProductionOutline.ProdRange = item.ProdRange;
-                annualProductionOutline.WorkshopLine = prodLine == null ? "" : prodLine.Line;
+                if(prodLine == null)
+                {
+                    annualProductionOutline.WorkshopLine ="";
+                }
+                else
+                {
+                    annualProductionOutline.WorkshopLine = lineMasters.Find(b => b.Line == prodLine.Line).Describe;
+                }
+                
                 annualProductionOutline.SAPItemNumber = item.SAPItemNumber;
                 annualProductionOutline.Model = item.Model;
                 annualProductionOutline.Languages = item.Languages;
@@ -1059,6 +1093,7 @@ namespace Business.Replenishment
                             rop.eop = Math.Ceiling(rop.monthl_avg_demand.Value * rop.supply_leadtime.Value / DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));
                             rop.rop_computed = rop.security_stock + rop.eop;
                             rop.max_stock_level = rop.monthl_avg_outstock * (12 / rop.stock_turnover);
+                            //瑞奇是ROP和最高库存值两者之间取较小的值,平台是取较大的值。
                             rop.rop_revised = Math.Min(rop.rop_computed.Value, rop.max_stock_level.Value);
                             rop.isparam = true;
                             rop.tenant_id = input.tenant_id;
@@ -1261,7 +1296,8 @@ namespace Business.Replenishment
                 rop.eop = Math.Ceiling(rop.monthl_avg_demand.Value * rop.supply_leadtime.Value / DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));
                 rop.rop_computed = rop.security_stock + rop.eop;
                 rop.max_stock_level = rop.monthl_avg_outstock * (12 / rop.stock_turnover);
-                rop.rop_revised = Math.Min(rop.rop_computed.Value, rop.max_stock_level.Value);
+                //瑞奇是ROP和最高库存值两者之间取较小的值,平台是取较大的值。
+                rop.rop_revised = Math.Max(rop.rop_computed.Value, rop.max_stock_level.Value);
                 rop.isparam = true;
                 rop.tenant_id = input.tenant_id;
                 rop.factory_id = input.factory_id;
@@ -1290,12 +1326,46 @@ namespace Business.Replenishment
         {
             //1.获取补货模型全局参数
             ReplenishmentDto replenishmentDto = GetROPParam(input.factory_id.ToString());
-            //获取月度发货计划(一次导入三个月的销售预测),因为是固定格式yyyy-MM所以可以用字符串比较,避免写很多字符串判断相等
+            //获取月度发货计划(一次导入三个月的发货计划),因为是固定格式yyyy-MM所以可以用字符串比较,避免写很多字符串判断相等
             string planMonth = $"{DateTime.Now.Year}-{DateTime.Now.Month.ToString("00")}";
             string planMonthMax = $"{DateTime.Now.AddMonths(replenishmentDto.SaleFcstMonth).Year}-{DateTime.Now.AddMonths(replenishmentDto.SaleFcstMonth).Month.ToString("00")}";
             var planList = _monthlyShipmentPlan.Select(a => a.PlanMonth.CompareTo(planMonth) >= 0 && a.PlanMonth.CompareTo(planMonthMax) <= 0 && !a.IsDeleted).ToList();
             //发货计划物料列表
             List<string> planItemList = planList?.Select(a => a.SAPItemNumber).Distinct().ToList();
+
+            List<LocationDetail> locations = _locationDetail.Select(x => planItemList.Contains(x.ItemNum) && x.Domain == input.factory_id.ToString() && x.IsActive).ToList();
+            //平台库存
+            var DMSItemList = _DMS_IN_ITEMMAPPING.Select(a => planList.Select(p => p.SAPItemNumber).ToList().Contains(a.CfnERPCode));
+            var gkhwStock = _DMS_IN_LOCDETAIL.Select(a => (a.DealerCode == "RQ000005" || a.DealerCode == "RQ000002"));
+            #region 在制数量
+            //获取在制数量 获取工单数取每年4月到12月底的工单
+            DateTime startYear = new DateTime(DateTime.Now.Year, 4, 1);
+            DateTime endYear = new DateTime(DateTime.Now.Year, 12, 31);
+            List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.Select(x => x.IsActive && x.QtyComplete > 0 && x.Domain == input.factory_id.ToString()).Where(p => p.DueDate >= startYear && p.DueDate <= endYear).ToList();
+            decimal? InProductionQty = 0.00m;
+            var workOrds = workOrdRoutings.GroupBy(x => x.WorkOrd).ToList();
+            Dictionary<string, decimal> dictInProduction = new Dictionary<string, decimal>();
+            //按照工单循环
+            //某工单10-90工序   Max(10-80工序QtyComplete)-90工序QtyComplete =在制数量
+            foreach (var item in workOrds)
+            {
+                var workOrdRoutingList = workOrdRoutings.Where(x => x.WorkOrd == item.Key).OrderByDescending(o => o.OP).ToList();
+                //找出最大工序
+                var MaxOp = workOrdRoutingList.FirstOrDefault();
+                //查询出其他工序最大值
+                var MaxQtyComplete = workOrdRoutingList.Where(x => x.RecID != MaxOp.RecID).ToList().Max(o => o.QtyComplete);
+                InProductionQty += MaxQtyComplete - MaxOp.QtyComplete;
+                if (dictInProduction.ContainsKey(MaxOp.ItemNum))
+                {
+                    dictInProduction[MaxOp.ItemNum] += InProductionQty.Value;
+                }
+                else
+                {
+                    dictInProduction.Add(MaxOp.ItemNum, InProductionQty.Value);
+                }
+            }
+            #endregion
+
             var itemList = _ic_item.GetListAsync(a => planList.Select(p => p.SAPItemNumber).Contains(a.number) && !a.IsDeleted).Result;
             var bomList = _ic_bom.GetListAsync(a => planItemList.Contains(a.item_number) && !a.IsDeleted && a.factory_id == input.factory_id).Result;
             var monthPlan = _productionMasterPlan.GetListAsync(a => planItemList.Contains(a.ItemNumber) && !a.IsDeleted && a.factory_id == input.factory_id).Result;
@@ -1305,124 +1375,404 @@ namespace Business.Replenishment
             List<mes_morder> moList = new List<mes_morder>();
             List<mes_moentry> moentryList = new List<mes_moentry>();
             List<ReplenishmentWeekPlan> weekPlan = new List<ReplenishmentWeekPlan>();
+            List<ReplenishmentWeekPlan> weekPlanUpdate = new List<ReplenishmentWeekPlan>();
             long bang_id = help.NextId();
             DateTime currentTime = DateTime.Now;
             int week = Convert.ToInt32(currentTime.DayOfWeek);
             week = week == 0 ? 7 : week;
-
             int count = planItemList.Count * 12*3;//瑞奇国科海王
             var list = _serialNumberAppService.GetBillNo(input.factory_id.ToString(), "MPO", count, "", 1);
             var nbrlistDto = _serialNumberAppService.GetBillNo(input.factory_id.ToString(), "M5", count, "", 1);
             int j = 0;
-            for (int i=0;i<12;i++)
+            //滚动三个月12周的周计划,已经发布的周计划不改(TODO:删除未来未发布的周计划和工单(是否影响资源检查)) 
+            //最小经济批量
+            var weekPlanDelete=_replenishmentWeekPlan.GetListAsync(a => a.ProductionStatus != "已发布" && a.IsReplenishmentModel=="N" && a.factory_id==input.factory_id).Result;
+            var workOrderDelete = weekPlanDelete.Select(b => b.ProductionOrder).ToList();
+            _workOrdMaster.Delete(a => workOrderDelete.Contains(a.WorkOrd) && a.Domain == input.factory_id.ToString());
+            _workOrdRouting.Delete(a => workOrderDelete.Contains(a.WorkOrd) && a.Domain == input.factory_id.ToString());
+            _workOrdDetail.Delete(a => workOrderDelete.Contains(a.WorkOrd) && a.Domain == input.factory_id.ToString());
+            await _mysql_mes_morder.DeleteAsync(a=>workOrderDelete.Contains(a.morder_no) && a.factory_id == input.factory_id);
+            await _mysql_mes_moentry.DeleteAsync(a => workOrderDelete.Contains(a.moentry_mono) && a.factory_id == input.factory_id);
+            var examine_result=_mysql_examine_result.GetListAsync(a => workOrderDelete.Contains(a.morder_no) && a.factory_id == input.factory_id).Result;
+            await _mysql_bom_child_examine.DeleteAsync(a => examine_result.Select(b => b.Id).ToList().Contains(a.examine_id.Value) && a.factory_id == input.factory_id);
+            await _mysql_examine_result.DeleteManyAsync(examine_result);
+            await _replenishmentWeekPlan.HardDeleteAsync(weekPlanDelete);
+
+            List<string> weeks = new List<string>();
+            for(int k=0;k<3;k++)
+            {
+                string kMonth = $"{DateTime.Now.AddMonths(k).Year}-{DateTime.Now.AddMonths(k).Month.ToString("00")}";
+                var kTime = DateTime.Now.AddMonths(k);
+                kTime = kTime.AddDays(1 - kTime.Day);//某月第一天
+                for (int w = 0; w < 4; w++)
+                {
+                    weeks.Add($"WK{GetWeekOfYear(kTime.AddDays(1 - week + 7 * (w + 1))).ToString("00")}");
+                }
+            }
+            //周生产计划
+            var weekPlanList=_replenishmentWeekPlan.GetListAsync(a => a.ProductionStatus == "已发布" && a.IsReplenishmentModel == "N"  && weeks.Contains(a.Week)).Result;
+            //周补货计划
+            var weekRepPlanList = _replenishmentWeekPlan.GetListAsync(a => a.IsReplenishmentModel == "Y" && weeks.Contains(a.Week)).Result;
+            for (int k=0;k<3;k++)
             {
-                planList.Where(c=>c.PlanMonth== planMonth).ToList().ForEach(a =>
+                string kMonth = $"{DateTime.Now.AddMonths(k).Year}-{DateTime.Now.AddMonths(k).Month.ToString("00")}";
+                planList.Where(c => c.PlanMonth == kMonth).ToList().ForEach(a =>
                 {
-                    var ic_item = itemList.Find(x => x.number == a.SAPItemNumber);
-                    var itemrop= ropModelList.Find(x=>x.number == a.SAPItemNumber);
-                    var monthPlanItem = monthPlan.Find(x => x.ItemNumber == a.SAPItemNumber);
-                    if (ic_item?.erp_cls == 1 && itemrop!=null)
+                    var kTime = Convert.ToDateTime(DateTime.Now.ToString("D").ToString()).AddMonths(k);
+                    kTime = kTime.AddDays(1 - kTime.Day);//某月第一天
+                    decimal? publishQty = 0;
+                    int publishWeeks = 0;
+                    for (int w = 0; w < 4; w++)
                     {
-                        var bom = bomList.Find(b => b.item_number == a.SAPItemNumber);
-                        mes_morder mes_Morder = new mes_morder();
-                        mes_Morder.GenerateNewId(help.NextId());
-                        mes_Morder.morder_type = MorderEnum.JhMorder;
-                        //mes_Morder.morder_icitem_type
-                        mes_Morder.work_order_type = MorderEnum.CgMorder;
-                        mes_Morder.morder_state = MorderEnum.Initial_state;
-                        mes_Morder.morder_no = list[j].NbrResult.ToString();
-                        mes_Morder.fms_number = ic_item.fms_number;
-                        mes_Morder.bom_number = bom.bom_number;
-                        mes_Morder.fmodel = ic_item.model;
-                        mes_Morder.urgent = 1;
-                        mes_Morder.moentry_startup_status = 0;
-                        mes_Morder.tenant_id = input.tenant_id;
-                        mes_Morder.factory_id = input.factory_id;
-                        mes_Morder.company_id = input.company_id;
-                        mes_Morder.org_id = input.org_id;
-                        mes_Morder.product_code = ic_item.number;
-                        mes_Morder.product_name = ic_item.name;
-                        mes_Morder.morder_date = DateTime.Now.Date.AddDays(1);
-                        //成品半成品取周一开始 + 取供应提前期为结束时间
-                        mes_Morder.moentry_sys_stime = currentTime.AddDays(1 - week + 7 * (i + 1));
-                        mes_Morder.moentry_sys_etime = currentTime.AddDays(1 - week + 7*(i+1)+ Convert.ToDouble(itemrop.supply_leadtime));
-                        //mes_Morder.morder_fstate = "计划";
-                        //TODO:目前没有取值位置
-                        mes_Morder.moentry_prd = null;
-                        mes_Morder.moentry_prdname = null;
-                        mes_Morder.moentry_wrkc = null;
-                        mes_Morder.moentry_wrkcname = null;
-                        mes_Morder.picking_qty = 0;
-                        //TODO:可删除主表字段
-                        mes_Morder.unit = ic_item.unit;
-                        mes_Morder.morder_production_number =Math.Ceiling(itemrop.eop.GetValueOrDefault()/4);
-                        mes_Morder.need_number = Math.Ceiling(itemrop.eop.GetValueOrDefault() / 4);
-                        mes_Morder.remaining_number = 0;
-                        mes_Morder.create_time = DateTime.Now;
-                        mes_Morder.bang_id = bang_id;
-                        //生成工单子表数据
-                        mes_moentry mes_Moentry = new mes_moentry();
-                        mes_Moentry.GenerateNewId(help.NextId());
-                        mes_Moentry.moentry_moid = mes_Morder.Id;
-                        mes_Moentry.moentry_mono = mes_Morder.morder_no;
-                        mes_Moentry.unit = ic_item.unit;
-                        mes_Moentry.morder_production_number = Math.Ceiling(itemrop.eop.GetValueOrDefault() / 4);
-                        mes_Moentry.need_number = Math.Ceiling(itemrop.eop.GetValueOrDefault() / 4);
-                        mes_Moentry.remaining_number = 0;
-                        mes_Moentry.tenant_id = input.tenant_id;
-                        mes_Moentry.factory_id = input.factory_id;
-                        mes_Moentry.company_id = input.company_id;
-                        mes_Moentry.org_id = input.org_id;
-                        mes_Moentry.create_time = DateTime.Now;
-                        mes_Moentry.bang_id = bang_id;
-                        moList.Add(mes_Morder);
-                        moentryList.Add(mes_Moentry);
-
-                        ReplenishmentWeekPlan weekItem = new ReplenishmentWeekPlan();
-                        weekItem.Priority = 1;
-                        weekItem.Area = itemrop.area;
-                        weekItem.PlanStartDate = mes_Morder.moentry_sys_stime.GetValueOrDefault();
-                        weekItem.Week =$"WK{GetWeekOfYear(mes_Morder.moentry_sys_stime.Value).ToString("00")}";
-                        weekItem.OrderNO = list[j].NbrResult.ToString();
-                        weekItem.ProductionOrder = nbrlistDto[j].NbrResult.ToString();
-                        weekItem.SAPOrderNO = "";
-                        weekItem.OrderType = "量产";
-                        weekItem.ProductionBatch = "";
-                        weekItem.ProductionStatus = "";
-                        weekItem.ProdLine =a.ProdLine;
-                        weekItem.ProdRange =a.ProdRange;
-                        weekItem.Line = monthPlanItem.WorkshopLine;
-                        weekItem.ItemNumber =a.SAPItemNumber;
-                        weekItem.Model =a.Model;
-                        weekItem.Languages =a.Languages;
-                        weekItem.Qty = mes_Morder.morder_production_number.Value;
-                        weekItem.ItemStatus = "";
-                        weekItem.PlanKittingDate = DateTime.Now;
-                        weekItem.tenant_id = input.tenant_id;
-                        weekItem.factory_id = input.factory_id;
-                        weekItem.company_id = input.company_id;
-                        weekItem.org_id = input.org_id;
-                        weekItem.create_time = DateTime.Now;
-                        weekItem.DistributionChannel = a.DistributionChannel;
-                        if (itemrop.area=="国内" || itemrop.area == "中国")
-                        {
-                            weekItem.SterilizationDate = mes_Morder.moentry_sys_etime.Value;
-                            weekItem.InStockDate = mes_Morder.moentry_sys_etime.Value.AddDays(8);
-                        }
-                        else
+                        var weekMonth= $"WK{GetWeekOfYear(kTime.AddDays(7 * w)).ToString("00")}";
+                        var ic_item = itemList.Find(x => x.number == a.SAPItemNumber);
+                        var itemrop = ropModelList.Find(x => x.number == a.SAPItemNumber && x.distributionchannel==a.DistributionChannel && x.zero_based_seqno==0);
+                        var monthPlanItem = monthPlan.Find(x => x.ItemNumber == a.SAPItemNumber);
+                        if (ic_item?.erp_cls == 1 && itemrop != null)
                         {
-                            weekItem.SterilizationDate = mes_Morder.moentry_sys_etime.Value;
-                            weekItem.InStockDate = mes_Morder.moentry_sys_etime.Value.AddDays(15);
+                            //存在已经发布的周生产计划该周不变化
+                            if (weekPlanList.Any(p => p.ItemNumber == a.SAPItemNumber && p.Week == weekMonth && p.DistributionChannel == a.DistributionChannel))
+                            {
+                                publishWeeks++;
+                                publishQty += weekPlanList.Find(p => p.ItemNumber == a.SAPItemNumber && p.Week == weekMonth && p.DistributionChannel == a.DistributionChannel).Qty;
+                                continue;
+                            }
+
+                            //只更新本周以后的周补货计划
+                            if (weekRepPlanList.Any(p => p.ItemNumber == a.SAPItemNumber && p.Week == weekMonth && p.DistributionChannel == a.DistributionChannel))
+                            {
+                                if (GetWeekOfYear(kTime.AddDays(7 * w)) > GetWeekOfYear(DateTime.Now))
+                                {
+                                    var PlanUpdate = weekRepPlanList.Find(p => p.ItemNumber == a.SAPItemNumber && p.Week == weekMonth && p.DistributionChannel == a.DistributionChannel);
+                                    PlanUpdate.Qty = Math.Ceiling((itemrop.eop.GetValueOrDefault() - publishQty.GetValueOrDefault()) / (4 - publishWeeks));
+                                    weekPlanUpdate.Add(PlanUpdate);
+                                }
+                            }else
+                            {
+                                ReplenishmentWeekPlan weekItem = new ReplenishmentWeekPlan();
+                                weekItem.Priority = 1;
+                                weekItem.Area = itemrop.area;
+                                weekItem.PlanStartDate = kTime.AddDays(7 * w);
+                                weekItem.Week = weekMonth;
+                                weekItem.OrderNO ="";
+                                weekItem.ProductionOrder ="";
+                                weekItem.SAPOrderNO = "";
+                                weekItem.OrderType = "量产";
+                                weekItem.ProductionBatch = "";
+                                weekItem.ProductionStatus = "";
+                                weekItem.ProdLine = a.ProdLine;
+                                weekItem.ProdRange = a.ProdRange;
+                                weekItem.Line = monthPlanItem.WorkshopLine;
+                                weekItem.ItemNumber = a.SAPItemNumber;
+                                weekItem.Model = a.Model;
+                                weekItem.Languages = a.Languages;
+                                weekItem.Qty = Math.Ceiling((itemrop.eop.GetValueOrDefault() - publishQty.GetValueOrDefault()) / (4 - publishWeeks));
+                                weekItem.ItemStatus = "";
+                                weekItem.PlanKittingDate = DateTime.Now;
+                                weekItem.tenant_id = input.tenant_id;
+                                weekItem.factory_id = input.factory_id;
+                                weekItem.company_id = input.company_id;
+                                weekItem.org_id = input.org_id;
+                                weekItem.create_time = DateTime.Now;
+                                weekItem.DistributionChannel = a.DistributionChannel;
+                                weekItem.IsReplenishmentModel = "Y";
+                                if (itemrop.area == "国内" || itemrop.area == "中国")
+                                {
+                                    weekItem.SterilizationDate = kTime.AddDays(7 * w + Convert.ToDouble(itemrop.supply_leadtime));
+                                    weekItem.InStockDate = weekItem.SterilizationDate.Value.AddDays(15);
+                                }
+                                else
+                                {
+                                    weekItem.SterilizationDate = kTime.AddDays(7 * w + Convert.ToDouble(itemrop.supply_leadtime));
+                                    weekItem.InStockDate = weekItem.SterilizationDate.Value.AddDays(8);
+                                }
+                                weekItem.AssembleHours = 0;
+                                weekItem.HeatSealHours = 0;
+                                weekItem.PackageHours = 0;
+                                weekItem.TotalHours = 0;
+                                weekPlan.Add(weekItem);
+                            }
+
+                            
+                            var bom = bomList.Find(b => b.item_number == a.SAPItemNumber);
+                            if(moList.Any(m=> m.bom_number == bom.bom_number &&
+                                   m.product_code == ic_item.number &&
+                                   m.moentry_sys_stime == kTime.AddDays(7 * w) &&
+                                   m.moentry_sys_etime == kTime.AddDays(7 * w + Convert.ToDouble(itemrop.supply_leadtime))))
+                            {
+                                for (int x = 0; x < moList.Count; x++)
+                                {
+                                    if (moList[x].bom_number == bom.bom_number &&
+                                       moList[x].product_code == ic_item.number &&
+                                       moList[x].moentry_sys_stime == kTime.AddDays(7 * w) &&
+                                       moList[x].moentry_sys_etime == kTime.AddDays(7 * w + Convert.ToDouble(itemrop.supply_leadtime)))
+                                    {
+                                        moList[x].morder_production_number += Math.Ceiling(((itemrop.eop - publishQty) / (4 - publishWeeks)).GetValueOrDefault());
+                                        moList[x].need_number += Math.Ceiling(((itemrop.eop - publishQty) / (4 - publishWeeks)).GetValueOrDefault());
+                                        moentryList[x].morder_production_number += Math.Ceiling(((itemrop.eop - publishQty) / (4 - publishWeeks)).GetValueOrDefault());
+                                        moentryList[x].need_number += Math.Ceiling(((itemrop.eop - publishQty) / (4 - publishWeeks)).GetValueOrDefault());
+                                    }
+                                    break;
+                                }
+                            }else
+                            {
+                                //5008  成品线边库  8001 成品合格库  8000成品待检 8002 不合格
+                                var locationList = locations.Where(x => x.ItemNum == a.SAPItemNumber && (x.Location == "5008" || x.Location == "8000" || x.Location == "8001")).ToList();
+                                //平台数据
+                                decimal itemInProduct = 0;
+                                if (dictInProduction.ContainsKey(a.SAPItemNumber))
+                                {
+                                    itemInProduct = dictInProduction[a.SAPItemNumber];
+                                }
+                                //平台数据
+                                decimal? hwStock = 0;
+                                if (DMSItemList.Find(d => d.CfnERPCode == a.SAPItemNumber) != null)
+                                {
+                                    var itemDMS = gkhwStock.Where(o => o.UPN == DMSItemList.Find(d => d.CfnERPCode == a.SAPItemNumber).CfnCode && o.DealerCode == "RQ000002").ToList();
+                                    if (itemDMS.Count > 0)
+                                    {
+                                        var maxDate = itemDMS.OrderByDescending(i => i.InventoryDate).First();
+                                        hwStock = itemDMS.Where(i => i.InventoryDate == maxDate.InventoryDate).Sum(q => q.Qty);
+                                    }
+                                }
+                                decimal? gkStock = 0;
+                                if (DMSItemList.Find(d => d.CfnERPCode == a.SAPItemNumber) != null)
+                                {
+                                    var itemDMS = gkhwStock.Where(o => o.UPN == DMSItemList.Find(d => d.CfnERPCode == a.SAPItemNumber).CfnCode && o.DealerCode == "RQ000005").ToList();
+                                    if (itemDMS.Count > 0)
+                                    {
+                                        var maxDate = itemDMS.OrderByDescending(i => i.InventoryDate).First();
+                                        gkStock = itemDMS.Where(i => i.InventoryDate == maxDate.InventoryDate).Sum(q => q.Qty);
+                                    }
+                                }
+                                //库存合计 + 在制 + 灭菌中 TODO: 灭菌中取值待确定
+                                decimal? locationSum = 0;
+                                if (a.DistributionChannel=="瑞奇")
+                                {
+                                    locationSum = locationList.Count == 0 ? 0 : locationList.Sum(x => x.QtyOnHand)+ itemInProduct + 0;
+                                }else if(a.DistributionChannel=="国科")
+                                {
+                                    locationSum = gkStock;
+                                }
+                                else if(a.DistributionChannel == "海王")
+                                {
+                                    locationSum = hwStock;
+                                }
+                                mes_morder mes_Morder = new mes_morder();
+                                mes_Morder.GenerateNewId(help.NextId());
+                                mes_Morder.morder_type = MorderEnum.JhMorder;
+                                mes_Morder.work_order_type = MorderEnum.CgMorder;
+                                mes_Morder.morder_state = MorderEnum.Initial_state;
+                                mes_Morder.morder_no = list[j].NbrResult.ToString();
+                                mes_Morder.fms_number = ic_item.fms_number;
+                                mes_Morder.bom_number = bom.bom_number;
+                                mes_Morder.fmodel = ic_item.model;
+                                mes_Morder.urgent = 1;
+                                mes_Morder.moentry_startup_status = 0;
+                                mes_Morder.tenant_id = input.tenant_id;
+                                mes_Morder.factory_id = input.factory_id;
+                                mes_Morder.company_id = input.company_id;
+                                mes_Morder.org_id = input.org_id;
+                                mes_Morder.product_code = ic_item.number;
+                                mes_Morder.product_name = ic_item.name;
+                                mes_Morder.morder_date = DateTime.Now.Date.AddDays(1);
+                                //成品半成品取周一开始 + 取供应提前期为结束时间
+                                mes_Morder.moentry_sys_stime = kTime.AddDays(7 * w);
+                                mes_Morder.moentry_sys_etime = kTime.AddDays(7 * w + Convert.ToDouble(itemrop.supply_leadtime));
+                                //mes_Morder.morder_fstate = "计划";
+                                //TODO:目前没有取值位置
+                                mes_Morder.moentry_prd = null;
+                                mes_Morder.moentry_prdname = null;
+                                mes_Morder.moentry_wrkc = null;
+                                mes_Morder.moentry_wrkcname = null;
+                                mes_Morder.picking_qty = 0;
+                                //TODO:可删除主表字段
+                                mes_Morder.unit = ic_item.unit;
+                                mes_Morder.morder_production_number = Math.Ceiling(((itemrop.eop - publishQty- locationSum) / (4 - publishWeeks)).GetValueOrDefault());
+                                mes_Morder.need_number = Math.Ceiling(((itemrop.eop- publishQty- locationSum) / (4 - publishWeeks)).GetValueOrDefault());
+                                mes_Morder.remaining_number = 0;
+                                mes_Morder.create_time = DateTime.Now;
+                                mes_Morder.bang_id = bang_id;
+                                //生成工单子表数据
+                                mes_moentry mes_Moentry = new mes_moentry();
+                                mes_Moentry.GenerateNewId(help.NextId());
+                                mes_Moentry.moentry_moid = mes_Morder.Id;
+                                mes_Moentry.moentry_mono = mes_Morder.morder_no;
+                                mes_Moentry.unit = ic_item.unit;
+                                mes_Moentry.morder_production_number = Math.Ceiling(((itemrop.eop - publishQty- locationSum) / (4 - publishWeeks)).GetValueOrDefault());
+                                mes_Moentry.need_number = Math.Ceiling(((itemrop.eop - publishQty- locationSum) / (4 - publishWeeks)).GetValueOrDefault());
+                                mes_Moentry.remaining_number = 0;
+                                mes_Moentry.tenant_id = input.tenant_id;
+                                mes_Moentry.factory_id = input.factory_id;
+                                mes_Moentry.company_id = input.company_id;
+                                mes_Moentry.org_id = input.org_id;
+                                mes_Moentry.create_time = DateTime.Now;
+                                mes_Moentry.bang_id = bang_id;
+                                if(mes_Morder.need_number>0)
+                                {
+                                    ReplenishmentWeekPlan weekItem = new ReplenishmentWeekPlan();
+                                    weekItem.Priority = 1;
+                                    weekItem.Area = itemrop.area;
+                                    weekItem.PlanStartDate = mes_Morder.moentry_sys_stime.GetValueOrDefault();
+                                    weekItem.Week = $"WK{GetWeekOfYear(mes_Morder.moentry_sys_stime.Value).ToString("00")}";
+                                    weekItem.OrderNO = nbrlistDto[j].NbrResult.ToString();
+                                    weekItem.ProductionOrder = list[j].NbrResult.ToString();
+                                    weekItem.SAPOrderNO = "";
+                                    weekItem.OrderType = "量产";
+                                    weekItem.ProductionBatch = "";
+                                    weekItem.ProductionStatus = "";
+                                    weekItem.ProdLine = a.ProdLine;
+                                    weekItem.ProdRange = a.ProdRange;
+                                    weekItem.Line = monthPlanItem.WorkshopLine;
+                                    weekItem.ItemNumber = a.SAPItemNumber;
+                                    weekItem.Model = a.Model;
+                                    weekItem.Languages = a.Languages;
+                                    weekItem.Qty = mes_Morder.morder_production_number.Value;
+                                    weekItem.ItemStatus = "";
+                                    weekItem.PlanKittingDate = DateTime.Now;
+                                    weekItem.tenant_id = input.tenant_id;
+                                    weekItem.factory_id = input.factory_id;
+                                    weekItem.company_id = input.company_id;
+                                    weekItem.org_id = input.org_id;
+                                    weekItem.create_time = DateTime.Now;
+                                    weekItem.DistributionChannel = a.DistributionChannel;
+                                    weekItem.IsReplenishmentModel = "N";
+                                    if (itemrop.area == "国内" || itemrop.area == "中国")
+                                    {
+                                        weekItem.SterilizationDate = mes_Morder.moentry_sys_etime.Value;
+                                        weekItem.InStockDate = mes_Morder.moentry_sys_etime.Value.AddDays(15);
+                                    }
+                                    else
+                                    {
+                                        weekItem.SterilizationDate = mes_Morder.moentry_sys_etime.Value;
+                                        weekItem.InStockDate = mes_Morder.moentry_sys_etime.Value.AddDays(8);
+                                    }
+                                    weekItem.AssembleHours = 0;
+                                    weekItem.HeatSealHours = 0;
+                                    weekItem.PackageHours = 0;
+                                    weekItem.TotalHours = 0;
+                                    weekPlan.Add(weekItem);
+                                    moList.Add(mes_Morder);
+                                    moentryList.Add(mes_Moentry);
+                                }
+                                j++;
+                            }
                         }
-                        weekItem.AssembleHours = 0;
-                        weekItem.HeatSealHours = 0;
-                        weekItem.PackageHours = 0;
-                        weekItem.TotalHours = 0;
-                        weekPlan.Add(weekItem);
-                        j++;
                     }
                 });
+
             }
+            #region
+            //for (int i=0;i<12;i++)
+            //{
+            //    planList.Where(c=>c.PlanMonth== planMonth).ToList().ForEach(a =>
+            //    {
+            //        var ic_item = itemList.Find(x => x.number == a.SAPItemNumber);
+            //        var itemrop= ropModelList.Find(x=>x.number == a.SAPItemNumber);
+            //        var monthPlanItem = monthPlan.Find(x => x.ItemNumber == a.SAPItemNumber);
+            //        if (ic_item?.erp_cls == 1 && itemrop!=null)
+            //        {
+            //            var bom = bomList.Find(b => b.item_number == a.SAPItemNumber);
+            //            mes_morder mes_Morder = new mes_morder();
+            //            mes_Morder.GenerateNewId(help.NextId());
+            //            mes_Morder.morder_type = MorderEnum.JhMorder;
+            //            //mes_Morder.morder_icitem_type
+            //            mes_Morder.work_order_type = MorderEnum.CgMorder;
+            //            mes_Morder.morder_state = MorderEnum.Initial_state;
+            //            mes_Morder.morder_no = list[j].NbrResult.ToString();
+            //            mes_Morder.fms_number = ic_item.fms_number;
+            //            mes_Morder.bom_number = bom.bom_number;
+            //            mes_Morder.fmodel = ic_item.model;
+            //            mes_Morder.urgent = 1;
+            //            mes_Morder.moentry_startup_status = 0;
+            //            mes_Morder.tenant_id = input.tenant_id;
+            //            mes_Morder.factory_id = input.factory_id;
+            //            mes_Morder.company_id = input.company_id;
+            //            mes_Morder.org_id = input.org_id;
+            //            mes_Morder.product_code = ic_item.number;
+            //            mes_Morder.product_name = ic_item.name;
+            //            mes_Morder.morder_date = DateTime.Now.Date.AddDays(1);
+            //            //成品半成品取周一开始 + 取供应提前期为结束时间
+            //            mes_Morder.moentry_sys_stime = currentTime.AddDays(1 - week + 7 * (i + 1));
+            //            mes_Morder.moentry_sys_etime = currentTime.AddDays(1 - week + 7*(i+1)+ Convert.ToDouble(itemrop.supply_leadtime));
+            //            //mes_Morder.morder_fstate = "计划";
+            //            //TODO:目前没有取值位置
+            //            mes_Morder.moentry_prd = null;
+            //            mes_Morder.moentry_prdname = null;
+            //            mes_Morder.moentry_wrkc = null;
+            //            mes_Morder.moentry_wrkcname = null;
+            //            mes_Morder.picking_qty = 0;
+            //            //TODO:可删除主表字段
+            //            mes_Morder.unit = ic_item.unit;
+            //            mes_Morder.morder_production_number =Math.Ceiling(itemrop.eop.GetValueOrDefault()/4);
+            //            mes_Morder.need_number = Math.Ceiling(itemrop.eop.GetValueOrDefault() / 4);
+            //            mes_Morder.remaining_number = 0;
+            //            mes_Morder.create_time = DateTime.Now;
+            //            mes_Morder.bang_id = bang_id;
+            //            //生成工单子表数据
+            //            mes_moentry mes_Moentry = new mes_moentry();
+            //            mes_Moentry.GenerateNewId(help.NextId());
+            //            mes_Moentry.moentry_moid = mes_Morder.Id;
+            //            mes_Moentry.moentry_mono = mes_Morder.morder_no;
+            //            mes_Moentry.unit = ic_item.unit;
+            //            mes_Moentry.morder_production_number = Math.Ceiling(itemrop.eop.GetValueOrDefault() / 4);
+            //            mes_Moentry.need_number = Math.Ceiling(itemrop.eop.GetValueOrDefault() / 4);
+            //            mes_Moentry.remaining_number = 0;
+            //            mes_Moentry.tenant_id = input.tenant_id;
+            //            mes_Moentry.factory_id = input.factory_id;
+            //            mes_Moentry.company_id = input.company_id;
+            //            mes_Moentry.org_id = input.org_id;
+            //            mes_Moentry.create_time = DateTime.Now;
+            //            mes_Moentry.bang_id = bang_id;
+            //            moList.Add(mes_Morder);
+            //            moentryList.Add(mes_Moentry);
+
+            //            ReplenishmentWeekPlan weekItem = new ReplenishmentWeekPlan();
+            //            weekItem.Priority = 1;
+            //            weekItem.Area = itemrop.area;
+            //            weekItem.PlanStartDate = mes_Morder.moentry_sys_stime.GetValueOrDefault();
+            //            weekItem.Week =$"WK{GetWeekOfYear(mes_Morder.moentry_sys_stime.Value).ToString("00")}";
+            //            weekItem.OrderNO = nbrlistDto[j].NbrResult.ToString(); 
+            //            weekItem.ProductionOrder = list[j].NbrResult.ToString();
+            //            weekItem.SAPOrderNO = "";
+            //            weekItem.OrderType = "量产";
+            //            weekItem.ProductionBatch = "";
+            //            weekItem.ProductionStatus = "";
+            //            weekItem.ProdLine =a.ProdLine;
+            //            weekItem.ProdRange =a.ProdRange;
+            //            weekItem.Line = monthPlanItem.WorkshopLine;
+            //            weekItem.ItemNumber =a.SAPItemNumber;
+            //            weekItem.Model =a.Model;
+            //            weekItem.Languages =a.Languages;
+            //            weekItem.Qty = mes_Morder.morder_production_number.Value;
+            //            weekItem.ItemStatus = "";
+            //            weekItem.PlanKittingDate = DateTime.Now;
+            //            weekItem.tenant_id = input.tenant_id;
+            //            weekItem.factory_id = input.factory_id;
+            //            weekItem.company_id = input.company_id;
+            //            weekItem.org_id = input.org_id;
+            //            weekItem.create_time = DateTime.Now;
+            //            weekItem.DistributionChannel = a.DistributionChannel;
+            //            if (itemrop.area=="国内" || itemrop.area == "中国")
+            //            {
+            //                weekItem.SterilizationDate = mes_Morder.moentry_sys_etime.Value;
+            //                weekItem.InStockDate = mes_Morder.moentry_sys_etime.Value.AddDays(15);
+            //            }
+            //            else
+            //            {
+            //                weekItem.SterilizationDate = mes_Morder.moentry_sys_etime.Value;
+            //                weekItem.InStockDate = mes_Morder.moentry_sys_etime.Value.AddDays(8);
+            //            }
+            //            weekItem.AssembleHours = 0;
+            //            weekItem.HeatSealHours = 0;
+            //            weekItem.PackageHours = 0;
+            //            weekItem.TotalHours = 0;
+            //            weekPlan.Add(weekItem);
+            //            j++;
+            //        }
+            //    });
+            //}
+            #endregion
             await _mysql_mes_morder.InsertManyAsync(moList);
             await _mysql_mes_moentry.InsertManyAsync(moentryList);
 
@@ -1432,30 +1782,30 @@ namespace Business.Replenishment
             var examine_resultList= _mysql_examine_result.GetListAsync(a=>a.bangid == bang_id).Result;
 
             //批量保存 后期考虑子工单
-            List<WorkOrdMaster> workOrds = new List<WorkOrdMaster>();
-            List<WorkOrdRouting> workOrdRoutings = new List<WorkOrdRouting>();
+            List<WorkOrdMaster> workOrdSave = new List<WorkOrdMaster>();
+            List<WorkOrdRouting> workOrdRoutingSave = new List<WorkOrdRouting>();
             List<WorkOrdDetail> workOrdDetails = new List<WorkOrdDetail>();
             if (moList.Any())
             {
                 moList.ForEach(s => { s.create_time = DateTime.Now; });
                 List<b_bom_child_examine> childExamineList = _mysql_bom_child_examine.GetListAsync(c => examine_resultList.Select(x => x.Id).Contains(c.examine_id.GetValueOrDefault())).Result;
                 //同步工单
-                CreateWorkOrdDates(moList, routingOps, workOrds, workOrdRoutings, workOrdDetails, examine_resultList, childExamineList);
+                CreateWorkOrdDates(moList, routingOps, workOrdSave, workOrdRoutingSave, workOrdDetails, examine_resultList, childExamineList);
             }
 
-            if (workOrds.Any())
+            if (workOrdSave.Any())
             {
-                workOrds=CalcPriority(workOrds, input.factory_id.ToString());
-                _workOrdMaster.Insert(workOrds);
+                workOrdSave = CalcPriority(workOrdSave, input.factory_id.ToString());
+                _workOrdMaster.Insert(workOrdSave);
             }
-            var DBworkOrdList = _workOrdMaster.Select(a => a.Domain == workOrds[0].Domain && workOrds.Select(c => c.WorkOrd).Contains(a.WorkOrd));
-            if (workOrdRoutings.Any())
+            var DBworkOrdList = _workOrdMaster.Select(a => a.Domain == workOrdSave[0].Domain && workOrdSave.Select(c => c.WorkOrd).Contains(a.WorkOrd));
+            if (workOrdRoutingSave.Any())
             {
-                workOrdRoutings.ForEach(c =>
+                workOrdRoutingSave.ForEach(c =>
                 {
                     c.WorkOrdMasterRecID = DBworkOrdList.Where(a => a.WorkOrd == c.WorkOrd).First().RecID;
                 });
-                _workOrdRouting.Insert(workOrdRoutings);
+                _workOrdRouting.Insert(workOrdRoutingSave);
             }
             if (workOrdDetails.Any())
             {
@@ -1468,39 +1818,43 @@ namespace Business.Replenishment
 
             weekPlan.ForEach(a =>
             {
-                var moItem = examine_resultList.Find(b => b.morder_no == a.OrderNO);
-                List<RoutingOpDetail> routingOp = routingOps.Where(x => x.RoutingCode == a.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<a.PlanStartDate)
-                {
-                    a.ItemStatus = "齐套";
-                    a.PlanKittingDate = moItem.kitting_times;
-                    a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
-                    a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
-                    a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
-                    a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
-                }
-                else
+                if(a.IsReplenishmentModel=="N")
                 {
-                    a.ItemStatus = "欠料";
-                    a.PlanKittingDate = moItem.kitting_times;
-                    a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
-                    a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
-                    a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
-                    a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
-                }
-                var workOrd = workOrds.Find(b => b.WorkOrd == a.OrderNO);
-                if(workOrd!=null)
-                {
-                    a.Priority = workOrd.Priority;
+                    var moItem = examine_resultList.Find(b => b.morder_no == a.ProductionOrder);
+                    List<RoutingOpDetail> routingOp = routingOps.Where(x => x.RoutingCode == a.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 < a.PlanStartDate)
+                    {
+                        a.ItemStatus = "齐套";
+                        a.PlanKittingDate = moItem.kitting_times;
+                        a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
+                        a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
+                        a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
+                        a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
+                    }
+                    else
+                    {
+                        a.ItemStatus = "欠料";
+                        a.PlanKittingDate = moItem.kitting_times;
+                        a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
+                        a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
+                        a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
+                        a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
+                    }
+                    var workOrd = workOrdSave.Find(b => b.WorkOrd == a.ProductionOrder);
+                    if (workOrd != null)
+                    {
+                        a.Priority = workOrd.Priority;
+                    }
                 }
             });
             await _replenishmentWeekPlan.InsertManyAsync(weekPlan);
+            await _replenishmentWeekPlan.UpdateManyAsync(weekPlanUpdate);
             return "OK";
         }
 
@@ -1513,8 +1867,9 @@ namespace Business.Replenishment
         {
             DateTime nextWeekMonday = getPreWeekStartTime().AddDays(14);
             DateTime next2WeekMonday = getPreWeekStartTime().AddDays(28);
-            var weekPlan = _replenishmentWeekPlan.GetListAsync(a => a.PlanStartDate >= nextWeekMonday && a.PlanStartDate < next2WeekMonday).Result.OrderBy(a=>a.Priority).ToList();
-            var workMasters = _workOrdMaster.Select(a => weekPlan.Select(s=>s.ItemNumber).Contains(a.ItemNum) && weekPlan.Select(p=>p.OrderNO).Contains(a.WorkOrd) && a.Domain == input.factory_id.ToString());
+            var weekPlan = _replenishmentWeekPlan.GetListAsync(a => a.PlanStartDate >= nextWeekMonday && a.PlanStartDate < next2WeekMonday && a.IsReplenishmentModel=="N").Result.OrderBy(a=>a.Priority).ToList();
+            List<WorkOrdMaster> workMasters = _workOrdMaster.Select(a => weekPlan.Select(s=>s.ItemNumber).Contains(a.ItemNum) && weekPlan.Select(p=>p.ProductionOrder).Contains(a.WorkOrd) && a.Domain == input.factory_id.ToString());
+            List<mes_morder> mes_Morders = _mysql_mes_morder.GetListAsync(a => workMasters.Select(b => b.WorkOrd).ToList().Contains(a.morder_no) && a.factory_id == input.factory_id).Result;
             decimal priority = 1;
             for(int i=0;i<weekPlan.Count;i++)
             {
@@ -1522,14 +1877,20 @@ namespace Business.Replenishment
                 weekPlan[i].Priority = priority;
                 workMasters.ForEach(b =>
                 {
-                    if (b.ItemNum == weekPlan[i].ItemNumber && b.WorkOrd == weekPlan[i].OrderNO)
+                    if (b.ItemNum == weekPlan[i].ItemNumber && b.WorkOrd == weekPlan[i].ProductionOrder)
                     {
                         b.Priority = priority;
+                        b.Status = "p";
                     }
                 });
+                mes_Morders.ForEach(c =>
+                {
+                    c.morder_state = MorderEnum.Initial_state;
+                });
                 priority++;
             }
             _workOrdMaster.Update(workMasters);
+            await _mysql_mes_morder.UpdateManyAsync(mes_Morders);
             await _replenishmentWeekPlan.UpdateManyAsync(weekPlan);
             return "OK";
         }
@@ -2091,13 +2452,14 @@ namespace Business.Replenishment
                 workOrd.Domain = item.factory_id.ToString();
                 workOrd.OrdDate = item.moentry_sys_stime;
                 workOrd.ReleaseDate = Convert.ToDateTime(item.moentry_sys_stime.GetValueOrDefault().ToString("u"));
+                workOrd.DueDate = item.moentry_sys_etime;
                 workOrd.WorkOrd = item.morder_no;
                 workOrd.ItemNum = item.product_code;//物料编码
                 workOrd.QtyOrded = item.need_number.GetValueOrDefault();
                 workOrd.RoutingCode = item.product_code;
                 workOrd.Period = 1;
                 workOrd.Priority = item.urgent;
-                workOrd.Status = " ";
+                workOrd.Status = "p";
                 workOrd.IsActive = true;
                 workOrd.IsConfirm = true;
                 workOrd.CreateTime = DateTime.Now;
@@ -2279,7 +2641,6 @@ namespace Business.Replenishment
         public List<WorkOrdMaster> CalcPriority(List<WorkOrdMaster> works, string domain)
         {
             var saleWordOrd = works.Where(a => !string.IsNullOrEmpty(a.SalesJob));
-            Dictionary<string, int> dict = new Dictionary<string, int>();
             var soList = _mysql_crm_seorder.GetListAsync(a => saleWordOrd.Select(b => b.SalesJob).Contains(a.bill_no)).Result;
 
             var custList = _custMaster.Select(a => soList.Select(b => b.custom_no).Contains(a.Cust) && a.Domain == domain);
@@ -3035,7 +3396,7 @@ namespace Business.Replenishment
                 await _ic_item_stock.InsertManyAsync(moIcitemStokc);
             }
 
-            var workordmsters = _workOrdMaster.Select(s => s.Domain == factoryId.ToString() && s.Status.ToLower() != "c");
+            var workordmsters = _workOrdMaster.Select(s => s.Domain == factoryId.ToString() && string.IsNullOrEmpty(s.Status) != true && s.Status.ToLower() != "c");
             if (workordmsters.Any())
             {
                 //根据工单表找到工单明细,然后根据DOP工单占用记录,对比工单明细发货数量,来做冲销。
@@ -3209,8 +3570,8 @@ namespace Business.Replenishment
             holidays = _holidayMaster.Select(p => p.Dated >= DateTime.Now.Date);
 
             //主工单
-            List<mo_mes_morder> mo_Mes_Morders = _mes_morder.GetListAsync(x => boms.Select(p => p.bom_number).Contains(x.bom_number) && (x.morder_state != MorderEnum.Accomplish_state || x.morder_state != MorderEnum.Close_state
-          && x.morder_icitem_type != MorderEnum.XgwyMorder) && x.company_id == param.company_id && x.bang_id == bangid).Result;
+            var ordlist = _workOrdMaster.Select(x => x.Domain == param.factoryId.ToString() && string.IsNullOrEmpty(x.Typed) == true && (x.Status.ToLower() == "p" || x.Status.ToLower() == "r")).ToList();
+            List<mo_mes_morder> mo_Mes_Morders = _mes_morder.GetListAsync(x => boms.Select(p => p.item_number).Contains(x.product_code) && ordlist.Select(c => c.WorkOrd).Contains(x.morder_no) && x.company_id == param.company_id && x.factory_id == param.factoryId && x.bang_id == bangid).Result;
             List<long> moids = mo_Mes_Morders.Select(p => p.mysql_id).ToList();
             List<mo_mes_moentry> mo_Mes_Moentry = _mes_moentry.GetListAsync(x => moids.Contains(x.moentry_moid)).Result;
             //工单占用表
@@ -3802,7 +4163,7 @@ namespace Business.Replenishment
         public static int GetWeekOfYear(DateTime dt)
         {
             System.Globalization.GregorianCalendar gc = new System.Globalization.GregorianCalendar();
-            int weekOfYear = gc.GetWeekOfYear(dt, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);
+            int weekOfYear = gc.GetWeekOfYear(dt, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
             return weekOfYear;
         }
 

+ 57 - 28
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -47,9 +47,9 @@ namespace Business.ResourceExamineManagement
         public DateTime quarter_endtime;
 
         /// <summary>
-        /// 是否
+        /// 是否
         /// </summary>
-        public bool IsInverted = false;
+        public bool IsStraight = false;
 
         /// <summary>
         /// 工单类型
@@ -435,6 +435,12 @@ namespace Business.ResourceExamineManagement
 
                     mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(make_time - 1));
                     MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, mes_Morders.moentry_sys_stime, sentrys, icitemlist);
+                    if (IsStraight)
+                    {
+                        //正排
+                        mes_Morders.moentry_sys_stime = childList.Max(s => s.kitting_time.GetValueOrDefault()).AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                        mes_Morders.moentry_sys_etime = mes_Morders.moentry_sys_stime.GetValueOrDefault().AddDays(make_time);
+                    }
                     if (!string.IsNullOrEmpty(mes_Morders.bom_number))
                     {
                         mes_Morders.mat_start_date = childList.Max(s => s.kitting_time.GetValueOrDefault()).AddDays(1).Date;//数据齐套完成后隔天开始生产;
@@ -694,11 +700,12 @@ namespace Business.ResourceExamineManagement
                     }  
                     decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
                     item.mo_qty = moo_qty;
-                    
+                    item.kitting_time = DateTime.Now;
                     if (mooccupylist.Any())
                     {
                         mooccupyAllList.AddRange(mooccupylist);
                         mooccupyAllInsertList.AddRange(mooccupylist);
+                        item.kitting_time = mooccupylist[0].moo_etime;
                         //在制占用明细
                         item.mo_occupy_list = new List<mo_occupy>();
                         mooccupylist.ForEach(s =>
@@ -716,15 +723,11 @@ namespace Business.ResourceExamineManagement
                     {
                         //在制完全足够
                         item.lack_qty = 0;
-                        //item.kitting_time = mooccupylist[0].moo_etime;
-                        item.kitting_time = DateTime.Now;
                         item.stock_state = 1;
                     }
                     else
                     {
                         item.lack_qty -= moo_qty;
-                        item.kitting_time = DateTime.Now;
-                        //TODO:需要按标准UPH来计算生产时长
                         //生成主工单
                         GenerateMorderDto generateMorderDto = new GenerateMorderDto()
                         {
@@ -766,7 +769,7 @@ namespace Business.ResourceExamineManagement
                                 var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, item.lack_qty, bangid);
                                 mooccupyAllList.Add(generateMooccupy);
                                 mooccupyAllInsertList.Add(generateMooccupy);
-
+                                
                                 //子工单生成的检查明细,还是挂接到主工单上。
                                 mes_Morders.moentry_sys_etime = plan_date.GetValueOrDefault().AddDays(-1);
                                 mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(make - 1));
@@ -794,16 +797,25 @@ namespace Business.ResourceExamineManagement
                                 mordersInsertList.AddRange(mes_MorderDto.mes_Morders);
                                 moentriesList.AddRange(mes_MorderDto.mes_Moentries);
                                 moentriesInsertList.AddRange(mes_MorderDto.mes_Moentries);
-                                //先计算末级数据的齐套时间。
+
+                                mes_Morders.mat_start_date = item.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                                                                                                  //先计算末级数据的齐套时间。
                                 if (cilList.Count > 0)
                                 {
                                     CalcIcitem(cilList, returnlist, bangid, sklist, mes_Morders.moentry_sys_stime, icitemlist, sentrys, childidList);
-
-                                    item.kitting_time = cilList.Max(s => s.kitting_time);
+                                    mes_Morders.mat_start_date = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(1).Date;
+                                    mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
+                                    if (item.kitting_time < mes_Morders.mat_end_date)
+                                    {
+                                        item.kitting_time = mes_Morders.mat_end_date;
+                                    }
+                                    if (IsStraight)
+                                    {
+                                        //正排
+                                        mes_Morders.moentry_sys_stime = item.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                        mes_Morders.moentry_sys_etime = mes_Morders.moentry_sys_stime.GetValueOrDefault().AddDays(make);
+                                    }
                                 }
-                                mes_Morders.mat_start_date = item.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
-                                mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
-                                item.kitting_time = mes_Morders.mat_end_date;
                             }
                         }
                     }
@@ -839,7 +851,16 @@ namespace Business.ResourceExamineManagement
                             if (cilList.Count > 0)
                             {
                                 CalcIcitem(cilList, returnlist, bangid, sklist, mesorder.ooentry_stime, icitemlist, sentrys, childidList);
-                                item.kitting_time = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());//加上物料的采购提前期
+                                var itemTime = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());//加上物料的采购提前期
+                                if (itemTime > item.kitting_time)
+                                {
+                                    item.kitting_time = itemTime;
+                                }
+                                if (IsStraight)
+                                {
+                                    mesorder.ooentry_stime = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(1);
+                                    mesorder.ooentry_etime = mesorder.ooentry_stime.GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());
+                                }
                             }
                             item.subcontracting_qty = item.lack_qty;
                             item.subcontracting_list = new List<ooder>();
@@ -1219,11 +1240,12 @@ namespace Business.ResourceExamineManagement
                             }
                             decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
                             sct.mo_qty = moo_qty;
-
+                            sct.kitting_time = DateTime.Now;
                             if (mooccupylist.Any())
                             {
                                 mooccupyAllList.AddRange(mooccupylist);
                                 mooccupyAllInsertList.AddRange(mooccupylist);
+                                sct.kitting_time = mooccupylist[0].moo_etime;
                                 //在制占用明细
                                 sct.mo_occupy_list = new List<mo_occupy>();
                                 mooccupylist.ForEach(s =>
@@ -1241,13 +1263,10 @@ namespace Business.ResourceExamineManagement
                             {
                                 //在制完全足够
                                 sct.lack_qty = 0;
-                                //item.kitting_time = mooccupylist[0].moo_etime;
-                                sct.kitting_time = DateTime.Now;
                                 sct.stock_state = 1;
                             }
                             else {
                                 sct.lack_qty -= moo_qty;
-                                sct.kitting_time = DateTime.Now;
                                 //TODO:需要按标准UPH来计算生产时长
                                 //生成主工单
                                 GenerateMorderDto generateMorderDto = new GenerateMorderDto()
@@ -1286,7 +1305,6 @@ namespace Business.ResourceExamineManagement
                                     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);
                                         mooccupyAllList.Add(generateMooccupy);
                                         mooccupyAllInsertList.Add(generateMooccupy);
@@ -1319,19 +1337,27 @@ namespace Business.ResourceExamineManagement
                                         mordersInsertList.AddRange(mes_MorderDto.mes_Morders);
                                         moentriesList.AddRange(mes_MorderDto.mes_Moentries);
                                         moentriesInsertList.AddRange(mes_MorderDto.mes_Moentries);
-                                        
+
+                                        mes_Morders.mat_start_date = sct.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
                                         //先计算末级数据的齐套时间。
                                         if (cilList.Count > 0)
                                         {
                                             CalcIcitem(cilList, returnlist, bangid, sklist, mes_Morders.moentry_sys_stime, icitemlist, sentrys, childidList);
-                                            sct.kitting_time = cilList.Max(s => s.kitting_time);
+                                            mes_Morders.mat_start_date = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(1).Date;
+                                            mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
+                                            if (sct.kitting_time < mes_Morders.mat_end_date)
+                                            {
+                                                sct.kitting_time = mes_Morders.mat_end_date;
+                                            }
+                                            if (IsStraight)
+                                            {
+                                                //正排
+                                                mes_Morders.moentry_sys_stime = sct.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                                mes_Morders.moentry_sys_etime = mes_Morders.moentry_sys_stime.GetValueOrDefault().AddDays(make);
+                                            }
                                         }
-                                        mes_Morders.mat_start_date = sct.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
-                                        mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
-                                        sct.kitting_time = mes_Morders.mat_end_date;
                                     }
                                 }
-                                
                             }
                         }
                         else if (sct.erp_cls == 3)
@@ -1546,7 +1572,7 @@ namespace Business.ResourceExamineManagement
             
             srm_Pr.pr_order_type = 1;//单据类型
 
-            if (plan_date != null)
+            if (plan_date != null && !IsStraight)
             {
                 //-1为提前一天准备
                 srm_Pr.pr_sarrive_date = plan_date.GetValueOrDefault().AddDays(-1 - (int)(Math.Ceiling(plan.clean_leadtime.GetValueOrDefault())));
@@ -1769,7 +1795,10 @@ namespace Business.ResourceExamineManagement
                 item.purchase_qty = item.lack_qty;
                 item.purchase_list = new List<purchase>();
             }
-            item.kitting_time = SRMPRDto.lastStartTmie;
+            if (SRMPRDto.lastStartTmie > item.kitting_time)
+            {
+                item.kitting_time = SRMPRDto.lastStartTmie;
+            }
             SRMPRDtoList.Add(SRMPRDto);
             return SRMPRDto;
         }

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

@@ -241,7 +241,7 @@ namespace Business.ResourceExamineManagement
             DateTime startTime = DateTime.Now;
             scheTime = startTime;
             //尚未开始生产的工单+正在生产的工单
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && ((p.OrdDate < endDate && p.OrdDate >= startTime && p.Status.ToUpper() =="P" && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID >0 ))) || p.Status.ToUpper() == "W")).ToList();
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && ((p.OrdDate < endDate && p.OrdDate >= startTime && p.Status.ToLower() =="p" && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID >0 ))) || p.Status.ToLower() == "w")).ToList();
             if (workOrds.Any())
             {
                 await DoProductSchedule(startTime, workOrds, domain, 1);

+ 11 - 12
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -695,7 +695,7 @@ namespace Business.ResourceExamineManagement
                 _morderAppService.param = param;
                 _purchaseOrderAppService.param = param;
                 _CalcBomViewAppService.param = param;
-                _CalcBomViewAppService.IsInverted = true;
+                _CalcBomViewAppService.IsStraight = true;
                 _CalcBomViewAppService.seorder = sorder;//销售订单
                 var orderSentrys = sentrys.Where(s => s.seorder_id == sorder.Id).ToList();
                 foreach (var item in orderSentrys)
@@ -2406,8 +2406,8 @@ namespace Business.ResourceExamineManagement
             {
                 return "当前任务工厂编号为空,请检查。";
             }
-
-            List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => x.morder_state == "初始" && x.factory_id.ToString() == domain).Result;
+            var ordlist = _workOrdMaster.Select(x => x.Domain == domain && string.IsNullOrEmpty(x.Typed) == true && x.Status.ToLower() == "p").ToList();
+            List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => ordlist.Select(c=>c.WorkOrd).Contains(x.morder_no) && x.factory_id.ToString() == domain).Result;
 
             /*//先排除锁定期内的工单 //优先级排序
             var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "WorkOrderLockPeriod" && s.Domain == domain).ToList();
@@ -2544,7 +2544,7 @@ namespace Business.ResourceExamineManagement
         /// <returns></returns>
         public async Task<string> OrderCompleteInspection(string domain, string userAccount)
         {
-            var workords = _workOrdMaster.Select(s => s.Domain == domain && (s.Status == "r" || string.IsNullOrEmpty(s.Status) == true)).ToList();
+            var workords = _workOrdMaster.Select(s => s.Domain == domain && (s.Status.ToLower() == "r" || string.IsNullOrEmpty(s.Status) == true)).ToList();
             List<mes_morder> morders = _mysql_mes_morder.GetListAsync(x => x.factory_id.ToString() == domain && workords.Select(s => s.WorkOrd).Contains(x.morder_no) && (x.morder_state == MorderEnum.Initial_state || x.morder_state == MorderEnum.Xd_state) && !x.IsDeleted).Result;
             if (morders.Any())
             {
@@ -3178,7 +3178,6 @@ namespace Business.ResourceExamineManagement
             _morderAppService.param = param;
             _purchaseOrderAppService.param = param;
             _CalcBomViewAppService.param = param;
-            _CalcBomViewAppService.IsInverted = true;
             foreach (var item in priorityMorderList)
             {
                 var moentry = mo_Mes_Moentries.Find(s => s.moentry_moid == item.Id);
@@ -3369,8 +3368,8 @@ namespace Business.ResourceExamineManagement
             holidays = _holidayMaster.Select(p => p.Dated >= DateTime.Now.Date);
 
             //主工单
-            List<mo_mes_morder> mo_Mes_Morders = _mes_morder.GetListAsync(x => boms.Select(p => p.item_number).Contains(x.product_code) && (x.morder_state != MorderEnum.Accomplish_state || x.morder_state != MorderEnum.Close_state
-          && x.morder_icitem_type != MorderEnum.XgwyMorder) && x.company_id == param.company_id && x.factory_id == param.factoryId && x.bang_id == bangid).Result;
+            var ordlist = _workOrdMaster.Select(x => x.Domain == param.factoryId.ToString() && string.IsNullOrEmpty(x.Typed) == true && (x.Status.ToLower() == "p" || x.Status == "r")).ToList();
+            List<mo_mes_morder> mo_Mes_Morders = _mes_morder.GetListAsync(x => boms.Select(p => p.item_number).Contains(x.product_code) && ordlist.Select(c => c.WorkOrd).Contains(x.morder_no) && x.company_id == param.company_id && x.factory_id == param.factoryId && x.bang_id == bangid).Result;
             List<long> moids = mo_Mes_Morders.Select(p => p.mysql_id).ToList();
             List<mo_mes_moentry> mo_Mes_Moentry = _mes_moentry.GetListAsync(x => moids.Contains(x.moentry_moid)).Result;
             //工单占用表
@@ -3842,7 +3841,7 @@ namespace Business.ResourceExamineManagement
             if (string.IsNullOrEmpty(workOrd))
             {
                 //获取工单数据
-                workOrdMasters = _workOrdMaster.Select(p => p.Domain == domain && p.OrdDate >= DateTime.Now.Date.AddDays(1) && p.OrdDate < DateTime.Now.Date.AddDays(4) && p.Status != "r" && p.Status != "c");
+                workOrdMasters = _workOrdMaster.Select(p => p.Domain == domain && p.OrdDate >= DateTime.Now.Date.AddDays(1) && p.OrdDate < DateTime.Now.Date.AddDays(4) && p.Status.ToLower() == "p");
             }
             else {
                 workOrds = workOrd.Split(",").ToList();
@@ -3850,7 +3849,7 @@ namespace Business.ResourceExamineManagement
                 {
                     return "没有需要下达的工单。";
                 }
-                workOrdMasters = _workOrdMaster.Select(p => p.Domain == domain && workOrds.Contains(p.WorkOrd) && p.Status != "r" && p.Status != "c");
+                workOrdMasters = _workOrdMaster.Select(p => p.Domain == domain && workOrds.Contains(p.WorkOrd) && p.Status.ToLower() == "p");
             }
             if (workOrdMasters.Count == 0)
             {
@@ -3904,7 +3903,7 @@ namespace Business.ResourceExamineManagement
                         if (worklistDto[index] != null)
                         {
                             p.LotSerial = worklistDto[index].NbrResult.ToString();
-                            var weekp = weekplan.Find(s => s.OrderNO == p.WorkOrd);
+                            var weekp = weekplan.Find(s => s.ProductionOrder == p.WorkOrd && s.IsReplenishmentModel=="N");
                             if (weekp != null)
                             {
                                 weekp.ProductionBatch = p.LotSerial;
@@ -4044,7 +4043,7 @@ namespace Business.ResourceExamineManagement
                 workOrd.RoutingCode = item.product_code;
                 workOrd.Period = 1;
                 workOrd.Priority = item.urgent;
-                workOrd.Status = " ";
+                workOrd.Status = "p";
                 workOrd.IsActive = true;
                 workOrd.IsConfirm = true;
                 workOrd.CreateTime = DateTime.Now;
@@ -4551,7 +4550,7 @@ namespace Business.ResourceExamineManagement
             //取数开始时间为当前日期
             DateTime startTime = DateTime.Now;
             //尚未开始生产的工单+正在生产的工单
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && ((p.OrdDate < endDate && p.OrdDate >= startTime && p.Status.ToUpper() == "P" && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0))) || p.Status.ToLower() == "w")).ToList();
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == domain && ((p.OrdDate < endDate && p.OrdDate >= startTime && p.Status.ToUpper() == "P" && (string.IsNullOrEmpty(p.Typed) || (!string.IsNullOrEmpty(p.Typed) && p.Typed.ToUpper() != "PW" && p.BusinessID > 0))) || p.Status.ToUpper() == "W")).ToList();
             string result = await _productionScheduleAppService.DoProductSchedule(startTime,workOrds, domain, 2);
             return result;
         }

+ 1 - 1
MicroServices/Business/Business.Application/SystemJobManagement/SystemJobAppService.cs

@@ -674,7 +674,7 @@ namespace Business.SystemJobManagement
                             order_point = 1,
                             secinv = 1,
                             secinv_ratio = 1,
-                            self_inspection_date = 1,
+                            self_inspection_date = custList[i].InsLT,
                             Warehousing_date = 1,
                             Shipping_date = 3,
                         });

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ItemMaster.cs

@@ -115,5 +115,11 @@ namespace Business.Domain
         /// </summary>
         [Comment("版本")]
         public string Rev { get; set; }
+
+        /// <summary>
+        /// 检验天数
+        /// </summary>
+        [Comment("检验天数")]
+        public int InsLT { get; set; }
     }
 }

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

@@ -33,6 +33,12 @@ namespace Business.Domain
         [Comment("生产线")]
         public string Line { get; set; }
 
+        /// <summary>
+        /// 生产线名称
+        /// </summary>
+        [Comment("生产线名称")]
+        public string Describe { get; set; }
+
         /// <summary>
         /// 库位
         /// </summary>

+ 7 - 2
MicroServices/Business/Business.Domain/StructuredDB/Replenishment/ReplenishmentWeekPlan.cs

@@ -79,10 +79,10 @@ namespace Business.StructuredDB.Replenishment
         public string? ProductionBatch { get; set; }
 
         /// <summary>
-        /// 生产状态
+        /// 发布状态
         /// </summary>
         [StringLength(128)]
-        [Comment("生产状态")]
+        [Comment("发布状态")]
         public string? ProductionStatus { get; set; }
 
         /// <summary>
@@ -195,5 +195,10 @@ namespace Business.StructuredDB.Replenishment
         /// 销售/渠道   
         /// </summary>
         public string DistributionChannel { get; set; }
+
+        /// <summary>
+        /// 是否为周补货计划,Y/N
+        /// </summary>
+        public string IsReplenishmentModel { get; set; }
     }
 }

+ 1 - 1
MicroServices/Business/Business.EntityFrameworkCore/Repository/SqlRepositories/ExtSqlRepository.cs

@@ -16,7 +16,7 @@ using EFCore.BulkExtensions;
 
 namespace Business.EntityFrameworkCore.SqlRepositories
 {
-    public class ExtSqlRepository<T>:ISqlRepository<T> where T : class, new()
+    public class ExtSqlRepository<T>:IExtSqlRepository<T> where T : class, new()
     {
         readonly BusinessExtDbContext _dbContext;
 

+ 34 - 0
MicroServices/Business/Business.EntityFrameworkCore/Repository/SqlRepositories/IExtSqlRepository.cs

@@ -0,0 +1,34 @@
+using Microsoft.EntityFrameworkCore.ChangeTracking;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlClient;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+
+namespace Business.EntityFrameworkCore.SqlRepositories
+{
+    public interface IExtSqlRepository<T> where T : class, new()
+    {
+        int Insert(T entity);
+        int Insert(List<T> entitylist);
+        int Update(T entity);
+        int Update(List<T> entitylist);
+
+        int Update(Expression<Func<T, bool>> whereLambda, Expression<Func<T, T>> entity);
+
+        int Delete(Expression<Func<T, bool>> whereLambda);
+
+        int Delete(List<T> entitylist);
+
+        bool IsExist(Expression<Func<T, bool>> whereLambda);
+
+        List<T> Select();
+
+        List<T> Select(Expression<Func<T, bool>> whereLambda);
+
+        Tuple<List<T>, int> Select<S>(int pageSize, int pageIndex, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderByLambda, bool isAsc);
+
+        DataSet SelectDataBaseBySql(string sql, string tableName);
+    }
+}

+ 1 - 1
MicroServices/Business/Business.Host/Startup.cs

@@ -14,7 +14,7 @@ namespace Business
         {
             services.AddApplication<BusinessHostModule>();
             services.AddScoped(typeof(ISqlRepository<>), typeof(SqlRepository<>));
-            services.AddScoped(typeof(ISqlRepository<>), typeof(ExtSqlRepository<>));
+            services.AddScoped(typeof(IExtSqlRepository<>), typeof(ExtSqlRepository<>));
             services.AddScoped(typeof(ISystemJobAppService), typeof(SystemJobAppService));
             services.AddScoped<GZY.Quartz.MUI.Areas.MyFeature.Pages.MainModel>();
         }

+ 4 - 0
MicroServices/Business/QuartzSettings/logs/logs.txt

@@ -813,3 +813,7 @@
 {"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-10-05T19:03:05.8676435+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
 {"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-10-05T19:03:05.8759565+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
 {"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-10-05T19:03:05.8781915+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-10-09T16:44:07.4723891+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-10-09T16:44:07.5270449+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-10-09T16:44:07.531439+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-10-09T16:44:07.5335201+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}