using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.Enums; using WIDESEA_Core; using WIDESEA_Model.Models; using WIDESEA_Core.Helper; using WIDESEAWCS_DTO.WCSInfo; using System.Transactions; namespace WIDESEA_TaskInfoService { public partial class TaskService { /// /// PDA申请入库--堆垛机立库入库 /// /// 起始地址 /// 任务类型--入空,入料 /// 托盘编号 /// 返回处理结果 public WebResponseContent GenerateInboundTask(string stationCode, int taskType, string palletCode) { string? name = Enum.GetName(typeof(TaskTypeEnum), taskType); MethodInfo? methodInfo = GetType().GetMethod(name + "Request"); if (methodInfo != null) { WebResponseContent? responseContent = (WebResponseContent?)methodInfo.Invoke(this, new object[] { stationCode, palletCode }); if (responseContent != null) { return responseContent; } } else { return WebResponseContent.Instance.Error("未找到该任务类型业务"); } return WebResponseContent.Instance.Error("错误"); } /// /// 空托盘入库 /// /// 起始地址 /// 托盘编号 /// 返回处理结果 public WebResponseContent PalletInboundRequest(string stationCode, string palletCode) { WebResponseContent content = new WebResponseContent(); try { (bool, string) result = CheckRequestInbound(stationCode, palletCode, false); if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2); content = AssignLocUpdateData(stationCode, TaskTypeEnum.PalletInbound.ObjToInt(), palletCode, false); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// /// 物料入库 /// /// 起始地址 /// 托盘编号 /// 返回处理结果 public WebResponseContent InboundRequest(string stationCode, string palletCode) { WebResponseContent content = new WebResponseContent(); try { Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(palletCode); (bool, string) result = CheckRequestInbound(stationCode, palletCode, true, stockInfo); if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2); content = AssignLocUpdateData(stationCode, TaskTypeEnum.Inbound.ObjToInt(), palletCode, true, stockInfo); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// /// 入库分配货位及处理数据 /// /// 起始地址 /// 任务类型 /// 托盘编号 /// 是否更新组盘信息--区分物料入库和空托入库 /// 组盘信息--可空 /// 订单号--可空 /// 返回处理结果 private WebResponseContent AssignLocUpdateData(string stationCode, int taskType, string palletCode, bool isUpdateStock = true, Dt_StockInfo? stockInfo = null, string orderNo = "") { WebResponseContent content = new WebResponseContent(); try { Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(stationCode, taskType); if (locationInfo != null) { Dt_Task task = new() { CurrentAddress = stationCode, Grade = 0, PalletCode = palletCode, NextAddress = locationInfo.LocationCode, Roadway = locationInfo.RoadwayNo, SourceAddress = stationCode, TargetAddress = locationInfo.LocationCode, TaskState = InTaskStatusEnum.InNew.ObjToInt(), TaskType = taskType, }; BaseDal.AddData(task); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.PalletLock.ObjToInt(); if (isUpdateStock) { locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); if (stockInfo != null && stockInfo.Details != null && stockInfo.Details.Count > 0) { orderNo = stockInfo.Details.FirstOrDefault()?.OrderNo ?? ""; stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); } else { return content = WebResponseContent.Instance.Error("未找到库存信息"); } } _basicService.LocationInfoService.Repository.UpdateData(locationInfo); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), orderNo, task.TaskNum); return content = WebResponseContent.Instance.OK(); } return content = WebResponseContent.Instance.Error("未找到可分配货位"); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// /// 堆垛机申请入库 /// /// /// public WebResponseContent StackerCraneRequestInbound(ConveyorLineDTO lineDTO) { WebResponseContent content = new WebResponseContent(); try { var task = BaseDal.QueryFirst(x => x.PalletCode == lineDTO.Barcode); if (task == null) throw new Exception($"未找到托盘号[{lineDTO.Barcode}]的入库任务"); if (task.TaskState >= (int)InTaskStatusEnum.Line_InFinish) throw new Exception($"托盘号[{lineDTO.Barcode}]的入库任务状态不匹配"); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(lineDTO.Barcode); if (stockInfo == null) throw new Exception($"未找到托盘[{lineDTO.Barcode}]的组盘信息"); Dt_StockInfoDetail? stockInfoDetail = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault(); if (stockInfoDetail == null) throw new Exception($"未找到托盘[{lineDTO.Barcode}]的组盘详情"); if (stockInfo.StockStatus != StockStatusEmun.入库确认.ObjToInt()) throw new Exception($"托盘[{lineDTO.Barcode}],该组盘状态不可入库"); Dt_InboundOrder inboundOrder = _inboundService.InbounOrderService.GetInboundOrder(stockInfoDetail.OrderNo); if (inboundOrder == null || inboundOrder.Details == null) throw new Exception($"未找到托盘[{lineDTO.Barcode}]的入库单明细信息"); Dt_StockInfo instockInfo = null; Dt_LocationInfo locationInfo = null; #region 判断当前入库托盘批次号是否存在已分配入库 Dt_StockInfoDetail instockInfoDetail = _stockService.StockInfoDetailService.Get_StockInfoDetail(stockInfoDetail.OrderNo, stockInfoDetail.BatchNo); if (instockInfoDetail != null) instockInfo = _stockService.StockInfoService.Repository.GetStockInfo(instockInfoDetail.StockId); if (instockInfo != null) { locationInfo = _basicService.LocationInfoService.GetLocation(instockInfo.LocationCode); } #endregion else { instockInfoDetail = _stockService.StockInfoDetailService.Get_StockInfoDetail(stockInfoDetail.OrderNo);//入库单存在库存,判断货位 if (instockInfoDetail != null) instockInfo = _stockService.StockInfoService.Repository.GetStockInfo(instockInfoDetail.StockId); if (instockInfo != null) { locationInfo = _basicService.LocationInfoService.GetLocation(instockInfo.LocationCode); //if (locationInfo.MaxQty == 12) //{ // locationInfo.EnableStatus = EnableStatusEnum.OnlyOut.ObjToInt(); // _basicService.LocationInfoService.Repository.UpdateData(locationInfo); // locationInfo = null; //} if (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt()) locationInfo = null; else { List stockInfoDetails = _stockService.StockInfoDetailService.Get_StockInfoDetails(stockInfoDetail.OrderNo);//获取工单所有已入库或入库中库存 if (stockInfoDetails.GroupBy(x => x.BatchNo).Count() < 2) locationInfo.EnableStatus = EnableStatusEnum.OnlyOut.ObjToInt(); else locationInfo = null; } } if (locationInfo == null) { int inboundOrderCount = inboundOrder.Details.Count; List stockInfoDetails = _stockService.StockInfoDetailService.Get_StockInfoDetails(stockInfoDetail.OrderNo);//获取工单所有已入库或入库中库存 if (stockInfoDetails != null || stockInfoDetails.Count > 0) inboundOrderCount -= stockInfoDetails.GroupBy(x => x.BatchNo).Count(); locationInfo = _basicService.LocationInfoService.AssignLocation(inboundOrderCount);//重新分配货位 } } if (locationInfo == null) throw new Exception($"无可入货位"); #region 修改库存及货位信息 task.TaskState = (int)InTaskStatusEnum.SC_InExecuting; task.CurrentAddress = task.NextAddress; task.NextAddress = locationInfo.LocationCode; task.TargetAddress = task.NextAddress; task.IsPickPlace = locationInfo.MaxQty - locationInfo.CurrentQty == 1; stockInfo.LocationCode = locationInfo.LocationCode; stockInfo.StockStatus = StockStatusEmun.入库中.ObjToInt(); stockInfoDetail.Status = StockStatusEmun.入库中.ObjToInt(); locationInfo.CurrentQty++; if (locationInfo.MaxQty == 12) locationInfo.EnableStatus = EnableStatusEnum.OnlyOut.ObjToInt(); locationInfo.LocationStatus = LocationStatusEnum.Inbounding.ObjToInt(); Db.Ado.BeginTran(); UpdateData(task); _stockService.StockInfoService.Repository.UpdateData(stockInfo); _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetail); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); Db.Ado.CommitTran(); #endregion content.OK(data: new ReceiveWMSInfo() { TargetAddress = task.TargetAddress, IsPickPlace = task.IsPickPlace, }); } catch (Exception ex) { Db.Ado.RollbackTran(); content.Error(ex.Message); } return content; } } }