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

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;
}
}
}