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.Error($"通知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(); } } }