diff --git a/IRC.Core.SCP/Service/CStoreSCPService.cs b/IRC.Core.SCP/Service/CStoreSCPService.cs index 462bad2e2..c173a9caa 100644 --- a/IRC.Core.SCP/Service/CStoreSCPService.cs +++ b/IRC.Core.SCP/Service/CStoreSCPService.cs @@ -190,9 +190,7 @@ namespace IRaCIS.Core.SCP.Service var _dictionaryRepository = _serviceProvider.GetService>(); var _seriesRepository = _serviceProvider.GetService>(); var _studyRepository = _serviceProvider.GetService>(); - var _studyGroupRepository = _serviceProvider.GetService>(); - var _cmoveStudyRepository = _serviceProvider.GetService>(); var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList(); var seriesModalityList = _seriesRepository.Where(t => _SCPStudyIdList.Contains(t.StudyId)).Select(t => new { SCPStudyId = t.StudyId, t.Modality, t.StudyInstanceUid }).ToList(); @@ -220,34 +218,7 @@ namespace IRaCIS.Core.SCP.Service await _studyRepository.BatchUpdateNoTrackingAsync(t => t.Id == g.Key.SCPStudyId, u => new SCPStudy() { Modalities = modality, ModalityForEdit = modalityForEdit }); - //添加课题组标签 - if (CurrentHospitalGroup != null) - { - if (!_studyGroupRepository.Any(t => t.SCPStudyId == g.Key.SCPStudyId && t.HospitalGroupId == CurrentHospitalGroup.Id)) - { - await _studyGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = g.Key.SCPStudyId, HospitalGroupId = CurrentHospitalGroup.Id }); - } - } - else - { - var findCmoveInfo = _cmoveStudyRepository.Where(t => t.StudyInstanceUIDList.Any(c => c == g.Key.StudyInstanceUid)).OrderByDescending(t => t.CreateTime).FirstOrDefault(); - if (findCmoveInfo != null) - { - foreach (var item in findCmoveInfo.HopitalGroupIdList) - { - if (!_studyGroupRepository.Any(t => t.SCPStudyId == g.Key.SCPStudyId && t.HospitalGroupId == item)) - { - await _studyGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = g.Key.SCPStudyId, HospitalGroupId = item }); - - } - } - } - else - { - Log.Logger.Warning($"未找到{g.Key.StudyInstanceUid}的Cmove记录"); - } - } } @@ -319,6 +290,9 @@ namespace IRaCIS.Core.SCP.Service var ossService = _serviceProvider.GetService(); var dicomArchiveService = _serviceProvider.GetService(); var _seriesRepository = _serviceProvider.GetService>(); + var _studyGroupRepository = _serviceProvider.GetService>(); + + var _cmoveStudyRepository = _serviceProvider.GetService>(); var _distributedLockProvider = _serviceProvider.GetService(); @@ -422,6 +396,39 @@ namespace IRaCIS.Core.SCP.Service if (!_SCPStudyIdList.Contains(scpStudyId)) { _SCPStudyIdList.Add(scpStudyId); + + #region 给检查打课题组标签 + + //添加课题组标签 + if (CurrentHospitalGroup != null) + { + if (!_studyGroupRepository.Any(t => t.SCPStudyId == scpStudyId && t.HospitalGroupId == CurrentHospitalGroup.Id)) + { + await _studyGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = scpStudyId, HospitalGroupId = CurrentHospitalGroup.Id }); + } + } + else + { + var findCmoveInfo = _cmoveStudyRepository.Where(t => t.StudyInstanceUIDList.Any(c => c == studyInstanceUid)).OrderByDescending(t => t.CreateTime).FirstOrDefault(); + + if (findCmoveInfo != null) + { + foreach (var item in findCmoveInfo.HopitalGroupIdList) + { + if (!_studyGroupRepository.Any(t => t.SCPStudyId == scpStudyId && t.HospitalGroupId == item)) + { + await _studyGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = scpStudyId, HospitalGroupId = item }); + + } + } + } + else + { + Log.Logger.Warning($"未找到{studyInstanceUid}的Cmove记录"); + } + } + #endregion + } var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId); diff --git a/IRaCIS.Core.API/appsettings.Test_HIR.json b/IRaCIS.Core.API/appsettings.Test_HIR.json index 093dc9938..c2b5e67d4 100644 --- a/IRaCIS.Core.API/appsettings.Test_HIR.json +++ b/IRaCIS.Core.API/appsettings.Test_HIR.json @@ -42,7 +42,7 @@ "IsNeedChangePassWord": true, // 密码有效期(天),到期后必须修改 "ChangePassWordDays": 1000, - "OpenImageShare": true, + "OpenImageShare": true }, "SystemEmailSendConfig": { diff --git a/IRaCIS.Core.API/appsettings.Uat_HIR.json b/IRaCIS.Core.API/appsettings.Uat_HIR.json index e3293cd39..87bd29ced 100644 --- a/IRaCIS.Core.API/appsettings.Uat_HIR.json +++ b/IRaCIS.Core.API/appsettings.Uat_HIR.json @@ -36,20 +36,12 @@ "AutoLoginOutMinutes": 120, "AESKey": "HIR_System_AES_Key_Info", "CmoveIntervalMinutes": 1, - "CmoveInstanceIntervalMinutes": 1 - }, - "SystemHospitalConfig": { - "HospitalCode": "EI", - "HospitalLogoPath": "/System/GeneralDocuments/1716453306898_图片2.png", - "TrialKeepCount": 60, - "HospitalName": "上海展影医疗科技有限公司", - "HospitalAliasName": "展影医疗", - "Country": "中国", - "City": "上海", - "Province": "上海", - "Address": "上海市杨浦区国泰路复旦科技园", - "Phone": "021-60702575", - "IsCanConnectInternet": false + "CmoveInstanceIntervalMinutes": 1, + // 是否强制用户定期修改密码 + "IsNeedChangePassWord": true, + // 密码有效期(天),到期后必须修改 + "ChangePassWordDays": 1000, + "OpenImageShare": true }, "SystemEmailSendConfig": { "Port": 465, @@ -57,6 +49,7 @@ "FromEmail": "test-study@extimaging.com", "FromName": "Test_HIR", "AuthorizationCode": "zhanying123", - "SiteUrl": "http://hir.test.extimaging.com/login" + "SiteUrl": "http://hir.test.extimaging.com/login", + "EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$" } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs index 35b0f99ed..1467aafd4 100644 --- a/IRaCIS.Core.Application/Service/Management/UserService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserService.cs @@ -491,8 +491,10 @@ namespace IRaCIS.Core.Application.Service .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.OA, t => !t.UserRoleList.Any(t => t.UserTypeEnum == UserTypeEnum.Admin || t.UserTypeEnum == UserTypeEnum.SuperAdmin)) //GA 只能看有该课题组的用户,并且不是admin oa - .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.GA, t => !t.UserRoleList.Any(t => t.UserTypeEnum == UserTypeEnum.Admin || t.UserTypeEnum == UserTypeEnum.SuperAdmin || t.UserTypeEnum == UserTypeEnum.OA) - && t.IdentityUserHospitalGroupList.Any(t => isGAGroupAdmin ? hospitalGroupAdminIdList.Contains(t.HospitalGroupId) : false)) + .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.GA, + t => /*!t.UserRoleList.Any(t => t.UserTypeEnum == UserTypeEnum.Admin || t.UserTypeEnum == UserTypeEnum.SuperAdmin || t.UserTypeEnum == UserTypeEnum.OA) &&*/ + + t.IdentityUserHospitalGroupList.Any(t => isGAGroupAdmin ? hospitalGroupAdminIdList.Contains(t.HospitalGroupId) : false)) .ProjectTo(_mapper.ConfigurationProvider); return await userQueryable.ToPagedListAsync(inQuery); @@ -1042,9 +1044,14 @@ namespace IRaCIS.Core.Application.Service { await _fusionCache.RemoveAsync(CacheKeys.UserToken(identityUserId)); - var userName = await _userRoleRepository.Where(t => t.Id == userRoleId).Select(t => t.UserName).FirstOrDefaultAsync(); + var userName = await _identityUserRepository.Where(t => t.Id == identityUserId).Select(t => t.UserName).FirstOrDefaultAsync(); + + if (userName.IsNotNullOrEmpty()) + { + await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = identityUserId, ActionUserName = userName, OptType = UserOptType.LoginOut }, true); + + } - await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = identityUserId, ActionUserName = userName, OptType = UserOptType.LoginOut }, true); return ResponseOutput.Ok(); } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs index 013482a8a..f2fb44a0d 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs @@ -115,7 +115,7 @@ namespace IRaCIS.Core.Application.Service //之前已经选择的用户 不放在列表中,现在又要改回去 废弃 - var query = _userRoleRepository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin && t.UserTypeEnum != UserTypeEnum.Admin && t.UserTypeEnum != UserTypeEnum.OA) + var query = _userRoleRepository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin && t.UserTypeEnum != UserTypeEnum.Admin && t.UserTypeEnum != UserTypeEnum.OA && t.UserTypeEnum != UserTypeEnum.GA) ////正式或者培训的项目 不能允许测试用户(必须正式用户) 同时必须是内部的用户 //.WhereIf(trialType == TrialType.OfficialTrial || trialType == TrialType.Training, t => t.IsTestUser == false && t.IsZhiZhun) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs index 827288e03..4f1258df6 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs @@ -134,7 +134,7 @@ namespace IRaCIS.Core.Application.Service var hospitalInfo = await _fusionCache.GetOrSetAsync(CacheKeys.Hospital, _ => CacheHelper.GetHospitalCode(_hIRHospitalRepository), TimeSpan.FromDays(7)); return await _trialRepository.AsQueryable() //过滤医院,切换会有问题 - .Where(t => t.HospitalId == hospitalInfo.Id) + .WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.Admin, t => t.HospitalId == hospitalInfo.Id) //SuperAdmin Admin OP OA .WhereIf(sap.Contains(_userInfo.UserTypeEnumInt), x => trialState.Contains(x.TrialStatusStr)) diff --git a/IRaCIS.Core.Application/Service/Visit/HospitalGroupService.cs b/IRaCIS.Core.Application/Service/Visit/HospitalGroupService.cs index 96ec3c8b2..bca76026d 100644 --- a/IRaCIS.Core.Application/Service/Visit/HospitalGroupService.cs +++ b/IRaCIS.Core.Application/Service/Visit/HospitalGroupService.cs @@ -81,8 +81,10 @@ public class HospitalGroupService(IRepository _hospitalGroupRepos [HttpPost] public async Task> GetHospitalGroupPageList(HospitalGroupQuery inQuery) { + //GA 只能看到自己是管理员的课题组 var hospitalGroupQueryable = _hospitalGroupRepository + .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.GA, t => t.IdentityUserList.Any(t => t.IdentityUserId == _userInfo.IdentityUserId && t.IsManager && t.IsDisabled == false)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Code), t => t.Code.Contains(inQuery.Code)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Name), t => t.Name.Contains(inQuery.Name)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Affiliation), t => t.Affiliation.Contains(inQuery.Affiliation)) diff --git a/IRaCIS.Core.Application/Service/Visit/PatientService.cs b/IRaCIS.Core.Application/Service/Visit/PatientService.cs index cb9841148..08f0c5b99 100644 --- a/IRaCIS.Core.Application/Service/Visit/PatientService.cs +++ b/IRaCIS.Core.Application/Service/Visit/PatientService.cs @@ -218,7 +218,7 @@ namespace IRaCIS.Application.Services .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialCode), t => t.TrialCode.Contains(inQuery.TrialCode)) //过滤医院,切换会有问题 - .Where(t => t.HospitalId == hospitalInfo.Id) + .WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.Admin, t => t.HospitalId == hospitalInfo.Id) //GA 要过滤课题组 .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.GA && hospitalGroupAdminIdList.Any(), t => hospitalGroupAdminIdList.Contains(t.HospitalGroupId)) .WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.Admin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.OA @@ -757,15 +757,25 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task>> GetPatientJoinTrialInitSelectList(PatientJoinTrialInitQuery inQuery) { + + var currentUserHospitalGroupList = _identityUserRepository.Where(t => t.Id == _userInfo.IdentityUserId).SelectMany(t => t.IdentityUserHospitalGroupList) + .Where(t => t.IsDisabled == false && t.HospitalGroup.IsEnable).Select(t => new { t.HospitalGroupId, t.IsManager }).ToList(); + + var hospitalGroupAdminIdList = currentUserHospitalGroupList.Where(t => t.IsManager).Select(t => t.HospitalGroupId).ToList(); + var hospitalGroupIdList = currentUserHospitalGroupList.Select(t => t.HospitalGroupId).ToList(); + //排除已参与的项目列表 var exceptQuery = _subjectPatientRepository.Where(t => t.PatientId == inQuery.PatientId).Select(t => t.Subject.TrialId); //患者检查所属的课题组 要和项目进行匹配,否则过滤掉 - var hospitalGroupIdList = await _studyRepository.Where(t => t.PatientId == inQuery.PatientId).SelectMany(t => t.HospitalGroupList).Select(t => t.HospitalGroupId).Distinct().ToListAsync(); + var studyhospitalGroupIdList = await _studyRepository.Where(t => t.PatientId == inQuery.PatientId).SelectMany(t => t.HospitalGroupList).Select(t => t.HospitalGroupId).Distinct().ToListAsync(); - var trialQuery = _trialRepository.Where(t => t.TrialStatusStr == StaticData.TrialState.TrialOngoing && hospitalGroupIdList.Contains(t.HospitalGroupId)) + + var intersection = hospitalGroupIdList.Intersect(studyhospitalGroupIdList).ToList(); + + var trialQuery = _trialRepository.Where(t => t.TrialStatusStr == StaticData.TrialState.TrialOngoing && intersection.Contains(t.HospitalGroupId)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Filter), t => t.ResearchProgramNo.Contains(inQuery.Filter) || t.ExperimentName.Contains(inQuery.Filter)) - .Where(t => t.TrialUserRoleList.Any(c => c.UserId == _userInfo.UserRoleId)) + .Where(t => t.TrialUserRoleList.Any(c => c.UserId == _userInfo.UserRoleId) && t.TrialIdentityUserList.Any(t => t.IdentityUserId == _userInfo.IdentityUserId)) .Where(t => !exceptQuery.Any(c => c == t.Id)).ProjectTo(_mapper.ConfigurationProvider); var list = trialQuery.ToList(); @@ -2593,7 +2603,11 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task> GetPatientOtherStudyList(PatientStudyOtherQuery inQuery) { + + var trialHospitalGroupId = await _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => t.HospitalGroupId).FirstOrDefaultAsync(); + var query = from scpStudy in _studyRepository.Where(t => inQuery.PatientIdList.Contains(t.PatientId) && !t.SCPStudySubjectVisitList.Any(t => (t.SubjectVisitId == inQuery.SujectVisitId || t.SubjectVisit.SubmitState == SubmitStateEnum.Submitted) && t.TrialId == inQuery.TrialId)) + .Where(t => t.HospitalGroupList.Any(t => t.HospitalGroupId == trialHospitalGroupId)) .WhereIf(inQuery.EarliestStudyTime != null, t => t.StudyTime >= inQuery.EarliestStudyTime) .WhereIf(inQuery.LatestStudyTime != null, t => t.StudyTime <= inQuery.LatestStudyTime) .WhereIf(!string.IsNullOrEmpty(inQuery.PatientIdStr), t => t.PatientIdStr.Contains(inQuery.PatientIdStr)) @@ -2718,7 +2732,10 @@ namespace IRaCIS.Application.Services // }); #endregion + var trialHospitalGroupId = await _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => t.HospitalGroupId).FirstOrDefaultAsync(); + var query = from scpStudy in _studyRepository.Where(t => !t.SCPStudySubjectVisitList.Any(t => t.SubjectVisit.SubmitState == SubmitStateEnum.Submitted && t.TrialId == inQuery.TrialId)) + .Where(t => t.HospitalGroupList.Any(t => t.HospitalGroupId == trialHospitalGroupId)) .WhereIf(inQuery.IsBindedVisit == false, t => !t.SCPStudySubjectVisitList.Any(t => t.TrialId == inQuery.TrialId)) .WhereIf(inQuery.IsBindedVisit == true, t => t.SCPStudySubjectVisitList.Any(t => t.TrialId == inQuery.TrialId)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.VisitName), t => t.SCPStudySubjectVisitList.Any(t => t.TrialId == inQuery.TrialId && t.SubjectVisit.VisitName.Contains(inQuery.VisitName))) diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 36b3ccd24..e638eec97 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -300,6 +300,24 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.Ok(); } + [AllowAnonymous] + public async Task NewUserHospitalGroup( + [FromServices] IRepository _SCPStudyHospitalGroupRepository, + [FromServices] IRepository _SCPStudyRepository, Guid hospitalGroupId) + { + + var scpStudyIdList = _SCPStudyRepository.Where().Select(t => t.Id).ToList(); + + foreach (var item in scpStudyIdList) + { + await _SCPStudyHospitalGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = item, HospitalGroupId = hospitalGroupId }); + } + + await _SCPStudyRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(); + } + /// /// 外部人员 中心调研人员维护 ///