林豪 左 1 жил өмнө
parent
commit
889238342d

+ 2 - 0
WCS.WorkEngineering/LockHub.cs

@@ -3,5 +3,7 @@
     public static class LockHub
     {
         public static object ApplyEmptySpoolLock = new object();
+
+        public static object AgvCallbackLock = new object();
     }
 }

+ 86 - 83
WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -151,104 +151,107 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         [HttpPost]
         public AgvCallbackResponse AgvCallback([FromBody] AgvCallbackRequest reqDto)
         {
-            var res = new AgvCallbackResponse() { code = AgvResponseCode.Success, message = "成功" };
-            WCS_TaskInfo taskInfo = null;
-            try
+            lock (LockHub.AgvCallbackLock)
             {
-                SqlSugarHelper.Do(db =>
+                var res = new AgvCallbackResponse() { code = AgvResponseCode.Success, message = "成功" };
+                WCS_TaskInfo taskInfo = null;
+                try
                 {
-                    //跟据AGVid找到对应的AGV任务
-                    var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2)).First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
-                    if (agvTask == null && reqDto.method != "applySecurity")
-                    {
-                        res.code = AgvResponseCode.Fail;
-                        res.message = "未找到对应的AGV任务";
-                        return;
-                    }
-                    switch (reqDto.method)
+                    SqlSugarHelper.Do(db =>
                     {
-                        //case "start": //表示请求巷道
-                        //    agvTask.Status = AGVTaskStatus.RequestOrPermission1;
-                        //    break;
+                        //跟据AGVid找到对应的AGV任务
+                        var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2)).First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
+                        if (agvTask == null && reqDto.method != "applySecurity")
+                        {
+                            res.code = AgvResponseCode.Fail;
+                            res.message = "未找到对应的AGV任务";
+                            return;
+                        }
+                        switch (reqDto.method)
+                        {
+                            //case "start": //表示请求巷道
+                            //    agvTask.Status = AGVTaskStatus.RequestOrPermission1;
+                            //    break;
 
-                        //case "end": //表示请求巷道
-                        //    agvTask.Status = AGVTaskStatus.RequestOrPermission1;
-                        //    break;
+                            //case "end": //表示请求巷道
+                            //    agvTask.Status = AGVTaskStatus.RequestOrPermission1;
+                            //    break;
 
-                        case "applyContinue": //表示请求巷道
+                            case "applyContinue": //表示请求巷道
 
-                            agvTask.Status = AGVTaskStatus.RequestOrPermission1;
-                            break;
+                                agvTask.Status = AGVTaskStatus.RequestOrPermission1;
+                                break;
 
-                        case "applySecurity": //表示请求放货或取货
-                            if (reqDto.callCode is "1012" or "1014" or "1016")
-                            {
-                                agvTask = db.Default.Queryable<WCS_AgvTaskInfo>()
-                                                    .SplitTable(tabs => tabs.Take(2))
-                                                    .First(v => v.Status == AGVTaskStatus.NewBuild && v.TaskType == AGVTaskType.CallForMaterial && v.Station == reqDto.callCode);
-                                agvTask.AgvID = reqDto.taskCode;
-                                var obj = World.GetSystemInstance<GetDeviceSystem>().Invoke("输送机") as List<Station>;
-                                var id = obj.FirstOrDefault(v => v.Entity.Code == agvTask.Station).Data.TaskNumber;
-                                taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == id);
-                                taskInfo.AgvTaskID = agvTask.ID;
-                                taskInfo.Status = Entity.TaskStatus.AGVExecution;
-                                db.Default.Updateable(taskInfo).ExecuteCommand();
-                                taskInfo.AddWCS_TASK_DTL(db, agvTask.Station, "agv执行中");
-                            }
-                            if (agvTask == null)
-                            {
-                                res.code = AgvResponseCode.Fail;
-                                res.message = "未找到对应的AGV任务";
-                                return;
-                            }
-                            agvTask.Status = AGVTaskStatus.RequestOrPermission2;
-                            break;
+                            case "applySecurity": //表示请求放货或取货
+                                if (reqDto.callCode is "1012" or "1014" or "1016")
+                                {
+                                    agvTask = db.Default.Queryable<WCS_AgvTaskInfo>()
+                                                        .SplitTable(tabs => tabs.Take(2))
+                                                        .First(v => v.Status == AGVTaskStatus.NewBuild && v.TaskType == AGVTaskType.CallForMaterial && v.Station == reqDto.callCode);
+                                    agvTask.AgvID = reqDto.taskCode;
+                                    var obj = World.GetSystemInstance<GetDeviceSystem>().Invoke("输送机") as List<Station>;
+                                    var id = obj.FirstOrDefault(v => v.Entity.Code == agvTask.Station).Data.TaskNumber;
+                                    taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == id);
+                                    taskInfo.AgvTaskID = agvTask.ID;
+                                    taskInfo.Status = Entity.TaskStatus.AGVExecution;
+                                    db.Default.Updateable(taskInfo).ExecuteCommand();
+                                    taskInfo.AddWCS_TASK_DTL(db, agvTask.Station, "agv执行中");
+                                }
+                                if (agvTask == null)
+                                {
+                                    res.code = AgvResponseCode.Fail;
+                                    res.message = "未找到对应的AGV任务";
+                                    return;
+                                }
+                                agvTask.Status = AGVTaskStatus.RequestOrPermission2;
+                                break;
+
+                            case "hjend_2": //补空任务完成
+                                if (agvTask.TaskType == AGVTaskType.CallForMaterial)
+                                {
+                                    taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agvTask.ID);
+                                    taskInfo.Status = Entity.TaskStatus.Finish;
+                                    taskInfo.EedTime = DateTime.Now;
+                                    taskInfo.AddWCS_TASK_DTL(db, "agv缓存区", "任务完成");
+                                    db.Default.Updateable(taskInfo).ExecuteCommand();
+                                    taskInfo.CompleteOrCancelTasks(db);
+                                }
+                                agvTask.Status = AGVTaskStatus.MissionCompleted;
+                                break;
+
+                            case "endhjBM": //取满任务完成
+                                agvTask.Status = AGVTaskStatus.MissionCompleted;
+                                break;
 
-                        case "hjend_2": //补空任务完成
-                            if (agvTask.TaskType == AGVTaskType.CallForMaterial)
-                            {
+                            case "tcEnd": //机台补空任务完成
+                                agvTask.Status = AGVTaskStatus.MissionCompleted;
                                 taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agvTask.ID);
                                 taskInfo.Status = Entity.TaskStatus.Finish;
-                                taskInfo.EedTime = DateTime.Now;
-                                taskInfo.AddWCS_TASK_DTL(db, "agv缓存区", "任务完成");
+                                taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成");
                                 db.Default.Updateable(taskInfo).ExecuteCommand();
                                 taskInfo.CompleteOrCancelTasks(db);
-                            }
-                            agvTask.Status = AGVTaskStatus.MissionCompleted;
-                            break;
+                                break;
 
-                        case "endhjBM": //取满任务完成
-                            agvTask.Status = AGVTaskStatus.MissionCompleted;
-                            break;
+                            case "exc_end": //异常信息上抛-值不匹配
+                                agvTask.Status = AGVTaskStatus.MissionCompleted;
+                                break;
 
-                        case "tcEnd": //机台补空任务完成
-                            agvTask.Status = AGVTaskStatus.MissionCompleted;
-                            taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agvTask.ID);
-                            taskInfo.Status = Entity.TaskStatus.Finish;
-                            taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成");
-                            db.Default.Updateable(taskInfo).ExecuteCommand();
-                            taskInfo.CompleteOrCancelTasks(db);
-                            break;
+                            case "outbin": //小车退出取货位
+                                agvTask.Status = AGVTaskStatus.Complete3;
+                                break;
 
-                        case "exc_end": //异常信息上抛-值不匹配
-                            agvTask.Status = AGVTaskStatus.MissionCompleted;
-                            break;
-
-                        case "outbin": //小车退出取货位
-                            agvTask.Status = AGVTaskStatus.Complete3;
-                            break;
-
-                        default:
-                            break;
-                    }
-                    db.Default.Updateable(agvTask).SplitTable().ExecuteCommand();
-                });
-                if (taskInfo != null && taskInfo.Status == Entity.TaskStatus.Finish) WmsApi.CompleteTask(taskInfo.ID);
-            }
-            catch (Exception ex)
-            {
-                res.code = AgvResponseCode.Error;
-                res.message = ex.Message;
+                            default:
+                                break;
+                        }
+                        db.Default.Updateable(agvTask).SplitTable().ExecuteCommand();
+                    });
+                    if (taskInfo != null && taskInfo.Status == Entity.TaskStatus.Finish) WmsApi.CompleteTask(taskInfo.ID);
+                }
+                catch (Exception ex)
+                {
+                    res.code = AgvResponseCode.Error;
+                    res.message = ex.Message;
+                }
             }
             return res;
         }