using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Memory; using NPOI.HPSF; using NPOI.SS.Formula.Functions; using Shentun.Pacs.Enums; using Shentun.Pacs.Models; using Shentun.Pacs.MyUser; using Shentun.Pacs.SysParmValues; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Caching; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; namespace Shentun.Pacs { public class CacheService : ISingletonDependency { private readonly IDistributedCache _userCache; private readonly IMemoryCache _customerOrgCache; //private readonly IDistributedCache _customerOrgCache; private readonly IDistributedCache _customerOrgTopNameCache; private readonly IDistributedCache _nationCache; private readonly IDistributedCache _sexCache; private readonly IDistributedCache _maritalStatusCache; private readonly IDistributedCache _forSexCache; private readonly IDistributedCache _deviceTypeCache; private readonly IDistributedCache _medicalTypeCache; private readonly IDistributedCache _personnelTypeCache; private readonly IMemoryCache _asbitemCache; private readonly IMemoryCache _itemTypeCache; //private readonly IDistributedCache _itemTypeCache; private readonly IRepository _userRepository; private readonly IRepository _nationRepository; private readonly IRepository _sexRepository; private readonly IRepository _forSexRepository; private readonly IRepository _deviceTypeRepository; private readonly IRepository _asbitemRepository; private readonly IRepository _itemTypeRepository; private readonly IRepository _customerOrgRepository; private readonly IRepository _maritalStatusRepository; private readonly IRepository _medicalTypeRepository; private readonly IRepository _personnelTypeRepository; private readonly IDistributedCache _sampleTypeCache; private readonly IRepository _sampleTypeRepository; private readonly SysParmValueManager _sysParmValueManager; private readonly IDistributedCache _diagnosisLevelCache; private readonly IRepository _diagnosisLevelRepository; private readonly IDistributedCache _customerOrgDisplayModeCache; private readonly IMemoryCache _userExtensionCache; public CacheService( IDistributedCache userCache, IMemoryCache customerOrgCache, IDistributedCache nationCache, IRepository userRepository, IDistributedCache sexCache, IMemoryCache asbitemCache, IMemoryCache itemTypeCache, IDistributedCache maritalStatusCache, IDistributedCache medicalTypeCache, IDistributedCache personnelTypeCache, IRepository sexRepository, IDistributedCache deviceTypeCache, IRepository deviceTypeRepository, IDistributedCache forSexCache, IRepository forSexRepository, IRepository asbitemRepository, IRepository itemTypeRepository, IRepository nationRepository, IRepository customerOrgRepository, IRepository maritalStatusRepository, IRepository medicalTypeRepository, IRepository personnelTypeRepository, IDistributedCache customerOrgTopNameCache, IDistributedCache sampleTypeCache, IRepository sampleTypeRepository, SysParmValueManager sysParmValueManager, IDistributedCache customerOrgDisplayModeCache, IDistributedCache diagnosisLevelCache, IRepository diagnosisLevelRepository, IMemoryCache userExtensionCache) { _userCache = userCache; _userRepository = userRepository; _sexCache = sexCache; _sexRepository = sexRepository; _forSexCache = forSexCache; _forSexRepository = forSexRepository; _deviceTypeCache = deviceTypeCache; _deviceTypeRepository = deviceTypeRepository; _asbitemCache = asbitemCache; _asbitemRepository = asbitemRepository; _itemTypeCache = itemTypeCache; _itemTypeRepository = itemTypeRepository; _nationCache = nationCache; _nationRepository = nationRepository; _customerOrgCache = customerOrgCache; _customerOrgRepository = customerOrgRepository; _maritalStatusCache = maritalStatusCache; _maritalStatusRepository = maritalStatusRepository; _medicalTypeCache = medicalTypeCache; _medicalTypeRepository = medicalTypeRepository; _personnelTypeCache = personnelTypeCache; _personnelTypeRepository = personnelTypeRepository; _customerOrgTopNameCache = customerOrgTopNameCache; _sampleTypeCache = sampleTypeCache; _sampleTypeRepository = sampleTypeRepository; _sysParmValueManager = sysParmValueManager; _customerOrgDisplayModeCache = customerOrgDisplayModeCache; _diagnosisLevelCache = diagnosisLevelCache; _diagnosisLevelRepository = diagnosisLevelRepository; _userExtensionCache = userExtensionCache; } private async Task GetUserAsync(Guid id) { var entity = await _userCache.GetOrAddAsync( id, //缓存键 async () => { var dataEntity = await _userRepository.FirstOrDefaultAsync(m => m.Id == id); //var userSign = dataEntity.GetProperty("user_sign"); //var userPhoto = dataEntity.GetProperty("user_photo"); //var entDto = new IdentityUserWithExtensionDto //{ // ConcurrencyStamp = dataEntity.ConcurrencyStamp, // CreationTime = dataEntity.CreationTime, // CreatorId = dataEntity.CreatorId, // DeleterId = dataEntity.DeleterId, // DeletionTime = dataEntity.DeletionTime, // Email = dataEntity.Email, // EmailConfirmed = dataEntity.EmailConfirmed, // Id = dataEntity.Id, // IsActive = dataEntity.IsActive, // IsDeleted = dataEntity.IsDeleted, // LastModificationTime = dataEntity.LastModificationTime, // LastModifierId = dataEntity.LastModifierId, // LockoutEnabled = dataEntity.LockoutEnabled, // LockoutEnd = dataEntity.LockoutEnd, // Name = dataEntity.Name, // PhoneNumber = dataEntity.PhoneNumber, // PhoneNumberConfirmed = dataEntity.PhoneNumberConfirmed, // Surname = dataEntity.Surname, // TenantId = dataEntity.TenantId, // UserName = dataEntity.UserName, // UserPhoto = userPhoto, // UserSign = userSign //}; return dataEntity; } ); return entity; } public async Task GetSurnameAsync(Guid? id) { if (id == null || id == default(Guid) || !id.HasValue) { return ""; } var entity = await GetUserAsync((Guid)id); if (entity != null) return entity.Surname; else return ""; } public async Task GetSurnameAsync(string id) { Guid newId; if (string.IsNullOrWhiteSpace(id) || !Guid.TryParse(id, out newId)) { return ""; } var entity = await GetUserAsync(newId); if (entity != null) return entity.Surname; else return ""; } public async Task GetUserSignAsync(Guid? id) { if (id == null || id == default(Guid) || !id.HasValue) { return ""; } string cacheKey = $"userExtension_{id.ToString()}"; var userExtension = (IdentityUserWithExtensionDto)_userExtensionCache.Get(cacheKey); if (userExtension == null) { var userEntity = await _userRepository.GetAsync(o => o.Id == id); var userSign = userEntity.GetProperty("user_sign"); var userPhoto = userEntity.GetProperty("user_photo"); userExtension = new IdentityUserWithExtensionDto { ConcurrencyStamp = userEntity.ConcurrencyStamp, CreationTime = userEntity.CreationTime, CreatorId = userEntity.CreatorId, DeleterId = userEntity.DeleterId, DeletionTime = userEntity.DeletionTime, Email = userEntity.Email, EmailConfirmed = userEntity.EmailConfirmed, Id = userEntity.Id, IsActive = userEntity.IsActive, IsDeleted = userEntity.IsDeleted, LastModificationTime = userEntity.LastModificationTime, LastModifierId = userEntity.LastModifierId, LockoutEnabled = userEntity.LockoutEnabled, LockoutEnd = userEntity.LockoutEnd, Name = userEntity.Name, PhoneNumber = userEntity.PhoneNumber, PhoneNumberConfirmed = userEntity.PhoneNumberConfirmed, Surname = userEntity.Surname, TenantId = userEntity.TenantId, UserName = userEntity.UserName, UserPhoto = userPhoto, UserSign = userSign }; _userExtensionCache.Set(cacheKey, userExtension); } if (userExtension == null) { return ""; } else { return userExtension.UserSign; } } private async Task GetSexAsync(char id) { var entity = await _sexCache.GetOrAddAsync( id, //缓存键 async () => (await _sexRepository.GetQueryableAsync()).Where(o => o.Id == id).Single() ); return entity; } public async Task GetSexNameAsync(char id) { var entity = await GetSexAsync(id); return entity.DisplayName; } private async Task GetForSexAsync(char id) { var entity = await _forSexCache.GetOrAddAsync( id, //缓存键 async () => (await _forSexRepository.GetQueryableAsync()).Where(o => o.Id == id).Single() ); return entity; } public async Task GetForSexNameAsync(char id) { var entity = await GetForSexAsync(id); return entity.DisplayName; } private async Task GetMaritalStatusAsync(char id) { var maritalStatusEntity = await _maritalStatusCache.GetAsync(id); if (maritalStatusEntity == null) { maritalStatusEntity = await _maritalStatusRepository.FirstOrDefaultAsync(f => f.Id == id); } return maritalStatusEntity; //var entity = await _maritalStatusCache.GetOrAddAsync( // id, //缓存键 // async () => (await _maritalStatusRepository.GetQueryableAsync()).Where(o => o.Id == id).Single() //); //return entity; } public async Task GetMaritalStatusNameAsync(char id) { var entity = await GetMaritalStatusAsync(id); return entity.DisplayName; } private async Task GetDeviceTypeAsync(Guid id) { var entity = await _deviceTypeCache.GetOrAddAsync( id, //缓存键 async () => await _deviceTypeRepository.GetAsync(id) ); return entity; } public async Task GetDeviceTypeNameAsync(Guid? id) { if (id == null || id == default(Guid) || !id.HasValue) { return ""; } var entity = await GetDeviceTypeAsync((Guid)id); return entity.DisplayName; } private async Task GetMedicalTypeAsync(Guid id) { var entity = await _medicalTypeCache.GetOrAddAsync( id, //缓存键 async () => await _medicalTypeRepository.GetAsync(id) ); return entity; } public async Task GetMedicalTypeNameAsync(Guid? id) { if (id == null || id == default(Guid) || !id.HasValue) { return ""; } var entity = await GetMedicalTypeAsync((Guid)id); return entity.DisplayName; } private async Task GetPersonnelTypeAsync(Guid id) { var entity = await _personnelTypeCache.GetOrAddAsync( id, //缓存键 async () => await _personnelTypeRepository.GetAsync(id) ); return entity; } public async Task GetPersonnelTypeNameAsync(Guid? id) { if (id == null || id == default(Guid) || !id.HasValue) { return ""; } var entity = await GetPersonnelTypeAsync((Guid)id); return entity.DisplayName; } public async Task GetAsbitemAsync(Guid id) { var entity = (Asbitem)_asbitemCache.Get(id); if (entity == null) { entity = await _asbitemRepository.GetAsync(o => o.Id == id); _asbitemCache.Set(id, entity); //entity = (CustomerOrg)_customerOrgCache.Get(id); } return entity; //var entity = await _asbitemCache.GetOrAddAsync( // id, //缓存键 // async () => await _asbitemRepository.GetAsync(id) //); //return entity; } public async Task GetItemTypeAsync(Guid id) { var entity = (ItemType)_itemTypeCache.Get(id); if (entity == null) { entity = await _itemTypeRepository.GetAsync(o => o.Id == id); _itemTypeCache.Set(id, entity); //entity = (CustomerOrg)_customerOrgCache.Get(id); } //var entity = await _itemTypeCache.GetOrAddAsync( // id, //缓存键 // async () => (ItemType) _itemTypeRepository.Get(id) //); return entity; } public async Task GetNationAsync(string id) { var entity = await _nationCache.GetOrAddAsync( id, //缓存键 async () => await _nationRepository.GetAsync(o => o.Id == id) ); return entity; } public async Task GetNationNameAsync(string id) { if (string.IsNullOrWhiteSpace(id)) { return ""; } var entity = await GetNationAsync(id); return entity.DisplayName; } /// /// 获取部门名称 /// /// /// public async Task GetCustomerOrgAsync(Guid id) { var entity = (CustomerOrg)_customerOrgCache.Get(id); if (entity == null) { entity = await _customerOrgRepository.GetAsync(o => o.Id == id); _customerOrgCache.Set(id, entity); //entity = (CustomerOrg)_customerOrgCache.Get(id); } return entity; } /// /// 获取部门名称 /// /// /// public async Task GetCustomerOrgNameAsync(Guid? id) { if (id == null || id == default(Guid) || !id.HasValue) { return ""; } var entity = await GetCustomerOrgAsync((Guid)id); return entity.DisplayName; } /// /// 获取一级单位 /// /// /// 单位显示模式 0-显示一级单位 1-显示上一级单位 /// public async Task GetTopCustomerOrgAsync(Guid id) { #region 获取单位显示模式 存缓存 string customerOrgDisplayMode = _customerOrgDisplayModeCache.Get("customer_org_display_mode"); if (string.IsNullOrWhiteSpace(customerOrgDisplayMode)) { customerOrgDisplayMode = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "customer_org_display_mode"); if (string.IsNullOrWhiteSpace(customerOrgDisplayMode)) { customerOrgDisplayMode = "0"; } _customerOrgDisplayModeCache.Set("customer_org_display_mode", customerOrgDisplayMode); } #endregion var entity = (CustomerOrg)_customerOrgCache.Get(id); if (entity == null) { entity = await _customerOrgRepository.GetAsync(o => o.Id == id); _customerOrgCache.Set(id, entity); } if (entity.ParentId != null && entity.ParentId != Guid.Empty) { Guid parentId = (Guid)entity.ParentId; if (customerOrgDisplayMode == "0") { entity = await GetTopCustomerOrgAsync(parentId); } else { entity = (CustomerOrg)_customerOrgCache.Get(parentId); if (entity == null) { entity = await _customerOrgRepository.GetAsync(o => o.Id == parentId); _customerOrgCache.Set(parentId, entity); } } } return entity; } /// /// 获取单位简称 一级单位 简称如果没有显示全称 /// /// /// public async Task GetTopCustomerOrgShortNameAsync(Guid CustomerOrgId) { var customerOrgEnt = await GetTopCustomerOrgAsync(CustomerOrgId); if (string.IsNullOrWhiteSpace(customerOrgEnt.ShortName)) return customerOrgEnt.DisplayName; else return customerOrgEnt.ShortName; } /// /// 获取部门简称 简称如果没有显示全称 /// /// /// public async Task GetCustomerOrgShortNameAsync(Guid CustomerOrgId) { var customerOrgEnt = await GetCustomerOrgAsync(CustomerOrgId); if (string.IsNullOrWhiteSpace(customerOrgEnt.ShortName)) return customerOrgEnt.DisplayName; else return customerOrgEnt.ShortName; } /// /// 获取所有部门名称 /// /// /// public async Task GetAllDepartmentNameAsync(Guid CustomerOrgId) { var departmentDisplayMode = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "department_display_mode"); if (departmentDisplayMode == "1") { List customerOrgNames = new List(); await GetAllDepartmentNameAsync(customerOrgNames, CustomerOrgId); if (customerOrgNames.Count > 1) { customerOrgNames.RemoveAt(0); return string.Join("\\", customerOrgNames); } else { //无部门 return ""; } } else { //兼容不设置系统参数的 return await GetCustomerOrgNameAsync(CustomerOrgId); } } /// /// 遍历获取单位数据 /// /// /// /// public async Task GetAllDepartmentNameAsync(List customerOrgNames, Guid? customerOrgId) { if (customerOrgId != null) { var customerOrgEnt = await GetCustomerOrgAsync(customerOrgId.Value); if (customerOrgEnt != null) { if (string.IsNullOrWhiteSpace(customerOrgEnt.ShortName)) customerOrgNames.AddFirst(customerOrgEnt.DisplayName); else customerOrgNames.AddFirst(customerOrgEnt.ShortName); await GetAllDepartmentNameAsync(customerOrgNames, customerOrgEnt.ParentId); } } } /// /// 缓存取单位名称 /// /// 部门ID /// public async Task GetTopCustomerOrgNameAsync(Guid CustomerOrgId) { string topCustomerOrgName = await _customerOrgTopNameCache.GetOrAddAsync( CustomerOrgId, //缓存键 async () => await GetTopCustomerOrgNameInCustomerOrgIdAsync(CustomerOrgId) ); return topCustomerOrgName; } /// /// 根据部门ID 按PathCode码查询单位名称 /// /// /// private async Task GetTopCustomerOrgNameInCustomerOrgIdAsync(Guid id) { #region 获取单位显示模式 存缓存 string customerOrgDisplayMode = _customerOrgDisplayModeCache.Get("customer_org_display_mode"); if (string.IsNullOrWhiteSpace(customerOrgDisplayMode)) { customerOrgDisplayMode = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "customer_org_display_mode"); if (string.IsNullOrWhiteSpace(customerOrgDisplayMode)) { customerOrgDisplayMode = "0"; } _customerOrgDisplayModeCache.Set("customer_org_display_mode", customerOrgDisplayMode); } #endregion var entity = (CustomerOrg)_customerOrgCache.Get(id); if (entity == null) { entity = await _customerOrgRepository.GetAsync(o => o.Id == id); _customerOrgCache.Set(id, entity); } if (entity.Id == GuidFlag.PersonCustomerOrgId) { return entity.DisplayName; } if (entity.PathCode.Length == 5) { return entity.DisplayName; } if (customerOrgDisplayMode == "0") { entity = await _customerOrgRepository.GetAsync(o => o.PathCode == entity.PathCode.Substring(0, 5)); } else { entity = await _customerOrgRepository.GetAsync(o => o.Id == entity.ParentId); } return entity.DisplayName; } /// /// 获取顶级单位ID 直取,不按配置来,用登记界面做单位比较 /// /// /// public async Task GetTopCustomerOrgIdAsync(Guid id) { Guid topCustomerOrgId = id; var entity = (CustomerOrg)_customerOrgCache.Get(id); if (entity == null) { entity = await _customerOrgRepository.GetAsync(o => o.Id == id); _customerOrgCache.Set(id, entity); } if (entity.PathCode.Length > 5) { entity = await _customerOrgRepository.GetAsync(o => o.PathCode == entity.PathCode.Substring(0, 5)); topCustomerOrgId = entity.Id; } return topCustomerOrgId; } private async Task GetSampleTypeAsync(Guid id) { var entity = await _sampleTypeCache.GetOrAddAsync( id, //缓存键 async () => await _sampleTypeRepository.GetAsync(id) ); return entity; } public async Task GetSampleTypeNameAsync(Guid? id) { if (id == null || id == default(Guid) || !id.HasValue) { return ""; } var entity = await GetSampleTypeAsync((Guid)id); return entity.DisplayName; } /// /// 获取诊断级别名称 /// /// /// public async Task GetDiagnosisLevelNameAsync(short? id) { if (id != null) { var diagnosisLevelEntity = await _diagnosisLevelCache.GetAsync(id.Value); if (diagnosisLevelEntity == null) { diagnosisLevelEntity = await _diagnosisLevelRepository.FirstOrDefaultAsync(f => f.Id == id); } return diagnosisLevelEntity.DisplayName; } else { return ""; } } } }