kazelee
2025-05-13 38a8b2931abd72ee04285794aacbea7ed7c49228
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
using System;
using System.Threading.Tasks;
 
using HH.WCS.Mobox3.DSZSH.Consts;
using HH.WCS.Mobox3.DSZSH.Devices;
using HH.WCS.Mobox3.DSZSH.Helpers;
using HH.WCS.Mobox3.DSZSH.Models;
using HH.WCS.Mobox3.DSZSH.ServiceCore;
 
using Newtonsoft.Json;
 
using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
 
namespace HH.WCS.Mobox3.DSZSH.Services {
    public class AgvService {
        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 任务,查询不到任务返回 <see langword="false"/>
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        private static bool AgvTaskProcessOk(AgvTaskState model) {
            var TN_Task = TaskHelper.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 AgvStateCode.执行:
                    TaskHelper.Begin(TN_Task, model.forklift_no); // 已推送的任务的状态改成执行
                    break;
                case AgvStateCode.开始取货:
                    TaskHelper.UpdateStatus(TN_Task, "开始取货"); // 任务状态改成开始取货
                    break;
                case AgvStateCode.取货完成:
                    TaskHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成
                    TaskHelper.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点
 
                    if (TN_Task.S_TYPE == TaskName.成品胶出库) {
                        var nextOutboundTask = Task.Run(() => {
                            OutboundCore.UpdateTaskState(SpotStateCode.任务执行完成);
                        });
                    }
 
                    break;
                case AgvStateCode.开始卸货:
                    TaskHelper.UpdateStatus(TN_Task, "开始卸货"); // 任务状态改成开始卸货
                    break;
                case AgvStateCode.卸货完成:
                    TaskHelper.UpdateStatus(TN_Task, "卸货完成"); // 任务状态改成卸货完成
                    TaskHelper.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点
                    break;
                case AgvStateCode.完成:
                    TaskHelper.End(TN_Task); // 任务状态改成结束
 
                    if (TN_Task.S_TYPE == TaskName.抽检_出库) {
                        var checkCompleteTask = Task.Run(() => {
                            CheckCore.UpdateTaskState(SpotStateCode.任务执行完成);
                        });
                    }
 
                    break;
                case AgvStateCode.异常:
                    TaskHelper.OperateStatus(TN_Task, 7); // 异常处理
                    TaskHelper.Fail(TN_Task); // 任务状态改成错误
                    break;
            }
 
            // 将AGV执行状态,加入TN_Task_Action表中
            TaskHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data);
            //调用第三方接口(如果有)TaskProcess.ReportStatus,添加任务动作关系表
 
            return true;
        }
 
 
 
        public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
            var gzResult = new ReturnResult();
            var db = DbHelper.GetDbClient();
            ModbusHelper.Relink();
 
            try {
                
 
                var prodLineInfo = AppStart.Settings.Config.ProductionLines[0];
                var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort);
                if (!prodLineDevice.LoadDeviceStateOk()) {
                    LogHelper.Info("加载设备信息失败");
                }
 
                var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.TaskNo);
                if (tn_task == null) {
                    LogHelper.Info($"任务号 '{model.TaskNo}' 不存在");
                }
 
                // 待修改:补充不同分支AGV判断
                if (prodLineDevice.SystemState == 1) {
                    if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.托盘_满托下线入库) {
                        prodLineDevice.AgvPicking = 1;
                    }
                    if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.托盘_空托上线) {
                        prodLineDevice.AgvPlacingPallet = 1;
                    }
                }
 
                LogHelper.Info(JsonConvert.SerializeObject(prodLineDevice, Formatting.Indented));
                return gzResult;
            }
            catch (Exception ex) {
                LogHelper.Info($"发生了异常:{ex.Message}");
                return gzResult;
            }
        }
    }
}