| using Autofac.Core; | 
| using Microsoft.AspNetCore.Authorization; | 
| using Microsoft.AspNetCore.Http; | 
| using Microsoft.AspNetCore.Mvc; | 
| using Microsoft.Extensions.DependencyModel; | 
| using Newtonsoft.Json; | 
| using System.Reflection; | 
| using WIDESEAWCS_Core.BaseController; | 
| using WIDESEAWCS_Core.Helper; | 
| using WIDESEAWCS_ISystemServices; | 
| using WIDESEAWCS_Model.Models; | 
| using System.IO; | 
| using WIDESEAWCS_QuartzJob.DeviceBase; | 
| using WIDESEAWCS_DTO.System; | 
| using System.ComponentModel; | 
| using System.Collections.Generic; | 
| using WIDESEAWCS_Communicator; | 
| using Quartz; | 
| using WIDESEAWCS_QuartzJob; | 
| using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; | 
| using WIDESEAWCS_Common.TaskEnum; | 
| using WIDESEAWCS_Core.Caches; | 
| using WIDESEAWCS_QuartzJob.DeviceEnum; | 
| using WIDESEAWCS_Core.Enums; | 
|   | 
| namespace WIDESEAWCS_WCSServer.Controllers.System | 
| { | 
|     [Route("api/Sys_Dictionary")] | 
|     [ApiController] | 
|     public class Sys_DictionaryController : ApiBaseController<ISys_DictionaryService, Sys_Dictionary> | 
|     { | 
|         private readonly IHttpContextAccessor _httpContextAccessor; | 
|         private readonly ICacheService _cacheService; | 
|   | 
|         public Sys_DictionaryController(ISys_DictionaryService service, IHttpContextAccessor httpContextAccessor, ICacheService cacheService) : base(service) | 
|         { | 
|             _httpContextAccessor = httpContextAccessor; | 
|             _cacheService = cacheService; | 
|         } | 
|   | 
|         [HttpPost, Route("GetVueDictionary"), AllowAnonymous] | 
|         public IActionResult GetVueDictionary([FromBody] string[] dicNos) | 
|         { | 
|             List<VueDictionaryDTO> vueDictionaryDTOs = Service.GetVueDictionary(dicNos); | 
|             try | 
|             { | 
|                 List<string> selectDicNos = vueDictionaryDTOs.Select(x => x.DicNo).ToList(); | 
|                 List<string> cacheDicNos = new List<string>(); | 
|                 foreach (string n in dicNos.Where(x => !selectDicNos.Contains(x))) | 
|                 { | 
|                     string? str = _cacheService.Get(n); | 
|                     if (!string.IsNullOrEmpty(str)) | 
|                     { | 
|                         VueDictionaryDTO? vueDictionary = JsonConvert.DeserializeObject<VueDictionaryDTO>(str); | 
|   | 
|                         if (vueDictionary != null) | 
|                         { | 
|                             vueDictionaryDTOs.Add(vueDictionary); | 
|                             cacheDicNos.Add(n); | 
|                         } | 
|                     } | 
|                 } | 
|                 List<string> dicList = dicNos.ToList(); | 
|                 List<string> otherDicNos = dicNos.Where(x => !cacheDicNos.Contains(x) && !selectDicNos.Contains(x)).ToList(); | 
|                 if (otherDicNos.Count() > 0) | 
|                 { | 
|                     string str = AppSettings.Configuration["dics"]; | 
|                     if (!string.IsNullOrEmpty(str)) | 
|                     { | 
|                         List<string> cusDics = new List<string>(); | 
|   | 
|                         List<string> dics = str.Split(",").ToList(); | 
|   | 
|                         foreach (var item in otherDicNos) | 
|                         { | 
|                             if (dics.Contains(item)) | 
|                             { | 
|                                 cusDics.Add(item); | 
|                             } | 
|                         } | 
|   | 
|                         foreach (var item in cusDics) | 
|                         { | 
|                             VueDictionaryDTO? vueDictionaryDTO = GetVueDictionary(item.Trim()); | 
|                             if (vueDictionaryDTO != null) | 
|                             { | 
|                                 vueDictionaryDTOs.Add(vueDictionaryDTO); | 
|                                 if (!_cacheService.Exists(item)) | 
|                                 { | 
|                                     _cacheService.Add(item, vueDictionaryDTO.Serialize()); | 
|                                 } | 
|                             } | 
|                         } | 
|                     } | 
|                 } | 
|             } | 
|             catch | 
|             { | 
|   | 
|             } | 
|             return Json(vueDictionaryDTOs); | 
|         } | 
|   | 
|         private VueDictionaryDTO? GetVueDictionary(string key) | 
|         { | 
|             VueDictionaryDTO? result = null; | 
|             try | 
|             { | 
|                 switch (key) | 
|                 { | 
|                     case "deviceType": | 
|                         { | 
|                             Type type = typeof(IDevice); | 
|                             var basePath = AppContext.BaseDirectory; | 
|                             List<Type> types = type.Assembly.GetTypes().Where(x => type.IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface).ToList(); | 
|                             List<object> data = new List<object>(); | 
|                             foreach (var deviceType in types) | 
|                             { | 
|                                 DescriptionAttribute? description = deviceType.GetCustomAttribute<DescriptionAttribute>(); | 
|                                 if (description != null) | 
|                                 { | 
|                                     data.Add(new { key = deviceType.Name, value = description.Description }); | 
|                                 } | 
|                                 else | 
|                                 { | 
|                                     data.Add(new { key = deviceType.Name, value = deviceType.Name }); | 
|                                 } | 
|                             } | 
|   | 
|                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; | 
|                         } | 
|                         break; | 
|                     case "jobAssembly": | 
|                         { | 
|                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = new List<object>() { new { key = "WIDESEAWCS_Tasks", value = "WIDESEAWCS_Tasks" } } }; | 
|   | 
|                         } | 
|                         break; | 
|                     case "jobClassName": | 
|                         { | 
|                             Type type = typeof(IJob); | 
|                             var basePath = AppContext.BaseDirectory; | 
|                             string path = Path.Combine(basePath, $"WIDESEAWCS_Tasks"); | 
|                             Assembly assembly = Assembly.LoadFrom(path); | 
|                             List<Type> types = assembly.GetTypes().Where(x => type.IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface).ToList(); | 
|   | 
|                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = types.Select(x => new { key = x.Name, value = x.Name }) }; | 
|                         } | 
|                         break; | 
|                     case "deviceStatus": | 
|                         { | 
|                             List<object> data = new List<object>(); | 
|                             Type type = typeof(DeviceStatusEnum); | 
|                             List<int> enums = Enum.GetValues(type).Cast<int>().ToList(); | 
|                             int index = 0; | 
|                             foreach (var item in enums) | 
|                             { | 
|                                 FieldInfo? fieldInfo = type.GetField(((DeviceStatusEnum)item).ToString()); | 
|                                 DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>(); | 
|                                 if (description != null) | 
|                                 { | 
|                                     data.Add(new { key = item.ToString(), value = description.Description }); | 
|                                 } | 
|                                 else | 
|                                 { | 
|                                     data.Add(new { key = item.ToString(), value = item.ToString() }); | 
|                                 } | 
|                                 index++; | 
|                             } | 
|   | 
|                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; | 
|                         } | 
|                         break; | 
|                     case "taskType": | 
|                         { | 
|                             List<object> data = new List<object>(); | 
|   | 
|                             #region TaskTypeEnum | 
|                             { | 
|                                 Type type = typeof(TaskTypeEnum); | 
|                                 List<int> enums = Enum.GetValues(typeof(TaskTypeEnum)).Cast<int>().ToList(); | 
|                                 int index = 0; | 
|                                 foreach (var item in enums) | 
|                                 { | 
|                                     FieldInfo? fieldInfo = typeof(TaskTypeEnum).GetField(((TaskTypeEnum)item).ToString()); | 
|                                     DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>(); | 
|                                     if (description != null) | 
|                                     { | 
|                                         data.Add(new { key = item.ToString(), value = description.Description }); | 
|                                     } | 
|                                     else | 
|                                     { | 
|                                         data.Add(new { key = item.ToString(), value = item.ToString() }); | 
|                                     } | 
|                                     index++; | 
|                                 } | 
|                             } | 
|                             #endregion | 
|   | 
|                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; | 
|                         } | 
|                         break; | 
|                     case "taskState": | 
|                         { | 
|                             List<object> data = new List<object>(); | 
|   | 
|                             #region TaskInStatusEnum | 
|                             { | 
|                                 Type type = typeof(TaskStatusEnum); | 
|                                 List<int> enums = Enum.GetValues(typeof(TaskStatusEnum)).Cast<int>().ToList(); | 
|                                 int index = 0; | 
|                                 foreach (var item in enums) | 
|                                 { | 
|                                     FieldInfo? fieldInfo = typeof(TaskStatusEnum).GetField(((TaskStatusEnum)item).ToString()); | 
|                                     DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>(); | 
|                                     if (description != null) | 
|                                     { | 
|                                         data.Add(new { key = item.ToString(), value = description.Description }); | 
|                                     } | 
|                                     else | 
|                                     { | 
|                                         data.Add(new { key = item.ToString(), value = item.ToString() }); | 
|                                     } | 
|                                     index++; | 
|                                 } | 
|                             } | 
|                             #endregion | 
|   | 
|                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; | 
|                         } | 
|                         break; | 
|                     case "devicePlcType": | 
|                         { | 
|                             Type type = typeof(BaseCommunicator); | 
|                             var basePath = AppContext.BaseDirectory; | 
|                             string path = Path.Combine(basePath, $"WIDESEAWCS_Communicator.dll"); | 
|                             Assembly assembly = Assembly.LoadFrom(path); | 
|                             List<Type> types = assembly.GetTypes().Where(x => type.IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface).ToList(); | 
|                             List<object> data = new List<object>(); | 
|                             foreach (var deviceType in types) | 
|                             { | 
|                                 DescriptionAttribute? description = deviceType.GetCustomAttribute<DescriptionAttribute>(); | 
|                                 if (description != null) | 
|                                 { | 
|                                     data.Add(new { key = deviceType.Name, value = description.Description }); | 
|                                 } | 
|                                 else | 
|                                 { | 
|                                     data.Add(new { key = deviceType.Name, value = deviceType.Name }); | 
|                                 } | 
|                             } | 
|   | 
|                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; | 
|                         } | 
|                         break; | 
|                     case "inOutType": | 
|                         { | 
|                             List<object> data = new List<object>(); | 
|                             Type type = typeof(RouterInOutType); | 
|                             List<int> enums = Enum.GetValues(typeof(RouterInOutType)).Cast<int>().ToList(); | 
|                             int index = 0; | 
|                             foreach (var item in enums) | 
|                             { | 
|                                 FieldInfo? fieldInfo = typeof(RouterInOutType).GetField(((RouterInOutType)item).ToString()); | 
|                                 DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>(); | 
|                                 if (description != null) | 
|                                 { | 
|                                     data.Add(new { key = item.ToString(), value = description.Description }); | 
|                                 } | 
|                                 else | 
|                                 { | 
|                                     data.Add(new { key = item.ToString(), value = item.ToString() }); | 
|                                 } | 
|                                 index++; | 
|                             } | 
|   | 
|                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; | 
|                         } | 
|                         break; | 
|                 } | 
|                 return result; | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return null; | 
|             } | 
|         } | 
|     } | 
| } |