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.

422 lines
20 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.EntityFrameworkCore;
  4. using Shentun.Peis.Asbitems;
  5. using Shentun.Peis.Enums;
  6. using Shentun.Peis.Models;
  7. using Shentun.Peis.PatientRegisters;
  8. using Shentun.Peis.Patients;
  9. using Shentun.Peis.Rooms;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using Volo.Abp;
  16. using Volo.Abp.Application.Services;
  17. using Volo.Abp.Domain.Repositories;
  18. using static NPOI.HSSF.Util.HSSFColor;
  19. namespace Shentun.Peis.QueueRegisters
  20. {
  21. /// <summary>
  22. /// 叫号排队
  23. /// </summary>
  24. [Authorize]
  25. [ApiExplorerSettings(GroupName = "Work")]
  26. public class QueueRegisterAppService : ApplicationService
  27. {
  28. private readonly IRepository<QueueRegister, Guid> _queueRegisterRepository;
  29. private readonly IRepository<Room, Guid> _roomRepository;
  30. private readonly IRepository<ItemType, Guid> _itemTypeRepository;
  31. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  32. private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
  33. private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
  34. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  35. private readonly IRepository<RoomDetail> _roomDetailRepository;
  36. private readonly CacheService _cacheService;
  37. private readonly QueueRegisterManager _queueRegisterManager;
  38. public QueueRegisterAppService(
  39. IRepository<QueueRegister, Guid> queueRegisterRepository,
  40. IRepository<ItemType, Guid> itemTypeRepository,
  41. IRepository<Room, Guid> roomRepository,
  42. IRepository<PatientRegister, Guid> patientRegisterRepository,
  43. IRepository<RegisterCheck, Guid> registerCheckRepository,
  44. IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
  45. IRepository<Asbitem, Guid> asbitemRepository,
  46. IRepository<RoomDetail> roomDetailRepository,
  47. CacheService cacheService,
  48. QueueRegisterManager queueRegisterManager)
  49. {
  50. _queueRegisterRepository = queueRegisterRepository;
  51. _itemTypeRepository = itemTypeRepository;
  52. _roomRepository = roomRepository;
  53. _patientRegisterRepository = patientRegisterRepository;
  54. _registerCheckRepository = registerCheckRepository;
  55. _registerCheckAsbitemRepository = registerCheckAsbitemRepository;
  56. _asbitemRepository = asbitemRepository;
  57. _roomDetailRepository = roomDetailRepository;
  58. _cacheService = cacheService;
  59. _queueRegisterManager = queueRegisterManager;
  60. }
  61. /// <summary>
  62. /// 获取当前排队信息
  63. /// </summary>
  64. /// <param name="input"></param>
  65. /// <returns></returns>
  66. [HttpPost("api/app/QueueRegister/GetQueueRegisterByPatientRegisterId")]
  67. public async Task<QueueRegisterByPatientRegisterIdDto> GetQueueRegisterByPatientRegisterIdAsync(PatientRegisterIdInputDto input)
  68. {
  69. var queueRegisterEnt = (from queueRegister in await _queueRegisterRepository.GetQueryableAsync()
  70. join room in await _roomRepository.GetQueryableAsync() on queueRegister.RoomId equals room.Id
  71. where queueRegister.PatientRegisterId == input.PatientRegisterId
  72. orderby queueRegister.CreationTime descending
  73. select new
  74. {
  75. queueRegister,
  76. room
  77. }).FirstOrDefault();
  78. if (queueRegisterEnt != null)
  79. {
  80. var queueCount = await _queueRegisterRepository.CountAsync(c => c.RoomId == queueRegisterEnt.queueRegister.RoomId
  81. && c.CompleteFlag == QueueRegisterCompleteFlag.Wait);
  82. var entDto = new QueueRegisterByPatientRegisterIdDto
  83. {
  84. CompleteFlag = queueRegisterEnt.queueRegister.CompleteFlag,
  85. RoomName = queueRegisterEnt.room.DisplayName,
  86. QueueCount = queueCount
  87. };
  88. return entDto;
  89. }
  90. else
  91. {
  92. return null;
  93. }
  94. }
  95. /// <summary>
  96. /// 获取房间排队信息
  97. /// </summary>
  98. /// <returns></returns>
  99. [HttpPost("api/app/QueueRegister/GetRoomQueueList")]
  100. public async Task<List<RoomQueueListDto>> GetRoomQueueListAsync(MedicalCenterIdInputDto input)
  101. {
  102. if (input.MedicalCenterId == Guid.Empty)
  103. throw new UserFriendlyException("体检中心不能为空");
  104. var entListDto = (from room in await _roomRepository.GetQueryableAsync()
  105. join queueRegister in (await _queueRegisterRepository.GetQueryableAsync())
  106. .Where(m => m.CompleteFlag == QueueRegisterCompleteFlag.Wait && m.CreationTime >= DateTime.Now.Date).AsQueryable()
  107. on room.Id equals queueRegister.RoomId into queueRegisterTemp
  108. from queueRegisterEmpty in queueRegisterTemp.DefaultIfEmpty()
  109. join itemType in await _itemTypeRepository.GetQueryableAsync()
  110. on room.ItemTypeId equals itemType.Id into itemTypeTemp
  111. from itemTypeEmpty in itemTypeTemp.DefaultIfEmpty()
  112. group new { room, itemTypeEmpty, queueRegisterEmpty } by room.Id into roomGroup
  113. select new RoomQueueListDto
  114. {
  115. ItemTypeName = roomGroup.FirstOrDefault().itemTypeEmpty != null ? roomGroup.FirstOrDefault().itemTypeEmpty.DisplayName : "",
  116. RoomName = roomGroup.FirstOrDefault().room.DisplayName,
  117. WaitCount = roomGroup.Count(c => c.queueRegisterEmpty != null)
  118. }).ToList();
  119. return entListDto;
  120. }
  121. /// <summary>
  122. /// 获取未分诊的组合项目 根据人员登记ID
  123. /// </summary>
  124. /// <param name="input"></param>
  125. /// <returns></returns>
  126. [HttpPost("api/app/QueueRegister/GetNotTriageAsbitemList")]
  127. public async Task<List<NotTriageAsbitemListDto>> GetNotTriageAsbitemListAsync(PatientRegisterIdInputDto input)
  128. {
  129. //分诊过的组合项目id
  130. var triageAsbitemIds = (from queueRegister in await _queueRegisterRepository.GetQueryableAsync()
  131. join room in await _roomRepository.GetQueryableAsync() on queueRegister.RoomId equals room.Id
  132. join roomDetail in await _roomDetailRepository.GetQueryableAsync() on room.Id equals roomDetail.RoomId
  133. where queueRegister.PatientRegisterId == input.PatientRegisterId
  134. select room.Id
  135. ).ToList();
  136. var entListDto = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  137. join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId
  138. join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
  139. join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id
  140. join itemType in await _itemTypeRepository.GetQueryableAsync() on asbitem.ItemTypeId equals itemType.Id into itemTypeTemp
  141. from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
  142. where patientRegister.Id == input.PatientRegisterId
  143. orderby itemTypeHaveEmpty.DisplayOrder, asbitem.DisplayOrder ascending
  144. select new NotTriageAsbitemListDto
  145. {
  146. ItemTypeName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : "",
  147. AsbitemId = asbitem.Id,
  148. AsbitemName = asbitem.DisplayName
  149. }).ToList();
  150. if (triageAsbitemIds.Any())
  151. {
  152. entListDto = entListDto.Where(m => !triageAsbitemIds.Contains(m.AsbitemId)).ToList();
  153. }
  154. return entListDto;
  155. }
  156. /// <summary>
  157. /// 获取已分诊的组合项目 根据人员登记ID
  158. /// </summary>
  159. /// <param name="input"></param>
  160. /// <returns></returns>
  161. [HttpPost("api/app/QueueRegister/GetYesTriageAsbitemList")]
  162. public async Task<List<YesTriageAsbitemListDto>> GetYesTriageAsbitemListAsync(PatientRegisterIdInputDto input)
  163. {
  164. var asbitemIds = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  165. join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId
  166. join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
  167. where patientRegister.Id == input.PatientRegisterId
  168. select registerCheckAsbitem.AsbitemId).ToList();
  169. if (!asbitemIds.Any())
  170. throw new UserFriendlyException("该人员未登记项目");
  171. var entListDto = (from queueRegister in await _queueRegisterRepository.GetQueryableAsync()
  172. join room in await _roomRepository.GetQueryableAsync() on queueRegister.RoomId equals room.Id
  173. join roomDetail in await _roomDetailRepository.GetQueryableAsync() on room.Id equals roomDetail.RoomId
  174. join asbitem in await _asbitemRepository.GetQueryableAsync() on roomDetail.AsbitemId equals asbitem.Id
  175. join itemType in await _itemTypeRepository.GetQueryableAsync() on asbitem.ItemTypeId equals itemType.Id into itemTypeTemp
  176. from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
  177. where queueRegister.PatientRegisterId == input.PatientRegisterId
  178. && asbitemIds.Contains(roomDetail.AsbitemId)
  179. orderby queueRegister.CreationTime descending
  180. select new YesTriageAsbitemListDto
  181. {
  182. ItemTypeName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : "",
  183. AsbitemId = asbitem.Id,
  184. AsbitemName = asbitem.DisplayName,
  185. CompleteFlag = queueRegister.CompleteFlag,
  186. RoomName = room.DisplayName,
  187. TriageName = _cacheService.GetSurnameAsync(queueRegister.CreatorId).Result
  188. }).ToList();
  189. return entListDto;
  190. }
  191. /// <summary>
  192. /// 获取房间信息 根据项目ID
  193. /// </summary>
  194. /// <param name="input"></param>
  195. /// <returns></returns>
  196. [HttpPost("api/app/QueueRegister/GetRoomListByAsbitemId")]
  197. public async Task<List<BaseRoomDto>> GetRoomListByAsbitemIdAsync(AsbitemIdInputDto input)
  198. {
  199. var query = (from room in await _roomRepository.GetQueryableAsync()
  200. join roomDetail in await _roomDetailRepository.GetQueryableAsync() on room.Id equals roomDetail.RoomId
  201. join queueRegister in await _queueRegisterRepository.GetQueryableAsync() on room.Id equals queueRegister.RoomId into queueRegisterTemp
  202. from queueRegisterHaveEmpty in queueRegisterTemp.DefaultIfEmpty()
  203. where roomDetail.AsbitemId == input.AsbitemId
  204. orderby room.DisplayOrder ascending
  205. select new
  206. {
  207. roomId = room.Id,
  208. roomName = room.DisplayName,
  209. queueTime = room.QueueTime,
  210. queueRegisterHaveEmpty
  211. }).ToList();
  212. var roomGroup = query.GroupBy(g => g.roomId).Select(s => new BaseRoomDto
  213. {
  214. RoomId = s.Key,
  215. RoomName = s.FirstOrDefault().roomName,
  216. QueueTime = s.Count(m => m.queueRegisterHaveEmpty != null) * s.FirstOrDefault().queueTime,
  217. }).ToList();
  218. return roomGroup;
  219. }
  220. /// <summary>
  221. /// 取消分诊 删除
  222. /// </summary>
  223. /// <param name="input"></param>
  224. /// <returns></returns>
  225. [HttpPost("api/app/QueueRegister/Delete")]
  226. public async Task DeleteAsync(QueueRegisterIdInputDto input)
  227. {
  228. await _queueRegisterRepository.DeleteAsync(d => d.Id == input.QueueRegisterId);
  229. }
  230. /// <summary>
  231. /// 人工排队房间
  232. /// </summary>
  233. /// <param name="input"></param>
  234. /// <returns></returns>
  235. [HttpPost("api/app/QueueRegister/ManualQueuingRoom")]
  236. public async Task<QueueRegisterByPatientRegisterIdDto> ManualQueuingRoomAsync(ManualQueuingRoomInputDto input)
  237. {
  238. //删除排队操作
  239. await _queueRegisterRepository.DeleteAsync(d => d.PatientRegisterId == input.PatientRegisterId, true);
  240. var entity = await _queueRegisterManager.ManualQueuingRoomAsync(input.PatientRegisterId, input.RoomId);
  241. await _queueRegisterRepository.InsertAsync(entity, true);
  242. return await GetQueueRegisterByPatientRegisterIdAsync(new PatientRegisterIdInputDto
  243. {
  244. PatientRegisterId = input.PatientRegisterId
  245. });
  246. }
  247. /// <summary>
  248. /// 自动排队房间
  249. /// </summary>
  250. /// <param name="input"></param>
  251. /// <returns></returns>
  252. [HttpPost("api/app/QueueRegister/AutomaticQueuingRoom")]
  253. public async Task<QueueRegisterByPatientRegisterIdDto> AutomaticQueuingRoomAsync(AutomaticQueuingRoomInputDto input)
  254. {
  255. //删除排队操作
  256. await _queueRegisterRepository.DeleteAsync(d => d.PatientRegisterId == input.PatientRegisterId, true);
  257. var entity = await _queueRegisterManager.AutomaticQueuingRoomAsync(input.PatientRegisterId);
  258. await _queueRegisterRepository.InsertAsync(entity, true);
  259. return await GetQueueRegisterByPatientRegisterIdAsync(new PatientRegisterIdInputDto
  260. {
  261. PatientRegisterId = input.PatientRegisterId
  262. });
  263. }
  264. /// <summary>
  265. /// 修改排队人员状态
  266. /// </summary>
  267. /// <param name="input"></param>
  268. /// <returns></returns>
  269. [HttpPost("api/app/QueueRegister/UpdateQueueRegisterStatus")]
  270. public async Task UpdateQueueRegisterStatusAsync(UpdateQueueRegisterStatusInputDto input)
  271. {
  272. var entity = await _queueRegisterManager.UpdateQueueRegisterStatusAsync(input.QueueRegisterId, input.CompleteFlag);
  273. await _queueRegisterRepository.UpdateAsync(entity);
  274. }
  275. /// <summary>
  276. /// 获取医生诊台叫号人员列表 根据房间ID
  277. /// </summary>
  278. /// <param name="input"></param>
  279. /// <returns></returns>
  280. [HttpPost("api/app/QueueRegister/GetQueueRegisterListByRoomId")]
  281. public async Task<GetQueueRegisterListByRoomIdDto> GetQueueRegisterListByRoomIdAsync(RoomIdInputDto input)
  282. {
  283. var entDto = new GetQueueRegisterListByRoomIdDto();
  284. var query = from queueRegister in await _queueRegisterRepository.GetQueryableAsync()
  285. join patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  286. on queueRegister.PatientRegisterId equals patientRegister.Id
  287. where queueRegister.CreationTime >= DateTime.Now.Date
  288. && queueRegister.RoomId == input.RoomId
  289. select new
  290. {
  291. completeFlag = queueRegister.CompleteFlag,
  292. patientName = patientRegister.PatientName,
  293. isVip = patientRegister.IsVip,
  294. queueRegisterId = queueRegister.Id,
  295. queueRegisterNumber = queueRegister.DisplayOrder
  296. };
  297. entDto.WaitDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.Wait)
  298. .Select(s => new GetQueueRegisterListByRoomIdDetailDto
  299. {
  300. IsVip = s.isVip,
  301. PatientName = s.patientName,
  302. QueueRegisterId = s.queueRegisterId,
  303. QueueRegisterNumber = s.queueRegisterNumber
  304. }).ToList();
  305. entDto.AlreadyCalledDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.AlreadyCalled)
  306. .Select(s => new GetQueueRegisterListByRoomIdDetailDto
  307. {
  308. IsVip = s.isVip,
  309. PatientName = s.patientName,
  310. QueueRegisterId = s.queueRegisterId,
  311. QueueRegisterNumber = s.queueRegisterNumber
  312. }).ToList();
  313. entDto.OverNumberDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.OverNumber)
  314. .Select(s => new GetQueueRegisterListByRoomIdDetailDto
  315. {
  316. IsVip = s.isVip,
  317. PatientName = s.patientName,
  318. QueueRegisterId = s.queueRegisterId,
  319. QueueRegisterNumber = s.queueRegisterNumber
  320. }).ToList();
  321. return entDto;
  322. }
  323. /// <summary>
  324. /// 获取叫号屏人员数据
  325. /// </summary>
  326. /// <param name="input"></param>
  327. /// <returns></returns>
  328. [HttpPost("api/app/QueueRegister/GetScreenQueueRegisterListByRoomId")]
  329. public async Task<GetScreenQueueRegisterListByRoomIdDto> GetScreenQueueRegisterListByRoomIdAsync(RoomIdInputDto input)
  330. {
  331. var entDto = new GetScreenQueueRegisterListByRoomIdDto();
  332. var query = from queueRegister in await _queueRegisterRepository.GetQueryableAsync()
  333. join patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  334. on queueRegister.PatientRegisterId equals patientRegister.Id
  335. where queueRegister.CreationTime >= DateTime.Now.Date
  336. && queueRegister.RoomId == input.RoomId
  337. select new
  338. {
  339. completeFlag = queueRegister.CompleteFlag,
  340. patientName = patientRegister.PatientName,
  341. isVip = patientRegister.IsVip,
  342. queueRegisterId = queueRegister.Id,
  343. queueRegisterNumber = queueRegister.DisplayOrder
  344. };
  345. var visitEnt = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.AlreadyCalled).OrderByDescending(o => o.queueRegisterNumber).FirstOrDefault();
  346. if (visitEnt != null)
  347. {
  348. entDto.VisitNumber = visitEnt.queueRegisterNumber;
  349. entDto.VisitName = visitEnt.patientName;
  350. }
  351. entDto.WaitDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.Wait)
  352. .Select(s => new GetScreenQueueRegisterListByRoomIdDetailDto
  353. {
  354. PatientName = s.patientName,
  355. QueueRegisterNumber = s.queueRegisterNumber
  356. }).ToList();
  357. entDto.OverNumberDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.OverNumber)
  358. .Select(s => new GetScreenQueueRegisterListByRoomIdDetailDto
  359. {
  360. PatientName = s.patientName,
  361. QueueRegisterNumber = s.queueRegisterNumber
  362. }).ToList();
  363. return entDto;
  364. }
  365. }
  366. }