kazelee
2025-05-20 ef839d119eec2c28fac5f5ba175d71f926afae44
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
using HH.WCS.Mobox3.AnGang.Devices;
using HH.WCS.Mobox3.AnGang.Dispatch;
using HH.WCS.Mobox3.AnGang.Models;
using HH.WCS.Mobox3.AnGang.process;
using HH.WCS.Mobox3.AnGang.config;
using HH.WCS.Mobox3.AnGang.Helper;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static HH.WCS.Mobox3.AnGang.Controllers.ApiModel;
using static HH.WCS.Mobox3.AnGang.Dtos.Response.AgvResponse;
using static HH.WCS.Mobox3.AnGang.Dtos.Request.AgvRequest;
 
namespace HH.WCS.Mobox3.AnGang.ServiceCore
{
    internal class WCSCore
    {
        public static ReturnResult OperateAgvTaskStatus(AgvTaskState model)
        {
            var result = new ReturnResult();
            try
            {
                switch (model.state) {
                    case 1023:
                    case 1025:
 
                        break;
                    case 1012:
                        break;
                    case 1004:
                        break;
                    case 1103:
                        break;
                    default:
                        // AGV 执行任务的逻辑处理
                        if (!AgvTaskProcessOk(model)) {
                            // 执行不OK,说明没有找到任务
                            result.ResultCode = 1;
                            result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}";
                            LogHelper.Info(result.ResultMsg, "API");
                            return result;
                        }
                        break;
                }
 
                result.ResultCode = 0;
                result.ResultMsg = "success";
                LogHelper.Info(result.ResultMsg, "API");
                return result;
            }
            catch(Exception ex)
            {
                result.ResultCode = -1;
                result.ResultMsg = $"发生了异常:{ex.Message}";
                LogHelper.Info(result.ResultMsg, "Error");
                return result;
            }
 
        }
 
        /// <summary>
        /// 执行AGV任务,查询不到任务返回false
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        private static bool AgvTaskProcessOk(AgvTaskState model) {
            var TN_Task = WCSHelper.GetTask(model.task_no); // 根据当前model编号查询任务
            if (TN_Task == null) { return false; }
 
            if (model.state > 7) {
                //安全请求等
                TaskHelper.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data);
                return true;
            }
            
            // AGV 任务 134562(7) 状态处理
            switch (model.state) {
                case 1:
                    WCSHelper.Begin(TN_Task, model.forklift_no); // 已推送的任务的状态改成执行
                    break;
                case 3:
                    WCSHelper.UpdateStatus(TN_Task, "开始取货"); // 任务状态改成开始取货
                    break;
                case 4:
                    WCSHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成
                    TaskHelper.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点
                    break;
                case 5:
                    WCSHelper.UpdateStatus(TN_Task, "开始卸货"); // 任务状态改成开始卸货
                    break;
                case 6:
                    WCSHelper.UpdateStatus(TN_Task, "卸货完成"); // 任务状态改成卸货完成
                    TaskHelper.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点
                    break;
                case 2:
                    WCSHelper.End(TN_Task); // 任务状态改成结束
                    break;
                case 7:
                    TaskHelper.OperateStatus(TN_Task, 7); // 异常处理
                    WCSHelper.Fail(TN_Task); // 任务状态改成错误
                    break;
            }
 
            WCSHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data);
            //调用第三方接口(如果有)TaskProcess.ReportStatus,添加任务动作关系表
 
            return true;
        }
 
        /// <summary>
        /// 任务分发,根据调度类型发给不同的调度系统
        /// </summary>
        internal static void Dispatch()
        {
            //查询任务
            //获取所有等待的任务
            var list = WCSHelper.GetWaitingTaskList();
            LogHelper.Info("等待任务信息" + JsonConvert.SerializeObject(list), "API");
            if (list.Count > 0)
            {
                list.ForEach(task =>
                {
                    //使用自定义任务推送
                    TaskHelper.SendTask(task);//调度NDC或杭奥或国自设备
                    //TaskProcess.SendGZTask(task);///调度国自设备
 
                });
            }
            else
            {
                LogHelper.Info("暂无任务");
            }
        }
 
        
 
        /// <summary>
        /// 空托下线堆叠
        /// </summary>
        /// <param name="tN_Task"></param>
        //public static void EmptyInStackArea(TN_Task tN_Task)
        //{
        //    if (tN_Task.S_TYPE == "满托出库上线")
        //    {
        //        var result = new SimpleResult();
        //        var db = DbHelper.GetDbClient();
        //        try
        //        {
        //            var startLocLists = 
        //                db.Queryable<TN_Location>().Where(a => a.S_AREA_CODE == Settings.Areas[6] && a.N_CURRENT_NUM >0 && a.N_LOCK_STATE==0 && a.S_LOCK_STATE == "无").ToList();
 
        //            if (startLocLists.Count == 0)
        //            {
        //                LogHelper.Info($"人工托盘区暂无已绑定的空托,需要满足:货位数量大于0,未锁定的,属于库区{Settings.Areas[6]}的货位");
        //                return;
        //            }
 
        //            foreach (var item in startLocLists)
        //            {
        //                //查询符合的未锁定已启用指定货区的当前数量合计后最接近容量的货位,终点
        //                var endLoc = db.Queryable<TN_Location>().
        //                    Where(a => a.N_CURRENT_NUM + item.N_CURRENT_NUM <= a.N_CAPACITY && a.S_AREA_CODE == Settings.Areas[3] && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y").
        //                    OrderBy(a => a.N_CURRENT_NUM + item.N_CURRENT_NUM - a.N_CAPACITY, OrderByType.Desc).First();
 
        //                if (endLoc == null)
        //                {
        //                    LogHelper.Info($"未找到合适的终点,需要满足:属于{Settings.Areas[3]}的未锁定的容量充足的货位");
        //                    continue;
        //                }
        //                var locCnt = db.Queryable<TN_Loc_Container>().First(a=>a.S_LOC_CODE == item.S_CODE);
 
        //                if (locCnt == null)
        //                {
        //                    LogHelper.Info($"货位{item.S_CODE}未绑定容器");
        //                    continue;
        //                }
 
        //                //创建空托下线堆叠任务
        //                if (WCSHelper.CreateTask(item.S_CODE, endLoc.S_CODE, "空托下线堆叠", 3, locCnt.S_CNTR_CODE))//创建搬送任务,起点终点容器
        //                {
        //                    LocationHelper.LockLoc(item.S_CODE, 2);//起点出库锁,
        //                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
 
        //                    LogHelper.Info($"生成空托下线堆叠任务成功,容器号{locCnt.S_CNTR_CODE},起点{item.S_CODE},终点{endLoc.S_CODE}");
        //                }
        //                else
        //                {
        //                    LogHelper.Info($"生成空托下线堆叠任务失败,容器号{locCnt.S_CNTR_CODE},起点{item.S_CODE},终点{endLoc.S_CODE}");
        //                    continue;
        //                }
        //            }
        //        }
        //        catch (Exception ex)
        //        {
        //            LogHelper.Info($"发生了异常:{ex.Message}", "Error");
        //        }
        //    }
        //}
 
        
    }
}