|
|
using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Logging;using NPOI.SS.Formula.Functions;using Shentun.Peis.Asbitems;using Shentun.Peis.Enums;using Shentun.Peis.Models;using Shentun.Peis.PatientRegisters;using Shentun.Peis.Patients;using Shentun.Peis.RegisterChecks;using Shentun.Peis.Rooms;using Shentun.Peis.SysParmValues;using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;using Volo.Abp;using Volo.Abp.Application.Services;using Volo.Abp.Auditing;using Volo.Abp.Domain.Repositories;using static NPOI.HSSF.Util.HSSFColor;
namespace Shentun.Peis.QueueRegisters{ /// <summary>
/// 叫号排队
/// </summary>
[Authorize] [ApiExplorerSettings(GroupName = "Work")] [DisableAuditing] 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; private readonly ILogger<QueueRegisterAppService> _logger; private readonly SysParmValueManager _sysParmValueManager; private readonly IRepository<DoctorSignIn, Guid> _doctorSignInRepository; private readonly RegisterCheckAppService _registerCheckAppService; private readonly IRepository<Patient, Guid> _patientRepository;
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, ILogger<QueueRegisterAppService> logger, SysParmValueManager sysParmValueManager, IRepository<DoctorSignIn, Guid> doctorSignInRepository, RegisterCheckAppService registerCheckAppService, IRepository<Patient, Guid> patientRepository) { _queueRegisterRepository = queueRegisterRepository; _itemTypeRepository = itemTypeRepository; _roomRepository = roomRepository; _patientRegisterRepository = patientRegisterRepository; _registerCheckRepository = registerCheckRepository; _registerCheckAsbitemRepository = registerCheckAsbitemRepository; _asbitemRepository = asbitemRepository; _roomDetailRepository = roomDetailRepository; _cacheService = cacheService; _queueRegisterManager = queueRegisterManager; _logger = logger; _sysParmValueManager = sysParmValueManager; _doctorSignInRepository = doctorSignInRepository; _registerCheckAppService = registerCheckAppService; _patientRepository = patientRepository; }
/// <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 join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on queueRegister.PatientRegisterId equals patientRegister.Id where queueRegister.PatientRegisterId == input.PatientRegisterId && queueRegister.CreationTime >= DateTime.Now.Date orderby queueRegister.CreationTime descending select new { queueRegister, room, patientName = patientRegister.PatientName, isVip = patientRegister.IsVip, }).FirstOrDefault(); if (queueRegisterEnt != null) { var queueCount = await (from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on queueRegister.PatientRegisterId equals patientRegister.Id where queueRegister.RoomId == queueRegisterEnt.queueRegister.RoomId && queueRegister.CompleteFlag == QueueRegisterCompleteFlag.Wait && queueRegister.CreationTime >= DateTime.Now.Date && queueRegister.DisplayOrder < queueRegisterEnt.queueRegister.DisplayOrder && patientRegister.IsVip == queueRegisterEnt.isVip && queueRegister.NoCompleteReason == '0' select queueRegister).CountAsync();
var entDto = new QueueRegisterByPatientRegisterIdDto { CompleteFlag = queueRegisterEnt.queueRegister.CompleteFlag, RoomName = queueRegisterEnt.room.DisplayName, QueueCount = queueCount, PatientName = queueRegisterEnt.patientName, RoomId = queueRegisterEnt.room.Id };
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 doctorAutoSignIn = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "call_number_is_sign");
//if (doctorAutoSignIn == "Y")
//{
// //自动签到
// var isSignInCount = await _doctorSignInRepository.CountAsync(m => m.CreationTime.Date == DateTime.Now.Date && m.SignInFlag == SignInFlag.SignIn);
// if (isSignInCount == 0)
// {
// await _registerCheckAppService.CreateDoctorBatchSignInAsync(new CreateDoctorBatchSignInInputDto { });
// }
//}
var doctorAutoSignIn = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "call_number_is_sign"); if (string.IsNullOrWhiteSpace(doctorAutoSignIn)) doctorAutoSignIn = "Y";
if (doctorAutoSignIn == "Y") { //已签到的房间
var roomIds = await _queueRegisterManager.GetSignInRoomAsync(); 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() where room.IsActive == 'Y' && roomIds.Contains(room.Id) 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), ItemTypeDisplayOrder = roomGroup.FirstOrDefault().itemTypeEmpty != null ? roomGroup.FirstOrDefault().itemTypeEmpty.DisplayOrder : 0, RoomDisplayOrder = roomGroup.FirstOrDefault().room.DisplayOrder }).ToList().OrderBy(o => o.RoomDisplayOrder).ToList();
return entListDto; } else { 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() where room.IsActive == 'Y' 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), ItemTypeDisplayOrder = roomGroup.FirstOrDefault().itemTypeEmpty != null ? roomGroup.FirstOrDefault().itemTypeEmpty.DisplayOrder : 0, RoomDisplayOrder = roomGroup.FirstOrDefault().room.DisplayOrder }).ToList().OrderBy(o => o.RoomDisplayOrder).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 roomDetail.AsbitemId ).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 && asbitem.IsCheck == 'Y' && registerCheck.CompleteFlag == RegisterCheckCompleteFlag.UnChecked 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) && asbitem.IsCheck == 'Y' 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).GetAwaiter().GetResult(), TriageTime = queueRegister.CreationTime.ToString("HH:mm:ss") }).ToList();
entListDto = entListDto.GroupBy(g => g.RoomName).Select(s => new YesTriageAsbitemListDto { RoomName = s.Key, AsbitemId = Guid.Empty, AsbitemName = string.Join(",", s.Select(s => s.AsbitemName)), CompleteFlag = s.FirstOrDefault().CompleteFlag, ItemTypeName = s.FirstOrDefault().ItemTypeName, TriageName = s.FirstOrDefault().TriageName, TriageTime = s.FirstOrDefault().TriageTime }).ToList();
return entListDto; }
/// <summary>
/// 获取房间信息 根据项目ID
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetRoomListByAsbitemId")] public async Task<List<BaseRoomDto>> GetRoomListByAsbitemIdAsync(GetRoomListByAsbitemIdInputDto input) {
var doctorAutoSignIn = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "call_number_is_sign"); if (string.IsNullOrWhiteSpace(doctorAutoSignIn)) doctorAutoSignIn = "Y";
var patientRegisterEnt = await _patientRegisterRepository.FirstOrDefaultAsync(f => f.Id == input.PatientRegisterId);
if (patientRegisterEnt == null) { throw new UserFriendlyException("人员不存在"); }
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 && room.IsActive == 'Y' // && roomIds.Contains(room.Id)
orderby room.DisplayOrder ascending select new { roomId = room.Id, roomName = room.DisplayName, queueTime = room.QueueTime, forSexId = room.ForSexId, queueRegisterHaveEmpty });
if (doctorAutoSignIn == "Y") { //已签到的房间
var roomIds = await _queueRegisterManager.GetSignInRoomAsync(); query = query.Where(m => roomIds.Contains(m.roomId)); }
var queryList = query.ToList();
var roomGroup = queryList.GroupBy(g => g.roomId).Select(s => new BaseRoomDto { RoomId = s.Key, RoomName = s.FirstOrDefault().roomName, QueueTime = s.Count(m => m.queueRegisterHaveEmpty != null && m.queueRegisterHaveEmpty.NoCompleteReason == '0') * s.FirstOrDefault().queueTime, ForSexId = s.FirstOrDefault().forSexId }).ToList();
if (patientRegisterEnt.SexId == SexFlag.UnKnown) { roomGroup = roomGroup.Where(m => m.ForSexId == ForSexFlag.All).ToList(); } else { roomGroup = roomGroup.Where(m => m.ForSexId == ForSexFlag.All || m.ForSexId == patientRegisterEnt.SexId).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); }
[HttpPost("api/app/QueueRegister/DeleteByPatientRegisterId")] public async Task DeleteByPatientRegisterIdAsync(PatientRegisterIdInputDto input) { await _queueRegisterRepository.DeleteAsync(d => d.PatientRegisterId == input.PatientRegisterId && d.CompleteFlag == QueueRegisterCompleteFlag.Wait); }
/// <summary>
/// 人工排队房间
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/ManualQueuingRoom")] public async Task<QueueRegisterByPatientRegisterIdDto> ManualQueuingRoomAsync(ManualQueuingRoomInputDto input) { var doctorAutoSignIn = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "call_number_is_sign"); if (string.IsNullOrWhiteSpace(doctorAutoSignIn)) doctorAutoSignIn = "Y";
if (doctorAutoSignIn == "Y") { //已签到的房间
var roomIds = await _queueRegisterManager.GetSignInRoomAsync(); if (!roomIds.Contains(input.RoomId)) { throw new UserFriendlyException("房间未签到,不能分配"); } }
//删除排队操作
await _queueRegisterRepository.DeleteAsync(d => d.PatientRegisterId == input.PatientRegisterId && d.CompleteFlag != QueueRegisterCompleteFlag.AlreadyCalled, 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 && d.CompleteFlag != QueueRegisterCompleteFlag.AlreadyCalled, true);
var entity = await _queueRegisterManager.AutomaticQueuingRoomAsync(input.PatientRegisterId, new List<Guid>());
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(QueueRegisterListByRoomIdInputDto 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 join roomDetail in await _roomDetailRepository.GetQueryableAsync() on queueRegister.RoomId equals roomDetail.RoomId 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, patientRegisterId = queueRegister.PatientRegisterId, patientRegisterNo = patientRegister.PatientRegisterNo, roomId = queueRegister.RoomId, asbitemId = roomDetail.AsbitemId, //lastModificationTime = queueRegister.LastModificationTime,
callTime = queueRegister.CallTime };
if (input.ItemTypeIds.Any()) {
var patientRegisterIds = query.Select(s => s.patientRegisterId).ToList();
//筛选项目类别
//项目类别下登记的所有组合项目
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 join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id where patientRegisterIds.Contains(patientRegister.Id) && input.ItemTypeIds.Contains(asbitem.ItemTypeId) group registerCheckAsbitem by registerCheckAsbitem.AsbitemId into cc select cc.Key).ToList();
query = query.Where(m => asbitemIds.Contains(m.asbitemId));
}
var roomGroup = query.ToList().GroupBy(g => g.queueRegisterId).Select(s => new { completeFlag = s.FirstOrDefault().completeFlag, patientName = s.FirstOrDefault().patientName, isVip = s.FirstOrDefault().isVip, queueRegisterId = s.Key, queueRegisterNumber = s.FirstOrDefault().queueRegisterNumber, //lastModificationTime = s.FirstOrDefault().lastModificationTime,
patientRegisterId = s.FirstOrDefault().patientRegisterId, patientRegisterNo = s.FirstOrDefault().patientRegisterNo, callTime = s.FirstOrDefault().callTime }).ToList();
var queueRegisterList = roomGroup.Where(m => m.isVip == 'Y').OrderBy(o => o.queueRegisterNumber).ToList(); queueRegisterList.AddRange(roomGroup.Where(m => m.isVip == 'N').OrderBy(o => o.queueRegisterNumber).ToList());
entDto.WaitDetail = queueRegisterList.Where(m => m.completeFlag == QueueRegisterCompleteFlag.Wait) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, PatientName = s.patientName, QueueRegisterId = s.queueRegisterId, QueueRegisterNumber = (s.isVip == 'Y' ? "V" : "") + s.queueRegisterNumber.ToString(), PatientRegisterId = s.patientRegisterId, PatientRegisterNo = s.patientRegisterNo }).ToList();
entDto.AlreadyCalledDetail = queueRegisterList.Where(m => m.completeFlag == QueueRegisterCompleteFlag.AlreadyCalled).OrderByDescending(o => o.callTime) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, PatientName = s.patientName, QueueRegisterId = s.queueRegisterId, QueueRegisterNumber = (s.isVip == 'Y' ? "V" : "") + s.queueRegisterNumber.ToString(), PatientRegisterId = s.patientRegisterId, PatientRegisterNo = s.patientRegisterNo }).ToList();
entDto.OverNumberDetail = roomGroup.Where(m => m.completeFlag == QueueRegisterCompleteFlag.OverNumber).OrderByDescending(o => o.callTime) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, PatientName = s.patientName, QueueRegisterId = s.queueRegisterId, QueueRegisterNumber = (s.isVip == 'Y' ? "V" : "") + s.queueRegisterNumber.ToString(), PatientRegisterId = s.patientRegisterId, PatientRegisterNo = s.patientRegisterNo }).ToList();
return entDto; }
/// <summary>
/// 获取叫号屏人员数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetScreenQueueRegisterListByRoomNo")] public async Task<GetScreenQueueRegisterListByRoomIdDto> GetScreenQueueRegisterListByRoomIdAsync(RoomNoInputDto 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 join room in await _roomRepository.GetQueryableAsync() on queueRegister.RoomId equals room.Id where queueRegister.CreationTime >= DateTime.Now.Date && room.RoomNo == input.RoomNo select new { completeFlag = queueRegister.CompleteFlag, patientName = patientRegister.PatientName, isVip = patientRegister.IsVip, queueRegisterId = queueRegister.Id, queueRegisterNumber = queueRegister.DisplayOrder, callTime = queueRegister.CallTime }).ToList();
var queueRegisterList = query.Where(m => m.isVip == 'Y').OrderBy(o => o.queueRegisterNumber).ToList(); queueRegisterList.AddRange(query.Where(m => m.isVip == 'N').OrderBy(o => o.queueRegisterNumber).ToList());
var visitEnt = queueRegisterList.Where(m => m.completeFlag == QueueRegisterCompleteFlag.AlreadyCalled).OrderByDescending(o => o.callTime).FirstOrDefault();
if (visitEnt != null) { entDto.VisitNumber = visitEnt.queueRegisterNumber; entDto.VisitName = visitEnt.patientName; }
entDto.WaitDetail = queueRegisterList.Where(m => m.completeFlag == QueueRegisterCompleteFlag.Wait) .Select(s => new GetScreenQueueRegisterListByRoomIdDetailDto { PatientName = s.patientName, QueueRegisterNumber = (s.isVip == 'Y' ? "V" : "") + s.queueRegisterNumber.ToString() }).ToList();
entDto.OverNumberDetail = queueRegisterList.Where(m => m.completeFlag == QueueRegisterCompleteFlag.OverNumber).OrderByDescending(o => o.callTime) .Select(s => new GetScreenQueueRegisterListByRoomIdDetailDto { PatientName = s.patientName, QueueRegisterNumber = (s.isVip == 'Y' ? "V" : "") + s.queueRegisterNumber.ToString() }).ToList();
return entDto; }
/// <summary>
/// 获取房间名称 根据房间号
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetRoomNameByRoomNo")] public async Task<GetRoomNameByRoomNoDto> GetRoomNameByRoomNoAsync(RoomNoInputDto input) { var roomEnt = await _roomRepository.FirstOrDefaultAsync(f => f.RoomNo == input.RoomNo); if (roomEnt == null) throw new UserFriendlyException("房间号不存在"); var entDto = new GetRoomNameByRoomNoDto { RoomName = roomEnt.DisplayName }; return entDto; }
#region 提供给小程序
/// <summary>
/// 小程序获取当前排队信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetAppQueueRegisterByIdNo")] public async Task<GetAppQueueRegisterByIdNoDto> GetAppQueueRegisterByIdNoAsync(IdNoInputDto input) { var msg = new GetAppQueueRegisterByIdNoDto(); var patientRegisterEnt = (await _patientRegisterRepository.GetQueryableAsync()).Include(x => x.Patient) .Where(m => m.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration && m.CompleteFlag != PatientRegisterCompleteFlag.SumCheck && m.Patient.IdNo == input.IdNo).OrderByDescending(o => o.MedicalStartDate).FirstOrDefault();
if (patientRegisterEnt == null) throw new UserFriendlyException("无人员登记记录或已总检"); //if (patientRegisterEnt.CompleteFlag == PatientRegisterCompleteFlag.PreRegistration)
// throw new UserFriendlyException("当前人员未正式登记");
//if (patientRegisterEnt.CompleteFlag == PatientRegisterCompleteFlag.PreRegistration)
// throw new UserFriendlyException("当前人员已总检");
msg.PatientRegisterNo = patientRegisterEnt.PatientRegisterNo; msg.MobileTelephone = patientRegisterEnt.Patient.MobileTelephone; msg.IdNo = patientRegisterEnt.Patient.IdNo; msg.MaritalStatusName = await _cacheService.GetMaritalStatusNameAsync(patientRegisterEnt.MaritalStatusId); msg.PatientName = patientRegisterEnt.PatientName; msg.Photo = patientRegisterEnt.Photo; msg.SexName = await _cacheService.GetSexNameAsync(patientRegisterEnt.SexId); msg.PatientRegisterId = patientRegisterEnt.Id;
var queueRegisterInfo = await GetQueueRegisterByPatientRegisterIdAsync(new PatientRegisterIdInputDto { PatientRegisterId = patientRegisterEnt.Id }); if (queueRegisterInfo != null) { msg.QueueCount = queueRegisterInfo.QueueCount; msg.RoomName = queueRegisterInfo.RoomName; msg.RoomId = queueRegisterInfo.RoomId; msg.CompleteFlag = queueRegisterInfo.CompleteFlag; }
#region 分诊项目
//登记的所有项目
var registerCheckAsbitemList = (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 == patientRegisterEnt.Id && asbitem.IsCheck == 'Y' orderby itemTypeHaveEmpty.DisplayOrder, asbitem.DisplayOrder ascending select new { asbitemId = asbitem.Id, registerCheckId = registerCheck.Id, isGiveUp = registerCheck.CompleteFlag == RegisterCheckCompleteFlag.GiveUpChecked ? 'Y' : 'N', asbitemName = asbitem.DisplayName }).ToList();
//分诊过的项目
var queueRegisterList = (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 == patientRegisterEnt.Id select new { completeFlag = queueRegister.CompleteFlag, roomName = room.DisplayName, asbitemId = roomDetail.AsbitemId }).ToList();
List<TriageAsbitemDetailDto> triageAsbitemDetailList = new List<TriageAsbitemDetailDto>();
foreach (var item in registerCheckAsbitemList) { var triageAsbitemDetail = new TriageAsbitemDetailDto { AsbitemName = item.asbitemName, IsGiveUp = item.isGiveUp, RegisterCheckId = item.registerCheckId };
var queueRegisterAsbitem = queueRegisterList.FirstOrDefault(f => f.asbitemId == item.asbitemId); if (queueRegisterAsbitem != null) { triageAsbitemDetail.CompleteFlag = queueRegisterAsbitem.completeFlag; triageAsbitemDetail.RoomName = queueRegisterAsbitem.roomName; }
triageAsbitemDetailList.Add(triageAsbitemDetail); }
msg.TriageAsbitemDetail = triageAsbitemDetailList;
#endregion
return msg; }
/// <summary>
/// 放弃项目
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/CreateGiveUpAsbitem")] public async Task<SmallProgramResultDto> CreateGiveUpAsbitemAsync(CreateGiveUpAsbitemInputDto input) { var registerCheckEnt = await _registerCheckRepository.FirstOrDefaultAsync(f => f.Id == input.RegisterCheckId); if (registerCheckEnt == null) { throw new UserFriendlyException("检查项目不存在"); }
if (registerCheckEnt.CompleteFlag == RegisterCheckCompleteFlag.Checked) { throw new UserFriendlyException("项目已检查,无法操作"); }
if (input.IsGiveUp == 'Y') { registerCheckEnt.CompleteFlag = RegisterCheckCompleteFlag.GiveUpChecked; await _registerCheckRepository.UpdateAsync(registerCheckEnt); } else if (input.IsGiveUp == 'N') { registerCheckEnt.CompleteFlag = RegisterCheckCompleteFlag.UnChecked; await _registerCheckRepository.UpdateAsync(registerCheckEnt); }
return new SmallProgramResultDto { IsSuccess = true }; }
/// <summary>
/// 创建新的项目分诊
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/CreateNewAsbitemTriage")] public async Task<SmallProgramResultDto> CreateNewAsbitemTriageAsync(CreateNewAsbitemTriageInputDto input) {
//当前排队的组合项目id集合
var asbitemIds = (from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join roomDetail in await _roomDetailRepository.GetQueryableAsync() on queueRegister.RoomId equals roomDetail.RoomId where queueRegister.PatientRegisterId == input.PatientRegisterId && roomDetail.RoomId == input.RoomId select new { queueRegister, roomDetail.AsbitemId }).ToList();
if (!asbitemIds.Any()) { throw new UserFriendlyException("无排队信息"); }
//删除排队操作
await _queueRegisterRepository.DeleteAsync(d => d.PatientRegisterId == input.PatientRegisterId && d.CompleteFlag != QueueRegisterCompleteFlag.AlreadyCalled, true);
var entity = await _queueRegisterManager.AutomaticQueuingRoomAsync(input.PatientRegisterId, asbitemIds.Select(s => s.AsbitemId).ToList());
await _queueRegisterRepository.InsertAsync(entity, true);
return new SmallProgramResultDto { IsSuccess = true };
} #endregion
#region 分诊屏
/// <summary>
/// 获取人员信息根据条码号
/// </summary>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetTriageScreenPatientRegisterByPatientRegisterNo")] public async Task<GetTriageScreenPatientRegisterByPatientRegisterNoDto> GetTriageScreenPatientRegisterByPatientRegisterNoAsync(PatientRegisterNoInputDto input) { var patientRegisterQuery = from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id select new { patientRegister, patient }; if (!string.IsNullOrWhiteSpace(input.PatientRegisterNo)) { patientRegisterQuery = patientRegisterQuery.Where(m => m.patientRegister.PatientRegisterNo == input.PatientRegisterNo); } if (!string.IsNullOrWhiteSpace(input.PatientNo)) { patientRegisterQuery = patientRegisterQuery.Where(m => m.patient.PatientNo == input.PatientNo); } if (!string.IsNullOrWhiteSpace(input.IdNo)) { patientRegisterQuery = patientRegisterQuery.Where(m => m.patient.IdNo == input.IdNo); }
var patientRegisterFirst = await patientRegisterQuery.FirstOrDefaultAsync(); if (patientRegisterFirst == null) { throw new UserFriendlyException("人员不存在"); }
var entDto = new GetTriageScreenPatientRegisterByPatientRegisterNoDto { MedicalStartDate = DataHelper.ConversionDateShortToString(patientRegisterFirst.patientRegister.MedicalStartDate), MobileTelephone = patientRegisterFirst.patient.MobileTelephone, PatientName = patientRegisterFirst.patientRegister.PatientName, PatientRegisterId = patientRegisterFirst.patientRegister.Id };
return entDto;
}
/// <summary>
/// 获取当前人员排队信息
/// </summary>
/// <returns></returns>
[HttpPost("api/app/QueueRegister/GetTriageScreenPatientRegisterQueueInfo")] public async Task<GetTriageScreenPatientRegisterQueueInfoDto> GetTriageScreenPatientRegisterQueueInfoAsync(PatientRegisterNoInputDto input) {
var patientRegisterQuery = from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id select new { patientRegister, patient }; if (!string.IsNullOrWhiteSpace(input.PatientRegisterNo)) { patientRegisterQuery = patientRegisterQuery.Where(m => m.patientRegister.PatientRegisterNo == input.PatientRegisterNo); } if (!string.IsNullOrWhiteSpace(input.PatientNo)) { patientRegisterQuery = patientRegisterQuery.Where(m => m.patient.PatientNo == input.PatientNo); } if (!string.IsNullOrWhiteSpace(input.IdNo)) { patientRegisterQuery = patientRegisterQuery.Where(m => m.patient.IdNo == input.IdNo); }
var patientRegisterFirst = await patientRegisterQuery.FirstOrDefaultAsync(); if (patientRegisterFirst == null) { throw new UserFriendlyException("人员不存在"); }
var queueRegisterEnt = (from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join room in await _roomRepository.GetQueryableAsync() on queueRegister.RoomId equals room.Id join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on queueRegister.PatientRegisterId equals patientRegister.Id where queueRegister.PatientRegisterId == patientRegisterFirst.patientRegister.Id && queueRegister.CreationTime >= DateTime.Now.Date orderby queueRegister.CreationTime descending select new { queueRegister, room, patientName = patientRegister.PatientName, isVip = patientRegister.IsVip, }).FirstOrDefault(); if (queueRegisterEnt != null) { var queueCount = await (from queueRegister in await _queueRegisterRepository.GetQueryableAsync() join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on queueRegister.PatientRegisterId equals patientRegister.Id where queueRegister.RoomId == queueRegisterEnt.queueRegister.RoomId && queueRegister.CompleteFlag == QueueRegisterCompleteFlag.Wait && queueRegister.CreationTime >= DateTime.Now.Date && queueRegister.DisplayOrder < queueRegisterEnt.queueRegister.DisplayOrder && queueRegister.NoCompleteReason == '0' select queueRegister).CountAsync();
var entDto = new GetTriageScreenPatientRegisterQueueInfoDto {
RoomName = queueRegisterEnt.room.DisplayName, QueueCount = queueCount, PatientName = queueRegisterEnt.patientName, QueueNum = queueRegisterEnt.queueRegister.DisplayOrder.ToString() };
return entDto; } else { throw new UserFriendlyException("当前无排队信息"); }
}
#endregion
}}
|