wanshenmean
2026-03-18 5c766d7e5c969b7530a014ded771973e242f25e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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 }.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();
        }
    }
}