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 机械手任务
|
|
/// <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);
|
}
|
|
/// <summary>
|
/// 创建机械手任务的通用方法
|
/// </summary>
|
/// <param name="stock">库存信息</param>
|
/// <param name="taskName">任务名称(组盘/换盘/拆盘)</param>
|
/// <param name="taskType">机械手任务类型</param>
|
/// <param name="palletCodeSelector">托盘号选择器</param>
|
/// <param name="requireStockWithoutLocation">是否要求库存未绑定货位</param>
|
/// <param name="stockPalletCodeSelector">库存查询用的托盘号选择器</param>
|
/// <returns>创建结果</returns>
|
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.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<WMSTaskDTO>(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 机械手任务
|
}
|
}
|