From a6080b76b1987d28ba87f09a67fa42847b0f8713 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Wed, 25 Dec 2024 11:25:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=A8=E6=88=B7=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 6 +- .../Service/Common/ExcelExportService.cs | 4 +- .../Service/Common/MailService.cs | 2 +- .../Service/Document/TrialDocumentService.cs | 2 +- .../Service/Management/UserService.cs | 6 +- .../Service/SiteSurvey/_MapConfig.cs | 12 +- .../TrialSiteUser/DTO/UserTrialViewModel.cs | 82 +++++- .../Interface/ITrialMaintenanceService.cs | 10 +- .../TrialSiteUser/TrialMaintenanceService.cs | 235 ++++++++++-------- .../Service/TrialSiteUser/TrialSiteService.cs | 8 +- .../Service/TrialSiteUser/_MapConfig.cs | 19 +- .../Service/TrialSiteUser/_MapConfig2.cs | 10 + IRaCIS.Core.Application/TestService.cs | 13 +- IRaCIS.Core.Domain/Management/User.cs | 2 +- .../TrialSiteUser/TrialSiteUser.cs | 2 +- IRaCIS.Core.Domain/TrialSiteUser/TrialUser.cs | 18 +- .../EntityConfigration/SubjectConfigration.cs | 18 +- 17 files changed, 297 insertions(+), 152 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index dd1f29caf..07c9d9684 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -12853,9 +12853,6 @@ - - Setting页面 为 site 勾选CRC用户列表 - Setting页面 项目参与人员勾选列表 @@ -12866,6 +12863,9 @@ + + Setting页面 为 site 勾选CRC用户列表 + 项目参与人员退出 其中IQC退出 回去释放工作量 diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index 7e33870a2..99fd14535 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -123,8 +123,8 @@ namespace IRaCIS.Core.Application.Service.Common t => t.TrialSite.TrialSiteCode.Contains(param.TrialSiteCode)) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.UserId == _userInfo.UserRoleId) - .WhereIf(!string.IsNullOrWhiteSpace(param.UserKeyInfo), t => (t.User.FullName).Contains(param.UserKeyInfo) - || t.User.UserName.Contains(param.UserKeyInfo) || t.User.EMail.Contains(param.UserKeyInfo)) + .WhereIf(!string.IsNullOrWhiteSpace(param.UserKeyInfo), t => (t.UserRole.FullName).Contains(param.UserKeyInfo) + || t.UserRole.UserName.Contains(param.UserKeyInfo) || t.UserRole.EMail.Contains(param.UserKeyInfo)) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); diff --git a/IRaCIS.Core.Application/Service/Common/MailService.cs b/IRaCIS.Core.Application/Service/Common/MailService.cs index 7041e3768..1d5b9ea24 100644 --- a/IRaCIS.Core.Application/Service/Common/MailService.cs +++ b/IRaCIS.Core.Application/Service/Common/MailService.cs @@ -686,7 +686,7 @@ namespace IRaCIS.Core.Application.Service var userTypeEnumList = emailConfigInfo.EmailNoticeUserTypeList.Where(t => t.EmailUserType == EmailUserType.To).Select(t => t.UserType).ToList(); var emailList = await _userRoleRepository.Where(t => userTypeEnumList.Contains(t.UserTypeEnum) && - (isHaveTrialId ? t.UserTrials.Any(t => t.TrialId == feedBack.TrialId) : true)).Select(t => new { t.EMail, t.UserTypeEnum, t.FullName }).ToListAsync(); + (isHaveTrialId ? t.UserRoleTrials.Any(t => t.TrialId == feedBack.TrialId) : true)).Select(t => new { t.EMail, t.UserTypeEnum, t.FullName }).ToListAsync(); foreach (var email in emailList) diff --git a/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs b/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs index dc9ece118..bf0315a1d 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs @@ -820,7 +820,7 @@ namespace IRaCIS.Core.Application.Services DocumentConfirmedUserCount = t.SystemDocConfirmedUserList.Count(), //DocumentUserCount= _trialUserRepository.Where(tu=>tu.TrialId== querySystemDocument.TrialId).Count(u=>t.NeedConfirmedUserTypeList.Any(cc=>cc.NeedConfirmUserTypeId== u.User.UserTypeId )) - DocumentUserCount = t.NeedConfirmedUserTypeList.SelectMany(u => u.UserTypeRole.UserList.SelectMany(b => b.UserTrials.Where(r => r.TrialId == inQuery.TrialId))).Count() + DocumentUserCount = t.NeedConfirmedUserTypeList.SelectMany(u => u.UserTypeRole.UserList.SelectMany(b => b.UserRoleTrials.Where(r => r.TrialId == inQuery.TrialId))).Count() }); var trialDocQueryable = _trialDocumentRepository.Where(t => t.TrialId == inQuery.TrialId).Select(t => new DocumentUnionWithUserStatView() diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs index b3864a38d..37d34c154 100644 --- a/IRaCIS.Core.Application/Service/Management/UserService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserService.cs @@ -534,9 +534,9 @@ namespace IRaCIS.Core.Application.Service identityUserId = identityUserId != Guid.Empty ? identityUserId : _userInfo.IdentityUserId; - var user = await _identityUserRepository.Where(t => t.Id == _userInfo.IdentityUserId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); + var user = await _identityUserRepository.Where(t => t.Id == identityUserId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); - user.AccountList = await _userRoleRepository.Where(t => t.IdentityUserId == _userInfo.IdentityUserId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + user.AccountList = await _userRoleRepository.Where(t => t.IdentityUserId == identityUserId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); return user; } @@ -906,7 +906,7 @@ namespace IRaCIS.Core.Application.Service var userLogQueryable = _userLogRepository.AsQueryable().IgnoreQueryFilters() - .WhereIf(inQuery.TrialId != null, t => t.LoginUser.UserTrials.Any(c => c.TrialId == inQuery.TrialId && (c.UserId == t.LoginUserId || c.UserId == t.OptUserId))) + .WhereIf(inQuery.TrialId != null, t => t.LoginUser.UserRoleTrials.Any(c => c.TrialId == inQuery.TrialId && (c.UserId == t.LoginUserId || c.UserId == t.OptUserId))) .WhereIf(trialCreateTime != null, t => t.CreateTime >= trialCreateTime) .WhereIf(inQuery.OptType != null, t => t.OptType == inQuery.OptType) .WhereIf(inQuery.UserId != null, t => t.LoginUserId == inQuery.UserId) diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/_MapConfig.cs b/IRaCIS.Core.Application/Service/SiteSurvey/_MapConfig.cs index 38de835b5..2c56f3450 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/_MapConfig.cs @@ -22,15 +22,15 @@ namespace IRaCIS.Core.Application.AutoMapper CreateMap() .ForMember(d => d.Id, u => u.Ignore()) - .ForMember(d => d.Phone, u => u.MapFrom(c => c.User.Phone)) - .ForMember(d => d.Email, u => u.MapFrom(c => c.User.EMail)) - .ForMember(d => d.OrganizationName, u => u.MapFrom(c => c.User.OrganizationName)) - .ForMember(d => d.UserTypeId, u => u.MapFrom(c => c.User.UserTypeId)) + .ForMember(d => d.Phone, u => u.MapFrom(c => c.UserRole.Phone)) + .ForMember(d => d.Email, u => u.MapFrom(c => c.UserRole.EMail)) + .ForMember(d => d.OrganizationName, u => u.MapFrom(c => c.UserRole.OrganizationName)) + .ForMember(d => d.UserTypeId, u => u.MapFrom(c => c.UserRole.UserTypeId)) .ForMember(d => d.IsHistoryUser, u => u.MapFrom(c => true)) .ForMember(d => d.IsHistoryUserOriginDeleted, u => u.MapFrom(c => c.IsDeleted)) .ForMember(d => d.IsHistoryUserDeleted, u => u.MapFrom(c => c.IsDeleted)) - .ForMember(d => d.FirstName, u => u.MapFrom(c => c.User.FirstName)) - .ForMember(d => d.LastName, u => u.MapFrom(c => c.User.LastName)) + .ForMember(d => d.FirstName, u => u.MapFrom(c => c.UserRole.FirstName)) + .ForMember(d => d.LastName, u => u.MapFrom(c => c.UserRole.LastName)) .ForMember(d => d.IsGenerateAccount, u => u.MapFrom(c => true)) .ForMember(d => d.IsGenerateSuccess, u => u.MapFrom(c => true)) .ForMember(d => d.SystemUserId, u => u.MapFrom(c => c.UserId)) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs index 53d4b2376..7990e4ce0 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs @@ -88,7 +88,7 @@ namespace IRaCIS.Application.Contracts [ExcelFormat("yyyy-MM-dd")] public DateTime? RemoveTime { get; set; } - public string RemoveTimeStr=> RemoveTime?.ToString("yyyy-MM-dd") ?? string.Empty; + public string RemoveTimeStr => RemoveTime?.ToString("yyyy-MM-dd") ?? string.Empty; //[ExporterHeader(Format = "yyyy-mm-DD")] @@ -122,6 +122,75 @@ namespace IRaCIS.Application.Contracts } + public class TrialIdentityUserDto + { + public Guid Id { get; set; } + + public Guid TrialId { get; set; } + + public Guid IdentityUserId { get; set; } + + public string Phone { get; set; } = String.Empty; + + public string EMail { get; set; } = string.Empty; + + public string OrganizationName { get; set; } = String.Empty; + + public string UserName { get; set; } = String.Empty; + + public string FullName { get; set; } = String.Empty; + + public bool IsDeleted { get; set; } + + + + public DateTime CreateTime { get; set; } + public DateTime UpdateTime { get; set; } + + [ExcelFormat("yyyy-MM-dd")] + public DateTime? RemoveTime { get; set; } + + [ExcelFormat("yyyy-MM-dd")] + public DateTime? JoinTime { get; set; } + + public string JoinTimeStr => JoinTime?.ToString("yyyy-MM-dd") ?? string.Empty; + public string RemoveTimeStr => RemoveTime?.ToString("yyyy-MM-dd") ?? string.Empty; + + + public List TrialUserRoleList { get; set; } + + } + + + public class TrialUserRoleScreeningDto + { + public Guid Id { get; set; } + + public Guid IdentityUserId { get; set; } + + public string Phone { get; set; } = String.Empty; + + public string EMail { get; set; } = string.Empty; + + public string OrganizationName { get; set; } = String.Empty; + + public string UserName { get; set; } = String.Empty; + + public string FullName { get; set; } = String.Empty; + + public bool IsSelect { get; set; } + } + + public class TrialIdentityUserRoleDto + { + public Guid Id { get; set; } + + public bool IsDeleted { get; set; } + + public DateTime CreateTime { get; set; } + public DateTime UpdateTime { get; set; } + } + public class TrialCRCUploadImageList_Export : ExcelExportInfo { @@ -150,19 +219,19 @@ namespace IRaCIS.Application.Contracts /// /// 数据 /// - public object Data { get; set; } + public object Data { get; set; } } public class ExportTemplateServiceDto : ExportTemplateAsyncDto { public IRepository commonDocumentRepository { get; set; } - public IWebHostEnvironment hostEnvironment { get; set; } + public IWebHostEnvironment hostEnvironment { get; set; } public bool IsEnglish { get; set; } } - public class VisitJudgeExportInfo: ExcelExportInfo + public class VisitJudgeExportInfo : ExcelExportInfo { public int VisitCount { get; set; } @@ -409,8 +478,13 @@ namespace IRaCIS.Application.Contracts public class TrialUserAddCommand { + [NotDefault] + public Guid IdentityUserId { get; set; } + + [NotDefault] public Guid UserId { get; set; } + [NotDefault] public Guid TrialId { get; set; } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialMaintenanceService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialMaintenanceService.cs index 99668f051..05dcd4675 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialMaintenanceService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialMaintenanceService.cs @@ -5,10 +5,10 @@ namespace IRaCIS.Application.Interfaces { public interface ITrialMaintenanceService { - Task AddTrialUsers(TrialUserAddCommand[] userTrialCommands); - Task DeleteMaintenanceUser(Guid id, bool isDelete); - Task> GetMaintenanceUserList(TrialMaintenanceQuery param); - Task> GetSiteCRCScreeningList(SiteCRCQuery param); - Task> GetTrialUserScreeningList(TrialUserQuery trialUserQuery); + //Task AddTrialUsers(TrialUserAddCommand[] userTrialCommands); + //Task DeleteMaintenanceUser(Guid id, bool isDelete); + //Task> GetMaintenanceUserList(TrialMaintenanceQuery param); + //Task> GetSiteCRCScreeningList(SiteCRCQuery param); + //Task> GetTrialUserScreeningList(TrialUserQuery trialUserQuery); } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs index 841bb78d4..4ef40427f 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs @@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc; namespace IRaCIS.Core.Application.Service { [ApiExplorerSettings(GroupName = "Trial")] - public class TrialMaintenanceService(IRepository _trialUseRoleRepository, + public class TrialMaintenanceService(IRepository _trialUseRoleRepository, IRepository _trialIdentityUserRepository, IRepository _userRoleRepository, IRepository _trialSiteUserRepository, IRepository _subjectVisitRepository, @@ -23,25 +23,143 @@ namespace IRaCIS.Core.Application.Service .ToListAsync(); } + #region 多账户调整已修改 /// /// Setting页面 获取项目参与人员列表 /// /// /// [HttpPost] - public async Task> GetMaintenanceUserList(TrialMaintenanceQuery inQuery) + public async Task> GetMaintenanceUserList(TrialMaintenanceQuery inQuery) + { + var query = _trialIdentityUserRepository.Where(t => t.TrialId == inQuery.TrialId).IgnoreQueryFilters() + .WhereIf(inQuery.UserTypeId != null, t => t.TrialUserRoleList.Any(t => t.UserRole.UserTypeId == inQuery.UserTypeId)) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserName), t => t.IdentityUser.UserName.Contains(inQuery.UserName)) + + .WhereIf(inQuery.IsDeleted != null, t => t.IsDeleted == inQuery.IsDeleted) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.OrganizationName), t => t.IdentityUser.OrganizationName.Contains(inQuery.OrganizationName)) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserRealName), t => (t.IdentityUser.FullName).Contains(inQuery.UserRealName)) + .ProjectTo(_mapper.ConfigurationProvider); + + return await query.ToPagedListAsync(inQuery, nameof(TrialIdentityUserDto.UpdateTime)); + } + + [TrialGlobalLimit("AfterStopCannNotOpt")] + //[Authorize(Policy = IRaCISPolicy.PM_APM)] + [HttpPut] + public async Task UpdateTrialUser(UpdateTrialUserCommand updateTrialUserCommand) + { + var trialUser = await _trialIdentityUserRepository.Where(t => t.Id == updateTrialUserCommand.Id, true, true).FirstOrDefaultAsync(); + + if (trialUser == null) return Null404NotFound(trialUser); + + + if (updateTrialUserCommand.IsDeleted) + { + if (await _trialSiteUserRepository.AnyAsync(t => t.UserRole.IdentityUserId == trialUser.IdentityUserId && t.TrialId == trialUser.TrialId)) + { + // ----人员已加入现场维护 + return ResponseOutput.NotOk(_localizer["TrialMaint_PersonnelJoined"]); + } + + var findQC = await _trialUseRoleRepository.FirstOrDefaultAsync(t => t.UserRole.IdentityUserId == trialUser.IdentityUserId && t.UserRole.UserTypeEnum == UserTypeEnum.IQC); + + if (findQC != null) + { + await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.CurrentActionUserId == findQC.Id && t.TrialId == trialUser.TrialId && t.IsTake, u => new SubjectVisit() { CurrentActionUserId = null, CurrentActionUserExpireTime = null, IsTake = false }); + } + + } + + _mapper.Map(updateTrialUserCommand, trialUser); + + await _trialUseRoleRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(); + + + } + + + /// Setting页面 项目参与人员勾选列表 + [HttpPost] + public async Task> GetTrialUserScreeningList(TrialUserQuery inQuery) + { + var trialType = _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => t.TrialType).FirstOrDefault(); + + var userTypeEnums = new List() { UserTypeEnum.ClinicalResearchCoordinator, UserTypeEnum.CRA, UserTypeEnum.IQC, UserTypeEnum.APM, UserTypeEnum.MIM, UserTypeEnum.QA, UserTypeEnum.MW, UserTypeEnum.MC }; + + //if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin) + { + userTypeEnums.Add(UserTypeEnum.ProjectManager); + } + + + //之前已经选择的用户 不放在列表中,现在又要改回去 废弃 + var query = _userRoleRepository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin) + + //正式或者培训的项目 不能允许测试用户(必须正式用户) 同时必须是内部的用户 + .WhereIf(trialType == TrialType.OfficialTrial || trialType == TrialType.Training, t => t.IsTestUser == false && t.IsZhiZhun) + + //测试项目 可以加入 测试用户 或者内部正式用户 + .WhereIf(trialType == TrialType.NoneOfficial, t => t.IsTestUser == true || (t.IsTestUser == false && t.IsZhiZhun)) + .Where(t => userTypeEnums.Contains(t.UserTypeEnum)) + .WhereIf(inQuery.UserTypeEnum != null, t => t.UserTypeEnum == inQuery.UserTypeEnum) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserRealName), t => t.IdentityUser.FullName.Contains(inQuery.UserRealName)) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserName), t => t.IdentityUser.UserName.Contains(inQuery.UserName)) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.OrganizationName), t => t.IdentityUser.OrganizationName.Contains(inQuery.OrganizationName)) + .Select(t => new TrialUserRoleScreeningDto() + { + Id = t.Id, + IdentityUserId = t.IdentityUserId, + EMail = t.IdentityUser.EMail, + FullName = t.IdentityUser.FullName, + OrganizationName = t.IdentityUser.OrganizationName, + Phone = t.IdentityUser.Phone, + UserName = t.IdentityUser.UserName, + + IsSelect = t.UserRoleTrials.Any(t => t.TrialId == inQuery.TrialId), + }); + + + return await query.ToPagedListAsync(inQuery); + + } + + #endregion + + + /// + /// Setting页面 批量添加项目参与人员 + /// + /// + /// + //[TrialAudit(AuditType.TrialAudit, AuditOptType.AddTrialStaff)] + [HttpPost] + [TrialGlobalLimit("AfterStopCannNotOpt")] + //[Authorize(Policy = IRaCISPolicy.PM_APM)] + public async Task AddTrialUsers(TrialUserAddCommand[] userTrialCommands) { - var query = _trialUseRoleRepository.Where(t => t.TrialId == inQuery.TrialId).IgnoreQueryFilters() - .WhereIf(inQuery.UserTypeId != null, t => t.UserRole.UserTypeId == inQuery.UserTypeId) - .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserName), t => t.UserRole.UserName.Contains(inQuery.UserName)) + foreach (var item in userTrialCommands.GroupBy(t => t.IdentityUserId)) + { + var currentUserRoleList = item.ToList(); - .WhereIf(inQuery.IsDeleted != null, t => t.IsDeleted == inQuery.IsDeleted) - .WhereIf(!string.IsNullOrWhiteSpace(inQuery.OrganizationName), t => t.UserRole.OrganizationName.Contains(inQuery.OrganizationName)) - .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserRealName), t => (t.UserRole.FullName).Contains(inQuery.UserRealName)) - .ProjectTo(_mapper.ConfigurationProvider); + var addArray = _mapper.Map(currentUserRoleList); - return await query.ToPagedListAsync(inQuery, nameof(TrialMaintenanceDTO.UpdateTime)); + var trialUsers = await _trialIdentityUserRepository.AddRangeAsync(addArray); + + foreach (var trialUser in trialUsers) + { + trialUser.JoinTime = DateTime.Now; + } + + + var success = await _trialUseRoleRepository.SaveChangesAsync(); + + } + + return ResponseOutput.Ok(); } @@ -67,114 +185,19 @@ namespace IRaCIS.Core.Application.Service } - /// Setting页面 项目参与人员勾选列表 - [HttpPost] - public async Task> GetTrialUserScreeningList(TrialUserQuery inQuery) - { - var trialType = _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => t.TrialType).FirstOrDefault(); - - var userTypeEnums = new List() { UserTypeEnum.ClinicalResearchCoordinator, UserTypeEnum.CRA, UserTypeEnum.IQC, UserTypeEnum.APM, UserTypeEnum.MIM, UserTypeEnum.QA, UserTypeEnum.MW, UserTypeEnum.MC }; - - //if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin) - { - userTypeEnums.Add(UserTypeEnum.ProjectManager); - } - - - //之前已经选择的用户 不放在列表中,现在又要改回去 废弃 - var query = _userRoleRepository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin) - - //正式或者培训的项目 不能允许测试用户(必须正式用户) 同时必须是内部的用户 - .WhereIf(trialType == TrialType.OfficialTrial || trialType == TrialType.Training, t => t.IsTestUser == false && t.IsZhiZhun) - - //测试项目 可以加入 测试用户 或者内部正式用户 - .WhereIf(trialType == TrialType.NoneOfficial, t => t.IsTestUser == true || (t.IsTestUser == false && t.IsZhiZhun)) - - - .Where(t => userTypeEnums.Contains(t.UserTypeEnum)) - - - .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserRealName), t => (t.FullName).Contains(inQuery.UserRealName)) - .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserName), t => t.UserName.Contains(inQuery.UserName)) - .WhereIf(!string.IsNullOrWhiteSpace(inQuery.OrganizationName), t => t.OrganizationName.Contains(inQuery.OrganizationName)) - .WhereIf(inQuery.UserTypeEnum != null, t => t.UserTypeEnum == inQuery.UserTypeEnum) - //.WhereIf(_userInfo.IsAdmin, t => t.UserTypeRole.Type == UserTypeGroup.TrialUser) - //.WhereIf(!_userInfo.IsAdmin, t => t.UserTypeRole.Type == UserTypeGroup.TrialUser || t.UserTypeEnum != UserTypeEnum.ProjectManager) - .ProjectTo(_mapper.ConfigurationProvider, new { trialId = inQuery.TrialId }); - - return await query.ToPagedListAsync(inQuery); - - } - - - /// - /// Setting页面 批量添加项目参与人员 - /// - /// - /// - //[TrialAudit(AuditType.TrialAudit, AuditOptType.AddTrialStaff)] - [HttpPost] - [TrialGlobalLimit( "AfterStopCannNotOpt" )] - //[Authorize(Policy = IRaCISPolicy.PM_APM)] - public async Task AddTrialUsers(TrialUserAddCommand[] userTrialCommands) - { - - var addArray = _mapper.Map(userTrialCommands); - - var trialUsers = await _trialUseRoleRepository.AddRangeAsync(addArray); - - foreach (var item in trialUsers) - { - item.JoinTime = DateTime.Now; - } - - - var success = await _trialUseRoleRepository.SaveChangesAsync(); - - return ResponseOutput.Result(success); - } - [TrialGlobalLimit( "AfterStopCannNotOpt" )] - //[Authorize(Policy = IRaCISPolicy.PM_APM)] - [HttpPut] - public async Task UpdateTrialUser(UpdateTrialUserCommand updateTrialUserCommand) - { - var trialUser = await _trialUseRoleRepository.Where(t => t.Id == updateTrialUserCommand.Id, true, true).FirstOrDefaultAsync(); - - if (trialUser == null) return Null404NotFound(trialUser); - if (updateTrialUserCommand.IsDeleted) - { - if (await _trialSiteUserRepository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) - { - // ----人员已加入现场维护 - return ResponseOutput.NotOk(_localizer["TrialMaint_PersonnelJoined"]); - } - - if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) - { - await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.CurrentActionUserId == trialUser.UserId && t.TrialId == trialUser.TrialId && t.IsTake, u => new SubjectVisit() { CurrentActionUserId = null, CurrentActionUserExpireTime = null, IsTake = false }); - } - - } - - _mapper.Map(updateTrialUserCommand, trialUser); - - await _trialUseRoleRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(); - } /// 项目参与人员退出 其中IQC退出 回去释放工作量 //[TrialAudit(AuditType.TrialAudit, AuditOptType.DeleteTrailStaff)] [HttpDelete, Route("{id:guid}/{trialId:guid}/{isDelete:bool}")] - [TrialGlobalLimit( "AfterStopCannNotOpt" )] + [TrialGlobalLimit("AfterStopCannNotOpt")] [UnitOfWork] [Obsolete] public async Task DeleteMaintenanceUser(Guid id, bool isDelete) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs index 2b5c7a822..e34b7cf42 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs @@ -31,8 +31,8 @@ namespace IRaCIS.Core.Application.Services .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteAliasName), t => t.TrialSiteAliasName.Contains(inQuery.TrialSiteAliasName)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), t => t.TrialSiteCode.Contains(inQuery.TrialSiteCode)) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.CRCUserList.Any(k => k.UserId == _userInfo.UserRoleId)) - .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserKeyInfo), t => t.CRCUserList.Any(k => (k.User.FullName).Contains(inQuery.UserKeyInfo) - || k.User.UserName.Contains(inQuery.UserKeyInfo) || k.User.EMail.Contains(inQuery.UserKeyInfo))) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserKeyInfo), t => t.CRCUserList.Any(k => (k.UserRole.FullName).Contains(inQuery.UserKeyInfo) + || k.UserRole.UserName.Contains(inQuery.UserKeyInfo) || k.UserRole.EMail.Contains(inQuery.UserKeyInfo))) .ProjectTo(_mapper.ConfigurationProvider); @@ -53,8 +53,8 @@ namespace IRaCIS.Core.Application.Services .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteAliasName), t => t.TrialSiteAliasName.Contains(inQuery.TrialSiteAliasName)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), t => t.TrialSiteCode.Contains(inQuery.TrialSiteCode)) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.CRCUserList.Any(k => k.UserId == _userInfo.UserRoleId)) - .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserKeyInfo), t => t.CRCUserList.Any(k => (k.User.FullName).Contains(inQuery.UserKeyInfo) - || k.User.UserName.Contains(inQuery.UserKeyInfo) || k.User.EMail.Contains(inQuery.UserKeyInfo))) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserKeyInfo), t => t.CRCUserList.Any(k => (k.UserRole.FullName).Contains(inQuery.UserKeyInfo) + || k.UserRole.UserName.Contains(inQuery.UserKeyInfo) || k.UserRole.EMail.Contains(inQuery.UserKeyInfo))) .ProjectTo(_mapper.ConfigurationProvider, new { isEn_Us = _userInfo.IsEn_Us }); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs index c0a1fad9a..934957d47 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs @@ -100,12 +100,13 @@ namespace IRaCIS.Core.Application.Service CreateMap(); var trialId = Guid.Empty; + CreateMap() .ForMember(d => d.UserRealName, u => u.MapFrom(s => s.FullName)) .ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName)) .ForMember(d => d.UserId, u => u.MapFrom(s => s.Id)) .ForMember(d => d.TrialId, u => u.MapFrom(s => trialId)) - .ForMember(d => d.IsSelect, u => u.MapFrom(t => t.UserTrials.Any(t => t.TrialId == trialId))); + .ForMember(d => d.IsSelect, u => u.MapFrom(t => t.UserRoleTrials.Any(t => t.TrialId == trialId))); CreateMap() @@ -126,7 +127,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count())) .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count())) .ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count())) - .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.User.FullName))); + .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.UserRole.FullName))); #endregion @@ -142,15 +143,15 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count())) .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count())) .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count())) - .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.User.FullName))) + .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.UserRole.FullName))) .ForMember(d => d.CallingAEList, u => u.MapFrom(s => s.TrialSiteDicomAEList.Select(u => u.CallingAE))); //CreateMap(); - CreateMap().IncludeMembers(t => t.User) - .ForMember(d => d.UserType, u => u.MapFrom(s => s.User.UserTypeRole.UserTypeShortName)) - .ForMember(d => d.UserRealName, u => u.MapFrom(s => s.User.FullName)); + CreateMap().IncludeMembers(t => t.UserRole) + .ForMember(d => d.UserType, u => u.MapFrom(s => s.UserRole.UserTypeRole.UserTypeShortName)) + .ForMember(d => d.UserRealName, u => u.MapFrom(s => s.UserRole.FullName)); CreateMap(); #endregion @@ -265,11 +266,11 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(t => t.TrialSiteUserList, u => u.Ignore()); - CreateMap().IncludeMembers(t => t.User) + CreateMap().IncludeMembers(t => t.UserRole) .ForMember(t => t.TrialSiteCode, u => u.MapFrom(c => c.TrialSite.TrialSiteCode)) .ForMember(t => t.TrialSiteAliasName, u => u.MapFrom(c => c.TrialSite.TrialSiteAliasName)) - .ForMember(t => t.UserRealName, u => u.MapFrom(c => c.User.FullName)) - .ForMember(t => t.UserType, u => u.MapFrom(c => c.User.UserTypeRole.UserTypeShortName)); + .ForMember(t => t.UserRealName, u => u.MapFrom(c => c.UserRole.FullName)) + .ForMember(t => t.UserType, u => u.MapFrom(c => c.UserRole.UserTypeRole.UserTypeShortName)); CreateMap(); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs index b6042bd4e..f65511ce3 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs @@ -1,4 +1,5 @@ using AutoMapper; +using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; @@ -51,8 +52,17 @@ namespace IRaCIS.Core.Application.Service CreateMap(); + + + CreateMap(); + + CreateMap(); + + + CreateMap(); + } } diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index e99543dfe..6b78f601a 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -189,27 +189,34 @@ namespace IRaCIS.Core.Application.Service /// public async Task UserTrialUser([FromServices] IRepository _trialIdentityUserRepository, [FromServices] IRepository _trialUserRoleReposiotry) { - var list = _trialUserRoleReposiotry.Where().Select(t => new { t.TrialId, t.UserRole.IdentityUserId, t.JoinTime, t.RemoveTime }).ToList(); + var list = _trialUserRoleReposiotry.Where().Select(t => new { t.TrialId, t.UserRole.IdentityUserId, t.UserId, t.JoinTime, t.RemoveTime }).ToList(); foreach (var item in list.GroupBy(t => new { t.IdentityUserId, t.TrialId })) { + + var id = NewId.NextSequentialGuid(); + var userRoleList = item.ToList(); + var userIdList = item.Select(t => t.UserId).ToList(); + var first = userRoleList.First(); var haveJoin = userRoleList.Any(t => t.JoinTime != null); if (haveJoin) { - await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() { IdentityUserId = item.Key.IdentityUserId, TrialId = item.Key.TrialId, JoinTime = userRoleList.Min(t => t.JoinTime) }); + await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() { Id = id, IdentityUserId = item.Key.IdentityUserId, TrialId = item.Key.TrialId, JoinTime = userRoleList.Min(t => t.JoinTime) }); } else { - await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() { IdentityUserId = item.Key.IdentityUserId, TrialId = item.Key.TrialId, RemoveTime = userRoleList.Max(t => t.RemoveTime) }); + await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() { Id = id, IdentityUserId = item.Key.IdentityUserId, TrialId = item.Key.TrialId, RemoveTime = userRoleList.Max(t => t.RemoveTime) }); } + await _trialUserRoleReposiotry.BatchUpdateNoTrackingAsync(t => t.TrialId == item.Key.TrialId && userIdList.Contains(t.UserId), u => new TrialUserRole() { TrialUserId = id }); + } await _trialIdentityUserRepository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Domain/Management/User.cs b/IRaCIS.Core.Domain/Management/User.cs index be1ef9cb4..bb10f9ffb 100644 --- a/IRaCIS.Core.Domain/Management/User.cs +++ b/IRaCIS.Core.Domain/Management/User.cs @@ -22,7 +22,7 @@ public class UserRole : BaseFullAuditEntity public List SystemDocConfirmedList { get; set; } [JsonIgnore] - public List UserTrials { get; set; } = new List(); + public List UserRoleTrials { get; set; } = new List(); [JsonIgnore] public List VisitTaskList { get; set; } diff --git a/IRaCIS.Core.Domain/TrialSiteUser/TrialSiteUser.cs b/IRaCIS.Core.Domain/TrialSiteUser/TrialSiteUser.cs index 9a6033296..cb2113b78 100644 --- a/IRaCIS.Core.Domain/TrialSiteUser/TrialSiteUser.cs +++ b/IRaCIS.Core.Domain/TrialSiteUser/TrialSiteUser.cs @@ -8,7 +8,7 @@ public class TrialSiteUser : BaseFullDeleteAuditEntity #region 导航属性 [JsonIgnore] [ForeignKey("UserId")] - public UserRole User { get; set; } + public UserRole UserRole { get; set; } [JsonIgnore] [ForeignKey("TrialId")] public Trial Trial { get; set; } diff --git a/IRaCIS.Core.Domain/TrialSiteUser/TrialUser.cs b/IRaCIS.Core.Domain/TrialSiteUser/TrialUser.cs index 54d57d6dd..e31e9ded0 100644 --- a/IRaCIS.Core.Domain/TrialSiteUser/TrialUser.cs +++ b/IRaCIS.Core.Domain/TrialSiteUser/TrialUser.cs @@ -3,7 +3,7 @@ namespace IRaCIS.Core.Domain.Models; [Comment("项目用户角色表")] [Table("TrialUser")] -public class TrialUserRole : BaseFullDeleteAuditEntity +public class TrialUserRole : BaseFullAuditEntity { #region 导航属性 [JsonIgnore] @@ -12,6 +12,11 @@ public class TrialUserRole : BaseFullDeleteAuditEntity [JsonIgnore] [ForeignKey("UserId")] public UserRole UserRole { get; set; } + + [JsonIgnore] + [ForeignKey("TrialUserId")] + public TrialIdentityUser TrialUser { get; set; } + #endregion public Guid UserId { get; set; } @@ -20,6 +25,13 @@ public class TrialUserRole : BaseFullDeleteAuditEntity public DateTime? RemoveTime { get; set; } public DateTime? JoinTime { get; set; } + + + public Guid? DeleteUserId { get; set; } + public bool IsDeleted { get; set; } + public DateTime? DeletedTime { get; set; } + + public Guid TrialUserId { get; set; } } @@ -37,6 +49,10 @@ public class TrialIdentityUser : BaseFullDeleteAuditEntity [ForeignKey("IdentityUserId")] public IdentityUser IdentityUser { get; set; } + [JsonIgnore] + + public List TrialUserRoleList { get; set; } + #endregion diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectConfigration.cs index 2b4260efc..f9b5de915 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectConfigration.cs @@ -82,7 +82,7 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration { //TrialUser 和User 之间 一对多 (一个用户可以参与多个项目) builder.HasOne(s => s.UserRole) - .WithMany(t => t.UserTrials) + .WithMany(t => t.UserRoleTrials) .HasForeignKey(s => s.UserId); //TrialUser User 一对一 创建人 @@ -98,8 +98,22 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration .WithOne(t => t.IdentityUser) .HasForeignKey(s => s.IdentityUserId); - + } } + + + public class TrialIdentityUserConfigration : IEntityTypeConfiguration + { + //当一个实体,针对同一个类,有两个一对一导航属性,但是是不同的外键,一个外键是一对一,一个是一对多,那么需要显示配置一对多的关系 + public void Configure(EntityTypeBuilder builder) + { + builder.HasMany(s => s.TrialUserRoleList) + .WithOne(t => t.TrialUser) + .HasForeignKey(s => s.TrialUserId); + } + } + + }