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
{
///
/// 移库任务流程服务。
/// 负责移库任务接收初始化、状态推进以及堆垛机完成时的WMS通知流程。
///
public class RelocationTaskFlowService : IRelocationTaskFlowService
{
private readonly HttpClientHelper _httpClientHelper;
///
/// 初始化移库任务流程服务。
///
/// WMS接口调用帮助类。
public RelocationTaskFlowService(HttpClientHelper httpClientHelper)
{
_httpClientHelper = httpClientHelper;
}
///
/// 接收WMS任务时初始化移库任务。
/// 当前移库任务不做额外初始化。
///
/// 任务实体。
/// WMS任务原始数据。
public void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
{
// 当前版本移库任务接收时不需要额外设置路由或状态。
}
///
/// 将移库任务推进到下一状态,并在关键状态调用WMS接口。
///
/// 任务实体。
/// 状态推进结果。
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();
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();
}
///
/// 处理堆垛机移库完成动作。
///
/// 任务实体。
/// 处理结果。
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();
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}】");
}
///
/// 将移库状态同步到WMS。
///
/// 任务实体。
/// 同步结果。
private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
{
var result = _httpClientHelper.Post(
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();
}
///
/// 通知WMS移库任务已完成。
///
/// 任务实体。
/// 通知结果。
private WebResponseContent NotifyWMSRelocationFinish(Dt_Task task)
{
var result = _httpClientHelper.Post(
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();
}
}
}