using System.Diagnostics.CodeAnalysis;
|
using WIDESEAWCS_Common.HttpEnum;
|
using WIDESEAWCS_Common.TaskEnum;
|
using WIDESEA_Core;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_DTO;
|
using WIDESEAWCS_DTO.TaskInfo;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
|
namespace WIDESEAWCS_TaskInfoService.Flows
|
{
|
/// <summary>
|
/// 移库任务流程服务。
|
/// 负责移库任务接收初始化、状态推进以及堆垛机完成时的WMS通知流程。
|
/// </summary>
|
public class RelocationTaskFlowService : IRelocationTaskFlowService
|
{
|
private readonly HttpClientHelper _httpClientHelper;
|
|
/// <summary>
|
/// 初始化移库任务流程服务。
|
/// </summary>
|
/// <param name="httpClientHelper">WMS接口调用帮助类。</param>
|
public RelocationTaskFlowService(HttpClientHelper httpClientHelper)
|
{
|
_httpClientHelper = httpClientHelper;
|
}
|
|
/// <summary>
|
/// 接收WMS任务时初始化移库任务。
|
/// 当前移库任务不做额外初始化。
|
/// </summary>
|
/// <param name="task">任务实体。</param>
|
/// <param name="source">WMS任务原始数据。</param>
|
public void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
|
{
|
// 当前版本移库任务接收时不需要额外设置路由或状态。
|
}
|
|
/// <summary>
|
/// 将移库任务推进到下一状态,并在关键状态调用WMS接口。
|
/// </summary>
|
/// <param name="task">任务实体。</param>
|
/// <returns>状态推进结果。</returns>
|
public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
|
{
|
if (task.TaskStatus >= (int)TaskRelocationStatusEnum.RelocationFinish)
|
return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
|
|
task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
|
if (task.TaskStatus <= 0)
|
return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
|
|
if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
|
{
|
return UpdateWMSTaskStatus(task);
|
}
|
|
if (task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish)
|
{
|
return NotifyWMSRelocationFinish(task);
|
}
|
|
return WebResponseContent.Instance.OK();
|
}
|
|
/// <summary>
|
/// 处理堆垛机移库完成动作。
|
/// </summary>
|
/// <param name="task">任务实体。</param>
|
/// <returns>处理结果。</returns>
|
public WebResponseContent CompleteStackerTask([NotNull] Dt_Task task)
|
{
|
WebResponseContent content = new WebResponseContent();
|
if (task.TaskStatus != (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
|
{
|
return WebResponseContent.Instance.OK();
|
}
|
|
int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
|
task.TaskStatus = nextStatus;
|
task.ModifyDate = DateTime.Now;
|
task.Modifier = "System";
|
|
WebResponseContent result = NotifyWMSRelocationFinish(task);
|
if (!result.Status)
|
{
|
return content.Error($"通知WMS系统堆垛机移库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Message}】");
|
}
|
|
return content.Error($"通知WMS系统堆垛机移库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】");
|
}
|
|
/// <summary>
|
/// 将移库状态同步到WMS。
|
/// </summary>
|
/// <param name="task">任务实体。</param>
|
/// <returns>同步结果。</returns>
|
private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
|
{
|
var result = _httpClientHelper.Post<WebResponseContent>(
|
nameof(ConfigKey.UpdateTaskByStatus),
|
new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus, NextAddress = task.NextAddress, CurrentAddress = task.CurrentAddress }.ToJson());
|
|
if (!result.IsSuccess || !result.Data.Status)
|
return WebResponseContent.Instance.Error($"调用WMS接口更新任务状态失败,任务号:【{task.TaskNum}】,错误信息:【{result.Data?.Message}】");
|
|
return WebResponseContent.Instance.OK();
|
}
|
|
/// <summary>
|
/// 通知WMS移库任务已完成。
|
/// </summary>
|
/// <param name="task">任务实体。</param>
|
/// <returns>通知结果。</returns>
|
private WebResponseContent NotifyWMSRelocationFinish(Dt_Task task)
|
{
|
var result = _httpClientHelper.Post<WebResponseContent>(
|
nameof(ConfigKey.RelocationFinishTask),
|
new CreateTaskDto
|
{
|
PalletCode = task.PalletCode,
|
SourceAddress = task.CurrentAddress,
|
TargetAddress = task.TargetAddress,
|
Roadway = task.Roadway,
|
TaskType = task.TaskType
|
}.ToJson());
|
|
if (!result.IsSuccess || !result.Data.Status)
|
return WebResponseContent.Instance.Error($"通知WMS系统移库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data?.Message}】");
|
|
return WebResponseContent.Instance.OK();
|
}
|
}
|
}
|