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;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
namespace WIDESEAWCS_TaskInfoService.Flows
{
///
/// 入库任务流程服务。
/// 负责入库任务接收初始化、状态推进及堆垛机完成处理。
///
public class InboundTaskFlowService : IInboundTaskFlowService
{
private readonly IRouterService _routerService;
private readonly HttpClientHelper _httpClientHelper;
///
/// 初始化入库任务流程服务。
///
/// 路由服务。
/// WMS接口调用帮助类。
public InboundTaskFlowService(IRouterService routerService, HttpClientHelper httpClientHelper)
{
_routerService = routerService;
_httpClientHelper = httpClientHelper;
}
///
/// 接收WMS任务时初始化入库任务。
///
/// 任务实体。
/// WMS任务原始数据。
public void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
{
Dt_Router routers = _routerService.QueryNextRoute(source.SourceAddress);
if (routers.IsNullOrEmpty())
{
return;
}
task.TaskStatus = (int)TaskInStatusEnum.InNew;
task.CurrentAddress = source.SourceAddress;
task.NextAddress = routers.ChildPosi;
}
///
/// 推进入库任务状态,并在关键状态调用WMS接口。
///
/// 任务实体。
/// 推进结果。
public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
{
if (task.TaskStatus >= (int)TaskInStatusEnum.InFinish)
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)TaskInStatusEnum.Line_InFinish)
{
return GetWMSInboundLocation(task);
}
return UpdateWMSTaskStatus(task);
}
///
/// 处理堆垛机入库完成动作。
///
/// 任务实体。
/// 处理结果。
public WebResponseContent CompleteStackerTask([NotNull] Dt_Task task)
{
WebResponseContent content = new WebResponseContent();
if (task.TaskStatus != (int)TaskInStatusEnum.SC_InExecuting)
{
return WebResponseContent.Instance.OK();
}
int nextStatus = task.TaskStatus.GetNextNotCompletedStatus();
task.TaskStatus = nextStatus;
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
var result = _httpClientHelper.Post(
nameof(ConfigKey.InboundFinishTaskAsync),
(new CreateTaskDto { PalletCode = task.PalletCode }).ToJson());
if (!result.IsSuccess || !result.Data.Status)
{
return content.Error($"通知WMS系统堆垛机入库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data?.Message}】");
}
return content.OK($"通知WMS系统堆垛机入库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】");
}
///
/// 从WMS获取入库目标地址并回写任务。
///
/// 任务实体。
/// 调用结果。
private WebResponseContent GetWMSInboundLocation(Dt_Task task)
{
var result = _httpClientHelper.Post(
nameof(ConfigKey.GetTasksLocation),
new CreateTaskDto { PalletCode = task.PalletCode }.ToJson());
if (!result.IsSuccess || !result.Data.Status)
return WebResponseContent.Instance.Error($"调用WMS接口获取任务目标地址失败,任务号:【{task.TaskNum}】,错误信息:【{result.Data?.Message}】");
string? nextAddress = result.Data.Data?.ToString();
if (string.IsNullOrEmpty(nextAddress))
return WebResponseContent.Instance.Error($"调用WMS接口获取任务目标地址失败,任务号:【{task.TaskNum}】,错误信息:【未获取到有效的目标地址】");
task.CurrentAddress = task.NextAddress;
task.NextAddress = nextAddress;
task.TargetAddress = nextAddress;
return WebResponseContent.Instance.OK();
}
///
/// 将任务状态同步到WMS。
///
/// 任务实体。
/// 同步结果。
private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
{
var result = _httpClientHelper.Post(
nameof(ConfigKey.UpdateTaskByStatus),
new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus }.ToJson());
if (!result.IsSuccess || !result.Data.Status)
return WebResponseContent.Instance.Error($"调用WMS接口更新任务状态失败,任务号:【{task.TaskNum}】,错误信息:【{result.Data?.Message}】");
return WebResponseContent.Instance.OK();
}
}
}