using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using PlcSiemens.Core.Extension; using ServiceCenter; using ServiceCenter.Attributes; using ServiceCenter.Extensions; using ServiceCenter.Redis; using ServiceCenter.SqlSugars; using System.Net.NetworkInformation; using System.Text; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.DataStructure; using WCS.Entity.Protocol.SRM; using WCS.WorkEngineering.Extensions; using WCS.WorkEngineering.Systems; using WCS.WorkEngineering.WebApi.Models.WCS.Request; using WCS.WorkEngineering.WebApi.Models.WCS.Response; using WCS.WorkEngineering.WebApi.Models.WMS.Response; namespace WCS.WorkEngineering.WebApi.Controllers { /// /// WCS相关接口控制器 /// [ApiController] [Route("api/[controller]/[action]")] public class WcsController : ControllerBase { /// /// 获取设备配置信息接口 /// /// [HttpGet] public List GetDeviceList() { return Device.All.ToList(); } /// /// 设备信息写入接口 /// [HttpPost] public void GetDevList() { var a = RedisHub.Monitor.LRange("Packs", 0, 80000); var packs = a.Select(JsonConvert.DeserializeObject).ToList(); } /// /// 任务处理接口 /// /// /// [HttpPost, Log("任务处理接口")] public SRes HandleTask([FromBody] HandleTaskRequest req) { var response = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess, ResDataList = new List() }; switch (req.Type) { //取消任务 case HandleTaskTypeEnum.取消任务: SqlSugarHelper.Do(db => { foreach (var item in req.TaskIds) { var task = db.Default.Queryable().Where(t => t.ID == item).First(); if (task != null) { //验证wms是否能取消 var res = WmsApi.HandleTaskVerify(response, item, 106); if (res == null) continue; switch (task.Type) { //case TaskType.SetPlate: //if (task.Status != Entity.TaskStatus.WaitingToExecute) //{ // response.ResDataList.Add(new HandleTaskResponse() // { // IsSuccess = false, // TaskNo = item, // Message = $"只能取消待执行状态组盘任务", // }); // continue; //} //break; //case TaskType.EnterDepot: //if (task.Status > Entity.TaskStatus.NewBuild) //{ // response.ResDataList.Add(new HandleTaskResponse() // { // IsSuccess = false, // TaskNo = item, // Message = $"只能取消待执行状态入库任务", // }); // continue; //} //break; case TaskType.OutDepot: if (task.Status > Entity.TaskStatus.WaitingToExecute) { response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"只能取消待执行状态出库任务", }); continue; } break; case TaskType.TransferDepot: if (task.Status > Entity.TaskStatus.WaitingToExecute) { response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"无法取消{task.Status.GetDescription()}的移库任务,只能取消新建/待执行的移库任务", }); continue; } break; case TaskType.Delivery: break; case TaskType.EmptyInit: if (task.Status != Entity.TaskStatus.WaitingToExecute) { response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"只能取消待执行状态空轮初始化任务", }); continue; } break; default: throw new ArgumentOutOfRangeException(); } var cancelRes = WmsApi.CarryTaskInfo(response, item, 106); if (cancelRes == null) continue; //找到对应的AGV任务 var agv = db.Default.Queryable().Where(v => v.ID == task.AgvTaskID && v.AgvStatus < AGVTaskStatus.MissionCompleted).SplitTable(v => v.Take(2)).First(); if (agv != null) { if (!agv.AgvID.IsNullOrEmpty()) { var cancelTaskUpdateRes = AgvApi.CancelAgvTask(response, item, agv.AgvID); //if (cancelTaskUpdateRes == null) continue; } agv.Status = AGVTaskStatus.Cancel; agv.AgvStatus = AGVTaskStatus.Cancel; db.Default.Updateable(agv).SplitTable(x=>x.Take(2)).ExecuteCommand(); } //更新任务状态 task.Status = Entity.TaskStatus.Cancel; task.EedTime = DateTime.Now; task.EditWho = req.User; task.ManualRemarks = req.ManualRemarks; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, "未知", "任务取消"); } else { response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"未找到对应任务{item}" }); } } }); break; // 完成任务 case HandleTaskTypeEnum.完成任务: SqlSugarHelper.Do(db => { foreach (var item in req.TaskIds) { var task = db.Default.Queryable().Where(t => t.ID == item).First(); if (task == null) continue; switch (task.Type) { case TaskType.OutDepot: { var res = WmsApi.HandleTaskVerify(response, item, 99); if (res == null) continue; if (task.BusType == "装箱码垛" || task.BusType == "扭转检测") { response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"当前任务不能手工完成", }); continue; } if (task.Status >= Entity.TaskStatus.Finish) { response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"只能完成未完成状态的任务", }); continue; } var cancelRes = WmsApi.CarryTaskInfo(response, item, 99); if (cancelRes == null) continue; //找到对应的AGV任务 var agv = db.Default.Queryable().Where(v => v.ID == task.AgvTaskID && v.AgvStatus < AGVTaskStatus.MissionCompleted).SplitTable(v => v.Take(2)).First(); if (agv != null) { //if (!agv.AgvID.IsNullOrEmpty()) //{ // var cancelTaskUpdateRes = CancelAgvTask(response, item, agv.AgvID); // if (cancelTaskUpdateRes == null) continue; //} agv.Status = AGVTaskStatus.MissionCompleted; agv.AgvStatus = AGVTaskStatus.MissionCompleted; db.Default.Updateable(agv).SplitTable(x=>x.Take(2)).ExecuteCommand(); } //更新任务状态 task.Status = Entity.TaskStatus.Finish; task.EedTime = DateTime.Now; task.EditWho = req.User; task.ManualRemarks = req.ManualRemarks; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, "未知", "任务完成"); break; } case TaskType.EnterDepot: { var res = WmsApi.HandleTaskVerify(response, item, 99); if (res == null) continue; switch (task.Type) { case TaskType.EnterDepot: if (task.Status >= Entity.TaskStatus.Finish) { response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"只能完成未完成状态的任务", }); continue; } if (task.AddrTo.Length < 6) { response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"只能完成已分配货位的任务", }); continue; } break; case TaskType.SetPlate: case TaskType.OutDepot: case TaskType.TransferDepot: case TaskType.Delivery: case TaskType.EmptyInit: break; default: throw new ArgumentOutOfRangeException(); } var cancelRes = WmsApi.CarryTaskInfo(response, item, 99); if (cancelRes == null) continue; //找到对应的AGV任务 var agv = db.Default.Queryable().Where(v => v.ID == task.AgvTaskID && v.AgvStatus < AGVTaskStatus.MissionCompleted).SplitTable(v => v.Take(2)).First(); if (agv != null) { //if (!agv.AgvID.IsNullOrEmpty()) //{ // var cancelTaskUpdateRes = CancelAgvTask(response, item, agv.AgvID); // if (cancelTaskUpdateRes == null) continue; //} agv.Status = AGVTaskStatus.MissionCompleted; agv.AgvStatus = AGVTaskStatus.MissionCompleted; db.Default.Updateable(agv).SplitTable(x=>x.Take(2)).ExecuteCommand(); } //更新任务状态 task.Status = Entity.TaskStatus.Finish; task.EedTime = DateTime.Now; task.EditWho = req.User; task.ManualRemarks = req.ManualRemarks; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, "未知", "任务完成"); break; } case TaskType.SetPlate: case TaskType.TransferDepot: case TaskType.Delivery: case TaskType.EmptyInit: default: response.ResDataList.Add(new HandleTaskResponse() { IsSuccess = false, TaskNo = item, Message = $"未找到对应任务{item}" }); break; } } }); break; default: throw new ArgumentOutOfRangeException(); } return response; } } }