| | |
| | | using Mapster; |
| | | using MapsterMapper; |
| | | using Microsoft.Extensions.Configuration; |
| | | using SqlSugar; |
| | |
| | | using WIDESEA_Core.Core; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO.GradingMachine; |
| | | using WIDESEA_DTO.Stock; |
| | | using WIDESEA_DTO.Task; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_IStockService; |
| | |
| | | try |
| | | { |
| | | |
| | | var stockInfo = await _stockInfoService.Repository.QueryFirstAsync(x => x.LocationDetails.WarehouseId == taskDto.WarehouseId && x.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode() && x.StockStatus == StockStatusEmun.空托盘库存.GetHashCode()); |
| | | var stockInfo = await _stockInfoService.Repository.QueryDataNavFirstAsync(x => x.LocationDetails.WarehouseId == taskDto.WarehouseId && x.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode() && x.StockStatus == StockStatusEmun.空托盘库存.GetHashCode()); |
| | | if (stockInfo == null) |
| | | return WebResponseContent.Instance.Error("未找到对应的库存信息"); |
| | | |
| | |
| | | NextAddress = taskDto.TargetAddress, |
| | | TargetAddress = taskDto.TargetAddress, |
| | | Roadway = stockInfo.LocationDetails.RoadwayNo, |
| | | TaskType = TaskTypeEnum.OutEmpty.GetHashCode(), |
| | | TaskType = TaskOutboundTypeEnum.OutEmpty.GetHashCode(), |
| | | TaskStatus = TaskStatusEnum.New.GetHashCode(), |
| | | Grade = 1, |
| | | TaskNum = await BaseDal.GetTaskNo(), |
| | | Creater = "system", |
| | | }; |
| | | var taskDtos = _mapper.Map<List<WMSTaskDTO>>(task); |
| | | var taskDtos = task.Adapt<WMSTaskDTO>(); |
| | | |
| | | BaseDal.AddData(task); |
| | | return WebResponseContent.Instance.OK("查询成功", taskDtos); |
| | | } |
| | | catch (Exception ex) |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 创建机械手组盘任务 |
| | | /// </summary> |
| | | public async Task<WebResponseContent> CreateRobotGroupPalletTaskAsync(StockDTO stock) |
| | | { |
| | | return await CreateRobotPalletTaskAsync( |
| | | stock, |
| | | "组盘", |
| | | RobotTaskTypeEnum.GroupPallet, |
| | | s => string.IsNullOrWhiteSpace(s.TargetPalletNo) ? s.SourcePalletNo : s.TargetPalletNo, |
| | | requireStockWithoutLocation: false); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 创建机械手换盘任务 |
| | | /// </summary> |
| | | public async Task<WebResponseContent> CreateRobotChangePalletTaskAsync(StockDTO stock) |
| | | { |
| | | return await CreateRobotPalletTaskAsync( |
| | | stock, |
| | | "换盘", |
| | | RobotTaskTypeEnum.ChangePallet, |
| | | s => s.SourcePalletNo, |
| | | requireStockWithoutLocation: true, |
| | | stockPalletCodeSelector: s => s.SourcePalletNo); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 创建机械手拆盘任务 |
| | | /// </summary> |
| | | public async Task<WebResponseContent> CreateRobotSplitPalletTaskAsync(StockDTO stock) |
| | | { |
| | | return await CreateRobotPalletTaskAsync( |
| | | stock, |
| | | "拆盘", |
| | | RobotTaskTypeEnum.SplitPallet, |
| | | s => s.SourcePalletNo, |
| | | requireStockWithoutLocation: true, |
| | | stockPalletCodeSelector: s => s.SourcePalletNo); |
| | | } |
| | | |
| | | private async Task<WebResponseContent> CreateRobotPalletTaskAsync( |
| | | StockDTO stock, |
| | | string taskName, |
| | | RobotTaskTypeEnum taskType, |
| | | Func<StockDTO, string?> palletCodeSelector, |
| | | bool requireStockWithoutLocation, |
| | | Func<StockDTO, string?>? stockPalletCodeSelector = null) |
| | | { |
| | | try |
| | | { |
| | | if (stock == null) |
| | | return WebResponseContent.Instance.Error("任务参数不能为空"); |
| | | |
| | | var palletCode = palletCodeSelector(stock)?.Trim(); |
| | | if (string.IsNullOrWhiteSpace(palletCode)) |
| | | return WebResponseContent.Instance.Error("托盘号不能为空"); |
| | | |
| | | var sourceLineNo = stock.SourceLineNo?.Trim(); |
| | | var targetLineNo = stock.TargetLineNo?.Trim(); |
| | | if (string.IsNullOrWhiteSpace(sourceLineNo) || string.IsNullOrWhiteSpace(targetLineNo)) |
| | | return WebResponseContent.Instance.Error("来源线体编号和目标线体编号不能为空"); |
| | | |
| | | var existingTask = await BaseDal.QueryFirstAsync(t => |
| | | t.PalletCode == palletCode && |
| | | (t.TaskStatus == TaskRobotStatusEnum.RobotNew.GetHashCode() |
| | | || t.TaskStatus == TaskRobotStatusEnum.RobotExecuting.GetHashCode() |
| | | || t.TaskStatus == TaskRobotStatusEnum.RobotPickFinish.GetHashCode() |
| | | || t.TaskStatus == TaskRobotStatusEnum.RobotPutFinish.GetHashCode() |
| | | || t.TaskStatus == TaskRobotStatusEnum.RobotPending.GetHashCode())); |
| | | if (existingTask != null) |
| | | return WebResponseContent.Instance.Error($"托盘[{palletCode}]已存在未完成任务"); |
| | | |
| | | Dt_StockInfo? stockInfo = null; |
| | | if (requireStockWithoutLocation) |
| | | { |
| | | var stockPalletCode = (stockPalletCodeSelector ?? palletCodeSelector).Invoke(stock)?.Trim(); |
| | | if (string.IsNullOrWhiteSpace(stockPalletCode)) |
| | | return WebResponseContent.Instance.Error("源托盘号不能为空"); |
| | | |
| | | stockInfo = await _stockInfoService.GetStockInfoAsync(stockPalletCode); |
| | | if (stockInfo == null) |
| | | return WebResponseContent.Instance.Error($"托盘[{stockPalletCode}]库存不存在"); |
| | | |
| | | if (stockInfo.LocationId > 0 || !string.IsNullOrWhiteSpace(stockInfo.LocationCode)) |
| | | return WebResponseContent.Instance.Error($"托盘[{stockPalletCode}]库存已绑定货位,不能创建机械手{taskName}任务"); |
| | | } |
| | | |
| | | var task = new Dt_Task |
| | | { |
| | | TaskNum = await BaseDal.GetTaskNo(), |
| | | PalletCode = palletCode, |
| | | PalletType = stockInfo?.PalletType ?? 0, |
| | | Roadway = stockInfo?.LocationDetails?.RoadwayNo ?? "ROBOT", |
| | | TaskType = taskType.GetHashCode(), |
| | | TaskStatus = TaskRobotStatusEnum.RobotNew.GetHashCode(), |
| | | SourceAddress = sourceLineNo, |
| | | TargetAddress = targetLineNo, |
| | | CurrentAddress = sourceLineNo, |
| | | NextAddress = targetLineNo, |
| | | WarehouseId = stockInfo?.WarehouseId ?? 1, |
| | | Grade = 1, |
| | | Remark = $"机械手{taskName}", |
| | | Creater = "system" |
| | | }; |
| | | |
| | | var result = await Repository.AddDataAsync(task) > 0; |
| | | if (!result) |
| | | return WebResponseContent.Instance.Error($"机械手{taskName}任务创建失败"); |
| | | |
| | | var wmstaskDto = _mapper.Map<WMSTaskDTO>(task); |
| | | return WebResponseContent.Instance.OK($"机械手{taskName}任务创建成功", wmstaskDto); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"机械手{taskName}任务创建失败: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | #endregion WCS逻辑处理 |
| | | |
| | | #region 分容柜接口 |