From d0303fa76bd44a39a63545d69fba27e278fb75a2 Mon Sep 17 00:00:00 2001 From: wxd <123@qq.com> Date: Mon, 22 Jul 2024 11:49:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AB=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AutomaticQueuingRoomInputDto.cs | 11 ++ .../GetQueueRegisterListByRoomIdDto.cs | 51 ++++++ .../ManualQueuingRoomInputDto.cs | 20 +++ .../UpdateQueueRegisterStatusInputDto.cs | 21 +++ .../Rooms/BaseRoomDto.cs | 4 +- .../QueueRegisters/QueueRegisterAppService.cs | 151 ++++++++++++++++-- .../QueueRegisters/QueueRegisterManager.cs | 127 +++++++++++++++ 7 files changed, 370 insertions(+), 15 deletions(-) create mode 100644 src/Shentun.Peis.Application.Contracts/QueueRegisters/AutomaticQueuingRoomInputDto.cs create mode 100644 src/Shentun.Peis.Application.Contracts/QueueRegisters/GetQueueRegisterListByRoomIdDto.cs create mode 100644 src/Shentun.Peis.Application.Contracts/QueueRegisters/ManualQueuingRoomInputDto.cs create mode 100644 src/Shentun.Peis.Application.Contracts/QueueRegisters/UpdateQueueRegisterStatusInputDto.cs create mode 100644 src/Shentun.Peis.Domain/QueueRegisters/QueueRegisterManager.cs diff --git a/src/Shentun.Peis.Application.Contracts/QueueRegisters/AutomaticQueuingRoomInputDto.cs b/src/Shentun.Peis.Application.Contracts/QueueRegisters/AutomaticQueuingRoomInputDto.cs new file mode 100644 index 0000000..db8b3a6 --- /dev/null +++ b/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; } + } +} diff --git a/src/Shentun.Peis.Application.Contracts/QueueRegisters/GetQueueRegisterListByRoomIdDto.cs b/src/Shentun.Peis.Application.Contracts/QueueRegisters/GetQueueRegisterListByRoomIdDto.cs new file mode 100644 index 0000000..2f776a1 --- /dev/null +++ b/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 + { + /// + /// 候诊列表 + /// + public List WaitDetail { get; set; } = new List(); + + /// + /// 已呼列表 + /// + public List AlreadyCalledDetail { get; set; } = new List(); + + /// + /// 过号列表 + /// + public List OverNumberDetail { get; set; } = new List(); + + } + + + + public class GetQueueRegisterListByRoomIdDetailDto + { + /// + /// 排队ID + /// + public Guid QueueRegisterId { get; set; } + + /// + /// 姓名 + /// + public string PatientName { get; set; } + + /// + /// 是否VIP Y N + /// + public char IsVip { get; set; } + + /// + /// 排队号码 + /// + public int QueueRegisterNumber { get; set; } + } +} diff --git a/src/Shentun.Peis.Application.Contracts/QueueRegisters/ManualQueuingRoomInputDto.cs b/src/Shentun.Peis.Application.Contracts/QueueRegisters/ManualQueuingRoomInputDto.cs new file mode 100644 index 0000000..d1b8607 --- /dev/null +++ b/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 + { + /// + /// 病人登记ID + /// + public Guid PatientRegisterId { get; set; } + + /// + /// 房间ID + /// + public Guid RoomId { get; set; } + } +} diff --git a/src/Shentun.Peis.Application.Contracts/QueueRegisters/UpdateQueueRegisterStatusInputDto.cs b/src/Shentun.Peis.Application.Contracts/QueueRegisters/UpdateQueueRegisterStatusInputDto.cs new file mode 100644 index 0000000..ca326c0 --- /dev/null +++ b/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 + { + /// + /// 排队ID + /// + public Guid QueueRegisterId { get; set; } + + /// + /// 完成标志 (o=候诊 1=已呼 2=过号) + /// + public char CompleteFlag { get; set; } + } +} diff --git a/src/Shentun.Peis.Application.Contracts/Rooms/BaseRoomDto.cs b/src/Shentun.Peis.Application.Contracts/Rooms/BaseRoomDto.cs index 504aa22..0c55a5c 100644 --- a/src/Shentun.Peis.Application.Contracts/Rooms/BaseRoomDto.cs +++ b/src/Shentun.Peis.Application.Contracts/Rooms/BaseRoomDto.cs @@ -6,10 +6,10 @@ namespace Shentun.Peis.Rooms { public class BaseRoomDto { - public Guid Id { get; set; } + public Guid RoomId { get; set; } public string RoomName { get; set; } - public int DisplayOrder { get; set; } + public decimal QueueTime { get; set; } } } diff --git a/src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs b/src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs index e31e68e..5f4e2e3 100644 --- a/src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs +++ b/src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs @@ -15,6 +15,7 @@ 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 { @@ -34,6 +35,7 @@ namespace Shentun.Peis.QueueRegisters private readonly IRepository _asbitemRepository; private readonly IRepository _roomDetailRepository; private readonly CacheService _cacheService; + private readonly QueueRegisterManager _queueRegisterManager; public QueueRegisterAppService( IRepository queueRegisterRepository, IRepository itemTypeRepository, @@ -43,7 +45,8 @@ namespace Shentun.Peis.QueueRegisters IRepository registerCheckAsbitemRepository, IRepository asbitemRepository, IRepository roomDetailRepository, - CacheService cacheService) + CacheService cacheService, + QueueRegisterManager queueRegisterManager) { _queueRegisterRepository = queueRegisterRepository; _itemTypeRepository = itemTypeRepository; @@ -54,6 +57,7 @@ namespace Shentun.Peis.QueueRegisters _asbitemRepository = asbitemRepository; _roomDetailRepository = roomDetailRepository; _cacheService = cacheService; + _queueRegisterManager = queueRegisterManager; } /// @@ -89,7 +93,7 @@ namespace Shentun.Peis.QueueRegisters } else { - throw new UserFriendlyException("当前无分诊信息"); + return null; } } @@ -206,18 +210,30 @@ namespace Shentun.Peis.QueueRegisters [HttpPost("api/app/QueueRegister/GetRoomListByAsbitemId")] public async Task> GetRoomListByAsbitemIdAsync(AsbitemIdInputDto input) { - var entListDto = (from room in await _roomRepository.GetQueryableAsync() - join roomDetail in await _roomDetailRepository.GetQueryableAsync() on room.Id equals roomDetail.RoomId - where roomDetail.AsbitemId == input.AsbitemId - orderby room.DisplayOrder ascending - select new BaseRoomDto - { - DisplayOrder = room.DisplayOrder, - Id = room.Id, - RoomName = room.DisplayName - }).ToList(); + 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(); - 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); } + + /// + /// 人工排队房间 + /// + /// + /// + [HttpPost("api/app/QueueRegister/ManualQueuingRoom")] + public async Task 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 + }); + } + + + /// + /// 自动排队房间 + /// + /// + /// + [HttpPost("api/app/QueueRegister/AutomaticQueuingRoom")] + public async Task 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 + }); + + } + + + /// + /// 修改排队人员状态 + /// + /// + /// + [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(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; + } } } diff --git a/src/Shentun.Peis.Domain/QueueRegisters/QueueRegisterManager.cs b/src/Shentun.Peis.Domain/QueueRegisters/QueueRegisterManager.cs new file mode 100644 index 0000000..1a4c36a --- /dev/null +++ b/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 _queueRegisterRepository; + private readonly IRepository _patientRegisterRepository; + private readonly IRepository _registerCheckRepository; + private readonly IRepository _registerCheckAsbitemRepository; + private readonly IRepository _roomDetailRepository; + private readonly IRepository _roomRepository; + + public QueueRegisterManager( + IRepository queueRegisterRepository, + IRepository patientRegisterRepository, + IRepository registerCheckRepository, + IRepository registerCheckAsbitemRepository, + IRepository roomDetailRepository, + IRepository roomRepository) + { + _queueRegisterRepository = queueRegisterRepository; + _patientRegisterRepository = patientRegisterRepository; + _registerCheckRepository = registerCheckRepository; + _registerCheckAsbitemRepository = registerCheckAsbitemRepository; + _roomDetailRepository = roomDetailRepository; + _roomRepository = roomRepository; + } + /// + /// 人员排队 + /// + /// + /// + /// + public async Task 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; + } + + /// + /// 自动排队 + /// + /// + /// + public async Task 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); + + } + + /// + /// 修改排队人员状态 + /// + /// + /// + /// + public async Task 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; + } + } +}