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.Enums; 
 | 
using WIDESEAWCS_Core.Caches; 
 | 
  
 | 
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> cacheDicNos = new List<string>(); 
 | 
                foreach (string n in dicNos) 
 | 
                { 
 | 
                    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(); 
 | 
                if (dicNos.Where(x => !cacheDicNos.Contains(x)).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 dics) 
 | 
                        { 
 | 
                            dicList.Remove(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; 
 | 
                            string path = Path.Combine(basePath, Assembly.GetExecutingAssembly().GetName().Name); 
 | 
                            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 "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 = Type.GetType("WIDESEAWCS_QuartzJob.DeviceEnum.DeviceStatusEnum"); 
 | 
                            List<int> enums = Enum.GetValues(type).Cast<int>().ToList(); 
 | 
                            int index = 0; 
 | 
                            foreach (var item in enums) 
 | 
                            { 
 | 
                                FieldInfo? fieldInfo = type.GetField((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 TaskInboundTypeEnum 
 | 
                            { 
 | 
                                Type type = typeof(TaskInboundTypeEnum); 
 | 
                                List<int> enums = Enum.GetValues(typeof(TaskInboundTypeEnum)).Cast<int>().ToList(); 
 | 
                                int index = 0; 
 | 
                                foreach (var item in enums) 
 | 
                                { 
 | 
                                    FieldInfo? fieldInfo = typeof(TaskInboundTypeEnum).GetField(((TaskInboundTypeEnum)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 
 | 
  
 | 
                            #region TaskOutboundTypeEnum 
 | 
                            { 
 | 
                                Type type = typeof(TaskOutboundTypeEnum); 
 | 
                                List<int> enums = Enum.GetValues(typeof(TaskOutboundTypeEnum)).Cast<int>().ToList(); 
 | 
                                int index = 0; 
 | 
                                foreach (var item in enums) 
 | 
                                { 
 | 
                                    FieldInfo? fieldInfo = typeof(TaskOutboundTypeEnum).GetField(((TaskOutboundTypeEnum)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 
 | 
  
 | 
                            #region TaskRelocationTypeEnum 
 | 
                            { 
 | 
                                Type type = typeof(TaskRelocationTypeEnum); 
 | 
                                List<int> enums = Enum.GetValues(typeof(TaskRelocationTypeEnum)).Cast<int>().ToList(); 
 | 
                                int index = 0; 
 | 
                                foreach (var item in enums) 
 | 
                                { 
 | 
                                    FieldInfo? fieldInfo = typeof(TaskRelocationTypeEnum).GetField(((TaskRelocationTypeEnum)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 
 | 
  
 | 
                            #region TaskOtherTypeEnum 
 | 
                            { 
 | 
                                Type type = typeof(TaskOtherTypeEnum); 
 | 
                                List<int> enums = Enum.GetValues(typeof(TaskOtherTypeEnum)).Cast<int>().ToList(); 
 | 
                                int index = 0; 
 | 
                                foreach (var item in enums) 
 | 
                                { 
 | 
                                    FieldInfo? fieldInfo = typeof(TaskOtherTypeEnum).GetField(((TaskOtherTypeEnum)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(TaskInStatusEnum); 
 | 
                                List<int> enums = Enum.GetValues(typeof(TaskInStatusEnum)).Cast<int>().ToList(); 
 | 
                                int index = 0; 
 | 
                                foreach (var item in enums) 
 | 
                                { 
 | 
                                    FieldInfo? fieldInfo = typeof(TaskInStatusEnum).GetField(((TaskInStatusEnum)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 
 | 
  
 | 
                            #region TaskOutStatusEnum 
 | 
                            { 
 | 
                                Type type = typeof(TaskOutStatusEnum); 
 | 
                                List<int> enums = Enum.GetValues(typeof(TaskOutStatusEnum)).Cast<int>().ToList(); 
 | 
                                int index = 0; 
 | 
                                foreach (var item in enums) 
 | 
                                { 
 | 
                                    FieldInfo? fieldInfo = typeof(TaskOutStatusEnum).GetField(((TaskOutStatusEnum)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; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |