|
|
using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;using Shentun.Peis.Asbitems;using Shentun.Peis.Enums;using Shentun.Peis.Models;using Shentun.Peis.PatientRegisters;using Shentun.Peis.Patients;using Shentun.Peis.Rooms;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Volo.Abp;using Volo.Abp.Application.Services;using Volo.Abp.Domain.Repositories;using static NPOI.HSSF.Util.HSSFColor;
namespace Shentun.Peis.QueueRegisters{ /// <summary>
/// 叫号排队
/// </summary>
[Authorize] [ApiExplorerSettings(GroupName = "Work")] public class QueueRegisterAppService : ApplicationService { private readonly IRepository<QueueRegister, Guid> _queueRegisterRepository; private readonly IRepository<Room, Guid> _roomRepository; private readonly IRepository<ItemType, Guid> _itemTypeRepository; private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository; private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository; private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository; private readonly IRepository<Asbitem, Guid> _asbitemRepository; private readonly IRepository<RoomDetail> _roomDetailRepository; private readonly CacheService _cacheService; private readonly QueueRegisterManager _queueRegisterManager; public QueueRegisterAppService( IRepository<QueueRegister, Guid> queueRegisterRepository, IRepository<ItemType, Guid> itemTypeRepository, IRepository<Room, Guid> roomRepository, IRepository<PatientRegister, Guid> patientRegisterRepository, IRepository<RegisterCheck, Guid> registerCheckRepository, IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository, IRepository<Asbitem, Guid> asbitemRepository, IRepository<RoomDetail> roomDetailRepository, CacheService cacheService, QueueRegisterManager queueRegisterManager) { _queueRegisterRepository = queueRegisterRepository; _itemTypeRepository = itemTypeRepository; _roomRepository = roomRepository; _patientRegisterRepository = patientRegisterRepository; _registerCheckRepository = registerCheckRepository; _registerCheckAsbitemRepository = registerCheckAsbitemRepository; _asbitemRepository = asbitemRepository; _roomDetailRepository = roomDetailRepository; _cacheService = cacheService; _queueRegisterManager = queueRegisterManager; }
/// <summary>
/// 获取当前排队信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetQueueRegisterByPatientRegisterId")] public async Task<QueueRegisterByPatientRegisterIdDto> GetQueueRegisterByPatientRegisterIdAsync(PatientRegisterIdInputDto input) { var queueRegisterEnt = (from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join room in await _roomRepository.GetQueryableAsync() on queueRegister.RoomId equals room.Id where queueRegister.PatientRegisterId == input.PatientRegisterId orderby queueRegister.CreationTime descending select new { queueRegister, room }).FirstOrDefault(); if (queueRegisterEnt != null) { var queueCount = await _queueRegisterRepository.CountAsync(c => c.RoomId == queueRegisterEnt.queueRegister.RoomId && c.CompleteFlag == QueueRegisterCompleteFlag.Wait);
var entDto = new QueueRegisterByPatientRegisterIdDto { CompleteFlag = queueRegisterEnt.queueRegister.CompleteFlag, RoomName = queueRegisterEnt.room.DisplayName, QueueCount = queueCount };
return entDto; } else { return null; } }
/// <summary>
/// 获取房间排队信息
/// </summary>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetRoomQueueList")] public async Task<List<RoomQueueListDto>> GetRoomQueueListAsync(MedicalCenterIdInputDto input) { if (input.MedicalCenterId == Guid.Empty) throw new UserFriendlyException("体检中心不能为空");
var entListDto = (from room in await _roomRepository.GetQueryableAsync() join queueRegister in (await _queueRegisterRepository.GetQueryableAsync()) .Where(m => m.CompleteFlag == QueueRegisterCompleteFlag.Wait && m.CreationTime >= DateTime.Now.Date).AsQueryable() on room.Id equals queueRegister.RoomId into queueRegisterTemp from queueRegisterEmpty in queueRegisterTemp.DefaultIfEmpty() join itemType in await _itemTypeRepository.GetQueryableAsync() on room.ItemTypeId equals itemType.Id into itemTypeTemp from itemTypeEmpty in itemTypeTemp.DefaultIfEmpty() group new { room, itemTypeEmpty, queueRegisterEmpty } by room.Id into roomGroup select new RoomQueueListDto { ItemTypeName = roomGroup.FirstOrDefault().itemTypeEmpty != null ? roomGroup.FirstOrDefault().itemTypeEmpty.DisplayName : "", RoomName = roomGroup.FirstOrDefault().room.DisplayName, WaitCount = roomGroup.Count(c => c.queueRegisterEmpty != null) }).ToList();
return entListDto; }
/// <summary>
/// 获取未分诊的组合项目 根据人员登记ID
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetNotTriageAsbitemList")] public async Task<List<NotTriageAsbitemListDto>> GetNotTriageAsbitemListAsync(PatientRegisterIdInputDto input) { //分诊过的组合项目id
var triageAsbitemIds = (from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join room in await _roomRepository.GetQueryableAsync() on queueRegister.RoomId equals room.Id join roomDetail in await _roomDetailRepository.GetQueryableAsync() on room.Id equals roomDetail.RoomId where queueRegister.PatientRegisterId == input.PatientRegisterId select room.Id ).ToList();
var entListDto = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id join itemType in await _itemTypeRepository.GetQueryableAsync() on asbitem.ItemTypeId equals itemType.Id into itemTypeTemp from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty() where patientRegister.Id == input.PatientRegisterId orderby itemTypeHaveEmpty.DisplayOrder, asbitem.DisplayOrder ascending select new NotTriageAsbitemListDto { ItemTypeName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : "", AsbitemId = asbitem.Id, AsbitemName = asbitem.DisplayName }).ToList();
if (triageAsbitemIds.Any()) { entListDto = entListDto.Where(m => !triageAsbitemIds.Contains(m.AsbitemId)).ToList(); }
return entListDto; }
/// <summary>
/// 获取已分诊的组合项目 根据人员登记ID
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetYesTriageAsbitemList")] public async Task<List<YesTriageAsbitemListDto>> GetYesTriageAsbitemListAsync(PatientRegisterIdInputDto input) {
var asbitemIds = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId where patientRegister.Id == input.PatientRegisterId select registerCheckAsbitem.AsbitemId).ToList();
if (!asbitemIds.Any()) throw new UserFriendlyException("该人员未登记项目");
var entListDto = (from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join room in await _roomRepository.GetQueryableAsync() on queueRegister.RoomId equals room.Id join roomDetail in await _roomDetailRepository.GetQueryableAsync() on room.Id equals roomDetail.RoomId join asbitem in await _asbitemRepository.GetQueryableAsync() on roomDetail.AsbitemId equals asbitem.Id join itemType in await _itemTypeRepository.GetQueryableAsync() on asbitem.ItemTypeId equals itemType.Id into itemTypeTemp from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty() where queueRegister.PatientRegisterId == input.PatientRegisterId && asbitemIds.Contains(roomDetail.AsbitemId) orderby queueRegister.CreationTime descending select new YesTriageAsbitemListDto { ItemTypeName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : "", AsbitemId = asbitem.Id, AsbitemName = asbitem.DisplayName, CompleteFlag = queueRegister.CompleteFlag, RoomName = room.DisplayName, TriageName = _cacheService.GetSurnameAsync(queueRegister.CreatorId).Result }).ToList();
return entListDto; }
/// <summary>
/// 获取房间信息 根据项目ID
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetRoomListByAsbitemId")] public async Task<List<BaseRoomDto>> GetRoomListByAsbitemIdAsync(AsbitemIdInputDto input) { var query = (from room in await _roomRepository.GetQueryableAsync() join roomDetail in await _roomDetailRepository.GetQueryableAsync() on room.Id equals roomDetail.RoomId join queueRegister in await _queueRegisterRepository.GetQueryableAsync() on room.Id equals queueRegister.RoomId into queueRegisterTemp from queueRegisterHaveEmpty in queueRegisterTemp.DefaultIfEmpty() where roomDetail.AsbitemId == input.AsbitemId orderby room.DisplayOrder ascending select new { roomId = room.Id, roomName = room.DisplayName, queueTime = room.QueueTime, queueRegisterHaveEmpty }).ToList();
var roomGroup = query.GroupBy(g => g.roomId).Select(s => new BaseRoomDto { RoomId = s.Key, RoomName = s.FirstOrDefault().roomName, QueueTime = s.Count(m => m.queueRegisterHaveEmpty != null) * s.FirstOrDefault().queueTime, }).ToList();
return roomGroup; }
/// <summary>
/// 取消分诊 删除
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/Delete")] public async Task DeleteAsync(QueueRegisterIdInputDto input) { await _queueRegisterRepository.DeleteAsync(d => d.Id == input.QueueRegisterId); }
/// <summary>
/// 人工排队房间
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/ManualQueuingRoom")] public async Task<QueueRegisterByPatientRegisterIdDto> ManualQueuingRoomAsync(ManualQueuingRoomInputDto input) { //删除排队操作
await _queueRegisterRepository.DeleteAsync(d => d.PatientRegisterId == input.PatientRegisterId, true);
var entity = await _queueRegisterManager.ManualQueuingRoomAsync(input.PatientRegisterId, input.RoomId);
await _queueRegisterRepository.InsertAsync(entity, true);
return await GetQueueRegisterByPatientRegisterIdAsync(new PatientRegisterIdInputDto { PatientRegisterId = input.PatientRegisterId }); }
/// <summary>
/// 自动排队房间
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/AutomaticQueuingRoom")] public async Task<QueueRegisterByPatientRegisterIdDto> AutomaticQueuingRoomAsync(AutomaticQueuingRoomInputDto input) { //删除排队操作
await _queueRegisterRepository.DeleteAsync(d => d.PatientRegisterId == input.PatientRegisterId, true);
var entity = await _queueRegisterManager.AutomaticQueuingRoomAsync(input.PatientRegisterId);
await _queueRegisterRepository.InsertAsync(entity, true);
return await GetQueueRegisterByPatientRegisterIdAsync(new PatientRegisterIdInputDto { PatientRegisterId = input.PatientRegisterId });
}
/// <summary>
/// 修改排队人员状态
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/UpdateQueueRegisterStatus")] public async Task UpdateQueueRegisterStatusAsync(UpdateQueueRegisterStatusInputDto input) { var entity = await _queueRegisterManager.UpdateQueueRegisterStatusAsync(input.QueueRegisterId, input.CompleteFlag); await _queueRegisterRepository.UpdateAsync(entity); }
/// <summary>
/// 获取医生诊台叫号人员列表 根据房间ID
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetQueueRegisterListByRoomId")] public async Task<GetQueueRegisterListByRoomIdDto> GetQueueRegisterListByRoomIdAsync(RoomIdInputDto input) { var entDto = new GetQueueRegisterListByRoomIdDto(); var query = from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on queueRegister.PatientRegisterId equals patientRegister.Id where queueRegister.CreationTime >= DateTime.Now.Date && queueRegister.RoomId == input.RoomId select new { completeFlag = queueRegister.CompleteFlag, patientName = patientRegister.PatientName, isVip = patientRegister.IsVip, queueRegisterId = queueRegister.Id, queueRegisterNumber = queueRegister.DisplayOrder };
entDto.WaitDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.Wait) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, PatientName = s.patientName, QueueRegisterId = s.queueRegisterId, QueueRegisterNumber = s.queueRegisterNumber }).ToList();
entDto.AlreadyCalledDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.AlreadyCalled) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, PatientName = s.patientName, QueueRegisterId = s.queueRegisterId, QueueRegisterNumber = s.queueRegisterNumber }).ToList();
entDto.OverNumberDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.OverNumber) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, PatientName = s.patientName, QueueRegisterId = s.queueRegisterId, QueueRegisterNumber = s.queueRegisterNumber }).ToList();
return entDto; }
/// <summary>
/// 获取叫号屏人员数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetScreenQueueRegisterListByRoomId")] public async Task<GetScreenQueueRegisterListByRoomIdDto> GetScreenQueueRegisterListByRoomIdAsync(RoomIdInputDto input) { var entDto = new GetScreenQueueRegisterListByRoomIdDto(); var query = from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on queueRegister.PatientRegisterId equals patientRegister.Id where queueRegister.CreationTime >= DateTime.Now.Date && queueRegister.RoomId == input.RoomId select new { completeFlag = queueRegister.CompleteFlag, patientName = patientRegister.PatientName, isVip = patientRegister.IsVip, queueRegisterId = queueRegister.Id, queueRegisterNumber = queueRegister.DisplayOrder };
var visitEnt = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.AlreadyCalled).OrderByDescending(o => o.queueRegisterNumber).FirstOrDefault();
if (visitEnt != null) { entDto.VisitNumber = visitEnt.queueRegisterNumber; entDto.VisitName = visitEnt.patientName; }
entDto.WaitDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.Wait) .Select(s => new GetScreenQueueRegisterListByRoomIdDetailDto { PatientName = s.patientName, QueueRegisterNumber = s.queueRegisterNumber }).ToList();
entDto.OverNumberDetail = query.Where(m => m.completeFlag == QueueRegisterCompleteFlag.OverNumber) .Select(s => new GetScreenQueueRegisterListByRoomIdDetailDto { PatientName = s.patientName, QueueRegisterNumber = s.queueRegisterNumber }).ToList();
return entDto; } }}
|