using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Quartz; using System.ComponentModel; using System.Reflection; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.MaterielEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Core.BaseController; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Caches; using WIDESEA_Core.Helper; using WIDESEA_DTO.System; using WIDESEA_ISystemService; using WIDESEA_Model.Models; namespace WIDESEA_WMSServer.Controllers { /// /// 字典 /// [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 selectDicNos = vueDictionaryDTOs.Select(x => x.DicNo).ToList(); List cacheDicNos = new List(); foreach (string n in dicNos.Where(x => !selectDicNos.Contains(x))) { 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(); List 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 cusDics = new List(); List 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 "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 "taskState": { List data = new List(); #region TaskInStatusEnum { Type type = typeof(TaskInStatusEnum); List enums = Enum.GetValues(typeof(TaskInStatusEnum)).Cast().ToList(); int index = 0; foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskInStatusEnum).GetField(((TaskInStatusEnum)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++; } } #endregion #region TaskOutStatusEnum { Type type = typeof(TaskOutStatusEnum); List enums = Enum.GetValues(typeof(TaskOutStatusEnum)).Cast().ToList(); int index = 0; foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskOutStatusEnum).GetField(((TaskOutStatusEnum)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++; } } #endregion #region TaskRelocationStatusEnum { Type type = typeof(TaskRelocationStatusEnum); List enums = Enum.GetValues(typeof(TaskRelocationStatusEnum)).Cast().ToList(); int index = 0; foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskRelocationStatusEnum).GetField(((TaskRelocationStatusEnum)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++; } } #endregion result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskInStatus": { List data = new List(); List enums = Enum.GetValues(typeof(TaskInStatusEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskInStatusEnum).GetField(((TaskInStatusEnum)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskOutStatus": { List data = new List(); List enums = Enum.GetValues(typeof(TaskOutStatusEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskOutStatusEnum).GetField(((TaskOutStatusEnum)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskRelocationStatus": { List data = new List(); List enums = Enum.GetValues(typeof(TaskRelocationStatusEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskRelocationStatusEnum).GetField(((TaskRelocationStatusEnum)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskInboundType": { List data = new List(); List enums = Enum.GetValues(typeof(TaskInboundTypeEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskInboundTypeEnum).GetField(((TaskInboundTypeEnum)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskOutboundType": { List data = new List(); List enums = Enum.GetValues(typeof(TaskOutboundTypeEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskOutboundTypeEnum).GetField(((TaskOutboundTypeEnum)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskRelocationType": { List data = new List(); List enums = Enum.GetValues(typeof(TaskRelocationTypeEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskRelocationTypeEnum).GetField(((TaskRelocationTypeEnum)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskTypeGroup": { List data = new List(); List enums = Enum.GetValues(typeof(TaskTypeGroup)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(TaskTypeGroup).GetField(((TaskTypeGroup)item).ToString()); DescriptionAttribute? description = fieldInfo.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : ((TaskTypeGroup)item).ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskTypeEnum": { // 合并入库/出库/移库任务类型 List data = new List(); foreach (var item in Enum.GetValues(typeof(TaskInboundTypeEnum)).Cast()) { var field = typeof(TaskInboundTypeEnum).GetField(((TaskInboundTypeEnum)item).ToString()); var desc = field?.GetCustomAttribute()?.Description ?? item.ToString(); data.Add(new { key = item.ToString(), value = desc }); } foreach (var item in Enum.GetValues(typeof(TaskOutboundTypeEnum)).Cast()) { var field = typeof(TaskOutboundTypeEnum).GetField(((TaskOutboundTypeEnum)item).ToString()); var desc = field?.GetCustomAttribute()?.Description ?? item.ToString(); data.Add(new { key = item.ToString(), value = desc }); } foreach (var item in Enum.GetValues(typeof(TaskRelocationTypeEnum)).Cast()) { var field = typeof(TaskRelocationTypeEnum).GetField(((TaskRelocationTypeEnum)item).ToString()); var desc = field?.GetCustomAttribute()?.Description ?? item.ToString(); data.Add(new { key = item.ToString(), value = desc }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "taskStatusEnum": { // 合并入库/出库/移库任务状态 List data = new List(); foreach (var item in Enum.GetValues(typeof(TaskInStatusEnum)).Cast()) { var field = typeof(TaskInStatusEnum).GetField(((TaskInStatusEnum)item).ToString()); var desc = field?.GetCustomAttribute()?.Description ?? item.ToString(); data.Add(new { key = item.ToString(), value = desc }); } foreach (var item in Enum.GetValues(typeof(TaskOutStatusEnum)).Cast()) { var field = typeof(TaskOutStatusEnum).GetField(((TaskOutStatusEnum)item).ToString()); var desc = field?.GetCustomAttribute()?.Description ?? item.ToString(); data.Add(new { key = item.ToString(), value = desc }); } foreach (var item in Enum.GetValues(typeof(TaskRelocationStatusEnum)).Cast()) { var field = typeof(TaskRelocationStatusEnum).GetField(((TaskRelocationStatusEnum)item).ToString()); var desc = field?.GetCustomAttribute()?.Description ?? item.ToString(); data.Add(new { key = item.ToString(), value = desc }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "stockChangeTypeEnum": { List data = new List(); List enums = Enum.GetValues(typeof(StockChangeTypeEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(StockChangeTypeEnum).GetField(((StockChangeTypeEnum)item).ToString()); DescriptionAttribute? description = fieldInfo?.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "stockStatusEmun": { List data = new List(); List enums = Enum.GetValues(typeof(StockStatusEmun)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(StockStatusEmun).GetField(((StockStatusEmun)item).ToString()); DescriptionAttribute? description = fieldInfo?.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "yesno": { // 使用真实的是否枚举 List data = new List(); List enums = Enum.GetValues(typeof(WhetherEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(WhetherEnum).GetField(((WhetherEnum)item).ToString()); DescriptionAttribute? description = fieldInfo?.GetCustomAttribute(); string displayName = description?.Description ?? ((WhetherEnum)item).ToString(); // 根据枚举值提供中文名称 switch ((WhetherEnum)item) { case WhetherEnum.True: displayName = "是"; break; case WhetherEnum.False: displayName = "否"; break; } data.Add(new { key = item.ToString(), value = displayName }); } // 为兼容性,同时支持 true/false 字符串 data.Add(new { key = "true", value = "是" }); data.Add(new { key = "false", value = "否" }); result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "InventoryMaterialType": { // 使用真实的物料类型枚举 List data = new List(); List enums = Enum.GetValues(typeof(MaterielTypeEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(MaterielTypeEnum).GetField(((MaterielTypeEnum)item).ToString()); DescriptionAttribute? description = fieldInfo?.GetCustomAttribute(); string displayName = description?.Description ?? ((MaterielTypeEnum)item).ToString(); // 根据枚举值提供中文名称 switch ((MaterielTypeEnum)item) { case MaterielTypeEnum.FinishProduct: displayName = "成品"; break; case MaterielTypeEnum.HalfProduct: displayName = "半成品"; break; case MaterielTypeEnum.RawMateriel: displayName = "原材料"; break; case MaterielTypeEnum.SpareParts: displayName = "备件"; break; } data.Add(new { key = item.ToString(), value = displayName }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "MaterielSourceType": { // 物料来源类型枚举 List data = new List(); List enums = Enum.GetValues(typeof(MaterielSourceTypeEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(MaterielSourceTypeEnum).GetField(((MaterielSourceTypeEnum)item).ToString()); DescriptionAttribute? description = fieldInfo?.GetCustomAttribute(); string displayName = description?.Description ?? ((MaterielSourceTypeEnum)item).ToString(); // 根据枚举值提供中文名称 switch ((MaterielSourceTypeEnum)item) { case MaterielSourceTypeEnum.PurchasePart: displayName = "采购件"; break; case MaterielSourceTypeEnum.SelfMadePart: displayName = "自制件"; break; case MaterielSourceTypeEnum.PurchaseAndSelf: displayName = "采购&自制件"; break; } data.Add(new { key = item.ToString(), value = displayName }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "InventoryMaterialStatus": { // 物料状态字典 - 根据业务需求定义 List data = new List { new { key = "1", value = "正常" }, new { key = "2", value = "待检" }, new { key = "3", value = "合格" }, new { key = "4", value = "不合格" }, new { key = "5", value = "冻结" }, new { key = "6", value = "报废" }, new { key = "7", value = "过期" }, new { key = "8", value = "损坏" } }; result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "locationStatusEnum": { // 货位状态枚举 List data = new List(); List enums = Enum.GetValues(typeof(LocationStatusEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(LocationStatusEnum).GetField(((LocationStatusEnum)item).ToString()); DescriptionAttribute? description = fieldInfo?.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "locationTypeEnum": { // 货位类型枚举 List data = new List(); List enums = Enum.GetValues(typeof(LocationTypeEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(LocationTypeEnum).GetField(((LocationTypeEnum)item).ToString()); DescriptionAttribute? description = fieldInfo?.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; case "enableStatusEnum": { // 货位禁用状态枚举 List data = new List(); List enums = Enum.GetValues(typeof(EnableStatusEnum)).Cast().ToList(); foreach (var item in enums) { FieldInfo? fieldInfo = typeof(EnableStatusEnum).GetField(((EnableStatusEnum)item).ToString()); DescriptionAttribute? description = fieldInfo?.GetCustomAttribute(); data.Add(new { key = item.ToString(), value = description != null ? description.Description : item.ToString() }); } result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data }; } break; } return result; } catch (Exception ex) { return null; } } } }