diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index bce95b40c..5b8df9988 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -57,6 +57,25 @@ 访视读片任务 + + + 获取手动分配 未分配的Subject列表(IsHaveAssigned 传递false) + + + + + + 批量为 多个Subject 分配医生 手动分配 + + + + + + + 批量取消Subject 分配的医生 + + + 系统模板文档配置表 diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index 5032845f7..b8d6155f0 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -66,7 +66,7 @@ namespace IRaCIS.Core.Application.ViewModel public string SubjectCode { get; set; } = String.Empty; - public bool? IsUrgent { get; set; } + public bool? IsUrgent { get; set; } public string TaskName { get; set; } = String.Empty; @@ -76,12 +76,72 @@ namespace IRaCIS.Core.Application.ViewModel public TaskState? TaskState { get; set; } - public DateTime? BeginAllocateDate { get; set; } + public DateTime? BeginAllocateDate { get; set; } public DateTime? EndAllocateDate { get; set; } } + public class SubjectAssignQuery : PageInput + { + [NotDefault] + public Guid TrialId { get; set; } + public Guid? SiteId { get; set; } + + public Guid? SubjectId { get; set; } + + public string SubjectCode { get; set; } = String.Empty; + + + public Guid? DoctorUserId { get; set; } + + public bool? IsHaveAssigned { get; set; } + + } + + public class SubjectAssignView + { + public Guid TrialId { get; set; } + public Guid SiteId { get; set; } + + public Guid SubjectId { get; set; } + + public String TrialSiteCode { get; set; } = String.Empty; + public string SubjectCode { get; set; } = String.Empty; + + public bool IsAssignDoctorUser { get; set; } + + public List DoctorUserLsit { get; set; } = new List(); + } + + + + public class AssignDoctorView + { + public string UserCode { get; set; } + public string UserName { get; set; } + public string FullName { get; set; } + + public string UserTypeShortName { get; set; } + } + + + + public class AssginSubjectDoctorCommand + { + public Guid TrialId { get; set; } + + public List SubjectIdList { get; set; } + + public List DoctorUserIdList { get; set; } + } + + public class CancelSubjectAssignCommand + { + public Guid TrialId { get; set; } + + public List SubjectIdList { get; set; } + } } diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index eb44430ce..e77dd5e74 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -23,22 +23,28 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _trialRepository; private readonly IRepository _subjectVisitRepository; + private readonly IRepository _subjectRepository; + private readonly IRepository _subjectUserRepository; - public VisitTaskService(IRepository visitTaskRepository, IRepository trialRepository, IRepository subjectVisitRepository) + + public VisitTaskService(IRepository visitTaskRepository, IRepository trialRepository, IRepository subjectVisitRepository, + IRepository subjectRepository, IRepository subjectUserRepository + ) { _visitTaskRepository = visitTaskRepository; _trialRepository = trialRepository; _subjectVisitRepository = subjectVisitRepository; + _subjectRepository = subjectRepository; + _subjectUserRepository = subjectUserRepository; } [HttpPost] public async Task> GetVisitTaskList(VisitTaskQuery queryVisitTask, [FromServices] IVisitTaskHelpeService _visitTaskCommonService) { - var trialId = queryVisitTask.TrialId; - //以前访视未产生任务的,在查询这里要产生 后期维护到一块 + //以前访视未产生任务的,在查询这里要产生 + var svIdList = await _subjectVisitRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.CheckState == CheckStateEnum.CVPassed && t.IsVisitTaskGenerated == false).Select(t => t.Id).ToListAsync(); - var svIdList = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed && t.IsVisitTaskGenerated == false).Select(t => t.Id).ToListAsync(); - await _visitTaskCommonService.GenerateVisitTaskAsync(trialId,svIdList); + await _visitTaskCommonService.GenerateVisitTaskAsync(queryVisitTask.TrialId, svIdList); var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId) @@ -62,16 +68,68 @@ namespace IRaCIS.Core.Application.Service } - ///// - ///// 给医生用户 分配任务 - ///// - ///// - ///// - //public async Task AllocateDoctorUserTask(string queryVisitTaskId) - //{ + /// + /// 获取手动分配 未分配的Subject列表(IsHaveAssigned 传递false) + /// + /// + [HttpPost] + public async Task> GetSubjectAssignList(SubjectAssignQuery querySubjectAssign) + { + var subjectQuery = _subjectRepository.Where(t => t.TrialId == querySubjectAssign.TrialId) + .WhereIf(querySubjectAssign.SiteId != null, t => t.SiteId == querySubjectAssign.SiteId) + .WhereIf(querySubjectAssign.SubjectId != null, t => t.Id == querySubjectAssign.SubjectId) + .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == true, t => t.SubjectDoctorList.Count() > 0) + .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == false, t => t.SubjectDoctorList.Count() == 0) + .WhereIf(querySubjectAssign.DoctorUserId != null, t => t.SubjectDoctorList.Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId)) + .ProjectTo(_mapper.ConfigurationProvider); - //} + var pageList = await subjectQuery.ToPagedListAsync(querySubjectAssign.PageIndex, querySubjectAssign.PageSize, string.IsNullOrWhiteSpace(querySubjectAssign.SortField) ? nameof(querySubjectAssign.SubjectId) : querySubjectAssign.SortField, querySubjectAssign.Asc ); + + return pageList; + } + /// + /// 批量为 多个Subject 分配医生 手动分配 + /// + /// + /// + [HttpPost] + public async Task AssignSubjectDoctor(AssginSubjectDoctorCommand assginSubjectDoctorCommand) + { + foreach (var subjectId in assginSubjectDoctorCommand.SubjectIdList) + { + foreach (var doctorUserId in assginSubjectDoctorCommand.DoctorUserIdList) + { + await _subjectUserRepository.AddAsync(new SubjectUser() { SubjectId = subjectId, DoctorUserId = doctorUserId, AssignTime = DateTime.Now }); + } + await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectId, u => new Subject() { IsAssignDoctorUser = true }); + + } + + await _subjectUserRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(); + } + + /// + /// 批量取消Subject 分配的医生 + /// + /// + [HttpPost] + public async Task CancelSubjectAssignDoctor(CancelSubjectAssignCommand cancelSubjectAssignCommand) + { + foreach (var subjectId in cancelSubjectAssignCommand.SubjectIdList) + { + await _subjectUserRepository.DeleteFromQueryAsync(t=>t.SubjectId== subjectId); + await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectId, u => new Subject() { IsAssignDoctorUser = false }); + } + + + await _subjectUserRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(); + } + } } diff --git a/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs b/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs index cef67fa25..79f5264a5 100644 --- a/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs @@ -16,9 +16,9 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)) .ForMember(o => o.FullName, t => t.MapFrom(u => u.DoctorUser.FullName)) .ForMember(o => o.UserTypeShortName, t => t.MapFrom(u => u.DoctorUser.UserTypeRole.UserTypeShortName)) - .ForMember(o => o.ArmList, t => t.MapFrom(u => u.VisitTaskList.Where(c=>c.TrialId==u.TrialId).Select(t=>t.ArmEnum).Distinct())) + .ForMember(o => o.ArmList, t => t.MapFrom(u => u.VisitTaskList.Where(c => c.TrialId == u.TrialId).Select(t => t.ArmEnum).Distinct())) .ForMember(o => o.TotalTaskCount, t => t.MapFrom(u => u.Trial.VisitTaskList.Count())) - .ForMember(o => o.SelfTaskCount, t => t.MapFrom(u => u.Trial.VisitTaskList.Count(t=>t.DoctorUserId==u.DoctorUserId))); + .ForMember(o => o.SelfTaskCount, t => t.MapFrom(u => u.Trial.VisitTaskList.Count(t => t.DoctorUserId == u.DoctorUserId))); CreateMap() .ForMember(o => o.ArmList, t => t.MapFrom(u => u.VisitTaskList.Where(c => c.TrialId == u.TrialId).Select(t => t.ArmEnum).Distinct())) @@ -39,6 +39,20 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.UserTypeShortName, t => t.MapFrom(u => u.DoctorUser.UserTypeRole.UserTypeShortName)); + CreateMap() + .ForMember(o => o.SubjectId, t => t.MapFrom(u => u.Id)) + .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.TrialSite.TrialSiteCode)) + .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Code)) + .ForMember(o => o.DoctorUserLsit, t => t.MapFrom(u => u.SubjectDoctorList)); + + CreateMap() + .ForMember(o => o.UserCode, t => t.MapFrom(u => u.DoctorUser.UserCode)) + .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)) + .ForMember(o => o.FullName, t => t.MapFrom(u => u.DoctorUser.FullName)) + .ForMember(o => o.UserTypeShortName, t => t.MapFrom(u => u.DoctorUser.UserTypeRole.UserTypeShortName)); + + + CreateMap(); @@ -46,7 +60,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.DoctorUserId, t => t.MapFrom(u => u.Id)) .ForMember(o => o.FullName, t => t.MapFrom(u => u.FullName)); - + } } diff --git a/IRaCIS.Core.Domain/Allocation/SubjectUser.cs b/IRaCIS.Core.Domain/Allocation/SubjectUser.cs new file mode 100644 index 000000000..3ebf95a7c --- /dev/null +++ b/IRaCIS.Core.Domain/Allocation/SubjectUser.cs @@ -0,0 +1,62 @@ + +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2022-06-10 11:59:27 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +using System; +using IRaCIS.Core.Domain.Share; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +namespace IRaCIS.Core.Domain.Models +{ + /// + ///SubjectUser + /// + [Table("SubjectUser")] + public class SubjectUser : Entity, IAuditUpdate, IAuditAdd + { + + /// + /// CreateUserId + /// + [Required] + public Guid CreateUserId { get; set; } + + /// + /// CreateTime + /// + [Required] + public DateTime CreateTime { get; set; } + + /// + /// UpdateTime + /// + [Required] + public DateTime UpdateTime { get; set; } + + /// + /// UpdateUserId + /// + [Required] + public Guid UpdateUserId { get; set; } + + + public DateTime? AssignTime { get; set; } + + /// + /// SubjectId + /// + [Required] + public Guid SubjectId { get; set; } + + public Subject Subject { get; set; } + + + public Guid DoctorUserId { get; set; } + + public User DoctorUser { get; set; } + + + } + +} diff --git a/IRaCIS.Core.Domain/Trial/Enroll.cs b/IRaCIS.Core.Domain/Trial/Enroll.cs index 8782f95e1..7e3df6e34 100644 --- a/IRaCIS.Core.Domain/Trial/Enroll.cs +++ b/IRaCIS.Core.Domain/Trial/Enroll.cs @@ -53,5 +53,8 @@ namespace IRaCIS.Core.Domain.Models public int? Downtime { get; set; } + + public int DoctorTrialState { get; set; } + } } diff --git a/IRaCIS.Core.Domain/Visit/Subject.cs b/IRaCIS.Core.Domain/Visit/Subject.cs index a5f0be6ba..fd8f781cc 100644 --- a/IRaCIS.Core.Domain/Visit/Subject.cs +++ b/IRaCIS.Core.Domain/Visit/Subject.cs @@ -13,8 +13,8 @@ namespace IRaCIS.Core.Domain.Models { public List SubjectVisitList { get; set; } = new List(); + public List SubjectDoctorList { get; set; } = new List(); - [ForeignKey("FinalSubjectVisitId")] public SubjectVisit FinalSubjectVisit { get; set; } @@ -28,9 +28,9 @@ namespace IRaCIS.Core.Domain.Models public Trial Trial { get; set; } [ForeignKey("SiteId")] - public Site Site { get; set; } + public Site Site { get; set; } - public List StudyList { get; set; }=new List (); + public List StudyList { get; set; } = new List(); public string Code { get; set; } public string FirstName { get; set; } = string.Empty; @@ -41,7 +41,7 @@ namespace IRaCIS.Core.Domain.Models [ForeignKey("LatestSubjectVisitId")] public SubjectVisit LatestSubjectVisit { get; set; } - public Guid? LatestSubjectVisitId { get; set; } + public Guid? LatestSubjectVisitId { get; set; } //public bool IsMissingImages { get; set; } = false; @@ -53,18 +53,18 @@ namespace IRaCIS.Core.Domain.Models public string Reason { get; set; } = string.Empty; public bool IsEnrollment { get; set; } - + public DateTime? OutEnrollmentTime { get; set; } public DateTime? VisitOverTime { get; set; } - + public DateTime CreateTime { get; set; } public Guid CreateUserId { get; set; } public DateTime UpdateTime { get; set; } public Guid UpdateUserId { get; set; } - + public string ShortName { get; set; } = String.Empty; @@ -88,5 +88,8 @@ namespace IRaCIS.Core.Domain.Models public DateTime? DeletedTime { get; set; } public Guid? DeleteUserId { get; set; } + + //是否分配了读片医生 + public bool IsAssignDoctorUser{get;set;} } } diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index 4f2064589..b5119609a 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -557,6 +557,8 @@ namespace IRaCIS.Core.Infra.EFCore public virtual DbSet VisitTask { get; set; } + public virtual DbSet SubjectUser { get; set; } + } diff --git a/IRaCIS.Core.Test/DbHelper.ttinclude b/IRaCIS.Core.Test/DbHelper.ttinclude index 51fd9a26f..ad577b233 100644 --- a/IRaCIS.Core.Test/DbHelper.ttinclude +++ b/IRaCIS.Core.Test/DbHelper.ttinclude @@ -4,7 +4,7 @@ public static readonly string ConnectionString = "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_New_Tet;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true"; public static readonly string DbDatabase = "IRaCIS_New_Tet"; //ַ,ƴ - public static readonly string TableName = "VisitTask"; + public static readonly string TableName = "SubjectUser"; //ļ service Ƿҳ } #>