Browse Source

叫号

master
wxd 1 year ago
parent
commit
d0303fa76b
  1. 11
      src/Shentun.Peis.Application.Contracts/QueueRegisters/AutomaticQueuingRoomInputDto.cs
  2. 51
      src/Shentun.Peis.Application.Contracts/QueueRegisters/GetQueueRegisterListByRoomIdDto.cs
  3. 20
      src/Shentun.Peis.Application.Contracts/QueueRegisters/ManualQueuingRoomInputDto.cs
  4. 21
      src/Shentun.Peis.Application.Contracts/QueueRegisters/UpdateQueueRegisterStatusInputDto.cs
  5. 4
      src/Shentun.Peis.Application.Contracts/Rooms/BaseRoomDto.cs
  6. 141
      src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs
  7. 127
      src/Shentun.Peis.Domain/QueueRegisters/QueueRegisterManager.cs

11
src/Shentun.Peis.Application.Contracts/QueueRegisters/AutomaticQueuingRoomInputDto.cs

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.QueueRegisters
{
public class AutomaticQueuingRoomInputDto
{
public Guid PatientRegisterId { get; set; }
}
}

51
src/Shentun.Peis.Application.Contracts/QueueRegisters/GetQueueRegisterListByRoomIdDto.cs

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
namespace Shentun.Peis.QueueRegisters
{
public class GetQueueRegisterListByRoomIdDto
{
/// <summary>
/// 候诊列表
/// </summary>
public List<GetQueueRegisterListByRoomIdDetailDto> WaitDetail { get; set; } = new List<GetQueueRegisterListByRoomIdDetailDto>();
/// <summary>
/// 已呼列表
/// </summary>
public List<GetQueueRegisterListByRoomIdDetailDto> AlreadyCalledDetail { get; set; } = new List<GetQueueRegisterListByRoomIdDetailDto>();
/// <summary>
/// 过号列表
/// </summary>
public List<GetQueueRegisterListByRoomIdDetailDto> OverNumberDetail { get; set; } = new List<GetQueueRegisterListByRoomIdDetailDto>();
}
public class GetQueueRegisterListByRoomIdDetailDto
{
/// <summary>
/// 排队ID
/// </summary>
public Guid QueueRegisterId { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string PatientName { get; set; }
/// <summary>
/// 是否VIP Y N
/// </summary>
public char IsVip { get; set; }
/// <summary>
/// 排队号码
/// </summary>
public int QueueRegisterNumber { get; set; }
}
}

20
src/Shentun.Peis.Application.Contracts/QueueRegisters/ManualQueuingRoomInputDto.cs

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
namespace Shentun.Peis.QueueRegisters
{
public class ManualQueuingRoomInputDto
{
/// <summary>
/// 病人登记ID
/// </summary>
public Guid PatientRegisterId { get; set; }
/// <summary>
/// 房间ID
/// </summary>
public Guid RoomId { get; set; }
}
}

21
src/Shentun.Peis.Application.Contracts/QueueRegisters/UpdateQueueRegisterStatusInputDto.cs

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Text;
namespace Shentun.Peis.QueueRegisters
{
public class UpdateQueueRegisterStatusInputDto
{
/// <summary>
/// 排队ID
/// </summary>
public Guid QueueRegisterId { get; set; }
/// <summary>
/// 完成标志 (o=候诊 1=已呼 2=过号)
/// </summary>
public char CompleteFlag { get; set; }
}
}

4
src/Shentun.Peis.Application.Contracts/Rooms/BaseRoomDto.cs

@ -6,10 +6,10 @@ namespace Shentun.Peis.Rooms
{ {
public class BaseRoomDto public class BaseRoomDto
{ {
public Guid Id { get; set; }
public Guid RoomId { get; set; }
public string RoomName { get; set; } public string RoomName { get; set; }
public int DisplayOrder { get; set; }
public decimal QueueTime { get; set; }
} }
} }

141
src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs

@ -15,6 +15,7 @@ using System.Threading.Tasks;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using static NPOI.HSSF.Util.HSSFColor;
namespace Shentun.Peis.QueueRegisters namespace Shentun.Peis.QueueRegisters
{ {
@ -34,6 +35,7 @@ namespace Shentun.Peis.QueueRegisters
private readonly IRepository<Asbitem, Guid> _asbitemRepository; private readonly IRepository<Asbitem, Guid> _asbitemRepository;
private readonly IRepository<RoomDetail> _roomDetailRepository; private readonly IRepository<RoomDetail> _roomDetailRepository;
private readonly CacheService _cacheService; private readonly CacheService _cacheService;
private readonly QueueRegisterManager _queueRegisterManager;
public QueueRegisterAppService( public QueueRegisterAppService(
IRepository<QueueRegister, Guid> queueRegisterRepository, IRepository<QueueRegister, Guid> queueRegisterRepository,
IRepository<ItemType, Guid> itemTypeRepository, IRepository<ItemType, Guid> itemTypeRepository,
@ -43,7 +45,8 @@ namespace Shentun.Peis.QueueRegisters
IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository, IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
IRepository<Asbitem, Guid> asbitemRepository, IRepository<Asbitem, Guid> asbitemRepository,
IRepository<RoomDetail> roomDetailRepository, IRepository<RoomDetail> roomDetailRepository,
CacheService cacheService)
CacheService cacheService,
QueueRegisterManager queueRegisterManager)
{ {
_queueRegisterRepository = queueRegisterRepository; _queueRegisterRepository = queueRegisterRepository;
_itemTypeRepository = itemTypeRepository; _itemTypeRepository = itemTypeRepository;
@ -54,6 +57,7 @@ namespace Shentun.Peis.QueueRegisters
_asbitemRepository = asbitemRepository; _asbitemRepository = asbitemRepository;
_roomDetailRepository = roomDetailRepository; _roomDetailRepository = roomDetailRepository;
_cacheService = cacheService; _cacheService = cacheService;
_queueRegisterManager = queueRegisterManager;
} }
/// <summary> /// <summary>
@ -89,7 +93,7 @@ namespace Shentun.Peis.QueueRegisters
} }
else else
{ {
throw new UserFriendlyException("当前无分诊信息");
return null;
} }
} }
@ -206,18 +210,30 @@ namespace Shentun.Peis.QueueRegisters
[HttpPost("api/app/QueueRegister/GetRoomListByAsbitemId")] [HttpPost("api/app/QueueRegister/GetRoomListByAsbitemId")]
public async Task<List<BaseRoomDto>> GetRoomListByAsbitemIdAsync(AsbitemIdInputDto input) public async Task<List<BaseRoomDto>> GetRoomListByAsbitemIdAsync(AsbitemIdInputDto input)
{ {
var entListDto = (from room in await _roomRepository.GetQueryableAsync()
var query = (from room in await _roomRepository.GetQueryableAsync()
join roomDetail in await _roomDetailRepository.GetQueryableAsync() on room.Id equals roomDetail.RoomId 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 where roomDetail.AsbitemId == input.AsbitemId
orderby room.DisplayOrder ascending orderby room.DisplayOrder ascending
select new BaseRoomDto
select new
{ {
DisplayOrder = room.DisplayOrder,
Id = room.Id,
RoomName = room.DisplayName
roomId = room.Id,
roomName = room.DisplayName,
queueTime = room.QueueTime,
queueRegisterHaveEmpty
}).ToList(); }).ToList();
return entListDto;
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;
} }
@ -231,5 +247,114 @@ namespace Shentun.Peis.QueueRegisters
{ {
await _queueRegisterRepository.DeleteAsync(d => d.Id == input.QueueRegisterId); 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);
var entity = await _queueRegisterManager.ManualQueuingRoomAsync(input.PatientRegisterId, input.RoomId);
await _queueRegisterRepository.InsertAsync(entity);
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);
var entity = await _queueRegisterManager.AutomaticQueuingRoomAsync(input.PatientRegisterId);
await _queueRegisterRepository.InsertAsync(entity);
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
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;
}
} }
} }

127
src/Shentun.Peis.Domain/QueueRegisters/QueueRegisterManager.cs

@ -0,0 +1,127 @@
using log4net.Util;
using Microsoft.EntityFrameworkCore;
using Shentun.Peis.Enums;
using Shentun.Peis.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services;
namespace Shentun.Peis.QueueRegisters
{
public class QueueRegisterManager : DomainService
{
private readonly IRepository<QueueRegister, Guid> _queueRegisterRepository;
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
private readonly IRepository<RoomDetail> _roomDetailRepository;
private readonly IRepository<Room, Guid> _roomRepository;
public QueueRegisterManager(
IRepository<QueueRegister, Guid> queueRegisterRepository,
IRepository<PatientRegister, Guid> patientRegisterRepository,
IRepository<RegisterCheck, Guid> registerCheckRepository,
IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
IRepository<RoomDetail> roomDetailRepository,
IRepository<Room, Guid> roomRepository)
{
_queueRegisterRepository = queueRegisterRepository;
_patientRegisterRepository = patientRegisterRepository;
_registerCheckRepository = registerCheckRepository;
_registerCheckAsbitemRepository = registerCheckAsbitemRepository;
_roomDetailRepository = roomDetailRepository;
_roomRepository = roomRepository;
}
/// <summary>
/// 人员排队
/// </summary>
/// <param name="PatientRegisterId"></param>
/// <param name="RoomId"></param>
/// <returns></returns>
public async Task<QueueRegister> ManualQueuingRoomAsync(Guid PatientRegisterId, Guid RoomId)
{
var maxDisplayOrder = await (await _queueRegisterRepository.GetQueryableAsync())
.Where(m => m.RoomId == RoomId && m.CreationTime >= DateTime.Now.Date)
.MaxAsync(m => m.DisplayOrder);
var queueRegisterEnt = new QueueRegister
{
CompleteFlag = QueueRegisterCompleteFlag.Wait,
DisplayOrder = maxDisplayOrder + 1,
PatientRegisterId = PatientRegisterId,
RoomId = RoomId
};
return queueRegisterEnt;
}
/// <summary>
/// 自动排队
/// </summary>
/// <param name="PatientRegisterId"></param>
/// <returns></returns>
public async Task<QueueRegister> AutomaticQueuingRoomAsync(Guid PatientRegisterId)
{
//获取当前人员登记的所有项目
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 == PatientRegisterId
select registerCheckAsbitem.AsbitemId).ToList();
if (!asbitemIds.Any())
throw new UserFriendlyException("该人员未登记项目");
//获取项目所属房间需要等待的时间
var query = from roomDetail in await _roomDetailRepository.GetQueryableAsync()
join room in await _roomRepository.GetQueryableAsync() on roomDetail.RoomId equals room.Id
join queueRegister in await _queueRegisterRepository.GetQueryableAsync() on room.Id equals queueRegister.RoomId into queueRegisterTemp
from queueRegisterHaveEmpty in queueRegisterTemp.DefaultIfEmpty()
where queueRegisterHaveEmpty.CreationTime >= DateTime.Now.Date && asbitemIds.Contains(roomDetail.AsbitemId)
select new
{
roomId = room.Id,
queueTime = room.QueueTime,
queueRegisterHaveEmpty
};
var roomGroup = query.ToList().GroupBy(g => g.roomId).Select(s => new
{
roomId = s.Key,
queueTime = s.FirstOrDefault().queueTime,
sumQueueTime = s.Count(m => m.queueRegisterHaveEmpty != null) * s.FirstOrDefault().queueTime
}).OrderBy(o => o.sumQueueTime).ThenBy(o => o.queueTime).First();
return await ManualQueuingRoomAsync(PatientRegisterId, roomGroup.roomId);
}
/// <summary>
/// 修改排队人员状态
/// </summary>
/// <param name="QueueRegisterId"></param>
/// <param name="CompleteFlag"></param>
/// <returns></returns>
public async Task<QueueRegister> UpdateQueueRegisterStatusAsync(Guid QueueRegisterId, char CompleteFlag)
{
var queueRegisterEnt = await _queueRegisterRepository.FirstOrDefaultAsync(f => f.Id == QueueRegisterId);
if (queueRegisterEnt == null)
{
throw new UserFriendlyException("排队ID不存在");
}
queueRegisterEnt.CompleteFlag = CompleteFlag;
return queueRegisterEnt;
}
}
}
Loading…
Cancel
Save