Ver Fonte

代码提交

tangdi há 2 anos atrás
pai
commit
bea34ae1d7

+ 1 - 1
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/IResourceExamineAppService.cs

@@ -61,7 +61,7 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         /// <param name="workOrds"></param>
         /// <returns></returns>
-        Task<string> PlanOrderResourceCheck(string companyid);
+        Task<string> PlanOrderResourceCheck(string domain);
 
         /// <summary>
         /// ×ÊÔ´¼ì²é½á¹ûÆÀÉó

+ 10 - 0
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -742,6 +742,7 @@ namespace Business.ResourceExamineManagement
                             bang_id = bangid
                         };
                         Mes_MorderDto mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
+
                         ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                         {
                             ItemNum = item.item_number,
@@ -762,6 +763,10 @@ namespace Business.ResourceExamineManagement
                             var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
                             if (mes_Morders != null)
                             {
+                                var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, item.lack_qty, bangid);
+                                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));
@@ -1280,6 +1285,11 @@ 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);
+
                                         //子工单生成的检查明细,还是挂接到主工单上。
                                         //mes_morder = ObjectMapper.Map<mo_mes_morder, mes_morder>(mes_Morders);
                                         mes_Morders.moentry_sys_etime = dateTime.AddDays(-1);

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

@@ -20,6 +20,7 @@ using Amazon.Runtime.Internal.Util;
 using IdentityModel.Client;
 using Amazon.Runtime;
 using Magicodes.ExporterAndImporter.Core.Extension;
+using Volo.Abp.Domain.Repositories;
 
 namespace Business.ResourceExamineManagement
 {
@@ -141,6 +142,11 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         private ISqlRepository<NbrMaster> _nbrMaster;
 
+        /// <summary>
+        /// 生产工单主表
+        /// </summary>
+        private readonly IRepository<mes_morder, long> _mysql_mes_morder;
+
         /// <summary>
         /// 工厂id
         /// </summary>
@@ -168,7 +174,8 @@ namespace Business.ResourceExamineManagement
             ISqlRepository<GeneralizedCodeMaster> generalizedCodeMaster,
             ICurrentTenant currentTenant,
             ISqlRepository<ScheduleExceptionMaster> scheduleExceptionMaster,
-            ISqlRepository<NbrMaster> nbrMaster
+            ISqlRepository<NbrMaster> nbrMaster,
+            IRepository<mes_morder, long> mysql_mes_morder
             )
         {
             _itemMaster = itemMaster;
@@ -188,6 +195,7 @@ namespace Business.ResourceExamineManagement
             _generalizedCodeMaster = generalizedCodeMaster;
             _currentTenant = currentTenant;
             _scheduleExceptionMaster = scheduleExceptionMaster;
+            _mysql_mes_morder = mysql_mes_morder;
         }
         #endregion
 
@@ -356,12 +364,28 @@ namespace Business.ResourceExamineManagement
                     item.DueDate = scheduleList.Max(s => s.WorkEndTime);
                 }
             }
+            var mesMorder = _mysql_mes_morder.GetListAsync(s => workOrds.Select(x => x.WorkOrd).Contains(s.morder_no) && s.factory_id.ToString() == domain).Result;
+            if(mesMorder.Any()) {
+                foreach (var mo in mesMorder)
+                {
+                    var wo = workOrds.Find(s => s.WorkOrd == mo.morder_no);
+                    if (wo != null)
+                    {
+                        mo.moentry_sys_stime = wo.OrdDate;
+                        mo.moentry_sys_etime = wo.DueDate;
+                    }
+                }
+            }
             using (TransactionScope scope = new TransactionScope())
             {
                 try
                 {
                     //更新工单计划开工时间、计划结束时间
                     _workOrdMaster.Update(workOrds);
+                    if (mesMorder.Any())
+                    {
+                        await _mysql_mes_morder.UpdateManyAsync(mesMorder);
+                    }
                     //删除当前日期下一天开始的工单排产记录
                     _periodSequenceDet.Delete(dbPeriodSequences);
                     _scheduleResultOpMaster.Delete(dbSchedules);

+ 53 - 74
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1909,7 +1909,7 @@ namespace Business.ResourceExamineManagement
             if (srm_po_list.Count > 0)
             {
                 //采购订单--取出状态为在途的PO
-                var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && srm_po_list.Select(c => c.po_id).Contains(x.Id) && x.state != 4).Result;
+                var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && srm_po_list.Select(c => c.po_id).Contains(x.Id) && x.state != 3).Result;
                 if (srm_po_main.Count > 0)
                 {
                     var moSrm_po_main = ObjectMapper.Map<List<srm_po_main>, List<mo_srm_po_main>>(srm_po_main);
@@ -2349,22 +2349,17 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        public async Task<string> PlanOrderResourceCheck(string companyid)
+        public async Task<string> PlanOrderResourceCheck(string domain)
         {
-            /*List<string> workOrds = workOrd.Split(",").ToList();
-            if (workOrds.Count == 0)
+            if (string.IsNullOrEmpty(domain))
             {
-                return "";
-            }*/
-            if (string.IsNullOrEmpty(companyid))
-            {
-                return "当前任务公司编码为空,请检查。";
+                return "当前任务工厂编号为空,请检查。";
             }
 
-            List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => x.morder_type == "计划工单" && x.morder_state == "初始" && x.company_id == long.Parse(companyid)).Result;
+            List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => x.morder_state == "初始" && x.factory_id.ToString() == domain).Result;
 
-            //先排除锁定期内的工单 //优先级排序
-            var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "WorkOrderLockPeriod" && s.Domain == companyid).ToList();
+            /*//先排除锁定期内的工单 //优先级排序
+            var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "WorkOrderLockPeriod" && s.Domain == domain).ToList();
             decimal lookDay = 0;
             if (sysSet.Any())
             {
@@ -2373,12 +2368,17 @@ namespace Business.ResourceExamineManagement
             }
             lookDay = lookDay == 0 ? 7 : lookDay;
             DateTime lookTime = DateTime.Now.Date.AddDays((double)lookDay);
-            Mes_Morders = Mes_Morders.Where(s => s.moentry_sys_stime > lookTime || s.moentry_sys_stime == null).OrderBy(s => s.moentry_sys_stime).ToList();
+            Mes_Morders = Mes_Morders.Where(s => s.moentry_sys_stime > lookTime || s.moentry_sys_stime == null).OrderBy(s => s.moentry_sys_stime).ToList();*/
+
+
 
             if (Mes_Morders.Any())
             {
-                Mes_Morders.ForEach(s => { s.moentry_sys_stime = DateTime.Now.Date.AddDays((double)lookDay + 1); });
                 List<string> monolist = Mes_Morders.Select(c => c.morder_no).ToList();
+
+                #region PR的清除目前不处理,待后续二期方案解决。
+                /*Mes_Morders.ForEach(s => { s.moentry_sys_stime = DateTime.Now.Date.AddDays((double)lookDay + 1); });
+                
                 //清理PR的占用。
                 //如果PR没有转PO,则PR没有合并,就删除,有合并,就减少合并后的PR的数量。
                 var prlist = _mysql_srm_pr_main.GetListAsync(s => monolist.Contains(s.pr_mono)).Result;
@@ -2404,25 +2404,26 @@ namespace Business.ResourceExamineManagement
                             updatelist.Add(getPr);
                         }
                     }
-                }
+                }*/
+                #endregion
                 List<srm_po_occupy> occupy = await _mysql_srm_po_occupy.GetListAsync(s => monolist.Contains(s.morder_mo));
                 _businessDbContext.BulkDelete(occupy);
-                if (updatelist.Any())
+                /*if (updatelist.Any())
                 {
                     _businessDbContext.BulkUpdate(updatelist);
                 }
                 if (dellist.Any())
                 {
                     _businessDbContext.BulkDelete(dellist);
-                }
+                }*/
                 //清理掉库存占用
                 var itemstockoccupy = _mysql_ic_item_stockoccupy.GetListAsync(s => monolist.Contains(s.morder_mo)).Result;
                 if (itemstockoccupy.Any())
                 {
                     _businessDbContext.BulkDelete(itemstockoccupy);
                 }
-                //清理锁定期外的排程数据.
-                var periodList = _periodSequenceDet.Select(s => monolist.Contains(s.WorkOrds));
+                //清理锁定期外的排程数据.工单排产会清理重排
+                /*var periodList = _periodSequenceDet.Select(s => monolist.Contains(s.WorkOrds));
                 if (periodList.Any())
                 {
                     _periodSequenceDet.Delete(s => monolist.Contains(s.WorkOrds));
@@ -2431,11 +2432,12 @@ namespace Business.ResourceExamineManagement
                 if (schedulList.Any())
                 {
                     _scheduleResultOpMaster.Delete(s => monolist.Contains(s.WorkOrd));
-                }
+                }*/
                 //只走计划工单
                 var rtn = await OrderKittingCheck(Mes_Morders, true);
             }
-            else {
+            else
+            {
                 return "未查找到对应的计划工单,请联系管理员。";
             }
             return "ok";
@@ -2702,7 +2704,7 @@ namespace Business.ResourceExamineManagement
             DateTime etime = DateTime.Now.Date.AddYears(2);
             if (!string.IsNullOrEmpty(endtime))
             {
-                DateTime.TryParse(startime, out etime);
+                DateTime.TryParse(endtime, out etime);
             }
             //根据排产日计划来获取
             var periodSd = _periodSequenceDet.Select(s => s.Domain == domain && string.IsNullOrEmpty(s.Status) == true && stime <= s.PlanDate && s.PlanDate <= etime).ToList();
@@ -3013,15 +3015,14 @@ namespace Business.ResourceExamineManagement
             PschedDto rtn = new PschedDto();
             //资源检查明细list
             List<ExamineResult> examines = new List<ExamineResult>();
-            OrderCheckDto input = new OrderCheckDto();
-            if (mo_Mes_Morders.Any())
+            //OrderCheckDto input = new OrderCheckDto();
+            if (!mo_Mes_Morders.Any())
             {
-                input.company_id = mo_Mes_Morders[0].company_id;
-                input.factoryId = mo_Mes_Morders[0].factory_id.GetValueOrDefault();
+                return rtn;
             }
             //资源检查入参全局变量赋值
-            param.company_id = input.company_id;
-            param.factoryId = input.factoryId;
+            param.company_id = mo_Mes_Morders[0].company_id;
+            param.factoryId = mo_Mes_Morders[0].factory_id.GetValueOrDefault();
             param.checkflag = false;
             param.checkPlan = planCheck;
             //生成当前计算bangid
@@ -3038,12 +3039,12 @@ namespace Business.ResourceExamineManagement
             List<mes_moentry> mo_Mes_Moentries = _mysql_mes_moentry.GetListAsync(x => morderIdList.Contains(x.moentry_moid.Value)).Result;
 
             //获取订单行数据
-            List<crm_seorderentry> sentrys = _mysql_crm_seorderentry.GetListAsync(p => p.company_id == input.company_id && p.factory_id == input.factoryId && !p.IsDeleted && mo_Mes_Moentries.Select(x => x.soentry_id).Contains(p.Id)).Result;
+            List<crm_seorderentry> sentrys = _mysql_crm_seorderentry.GetListAsync(p => p.company_id == param.company_id && p.factory_id == param.factoryId && !p.IsDeleted && mo_Mes_Moentries.Select(x => x.soentry_id).Contains(p.Id)).Result;
 
             //删除同步Mysql后旧数据
             await DeleteMySqlOldData(sentrys);
             
-            List<mo_ic_bom> boms = _ic_bom.GetListAsync(p => mo_Mes_Morders.Select(m => m.bom_number).Contains(p.bom_number) && p.factory_id == input.factoryId && p.company_id == input.company_id && !p.IsDeleted).Result.ToList();
+            List<mo_ic_bom> boms = _ic_bom.GetListAsync(p => mo_Mes_Morders.Select(m => m.bom_number).Contains(p.bom_number) && p.factory_id == param.factoryId && p.company_id == param.company_id && !p.IsDeleted).Result.ToList();
 
             //物料bom
             List<mo_ic_bom> bomlist = new List<mo_ic_bom>();
@@ -3077,9 +3078,21 @@ namespace Business.ResourceExamineManagement
             }
 
             //数据库快照-同步mysql库数据到mongoDB中
-            await DbSnapShot(input.company_id, input.factoryId, bangid, pretreatments);
+            await DbSnapShot(param.company_id, param.factoryId, bangid, pretreatments);
 
             DataInitialization(boms, bangid, icitemlist, stocklist, pretreatments, sklist);
+
+            //调用优先级计算算法
+            var workOrds = _replenishmentAppService.CalcPriority(mo_Mes_Morders.Select(p => p.morder_no).ToList(), param.factoryId.ToString());
+            List<mes_morder> priorityMorderList = new List<mes_morder>();
+            foreach (var work in workOrds)
+            {
+                var mo = mo_Mes_Morders.Find(s => s.morder_no == work.WorkOrd);
+                if (mo != null)
+                {
+                    priorityMorderList.Add(mo);
+                }
+            }
             if (!planCheck)
             {
                 //如果是齐套检查,则不考虑其他数据的占用,只看原材料库存
@@ -3089,7 +3102,7 @@ namespace Business.ResourceExamineManagement
             _purchaseOrderAppService.param = param;
             _CalcBomViewAppService.param = param;
             _CalcBomViewAppService.IsInverted = true;
-            foreach (var item in mo_Mes_Morders)
+            foreach (var item in priorityMorderList)
             {
                 var moentry = mo_Mes_Moentries.Find(s => s.moentry_moid == item.Id);
                 if (moentry == null)
@@ -3131,7 +3144,7 @@ namespace Business.ResourceExamineManagement
                 _CalcBomViewAppService.BomStock(getBomList, stocklist, bangid);
 
                 //计算
-                _CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.start_time, sklist, sentry, icitemlist);
+                _CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.moentry_sys_stime, sklist, sentry, icitemlist);
                 
                 //TODO:最晚开始时间
                 var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
@@ -3164,61 +3177,26 @@ namespace Business.ResourceExamineManagement
                         rtn.srm_pr_list = _CalcBomViewAppService.SRMPRDtoList;
                 }
 
-
                 //获取工单数据
-                var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c=>c.morder_no).Contains(p.WorkOrd));
+                var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c => c.morder_no).Contains(p.WorkOrd) && p.Domain == param.factoryId.ToString());
                 workOrdMasters.ForEach(s => {
                     var mo = mo_Mes_Morders.Find(m => m.morder_no == s.WorkOrd);
                     if (mo != null)
                     {
-                        //锁定期
                         s.OrdDate = mo.moentry_sys_stime;
                         s.DueDate = mo.moentry_sys_stime;
                     }
                     
                 });
-                //优先级排序
-                workOrdMasters = workOrdMasters.OrderBy(s => s.OrdDate).ToList();
-                //排产
-                //await _productionScheduleAppService.DoProductSchedule(workOrdMasters, param.factoryId.ToString());
-                
-                foreach (var wod in workOrdMasters)
-                {
-                    var morder = mo_Mes_Morders.Find(s => s.morder_no == wod.WorkOrd);
-                    morder.moentry_sys_stime = wod.OrdDate;
-                    morder.moentry_sys_etime = wod.DueDate;
-
-                    /*var exa = rtn.examines.Find(s => s.morder_no == wod.WorkOrd);
-                    exa.latest_times = morder.moentry_sys_etime.GetValueOrDefault().Date.AddDays(1);*/
-                    //根据排产后得日期,反推PR。
-                    /*var wkordPrList = prmainlist.Where(s => s.pr_mono == wod.WorkOrd).ToList();
-
-                    //反算所有的PR,根据时间减去提前期   //按最大预处理时间倒排
-                    var moIcitems = icitemlist.Where(s => s.is_clean == 1 && wkordPrList.Select(c => c.icitem_id).Contains(s.mysql_id)).ToList();
-                    //获取预处理提前期最大值
-                    decimal maxTime = 0;
-                    if (moIcitems.Any())
-                    {
-                        maxTime = moIcitems.Max(x => x.clean_leadtime.GetValueOrDefault());
-                    }
-                    wkordPrList.ForEach(pr =>
-                    {
-                        var ts = pr.pr_parrive_date - pr.pr_psend_date;
-                        //var icitem = icitemlist.Find(s => s.mysql_id == pr.icitem_id);
-                        //var bce = exa.BomChildExamineList.Find(s => s.item_id == pr.icitem_id && s.num == pr.num);
-                        pr.pr_sarrive_date = morder.moentry_sys_stime.Value.AddDays((double)(0 - maxTime - 1));//到货还需要向前推 物料的预处理时间。到货日期必须提前一天到
-                        pr.pr_ssend_date = pr.pr_sarrive_date.GetValueOrDefault().AddDays(0 - ts.Value.Days);
-                        if (pr.pr_ssend_date < DateTime.Now.Date.AddDays(1))
-                        {
-                            pr.pr_ssend_date = DateTime.Now.Date.AddDays(1);
-                        }
-                    });*/
-                }
                 using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
                 {
                     try
                     {
                         _businessDbContext.BulkUpdate(mo_Mes_Morders);
+                        if (workOrdMasters.Any())
+                        {
+                            _workOrdMaster.Update(workOrdMasters);
+                        }
                         if (prmainlist.Any())
                         {
                             var pr_mainlist = ObjectMapper.Map<List<mo_srm_pr_main>, List<srm_pr_main>>(prmainlist);
@@ -3958,6 +3936,7 @@ namespace Business.ResourceExamineManagement
                 workOrd = new WorkOrdMaster();
                 workOrd.Domain = item.factory_id.ToString();
                 workOrd.OrdDate = item.moentry_sys_stime;
+                workOrd.DueDate = item.moentry_sys_etime;
                 workOrd.ReleaseDate = Convert.ToDateTime(item.moentry_sys_stime.GetValueOrDefault().ToString("u"));
                 workOrd.WorkOrd = item.morder_no;
                 workOrd.ItemNum = item.product_code;//物料编码
@@ -4405,7 +4384,7 @@ namespace Business.ResourceExamineManagement
         public async Task<string> ProductionSchedule(string domain)
         {
             //获取需要排产的工单(获取四周的工单:正常工单+已审批通过的特殊工单)
-            DateTime endDate = DateTime.Now.Date.AddDays(28).AddDays(1);
+            DateTime endDate = DateTime.Now.Date.AddDays(118).AddDays(1);
             //取数开始时间为当前天的下一天
             DateTime startDate = DateTime.Now.Date.AddDays(1);
             //尚未开始生产的工单+正在生产的工单

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

@@ -60,7 +60,7 @@ namespace Business.Domain
         [Comment("是否加急")]
         public int? po_express { get; set; }
         /// <summary>
-        /// 数据状态(0-新增、1-通过、2-完成、3-关闭、4-未通过)
+        /// 数据状态(0-新增、1-通过、2-完成、3-未通过)
         /// </summary>
         [Comment("数据状态")]
         public int? state { get; set; }

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/SRM/srm_po_main.cs

@@ -61,7 +61,7 @@ namespace Business.Domain
         [Comment("是否加急")]
         public int? po_express { get; set; }
         /// <summary>
-        /// 数据状态(0-新增、1-审核中、2-同意、3-拒绝、4-关闭)
+        /// 数据状态(0-新增、1-审核中、2-同意、3-关闭)
         /// </summary>
         [Comment("数据状态")]
         public int? state { get; set; }

+ 2 - 2
MicroServices/Business/Business.HttpApi/Controllers/ResourceExamineController.cs

@@ -111,9 +111,9 @@ namespace Business.Controllers
         /// <returns></returns>
         [HttpPost]
         [Route("PlanOrderResourceCheck")]
-        public Task<string> PlanOrderResourceCheck(string companyid)
+        public Task<string> PlanOrderResourceCheck(string domain)
         {
-            return _ResourceExamineAppService.PlanOrderResourceCheck(companyid);
+            return _ResourceExamineAppService.PlanOrderResourceCheck(domain);
         }
         /// <summary>
         /// BOM清单批量预处理