You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

362 lines
12 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.Extensions.Caching.Distributed;
  3. using Shentun.Peis.Enums;
  4. using Shentun.Peis.Models;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using Volo.Abp.Caching;
  11. using Volo.Abp.DependencyInjection;
  12. using Volo.Abp.Domain.Entities;
  13. using Volo.Abp.Domain.Repositories;
  14. using Volo.Abp.Identity;
  15. namespace Shentun.Peis
  16. {
  17. public class CacheService : ISingletonDependency
  18. {
  19. private readonly IDistributedCache<IdentityUser, Guid> _userCache;
  20. private readonly IDistributedCache<CustomerOrg, Guid> _customerOrgCache;
  21. private readonly IDistributedCache<string, Guid> _customerOrgTopNameCache;
  22. private readonly IDistributedCache<Nation, string> _nationCache;
  23. private readonly IDistributedCache<Sex, char> _sexCache;
  24. private readonly IDistributedCache<MaritalStatus, char> _maritalStatusCache;
  25. private readonly IDistributedCache<ForSex, char> _forSexCache;
  26. private readonly IDistributedCache<DeviceType, Guid> _deviceTypeCache;
  27. private readonly IDistributedCache<MedicalType, Guid> _medicalTypeCache;
  28. private readonly IDistributedCache<PersonnelType, Guid> _personnelTypeCache;
  29. private readonly IDistributedCache<Asbitem, Guid> _asbitemCache;
  30. private readonly IDistributedCache<ItemType, Guid> _itemTypeCache;
  31. private readonly IRepository<IdentityUser, Guid> _userRepository;
  32. private readonly IRepository<Nation> _nationRepository;
  33. private readonly IRepository<Sex> _sexRepository;
  34. private readonly IRepository<ForSex> _forSexRepository;
  35. private readonly IRepository<DeviceType, Guid> _deviceTypeRepository;
  36. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  37. private readonly IRepository<ItemType, Guid> _itemTypeRepository;
  38. private readonly IRepository<CustomerOrg, Guid> _customerOrgRepository;
  39. private readonly IRepository<MaritalStatus> _maritalStatusRepository;
  40. private readonly IRepository<MedicalType, Guid> _medicalTypeRepository;
  41. private readonly IRepository<PersonnelType, Guid> _personnelTypeRepository;
  42. public CacheService(
  43. IDistributedCache<IdentityUser, Guid> userCache,
  44. IDistributedCache<CustomerOrg, Guid> customerOrgCache,
  45. IDistributedCache<Nation, string> nationCache,
  46. IRepository<IdentityUser, Guid> userRepository,
  47. IDistributedCache<Sex, char> sexCache,
  48. IDistributedCache<Asbitem, Guid> asbitemCache,
  49. IDistributedCache<ItemType, Guid> itemTypeCache,
  50. IDistributedCache<MaritalStatus, char> maritalStatusCache,
  51. IDistributedCache<MedicalType, Guid> medicalTypeCache,
  52. IDistributedCache<PersonnelType, Guid> personnelTypeCache,
  53. IRepository<Sex> sexRepository,
  54. IDistributedCache<DeviceType, Guid> deviceTypeCache,
  55. IRepository<DeviceType, Guid> deviceTypeRepository,
  56. IDistributedCache<ForSex, char> forSexCache,
  57. IRepository<ForSex> forSexRepository,
  58. IRepository<Asbitem, Guid> asbitemRepository,
  59. IRepository<ItemType, Guid> itemTypeRepository,
  60. IRepository<Nation> nationRepository,
  61. IRepository<CustomerOrg, Guid> customerOrgRepository,
  62. IRepository<MaritalStatus> maritalStatusRepository,
  63. IRepository<MedicalType, Guid> medicalTypeRepository,
  64. IRepository<PersonnelType, Guid> personnelTypeRepository
  65. ,
  66. IDistributedCache<string, Guid> customerOrgTopNameCache)
  67. {
  68. _userCache = userCache;
  69. _userRepository = userRepository;
  70. _sexCache = sexCache;
  71. _sexRepository = sexRepository;
  72. _forSexCache = forSexCache;
  73. _forSexRepository = forSexRepository;
  74. _deviceTypeCache = deviceTypeCache;
  75. _deviceTypeRepository = deviceTypeRepository;
  76. _asbitemCache = asbitemCache;
  77. _asbitemRepository = asbitemRepository;
  78. _itemTypeCache = itemTypeCache;
  79. _itemTypeRepository = itemTypeRepository;
  80. _nationCache = nationCache;
  81. _nationRepository = nationRepository;
  82. _customerOrgCache = customerOrgCache;
  83. _customerOrgRepository = customerOrgRepository;
  84. _maritalStatusCache = maritalStatusCache;
  85. _maritalStatusRepository = maritalStatusRepository;
  86. _medicalTypeCache = medicalTypeCache;
  87. _medicalTypeRepository = medicalTypeRepository;
  88. _personnelTypeCache = personnelTypeCache;
  89. _personnelTypeRepository = personnelTypeRepository;
  90. _customerOrgTopNameCache = customerOrgTopNameCache;
  91. }
  92. private async Task<IdentityUser> GetUserAsync(Guid id)
  93. {
  94. var entity = await _userCache.GetOrAddAsync(
  95. id, //缓存键
  96. async () => await _userRepository.FirstOrDefaultAsync(m => m.Id == id)
  97. );
  98. return entity;
  99. }
  100. public async Task<string> GetSurnameAsync(Guid? id)
  101. {
  102. if (id == null || id == default(Guid) || !id.HasValue)
  103. {
  104. return "";
  105. }
  106. var entity = await GetUserAsync((Guid)id);
  107. if (entity != null)
  108. return entity.Surname;
  109. else
  110. return "";
  111. }
  112. private async Task<Sex> GetSexAsync(char id)
  113. {
  114. var entity = await _sexCache.GetOrAddAsync(
  115. id, //缓存键
  116. async () => (await _sexRepository.GetQueryableAsync()).Where(o => o.Id == id).Single()
  117. );
  118. return entity;
  119. }
  120. public async Task<string> GetSexNameAsync(char id)
  121. {
  122. var entity = await GetSexAsync(id);
  123. return entity.DisplayName;
  124. }
  125. private async Task<ForSex> GetForSexAsync(char id)
  126. {
  127. var entity = await _forSexCache.GetOrAddAsync(
  128. id, //缓存键
  129. async () => (await _forSexRepository.GetQueryableAsync()).Where(o => o.Id == id).Single()
  130. );
  131. return entity;
  132. }
  133. public async Task<string> GetForSexNameAsync(char id)
  134. {
  135. var entity = await GetForSexAsync(id);
  136. return entity.DisplayName;
  137. }
  138. private async Task<MaritalStatus> GetMaritalStatusAsync(char id)
  139. {
  140. var entity = await _maritalStatusCache.GetOrAddAsync(
  141. id, //缓存键
  142. async () => (await _maritalStatusRepository.GetQueryableAsync()).Where(o => o.Id == id).Single()
  143. );
  144. return entity;
  145. }
  146. public async Task<string> GetMaritalStatusNameAsync(char id)
  147. {
  148. var entity = await GetMaritalStatusAsync(id);
  149. return entity.DisplayName;
  150. }
  151. private async Task<DeviceType> GetDeviceTypeAsync(Guid id)
  152. {
  153. var entity = await _deviceTypeCache.GetOrAddAsync(
  154. id, //缓存键
  155. async () => await _deviceTypeRepository.GetAsync(id)
  156. );
  157. return entity;
  158. }
  159. public async Task<string> GetDeviceTypeNameAsync(Guid? id)
  160. {
  161. if (id == null || id == default(Guid) || !id.HasValue)
  162. {
  163. return "";
  164. }
  165. var entity = await GetDeviceTypeAsync((Guid)id);
  166. return entity.DisplayName;
  167. }
  168. private async Task<MedicalType> GetMedicalTypeAsync(Guid id)
  169. {
  170. var entity = await _medicalTypeCache.GetOrAddAsync(
  171. id, //缓存键
  172. async () => await _medicalTypeRepository.GetAsync(id)
  173. );
  174. return entity;
  175. }
  176. public async Task<string> GetMedicalTypeNameAsync(Guid? id)
  177. {
  178. if (id == null || id == default(Guid) || !id.HasValue)
  179. {
  180. return "";
  181. }
  182. var entity = await GetMedicalTypeAsync((Guid)id);
  183. return entity.DisplayName;
  184. }
  185. private async Task<PersonnelType> GetPersonnelTypeAsync(Guid id)
  186. {
  187. var entity = await _personnelTypeCache.GetOrAddAsync(
  188. id, //缓存键
  189. async () => await _personnelTypeRepository.GetAsync(id)
  190. );
  191. return entity;
  192. }
  193. public async Task<string> GetPersonnelTypeNameAsync(Guid? id)
  194. {
  195. if (id == null || id == default(Guid) || !id.HasValue)
  196. {
  197. return "";
  198. }
  199. var entity = await GetPersonnelTypeAsync((Guid)id);
  200. return entity.DisplayName;
  201. }
  202. public async Task<Asbitem> GetAsbitemAsync(Guid id)
  203. {
  204. var entity = await _asbitemCache.GetOrAddAsync(
  205. id, //缓存键
  206. async () => await _asbitemRepository.GetAsync(id)
  207. );
  208. return entity;
  209. }
  210. public async Task<ItemType> GetItemTypeAsync(Guid id)
  211. {
  212. var entity = await _itemTypeCache.GetOrAddAsync(
  213. id, //缓存键
  214. async () => await _itemTypeRepository.GetAsync(id)
  215. );
  216. return entity;
  217. }
  218. public async Task<Nation> GetNationAsync(string id)
  219. {
  220. var entity = await _nationCache.GetOrAddAsync(
  221. id, //缓存键
  222. async () => await _nationRepository.GetAsync(o => o.Id == id)
  223. );
  224. return entity;
  225. }
  226. public async Task<string> GetNationNameAsync(string id)
  227. {
  228. if (string.IsNullOrWhiteSpace(id))
  229. {
  230. return "";
  231. }
  232. var entity = await GetNationAsync(id);
  233. return entity.DisplayName;
  234. }
  235. public async Task<CustomerOrg> GetCustomerOrgAsync(Guid id)
  236. {
  237. var entity = await _customerOrgCache.GetAsync(id);
  238. if (entity == null)
  239. {
  240. entity = await _customerOrgRepository.GetAsync(o => o.Id == id);
  241. _customerOrgCache.Set(id, entity);
  242. }
  243. return entity;
  244. }
  245. public async Task<string> GetCustomerOrgNameAsync(Guid? id)
  246. {
  247. if (id == null || id == default(Guid) || !id.HasValue)
  248. {
  249. return "";
  250. }
  251. var entity = await GetCustomerOrgAsync((Guid)id);
  252. return entity.DisplayName;
  253. }
  254. public async Task<CustomerOrg> GetTopCustomerOrgAsync(Guid id)
  255. {
  256. var entity = await _customerOrgCache.GetAsync(id);
  257. if(entity == null)
  258. {
  259. entity = await _customerOrgRepository.GetAsync(o => o.Id == id);
  260. _customerOrgCache.Set(id, entity);
  261. }
  262. if (entity.ParentId != null && entity.ParentId != Guid.Empty)
  263. {
  264. entity = await GetTopCustomerOrgAsync((Guid)entity.ParentId);
  265. }
  266. return entity;
  267. }
  268. /// <summary>
  269. /// 缓存取单位名称
  270. /// </summary>
  271. /// <param name="CustomerOrgId">部门ID</param>
  272. /// <returns></returns>
  273. public async Task<string> GetTopCustomerOrgNameAsync(Guid CustomerOrgId)
  274. {
  275. string topCustomerOrgName = await _customerOrgTopNameCache.GetOrAddAsync(
  276. CustomerOrgId, //缓存键
  277. async () => await GetTopCustomerOrgNameInCustomerOrgIdAsync(CustomerOrgId)
  278. );
  279. return topCustomerOrgName;
  280. }
  281. /// <summary>
  282. /// 根据部门ID 按PathCode码查询单位名称
  283. /// </summary>
  284. /// <param name="id"></param>
  285. /// <returns></returns>
  286. private async Task<string> GetTopCustomerOrgNameInCustomerOrgIdAsync(Guid id)
  287. {
  288. var entity = await _customerOrgCache.GetAsync(id);
  289. if (entity == null)
  290. {
  291. entity = await _customerOrgRepository.GetAsync(o => o.Id == id);
  292. _customerOrgCache.Set(id, entity);
  293. }
  294. if (entity.Id == GuidFlag.PersonCustomerOrgId)
  295. {
  296. return entity.DisplayName;
  297. }
  298. if (entity.PathCode.Length == 5)
  299. {
  300. return entity.DisplayName;
  301. }
  302. entity = await _customerOrgRepository.GetAsync(o => o.PathCode == entity.PathCode.Substring(0, 5));
  303. return entity.DisplayName;
  304. }
  305. }
  306. }