using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; using System.Collections; using System.Collections.Generic; using System.Dynamic; using System.Reflection; using System.Threading.Tasks; using WIDESEAWCS_Common.StackerCraneEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Caches; using WIDESEAWCS_Core.Utilities; using WIDESEAWCS_DTO.System; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.Repository; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_Server.Controllers.System; using WIDESEAWCS_Tasks.ConveyorLineJob; using WIDESEAWCS_Tasks.ShuttleCarJob; using WIDESEAWCS_Tasks.StackerCraneJob; using static WIDESEAWCS_Server.Controllers.LargeScreenController; namespace WIDESEAWCS_Server.Controllers { [Route("api/LargeScreen")] [ApiController, AllowAnonymous] public class LargeScreenController : Controller { private readonly IDeviceInfoRepository _deviceInfoRepository; private readonly IRouterService _routerService; private readonly ICacheService _cacheService; private readonly ITaskRepository _taskRepository; private readonly ITaskService _taskService; public LargeScreenController(ICacheService cacheService, IRouterService routerService, IDeviceInfoRepository deviceInfoRepository, ITaskRepository taskRepository, ITaskService taskService) { _deviceInfoRepository = deviceInfoRepository; _routerService = routerService; _cacheService = cacheService; _taskRepository = taskRepository; _taskService = taskService; } [HttpPost, Route("GetTaskInfos")] public WebResponseContent GetTaskInfos([FromBody] SaveModel model) { WebResponseContent webResponseContent = new WebResponseContent(); List taskInfos = new List(); List dictionaryDTOs = new List(); try { var name = model.MainData["Name"].ToString(); List dt_Tasks = new List(); if (name == "入库") { dt_Tasks = _taskRepository.QueryData(x => !_taskService.TaskOutboundTypes.Contains(x.TaskType) && !_taskService.TaskRelocationTypes.Contains(x.TaskType)); dt_Tasks = dt_Tasks.OrderByDescending(x => x.TaskType).Take(10).ToList(); } else { dt_Tasks = _taskRepository.QueryData(x => !_taskService.TaskInboundTypes.Contains(x.TaskType)); dt_Tasks = dt_Tasks.OrderByDescending(x => x.TaskType).Take(10).ToList(); } if (dt_Tasks.Count > 0) { List taskTypeDTOs = GetDictionary(Sys_DictionaryController.GetVueDictionary("taskType").Data); List taskStateDTOs = GetDictionary(Sys_DictionaryController.GetVueDictionary("taskState").Data); foreach (var dt_Task in dt_Tasks) { TaskInfo taskInfo = new TaskInfo() { PalletCode = dt_Task.PalletCode, ShuttleCarCode = dt_Task.ShuttleCarCode, TaskState = taskStateDTOs.Where(x => x.name == dt_Task.TaskType.ToString()).First().remark, TaskType = taskTypeDTOs.Where(x => x.name == dt_Task.TaskType.ToString()).First().remark, SourceAddress = dt_Task.SourceAddress, TargetAddress = dt_Task.TargetAddress, TaskNum = dt_Task.TaskNum, }; taskInfos.Add(taskInfo); } } webResponseContent.OK(data: taskInfos); } catch (Exception ex) { webResponseContent.Error(ex.Message); } return webResponseContent; } /// /// 获取穿梭车电量 /// /// [HttpPost, Route("GetShuttleCarInfos")] public WebResponseContent GetShuttleCarInfos() { WebResponseContent webResponseContent = new WebResponseContent(); int ElectricQuantity1 = 0; int ElectricQuantity2 = 0; try { var Device = _cacheService.Get(typeof(ShuttleCarTaskCommandR), "RGV01"); if (Device != null) { ShuttleCarTaskCommandR? shuttleCar = Device as ShuttleCarTaskCommandR; if (shuttleCar != null) ElectricQuantity1 = shuttleCar.ElectricQuantity; } Device = _cacheService.Get(typeof(ShuttleCarTaskCommandR), "RGV02"); if (Device != null) { ShuttleCarTaskCommandR? shuttleCar = Device as ShuttleCarTaskCommandR; if (shuttleCar != null) ElectricQuantity2 = shuttleCar.ElectricQuantity; } } catch (Exception ex) { webResponseContent.Error(ex.Message); } return webResponseContent.OK(data: new { ElectricQuantity1, ElectricQuantity2 }); } /// /// 获取设备信息 /// /// [HttpPost, Route("GetDeviceInfos")] public WebResponseContent GetDeviceInfos() { WebResponseContent webResponseContent = new WebResponseContent(); try { List devices = new List(); var DeviceInfos = _deviceInfoRepository.QueryData(x => x.DeviceStatus == "1").ToList(); foreach (var item in DeviceInfos) { switch (item.DeviceType) { case "SpeStackerCrane"://堆垛机 { var Device = _cacheService.Get(typeof(StackerCraneTaskCommandR), item.DeviceCode) as StackerCraneTaskCommandR; if (Device != null) { DeviceInfo deviceInfo = new DeviceInfo() { DeviceName = item.DeviceName, DeviceCode = item.DeviceCode, DeviceStatus = Device.Onlinestate == 1 ? "在线" : "离线", DeviceMachine = GetRunStatus(Device.RunStatus), Err_Status = GetErr_Status(Device.Err_Status), TaskID = Device.CurrentTaskNum }; devices.Add(deviceInfo); } } break; case "CommonConveyorLine"://输送线 { List childDeviceCodes = _routerService.QueryAllPositions(item.DeviceCode); List strings = new List() { "1003", "1006", "1007" }; childDeviceCodes.AddRange(strings); foreach (var childDeviceCode in childDeviceCodes.OrderBy(x => x)) { var Device = _cacheService.Get(typeof(ConveyorLineTaskCommandR), childDeviceCode) as ConveyorLineTaskCommandR; if (Device != null) { DeviceInfo deviceInfo = new DeviceInfo() { DeviceName = item.DeviceName, DeviceCode = childDeviceCode, DeviceStatus = Device.inRead == 1 ? "可写" : "不可写", DeviceMachine = GetMachine(Device.Status), TaskID = Device.TaskNum, Err_Status = GetSpec(Device.Spec) }; devices.Add(deviceInfo); } } } break; case "ShuttleCar"://穿梭车 { var Device = _cacheService.Get(typeof(ShuttleCarTaskCommandR), item.DeviceCode) as ShuttleCarTaskCommandR; if (Device != null) { DeviceInfo deviceInfo = new DeviceInfo() { DeviceName = item.DeviceName, DeviceCode = item.DeviceCode, DeviceStatus = Device.JoinStatus == 1 ? "在线" : "离线", DeviceMachine = GetStatus(Device.Status), Err_Status = GetErrStatus(Device.Err_Status), TaskID = Device.number }; devices.Add(deviceInfo); } } break; default: break; } } webResponseContent.OK(data: devices); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } return webResponseContent; } List GetDictionary(object data) { List dictionaryDTOs = new List(); List a = data as List; foreach (var task in a) { dynamic dictionaryDTO = task; DictionaryDTO dictionary = new DictionaryDTO { name = dictionaryDTO.key, remark = dictionaryDTO.value, }; dictionaryDTOs.Add(dictionary); } return dictionaryDTOs; } public class DictionaryDTO { public string name { get; set; } public string remark { get; set; } } public class TaskInfo { /// /// 任务号 /// public int TaskNum { get; set; } /// /// 托盘号 /// public string PalletCode { get; set; } /// /// 穿梭车 /// public string ShuttleCarCode { get; set; } /// /// 任务类型 /// public string TaskType { get; set; } /// /// 任务状态 /// public string TaskState { get; set; } /// /// 起始地址 /// public string SourceAddress { get; set; } /// /// 目的地址 /// public string TargetAddress { get; set; } } public class DeviceInfo { /// /// 设备名 /// public string DeviceName { get; set; } /// /// 设备编号 /// public string DeviceCode { get; set; } /// /// 设备状态 /// public string DeviceStatus { get; set; } /// /// 设备信息 /// public string DeviceMachine { get; set; } /// /// 故障 /// public string Err_Status { get; set; } public int TaskID { get; set; } } /// /// 获取堆垛机运行状态 /// /// /// string GetRunStatus(ushort status) { string RunStatus = string.Empty; switch (status) { case 1: RunStatus = "初始化中"; break; case 2: RunStatus = "故障暂停"; break; case 3: RunStatus = "手动模式"; break; case 4: RunStatus = "单步模式"; break; case 5: RunStatus = "维护模式"; break; case 6: RunStatus = "取货检查"; break; case 7: RunStatus = "取货站点判断"; break; case 8: RunStatus = "无货运行"; break; case 9: RunStatus = "请求取货"; break; case 10: RunStatus = "取货探货"; break; case 11: RunStatus = "取货伸叉"; break; case 12: RunStatus = "取货抬高"; break; case 13: RunStatus = "取货回叉"; break; case 14: RunStatus = "取货完成"; break; case 15: RunStatus = "放货检查"; break; case 16: RunStatus = "放货站点判断"; break; case 17: RunStatus = "有货运行"; break; case 18: RunStatus = "请求放货"; break; case 19: RunStatus = "放货探货"; break; case 20: RunStatus = "放货伸叉"; break; case 21: RunStatus = "放货降低"; break; case 22: RunStatus = "放货回叉"; break; case 23: RunStatus = "放货完成"; break; case 24: RunStatus = "无货待命"; break; case 25: RunStatus = "有货待命"; break; case 26: RunStatus = "半自动模式"; break; } return RunStatus; } /// /// 获取堆垛机故障代码 /// /// /// string GetErr_Status(ushort status) { string RunStatus = string.Empty; switch (status) { case 1: RunStatus = "货叉不在中"; break; case 2: RunStatus = "取货货架无货"; break; case 3: RunStatus = "放货货架有货"; break; case 4: RunStatus = "任务非法"; break; case 5: RunStatus = "行走反向"; break; case 6: RunStatus = "行走变频器报警"; break; case 7: RunStatus = "行走堵转"; break; case 8: RunStatus = "行走失速"; break; case 9: RunStatus = "提升反向"; break; case 10: RunStatus = "提升变频器报警"; break; case 11: RunStatus = "提升堵转"; break; case 12: RunStatus = "提升失速"; break; case 13: RunStatus = "货叉1反向"; break; case 14: RunStatus = "货叉1变频器报警"; break; case 15: RunStatus = "货叉1堵转"; break; case 16: RunStatus = "货叉1失速"; break; case 17: RunStatus = "货叉2反向"; break; case 18: RunStatus = "货叉2变频器报警"; break; case 19: RunStatus = "货叉2堵转"; break; case 20: RunStatus = "货叉2失速"; break; case 21: RunStatus = "急停故障"; break; case 22: RunStatus = "前极限"; break; case 23: RunStatus = "后极限"; break; case 24: RunStatus = "行走极限"; break; case 25: RunStatus = "上极限"; break; case 26: RunStatus = "下极限"; break; case 27: RunStatus = "升降极限"; break; case 28: RunStatus = "货叉前极限"; break; case 29: RunStatus = "货叉后极限"; break; case 30: RunStatus = "货叉后极限"; break; case 31: RunStatus = "右超叉"; break; case 32: RunStatus = "前超叉"; break; case 33: RunStatus = "后超叉"; break; case 34: RunStatus = "超高"; break; case 35: RunStatus = "认址故障"; break; case 36: RunStatus = "放货无货"; break; case 37: RunStatus = "取货完成无货"; break; case 38: RunStatus = "取货货叉有货"; break; case 39: RunStatus = "放货完成有货"; break; case 40: RunStatus = "提升编码"; break; case 41: RunStatus = "行走"; break; case 42: RunStatus = "货叉"; break; case 43: RunStatus = "断绳故障"; break; case 44: RunStatus = "A叉不在中"; break; case 45: RunStatus = "B叉不在中"; break; case 46: RunStatus = "取货前排有货"; break; case 47: RunStatus = "放货前排有货"; break; case 48: RunStatus = "不在列站点"; break; case 49: RunStatus = "不在层站点"; break; case 50: RunStatus = "通讯故障"; break; case 51: RunStatus = "卸货货叉回叉有货故障"; break; case 52: RunStatus = "载货台超重过载"; break; case 53: RunStatus = "高度不符"; break; case 54: RunStatus = "层给定位置超限故障"; break; case 55: RunStatus = "列给定位置超限故障"; break; case 56: RunStatus = "叉给定位置超限故障"; break; case 57: RunStatus = "触摸屏通讯故障"; break; } return RunStatus; } string GetMachine(ushort machine) { string RunStatus = string.Empty; switch (machine) { case 0: RunStatus = "关闭"; break; case 2: RunStatus = "有货"; break; case 3: RunStatus = "等待指令"; break; case 4: RunStatus = "空闲"; break; case 12: RunStatus = "自检错误"; break; case 13: RunStatus = "无变有"; break; case 14: RunStatus = "提前到来"; break; case 15: RunStatus = "接收超时"; break; case 16: RunStatus = "接收暂停"; break; case 17: RunStatus = "有变无"; break; case 19: RunStatus = "放行超时"; break; case 20: RunStatus = "放行暂停"; break; } return RunStatus; } string GetSpec(ushort spec) { string RunStatus = string.Empty; switch (spec) { case 1: RunStatus = "左超"; break; case 2: RunStatus = "右超"; break; case 3: RunStatus = "前超"; break; case 4: RunStatus = "后超"; break; case 5: RunStatus = "超高"; break; case 6: RunStatus = "超重"; break; } return RunStatus; } string GetStatus(short status) { string Status = string.Empty; switch (status) { case 0: Status = "待机中"; break; case 1: Status = "入库中"; break; case 2: Status = "出库中"; break; case 3: Status = "移库中"; break; case 4: Status = "盘点中"; break; case 9: Status = "手动中"; break; case 10: Status = "充电中"; break; case 13: Status = "A侧回零中"; break; case 14: Status = "B侧回零中"; break; case 15: Status = "A侧后退中"; break; case 16: Status = "B侧后退中"; break; } return Status; } string GetErrStatus(short status) { string Status = string.Empty; switch (status) { case 0: Status = "正常"; break; case 1: Status = "前防撞保护"; break; case 2: Status = "后防撞保护"; break; case 3: Status = "顶升超时"; break; case 4: Status = "行走超时"; break; case 5: Status = "前减速激光故障"; break; case 6: Status = "后减速激光故障"; break; case 7: Status = "前向上减速激光故障"; break; case 8: Status = "后向上减速激光故障"; break; case 9: Status = "接近开关故障"; break; case 10: Status = "行走堵转报警"; break; case 11: Status = "A侧急停报警"; break; case 12: Status = "B侧急停报警"; break; case 13: Status = "行走电机故障"; break; case 14: Status = "顶升电机故障"; break; case 15: Status = "电量不足"; break; } return Status; } } }