Quellcode durchsuchen

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

tangdi vor 2 Jahren
Ursprung
Commit
d2c4b11beb

+ 65 - 14
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -23,6 +23,8 @@ using Magicodes.ExporterAndImporter.Core.Extension;
 using Volo.Abp.Domain.Repositories;
 using System.Runtime.CompilerServices;
 using NUglify.JavaScript;
+using MathNet.Numerics.Optimization.LineSearch;
+using MathNet.Numerics;
 
 namespace Business.ResourceExamineManagement
 {
@@ -487,6 +489,35 @@ namespace Business.ResourceExamineManagement
                     }
                 }
             }
+
+            //获取计划日期在当前日期之前且报工数量为0的日计划
+            List<PeriodSequenceDet> oldSequenceDets = _periodSequenceDet.Select(p =>p.Domain ==domain && p.PlanDate < scheTime.Date && p.CompQty == 0).ToList();
+            List<ScheduleResultOpMaster> oldSchedules = new List<ScheduleResultOpMaster>();
+            if (oldSequenceDets.Any())
+            {
+                var oldWorkords = oldSequenceDets.Select(p => p.WorkOrds).ToList();
+                var oldDate = oldSequenceDets.Select(p => p.PlanDate).ToList();
+                var oldOps = oldSequenceDets.Select(p => p.Op).ToList();
+                
+                //更新计划日期为当前日期
+                foreach (var oldItem in oldSequenceDets)
+                {
+                    var curSche = _scheduleResultOpMaster.Select(p => p.Domain == domain && p.WorkOrd == oldItem.WorkOrds && p.WorkDate== oldItem.PlanDate && p.Op == oldItem.Op).FirstOrDefault();
+                    if (curSche != null)
+                    {
+                        oldSchedules.Add(curSche);
+                    }
+                    oldItem.PlanDate = scheTime.Date;
+                }
+                string strScheTime = scheTime.Date.ToString("yyyy-MM-dd");
+                foreach (var oldItem in oldSchedules)
+                {
+                    oldItem.WorkDate = scheTime.Date;
+                    oldItem.WorkStartTime = Convert.ToDateTime(oldItem.WorkStartTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(oldItem.WorkStartTime.ToString("yyyy-MM-dd"), strScheTime));
+                    oldItem.WorkEndTime = Convert.ToDateTime(oldItem.WorkEndTime.ToString("yyyy-MM-dd HH:mm:ss").Replace(oldItem.WorkEndTime.ToString("yyyy-MM-dd"), strScheTime));
+                }
+            }
+            
             using (TransactionScope scope = new TransactionScope())
             {
                 try
@@ -502,10 +533,7 @@ namespace Business.ResourceExamineManagement
                     {
                         await _mysql_mes_morder.UpdateManyAsync(mesMorder);
                     }
-                    //删除当前日期下一天开始的工单排产记录
-                    _periodSequenceDet.Delete(p=>p.PlanDate >scheTime.Date && p.Domain == domain && p.OrdQty != 0);
-                    _scheduleResultOpMaster.Delete(p=>p.WorkDate > scheTime.Date && p.Domain == domain);
-
+                    
                     //添加工单工序准备开始时间记录
                     if (inserts.Any())
                     {
@@ -516,23 +544,46 @@ namespace Business.ResourceExamineManagement
                     {
                         _workOrdSetupTimeRecord.Update(updates);
                     }
+                    //已投产的工单,只需要保存当前日期下一天的排产记录
+                    List<string> sczWorkords = workOrds.Where(p => p.Status.ToUpper() == "W").Select(p=>p.WorkOrd).ToList();
+                    if (sczWorkords.Any())
+                    {
+                        //删除当前日期下一天开始的工单排产记录
+                        _periodSequenceDet.Delete(p => sczWorkords.Contains(p.WorkOrds) && p.PlanDate > scheTime.Date && p.Domain == domain && p.OrdQty != 0);
+                        _scheduleResultOpMaster.Delete(p => sczWorkords.Contains(p.WorkOrd) && p.WorkDate > scheTime.Date && p.Domain == domain);
+
+                        //保存下一天的日计划数据
+                        _periodSequenceDet.Insert(periodSequenceDtls.Where(p => sczWorkords.Contains(p.WorkOrds) && p.PlanDate > scheTime.Date).ToList());
+                        _scheduleResultOpMaster.Insert(scheduleMasters.Where(p => sczWorkords.Contains(p.WorkOrd) && p.WorkDate > scheTime.Date).ToList());
+                    }
+                    //未投产的工单,当前日期及以后的排产记录全部删除
+                    List<string> wscWorkords = workOrds.Where(p => p.Status.ToUpper() != "W").Select(p => p.WorkOrd).ToList();
+                    if (wscWorkords.Any())
+                    {
+                        //删除当前日期及以后的工单排产记录
+                        _periodSequenceDet.Delete(p => wscWorkords.Contains(p.WorkOrds) && p.PlanDate >= scheTime.Date && p.Domain == domain && p.OrdQty != 0);
+                        _scheduleResultOpMaster.Delete(p => wscWorkords.Contains(p.WorkOrd) && p.WorkDate >= scheTime.Date && p.Domain == domain);
 
-                    //当天日计划数据调整
-                    //获取当天重新排产的工单日计划
-                    var tdSeqDtls = periodSequenceDtls.Where(p => p.PlanDate == scheTime.Date).ToList();
-                    var tdSchMsts = scheduleMasters.Where(p => p.WorkDate == scheTime.Date).ToList();
-                    ////删除数据库中的已存在的当天日计划
-                    //_periodSequenceDet.Delete(p=>p.Domain == domain && tdSeqDtls.Select(m => m.Op).Contains(p.Op) && tdSeqDtls.Select(m => m.WorkOrds).Contains(p.WorkOrds) && p.PlanDate == scheTime.Date && p.OrdQty != 0);
-                    //_scheduleResultOpMaster.Delete(p=>p.Domain == domain && tdSchMsts.Select(m => m.Op).Contains(p.Op) && tdSchMsts.Select(m => m.WorkOrd).Contains(p.WorkOrd) && p.WorkDate == scheTime.Date);
-                    //保存下一天的日计划数据
-                    _periodSequenceDet.Insert(periodSequenceDtls.Where(p=>p.PlanDate > scheTime.Date).ToList());
-                    _scheduleResultOpMaster.Insert(scheduleMasters.Where(p => p.WorkDate > scheTime.Date).ToList());
+                        //保存当前日期及以后的日计划数据
+                        _periodSequenceDet.Insert(periodSequenceDtls.Where(p => wscWorkords.Contains(p.WorkOrds) && p.PlanDate >= scheTime.Date).ToList());
+                        _scheduleResultOpMaster.Insert(scheduleMasters.Where(p => wscWorkords.Contains(p.WorkOrd) && p.WorkDate >= scheTime.Date).ToList());
+                    }
+                    //更新过期日计划的计划开工日期
+                    if (oldSequenceDets.Any())
+                    {
+                        _periodSequenceDet.Update(oldSequenceDets);
+                    }
+                    if (oldSchedules.Any())
+                    {
+                        _scheduleResultOpMaster.Update(oldSchedules);
+                    }
                     scope.Complete();
                 }
                 catch (Exception ex)
                 {
                     new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductSchedule", "保存排产数据失败:" + ex.Message, _currentTenant.Id.ToString());
                     scope.Dispose();
+                    return "NO|排产数据保存失败";
                 }
             }
 

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

@@ -73,7 +73,7 @@ namespace Business.ResourceExamineManagement
         private readonly IRepository<mo_ic_item,long> _ic_item;
         private IRepository<ic_item, long> _mysql_ic_item;
 
-        private IRepository<ic_demandschedule, long> __mysql_ic_demandschedule;
+        private IRepository<ic_demandschedule, long> _mysql_ic_demandschedule;
 
         /// <summary>
         /// 物料BOM
@@ -525,7 +525,7 @@ namespace Business.ResourceExamineManagement
             _ic_item_stockoccupy = ic_item_stockoccupy;
             _srm_supplier = srm_supplier;
             _mysql_ic_item = mysql_ic_item;
-            __mysql_ic_demandschedule= mysql_ic_demandschedule;
+            _mysql_ic_demandschedule= mysql_ic_demandschedule;
             _mysql_ic_bom = mysql_ic_bom;
             _mysql_ic_bom_child = mysql_ic_bom_child;
             _mysql_crm_seorder = mysql_crm_seorder;
@@ -5679,11 +5679,18 @@ namespace Business.ResourceExamineManagement
                 }).ToList();
                 //需要测试工单没有做资源检查会不会报错
                 var examineIds = workExamineResult.Select(s => s.examineId).ToList();
-                var examines=_mysql_bom_child_examine.GetListAsync(a => examineIds.Contains(a.examine_id.Value) && a.erp_cls==3 && a.lack_qty>0 && a.factory_id.ToString() == domain).Result;
+                var examines=_mysql_bom_child_examine.GetListAsync(a => examineIds.Contains(a.examine_id.Value) && a.erp_cls==3 && a.factory_id.ToString() == domain).Result;
                 var pickBills = _nbrDetail.Select(a => workordList.Contains(a.WorkOrd) && a.Type.ToUpper()=="SM" && a.Domain == domain);
                 var dsList=_srm_polist_ds.Select(a => a.requestdate <= endTime && a.domain==domain);
                 var itemList = _itemMaster.Select(a => examines.Select(e=>e.item_number).Distinct().ToList().Contains(a.ItemNum) && a.Domain == domain);
-                var itemListStock = _SAPInv.Select(a => examines.Select(e => e.item_number).Distinct().ToList().Contains(a.MATNR) && (a.LGORT=="1000" || a.LGORT == "1001" || a.LGORT == "5007" || a.LGORT == "5008") && a.WERKS == domain);
+                var locationRange = _configurationItem.Select(x => x.FldName == "MRPLocationRange" && x.Domain == domain).FirstOrDefault();
+
+                List<string> locationList = new List<string> { "1000", "1001", "5007", "5008"};
+                if (locationRange != null && locationRange.Val != null)
+                {
+                    locationList = locationRange.Val.SplitToArray(",").ToList();
+                }
+                var itemListStock = _SAPInv.Select(a => examines.Select(e => e.item_number).Distinct().ToList().Contains(a.MATNR) && locationList.Contains(a.LGORT) && a.WERKS == domain);
                 List<ic_demandschedule> ds = new List<ic_demandschedule>();
                 for(int i=0;i<4;i++)
                 {
@@ -5732,7 +5739,7 @@ namespace Business.ResourceExamineManagement
                                 itemds.mesqty =d.NeedQty- pickBills.Where(a=> workItem.Select(s=>s.WorkOrd).Contains(a.WorkOrd) && a.ItemNum== d.ItemNum).Sum(q=>q.QtyRec);
                                 itemds.locqty = itemListStock.Where(a=>a.MATNR==d.ItemNum).Sum(a=>a.LABST+a.INSME);
                                 //累计在途数量
-                                itemds.sechedqty = dsList.Where(a => a.requestdate<itemds.arrivaldate).Sum(a=>a.schedqty-a.sentqty);
+                                itemds.sechedqty = dsList.Where(a => a.requestdate<itemds.arrivaldate && a.itemnum==d.ItemNum).Sum(a=>a.schedqty-a.sentqty);
                                 itemds.tosechedqty = itemds.locqty+itemds.sechedqty-itemds.mesqty;
                                 itemds.status = "";
                                 itemds.remarks = "";
@@ -5746,6 +5753,8 @@ namespace Business.ResourceExamineManagement
                         }
                     }
                 }
+                await _mysql_ic_demandschedule.HardDeleteAsync(a => a.status != "P");
+                _srm_polist_ds.Delete(a=>a.status=="N");
                 await _businessDbContext.BulkInsertAsync(ds);
                 return "ok";
             }

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

@@ -57,6 +57,12 @@ namespace Business.Domain
         [Comment("订单数量")]
         public decimal? OrdQty { get; set; }
 
+        /// <summary>
+        /// 报工数量
+        /// </summary>
+        [Comment("报工数量")]
+        public decimal CompQty { get; set; }
+
         /// <summary>
         /// 工单
         /// </summary>

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/Production/ScheduleResultOpMaster.cs

@@ -49,7 +49,7 @@ namespace Business.Domain
         /// 工序
         /// </summary>
         [Comment("工序")]
-        public int? Op { get; set; }
+        public int Op { get; set; }
 
         /// <summary>
         /// 计划日期