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_Core.Enums; using WIDESEAWCS_Core.Caches; using WIDESEAWCS_QuartzJob.DeviceEnum; using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; using WIDESEAWCS_Common; namespace WIDESEAWCS_WCSServer.Controllers.System { [Route("api/Sys_Dictionary")] [ApiController] public class Sys_DictionaryController : ApiBaseController { 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 vueDictionaryDTOs = Service.GetVueDictionary(dicNos); try { List cacheDicNos = new List(); foreach (string n in dicNos) { if(vueDictionaryDTOs.Where(x => x.DicNo == n).Count() > 0) { continue; } string str = _cacheService.Get(n); if (!string.IsNullOrEmpty(str)) { VueDictionaryDTO? vueDictionary = JsonConvert.DeserializeObject(str); if (vueDictionary != null) { vueDictionaryDTOs.Add(vueDictionary); cacheDicNos.Add(n); } } } List dicList = dicNos.ToList(); if (dicNos.Where(x => !cacheDicNos.Contains(x)).Count() > 0) { string str = AppSettings.Configuration["dics"]; if (!string.IsNullOrEmpty(str)) { List cusDics = new List(); List dics = str.Split(",").ToList(); foreach (var item in dics) { dicList.Remove(item); cusDics.Add(item); } foreach (var item in cusDics) { if (vueDictionaryDTOs.Where(x => x.DicNo == item).Count() > 0) { continue; } VueDictionaryDTO vueDictionaryDTO = GetVueDictionary(item.Trim()); if (vueDictionaryDTO != null) { vueDictionaryDTOs.Add(vueDictionaryDTO); if (!_cacheService.Exists(item) && vueDictionaryDTO.SaveCache) { _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("", Assembly.GetAssembly(type).GetName()); Assembly assembly = Assembly.GetAssembly(type); List types = assembly.GetTypes().Where(x => type.IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface).ToList(); List data = new List(); foreach (var deviceType in types) { DescriptionAttribute? description = deviceType.GetCustomAttribute(); 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() { 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 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 data = new List(); Type type = typeof(DeviceStatusEnum); List enums = Enum.GetValues(type).Cast().ToList(); int index = 0; foreach (var item in enums) { FieldInfo? fieldInfo = type.GetField(((DeviceStatusEnum)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); 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 "devicePlcType": { Type type = typeof(BaseCommunicator); var basePath = AppContext.BaseDirectory; string path = Path.Combine(basePath, $"WIDESEAWCS_Communicator.dll"); Assembly assembly = Assembly.LoadFrom(path); List types = assembly.GetTypes().Where(x => type.IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface).ToList(); List data = new List(); foreach (var deviceType in types) { DescriptionAttribute? description = deviceType.GetCustomAttribute(); 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 "taskState": { Type type = typeof(TaskStatusEnum); List enums = Enum.GetValues(typeof(TaskStatusEnum)).Cast().ToList(); int index = 0; List data = new List(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskStatusEnum).GetField(((TaskStatusEnum)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); 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; } } } }