using Newtonsoft.Json; 
 | 
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.ComponentModel; 
 | 
using System.Linq; 
 | 
using System.Reflection; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEAWCS_Common.TaskEnum; 
 | 
using WIDESEAWCS_Core.BaseRepository; 
 | 
using WIDESEAWCS_Core.BaseServices; 
 | 
using WIDESEAWCS_Core.Caches; 
 | 
using WIDESEAWCS_Core.DB; 
 | 
using WIDESEAWCS_Core.Enums; 
 | 
using WIDESEAWCS_Core.Helper; 
 | 
using WIDESEAWCS_DTO.System; 
 | 
using WIDESEAWCS_ISystemServices; 
 | 
using WIDESEAWCS_Model.Models; 
 | 
  
 | 
namespace WIDESEAWCS_SystemServices 
 | 
{ 
 | 
    public class Sys_DictionaryService : ServiceBase<Sys_Dictionary, IRepository<Sys_Dictionary>>, ISys_DictionaryService 
 | 
    { 
 | 
        private readonly IUnitOfWorkManage _unitOfWorkManage; 
 | 
        private readonly ICacheService _cacheService; 
 | 
  
 | 
        public Sys_DictionaryService(IRepository<Sys_Dictionary> BaseDal, IUnitOfWorkManage unitOfWorkManage, ICacheService cacheService) : base(BaseDal) 
 | 
        { 
 | 
            _unitOfWorkManage = unitOfWorkManage; 
 | 
            _cacheService = cacheService; 
 | 
        } 
 | 
  
 | 
        public List<VueDictionaryDTO> GetVueDictionary(string[] dicNos) 
 | 
        { 
 | 
            if (dicNos == null || dicNos.Count() == 0) return new List<VueDictionaryDTO>(); 
 | 
            List<VueDictionaryDTO> vueDictionaryDTOs = new List<VueDictionaryDTO>(); 
 | 
  
 | 
            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); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            if (dicNos.Where(x => !cacheDicNos.Contains(x)).Count() > 0) 
 | 
            { 
 | 
                List<string> list = dicNos.Where(x => !cacheDicNos.Contains(x)).ToList(); 
 | 
                List<Sys_Dictionary> dictionaries = GetDictionaries(list).ToList(); 
 | 
  
 | 
                List<VueDictionaryDTO> selectDics = dictionaries.Select(s => new VueDictionaryDTO 
 | 
                { 
 | 
                    DicNo = s.DicNo, 
 | 
                    Config = s.Config, 
 | 
                    //dbSql = s.Sql, 
 | 
                    Data = s.DicList.OrderByDescending(o => o.OrderNo).Select(list => new { key = list.DicValue, value = list.DicName }) 
 | 
                }).ToList(); 
 | 
  
 | 
                foreach (var v in dictionaries) 
 | 
                { 
 | 
                    if (!string.IsNullOrEmpty(v.DBSql)) 
 | 
                    { 
 | 
                        VueDictionaryDTO? temp = selectDics.FirstOrDefault(x => x.DicNo == v.DicNo); 
 | 
                        if (temp != null) 
 | 
                            selectDics.Remove(temp); 
 | 
                        selectDics.Add(new VueDictionaryDTO 
 | 
                        { 
 | 
                            Config = v.Config, 
 | 
                            DicNo = v.DicNo, 
 | 
                            Data = BaseDal.QueryDynamicDataBySql(v.DBSql), 
 | 
                            SaveCache = false, 
 | 
                        }); 
 | 
                    } 
 | 
                } 
 | 
  
 | 
                foreach (var item in selectDics) 
 | 
                { 
 | 
                    if (!_cacheService.Exists(item.DicNo) && item.SaveCache) 
 | 
                    { 
 | 
                        _cacheService.Add(item.DicNo, item.Serialize()); 
 | 
                    } 
 | 
                } 
 | 
                vueDictionaryDTOs.AddRange(selectDics); 
 | 
            } 
 | 
  
 | 
            return vueDictionaryDTOs; 
 | 
        } 
 | 
  
 | 
        public IEnumerable<Sys_Dictionary> GetDictionaries(IEnumerable<string> dicNos, bool executeSql = false) 
 | 
        { 
 | 
            List<Sys_Dictionary> Dictionaries = GetAllDictionary(dicNos); 
 | 
  
 | 
            return Dictionaries; 
 | 
        } 
 | 
  
 | 
        List<Sys_DictionaryList> Query(string sql) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                return BaseDal.QueryDynamicDataBySql(sql, null).Select(s => new Sys_DictionaryList() 
 | 
                { 
 | 
                    DicName = s.Value, 
 | 
                    DicValue = s.Key.ToString() 
 | 
                }).ToList(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                throw ex; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        private List<Sys_Dictionary> GetAllDictionary(IEnumerable<string> dicNos) 
 | 
        { 
 | 
            //base.QueryData().ToList(); 
 | 
            List<Sys_Dictionary> _dictionaries = Db.Queryable<Sys_Dictionary>().Includes(x => x.DicList).Where(x => x.Enable == 1 && dicNos.Contains(x.DicNo)).ToList(); 
 | 
            return _dictionaries; 
 | 
        } 
 | 
    } 
 | 
} 
 |