Explorar o código

领料单状态逻辑补充。

tangdi %!s(int64=2) %!d(string=hai) anos
pai
achega
da8478baf7

+ 39 - 33
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -2666,31 +2666,28 @@ namespace Business.ResourceExamineManagement
                 foreach (var mo in mo_Mes_Morders)
                 {
                     //查出已产生领料单、过滤掉,取出未领料的工单
-                    var nbr = nbrList.Find(s => s.WorkOrd == mo.morder_no);
-                    if (nbr != null)
+                    var nbrs = nbrList.Where(s => s.WorkOrd == mo.morder_no).ToList();
+                    if (nbrs.Any())
                     {
-                        //完成时间到了
-                        if (nbr.EffDate.GetValueOrDefault().Date == DateTime.Now.Date)
+                        //查出没有备料完成的数据
+                        var noCompletedList = nbrs.Where(x => (x.TransType == "PrevProcess" && x.Ufld1 != "completed") || x.Status.ToUpper() != "C").ToList();
+                        if (noCompletedList.Any())
                         {
-                            //如果应完成日期,没有完成,则更新工单状态
-                            if (nbr.Ufld1 == "completed")
+                            //代表还有没有备料完成
+                            if (noCompletedList.Where(x => x.EffDate.GetValueOrDefault().Date <= DateTime.Now.Date).Any())
                             {
-                                //工单状态为  “生产齐套”
-                                mo.MaterialSituation = MorderEnum.ProduceComplete;
+                                //如果有结束日期小于等于当天,因为考虑备料会晚上才备完
+                                mo.MaterialSituation = MorderEnum.Lag;//工单状态为  “备料滞后”
                             }
                             else
                             {
-                                //工单状态为  “备料滞后
-                                mo.MaterialSituation = MorderEnum.Lag;
+                                //工单状态为  “备料
+                                mo.MaterialSituation = MorderEnum.Preparation;
                             }
                         }
-                        //完成时间未到
-                        else if (nbr.EffDate.GetValueOrDefault().Date > DateTime.Now.Date)
-                        {
-                            //工单状态为  “备料中”
-                            mo.MaterialSituation = MorderEnum.Preparation;
+                        else {
+                            mo.MaterialSituation = MorderEnum.ProduceComplete;//工单状态为  “生产齐套”
                         }
-                        //完成时间已经过去,则不做处理
                     }
                     else {
                         checkMo.Add(mo);
@@ -2869,7 +2866,7 @@ namespace Business.ResourceExamineManagement
             var periodSd = _periodSequenceDet.Select(s => s.Domain == domain && string.IsNullOrEmpty(s.Status) == true && stime <= s.PlanDate && s.PlanDate <= etime).ToList();
             if (periodSd.Any())
             {
-                List<string> tsWork = new List<string> { "试制工单", "TCN工单", "返工工单" };
+                List<string> tsWork = new List<string> { "test", "tcn", "rw" };
                 var ordlist = _workOrdMaster.Select(x => x.Domain == domain && periodSd.Select(s => s.WorkOrds).Contains(x.WorkOrd) && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && (x.Status.ToLower() == "p" || x.Status.ToLower() == "r")).ToList();
 
                 List<mes_morder> morders = _mysql_mes_morder.GetListAsync(x => domain == x.factory_id.ToString() && ordlist.Select(s => s.WorkOrd).Contains(x.morder_no) && (x.morder_state == MorderEnum.Initial_state || x.morder_state == MorderEnum.Xd_state) && !x.IsDeleted).Result;
@@ -2896,10 +2893,10 @@ namespace Business.ResourceExamineManagement
                         if (mo.MaterialSituation == MorderEnum.CarehouseComplete && mo.morder_state == MorderEnum.Initial_state && mo.moentry_sys_stime.GetValueOrDefault().Date <= lookTime)
                         {
                             workords += "," + mo.morder_no;
-                            mo.morder_state = MorderEnum.Xd_state;
+                            //mo.morder_state = MorderEnum.Xd_state;
                         }
                     }
-                    
+                    await _mysql_mes_morder.UpdateManyAsync(morders);
                     if (workords.Length > 0)
                     {
                         workords = workords.Substring(1, workords.Length - 1);
@@ -2910,7 +2907,6 @@ namespace Business.ResourceExamineManagement
                             new NLogHelper("ResourceExamineAppService").WriteLog("CreatePickBill", "生成领料单相关数据更新失败:" + pickRst, _currentTenant.Id.ToString());
                             return pickRst;
                         }
-                        await _mysql_mes_morder.UpdateManyAsync(morders);
                         var insertList = GetCopyOP(workords, domain);
                         if (insertList.Any())
                         {
@@ -4054,6 +4050,13 @@ namespace Business.ResourceExamineManagement
             await AutoCreatePickBill(workOrdMasters, dbPeriodSequences, nbrMasterList, nbrDetailList, userAccount, workDetails);
             if (nbrMasterList.Any())
             {
+                workOrdMasters = workOrdMasters.Where(x => nbrMasterList.Select(c => c.WorkOrd).Contains(x.WorkOrd)).ToList();
+
+                List<mes_morder> morders = _mysql_mes_morder.GetListAsync(x => domain == x.factory_id.ToString() && workOrdMasters.Select(s => s.WorkOrd).Contains(x.morder_no) && !x.IsDeleted).Result;
+                morders.ForEach(x =>
+                {
+                    x.morder_state = MorderEnum.Xd_state;
+                });
                 string seqSql = "";
                 var weekplan = _replenishmentWeekPlan.GetListAsync(s => s.factory_id.ToString() == domain && workOrdMasters.Select(x => x.WorkOrd).Contains(s.ProductionOrder)).Result;
                 var worklistDto = _serialNumberAppService.GetBillNo(domain, "WOlot", workOrdMasters.Count, userAccount, 1);
@@ -4072,7 +4075,7 @@ namespace Business.ResourceExamineManagement
                         if (worklistDto[index] != null)
                         {
                             p.LotSerial = worklistDto[index].NbrResult.ToString();
-                            var weekp = weekplan.Find(s => s.ProductionOrder == p.WorkOrd && s.IsReplenishmentModel=="N");
+                            var weekp = weekplan.Find(s => s.ProductionOrder == p.WorkOrd && s.IsReplenishmentModel == "N");
                             if (weekp != null)
                             {
                                 weekp.ProductionBatch = p.LotSerial;
@@ -4081,12 +4084,11 @@ namespace Business.ResourceExamineManagement
                         index++;
                     }
                     //生成工单事务、工单下达事务
-                    strWoSql += "A,"+p.Domain+","+ seqId.ToString()+ ",nbr-wo-mes,工单," + p.WorkOrd+","+p.RecID+ "|";
+                    strWoSql += "A," + p.Domain + "," + seqId.ToString() + ",nbr-wo-mes,工单," + p.WorkOrd + "," + p.RecID + "|";
                     seqId++;
                     strWoStuSql += "REL," + p.Domain + "," + seqId.ToString() + ",nbr-wo-stu,工单下达," + p.WorkOrd + "," + p.RecID + "|";
                     seqId++;
                 });
-
                 var nbrlistDto = _serialNumberAppService.GetBillNo(workOrdMasters[0].Domain, "SM", nbrMasterList.Count, userAccount, 1);
                 if (nbrlistDto.Any())
                 {
@@ -4102,13 +4104,11 @@ namespace Business.ResourceExamineManagement
                         index++;
                     }
                 }
-
                 //清理掉库存占用  这里考虑的是资源检查的占用没有完全占用备料单数据,而其他数据再进行齐套检查时,无法考虑到备料单的占用。
                 var itemstockoccupy = _mysql_ic_item_stockoccupy.GetListAsync(s => workOrdMasters.Select(x => x.WorkOrd).Contains(s.morder_mo) && s.factory_id.ToString() == domain).Result;
                 var icitem = _mysql_ic_item.GetListAsync(s => s.factory_id.ToString() == domain && nbrDetailList.Select(c => c.ItemNum).Contains(s.number)).Result;
                 //根据领料单生成一次工单的数据占用
                 List<ic_item_stockoccupy> insertOccuyy = new List<ic_item_stockoccupy>();
-
                 nbrMasterList.ForEach(s =>
                 {
                     var nbrdtls = nbrDetailList.Where(a => a.Nbr == s.Nbr).ToList();
@@ -4130,14 +4130,13 @@ namespace Business.ResourceExamineManagement
                             itemStockoccupyDto.quantity = x.CurrQtyOpened.GetValueOrDefault();
                             insertOccuyy.Add(itemStockoccupyDto);
                         }
-                    }); 
+                    });
                     seqSql += "insert QadTracking(Ufld1,Domain,SeqID,TransType,Subject,[Order],Int1,Ufld2,CreateTime,CreateUser,UpdateTime,UpdateUser) " +
                     "select 'A','" + domain + "'," + seqId.ToString() + ",'nbr-sm-mes','领料申请单',Nbr,RecID,'sm',getdate(),CreateUser,getdate(),UpdateUser from NbrMaster where RecID=" + s.RecID + ";";
                     seqId++;
                 });
-
                 //获取工单工艺路径数据
-                List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.Select(p => ords.Contains(p.WorkOrd) && p.MilestoneOp && p.Domain == workOrdMasters[0].Domain && p.Status != "C" && p.IsActive);
+                List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.Select(p => workOrdMasters.Select(x => x.WorkOrd).Contains(p.WorkOrd) && p.MilestoneOp && p.Domain == domain && p.Status != "C" && p.IsActive);
                 workOrdRoutings.ForEach(p => { p.Status = "r"; });
                 using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
                 {
@@ -4146,7 +4145,7 @@ namespace Business.ResourceExamineManagement
                         _nbrMaster.Insert(nbrMasterList);
                         nbrMasterList.ForEach(a =>
                         {
-                            string sql =string.Format("exec pr_WMS_BPM_AddMobileTask @TaskID='{0}',@PlanDate='{1}',@ExecuterTypeID=2,@CreateUser='{2}'", a.Nbr, a.Date.Value.ToString("yyyy-MM-dd"), a.CreateUser);
+                            string sql = string.Format("exec pr_WMS_BPM_AddMobileTask @TaskID='{0}',@PlanDate='{1}',@ExecuterTypeID=2,@CreateUser='{2}'", a.Nbr, a.Date.Value.ToString("yyyy-MM-dd"), a.CreateUser);
                             _businessDbContext.Database.ExecuteSqlRaw(sql);
                         });
                         if (!string.IsNullOrEmpty(strWoSql))
@@ -4156,7 +4155,8 @@ namespace Business.ResourceExamineManagement
                             string sql = string.Format("exec pr_WMS_AddWorkOrdSeq @strWoSql='{0}',@strWoStuSql='{1}'", strWoSql, strWoStuSql);
                             _businessBangDbContext.Database.ExecuteSqlRaw(sql);
                         }
-                        if (!string.IsNullOrEmpty(seqSql)) {
+                        if (!string.IsNullOrEmpty(seqSql))
+                        {
                             _businessBangDbContext.Database.ExecuteSqlRaw(seqSql);
                         }
                         if (itemstockoccupy.Any())
@@ -4164,10 +4164,9 @@ namespace Business.ResourceExamineManagement
                             await _mysql_ic_item_stockoccupy.HardDeleteAsync(itemstockoccupy);
                         }
                         if (insertOccuyy.Any())
-                        { 
+                        {
                             _businessDbContext.BulkInsert(insertOccuyy);
                         }
-
                         //快开平台用自增列RecId关联,所以需要插入后再查给明细表赋相应的值
                         List<string> nbrs = nbrMasterList.Select(a => a.Nbr).ToList();
                         var DBnbrList = _nbrMaster.Select(a => a.Domain == workOrdMasters[0].Domain && a.Type == "SM" && nbrs.Contains(a.Nbr));
@@ -4177,8 +4176,12 @@ namespace Business.ResourceExamineManagement
                         });
                         _nbrDetail.Insert(nbrDetailList);
                         await _replenishmentWeekPlan.UpdateManyAsync(weekplan);
+
+                        if (morders != null)
+                        {
+                            await _mysql_mes_morder.UpdateManyAsync(morders);
+                        }
                         _workOrdMaster.Update(workOrdMasters);
-                        _periodSequenceDet.Update(dbPeriodSequences);
                         _workOrdRouting.Update(workOrdRoutings);
                         await unitOfWork.CompleteAsync();
                     }
@@ -4190,6 +4193,9 @@ namespace Business.ResourceExamineManagement
                     }
                 }
             }
+            else {
+                return "当前工单下达失败,请检查工单信息。";
+            }
             return "ok";
         }