Murphy před 2 roky
rodič
revize
7808089b8b

+ 2 - 0
MicroServices/Business/Business.Application.Contracts/SystemJob/ISystemJobAppService.cs

@@ -45,6 +45,8 @@ namespace Business.SystemJob
 
         string DoProductScheduleJob();
 
+        Task<string> SyncItemStockOccupyClear();
+
         string TestTimeOut();
     }
 }

+ 1 - 6
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -1057,7 +1057,7 @@ namespace Business.Replenishment
             var dateEnd = DateTime.Now;
             //获取瑞奇发往国科海王的记录
             var gkhwList = _ASNBOLShipperMaster.Select(a => a.Domain == input.factory_id.ToString() && (a.SoldTo == "10002080" || a.SoldTo == "10001981"));
-            var recidList = gkhwList.Select(a => a.RecID).ToList();
+            var recidList = gkhwList.Select(a => Convert.ToInt64(a.RecID)).ToList();
             //获取瑞奇发货记录
             var shipList = _ASNBOLShipperDetail.Select(a => a.Domain == input.factory_id.ToString() && a.IsActive && a.shtype == "SH" && a.Typed != "S" && a.RealQty > 0
             && itemList.Contains(a.ContainerItem) && a.ShipDate >= dateBegin && a.ShipDate <= dateEnd && !recidList.Contains(a.ASNBOLShipperRecID));//瑞奇只算瑞奇排除国科海王
@@ -3663,7 +3663,6 @@ namespace Business.Replenishment
                 var moIcitemStokc = ObjectMapper.Map<List<ic_item_stock>, List<mo_ic_item_stock>>(icitemStokc);
                 moIcitemStokc.ForEach(item => { item.GenerateNewId(help.NextId()); });
                 //插入数据
-                //await _ic_item_stock.InsertManyAsync(moIcitemStokc);
                 await MongoHelper<mo_ic_item_stock>.InsertManyAsync(moIcitemStokc);
             }
 
@@ -3703,7 +3702,6 @@ namespace Business.Replenishment
                     {
                         var mo_item_occupy = ObjectMapper.Map<List<ic_item_stockoccupy>, List<mo_ic_item_stockoccupy>>(item_occupy);
                         mo_item_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
-                        //await _ic_item_stockoccupy.InsertManyAsync(mo_item_occupy);
                         await MongoHelper<mo_ic_item_stockoccupy>.InsertManyAsync(mo_item_occupy);
                     }
                 }
@@ -3715,7 +3713,6 @@ namespace Business.Replenishment
                     mes_morder.ForEach(item => { item.bang_id = bangid; });
                     var moMes_morder = ObjectMapper.Map<List<mes_morder>, List<mo_mes_morder>>(mes_morder);
                     moMes_morder.ForEach(item => { item.GenerateNewId(help.NextId()); });
-                    //await _mes_morder.InsertManyAsync(moMes_morder);
                     await MongoHelper<mo_mes_morder>.InsertManyAsync(moMes_morder);
                 }
                 //工单子表
@@ -3725,7 +3722,6 @@ namespace Business.Replenishment
                     mes_moentry.ForEach(item => { item.bang_id = bangid; });
                     var moMes_moentry = ObjectMapper.Map<List<mes_moentry>, List<mo_mes_moentry>>(mes_moentry);
                     moMes_moentry.ForEach(item => { item.GenerateNewId(help.NextId()); });
-                    //await _mes_moentry.InsertManyAsync(moMes_moentry);
                     await MongoHelper<mo_mes_moentry>.InsertManyAsync(moMes_moentry);
                 }
 
@@ -3735,7 +3731,6 @@ namespace Business.Replenishment
                 {
                     var moMes_mooccupy = ObjectMapper.Map<List<mes_mooccupy>, List<mo_mes_mooccupy>>(mes_mooccupy);
                     moMes_mooccupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
-                    //await _mes_mooccupy.InsertManyAsync(moMes_mooccupy);
                     await MongoHelper<mo_mes_mooccupy>.InsertManyAsync(moMes_mooccupy);
                 }
             }

+ 6 - 6
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -291,11 +291,11 @@ namespace Business.ResourceExamineManagement
                             Domain = param.factoryId.ToString()
                         };
                         int make_time = _productExamineAppService.ProductTime(prodExamine);
-                        if (make_time < level1Dto.PurLT)
+                        /*if (make_time < level1Dto.PurLT)
                         {
                             //如果生产时长小于供应提前期,则按供应提前期算
                             make_time = level1Dto.PurLT;
-                        }
+                        }*/
                         //根据成品属性来判断是自制还是委外还是外购,需要考虑这种场景
                         if (level1Dto.erp_cls == 1 && param.checkflag)
                         {
@@ -777,11 +777,11 @@ namespace Business.ResourceExamineManagement
                                 Domain = param.factoryId.ToString()
                             };
                             int make = _productExamineAppService.ProductTime(prodExamine);
-                            if (make < item.PurLT)
+                            /*if (make < item.PurLT)
                             {
                                 //如果生产时长小于供应提前期,则按供应提前期算
                                 make = item.PurLT;
-                            }
+                            }*/
                             item.make_qty = item.lack_qty;
                             if (mes_MorderDto != null)
                             {
@@ -1331,11 +1331,11 @@ namespace Business.ResourceExamineManagement
                                         Domain = param.factoryId.ToString()
                                     };
                                     int make = _productExamineAppService.ProductTime(prodExamine);
-                                    if (make < sct.PurLT)
+                                    /*if (make < sct.PurLT)
                                     {
                                         //如果生产时长小于供应提前期,则按供应提前期算
                                         make = sct.PurLT;
-                                    }
+                                    }*/
                                     sct.make_qty = sct.lack_qty;
                                     if (mes_MorderDto != null)
                                     {

+ 24 - 0
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -22,6 +22,7 @@ using Amazon.Runtime;
 using Magicodes.ExporterAndImporter.Core.Extension;
 using Volo.Abp.Domain.Repositories;
 using System.Runtime.CompilerServices;
+using NUglify.JavaScript;
 
 namespace Business.ResourceExamineManagement
 {
@@ -450,6 +451,15 @@ namespace Business.ResourceExamineManagement
                     }
                 }
             }
+
+            //取数开始时间为当前日期
+            DateTime beginDate = DateTime.Now.Date;
+            DateTime endDate = DateTime.Now.Date.AddDays(4);
+            //取三天内的日计划
+            var thePeriods = periodSequenceDtls.Where(p => p.PlanDate >= beginDate && p.PlanDate <= endDate).ToList();
+            var workordList = _workOrdMaster.Select(x => x.Domain == domain && x.Status.ToLower() == "r" && thePeriods.Select(s => s.WorkOrds).Contains(x.WorkOrd)).ToList();
+            var nbrMasterList = _nbrMaster.Select(x => x.Domain == domain && x.Type == "SM" && thePeriods.Select(s => s.WorkOrds).Contains(x.WorkOrd)).ToList();
+
             //更新当天日计划的计划数量,排产数量
             foreach (var item in periodSequenceDtls)
             {
@@ -457,6 +467,16 @@ namespace Business.ResourceExamineManagement
                 //获取历史排产数据
                 var curDtl = dbPeriodSequences.FirstOrDefault(p => p.Op == item.Op && p.WorkOrds == item.WorkOrds && p.Line == item.Line && p.PlanDate == item.PlanDate && p.PlanDate == scheTime.Date);
                 item.OrdQty = curDtl == null ? item.OrdQty : curDtl.OrdQty;
+                //未来三天的日计划(工单下达,且前处理完成)状态设为r
+                if (item.PlanDate >= beginDate && item.PlanDate <= endDate && workordList.Exists(p => p.WorkOrd == item.WorkOrds))
+                {
+                    //工单不需要前处理的领料单全部出库且工单需要前处理的领料单前处理完成,则日计划自动下达
+                    var curNbrs = nbrMasterList.Where(p => p.WorkOrd == item.WorkOrds).ToList();
+                    if (curNbrs.Any() && !curNbrs.Exists(p=>p.Status.ToLower() != "c" || (p.TransType == "PrevProcess" && p.Ufld1 != "completed")))
+                    {
+                        item.Status = "r";
+                    }
+                }
             }
             using (TransactionScope scope = new TransactionScope())
             {
@@ -4072,6 +4092,10 @@ namespace Business.ResourceExamineManagement
             int op = routing.OP;
             //排产任务执行时间
             DateTime actStart = scheTime;
+            if (workOrd.JointTyped.ToUpper() == "B")
+            {
+                actStart = workOrd.OrdDate.GetValueOrDefault();
+            }
             //获取工序对应的产线,根据优先级排序
             var lines = prodLines.Where(p => p.Part == workOrd.ItemNum && p.Op == op).OrderBy(p => p.Sequence).ToList();
             //获取工序开始准备时长记录

+ 91 - 77
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1152,67 +1152,79 @@ namespace Business.ResourceExamineManagement
             //直接按间隔多少天一次来处理数据,定时任务按周四来考虑。
             DateTime toTime = DateTime.Now; //new DateTime(2023, 7, 6);
             DateTime starttime = toTime.Date.AddDays(1);
-            DateTime endtime = toTime.Date.AddDays(7);
+            DateTime endtime = toTime.Date.AddDays(28);
             //只合并要货令
-            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && s.state == 1).Result;
-            List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.icitem_id).Distinct().Contains(s.Id)).Result;
+            List<srm_pr_main> alllist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && s.state == 1).Result;
+            List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && alllist.Select(c => c.icitem_id).Distinct().Contains(s.Id)).Result;
 
-            var occupylist = _mysql_srm_po_occupy.GetListAsync(s => prlist.Select(c => c.Id).Contains(s.polist_id.GetValueOrDefault()) && s.company_id.ToString() == companyid && s.IsDeleted == false).Result;
+            var occupylist = _mysql_srm_po_occupy.GetListAsync(s => alllist.Select(c => c.Id).Contains(s.polist_id.GetValueOrDefault()) && s.company_id.ToString() == companyid && s.IsDeleted == false).Result;
 
-            List<srm_pr_main> insetPrList = new List<srm_pr_main>();
-            List<srm_pr_main> updatePrList = new List<srm_pr_main>();
-            long Nbr = help.NextId();
-            foreach (var pr in prlist)
+            List<srm_pr_main> insetAllList = new List<srm_pr_main>();
+            List<srm_pr_main> updateAllList = new List<srm_pr_main>();
+
+            //每次发布四周的数据
+            for (int i = 0; i < 4; i++)
             {
-                bool bl = pr.sentry_id == null;//区分是销售订单和非销售订单的合并。
-                //找到是否生成了新的PR  当前数据是否已经产生合并,则不再合并。
-                var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && s.IsRequireGoods == pr.IsRequireGoods && s.supplier_type==pr.supplier_type && (s.sentry_id == null) == bl);
-                //var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id);
-                if (newPr == null)
+                starttime = toTime.Date.AddDays(i * 7 + 1);
+                endtime = toTime.Date.AddDays((i + 1) * 7);
+                List<srm_pr_main> prlist = alllist.Where(s => s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime).ToList();
+                List<srm_pr_main> insetPrList = new List<srm_pr_main>();
+                List<srm_pr_main> updatePrList = new List<srm_pr_main>();
+                long Nbr = help.NextId();
+                foreach (var pr in prlist)
                 {
-                    //有多条才进行合并
-                    var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && s.IsRequireGoods == pr.IsRequireGoods && s.supplier_type == pr.supplier_type && (s.sentry_id == null) == bl).ToList();
-                    //var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id).ToList();
-                    if (ilist.Count > 1)
+                    bool bl = pr.sentry_id == null;//区分是销售订单和非销售订单的合并。
+                                                   //找到是否生成了新的PR  当前数据是否已经产生合并,则不再合并。
+                    var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && s.IsRequireGoods == pr.IsRequireGoods && s.supplier_type == pr.supplier_type && (s.sentry_id == null) == bl);
+                    if (newPr == null)
                     {
-                        var icitem = ic_Items.Find(s => s.Id == pr.icitem_id);
-                        var prRefoccupy = occupylist.Where(s => s.polist_id == pr.Id).ToList();
-                        newPr = help.DeepCopy(pr);
-                        newPr.GenerateNewId(help.NextId());
-                        prRefoccupy.ForEach(a => {
-                            a.polist_id = newPr.Id;
-                        });
-                        newPr.pr_billno = Nbr.ToString();//pr单号
-                        newPr.state = pr.state;
-                        newPr.pr_rqty = ilist.Sum(s => s.pr_rqty);//需求数量
-                        newPr.pr_aqty = ilist.Sum(s => s.pr_aqty);//申请数量
-                        newPr.pr_sqty = ilist.Sum(s => s.pr_sqty);//建议数量
-
-                        newPr.pr_ssend_date = ilist.Min(s => s.pr_ssend_date);//系统建议下单日期
-                        newPr.pr_sarrive_date = ilist.Min(s => s.pr_sarrive_date);//系统建议到达日期(建议到货日期)
-                        /*            newPr.pr_psend_date = ilist.Min(s => s.pr_psend_date);//计划下单日期
-                                    newPr.pr_parrive_date = ilist.Min(s => s.pr_parrive_date);//计划到达日期
-                                    newPr.pr_rarrive_date = ilist.Min(s => s.pr_rarrive_date);//需求到货日期*/
-
-                        //newPr.pr_sysprice = newPr.pr_rqty * pr.pr_price * (1 + pr.pr_rate);//系统价格(含税)
-                        newPr.pr_orderprice = newPr.pr_aqty * pr.pr_sysprice;//订单价格(含税)
-                        ilist.ForEach(s => { s.refer_pr_billno = newPr.pr_billno; });
-                        insetPrList.Add(newPr);
-                        ilist.ForEach(s => { s.state = 0; });
-                        updatePrList.AddRange(ilist);
-                        Nbr++;
+                        //有多条才进行合并
+                        var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && s.IsRequireGoods == pr.IsRequireGoods && s.supplier_type == pr.supplier_type && (s.sentry_id == null) == bl).ToList();
+                        //var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id).ToList();
+                        if (ilist.Count > 1)
+                        {
+                            var icitem = ic_Items.Find(s => s.Id == pr.icitem_id);
+                            var prRefoccupy = occupylist.Where(s => s.polist_id == pr.Id).ToList();
+                            newPr = help.DeepCopy(pr);
+                            newPr.GenerateNewId(help.NextId());
+                            prRefoccupy.ForEach(a => {
+                                a.polist_id = newPr.Id;
+                            });
+                            newPr.pr_billno = Nbr.ToString();//pr单号
+                            newPr.state = pr.state;
+                            newPr.pr_rqty = ilist.Sum(s => s.pr_rqty);//需求数量
+                            newPr.pr_aqty = ilist.Sum(s => s.pr_aqty);//申请数量
+                            newPr.pr_sqty = ilist.Sum(s => s.pr_sqty);//建议数量
+
+                            newPr.pr_ssend_date = ilist.Min(s => s.pr_ssend_date);//系统建议下单日期
+                            newPr.pr_sarrive_date = ilist.Min(s => s.pr_sarrive_date);//系统建议到达日期(建议到货日期)
+                            /*            newPr.pr_psend_date = ilist.Min(s => s.pr_psend_date);//计划下单日期
+                                        newPr.pr_parrive_date = ilist.Min(s => s.pr_parrive_date);//计划到达日期
+                                        newPr.pr_rarrive_date = ilist.Min(s => s.pr_rarrive_date);//需求到货日期*/
+
+                            //newPr.pr_sysprice = newPr.pr_rqty * pr.pr_price * (1 + pr.pr_rate);//系统价格(含税)
+                            newPr.pr_orderprice = newPr.pr_aqty * pr.pr_sysprice;//订单价格(含税)
+                            ilist.ForEach(s => { s.refer_pr_billno = newPr.pr_billno; });
+                            insetPrList.Add(newPr);
+                            ilist.ForEach(s => { s.state = 0; });
+                            updatePrList.AddRange(ilist);
+                            Nbr++;
+                        }
                     }
                 }
+                insetAllList.AddRange(insetPrList);
+                updateAllList.AddRange(updatePrList);
             }
-            if (insetPrList.Any())
+
+            if (insetAllList.Any())
             {
-                var nbrlistDto = _serialNumberAppService.GetBillNo(insetPrList[0].factory_id.ToString(), "PR", insetPrList.Count, "admin", 1);
+                var nbrlistDto = _serialNumberAppService.GetBillNo(insetAllList[0].factory_id.ToString(), "PR", insetAllList.Count, "admin", 1);
                 int index = 0;
-                foreach (var p in insetPrList)
+                foreach (var p in insetAllList)
                 {
                     if (nbrlistDto[index] != null)
                     {
-                        updatePrList.Where(x => x.refer_pr_billno == p.pr_billno).ToList().ForEach(c =>
+                        updateAllList.Where(x => x.refer_pr_billno == p.pr_billno).ToList().ForEach(c =>
                         {
                             c.refer_pr_billno = nbrlistDto[index].NbrResult.ToString();
                         });
@@ -1238,13 +1250,13 @@ namespace Business.ResourceExamineManagement
                 try
                 {
                     
-                    if (insetPrList.Any())
+                    if (insetAllList.Any())
                     {
-                        _businessDbContext.BulkInsert(insetPrList);
+                        _businessDbContext.BulkInsert(insetAllList);
                     }
-                    if (updatePrList.Any())
+                    if (updateAllList.Any())
                     {
-                        _businessDbContext.BulkUpdate(updatePrList);
+                        _businessDbContext.BulkUpdate(updateAllList);
                     }
                     if (occupylist.Any())
                     {
@@ -1266,9 +1278,10 @@ namespace Business.ResourceExamineManagement
         /// <param name="companyid"></param>
         public async Task<string> PrSendSAP(string companyid)
         {
+            //按要求推送四周数据
             DateTime toTime = DateTime.Now;
             DateTime starttime = toTime.Date.AddDays(1);
-            DateTime endtime = toTime.Date.AddDays(7);
+            DateTime endtime = toTime.Date.AddDays(28);
             //取出采购申请数据
             List<srm_pr_main> prapplyList = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && s.state == 1 && s.IsRequireGoods == 0).Result;
             string seqSql = "";
@@ -1387,10 +1400,10 @@ namespace Business.ResourceExamineManagement
         //PR自动审核
         public async Task<string> PrAutoApprove(string companyid)
         {
-            //直接按间隔多少天一次来处理数据,定时任务按周四来考虑
+            //按要求改成发布四周任务
             DateTime toTime = DateTime.Now.Date;
             DateTime starttime = toTime.AddDays(1);
-            DateTime endtime = toTime.AddDays(7);
+            DateTime endtime = toTime.AddDays(28);
             List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.IsRequireGoods == 1 && s.pr_ssend_date >= starttime &&
             s.pr_ssend_date <= endtime && s.state == 1).Result;
 
@@ -1727,7 +1740,7 @@ namespace Business.ResourceExamineManagement
                 }
             }
             
-            List<mo_ic_item_stockoccupy> item_stockoccupy = await _ic_item_stockoccupy.GetListAsync(s => seIds.Contains(s.orderentry_id.Value) && bangidList.Contains(s.bang_id));
+            List<mo_ic_item_stockoccupy> item_stockoccupy = await _ic_item_stockoccupy.GetListAsync(s => seIds.Contains(s.orderentry_id.GetValueOrDefault()) && bangidList.Contains(s.bang_id));
 
             using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
             {
@@ -2702,7 +2715,6 @@ namespace Business.ResourceExamineManagement
                 }
                 if (checkMo.Any())
                 {
-
                     var rtn = await OrderKittingCheck(checkMo);
                     if (rtn != null && rtn.examines != null)
                     {
@@ -3883,7 +3895,7 @@ namespace Business.ResourceExamineManagement
             };
             nbrMasterList.Add(newNbr);
             List<string> headAccount = new List<string>();
-            int i = 1;
+            short i = 1;
             bool typed = !string.IsNullOrEmpty(workord.Typed);
             detail.ForEach(a =>
             {
@@ -4777,12 +4789,11 @@ 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.ToUpper() == "W")).ToList();
-            string result = "OK";
             if (workOrds.Any())
             {
-                result = await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, domain, 2);
+                await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, domain, 2);
             }
-            return result;
+            return "OK";
         }
 
         /// <summary>
@@ -4793,31 +4804,34 @@ namespace Business.ResourceExamineManagement
         /// <exception cref="NotImplementedException"></exception>
         public async Task<string> UpdatePlanDate(UpdateDto input)
         {
-            WorkOrdMaster workOrd = _workOrdMaster.Select(p=>p.IsActive && p.Domain == input.domain && p.WorkOrd == input.workord).FirstOrDefault();
-            if (workOrd == null)
-            {
-                return "NO|工单【"+input.workord+"】不存在,请联系系统管理员!";
-            }
-            //更新工单计划开工日期,调整是否需要处理提前期状态字段为B
-            workOrd.OrdDate = input.planDate;
-            workOrd.JointTyped = "B";
-            _workOrdMaster.Update(workOrd);
-
             //获取需要排产的工单(获取四周的工单:正常工单+已审批通过的特殊工单)
             DateTime endDate = DateTime.Now.Date.AddDays(28).AddDays(1);
             //取数开始时间为当前天的下一天
             DateTime startTime = DateTime.Now;
             //尚未开始生产的工单+正在生产的工单
-            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.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();
-            //调用优先级计算算法
-            workOrds = _replenishmentAppService.CalcPriority(workOrds.Select(p=>p.WorkOrd).ToList(), input.domain);
+            var workOrds = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.domain && (p.WorkOrd == input.workord || (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();
+            if (!workOrds.Exists(p=>p.WorkOrd == input.workord))
+            {
+                return "NO|工单【" + input.workord + "】不存在,请联系系统管理员!";
+            }
+            //计算工单优先级
+            var workInfos = _replenishmentAppService.CalcPriority(workOrds.Select(p => p.WorkOrd).ToList(), input.domain);
+            workOrds.ForEach(p => {
+                p.OrdDate = p.WorkOrd == input.workord ? input.planDate : p.OrdDate;
+                p.JointTyped = p.WorkOrd == input.workord ? "B" : p.JointTyped;
+                p.Priority = p.WorkOrd == input.workord ? workInfos.First(p => p.WorkOrd == input.workord).Priority : p.Priority;
+            });
             //执行排产
-            string result = "OK";
             if (workOrds.Any())
             {
-                result = await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, input.domain, 2);
+                await _productionScheduleAppService.DoProductSchedule(startTime, workOrds, input.domain, 2);
             }
-            return result;
+            //更新原工单优先级
+            WorkOrdMaster workOrd = _workOrdMaster.Select(p => p.IsActive && p.Domain == input.domain && p.WorkOrd == input.workord).FirstOrDefault();
+            workOrd.Priority = workInfos.First(p => p.WorkOrd == workOrd.WorkOrd).Priority;
+            workOrd.JointTyped = "";
+            _workOrdMaster.Update(workOrd);
+            return "OK";
         }
 
         /// <summary>
@@ -4845,7 +4859,7 @@ namespace Business.ResourceExamineManagement
                             var dtls = subDetalis.Where(s => s.substitute_group_id == g.Id).ToList();
                             foreach (var dtl in dtls)
                             {
-                                var l = list.Find(s => s.item_number == dtl.icitem_number && s.qty == dtl.replace_qty);
+                                var l = list.Find(s => s.item_number == dtl.icitem_number);
                                 if (l == null)
                                 {
                                     return "当前替代方案【" + code + "】的标准件未找到相同数量相同物料的BOM明细。";

+ 107 - 0
MicroServices/Business/Business.Application/SystemJobManagement/SystemJobAppService.cs

@@ -128,6 +128,11 @@ namespace Business.SystemJobManagement
         private IRepository<srm_po_main, long> _srm_po_main;
         private IRepository<srm_po_list, long> _srm_po_list;
 
+        private IRepository<ic_item_stockoccupy, long> _ic_item_stockoccupy;
+        private ISqlRepository<NbrMaster> _nbrMaster;
+        private ISqlRepository<NbrDetail> _nbrDetail;
+        private readonly ISqlRepository<ASNBOLShipperDetail> _ASNBOLShipperDetail;
+
         /// <summary>
         /// 生产排产
         /// </summary>
@@ -164,6 +169,10 @@ namespace Business.SystemJobManagement
          ISqlRepository<PurOrdDetail> purOrdDetail,
          IRepository<srm_po_main, long> srm_po_main,
          IRepository<srm_po_list, long> srm_po_list,
+         ISqlRepository<NbrMaster> nbrMaster,
+         ISqlRepository<NbrDetail> nbrDetail,
+         IRepository<ic_item_stockoccupy, long> ic_item_stockoccupy,
+         ISqlRepository<ASNBOLShipperDetail> ASNBOLShipperDetail,
          BusinessDbContext businessDbContext
          )
         {
@@ -199,6 +208,10 @@ namespace Business.SystemJobManagement
             _purOrdDetail = purOrdDetail;
             _srm_po_main = srm_po_main;
             _srm_po_list = srm_po_list;
+            _nbrMaster = nbrMaster;
+            _nbrDetail = nbrDetail;
+            _ic_item_stockoccupy = ic_item_stockoccupy;
+            _ASNBOLShipperDetail = ASNBOLShipperDetail;
         }
 
         public string SyncWMSDataToMySQLJob()
@@ -1181,5 +1194,99 @@ namespace Business.SystemJobManagement
             }
             return poStatu;
         }
+
+        /// <summary>
+        /// 同步清除库存占用记录(工单针对原材料,销售订单针对成品库存占用)
+        /// </summary>
+        /// <returns></returns>
+        public async Task<string> SyncItemStockOccupyClear()
+        {
+            try
+            {
+                IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
+                string domain = configuration.GetConnectionString("Factory_id");
+                string companyid = configuration.GetConnectionString("Company_id");
+                if (string.IsNullOrEmpty(domain) || string.IsNullOrEmpty(companyid))
+                {
+                    return "请检查配置文件中公司和工厂编码是否维护。";
+                }
+                DateTime start = DateTime.Now.Date.AddDays(-1);
+
+                //销售订单取过去两天和当天的记录,已发出的数据,进行清理库存占用表记录
+                var ASNBOLdtls = _ASNBOLShipperDetail.Select(x => x.Domain == domain && x.IsActive && x.shtype == "SH" && x.Typed != "S" && x.RealQty > 0 && x.UpdateTime >= start).ToList();
+                var ordnbr = ASNBOLdtls.Select(x => x.OrdNbr).ToList();
+                var alldtls = ASNBOLdtls.Where(x => ordnbr.Contains(x.OrdNbr)).ToList();
+
+                List<ic_item_stockoccupy> dellist = new List<ic_item_stockoccupy>();
+                List<ic_item_stockoccupy> updtelist = new List<ic_item_stockoccupy>();
+
+                var seorderentrys = _mysql_crm_seorderentry.GetListAsync(x => x.factory_id.ToString() == domain && ordnbr.Contains(x.bill_no)).Result;
+                var occupys = _ic_item_stockoccupy.GetListAsync(x => x.factory_id.ToString() == domain && seorderentrys.Select(c => c.Id).Contains(x.orderentry_id.GetValueOrDefault())).Result;
+                foreach (var se in seorderentrys)
+                {
+                    var seASNBOLdtl = alldtls.Where(x => x.OrdNbr == se.bill_no && x.ContainerItem == se.item_number).ToList();
+                    if (seASNBOLdtl.Any())
+                    {
+                        var oup = occupys.Find(x => x.icitem_number == se.item_number);
+                        if (oup != null)
+                        {
+                            //先按订单数量更新占用数量,然后通过占用数量-发货数量,计算更新占用数量。
+                            oup.quantity = se.qty.GetValueOrDefault();
+                            decimal cale = oup.quantity - seASNBOLdtl.Sum(x => x.QtyToShip.GetValueOrDefault());
+                            if (cale > 0)
+                            {
+                                oup.quantity = cale;
+                                updtelist.Add(oup);
+                            }
+                            else
+                            {
+                                dellist.Add(oup);
+                            }
+                        }
+                    }
+                }
+                //工单按领料单已出库完成记录,清理掉库存占用记录
+                List<NbrMaster> nbrlist = _nbrMaster.Select(x => x.Domain == domain && x.Type.ToUpper() == "SM" && x.UpdateTime >= start).ToList();
+               
+                var workords = nbrlist.Select(x => x.WorkOrd).Distinct();
+                var occupy = _ic_item_stockoccupy.GetListAsync(x => workords.Contains(x.morder_mo)).Result;
+                var nbrDtls = _nbrDetail.Select(x => x.Domain == domain && nbrlist.Select(c => c.RecID).Contains(x.NbrRecID)).ToList();
+                foreach (var nbr in nbrlist)
+                {
+                    var dtls = nbrDtls.Where(x => x.NbrRecID == nbr.RecID).ToList();
+                    foreach (var dtl in dtls)
+                    {
+                        var occ = occupy.Find(x => x.icitem_number == dtl.ItemNum);
+                        if (occ != null)
+                        {
+                            occ.quantity = dtl.QtyOrd.GetValueOrDefault();
+                            decimal differ = occ.quantity - dtl.QtyFrom.GetValueOrDefault();
+                            if (differ > 0)
+                            {
+                                occ.quantity = differ;
+                                updtelist.Add(occ);
+                            }
+                            else
+                            {
+                                dellist.Add(occ);
+                            }
+                        }
+                    }
+                }
+                if (updtelist.Any())
+                {
+                    _businessDbContext.BulkUpdate(updtelist);
+                }
+                if (dellist.Any())
+                {
+                    await _ic_item_stockoccupy.HardDeleteAsync(dellist);
+                }
+                return "ok";
+            }
+            catch (Exception ex)
+            {
+                return ex.Message;
+            }
+        }
     }
 }

+ 6 - 1
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ASNBOLShipperDetail.cs

@@ -70,6 +70,11 @@ namespace Business.Domain
         [Comment("物料编码")]
         public string ContainerItem { get; set; }
 
+        /// <summary>
+        /// OrdNbr
+        /// </summary>
+        [Comment("OrdNbr")]
+        public string OrdNbr { get; set; }
 
         /// <summary>
         /// 行号
@@ -100,7 +105,7 @@ namespace Business.Domain
         /// 主表ID
         /// </summary>
         [Comment("主表ID")]
-        public int ASNBOLShipperRecID { get; set; }
+        public long ASNBOLShipperRecID { get; set; }
 
         /// <summary>
         /// 创建时间

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

@@ -90,7 +90,7 @@ namespace Business.Domain
         /// 行号
         /// </summary>
         [Comment("行号")]
-        public int Line { get; set; }
+        public short Line { get; set; }
 
         /// <summary>
         /// 主表主键

+ 11 - 0
MicroServices/Business/Business.HttpApi/Controllers/SystemJobController.cs

@@ -76,6 +76,17 @@ namespace Business.Controllers
             return _SystemJobAppService.DoProductScheduleJob();
         }
 
+        /// <summary>
+        /// 定时同步WMS物料订单等基础数据到MySQL
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        [Route("SyncItemStockOccupyClear")]
+        public Task<string> SyncItemStockOccupyClear()
+        {
+            return _SystemJobAppService.SyncItemStockOccupyClear();
+        }
+
         /// <summary>
         /// 测试接口超时
         /// </summary>