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.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 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();
return WebResponseContent.Instance.OK($"机械手{taskName}任务创建成功", wmstaskDto);
}
catch (Exception ex)
{
return WebResponseContent.Instance.Error($"机械手{taskName}任务创建失败: {ex.Message}");
}
}
#endregion 机械手任务
}
}