diff --git a/IRC.Core.SCP/Service/BaseService.cs b/IRC.Core.SCP/Service/BaseService.cs index a10e9bf9c..e1a97e0b9 100644 --- a/IRC.Core.SCP/Service/BaseService.cs +++ b/IRC.Core.SCP/Service/BaseService.cs @@ -26,7 +26,6 @@ namespace IRaCIS.Core.SCP.Service public IUserInfo _userInfo { get; set; } - public IRepository _repository { get; set; } public IStringLocalizer _localizer { get; set; } @@ -51,9 +50,6 @@ namespace IRaCIS.Core.SCP.Service [MemberNotNull(nameof(_userInfo))] public IUserInfo _userInfo { get; set; } - [MemberNotNull(nameof(_repository))] - public IRepository _repository { get; set; } - [MemberNotNull(nameof(_localizer))] public IStringLocalizer _localizer { get; set; } @@ -75,8 +71,7 @@ namespace IRaCIS.Core.SCP.Service [MemberNotNull(nameof(_userInfo))] public IUserInfo _userInfo { get; set; } - [MemberNotNull(nameof(_repository))] - public IRepository _repository { get; set; } + [MemberNotNull(nameof(_localizer))] public IStringLocalizer _localizer { get; set; } @@ -93,8 +88,6 @@ namespace IRaCIS.Core.SCP.Service public IUserInfo _userInfo { get; set; } - public IRepository _repository { get; set; } - public IStringLocalizer _localizer { get; set; } public static IResponseOutput Null404NotFound(TEntity? businessObject) where TEntity : class diff --git a/IRC.Core.SCP/Service/CStoreSCPService.cs b/IRC.Core.SCP/Service/CStoreSCPService.cs index 6cfb381ad..86c09af4e 100644 --- a/IRC.Core.SCP/Service/CStoreSCPService.cs +++ b/IRC.Core.SCP/Service/CStoreSCPService.cs @@ -301,7 +301,7 @@ namespace IRaCIS.Core.SCP.Service { try { - var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(request.Dataset, _trialId, _trialSiteId, storeRelativePath, Association.CallingAE, Association.CalledAE); + var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(request.Dataset, _trialId, _trialSiteId, storeRelativePath, Association.CallingAE, Association.CalledAE,fileSize); if (!_SCPStudyIdList.Contains(scpStudyId)) { diff --git a/IRC.Core.SCP/Service/DicomArchiveService.cs b/IRC.Core.SCP/Service/DicomArchiveService.cs index ee456af4a..ac0edd173 100644 --- a/IRC.Core.SCP/Service/DicomArchiveService.cs +++ b/IRC.Core.SCP/Service/DicomArchiveService.cs @@ -12,6 +12,7 @@ using IRaCIS.Core.SCP.Service; using IRaCIS.Core.Infra.EFCore; using MassTransit; using System.Runtime.Intrinsics.X86; +using Serilog.Sinks.File; namespace IRaCIS.Core.SCP.Service { @@ -51,7 +52,7 @@ namespace IRaCIS.Core.SCP.Service /// /// /// - public async Task ArchiveDicomFileAsync(DicomDataset dataset, Guid trialId, Guid trialSiteId, string fileRelativePath, string callingAE, string calledAE) + public async Task ArchiveDicomFileAsync(DicomDataset dataset, Guid trialId, Guid trialSiteId, string fileRelativePath, string callingAE, string calledAE,long fileSize) { string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID); string seriesInstanceUid = dataset.GetString(DicomTag.SeriesInstanceUID); @@ -270,7 +271,10 @@ namespace IRaCIS.Core.SCP.Service WindowCenter = dataset.GetSingleValueOrDefault(DicomTag.WindowCenter, string.Empty), WindowWidth = dataset.GetSingleValueOrDefault(DicomTag.WindowWidth, string.Empty), - Path = fileRelativePath + Path = fileRelativePath, + + FileSize= fileSize, + }; ++findStudy.InstanceCount; @@ -300,7 +304,7 @@ namespace IRaCIS.Core.SCP.Service } else { - await _instanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == instanceId, u => new SCPInstance() { Path = fileRelativePath }); + await _instanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == instanceId, u => new SCPInstance() { Path = fileRelativePath,FileSize=fileSize }); } //await _studyRepository.SaveChangesAsync(); diff --git a/IRC.Core.SCP/Service/Interface/IDicomArchiveService.cs b/IRC.Core.SCP/Service/Interface/IDicomArchiveService.cs index 1c107e94b..99312ef4f 100644 --- a/IRC.Core.SCP/Service/Interface/IDicomArchiveService.cs +++ b/IRC.Core.SCP/Service/Interface/IDicomArchiveService.cs @@ -5,7 +5,7 @@ namespace IRaCIS.Core.SCP.Service { public interface IDicomArchiveService { - Task ArchiveDicomFileAsync(DicomDataset dicomDataset,Guid trialId,Guid trialSiteId, string fileRelativePath,string callingAE,string calledAE); + Task ArchiveDicomFileAsync(DicomDataset dicomDataset,Guid trialId,Guid trialSiteId, string fileRelativePath,string callingAE,string calledAE,long fileSize); } } diff --git a/IRC.Core.SCP/appsettings.Prod_IRC_SCP.json b/IRC.Core.SCP/appsettings.Prod_IRC_SCP.json index f204a222f..279ba1efe 100644 --- a/IRC.Core.SCP/appsettings.Prod_IRC_SCP.json +++ b/IRC.Core.SCP/appsettings.Prod_IRC_SCP.json @@ -31,32 +31,18 @@ }, "ConnectionStrings": { - "RemoteNew": "Server=us-prod-mssql-service,1433;Database=US_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true", - "Hangfire": "Server=us-prod-mssql-service,1433;Database=US_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true" + "RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true", + "Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true" }, - "BasicSystemConfig": { - "OpenUserComplexPassword": true, - "OpenSignDocumentBeforeWork": true, - "OpenTrialRelationDelete": true, - - "OpenLoginLimit": true, - "LoginMaxFailCount": 5, - - "LoginFailLockMinutes": 30 - - }, - - "SystemEmailSendConfig": { - "Port": 465, - "Host": "smtp.qiye.aliyun.com", - "FromEmail": "study@extimaging.com", - "FromName": "研究单位阅片系统", - "AuthorizationCode": "zhanying123", - "SiteUrl": "https://study.extimaging.com/login" + "DicomSCPServiceConfig": { + "CalledAEList": [ + "STORESCP" + ], + "ServerPort": 11112 } } diff --git a/IRaCIS.Core.API/Controllers/ExtraController.cs b/IRaCIS.Core.API/Controllers/ExtraController.cs index a4cbf199d..3c9875df9 100644 --- a/IRaCIS.Core.API/Controllers/ExtraController.cs +++ b/IRaCIS.Core.API/Controllers/ExtraController.cs @@ -34,6 +34,7 @@ using DocumentFormat.OpenXml.Spreadsheet; using AutoMapper.QueryableExtensions; using NetTopologySuite.Algorithm; using ZiggyCreatures.Caching.Fusion; +using AlibabaCloud.SDK.Sts20150401; namespace IRaCIS.Api.Controllers { @@ -255,9 +256,9 @@ namespace IRaCIS.Api.Controllers // 验证阅片休息时间 await readingImageTaskService.ResetReadingRestTime(returnModel.Data.BasicInfo.Id); - await _fusionCache.SetAsync(CacheKeys.UserToken(userId) , returnModel.Data.JWTStr, TimeSpan.FromDays(7)); + await _fusionCache.SetAsync(CacheKeys.UserToken(userId), returnModel.Data.JWTStr, TimeSpan.FromDays(7)); - await _fusionCache.SetAsync(CacheKeys.UserAutoLoginOut(userId) , DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes)); + await _fusionCache.SetAsync(CacheKeys.UserAutoLoginOut(userId), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes)); } } @@ -354,6 +355,44 @@ namespace IRaCIS.Api.Controllers } } + [HttpGet("user/getUploadTempToken")] + public IResponseOutput GetUploadTempToken([FromServices] IOptionsMonitor options) + { + var ossOptions = options.CurrentValue; + + var client = new Client(new AlibabaCloud.OpenApiClient.Models.Config() + { + AccessKeyId = ossOptions.accessKeyId, + AccessKeySecret = ossOptions.accessKeySecret, + Endpoint = "sts.cn-hangzhou.aliyuncs.com" + }); + + var assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest(); + // 将设置为自定义的会话名称,例如oss-role-session。 + assumeRoleRequest.RoleSessionName = $"session-name-{NewId.NextGuid()}"; + // 将替换为拥有上传文件到指定OSS Bucket权限的RAM角色的ARN。 + assumeRoleRequest.RoleArn = ossOptions.roleArn; + assumeRoleRequest.DurationSeconds = 3600; + var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions(); + var response = client.AssumeRoleWithOptions(assumeRoleRequest, runtime); + var credentials = response.Body.Credentials; + + return ResponseOutput.Ok(new + { + AccessKeyId = credentials.AccessKeyId, + AccessKeySecret = credentials.AccessKeySecret, + Expiration = credentials.Expiration, + SecurityToken = credentials.SecurityToken, + + + Region = ossOptions.region, + BucketName = ossOptions.bucketName, + ViewEndpoint = ossOptions.viewEndpoint, + + }); + } + + [HttpGet("user/GenerateSTS")] public IResponseOutput GenerateSTS([FromServices] IOptionsMonitor options) @@ -428,7 +467,7 @@ namespace IRaCIS.Api.Controllers [HttpGet, Route("ip")] [AllowAnonymous] - public IResponseOutput Get([FromServices] IHttpContextAccessor _context/*, [FromServices] IUserService _userService*/) + public IResponseOutput Get([FromServices] IHttpContextAccessor _context) { StringBuilder sb = new StringBuilder(); @@ -449,7 +488,7 @@ namespace IRaCIS.Api.Controllers [HttpGet, Route("ip2")] [AllowAnonymous] - public IResponseOutput Get2([FromServices] IHttpContextAccessor _context, [FromServices] IRepository _userService) + public IResponseOutput Get2([FromServices] IHttpContextAccessor _context) { StringBuilder sb = new StringBuilder(); diff --git a/IRaCIS.Core.API/Controllers/FinancialChangeController.cs b/IRaCIS.Core.API/Controllers/FinancialChangeController.cs index 0b3b13468..43f02d674 100644 --- a/IRaCIS.Core.API/Controllers/FinancialChangeController.cs +++ b/IRaCIS.Core.API/Controllers/FinancialChangeController.cs @@ -19,18 +19,12 @@ namespace IRaCIS.Core.API.Controllers.Special //谨慎修改 涉及到财务模块 [ApiController, Authorize, ApiExplorerSettings(GroupName = "Financial")] - public class FinancialChangeController : ControllerBase + public class FinancialChangeController( + ITrialService _trialService, + ICalculateService _calculateService, + IStringLocalizer _localizer) : ControllerBase { - private readonly ITrialService _trialService; - private readonly ICalculateService _calculateService; - private IStringLocalizer _localizer { get; set; } - public FinancialChangeController(ITrialService trialService, ICalculateService calculateService, IStringLocalizer localizer - ) - { - _localizer = localizer; - _trialService = trialService; - _calculateService = calculateService; - } + //[TrialAudit(AuditType.TrialAudit, AuditOptType.AddOrUpdateTrial)] diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs index bbeaf4e35..26c8ba83e 100644 --- a/IRaCIS.Core.API/Controllers/InspectionController.cs +++ b/IRaCIS.Core.API/Controllers/InspectionController.cs @@ -26,78 +26,19 @@ namespace IRaCIS.Core.API.Controllers [ApiController, ApiExplorerSettings(GroupName = "Reviewer")] [UnitOfWork] - public class InspectionController : ControllerBase + public class InspectionController( + ITrialDocumentService _trialDocumentService, + IReadingImageTaskService _iReadingImageTaskService, + ITrialConfigService _trialConfigService, + IClinicalAnswerService _clinicalAnswerService, + IReadingClinicalDataService _readingClinicalDataService, + IQCOperationService _qCOperationService, + IInspectionService _inspectionService, + IReadingMedicalReviewService _readingMedicalReviewService, + IReadingMedicineQuestionService _readingMedicineQuestionService + ) : ControllerBase { - private readonly IRepository _repository; - private readonly IMapper _mapper; - private readonly IUserInfo _userInfo; - private readonly ITrialDocumentService _trialDocumentService; - private readonly IQCListService _qCListService; - private readonly IReadingImageTaskService _iReadingImageTaskService; - private readonly IHttpContextAccessor _httpContext; - private readonly ITrialConfigService _trialConfigService; - private readonly INoneDicomStudyService _noneDicomStudyService; - private readonly IClinicalAnswerService _clinicalAnswerService; - private readonly ISubjectService _subjectService; - private readonly IReadingClinicalDataService _readingClinicalDataService; - private readonly ISubjectVisitService _subjectVisitService; - private readonly IQCOperationService _qCOperationService; - private readonly IClinicalDataService _clinicalDataService; - private readonly IVisitPlanService _visitPlanService; - - private readonly IInspectionService _inspectionService; - private readonly IReadingMedicalReviewService _readingMedicalReviewService; - private readonly IReadingMedicineQuestionService _readingMedicineQuestionService; - private readonly IRepository _dataInspectionRepository; - private delegate Task executionFun(dynamic data); - - public InspectionController(IRepository repository, - IRepository _repositoryDataInspection, - IMapper mapper, IUserInfo userInfo, - ITrialDocumentService trialDocumentService, - IRepository dataInspectionRepository, - IQCListService _qCListService, - IReadingImageTaskService _iReadingImageTaskService, - IHttpContextAccessor httpContext, - IInspectionService sinspectionService, - IReadingMedicalReviewService readingMedicalReviewService, - IReadingMedicineQuestionService readingMedicineQuestionService, - ITrialConfigService _trialConfigService, - INoneDicomStudyService noneDicomStudyService, - IClinicalAnswerService clinicalAnswerService, - ISubjectService _subjectService, - IReadingClinicalDataService _readingClinicalDataService, - ISubjectVisitService subjectVisitService, - IQCOperationService qCOperationService, - IClinicalDataService clinicalDataService, - IVisitPlanService visitPlanService - ) - { - this._repository = repository; - this._mapper = mapper; - this._userInfo = userInfo; - this._inspectionService = sinspectionService; - this._readingMedicalReviewService = readingMedicalReviewService; - this._readingMedicineQuestionService = readingMedicineQuestionService; - this._trialDocumentService = trialDocumentService; - this._qCListService = _qCListService; - this._iReadingImageTaskService = _iReadingImageTaskService; - this._httpContext = httpContext; - this._trialConfigService = _trialConfigService; - this._noneDicomStudyService = noneDicomStudyService; - this._clinicalAnswerService = clinicalAnswerService; - this._subjectService = _subjectService; - this._readingClinicalDataService = _readingClinicalDataService; - this._subjectVisitService = subjectVisitService; - this._qCOperationService = qCOperationService; - this._clinicalDataService = clinicalDataService; - this._visitPlanService = visitPlanService; - this._dataInspectionRepository = dataInspectionRepository; - } - - - - + #region 获取稽查数据 /// /// 获取稽查数据 diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 15bcd764f..5f25482bc 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -228,36 +228,14 @@ namespace IRaCIS.Core.API.Controllers [ApiExplorerSettings(GroupName = "Image")] [ApiController] - public class StudyController : UploadBaseController + public class StudyController( + IMediator _mediator, + QCCommon _qCCommon, + IUserInfo _userInfo, + IRepository _subjectVisitRepository, + IStringLocalizer _localizer) : UploadBaseController { - public IMapper _mapper { get; set; } - public IUserInfo _userInfo { get; set; } - - - private readonly IMediator _mediator; - - - - public IStringLocalizer _localizer { get; set; } - - - private readonly IWebHostEnvironment _hostEnvironment; - - private readonly IRepository _repository; - - private readonly QCCommon _qCCommon; - public StudyController(IMapper mapper, IStringLocalizer localizer, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IMediator mediator, - QCCommon qCCommon, - IRepository repository) - { - _qCCommon = qCCommon; - _hostEnvironment = hostEnvironment; - _mediator = mediator; - _localizer = localizer; - _mapper = mapper; - _userInfo = userInfo; - _repository = repository; - } + [HttpPost, Route("Study/PreArchiveStudy")] @@ -390,7 +368,7 @@ namespace IRaCIS.Core.API.Controllers throw new BusinessValidationFailedException(_localizer["UploadDownLoad_RequestError"]); } - studyMonitor.FileSize = (decimal)HttpContext.Request.ContentLength; + studyMonitor.FileSize = (long)HttpContext.Request.ContentLength; studyMonitor.FileCount = archiveResult.ReceivedFileCount; studyMonitor.FailedFileCount = archiveResult.ErrorFiles.Count; studyMonitor.IsDicomReUpload = archiveStudyCommand.AbandonStudyId != null; @@ -467,12 +445,15 @@ namespace IRaCIS.Core.API.Controllers /// /// /// + /// /// [HttpPost("NoneDicomStudy/UploadNoneDicomFile")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task UploadNoneDicomFile(UploadNoneDicomFileCommand incommand, - [FromServices] IRepository _noneDicomStudyRepository, [FromServices] IRepository _studyMonitorRepository) + [FromServices] IRepository _noneDicomStudyRepository, + [FromServices] IRepository _studyMonitorRepository, + [FromServices] IRepository _noneDicomStudyFileRepository) { var subjectVisitId = incommand.SubjectVisitId; @@ -480,9 +461,9 @@ namespace IRaCIS.Core.API.Controllers var noneDicomStudyId = incommand.NoneDicomStudyId; - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); - var sv = (await _repository.Where(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.TrialSiteId, t.SubjectId }).FirstOrDefaultAsync()).IfNullThrowConvertException(); + var sv = (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.TrialSiteId, t.SubjectId }).FirstOrDefaultAsync()).IfNullThrowConvertException(); var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == studyMonitorId); @@ -490,7 +471,7 @@ namespace IRaCIS.Core.API.Controllers foreach (var item in incommand.UploadedFileList) { - await _repository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, NoneDicomStudyId = noneDicomStudyId,FileType=item.FileType }); + await _noneDicomStudyFileRepository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, NoneDicomStudyId = noneDicomStudyId,FileType=item.FileType,FileSize=item.FileFize }); } var uploadFinishedTime = DateTime.Now; @@ -509,7 +490,7 @@ namespace IRaCIS.Core.API.Controllers studyMonitor.IP = _userInfo.IP; studyMonitor.IsSuccess = true; - await _repository.SaveChangesAsync(); + await _noneDicomStudyRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -523,12 +504,13 @@ namespace IRaCIS.Core.API.Controllers /// /// /// + /// /// /// [HttpPost("QCOperation/UploadVisitCheckExcel/{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task UploadVisitCheckExcel(Guid trialId, [FromServices] IOSSService oSSService) + public async Task UploadVisitCheckExcel(Guid trialId, [FromServices] IOSSService oSSService, [FromServices] IRepository _inspectionFileRepository) { var fileName = string.Empty; @@ -550,7 +532,7 @@ namespace IRaCIS.Core.API.Controllers var ossRelativePath = await oSSService.UploadToOSSAsync(fileStream, "InspectionUpload/Check", realFileName); - await _repository.AddAsync(new InspectionFile() { FileName = realFileName, RelativePath = ossRelativePath, TrialId = trialId }); + await _inspectionFileRepository.AddAsync(new InspectionFile() { FileName = realFileName, RelativePath = ossRelativePath, TrialId = trialId }); return ossRelativePath; diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.csproj b/IRaCIS.Core.API/IRaCIS.Core.API.csproj index 5a7be3fe9..6b067ed71 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.csproj +++ b/IRaCIS.Core.API/IRaCIS.Core.API.csproj @@ -61,6 +61,7 @@ + diff --git a/IRaCIS.Core.API/_PipelineExtensions/Serilog/SerilogHelper.cs b/IRaCIS.Core.API/_PipelineExtensions/Serilog/SerilogHelper.cs index 9be804fbf..3e4c2aa59 100644 --- a/IRaCIS.Core.API/_PipelineExtensions/Serilog/SerilogHelper.cs +++ b/IRaCIS.Core.API/_PipelineExtensions/Serilog/SerilogHelper.cs @@ -20,18 +20,20 @@ namespace IRaCIS.Core.API // Set all the common properties available for every request diagnosticContext.Set("Host", request.Host); + diagnosticContext.Set("Protocol", request.Protocol); + diagnosticContext.Set("Scheme", request.Scheme); + + #region old 未用 //这种获取的Ip不准 配置服务才行 //diagnosticContext.Set("RequestIP", httpContext.Connection.RemoteIpAddress.ToString()); //这种方式可以,但是serilog提供了 就不用了 //diagnosticContext.Set("TestIP", httpContext.GetUserIp()); - diagnosticContext.Set("Protocol", request.Protocol); - diagnosticContext.Set("Scheme", request.Scheme); - //这种方式不行 读取的body为空字符串 必须在中间件中读取 //diagnosticContext.Set("RequestBody", await ReadRequestBody(httpContext.Request)); //diagnosticContext.Set("RequestBody", RequestPayload); + #endregion // Only set it if available. You're not sending sensitive data in a querystring right?! if (request.QueryString.HasValue) diff --git a/IRaCIS.Core.API/_ServiceExtensions/NewtonsoftJson/NewtonsoftJsonSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/NewtonsoftJson/NewtonsoftJsonSetup.cs index c23963a5d..69032ff19 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/NewtonsoftJson/NewtonsoftJsonSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/NewtonsoftJson/NewtonsoftJsonSetup.cs @@ -14,7 +14,7 @@ namespace IRaCIS.Core.API { services.AddHttpContextAccessor(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); builder.AddNewtonsoftJson(options => @@ -31,11 +31,9 @@ namespace IRaCIS.Core.API options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; - //options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ; options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService()); - //options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService()); //IsoDateTimeConverter diff --git a/IRaCIS.Core.API/_ServiceExtensions/NewtonsoftJson/ObjectStorePathConvert.cs b/IRaCIS.Core.API/_ServiceExtensions/NewtonsoftJson/ObjectStorePathConvert.cs index b9df7af84..e7d4aad48 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/NewtonsoftJson/ObjectStorePathConvert.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/NewtonsoftJson/ObjectStorePathConvert.cs @@ -9,15 +9,13 @@ using System.Text.RegularExpressions; namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson { - public class CustomStringConverter : JsonConverter + public class ObjectStorePathConvert : JsonConverter { - //private readonly IHttpContextAccessor _httpContextAccessor; private readonly IOSSService _oSSService; // 构造函数 - public CustomStringConverter(/*IHttpContextAccessor httpContextAccessor*/ IOSSService oSSService) + public ObjectStorePathConvert( IOSSService oSSService) { - //_httpContextAccessor = httpContextAccessor; _oSSService = oSSService; } diff --git a/IRaCIS.Core.API/_ServiceExtensions/Serilog/HttpContextEnricher.cs b/IRaCIS.Core.API/_ServiceExtensions/Serilog/HttpContextEnricher.cs index 330cbc0a0..afbbf681d 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/Serilog/HttpContextEnricher.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/Serilog/HttpContextEnricher.cs @@ -31,13 +31,13 @@ namespace IRaCIS.Core.API logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("LocalIP", httpContext.Connection.LocalIpAddress.MapToIPv4().ToString())); + logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserRealName", httpContext?.User?.FindFirst(ClaimAttributes.RealName)?.Value)); + logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserType", httpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeShortName)?.Value)); + //这样读取没用 //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestBody", await ReadRequestBody(httpContext.Request))); //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", IPHelper.GetIP(httpContext.Request) )); - logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserRealName", httpContext?.User?.FindFirst(ClaimAttributes.RealName)?.Value)); - logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserType", httpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeShortName)?.Value)); - //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Referer", httpContext.Request.Headers["Referer"].ToString())); //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("request_path", httpContext.Request.Path)); //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("request_method", httpContext.Request.Method)); diff --git a/IRaCIS.Core.API/appsettings.Prod_IRC.json b/IRaCIS.Core.API/appsettings.Prod_IRC.json index c3dd1e8a2..293d9933e 100644 --- a/IRaCIS.Core.API/appsettings.Prod_IRC.json +++ b/IRaCIS.Core.API/appsettings.Prod_IRC.json @@ -68,5 +68,10 @@ "CompanyNameCN": "上海展影医疗科技有限公司", "CompanyShortName": "Extensive Imaging", "CompanyShortNameCN": "展影医疗" + }, + "SystemPacsConfig": { + "Port": "11113", + "IP": "101.132.193.237" } + } diff --git a/IRaCIS.Core.Application/BaseService.cs b/IRaCIS.Core.Application/BaseService.cs index 1d87bdb1f..a4fe57913 100644 --- a/IRaCIS.Core.Application/BaseService.cs +++ b/IRaCIS.Core.Application/BaseService.cs @@ -27,7 +27,7 @@ namespace IRaCIS.Core.Application public IUserInfo _userInfo { get; set; } - public IRepository _repository { get; set; } + public IStringLocalizer _localizer { get; set; } @@ -52,8 +52,6 @@ namespace IRaCIS.Core.Application [MemberNotNull(nameof(_userInfo))] public IUserInfo _userInfo { get; set; } - [MemberNotNull(nameof(_repository))] - public IRepository _repository { get; set; } [MemberNotNull(nameof(_localizer))] public IStringLocalizer _localizer { get; set; } @@ -79,9 +77,6 @@ namespace IRaCIS.Core.Application [MemberNotNull(nameof(_userInfo))] public IUserInfo _userInfo { get; set; } - [MemberNotNull(nameof(_repository))] - public IRepository _repository { get; set; } - [MemberNotNull(nameof(_localizer))] public IStringLocalizer _localizer { get; set; } @@ -98,8 +93,6 @@ namespace IRaCIS.Core.Application public IUserInfo _userInfo { get; set; } - public IRepository _repository { get; set; } - public IStringLocalizer _localizer { get; set; } public IFusionCache _fusionCache { get; set; } diff --git a/IRaCIS.Core.Application/BusinessFilter/UnifiedApiResultFilter.cs b/IRaCIS.Core.Application/BusinessFilter/UnifiedApiResultFilter.cs index 3e135e386..d335a9750 100644 --- a/IRaCIS.Core.Application/BusinessFilter/UnifiedApiResultFilter.cs +++ b/IRaCIS.Core.Application/BusinessFilter/UnifiedApiResultFilter.cs @@ -69,8 +69,12 @@ namespace IRaCIS.Application.Services.BusinessFilter { var result = objectResult.Value as IResponseOutput; - //统一在这里记录国际化的日志信息 - _logger.LogWarning($"{result.LocalizedInfo}"); + if (!string.IsNullOrWhiteSpace(result.LocalizedInfo)) + { + //统一在这里记录国际化的日志信息 + _logger.LogWarning($"{result.LocalizedInfo}"); + } + } else if (statusCode != 200 && !(objectResult.Value is IResponseOutput)) diff --git a/IRaCIS.Core.Application/Helper/CacheHelper.cs b/IRaCIS.Core.Application/Helper/CacheHelper.cs index 8198049df..87248465a 100644 --- a/IRaCIS.Core.Application/Helper/CacheHelper.cs +++ b/IRaCIS.Core.Application/Helper/CacheHelper.cs @@ -42,9 +42,9 @@ namespace IRaCIS.Core.Application.Helper return statusStr; } - public static async Task> GetSystemAnonymizationListAsync(IRepository _repository) + public static async Task> GetSystemAnonymizationListAsync(IRepository _systemAnonymizationRepository) { - var list = await _repository.Where(t => t.IsEnable).ToListAsync(); + var list = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync(); return list; } diff --git a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs index 069eb3b3f..f4285471f 100644 --- a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs +++ b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs @@ -3,6 +3,7 @@ using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml.Wordprocessing; using IRaCIS.Application.Contracts; using IRaCIS.Application.Interfaces; +using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson; using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Hosting; @@ -14,6 +15,8 @@ using Newtonsoft.Json.Linq; using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using System.Collections; +using System.ComponentModel; +using System.Globalization; using System.IO; namespace IRaCIS.Core.Application.Service; @@ -23,19 +26,13 @@ public static class ExcelExportHelper //MiniExcel_Export public static async Task DataExportAsync(string code, ExcelExportInfo data, string exportFileNamePrefix, IRepository _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null) { + var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; //判断是否有字典翻译 - object translateData = data; if (_dictionaryService != null && translateType != null) { - - ////只标注单个的时候 - //var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true)) - // .Select(c => new { c.Name, DicParentCode = ((DictionaryTranslateAttribute?)c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false)[0])?.DicParentCode }).ToList(); - - //一个值 对应不同的字典翻译 var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true)) .SelectMany(c => @@ -62,12 +59,18 @@ public static class ExcelExportHelper var newObjList = new List(); var no = 1; - foreach (var item in dic[key] as IList ) + foreach (var item in dic[key] as IList) { - //var itemDic = JsonConvert.DeserializeObject>(item.ToJsonNotIgnoreNull()); - var itemDic = item.ConvertToDictionary(); + //处理集合里面时间类型,根据当前语言将时间转变为字符串 + foreach (var itemValuePair in itemDic) + { + if (DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result)) + { + itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result ); + } + } foreach (var needTranslateProperty in needTranslatePropertyList) @@ -79,7 +82,7 @@ public static class ExcelExportHelper { var beforeValue = itemDic[needTranslateProperty.Name]?.ToString(); - itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t=>data.IsEn_US?t.Value:t.ValueCN).FirstOrDefault() ?? String.Empty; + itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; } } //普通翻译 或者某一标准翻译 @@ -88,7 +91,7 @@ public static class ExcelExportHelper var beforeValue = itemDic[needTranslateProperty.Name]?.ToString(); - itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => data.IsEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; } @@ -104,6 +107,7 @@ public static class ExcelExportHelper dic[key] = newObjList; } + } @@ -139,7 +143,7 @@ public static class ExcelExportHelper if (sheetCount == 2) { - if (data.IsEn_US) + if (isEn_US) { workbook.RemoveSheetAt(0); } @@ -149,7 +153,7 @@ public static class ExcelExportHelper } var memoryStream2 = new MemoryStream(); - workbook.Write(memoryStream2,true); + workbook.Write(memoryStream2, true); memoryStream2.Seek(0, SeekOrigin.Begin); @@ -160,14 +164,9 @@ public static class ExcelExportHelper //fileNmae = workbook.GetSheetName(0); #endregion - - - - - #region MiniExcel - var memoryStream = new MemoryStream(); + var memoryStream = new MemoryStream(); var config = new OpenXmlConfiguration() { @@ -181,29 +180,18 @@ public static class ExcelExportHelper return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { - FileDownloadName = $"{(string.IsNullOrEmpty(exportFileNamePrefix) ? "" : exportFileNamePrefix+ "_") }{Path.GetFileNameWithoutExtension(fileName) }_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx" + FileDownloadName = $"{(string.IsNullOrEmpty(exportFileNamePrefix) ? "" : exportFileNamePrefix + "_")}{Path.GetFileNameWithoutExtension(fileName)}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx" }; #endregion - #region Magicodes 模板规则不一样 - - ////创建Excel导出对象 - //IExportFileByTemplate exporter = new ExcelExporter(); - - ////根据模板导出 - //var result = await exporter.ExportBytesByTemplate(exportInfo, tplPath); - - - //return new XlsxFileResult(bytes: result, fileDownloadName: $"{doc.Name}_{DateTime.Now.ToString("yyyy-MM-dd:hh:mm:ss")}.xlsx"); - #endregion - } public static async Task<(MemoryStream, string)> DataExport_NpoiTestAsync(string code, ExcelExportInfo data, IRepository _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null) { + var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; //判断是否有字典翻译 object translateData = data; @@ -211,11 +199,6 @@ public static class ExcelExportHelper if (_dictionaryService != null && translateType != null) { - ////只标注单个的时候 - //var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true)) - // .Select(c => new { c.Name, DicParentCode = ((DictionaryTranslateAttribute?)c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false)[0])?.DicParentCode }).ToList(); - - //一个值 对应不同的字典翻译 var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true)) .SelectMany(c => @@ -247,6 +230,15 @@ public static class ExcelExportHelper //var itemDic = JsonConvert.DeserializeObject>(item.ToJsonNotIgnoreNull()); var itemDic = item.ConvertToDictionary(); + //处理集合里面时间类型,根据当前语言将时间转变为字符串 + foreach (var itemValuePair in itemDic) + { + if (DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result)) + { + itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result); + } + } + foreach (var needTranslateProperty in needTranslatePropertyList) { //翻译的属性依赖其他属性 @@ -256,7 +248,7 @@ public static class ExcelExportHelper { var beforeValue = itemDic[needTranslateProperty.Name]?.ToString(); - itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => data.IsEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; } } //普通翻译 或者某一标准翻译 @@ -265,7 +257,7 @@ public static class ExcelExportHelper var beforeValue = itemDic[needTranslateProperty.Name]?.ToString(); - itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => data.IsEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; } @@ -310,7 +302,7 @@ public static class ExcelExportHelper if (sheetCount == 2) { - if (data.IsEn_US) + if (isEn_US) { workbook.RemoveSheetAt(0); } @@ -320,7 +312,7 @@ public static class ExcelExportHelper } var memoryStream2 = new MemoryStream(); - workbook.Write(memoryStream2,true); + workbook.Write(memoryStream2, true); memoryStream2.Seek(0, SeekOrigin.Begin); @@ -355,4 +347,7 @@ public static class ExcelExportHelper #endregion } + + + } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Helper/FileStoreHelper.cs b/IRaCIS.Core.Application/Helper/FileStoreHelper.cs index 55c01d7f0..ed371698a 100644 --- a/IRaCIS.Core.Application/Helper/FileStoreHelper.cs +++ b/IRaCIS.Core.Application/Helper/FileStoreHelper.cs @@ -136,7 +136,7 @@ public static class FileStoreHelper { var doc = await _commonDocumentRepository.FirstOrDefaultAsync(t => t.Code == code); - var isEn_US = CultureInfo.CurrentCulture.Name!= "zh-CN"; + var isEn_US = CultureInfo.CurrentCulture.Name!= StaticData.CultureInfo.zh_CN; if (doc == null) { //---数据库没有找到对应的数据模板文件,请联系系统运维人员。 diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskAllocationRuleService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskAllocationRuleService.cs index 6977fb1e0..89d943028 100644 --- a/IRaCIS.Core.Application/Service/Allocation/TaskAllocationRuleService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/TaskAllocationRuleService.cs @@ -21,6 +21,8 @@ namespace IRaCIS.Core.Application.Service public class TaskAllocationRuleService( IRepository _taskAllocationRuleRepository, IRepository _userRepository, + IRepository _enrollRepository, + IRepository _readingQuestionCriterionTrialRepository, IRepository _subjectCanceDoctorRepository) : BaseService, ITaskAllocationRuleService { @@ -37,7 +39,7 @@ namespace IRaCIS.Core.Application.Service var list = await _taskAllocationRuleRepository.Where(t => t.TrialId == trialId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); //所有标准都是一样 后台只返回任意一个标准的就好了 - var trialTaskConfig = await _repository.Where(t => t.TrialId == trialId && t.IsConfirm).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); + var trialTaskConfig = await _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == trialId && t.IsConfirm).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); return (list, trialTaskConfig); } @@ -53,7 +55,7 @@ namespace IRaCIS.Core.Application.Service //冗余 存 - var enrollId = _repository.Where(t => t.TrialId == addOrEditTaskAllocationRule.TrialId && t.DoctorUserId == addOrEditTaskAllocationRule.DoctorUserId).Select(t => t.Id).FirstOrDefault(); + var enrollId = _enrollRepository.Where(t => t.TrialId == addOrEditTaskAllocationRule.TrialId && t.DoctorUserId == addOrEditTaskAllocationRule.DoctorUserId).Select(t => t.Id).FirstOrDefault(); if (enrollId == Guid.Empty) { diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs index 7d2b769bd..db1f15367 100644 --- a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs @@ -37,6 +37,8 @@ namespace IRaCIS.Core.Application.Service IDistributedLockProvider _distributedLockProvider, IRepository _trialRepository, IRepository _trialSiteRepository, + IRepository _enrollRepository, + IRepository _userRepository, IRepository _trialVirtualSiteCodeUpdateRepository, IVisitTaskHelpeService _visitTaskCommonService) : BaseService, ITaskConsistentRuleService { @@ -112,7 +114,7 @@ namespace IRaCIS.Core.Application.Service } #endregion - var trialTaskConfig = _repository.Where(t => t.Id == inQuery.TrialId).Select(t => new { IsHaveDoubleReadCriterion = t.TrialReadingCriterionList.Any(t => t.IsSigned && t.IsConfirm && t.ReadingType == ReadingMethod.Double), t.VitrualSiteCode }).FirstOrDefault(); + var trialTaskConfig = _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => new { IsHaveDoubleReadCriterion = t.TrialReadingCriterionList.Any(t => t.IsSigned && t.IsConfirm && t.ReadingType == ReadingMethod.Double), t.VitrualSiteCode }).FirstOrDefault(); return ResponseOutput.Ok(pageList, trialTaskConfig); } @@ -373,9 +375,9 @@ namespace IRaCIS.Core.Application.Service var subjectList = query.ToList(); - var doctorUserIdQuery = from enroll in _repository.Where(t => t.TrialId == trialId).Where(t => t.EnrollReadingCategoryList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(c => c.ReadingCategory == ReadingCategory.Global || c.ReadingCategory == ReadingCategory.Visit)) + var doctorUserIdQuery = from enroll in _enrollRepository.Where(t => t.TrialId == trialId).Where(t => t.EnrollReadingCategoryList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(c => c.ReadingCategory == ReadingCategory.Global || c.ReadingCategory == ReadingCategory.Visit)) .Where(t => t.EnrollReadingCriteriaList.Any(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsJoinAnalysis == true)) - join user in _repository.Where() on enroll.DoctorId equals user.DoctorId + join user in _userRepository.Where() on enroll.DoctorId equals user.DoctorId select user.Id; var configDoctorUserIdList = await doctorUserIdQuery.ToListAsync(); @@ -788,10 +790,10 @@ namespace IRaCIS.Core.Application.Service Expression> visitTaskFilter = comonTaskFilter.And(t => t.ReadingCategory == ReadingCategory.Visit); - var taskConsistentRuleQueryable = from enroll in _repository.Where(t => t.TrialId == trialId && t.EnrollStatus == EnrollStatus.ConfirmIntoGroup + var taskConsistentRuleQueryable = from enroll in _enrollRepository.Where(t => t.TrialId == trialId && t.EnrollStatus == EnrollStatus.ConfirmIntoGroup && t.EnrollReadingCriteriaList.Any(c => c.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && c.IsJoinAnalysis)) - join user in _repository.Where() on enroll.DoctorUserId equals user.Id - join taskConsistentRule in _repository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.IsSelfAnalysis) on enroll.TrialId equals taskConsistentRule.TrialId + join user in _userRepository.Where() on enroll.DoctorUserId equals user.Id + join taskConsistentRule in _taskConsistentRuleRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.IsSelfAnalysis) on enroll.TrialId equals taskConsistentRule.TrialId select new TaskConsistentRuleView() { Id = taskConsistentRule.Id, diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskMedicalReviewRuleService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskMedicalReviewRuleService.cs index 88bc85642..e76863049 100644 --- a/IRaCIS.Core.Application/Service/Allocation/TaskMedicalReviewRuleService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/TaskMedicalReviewRuleService.cs @@ -17,7 +17,8 @@ namespace IRaCIS.Core.Application.Service /// [ApiExplorerSettings(GroupName = "Trial")] public class TaskMedicalReviewRuleService( - IRepository _taskMedicalReviewRuleRepository) : BaseService, ITaskMedicalReviewRuleService + IRepository _taskMedicalReviewRuleRepository, + IRepository _trialUserRepository) : BaseService, ITaskMedicalReviewRuleService { @@ -30,7 +31,7 @@ namespace IRaCIS.Core.Application.Service var taskTaskMedicalReviewRuleQueryable = _taskMedicalReviewRuleRepository.Where(t => t.TrialId == inQuery.TrialId) .ProjectTo(_mapper.ConfigurationProvider); - var isHaveMIM = await _repository.AnyAsync(t => t.User.UserTypeEnum == Domain.Share.UserTypeEnum.MIM && t.TrialId==inQuery.TrialId); + var isHaveMIM = await _trialUserRepository.AnyAsync(t => t.User.UserTypeEnum == Domain.Share.UserTypeEnum.MIM && t.TrialId==inQuery.TrialId); return (await taskTaskMedicalReviewRuleQueryable.ToListAsync(),new {IsHaveMIM=isHaveMIM}); } diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index eebdff014..83d1bb3cf 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -43,6 +43,16 @@ namespace IRaCIS.Core.Application.Service.Allocation IRepository _subjectCriteriaEvaluationRepository, IRepository _subjectCriteriaEvaluationVisitFilterRepository, IRepository _trialReadingCriterionRepository, + IRepository _readingQuestionCriterionTrialRepository, + IRepository _readingTaskQuestionAnswerRepository, + IRepository _dicomInstanceRepository, + IRepository _dicomSeriesRepository, + IRepository _subjectCanceDoctorRepository, + IRepository _readingTaskQuestionMarkRepository, + IRepository _readingTableAnswerRowInfoRepository, + IRepository _readingCustomTagRepository, + IRepository _taskInfluenceRepository, + IRepository _trialQCQuestionAnswerRepository, IRepository _subjectCriteriaEvaluationVisitStudyFilterRepository) : BaseService, IVisitTaskService { @@ -63,13 +73,13 @@ namespace IRaCIS.Core.Application.Service.Allocation TaskUrgentRemake = inDto.TaskUrgentRemake, }); - + return await _visitTaskRepository.SaveChangesAsync(); } public async Task> GetTrialCriterionList(Guid trialId, bool isHaveSigned = true, bool? isAutoCreate = null) { - var list = await _repository.Where(t => t.TrialId == trialId && t.IsConfirm) + var list = await _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == trialId && t.IsConfirm) .OrderBy(t => t.ShowOrder) .Select(t => new TrialReadingCriterionDto() @@ -275,7 +285,7 @@ namespace IRaCIS.Core.Application.Service.Allocation var subjectId = cancelCommand.CancelList.First().SubjectId; - await _repository.AddAsync(new SubjectCanceDoctor() { SubjectId = subjectId, Note = cancelCommand.Note, TrialReadingCriterionId = cancelCommand.TrialReadingCriterionId }); + await _subjectCanceDoctorRepository.AddAsync(new SubjectCanceDoctor() { SubjectId = subjectId, Note = cancelCommand.Note, TrialReadingCriterionId = cancelCommand.TrialReadingCriterionId }); await _visitTaskRepository.SaveChangesAsync(); @@ -1553,9 +1563,9 @@ namespace IRaCIS.Core.Application.Service.Allocation /// private async Task PMReReadingConfirmOrBackInfluenceAnalysisAsync(Guid subjectId) { - if (await _repository.AnyAsync(t => t.IsAnalysisCreate && t.SubjectId == subjectId)) + if (await _visitTaskRepository.AnyAsync(t => t.IsAnalysisCreate && t.SubjectId == subjectId)) { - await _repository.UpdatePartialFromQueryAsync(t => t.Id == subjectId, u => new Subject() { IsReReadingOrBackInfluenceAnalysis = true }); + await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectId, u => new Subject() { IsReReadingOrBackInfluenceAnalysis = true }); } @@ -2150,7 +2160,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { //自定义 - var readingCustomTagList = _repository.Where(t => t.VisitTaskId == origenalTask.Id).ToList(); + var readingCustomTagList = _readingCustomTagRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList(); foreach (var item in readingCustomTagList) { @@ -2158,10 +2168,10 @@ namespace IRaCIS.Core.Application.Service.Allocation item.VisitTaskId = newTask.Id; } - _ = _repository.AddRangeAsync(readingCustomTagList).Result; + _ = _readingCustomTagRepository.AddRangeAsync(readingCustomTagList).Result; - var readingTaskQuestionMarkList = _repository.Where(t => t.VisitTaskId == origenalTask.Id).ToList(); + var readingTaskQuestionMarkList = _readingTaskQuestionMarkRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList(); foreach (var item in readingTaskQuestionMarkList) { @@ -2169,21 +2179,21 @@ namespace IRaCIS.Core.Application.Service.Allocation item.VisitTaskId = newTask.Id; } - _ = _repository.AddRangeAsync(readingTaskQuestionMarkList).Result; + _ = _readingTaskQuestionMarkRepository.AddRangeAsync(readingTaskQuestionMarkList).Result; - var readingTaskQuestionAnswerList = _repository.Where(t => t.VisitTaskId == origenalTask.Id).ToList(); + var readingTaskQuestionAnswerList = _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList(); foreach (var item in readingTaskQuestionAnswerList) { item.Id = Guid.Empty; item.VisitTaskId = newTask.Id; } - _ = _repository.AddRangeAsync(readingTaskQuestionAnswerList).Result; + _ = _readingTaskQuestionAnswerRepository.AddRangeAsync(readingTaskQuestionAnswerList).Result; //ReadingTableAnswerRowInfo ReadingTableQuestionAnswer 一起加 - var readingTableAnswerRowInfoList = _repository.Where(t => t.VisitTaskId == origenalTask.Id).Include(t => t.LesionAnswerList).ToList(); + var readingTableAnswerRowInfoList = _readingTableAnswerRowInfoRepository.Where(t => t.VisitTaskId == origenalTask.Id).Include(t => t.LesionAnswerList).ToList(); foreach (var item in readingTableAnswerRowInfoList) { @@ -2206,7 +2216,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } } - _ = _repository.AddRangeAsync(readingTableAnswerRowInfoList).Result; + _ = _readingTableAnswerRowInfoRepository.AddRangeAsync(readingTableAnswerRowInfoList).Result; @@ -2535,9 +2545,9 @@ namespace IRaCIS.Core.Application.Service.Allocation //await _repository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, TalkContent = "PM/APM同意一致性核查回退。", UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); - await _repository.BatchDeleteAsync(t => t.SubjectVisitId == subjectVisitId); - await _repository.BatchDeleteAsync(t => t.DicomSerie.IsDeleted); - await _repository.BatchDeleteAsync(t => t.IsDeleted); + await _trialQCQuestionAnswerRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisitId == subjectVisitId); + await _dicomInstanceRepository.BatchDeleteNoTrackingAsync(t => t.DicomSerie.IsDeleted); + await _dicomSeriesRepository.BatchDeleteNoTrackingAsync(t => t.IsDeleted); var success = await _subjectVisitRepository.SaveChangesAsync(); @@ -2870,7 +2880,7 @@ namespace IRaCIS.Core.Application.Service.Allocation /// public async Task> GetInfluencedTaskList(Guid taskId) { - var list = await _repository.Where(t => t.OriginalTaskId == taskId)/*.Select(t => t.InfluenceTask)*/.ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var list = await _taskInfluenceRepository.Where(t => t.OriginalTaskId == taskId)/*.Select(t => t.InfluenceTask)*/.ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); return list; } diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index a87afe8a4..27ced84d5 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -29,7 +29,20 @@ namespace IRaCIS.Core.Application.Service.Common { [ApiExplorerSettings(GroupName = "Common")] - public class ExcelExportService : BaseService + public class ExcelExportService(IRepository _trialUserRepository, + IRepository _visitTaskRepository, + IRepository _readingQuestionCriterionTrialRepository, + IRepository _systemDocNeedConfirmedUserTypeRepository, + IRepository _dicomStudyRepository, + IRepository _qcChallengeRepository, + IRepository _readModuleRepository, + IRepository _noneDicomStudyRepository, + IRepository _studyMonitorRepository, + IRepository _commonDocumentRepository, + IRepository _systemDocConfirmedUserRepository, + IRepository _trialDocNeedConfirmedUserTypeRepository, + IRepository _trialDocConfirmedUserRepository, + IRepository _subjectRepository) : BaseService { @@ -73,8 +86,8 @@ namespace IRaCIS.Core.Application.Service.Common .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialMaintenanceDTO)); @@ -119,8 +132,8 @@ namespace IRaCIS.Core.Application.Service.Common .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + @@ -174,8 +187,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = data; - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserSummary_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialSiteUserSummaryDto)); @@ -300,8 +313,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = new ExcelExportInfo(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialToBeDoneDto)); @@ -335,15 +348,15 @@ namespace IRaCIS.Core.Application.Service.Common [FromServices] IRepository _trialRepository ) { - var trialInfo = (await _repository.Where(t => t.Id == inQuery.TrialId).Select(t => new { t.TrialFinishedTime, t.TrialStatusStr }).FirstNotNullAsync()); + var trialInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => new { t.TrialFinishedTime, t.TrialStatusStr }).FirstNotNullAsync()); - var trialDocQuery = from trialDocumentNeedConfirmedUserType in _repository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) - join trialUser in _repository.Where(t => t.TrialId == inQuery.TrialId) + var trialDocQuery = from trialDocumentNeedConfirmedUserType in _trialDocNeedConfirmedUserTypeRepository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) + join trialUser in _trialUserRepository.Where(t => t.TrialId == inQuery.TrialId) .WhereIf(inQuery.UserId != null, t => t.UserId == inQuery.UserId) .WhereIf(inQuery.UserTypeId != null, t => t.User.UserTypeId == inQuery.UserTypeId) on trialDocumentNeedConfirmedUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId - join confirm in _repository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) on + join confirm in _trialDocConfirmedUserRepository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) on new { trialUser.UserId, TrialDocumentId = trialDocumentNeedConfirmedUserType.TrialDocumentId } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new TrainingRecordExportDTO() @@ -375,12 +388,12 @@ namespace IRaCIS.Core.Application.Service.Common - var systemDocQuery = from needConfirmEdUserType in _repository.WhereIf(trialInfo.TrialFinishedTime != null, u => u.SystemDocument.CreateTime < trialInfo.TrialFinishedTime) + var systemDocQuery = from needConfirmEdUserType in _systemDocNeedConfirmedUserTypeRepository.WhereIf(trialInfo.TrialFinishedTime != null, u => u.SystemDocument.CreateTime < trialInfo.TrialFinishedTime) - join trialUser in _repository.Where(t => t.TrialId == inQuery.TrialId) + join trialUser in _trialUserRepository.Where(t => t.TrialId == inQuery.TrialId) .WhereIf(inQuery.UserId != null, t => t.UserId == inQuery.UserId) on needConfirmEdUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId - join confirm in _repository.GetQueryable() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmEdUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc + join confirm in _systemDocConfirmedUserRepository.Where() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmEdUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new TrainingRecordExportDTO() { @@ -420,9 +433,10 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); + exportInfo.List=list; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialTrainingRecordList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrainingRecordExportDTO)); @@ -476,8 +490,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialCRCUploadImageList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO)); @@ -535,8 +549,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialQCVisitImageList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO)); @@ -563,7 +577,7 @@ namespace IRaCIS.Core.Application.Service.Common { var svExpression = QCCommon.GetQCChallengeFilter(inQuery.VisitPlanArray); - var query = _repository.Where(x => x.TrialId == inQuery.TrialId) + var query = _qcChallengeRepository.Where(x => x.TrialId == inQuery.TrialId) //.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState) .WhereIf(inQuery.ReuploadEnum != null, t => t.ReuploadEnum == inQuery.ReuploadEnum) .WhereIf(inQuery.IsClosed != null, t => t.IsClosed == inQuery.IsClosed) @@ -585,8 +599,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialQCImageChanllengeList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(QCChanllengeExportDto)); } @@ -629,8 +643,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectExportDTO)); @@ -657,8 +671,8 @@ namespace IRaCIS.Core.Application.Service.Common { - var query = from subject in _repository.Where(u => u.TrialId == dto.TrialId) - join trialReadingCriterion in _repository.Where(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId) on subject.TrialId equals trialReadingCriterion.TrialId + var query = from subject in _subjectRepository.Where(u => u.TrialId == dto.TrialId) + join trialReadingCriterion in _readingQuestionCriterionTrialRepository.Where(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId) on subject.TrialId equals trialReadingCriterion.TrialId select new SubjectProgressDto() { @@ -702,11 +716,11 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == dto.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - exportInfo.CriterionName = await _repository.Where(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync(); + exportInfo.CriterionName = await _readingQuestionCriterionTrialRepository.Where(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.TrialSubjectProgressList_Export, exportInfo, /*"", */_commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectProgressDto)); @@ -798,7 +812,7 @@ namespace IRaCIS.Core.Application.Service.Common { var svExpression = QCCommon.GetStudyMonitorSubjectVisitFilter(inQuery.VisitPlanArray); - var StudyMonitorQuery = _repository.Where(t => t.TrialId == inQuery.TrialId, ignoreQueryFilters: true) + var StudyMonitorQuery = _studyMonitorRepository.Where(t => t.TrialId == inQuery.TrialId, ignoreQueryFilters: true) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) //.WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) .WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression) @@ -851,8 +865,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyUploadMonitor_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyMonitorExportDto)); @@ -879,7 +893,7 @@ namespace IRaCIS.Core.Application.Service.Common [FromServices] IRepository _trialRepository) { - var list = await _repository.Where(u => u.TrialId == param.TrialId) + var list = await _readModuleRepository.Where(u => u.TrialId == param.TrialId) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); @@ -888,8 +902,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectReadingPeriodList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadPeriodExportDto)); @@ -913,7 +927,7 @@ namespace IRaCIS.Core.Application.Service.Common var svExpression = QCCommon.GetDicomStudySubjectVisitFilter(studyQuery.VisitPlanArray); - var dicomStudyQuery = _repository.Where(t => t.TrialId == studyQuery.TrialId) + var dicomStudyQuery = _dicomStudyRepository.Where(t => t.TrialId == studyQuery.TrialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) .WhereIf(studyQuery.VisitPlanArray != null && studyQuery.VisitPlanArray?.Length > 0, svExpression) .WhereIf(!string.IsNullOrWhiteSpace(studyQuery.SubjectInfo), t => t.Subject.Code.Contains(studyQuery.SubjectInfo)) @@ -941,7 +955,7 @@ namespace IRaCIS.Core.Application.Service.Common var svExpression2 = QCCommon.GetNoneDicomStudySubjectVisitFilter(studyQuery.VisitPlanArray); - var nodeDicomStudyQuery = _repository.Where(t => t.TrialId == studyQuery.TrialId) + var nodeDicomStudyQuery = _noneDicomStudyRepository.Where(t => t.TrialId == studyQuery.TrialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) .WhereIf(studyQuery.VisitPlanArray != null && studyQuery.VisitPlanArray?.Length > 0, svExpression2) .WhereIf(!string.IsNullOrWhiteSpace(studyQuery.SubjectInfo), t => t.Subject.Code.Contains(studyQuery.SubjectInfo)) @@ -978,8 +992,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == studyQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyExportDTO)); } @@ -1019,8 +1033,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectVisitCheckList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PMKCheckEXportDTO)); } @@ -1042,7 +1056,7 @@ namespace IRaCIS.Core.Application.Service.Common [FromServices] IDictionaryService _dictionaryService, [FromServices] IRepository _trialRepository) { - var list = await _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false) + var list = await _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false) //.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null) .WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) @@ -1072,8 +1086,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadingTaskExportDto)); } @@ -1138,8 +1152,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReReadingTaskExportDto)); } @@ -1198,8 +1212,8 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialMedicalReviewList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TaskMedicalReviewExportDto)); } @@ -1221,7 +1235,7 @@ namespace IRaCIS.Core.Application.Service.Common [FromServices] IRepository _trialRepository) { - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); if (criterion.CriterionType != CriterionType.RECIST1Point1) { @@ -1230,9 +1244,9 @@ namespace IRaCIS.Core.Application.Service.Common } //产生一致性分析的Subject - var subjectQuerybal = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsSelfAnalysis == true).Select(t => t.SubjectId).Distinct(); + var subjectQuerybal = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsSelfAnalysis == true).Select(t => t.SubjectId).Distinct(); - var allList = await _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && subjectQuerybal.Contains(t.SubjectId) && t.ReadingCategory == ReadingCategory.Visit) + var allList = await _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && subjectQuerybal.Contains(t.SubjectId) && t.ReadingCategory == ReadingCategory.Visit) .Where(t => (t.IsSelfAnalysis == true || t.IsSelfAnalysis == null) && t.VisitTaskNum > 0) //一致性分析的结果 + 正常任务的结果 + 仅仅访视的结果 +去除基线 //.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) @@ -1281,10 +1295,10 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - exportInfo.CriterionName = await _repository.Where(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync(); + exportInfo.CriterionName = await _readingQuestionCriterionTrialRepository.Where(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSelfAnalysisList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SelftAnalysisExport)); } @@ -1304,7 +1318,7 @@ namespace IRaCIS.Core.Application.Service.Common [FromServices] IDictionaryService _dictionaryService, [FromServices] IRepository _trialRepository) { - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); if (criterion.CriterionType != CriterionType.RECIST1Point1) { @@ -1314,9 +1328,9 @@ namespace IRaCIS.Core.Application.Service.Common //产生组间一致性分析的Subject - var subjectQuerybal = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsSelfAnalysis == false).Select(t => t.SubjectId).Distinct(); + var subjectQuerybal = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsSelfAnalysis == false).Select(t => t.SubjectId).Distinct(); - var allList = await _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && subjectQuerybal.Contains(t.SubjectId) && t.ReadingCategory == ReadingCategory.Visit) + var allList = await _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && subjectQuerybal.Contains(t.SubjectId) && t.ReadingCategory == ReadingCategory.Visit) .Where(t => (t.IsSelfAnalysis == false || t.IsSelfAnalysis == null) && t.VisitTaskNum > 0) //一致性分析的结果 + 正常任务的结果 +仅仅访视的结果 //.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) @@ -1385,10 +1399,10 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - exportInfo.CriterionName = await _repository.Where(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync(); + exportInfo.CriterionName = await _readingQuestionCriterionTrialRepository.Where(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync(); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(newList, _userInfo.TimeZoneId); ; - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialGroupAnalysisList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(GroupAnalysisExport)); } @@ -1427,7 +1441,7 @@ namespace IRaCIS.Core.Application.Service.Common { var list = new List(); - var criterion = await _repository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); if (criterion.CriterionType == CriterionType.RECIST1Point1) { @@ -1442,7 +1456,7 @@ namespace IRaCIS.Core.Application.Service.Common list.Add(new ExportDocumentDes() { Code = StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); } - var result = _repository.Where(t => list.Select(c => c.Code).Contains(t.Code)).Select(c => new ExportDocumentDes() { Code = c.Code, FileName = _userInfo.IsEn_Us ? c.Name : c.NameCN }).ToList(); + var result = _commonDocumentRepository.Where(t => list.Select(c => c.Code).Contains(t.Code)).Select(c => new ExportDocumentDes() { Code = c.Code, FileName = _userInfo.IsEn_Us ? c.Name : c.NameCN }).ToList(); foreach (var item in list) { @@ -1624,7 +1638,7 @@ namespace IRaCIS.Core.Application.Service.Common //每次查询必须是单标准的 - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); if (criterion.CriterionType != CriterionType.RECIST1Point1 && criterion.CriterionType != CriterionType.PCWG3) { @@ -1632,7 +1646,7 @@ namespace IRaCIS.Core.Application.Service.Common throw new Exception(_localizer["ExcelExport_UnsupportedExport"]); } - var list = await _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect) + var list = await _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect) //访视和全局查询已签名完成的,裁判可以是未签名,未完成的 .Where(t => (t.ReadingTaskState == ReadingTaskState.HaveSigned && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global)) || (t.ReadingCategory == ReadingCategory.Judge)) @@ -1665,8 +1679,8 @@ namespace IRaCIS.Core.Application.Service.Common list = DealJudgeMark(criterion.ArbitrationRule, list); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list.Where(t => t.ReadingCategory != ReadingCategory.Global).ToList(), _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.OverallTumorEvaluation_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(OverallTumorEvaluationExport), criterion.CriterionType); @@ -1689,9 +1703,9 @@ namespace IRaCIS.Core.Application.Service.Common { //每次查询必须是单标准的 - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstOrDefaultAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstOrDefaultAsync(); - var query = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned) + var query = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned) //.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) //.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) @@ -1725,8 +1739,8 @@ namespace IRaCIS.Core.Application.Service.Common list = DealJudgeMark(criterion.ArbitrationRule, list); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list.Where(t => t.ReadingCategory != ReadingCategory.Global).ToList(), _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1EvaluationOfTumorEfficacyExport), criterion.CriterionType); @@ -1758,9 +1772,9 @@ namespace IRaCIS.Core.Application.Service.Common { //每次查询必须是单标准的 - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstOrDefaultAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstOrDefaultAsync(); - var query = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned) + var query = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned) .WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId) .WhereIf(queryVisitTask.TrialSiteId != null, t => t.Subject.TrialSiteId == queryVisitTask.TrialSiteId) @@ -1814,8 +1828,8 @@ namespace IRaCIS.Core.Application.Service.Common //处理裁判标记 list = DealJudgeMark(criterion.ArbitrationRule, list); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(exportList, _userInfo.TimeZoneId); - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1DetailedOfEvaluatedLesionExport), criterion.CriterionType); @@ -1849,8 +1863,8 @@ namespace IRaCIS.Core.Application.Service.Common list = DealJudgeMark(criterion.ArbitrationRule, list); exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(exportList, _userInfo.TimeZoneId); ; - exportInfo.IsEn_US = _userInfo.IsEn_Us; - exportInfo.ClientZoneId = _userInfo.TimeZoneId; + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PCWG3DetailedOfEvaluatedLesionExport), criterion.CriterionType); diff --git a/IRaCIS.Core.Application/Service/Common/MailService.cs b/IRaCIS.Core.Application/Service/Common/MailService.cs index 16f4916b2..c9b05b161 100644 --- a/IRaCIS.Core.Application/Service/Common/MailService.cs +++ b/IRaCIS.Core.Application/Service/Common/MailService.cs @@ -56,11 +56,16 @@ namespace IRaCIS.Application.Services public class MailVerificationService( IRepository _verificationCodeRepository, IRepository _systemBasicDatarepository, + IRepository _visitTaskRepository, + IRepository _trialSiteRepository, IRepository _userRepository, + IRepository _userFeedBackRepository, ITokenService _tokenService, + IRepository _subjectVisitRepository, IRepository _trialRepository, IRepository _userTypeRepository, IRepository _doctorTypeRepository, + IRepository _dictionaryRepository, IRepository _emailNoticeConfigrepository, IOptionsMonitor systemEmailConfig, IDistributedLockProvider _distributedLockProvider) : BaseService, IMailVerificationService @@ -351,9 +356,9 @@ namespace IRaCIS.Application.Services messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); - var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == trialSiteSurvey.TrialId); + var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialSiteSurvey.TrialId); - var siteInfo = await _repository.FirstOrDefaultAsync(t => t.TrialId == trialSiteSurvey.TrialId && t.Id == trialSiteSurvey.TrialSiteId, true); + var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialSiteSurvey.TrialId && t.Id == trialSiteSurvey.TrialSiteId, true); var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; @@ -718,7 +723,7 @@ namespace IRaCIS.Application.Services public async Task UserFeedBackMail(Guid feedBackId) { - var feedBack = await _repository.Where(t => t.Id == feedBackId).Include(t => t.CreateUser).ThenInclude(t => t.UserTypeRole).FirstNotNullAsync(); + var feedBack = await _userFeedBackRepository.Where(t => t.Id == feedBackId).Include(t => t.CreateUser).ThenInclude(t => t.UserTypeRole).FirstNotNullAsync(); var messageToSend = new MimeMessage(); //发件地址 @@ -734,7 +739,7 @@ namespace IRaCIS.Application.Services var userTypeEnumList = emailConfigInfo.EmailNoticeUserTypeList.Where(t => t.EmailUserType == EmailUserType.To).Select(t => t.UserType).ToList(); - var emailList = await _repository.Where(t => userTypeEnumList.Contains(t.UserTypeEnum) && + var emailList = await _userRepository.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(); @@ -749,10 +754,10 @@ namespace IRaCIS.Application.Services if (feedBack.VisitTaskId != null) { - var emailType = await _repository.Where(t => t.Parent.Code == "Email_BusinessScenario" && t.ParentId != null && t.Code == ((int)EmailBusinessScenario.IRImageError).ToString()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefaultAsync(); + var emailType = await _dictionaryRepository.Where(t => t.Parent.Code == "Email_BusinessScenario" && t.ParentId != null && t.Code == ((int)EmailBusinessScenario.IRImageError).ToString()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefaultAsync(); - var info = await _repository.Where(t => t.Id == feedBack.VisitTaskId).Select(t => new { t.Trial.ResearchProgramNo, t.Trial.TrialCode, SubejctCode = t.Subject.Code, t.SourceSubjectVisit.VisitName }).FirstNotNullAsync(); + var info = await _visitTaskRepository.Where(t => t.Id == feedBack.VisitTaskId).Select(t => new { t.Trial.ResearchProgramNo, t.Trial.TrialCode, SubejctCode = t.Subject.Code, t.SourceSubjectVisit.VisitName }).FirstNotNullAsync(); Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { @@ -779,10 +784,10 @@ namespace IRaCIS.Application.Services } else if (feedBack.SubjectVisitId != null) { - var emailType = await _repository.Where(t => t.Parent.Code == "Email_BusinessScenario" && t.ParentId != null && t.Code == ((int)EmailBusinessScenario.TrialSubjectVisitFeedBack).ToString()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefaultAsync(); + var emailType = await _dictionaryRepository.Where(t => t.Parent.Code == "Email_BusinessScenario" && t.ParentId != null && t.Code == ((int)EmailBusinessScenario.TrialSubjectVisitFeedBack).ToString()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefaultAsync(); - var info = await _repository.Where(t => t.Id == feedBack.SubjectVisitId).Select(t => new { t.Trial.ResearchProgramNo, t.Trial.TrialCode, SubejctCode = t.Subject.Code, t.VisitName }).FirstNotNullAsync(); + var info = await _subjectVisitRepository.Where(t => t.Id == feedBack.SubjectVisitId).Select(t => new { t.Trial.ResearchProgramNo, t.Trial.TrialCode, SubejctCode = t.Subject.Code, t.VisitName }).FirstNotNullAsync(); Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { @@ -810,10 +815,10 @@ namespace IRaCIS.Application.Services else if (feedBack.TrialId != null) { - var emailType = await _repository.Where(t => t.Parent.Code == "Email_BusinessScenario" && t.ParentId != null && t.Code == ((int)EmailBusinessScenario.TrialFeedBack).ToString()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefaultAsync(); + var emailType = await _dictionaryRepository.Where(t => t.Parent.Code == "Email_BusinessScenario" && t.ParentId != null && t.Code == ((int)EmailBusinessScenario.TrialFeedBack).ToString()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefaultAsync(); - var info = await _repository.Where(t => t.Id == feedBack.TrialId).Select(t => new { t.ResearchProgramNo, t.TrialCode }).FirstNotNullAsync(); + var info = await _trialRepository.Where(t => t.Id == feedBack.TrialId).Select(t => new { t.ResearchProgramNo, t.TrialCode }).FirstNotNullAsync(); Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { diff --git a/IRaCIS.Core.Application/Service/Common/SystemBasicDataService.cs b/IRaCIS.Core.Application/Service/Common/SystemBasicDataService.cs index f8e36c680..108f6f5ab 100644 --- a/IRaCIS.Core.Application/Service/Common/SystemBasicDataService.cs +++ b/IRaCIS.Core.Application/Service/Common/SystemBasicDataService.cs @@ -35,7 +35,7 @@ namespace IRaCIS.Core.Application.Services [HttpGet("{code}")] public async Task GetSystemBasicData(string code) { - return (await _repository.Where(t => t.Code == code).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); + return (await _systemBasicDataRepository.Where(t => t.Code == code).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); } diff --git a/IRaCIS.Core.Application/Service/Doctor/AttachmentService.cs b/IRaCIS.Core.Application/Service/Doctor/AttachmentService.cs index 2cf06c747..598a16889 100644 --- a/IRaCIS.Core.Application/Service/Doctor/AttachmentService.cs +++ b/IRaCIS.Core.Application/Service/Doctor/AttachmentService.cs @@ -159,8 +159,8 @@ namespace IRaCIS.Application.Services var newAttachment = attachments.Where(t => t.Id == Guid.Empty); - await _repository.AddRangeAsync(newAttachment); - await _repository.SaveChangesAsync(); + await _attachmentrepository.AddRangeAsync(newAttachment); + await _attachmentrepository.SaveChangesAsync(); //_doctorAttachmentRepository.AddRange(newAttachment); //_doctorAttachmentRepository.SaveChanges(); @@ -184,8 +184,8 @@ namespace IRaCIS.Application.Services attachment.IsOfficial = true; } - await _repository.AddAsync(newAttachment); - var success = await _repository.SaveChangesAsync(); + await _attachmentrepository.AddAsync(newAttachment); + var success = await _attachmentrepository.SaveChangesAsync(); return ResponseOutput.Result(success, attachment); } @@ -214,15 +214,14 @@ namespace IRaCIS.Application.Services [HttpPost("{doctorId:guid}/{attachmentId:guid}/{language}")] public async Task SetOfficial(Guid doctorId, Guid attachmentId, int language) { - var resumeList = await _attachmentrepository.Where(t => t.DoctorId == doctorId && t.Type == "Resume" && t.Language == language).ToListAsync(); + var resumeList = await _attachmentrepository.Where(t => t.DoctorId == doctorId && t.Type == "Resume" && t.Language == language,true).ToListAsync(); foreach (var item in resumeList) { if (item.Id == attachmentId) item.IsOfficial = true; else item.IsOfficial = false; - await _repository.UpdateAsync(item); } - return ResponseOutput.Result(await _repository.SaveChangesAsync()); + return ResponseOutput.Result(await _attachmentrepository.SaveChangesAsync()); } /// diff --git a/IRaCIS.Core.Application/Service/Doctor/DoctorListService.cs b/IRaCIS.Core.Application/Service/Doctor/DoctorListService.cs index 6168edeb6..12d447cb8 100644 --- a/IRaCIS.Core.Application/Service/Doctor/DoctorListService.cs +++ b/IRaCIS.Core.Application/Service/Doctor/DoctorListService.cs @@ -8,7 +8,11 @@ using Microsoft.AspNetCore.Mvc; namespace IRaCIS.Application.Services { [ApiExplorerSettings(GroupName = "Reviewer")] - public class DoctorListService (IRepository _doctorRepository) : BaseService, IDoctorListQueryService + public class DoctorListService ( + IRepository _doctorRepository, + IRepository _enrollRepository, + IRepository _enrollDetailRepository, + IRepository _trialRepository) : BaseService, IDoctorListQueryService { @@ -62,7 +66,7 @@ namespace IRaCIS.Application.Services ReviewerSelectionQueryDTO inQuery) { //项目配置需要的医生过滤 2表示混合 - var trialConfig = await _repository.Where(s => s.Id == inQuery.TrialId).Select(t=>new { t.AttendedReviewerTypeEnumList ,t.TrialType} ).FirstOrDefaultAsync().IfNullThrowException(); + var trialConfig = await _trialRepository.Where(s => s.Id == inQuery.TrialId).Select(t=>new { t.AttendedReviewerTypeEnumList ,t.TrialType} ).FirstOrDefaultAsync().IfNullThrowException(); //var nation = trialConfig.AttendedReviewerType; // 临床项目经验 多选 @@ -97,7 +101,7 @@ namespace IRaCIS.Application.Services var result = await query.ToPagedListAsync(inQuery); //是否已申请 申请时间 申请人 - var doctorStateList = await _repository.Where(x => x.TrialId == inQuery.TrialId && x.EnrollStatus == EnrollStatus.HasApplyDownloadResume) + var doctorStateList = await _enrollDetailRepository.Where(x => x.TrialId == inQuery.TrialId && x.EnrollStatus == EnrollStatus.HasApplyDownloadResume) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); result.CurrentPageData.ToList().ForEach(doctor => @@ -128,7 +132,7 @@ namespace IRaCIS.Application.Services ReviewerSubmissionQueryDTO inQuery) { - var doctorQuery = _repository.Where(x => x.TrialId == inQuery.TrialId) + var doctorQuery = _enrollRepository.Where(x => x.TrialId == inQuery.TrialId) //提交CRO 以及下载简历列表 .WhereIf(inQuery.IntoGroupSearchState == 1, t => t.EnrollStatus >= EnrollStatus.HasApplyDownloadResume) //CRO确认列表 状态为 已提交CRO @@ -138,7 +142,7 @@ namespace IRaCIS.Application.Services var doctorPageList = await doctorQuery.ToPagedListAsync(inQuery); - var enrollStateList = await _repository.Where(x => x.TrialId == inQuery.TrialId) + var enrollStateList = await _enrollDetailRepository.Where(x => x.TrialId == inQuery.TrialId) //提交CRO 以及下载简历列表 .WhereIf(inQuery.IntoGroupSearchState == 1, t => t.EnrollStatus == EnrollStatus.HasCommittedToCRO) //CRO确认列表 状态为 已提交CRO @@ -166,7 +170,7 @@ namespace IRaCIS.Application.Services if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM) { //SPM 要看到提交的时间 提交人 - var enrollCommitList = await _repository.Where(x => x.TrialId == inQuery.TrialId) + var enrollCommitList = await _enrollDetailRepository.Where(x => x.TrialId == inQuery.TrialId) //提交CRO 以及下载简历列表 .WhereIf(inQuery.IntoGroupSearchState == 4, t => t.EnrollStatus == EnrollStatus.HasCommittedToCRO) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); @@ -195,7 +199,7 @@ namespace IRaCIS.Application.Services //public async Task> GetSPMSubmissionOrApprovalReviewerList( // ReviewerSubmissionQueryDTO param) //{ - // var doctorQuery = _repository.Where(x => x.TrialId == param.TrialId) + // var doctorQuery = _enrollRepository(x => x.TrialId == param.TrialId) // //提交CRO 以及下载简历列表 // .WhereIf(param.IntoGroupSearchState == 1, t => t.EnrollStatus >= (int)EnrollStatus.HasApplyDownloadResume) // //CRO确认列表 状态为 已提交CRO @@ -205,7 +209,7 @@ namespace IRaCIS.Application.Services // var doctorPageList = await doctorQuery.ToPagedListAsync(param.PageIndex, param.PageSize, param.SortField == "" ? "Code" : param.SortField, param.Asc); - // var enrollStateList = await _repository.Where(x => x.TrialId == param.TrialId) + // var enrollStateList = await _enrollDetailRepository.Where(x => x.TrialId == param.TrialId) // //提交CRO 以及下载简历列表 // .WhereIf(param.IntoGroupSearchState == 1, t => t.EnrollStatus == (int)EnrollStatus.HasCommittedToCRO) // //CRO确认列表 状态为 已提交CRO @@ -236,12 +240,12 @@ namespace IRaCIS.Application.Services { - var doctorQuery = _repository.Where(x => x.TrialId == inQuery.TrialId && x.EnrollStatus >= EnrollStatus.InviteIntoGroup) + var doctorQuery = _enrollRepository.Where(x => x.TrialId == inQuery.TrialId && x.EnrollStatus >= EnrollStatus.InviteIntoGroup) .ProjectTo(_mapper.ConfigurationProvider); var doctorPageList = await doctorQuery.ToPagedListAsync(inQuery); - var enrollStateList = await _repository.Where(x => x.TrialId == inQuery.TrialId && x.EnrollStatus > EnrollStatus.InviteIntoGroup) + var enrollStateList = await _enrollDetailRepository.Where(x => x.TrialId == inQuery.TrialId && x.EnrollStatus > EnrollStatus.InviteIntoGroup) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); diff --git a/IRaCIS.Core.Application/Service/Doctor/DoctorService.cs b/IRaCIS.Core.Application/Service/Doctor/DoctorService.cs index 3a280e2f6..50cdd9746 100644 --- a/IRaCIS.Core.Application/Service/Doctor/DoctorService.cs +++ b/IRaCIS.Core.Application/Service/Doctor/DoctorService.cs @@ -11,10 +11,12 @@ namespace IRaCIS.Application.Services [ApiExplorerSettings(GroupName = "Reviewer")] public class DoctorService( IRepository _doctorRepository, + IRepository _doctorDictionaryRepository, IRepository _enrollRepository, IRepository _attachmentRepository, IRepository _doctorCriterionFileRepository, IRepository _trialRepository, + IRepository _vacationRepository, IRepository _trialExtRepository ) : BaseService, IDoctorService { @@ -71,7 +73,7 @@ namespace IRaCIS.Application.Services //await _repository.AddAsync(new UserDoctor() { DoctorId = doctor.Id, UserId = _userInfo.Id }); //_userDoctorRepository.Add(new UserDoctor() { DoctorId = doctor.Id, UserId = _userInfo.Id }); - var success = await _repository.SaveChangesAsync(); + var success = await _doctorDictionaryRepository.SaveChangesAsync(); return ResponseOutput.Result(success, _mapper.Map(doctor)); } @@ -95,18 +97,18 @@ namespace IRaCIS.Application.Services var doctor = await _doctorRepository.FirstOrDefaultAsync(t => t.Id == updateModel.Id).IfNullThrowException(); //删除中间表 Title对应的记录 - await _repository.BatchDeleteAsync(t => t.DoctorId == updateModel.Id && t.KeyName == StaticData.Title); + await _doctorDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.DoctorId == updateModel.Id && t.KeyName == StaticData.Title); var adddata = new List(); //重新插入新的 Title记录 updateModel.TitleIds.ForEach(titleId => adddata.Add(new DoctorDictionary() { DoctorId = updateModel.Id.Value, KeyName = StaticData.Title, DictionaryId = titleId })); - await _repository.AddRangeAsync(adddata); + await _doctorDictionaryRepository.AddRangeAsync(adddata); _mapper.Map(basicInfoModel, doctor); - var success = await _repository.SaveChangesAsync(); + var success = await _doctorDictionaryRepository.SaveChangesAsync(); return ResponseOutput.Result(success, basicInfoModel); @@ -295,7 +297,7 @@ namespace IRaCIS.Application.Services #endregion - var entity = await _repository.InsertOrUpdateAsync(doctorWorkInfoModel, true); + var entity = await _doctorRepository.InsertOrUpdateAsync(doctorWorkInfoModel, true); return ResponseOutput.Ok(); @@ -364,7 +366,7 @@ namespace IRaCIS.Application.Services //_doctorDictionaryRepository.Delete(t => // t.DoctorId == specialtyUpdateModel.Id && t.KeyName == StaticData.ReadingType); - await _repository.BatchDeleteAsync(t => + await _doctorDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.DoctorId == specialtyUpdateModel.Id && (t.KeyName == StaticData.Subspeciality || t.KeyName == StaticData.ReadingType)); @@ -388,11 +390,11 @@ namespace IRaCIS.Application.Services DictionaryId = subspecialityId })); - await _repository.AddRangeAsync(adddata); + await _doctorDictionaryRepository.AddRangeAsync(adddata); _mapper.Map(specialtyUpdateModel, doctor); - var success = await _repository.SaveChangesAsync(); + var success = await _doctorDictionaryRepository.SaveChangesAsync(); return ResponseOutput.Result(success); @@ -518,7 +520,7 @@ namespace IRaCIS.Application.Services var doctor = (await _doctorRepository .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(t => t.Id == doctorId)).IfNullThrowException(); - doctor.InHoliday = (await _repository.CountAsync(x => x.DoctorId == doctorId && x.EndDate <= appDateTimeNow && x.StartDate <= appDateTimeNow)) > 0; + doctor.InHoliday = (await _vacationRepository.CountAsync(x => x.DoctorId == doctorId && x.EndDate <= appDateTimeNow && x.StartDate <= appDateTimeNow)) > 0; return doctor; } diff --git a/IRaCIS.Core.Application/Service/Doctor/EducationService.cs b/IRaCIS.Core.Application/Service/Doctor/EducationService.cs index ccc9d5ec1..5f12ce29d 100644 --- a/IRaCIS.Core.Application/Service/Doctor/EducationService.cs +++ b/IRaCIS.Core.Application/Service/Doctor/EducationService.cs @@ -59,7 +59,7 @@ namespace IRaCIS.Application.Services break; } await _educationRepository.AddAsync(doctorEducationInfo); - var success = await _repository.SaveChangesAsync(); + var success = await _educationRepository.SaveChangesAsync(); return ResponseOutput.Result(success, doctorEducationInfo.Id.ToString()); } @@ -72,7 +72,7 @@ namespace IRaCIS.Application.Services _mapper.Map(educationInfoViewModel, needUpdate); - var success = await _repository.SaveChangesAsync(); + var success = await _educationRepository.SaveChangesAsync(); return ResponseOutput.Ok(success); @@ -114,7 +114,7 @@ namespace IRaCIS.Application.Services //} #endregion - var entity = await _repository.InsertOrUpdateAsync(postgraduateViewModel, true); + var entity = await _postgraduateRepository.InsertOrUpdateAsync(postgraduateViewModel, true); return ResponseOutput.Ok(entity.Id); } /// @@ -126,7 +126,7 @@ namespace IRaCIS.Application.Services [HttpDelete("{doctorId:guid}")] public async Task DeletePostgraduateInfo(Guid doctorId) { - var success = await _repository.BatchDeleteAsync(o => o.Id == doctorId); + var success = await _postgraduateRepository.BatchDeleteNoTrackingAsync(o => o.Id == doctorId); return ResponseOutput.Result(success); } } diff --git a/IRaCIS.Core.Application/Service/Doctor/ResearchPublicationService.cs b/IRaCIS.Core.Application/Service/Doctor/ResearchPublicationService.cs index b7cf597f7..97a0f2ef4 100644 --- a/IRaCIS.Core.Application/Service/Doctor/ResearchPublicationService.cs +++ b/IRaCIS.Core.Application/Service/Doctor/ResearchPublicationService.cs @@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc; namespace IRaCIS.Application.Services { [ApiExplorerSettings(GroupName = "Reviewer")] - public class ResearchPublicationService(IRepository researchPublicationRepository) : BaseService, IResearchPublicationService + public class ResearchPublicationService(IRepository _researchPublicationRepository) : BaseService, IResearchPublicationService { @@ -17,7 +17,7 @@ namespace IRaCIS.Application.Services [HttpGet("{doctorId:guid}")] public async Task GetResearchPublication(Guid doctorId) { - var doctorScientificResearchInfo = await researchPublicationRepository.Where(o => o.DoctorId == doctorId) + var doctorScientificResearchInfo = await _researchPublicationRepository.Where(o => o.DoctorId == doctorId) .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); return doctorScientificResearchInfo!; @@ -28,7 +28,7 @@ namespace IRaCIS.Application.Services public async Task AddOrUpdateResearchPublication(ResearchPublicationDTO param) { - var entity = await _repository.InsertOrUpdateAsync(param, true); + var entity = await _researchPublicationRepository.InsertOrUpdateAsync(param, true); return ResponseOutput.Ok(entity.Id); } diff --git a/IRaCIS.Core.Application/Service/Doctor/TrialExperienceService.cs b/IRaCIS.Core.Application/Service/Doctor/TrialExperienceService.cs index f38ce1fd8..6fd328a0b 100644 --- a/IRaCIS.Core.Application/Service/Doctor/TrialExperienceService.cs +++ b/IRaCIS.Core.Application/Service/Doctor/TrialExperienceService.cs @@ -8,6 +8,7 @@ namespace IRaCIS.Application.Services public class TrialExperienceService( IRepository _trialExperienceRepository, IRepository _doctorRepository, + IRepository _trialExperienceCriteriaRepository, IRepository _attachmentRepository ) : BaseService, ITrialExperienceService { @@ -67,7 +68,7 @@ namespace IRaCIS.Application.Services var trialExperience = _mapper.Map(trialExperienceViewModel); - trialExperience = await _repository.AddAsync(trialExperience); + trialExperience = await _trialExperienceRepository.AddAsync(trialExperience); List criteriaList = new List(); trialExperienceViewModel.EvaluationCriteriaIdList.ForEach(t => criteriaList.Add(new TrialExperienceCriteria() @@ -78,22 +79,20 @@ namespace IRaCIS.Application.Services TrialExperienceId = trialExperience.Id })); - await _repository.AddRangeAsync(criteriaList); + await _trialExperienceCriteriaRepository.AddRangeAsync(criteriaList); - var success = await _repository.SaveChangesAsync(); + var success = await _trialExperienceCriteriaRepository.SaveChangesAsync(); return ResponseOutput.Result(success, trialExperience.Id); } else { - var needUpdate = await _trialExperienceRepository.FirstOrDefaultAsync(t => t.Id == trialExperienceViewModel.Id); + var needUpdate = trialExperienceViewModel; - if (needUpdate == null) return Null404NotFound(needUpdate); - _mapper.Map(trialExperienceViewModel, needUpdate); - await _repository.UpdateAsync(needUpdate); + await _trialExperienceRepository.UpdateFromDTOAsync(trialExperienceViewModel); - await _repository.BatchDeleteAsync(t => t.TrialExperienceId == needUpdate.Id); + await _trialExperienceCriteriaRepository.BatchDeleteNoTrackingAsync(t => t.TrialExperienceId == needUpdate.Id); List criteriaList = new List(); @@ -101,13 +100,13 @@ namespace IRaCIS.Application.Services { DoctorId = trialExperienceViewModel.DoctorId, EvaluationCriteriaId = t, - TrialExperienceId = needUpdate.Id + TrialExperienceId = needUpdate.Id.Value })); - await _repository.AddRangeAsync(criteriaList); + await _trialExperienceCriteriaRepository.AddRangeAsync(criteriaList); - var success = await _repository.SaveChangesAsync(); + var success = await _trialExperienceCriteriaRepository.SaveChangesAsync(); return ResponseOutput.Result(success, trialExperienceViewModel.Id); } } @@ -119,7 +118,7 @@ namespace IRaCIS.Application.Services [HttpDelete, Route("{doctorId:guid}")] public async Task DeleteTrialExperience(Guid doctorId) { - var success = await _repository.BatchDeleteAsync(o => o.Id == doctorId); + var success = await _trialExperienceRepository.BatchDeleteNoTrackingAsync(o => o.Id == doctorId); return ResponseOutput.Result(success); } /// @@ -133,7 +132,7 @@ namespace IRaCIS.Application.Services { //_attachmentRepository.Delete(t => t.DoctorId == updateGCPExperienceParam.Id && t.Type == StaticData.GCP); - var successs = await _repository.BatchUpdateAsync(o => o.Id == updateGCPExperienceParam.Id, u => new Doctor() + var successs = await _doctorRepository.BatchUpdateNoTrackingAsync(o => o.Id == updateGCPExperienceParam.Id, u => new Doctor() { GCP = updateGCPExperienceParam.GCP, GCPId = (updateGCPExperienceParam.GCP==0||updateGCPExperienceParam.GCPId==null)?Guid.Empty: updateGCPExperienceParam.GCPId!.Value @@ -141,7 +140,7 @@ namespace IRaCIS.Application.Services if (updateGCPExperienceParam.GCP == 0 ) { - await _repository.BatchDeleteAsync(a => a.DoctorId == updateGCPExperienceParam.Id && a.Type=="GCP"); + await _attachmentRepository.BatchDeleteNoTrackingAsync(a => a.DoctorId == updateGCPExperienceParam.Id && a.Type=="GCP"); } return ResponseOutput.Result(successs, updateGCPExperienceParam.GCPId.ToString()); @@ -155,7 +154,7 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task UpdateOtherExperience(ClinicalExperienceCommand updateOtherClinicalExperience) { - var success = await _repository.BatchUpdateAsync(o => o.Id == updateOtherClinicalExperience.DoctorId, u => new Doctor() + var success = await _doctorRepository.BatchUpdateNoTrackingAsync(o => o.Id == updateOtherClinicalExperience.DoctorId, u => new Doctor() { OtherClinicalExperience = updateOtherClinicalExperience.OtherClinicalExperience ?? string.Empty, OtherClinicalExperienceCN = updateOtherClinicalExperience.OtherClinicalExperienceCN ?? string.Empty diff --git a/IRaCIS.Core.Application/Service/Doctor/VacationService.cs b/IRaCIS.Core.Application/Service/Doctor/VacationService.cs index 1cb5489ab..dff6bd463 100644 --- a/IRaCIS.Core.Application/Service/Doctor/VacationService.cs +++ b/IRaCIS.Core.Application/Service/Doctor/VacationService.cs @@ -23,7 +23,7 @@ namespace IRaCIS.Application.Services { var result = await _vacationRepository.AddAsync(_mapper.Map(param)); - var success = await _repository.SaveChangesAsync(); + var success = await _vacationRepository.SaveChangesAsync(); return ResponseOutput.Result(success, result.Id); diff --git a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs index 00633a230..134cf278a 100644 --- a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs +++ b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs @@ -37,6 +37,9 @@ namespace IRaCIS.Core.Application.Service public class EmailSendService( IRepository _trialEmailNoticeConfigRepository, IRepository _trialRepository, + IRepository _trialUserRepository, + IRepository _visitTaskRepository, + IRepository _trialSiteUserRepository, IOptionsMonitor _SystemEmailSendConfig) : BaseService, IEmailSendService { @@ -66,7 +69,7 @@ namespace IRaCIS.Core.Application.Service result = isPDConfirm; } - var taskInfo = await _repository.Where(t => t.Id == visitTaskId).Select(t => new + var taskInfo = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => new { t.Subject.TrialSiteId, t.Trial.ResearchProgramNo, @@ -124,10 +127,10 @@ namespace IRaCIS.Core.Application.Service public async Task SendTrialImageQCTaskEmailAsync(Guid trialId) { var isEn_us = false; - var trialInfo = await _repository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync(); + var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync(); //找到 该项目的IQC 用户Id - var userList = await _repository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.FullName }).ToListAsync(); + var userList = await _trialUserRepository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.FullName }).ToListAsync(); //判断是否任务可以领取 ,可以的话 发送邮件 var userIdList = userList.Select(t => t.UserId).ToList(); @@ -177,10 +180,10 @@ namespace IRaCIS.Core.Application.Service public async Task SendTrialQCQuestionEmailAsync(Guid trialId) { var isEn_us = false; - var trialInfo =await _repository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr, t.DeclarationTypeEnumList }).FirstNotNullAsync(); + var trialInfo =await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr, t.DeclarationTypeEnumList }).FirstNotNullAsync(); //找到 该项目的IQC 用户Id - var userList = await _repository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.FullName }).ToListAsync(); + var userList = await _trialUserRepository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.FullName }).ToListAsync(); //判断是否任务可以领取 ,可以的话 发送邮件 @@ -232,10 +235,10 @@ namespace IRaCIS.Core.Application.Service { var isEn_us = false; - var trialInfo = await _repository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync(); + var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync(); //找到 该项目的CRC 用户Id - var userList = await _repository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.User.FullName }).ToListAsync(); + var userList = await _trialUserRepository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.User.FullName }).ToListAsync(); //判断是否任务可以领取 ,可以的话 发送邮件 @@ -319,7 +322,7 @@ namespace IRaCIS.Core.Application.Service var allUserTypeEnumList = toUserTypeEnumList.Union(copyUserTypeEnumList).Distinct().ToList(); - var allUserList = await _repository.Where(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.User.UserTypeEnum)).Select(t => new { t.UserId, t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToListAsync(); + var allUserList = await _trialUserRepository.Where(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.User.UserTypeEnum)).Select(t => new { t.UserId, t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToListAsync(); var toUserList = allUserList.Where(t => toUserTypeEnumList.Contains(t.UserTypeEnum)) @@ -332,7 +335,7 @@ namespace IRaCIS.Core.Application.Service } if (trialSiteId != null && toUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA)) { - var curentSiteUserIdList = _repository.Where(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId).Select(t => t.UserId).ToList(); + var curentSiteUserIdList = _trialSiteUserRepository.Where(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId).Select(t => t.UserId).ToList(); toUserList = toUserList.Where(t => (t.UserTypeEnum != UserTypeEnum.CRA && t.UserTypeEnum != UserTypeEnum.ClinicalResearchCoordinator) || curentSiteUserIdList.Contains(t.UserId)).ToList(); } @@ -346,7 +349,7 @@ namespace IRaCIS.Core.Application.Service if (trialSiteId != null && copyUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA)) { - var curentSiteUserIdList = _repository.Where(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId).Select(t => t.UserId).ToList(); + var curentSiteUserIdList = _trialSiteUserRepository.Where(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId).Select(t => t.UserId).ToList(); copyUserList = copyUserList.Where(t => (t.UserTypeEnum != UserTypeEnum.CRA && t.UserTypeEnum != UserTypeEnum.ClinicalResearchCoordinator) || curentSiteUserIdList.Contains(t.UserId)).ToList(); } diff --git a/IRaCIS.Core.Application/Service/Document/SystemDocumentService.cs b/IRaCIS.Core.Application/Service/Document/SystemDocumentService.cs index 1c2fdd190..8ea2c4670 100644 --- a/IRaCIS.Core.Application/Service/Document/SystemDocumentService.cs +++ b/IRaCIS.Core.Application/Service/Document/SystemDocumentService.cs @@ -17,6 +17,7 @@ namespace IRaCIS.Core.Application.Services [ApiExplorerSettings(GroupName = "Trial")] public class SystemDocumentService( IRepository _systemDocumentRepository, + IRepository _userRepository, IRepository _systemDocConfirmedUserRepository) : BaseService, ISystemDocumentService { @@ -124,7 +125,7 @@ namespace IRaCIS.Core.Application.Services public async Task DeleteSystemDocumentAsync(Guid systemDocumentId) { - if (await _repository.Where(t => t.Id == systemDocumentId).AnyAsync(u => u.SystemDocConfirmedUserList.Any())) + if (await _systemDocumentRepository.Where(t => t.Id == systemDocumentId).AnyAsync(u => u.SystemDocConfirmedUserList.Any())) { //---已有用户阅读该文档,并签名,不允许删除。 return ResponseOutput.NotOk(_localizer["SystemD_CannotDeleteSignedFile"]); @@ -146,10 +147,10 @@ namespace IRaCIS.Core.Application.Services var query = from sysDoc in _systemDocumentRepository.Where(t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) .WhereIf(!string.IsNullOrEmpty(inQuery.Name), t => t.Name.Contains(inQuery.Name)) .WhereIf(inQuery.FileTypeId != null, t => t.FileTypeId == inQuery.FileTypeId) - join confirm in _repository.GetQueryable() on new { ConfirmUserId = _userInfo.Id, SystemDocumentId = sysDoc.Id } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc + join confirm in _systemDocConfirmedUserRepository.Where() on new { ConfirmUserId = _userInfo.Id, SystemDocumentId = sysDoc.Id } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc from confirm in cc.DefaultIfEmpty() - join user in _repository.GetQueryable() on _userInfo.Id equals user.Id + join user in _userRepository.Where() on _userInfo.Id equals user.Id select new UnionDocumentWithConfirmInfoView() { diff --git a/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs b/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs index 7bf559924..8e13c0287 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs @@ -25,7 +25,11 @@ namespace IRaCIS.Core.Application.Services IRepository _trialRepository, ISystemDocumentService _systemDocumentService, IRepository _systemDocConfirmedUserRepository, + IRepository _systemDocNeedConfirmedUserTypeRepository, + IRepository _trialDocNeedConfirmedUserTypeRepository, IRepository _systemDocumentRepository, + IRepository _trialUserRepository, + IRepository _trialDocConfirmedUserRepository, IRepository _readingQuestionCriterionTrialRepository) : BaseService, ITrialDocumentService { @@ -58,8 +62,8 @@ namespace IRaCIS.Core.Application.Services .WhereIf(inQuery.TrialId != null, t => t.TrialId == inQuery.TrialId) .Where(t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) - join trialUser in _repository.Where(t => t.UserId == _userInfo.Id) on trialDoc.TrialId equals trialUser.TrialId - join confirm in _repository.Where() on + join trialUser in _trialUserRepository.Where(t => t.UserId == _userInfo.Id) on trialDoc.TrialId equals trialUser.TrialId + join confirm in _trialDocConfirmedUserRepository.Where() on new { trialUser.UserId, TrialDocumentId = trialDoc.Id } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc from confirm in cc.DefaultIfEmpty() @@ -217,17 +221,17 @@ namespace IRaCIS.Core.Application.Services var trialId = inQuery.TrialId; - var trialInfo = await (_repository.Where(t => t.Id == inQuery.TrialId, ignoreQueryFilters: true).Select(t => new { t.TrialFinishedTime, t.TrialStatusStr }).FirstNotNullAsync()); + var trialInfo = await ( _trialRepository.Where(t => t.Id == inQuery.TrialId, ignoreQueryFilters: true).Select(t => new { t.TrialFinishedTime, t.TrialStatusStr }).FirstNotNullAsync()); //系统文档查询 - var systemDocumentQueryable = from needConfirmedUserType in _repository.Where(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) + var systemDocumentQueryable = from needConfirmedUserType in _systemDocNeedConfirmedUserTypeRepository.Where(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) //.Where(u => u.UserTypeRole.UserList.SelectMany(cc => cc.UserTrials.Where(t => t.TrialId == querySystemDocument.TrialId)).Any(e => e.Trial.TrialFinishedTime < u.SystemDocument.CreateTime)) .WhereIf(trialInfo.TrialFinishedTime != null, u => u.SystemDocument.CreateTime < trialInfo.TrialFinishedTime) .WhereIf(!_userInfo.IsAdmin, t => t.SystemDocument.IsDeleted == false || (t.SystemDocument.IsDeleted == true && t.SystemDocument.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) - join trialUser in _repository.Where(t => t.TrialId == inQuery.TrialId && t.UserId == _userInfo.Id) + join trialUser in _trialUserRepository.Where(t => t.TrialId == inQuery.TrialId && t.UserId == _userInfo.Id) on needConfirmedUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId - join confirm in _repository.GetQueryable() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmedUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc + join confirm in _systemDocConfirmedUserRepository.Where() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmedUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new UnionDocumentWithConfirmInfoView() { @@ -259,8 +263,8 @@ namespace IRaCIS.Core.Application.Services .WhereIf(!_userInfo.IsAdmin, t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) .WhereIf(!_userInfo.IsAdmin, t => t.IsDeleted == false || (t.IsDeleted == true && t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) - join trialUser in _repository.Where(t => t.TrialId == inQuery.TrialId && t.UserId == _userInfo.Id) on trialDoc.TrialId equals trialUser.TrialId - join confirm in _repository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) on + join trialUser in _trialUserRepository.Where(t => t.TrialId == inQuery.TrialId && t.UserId == _userInfo.Id) on trialDoc.TrialId equals trialUser.TrialId + join confirm in _trialDocConfirmedUserRepository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) on new { trialUser.UserId, TrialDocumentId = trialDoc.Id } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new UnionDocumentWithConfirmInfoView() @@ -389,15 +393,15 @@ namespace IRaCIS.Core.Application.Services #endregion - var trialInfo = (await _repository.Where(t => t.Id == inQuery.TrialId).Select(t => new { t.TrialFinishedTime, t.TrialStatusStr }).FirstNotNullAsync()); + var trialInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => new { t.TrialFinishedTime, t.TrialStatusStr }).FirstNotNullAsync()); - var trialDocQuery = from trialDocumentNeedConfirmedUserType in _repository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) - join trialUser in _repository.Where(t => t.TrialId == inQuery.TrialId) + var trialDocQuery = from trialDocumentNeedConfirmedUserType in _trialDocNeedConfirmedUserTypeRepository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) + join trialUser in _trialUserRepository.Where(t => t.TrialId == inQuery.TrialId) .WhereIf(inQuery.UserId != null, t => t.UserId == inQuery.UserId) .WhereIf(inQuery.UserTypeId != null, t => t.User.UserTypeId == inQuery.UserTypeId) on trialDocumentNeedConfirmedUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId - join confirm in _repository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) on + join confirm in _trialDocConfirmedUserRepository.Where(t => t.TrialDocument.TrialId == inQuery.TrialId) on new { trialUser.UserId, TrialDocumentId = trialDocumentNeedConfirmedUserType.TrialDocumentId } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new UnionDocumentWithConfirmInfoView() @@ -429,12 +433,12 @@ namespace IRaCIS.Core.Application.Services - var systemDocQuery = from needConfirmEdUserType in _repository.WhereIf(trialInfo.TrialFinishedTime != null, u => u.SystemDocument.CreateTime < trialInfo.TrialFinishedTime) + var systemDocQuery = from needConfirmEdUserType in _systemDocNeedConfirmedUserTypeRepository.WhereIf(trialInfo.TrialFinishedTime != null, u => u.SystemDocument.CreateTime < trialInfo.TrialFinishedTime) - join trialUser in _repository.Where(t => t.TrialId == inQuery.TrialId) + join trialUser in _trialUserRepository.Where(t => t.TrialId == inQuery.TrialId) .WhereIf(inQuery.UserId != null, t => t.UserId == inQuery.UserId) on needConfirmEdUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId - join confirm in _repository.GetQueryable() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmEdUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc + join confirm in _systemDocConfirmedUserRepository.Where() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmEdUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new UnionDocumentWithConfirmInfoView() { @@ -494,7 +498,7 @@ namespace IRaCIS.Core.Application.Services [HttpGet("{trialId:guid}")] public async Task> GetTrialUserSelect(Guid trialId) { - return await _repository.Where(t => t.TrialId == trialId) + return await _trialUserRepository.Where(t => t.TrialId == trialId) .Select(t => new TrialUserDto() { UserId = t.UserId, RealName = t.User.FullName, UserName = t.User.UserName }) .ToListAsync(); } @@ -618,7 +622,7 @@ namespace IRaCIS.Core.Application.Services { if (!await _systemDocConfirmedUserRepository.AnyAsync(t => t.SystemDocumentId == documentId && t.ConfirmUserId == _userInfo.Id)) { - await _repository.AddAsync(new SystemDocConfirmedUser() { SystemDocumentId = documentId, ConfirmUserId = _userInfo.Id, SignFirstViewTime = DateTime.Now }); + await _systemDocConfirmedUserRepository.AddAsync(new SystemDocConfirmedUser() { SystemDocumentId = documentId, ConfirmUserId = _userInfo.Id, SignFirstViewTime = DateTime.Now }); } @@ -629,14 +633,14 @@ namespace IRaCIS.Core.Application.Services if (!await _trialDocUserTypeConfirmedUserRepository.AnyAsync(t => t.TrialDocumentId == documentId && t.ConfirmUserId == _userInfo.Id)) { - await _repository.AddAsync(new TrialDocConfirmedUser() { TrialDocumentId = documentId, ConfirmUserId = _userInfo.Id, SignFirstViewTime = DateTime.Now }); + await _trialDocConfirmedUserRepository.AddAsync(new TrialDocConfirmedUser() { TrialDocumentId = documentId, ConfirmUserId = _userInfo.Id, SignFirstViewTime = DateTime.Now }); } } - success = await _repository.SaveChangesAsync(); + success = await _systemDocConfirmedUserRepository.SaveChangesAsync(); return ResponseOutput.Ok(success); } @@ -646,11 +650,11 @@ namespace IRaCIS.Core.Application.Services { if (!await _systemDocConfirmedUserRepository.AnyAsync(t => t.SystemDocumentId == documentId && t.ConfirmUserId == _userInfo.Id)) { - await _repository.AddAsync(new SystemDocConfirmedUser() { SystemDocumentId = documentId, ConfirmUserId = _userInfo.Id, SignFirstViewTime = DateTime.Now }); + await _systemDocConfirmedUserRepository.AddAsync(new SystemDocConfirmedUser() { SystemDocumentId = documentId, ConfirmUserId = _userInfo.Id, SignFirstViewTime = DateTime.Now }); } - var success = await _repository.SaveChangesAsync(); + var success = await _systemDocConfirmedUserRepository.SaveChangesAsync(); return ResponseOutput.Ok(success); } @@ -661,10 +665,10 @@ namespace IRaCIS.Core.Application.Services if (!await _trialDocUserTypeConfirmedUserRepository.AnyAsync(t => t.TrialDocumentId == documentId && t.ConfirmUserId == _userInfo.Id)) { - await _repository.AddAsync(new TrialDocConfirmedUser() { TrialDocumentId = documentId, ConfirmUserId = _userInfo.Id, SignFirstViewTime = DateTime.Now }); + await _trialDocConfirmedUserRepository.AddAsync(new TrialDocConfirmedUser() { TrialDocumentId = documentId, ConfirmUserId = _userInfo.Id, SignFirstViewTime = DateTime.Now }); } - var success = await _repository.SaveChangesAsync(); + var success = await _trialDocConfirmedUserRepository.SaveChangesAsync(); return ResponseOutput.Ok(success); } @@ -776,7 +780,7 @@ namespace IRaCIS.Core.Application.Services [Obsolete] public List GetTrialUserDocumentList(Guid trialId) { - var query = _repository.Where(t => t.TrialId == trialId) + var query = _trialUserRepository.Where(t => t.TrialId == trialId) .Select(t => new TrialUserUnionDocumentView() { UserId = t.UserId, @@ -805,8 +809,8 @@ namespace IRaCIS.Core.Application.Services [Obsolete] public async Task> GetTrialSystemDocumentList(DocumentTrialUnionQuery inQuery) { - var systemDocumentQueryable = _repository - .WhereIf(!_userInfo.IsAdmin, t => t.IsDeleted == false) + var systemDocumentQueryable = _systemDocumentRepository + .WhereIf(!_userInfo.IsAdmin, t => t.IsDeleted == false) .Select(t => new DocumentUnionWithUserStatView() { Id = t.Id, diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index a7bcd061a..dd74124a9 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -40,10 +40,16 @@ namespace IRaCIS.Core.Application.Service IRepository _emailNoticeConfigRepository, IRepository _trialRepository, IRepository _taskMedicalReviewRepository, + IRepository _readingGlobalTaskInfoRepository, IRepository _visitTaskRepository, IRepository _trialUserRepository, + IRepository _trialEmailNoticeUserRepository, IRepository _subjectRepository, + IRepository _readModuleRepository, + IRepository _readingTableQuestionAnswerRepository, IRepository _subjectVisitRepository, + IRepository _readingTaskQuestionAnswerRepository, + IRepository _readingQuestionCriterionTrialRepository, IEmailSendService _emailSendService) : BaseService, ITrialEmailNoticeConfigService { @@ -308,7 +314,7 @@ namespace IRaCIS.Core.Application.Service //入组确认 根据每个标准配置的是否自动发送,发送邮件与否 if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed) { - if (await _repository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() && + if (await _readingTableQuestionAnswerRepository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() && x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion)) { answer = "是"; @@ -335,7 +341,7 @@ namespace IRaCIS.Core.Application.Service if (answer == "是") { //把另外一个人的任务设置为不加急(如果项目加急是否 subject 加急是否) - var urgent = _repository.Where(t => t.Id == taskInfo.SourceSubjectVisitId).Select(t => new { IsSubjectUrgent = t.Subject.IsUrgent, t.Trial.IsUrgent }).FirstOrDefault(); + var urgent = _subjectVisitRepository.Where(t => t.Id == taskInfo.SourceSubjectVisitId).Select(t => new { IsSubjectUrgent = t.Subject.IsUrgent, t.Trial.IsUrgent }).FirstOrDefault(); if (urgent?.IsUrgent == false || urgent?.IsSubjectUrgent == false) { @@ -487,7 +493,7 @@ namespace IRaCIS.Core.Application.Service // if (taskInfo.ReadingCategory == ReadingCategory.Visit) // { // //存在阅片期 那么就是截止访视 - // if (await _repository.Where(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.SubjectVisitId == taskInfo.SourceSubjectVisitId && t.ReadingSetType == ReadingSetType.ImageReading).AnyAsync()) + // if (await _readModuleRepository.Where(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.SubjectVisitId == taskInfo.SourceSubjectVisitId && t.ReadingSetType == ReadingSetType.ImageReading).AnyAsync()) // { // isNeedSend = false; // } @@ -856,7 +862,7 @@ namespace IRaCIS.Core.Application.Service var currentLatestPdVisitId = pdSubjectVisitIdList.Last(); //标准配置 - var trialReadingCriterionConfig = await _repository.Where(t => t.Id == trialReadingCriterionId).Select(t => new + var trialReadingCriterionConfig = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingType, t.IsReadingTaskViewInOrder, t.CriterionType, t.ArbitrationRule }).FirstNotNullAsync(); // 项目双重 @@ -902,7 +908,7 @@ namespace IRaCIS.Core.Application.Service //仲裁在阅片期上 else if (trialReadingCriterionConfig.ArbitrationRule == ArbitrationRule.Reading) { - var existReadModule = await _repository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == currentLatestPdVisitId && t.ReadingSetType == ReadingSetType.ImageReading) + var existReadModule = await _readModuleRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == currentLatestPdVisitId && t.ReadingSetType == ReadingSetType.ImageReading) .FirstOrDefaultAsync(); if (existReadModule == null) @@ -975,7 +981,7 @@ namespace IRaCIS.Core.Application.Service // { // //存在阅片期 那么就是截止访视 - // var existReadModule = await _repository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == currentLatestPdVisitId && t.ReadingSetType == ReadingSetType.ImageReading) + // var existReadModule = await _readModuleRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == currentLatestPdVisitId && t.ReadingSetType == ReadingSetType.ImageReading) // .FirstOrDefaultAsync(); // if (existReadModule != null) // { @@ -1071,20 +1077,20 @@ namespace IRaCIS.Core.Application.Service if (readingCategory == ReadingCategory.Visit) { - visitQuestionAnswer = await _repository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); + visitQuestionAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); answer = visitQuestionAnswer.Answer; } else if (readingCategory == ReadingCategory.Global) { - var questionAnsewer = await _repository.Where(t => t.GlobalTaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.Tumor).OrderByDescending(c => c.VisitTask.VisitTaskNum).FirstNotNullAsync(); + var questionAnsewer = await _readingGlobalTaskInfoRepository.Where(t => t.GlobalTaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.Tumor).OrderByDescending(c => c.VisitTask.VisitTaskNum).FirstNotNullAsync(); answer = questionAnsewer.Answer; if (string.IsNullOrEmpty(questionAnsewer.Answer)) { - answer = await _repository.Where(t => questionAnsewer.TaskId == t.VisitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor) + answer = await _readingTaskQuestionAnswerRepository.Where(t => questionAnsewer.TaskId == t.VisitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor) .Select(t => t.Answer).FirstOrDefaultAsync(); } @@ -1093,7 +1099,7 @@ namespace IRaCIS.Core.Application.Service //{ // var judgeResultTaskId = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.JudgeResultTaskId).FirstNotNullAsync(); - // var questionAnsewer = await _repository.Where(t => t.VisitTaskId == judgeResultTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); + // var questionAnsewer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == judgeResultTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); // answer = questionAnsewer.Answer; @@ -1119,14 +1125,14 @@ namespace IRaCIS.Core.Application.Service if (readingCategory == ReadingCategory.Visit) { - visitQuestionAnswer = await _repository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); + visitQuestionAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); answer = visitQuestionAnswer.Answer; } else if (readingCategory == ReadingCategory.Global) { - var questionAnsewer = await _repository.Where(t => t.TaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); + var questionAnsewer = await _readingGlobalTaskInfoRepository.Where(t => t.TaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); answer = questionAnsewer.Answer; } @@ -1134,7 +1140,7 @@ namespace IRaCIS.Core.Application.Service //{ // //var judgeResultTaskId = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.JudgeResultTaskId).FirstNotNullAsync(); - // var questionAnsewer = await _repository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); + // var questionAnsewer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); // answer = questionAnsewer.Answer; //} @@ -1278,7 +1284,7 @@ namespace IRaCIS.Core.Application.Service }).FirstNotNullAsync(); - var list = await _repository.Where(t => t.TrialId == trialId && t.IsConfirm).Select(t => new { t.CriterionType, TrialReadingCriterionId = t.Id }).ToListAsync(); + var list = await _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == trialId && t.IsConfirm).Select(t => new { t.CriterionType, TrialReadingCriterionId = t.Id }).ToListAsync(); var addList = _mapper.Map>(batchAddList); @@ -1374,8 +1380,8 @@ namespace IRaCIS.Core.Application.Service { var id = (Guid)addOrEditTrialEmailNoticeConfig.Id; - await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfigId == addOrEditTrialEmailNoticeConfig.Id); - await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfigId == addOrEditTrialEmailNoticeConfig.Id); + await _trialEmailNoticeUserRepository.BatchDeleteNoTrackingAsync(t => t.TrialEmailNoticeConfigId == addOrEditTrialEmailNoticeConfig.Id); + await _trialEmailBlackUserRepository.BatchDeleteNoTrackingAsync(t => t.TrialEmailNoticeConfigId == addOrEditTrialEmailNoticeConfig.Id); List trialEmailNoticeUsers = new List(); @@ -1392,7 +1398,7 @@ namespace IRaCIS.Core.Application.Service trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.Copy, UserType = item, TrialEmailNoticeConfigId = id }); } - await _repository.AddRangeAsync(trialEmailNoticeUsers); + await _trialEmailNoticeUserRepository.AddRangeAsync(trialEmailNoticeUsers); foreach (var userid in addOrEditTrialEmailNoticeConfig.BlackUserIdList) { @@ -1459,7 +1465,7 @@ namespace IRaCIS.Core.Application.Service #region 人员还未加入,可以先配置邮件 历史废弃 - //var toUserList = await _repository.Where(t => t.TrialId == config.TrialId) + //var toUserList = await _trialUserRepository.Where(t => t.TrialId == config.TrialId) // .WhereIf(config.ToUserTypeList != null, t => config.ToUserTypeList.Contains(t.User.UserTypeEnum)) // .Select(t => new { t.User.EMail, t.User.FullName }).ToListAsync(); diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index 24982f635..be29c21d3 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -184,7 +184,7 @@ namespace IRaCIS.Core.Application.Contracts [NotDefault] public Guid SubjectVisitId { get; set; } - public decimal FileSize { get; set; } + public long FileSize { get; set; } public bool IsDicomReUpload { get; set; } @@ -206,7 +206,7 @@ namespace IRaCIS.Core.Application.Contracts public Guid SubjectVisitId { get; set; } - public decimal FileSize { get; set; } + public long FileSize { get; set; } public bool IsDicomReUpload { get; set; } @@ -360,5 +360,7 @@ namespace IRaCIS.Core.Application.Contracts public string Path { get; set; } = string.Empty; public string HtmlPath { get; set; } = string.Empty; + + public decimal FileFize { get; set; } } } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs index be6ce45cc..3f2c31f05 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs @@ -22,6 +22,7 @@ namespace IRaCIS.Core.Application.Services IRepository _seriesRepository, IRepository _instanceRepository, IRepository _dictionaryRepository, + IRepository _systemAnonymizationRepository, IDistributedLockProvider _distributedLockProvider) : BaseService, IDicomArchiveService { @@ -59,7 +60,7 @@ namespace IRaCIS.Core.Application.Services } - var anonymizeList = await _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_repository), TimeSpan.FromDays(7)); + var anonymizeList = await _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_systemAnonymizationRepository), TimeSpan.FromDays(7)); var fixedFiledList = anonymizeList.Where(t => t.IsFixed).ToList(); var ircFiledList = anonymizeList.Where(t => t.IsFixed == false).ToList(); diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index bf097ad74..58a9b9415 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -36,7 +36,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc IRepository _visitTaskRepository, IRepository _subjectVisitRepository, IOSSService _oSSService, + IRepository _dictionaryRepository, + IRepository _trialRepository, IRepository _studyMonitorRepository, + IRepository _taskStudyRepository, + IRepository _taskSeriesRepository, + IRepository _taskInstanceRepository, + IRepository _readingQuestionCriterionTrialRepository, IDistributedLockProvider _distributedLockProvider) : BaseService, IDownloadAndUploadService { @@ -99,7 +105,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { await SubejctRandomReadingTaskNameDeal(subjectId, trialReadingCriterionId); - var query = _repository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SourceSubjectVisitId != null + var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect) .Select(u => new SubjectImageUploadDTO() { @@ -174,7 +180,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc study.PatientBirthDate = $"{study.PatientBirthDate[0]}{study.PatientBirthDate[1]}{study.PatientBirthDate[2]}{study.PatientBirthDate[3]}-{study.PatientBirthDate[4]}{study.PatientBirthDate[5]}-{study.PatientBirthDate[6]}{study.PatientBirthDate[7]}"; } - var dicModalityList = _repository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList(); + var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList(); var modality = study.Modalities; @@ -237,7 +243,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { #region 获取该subject 已生成任务的访视的检查 - var queryStudy = _repository.Where(t => t.SubjectId == incommand.SubjectId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id).Select(u => new + var queryStudy = _visitTaskRepository.Where(t => t.SubjectId == incommand.SubjectId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id).Select(u => new { VisitTaskId = u.Id, SourceSubjectVisitId = u.SourceSubjectVisitId, @@ -286,7 +292,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc using (await @lock.AcquireAsync()) { //查询数据库获取最大的Code 没有记录则为0 - var dbStudyCodeIntMax = _repository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); + var dbStudyCodeIntMax = _taskStudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增 var cacheMaxCodeInt = await _fusionCache.GetOrDefaultAsync(CacheKeys.TrialStudyMaxCode(trialId)); @@ -313,7 +319,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc SpecialArchiveStudyDeal(study); modalitys = study.Modalities; - await _repository.AddAsync(study); + await _taskStudyRepository.AddAsync(study); studyMonitor.StudyId = study.Id; @@ -335,7 +341,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc //前端传递的数量不准,上传的时候,把失败的也加进来了,以实际数组的数字为准 series.InstanceCount = seriesItem.InstanceList.Count; - await _repository.AddAsync(series); + await _taskSeriesRepository.AddAsync(series); foreach (var instanceItem in seriesItem.InstanceList) { @@ -352,7 +358,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc //isntance.SubjectVisitId = incommand.SubjectVisitId; isntance.VisitTaskId = findOriginStudy.VisitTaskId; - await _repository.AddAsync(isntance); + await _taskInstanceRepository.AddAsync(isntance); } } @@ -365,7 +371,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), findOriginStudy.VisitTaskId.ToString()); - var study = await _repository.FirstOrDefaultAsync(t => t.Id == studyId); + var study = await _taskStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId); //重传的时候也要赋值检查Id studyMonitor.StudyId = study.Id; @@ -384,7 +390,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { var seriesId = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, trialId.ToString(), findOriginStudy.VisitTaskId.ToString()); - TaskSeries dicomSeries = await _repository.FirstOrDefaultAsync(t => t.Id == seriesId); + TaskSeries dicomSeries = await _taskSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId); //判断重复 if (dicomSeries == null) @@ -400,7 +406,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc //series.SubjectVisitId = incommand.SubjectVisitId; - dicomSeries = await _repository.AddAsync(series); + dicomSeries = await _taskSeriesRepository.AddAsync(series); //新的序列 那么 检查的序列数量+1 study.SeriesCount += 1; @@ -422,7 +428,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc insntance.SubjectId = incommand.SubjectId; insntance.VisitTaskId = findOriginStudy.VisitTaskId; - await _repository.AddAsync(insntance); + await _taskInstanceRepository.AddAsync(insntance); } @@ -438,7 +444,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc using (await @lock2.AcquireAsync()) { - await _repository.SaveChangesAsync(); + await _taskStudyRepository.SaveChangesAsync(); } } catch (Exception ex) @@ -465,9 +471,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc public async Task DeleteTaskStudy(Guid visitTaskId) { - await _repository.BatchDeleteAsync(t => t.VisitTaskId == visitTaskId); - await _repository.BatchDeleteAsync(t => t.VisitTaskId == visitTaskId); - await _repository.BatchDeleteAsync(t => t.VisitTaskId == visitTaskId); + await _taskStudyRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId); + await _taskSeriesRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId); + await _taskInstanceRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId); return ResponseOutput.Ok(); } @@ -484,7 +490,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { - var extralConfig = _repository.Where(t => t.Id == trialId).Select(t => t.TrialExtraConfigJsonStr).FirstOrDefault() ?? string.Empty; + var extralConfig = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialExtraConfigJsonStr).FirstOrDefault() ?? string.Empty; var config = JsonConvert.DeserializeObject(extralConfig) ?? new TrialExtraConfig(); @@ -542,7 +548,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc if (inQuery.TrialReadingCriterionId != null) { - var criterionInfo = await _repository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.IsImageFilter, t.CriterionModalitys }).FirstOrDefaultAsync(); + var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.IsImageFilter, t.CriterionModalitys }).FirstOrDefaultAsync(); if (criterionInfo != null) { diff --git a/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/NoneDicomStudyService.cs similarity index 87% rename from IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs rename to IRaCIS.Core.Application/Service/ImageAndDoc/NoneDicomStudyService.cs index ed4e6e254..63a74b56f 100644 --- a/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/NoneDicomStudyService.cs @@ -19,7 +19,9 @@ namespace IRaCIS.Core.Application.Contracts public class NoneDicomStudyService( IRepository _noneDicomStudyRepository, IRepository _noneDicomStudyFileRepository, + IRepository _trialRepository, IDistributedLockProvider _distributedLockProvider, + IRepository _subjectVisitRepository, QCCommon _qCCommon) : BaseService, INoneDicomStudyService { @@ -42,11 +44,11 @@ namespace IRaCIS.Core.Application.Contracts public async Task> AddOrUpdateNoneDicomStudy(NoneDicomStudyAddOrEdit addOrEditNoneDicomStudy) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditNoneDicomStudy.SubjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, addOrEditNoneDicomStudy.SubjectVisitId); - if (_repository.Where(t => t.Id == addOrEditNoneDicomStudy.TrialId).Any(t => t.IsVerifyVisitImageDate==true)) + if ( _trialRepository.Where(t => t.Id == addOrEditNoneDicomStudy.TrialId).Any(t => t.IsVerifyVisitImageDate==true)) { - await _qCCommon.VerifyStudyImageDataAsync(_repository, addOrEditNoneDicomStudy.SubjectId, addOrEditNoneDicomStudy.SubjectVisitId, addOrEditNoneDicomStudy.ImageDate); + await _qCCommon.VerifyStudyImageDataAsync(_subjectVisitRepository, addOrEditNoneDicomStudy.SubjectId, addOrEditNoneDicomStudy.SubjectVisitId, addOrEditNoneDicomStudy.ImageDate); } @@ -92,7 +94,7 @@ namespace IRaCIS.Core.Application.Contracts //提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除 - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); await _noneDicomStudyRepository.DeleteFromQueryAsync(noneDicomStudyId); @@ -112,7 +114,7 @@ namespace IRaCIS.Core.Application.Contracts public async Task DeleteNoneDicomStudyFile(Guid noneDicomStudyFileId, Guid subjectVisitId) { //提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除 - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); var noneDicomStudyFile = await _noneDicomStudyFileRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyFileId); @@ -141,7 +143,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpGet("{subjectVisitId:guid}")] public async Task> GetVisitNoneDicomStudyFileList(Guid subjectVisitId) { - return await _repository.Where(t => t.NoneDicomStudy.SubjectVisitId == subjectVisitId) + return await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudy.SubjectVisitId == subjectVisitId) .ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken }).ToListAsync(); } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index 7a489fc87..9edffb891 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -14,7 +14,6 @@ using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System.Threading; using Medallion.Threading; -using System.Reactive.Subjects; using DocumentFormat.OpenXml.Drawing.Diagrams; using IRaCIS.Core.Application.Service.ImageAndDoc.DTO; using ZiggyCreatures.Caching.Fusion; @@ -28,7 +27,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc IRepository _dicomSeriesRepository, IRepository _dicomstudyRepository, IRepository _dictionaryRepository, + IRepository _trialRepository, + IRepository _visitTaskRepository, + IRepository _dicomStudyRepository, + IRepository _subjectRepository, IRepository _studyMonitorRepository, + IRepository _systemAnonymizationRepository, + IRepository _noneDicomStudyRepository, IDistributedLockProvider _distributedLockProvider) : BaseService, IStudyService { @@ -345,7 +350,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var svExpression = QCCommon.GetDicomStudySubjectVisitFilter(inQuery.VisitPlanArray); - var dicomStudyQuery = _repository.Where(t => t.TrialId == inQuery.TrialId) + var dicomStudyQuery = _dicomStudyRepository.Where(t => t.TrialId == inQuery.TrialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) //.WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) .WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression) @@ -394,7 +399,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var svExpression2 = QCCommon.GetNoneDicomStudySubjectVisitFilter(inQuery.VisitPlanArray); - var nodeDicomStudyQuery = _repository.Where(t => t.TrialId == inQuery.TrialId) + var nodeDicomStudyQuery = _noneDicomStudyRepository.Where(t => t.TrialId == inQuery.TrialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) //.WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) .WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression2) @@ -456,7 +461,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc public async Task> GetDicomAndNoneDicomStudyMonitorList(StudyQuery inQuery) { var svExpression = QCCommon.GetStudyMonitorSubjectVisitFilter(inQuery.VisitPlanArray); - var StudyMonitorQuery = _repository.Where(t => t.TrialId == inQuery.TrialId, ignoreQueryFilters: true) + var StudyMonitorQuery = _studyMonitorRepository.Where(t => t.TrialId == inQuery.TrialId, ignoreQueryFilters: true) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) //.WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) .WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression) @@ -576,9 +581,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc // }; #endregion - var studyInfo = _repository.Where(u => u.SubjectVisitId == subjectVisitId).Select(t => new { t.SubjectId, t.TrialId }).FirstOrDefault().IfNullThrowException(); + var studyInfo = _dicomStudyRepository.Where(u => u.SubjectVisitId == subjectVisitId).Select(t => new { t.SubjectId, t.TrialId }).FirstOrDefault().IfNullThrowException(); - var query = _repository.Where(t => t.SubjectVisitId != subjectVisitId && t.TrialId == studyInfo.TrialId && t.SubjectId == studyInfo.SubjectId) + var query = _dicomStudyRepository.Where(t => t.SubjectVisitId != subjectVisitId && t.TrialId == studyInfo.TrialId && t.SubjectId == studyInfo.SubjectId) .ProjectTo(_mapper.ConfigurationProvider).ToList(); var list = query.OrderBy(u => u.VisitName).ThenBy(s => s.StudyCode).ToList(); @@ -593,7 +598,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc [AllowAnonymous] public IResponseOutput Item(Guid studyId) { - return ResponseOutput.Ok(_mapper.Map(_repository.Where().FirstOrDefault(s => s.Id == studyId))); + return ResponseOutput.Ok(_mapper.Map(_dicomStudyRepository.Where().FirstOrDefault(s => s.Id == studyId))); } @@ -602,7 +607,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc public async Task>> VerifyTaskStudyAllowUploadAsync(VerifyTaskUploadOrReupload verifyInfo) { - var queryStudy = _repository.Where(t => t.SubjectId == verifyInfo.SubjectId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id).Select(u => new + var queryStudy = _visitTaskRepository.Where(t => t.SubjectId == verifyInfo.SubjectId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id).Select(u => new { VisitTaskId = u.Id, SourceSubjectVisitId = u.SourceSubjectVisitId, @@ -632,7 +637,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var subjectId = verifyInfo.SubjectId; - var visitList = _repository.Where(t => t.SubjectId == verifyInfo.SubjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToList(); + var visitList = _subjectVisitRepository.Where(t => t.SubjectId == verifyInfo.SubjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToList(); foreach (var waitUploadItem in verifyInfo.StudyInstanceUidList) { @@ -641,7 +646,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var result = new VerifyStudyUploadResult(); - if ( _fusionCache.GetOrDefault($"StudyUid_{trialId}_{studyInstanceUid}") != _userInfo.Id) + if (_fusionCache.GetOrDefault($"StudyUid_{trialId}_{studyInstanceUid}") != _userInfo.Id) { result.AllowUpload = false; @@ -707,7 +712,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc - var systemAnonymizationList = _repository.Where(t => t.IsEnable).ToList(); + var systemAnonymizationList = _systemAnonymizationRepository.Where(t => t.IsEnable).ToList(); return ResponseOutput.Ok>(resultList, new { @@ -724,11 +729,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc [HttpPost] public IResponseOutput> VerifyStudyAllowUpload(VerifyUploadOrReupload verifyInfo) { - var trialInfo = _repository.Where().FirstOrDefault(t => t.Id == verifyInfo.TrialId).IfNullThrowException(); + var trialInfo = _trialRepository.Where().FirstOrDefault(t => t.Id == verifyInfo.TrialId).IfNullThrowException(); var result = new List(); - var visitList = _repository.Where(t => t.SubjectId == verifyInfo.SubjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToList(); + var visitList = _subjectVisitRepository.Where(t => t.SubjectId == verifyInfo.SubjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToList(); verifyInfo.StudyInstanceUidList.ForEach(waitUploadItem => @@ -768,7 +773,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc // 写入dicom 固定的信息,以及组织路径的信息 以及匿名化的信息 var otherData = GetSaveToDicomInfo(verifyInfo.SubjectVisitId); - var anonymizeList = _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_repository), TimeSpan.FromDays(7)).Result; + var anonymizeList = _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_systemAnonymizationRepository), TimeSpan.FromDays(7)).Result; return ResponseOutput.Ok>(result, new { @@ -782,9 +787,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc private VerifyStudyUploadResult VerifyStudyUpload(string studyInstanceUid, Guid trialId, Guid currentSubjectVisitId, Guid SubjectId) { + var cacheUserId = _fusionCache.TryGet(CacheKeys.TrialStudyUidUploading(trialId, studyInstanceUid)); + var result = new VerifyStudyUploadResult(); - if (_fusionCache.GetOrDefault(CacheKeys.TrialStudyUidUploading(trialId, studyInstanceUid)) != _userInfo.Id) + if (cacheUserId.GetValueOrDefault() != _userInfo.Id && cacheUserId.HasValue) { result.AllowUpload = false; @@ -797,7 +804,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc return result; } - if (_repository.Where(t => t.Id == SubjectId).Select(t => t.Status).FirstOrDefault() == SubjectStatus.EndOfVisit) + if (_subjectRepository.Where(t => t.Id == SubjectId).Select(t => t.Status).FirstOrDefault() == SubjectStatus.EndOfVisit) { result.AllowUpload = false; @@ -813,7 +820,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc - var verifyStudyInfo = _repository.Where(t => t.TrialId == trialId && t.Id == expectStudyId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault(); + var verifyStudyInfo = _dicomStudyRepository.Where(t => t.TrialId == trialId && t.Id == expectStudyId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault(); result.StudyInfo = verifyStudyInfo; @@ -830,7 +837,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { result.AllowReUpload = true; - result.UploadedSeriesList = _repository.Where(t => t.StudyId == verifyStudyInfo.Id).Select(t => new UploadedSeries() + result.UploadedSeriesList = _dicomSeriesRepository.Where(t => t.StudyId == verifyStudyInfo.Id).Select(t => new UploadedSeries() { SeriesId = t.Id, SeriesInstanceUid = t.SeriesInstanceUid, SOPInstanceUIDList = t.DicomInstanceList.Select(c => c.SopInstanceUid).ToList() }).ToList(); } //不是同一个受试者 diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/SystemAnonymizationService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/SystemAnonymizationService.cs index 601d5884a..9307cadc8 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/SystemAnonymizationService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/SystemAnonymizationService.cs @@ -14,7 +14,7 @@ namespace IRaCIS.Core.Application.Service /// SystemAnonymizationService /// [ApiExplorerSettings(GroupName = "Image")] - public class SystemAnonymizationService(IRepository systemAnonymizationRepository) : BaseService, ISystemAnonymizationService + public class SystemAnonymizationService(IRepository _systemAnonymizationRepository) : BaseService, ISystemAnonymizationService { @@ -22,7 +22,7 @@ namespace IRaCIS.Core.Application.Service public async Task> GetSystemAnonymizationList(SystemAnonymizationQuery inQuery) { - var systemAnonymizationQueryable = systemAnonymizationRepository + var systemAnonymizationQueryable = _systemAnonymizationRepository .WhereIf(!string.IsNullOrEmpty(inQuery.Group), t => t.Group.Contains(inQuery.Group)) .WhereIf(!string.IsNullOrEmpty(inQuery.Element), t => t.Element.Contains(inQuery.Element)) .WhereIf(inQuery.IsAdd != null, t => t.IsAdd == inQuery.IsAdd) @@ -36,7 +36,7 @@ namespace IRaCIS.Core.Application.Service public async Task AddOrUpdateSystemAnonymization(SystemAnonymizationAddOrEdit addOrEditSystemAnonymization) { - var entity = await _repository.InsertOrUpdateAsync(addOrEditSystemAnonymization, true); + var entity = await _systemAnonymizationRepository.InsertOrUpdateAsync(addOrEditSystemAnonymization, true); return ResponseOutput.Ok(entity.Id.ToString()); @@ -47,7 +47,7 @@ namespace IRaCIS.Core.Application.Service [HttpDelete("{systemAnonymizationId:guid}")] public async Task DeleteSystemAnonymization(Guid systemAnonymizationId) { - var success = await systemAnonymizationRepository.BatchDeleteNoTrackingAsync(t => t.Id == systemAnonymizationId); + var success = await _systemAnonymizationRepository.BatchDeleteNoTrackingAsync(t => t.Id == systemAnonymizationId); return ResponseOutput.Result(success); } diff --git a/IRaCIS.Core.Application/Service/Inspection/FrontAuditConfigService.cs b/IRaCIS.Core.Application/Service/Inspection/FrontAuditConfigService.cs index dfbe31491..592ca05f9 100644 --- a/IRaCIS.Core.Application/Service/Inspection/FrontAuditConfigService.cs +++ b/IRaCIS.Core.Application/Service/Inspection/FrontAuditConfigService.cs @@ -33,7 +33,9 @@ namespace IRaCIS.Core.Application.Service IRepository _qCChallengeRepository, IRepository _dictionaryRepository, IRepository _trialRepository, - IRepository _checkChallengeDialogRepository) : BaseService, IFrontAuditConfigService + IRepository _userRepository, + + IRepository _checkChallengeDialogRepository) : BaseService, IFrontAuditConfigService { @@ -403,7 +405,7 @@ namespace IRaCIS.Core.Application.Service //用户的数据稽查没有 临时处理 - var userObj = await _repository.Where(t => t.Id == objectRelationParentId).Select(t => new { UserRealName = t.FullName, t.Phone, t.UserName, UserType = t.UserTypeRole.UserTypeShortName, t.EMail, t.OrganizationName }).FirstOrDefaultAsync(); + var userObj = await _userRepository.Where(t => t.Id == objectRelationParentId).Select(t => new { UserRealName = t.FullName, t.Phone, t.UserName, UserType = t.UserTypeRole.UserTypeShortName, t.EMail, t.OrganizationName }).FirstOrDefaultAsync(); if (userObj != null) { @@ -942,8 +944,8 @@ namespace IRaCIS.Core.Application.Service [HttpGet] public async Task> GetAuditConfigChildList(Guid frontAuditConfigId) { - //var list = await (from data in _repository.GetQueryable().Where(x => x.Id == frontAuditConfigId) - // join childrenType in _repository.GetQueryable() on data.Id equals childrenType.ParentId + //var list = await (from data in _frontAuditConfigRepository.Where().Where(x => x.Id == frontAuditConfigId) + // join childrenType in _frontAuditConfigRepository.Where() on data.Id equals childrenType.ParentId // select childrenType).OrderBy(x => x.Sort).ToListAsync(); //return list; @@ -992,7 +994,8 @@ namespace IRaCIS.Core.Application.Service var additem = await _frontAuditConfigRepository.FirstOrDefaultAsync(x => x.Id == item.AddItemGuid); - var alllist = _frontAuditConfigRepository.Where(x => item.DataSourceGuids.Contains(x.ParentId)).ToList().GroupBy(x => new { x.ValueCN }, (key, lst) => new FrontAuditConfig + //跟踪的方式查询,直接修改,然后保存数据库 + var alllist = _frontAuditConfigRepository.Where(x => item.DataSourceGuids.Contains(x.ParentId),true).ToList().GroupBy(x => new { x.ValueCN }, (key, lst) => new FrontAuditConfig { Sort = lst.Select(x => x.Sort).FirstOrDefault(), TableConfigJsonStr = lst.Select(x => x.TableConfigJsonStr).FirstOrDefault(), @@ -1063,9 +1066,8 @@ namespace IRaCIS.Core.Application.Service }); - await _repository.UpdateRange(neewupdate); - await _repository.AddRangeAsync(list); - await _repository.SaveChangesAsync(); + await _frontAuditConfigRepository.AddRangeAsync(list); + await _frontAuditConfigRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -1092,14 +1094,14 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task> GetFrontAuditConfigList(FrontAuditConfigQuery iq) { - var query = from data in _repository.GetQueryable() - join childrenType in _repository.GetQueryable() on data.ChildrenTypeId equals childrenType.Id into childrenTypetemp + var query = from data in _frontAuditConfigRepository.Where() + join childrenType in _dictionaryRepository.Where() on data.ChildrenTypeId equals childrenType.Id into childrenTypetemp from leftchildrenType in childrenTypetemp.DefaultIfEmpty() - join ModuleType in _repository.GetQueryable() on data.ModuleTypeId equals ModuleType.Id into ModuleTypetemp + join ModuleType in _dictionaryRepository.Where() on data.ModuleTypeId equals ModuleType.Id into ModuleTypetemp from leftModuleType in ModuleTypetemp.DefaultIfEmpty() - join OptTypeId in _repository.GetQueryable() on data.OptTypeId equals OptTypeId.Id into OptTypeIdtemp + join OptTypeId in _dictionaryRepository.Where() on data.OptTypeId equals OptTypeId.Id into OptTypeIdtemp from leftOptTypeId in OptTypeIdtemp.DefaultIfEmpty() - join ObjectTypeId in _repository.GetQueryable() on data.ObjectTypeId equals ObjectTypeId.Id into ObjectTypeIdtemp + join ObjectTypeId in _dictionaryRepository.Where() on data.ObjectTypeId equals ObjectTypeId.Id into ObjectTypeIdtemp from leftObjectTypeIdtemp in ObjectTypeIdtemp.DefaultIfEmpty() select new FrontAuditConfigView() { @@ -1235,7 +1237,7 @@ namespace IRaCIS.Core.Application.Service //---存在子类 不能删除 return ResponseOutput.NotOk(_localizer["FrontAudit_CannotDelSub"]); } - var success = await _repository.BatchDeleteAsync(t => t.Id == frontAuditConfigId); + var success = await _frontAuditConfigRepository.BatchDeleteNoTrackingAsync(t => t.Id == frontAuditConfigId); return ResponseOutput.Result(success); } diff --git a/IRaCIS.Core.Application/Service/Inspection/InspectionService.cs b/IRaCIS.Core.Application/Service/Inspection/InspectionService.cs index 0f0112510..0ee0e60e5 100644 --- a/IRaCIS.Core.Application/Service/Inspection/InspectionService.cs +++ b/IRaCIS.Core.Application/Service/Inspection/InspectionService.cs @@ -13,6 +13,15 @@ namespace IRaCIS.Core.Application.Service.Inspection [NonDynamicWebApi] public class InspectionService( IRepository _dataInspectionRepository, + IRepository _dictionaryRepository, + IRepository _trialSignRepository, + IRepository _userRepository, + IRepository _trialSiteRepository, + IRepository _trialRepository, + IRepository _subjectRepository, + IRepository _subjectVisitRepository, + IRepository _userTypeRepository, + IRepository _visitTaskRepository, IRepository _frontAuditConfigRepository) : BaseService, IInspectionService { @@ -23,66 +32,66 @@ namespace IRaCIS.Core.Application.Service.Inspection { //_repository.GetQueryable.GetQueryable < DataInspection > - var trialData = await _repository.GetQueryable().Where(x => x.Id == inQuery.TrialId).AsNoTracking().FirstNotNullAsync(); + var trialData = await _trialRepository.Where(x => x.Id == inQuery.TrialId).AsNoTracking().FirstNotNullAsync(); trialData.TrialFinishTime = trialData.TrialFinishTime == null ? DateTime.Now : trialData.TrialFinishTime; #region 逻辑代码 - var query = from data in _repository.GetQueryable() + var query = from data in _dataInspectionRepository.Where() //.Where(x => (x.TrialId == dto.TrialId)||(x.TrialId==null&&x.CreateTime>= trialData.CreateTime && x.CreateTime <= trialData.TrialFinishTime)) - join trial in _repository.GetQueryable().IgnoreQueryFilters() on data.TrialId equals trial.Id into trialtemp + join trial in _trialRepository.Where().IgnoreQueryFilters() on data.TrialId equals trial.Id into trialtemp from leftrial in trialtemp.DefaultIfEmpty() - join trialSite in _repository.GetQueryable().IgnoreQueryFilters() on data.TrialSiteId equals trialSite.Id into trialSitetemp + join trialSite in _trialSiteRepository.Where().IgnoreQueryFilters() on data.TrialSiteId equals trialSite.Id into trialSitetemp from lefttrialSite in trialSitetemp.DefaultIfEmpty() - join subject in _repository.GetQueryable().IgnoreQueryFilters() on data.SubjectId equals subject.Id into subtemp + join subject in _subjectRepository.Where().IgnoreQueryFilters() on data.SubjectId equals subject.Id into subtemp from leftsubject in subtemp.DefaultIfEmpty() - join subjectVisit in _repository.GetQueryable().IgnoreQueryFilters() on data.SubjectVisitId equals subjectVisit.Id into subjectVisittemp + join subjectVisit in _subjectVisitRepository.Where().IgnoreQueryFilters() on data.SubjectVisitId equals subjectVisit.Id into subjectVisittemp from leftsubjectVisit in subjectVisittemp.DefaultIfEmpty() - join parent in _repository.GetQueryable() on data.ParentId equals parent.Id into parenttemp + join parent in _dataInspectionRepository.Where() on data.ParentId equals parent.Id into parenttemp from leftparent in parenttemp.DefaultIfEmpty() - join user in _repository.GetQueryable().IgnoreQueryFilters() on data.CreateUserId equals user.Id into usertemp + join user in _userRepository.Where().IgnoreQueryFilters() on data.CreateUserId equals user.Id into usertemp from leftuser in usertemp.DefaultIfEmpty() - join usertype in _repository.GetQueryable().IgnoreQueryFilters() on leftuser.UserTypeId equals usertype.Id into usertypetemp + join usertype in _userTypeRepository.Where().IgnoreQueryFilters() on leftuser.UserTypeId equals usertype.Id into usertypetemp from leftusertype in usertypetemp.DefaultIfEmpty() - join visttask in _repository.GetQueryable().IgnoreQueryFilters() on data.VisitTaskId equals visttask.Id into visttasktemp + join visttask in _visitTaskRepository.Where().IgnoreQueryFilters() on data.VisitTaskId equals visttask.Id into visttasktemp from leftvisttask in visttasktemp.DefaultIfEmpty() //join trialCriterion in _repository.GetQueryable().IgnoreQueryFilters() on data.TrialReadingCriterionId equals trialCriterion.Id into criterion //from leftCriterion in criterion.DefaultIfEmpty() - //join moduleTyped in _repository.GetQueryable().Where(x => x.Code == "ModuleType") on 1 equals 1 - //join moduleTypec in _repository.GetQueryable() on new { ParentId = moduleTyped.Id, ModuleType = data.ModuleType } equals new { ParentId = moduleTypec.ParentId.Value, ModuleType = moduleTypec.Value } into moduleTypectemp + //join moduleTyped in _dictionaryRepository.Where().Where(x => x.Code == "ModuleType") on 1 equals 1 + //join moduleTypec in _dictionaryRepository.Where() on new { ParentId = moduleTyped.Id, ModuleType = data.ModuleType } equals new { ParentId = moduleTypec.ParentId.Value, ModuleType = moduleTypec.Value } into moduleTypectemp - //join childrenTyped in _repository.GetQueryable().Where(x => x.Code == "ChildrenType") on 1 equals 1 - //join childrenTypec in _repository.GetQueryable() on new { ParentId = childrenTyped.Id, ModuleType = data.ChildrenType } equals new { ParentId = childrenTypec.ParentId.Value, ModuleType = childrenTypec.Value } into childrenTypectemp + //join childrenTyped in _dictionaryRepository.Where().Where(x => x.Code == "ChildrenType") on 1 equals 1 + //join childrenTypec in _dictionaryRepository.Where() on new { ParentId = childrenTyped.Id, ModuleType = data.ChildrenType } equals new { ParentId = childrenTypec.ParentId.Value, ModuleType = childrenTypec.Value } into childrenTypectemp //from leftchildrenTypec in childrenTypectemp.DefaultIfEmpty() - //join ObjectTyped in _repository.GetQueryable().Where(x => x.Code == "ObjectType") on 1 equals 1 - //join ObjectTypec in _repository.GetQueryable() on new { ParentId = ObjectTyped.Id, ModuleType = data.ObjectType } equals new { ParentId = ObjectTypec.ParentId.Value, ModuleType = ObjectTypec.Value } into objectTypetemp + //join ObjectTyped in _dictionaryRepository.Where().Where(x => x.Code == "ObjectType") on 1 equals 1 + //join ObjectTypec in _dictionaryRepository.Where() on new { ParentId = ObjectTyped.Id, ModuleType = data.ObjectType } equals new { ParentId = ObjectTypec.ParentId.Value, ModuleType = ObjectTypec.Value } into objectTypetemp //from leftObjectType in objectTypetemp.DefaultIfEmpty() - //join OptTyped in _repository.GetQueryable().Where(x => x.Code == "OptType") on 1 equals 1 - //join OptTypec in _repository.GetQueryable() on new { ParentId = OptTyped.Id, ModuleType = data.OptType } equals new { ParentId = OptTypec.ParentId.Value, ModuleType = OptTypec.Value } into optTypetemp + //join OptTyped in _dictionaryRepository.Where().Where(x => x.Code == "OptType") on 1 equals 1 + //join OptTypec in _dictionaryRepository.Where() on new { ParentId = OptTyped.Id, ModuleType = data.OptType } equals new { ParentId = OptTypec.ParentId.Value, ModuleType = OptTypec.Value } into optTypetemp //from leftOptType in optTypetemp.DefaultIfEmpty() - join trialSign in _repository.GetQueryable().IgnoreQueryFilters() on data.SignId equals trialSign.Id into trialSigntemp + join trialSign in _trialSignRepository.Where().IgnoreQueryFilters() on data.SignId equals trialSign.Id into trialSigntemp from lefttrialSign in trialSigntemp.DefaultIfEmpty() - join leftfrontAuditConfig in _repository.GetQueryable().Where(x => x.ConfigType == "M" && x.Identification != null && x.IsEnable == true) on + join leftfrontAuditConfig in _frontAuditConfigRepository.Where().Where(x => x.ConfigType == "M" && x.Identification != null && x.IsEnable == true) on data.Identification.ToLower() equals leftfrontAuditConfig.Identification.ToLower() - join moduleTypec in _repository.GetQueryable() on new { ModuleType = leftfrontAuditConfig.ModuleTypeId!.Value } equals new { ModuleType = moduleTypec.Id } into moduleTypectemp + join moduleTypec in _dictionaryRepository.Where() on new { ModuleType = leftfrontAuditConfig.ModuleTypeId!.Value } equals new { ModuleType = moduleTypec.Id } into moduleTypectemp from leftmoduleTypec in moduleTypectemp.DefaultIfEmpty() - join OptTypec in _repository.GetQueryable() on new { ModuleType = leftfrontAuditConfig.OptTypeId!.Value } equals new { ModuleType = OptTypec.Id } into optTypetemp + join OptTypec in _dictionaryRepository.Where() on new { ModuleType = leftfrontAuditConfig.OptTypeId!.Value } equals new { ModuleType = OptTypec.Id } into optTypetemp from leftOptType in optTypetemp.DefaultIfEmpty() select new GetDataInspectionOutDto() @@ -242,7 +251,7 @@ namespace IRaCIS.Core.Application.Service.Inspection { if (response.IsSuccess) { - await _repository.BatchUpdateAsync(t => t.Id == signId, u => new TrialSign() { IsCompleted = true }); + await _trialSignRepository.BatchUpdateNoTrackingAsync(t => t.Id == signId, u => new TrialSign() { IsCompleted = true }); } } @@ -251,7 +260,7 @@ namespace IRaCIS.Core.Application.Service.Inspection /// 验证用户签名信息 /// public async Task VerifySignatureAsync(SignDTO signDTO) { - var user = await _repository.FirstOrDefaultAsync(u => u.UserName == signDTO.UserName && u.Password == signDTO.PassWord); + var user = await _userRepository.FirstOrDefaultAsync(u => u.UserName == signDTO.UserName && u.Password == signDTO.PassWord); if (user == null) { throw new BusinessValidationFailedException(_localizer["User_CheckNameOrPw"]); @@ -268,9 +277,9 @@ namespace IRaCIS.Core.Application.Service.Inspection /// 添加签名记录 /// public async Task AddSignRecordAsync(SignDTO signDTO) { - var add = await _repository.AddAsync(_mapper.Map(signDTO)); + var add = await _trialSignRepository.AddAsync(_mapper.Map(signDTO)); - var success = await _repository.SaveChangesAsync(); + var success = await _trialSignRepository.SaveChangesAsync(); return add.Id; diff --git a/IRaCIS.Core.Application/Service/Institution/SiteService.cs b/IRaCIS.Core.Application/Service/Institution/SiteService.cs index 4076898c0..cc20b12b8 100644 --- a/IRaCIS.Core.Application/Service/Institution/SiteService.cs +++ b/IRaCIS.Core.Application/Service/Institution/SiteService.cs @@ -15,6 +15,7 @@ namespace IRaCIS.Application.Services IRepository _siteRepository, IRepository _trialSiteUserRepository, IDistributedLockProvider _distributedLockProvider, + IRepository _trialSiteRepository, IRepository _hospitalRepository) : BaseService, ISiteService { @@ -46,7 +47,7 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task> GetTrialSiteList(TrialSiteInQuery inQuery) { - var query = _repository.Where(t => t.SiteId == null) + var query = _trialSiteRepository.Where(t => t.SiteId == null) .WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteName), t => t.TrialSiteName.Contains(inQuery.TrialSiteName) || t.TrialSiteAliasName.Contains(inQuery.TrialSiteName)) .WhereIf(!string.IsNullOrEmpty(inQuery.TrialCode), t => t.Trial.TrialCode.Contains(inQuery.TrialCode)) .Select(t => new TrialSiteAddView() @@ -100,7 +101,7 @@ namespace IRaCIS.Application.Services if (siteCommand.TrialSiteId != null) { - await _repository.BatchUpdateAsync(t => t.Id == siteCommand.TrialSiteId, u => new TrialSite() { SiteId = site.Id }); + await _trialSiteRepository.BatchUpdateNoTrackingAsync(t => t.Id == siteCommand.TrialSiteId, u => new TrialSite() { SiteId = site.Id }); } return ResponseOutput.Ok(site.Id.ToString()); diff --git a/IRaCIS.Core.Application/Service/Management/MenuService.cs b/IRaCIS.Core.Application/Service/Management/MenuService.cs index 866c77b7a..65bb7a1f1 100644 --- a/IRaCIS.Core.Application/Service/Management/MenuService.cs +++ b/IRaCIS.Core.Application/Service/Management/MenuService.cs @@ -7,7 +7,7 @@ namespace IRaCIS.Application.Services { [ApiExplorerSettings(GroupName = "Management")] public class MenuService( - IRepository menuRepository, + IRepository _menuRepository, IRepository _userTypeMenuRepository) : BaseService, IMenuService { @@ -26,7 +26,7 @@ namespace IRaCIS.Application.Services VerifyMsg = _localizer["Menu_ParentDupChild"] }; - var menu = await _repository.InsertOrUpdateAsync(menuAddOrUpdateModel, true, exp); + var menu = await _menuRepository.InsertOrUpdateAsync(menuAddOrUpdateModel, true, exp); return ResponseOutput.Ok(menu.Id.ToString()); @@ -85,13 +85,13 @@ namespace IRaCIS.Application.Services [HttpDelete("{menuId:guid}")] public async Task DeleteMenu(Guid menuId) { - if (await menuRepository.AnyAsync(t => t.ParentId == menuId)) + if (await _menuRepository.AnyAsync(t => t.ParentId == menuId)) { //---该节点存在子节点,请在删除子节点后,再删除该节点。 return ResponseOutput.NotOk(_localizer["Menu_ChildExist"]); } - var success =await menuRepository.BatchDeleteNoTrackingAsync(u => u.Id == menuId); + var success =await _menuRepository.BatchDeleteNoTrackingAsync(u => u.Id == menuId); return ResponseOutput.Result(success); } @@ -104,7 +104,7 @@ namespace IRaCIS.Application.Services [HttpGet] public async Task> GetMenuTree() { - var allMenuList = (await menuRepository.ProjectTo(_mapper.ConfigurationProvider).ToListAsync()).IfNullThrowException(); + var allMenuList = (await _menuRepository.ProjectTo(_mapper.ConfigurationProvider).ToListAsync()).IfNullThrowException(); var list = allMenuList.ToTree((root, child) => child.ParentId == Guid.Empty, (root, child) => child.ParentId == root.MenuId, @@ -125,7 +125,7 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task> GetMenuList(MenuQueyDTO menuQueyDTO) { - return await menuRepository + return await _menuRepository .WhereIf(menuQueyDTO.ParentId != null, t => t.ParentId == menuQueyDTO.ParentId) .WhereIf(menuQueyDTO.IsEnable != null, t => t.IsEnable == menuQueyDTO.IsEnable) .WhereIf(menuQueyDTO.IsCache != null, t => t.IsCache == menuQueyDTO.IsCache) @@ -146,7 +146,7 @@ namespace IRaCIS.Application.Services [HttpGet("{userTypeId:guid}")] public async Task> GetUserTypeMenuTree(Guid userTypeId) { - var menuFunctionlist = (await menuRepository + var menuFunctionlist = (await _menuRepository .ProjectTo(_mapper.ConfigurationProvider, new { userTypeId = userTypeId }).ToListAsync()).IfNullThrowException(); @@ -189,7 +189,7 @@ namespace IRaCIS.Application.Services .Where(t => t.UserTypeId == _userInfo.UserTypeId && t.Menu.MenuType == "F") .Select(t => t.Menu.PermissionStr).ToListAsync(); - //var str = await _repository.Where(t => t.Id == _userInfo.UserTypeId).Select(t => t.PermissionStr).FirstOrDefaultAsync(); + //var str = await _userTypeRepository.Where(t => t.Id == _userInfo.UserTypeId).Select(t => t.PermissionStr).FirstOrDefaultAsync(); list.Add(_userInfo.PermissionStr); diff --git a/IRaCIS.Core.Application/Service/Management/UserFeedBackService.cs b/IRaCIS.Core.Application/Service/Management/UserFeedBackService.cs index c91073667..86919aca8 100644 --- a/IRaCIS.Core.Application/Service/Management/UserFeedBackService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserFeedBackService.cs @@ -19,7 +19,10 @@ namespace IRaCIS.Core.Application.Service /// UserFeedBackService /// [ApiExplorerSettings(GroupName = "Management")] - public class UserFeedBackService (IRepository _userFeedBackRepository) : BaseService, IUserFeedBackService + public class UserFeedBackService (IRepository _userFeedBackRepository, + IRepository _visitTaskRepository, + IRepository _subjectVisitRepository, + IRepository _subjectRepository) : BaseService, IUserFeedBackService { @@ -74,7 +77,7 @@ namespace IRaCIS.Core.Application.Service if (addOrEditUserFeedBack.VisitTaskId != null) { - var info = await _repository.Where(t => t.Id == addOrEditUserFeedBack.VisitTaskId).Select(t => new { t.SubjectId, t.SourceSubjectVisitId, t.Subject.TrialSiteId }).FirstOrDefaultAsync(); + var info = await _visitTaskRepository.Where(t => t.Id == addOrEditUserFeedBack.VisitTaskId).Select(t => new { t.SubjectId, t.SourceSubjectVisitId, t.Subject.TrialSiteId }).FirstOrDefaultAsync(); if (info != null) { @@ -86,7 +89,7 @@ namespace IRaCIS.Core.Application.Service else if (addOrEditUserFeedBack.SubjectVisitId != null) { - var info = await _repository.Where(t => t.Id == addOrEditUserFeedBack.SubjectVisitId).Select(t => new { t.TrialSiteId, t.SubjectId }).FirstOrDefaultAsync(); + var info = await _subjectVisitRepository.Where(t => t.Id == addOrEditUserFeedBack.SubjectVisitId).Select(t => new { t.TrialSiteId, t.SubjectId }).FirstOrDefaultAsync(); if (info != null) { @@ -96,7 +99,7 @@ namespace IRaCIS.Core.Application.Service } else if (addOrEditUserFeedBack.SubjectId != null) { - var info = await _repository.Where(t => t.Id == addOrEditUserFeedBack.SubjectId).Select(t => new { t.TrialSiteId }).FirstOrDefaultAsync(); + var info = await _subjectRepository.Where(t => t.Id == addOrEditUserFeedBack.SubjectId).Select(t => new { t.TrialSiteId }).FirstOrDefaultAsync(); if (info != null) { diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs index 050f4009c..d2aa0a4ed 100644 --- a/IRaCIS.Core.Application/Service/Management/UserService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserService.cs @@ -32,6 +32,7 @@ namespace IRaCIS.Application.Services IRepository _userPassWordLogRepository, IDistributedLockProvider _distributedLockProvider, IEasyCachingProvider _cache, + IRepository _trialRepository, IOptionsMonitor _verifyConfig, IOptionsMonitor systemEmailConfig, @@ -814,7 +815,7 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task> GetUserLogList(UserLogQuery inQuery) { - DateTime? trialCreateTime = inQuery.TrialId != null ? _repository.Where(t => t.Id == inQuery.TrialId).Select(t => t.CreateTime).FirstOrDefault() : null; + DateTime? trialCreateTime = inQuery.TrialId != null ? _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => t.CreateTime).FirstOrDefault() : null; var userLogQueryable = _userLogRepository diff --git a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs index 0d3f1ac5f..189191b3c 100644 --- a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs @@ -14,7 +14,7 @@ namespace IRaCIS.Core.Application.Contracts /// UserTypeRoleService /// [ApiExplorerSettings(GroupName = "Management")] - public class UserTypeRoleService(IRepository _userTypeRepository) : BaseService, IUserTypeService + public class UserTypeRoleService(IRepository _userTypeRepository, IRepository _userRepository) : BaseService, IUserTypeService { [HttpPost] @@ -71,7 +71,7 @@ namespace IRaCIS.Core.Application.Contracts await _userTypeRepository.EntityVerifyAsync(entity.Id, verifyExp1); } - var success = await _repository.SaveChangesAsync(); + var success = await _userTypeRepository.SaveChangesAsync(); return ResponseOutput.Ok( entity.Id.ToString()); @@ -81,7 +81,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpDelete("{userTypeId:guid}")] public async Task DeleteUserTypeRole(Guid userTypeId) { - if ( await _repository.AnyAsync(t => t.UserTypeId == userTypeId)) + if ( await _userRepository.AnyAsync(t => t.UserTypeId == userTypeId)) { //---该用户类型中已存在用户,不能删除 return ResponseOutput.NotOk(_localizer["UserType_InUse"]); diff --git a/IRaCIS.Core.Application/Service/QC/ClinicalDataService.cs b/IRaCIS.Core.Application/Service/QC/ClinicalDataService.cs index 5e682bb99..6ac863684 100644 --- a/IRaCIS.Core.Application/Service/QC/ClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/QC/ClinicalDataService.cs @@ -34,7 +34,7 @@ namespace IRaCIS.Core.Application.Contracts // 最完美方式 其中TrialSite 通过导航属性 两个字段连接出来 - var clinicalObj = await _repository.Where(t => t.Id == subjectVisitId) + var clinicalObj = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId) .ProjectTo(_mapper.ConfigurationProvider, new { subjectVisitId = subjectVisitId, token = _userInfo.UserToken }).FirstOrDefaultAsync().IfNullThrowException(); return clinicalObj; @@ -54,7 +54,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpPost("{trialId:guid}")] public async Task> AddOrUpdatePreviousHistory(PreviousHistoryAddOrEdit addOrEditPreviousHistory) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousHistory.SubjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, addOrEditPreviousHistory.SubjectVisitId); var entity = await _previousHistoryRepository.InsertOrUpdateAsync(addOrEditPreviousHistory, true); return ResponseOutput.Ok(entity.Id); @@ -64,7 +64,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousHistoryId:guid}")] public async Task DeletePreviousHistory(Guid previousHistoryId,Guid subjectVisitId) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); await _previousHistoryRepository.DeleteFromQueryAsync(t => t.Id == previousHistoryId,true); return ResponseOutput.Ok(); } @@ -81,7 +81,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpPost("{trialId:guid}")] public async Task> AddOrUpdatePreviousOther(PreviousOtherAddOrEdit addOrEditPreviousOther) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousOther.SubjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, addOrEditPreviousOther.SubjectVisitId); var entity = await _previousOtherRepository.InsertOrUpdateAsync(addOrEditPreviousOther, true); return ResponseOutput.Ok(entity.Id); @@ -91,7 +91,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousOtherId:guid}")] public async Task DeletePreviousOther(Guid previousOtherId, Guid subjectVisitId) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); await _previousOtherRepository.DeleteFromQueryAsync(t => t.Id == previousOtherId,true); return ResponseOutput.Ok(); @@ -109,7 +109,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpPost("{trialId:guid}")] public async Task> AddOrUpdatePreviousSurgery(PreviousSurgeryAddOrEdit addOrEditPreviousSurgery) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousSurgery.SubjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, addOrEditPreviousSurgery.SubjectVisitId); var entity = await _previousSurgeryRepository.InsertOrUpdateAsync(addOrEditPreviousSurgery, true); return ResponseOutput.Ok(entity.Id); } @@ -118,7 +118,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousSurgeryId:guid}")] public async Task DeletePreviousSurgery(Guid previousSurgeryId, Guid subjectVisitId) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); var success = await _previousSurgeryRepository.DeleteFromQueryAsync(t => t.Id == previousSurgeryId,true); return ResponseOutput.Ok(); } @@ -135,7 +135,7 @@ namespace IRaCIS.Core.Application.Contracts public async Task AddOrUpdatePreviousPDF(PreviousPDFAddOrEdit addOrEditPreviousPDF) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousPDF.SubjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, addOrEditPreviousPDF.SubjectVisitId); var entity = await _previousPdfRepository.InsertOrUpdateAsync(addOrEditPreviousPDF, true); return ResponseOutput.Ok(entity.Id); @@ -144,7 +144,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousPDFId:guid}")] public async Task DeletePreviousPDF(Guid previousPDFId, Guid subjectVisitId) { - await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); + await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); await _previousPdfRepository.DeleteFromQueryAsync(t => t.Id == previousPDFId,true); return ResponseOutput.Ok(); diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 6c545b2d4..cea1ddb9d 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -1,4 +1,5 @@ -using IRaCIS.Core.Application.Contracts.DTO; +using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson; +using IRaCIS.Core.Application.Contracts.DTO; using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; @@ -8,6 +9,7 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Web; +using static MassTransit.ValidationResultExtensions; namespace IRaCIS.Core.Application.Contracts { @@ -36,8 +38,8 @@ namespace IRaCIS.Core.Application.Contracts { public Guid TrialId { get; set; } - public Guid? VisitId { get; set; } - } + public Guid? VisitId { get; set; } + } public class QCVisitSearchDTO : PageInput { @@ -54,8 +56,8 @@ namespace IRaCIS.Core.Application.Contracts public Guid TrialId { get; set; } public Guid? TrialSiteId { get; set; } - public Guid? VisitId { get; set; } - public Guid? SubjectId { get; set; } + public Guid? VisitId { get; set; } + public Guid? SubjectId { get; set; } public string SubjectInfo { get; set; } = String.Empty; @@ -132,7 +134,7 @@ namespace IRaCIS.Core.Application.Contracts - public string OutEnrollmentVisitName { get; set; } = String.Empty; + public string OutEnrollmentVisitName { get; set; } = String.Empty; public string BodyPartTypes { get; set; } = String.Empty; @@ -211,7 +213,7 @@ namespace IRaCIS.Core.Application.Contracts //临床数据收集 - public string ClinicalDataCollect => $"{DicomStudyCount},{NoneDicomStudyCount}{(IsBaseLine? (ClinicalInformationTransmissionEnum>0 && IsHaveClinicalData ? ",w/" : ",w/o") :"" )}"; + public string ClinicalDataCollect => $"{DicomStudyCount},{NoneDicomStudyCount}{(IsBaseLine ? (ClinicalInformationTransmissionEnum > 0 && IsHaveClinicalData ? ",w/" : ",w/o") : "")}"; public int? DicomStudyCount { get; set; } public int? NoneDicomStudyCount { get; set; } @@ -257,7 +259,7 @@ namespace IRaCIS.Core.Application.Contracts } - public class QCVisitExportDTO: CRCVisitExportDTO + public class QCVisitExportDTO : CRCVisitExportDTO { //上传人 public string SubmitUserRealName { get; set; } @@ -294,7 +296,7 @@ namespace IRaCIS.Core.Application.Contracts public string Content { get; set; } = string.Empty; - [DictionaryTranslateAttribute("YesOrNo")] + [DictionaryTranslateAttribute("ChallengeIsClosed")] public bool IsClosed { get; set; } public DateTime? ClosedTime { get; set; } @@ -317,10 +319,9 @@ namespace IRaCIS.Core.Application.Contracts [DictionaryTranslateAttribute("ReuploadEnum")] public QCChanllengeReuploadEnum ReuploadEnum { get; set; } + public List DialogList { get; set; } - - - public string DialogStr { get; set; } + public string DialogStr => string.Join("\n\n", DialogList.OrderBy(t => t.CreateTime).Select(c => c.UserName + " (" + ExportExcelConverterDate.DateTimeInternationalToString(c.CreateTime) + ") :" + c.Content)); //public SubmitStateEnum SubmitState { get; set; } //public string? CurrentActionUserName { get; set; } @@ -341,6 +342,16 @@ namespace IRaCIS.Core.Application.Contracts } + public class DialogInfo + { + public DateTime CreateTime { get; set; } + + public string UserName { get; set; } + + public string Content { get; set; } + } + + public class SubjectExportDTO { @@ -636,7 +647,7 @@ namespace IRaCIS.Core.Application.Contracts public int FileCount { get; set; } [DictionaryTranslateAttribute("YesOrNo")] - public bool IsSuccess { get; set; } + public bool IsSuccess { get; set; } public string Note { get; set; } = string.Empty; @@ -717,7 +728,8 @@ namespace IRaCIS.Core.Application.Contracts public string CheckResult { get; set; } = String.Empty; - public string CheckDialogStr { get; set; } + public List CheckDialogList { get; set; } + public string CheckDialogStr => string.Join("\n\n", CheckDialogList.OrderBy(t => t.CreateTime).Select(c => c.UserName + " (" + ExportExcelConverterDate.DateTimeInternationalToString(c.CreateTime) + ") :" + c.Content)); public DateTime? CheckBackTime { get; set; } @@ -792,7 +804,7 @@ namespace IRaCIS.Core.Application.Contracts { - + public string? ReReadingNewTaskCode { get; set; } @@ -988,7 +1000,7 @@ namespace IRaCIS.Core.Application.Contracts public Guid VisitTaskId { get; set; } public string Answer { get; set; } - + } @@ -1218,17 +1230,17 @@ namespace IRaCIS.Core.Application.Contracts public class GetNextCRCChallengeInDto { - [NotDefault] - public Guid TrialId { get; set; } + [NotDefault] + public Guid TrialId { get; set; } - /// - /// QCChallengeId - /// - public Guid QCChallengeId { get; set; } - } + /// + /// QCChallengeId + /// + public Guid QCChallengeId { get; set; } + } - public class ChallengeQuery : PageInput + public class ChallengeQuery : PageInput { [NotDefault] public Guid TrialId { get; set; } @@ -1247,7 +1259,7 @@ namespace IRaCIS.Core.Application.Contracts public Guid? CreateUserId { get; set; } - } + } public class QCCRCChallengeViewModel { @@ -1438,7 +1450,7 @@ namespace IRaCIS.Core.Application.Contracts public List DialogList { get; set; } } - public class QCCheckWithModalityView: QCCheckViewModel + public class QCCheckWithModalityView : QCCheckViewModel { public DateTime? EarliestScanDate { get; set; } @@ -1446,7 +1458,7 @@ namespace IRaCIS.Core.Application.Contracts public List ModalityList { get; set; } - public string Modalitys =>string.Join(',', ModalityList); + public string Modalitys => string.Join(',', ModalityList); } public class QCCheckViewModel @@ -1589,7 +1601,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsLostVisit { get; set; } - public string VisitImageZipPath { get; set; } + public string VisitImageZipPath { get; set; } public PackState PackState { get; set; } @@ -1599,7 +1611,7 @@ namespace IRaCIS.Core.Application.Contracts public DateTime? PreliminaryAuditTime { get; set; } - public DateTime? AuditTime => QCProcessEnum == TrialQCProcess.SingleAudit ? PreliminaryAuditTime : (QCProcessEnum == TrialQCProcess.DoubleAudit ? ReviewAuditTime : null); + public DateTime? AuditTime => QCProcessEnum == TrialQCProcess.SingleAudit ? PreliminaryAuditTime : (QCProcessEnum == TrialQCProcess.DoubleAudit ? ReviewAuditTime : null); } diff --git a/IRaCIS.Core.Application/Service/QC/QCCommon.cs b/IRaCIS.Core.Application/Service/QC/QCCommon.cs index dba63d1bb..554cc9362 100644 --- a/IRaCIS.Core.Application/Service/QC/QCCommon.cs +++ b/IRaCIS.Core.Application/Service/QC/QCCommon.cs @@ -8,24 +8,24 @@ namespace IRaCIS.Core.Application.Service public class QCCommon: BaseService { - + /// /// 验证CRC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人 /// - /// + /// /// /// /// /// - public async Task VerifyIsCRCSubmmitAsync(IRepository _repository, IUserInfo _userInfo, Guid? subjectVisitId = null) + public async Task VerifyIsCRCSubmmitAsync(IRepository _subjectVisitRepository, IUserInfo _userInfo, Guid? subjectVisitId = null) { if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator) { //添加的时候不验证 if (subjectVisitId != null) { - if (await _repository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted && + if (await _subjectVisitRepository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted && (!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload)))) { //---CRC 已提交影像,不能进行操作。 @@ -39,17 +39,17 @@ namespace IRaCIS.Core.Application.Service if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) { - await VerifyIsCanQCAsync(_repository, _userInfo, null, subjectVisitId); + await VerifyIsCanQCAsync(_subjectVisitRepository, _userInfo, null, subjectVisitId); } } - public async Task VerifyIsCanQCAsync(IRepository _repository, IUserInfo _userInfo, SubjectVisit? subjectVisit = null, Guid? subjectVisitId = null) + public async Task VerifyIsCanQCAsync(IRepository _subjectVisitRepository, IUserInfo _userInfo, SubjectVisit? subjectVisit = null, Guid? subjectVisitId = null) { if (subjectVisitId != null) { - subjectVisit = (await _repository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); + subjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); } if (subjectVisit!.CurrentActionUserId != _userInfo.Id) { @@ -60,11 +60,11 @@ namespace IRaCIS.Core.Application.Service - public async Task VerifyStudyImageDataAsync(IRepository _repository, Guid subjectId, Guid subjectVisitId, DateTime imageDate) + public async Task VerifyStudyImageDataAsync(IRepository _subjectVisitRepository, Guid subjectId, Guid subjectVisitId, DateTime imageDate) { - var visitList = await _repository.Where(t => t.SubjectId == subjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToListAsync(); + var visitList = await _subjectVisitRepository.Where(t => t.SubjectId == subjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToListAsync(); - var currentVisitNum = await _repository.Where(t => t.Id == subjectVisitId).Select(t => t.VisitNum).FirstOrDefaultAsync(); + var currentVisitNum = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => t.VisitNum).FirstOrDefaultAsync(); diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index 13114153a..c6f841f1e 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -20,6 +20,11 @@ namespace IRaCIS.Core.Application.Image.QA IRepository _clinicalDataTrialSet, IRepository _trialQCQuestionAnswerRepository, IRepository _trialQCQuestionRepository, + IRepository _dicomStudyRepository, + IRepository _trialUserRepository, + IRepository _dicomSeriesRepository, + IRepository _noneDicomStudyRepository, + IRepository _qcChallengeRepository, IReadingImageTaskService _IReadingImageTaskService) : BaseService, IQCListService { @@ -58,7 +63,7 @@ namespace IRaCIS.Core.Application.Image.QA var defalutSortArray = new string[] { nameof(SubjectVisit.IsUrgent) + " desc", nameof(SubjectVisit.SubjectId), nameof(SubjectVisit.VisitNum) }; var pageList = await query.ToPagedListAsync(inQuery, defalutSortArray); - var config = await _repository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); + var config = await _trialRepository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); config.IsHaveSubjectClinicalData = await _clinicalDataTrialSet.AnyAsync(x => x.TrialId == inQuery.TrialId && x.IsConfirm && (x.ClinicalDataLevel == ClinicalLevel.Subject ) && x.UploadRole == UploadRole.CRC); config.IsHaveVisitClinicalData = await _clinicalDataTrialSet.AnyAsync(x => x.TrialId == inQuery.TrialId && x.IsConfirm && (x.ClinicalDataLevel == ClinicalLevel.SubjectVisit) && x.UploadRole == UploadRole.CRC); return ResponseOutput.Ok (pageList, config); @@ -134,7 +139,7 @@ namespace IRaCIS.Core.Application.Image.QA var svExpression = QCCommon.GetQCChallengeFilter(inQuery.VisitPlanArray); - var query = _repository.Where(x => x.TrialId == inQuery.TrialId) + var query = _qcChallengeRepository.Where(x => x.TrialId == inQuery.TrialId) //.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState) .WhereIf(inQuery.ReuploadEnum != null, t => t.ReuploadEnum == inQuery.ReuploadEnum) .WhereIf(inQuery.IsClosed != null, t => t.IsClosed == inQuery.IsClosed) @@ -152,7 +157,7 @@ namespace IRaCIS.Core.Application.Image.QA var pageList = await query.ToPagedListAsync(inQuery, new string[] { "IsUrgent desc", "CreateTime asc" }); - var config = await _repository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); + var config = await _trialRepository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return ResponseOutput.Ok (pageList, config); } @@ -173,7 +178,7 @@ namespace IRaCIS.Core.Application.Image.QA var svExpression = QCCommon.GetQCChallengeFilter(inQuery.VisitPlanArray); - var query = _repository.Where(x => x.TrialId == inQuery.TrialId) + var query = _qcChallengeRepository.Where(x => x.TrialId == inQuery.TrialId) //.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState) .WhereIf(inQuery.ReuploadEnum != null, t => t.ReuploadEnum == inQuery.ReuploadEnum) .WhereIf(inQuery.IsClosed != null, t => t.IsClosed == inQuery.IsClosed) @@ -190,7 +195,7 @@ namespace IRaCIS.Core.Application.Image.QA var pageList = await query.ToPagedListAsync(inQuery, new string[] { "IsUrgent desc", "IsClosed asc" }); - var config = await _repository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); + var config = await _trialRepository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return (pageList, config); } @@ -260,7 +265,7 @@ namespace IRaCIS.Core.Application.Image.QA - var config = await _repository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); + var config = await _trialRepository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return ResponseOutput.Ok (pageList, config); @@ -292,7 +297,7 @@ namespace IRaCIS.Core.Application.Image.QA .ProjectTo(_mapper.ConfigurationProvider); var pageList = await query.ToPagedListAsync(inQuery); - var config = await _repository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); + var config = await _trialRepository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return (pageList, config); } @@ -371,7 +376,7 @@ namespace IRaCIS.Core.Application.Image.QA ExistsManual= (await _IReadingImageTaskService.GetManualList(new GetManualListInDto() { TrialId = sv.TrialId })).Count() > 0, SeriesList = temp.SeriesList, RelationInfo = await GetVisitQCSubjectInfo(subjectVisitId), - NoneDicomStudyList = await _repository.Where(t => t.SubjectVisitId == subjectVisitId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(), + NoneDicomStudyList = await _noneDicomStudyRepository.Where(t => t.SubjectVisitId == subjectVisitId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(), SubjectClinicalData = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId) .ProjectTo(_mapper.ConfigurationProvider, new { subjectVisitId = subjectVisitId, token = _userInfo.UserToken }).FirstOrDefaultAsync() }; @@ -441,16 +446,16 @@ namespace IRaCIS.Core.Application.Image.QA //https://github.com/dotnet/efcore/issues/26833 ef core 导航属性不支持右连接 // 直接用ProjectTo的方式 多做一次查询 代码简洁很多 特别是连表多,字段多的情况 - if (await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess && t.CurrentQCEnum == currentQCType)) + if (await _trialQCQuestionAnswerRepository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess && t.CurrentQCEnum == currentQCType)) { - var list = await _repository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess && t.CurrentQCEnum == currentQCType).OrderBy(t => t.TrialQCQuestionConfigure.ShowOrder) + var list = await _trialQCQuestionAnswerRepository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess && t.CurrentQCEnum == currentQCType).OrderBy(t => t.TrialQCQuestionConfigure.ShowOrder) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); return list; } else { - return await _repository.Where(t => t.IsEnable == true && t.TrialId == trialId).OrderBy(t => t.ShowOrder).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + return await _trialQCQuestionRepository.Where(t => t.IsEnable == true && t.TrialId == trialId).OrderBy(t => t.ShowOrder).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } } @@ -466,7 +471,7 @@ namespace IRaCIS.Core.Application.Image.QA [HttpGet("{subjectVisitId:guid}/{trialQCProcess:int}/{currentQCType:int}")] public async Task> GetHistoryChallengeList(Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType) { - var qaChallengeQuery = _repository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess) + var qaChallengeQuery = _qcChallengeRepository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess) .WhereIf(currentQCType == CurrentQC.First, t => t.CurrentQCEnum == currentQCType)//复审的时候可以看到初审的质疑 .ProjectTo(_mapper.ConfigurationProvider); var qaChallenges = await qaChallengeQuery.ToListAsync(); @@ -498,10 +503,10 @@ namespace IRaCIS.Core.Application.Image.QA [HttpGet("{subjectVisitId:guid}")] public async Task GetVisitQCStudyAndSeriesList(Guid subjectVisitId) { - var studyList = await _repository.Where(s => s.SubjectVisitId == subjectVisitId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var studyList = await _dicomStudyRepository.Where(s => s.SubjectVisitId == subjectVisitId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var studyIds = studyList.Select(t => t.StudyId).ToList(); - var seriesList = await _repository.Where(t => studyIds.Contains(t.StudyId)).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider) + var seriesList = await _dicomSeriesRepository.Where(t => studyIds.Contains(t.StudyId)).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider) .OrderBy(t => t.StudyCode).ThenBy(t => t.SeriesNumber).ToListAsync(); return new QAStudySeriesInfo { StudyList = studyList, SeriesList = seriesList }; @@ -518,10 +523,10 @@ namespace IRaCIS.Core.Application.Image.QA { var visit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).FirstNotNullAsync(); - var list= await _repository.Where(s => s.SubjectVisitId == subjectVisitId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).OrderBy(t=>t.StudyCode).ToListAsync(); + var list= await _dicomStudyRepository.Where(s => s.SubjectVisitId == subjectVisitId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).OrderBy(t=>t.StudyCode).ToListAsync(); - var config = await _repository.Where(t => t.Id == subjectVisitId).Select(t=>t.Trial).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); + var config = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t=>t.Trial).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); config.IsHaveStudyClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.IsConfirm && x.TrialId == visit.TrialId && x.ClinicalDataLevel == ClinicalLevel.Study); @@ -540,7 +545,7 @@ namespace IRaCIS.Core.Application.Image.QA public async Task> GetQCChallengeDialogList(Guid qaChallengeId) { - var list = await _repository.Where(t => t.Id == qaChallengeId) + var list = await _qcChallengeRepository.Where(t => t.Id == qaChallengeId) .ProjectTo(_mapper.ConfigurationProvider, new { currentUserId = _userInfo.Id }).ToListAsync(); //利用automapper 运行时映射 @@ -562,7 +567,7 @@ namespace IRaCIS.Core.Application.Image.QA public async Task> GetCRCVisitChallengeAndDialog(Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess) { - var qaChallengeQuery = _repository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess) + var qaChallengeQuery = _qcChallengeRepository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess) .ProjectTo(_mapper.ConfigurationProvider, new { currentUserId = _userInfo.Id }); var list = await qaChallengeQuery.ToListAsync(); @@ -581,7 +586,7 @@ namespace IRaCIS.Core.Application.Image.QA public async Task> GetQCChallengeCreatorList(Guid trialId) { - return await _repository.Where(t => t.TrialId == trialId && t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new QCChanllengeCreatorDto() + return await _trialUserRepository.Where(t => t.TrialId == trialId && t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new QCChanllengeCreatorDto() { CreatorRealName = t.User.FullName, Creator = t.User.UserName, @@ -598,7 +603,7 @@ namespace IRaCIS.Core.Application.Image.QA [HttpGet("{trialId:guid}")] public async Task> GetQCParticipantList(Guid trialId) { - return await _repository.Where(t => t.TrialId == trialId && (t.User.UserTypeEnum == UserTypeEnum.IQC || t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)).Select(t => new ParticipantDTO() + return await _trialUserRepository.Where(t => t.TrialId == trialId && (t.User.UserTypeEnum == UserTypeEnum.IQC || t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)).Select(t => new ParticipantDTO() { HandleUserRealName = t.User.FullName, HandleUser = t.User.UserName, @@ -613,9 +618,9 @@ namespace IRaCIS.Core.Application.Image.QA /// /// [HttpPost] - public async Task> GetConsistencyCheckFile(GetConsistencyCheckFileInDto inQuery) + public async Task> GetConsistencyCheckFile(GetConsistencyCheckFileInDto inQuery, [FromServices] IRepository _inspectionFileRepository) { - var query = _repository.Where(t => t.TrialId == inQuery.TrialId) + var query = _inspectionFileRepository.Where(t => t.TrialId == inQuery.TrialId) .ProjectTo(_mapper.ConfigurationProvider); return await query.ToPagedListAsync(inQuery); diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 7ee24f50e..d2e56bddc 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -29,9 +29,17 @@ namespace IRaCIS.Core.Application.Image.QA IRepository _readingClinicalDataRepository, IRepository _clinicalDataTrialSetRepository, IRepository _qCChallengeDialogrepository, - IRepository _checkChallengeDialogrepository, + IRepository _checkChallengeDialogRepository, IRepository _trialRepository, + IRepository _dicomSeriesRepository, IRepository _visitTaskRepository, + IRepository _scpPatientRepository, + IRepository _scpStudyRepository, + IRepository _trialUserRepository, + IRepository _readModuleRepository, + IRepository _dicomInstanceRepository, + IRepository _trialQCQuestionAnswerRepository, + IRepository _readingQuestionCriterionTrialRepository, IDistributedLockProvider _distributedLockProvider, IReadingClinicalDataService _readingClinicalDataService) : BaseService, IQCOperationService { @@ -46,7 +54,7 @@ namespace IRaCIS.Core.Application.Image.QA { await VerifyIsCanQCAsync(null, subjectVisitId); - if (!await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == currentQCType)) + if (!await _trialQCQuestionAnswerRepository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == currentQCType)) { //---请先核查图像,并保存审核问题,然后再发质疑。 return ResponseOutput.NotOk(_localizer["QCOperation_CheckFirst"]); @@ -108,7 +116,7 @@ namespace IRaCIS.Core.Application.Image.QA else { - await _repository.UpdateFromDTOAsync(qaQuestionCommand, true); + await _qcChallengeRepository.UpdateFromDTOAsync(qaQuestionCommand, true); return ResponseOutput.Ok(); @@ -183,7 +191,7 @@ namespace IRaCIS.Core.Application.Image.QA public async Task DeleteQCChallenge(Guid qcChallengeId) { - if (await _repository.AnyAsync(t => t.QCChallengeId == qcChallengeId)) + if (await _qCChallengeDialogrepository.AnyAsync(t => t.QCChallengeId == qcChallengeId)) { //---当前QC质疑已经回复。 ResponseOutput.NotOk(_localizer["QCOperation_QuestionReplied"]); @@ -195,7 +203,7 @@ namespace IRaCIS.Core.Application.Image.QA await _qcChallengeRepository.DeleteAsync(qaRecord); - var success1 = await _repository.SaveChangesAsync(); + var success1 = await _qcChallengeRepository.SaveChangesAsync(); return ResponseOutput.Result(success1 /*|| success2 || success3*/); } @@ -216,7 +224,7 @@ namespace IRaCIS.Core.Application.Image.QA qaReply.UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt; - var dbQCChallenge = (await _repository.FirstOrDefaultAsync(t => t.Id == qaDialogCommand.QCChallengeId)).IfNullThrowException(); + var dbQCChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qaDialogCommand.QCChallengeId)).IfNullThrowException(); dbQCChallenge.LatestMsgTime = DateTime.Now; @@ -224,7 +232,7 @@ namespace IRaCIS.Core.Application.Image.QA dbQCChallenge.LatestReplyUserId = _userInfo.Id; - var success = await _repository.SaveChangesAsync(); + var success = await _qCChallengeDialogrepository.SaveChangesAsync(); return ResponseOutput.Result(success, qaReply); @@ -254,7 +262,7 @@ namespace IRaCIS.Core.Application.Image.QA qaReply.UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt; - await _repository.AddAsync(qaReply); + await _checkChallengeDialogRepository.AddAsync(qaReply); if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator) { @@ -271,7 +279,7 @@ namespace IRaCIS.Core.Application.Image.QA throw new BusinessValidationFailedException(_localizer["QCOperation_NoPermissionReply"]); } - var success = await _repository.SaveChangesAsync(); + var success = await _subjectVisitRepository.SaveChangesAsync(); return ResponseOutput.Result(success, qaReply.Id); } @@ -298,7 +306,7 @@ namespace IRaCIS.Core.Application.Image.QA sv.CloseTheReason = input.CloseCheckChallenge; sv.CheckChallengeState = CheckChanllengeTypeEnum.Closed; - await _checkChallengeDialogrepository.AddAsync(new CheckChallengeDialog() + await _checkChallengeDialogRepository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = input.subjectVisitId, //---原因: @@ -306,7 +314,7 @@ namespace IRaCIS.Core.Application.Image.QA UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, }); - await _repository.SaveChangesAsync(); + await _subjectVisitRepository.SaveChangesAsync(); return ResponseOutput.Ok(sv); } @@ -379,7 +387,7 @@ namespace IRaCIS.Core.Application.Image.QA var QCChallengeId = await _qcChallengeRepository.Where(x => x.SubjectVisitId == subjectVisitId).Select(x => x.Id).FirstOrDefaultAsync(); - await _checkChallengeDialogrepository.AddAsync(new CheckChallengeDialog() + await _checkChallengeDialogRepository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, @@ -425,7 +433,7 @@ namespace IRaCIS.Core.Application.Image.QA sv.RequestBackState = RequestBackStateEnum.PM_NotAgree; //---PM/APM拒绝一致性核查回退 - await _repository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, TalkContent = _localizer["QCOperation_PMReject"], UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); + await _checkChallengeDialogRepository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, TalkContent = _localizer["QCOperation_PMReject"], UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); await _subjectVisitRepository.SaveChangesAsync(); @@ -499,12 +507,12 @@ namespace IRaCIS.Core.Application.Image.QA //_qcChallengeDialogRepository.Delete(t => t.SubjectVisitId == subjectVisitId); //_checkChallengeDialogRepository.Delete(t => t.SubjectVisitId == subjectVisitId); //---PM/APM同意一致性核查回退。 - await _repository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, TalkContent = _localizer["QCOperation_PMAPMConsistency"], UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); + await _checkChallengeDialogRepository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, TalkContent = _localizer["QCOperation_PMAPMConsistency"], UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); - await _repository.BatchDeleteAsync(t => t.SubjectVisitId == subjectVisitId); + await _trialQCQuestionAnswerRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisitId == subjectVisitId); - await _repository.BatchDeleteAsync(t => t.DicomSerie.IsDeleted); - await _repository.BatchDeleteAsync(t => t.IsDeleted); + await _dicomInstanceRepository.BatchDeleteNoTrackingAsync(t => t.DicomSerie.IsDeleted); + await _dicomSeriesRepository.BatchDeleteNoTrackingAsync(t => t.IsDeleted); var success = await _subjectVisitRepository.SaveChangesAsync(); @@ -547,7 +555,7 @@ namespace IRaCIS.Core.Application.Image.QA #region 先查询再更新 - var questionAnswerList = await _repository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess && t.CurrentQCEnum == currentQCType, true).ToListAsync(); + var questionAnswerList = await _trialQCQuestionAnswerRepository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess && t.CurrentQCEnum == currentQCType, true).ToListAsync(); qcQuestionAnswerCommands.ToList().ForEach(t => { @@ -567,7 +575,7 @@ namespace IRaCIS.Core.Application.Image.QA - return ResponseOutput.Ok(await _repository.SaveChangesAsync()); + return ResponseOutput.Ok(await _trialQCQuestionAnswerRepository.SaveChangesAsync()); } else { @@ -575,9 +583,9 @@ namespace IRaCIS.Core.Application.Image.QA addlist.ForEach(t => { t.TrialId = trialId; t.SubjectVisitId = subjectVisitId; t.CurrentQCEnum = currentQCType; t.QCProcessEnum = trialQCProcess; }); - await _repository.AddRangeAsync(addlist); + await _trialQCQuestionAnswerRepository.AddRangeAsync(addlist); - return ResponseOutput.Result(await _repository.SaveChangesAsync()); + return ResponseOutput.Result(await _trialQCQuestionAnswerRepository.SaveChangesAsync()); } @@ -601,7 +609,7 @@ namespace IRaCIS.Core.Application.Image.QA await VerifyIsCanQCAsync(null, subjectVisitId); - var series = (await _repository.Where(t => t.Id == seriesId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); + var series = (await _dicomSeriesRepository.Where(t => t.Id == seriesId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); if (state == 1) @@ -616,9 +624,9 @@ namespace IRaCIS.Core.Application.Image.QA { series.IsDeleted = true; - var study = (await _repository.Where(t => t.Id == studyId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); + var study = (await _dicomStudyRepository.Where(t => t.Id == studyId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); - var instanceIdList = await _repository.Where(t => t.SeriesId == seriesId).Select(t => t.Id).ToListAsync(); + var instanceIdList = await _dicomInstanceRepository.Where(t => t.SeriesId == seriesId).Select(t => t.Id).ToListAsync(); //instanceIdList.ForEach(t => //{ @@ -641,10 +649,10 @@ namespace IRaCIS.Core.Application.Image.QA { series.IsDeleted = false; - var study = (await _repository.Where(t => t.Id == studyId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); + var study = (await _dicomStudyRepository.Where(t => t.Id == studyId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); - var instanceIdList = await _repository.Where(t => t.SeriesId == seriesId).Select(t => t.Id).ToListAsync(); + var instanceIdList = await _dicomInstanceRepository.Where(t => t.SeriesId == seriesId).Select(t => t.Id).ToListAsync(); study.InstanceCount = study.InstanceCount + instanceIdList.Count; @@ -653,7 +661,7 @@ namespace IRaCIS.Core.Application.Image.QA study.IsDeleted = study.SeriesCount == 0; } - return ResponseOutput.Ok(await _repository.SaveChangesAsync()); + return ResponseOutput.Ok(await _dicomStudyRepository.SaveChangesAsync()); } /// @@ -685,20 +693,20 @@ namespace IRaCIS.Core.Application.Image.QA { var studyId = updateModalityCommand.Id; - var study = (await _repository.FirstOrDefaultAsync(t => t.Id == studyId)).IfNullThrowException(); + var study = (await _dicomStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId)).IfNullThrowException(); study.BodyPartForEdit = updateModalityCommand.BodyPart; study.ModalityForEdit = updateModalityCommand.Modality; - await _repository.BatchUpdateAsync(t => t.StudyId == studyId, r => new DicomSeries() { BodyPartForEdit = updateModalityCommand.BodyPart }); + await _dicomSeriesRepository.BatchUpdateNoTrackingAsync(t => t.StudyId == studyId, r => new DicomSeries() { BodyPartForEdit = updateModalityCommand.BodyPart }); } else if (updateModalityCommand.Type == 2) { var seriesId = updateModalityCommand.Id; - var series = (await _repository.FirstOrDefaultAsync(t => t.Id == seriesId)).IfNullThrowException(); + var series = (await _dicomSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId)).IfNullThrowException(); series.BodyPartForEdit = updateModalityCommand.BodyPart; } @@ -707,7 +715,7 @@ namespace IRaCIS.Core.Application.Image.QA } - await _repository.SaveChangesAsync(); + await _subjectVisitRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -722,7 +730,7 @@ namespace IRaCIS.Core.Application.Image.QA { await VerifyIsCanQCAsync(null, subjectVisitId); - if (await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) + if (await _qcChallengeRepository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) { //---当前访视有质疑未关闭,不允许该操作 return ResponseOutput.NotOk(_localizer["QCOperation_UnresolvedQCQuery"]); @@ -765,10 +773,10 @@ namespace IRaCIS.Core.Application.Image.QA await _dicomStudyRepository.DeleteAsync(study); - var succeess2 = await _repository.BatchDeleteAsync(t => t.StudyId == id); + var succeess2 = await _dicomInstanceRepository.BatchDeleteNoTrackingAsync(t => t.StudyId == id); var success3 = await _dicomSeriesrepository.BatchDeleteNoTrackingAsync(t => t.StudyId == id); - await _repository.BatchUpdateAsync(t => t.Id == id,u=>new SCPStudy() { SubjectVisitId=null}); + await _scpStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == id,u=>new SCPStudy() { SubjectVisitId=null}); @@ -777,7 +785,7 @@ namespace IRaCIS.Core.Application.Image.QA //删除 物理文件 - //var instancePathList = await _repository.Where(t => t.StudyId == id) + //var instancePathList = await _dicomInstanceRepository.Where(t => t.StudyId == id) // .Select(t => t.Path).ToListAsync(); //instancePathList.ForEach(path => @@ -796,13 +804,13 @@ namespace IRaCIS.Core.Application.Image.QA var subjectId=waitDeleteStudyList.Select(t=>t.SubjectId).FirstOrDefault(); - var patientList = _repository.Where(t => t.SubjectId == subjectId).Select(t => t.Id).ToList(); + var patientList = _scpPatientRepository.Where(t => t.SubjectId == subjectId).Select(t => t.Id).ToList(); foreach (var patientId in patientList) { - if (_repository.Where(t=>t.Id== patientId).Any(t => t.SCPStudyList.Count() == t.SCPStudyList.Where(t => t.SubjectVisitId == null).Count())) + if (_scpPatientRepository.Where(t=>t.Id== patientId).Any(t => t.SCPStudyList.Count() == t.SCPStudyList.Where(t => t.SubjectVisitId == null).Count())) { - await _repository.BatchUpdateAsync(t => t.Id == patientId, u => new SCPPatient() { SubjectId = null }); + await _scpPatientRepository.BatchUpdateNoTrackingAsync(t => t.Id == patientId, u => new SCPPatient() { SubjectId = null }); } } @@ -1256,11 +1264,11 @@ namespace IRaCIS.Core.Application.Image.QA .FirstOrDefaultAsync(t => t.TrialId == cRCRequestToQCCommand.TrialId)).IfNullThrowException(); //找到符合配置的标准 确认的并且签名的、双重,有序,阅片期仲裁 - var trialReadingCriterionIdList = _repository.Where(t => t.TrialId == cRCRequestToQCCommand.TrialId && t.IsConfirm && t.ReadingInfoSignTime != null + var trialReadingCriterionIdList = _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == cRCRequestToQCCommand.TrialId && t.IsConfirm && t.ReadingInfoSignTime != null //&& t.ReadingType == ReadingMethod.Double && t.ArbitrationRule == ArbitrationRule.Reading && t.IsReadingTaskViewInOrder == ReadingOrder.InOrder && t.IsReadingPeriod).Select(t => t.Id).ToList(); - var trialInOrderCriterionIdList = _repository.Where(t => t.TrialId == cRCRequestToQCCommand.TrialId && t.IsConfirm && t.ReadingInfoSignTime != null + var trialInOrderCriterionIdList = _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == cRCRequestToQCCommand.TrialId && t.IsConfirm && t.ReadingInfoSignTime != null //&& t.ReadingType == ReadingMethod.Double && t.ArbitrationRule == ArbitrationRule.Reading && t.IsReadingTaskViewInOrder == ReadingOrder.InOrder).Select(t => t.Id).ToList(); @@ -1287,7 +1295,7 @@ namespace IRaCIS.Core.Application.Image.QA } //获取确认的临床数据配置 - var clinicalDataConfirmList = _repository.Where(t => t.TrialId == trialId && t.IsConfirm).ToList(); + var clinicalDataConfirmList = _clinicalDataTrialSetRepository.Where(t => t.TrialId == trialId && t.IsConfirm).ToList(); // 别人未提交的 foreach (var dbSubjectVisit in dbSubjectVisitList) @@ -1461,10 +1469,10 @@ namespace IRaCIS.Core.Application.Image.QA foreach (var trialReadingCriterionId in trialReadingCriterionIdList) { //不存在该阅片期 (重传、回退都会重新提交) - if (!await _repository.Where(t => t.SubjectVisitId == dbSubjectVisit.Id && t.ReadingSetType == ReadingSetType.ImageReading && t.TrialReadingCriterionId == trialReadingCriterionId).AnyAsync()) + if (!await _readModuleRepository.Where(t => t.SubjectVisitId == dbSubjectVisit.Id && t.ReadingSetType == ReadingSetType.ImageReading && t.TrialReadingCriterionId == trialReadingCriterionId).AnyAsync()) { - var newReadModule = await _repository.AddAsync(new ReadModule() + var newReadModule = await _readModuleRepository.AddAsync(new ReadModule() { TrialReadingCriterionId = trialReadingCriterionId, ReadingSetType = ReadingSetType.ImageReading, @@ -1488,7 +1496,7 @@ namespace IRaCIS.Core.Application.Image.QA - var success = await _repository.SaveChangesAsync(); + var success = await _subjectVisitRepository.SaveChangesAsync(); return ResponseOutput.Ok(success); @@ -1510,7 +1518,7 @@ namespace IRaCIS.Core.Application.Image.QA public async Task QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState) { - if (!await _repository.AnyAsync(t => t.TrialId == trialId && t.UserId == _userInfo.Id)) + if (!await _trialUserRepository.AnyAsync(t => t.TrialId == trialId && t.UserId == _userInfo.Id)) { //---您已经被移出项目,没有操作权限。 return ResponseOutput.NotOk(_localizer["QCOperation_RemoveItem"]); @@ -1520,7 +1528,7 @@ namespace IRaCIS.Core.Application.Image.QA if (auditState == AuditStateEnum.QCPassed) { //判断质疑是否都关闭了 - if (await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) + if (await _qcChallengeRepository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) { //---当前访视有影像质控质疑未关闭,不能进行此操作。 return ResponseOutput.NotOk(_localizer["QCOperation_QCNotClosed"]); @@ -1540,7 +1548,7 @@ namespace IRaCIS.Core.Application.Image.QA //删除 软删除的物理文件 - var instancePathList = await _repository.Where(t => t.DicomSerie.IsDeleted && t.SubjectVisitId == subjectVisitId) + var instancePathList = await _dicomInstanceRepository.Where(t => t.DicomSerie.IsDeleted && t.SubjectVisitId == subjectVisitId) .Select(t => t.Path).ToListAsync(); //维护统一状态 @@ -1561,7 +1569,7 @@ namespace IRaCIS.Core.Application.Image.QA { if (dbSubjectVisit.AuditState == AuditStateEnum.InPrimaryQC) { - if (!await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First)) + if (!await _trialQCQuestionAnswerRepository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First)) { //---影像质控审核问题没有保存,不能进行此操作。 return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); @@ -1608,7 +1616,7 @@ namespace IRaCIS.Core.Application.Image.QA if (dbSubjectVisit.AuditState == AuditStateEnum.InPrimaryQC) { - if (!await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First)) + if (!await _trialQCQuestionAnswerRepository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First)) { //---影像质控审核问题没有保存,不能进行此操作。 return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); @@ -1623,7 +1631,7 @@ namespace IRaCIS.Core.Application.Image.QA else if (dbSubjectVisit.AuditState == AuditStateEnum.InSecondaryQC) { - if (!await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.Second)) + if (!await _trialQCQuestionAnswerRepository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.Second)) { //---影像质控审核问题没有保存,不能进行此操作。 return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); @@ -1719,7 +1727,7 @@ namespace IRaCIS.Core.Application.Image.QA dbSubjectVisit.CurrentActionUserId = null; dbSubjectVisit.CurrentActionUserExpireTime = null; - await _repository.SaveChangesAsync(); + await _subjectVisitRepository.SaveChangesAsync(); return ResponseOutput.Result(true); @@ -1745,7 +1753,7 @@ namespace IRaCIS.Core.Application.Image.QA var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); sv.IsUrgent = setOrCancel; - var success = await _repository.SaveChangesAsync(); + var success = await _subjectVisitRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -1782,7 +1790,7 @@ namespace IRaCIS.Core.Application.Image.QA { //获取项目配置 - var trialConfig = await _repository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }) + var trialConfig = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }) .FirstOrDefaultAsync().IfNullThrowException(); if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) @@ -1829,7 +1837,7 @@ namespace IRaCIS.Core.Application.Image.QA }); //双审 并且是2QC 那么需要回退到1QC 讲1QC数据清除 - if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit && await _repository.AnyAsync(t => t.Id == qcChallengeId && t.SubjectVisit.AuditState == AuditStateEnum.InSecondaryQC)) + if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit && await _qcChallengeRepository.AnyAsync(t => t.Id == qcChallengeId && t.SubjectVisit.AuditState == AuditStateEnum.InSecondaryQC)) { @@ -1853,18 +1861,18 @@ namespace IRaCIS.Core.Application.Image.QA //删除1QC 填写的问题答案 - await _repository.BatchDeleteAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId && t.CurrentQCEnum == CurrentQC.First); + await _trialQCQuestionAnswerRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId && t.CurrentQCEnum == CurrentQC.First); //2QC 数据变为1QC - await _repository.BatchUpdateAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId && t.CurrentQCEnum == CurrentQC.Second, k => new QCChallenge() { CurrentQCEnum = CurrentQC.First }); - await _repository.BatchUpdateAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId && t.CurrentQCEnum == CurrentQC.Second, k => new TrialQCQuestionAnswer() { CurrentQCEnum = CurrentQC.First }); + await _qcChallengeRepository.BatchUpdateNoTrackingAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId && t.CurrentQCEnum == CurrentQC.Second, k => new QCChallenge() { CurrentQCEnum = CurrentQC.First }); + await _trialQCQuestionAnswerRepository.BatchUpdateNoTrackingAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId && t.CurrentQCEnum == CurrentQC.Second, k => new TrialQCQuestionAnswer() { CurrentQCEnum = CurrentQC.First }); } - var success = await _repository.SaveChangesAsync(); + var success = await _qcChallengeRepository.SaveChangesAsync(); return ResponseOutput.Result(success); diff --git a/IRaCIS.Core.Application/Service/QC/TrialQCQuestionService.cs b/IRaCIS.Core.Application/Service/QC/TrialQCQuestionService.cs index 55ff08702..43be232ff 100644 --- a/IRaCIS.Core.Application/Service/QC/TrialQCQuestionService.cs +++ b/IRaCIS.Core.Application/Service/QC/TrialQCQuestionService.cs @@ -21,6 +21,9 @@ namespace IRaCIS.Core.Application.Contracts [ApiExplorerSettings(GroupName = "Image")] public class TrialQCQuestionConfigureService( IRepository _trialQcQuestionRepository, + IRepository _trialRepository, + IRepository _trialQCQuestionRepository, + IRepository _trialQCQuestionAnswerRepository, IRepository _qCQuestionRepository) : BaseService, ITrialQCQuestionConfigureService { @@ -55,10 +58,10 @@ namespace IRaCIS.Core.Application.Contracts var list = await trialQCQuestionQueryable.OrderByDescending(x=>x.LanguageType).ThenBy(t => t.ShowOrder).ToListAsync(); - var isHaveQCQuestion = _repository.Where(t => t.TrialId == queryTrialQCQuestionConfigure.TrialId).Any(); + var isHaveQCQuestion = _trialQCQuestionRepository.Where(t => t.TrialId == queryTrialQCQuestionConfigure.TrialId).Any(); - var signInfo = await _repository.Where(t => t.Id == queryTrialQCQuestionConfigure.TrialId) + var signInfo = await _trialRepository.Where(t => t.Id == queryTrialQCQuestionConfigure.TrialId) .Select(trial => new { trial.QCProcessEnum, @@ -132,7 +135,7 @@ namespace IRaCIS.Core.Application.Contracts public async Task VerifyIsQCConfirmedAsync(Guid trialId) { - if (!await _repository.AnyAsync(t => t.Id == trialId && t.QCQuestionConfirmedUserId == null)) + if (!await _trialRepository.AnyAsync(t => t.Id == trialId && t.QCQuestionConfirmedUserId == null)) { //---影像质控审核问题模板已经确认,不允许操作。 throw new BusinessValidationFailedException(_localizer["TrialQCQuestion_TemplateConfirmed"]); @@ -251,7 +254,7 @@ namespace IRaCIS.Core.Application.Contracts await _trialQcQuestionRepository.AddRangeAsync(childList); - var success = await _repository.SaveChangesAsync(); + var success = await _trialQcQuestionRepository.SaveChangesAsync(); return ResponseOutput.Result(success); } @@ -318,7 +321,7 @@ namespace IRaCIS.Core.Application.Contracts return ResponseOutput.NotOk(_localizer["TrialQCQuestion_DeleteChildFirst"]); } - if (await _repository.AnyAsync(t => t.TrialQCQuestionConfigureId == trialQCQuestionConfigureId)) + if (await _trialQCQuestionAnswerRepository.AnyAsync(t => t.TrialQCQuestionConfigureId == trialQCQuestionConfigureId)) { //---该审核问题已被影像质控过程引用,不允许删除 return ResponseOutput.NotOk(_localizer["TrialQCQuestion_ReferencedByQCProcess"]); diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index 292e159cb..3ad2ace1a 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -26,11 +26,11 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) .ForMember(d => d.SubmitUserName, u => u.MapFrom(s => s.SubmitUser.FullName)) .ForMember(d => d.ClinicalInformationTransmissionEnum, u => u.MapFrom(s => s.Trial.ClinicalInformationTransmissionEnum)) - + .ForMember(d => d.IsHaveClinicalData, u => u.MapFrom(t => t.IsBaseLine ? t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() || t.ReadingClinicalDataList.Any(x => x.ClinicalDataTrialSet.UploadRole == Domain.Share.UploadRole.CRC && x.ReadingClinicalDataPDFList.Count > 0) || t.PreviousSurgeryList.Any() : false)) - + .ForMember(d => d.DicomStudyCount, u => u.MapFrom(t => t.StudyList.Count())) .ForMember(d => d.NoneDicomStudyCount, u => u.MapFrom(t => t.NoneDicomStudyList.Count(t => t.NoneDicomFileList.Any()))); @@ -40,9 +40,12 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.CurrentActionUserName, u => u.MapFrom(s => s.CurrentActionUser.UserName)) .ForMember(d => d.PreliminaryAuditUserName, u => u.MapFrom(s => s.PreliminaryAuditUser.UserName)) .ForMember(d => d.ReviewAuditUserName, u => u.MapFrom(s => s.ReviewAuditUser.UserName)); - + CreateMap() + .ForMember(d => d.CreateTime, u => u.MapFrom(s => s.CreateTime)) + .ForMember(d => d.UserName, u => u.MapFrom(s => s.CreateUser.UserName)) + .ForMember(d => d.Content, u => u.MapFrom(s => s.TalkContent)); CreateMap() @@ -53,7 +56,10 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.CreateUserName, u => u.MapFrom(s => s.CreateUser.UserName)) .ForMember(d => d.LatestReplyUserName, u => u.MapFrom(t => t.LatestReplyUser.UserName)) - .ForMember(d => d.DialogStr, u => u.MapFrom(t => string.Join("\n\n", t.DialogList.OrderBy(t => t.CreateTime).Select(c => c.CreateUser.UserName + " (" + c.CreateTime.ToString("yyyy-MM-dd HH:mm:ss") + ") :" + c.TalkContent)))) + .ForMember(d => d.DialogList, u => u.MapFrom(t => t.DialogList)) + + //.ForMember(d => d.DialogStr, u => u.MapFrom(t => string.Join("\n\n", t.DialogList.OrderBy(t => t.CreateTime) + //.Select(c => c.CreateUser.UserName + " (" + c.CreateTime.ToString("yyyy-MM-dd HH:mm:ss") + ") :" + c.TalkContent)))) .ForMember(d => d.SubjectState, u => u.MapFrom(s => s.SubjectVisit.Subject.Status)); @@ -96,7 +102,7 @@ namespace IRaCIS.Core.Application.Service // .ForMember(d => d.ReadingStatus, u => u.MapFrom(s => s.VisitTaskList // .Count(t=>t.TaskState==TaskState.Effect && t.IsAnalysisCreate==false && t.ReadingCategory==ReadingCategory.Visit && t.ReadingTaskState==ReadingTaskState.HaveSigned)==s. s.ReadingStatus)) - + @@ -111,13 +117,20 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.FirstGiveMedicineTime, u => u.MapFrom(s => s.Subject.FirstGiveMedicineTime)) .ForMember(d => d.TrialReadingCriterionName, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionName)); + CreateMap() + .ForMember(d => d.CreateTime, u => u.MapFrom(s => s.CreateTime)) + .ForMember(d => d.UserName, u => u.MapFrom(s => s.CreateUser.UserName)) + .ForMember(d => d.Content, u => u.MapFrom(s => s.TalkContent)); CreateMap() .ForMember(d => d.TalkContent, u => u.MapFrom(s => s.CheckChallengeDialogList.OrderByDescending(y => y.CreateTime).Select(x => x.TalkContent).FirstOrDefault())) .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode)) - .ForMember(d => d.CheckDialogStr, u => u.MapFrom(t => string.Join("\n\n", t.CheckChallengeDialogList.OrderBy(t => t.CreateTime).Select(c => c.CreateUser.UserName + " (" + c.CreateTime.ToString("yyyy-MM-dd HH:mm:ss") + ") :" + c.TalkContent)))) + .ForMember(d => d.CheckDialogList, u => u.MapFrom(s => s.CheckChallengeDialogList)) + //.ForMember(d => d.CheckDialogStr, u => u.MapFrom(t => string.Join("\n\n", + //t.CheckChallengeDialogList.OrderBy(t => t.CreateTime).Select(c => c.CreateUser.UserName + " (" + c.CreateTime.ToString("yyyy-MM-dd HH:mm:ss") + ") :" + c.TalkContent)))) + .ForMember(d => d.ModalityList, c => c.MapFrom(s => (s.NoneDicomStudyList.Select(t => t.Modality) .Union(s.StudyList.Select(k => k.ModalityForEdit))).Distinct())) @@ -155,13 +168,13 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.MedicalNo, t => t.MapFrom(u => u.VisitTask.Subject.MedicalNo)) .ForMember(o => o.DoctorUserName, t => t.MapFrom(u => u.VisitTask.DoctorUser.UserName)) .ForMember(o => o.MedicalManagerUserName, t => t.MapFrom(u => u.MedicalManagerUser.UserName)) - .ForMember(o => o.QuestionContent, t => t.MapFrom(u=> string.Join("\n\n", u.ReadingMedicalReviewDialogList.Where(t => t.IsHaveQuestion).Select(t=>t.Questioning))) ); + .ForMember(o => o.QuestionContent, t => t.MapFrom(u => string.Join("\n\n", u.ReadingMedicalReviewDialogList.Where(t => t.IsHaveQuestion).Select(t => t.Questioning)))); CreateMap() .ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName)) .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.IsSelfAnalysis == true ? u.BlindTrialSiteCode : u.Subject.TrialSite.TrialSiteCode)) .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.IsSelfAnalysis == true ? u.BlindSubjectCode : u.Subject.Code)) - + ; @@ -173,8 +186,8 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) .ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine)) .ForMember(o => o.EvaluateResult, t => t.MapFrom(u => - u.SourceSubjectVisit.IsBaseLine? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault()!.Answer - : u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstOrDefault()!.Answer )) + u.SourceSubjectVisit.IsBaseLine ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault()!.Answer + : u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstOrDefault()!.Answer)) .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)); @@ -191,15 +204,15 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.JudgeArmEnum, t => t.MapFrom(u => u.JudgeResultTask.ArmEnum)) .ForMember(o => o.OverallTumorEvaluationResult, t => t.MapFrom(u => - criterionType == CriterionType.RECIST1Point1 ?( u.SourceSubjectVisit.IsBaseLine==true ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault()!.Answer: - u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).Select(t=>t.IsGlobalChange?t.GlobalChangeAnswer:t.Answer).FirstOrDefault()) + criterionType == CriterionType.RECIST1Point1 ? (u.SourceSubjectVisit.IsBaseLine == true ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault()!.Answer : + u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).Select(t => t.IsGlobalChange ? t.GlobalChangeAnswer : t.Answer).FirstOrDefault()) : criterionType == CriterionType.PCWG3 ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstOrDefault()!.Answer : String.Empty )) .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)) - //.ForMember(o => o.GlobalTaskAnswerList, t => t.MapFrom(u => u.GlobalVisitResultList.Where(t=>t.GlobalAnswerType== GlobalAnswerType.Question).Select(c=>new GlobalAnswerInfo() { GlobalTaskVisitNum=c.VisitTask.VisitTaskNum,VisitTaskId=c.TaskId ,Answer=c.Answer}))) + //.ForMember(o => o.GlobalTaskAnswerList, t => t.MapFrom(u => u.GlobalVisitResultList.Where(t=>t.GlobalAnswerType== GlobalAnswerType.Question).Select(c=>new GlobalAnswerInfo() { GlobalTaskVisitNum=c.VisitTask.VisitTaskNum,VisitTaskId=c.TaskId ,Answer=c.Answer}))) ; @@ -220,14 +233,14 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(o => o.LessionCode, t => t.MapFrom(u => u.RowMark)) - .ForMember(o => o.LessionType, t => t.MapFrom(u =>(int?) u.ReadingQuestionTrial.LesionType)) + .ForMember(o => o.LessionType, t => t.MapFrom(u => (int?)u.ReadingQuestionTrial.LesionType)) .ForMember(o => o.IsLymph, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.IsLymph).FirstOrDefault()!.Answer)) //位置可能是自己填写的 .ForMember(o => o.LessionLocation, t => //t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.Location).FirstOrDefault().Answer) t.MapFrom(u => isEn_Us ? u.OrganInfo.PartEN : u.OrganInfo.Part) - + ) .ForMember(o => o.LessionOrgan, t => //t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.Organ).FirstOrDefault().Answer) @@ -239,7 +252,7 @@ namespace IRaCIS.Core.Application.Service //u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.Location).FirstOrDefault()!.Answer : isEn_Us ? u.OrganInfo.TULATEN : u.OrganInfo.TULAT) t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.BodyPartDescription).FirstOrDefault()!.Answer) ) - + .ForMember(o => o.LongDiameter, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.MajorAxis).FirstOrDefault()!.Answer)) .ForMember(o => o.ShortDiameter, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.ShortAxis).FirstOrDefault()!.Answer)) .ForMember(o => o.LessionState, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State).FirstOrDefault()!.Answer)); @@ -267,7 +280,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.BodyPartDescription, t => //t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.Part).FirstOrDefault().Answer) t.MapFrom(u => isEn_Us ? u.OrganInfo.PartEN : u.OrganInfo.Part) - ) + ) .ForMember(o => o.LessionState, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State).FirstOrDefault()!.Answer)); #endregion @@ -328,8 +341,8 @@ namespace IRaCIS.Core.Application.Service CreateMap(); - CreateMap(); - CreateMap(); + CreateMap(); + CreateMap(); CreateMap() @@ -385,10 +398,10 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.QCProcessEnum, u => u.MapFrom(s => s.Trial.QCProcessEnum)) .ForMember(d => d.SubjectStatus, u => u.MapFrom(s => s.Subject.Status)) .ForMember(d => d.StudyCount, u => u.MapFrom(s => s.StudyList.Count())) - + .ForMember(d => d.SubmitUserName, u => u.MapFrom(s => s.SubmitUser.UserName)) .ForMember(d => d.SubmitUserRealName, u => u.MapFrom(s => s.SubmitUser.FullName)) - + .ForMember(d => d.CurrentActionUserName, u => u.MapFrom(s => s.CurrentActionUser.UserName)) .ForMember(d => d.PreliminaryAuditUserName, u => u.MapFrom(s => s.PreliminaryAuditUser.UserName)) .ForMember(d => d.ReviewAuditUserName, u => u.MapFrom(s => s.ReviewAuditUser.UserName)) @@ -412,12 +425,12 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.Sex, u => u.MapFrom(s => s.Subject.Sex)) .ForMember(d => d.Age, u => u.MapFrom(t => t.Subject.Age)) .ForMember(d => d.IsHaveClinicalData, u => u.MapFrom(t => t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() - || t.Subject.ClinicalFormList.Any(x=>x.ClinicalDataTrialSet.UploadRole==UploadRole.CRC&& x.ReadingId==t.Id) + || t.Subject.ClinicalFormList.Any(x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == t.Id) || t.ReadingClinicalDataList.Any(x => x.ClinicalDataTrialSet.UploadRole == Domain.Share.UploadRole.CRC && x.ReadingClinicalDataPDFList.Count > 0) || t.PreviousSurgeryList.Any())) - .ForMember(d => d.IsHaveUploadFailed, u => u.MapFrom(t => t.StudyList.SelectMany(c=>c.DicomStudyMonitorList).Any(h => h.FailedFileCount>0) )) - + .ForMember(d => d.IsHaveUploadFailed, u => u.MapFrom(t => t.StudyList.SelectMany(c => c.DicomStudyMonitorList).Any(h => h.FailedFileCount > 0))) + //.ForMember(d => d.VisitName, u => u.MapFrom(t =>t.InPlan? t.VisitStage.VisitName : t.VisitName)) //.ForMember(d => d.VisitNum, u => u.MapFrom(t => t.InPlan ? t.VisitStage.VisitNum : t.VisitNum)) //.ForMember(d => d.VisitDay, u => u.MapFrom(t => t.InPlan ? t.VisitStage.VisitDay : t.VisitDay)) @@ -436,7 +449,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.ModalityList, c => c.MapFrom(s => (s.NoneDicomStudyList.Select(t => t.Modality) .Union(s.StudyList.Select(k => k.ModalityForEdit))).Distinct())); - + //一致性核查 质疑对话 CreateMap() @@ -581,7 +594,7 @@ namespace IRaCIS.Core.Application.Service CreateMap() //.ForMember(d => d.FileCount, u => u.MapFrom(s => s.NoneDicomFileList.Count)) - .ForMember(d => d.NoneDicomStudyFileList, u => u.MapFrom(s => isFilterZip? s.NoneDicomFileList.Where(t=>!t.FileType.Contains(StaticData.FileType.Zip)): s.NoneDicomFileList)) + .ForMember(d => d.NoneDicomStudyFileList, u => u.MapFrom(s => isFilterZip ? s.NoneDicomFileList.Where(t => !t.FileType.Contains(StaticData.FileType.Zip)) : s.NoneDicomFileList)) .ForMember(d => d.CodeView, u => u.MapFrom(s => s.StudyCode)); diff --git a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs index 41e521775..95e843f46 100644 --- a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs +++ b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs @@ -37,6 +37,8 @@ namespace IRaCIS.Core.Application.Service IRepository _trialReadingQuestionRepository, IRepository _visitTaskRepository, IVisitTaskHelpeService _IVisitTaskHelpeService, + IRepository _dicomStudyRepository, + IRepository _dicomSeriesRepository, IRepository _taskMedicalReviewRepository, IRepository _visitTaskReReadingRepository) : BaseService, ISubjectCriteriaEvaluationService { @@ -311,7 +313,7 @@ namespace IRaCIS.Core.Application.Service //找到该方式的所有序列 - var list = await _repository.Where(t => t.SubjectVisitId == subjectVisitId && t.SubjectId == subjectId).Select(t => new { SeriesId = t.Id, t.StudyId, t.BodyPartForEdit }).ToListAsync(); + var list = await _dicomSeriesRepository.Where(t => t.SubjectVisitId == subjectVisitId && t.SubjectId == subjectId).Select(t => new { SeriesId = t.Id, t.StudyId, t.BodyPartForEdit }).ToListAsync(); ////已经自动筛选过 @@ -462,7 +464,7 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task> GetHaveGeneratedTaskList(HaveGeneratedTaskQuery inQuery) { - var list = await _repository.Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectId == inQuery.SubjectId && t.TaskState == TaskState.Effect).OrderBy(t => t.VisitTaskNum) + var list = await _visitTaskRepository.Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectId == inQuery.SubjectId && t.TaskState == TaskState.Effect).OrderBy(t => t.VisitTaskNum) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); return list; @@ -494,7 +496,7 @@ namespace IRaCIS.Core.Application.Service var idList = batchGenerateTaskCommand.SubjectVisitIdList.Select(t => (Guid?)t).ToList(); //存在任务的访视 - var haveGenerateVisitIdList = await _repository.Where(t => idList.Contains(t.SourceSubjectVisitId) && t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId && t.TaskState == TaskState.Effect) + var haveGenerateVisitIdList = await _visitTaskRepository.Where(t => idList.Contains(t.SourceSubjectVisitId) && t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId && t.TaskState == TaskState.Effect) .Select(t => t.SourceSubjectVisitId).ToListAsync(); var generateVisitIdList = idList.Except(haveGenerateVisitIdList); @@ -514,12 +516,12 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task GetVisitStudyAndSeriesList(VisitStudyAndSeriesQuery inQuery) { - var studyList = await _repository.Where(s => s.SubjectVisitId == inQuery.SubjectVisitId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var studyList = await _dicomStudyRepository.Where(s => s.SubjectVisitId == inQuery.SubjectVisitId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var studyIds = studyList.Select(t => t.StudyId).ToList(); - var query = from series in _repository.Where(t => studyIds.Contains(t.StudyId)) + var query = from series in _dicomSeriesRepository.Where(t => studyIds.Contains(t.StudyId)) join visitStudyFilter in _subjectCriteriaEvaluationVisitStudyFilterRepository.Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectVisitId == inQuery.SubjectVisitId) on series.Id equals visitStudyFilter.SeriesId into d from visitStudyFilter in d.DefaultIfEmpty() diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs index 362281b9c..f99104d8e 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs @@ -26,6 +26,7 @@ namespace IRaCIS.Application.Services IRepository _previousPDFRepository, IRepository _dictionaryRepository, IRepository _trialRepository, + IRepository _readingQuestionCriterionTrialRepository, IRepository _trialClinicalQuestionRepository, IRepository _systemClinicalQuestionRepository) : BaseService { @@ -231,7 +232,7 @@ namespace IRaCIS.Application.Services { await _trialClinicalDataSetCriterionRepository.DeleteFromQueryAsync(t => t.TrialClinicalDataSetId == entity.Id); - await _repository.AddRangeAsync(entity.TrialClinicalDataSetCriteriaList); + await _trialClinicalDataSetCriterionRepository.AddRangeAsync(entity.TrialClinicalDataSetCriteriaList); } @@ -320,7 +321,7 @@ namespace IRaCIS.Application.Services //[HttpPost] //public async Task> GetTrialCriterionSelectList(TrialCriterionSelectQuery inQuery) //{ - // return await _repository.Where(t => t.TrialId == inQuery.TrialId) + // return await _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == inQuery.TrialId) // .WhereIf(!string.IsNullOrEmpty(inQuery.CriterionName), t => t.CriterionName.Contains(inQuery.CriterionName)) // .WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable) // .WhereIf(inQuery.IsCompleteConfig != null, t => t.IsCompleteConfig == inQuery.IsCompleteConfig) @@ -363,7 +364,7 @@ namespace IRaCIS.Application.Services var systemDataList = systemClinicalDataList.Where(x => needAddids.Contains(x.Id)).ToList(); - var readingCriterionList = _repository.Where(t => t.TrialId == trialId).Where(t => t.ReadingQuestionCriterionSystemId != null) + var readingCriterionList = _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == trialId).Where(t => t.ReadingQuestionCriterionSystemId != null) .Select(t => new { t.ReadingQuestionCriterionSystemId, TrialReadingCriterionId = t.Id ,t.CriterionType}).ToList(); @@ -419,7 +420,7 @@ namespace IRaCIS.Application.Services // var systemDataList = systemClinicalDataList.Where(x => needAddids.Contains(x.Id)).ToList(); - // var readingCriterionList = _repository.Where(t => t.TrialId == trialId).Where(t => t.ReadingQuestionCriterionSystemId != null) + // var readingCriterionList = _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == trialId).Where(t => t.ReadingQuestionCriterionSystemId != null) // .Select(t => new { t.ReadingQuestionCriterionSystemId, TrialReadingCriterionId = t.Id }).ToList(); diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index 663990275..945c150ba 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -354,9 +354,9 @@ namespace IRaCIS.Application.Services //如果先生成了任务,再签名subject级别 PM 临床数据,那么会导致其他标准的任务签名状态无法得到维护 - if (await _repository.AnyAsync(t => t.Id == data.ClinicalDataTrialSetId && t.UploadRole == UploadRole.PM && (t.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataLevel == ClinicalLevel.SubjectVisit))) + if (await _clinicalDataTrialSetRepository.AnyAsync(t => t.Id == data.ClinicalDataTrialSetId && t.UploadRole == UploadRole.PM && (t.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataLevel == ClinicalLevel.SubjectVisit))) { - var needDealTrialReadingCriterionIdList = _repository.Where(t => t.Id == data.ClinicalDataTrialSetId) + var needDealTrialReadingCriterionIdList = _clinicalDataTrialSetRepository.Where(t => t.Id == data.ClinicalDataTrialSetId) .SelectMany(t => t.TrialClinicalDataSetCriteriaList) .Select(u => u.TrialReadingCriterionId).Distinct().ToList(); @@ -400,9 +400,9 @@ namespace IRaCIS.Application.Services // //如果先生成了任务,再签名subject级别 PM 临床数据,那么会导致其他标准的任务签名状态无法得到维护 - // if (await _repository.AnyAsync(t => t.Id == data.ClinicalDataTrialSetId && t.UploadRole == UploadRole.PM && t.ClinicalDataLevel == ClinicalLevel.Subject)) + // if (await _clinicalDataTrialSetRepository.AnyAsync(t => t.Id == data.ClinicalDataTrialSetId && t.UploadRole == UploadRole.PM && t.ClinicalDataLevel == ClinicalLevel.Subject)) // { - // var needDealTrialReadingCriterionIdList = _repository.Where(t => t.Id == data.ClinicalDataTrialSetId) + // var needDealTrialReadingCriterionIdList = _clinicalDataTrialSetRepository.Where(t => t.Id == data.ClinicalDataTrialSetId) // .SelectMany(t => t.TrialClinicalDataSetCriteriaList) // .Select(u => u.TrialReadingCriterionId).Distinct().ToList(); @@ -431,7 +431,7 @@ namespace IRaCIS.Application.Services //var criterionType = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCritrialId).Select(t => t.CriterionType).FirstOrDefaultAsync(); // 获取确认的项目标准 废弃 签名的时候 传递标准Id - //var confirmedCtritrialList = _repository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime != null).Select(t => new { t.Id, t.CriterionType }).ToList(); + //var confirmedCtritrialList = _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime != null).Select(t => new { t.Id, t.CriterionType }).ToList(); var needSignCount = 0; var haveSignedCount = _readingClinicalDataRepository.Where(t => t.TrialId == trialId && t.IsSign && t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned && t.ReadingId == readingId && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM).Count(); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs index f30de3f84..4cc96de78 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs @@ -28,6 +28,7 @@ namespace IRaCIS.Application.Services IRepository _readingQuestionCriterionTrialRepository, IRepository _dicomInstanceRepository, IRepository _noneDicomStudyFileRepository, + IRepository _readingClinicalDataRepository, IRepository _readingPeriodSetRepository, IRepository _readModuleRepository) : BaseService { @@ -454,7 +455,7 @@ namespace IRaCIS.Application.Services var readModule = await _readModuleRepository.Where(x => x.Id == readModuleId).FirstNotNullAsync(); - if(await _repository.Where(t => t.ReadingId == readModuleId).AnyAsync(t => t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned)) + if(await _readingClinicalDataRepository.Where(t => t.ReadingId == readModuleId).AnyAsync(t => t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned)) { //---临床资料已签名,不允许删除 return ResponseOutput.NotOk(_localizer["ReadModule_SignedDataCannotDelete"]); diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs index 23930791e..b8159abca 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs @@ -35,11 +35,15 @@ namespace IRaCIS.Core.Application.Contracts IRepository _trialSiteSurveyRepository, IRepository _trialSiteUserSurveyRepository, IRepository _userRepository, + IRepository _trialRepository, IRepository _trialSiteRepository, + IRepository _doctorRepository, + IRepository _verificationCodeRepository, IRepository _trialUserRepository, IRepository _trialSiteUserRepository, IDistributedLockProvider _distributedLockProvider, ITokenService _tokenService, + IRepository _userTypeRepository, IMailVerificationService _mailVerificationService, IOptionsMonitor systemEmailConfig) : BaseService, ITrialSiteSurveyService { @@ -80,7 +84,7 @@ namespace IRaCIS.Core.Application.Contracts [AllowAnonymous] public async Task VerifyEmialGetDoctorInfo(VerifyEmialGetDoctorInfoInDto inDto) { - var verificationRecord = await _repository.GetQueryable().OrderByDescending(x => x.ExpirationTime).Where(t => (t.EmailOrPhone == inDto.EmailOrPhone) && t.Code == inDto.VerificationCode && t.CodeType == VerifyType.Email).FirstOrDefaultAsync(); + var verificationRecord = await _verificationCodeRepository.Where().OrderByDescending(x => x.ExpirationTime).Where(t => (t.EmailOrPhone == inDto.EmailOrPhone) && t.Code == inDto.VerificationCode && t.CodeType == VerifyType.Email).FirstOrDefaultAsync(); VerifyEmialGetDoctorInfoOutDto result = new VerifyEmialGetDoctorInfoOutDto(); //检查数据库是否存在该验证码 @@ -101,9 +105,9 @@ namespace IRaCIS.Core.Application.Contracts { //删除验证码历史记录 - await _repository.BatchDeleteAsync(t => t.Id == verificationRecord.Id); + await _verificationCodeRepository.BatchDeleteNoTrackingAsync(t => t.Id == verificationRecord.Id); - var dockerInfo = await _repository.Where(t => t.EMail == inDto.EmailOrPhone || t.Phone == inDto.EmailOrPhone).FirstOrDefaultAsync(); + var dockerInfo = await _doctorRepository.Where(t => t.EMail == inDto.EmailOrPhone || t.Phone == inDto.EmailOrPhone).FirstOrDefaultAsync(); if (dockerInfo != null) { @@ -138,7 +142,7 @@ namespace IRaCIS.Core.Application.Contracts //验证码 6位 int verificationCode = new Random().Next(100000, 1000000); - var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == userInfo.TrialId); + var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == userInfo.TrialId); await _mailVerificationService.AnolymousSendEmail(trialInfo.ResearchProgramNo, userInfo.Email, verificationCode); @@ -165,7 +169,7 @@ namespace IRaCIS.Core.Application.Contracts #region 20230804 修改调研表逻辑 - var verifyRecord = await _repository.FirstOrDefaultAsync(t => (t.EmailOrPhone == userInfo.EmailOrPhone) && t.Code == userInfo.verificationCode && t.CodeType == userInfo.verificationType); + var verifyRecord = await _verificationCodeRepository.FirstOrDefaultAsync(t => (t.EmailOrPhone == userInfo.EmailOrPhone) && t.Code == userInfo.verificationCode && t.CodeType == userInfo.verificationType); //检查数据库是否存在该验证码 if (verifyRecord == null) { @@ -179,7 +183,7 @@ namespace IRaCIS.Core.Application.Contracts else { //删除验证码历史记录 - await _repository.BatchDeleteAsync(t => t.Id == verifyRecord.Id); + await _verificationCodeRepository.BatchDeleteNoTrackingAsync(t => t.Id == verifyRecord.Id); //验证码正确 不处理 } @@ -205,7 +209,7 @@ namespace IRaCIS.Core.Application.Contracts //从项目site 中找到已存在的 加到历史人员中 addSurvey.TrialSiteUserSurveyList = userList; - currentEntity = await _repository.AddAsync(addSurvey); + currentEntity = await _trialSiteSurveyRepository.AddAsync(addSurvey); } else @@ -309,7 +313,7 @@ namespace IRaCIS.Core.Application.Contracts //删除验证码历史记录 - await _repository.BatchDeleteAsync(t => t.EmailOrPhone == userInfo.EmailOrPhone && t.Code == userInfo.verificationCode && t.CodeType == userInfo.verificationType); + await _verificationCodeRepository.BatchDeleteNoTrackingAsync(t => t.EmailOrPhone == userInfo.EmailOrPhone && t.Code == userInfo.verificationCode && t.CodeType == userInfo.verificationType); await _trialSiteSurveyRepository.SaveChangesAsync(); @@ -527,7 +531,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpGet("{trialId:guid}")] public async Task GetTrialSurveyInitInfo(Guid trialId) { - var info = await _repository.Where(t => t.Id == trialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); + var info = await _trialRepository.Where(t => t.Id == trialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return info; } @@ -552,7 +556,7 @@ namespace IRaCIS.Core.Application.Contracts var messageToSend = new MimeMessage(); - if (await _repository.AnyAsync(t => t.State == TrialSiteSurveyEnum.PMCreatedAndLock && t.Id == trialSiteSurveyId)) + if (await _trialSiteSurveyRepository.AnyAsync(t => t.State == TrialSiteSurveyEnum.PMCreatedAndLock && t.Id == trialSiteSurveyId)) { //---中心调研已锁定,不允许操作。 return ResponseOutput.NotOk(_localizer["TrialSiteSurvey_Locked"]); @@ -628,7 +632,7 @@ namespace IRaCIS.Core.Application.Contracts survey.IsDeleted = true; - await _repository.SaveChangesAsync(); + await _trialSiteSurveyRepository.SaveChangesAsync(); return ResponseOutput.Ok(); @@ -745,7 +749,7 @@ namespace IRaCIS.Core.Application.Contracts private async Task GenerateAccountAsync(List needGenerateList, Guid trialId) { - var trialType = _repository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault(); + var trialType = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault(); foreach (var item in needGenerateList) { @@ -777,7 +781,7 @@ namespace IRaCIS.Core.Application.Contracts saveItem.UserName = saveItem.UserCode; - saveItem.UserTypeEnum = _repository.Where(t => t.Id == saveItem.UserTypeId).Select(t => t.UserTypeEnum).First(); + saveItem.UserTypeEnum = _userTypeRepository.Where(t => t.Id == saveItem.UserTypeId).Select(t => t.UserTypeEnum).First(); var newUser = _userRepository.AddAsync(saveItem).Result; @@ -829,7 +833,7 @@ namespace IRaCIS.Core.Application.Contracts var findTrialUser = await _trialUserRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.UserId == userId, true); if (findTrialUser == null) { - await _repository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId, JoinTime = DateTime.Now }); + await _trialUserRepository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId, JoinTime = DateTime.Now }); await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, userId, joinCommand.BaseUrl, joinCommand.RouteUrl); @@ -850,7 +854,7 @@ namespace IRaCIS.Core.Application.Contracts if (findTrialSiteUser == null) { - await _repository.AddAsync(new TrialSiteUser() { TrialId = trialId, TrialSiteId = trialSiteId, UserId = userId }); + await _trialSiteUserRepository.AddAsync(new TrialSiteUser() { TrialId = trialId, TrialSiteId = trialSiteId, UserId = userId }); } else @@ -888,7 +892,7 @@ namespace IRaCIS.Core.Application.Contracts }); - await _repository.SaveChangesAsync(); + await _trialSiteUserRepository.SaveChangesAsync(); } @@ -897,7 +901,7 @@ namespace IRaCIS.Core.Application.Contracts { - var trialType = _repository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault(); + var trialType = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault(); //判断是否有系统账号 foreach (var item in list) @@ -947,7 +951,7 @@ namespace IRaCIS.Core.Application.Contracts var findTrialUser = await _trialUserRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.UserId == userId, true); if (findTrialUser == null) { - await _repository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId, JoinTime = DateTime.Now }); + await _trialUserRepository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId, JoinTime = DateTime.Now }); await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, userId, baseUrl, routeUrl); @@ -969,7 +973,7 @@ namespace IRaCIS.Core.Application.Contracts if (findTrialSiteUser == null) { - await _repository.AddAsync(new TrialSiteUser() { TrialId = trialId, TrialSiteId = trialSiteId, UserId = userId }); + await _trialSiteUserRepository.AddAsync(new TrialSiteUser() { TrialId = trialId, TrialSiteId = trialSiteId, UserId = userId }); } else diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteUserSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteUserSurveyService.cs index 880cf5f1a..74de0f00d 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteUserSurveyService.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteUserSurveyService.cs @@ -17,6 +17,8 @@ namespace IRaCIS.Core.Application.Contracts [ApiExplorerSettings(GroupName = "Trial")] public class TrialSiteUserSurveyService( IRepository _trialSiteUserSurveyRepository, + IRepository _trialRepository, + IRepository _userRepository, IRepository _trialSiteSurveyRepository) : BaseService, ITrialSiteUserSurveyService { @@ -51,12 +53,12 @@ namespace IRaCIS.Core.Application.Contracts { var trialId = _trialSiteSurveyRepository.Where(t => t.Id == addOrEditTrialSiteUserSurvey.TrialSiteSurveyId, false, true).Select(t => t.TrialId).FirstOrDefault(); - var trialType = _repository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault(); + var trialType = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault(); var item = addOrEditTrialSiteUserSurvey; //找下系统中是否存在该用户类型的 并且邮箱 或者手机的账户 - var sysUserInfo = await _repository.Where(t => t.UserTypeId == item.UserTypeId && t.EMail == item.Email).Include(t => t.UserTypeRole).FirstOrDefaultAsync(); + var sysUserInfo = await _userRepository.Where(t => t.UserTypeId == item.UserTypeId && t.EMail == item.Email).Include(t => t.UserTypeRole).FirstOrDefaultAsync(); if (sysUserInfo != null) { @@ -97,7 +99,7 @@ namespace IRaCIS.Core.Application.Contracts if (addOrEditTrialSiteUserSurvey.UserTypeId != null) { - var existSysUser = await _repository.Where(t => t.EMail == addOrEditTrialSiteUserSurvey.Email && t.UserTypeId == addOrEditTrialSiteUserSurvey.UserTypeId).Include(d => d.UserTypeRole).FirstOrDefaultAsync(); + var existSysUser = await _userRepository.Where(t => t.EMail == addOrEditTrialSiteUserSurvey.Email && t.UserTypeId == addOrEditTrialSiteUserSurvey.UserTypeId).Include(d => d.UserTypeRole).FirstOrDefaultAsync(); if (existSysUser != null) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs index a6d85a694..e0c620b3e 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs @@ -44,7 +44,7 @@ namespace IRaCIS.Application.Contracts } - public class TrialUserSelct: UserTrialCommand + public class TrialUserSelct : UserTrialCommand { public string Phone { get; set; } = String.Empty; @@ -120,7 +120,7 @@ namespace IRaCIS.Application.Contracts } - public class TrialCRCUploadImageList_Export: ExcelExportInfo + public class TrialCRCUploadImageList_Export : ExcelExportInfo { @@ -129,12 +129,8 @@ namespace IRaCIS.Application.Contracts public class ExcelExportInfo : TrialSelectDTO { - - public string CurrentTime => TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById(ClientZoneId)).ToString("yyyy-MM-dd HH:mm:ss"); + public string CurrentTime { get; set; } - public bool IsEn_US { get; set; } - - public string ClientZoneId { get; set; } = string.Empty; public object List { get; set; } } @@ -162,10 +158,10 @@ namespace IRaCIS.Application.Contracts { public List TrialSiteUserList { get; set; } = new List(); - + } - public class TrialSiteUserSummaryDto: TrialSiteUserSurveyView + public class TrialSiteUserSummaryDto : TrialSiteUserSurveyView { @@ -177,7 +173,7 @@ namespace IRaCIS.Application.Contracts //public string IsGenerateAccountStr => IsGenerateAccount ? "是" : "否"; - + //public string StateStr => State.GetDescription(); } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 22d77b8b4..a401e036a 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -40,6 +40,7 @@ namespace IRaCIS.Core.Application IRepository _clinicalDataTrialSetRepository, IRepository _readingCriterionPageRepository, IOrganInfoService _iOrganInfoService, + IRepository _trialBodyPartRepository, IRepository _readingCriterionDictionaryRepository, IRepository _readingTrialCriterionDictionaryRepository, IReadingQuestionService iReadingQuestionService, @@ -47,6 +48,10 @@ namespace IRaCIS.Core.Application IRepository _readingTaskQuestionAnswer, IRepository _readingTableQuestionAnswerRepository, IRepository _readingTableAnswerRowInfoRepository, + IRepository _systemBasicDataRepository, + IRepository _subjectVisitRepository, + IRepository _enrollRepository, + IRepository _trialStateChangeRepository, IRepository _readingTableQuestionTrialRepository) : BaseService, ITrialConfigService { @@ -725,7 +730,7 @@ namespace IRaCIS.Core.Application [HttpGet("{signCode}")] public async Task GetSignText(string signCode) { - var signRawText = await _repository.Where(t => t.Code == signCode).Select(t => new { t.Code, t.Value, t.ValueCN, t.Id, ParentValue = t.Parent.Value, ParentValueCN = t.Parent.ValueCN }).FirstOrDefaultAsync(); + var signRawText = await _systemBasicDataRepository.Where(t => t.Code == signCode).Select(t => new { t.Code, t.Value, t.ValueCN, t.Id, ParentValue = t.Parent.Value, ParentValueCN = t.Parent.ValueCN }).FirstOrDefaultAsync(); if (signRawText == null) { @@ -769,7 +774,7 @@ namespace IRaCIS.Core.Application .IfNullThrowException(); - var showOrderList = await _repository.Where(t => t.TrialId == signConfirmDTO.TrialId).Select(t => + var showOrderList = await _trialQCQuestionRepository.Where(t => t.TrialId == signConfirmDTO.TrialId).Select(t => new { t.ShowOrder, ParentShowOrder = (int?)t.ParentQCQuestion.ShowOrder }).ToListAsync(); if (trialConfig.QCProcessEnum == @@ -839,7 +844,7 @@ namespace IRaCIS.Core.Application .IfNullThrowException(); - var showOrderList = await _repository.Where(t => t.TrialId == signConfirmDTO.TrialId).Select(t => + var showOrderList = await _trialQCQuestionRepository.Where(t => t.TrialId == signConfirmDTO.TrialId).Select(t => new { t.ShowOrder, ParentShowOrder = (int?)t.ParentQCQuestion.ShowOrder }).ToListAsync(); if (trialConfig.QCProcessEnum == @@ -906,7 +911,7 @@ namespace IRaCIS.Core.Application //await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys }); - return ResponseOutput.Ok(await _repository.SaveChangesAsync()); + return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync()); } @@ -1049,7 +1054,7 @@ namespace IRaCIS.Core.Application //}); ; - var result = await _repository.SaveChangesAsync(); + var result = await _trialRepository.SaveChangesAsync(); if (trialConfig.IsTrialProcessConfirmed) { @@ -1086,7 +1091,7 @@ namespace IRaCIS.Core.Application if (trialConfig.IsUrgent) { - await _repository.BatchUpdateAsync(t => t.TrialId == trialInfo.Id && t.SubmitState == SubmitStateEnum.Submitted && t.ForwardState < ForwardStateEnum.Forwarded, + await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialInfo.Id && t.SubmitState == SubmitStateEnum.Submitted && t.ForwardState < ForwardStateEnum.Forwarded, s => new SubjectVisit() { IsUrgent = trialConfig.IsUrgent }); } else //之前设置为加急的访视状态不变。后续提交的访视,为不加急。 @@ -1098,7 +1103,7 @@ namespace IRaCIS.Core.Application trialInfo.UpdateTime = DateTime.Now; - return ResponseOutput.Ok(await _repository.SaveChangesAsync()); + return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync()); } /// @@ -1178,7 +1183,7 @@ namespace IRaCIS.Core.Application //Paused、 添加工总量 算医生读片中 if (trialStatusStr.Contains(StaticData.TrialState.TrialCompleted)) { - await _repository.BatchUpdateAsync(u => u.TrialId == trialId, e => new Enroll + await _enrollRepository.BatchUpdateNoTrackingAsync(u => u.TrialId == trialId, e => new Enroll { EnrollStatus = EnrollStatus.Finished }); @@ -1189,7 +1194,7 @@ namespace IRaCIS.Core.Application await _fusionCache.SetAsync(CacheKeys.Trial(trial.Id.ToString()), trialStatusStr, TimeSpan.FromDays(7)); - await _repository.SaveChangesAsync(); + await _trialRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -1203,7 +1208,7 @@ namespace IRaCIS.Core.Application [HttpGet("{trialId:guid}")] public async Task> GetTrialStateChangeList(Guid trialId) { - return await _repository.Where(t => t.TrialId == trialId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + return await _trialStateChangeRepository.Where(t => t.TrialId == trialId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } @@ -1295,7 +1300,7 @@ namespace IRaCIS.Core.Application public async Task AddOrUpdateTrialBodyPart(AddOrUpdateTrialBodyPartCommand incommand) { - var codeList = await _repository.Where(t => t.TrialId == incommand.TrialId) + var codeList = await _trialBodyPartRepository.Where(t => t.TrialId == incommand.TrialId) .WhereIf(incommand.Id != null, t => t.Id != incommand.Id) .Select(t => t.Code).ToListAsync(); @@ -1319,7 +1324,7 @@ namespace IRaCIS.Core.Application VerifyMsg = _localizer["TrialBodyPart_DupName"] }; - var cro = await _repository.InsertOrUpdateAsync(incommand, true, exp); + var cro = await _trialBodyPartRepository.InsertOrUpdateAsync(incommand, true, exp); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs index dc368dc31..3b1fea4d3 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs @@ -28,6 +28,8 @@ namespace IRaCIS.Core.Application.Service IRepository _trialExternalUseRepository, IRepository _userRepository, IRepository _trialUserRepository, + IRepository _trialRepository, + IRepository _userTypeRepository, IMailVerificationService _mailVerificationService, IDistributedLockProvider _distributedLockProvider) : BaseService, ITrialExternalUserService { @@ -97,7 +99,7 @@ namespace IRaCIS.Core.Application.Service var existUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId); - var trialType = await _repository.Where(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync(); + var trialType = await _trialRepository.Where(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync(); if (existUser != null) { @@ -127,13 +129,13 @@ namespace IRaCIS.Core.Application.Service generateUser.UserName = generateUser.UserCode; - generateUser.UserTypeEnum = _repository.Where(t => t.Id == generateUser.UserTypeId).Select(t => t.UserTypeEnum).First(); + generateUser.UserTypeEnum = _userTypeRepository.Where(t => t.Id == generateUser.UserTypeId).Select(t => t.UserTypeEnum).First(); generateUser.Password = MD5Helper.Md5("123456"); generateUser.Status = UserStateEnum.Disable; - var newAddUser = await _repository.AddAsync(generateUser); + var newAddUser = await _userRepository.AddAsync(generateUser); addEntity.IsSystemUser = false; @@ -254,7 +256,7 @@ namespace IRaCIS.Core.Application.Service if (!await _trialUserRepository.AnyAsync(t => t.TrialId == trialId && t.UserId == userId, true)) { - await _repository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId, JoinTime = DateTime.Now }); + await _trialUserRepository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId, JoinTime = DateTime.Now }); await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == userId, u => new User() { Status = UserStateEnum.Enable }); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs index 1318f7ab2..0198b9589 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs @@ -16,44 +16,12 @@ namespace IRaCIS.Application.Services [ApiExplorerSettings(GroupName = "Trial")] public class TrialMaintenanceService( IRepository _trialUseRepository, + IRepository _userRepository, + IRepository _trialSiteUserRepository, + IRepository _subjectVisitRepository, IRepository _trialRepository) : BaseService, ITrialMaintenanceService { - #region 移动废弃 - - ///// - ///// 项目参与人员导出 - ///// - ///// - ///// - ///// - ///// - //[HttpPost] - //[AllowAnonymous] - //public async Task TrialUserListExport(TrialMaintenanceExportQuery param, [FromServices] IRepository _commonDocumentRepository, [FromServices] IDictionaryService _dictionaryService) - //{ - - // var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - - // exportInfo.List = await _trialUseRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters() - // .WhereIf(param.UserTypeId != null, t => t.User.UserTypeId == param.UserTypeId) - // .WhereIf(!string.IsNullOrWhiteSpace(param.UserName), t => t.User.UserName.Contains(param.UserName)) - - // .WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted) - // .WhereIf(!string.IsNullOrWhiteSpace(param.OrganizationName), - // t => t.User.OrganizationName.Contains(param.OrganizationName)) - // .WhereIf(!string.IsNullOrWhiteSpace(param.UserRealName), - // t => (t.User.FullName).Contains(param.UserRealName)) - // .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - - - // exportInfo.IsEn_US = _userInfo.IsEn_Us; - - // return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialMaintenanceDTO)); - - //} - #endregion - [HttpGet] public async Task> GetTrialUserList(Guid trialId) { @@ -121,7 +89,7 @@ namespace IRaCIS.Application.Services //之前已经选择的用户 不放在列表中,现在又要改回去 废弃 - var query = _repository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin) + var query = _userRepository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin) //正式或者培训的项目 不能允许测试用户(必须正式用户) 同时必须是内部的用户 .WhereIf(trialType == TrialType.OfficialTrial || trialType == TrialType.Training, t => t.IsTestUser == false && t.IsZhiZhun) @@ -168,7 +136,7 @@ namespace IRaCIS.Application.Services } - var success = await _repository.SaveChangesAsync(); + var success = await _trialUseRepository.SaveChangesAsync(); return ResponseOutput.Result(success); } @@ -187,7 +155,7 @@ namespace IRaCIS.Application.Services if (updateTrialUserCommand.IsDeleted) { - if (await _repository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) + if (await _trialSiteUserRepository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) { // ----人员已加入现场维护 return ResponseOutput.NotOk(_localizer["TrialMaint_PersonnelJoined"]); @@ -195,14 +163,14 @@ namespace IRaCIS.Application.Services if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) { - await _repository.BatchUpdateAsync(t => t.CurrentActionUserId == trialUser.UserId && t.TrialId == trialUser.TrialId && t.IsTake, u => new SubjectVisit() { CurrentActionUserId = null, CurrentActionUserExpireTime = null, IsTake = false }); + 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 _repository.SaveChangesAsync(); + await _trialUseRepository.SaveChangesAsync(); return ResponseOutput.Ok(); @@ -223,7 +191,7 @@ namespace IRaCIS.Application.Services if (trialUser == null) return Null404NotFound(trialUser); - if (await _repository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) + if (await _trialSiteUserRepository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) { //---人员已加入现场维护 return ResponseOutput.NotOk(_localizer["TrialMaint_PersonnelJoined"]); @@ -231,12 +199,12 @@ namespace IRaCIS.Application.Services if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC && isDelete) { - await _repository.BatchUpdateAsync(t => t.CurrentActionUserId == trialUser.UserId && t.TrialId == trialUser.TrialId && t.IsTake, u => new SubjectVisit() { CurrentActionUserId = null, CurrentActionUserExpireTime = null, IsTake = false }); + await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.CurrentActionUserId == trialUser.UserId && t.TrialId == trialUser.TrialId && t.IsTake, u => new SubjectVisit() { CurrentActionUserId = null, CurrentActionUserExpireTime = null, IsTake = false }); } await _trialUseRepository.BatchUpdateNoTrackingAsync(t => t.Id == id, u => new TrialUser() { IsDeleted = isDelete, RemoveTime = isDelete ? DateTime.Now : null }); - await _repository.SaveChangesAsync(); + await _trialUseRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs index 18f15f6ab..761cb5462 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs @@ -23,6 +23,16 @@ namespace IRaCIS.Application.Services public class TrialService( IRepository _trialRepository, IRepository _trialUserRepository, + IRepository _croRepository, + IRepository _enrollDetailRepository, + IRepository _dictionaryRepository, + IRepository _enrollRepository, + IRepository _workloadRepository, + IRepository _sponsorRepository, + IRepository _visitStageRepository, + IRepository _trialPaymentPriceRepository, + IRepository _trialDictionaryRepository, + IRepository _trialBodyPartRepository, IOptionsMonitor _verifyConfig) : BaseService, ITrialService { @@ -120,7 +130,7 @@ namespace IRaCIS.Application.Services [NonDynamicMethod] public async Task GetTrialMaxState(Guid trialId) { - return await _repository.Where(t => t.TrialId == trialId).MaxAsync(u => (int?)u.EnrollStatus) ?? 0; + return await _enrollDetailRepository.Where(t => t.TrialId == trialId).MaxAsync(u => (int?)u.EnrollStatus) ?? 0; } [HttpGet("{trialId:guid}")] @@ -203,23 +213,23 @@ namespace IRaCIS.Application.Services //如果是PM, 则需要将该人员添加到 运维人员表 //添加运维人员PM - await _repository.AddAsync(new TrialUser() { TrialId = trial.Id, UserId = _userInfo.Id, JoinTime = DateTime.Now }); + await _trialUserRepository.AddAsync(new TrialUser() { TrialId = trial.Id, UserId = _userInfo.Id, JoinTime = DateTime.Now }); // 添加扩展信息表记录 - await _repository.AddAsync(new TrialPaymentPrice() { TrialId = trial.Id }); + await _trialPaymentPriceRepository.AddAsync(new TrialPaymentPrice() { TrialId = trial.Id }); //添加访视 - await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 0, BlindName = "B" + 0.ToString("D3"), VisitDay = 0, VisitName = "Baseline", IsBaseLine = true, VisitWindowLeft = -28, VisitWindowRight = 0 }); - await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 1, BlindName = "B" + 10.ToString("D3"), VisitDay = 30, VisitName = "Visit 1", VisitWindowLeft = -5, VisitWindowRight = 5 }); + await _visitStageRepository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 0, BlindName = "B" + 0.ToString("D3"), VisitDay = 0, VisitName = "Baseline", IsBaseLine = true, VisitWindowLeft = -28, VisitWindowRight = 0 }); + await _visitStageRepository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 1, BlindName = "B" + 10.ToString("D3"), VisitDay = 30, VisitName = "Visit 1", VisitWindowLeft = -5, VisitWindowRight = 5 }); - var success = await _repository.SaveChangesAsync(); + var success = await _trialRepository.SaveChangesAsync(); //维护CRO Sponsor await DealSponsorAndCROAsync(trial); //维护部位到项目表 - var searchList = await _repository.Where(t => t.Parent.Code == "BodyPart" && t.ParentId != null && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var searchList = await _dictionaryRepository.Where(t => t.Parent.Code == "BodyPart" && t.ParentId != null && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var needAddBodyPartList = searchList.Select(t => new TrialBodyPart() { Code = t.Code, Name = t.Value, NameCN = t.ValueCN }).ToList(); @@ -229,7 +239,7 @@ namespace IRaCIS.Application.Services } - await _repository.AddRangeAsync(needAddBodyPartList, true); + await _trialBodyPartRepository.AddRangeAsync(needAddBodyPartList, true); await _fusionCache.SetAsync(CacheKeys.Trial(trial.Id.ToString()), StaticData.TrialState.TrialInitializing, TimeSpan.FromDays(7)); @@ -239,14 +249,14 @@ namespace IRaCIS.Application.Services { var updateModel = trialAddModel; - if (!await _repository.AnyAsync(u => u.Id == trialAddModel.Id && (u.TrialStatusStr == StaticData.TrialState.TrialInitializing || u.TrialStatusStr == StaticData.TrialState.TrialOngoing))) + if (!await _trialRepository.AnyAsync(u => u.Id == trialAddModel.Id && (u.TrialStatusStr == StaticData.TrialState.TrialInitializing || u.TrialStatusStr == StaticData.TrialState.TrialOngoing))) { //---项目状态只有处于:初始化或者进行中时,才允许操作。 throw new BusinessValidationFailedException(_localizer["Trial_InvalidProjectStatus"]); } // 判断项目Id 是否已经存在 - if (await _repository.AnyAsync(u => u.TrialCode == updateModel.TrialCode && u.Id != updateModel.Id)) + if (await _trialRepository.AnyAsync(u => u.TrialCode == updateModel.TrialCode && u.Id != updateModel.Id)) { //---已经存在相同的项目编号。 throw new BusinessValidationFailedException(_localizer["Trial_DuplicateProjectNumber"]); @@ -254,11 +264,11 @@ namespace IRaCIS.Application.Services - var trial = await _repository.FirstOrDefaultAsync(t => t.Id == updateModel.Id); + var trial = await _trialRepository.FirstOrDefaultAsync(t => t.Id == updateModel.Id); //删除中间表 Title对应的记录 - await _repository.BatchDeleteAsync(t => t.TrialId == updateModel.Id); + await _trialDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == updateModel.Id); //重新插入新的 Title记录 @@ -277,7 +287,7 @@ namespace IRaCIS.Application.Services trial.DeclarationTypes = $"|{string.Join('|', updateModel.DeclarationTypeEnumList.Select(x => ((int)x).ToString()).ToList())}|"; trial.AttendedReviewerTypes = $"|{string.Join('|', updateModel.AttendedReviewerTypeEnumList.Select(x => ((int)x).ToString()).ToList())}|"; - var success = await _repository.SaveChangesAsync(); + var success = await _trialRepository.SaveChangesAsync(); //维护CRO Sponsor await DealSponsorAndCROAsync(trial); @@ -292,17 +302,17 @@ namespace IRaCIS.Application.Services { if (trial.SponsorId != null) { - if (await _repository.AnyAsync(t => t.Id == trial.SponsorId && t.IsTrialLevel)) + if (await _sponsorRepository.AnyAsync(t => t.Id == trial.SponsorId && t.IsTrialLevel)) { - await _repository.BatchUpdateAsync(t => t.Id == trial.SponsorId, u => new Sponsor() { TrialId = trial.Id }); + await _sponsorRepository.BatchUpdateNoTrackingAsync(t => t.Id == trial.SponsorId, u => new Sponsor() { TrialId = trial.Id }); } } if (trial.CROId != null) { - if (await _repository.AnyAsync(t => t.Id == trial.CROId && t.IsTrialLevel)) + if (await _croRepository.AnyAsync(t => t.Id == trial.CROId && t.IsTrialLevel)) { - await _repository.BatchUpdateAsync(t => t.Id == trial.CROId, u => new CRO() { TrialId = trial.Id }); + await _croRepository.BatchUpdateNoTrackingAsync(t => t.Id == trial.CROId, u => new CRO() { TrialId = trial.Id }); } } } @@ -317,7 +327,7 @@ namespace IRaCIS.Application.Services switch (newState) { case (int)TrialExpedited.ExpeditedIn24H: - await _repository.BatchUpdateAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() + await _workloadRepository.BatchUpdateNoTrackingAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() { TimepointIn24H = u.Timepoint, AdjudicationIn24H = u.Adjudication, @@ -326,7 +336,7 @@ namespace IRaCIS.Application.Services }); break; case (int)TrialExpedited.ExpeditedIn48H: - await _repository.BatchUpdateAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() + await _workloadRepository.BatchUpdateNoTrackingAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() { TimepointIn48H = u.Timepoint, AdjudicationIn48H = u.Adjudication, @@ -347,7 +357,7 @@ namespace IRaCIS.Application.Services switch (newState) { case (int)TrialExpedited.None: - await _repository.BatchUpdateAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() + await _workloadRepository.BatchUpdateNoTrackingAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() { Timepoint = u.TimepointIn24H, Adjudication = u.AdjudicationIn24H, @@ -356,7 +366,7 @@ namespace IRaCIS.Application.Services }); break; case (int)TrialExpedited.ExpeditedIn48H: - await _repository.BatchUpdateAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() + await _workloadRepository.BatchUpdateNoTrackingAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() { TimepointIn48H = u.TimepointIn24H, AdjudicationIn48H = u.AdjudicationIn24H, @@ -378,7 +388,7 @@ namespace IRaCIS.Application.Services switch (newState) { case (int)TrialExpedited.None: - await _repository.BatchUpdateAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() + await _workloadRepository.BatchUpdateNoTrackingAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() { Timepoint = u.TimepointIn48H, Adjudication = u.AdjudicationIn48H, @@ -387,7 +397,7 @@ namespace IRaCIS.Application.Services }); break; case (int)TrialExpedited.ExpeditedIn24H: - await _repository.BatchUpdateAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() + await _workloadRepository.BatchUpdateNoTrackingAsync(t => t.IsLock == false && t.TrialId == trialId, u => new Workload() { TimepointIn24H = u.TimepointIn48H, AdjudicationIn24H = u.AdjudicationIn48H, @@ -422,166 +432,132 @@ namespace IRaCIS.Application.Services if (_verifyConfig.CurrentValue.OpenTrialRelationDelete) { - #region 项目真删除废弃 - //if (trial.VisitPlanConfirmed) - //{ - // return ResponseOutput.NotOk("Trial访视计划已经确认,无法删除"); - //} + #region 真项目删除 + //await _repository.BatchDeleteNoTrackingAsync(o => o.SubjectVisit.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(o => o.TrialReadingCriterion.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _dicomSeriesRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _dicomInstanceRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.Enroll.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.NoneDicomStudy.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //if (await _repository.AnyAsync(u => u.TrialId == trialId)) - //{ - // return ResponseOutput.NotOk("该Trial有医生入组或在入组流程中,无法删除"); - //} + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //if (await _repository.AnyAsync(u => u.TrialId == trialId)) - //{ - // return ResponseOutput.NotOk("该Trial下面有Site,无法删除"); - //} + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - ////PM 可以删除项目 仅仅在没有site 参与者只有他自己的时候 - //if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager) - //{ - // //参与者仅有他自己时,可以删除 - // if (await _trialUserRepository.CountAsync(t => t.TrialId == trialId) == 1) - // { - // var success1 = await _repository.BatchDeleteAsync(o => o.Id == trialId) || - // await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - // await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - // return ResponseOutput.Result(success1); - // } - //} - //if (await _repository.AnyAsync(u => u.TrialId == trialId)) - //{ - // return ResponseOutput.NotOk("该Trial下面有参与者,无法删除"); - //} + //await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); + + + //await _repository.BatchDeleteNoTrackingAsync(t => t.QCChallenge.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + + + //await _repository.BatchDeleteNoTrackingAsync(t => t.ReadingClinicalData.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TaskMedicalReview.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TaskMedicalReview.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + + //await _repository.BatchDeleteNoTrackingAsync(t => t.VisitTask.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.ReadingPeriodSet.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.VisitTask.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.Subject.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _subjectVisitRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _taskConsistentRuleRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.InfluenceTask.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + + //await _repository.BatchDeleteNoTrackingAsync(o => o.Id == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterion.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterion.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _trialDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialDocument.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialDocument.TrialId == trialId); + + //await _trialEmailNoticeUserRepository.BatchDeleteNoTrackingAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); + + ////await _repository.BatchDeleteAsync(t => t.TrialId == trialId) ; + //await _trialEmailNoticeUserRepository.BatchDeleteNoTrackingAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialSiteSurvey.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialSiteSurvey.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + //await _repository.BatchDeleteNoTrackingAsync(t => t.OriginalReReadingTask.TrialId == trialId); + //await _visitTaskRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); #endregion - await _repository.BatchDeleteAsync(o => o.SubjectVisit.TrialId == trialId); - await _repository.BatchDeleteAsync(o => o.TrialId == trialId); - await _repository.BatchDeleteAsync(o => o.TrialId == trialId); - await _repository.BatchDeleteAsync(o => o.TrialReadingCriterion.TrialId == trialId); - await _repository.BatchDeleteAsync(o => o.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.Enroll.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.NoneDicomStudy.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - - - - await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId); - - - await _repository.BatchDeleteAsync(t => t.QCChallenge.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - - - await _repository.BatchDeleteAsync(t => t.ReadingClinicalData.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - - await _repository.BatchDeleteAsync(t => t.TaskMedicalReview.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TaskMedicalReview.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - - await _repository.BatchDeleteAsync(t => t.VisitTask.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.ReadingPeriodSet.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.VisitTask.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.Subject.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.InfluenceTask.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - - await _repository.BatchDeleteAsync(o => o.Id == trialId); - await _repository.BatchDeleteAsync(t => t.TrialReadingCriterion.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialReadingCriterion.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialDocument.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialDocument.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); - - //await _repository.BatchDeleteAsync(t => t.TrialId == trialId) ; - await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialSiteSurvey.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialSiteSurvey.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - - await _repository.BatchDeleteAsync(t => t.OriginalReReadingTask.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId); return ResponseOutput.Ok(); @@ -620,7 +596,7 @@ namespace IRaCIS.Application.Services /// public async Task> GetTrialEnrollmentReviewerIds(Guid trialId) { - return await _repository.Where(u => u.TrialId == trialId && + return await _enrollRepository.Where(u => u.TrialId == trialId && u.EnrollStatus >= EnrollStatus.DoctorReading).Select(u => u.DoctorId).Distinct().ToListAsync(); } @@ -663,14 +639,14 @@ namespace IRaCIS.Application.Services [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task UpdateEnrollStatus(Guid trialId, EnrollStatus status) { - await _repository.AddAsync(new EnrollDetail() + await _enrollDetailRepository.AddAsync(new EnrollDetail() { DoctorId = _userInfo.Id, TrialId = trialId, EnrollStatus = status, OptUserType = (int)SystemUserType.DoctorUser, }); - return ResponseOutput.Result(await _repository.BatchUpdateAsync(u => u.TrialId == trialId && u.DoctorId == _userInfo.Id, e => new Enroll + return ResponseOutput.Result(await _enrollRepository.BatchUpdateNoTrackingAsync(u => u.TrialId == trialId && u.DoctorId == _userInfo.Id, e => new Enroll { EnrollStatus = status })); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs index 0be57ae8d..66f63f1f2 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs @@ -18,6 +18,8 @@ namespace IRaCIS.Core.Application.Services IRepository _trialSiteRepository, IRepository _trialSiteUserRepository, IRepository _siteRepository, + IRepository _subjectRepository, + IRepository _visitTaskRepository, IRepository _trialRepository) : BaseService, ITrialSiteService { @@ -128,10 +130,10 @@ namespace IRaCIS.Core.Application.Services } } - await _repository.AddRangeAsync(addArray); + await _trialSiteRepository.AddRangeAsync(addArray); - return ResponseOutput.Result(await _repository.SaveChangesAsync()); + return ResponseOutput.Result(await _trialSiteRepository.SaveChangesAsync()); } @@ -156,13 +158,13 @@ namespace IRaCIS.Core.Application.Services if (editTrialSiteCommand.IsDeleted) { - if (await _repository.AnyAsync(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId)) + if (await _trialSiteUserRepository.AnyAsync(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId)) { //---The site has been associated with CRC, and couldn't be deleted. return ResponseOutput.NotOk(_localizer["TrialSite_CannotDeleteAssociatedCRC"]); } - if (await _repository.AnyAsync(t => t.TrialSiteId == trialSiteId && t.TrialId == trialId)) + if (await _subjectRepository.AnyAsync(t => t.TrialSiteId == trialSiteId && t.TrialId == trialId)) { //---The subjects has been added to this site, and couldn't be disable. return ResponseOutput.NotOk(_localizer["TrialSite_ParticipantJoined"]); @@ -276,7 +278,7 @@ namespace IRaCIS.Core.Application.Services .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.CRCUserList.Any(t => t.UserId == _userInfo.Id)) .Select(t => t.TrialSiteCode).ToListAsync(); - var virtualList = await _repository.Where(t => t.IsSelfAnalysis == true && t.TrialId == trialId).Select(t => t.BlindTrialSiteCode).Distinct().ToListAsync(); + var virtualList = await _visitTaskRepository.Where(t => t.IsSelfAnalysis == true && t.TrialId == trialId).Select(t => t.BlindTrialSiteCode).Distinct().ToListAsync(); return isIncludeVirtualSite ? list.Concat(virtualList) : list; } @@ -295,21 +297,21 @@ namespace IRaCIS.Core.Application.Services var trialId = relation.TrialId; var trialSiteId = relation.Id; - if (await _repository.AnyAsync(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId)) + if (await _trialSiteUserRepository.AnyAsync(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId)) { //---The site has been associated with CRC, and couldn't be deleted. return ResponseOutput.NotOk(_localizer["TrialSite_CannotDeleteAssociatedCRC"]); } - if (await _repository.AnyAsync(t => t.TrialSiteId == trialSiteId && t.TrialId == trialId)) + if (await _subjectRepository.AnyAsync(t => t.TrialSiteId == trialSiteId && t.TrialId == trialId)) { //---The subjects has been added to this site, and couldn't be deleted. return ResponseOutput.NotOk(_localizer["TrialSite_CannotDeleteAssociatedSubject"]); } - await _repository.DeleteAsync(relation); + await _trialSiteRepository.DeleteAsync(relation); - return ResponseOutput.Result(await _repository.SaveChangesAsync()); + return ResponseOutput.Result(await _trialSiteUserRepository.SaveChangesAsync()); } diff --git a/IRaCIS.Core.Application/Service/Visit/PatientService.cs b/IRaCIS.Core.Application/Service/Visit/PatientService.cs index 845b51d55..d69f2a4d0 100644 --- a/IRaCIS.Core.Application/Service/Visit/PatientService.cs +++ b/IRaCIS.Core.Application/Service/Visit/PatientService.cs @@ -53,6 +53,9 @@ namespace IRaCIS.Application.Services IRepository _subjectRepository, IRepository _subjectVisitRepository, IRepository _dictionaryRepository, + IRepository _dicomStudyRepository, + IRepository _scpPatientRepository, + IRepository _scpImageUploadRepository, IDistributedLockProvider _distributedLockProvider) : BaseService { @@ -104,7 +107,7 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task>> GetSCPImageUploadList(SCPImageUploadQuery inQuery) { - var query = _repository.Where(t => t.TrialId == inQuery.TrialId) + var query = _scpImageUploadRepository.Where(t => t.TrialId == inQuery.TrialId) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.CalledAE), t => t.CalledAE.Contains(inQuery.CalledAE)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.CallingAEIP), t => t.CallingAEIP.Contains(inQuery.CallingAEIP)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.CallingAE), t => t.CallingAE.Contains(inQuery.CallingAE)) @@ -318,11 +321,11 @@ namespace IRaCIS.Application.Services var subjectId = inCommand.SubjectId; - var isVerifyVisitImageDate = await _repository.Where(t => t.Id == inCommand.TrialId).Select(t => t.IsVerifyVisitImageDate).FirstNotNullAsync(); + var isVerifyVisitImageDate = await _trialRepository.Where(t => t.Id == inCommand.TrialId).Select(t => t.IsVerifyVisitImageDate).FirstNotNullAsync(); var result = new List(); - var visitList = _repository.Where(t => t.SubjectId == inCommand.SubjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToList(); + var visitList = _subjectVisitRepository.Where(t => t.SubjectId == inCommand.SubjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToList(); var currentVisitNum = visitList.First(t => t.Id == inCommand.SubjectVisitId).VisitNum; @@ -355,7 +358,7 @@ namespace IRaCIS.Application.Services } } - var verifyStudyInfo = _repository.Where(t => t.TrialId == trialId && t.Id == waitUploadItem.Id).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault(); + var verifyStudyInfo = _dicomStudyRepository.Where(t => t.TrialId == trialId && t.Id == waitUploadItem.Id).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault(); var currentStudyResult = new VerifySCPStudyUploadResult() { SCPStudyId = waitUploadItem.Id }; @@ -436,7 +439,7 @@ namespace IRaCIS.Application.Services using (await @lock.AcquireAsync()) { - var dbStudyCodeIntMax = _repository.Where(s => s.TrialId == inCommand.TrialId).Select(t => t.Code).DefaultIfEmpty().Max(); + var dbStudyCodeIntMax = _dicomStudyRepository.Where(s => s.TrialId == inCommand.TrialId).Select(t => t.Code).DefaultIfEmpty().Max(); int currentNextCodeInt = dbStudyCodeIntMax + 1; @@ -450,7 +453,7 @@ namespace IRaCIS.Application.Services { var newStuty = _mapper.Map(find.SCPStudy); - await _repository.AddAsync(newStuty); + await _dicomStudyRepository.AddAsync(newStuty); newStuty.SeqId = Guid.Empty; newStuty.Code = currentNextCodeInt; @@ -471,7 +474,7 @@ namespace IRaCIS.Application.Services series.SubjectVisitId = subjectVisitId; } - await _repository.AddRangeAsync(newSeriesList); + await _dicomSeriesRepository.AddRangeAsync(newSeriesList); var newInstanceList = _mapper.Map>(find.InstanceList); @@ -483,13 +486,13 @@ namespace IRaCIS.Application.Services instance.SubjectVisitId = subjectVisitId; } - await _repository.AddRangeAsync(newInstanceList); + await _dicomInstanceRepository.AddRangeAsync(newInstanceList); } currentNextCodeInt++; - await _repository.BatchUpdateAsync(t => t.Id == find.SCPStudy.PatientId, u => new SCPPatient() { SubjectId = subjectId }); - await _repository.BatchUpdateAsync(t => t.Id == scpStudyId, u => new SCPStudy() { SubjectVisitId = subjectVisitId }); + await _scpPatientRepository.BatchUpdateNoTrackingAsync(t => t.Id == find.SCPStudy.PatientId, u => new SCPPatient() { SubjectId = subjectId }); + await _scpStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == scpStudyId, u => new SCPStudy() { SubjectVisitId = subjectVisitId }); } @@ -576,9 +579,8 @@ namespace IRaCIS.Application.Services } } - await _repository.SaveChangesAsync(); - await _repository.BatchUpdateAsync(t => t.Id == scpStudy.PatientId, u => new SCPPatient() { SubjectId = subjectId }); - await _repository.BatchUpdateAsync(t => t.Id == scpStudyId, u => new SCPStudy() { SubjectVisitId = subjectVisitId }); + await _scpPatientRepository.BatchUpdateNoTrackingAsync(t => t.Id == scpStudy.PatientId, u => new SCPPatient() { SubjectId = subjectId }); + await _scpStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == scpStudyId, u => new SCPStudy() { SubjectVisitId = subjectVisitId }); } @@ -586,7 +588,7 @@ namespace IRaCIS.Application.Services - await _repository.SaveChangesAsync(); + await _scpStudyRepository.SaveChangesAsync(); return ResponseOutput.Ok(); diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectService.cs index 820bdb807..857722353 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectService.cs @@ -13,6 +13,7 @@ namespace IRaCIS.Application.Services [ApiExplorerSettings(GroupName = "Trial")] public class SubjectService( IRepository _subjectRepository, + IRepository _trialRepository, IRepository _subjectVisitRepository) : BaseService, ISubjectService { @@ -28,7 +29,7 @@ namespace IRaCIS.Application.Services public async Task> AddOrUpdateSubject([FromBody] SubjectCommand subjectCommand) { var svlist = new List(); - if (await _repository.AnyAsync(t => t.Id == subjectCommand.TrialId && !t.VisitPlanConfirmed)) + if (await _trialRepository.AnyAsync(t => t.Id == subjectCommand.TrialId && !t.VisitPlanConfirmed)) { //---项目访视计划没有确认。请联系项目经理确认项目访视计划后,再添加受试者。 return ResponseOutput.NotOk(_localizer["Subject_NoConfirmedPlan"]); @@ -124,7 +125,7 @@ namespace IRaCIS.Application.Services var pageList = await subjectQuery.ToPagedListAsync(inQuery,nameof(SubjectQueryView.Code)); - var trialConfig = await _repository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); + var trialConfig = await _trialRepository.Where(t => t.Id == inQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return ResponseOutput.Ok(pageList, trialConfig); diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs index d45713359..8672695b0 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs @@ -23,13 +23,17 @@ namespace IRaCIS.Core.Application.Services public class SubjectVisitService( IRepository _subjectVisitRepository, IRepository _trialRepository, + IRepository _dicomStudyRepository, IRepository _noneDicomStudyRepository, IRepository _visitTaskRepository, IRepository _readingTableAnswerRowInfoRepository, IRepository _readingCustomTagRepository, IRepository _noneDicomStudyFileRepository, IRepository _subjectRepository, + IRepository _dicomInstanceRepository, + IRepository _taskStudyRepository, IServiceProvider _serviceProvider, + IRepository _dicomSeriesRepository, IRepository _trialReadingCriterionRepository ) : BaseService, ISubjectVisitService { @@ -85,7 +89,7 @@ namespace IRaCIS.Core.Application.Services throw new BusinessValidationFailedException(_localizer["Visit_NoExtraVisitAfterLast"]); } - if (await _repository.AnyAsync(t => t.SubjectId == svCommand.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum > svCommand.VisitNum && t.SignTime != null && t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.InOrder)) + if (await _visitTaskRepository.AnyAsync(t => t.SubjectId == svCommand.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum > svCommand.VisitNum && t.SignTime != null && t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.InOrder)) { //---该受试者后续访视已有任务完成阅片(有序阅片标准),不允许在此添加,如果确实需要,请回退 throw new BusinessValidationFailedException(_localizer["Visit_FinishedTasksNoAdd"]); @@ -182,7 +186,7 @@ namespace IRaCIS.Core.Application.Services //[Authorize(Policy = IRaCISPolicy.CRC)] public async Task DeleteSV(Guid id) { - if (await _repository.AnyAsync(t => t.SubjectVisitId == id)) + if (await _dicomStudyRepository.AnyAsync(t => t.SubjectVisitId == id)) { //---当前访视已经有影像上传,不允许删除。 return ResponseOutput.NotOk(_localizer["Visit_UploadedNoDelete"]); @@ -216,7 +220,7 @@ namespace IRaCIS.Core.Application.Services [AllowAnonymous] public async Task> GetVisitStudyList(Guid trialId, Guid sujectVisitId, int isReading) { - var studyList = await _repository.Where(t => t.TrialId == trialId && t.SubjectVisitId == sujectVisitId).Select(k => new VisitStudyDTO() + var studyList = await _dicomStudyRepository.Where(t => t.TrialId == trialId && t.SubjectVisitId == sujectVisitId).Select(k => new VisitStudyDTO() { InstanceCount = k.InstanceCount, Modalities = k.Modalities, @@ -226,12 +230,12 @@ namespace IRaCIS.Core.Application.Services }).ToListAsync(); var studyIds = studyList.Select(t => t.StudyId).ToList(); - var instanceList = await _repository.Where(t => studyIds.Contains(t.StudyId)) + var instanceList = await _dicomInstanceRepository.Where(t => studyIds.Contains(t.StudyId)) .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.HtmlPath }).ToListAsync(); foreach (var t in studyList) { - t.SeriesList = await _repository.Where(s => s.StudyId == t.StudyId) + t.SeriesList = await _dicomSeriesRepository.Where(s => s.StudyId == t.StudyId) .WhereIf(isReading == 1, s => s.IsReading).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); @@ -275,9 +279,9 @@ namespace IRaCIS.Core.Application.Services [HttpPost] public async Task GetDicomSeriesInfo(GetDicomSeriesInfoInDto inDto) { - DicomSeriesDTO series = await _repository.Where(s => s.Id == inDto.SeriesId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); + DicomSeriesDTO series = await _dicomSeriesRepository.Where(s => s.Id == inDto.SeriesId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); - var instanceList = await _repository.Where(t => t.SeriesId == inDto.SeriesId) + var instanceList = await _dicomInstanceRepository.Where(t => t.SeriesId == inDto.SeriesId) .Select(t => new { t.SeriesId, t.StudyId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath, t.SliceLocation }).ToListAsync(); @@ -360,17 +364,17 @@ namespace IRaCIS.Core.Application.Services } - List ctseriesLists = await _repository.Where(s => ctseriesIds.Contains(s.Id)).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - List ptseriesLists = await _repository.Where(s => ptseriesIds.Contains(s.Id)).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + List ctseriesLists = await _dicomSeriesRepository.Where(s => ctseriesIds.Contains(s.Id)).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + List ptseriesLists = await _dicomSeriesRepository.Where(s => ptseriesIds.Contains(s.Id)).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var seriesIds = ctseriesIds.Union(ptseriesIds).ToList(); //并集 - var instanceList = await _repository.Where(t => seriesIds.Contains(t.SeriesId)) + var instanceList = await _dicomInstanceRepository.Where(t => seriesIds.Contains(t.SeriesId)) .Select(t => new { t.SeriesId, t.StudyId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync(); var studyIds = instanceList.Select(x => x.StudyId).Distinct().ToList(); - var studyList = await _repository.Where(t => studyIds.Contains(t.Id)) + var studyList = await _dicomStudyRepository.Where(t => studyIds.Contains(t.Id)) .Select(k => new StudyInfo() { InstanceCount = k.InstanceCount, @@ -446,7 +450,7 @@ namespace IRaCIS.Core.Application.Services if (taskInfo.TaskStudyCount > 0) { - var taskStudyList = await _repository.Where(t => t.TrialId == indto.TrialId && t.VisitTaskId == indto.VisitTaskId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var taskStudyList = await _taskStudyRepository.Where(t => t.TrialId == indto.TrialId && t.VisitTaskId == indto.VisitTaskId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); foreach (var study in taskStudyList) { @@ -473,7 +477,7 @@ namespace IRaCIS.Core.Application.Services var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false); - var dicomStudyList = await _repository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId) + var dicomStudyList = await _dicomStudyRepository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId) .WhereIf(taskInfo.IsImageFilter == true, t => taskInfo.CriterionModalitys.Contains(t.ModalityForEdit)) .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) .Select(k => new VisitStudyDTO() @@ -487,10 +491,10 @@ namespace IRaCIS.Core.Application.Services }).ToListAsync(); var studyIds = dicomStudyList.Select(t => t.StudyId).ToList(); - var instanceList = await _repository.Where(t => studyIds.Contains(t.StudyId)) + var instanceList = await _dicomInstanceRepository.Where(t => studyIds.Contains(t.StudyId)) .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync(); - List seriesLists = await _repository.Where(s => studyIds.Contains(s.StudyId)) + List seriesLists = await _dicomSeriesRepository.Where(s => studyIds.Contains(s.StudyId)) .WhereIf(isManualGenerate == false, t => t.IsReading) .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) .OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); @@ -558,7 +562,7 @@ namespace IRaCIS.Core.Application.Services var thisSeriesIdIds = rowInfoList.Where(x => x.SeriesId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.SeriesId).Distinct().ToList(); if (rowInfoList.Count > 0) { - var thisVisitTaskStudy = await _repository.Where(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO() + var thisVisitTaskStudy = await _dicomStudyRepository.Where(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO() { InstanceCount = k.InstanceCount, @@ -572,7 +576,7 @@ namespace IRaCIS.Core.Application.Services if (thisVisitTaskStudy != null) { thisVisitTaskStudy.StudyId = default(Guid); - var item = await _repository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber). + var item = await _dicomSeriesRepository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber). ThenBy(s => s.SeriesTime) .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); @@ -582,7 +586,7 @@ namespace IRaCIS.Core.Application.Services var markInstanceIdList = rowInfoList.Where(y => y.InstanceId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(y => y.InstanceId!.Value).Distinct().ToList(); - item.InstanceInfoList = await _repository.Where(t => markInstanceIdList.Contains(t.Id)).OrderBy(t => t.InstanceNumber).Select(k => + item.InstanceInfoList = await _dicomInstanceRepository.Where(t => markInstanceIdList.Contains(t.Id)).OrderBy(t => t.InstanceNumber).Select(k => new InstanceBasicInfo() { Id = k.Id, @@ -613,7 +617,7 @@ namespace IRaCIS.Core.Application.Services item.Description = "Key Series"; - var modalityList = await _repository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(x => x.Modality).Distinct().ToListAsync(); ; + var modalityList = await _dicomSeriesRepository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(x => x.Modality).Distinct().ToListAsync(); ; item.Modality = string.Join(",", modalityList); thisVisitTaskStudy.SeriesList.Add(item); //thisVisitTaskStudy.SeriesCount = thisVisitTaskStudy.SeriesList.Count; diff --git a/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs b/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs index 341e427b7..812c5902c 100644 --- a/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs +++ b/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs @@ -16,6 +16,7 @@ namespace IRaCIS.Application.Services IRepository _trialRepository, IRepository _subjectVisitRepository, IRepository _influnceRepository, + IRepository _visitTaskRepository, IRepository _subjectRepository, IRepository _visitPlanInfluenceStatRepository) : BaseService, IVisitPlanService { @@ -43,9 +44,9 @@ namespace IRaCIS.Application.Services var query = _visitStageRepository.AsQueryable(true).Where(u => u.TrialId == trialId) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(t => t.VisitNum); var list = await query.ToListAsync(); - var trial = (await _repository.FirstOrDefaultAsync(t => t.Id == trialId)).IfNullThrowException(); + var trial = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId)).IfNullThrowException(); - var isHaveGeneratedTask = (await _repository.AnyAsync(t => t.TrialId == trialId)); + var isHaveGeneratedTask = (await _visitTaskRepository.AnyAsync(t => t.TrialId == trialId)); return new VisitPlanView() { VisitPlanList = list, @@ -179,7 +180,7 @@ namespace IRaCIS.Application.Services if (stage.IsBaseLine && stage.IsBaseLine != visitPlan.IsBaseLine) { - if (await _repository.Where(t => t.TrialId == visitPlan.TrialId).AnyAsync(v => v.IsBaseLine && v.SubmitState >= SubmitStateEnum.ToSubmit)) + if (await _subjectVisitRepository.Where(t => t.TrialId == visitPlan.TrialId).AnyAsync(v => v.IsBaseLine && v.SubmitState >= SubmitStateEnum.ToSubmit)) { //---有受试者的基线已经上传了影像数据,不允许修改基线访视。 throw new BusinessValidationFailedException(_localizer["VisitPlan_ExistBaselineImgNoModify"]); @@ -497,13 +498,13 @@ namespace IRaCIS.Application.Services var visitPlan = await _visitStageRepository.FirstOrDefaultAsync(t => t.Id == id); if (visitPlan == null) return Null404NotFound(visitPlan); - if (await _repository.AnyAsync(t => t.VisitName == visitPlan.VisitName && t.TrialId == visitPlan.TrialId && t.VisitExecuted == VisitExecutedEnum.Executed)) + if (await _subjectVisitRepository.AnyAsync(t => t.VisitName == visitPlan.VisitName && t.TrialId == visitPlan.TrialId && t.VisitExecuted == VisitExecutedEnum.Executed)) { //---The visit plan has been assigned to the subjects and executed. return ResponseOutput.NotOk(_localizer["VisitPlan_Assigned"]); } - await _repository.BatchDeleteAsync(t => t.TrialId == visitPlan.TrialId && t.VisitName == visitPlan.VisitName); + await _subjectVisitRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == visitPlan.TrialId && t.VisitName == visitPlan.VisitName); var result = await _visitStageRepository.BatchDeleteNoTrackingAsync(u => u.Id == id); diff --git a/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs b/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs index fb24edf70..d22694297 100644 --- a/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs +++ b/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs @@ -22,6 +22,7 @@ namespace IRaCIS.Application.Services IRepository _trialRevenuesPriceRepository, IRepository _trialRevenuesPriceVerificationRepository, IRepository _enrollReadingCriterionRepository, + IRepository _visitTaskRepository, IRepository _taskAllocationRuleRepository) : BaseService, IDoctorWorkloadService { @@ -129,7 +130,7 @@ namespace IRaCIS.Application.Services var enroll = await _enrollRepository.FirstAsync(t => t.Id == inDto.EnrollId); - if (_repository.Where(t => t.TrialId == enroll.TrialId && t.DoctorUserId == enroll.DoctorUserId && t.TaskAllocationState == TaskAllocationState.Allocated && t.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Any()) + if (_visitTaskRepository.Where(t => t.TrialId == enroll.TrialId && t.DoctorUserId == enroll.DoctorUserId && t.TaskAllocationState == TaskAllocationState.Allocated && t.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Any()) { var readingCategoryList = await _enrollReadingCategoryRepository.Where(t => t.EnrollId == inDto.EnrollId && t.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Select(t => t.ReadingCategory).ToListAsync(); diff --git a/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs b/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs index 935da1d58..58eda4ce6 100644 --- a/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs +++ b/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs @@ -19,6 +19,8 @@ namespace IRaCIS.Application.Services IRepository _doctorRepository, IRepository _enrollDetailRepository, IRepository _workloadRepository, + IRepository _userRepository, + IRepository _trialUserRepository, IMailVerificationService _mailVerificationService) : BaseService, IEnrollService { @@ -140,7 +142,7 @@ namespace IRaCIS.Application.Services TrialId = trialId, EnrollStatus = EnrollStatus.HasApplyDownloadResume, - DoctorUserId = _repository.Where(t => t.DoctorId == doctorId).Select(t => t.Id).FirstOrDefault() + DoctorUserId = _userRepository.Where(t => t.DoctorId == doctorId).Select(t => t.Id).FirstOrDefault() }); ; await _enrollDetailRepository.AddAsync(new EnrollDetail() @@ -168,7 +170,7 @@ namespace IRaCIS.Application.Services var trial = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId); - var hasSPMOrCPM = await _repository.Where(t => t.TrialId == trialId).AnyAsync(t=> t.User.UserTypeEnum == UserTypeEnum.SPM || t.User.UserTypeEnum == UserTypeEnum.CPM); + var hasSPMOrCPM = await _trialUserRepository.Where(t => t.TrialId == trialId).AnyAsync(t=> t.User.UserTypeEnum == UserTypeEnum.SPM || t.User.UserTypeEnum == UserTypeEnum.CPM); if (trial != null) { diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 6d617ec9c..56983e702 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -33,73 +33,65 @@ using Xceed.Words.NET; namespace IRaCIS.Application.Services { [ApiExplorerSettings(GroupName = "Institution")] - public class TestService : BaseService + public class TestService( + IRepository _dicRepository, + IRepository _trialRepository, + IOptionsMonitor _systemEmailConfig, + IOptionsMonitor _basicConfig, + IRepository _systemDocumentRepository, + IRepository _trialClinicalDataSetCriterionRepository, + IRepository _dicomInstanceRepository, + IRepository _internationalizationRepository, + IRepository _systemDocConfirmedUserRepository, + IRepository _dicomStudyRepository, + IRepository _clinicalDataTrialSetRepository, + IRepository _readingQuestionCriterionTrialRepository, + IRepository _visitTaskRepository, + IRepository _dicomSeriesRepository, + IRepository _userRepository, + IRepository _trialBodyPartRepository, + IDistributedLockProvider _distributedLockProvider, + ILogger _logger) : BaseService { - public static int IntValue = 100; - private readonly IRepository _dicRepository; - private readonly IRepository _trialRepository; - - //private readonly IDistributedCache _cache; - - private readonly IOptionsMonitor _systemEmailConfig; - - private readonly IOptionsMonitor _basicConfig; - private readonly IRepository _visitTaskRepositoryy; - - private readonly IDistributedLockProvider _distributedLockProvider; - - private readonly ILogger _logger; - - public TestService(IRepository dicRepository, IRepository trialRepository, ILogger logger - - , IOptionsMonitor systemEmailConfig, IOptionsMonitor basicConfig, IRepository visitTaskRepository, IDistributedLockProvider distributedLockProvider) - { - _visitTaskRepositoryy = visitTaskRepository; - - _systemEmailConfig = systemEmailConfig; - _basicConfig = basicConfig; - - _dicRepository = dicRepository; - _trialRepository = trialRepository; - - _distributedLockProvider = distributedLockProvider; - - _logger = logger; - //_cache = cache; - } - /// /// 清理一致性分析任务 /// /// + /// + /// + /// /// - public async Task DeleteConsistentDate(Guid trialReadingCriterionId) + public async Task DeleteConsistentDate(Guid trialReadingCriterionId, + [FromServices] IRepository _taskConsistentRuleRepository, + [FromServices] IRepository _readingConsistentClinicalDataPDFRepository, + [FromServices] IRepository _readingConsistentClinicalDataRepository + ) { - var consistentSubjectIdList = _repository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == true).Select(t => t.SubjectId).ToList(); + var consistentSubjectIdList = _visitTaskRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == true).Select(t => t.SubjectId).ToList(); - await _repository.BatchDeleteAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId); + await _taskConsistentRuleRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId); - await _repository.BatchDeleteAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == true); + await _visitTaskRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == true); - await _repository.BatchDeleteAsync(t => consistentSubjectIdList.Contains(t.ReadingConsistentClinicalData.SubjectId)); + await _readingConsistentClinicalDataPDFRepository.BatchDeleteNoTrackingAsync(t => consistentSubjectIdList.Contains(t.ReadingConsistentClinicalData.SubjectId)); - await _repository.BatchDeleteAsync(t => consistentSubjectIdList.Contains(t.SubjectId)); + await _readingConsistentClinicalDataRepository.BatchDeleteNoTrackingAsync(t => consistentSubjectIdList.Contains(t.SubjectId)); - await _repository.SaveChangesAsync(); + await _readingConsistentClinicalDataRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } public async Task TestEFcore8() { - var systemDocQuery = from sysDoc in _repository.GetQueryable() + var systemDocQuery = from sysDoc in _systemDocumentRepository.Where() - join confirm in _repository.GetQueryable().Where(t => t.ConfirmTime != null) on sysDoc.Id equals confirm.SystemDocumentId + join confirm in _systemDocConfirmedUserRepository.Where().Where(t => t.ConfirmTime != null) on sysDoc.Id equals confirm.SystemDocumentId select new UnionDocumentWithConfirmInfoView() { IsSystemDoc = true, @@ -131,7 +123,7 @@ namespace IRaCIS.Application.Services //await _repository.BatchUpdateAsync(t => t.Id == Guid.Empty, u => new Subject() { FirstName = "fddd", LastName = "sss", UpdateTime = DateTime.Now }); - //await _repository.Where().ExecuteUpdateAsync(t => t.SetProperty(t => t.UpdateTime, u => DateTime.Now)); + //await _subjectRepository.Where().ExecuteUpdateAsync(t => t.SetProperty(t => t.UpdateTime, u => DateTime.Now)); return ResponseOutput.Ok(list); } @@ -155,7 +147,7 @@ namespace IRaCIS.Application.Services public async Task TestDistributedLock() { - await _repository.Where().Select(t => t.FullName).FirstNotNullAsync(); + await _userRepository.Where().Select(t => t.FullName).FirstNotNullAsync(); Console.WriteLine($"我进来了当前值是:" + IntValue); _logger.LogWarning($"我进来了当前值是:" + IntValue); @@ -186,11 +178,11 @@ namespace IRaCIS.Application.Services foreach (var row in rows) { - await _repository.InsertOrUpdateAsync(row); + await _internationalizationRepository.InsertOrUpdateAsync(row); } - await _repository.SaveChangesAsync(); + await _internationalizationRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -199,7 +191,6 @@ namespace IRaCIS.Application.Services public async Task Get() { - await _repository.Where(t => t.SubjectId == Guid.Empty).Include(t => t.ReadingClinicalDataPDFList).ExecuteDeleteAsync(); // Generate RSA keys var keyPair = RSAHelper.GenerateRSAKeyPair(2048); @@ -394,7 +385,7 @@ namespace IRaCIS.Application.Services - //var d = _repository.Where(t => t.FullName.Contains("cc")).Select(t => t.FullName).FirstOrDefault(); + //var d = _userRepository.Where(t => t.FullName.Contains("cc")).Select(t => t.FullName).FirstOrDefault(); //var c = _dicRepository.Where(t => t.ParentId != null).Select(t => t.MappedValue).First(); //CultureInfo culture = CultureInfo.CurrentUICulture; @@ -421,12 +412,12 @@ namespace IRaCIS.Application.Services return _localizer["test{0}", "测试"]; - //var list = _repository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.VisitTaskList).ToList(); + //var list = _subjectVisitRepository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.VisitTaskList).ToList(); - //var list2 = _repository.Where(t => t.Id == Guid.NewGuid()).Select(t => t.SourceSubjectVisit).ToList(); + //var list2 = _visitTaskRepository.Where(t => t.Id == Guid.NewGuid()).Select(t => t.SourceSubjectVisit).ToList(); - //var list3 = _repository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.SourceSubjectVisit.VisitTaskList).ToList(); - //var list2 = _repository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.SubjectVisitTaskList).ToList(); + //var list3 = _visitTaskRepository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.SourceSubjectVisit.VisitTaskList).ToList(); + //var list2 = _subjectRepository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.SubjectVisitTaskList).ToList(); //return _userInfo.LocalIp; } @@ -439,7 +430,7 @@ namespace IRaCIS.Application.Services var needAddBodyPartList = searchList.Select(t => new TrialBodyPart() { Code = t.Code, Name = t.Value, NameCN = t.ValueCN }); - var trialIds = _repository.Where(t => !t.TrialBodyPartList.Any()).Select(t => t.Id).ToList(); + var trialIds = _trialRepository.Where(t => !t.TrialBodyPartList.Any()).Select(t => t.Id).ToList(); foreach (var trialId in trialIds) { @@ -447,10 +438,10 @@ namespace IRaCIS.Application.Services tempList.ForEach(t => t.TrialId = trialId); - await _repository.AddRangeAsync(tempList); + await _trialBodyPartRepository.AddRangeAsync(tempList); } - await _repository.SaveChangesAsync(); + await _dicRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -462,7 +453,7 @@ namespace IRaCIS.Application.Services [AllowAnonymous] public async Task ModifyClinicalDataTable() { - var needAddList = _repository.Where(t => t.CriterionEnumListStr != String.Empty && t.TrialClinicalDataSetCriteriaList.Count() == 0).ToList(); + var needAddList = _clinicalDataTrialSetRepository.Where(t => t.CriterionEnumListStr != String.Empty && t.TrialClinicalDataSetCriteriaList.Count() == 0).ToList(); //遍历项目 @@ -470,7 +461,7 @@ namespace IRaCIS.Application.Services { //找到项目存在的项目标准 - var trialCritrialList = _repository.Where(t => t.TrialId == needAddTrialGroup.Key).ToList(); + var trialCritrialList = _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == needAddTrialGroup.Key).ToList(); //遍历项目下的临床数据 foreach (var needAddTrial in needAddTrialGroup) @@ -484,12 +475,12 @@ namespace IRaCIS.Application.Services if (find != null) { - await _repository.AddAsync(new TrialClinicalDataSetCriterion() { TrialClinicalDataSetId = needAddTrial.Id, TrialReadingCriterionId = find.Id }); + await _trialClinicalDataSetCriterionRepository.AddAsync(new TrialClinicalDataSetCriterion() { TrialClinicalDataSetId = needAddTrial.Id, TrialReadingCriterionId = find.Id }); } } } } - await _repository.SaveChangesAsync(); + await _trialClinicalDataSetCriterionRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -500,7 +491,7 @@ namespace IRaCIS.Application.Services /// [AllowAnonymous] [UnitOfWork] - public async Task OldLocalImageResizeJpg([FromServices] IOSSService oSSService, [FromServices] IRepository _repository, [FromServices] IWebHostEnvironment _hostEnvironment) + public async Task OldLocalImageResizeJpg([FromServices] IOSSService oSSService, [FromServices] IWebHostEnvironment _hostEnvironment) { var aliConfig = oSSService.ObjectStoreServiceOptions.AliyunOSS; @@ -508,7 +499,7 @@ namespace IRaCIS.Application.Services var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment); - var studyList = _repository.Where(t => t.SeriesList.Any(t => t.ImageResizePath.Length < 10)).Select(t => new { t.TrialId, t.Subject.TrialSiteId, t.SubjectId, t.SubjectVisitId, t.Id }).ToList(); + var studyList = _dicomStudyRepository.Where(t => t.SeriesList.Any(t => t.ImageResizePath.Length < 10)).Select(t => new { t.TrialId, t.Subject.TrialSiteId, t.SubjectId, t.SubjectVisitId, t.Id }).ToList(); foreach (var studyitem in studyList) { @@ -549,9 +540,9 @@ namespace IRaCIS.Application.Services foreach (var jpg in jpgInfoList) { - var seriesId = _repository.Where(t => t.Id == jpg.InstanceId).Select(t => t.SeriesId).FirstOrDefault(); + var seriesId = _dicomInstanceRepository.Where(t => t.Id == jpg.InstanceId).Select(t => t.SeriesId).FirstOrDefault(); - await _repository.BatchUpdateAsync(t => t.Id == seriesId, t => new DicomSeries() { ImageResizePath = "/" + jpg.Key }); + await _dicomSeriesRepository.BatchUpdateNoTrackingAsync(t => t.Id == seriesId, t => new DicomSeries() { ImageResizePath = "/" + jpg.Key }); } // 设置 NextMarker 以获取下一页的数据 @@ -564,7 +555,7 @@ namespace IRaCIS.Application.Services Console.WriteLine($"Error: {ex.Message}"); } - await _repository.SaveChangesAsync(); + await _dicomStudyRepository.SaveChangesAsync(); } diff --git a/IRaCIS.Core.Application/Triggers/AddCRCCliniaclDataTrigger.cs b/IRaCIS.Core.Application/Triggers/AddCRCCliniaclDataTrigger.cs index 8ee6c4463..d55cd73a6 100644 --- a/IRaCIS.Core.Application/Triggers/AddCRCCliniaclDataTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/AddCRCCliniaclDataTrigger.cs @@ -8,19 +8,11 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Triggers { - public class AddCRCCliniaclDataTrigger : IAfterSaveTrigger - { - private readonly IRepository _subjectVisitRepository; - private readonly IRepository _repository; - private readonly IClinicalAnswerService _iClinicalAnswerService; - - public AddCRCCliniaclDataTrigger(IRepository subjectVisitRepository, IRepository repository, IClinicalAnswerService iClinicalAnswerService) - { - _subjectVisitRepository = subjectVisitRepository; - - _repository = repository; - this._iClinicalAnswerService = iClinicalAnswerService; - } + public class AddCRCCliniaclDataTrigger( + IRepository _subjectVisitRepository, + IClinicalAnswerService _iClinicalAnswerService) : IAfterSaveTrigger + { + //注意删除不能用扩展方法,必须用EF跟踪的实体 否则不能取到 SubjectVisitId public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) diff --git a/IRaCIS.Core.Application/Triggers/AddSubjectTrigger.cs b/IRaCIS.Core.Application/Triggers/AddSubjectTrigger.cs index 0bf4d5ebb..a20275b91 100644 --- a/IRaCIS.Core.Application/Triggers/AddSubjectTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/AddSubjectTrigger.cs @@ -8,28 +8,14 @@ namespace IRaCIS.Core.Application.Triggers /// /// 添加访视计划 要给改项目下的所有Subject 添加该访视 /// - public class AddSubjectTrigger : IBeforeSaveTrigger + public class AddSubjectTrigger( + IRepository _subjectVisitRepository, + + IRepository _visitStageRepository, + IRepository _trialRepository, + IMapper _mapper) : IBeforeSaveTrigger { - private readonly IRepository _subjectVisitRepository; - private readonly IRepository _clinicalDataTrialSetRepository; - private readonly IRepository _readingClinicalDataRepository; - private readonly IRepository _visitStageRepository; - private readonly IRepository _trialRepository; - private readonly IMapper _mapper; - - public AddSubjectTrigger(IRepository subjectVisitRepository, - IRepository clinicalDataTrialSetRepository, - IRepository readingClinicalDataRepository, - IMapper mapper, IRepository visitStageRepository, IRepository trialRepository) - { - _subjectVisitRepository = subjectVisitRepository; - this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; - this._readingClinicalDataRepository = readingClinicalDataRepository; - _trialRepository = trialRepository; - - _visitStageRepository = visitStageRepository; - _mapper = mapper; - } + public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) { diff --git a/IRaCIS.Core.Application/Triggers/AddlTrialUserTrigger.cs b/IRaCIS.Core.Application/Triggers/AddlTrialUserTrigger.cs index 6f5082e6e..85a721ffb 100644 --- a/IRaCIS.Core.Application/Triggers/AddlTrialUserTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/AddlTrialUserTrigger.cs @@ -12,20 +12,13 @@ namespace IRaCIS.Core.Application.Triggers { // 统一处理 外部用户、中心调研(先添加 再发送邮件)、参与医生加入到项目 ----废弃 - public class AddlTrialUserTrigger :IBeforeSaveTrigger + public class AddlTrialUserTrigger( + IStringLocalizer _localizer, + IRepository _trialRepository, + IRepository _userRepository) : IBeforeSaveTrigger { - public IStringLocalizer _localizer; - private readonly IRepository _trialRepository; - private readonly IRepository _userRepository; - - public AddlTrialUserTrigger(IRepository trialRepository, IRepository userRepository, IStringLocalizer localizer) - { - _trialRepository = trialRepository; - - _userRepository = userRepository; - _localizer = localizer; - } + public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) { var trialUser = context.Entity; diff --git a/IRaCIS.Core.Application/Triggers/ChallengeStateTrigger.cs b/IRaCIS.Core.Application/Triggers/ChallengeStateTrigger.cs index 24431b77f..e169a367a 100644 --- a/IRaCIS.Core.Application/Triggers/ChallengeStateTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/ChallengeStateTrigger.cs @@ -5,14 +5,9 @@ namespace IRaCIS.Core.Application.Triggers { //访视 质疑状态 触发修改 - public class ChallengeStateTrigger : IAfterSaveTrigger + public class ChallengeStateTrigger(IRepository _qcChallengeRepository, IRepository _subjectVisitRepository) : IAfterSaveTrigger { - private readonly IRepository _repository; - - public ChallengeStateTrigger(IRepository repository) - { - _repository = repository; - } + public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { @@ -21,7 +16,7 @@ namespace IRaCIS.Core.Application.Triggers ChallengeStateEnum subjectVisitChallengeState = default; - var closedStateList = await _repository.Where(t => t.SubjectVisitId == subjectVisitId).Select(t => t.IsClosed).ToListAsync(); + var closedStateList = await _qcChallengeRepository.Where(t => t.SubjectVisitId == subjectVisitId).Select(t => t.IsClosed).ToListAsync(); if (closedStateList.Count == 0) { @@ -37,7 +32,7 @@ namespace IRaCIS.Core.Application.Triggers } - await _repository.BatchUpdateAsync(t => t.Id == subjectVisitId, + await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { ChallengeState = subjectVisitChallengeState }); } } diff --git a/IRaCIS.Core.Application/Triggers/SubjectStateTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectStateTrigger.cs index 2c958a2bb..3f5a484c3 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectStateTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectStateTrigger.cs @@ -11,18 +11,11 @@ namespace IRaCIS.Core.Application.Triggers /// /// /// - public class SubjectStateTrigger : IAfterSaveTrigger + public class SubjectStateTrigger( + IStringLocalizer _localizer, + IRepository _subjectVisitRepository) : IAfterSaveTrigger { - public IStringLocalizer _localizer; - private readonly IRepository _repository; - private readonly IRepository _subjectVisitRepository; - - public SubjectStateTrigger(IRepository subjectVisitRepository, IStringLocalizer localizer, IRepository repository) - { - _repository = repository; - _localizer = localizer; - _subjectVisitRepository = subjectVisitRepository; - } + public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { @@ -39,7 +32,7 @@ namespace IRaCIS.Core.Application.Triggers var trialSiteId = context.Entity.TrialSiteId; - await _repository.BatchUpdateAsync(t => t.SubjectId == subjectId, u => new SubjectVisit() { TrialSiteId = trialSiteId }); + await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId, u => new SubjectVisit() { TrialSiteId = trialSiteId }); diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs index 94463c240..2884dddfb 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs @@ -12,44 +12,14 @@ namespace IRaCIS.Core.Application.Triggers /// /// 处理 访视 末次评估 会影响Subject 状态 /// - public class SubjectVisitCheckPassedTrigger : IBeforeSaveTrigger + public class SubjectVisitCheckPassedTrigger( + IVisitTaskHelpeService _visitTaskHelpeService, + IRepository _subjectRepository, + IRepository _trialReadingCriterionRepository, + ISubjectCriteriaEvaluationService _subjectCriteriaEvaluationService, + IRepository _subjectCriteriaEvaluationRepository) : IBeforeSaveTrigger { - private readonly IVisitTaskHelpeService _visitTaskHelpeService; - - private readonly IRepository _subjectRepository; - private readonly IRepository _clinicalDataTrialSetRepository; - private readonly IRepository _readingClinicalDataRepository; - - private readonly IRepository _trialReadingCriterionRepository; - - private readonly IRepository _SubjectCriteriaEvaluationVisitFilterRepository; - - - - private readonly ISubjectCriteriaEvaluationService _subjectCriteriaEvaluationService; - - private readonly IRepository _subjectCriteriaEvaluationRepository; - - public SubjectVisitCheckPassedTrigger(IRepository subjectRepository, - IRepository clinicalDataTrialSetRepository, - IRepository readingClinicalDataRepository, - IVisitTaskHelpeService visitTaskHelpeService, IRepository trialReadingCriterionRepository, - IRepository subjectCriteriaEvaluationVisitFilterRepository, ISubjectCriteriaEvaluationService subjectCriteriaEvaluationService - , IRepository subjectCriteriaEvaluationRepository) - { - _subjectCriteriaEvaluationRepository= subjectCriteriaEvaluationRepository; - _subjectRepository = subjectRepository; - _clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; - _readingClinicalDataRepository = readingClinicalDataRepository; - this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; - _visitTaskHelpeService = visitTaskHelpeService; - _trialReadingCriterionRepository = trialReadingCriterionRepository; - _SubjectCriteriaEvaluationVisitFilterRepository = subjectCriteriaEvaluationVisitFilterRepository; - _subjectCriteriaEvaluationService = subjectCriteriaEvaluationService; - } - - public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) { @@ -71,7 +41,7 @@ namespace IRaCIS.Core.Application.Triggers context.Entity.IsPMBackOrReReading = false; //找到手动生成任务的标准 - var criterionList = await _trialReadingCriterionRepository.Where(t => t.IsAutoCreate == false && t.IsSigned == true).Select(t => new { t.Id, t.TrialId,t.IsReadingTaskViewInOrder }).ToListAsync(); + var criterionList = await _trialReadingCriterionRepository.Where(t => t.IsAutoCreate == false && t.IsSigned == true).Select(t => new { t.Id, t.TrialId, t.IsReadingTaskViewInOrder }).ToListAsync(); foreach (var criterion in criterionList) { @@ -81,7 +51,7 @@ namespace IRaCIS.Core.Application.Triggers //} //如果参与评估,那么久对当前访视进行自动筛选 - if( await _subjectCriteriaEvaluationRepository.AnyAsync(t=>t.SubjectId==subjectVisit.SubjectId && t.TrialReadingCriterionId==criterion.Id && t.IsJoinEvaluation)) + if (await _subjectCriteriaEvaluationRepository.AnyAsync(t => t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId == criterion.Id && t.IsJoinEvaluation)) { await _subjectCriteriaEvaluationService.AutoSubjectCriteriaEvaluationVisitFilter(subjectVisit.SubjectId, subjectVisit.Id, criterion.Id); diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitFinalVisitTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitFinalVisitTrigger.cs index 2a9254098..9889f1d3a 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitFinalVisitTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitFinalVisitTrigger.cs @@ -12,38 +12,18 @@ namespace IRaCIS.Core.Application.Triggers /// /// 处理 访视 末次评估 会影响Subject 状态 /// - public class SubjectVisitFinalVisitTrigger :IAfterSaveTrigger + public class SubjectVisitFinalVisitTrigger( + IRepository _subjectVisitRepository, + IRepository _readModuleRepository, + IRepository _subjectRepository, + IRepository _visitTaskRepository, + IVisitTaskHelpeService _ivisitTaskHelpeService, + IStringLocalizer _localizer, + IRepository _trialRepository, + IRepository _readingQuestionCriterionTrialRepository + ) : IAfterSaveTrigger { - private readonly IRepository _subjectVisitRepository; - private readonly IRepository _readingPeriodSetRepository; - private readonly IRepository _readingPeriodPlanRepository; - private readonly IRepository _readModuleRepository; - private readonly IRepository _subjectRepository; - private readonly IRepository _visitTaskRepository; - private readonly IVisitTaskHelpeService _ivisitTaskHelpeService; - public IStringLocalizer _localizer; - private readonly IRepository _repository; - public SubjectVisitFinalVisitTrigger(IRepository subjectVisitRepository, - - IRepository readingPeriodSetRepository, - IRepository readingPeriodPlanRepository, - IRepository visitTaskRepository, - IVisitTaskHelpeService visitTaskHelpeService, - IRepository readModuleRepository, - IRepository subjectRepository, - IStringLocalizer localizer, - IRepository repository) - { - _subjectVisitRepository = subjectVisitRepository; - this._readingPeriodSetRepository = readingPeriodSetRepository; - this._visitTaskRepository = visitTaskRepository; - this._ivisitTaskHelpeService = visitTaskHelpeService; - this._readingPeriodPlanRepository = readingPeriodPlanRepository; - this._readModuleRepository = readModuleRepository; - _subjectRepository = subjectRepository; - _repository = repository; - _localizer = localizer; - } + public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { @@ -112,12 +92,12 @@ namespace IRaCIS.Core.Application.Triggers // 是否全局阅片 - var trial = await _repository.Where(x => x.Id == trialId).FirstNotNullAsync(); + var trial = await _trialRepository.Where(x => x.Id == trialId).FirstNotNullAsync(); if (!subjectVisit.IsBaseLine && subjectVisit.SubmitState == SubmitStateEnum.Submitted) { - var criterionList = await _repository.Where(x => x.TrialId == trialId && x.ReadingInfoSignTime != null && x.IsConfirm && x.IsReadingPeriod && x.IsReadingTaskViewInOrder == ReadingOrder.InOrder).ToListAsync(); + var criterionList = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialId && x.ReadingInfoSignTime != null && x.IsConfirm && x.IsReadingPeriod && x.IsReadingTaskViewInOrder == ReadingOrder.InOrder).ToListAsync(); foreach (var item in criterionList) { diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs index 04e0c5d44..a5d1043bf 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs @@ -7,18 +7,14 @@ namespace IRaCIS.Core.Application.Triggers /// /// 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期 /// - public class SubjectVisitTrigger : IAfterSaveTrigger, IAfterSaveTrigger, IAfterSaveTrigger + public class SubjectVisitTrigger( + IRepository _subjectVisitRepository, + IClinicalAnswerService _iClinicalAnswerService, + IRepository _dicomSeriesRepository, + IRepository _noneDicomStudyRepository + ) : IAfterSaveTrigger, IAfterSaveTrigger, IAfterSaveTrigger { - private readonly IRepository _subjectVisitRepository; - private readonly IClinicalAnswerService _iClinicalAnswerService; - private readonly IRepository _repository; - - public SubjectVisitTrigger(IRepository subjectVisitRepository, IClinicalAnswerService iClinicalAnswerService,IRepository repository) - { - _subjectVisitRepository = subjectVisitRepository; - this._iClinicalAnswerService = iClinicalAnswerService; - _repository = repository; - } + //注意删除不能用扩展方法,必须用EF跟踪的实体 否则不能取到 SubjectVisitId public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) @@ -54,7 +50,7 @@ namespace IRaCIS.Core.Application.Triggers var studyId = context.Entity.Id; //处理Modality - var seriesModalityList = _repository.Where(t => t.StudyId == studyId).Select(u => u.Modality).Distinct(); + var seriesModalityList = _dicomSeriesRepository.Where(t => t.StudyId == studyId).Select(u => u.Modality).Distinct(); string ModaliyStr = string.Join('、', seriesModalityList.ToList()); @@ -101,7 +97,7 @@ namespace IRaCIS.Core.Application.Triggers public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { - var subjectVisitId =await _repository.Where(x=>x.Id== context.Entity.NoneDicomStudyId).Select(x=>x.SubjectVisitId).FirstOrDefaultAsync(); + var subjectVisitId =await _noneDicomStudyRepository.Where(x=>x.Id== context.Entity.NoneDicomStudyId).Select(x=>x.SubjectVisitId).FirstOrDefaultAsync(); if (context.ChangeType == ChangeType.Deleted || context.ChangeType == ChangeType.Added) { diff --git a/IRaCIS.Core.Application/Triggers/TableQuestionRowTrigger.cs b/IRaCIS.Core.Application/Triggers/TableQuestionRowTrigger.cs index 1d7e49c2a..40ba60b9d 100644 --- a/IRaCIS.Core.Application/Triggers/TableQuestionRowTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/TableQuestionRowTrigger.cs @@ -5,15 +5,10 @@ using System.Linq.Dynamic.Core; namespace IRaCIS.Core.Application.Triggers { //病灶编号维护 - public class TableQuestionRowTrigger : IBeforeSaveTrigger + public class TableQuestionRowTrigger( + IRepository _readingQuestionTrialRepository) : IBeforeSaveTrigger { - private readonly IRepository _readingQuestionTrialRepository; - - public TableQuestionRowTrigger(IRepository readingQuestionTrialRepository, IRepository repository) - { - this._readingQuestionTrialRepository = readingQuestionTrialRepository; - } - + public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) { Dictionary splitLesionDic = new Dictionary() diff --git a/IRaCIS.Core.Application/Triggers/TrialCriterionSignTrigger.cs b/IRaCIS.Core.Application/Triggers/TrialCriterionSignTrigger.cs index ece0a42a3..f33ee4537 100644 --- a/IRaCIS.Core.Application/Triggers/TrialCriterionSignTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/TrialCriterionSignTrigger.cs @@ -11,20 +11,11 @@ namespace IRaCIS.Core.Application.Triggers /// /// 因为可能先一致性核查通过,生成其他标准的任务了,新签名的标准也需要产生任务 /// - public class TrialCriterionSignTrigger : IBeforeSaveTrigger + public class TrialCriterionSignTrigger( + IVisitTaskHelpeService _visitTaskHelpeService) : IBeforeSaveTrigger { - private readonly IVisitTaskHelpeService _visitTaskHelpeService; - - - public TrialCriterionSignTrigger( - - IVisitTaskHelpeService visitTaskHelpeService) - { - - - _visitTaskHelpeService = visitTaskHelpeService; - } + public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) { diff --git a/IRaCIS.Core.Application/Triggers/UserLogTrigger.cs b/IRaCIS.Core.Application/Triggers/UserLogTrigger.cs index eb94e0e15..1ae92ddff 100644 --- a/IRaCIS.Core.Application/Triggers/UserLogTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/UserLogTrigger.cs @@ -10,16 +10,10 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Triggers { - public class UserLogTrigger : IBeforeSaveTrigger + public class UserLogTrigger( + ISearcher _searcher) : IBeforeSaveTrigger { - public ISearcher _searcher; - - public ILogger _logger; - public UserLogTrigger(ISearcher searcher,ILogger logger) - { - _searcher = searcher; - _logger= logger; - } + //国家|区域|省份|城市|ISP 缺省的地域信息默认是0 //0|0|0|内网IP|内网IP diff --git a/IRaCIS.Core.Application/Triggers/VisitTaskIbeforeTrigger.cs b/IRaCIS.Core.Application/Triggers/VisitTaskIbeforeTrigger.cs index 9c7eec7ab..d10cdd576 100644 --- a/IRaCIS.Core.Application/Triggers/VisitTaskIbeforeTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/VisitTaskIbeforeTrigger.cs @@ -11,20 +11,12 @@ using System.Linq.Expressions; namespace IRaCIS.Core.Application.Triggers { - public class VisitTaskIbeforeTrigger : IBeforeSaveTrigger, IAfterSaveTrigger + public class VisitTaskIbeforeTrigger( + IRepository _visitTaskRepository, + IRepository _readingJudgeInfoRepository) : IBeforeSaveTrigger, IAfterSaveTrigger { - private readonly IRepository _visitTaskRepository; - private readonly IRepository _readingJudgeInfoRepository; - - public VisitTaskIbeforeTrigger( - - IRepository visitTaskRepository, IRepository readingJudgeInfoRepository) - { - - _visitTaskRepository = visitTaskRepository; - _readingJudgeInfoRepository = readingJudgeInfoRepository; - } + /// /// 因为维护状态先后顺序导致 裁判任务关联的 任务上的JudgeVisitTaskId==nulll 在这里需要重新设置下 diff --git a/IRaCIS.Core.Application/Triggers/VisitTaskIsFrontTaskNeedSignButNotSignTrigger.cs b/IRaCIS.Core.Application/Triggers/VisitTaskIsFrontTaskNeedSignButNotSignTrigger.cs index efac2b1a1..cda03515b 100644 --- a/IRaCIS.Core.Application/Triggers/VisitTaskIsFrontTaskNeedSignButNotSignTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/VisitTaskIsFrontTaskNeedSignButNotSignTrigger.cs @@ -12,35 +12,12 @@ namespace IRaCIS.Core.Application.Triggers /// /// 维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果 /// - public class VisitTaskIsFrontTaskNeedSignButNotSignTrigger : IAfterSaveTrigger + public class VisitTaskIsFrontTaskNeedSignButNotSignTrigger( + IRepository _visitTaskRepository, + IRepository _trialReadingCriterionRepository) : IAfterSaveTrigger { - private readonly IRepository _visitTaskRepository; - private readonly IRepository _trialReadingCriterionRepository; - - private readonly IRepository _trialReadingQuestionRepository; - - private readonly IRepository _readingTaskQuestionAnswerRepository; - - private readonly IRepository _subjectAdditionalEvaluationResultRepository; - private readonly IRepository _readingJudgeInfoRepository; - - - public VisitTaskIsFrontTaskNeedSignButNotSignTrigger( - - IRepository visitTaskRepository, IRepository trialReadingCriterionRepository, IRepository trialReadingQuestionRepository - , IRepository readingTaskQuestionAnswerRepository, IRepository subjectAdditionalEvaluationResultRepository, IRepository readingJudgeInfoRepository) - { - _trialReadingCriterionRepository = trialReadingCriterionRepository; - - _visitTaskRepository = visitTaskRepository; - _trialReadingQuestionRepository = trialReadingQuestionRepository; - - _readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository; - _subjectAdditionalEvaluationResultRepository = subjectAdditionalEvaluationResultRepository; - _readingJudgeInfoRepository = readingJudgeInfoRepository; - } - + //添加任务的时候 如果需要签名 并且已经签名了 那么要维护该标准 该Subject IsFrontTaskNeedSignButNotSign字段 public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) diff --git a/IRaCIS.Core.Domain/Image/DicomInstance.cs b/IRaCIS.Core.Domain/Image/DicomInstance.cs index 758ff13cf..3096a0046 100644 --- a/IRaCIS.Core.Domain/Image/DicomInstance.cs +++ b/IRaCIS.Core.Domain/Image/DicomInstance.cs @@ -53,5 +53,7 @@ namespace IRaCIS.Core.Domain.Models public string HtmlPath { get; set; }=string.Empty; + public long? FileSize { get; set; } + } } diff --git a/IRaCIS.Core.Domain/Image/DicomStudy.cs b/IRaCIS.Core.Domain/Image/DicomStudy.cs index b17d275b1..ede2cf307 100644 --- a/IRaCIS.Core.Domain/Image/DicomStudy.cs +++ b/IRaCIS.Core.Domain/Image/DicomStudy.cs @@ -93,6 +93,8 @@ namespace IRaCIS.Core.Domain.Models public bool IsFromPACS { get; set; } + + } } diff --git a/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs b/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs index dc83b79f4..29d084dbe 100644 --- a/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs +++ b/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs @@ -61,7 +61,7 @@ namespace IRaCIS.Core.Domain.Models public int FailedFileCount { get; set; } - public decimal FileSize { get; set; } + public long FileSize { get; set; } public string IP { get; set; } diff --git a/IRaCIS.Core.Domain/QC/NoneDicom/NoneDicomStudy.cs b/IRaCIS.Core.Domain/Image/NoneDicomStudy.cs similarity index 100% rename from IRaCIS.Core.Domain/QC/NoneDicom/NoneDicomStudy.cs rename to IRaCIS.Core.Domain/Image/NoneDicomStudy.cs diff --git a/IRaCIS.Core.Domain/QC/NoneDicom/NoneDicomStudyFile.cs b/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs similarity index 95% rename from IRaCIS.Core.Domain/QC/NoneDicom/NoneDicomStudyFile.cs rename to IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs index 138bf1427..199aad976 100644 --- a/IRaCIS.Core.Domain/QC/NoneDicom/NoneDicomStudyFile.cs +++ b/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs @@ -31,6 +31,8 @@ namespace IRaCIS.Core.Domain.Models public string FileType { get; set; } + public decimal? FileSize { get; set; } + } } diff --git a/IRaCIS.Core.Domain/Image/SCPInstance.cs b/IRaCIS.Core.Domain/Image/SCPInstance.cs index 115656f04..844283149 100644 --- a/IRaCIS.Core.Domain/Image/SCPInstance.cs +++ b/IRaCIS.Core.Domain/Image/SCPInstance.cs @@ -46,6 +46,8 @@ namespace IRaCIS.Core.Domain.Models public bool Anonymize { get; set; } public string Path { get; set; } = string.Empty; + public long? FileSize { get; set; } + } diff --git a/IRaCIS.Core.Domain/Image/TaskInstance.cs b/IRaCIS.Core.Domain/Image/TaskInstance.cs index ea1035483..7276c500b 100644 --- a/IRaCIS.Core.Domain/Image/TaskInstance.cs +++ b/IRaCIS.Core.Domain/Image/TaskInstance.cs @@ -52,5 +52,7 @@ namespace IRaCIS.Core.Domain.Models public string HtmlPath { get; set; }=string.Empty; + public long? FileSize { get; set; } + } } diff --git a/IRaCIS.Core.Infra.EFCore/Repository/IRepository.cs b/IRaCIS.Core.Infra.EFCore/Repository/IRepository.cs index 616d242ca..0d30571c0 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/IRepository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/IRepository.cs @@ -17,7 +17,7 @@ using Microsoft.Extensions.Localization; namespace IRaCIS.Core.Infra.EFCore { - #region 泛型通用版本 + #region 泛型通用版本 非必要 禁止使用!!! public interface IRepository @@ -68,9 +68,9 @@ namespace IRaCIS.Core.Infra.EFCore Task DeleteAsync(T entity, bool autoSave = false) where T : Entity; - Task BatchDeleteAsync(Expression> deleteFilter) where T : Entity; + Task BatchDeleteNoTrackingAsync(Expression> deleteFilter) where T : Entity; - Task BatchUpdateAsync(Expression> where, Expression> updateFactory) where T : Entity; + Task BatchUpdateNoTrackingAsync(Expression> where, Expression> updateFactory) where T : Entity; Task UpdatePartialFromQueryAsync(Expression> updateFilter, Expression> updateFactory, @@ -407,12 +407,12 @@ namespace IRaCIS.Core.Infra.EFCore #endregion - public async Task BatchDeleteAsync(Expression> deleteFilter) where T : Entity + public async Task BatchDeleteNoTrackingAsync(Expression> deleteFilter) where T : Entity { return await _dbContext.BatchDeleteNoTrackingAsync(deleteFilter); } - public async Task BatchUpdateAsync(Expression> whereFilter, Expression> updateFactory) where T : Entity + public async Task BatchUpdateNoTrackingAsync(Expression> whereFilter, Expression> updateFactory) where T : Entity { return await _dbContext.BatchUpdateNoTrackingAsync(whereFilter, updateFactory, _userInfo.Id); diff --git a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs index d8daf48a1..af822f27b 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs @@ -44,7 +44,6 @@ namespace IRaCIS.Core.Infra.EFCore _dbContext = dbContext; _mapper = mapper; _userInfo = userInfo; - } @@ -381,7 +380,7 @@ namespace IRaCIS.Core.Infra.EFCore - #region 保存 、忽略 、验证 + #region 保存 、忽略 、验证 public async Task InsertOrUpdateAsync(TFrom from, bool autoSave = false, params EntityVerifyExp[] verify) { var entity = _mapper.Map(from); diff --git a/IRaCIS.Core.Infrastructure/Extention/ExportExcelDateConverter.cs b/IRaCIS.Core.Infrastructure/Extention/ExportExcelDateConverter.cs index 1eab8021d..e24903407 100644 --- a/IRaCIS.Core.Infrastructure/Extention/ExportExcelDateConverter.cs +++ b/IRaCIS.Core.Infrastructure/Extention/ExportExcelDateConverter.cs @@ -2,6 +2,8 @@ using Newtonsoft.Json; using System; using SharpCompress.Writers; +using IRaCIS.Core.Domain.Share; +using System.Globalization; namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson { @@ -77,6 +79,37 @@ namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson return deserializedObj!; } + + public static string DateTimeInternationalToString(DateTime? dateTime, string? clientZoneId=null) + { + var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; + + if (dateTime.HasValue) + { + + var needDealTime = dateTime.Value; + + if (!string.IsNullOrWhiteSpace(clientZoneId)) + { + needDealTime = TimeZoneInfo.ConvertTime(needDealTime, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById(clientZoneId)); + } + + if (isEn_US) + { + //暂时保持一致,等需求确认,修改英文要展示的日期格式 + return needDealTime.ToString("yyyy-MM-dd HH:mm:ss"); + } + else + { + return needDealTime.ToString("yyyy-MM-dd HH:mm:ss"); + } + } + else + { + return string.Empty; + } + + } } } diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/IQueryablePageListExtensions.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/IQueryablePageListExtensions.cs index 5fdbf8e2c..f423446c4 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/IQueryablePageListExtensions.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/IQueryablePageListExtensions.cs @@ -140,6 +140,10 @@ namespace IRaCIS.Core.Infrastructure.Extention { propName = sortField; } + else + { + propName= pageInput.SortField; + } source = string.IsNullOrWhiteSpace(propName) ? source : (pageInput.Asc ? source.OrderBy(propName) : source.OrderBy(propName + " desc"));