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
{
///
/// 叫号排队
///
[Authorize]
[ApiExplorerSettings(GroupName = "Work")]
[DisableAuditing]
public class QueueRegisterAppService : ApplicationService
{
private readonly IRepository _queueRegisterRepository;
private readonly IRepository _roomRepository;
private readonly IRepository _itemTypeRepository;
private readonly IRepository _patientRegisterRepository;
private readonly IRepository _registerCheckRepository;
private readonly IRepository _registerCheckAsbitemRepository;
private readonly IRepository _asbitemRepository;
private readonly IRepository _roomDetailRepository;
private readonly CacheService _cacheService;
private readonly QueueRegisterManager _queueRegisterManager;
private readonly ILogger _logger;
private readonly SysParmValueManager _sysParmValueManager;
private readonly IRepository _doctorSignInRepository;
private readonly RegisterCheckAppService _registerCheckAppService;
private readonly IRepository _patientRepository;
public QueueRegisterAppService(
IRepository queueRegisterRepository,
IRepository itemTypeRepository,
IRepository roomRepository,
IRepository patientRegisterRepository,
IRepository registerCheckRepository,
IRepository registerCheckAsbitemRepository,
IRepository asbitemRepository,
IRepository roomDetailRepository,
CacheService cacheService,
QueueRegisterManager queueRegisterManager,
ILogger logger,
SysParmValueManager sysParmValueManager,
IRepository doctorSignInRepository,
RegisterCheckAppService registerCheckAppService,
IRepository 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;
}
///
/// 获取当前排队信息
///
///
///
[HttpPost("api/app/QueueRegister/GetQueueRegisterByPatientRegisterId")]
public async Task 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;
}
}
///
/// 获取房间排队信息
///
///
[HttpPost("api/app/QueueRegister/GetRoomQueueList")]
public async Task> 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;
}
}
///
/// 获取未分诊的组合项目 根据人员登记ID (弃检、已检的剔除)
///
///
///
[HttpPost("api/app/QueueRegister/GetNotTriageAsbitemList")]
public async Task> 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;
}
///
/// 获取已分诊的组合项目 根据人员登记ID
///
///
///
[HttpPost("api/app/QueueRegister/GetYesTriageAsbitemList")]
public async Task> 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;
}
///
/// 获取房间信息 根据项目ID
///
///
///
[HttpPost("api/app/QueueRegister/GetRoomListByAsbitemId")]
public async Task> 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;
}
///
/// 取消分诊 删除
///
///
///
[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);
}
///
/// 人工排队房间
///
///
///
[HttpPost("api/app/QueueRegister/ManualQueuingRoom")]
public async Task 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
});
}
///
/// 自动排队房间
///
///
///
[HttpPost("api/app/QueueRegister/AutomaticQueuingRoom")]
public async Task 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());
await _queueRegisterRepository.InsertAsync(entity, true);
return await GetQueueRegisterByPatientRegisterIdAsync(new PatientRegisterIdInputDto
{
PatientRegisterId = input.PatientRegisterId
});
}
///
/// 修改排队人员状态
///
///
///
[HttpPost("api/app/QueueRegister/UpdateQueueRegisterStatus")]
public async Task UpdateQueueRegisterStatusAsync(UpdateQueueRegisterStatusInputDto input)
{
var entity = await _queueRegisterManager.UpdateQueueRegisterStatusAsync(input.QueueRegisterId, input.CompleteFlag);
await _queueRegisterRepository.UpdateAsync(entity);
}
///
/// 获取医生诊台叫号人员列表 根据房间ID
///
///
///
[HttpPost("api/app/QueueRegister/GetQueueRegisterListByRoomId")]
public async Task 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;
}
///
/// 获取叫号屏人员数据
///
///
///
[HttpPost("api/app/QueueRegister/GetScreenQueueRegisterListByRoomNo")]
public async Task 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;
}
///
/// 获取房间名称 根据房间号
///
///
///
[HttpPost("api/app/QueueRegister/GetRoomNameByRoomNo")]
public async Task 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 提供给小程序
///
/// 小程序获取当前排队信息
///
///
///
[HttpPost("api/app/QueueRegister/GetAppQueueRegisterByIdNo")]
public async Task 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 triageAsbitemDetailList = new List();
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;
}
///
/// 放弃项目
///
///
///
[HttpPost("api/app/QueueRegister/CreateGiveUpAsbitem")]
public async Task 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
};
}
///
/// 创建新的项目分诊
///
///
///
[HttpPost("api/app/QueueRegister/CreateNewAsbitemTriage")]
public async Task 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 分诊屏
///
/// 获取人员信息根据条码号
///
///
[HttpPost("api/app/QueueRegister/GetTriageScreenPatientRegisterByPatientRegisterNo")]
public async Task 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;
}
///
/// 获取当前人员排队信息
///
///
[HttpPost("api/app/QueueRegister/GetTriageScreenPatientRegisterQueueInfo")]
public async Task 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
}
}