diff --git a/IRC.Core.SCP/appsettings.Prod_IRC_SCP.json b/IRC.Core.SCP/appsettings.Prod_IRC_SCP.json index 279ba1efe..44af0926a 100644 --- a/IRC.Core.SCP/appsettings.Prod_IRC_SCP.json +++ b/IRC.Core.SCP/appsettings.Prod_IRC_SCP.json @@ -19,7 +19,6 @@ "viewEndpoint": "https://zy-irc-cache.oss-cn-shanghai.aliyuncs.com", "region": "oss-cn-shanghai" }, - "MinIO": { "endpoint": "http://192.168.3.68", "port": "8001", @@ -35,9 +34,6 @@ "Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true" }, - - - "DicomSCPServiceConfig": { "CalledAEList": [ "STORESCP" diff --git a/IRaCIS.Core.API/Controllers/ExtraController.cs b/IRaCIS.Core.API/Controllers/ExtraController.cs index b6cc9483a..e62d2df39 100644 --- a/IRaCIS.Core.API/Controllers/ExtraController.cs +++ b/IRaCIS.Core.API/Controllers/ExtraController.cs @@ -23,9 +23,6 @@ using System.Linq; using Microsoft.Extensions.Logging; using MassTransit; using Microsoft.AspNetCore.Hosting; -using Aliyun.Acs.Core.Profile; -using Aliyun.Acs.Core.Auth.Sts; -using Aliyun.Acs.Core; using IRaCIS.Core.Application.Helper; using Microsoft.Extensions.Options; using IRaCIS.Core.Application.Contracts; @@ -35,6 +32,8 @@ using AutoMapper.QueryableExtensions; using NetTopologySuite.Algorithm; using ZiggyCreatures.Caching.Fusion; using AlibabaCloud.SDK.Sts20150401; +using AlibabaCloud.SDK.Sts20150401.Models; +using Org.BouncyCastle.Tls; namespace IRaCIS.Api.Controllers { @@ -327,15 +326,15 @@ namespace IRaCIS.Api.Controllers var tempToken = new AliyunOSSTempToken() { - AccessKeyId = credentials.AccessKeyId, - AccessKeySecret = credentials.AccessKeySecret, - Expiration = credentials.Expiration, - SecurityToken = credentials.SecurityToken, + accessKeyId = credentials.AccessKeyId, + accessKeySecret = credentials.AccessKeySecret, + expiration = credentials.Expiration, + securityToken = credentials.SecurityToken, - Region = ossOptions.region, - BucketName = ossOptions.bucketName, - ViewEndpoint = ossOptions.viewEndpoint, + region = ossOptions.region, + bucketName = ossOptions.bucketName, + viewEndpoint = ossOptions.viewEndpoint, }; @@ -372,45 +371,48 @@ namespace IRaCIS.Api.Controllers } - - [HttpGet("user/GenerateSTS")] - public IResponseOutput GenerateSTS([FromServices] IOptionsMonitor options) - { - var ossOptions = options.CurrentValue; + #region aliyun-net-sdk-sts 之前 + //[HttpGet("user/GenerateSTS")] + //public IResponseOutput GenerateSTS([FromServices] IOptionsMonitor options) + //{ + // var ossOptions = options.CurrentValue; - IClientProfile profile = DefaultProfile.GetProfile(ossOptions.regionId, ossOptions.accessKeyId, ossOptions.accessKeySecret); - DefaultAcsClient client = new DefaultAcsClient(profile); + // IClientProfile profile = DefaultProfile.GetProfile(ossOptions.regionId, ossOptions.accessKeyId, ossOptions.accessKeySecret); + // DefaultAcsClient client = new DefaultAcsClient(profile); - // 创建一个STS请求 - AssumeRoleRequest request = new AssumeRoleRequest - { - RoleArn = ossOptions.roleArn, // 角色ARN,需要替换为你的角色ARN - RoleSessionName = $"session-name-{NewId.NextGuid()}", // 角色会话名称,可自定义 - DurationSeconds = 900, // 令牌有效期(单位:秒),这里设置为1小时 - }; + // // 创建一个STS请求 + // AssumeRoleRequest request = new AssumeRoleRequest + // { + // RoleArn = ossOptions.roleArn, // 角色ARN,需要替换为你的角色ARN + // RoleSessionName = $"session-name-{NewId.NextGuid()}", // 角色会话名称,可自定义 + // DurationSeconds = 900, // 令牌有效期(单位:秒),这里设置为1小时 + // }; - AssumeRoleResponse response = client.GetAcsResponse(request); + // AssumeRoleResponse response = client.GetAcsResponse(request); - // 返回STS令牌信息给前端 - var stsToken = new - { - AccessKeyId = response.Credentials.AccessKeyId, - AccessKeySecret = response.Credentials.AccessKeySecret, - SecurityToken = response.Credentials.SecurityToken, - Expiration = response.Credentials.Expiration, + // // 返回STS令牌信息给前端 + // var stsToken = new + // { + // AccessKeyId = response.Credentials.AccessKeyId, + // AccessKeySecret = response.Credentials.AccessKeySecret, + // SecurityToken = response.Credentials.SecurityToken, + // Expiration = response.Credentials.Expiration, - Region = ossOptions.region, - BucketName = ossOptions.bucketName, - ViewEndpoint = ossOptions.viewEndpoint, + // Region = ossOptions.region, + // BucketName = ossOptions.bucketName, + // ViewEndpoint = ossOptions.viewEndpoint, - }; + // }; + + // return ResponseOutput.Ok(stsToken); + + //} + #endregion - return ResponseOutput.Ok(stsToken); - } diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.csproj b/IRaCIS.Core.API/IRaCIS.Core.API.csproj index 6b067ed71..75a98c8da 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.csproj +++ b/IRaCIS.Core.API/IRaCIS.Core.API.csproj @@ -62,7 +62,6 @@ - @@ -78,7 +77,6 @@ - diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index 47e8140ae..24c372afc 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -281,21 +281,23 @@ Dicom 归档 - + 上传非Dicom 文件 支持压缩包 多文件上传 + - + 一致性核查 excel上传 支持三种格式 + diff --git a/IRaCIS.Core.API/Progranm.cs b/IRaCIS.Core.API/Progranm.cs index 2b2805151..c785221c2 100644 --- a/IRaCIS.Core.API/Progranm.cs +++ b/IRaCIS.Core.API/Progranm.cs @@ -129,7 +129,7 @@ builder.Services.AddDynamicWebApiSetup(); //AutoMapper builder.Services.AddAutoMapperSetup(); //EF ORM QueryWithNoLock -builder.Services.AddEFSetup(_configuration); +builder.Services.AddEFSetup(_configuration,enviromentName); //Http 响应压缩 builder.Services.AddResponseCompressionSetup(); //Swagger Api 文档 diff --git a/IRaCIS.Core.API/Properties/launchSettings.json b/IRaCIS.Core.API/Properties/launchSettings.json index dbe673470..89bfb6def 100644 --- a/IRaCIS.Core.API/Properties/launchSettings.json +++ b/IRaCIS.Core.API/Properties/launchSettings.json @@ -24,6 +24,14 @@ }, "applicationUrl": "http://localhost:6100" }, + "IRaCIS.Test_IRC_PGSQL": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Test_IRC_PGSQL" + }, + "applicationUrl": "http://localhost:6100" + }, "IRaCIS.Event_IRC": { "commandName": "Project", "launchBrowser": true, diff --git a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs index 3713359d6..5d87f976a 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs @@ -18,7 +18,7 @@ namespace IRaCIS.Core.API { public static class EFSetup { - public static void AddEFSetup( this IServiceCollection services, IConfiguration configuration) + public static void AddEFSetup( this IServiceCollection services, IConfiguration configuration,string envName) { services.AddHttpContextAccessor(); @@ -38,8 +38,15 @@ namespace IRaCIS.Core.API //public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); }); var logFactory = LoggerFactory.Create(builder => { builder.AddDebug(); }); - options.UseSqlServer(configuration.GetSection("ConnectionStrings:RemoteNew").Value, - contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure()); + if(envName != "Test_IRC_PGSQL") + { + options.UseSqlServer(configuration.GetSection("ConnectionStrings:RemoteNew").Value,contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure()); + } + else + { + options.UseNpgsql(@"Host=106.14.89.110;Port=5432;Username=sa;Password=pgsql_pwd;Database=Test_IRC"); + } + options.UseLoggerFactory(logFactory); diff --git a/IRaCIS.Core.API/appsettings.Test_IRC_PGSQL.json b/IRaCIS.Core.API/appsettings.Test_IRC_PGSQL.json new file mode 100644 index 000000000..938cbb330 --- /dev/null +++ b/IRaCIS.Core.API/appsettings.Test_IRC_PGSQL.json @@ -0,0 +1,94 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "ConnectionStrings": { + "RemoteNew": "Server=106.14.89.110,1435;Database=Test_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true", + "Hangfire": "Server=106.14.89.110,1435;Database=Test_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true" + }, + + "ObjectStoreService": { + + "ObjectStoreUse": "AliyunOSS", + + "AliyunOSS": { + "regionId": "cn-shanghai", + "internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com", + "endPoint": "https://oss-cn-shanghai.aliyuncs.com", + "accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ", + "accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio", + "bucketName": "zy-irc-test-store", + "roleArn": "acs:ram::1899121822495495:role/oss-upload", + "viewEndpoint": "https://zy-irc-test-store.oss-cn-shanghai.aliyuncs.com", + "region": "oss-cn-shanghai" + }, + "MinIO": { + "endPoint": "hir-oss.test.extimaging.com", + "port": "443", + "useSSL": true, + "accessKey": "fbStsVYCIPKHQneeqMwD", + "secretKey": "TzgvyA3zGXMUnpilJNUlyMYHfosl1hBMl6lxPmjy", + "bucketName": "irc-test", + "viewEndpoint": "https://hir-oss.test.extimaging.com/irc-test" + }, + "AWS": { + "endPoint": "s3.us-east-1.amazonaws.com", + "useSSL": true, + "accessKey": "AKIAZQ3DRSOHFPJJ6FEU", + "secretKey": "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", + "bucketName": "ei-irc-test-store", + "viewEndpoint": "https://ei-irc-test-store.s3.amazonaws.com/" + } + }, + + "BasicSystemConfig": { + + "OpenUserComplexPassword": false, + + "OpenSignDocumentBeforeWork": false, + + "OpenTrialRelationDelete": true, + + "OpenLoginLimit": false, + + "LoginMaxFailCount": 5, + + "LoginFailLockMinutes": 1, + + "AutoLoginOutMinutes": 1, + + "OpenLoginMFA": false, + + "ContinuousReadingTimeMin": 120, + + "ReadingRestTimeMin": 10, + "IsNeedChangePassWord": true, + + "ChangePassWordDays": 90 + }, + + "SystemEmailSendConfig": { + "Port": 465, + "Host": "smtp.qiye.aliyun.com", + "FromEmail": "test@extimaging.com", + "FromName": "Test_IRC", + "AuthorizationCode": "SHzyyl2021", + "SiteUrl": "http://irc.test.extimaging.com/login", + + "OrganizationName": "Extlmaging", + "OrganizationNameCN": "Extlmaging", + "CompanyName": "Extensive Imaging", + "CompanyNameCN": "上海展影医疗科技有限公司", + "CompanyShortName": "Extensive Imaging", + "CompanyShortNameCN": "展影医疗" + }, + + "SystemPacsConfig": { + "Port": "11113", + "IP": "106.14.89.110" + } +} diff --git a/IRaCIS.Core.Application/Helper/OSSService.cs b/IRaCIS.Core.Application/Helper/OSSService.cs index 4703f78af..05f9fa19e 100644 --- a/IRaCIS.Core.Application/Helper/OSSService.cs +++ b/IRaCIS.Core.Application/Helper/OSSService.cs @@ -82,14 +82,14 @@ namespace IRaCIS.Core.Application.Helper public class AliyunOSSTempToken { - public string AccessKeyId { get; set; } - public string AccessKeySecret { get; set; } - public string SecurityToken { get; set; } - public string Expiration { get; set; } + public string accessKeyId { get; set; } + public string accessKeySecret { get; set; } + public string securityToken { get; set; } + public string expiration { get; set; } - public string Region { get; set; } - public string BucketName { get; set; } - public string ViewEndpoint { get; set; } + public string region { get; set; } + public string bucketName { get; set; } + public string viewEndpoint { get; set; } } diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index e0b261fcb..d217141d5 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -90,7 +90,7 @@ 分配规则 - + 分配规则 @@ -121,7 +121,7 @@ 一致性分析配置表 - + 一致性分析配置表 @@ -211,7 +211,7 @@ 医学审核生成规则 废弃 - + 医学审核生成规则 废弃 @@ -311,7 +311,7 @@ 访视读片任务 - + 访视读片任务 @@ -847,7 +847,7 @@ TrialEmailNoticeConfigService - + TrialEmailNoticeConfigService @@ -1228,7 +1228,7 @@ FrontAuditConfigService - + FrontAuditConfigService @@ -1397,7 +1397,7 @@ UserFeedBackService - + UserFeedBackService @@ -1409,11 +1409,11 @@ - + 验证CRC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人 - + @@ -3809,7 +3809,7 @@ SubjectCriteriaEvaluationService - + SubjectCriteriaEvaluationService @@ -10021,7 +10021,7 @@ 项目外部人员 录入流程相关 - + 项目外部人员 录入流程相关 @@ -11445,7 +11445,7 @@ UserTypeRoleService - + UserTypeRoleService @@ -11749,7 +11749,7 @@ NoneDicomStudyService - + NoneDicomStudyService @@ -11794,7 +11794,7 @@ 项目QC 问题 管理 - + 项目QC 问题 管理 @@ -11870,7 +11870,7 @@ TrialSiteSurveyService - + TrialSiteSurveyService @@ -11962,7 +11962,7 @@ TrialSiteUserSurveyService - + TrialSiteUserSurveyService @@ -12483,7 +12483,7 @@ SystemDocumentService - + SystemDocumentService @@ -12506,7 +12506,7 @@ TrialDocumentService - + TrialDocumentService @@ -12855,7 +12855,7 @@ - + 获取一致性核查文件上传记录 @@ -13451,21 +13451,41 @@ 添加访视计划 要给改项目下的所有Subject 添加该访视 + + + 添加访视计划 要给改项目下的所有Subject 添加该访视 + + + + + + + 处理 访视 末次评估 会影响Subject 状态 + + + 处理 访视 末次评估 会影响Subject 状态 + + 处理 访视 末次评估 会影响Subject 状态 + + + 处理 访视 末次评估 会影响Subject 状态 + + 处理生成阅片期 以及后续访视状态 @@ -13478,6 +13498,11 @@ 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期 + + + 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期 + + 处理提交状态 @@ -13489,6 +13514,11 @@ 因为可能先一致性核查通过,生成其他标准的任务了,新签名的标准也需要产生任务 + + + 因为可能先一致性核查通过,生成其他标准的任务了,新签名的标准也需要产生任务 + + 因为维护状态先后顺序导致 裁判任务关联的 任务上的JudgeVisitTaskId==nulll 在这里需要重新设置下 @@ -13515,6 +13545,11 @@ 维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果 + + + 维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果 + + 统一返回前端数据包装,之前在控制器包装,现在修改为动态Api 在ResultFilter这里包装,减少重复冗余代码 @@ -14231,7 +14266,7 @@ 临床数据配置 - + 临床数据配置 @@ -15245,7 +15280,7 @@ 生成的阅片模块(在大列表上展示的) 阅片期 - + 生成的阅片模块(在大列表上展示的) 阅片期 @@ -15580,11 +15615,14 @@ - + 清理一致性分析任务 + + + @@ -15593,7 +15631,7 @@ - + 维护OSS 影像数据 diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs index 6f3910b2d..0032537e4 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs @@ -22,7 +22,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO public string TaskName { get; set; } public bool IsImageFilter { get; set; } - public string CriterionModalitys { get; set; } + public string CriterionModalitys { get; set; } public Guid? SourceSubjectVisitId { get; set; } public PackState PackState { get; set; } @@ -33,7 +33,40 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO } - public class StudyBasicInfo + + + + public class StudyBasicInfo : DicomStudyBasicInfo + { + + public List SopInstanceUidList { get; set; } + } + + + public class SubjectCRCImageUploadedDto + { + public Guid VisitTaskId { get; set; } + + public Guid SubjectId { get; set; } + + public string SubjectCode { get; set; } + + public string TaskBlindName { get; set; } + + public string TaskName { get; set; } + + public bool IsImageFilter { get; set; } + public string CriterionModalitys { get; set; } + + public Guid? SourceSubjectVisitId { get; set; } + + public List DicomStudyList { get; set; } + + public List NoneDicomStudyList { get; set; } + } + + + public class DicomStudyBasicInfo { public Guid Id { get; set; } public string StudyInstanceUid { get; set; } @@ -54,8 +87,26 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO public string Description { get; set; } public int SeriesCount { get; set; } public int InstanceCount { get; set; } + } - public List SopInstanceUidList { get; set; } + public class NoneDicomStudyBasicInfo + { + public Guid Id { get; set; } + + public string StudyCode { get; set; } = string.Empty; + + public int FileCount { get; set; } + + public string BodyPart { get; set; } + + public string Modality { get; set; } + + public DateTime ImageDate { get; set; } + + public string Description { get; set; } = string.Empty; + + + } } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index 2a2f45b16..dbb274b34 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -377,7 +377,32 @@ namespace IRaCIS.Core.Application.Contracts public class IRReadingDownloadQuery { [NotDefault] - public Guid VisitTaskId { get; set; } + public Guid SubjectId { get; set; } + + [NotDefault] + public Guid TrialReadingCriterionId { get; set; } + + [NotDefault] + public string SubjectCode { get; set; } + } + + + public class IRDownloadQuery + { + [NotDefault] + public Guid SubjectId { get; set; } + + [NotDefault] + public Guid TrialReadingCriterionId { get; set; } + + [NotDefault] + public string SubjectCode { get; set; } + + public List SubjectVisitIdList { get; set; } + + public List DicomStudyIdList { get; set; } + + public List NoneDicomStudyIdList { get; set; } } } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index 6ddf4bbf1..3c3f7127c 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -914,8 +914,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc SubjectCode = sv.Subject.Code, VisitName = sv.VisitName, - StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id):false) - + StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false) + .Select(u => new { u.PatientId, @@ -935,8 +935,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc }).ToList(), - NoneDicomStudyList = sv.NoneDicomStudyList.Where( t => isQueryNoneDicom?inQuery.NoneDicomStudyIdList.Contains(t.Id):false) - + NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false) + .Select(nd => new { nd.Modality, @@ -952,44 +952,53 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc }).ToList() }; - var result = query.ToList(); + var result = query.FirstOrDefault(); return ResponseOutput.Ok(result); } /// - /// IR 阅片页面获取下载检查的信息 会根据标准进行过滤检查,(后端要考虑到一致性分析 subjectCode的问题) + /// IR 阅片页面 和IR 任务列表页面下载 勾选下载列表(后端要考虑到一致性分析 subjectCode的问题) /// /// /// - [HttpPost] - public async Task GetIRReadingDownloadStudyInfo(IRReadingDownloadQuery inQuery) + public async Task> GetSubjectImageDownloadSelectList(IRReadingDownloadQuery inQuery) { - var taskInfo = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId) - .Select(t => new - { - t.BlindSubjectCode, - t.IsAnalysisCreate, - t.SourceSubjectVisitId, - t.TrialReadingCriterion.IsImageFilter, - t.TrialReadingCriterion.CriterionModalitys - }) - .FirstNotNullAsync(); - if (taskInfo.SourceSubjectVisitId == null) - { - return ResponseOutput.NotOk("请开发核实传递的参数,该查询任务关联访视Id没有值"); - } + var query = _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId + && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect) + .ProjectTo(_mapper.ConfigurationProvider); - var query = from sv in _subjectVisitRepository.Where(t => t.Id == taskInfo.SourceSubjectVisitId) + + var list = await query.Where(t=>t.SubjectCode==inQuery.SubjectCode).ToListAsync(); + return list; + + } + + /// + /// IR 阅片页面获取下载检查的信息 会根据标准进行过滤检查,(后端要考虑到一致性分析 subjectCode的问题) + /// + /// + /// + /// + [HttpPost] + public async Task GetIRReadingDownloadStudyInfo(IRDownloadQuery inQuery, [FromServices] IRepository _subjectRepository) + { + var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId) + .Select(t => new { t.IsImageFilter, t.CriterionModalitys }).FirstNotNullAsync(); + + var isQueryDicom = inQuery.DicomStudyIdList.Count > 0; + var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0; + + var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t=>inQuery.SubjectVisitIdList.Contains(t.Id))) select new { SubjectCode = sv.Subject.Code, VisitName = sv.VisitName, - StudyList = sv.StudyList.AsQueryable().WhereIf(taskInfo.IsImageFilter, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|")) + StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false) .Select(u => new { u.PatientId, @@ -1008,7 +1017,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc }), - NoneDicomStudyList = sv.NoneDicomStudyList.AsQueryable().WhereIf(taskInfo.IsImageFilter, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.Modality + "|")) + NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false) .Select(nd => new { nd.Modality, @@ -1024,7 +1033,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc }) }; - return ResponseOutput.Ok(); + + + var result = await query.FirstOrDefaultAsync(); + + return ResponseOutput.Ok(result); } } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs index 8e41acc53..372bc020c 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs @@ -3,6 +3,7 @@ using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts.Dicom.DTO; using IRaCIS.Core.Application.Contracts.DTO; +using IRaCIS.Core.Application.Service.ImageAndDoc.DTO; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Models; @@ -60,17 +61,17 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.StudyTime, t => t.MapFrom(u => u.DicomStudy.StudyTime)) .ForMember(o => o.StudyCode, t => t.MapFrom(u => u.DicomStudy.StudyCode)) - //.ForMember(o => o.InstanceList, t => t.MapFrom(u => u.DicomInstanceList.Select(t=>t.Id).ToArray())) - // .ForMember(o => o.InstancePathList, t => t.MapFrom(u => u.DicomInstanceList.OrderBy(t=>t.InstanceNumber).Select(t => t.Path))) + //.ForMember(o => o.InstanceList, t => t.MapFrom(u => u.DicomInstanceList.Select(t=>t.Id).ToArray())) + // .ForMember(o => o.InstancePathList, t => t.MapFrom(u => u.DicomInstanceList.OrderBy(t=>t.InstanceNumber).Select(t => t.Path))) ; CreateMap() - .ForMember(o => o.IsCompleteClinicalData, t => t.MapFrom(u => !u.ReadingClinicalDataList.Any(x=>x.ReadingClinicalDataPDFList.Count()==0))) - .ForMember(o => o.UploadedTime, t => t.MapFrom(u => u.CreateTime)) + .ForMember(o => o.IsCompleteClinicalData, t => t.MapFrom(u => !u.ReadingClinicalDataList.Any(x => x.ReadingClinicalDataPDFList.Count() == 0))) + .ForMember(o => o.UploadedTime, t => t.MapFrom(u => u.CreateTime)) .ForMember(o => o.Uploader, t => t.MapFrom(u => u.Uploader.LastName + " / " + u.Uploader.FirstName)) .ForMember(o => o.StudyId, t => t.MapFrom(u => u.Id)) - .ForMember(o => o.IsHaveUploadFailed, t => t.MapFrom(u => u.DicomStudyMonitorList.Any(t=>t.FailedFileCount>0))) - .ForMember(o => o.Modalities, t => t.MapFrom(u => string.Join('、', u.SeriesList.Select(t => t.Modality).Distinct()) )); + .ForMember(o => o.IsHaveUploadFailed, t => t.MapFrom(u => u.DicomStudyMonitorList.Any(t => t.FailedFileCount > 0))) + .ForMember(o => o.Modalities, t => t.MapFrom(u => string.Join('、', u.SeriesList.Select(t => t.Modality).Distinct()))); @@ -124,10 +125,19 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.VisitNum, u => u.MapFrom(s => s.SubjectVisit.VisitNum)) .ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName)); - + CreateMap(); + CreateMap(); + CreateMap() + .ForMember(d => d.VisitTaskId, u => u.MapFrom(s => s.Id)) + .ForMember(d => d.IsImageFilter, u => u.MapFrom(s => s.TrialReadingCriterion.IsImageFilter)) + .ForMember(d => d.CriterionModalitys, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionModalitys)) + .ForMember(d => d.SubjectCode, u => u.MapFrom(u => u.IsSelfAnalysis == true ? u.BlindSubjectCode : u.Subject.Code)) + .ForMember(d => d.DicomStudyList, u => u.MapFrom(s => s.SourceSubjectVisit.StudyList)) + .ForMember(d => d.NoneDicomStudyList, u => u.MapFrom(s => s.SourceSubjectVisit.NoneDicomStudyList)) + ; } } - + } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index cea1ddb9d..4e27834da 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -311,7 +311,11 @@ namespace IRaCIS.Core.Application.Contracts get { if (!ClosedTime.HasValue) - return ""; + { + var now = DateTime.Now; + return string.Format("{0}d {1}h {2}m", (now - CreateTime)?.Days, (now - CreateTime)?.Hours, (now - CreateTime)?.Minutes); + + } else return string.Format("{0}d {1}h {2}m", (ClosedTime - CreateTime)?.Days, (ClosedTime - CreateTime)?.Hours, (ClosedTime - CreateTime)?.Minutes); } } @@ -321,7 +325,7 @@ namespace IRaCIS.Core.Application.Contracts public QCChanllengeReuploadEnum ReuploadEnum { get; set; } public List DialogList { 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 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; } diff --git a/IRaCIS.Core.Domain/Image/NoneDicomStudy.cs b/IRaCIS.Core.Domain/Image/NoneDicomStudy.cs index 61b17b548..900b2f720 100644 --- a/IRaCIS.Core.Domain/Image/NoneDicomStudy.cs +++ b/IRaCIS.Core.Domain/Image/NoneDicomStudy.cs @@ -18,6 +18,10 @@ namespace IRaCIS.Core.Domain.Models #region 导航属性 [JsonIgnore] public List NoneDicomFileList { get; set; } + + [JsonIgnore] + public List TaskNoneDicomFileList { get; set; } + [JsonIgnore] public SubjectVisit SubjectVisit { get; set; } [JsonIgnore] diff --git a/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs b/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs index ecd0a58d1..c7c286986 100644 --- a/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs +++ b/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs @@ -8,9 +8,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace IRaCIS.Core.Domain.Models { - /// - ///NoneDicomStudyFile - /// + [Table("NoneDicomStudyFile")] public class NoneDicomStudyFile : BaseAddAuditEntity { @@ -23,9 +21,9 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] public VisitTask VisitTask { get; set; } - //[ForeignKey("OriginNoneDicomStudyId")] - //[JsonIgnore] - //public NoneDicomStudy OriginNoneDicomStudy { get; set; } + [ForeignKey("OriginNoneDicomStudyId")] + [JsonIgnore] + public NoneDicomStudy OriginNoneDicomStudy { get; set; } #endregion diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index 15414fe37..931eb9a6e 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -72,6 +72,8 @@ namespace IRaCIS.Core.Infra.EFCore builder.HasNoKey(); }); + modelBuilder.Entity().HasMany(t => t.NoneDicomFileList).WithOne(s => s.NoneDicomStudy).HasForeignKey(t => t.NoneDicomStudyId); + modelBuilder.Entity().HasMany(t => t.TaskNoneDicomFileList).WithOne(s => s.OriginNoneDicomStudy).HasForeignKey(t => t.OriginNoneDicomStudyId); modelBuilder.Entity().HasQueryFilter(p => p.IsAdditional == false);