using WIDESEA_Common.TaskEnum; using WIDESEA_Core; using WIDESEA_DTO.Stock; using WIDESEA_DTO.Task; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService { public partial class TaskService { #region 机械手任务 /// /// 创建机械手组盘任务 /// public async Task CreateRobotGroupPalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "组盘", RobotTaskTypeEnum.GroupPallet, s => string.IsNullOrWhiteSpace(s.TargetPalletNo) ? s.SourcePalletNo : s.TargetPalletNo, requireStockWithoutLocation: false); } /// /// 创建机械手换盘任务 /// public async Task CreateRobotChangePalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "换盘", RobotTaskTypeEnum.ChangePallet, s => s.SourcePalletNo, requireStockWithoutLocation: true, stockPalletCodeSelector: s => s.SourcePalletNo); } /// /// 创建机械手拆盘任务 /// public async Task CreateRobotSplitPalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "拆盘", RobotTaskTypeEnum.SplitPallet, s => s.SourcePalletNo, requireStockWithoutLocation: true, stockPalletCodeSelector: s => s.SourcePalletNo); } /// /// 创建机械手任务的通用方法 /// /// 库存信息 /// 任务名称(组盘/换盘/拆盘) /// 机械手任务类型 /// 托盘号选择器 /// 是否要求库存未绑定货位 /// 库存查询用的托盘号选择器 /// 创建结果 private async Task CreateRobotPalletTaskAsync( StockDTO stock, string taskName, RobotTaskTypeEnum taskType, Func palletCodeSelector, bool requireStockWithoutLocation, Func? 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.Repository.QueryDataNavFirstAsync(x => x.PalletCode == stockPalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error($"托盘[{stockPalletCode}]库存不存在"); if (stockInfo.LocationId > 0 || !string.IsNullOrWhiteSpace(stockInfo.LocationCode)) return WebResponseContent.Instance.Error($"托盘[{stockPalletCode}]库存已绑定货位,不能创建机械手{taskName}任务"); } var section = App.Configuration.GetSection("RobotTaskAddressRules").GetSection(targetLineNo).GetChildren().Select(c => c.Value).ToArray(); if (section.Length < 2) return WebResponseContent.Instance.Error($"未找到线体[{targetLineNo}]的地址配置"); var task = new Dt_Task { TaskNum = await BaseDal.GetTaskNo(), PalletCode = palletCode, PalletType = stockInfo?.PalletType ?? 0, Roadway = stock.Roadway ?? string.Empty, TaskType = taskType.GetHashCode(), TaskStatus = TaskRobotStatusEnum.RobotNew.GetHashCode(), SourceAddress = section[0]!, TargetAddress = section[1]!, CurrentAddress = targetLineNo, 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(task) ?? new WMSTaskDTO(); wmstaskDto.TaskQuantity = stock.Details?.Sum(d => d.Quantity) ?? 0; return WebResponseContent.Instance.OK($"机械手{taskName}任务创建成功", wmstaskDto); } catch (Exception ex) { return WebResponseContent.Instance.Error($"机械手{taskName}任务创建失败: {ex.Message}"); } } #endregion 机械手任务 } }