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 WebResponseContent InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source) { // 当前版本移库任务接收时不需要额外设置路由或状态。 return WebResponseContent.Instance.OK(); } /// /// 将移库任务推进到下一状态,并在关键状态调用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(); } } }