1
z8018
2025-06-10 e46aa927d231af83724683c7286d9db503e24cf7
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 命名空间:WIDESEAWCS_ITaskInfoService
 * 创建者:胡童庆
 * 创建时间:2024/8/2 16:13:36
 * 版本:V1.0.0
 * 描述:
 *
 * ----------------------------------------------------------------
 * 修改人:
 * 修改时间:
 * 版本:V1.0.1
 * 修改说明:
 * 
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
 
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_DTO.BasicInfo;
using WIDESEAWCS_Model.Models;
 
namespace WIDESEAWCS_ITaskInfoService
{
    public interface ITaskService : IService<Dt_Task>
    {
        /// <summary>
        /// 查询指定门架设备未执行的任务
        /// </summary>
        /// <param name="gantryDeviceNo">门架设备编号</param>
        /// <returns>未执行的任务数据,若不存在则返回null</returns>
        Dt_Task? QueryAGantryUnExecuteTask(string gantryDeviceNo);
 
        /// <summary>
        /// 执行订单块放置测试,根据订单行ID获取订单明细并计算放置位置
        /// </summary>
        /// <param name="orderRowId">订单行ID</param>
        /// <returns>包含放置块信息的Web响应内容。成功时返回放置块列表,失败时返回错误信息</returns>
        /// <remarks>
        /// 1. 通过订单行ID查询订单明细数据 <br/>
        /// 2. 对每个有效订单明细计算合适的放置位置 <br/>
        /// 3. 创建容器项和任务记录 <br/>
        /// 4. 通过WebSocket发布放置位置信息 <br/>
        /// 5. 返回所有成功放置的块信息
        /// </remarks>
        WebResponseContent PlaceBlockTest(int orderRowId);
 
        /// <summary>
        /// 创建任务并计算物品放置位置
        /// </summary>
        /// <param name="takePosition">取货位置编码</param>
        /// <param name="putPosition">放货位置编码</param>
        /// <param name="deviceCode">设备编码</param>
        /// <param name="length">物品长度</param>
        /// <param name="width">物品宽度</param>
        /// <param name="height">物品高度</param>
        /// <returns>包含操作结果的Web响应内容</returns>
        /// <remarks>
        /// 1. 验证取货/放货位置是否存在 <br/>
        /// 2. 计算物品在容器中的最佳放置位置 <br/>
        /// 3. 创建容器物品记录和任务记录 <br/>
        /// 4. 通过WebSocket通知客户端
        /// </remarks>
        WebResponseContent CreateTask(string takePosition, string putPosition, string deviceCode, int length, int width, int height);
 
        /// <summary>
        /// 根据订单信息生成任务
        /// </summary>
        /// <param name="orderInfo">订单信息</param>
        /// <returns>包含三个值的元组: <br/>
        /// Item1 - 操作是否成功 (bool) <br/>
        /// Item2 - 生成的任务对象 (Dt_Task),失败时为null <br/>
        /// Item3 - 错误消息 (string),成功时为空字符串
        /// </returns>
        /// <remarks>
        /// 该方法会: <br/>
        /// 1. 根据订单尺寸获取合适的货位 <br/>
        /// 2. 创建容器项和任务记录 <br/>
        /// 3. 更新相关容器状态 <br/>
        /// 4. 在事务中执行所有数据库操作
        /// </remarks>
        (bool, Dt_Task?, string) GenerateTask(OrderInfo orderInfo);
 
        /// <summary>
        /// 重新生成任务
        /// </summary>
        /// <param name="task">原始任务对象</param>
        /// <param name="stationCode">工作站编码</param>
        /// <returns>
        /// 包含三个值的元组: <br/>
        /// 1. bool - 操作是否成功 <br/>
        /// 2. Dt_Task - 更新后的任务对象(失败时为null) <br/>
        /// 3. string - 错误消息(成功时为空字符串)
        /// </returns>
        /// <remarks>
        /// 该方法用于重新生成任务信息,包括: <br/>
        /// 1. 解析板子尺寸信息 <br/>
        /// 2. 验证取货/放货位置 <br/>
        /// 3. 计算物品放置位置 <br/>
        /// 4. 更新任务状态和位置信息 <br/>
        /// 5. 在事务中更新数据库记录
        /// </remarks>
        (bool, Dt_Task?, string) RegenerateTask(Dt_Task task, string stationCode);
 
        /// <summary>
        /// 生成异常任务
        /// </summary>
        /// <param name="orderInfo">订单信息</param>
        /// <returns>元组包含三个值: <br/>
        /// Item1 - 操作是否成功(bool) <br/>
        /// Item2 - 生成的任务对象(Dt_Task),失败时为null <br/>
        /// Item3 - 错误消息(string),成功时为空字符串</returns>
        /// <remarks>
        /// 该方法会根据订单信息生成一个异常处理任务,包括: <br/>
        /// 1. 获取异常位置 <br/>
        /// 2. 验证放货/取货位置 <br/>
        /// 3. 创建容器项和任务记录 <br/>
        /// 4. 提交事务
        /// </remarks>
        (bool, Dt_Task?, string) GenerateExceptionTask(OrderInfo orderInfo);
 
        /// <summary>
        /// 根据设备编号获取取货位置
        /// </summary>
        /// <param name="deviceCode">设备编号</param>
        /// <returns>符合条件的容器对象,若找不到则返回null</returns>
        /// <remarks>
        /// 1. 首先查询指定设备下所有可用的取货容器,并按ContainerSort升序排序 <br/>
        /// 2. 查找该设备最近的任务记录 <br/>
        /// 3. 如果找到任务记录,则根据任务源地址匹配容器,返回下一个容器(若已是最后一个则返回第一个) <br/>
        /// 4. 如果出现异常或未找到匹配项,则返回第一个可用容器
        /// </remarks>
        Dt_Container? GetTakePosition(string deviceCode);
 
        /// <summary>
        /// 任务完成处理方法
        /// </summary>
        /// <param name="task">任务实体</param>
        /// <returns>Web响应内容</returns>
        /// <remarks>
        /// 1. 更新任务状态为"龙门架完成" <br/>
        /// 2. 更新相关订单详情状态为"码垛成功" <br/>
        /// 3. 更新订单行中的托盘数量 <br/>
        /// 4. 根据任务完成情况发送WebSocket通知 <br/>
        /// 5. 记录操作日志并提交事务 <br/>
        /// 6. 异常时回滚事务并返回错误信息
        /// </remarks>
        WebResponseContent TaskComplete(Dt_Task task);
    }
}