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.

304 lines
14 KiB

3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
  1. using NPOI.Util;
  2. using Shentun.Peis.Enums;
  3. using Shentun.Peis.HelperDto;
  4. using Shentun.Peis.Models;
  5. using Shentun.Utilities;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Volo.Abp;
  12. using Volo.Abp.Domain.Repositories;
  13. using Volo.Abp.Domain.Services;
  14. namespace Shentun.Peis.Items
  15. {
  16. /// <summary>
  17. /// 项目设置
  18. /// </summary>
  19. public class ItemManager : DomainService
  20. {
  21. private readonly IRepository<Item, Guid> _repository;
  22. private readonly IRepository<AsbitemDetail> _asbtiemDetailRepository;
  23. private readonly IRepository<ItemTemplateDetail> _itemTemplateDetailRepository;
  24. private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
  25. private readonly IRepository<ReferenceRange, Guid> _referenceRangeRepository;
  26. private readonly IRepository<ItemResultTemplate, Guid> _itemResultTemplateRepository;
  27. private readonly IRepository<ItemResultMatch, Guid> _itemResultMatchRepository;
  28. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  29. private readonly IRepository<RegisterCheckAsbitem, Guid> _registerAsbitemRepository;
  30. private readonly IRepository<RegisterCheck> _registerCheckRepository;
  31. public ItemManager(
  32. IRepository<Item, Guid> repository,
  33. IRepository<ItemResultMatch, Guid> itemResultMatchRepository,
  34. IRepository<ItemResultTemplate, Guid> itemResultTemplateRepository,
  35. IRepository<ReferenceRange, Guid> referenceRangeRepository,
  36. IRepository<AsbitemDetail> asbtiemDetailRepository,
  37. IRepository<ItemTemplateDetail> itemTemplateDetailRepository,
  38. IRepository<RegisterCheckItem> registerCheckItemRepository,
  39. IRepository<SexHormoneReferenceRange, Guid> sexHormoneReferenceRangeRepository,
  40. IRepository<PatientRegister, Guid> patientRegisterRepository,
  41. IRepository<RegisterCheckAsbitem, Guid> registerAsbitemRepository,
  42. IRepository<RegisterCheck, Guid> registerCheckRepository)
  43. {
  44. this._repository = repository;
  45. this._asbtiemDetailRepository = asbtiemDetailRepository;
  46. this._itemTemplateDetailRepository = itemTemplateDetailRepository;
  47. this._registerCheckItemRepository = registerCheckItemRepository;
  48. this._registerCheckRepository = registerCheckRepository;
  49. this._referenceRangeRepository = referenceRangeRepository;
  50. this._itemResultTemplateRepository = itemResultTemplateRepository;
  51. this._itemResultMatchRepository = itemResultMatchRepository;
  52. this._patientRegisterRepository = patientRegisterRepository;
  53. this._registerAsbitemRepository = registerAsbitemRepository;
  54. }
  55. /// <summary>
  56. /// 创建
  57. /// </summary>
  58. /// <param name="entity"></param>
  59. /// <returns></returns>
  60. public async Task<Item> CreateAsync(
  61. Item entity
  62. )
  63. {
  64. Verify(entity);
  65. //await EntityHelper.CheckSameName<Item, Guid>(_repository, entity.DisplayName);
  66. var existEntity = await _repository.CountAsync(o => o.DisplayName == entity.DisplayName
  67. && o.ItemTypeId == entity.ItemTypeId);
  68. if (existEntity > 0)
  69. {
  70. throw new UserFriendlyException($"名称:'{entity.DisplayName}'在同一科室下已存在");
  71. }
  72. return new Item
  73. {
  74. DisplayName = entity.DisplayName,
  75. SimpleCode = LanguageConverter.GetPYSimpleCode(entity.DisplayName),
  76. DisplayOrder = await EntityHelper.CreateMaxDisplayOrder<Item>(_repository),
  77. DefaultResult = entity.DefaultResult,
  78. DiagnosisFunction = entity.DiagnosisFunction,
  79. IsActive = entity.IsActive,
  80. IsContinueProcess = entity.IsContinueProcess,
  81. IsDiagnosisFunction = entity.IsDiagnosisFunction,
  82. ItemTypeId = entity.ItemTypeId,
  83. Price = entity.Price,
  84. CalculationFunction = entity.CalculationFunction,
  85. EnglishShortName = entity.EnglishShortName,
  86. InputCheck = entity.InputCheck,
  87. IsCalculationItem = entity.IsCalculationItem,
  88. IsNameIntoSummary = entity.IsNameIntoSummary,
  89. IsProduceSummary = entity.IsProduceSummary,
  90. PriceItemId = entity.PriceItemId,
  91. ReferenceRangeTypeFlag = entity.ReferenceRangeTypeFlag,
  92. ResultTemplateTypeFlag = entity.ResultTemplateTypeFlag,
  93. UnitId = entity.UnitId,
  94. LineModeFlag = entity.LineModeFlag,
  95. DeviceTypeId = entity.DeviceTypeId,
  96. IsCriticalValueFunction = entity.IsCriticalValueFunction,
  97. IsFollowUpFunction = entity.IsFollowUpFunction,
  98. FollowUpFunction = entity.FollowUpFunction,
  99. CriticalValueFunction = entity.CriticalValueFunction
  100. };
  101. }
  102. /// <summary>
  103. /// 更新
  104. /// </summary>
  105. /// <param name="sourceEntity"></param>
  106. /// <param name="targetEntity"></param>
  107. /// <returns></returns>
  108. public async Task UpdateAsync(
  109. Item sourceEntity,
  110. Item targetEntity
  111. )
  112. {
  113. DataHelper.CheckEntityIsNull(targetEntity);
  114. Verify(sourceEntity);
  115. if (sourceEntity.DisplayName != targetEntity.DisplayName)
  116. {
  117. var existEntity = await _repository.CountAsync(o => o.Id != targetEntity.Id && o.DisplayName == sourceEntity.DisplayName
  118. && o.ItemTypeId == sourceEntity.ItemTypeId);
  119. if (existEntity > 0)
  120. {
  121. throw new UserFriendlyException($"名称:'{sourceEntity.DisplayName}'在同一科室下已存在");
  122. }
  123. //await EntityHelper.CheckSameName<Item, Guid>(_repository, sourceEntity.DisplayName, targetEntity);
  124. targetEntity.DisplayName = sourceEntity.DisplayName;
  125. targetEntity.SimpleCode = LanguageConverter.GetPYSimpleCode(targetEntity.DisplayName);
  126. }
  127. targetEntity.DefaultResult = sourceEntity.DefaultResult;
  128. targetEntity.DiagnosisFunction = sourceEntity.DiagnosisFunction;
  129. targetEntity.IsActive = sourceEntity.IsActive;
  130. targetEntity.IsContinueProcess = sourceEntity.IsContinueProcess;
  131. targetEntity.IsDiagnosisFunction = sourceEntity.IsDiagnosisFunction;
  132. targetEntity.ItemTypeId = sourceEntity.ItemTypeId;
  133. targetEntity.Price = sourceEntity.Price;
  134. targetEntity.CalculationFunction = sourceEntity.CalculationFunction;
  135. targetEntity.EnglishShortName = sourceEntity.EnglishShortName;
  136. targetEntity.InputCheck = sourceEntity.InputCheck;
  137. targetEntity.IsCalculationItem = sourceEntity.IsCalculationItem;
  138. targetEntity.IsNameIntoSummary = sourceEntity.IsNameIntoSummary;
  139. targetEntity.IsProduceSummary = sourceEntity.IsProduceSummary;
  140. targetEntity.PriceItemId = sourceEntity.PriceItemId;
  141. targetEntity.ReferenceRangeTypeFlag = sourceEntity.ReferenceRangeTypeFlag;
  142. targetEntity.ResultTemplateTypeFlag = sourceEntity.ResultTemplateTypeFlag;
  143. targetEntity.UnitId = sourceEntity.UnitId;
  144. targetEntity.LineModeFlag = sourceEntity.LineModeFlag;
  145. targetEntity.DeviceTypeId = sourceEntity.DeviceTypeId;
  146. targetEntity.IsCriticalValueFunction = sourceEntity.IsCriticalValueFunction;
  147. targetEntity.IsFollowUpFunction = sourceEntity.IsFollowUpFunction;
  148. targetEntity.CriticalValueFunction = sourceEntity.CriticalValueFunction;
  149. targetEntity.FollowUpFunction = sourceEntity.FollowUpFunction;
  150. }
  151. private void Verify(Item entity)
  152. {
  153. DataHelper.CheckEntityIsNull(entity);
  154. DataHelper.CheckStringIsNull(entity.DisplayName, "名称");
  155. DataHelper.CheckGuidIsDefaultValue(entity.ItemTypeId, "项目类别");
  156. DataHelper.CheckCharIsYOrN(entity.IsProduceSummary, "是否生成小结");
  157. DataHelper.CheckCharIsYOrN(entity.IsNameIntoSummary, "名称是否进入小结");
  158. DataHelper.CheckCharIsYOrN(entity.IsDiagnosisFunction, "是否启用诊断函数");
  159. DataHelper.CheckCharIsYOrN(entity.IsCalculationItem, "是否计算项目");
  160. DataHelper.CheckCharIsYOrN(entity.IsContinueProcess, "是否继续处理");
  161. DataHelper.CheckCharIsYOrN(entity.IsActive, "是否启用");
  162. if (entity.ReferenceRangeTypeFlag != ItemReferenceRangeTypeFlag.None
  163. && entity.ReferenceRangeTypeFlag != ItemReferenceRangeTypeFlag.Number
  164. && entity.ReferenceRangeTypeFlag != ItemReferenceRangeTypeFlag.Character
  165. && entity.ReferenceRangeTypeFlag != ItemReferenceRangeTypeFlag.SexHormone)
  166. {
  167. throw new ArgumentException($"参考范围类别参数为:{entity.ReferenceRangeTypeFlag},是无效值,只能为'{ItemReferenceRangeTypeFlag.None}','{ItemReferenceRangeTypeFlag.Number}','{ItemReferenceRangeTypeFlag.Character}','{ItemReferenceRangeTypeFlag.SexHormone}'");
  168. }
  169. DataHelper.CheckCharIsYOrN(entity.IsCriticalValueFunction, "是否启用危急值函数");
  170. DataHelper.CheckCharIsYOrN(entity.IsFollowUpFunction, "是否启用随访函数");
  171. }
  172. /// <summary>
  173. /// 更新参考范围类型
  174. /// </summary>
  175. /// <param name="sourceEntity"></param>
  176. /// <param name="targetEntity"></param>
  177. /// <returns></returns>
  178. public async Task UpdateRangeTypeAsync(Guid itemid, char ReferenceRangeTypeFlag)
  179. {
  180. var itement = await _repository.GetAsync(itemid);
  181. if (itement != null)
  182. {
  183. itement.ReferenceRangeTypeFlag = ReferenceRangeTypeFlag;
  184. await _repository.UpdateAsync(itement);
  185. }
  186. }
  187. /// <summary>
  188. /// 修改排序 置顶,置底
  189. /// </summary>
  190. /// <param name="id">需要修改的ID</param>
  191. /// <param name="SortType">修改方式:1 置顶 2 置底</param>
  192. /// <returns></returns>
  193. public async Task UpdateManySortAsync(Guid id, int SortType)
  194. {
  195. await EntityHelper.UpdateManySortAsync(_repository, id, SortType);
  196. }
  197. /// <summary>
  198. /// 修改排序 拖拽
  199. /// </summary>
  200. /// <typeparam name="TEntity"></typeparam>
  201. /// <param name="repository"></param>
  202. /// <param name="input"></param>
  203. /// <returns></returns>
  204. public async Task UpdateSortManyAsync(UpdateSortManyDto input)
  205. {
  206. await EntityHelper.UpdateSortManyAsync(_repository, input);
  207. }
  208. /// <summary>
  209. /// 删除项目时,同步删除项目结果模板( item_result_template)、参考范围(reference_range)、结果匹配(item_result_match)、组合项目包含的项目(asbitem_detail),项目模板明细(ItemTemplateDetail)。
  210. /// </summary>
  211. /// <param name="id"></param>
  212. /// <returns></returns>
  213. /// <exception cref="UserFriendlyException"></exception>
  214. public async Task CheckAndDeleteAsync(Guid id)
  215. {
  216. var itemEnt = await _repository.FindAsync(m => m.Id == id);
  217. if (itemEnt != null)
  218. {
  219. var IsRegister = from a in await _patientRegisterRepository.GetQueryableAsync()
  220. join b in await _registerAsbitemRepository.GetQueryableAsync() on a.Id equals b.PatientRegisterId
  221. join c in await _registerCheckRepository.GetQueryableAsync() on b.RegisterCheckId equals c.Id
  222. join d in await _registerCheckItemRepository.GetQueryableAsync() on c.Id equals d.RegisterCheckId
  223. where d.ItemId == id
  224. select new
  225. {
  226. PatientName = a.PatientName
  227. };
  228. if (IsRegister.Count() > 0)
  229. {
  230. throw new UserFriendlyException($"该项目已被{IsRegister.ToList().FirstOrDefault().PatientName}登记,无法删除");
  231. }
  232. //删除item_result_match数据
  233. var itemResultMatchList = await _itemResultMatchRepository.GetListAsync(m => m.ItemId == id);
  234. if (itemResultMatchList.Any())
  235. {
  236. await _itemResultMatchRepository.DeleteManyAsync(itemResultMatchList);
  237. }
  238. //删除item_result_template数据
  239. var itemResultTemplateList = await _itemResultTemplateRepository.GetListAsync(m => m.ItemId == id);
  240. if (itemResultTemplateList.Any())
  241. {
  242. await _itemResultTemplateRepository.DeleteManyAsync(itemResultTemplateList);
  243. }
  244. //删除reference_range数据
  245. var referenceRangeList = await _referenceRangeRepository.GetListAsync(m => m.ItemId == id);
  246. if (referenceRangeList.Any())
  247. {
  248. await _referenceRangeRepository.DeleteManyAsync(referenceRangeList);
  249. }
  250. //删除asbitem_detail数据
  251. var asbtiemDetailList = await _asbtiemDetailRepository.GetListAsync(m => m.ItemId == id);
  252. if (asbtiemDetailList.Any())
  253. {
  254. await _asbtiemDetailRepository.DeleteManyAsync(asbtiemDetailList);
  255. }
  256. //删除项目模板明细
  257. await _itemTemplateDetailRepository.DeleteAsync(m => m.ItemId == id);
  258. //删除项目
  259. await _repository.DeleteAsync(id);
  260. }
  261. else
  262. {
  263. throw new UserFriendlyException("数据不存在");
  264. }
  265. }
  266. }
  267. }