/// <summary> /// PDA发送拣选任务完成 /// </summary> /// <param name="xml"></param> /// <returns></returns> //public string LesSendFinishStatusPDA(string xml) //{ // string result = xml; // try { XDocument.Parse(xml); } // catch (Exception ex) { return "ERROR:" + ex.Message; } // try // { // AST_LesTask_PDA_Finish model = AST_LesTask_PDA_FinishConverter.ConvertRequestPDA(xml); // using (GeelyPtlEntities dbContext = new GeelyPtlEntities()) // { // List<AST_LesTask_PDA> targets = dbContext.AST_LesTask_PDAs.Where(x => model.BILLID.Contains(x.BillCode)).ToList(); // foreach (var target in targets) // { // target.IsFinished = true; // } // dbContext.SaveChanges(); // } // XDocument xDocument = XDocument.Parse(xml); // XElement serviceElement = xDocument.Descendants("Service").First(); // XElement dataElement = serviceElement.Descendants("Data").First(); // XElement requestElement = dataElement.Descendants("Request").First(); // XElement arrivedElement = requestElement.Descendants("ASSEMBLE").First(); // XElement type = new XElement("TYPE"); // type.Value = "succ"; // XElement message = new XElement("MESSAGE"); // message.Value = "接收成功!"; // arrivedElement.Add(type); // arrivedElement.Add(message); // result = Converter.ToXml(xDocument); // } // catch // { // XDocument xDocument = XDocument.Parse(xml); // XElement serviceElement = xDocument.Descendants("Service").First(); // XElement dataElement = serviceElement.Descendants("Data").First(); // XElement requestElement = dataElement.Descendants("Request").First(); // XElement arrivedElement = requestElement.Descendants("ASSEMBLE").First(); // XElement type = new XElement("TYPE"); // type.Value = "error"; // XElement message = new XElement("MESSAGE"); // message.Value = "接收失败!"; // arrivedElement.Add(type); // arrivedElement.Add(message); // result = Converter.ToXml(xDocument); // } // return result; //} #endregion /// <summary> /// PDA发送拣选任务完成 /// </summary> /// <param name="xml">报文</param> /// <returns></returns> public string LesSendFinishStatusPDA(string xml) { string result = xml; try { XDocument.Parse(xml); } catch (Exception ex) { return("ERROR:" + ex.Message); } try { using (GeelyPtlEntities dbContext = new GeelyPtlEntities()) { List <AST_PalletPickResult_PDA> astPalletPickResults = AST_PalletPickResult_PDAConverter.ConvertRequestPDA(xml, dbContext); if (astPalletPickResults.Count > 0) { string sReqCode = GetReqCode(); AST_PalletPickResultMessage_PDA astPalletPickResultMessage = new AST_PalletPickResultMessage_PDA(); astPalletPickResultMessage.AST_PalletPickResultKey = sReqCode; astPalletPickResultMessage.ReceivedXml = xml; astPalletPickResultMessage.ReceivedTime = DateTime.Now; dbContext.AST_PalletPickResultMessage_PDAs.Add(astPalletPickResultMessage); foreach (AST_PalletPickResult_PDA astPalletPickResult in astPalletPickResults) { if (!dbContext.AST_PalletPickResult_PDAs.Any(pa => pa.BatchCode == astPalletPickResult.BatchCode && pa.CFG_PalletId == astPalletPickResult.CFG_PalletId && pa.PickBillIds == astPalletPickResult.PickBillIds)) { astPalletPickResult.AST_PalletPickResultKey = sReqCode; dbContext.AST_PalletPickResult_PDAs.Add(astPalletPickResult); //结束LES拣料任务 List <AST_LesTask_PDA> targets = dbContext.AST_LesTask_PDAs.Where(x => astPalletPickResult.PickBillIds.Contains(x.BillCode)).ToList(); foreach (var target in targets) { target.IsFinished = true; } //结束托盘拣料任务及其明细 List <AST_PalletTaskItem_PDA> astPalletTaskItems = dbContext.AST_PalletTaskItem_PDAs .Where(t => t.AST_PalletTask_PDA.BatchCode.Equals(astPalletPickResult.BatchCode) && t.AST_PalletTask_PDA.CFG_PalletId == astPalletPickResult.CFG_PalletId && t.BoxCode.Equals(astPalletPickResult.BoxCode) && t.PickStatus != PickStatus.Finished).ToList(); if (astPalletTaskItems.Count > 0) { foreach (AST_PalletTaskItem_PDA astPalletTaskItem in astPalletTaskItems) { if (astPalletTaskItem.PickedQuantity == null) { astPalletTaskItem.PickedQuantity = 0; } astPalletTaskItem.PickedQuantity = Convert.ToInt32(astPalletTaskItem.PickedQuantity) + astPalletPickResult.Quantity; astPalletTaskItem.PickedTime = astPalletPickResult.ReceivedTime; astPalletTaskItem.PickStatus = astPalletTaskItem.PickedQuantity >= astPalletTaskItem.ToPickQuantity ? PickStatus.Finished : PickStatus.Picking; } AST_PalletTask_PDA astPalletTask = astPalletTaskItems.FirstOrDefault().AST_PalletTask_PDA; if (astPalletTask.AST_PalletTaskItem_PDAs.All(t => t.PickStatus == PickStatus.Finished)) { astPalletTask.PickStatus = PickStatus.Finished; } } } } dbContext.SaveChanges(); } } return(AST_PalletPickResult_PDAConverter.ConvertResponse(xml, true, string.Empty)); } catch (Exception ex) { string message = ex.Message; if (message.Contains("无效的托盘编码")) { return(AST_PalletPickResult_PDAConverter.ConvertResponse(xml, true, string.Empty)); } else { DbEntityValidationException dbEntityValidationException = ex as DbEntityValidationException; if (dbEntityValidationException != null) { foreach (DbEntityValidationResult validationResult in dbEntityValidationException.EntityValidationErrors) { foreach (DbValidationError validationError in validationResult.ValidationErrors) { message += Environment.NewLine + validationError.ErrorMessage; } } } message += Environment.NewLine + ex.StackTrace; Logger.Log("LesSendFinishStatusPDA", DateTime.Now.ToString("HH:mm:ss") + Environment.NewLine + xml + Environment.NewLine + message + Environment.NewLine + Environment.NewLine); return(AST_PalletPickResult_PDAConverter.ConvertResponse(xml, false, message)); } } }
/// <summary> /// 按托合并原始分拣任务-PDA。 /// </summary> /// <param name="astPalletArrived">从接口解析还未持久化的托盘抵达记录。</param> /// <param name="dbContext">数据上下文。</param> public static void GeneratePDA(AST_PalletArrived_PDA astPalletArrived, GeelyPtlEntities dbContext) { List <AST_LesTask_PDA> astLesTasks = dbContext.AST_LesTask_PDAs .Where(lt => lt.BatchCode == astPalletArrived.BatchCode && lt.CFG_PalletId == astPalletArrived.CFG_PalletId && lt.CFG_ChannelId == astPalletArrived.CFG_ChannelId && astPalletArrived.PickBillIds.Contains(lt.BillCode) && !lt.TaskGenerated) .ToList(); if (astLesTasks.Count > 0) { AST_LesTask_PDA mainAstLesTask = astLesTasks.First(); AST_PalletTask_PDA astPalletTask = new AST_PalletTask_PDA(); astPalletTask.CFG_PalletId = astPalletArrived.CFG_PalletId; astPalletTask.BatchCode = mainAstLesTask.BatchCode; astPalletTask.PickBillIds = astPalletArrived.PickBillIds; astPalletTask.ProjectCode = astPalletArrived.ProjectCode; astPalletTask.WbsId = mainAstLesTask.WbsId; astPalletTask.ProjectStep = astPalletArrived.ProjectStep; astPalletTask.CFG_ChannelId = astPalletArrived.CFG_ChannelId; astPalletTask.PickStatus = PickStatus.New; astPalletTask.CreateTime = DateTime.Now; dbContext.AST_PalletTask_PDAs.Add(astPalletTask); //提取当前目标工位、当前批次、当前巷道、当前托盘未合并的原始任务 List <int> cfgWorkStationIds = astLesTasks .Select(lt => lt.CFG_WorkStationId) .Distinct() .ToList(); foreach (int cfgWorkStationId in cfgWorkStationIds) { ILookup <int, AST_LesTask_PDA> astLesTaskLookupByFromPalletPosition = astLesTasks .Where(lt => lt.CFG_WorkStationId == cfgWorkStationId) .OrderBy(lt => lt.FromPalletPosition) .ToLookup(lt => lt.FromPalletPosition); //明细的合并,特殊件单独拣 foreach (IGrouping <int, AST_LesTask_PDA> astLesTaskGroupingByFromPalletPosition in astLesTaskLookupByFromPalletPosition) { int fromPalletPosition = astLesTaskGroupingByFromPalletPosition.Key; AST_LesTask_PDA mainAstLesTaskByWorkStation = astLesTaskGroupingByFromPalletPosition.First(); List <AST_LesTaskItem_PDA> normalAstLesTaskItems = new List <AST_LesTaskItem_PDA>(); List <AST_LesTaskItem_PDA> specialAstLesTaskItems = new List <AST_LesTaskItem_PDA>(); foreach (AST_LesTask_PDA astLesTask in astLesTaskGroupingByFromPalletPosition) { normalAstLesTaskItems.AddRange(astLesTask.AST_LesTaskItem_PDAs.Where(lti => !lti.IsSpecial)); specialAstLesTaskItems.AddRange(astLesTask.AST_LesTaskItem_PDAs.Where(lti => lti.IsSpecial)); } //普通件 if (normalAstLesTaskItems.Count > 0) { AST_LesTaskItem_PDA mainAstLesTaskItem = normalAstLesTaskItems.First(); int totalNormalQuantity = normalAstLesTaskItems.Sum(lti => lti.ToPickQuantity); AST_PalletTaskItem_PDA astPalletTaskItem = new AST_PalletTaskItem_PDA(); astPalletTaskItem.AST_PalletTask_PDA = astPalletTask; astPalletTaskItem.CFG_WorkStationId = cfgWorkStationId; astPalletTaskItem.BoxCode = mainAstLesTaskByWorkStation.BoxCode; astPalletTaskItem.FromPalletPosition = fromPalletPosition; astPalletTaskItem.MaterialCode = mainAstLesTaskItem.MaterialCode; astPalletTaskItem.MaterialName = mainAstLesTaskItem.MaterialName; astPalletTaskItem.MaterialBarcode = mainAstLesTaskItem.MaterialBarcode; astPalletTaskItem.ToPickQuantity = totalNormalQuantity; astPalletTaskItem.MaxQuantityInSingleCartPosition = mainAstLesTaskItem.MaxQuantityInSingleCartPosition; astPalletTaskItem.IsSpecial = false; astPalletTaskItem.IsBig = mainAstLesTaskItem.IsBig; astPalletTaskItem.PickStatus = PickStatus.New; dbContext.AST_PalletTaskItem_PDAs.Add(astPalletTaskItem); foreach (AST_LesTaskItem_PDA normalAstLesTaskItem in normalAstLesTaskItems) { normalAstLesTaskItem.AST_PalletTaskItem_PDA = astPalletTaskItem; } } //特殊件 foreach (AST_LesTaskItem_PDA astLesTaskItem in specialAstLesTaskItems) { AST_PalletTaskItem_PDA astPalletTaskItem = new AST_PalletTaskItem_PDA(); astPalletTaskItem.AST_PalletTask_PDA = astPalletTask; astPalletTaskItem.CFG_WorkStationId = cfgWorkStationId; astPalletTaskItem.BoxCode = mainAstLesTaskByWorkStation.BoxCode; astPalletTaskItem.FromPalletPosition = fromPalletPosition; astPalletTaskItem.MaterialCode = astLesTaskItem.MaterialCode; astPalletTaskItem.MaterialName = astLesTaskItem.MaterialName; astPalletTaskItem.MaterialBarcode = astLesTaskItem.MaterialBarcode; astPalletTaskItem.ToPickQuantity = astLesTaskItem.ToPickQuantity; astPalletTaskItem.MaxQuantityInSingleCartPosition = astLesTaskItem.MaxQuantityInSingleCartPosition; astPalletTaskItem.IsSpecial = true; astPalletTaskItem.IsBig = astLesTaskItem.IsBig; astPalletTaskItem.PickStatus = PickStatus.New; dbContext.AST_PalletTaskItem_PDAs.Add(astPalletTaskItem); astLesTaskItem.AST_PalletTaskItem_PDA = astPalletTaskItem; } //标记已合并按托任务 foreach (AST_LesTask_PDA astLesTask in astLesTaskGroupingByFromPalletPosition) { astLesTask.TaskGenerated = true; } } } } }
/// <summary> /// 按巷道查询当前PDA任务。 /// </summary> /// <param name="cfgChannelId">巷道的主键。</param> /// <param name="dPtlPalletLastArriveTime">PTL托盘最后到达时间。</param> private AssortingKanbanTaskInfo QueryPDACurrentTaskInfo(int cfgChannelId, DateTime dPtlPalletLastArriveTime) { AssortingKanbanTaskInfo result = new AssortingKanbanTaskInfo(); try { using (GeelyPtlEntities dbContext = new GeelyPtlEntities()) { DateTime minTime = DateTime.Today; DateTime maxTime = minTime.AddDays(1); AST_PalletTask_PDA astPalletTask = null; if (dPtlPalletLastArriveTime == DateTime.MinValue) { astPalletTask = dbContext.AST_PalletTask_PDAs .Where(pt => pt.CFG_ChannelId == cfgChannelId && pt.PickStatus != PickStatus.Finished && pt.CreateTime > minTime && pt.CreateTime < maxTime) .OrderByDescending(pt => pt.Id) .FirstOrDefault(); } else { astPalletTask = dbContext.AST_PalletTask_PDAs .Where(pt => pt.CFG_ChannelId == cfgChannelId && pt.PickStatus != PickStatus.Finished && pt.CreateTime > minTime && pt.CreateTime <maxTime && pt.CreateTime> dPtlPalletLastArriveTime) .OrderByDescending(pt => pt.Id) .FirstOrDefault(); } //AST_PalletTask_PDA astPalletTask = dbContext.AST_PalletTask_PDAs // .Where(pt => pt.CFG_ChannelId == cfgChannelId && pt.PickStatus != PickStatus.Finished && pt.CreateTime > minTime && pt.CreateTime < maxTime) // .OrderByDescending(pt => pt.Id) // .FirstOrDefault(); //AST_CartTask astCartTask = dbContext.AST_CartTaskItems // .Where(cti => cti.AST_CartTask.CFG_ChannelId == cfgChannelId && cti.AssortingStatus != AssortingStatus.Finished) // .Select(cti => cti.AST_CartTask) // .FirstOrDefault(); if (astPalletTask == null) { result = null; return(result); } string currentBatchCode = astPalletTask.BatchCode; if (!string.IsNullOrEmpty(currentBatchCode)) { AST_LesTask_PDA currentBatchFirstAstLesTask = dbContext.AST_LesTask_PDAs .Where(lt => lt.CFG_ChannelId == cfgChannelId && lt.BatchCode == currentBatchCode && lt.CFG_PalletId == astPalletTask.CFG_PalletId) .OrderByDescending(lt => lt.Id).FirstOrDefault(); result.CurrentBatchInfo.PickType = ConverterPickTypeToText(currentBatchFirstAstLesTask.WbsId); //PDA手持机拣料 //result.CurrentBatchInfo.PickType = currentBatchFirstAstLesTask.WbsId; //PDA手持机拣料 //result.CurrentBatchInfo.PickType = 2; //PDA手持机拣料 result.CurrentBatchInfo.ProjectCode = currentBatchFirstAstLesTask.ProjectCode; result.CurrentBatchInfo.ProjectStep = currentBatchFirstAstLesTask.ProjectStep; result.CurrentBatchInfo.BatchCode = currentBatchFirstAstLesTask.BatchCode; result.CurrentBatchInfo.FinishedPalletCount = dbContext.AST_PalletTask_PDAs .Count(pr => pr.CFG_ChannelId == cfgChannelId && pr.BatchCode == currentBatchCode && pr.PickStatus == PickStatus.Finished); //result.CurrentBatchInfo.FinishedPalletCount = 0; result.CurrentBatchInfo.TotalPalletCount = dbContext.AST_LesTask_PDAs .Where(lt => lt.CFG_ChannelId == cfgChannelId && lt.BatchCode == currentBatchCode) .Select(lt => lt.CFG_PalletId) .Distinct() .Count(); //以下 4 个汇总界面不展示 result.CurrentBatchInfo.FinishedMaterialTypeCount = 0; result.CurrentBatchInfo.TotalMaterialTypeCount = 0; result.CurrentBatchInfo.FinishedMaterialCount = 0; result.CurrentBatchInfo.TotalMaterialCount = 0; List <CFG_ChannelCurrentCart> cfgChannelCurrentCarts = dbContext.CFG_ChannelCurrentCarts .Where(ccc => ccc.CFG_ChannelId == cfgChannelId) .OrderBy(ccc => ccc.Position) .ToList(); foreach (CFG_ChannelCurrentCart cfgChannelCurrentCart in cfgChannelCurrentCarts) { CFG_ChannelCurrentCartDto cfgChannelCurrentCartDto = new CFG_ChannelCurrentCartDto(); cfgChannelCurrentCartDto.CFG_ChannelCurrentCartId = cfgChannelCurrentCart.Id; cfgChannelCurrentCartDto.CFG_ChannelId = cfgChannelCurrentCart.CFG_ChannelId; cfgChannelCurrentCartDto.Position = cfgChannelCurrentCart.Position; cfgChannelCurrentCartDto.CFG_CartId = cfgChannelCurrentCart.CFG_CartId; if (cfgChannelCurrentCart.CFG_Cart != null) { cfgChannelCurrentCartDto.CartCode = cfgChannelCurrentCart.CFG_Cart.Code; cfgChannelCurrentCartDto.CartName = cfgChannelCurrentCart.CFG_Cart.Name; } } if (astPalletTask != null) { AST_PalletTaskDto astPalletTaskDto = new AST_PalletTaskDto(); astPalletTaskDto.AST_PalletTaskId = astPalletTask.Id; astPalletTaskDto.CFG_PalletId = astPalletTask.CFG_PalletId; astPalletTaskDto.PalletCode = astPalletTask.CFG_Pallet.Code; astPalletTaskDto.PalletType = astPalletTask.CFG_Pallet.PalletType; astPalletTaskDto.PalletRotationStatus = astPalletTask.CFG_Pallet.PalletRotationStatus; List <AST_PalletTaskItem_PDA> astPalletTaskItems = astPalletTask.AST_PalletTaskItem_PDAs .OrderBy(pti => pti.FromPalletPosition) .ToList(); foreach (AST_PalletTaskItem_PDA astPalletTaskItem in astPalletTaskItems) { AST_PalletTaskItemDto astPalletTaskItemDto = new AST_PalletTaskItemDto(); astPalletTaskItemDto.AST_PalletTaskItemId = astPalletTaskItem.Id; astPalletTaskItemDto.FromPalletPosition = astPalletTaskItem.FromPalletPosition; astPalletTaskItemDto.WorkStationCode = astPalletTaskItem.CFG_WorkStation.Code; astPalletTaskItemDto.MaterialCode = astPalletTaskItem.MaterialCode; astPalletTaskItemDto.MaterialName = astPalletTaskItem.MaterialName; astPalletTaskItemDto.MaterialBarcode = astPalletTaskItem.MaterialBarcode; astPalletTaskItemDto.ToPickQuantity = astPalletTaskItem.ToPickQuantity; astPalletTaskItemDto.IsSpecial = astPalletTaskItem.IsSpecial; astPalletTaskItemDto.IsBig = astPalletTaskItem.IsBig; astPalletTaskItemDto.PickStatus = astPalletTaskItem.PickStatus; astPalletTaskItemDto.PickedQuantity = astPalletTaskItem.PickedQuantity; astPalletTaskDto.Items.Add(astPalletTaskItemDto); } result.CurrentPalletTask = astPalletTaskDto; } //if (astCartTask != null) //{ // AST_CartTaskDto astCartTaskDto = new AST_CartTaskDto(); // astCartTaskDto.AST_CartTaskId = astCartTask.Id; // astCartTaskDto.CFG_CartId = astCartTask.CFG_CartId; // astCartTaskDto.CartCode = astCartTask.CFG_Cart.Code; // astCartTaskDto.CartName = astCartTask.CFG_Cart.Name; // List<AST_CartTaskItem> astCartTaskItems = astCartTask.AST_CartTaskItems // .OrderBy(cti => cti.CartPosition) // .ToList(); // foreach (AST_CartTaskItem astCartTaskItem in astCartTaskItems) // { // AST_PalletTaskItem astPalletTaskItem = astCartTaskItem.AST_PalletTaskItem; // AST_CartTaskItemDto astCartTaskItemDto = new AST_CartTaskItemDto(); // astCartTaskItemDto.AST_CartTaskItemId = astCartTaskItem.Id; // astCartTaskItemDto.CartPosition = astCartTaskItem.CartPosition; // astCartTaskItemDto.WorkStationCode = astCartTask.CFG_WorkStation.Code; // astCartTaskItemDto.MaterialCode = astPalletTaskItem.MaterialCode; // astCartTaskItemDto.MaterialName = astPalletTaskItem.MaterialName; // astCartTaskItemDto.MaterialBarcode = astPalletTaskItem.MaterialBarcode; // astCartTaskItemDto.MaxQuantityInSingleCartPosition = astPalletTaskItem.MaxQuantityInSingleCartPosition; // astCartTaskItemDto.IsSpecial = astPalletTaskItem.IsSpecial; // astCartTaskItemDto.IsBig = astPalletTaskItem.IsBig; // astCartTaskItemDto.AssortingStatus = astCartTaskItem.AssortingStatus; // astCartTaskItemDto.PickedQuantity = astCartTaskItem.AssortedQuantity; // astCartTaskDto.Items.Add(astCartTaskItemDto); // } // result.CurrentCartTask = astCartTaskDto; //} } } } catch (Exception ex) { string message = ex.Message; DbEntityValidationException dbEntityValidationException = ex as DbEntityValidationException; if (dbEntityValidationException != null) { foreach (DbEntityValidationResult validationResult in dbEntityValidationException.EntityValidationErrors) { foreach (DbValidationError validationError in validationResult.ValidationErrors) { message += Environment.NewLine + validationError.ErrorMessage; } } } message += Environment.NewLine + ex.StackTrace; Logger.Log("ForAssortingKanbanService.QueryPDACurrentTaskInfo", DateTime.Now.ToString("HH:mm:ss") + Environment.NewLine + message + Environment.NewLine + Environment.NewLine); } return(result); }