Compare commits
262 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f77c1f0256 | |||
| 9775d3b93f | |||
| 4fb431f3bd | |||
| e66edbf2c7 | |||
| 8828de9456 | |||
| 484ad67152 | |||
| 97e8ec44cb | |||
| 3454e330f5 | |||
| e91af9cea4 | |||
| 8e1d2855c6 | |||
| 0e01bd167e | |||
| ec4952766e | |||
| e976de18e0 | |||
| 81f5b47918 | |||
| 5e7ddc07db | |||
| 11a8e6e565 | |||
| b9f78c5f0b | |||
| af4aec6a69 | |||
| f8c3064b07 | |||
| d3c0e5979a | |||
| 43a720e09e | |||
| 8a232be59f | |||
| 01018737fd | |||
| 0c228fab1f | |||
| 0d0e795faf | |||
| 76965111fe | |||
| 67d2067a28 | |||
| 4e63395a35 | |||
| 1d85f49a97 | |||
| bcad91dc18 | |||
| d516b8a4dc | |||
| 2d651ca51d | |||
| f9b52f9433 | |||
| f6f3fcf1d3 | |||
| 1d3e324b9a | |||
| 350101091a | |||
| 343360cdbe | |||
| 739c3ad4cb | |||
| ed38a863d4 | |||
| 5d797959e3 | |||
| 3626d2e1bf | |||
| 7b272a0b21 | |||
| cdd0c52182 | |||
| 8b490dd4f9 | |||
| f30494ad30 | |||
| 6e6b456115 | |||
| ebc56e5eb7 | |||
| 2b5fb427df | |||
| 8f62b8cd5f | |||
| de673afb9e | |||
| 8bd4ef169c | |||
| 59ff0f2ad0 | |||
| fd478715f3 | |||
| 8b21f29978 | |||
| 367f698348 | |||
| bda31f2ba7 | |||
| f9d48272ef | |||
| 865412a551 | |||
| c033ef2d28 | |||
| e1ddb5920f | |||
| 4f6225047e | |||
| 107e3ec360 | |||
| 2b766e216c | |||
| 419453a8c5 | |||
| 862128abf0 | |||
| 491b0522ab | |||
| 5d61780b7c | |||
| 6bd3956e2e | |||
| 3a7963d0f9 | |||
| 9cd2c684b5 | |||
| b9a5881333 | |||
| 9bbf81875f | |||
| 09a1d06c8d | |||
| 1e8daafba4 | |||
| a726021ea9 | |||
| 189ed2a22d | |||
| b03397ca87 | |||
| d9bf39acb0 | |||
| 21b68e6bb9 | |||
| aa15145765 | |||
| c6b7902eca | |||
| 72d60bea62 | |||
| 1239b1e542 | |||
| 420e730003 | |||
| 56e682314f | |||
| 8e8fb1cc8c | |||
| cf00e51559 | |||
| 8a9b61185e | |||
| ac406ac6f3 | |||
| 9f43bd5294 | |||
| 7b853c74f3 | |||
| 83bd026c4e | |||
| 3fce40b4c9 | |||
| 75056923dc | |||
| 597d4b7469 | |||
| e7ddec4329 | |||
| 5f1a25c2ec | |||
| 5b8f08f3a3 | |||
| 544ceefef7 | |||
| 33c55db206 | |||
| ce12fa0d22 | |||
| 2f50c17320 | |||
| 83b6fe7cb2 | |||
| 63eeb88066 | |||
| dfeb4204e7 | |||
| 2a8f66f360 | |||
| d34f047418 | |||
| 56331ea150 | |||
| 482d789870 | |||
| 0e6055881a | |||
| f10d1b0a9e | |||
| a2ef29e75d | |||
| 6468a6505b | |||
| 0e1655004a | |||
| 26421f78e2 | |||
| 22d3d542ae | |||
| 714f48deb7 | |||
| dda82466c9 | |||
| 1678f9a021 | |||
| fc9969570d | |||
| 5c760a83d6 | |||
| bed0b41789 | |||
| 4859fd301a | |||
| 957c85d641 | |||
| a1c4c00d1c | |||
| 2cd8e25466 | |||
| d7829c371f | |||
| 36f236f69f | |||
| 80b877879c | |||
| f698d77719 | |||
| bebb76e51a | |||
| af86dd92c5 | |||
| 3ed4d29af3 | |||
| 14f4f66f84 | |||
| d4ffe2eadf | |||
| b0c3ba2a11 | |||
| 0adf7a5c84 | |||
| 2e9a252910 | |||
| ecb4854c78 | |||
| b8ecc5e591 | |||
| 9dc272fd17 | |||
| 763430099b | |||
| 28d28cffd7 | |||
| 78e9d430bd | |||
| 499fa59b92 | |||
| 817164c4f3 | |||
| e0ad618d1a | |||
| 9329ef34e2 | |||
| 2c7444c15b | |||
| a586b267db | |||
| f665b1f623 | |||
| c34425b231 | |||
| 7e47e07747 | |||
| 90e1f87fb4 | |||
| 05a9ef9410 | |||
| c41b6b2eb3 | |||
| c8ce49a383 | |||
| 919a6c7028 | |||
| 8a1a07980d | |||
| 8556f7cdf6 | |||
| 0d82e3e72b | |||
| 8bbdbc6cf5 | |||
| ac10d4ca70 | |||
| 1355688a36 | |||
| 88c8d5e34c | |||
| b54ebcb0d1 | |||
| 3532a8c5c0 | |||
| fe28fd355b | |||
| 9a976022e5 | |||
| 240a577361 | |||
| 3851eb0c29 | |||
| 976f6d8224 | |||
| 1461240f27 | |||
| 0c29fcb9bd | |||
| a754a4fcc6 | |||
| 0e165a196c | |||
| 53d29fe79d | |||
| 2854acf146 | |||
| 73035a4369 | |||
| 1da0435b4e | |||
| 84ccbe3ac0 | |||
| 4a86ae0bfd | |||
| ceb1337cde | |||
| 6013555139 | |||
| 1e533706aa | |||
| 2fe9e88c52 | |||
| 2a0b21c8b1 | |||
| f8a5e753da | |||
| 559b18ff5a | |||
| b95592db96 | |||
| a3c471de38 | |||
| 36576d1936 | |||
| e000b7ea6d | |||
| 74c3b2c180 | |||
| 0b7878b1c6 | |||
| 8cffbd9901 | |||
| d32eae030e | |||
| b991e9950f | |||
| 683abe0035 | |||
| a77eabd379 | |||
| c58913062a | |||
| e736fe6557 | |||
| 43464ee4aa | |||
| 26e246e71a | |||
| 98a9a62b2d | |||
| 5210684c50 | |||
| 7ea2dc7176 | |||
| a8c5bf8e34 | |||
| ff3b0db3ea | |||
| e7917d5ee7 | |||
| 2cd3cdaf38 | |||
| d5639a26d6 | |||
| a13cdae4d2 | |||
| 2d53a9e82c | |||
| 57c860a643 | |||
| 744230d7ec | |||
| 8f4cd8a447 | |||
| 9e2d1289c9 | |||
| d05e5ed2c0 | |||
| 070b99d6ef | |||
| eae1040695 | |||
| 06dde739c3 | |||
| 8875595012 | |||
| 1bb95bd1b5 | |||
| 40599918ba | |||
| 1b4483dfa5 | |||
| e18987f235 | |||
| 817089d81b | |||
| 41883ca5da | |||
| 4d71478d50 | |||
| 43ef5bcdd9 | |||
| 55bd30c24d | |||
| 7447b30892 | |||
| 18d4ee0dfa | |||
| f0be7d2e9e | |||
| a0747230ac | |||
| 1df06fc0ee | |||
| ece6bb6e0a | |||
| 0d5810a8fb | |||
| 2bae90e339 | |||
| 0a994573cd | |||
| e941bd8266 | |||
| b167ec794a | |||
| fb3647fc99 | |||
| fbe94c0f57 | |||
| d87aa2620e | |||
| 83b006c615 | |||
| 9feba1c570 | |||
| 57c4b198f7 | |||
| 127b643e44 | |||
| 2fbd0b09f6 | |||
| 520aa26a11 | |||
| d09dae8378 | |||
| 8689ac9139 | |||
| 212a7ed2b8 | |||
| d9b3e56930 | |||
| 7fae8de733 | |||
| be8af75e61 | |||
| b4cf5cd2a3 | |||
| 7649e60d28 | |||
| 0aa981eea5 | |||
| 122b50e114 |
@@ -296,15 +296,23 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
var startTime = DateTime.Now;
|
||||
|
||||
if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}"))
|
||||
{
|
||||
//---当前已有人正在上传和归档该检查!
|
||||
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress"));
|
||||
}
|
||||
else
|
||||
|
||||
if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}") && _provider.Get<Guid>($"StudyUid_{trialId}_{studyInstanceUid}").Value == _userInfo.Id)
|
||||
{
|
||||
_provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30));
|
||||
}
|
||||
|
||||
|
||||
|
||||
//if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}"))
|
||||
//{
|
||||
// //---当前已有人正在上传和归档该检查!
|
||||
// return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress"));
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// _provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30));
|
||||
//}
|
||||
|
||||
//到了接口,代表上传结束了
|
||||
|
||||
|
||||
@@ -83,12 +83,10 @@ namespace IRaCIS.Core.API
|
||||
if (_configuration.GetSection("BasicSystemConfig").GetValue<bool>("OpenLoginLimit"))
|
||||
{
|
||||
options.Filters.Add<LimitUserRequestAuthorization>();
|
||||
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
.AddNewtonsoftJsonSetup(); // NewtonsoftJson 序列化 处理
|
||||
|
||||
services.AddOptions().Configure<SystemEmailSendConfig>( _configuration.GetSection("SystemEmailSendConfig"));
|
||||
@@ -219,8 +217,8 @@ namespace IRaCIS.Core.API
|
||||
|
||||
app.UseCors(t => t.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
|
||||
|
||||
app.UseIRacisHostStaticFileStore(env);
|
||||
|
||||
//app.UseIRacisHostStaticFileStore(env);
|
||||
app.UseMiddleware<MultiDiskStaticFilesMiddleware>();
|
||||
|
||||
|
||||
app.UseAuthentication();
|
||||
|
||||
+74
-34
@@ -11,6 +11,7 @@ using Microsoft.Extensions.Hosting.Internal;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Microsoft.VisualBasic;
|
||||
using SharpCompress.Common;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
@@ -23,16 +24,14 @@ namespace IRaCIS.Core.API
|
||||
{
|
||||
private readonly RequestDelegate _next;
|
||||
private readonly IWebHostEnvironment _hostingEnv;
|
||||
private readonly StaticFileOptions _options;
|
||||
private readonly ILoggerFactory _loggerFactory;
|
||||
|
||||
private string iRaCISDefaultDataFolder = string.Empty;
|
||||
|
||||
public MultiDiskStaticFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, StaticFileOptions options, ILoggerFactory loggerFactory)
|
||||
public MultiDiskStaticFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, ILoggerFactory loggerFactory)
|
||||
{
|
||||
_next = next;
|
||||
_hostingEnv = hostingEnv;
|
||||
_options = options;
|
||||
_loggerFactory = loggerFactory;
|
||||
|
||||
iRaCISDefaultDataFolder = FileStoreHelper.GetIRaCISRootDataFolder(_hostingEnv);
|
||||
@@ -50,53 +49,101 @@ namespace IRaCIS.Core.API
|
||||
|
||||
var isDicomFile = path.Contains($"{StaticData.Folder.DicomFolder}");
|
||||
|
||||
var defaultFileProvider = new PhysicalFileProvider(iRaCISDefaultDataFolder);
|
||||
var staticFileOptions = new StaticFileOptions
|
||||
{
|
||||
FileProvider = defaultFileProvider,
|
||||
RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
||||
ServeUnknownFileTypes = true,
|
||||
DefaultContentType = "application/octet-stream"
|
||||
};
|
||||
|
||||
var defaultRoot = Path.GetPathRoot(iRaCISDefaultDataFolder);
|
||||
|
||||
//先从默认里面去找
|
||||
if (isIRacisFile)
|
||||
{
|
||||
if (defaultFileProvider.GetFileInfo(context.Request.Path).Exists)
|
||||
|
||||
|
||||
|
||||
#region 方式二
|
||||
|
||||
//var defaultFileProvider = new PhysicalFileProvider(iRaCISDefaultDataFolder);
|
||||
|
||||
//var staticFileOptions = new StaticFileOptions
|
||||
//{
|
||||
// FileProvider = defaultFileProvider,
|
||||
// RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
||||
// ServeUnknownFileTypes = true,
|
||||
// DefaultContentType = "application/octet-stream"
|
||||
//};
|
||||
|
||||
//var a = defaultFileProvider.GetFileInfo(context.Request.Path).Exists;
|
||||
|
||||
//var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(staticFileOptions), _loggerFactory);
|
||||
//await staticFileMiddleware.Invoke(context);
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 文档上传默认会加wwwroot 奇怪...
|
||||
|
||||
var defaultFileProvider = new PhysicalFileProvider(FileStoreHelper.GetIRaCISRootPath(_hostingEnv));
|
||||
|
||||
if (defaultFileProvider.GetFileInfo(path).Exists)
|
||||
{
|
||||
var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(staticFileOptions), _loggerFactory);
|
||||
await staticFileMiddleware.Invoke(context);
|
||||
|
||||
var actrualPath = defaultFileProvider.GetFileInfo(path).PhysicalPath;
|
||||
|
||||
await context.Response.SendFileAsync(new PhysicalFileInfo(new FileInfo(actrualPath)));
|
||||
|
||||
return;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
//没找到
|
||||
//dicom影像,从多个文件夹尝试,因为会存在切换磁盘
|
||||
if (isDicomFile)
|
||||
{
|
||||
var disks = GetDisks().Where(t=>!t.Contains(defaultRoot));
|
||||
var defaultRoot = Path.GetPathRoot(iRaCISDefaultDataFolder);
|
||||
|
||||
//除默认部署路径的其他路径
|
||||
var disks = DriveInfo.GetDrives()
|
||||
.Where(d => d.IsReady && d.DriveType == DriveType.Fixed)/*.Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))*/
|
||||
.OrderBy(d => d.AvailableFreeSpace)
|
||||
.Select(d => d.RootDirectory.FullName)
|
||||
.ToArray().Where(t=>!t.Contains(defaultRoot));
|
||||
|
||||
|
||||
foreach (var item in disks)
|
||||
{
|
||||
var otherFileStoreFolder = Path.Combine(item, _hostingEnv.EnvironmentName);
|
||||
|
||||
if (!Directory.Exists(otherFileStoreFolder))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var otherFileProvider= new PhysicalFileProvider(otherFileStoreFolder);
|
||||
|
||||
var otherStaticFileOptions = new StaticFileOptions
|
||||
{
|
||||
FileProvider = otherFileProvider,
|
||||
RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
||||
ServeUnknownFileTypes = true,
|
||||
DefaultContentType = "application/octet-stream"
|
||||
};
|
||||
|
||||
|
||||
if (otherFileProvider.GetFileInfo(context.Request.Path).Exists)
|
||||
if (otherFileProvider.GetFileInfo(path).Exists)
|
||||
{
|
||||
var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(staticFileOptions), _loggerFactory);
|
||||
await staticFileMiddleware.Invoke(context);
|
||||
|
||||
var actrualPath = otherFileProvider.GetFileInfo(path).PhysicalPath;
|
||||
|
||||
//方式一
|
||||
await context.Response.SendFileAsync( new PhysicalFileInfo(new FileInfo(actrualPath)));
|
||||
|
||||
#region 方式二 报错 otherFileProvider 应该还包含/{StaticData.Folder.IRaCISDataFolder} 这一层级
|
||||
//var otherStaticFileOptions = new StaticFileOptions
|
||||
//{
|
||||
// FileProvider = otherFileProvider,
|
||||
// RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
||||
// ServeUnknownFileTypes = true,
|
||||
// DefaultContentType = "application/octet-stream"
|
||||
//};
|
||||
//var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(otherStaticFileOptions), _loggerFactory);
|
||||
//await staticFileMiddleware.Invoke(context);
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -109,14 +156,7 @@ namespace IRaCIS.Core.API
|
||||
|
||||
|
||||
|
||||
private string[] GetDisks()
|
||||
{
|
||||
// 获取系统中所有可用的磁盘
|
||||
return DriveInfo.GetDrives()
|
||||
.Where(d => d.IsReady && d.DriveType == DriveType.Fixed).Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))
|
||||
.Select(d => d.RootDirectory.FullName)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//private static string GetContentType(string path)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using IRaCIS.Core.Infrastructure.Extention;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Newtonsoft.Json;
|
||||
@@ -12,9 +13,14 @@ namespace IRaCIS.Core.API
|
||||
{
|
||||
public class ApiResponseHandler : AuthenticationHandler<AuthenticationSchemeOptions>
|
||||
{
|
||||
public ApiResponseHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
|
||||
public IStringLocalizer _localizer;
|
||||
public ApiResponseHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
|
||||
IStringLocalizer localizer,
|
||||
ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
|
||||
{
|
||||
}
|
||||
_localizer = localizer;
|
||||
|
||||
}
|
||||
|
||||
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
|
||||
{
|
||||
@@ -24,14 +30,16 @@ namespace IRaCIS.Core.API
|
||||
{
|
||||
Response.ContentType = "application/json";
|
||||
Response.StatusCode = StatusCodes.Status401Unauthorized;
|
||||
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您无权访问该接口", ApiResponseCodeEnum.NoToken)));
|
||||
//---您无权访问该接口
|
||||
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["ApiResponse_NoAccess"], ApiResponseCodeEnum.NoToken)));
|
||||
}
|
||||
|
||||
protected override async Task HandleForbiddenAsync(AuthenticationProperties properties)
|
||||
{
|
||||
Response.ContentType = "application/json";
|
||||
Response.StatusCode = StatusCodes.Status403Forbidden;
|
||||
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您的权限不允许进行该操作",ApiResponseCodeEnum.HaveTokenNotAccess)));
|
||||
//---您的权限不允许进行该操作
|
||||
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["ApiResponse_Permission"],ApiResponseCodeEnum.HaveTokenNotAccess)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -43,8 +43,6 @@ public class LimitUserRequestAuthorization :BaseService, IAsyncAuthorizationFilt
|
||||
{
|
||||
//1、用户登陆的时候,设置缓存
|
||||
|
||||
|
||||
|
||||
//没有从请求中取到token
|
||||
if (string.IsNullOrWhiteSpace(_userInfo.UserToken))
|
||||
{
|
||||
|
||||
@@ -11,6 +11,12 @@ namespace IRaCIS.Core.Application.Filter
|
||||
|
||||
public class ModelActionFilter : ActionFilterAttribute, IActionFilter
|
||||
{
|
||||
public IStringLocalizer _localizer;
|
||||
public ModelActionFilter(IStringLocalizer localizer)
|
||||
{
|
||||
_localizer = localizer;
|
||||
}
|
||||
|
||||
public override void OnActionExecuting(ActionExecutingContext context)
|
||||
{
|
||||
if (!context.ModelState.IsValid)
|
||||
@@ -23,7 +29,7 @@ namespace IRaCIS.Core.Application.Filter
|
||||
.ToArray();
|
||||
|
||||
//---提供给接口的参数无效。
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("Invalid parameters provided for the API." + JsonConvert.SerializeObject( validationErrors)));
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["ModelAction_InvalidAPIParameter"] + JsonConvert.SerializeObject( validationErrors)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using IRaCIS.Core.Infrastructure.Extention;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace IRaCIS.Core.Application.Filter
|
||||
@@ -10,10 +11,13 @@ namespace IRaCIS.Core.Application.Filter
|
||||
{
|
||||
private readonly ILogger<ProjectExceptionFilter> _logger;
|
||||
|
||||
public ProjectExceptionFilter(ILogger<ProjectExceptionFilter> logger)
|
||||
public IStringLocalizer _localizer;
|
||||
|
||||
public ProjectExceptionFilter(IStringLocalizer localizer, ILogger<ProjectExceptionFilter> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
_localizer = localizer;
|
||||
}
|
||||
public void OnException(ExceptionContext context)
|
||||
{
|
||||
//context.ExceptionHandled;//记录当前这个异常是否已经被处理过了
|
||||
@@ -23,7 +27,7 @@ namespace IRaCIS.Core.Application.Filter
|
||||
if (context.Exception.GetType().Name == "DbUpdateConcurrencyException")
|
||||
{
|
||||
//---并发更新,当前不允许该操作
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("Concurrent update, operation not allowed at this time." + context.Exception.Message));
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["ProjectException_ConcurrentUpdateNotAllowed"] + context.Exception.Message));
|
||||
}
|
||||
|
||||
if (context.Exception.GetType() == typeof(BusinessValidationFailedException))
|
||||
@@ -36,7 +40,7 @@ namespace IRaCIS.Core.Application.Filter
|
||||
}
|
||||
else
|
||||
{
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("程序异常,请联系开发人员。" + (context.Exception.InnerException is null ? (context.Exception.Message /*+ context.Exception.StackTrace*/)
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["Project_ExceptionContactDeveloper"] + (context.Exception.InnerException is null ? (context.Exception.Message /*+ context.Exception.StackTrace*/)
|
||||
: (context.Exception.InnerException?.Message /*+ context.Exception.InnerException?.StackTrace*/)), ApiResponseCodeEnum.ProgramException));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
using DocumentFormat.OpenXml.Drawing.Diagrams;
|
||||
using DocumentFormat.OpenXml.Spreadsheet;
|
||||
using DocumentFormat.OpenXml.Wordprocessing;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Magicodes.ExporterAndImporter.Excel;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using MiniExcelLibs;
|
||||
@@ -9,17 +13,22 @@ using MiniExcelLibs.OpenXml;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NPOI.HSSF.UserModel;
|
||||
using NPOI.XSSF.UserModel;
|
||||
using SkiaSharp;
|
||||
using System.IO;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service;
|
||||
|
||||
public static class ExcelExportHelper
|
||||
{
|
||||
//MiniExcel_Export
|
||||
public static async Task<IActionResult> DataExportAsync(string code, object data, string exportFileNamePrefix, IRepository<CommonDocument> _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null)
|
||||
public static async Task<IActionResult> DataExportAsync(string code, ExcelExportInfo data, string exportFileNamePrefix, IRepository<CommonDocument> _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null)
|
||||
{
|
||||
|
||||
//判断是否有字典翻译
|
||||
|
||||
object translateData = data;
|
||||
|
||||
if (_dictionaryService != null && translateType != null)
|
||||
{
|
||||
|
||||
@@ -32,7 +41,7 @@ public static class ExcelExportHelper
|
||||
var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true))
|
||||
.SelectMany(c =>
|
||||
c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false).Select(f => (DictionaryTranslateAttribute?)f).Where(t => t?.CriterionType == criterionType || t?.CriterionType == null)
|
||||
.Select(k => new { c.Name, k.DicParentCode ,k.IsTranslateDenpendOtherProperty, k.DependPropertyName,k.DependPropertyValueStr})
|
||||
.Select(k => new { c.Name, k.DicParentCode, k.IsTranslateDenpendOtherProperty, k.DependPropertyName, k.DependPropertyValueStr })
|
||||
).ToList();
|
||||
|
||||
|
||||
@@ -61,13 +70,13 @@ public static class ExcelExportHelper
|
||||
foreach (var needTranslateProperty in needTranslatePropertyList)
|
||||
{
|
||||
//翻译的属性依赖其他属性
|
||||
if(needTranslateProperty.IsTranslateDenpendOtherProperty)
|
||||
if (needTranslateProperty.IsTranslateDenpendOtherProperty)
|
||||
{
|
||||
if (item[needTranslateProperty.DependPropertyName]?.ToString().ToLower() == needTranslateProperty.DependPropertyValueStr.ToLower())
|
||||
{
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
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;
|
||||
}
|
||||
}
|
||||
//普通翻译 或者某一标准翻译
|
||||
@@ -76,9 +85,9 @@ public static class ExcelExportHelper
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -89,14 +98,15 @@ public static class ExcelExportHelper
|
||||
newObjList.Add(itemDic);
|
||||
}
|
||||
|
||||
dic[key] = newObjList ;
|
||||
dic[key] = newObjList;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
data = dic;
|
||||
//data = dic;
|
||||
|
||||
translateData = dic;
|
||||
|
||||
}
|
||||
|
||||
@@ -110,22 +120,65 @@ public static class ExcelExportHelper
|
||||
//模板路径
|
||||
var tplPath = physicalPath;
|
||||
|
||||
#region 根据中英文 删除模板sheet
|
||||
|
||||
// 打开模板文件
|
||||
var templateFile = new FileStream(tplPath, FileMode.Open, FileAccess.Read);
|
||||
|
||||
// 获取文件流
|
||||
var templateStream = new MemoryStream();
|
||||
templateFile.CopyTo(templateStream);
|
||||
templateStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
var workbook = new XSSFWorkbook(templateStream);
|
||||
|
||||
int sheetCount = workbook.NumberOfSheets;
|
||||
|
||||
if (sheetCount == 2)
|
||||
{
|
||||
if (data.IsEn_US)
|
||||
{
|
||||
workbook.RemoveSheetAt(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
workbook.RemoveSheetAt(1);
|
||||
}
|
||||
|
||||
var memoryStream2 = new MemoryStream();
|
||||
workbook.Write(memoryStream2);
|
||||
|
||||
memoryStream2.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
templateStream = memoryStream2;
|
||||
}
|
||||
|
||||
// 文件名称 从sheet里面取
|
||||
fileNmae = workbook.GetSheetName(0);
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#region MiniExcel
|
||||
|
||||
var memoryStream = new MemoryStream();
|
||||
var memoryStream = new MemoryStream();
|
||||
|
||||
var config = new OpenXmlConfiguration()
|
||||
{
|
||||
IgnoreTemplateParameterMissing = true,
|
||||
};
|
||||
|
||||
await MiniExcel.SaveAsByTemplateAsync(memoryStream, tplPath, data, config);
|
||||
await MiniExcel.SaveAsByTemplateAsync(memoryStream, templateStream.ToArray(), translateData, config);
|
||||
|
||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
|
||||
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||
{
|
||||
FileDownloadName = $"{exportFileNamePrefix}_{fileNmae.Substring(0, fileNmae.LastIndexOf('.'))}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
|
||||
FileDownloadName = $"{exportFileNamePrefix}_{fileNmae/*.Substring(0, fileNmae.LastIndexOf('.'))*/}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
|
||||
};
|
||||
|
||||
#endregion
|
||||
@@ -146,10 +199,12 @@ public static class ExcelExportHelper
|
||||
|
||||
|
||||
|
||||
public static async Task<(MemoryStream,string)> DataExport_NpoiTestAsync(string code, object data, IRepository<CommonDocument> _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null)
|
||||
public static async Task<(MemoryStream, string)> DataExport_NpoiTestAsync(string code, ExcelExportInfo data, IRepository<CommonDocument> _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null)
|
||||
{
|
||||
//判断是否有字典翻译
|
||||
|
||||
object translateData = data;
|
||||
|
||||
if (_dictionaryService != null && translateType != null)
|
||||
{
|
||||
|
||||
@@ -197,7 +252,7 @@ public static class ExcelExportHelper
|
||||
{
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
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;
|
||||
}
|
||||
}
|
||||
//普通翻译 或者某一标准翻译
|
||||
@@ -206,7 +261,7 @@ public static class ExcelExportHelper
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -223,18 +278,55 @@ public static class ExcelExportHelper
|
||||
}
|
||||
|
||||
|
||||
data = dic;
|
||||
|
||||
//data = dic;
|
||||
translateData = dic;
|
||||
|
||||
}
|
||||
|
||||
|
||||
var (physicalPath, fileName) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code);
|
||||
|
||||
|
||||
|
||||
//模板路径
|
||||
var tplPath = physicalPath;
|
||||
|
||||
#region 根据中英文 删除模板sheet
|
||||
|
||||
// 打开模板文件
|
||||
var templateFile = new FileStream(tplPath, FileMode.Open, FileAccess.Read);
|
||||
|
||||
// 获取文件流
|
||||
var templateStream = new MemoryStream();
|
||||
templateFile.CopyTo(templateStream);
|
||||
templateStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
var workbook = new XSSFWorkbook(templateStream);
|
||||
|
||||
int sheetCount = workbook.NumberOfSheets;
|
||||
|
||||
if (sheetCount == 2)
|
||||
{
|
||||
if (data.IsEn_US)
|
||||
{
|
||||
workbook.RemoveSheetAt(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
workbook.RemoveSheetAt(1);
|
||||
}
|
||||
|
||||
var memoryStream2 = new MemoryStream();
|
||||
workbook.Write(memoryStream2);
|
||||
|
||||
memoryStream2.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
templateStream = memoryStream2;
|
||||
}
|
||||
|
||||
// 文件名称 从sheet里面取
|
||||
fileName = workbook.GetSheetName(0);
|
||||
#endregion
|
||||
|
||||
#region MiniExcel
|
||||
|
||||
var memoryStream = new MemoryStream();
|
||||
@@ -244,7 +336,7 @@ public static class ExcelExportHelper
|
||||
IgnoreTemplateParameterMissing = true,
|
||||
};
|
||||
|
||||
await MiniExcel.SaveAsByTemplateAsync(memoryStream, tplPath, data, config);
|
||||
await MiniExcel.SaveAsByTemplateAsync(memoryStream, tplPath, translateData, config);
|
||||
|
||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace IRaCIS.Core.Application.Helper;
|
||||
@@ -495,7 +497,12 @@ public static class FileStoreHelper
|
||||
|
||||
public static (string PhysicalPath, string RelativePath) GetDicomInstanceFilePath(IWebHostEnvironment _hostEnvironment, Guid trialId, Guid siteId, Guid subjectId, Guid subjectVisitId, Guid studyId, Guid instanceId)
|
||||
{
|
||||
var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);
|
||||
#region 切换存储前
|
||||
//var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);
|
||||
#endregion
|
||||
var rootPath = Path.Combine(FileStoreHelper.GetBestStoreDisk(_hostEnvironment), StaticData.Folder.IRaCISDataFolder) ;
|
||||
|
||||
|
||||
|
||||
//加入访视层级 和Data
|
||||
var path = Path.Combine(rootPath, StaticData.Folder.TrialDataFolder, trialId.ToString(),
|
||||
@@ -517,8 +524,64 @@ public static class FileStoreHelper
|
||||
return (physicalPath, relativePath);
|
||||
}
|
||||
|
||||
public static string GetBestStoreDisk(IWebHostEnvironment _hostEnvironment)
|
||||
{
|
||||
|
||||
var json = File.ReadAllText( Path.Combine(_hostEnvironment.ContentRootPath, "appsettings.json"));
|
||||
|
||||
JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load });
|
||||
|
||||
int switchingRatio = 80;
|
||||
|
||||
try
|
||||
{
|
||||
switchingRatio = (int)jsonObject["IRaCISImageStore"]["SwitchingRatio"];
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
//---解析Json文件配置出现问题
|
||||
throw new BusinessValidationFailedException(StaticData.International("SysMon_JsonConfig") + e.Message);
|
||||
}
|
||||
|
||||
//默认存储的路径
|
||||
var defaultStoreRootFolder = FileStoreHelper.GetIRaCISRootPath(_hostEnvironment);
|
||||
|
||||
|
||||
DriveInfo defaultDrive = new DriveInfo(Path.GetPathRoot(defaultStoreRootFolder));
|
||||
|
||||
var drives = DriveInfo.GetDrives().Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))
|
||||
.Where(d => d.DriveType == DriveType.Fixed && d.IsReady)
|
||||
//剩余空间最多的
|
||||
.OrderByDescending(d => d.AvailableFreeSpace)
|
||||
|
||||
//存储空间相同,则按照按照总空间从大到小排序
|
||||
.ThenByDescending(d => d.TotalSize - d.TotalFreeSpace);
|
||||
|
||||
var bestDrive = drives.FirstOrDefault();
|
||||
var bestStoreRootFolder = string.Empty;
|
||||
|
||||
//仅仅只有C 盘
|
||||
if (bestDrive == null || ((double)(defaultDrive.TotalSize - defaultDrive.TotalFreeSpace) / defaultDrive.TotalSize) * 100 < switchingRatio)
|
||||
{
|
||||
bestStoreRootFolder = defaultStoreRootFolder;
|
||||
}
|
||||
else
|
||||
{
|
||||
bestStoreRootFolder = Path.Combine(bestDrive?.RootDirectory.FullName, _hostEnvironment.EnvironmentName);
|
||||
}
|
||||
|
||||
if (!Directory.Exists(bestStoreRootFolder))
|
||||
{
|
||||
Directory.CreateDirectory(bestStoreRootFolder);
|
||||
}
|
||||
|
||||
return bestStoreRootFolder;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 获取医生通用文件存放路径
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ public static class SendEmailHelper
|
||||
|
||||
await smtp.AuthenticateAsync(_systemEmailConfig.FromEmail, _systemEmailConfig.AuthorizationCode);
|
||||
|
||||
|
||||
await smtp.SendAsync(messageToSend);
|
||||
|
||||
await smtp.DisconnectAsync(true);
|
||||
@@ -42,13 +43,28 @@ public static class SendEmailHelper
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
//---邮件发送失败,您进行的操作未能成功,请检查邮箱或联系维护人员
|
||||
//---邮件发送失败,您进行的操作未能成功,请检查邮箱或联系维护人员
|
||||
throw new Exception(StaticData.International("SendEmail_SendFail"));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static async Task<bool> TestEmailConfigAsync(SystemEmailSendConfig _systemEmailConfig)
|
||||
{
|
||||
using (var client = new MailKit.Net.Smtp.SmtpClient())
|
||||
{
|
||||
|
||||
await client.ConnectAsync(_systemEmailConfig.Host, _systemEmailConfig.Port, SecureSocketOptions.SslOnConnect);
|
||||
|
||||
await client.AuthenticateAsync(_systemEmailConfig.FromEmail, _systemEmailConfig.AuthorizationCode);
|
||||
|
||||
await client.DisconnectAsync(true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static async Task SendEmailAsync(SMTPEmailConfig sMTPEmailConfig, EventHandler<MessageSentEventArgs>? messageSentSuccess = null)
|
||||
{
|
||||
var messageToSend = new MimeMessage();
|
||||
@@ -63,7 +79,7 @@ public static class SendEmailHelper
|
||||
|
||||
if (sMTPEmailConfig.ToMailAddressList.Count == 0)
|
||||
{
|
||||
//---没有收件人
|
||||
//---没有收件人
|
||||
throw new ArgumentException(StaticData.International("SendEmail_NoRecipient"));
|
||||
}
|
||||
else
|
||||
|
||||
@@ -467,6 +467,43 @@
|
||||
系统模板文档配置表
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.TrialUserListExport(IRaCIS.Application.Contracts.TrialMaintenanceExportQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},IRaCIS.Application.Interfaces.IDictionaryService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialUser})">
|
||||
<summary>
|
||||
项目参与人员导出
|
||||
</summary>
|
||||
<param name="param"></param>
|
||||
<param name="_commonDocumentRepository"></param>
|
||||
<param name="_dictionaryService"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<param name="_trialUseRepository"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:System.Exception"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.TrialSiteUserListExport(IRaCIS.Core.Application.Contracts.DTO.SiteCRCExportQueryDTO,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},IRaCIS.Application.Interfaces.IDictionaryService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialSiteUser})">
|
||||
<summary>
|
||||
Site用户列表导出
|
||||
</summary>
|
||||
<param name="param"></param>
|
||||
<param name="_commonDocumentRepository"></param>
|
||||
<param name="_dictionaryService"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<param name="_trialSiteUserRepository"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:System.Exception"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.TrialSiteUserSummaryListExport(IRaCIS.Core.Application.Contracts.TrialSiteUserSurveyExportQueryDto,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialSiteSurvey},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialSiteUserSurvey},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Application.Interfaces.IDictionaryService)">
|
||||
<summary>
|
||||
Site用户汇总表导出
|
||||
</summary>
|
||||
<param name="queryParam"></param>
|
||||
<param name="_commonDocumentRepository"></param>
|
||||
<param name="_trialSiteSurveyRepository"></param>
|
||||
<param name="_trialSiteUserSurveyRepository"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<param name="_dictionaryService"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:System.Exception"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.CRCVisitList_Export(IRaCIS.Core.Application.Contracts.CRCVisitSearchDTO,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},IRaCIS.Application.Interfaces.IDictionaryService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
影像上传列表 只导出已上传状态的访视记录
|
||||
@@ -638,6 +675,11 @@
|
||||
<param name="_trialRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.InternationalizationService">
|
||||
<summary>
|
||||
InternationalizationService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.TrialEmailNoticeConfigService">
|
||||
<summary>
|
||||
TrialEmailNoticeConfigService
|
||||
@@ -836,6 +878,16 @@
|
||||
阅片临床数据ID
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Inspection.DTO.ReadingClinicalDataSignIndto.IsBlind">
|
||||
<summary>
|
||||
是否盲化
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Inspection.DTO.ReadingClinicalDataSignIndto.IsComplete">
|
||||
<summary>
|
||||
是否完整
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto`1">
|
||||
<summary>
|
||||
稽查泛型Dto
|
||||
@@ -1101,6 +1153,15 @@
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.GeneralCalculateService.LogRecord(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto,System.String,IRaCIS.Core.Domain.Share.LesionType)">
|
||||
<summary>
|
||||
添加计算错误日志
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<param name="lesionName"></param>
|
||||
<param name="lesionType"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.GeneralCalculateService.GetReadingCalculateDto(System.Guid)">
|
||||
<summary>
|
||||
获取ReadingCalculateDto
|
||||
@@ -1191,6 +1252,16 @@
|
||||
上一次访视Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.firstChangeTaskId">
|
||||
<summary>
|
||||
首次转变的任务ID
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.compareTaskList">
|
||||
<summary>
|
||||
触发任务list
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetDeleteLesionStatrIndex(IRaCIS.Core.Application.Service.Reading.Dto.DeleteReadingRowAnswerInDto)">
|
||||
<summary>
|
||||
删除病灶获取起始病灶序号(RECIST1Point1 固定是1)
|
||||
@@ -1204,7 +1275,7 @@
|
||||
<param name="indto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.TestCalculate(System.Guid,IRaCIS.Core.Domain.Share.QuestionType)">
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.TestCalculate(System.Guid,System.Nullable{IRaCIS.Core.Domain.Share.QuestionType})">
|
||||
<summary>
|
||||
测试计算
|
||||
</summary>
|
||||
@@ -1358,9 +1429,9 @@
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetLastTaskSODChange(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)">
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetComparedTriggeringSODChange(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)">
|
||||
<summary>
|
||||
与前一访视SOD相比变化量
|
||||
与触发iRECIST访视相比SOD变化量
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
@@ -1372,9 +1443,9 @@
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetISODChange(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)">
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetComparedTriggeringiSODChange(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)">
|
||||
<summary>
|
||||
与前一访视相比iSOD变化量
|
||||
与触发iRECIST访视相比iSOD变化量
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
@@ -1429,6 +1500,12 @@
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetCompareTaskId(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto,IRaCIS.Core.Domain.Share.QuestionType)">
|
||||
<summary>
|
||||
获取比较任务Id 需要之前一次访视为IUPD或者ICPD
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetIRECISTTargetLesionEvaluate(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)" -->
|
||||
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetIRECISTNoTargetLesionEvaluate(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)" -->
|
||||
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.GetNewTargetLesionEvaluate(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)" -->
|
||||
@@ -1442,7 +1519,7 @@
|
||||
{
|
||||
疗效为 ND
|
||||
}
|
||||
else if (任一病灶从非“存在”状态改为“存在”状态)
|
||||
else if (存在状态为“明确”的其它既往新病灶)
|
||||
{
|
||||
疗效为 iUPD
|
||||
}
|
||||
@@ -1454,6 +1531,10 @@
|
||||
{
|
||||
疗效为 疑似
|
||||
}
|
||||
else
|
||||
{
|
||||
//错误级别日志:项目、标准、受试者、阅片人、任务。输出其它既往新病灶数据:
|
||||
}
|
||||
</remarks>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
@@ -2282,6 +2363,15 @@
|
||||
<param name="beforeConvertedTaskId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.IGeneralCalculateService.LogRecord(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto,System.String,IRaCIS.Core.Domain.Share.LesionType)">
|
||||
<summary>
|
||||
添加计算错误日志
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<param name="lesionName"></param>
|
||||
<param name="lesionType"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.IReadingCalculateService.CalculateTask(IRaCIS.Core.Application.Service.Reading.Dto.CalculateTaskInDto)">
|
||||
<summary>
|
||||
自动计算 并修改值
|
||||
@@ -2629,6 +2719,16 @@
|
||||
任务名称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetCanChangeReadVisitListInDto.SubjectId">
|
||||
<summary>
|
||||
受试者ID
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ChangeCutOffVisitInDto.Name">
|
||||
<summary>
|
||||
模块名称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetSubjectReadVisitsInDto.ReadingSetType">
|
||||
<summary>
|
||||
阅片配置的类型
|
||||
@@ -3369,6 +3469,16 @@
|
||||
序号标记
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetManualListOutDto.Name">
|
||||
<summary>
|
||||
Name
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetManualListOutDto.Path">
|
||||
<summary>
|
||||
Path
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableAnswerRowInfoBase.QuestionId">
|
||||
<summary>
|
||||
第一层的Question
|
||||
@@ -3384,6 +3494,11 @@
|
||||
VisitTaskId
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableAnswerRowInfoBase.MarkTool">
|
||||
<summary>
|
||||
标记工具
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableAnswerRowInfoBase.TrialId">
|
||||
<summary>
|
||||
TrialId
|
||||
@@ -3819,11 +3934,26 @@
|
||||
字典code
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReportVerifyOutDto.IsExistDisease">
|
||||
<summary>
|
||||
是否存在疾病
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReportVerifyOutDto.TumorEvaluate">
|
||||
<summary>
|
||||
整体肿瘤评估
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.VerifyVisitTaskQuestionsInDto.VisitTaskId">
|
||||
<summary>
|
||||
任务Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SubmitTableQuestionInDto.MarkTool">
|
||||
<summary>
|
||||
标记工具
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SubmitTableQuestionInDto.PicturePath">
|
||||
<summary>
|
||||
截图地址
|
||||
@@ -6921,6 +7051,45 @@
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.UserWLTemplateService">
|
||||
<summary>
|
||||
用户WL模板
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserWLTemplateService.GetUserWLTemplateList(IRaCIS.Core.Application.ViewModel.UserWLTemplateQuery)">
|
||||
<summary>
|
||||
获取模板
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserWLTemplateService.AddOrUpdateUserWLTemplate(IRaCIS.Core.Application.ViewModel.UserWLTemplateAddOrEdit)">
|
||||
<summary>
|
||||
新增修改模板
|
||||
</summary>
|
||||
<param name="addOrEditUserWLTemplate"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserWLTemplateService.DeleteUserWLTemplate(System.Guid)">
|
||||
<summary>
|
||||
删除模板
|
||||
</summary>
|
||||
<param name="userWLTemplateId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserWLTemplateService.GetAutoCutNextTask">
|
||||
<summary>
|
||||
获取自动切换任务配置
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserWLTemplateService.SetAutoCutNextTask(IRaCIS.Core.Application.ViewModel.SetAutoCutNextTaskInDto)">
|
||||
<summary>
|
||||
设置自动切换任务
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.TrialExternalUserService">
|
||||
<summary>
|
||||
项目外部人员 录入流程相关
|
||||
@@ -7251,6 +7420,15 @@
|
||||
是否为特殊类型
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.InternationalizationView">
|
||||
<summary> InternationalizationView 列表视图模型 </summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.InternationalizationQuery">
|
||||
<summary>InternationalizationQuery 列表查询参数模型</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.InternationalizationAddOrEdit">
|
||||
<summary> InternationalizationAddOrEdit 列表查询参数模型</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.TrialEmailNoticeConfigView">
|
||||
<summary> TrialEmailNoticeConfigView 列表视图模型 </summary>
|
||||
</member>
|
||||
@@ -7308,6 +7486,16 @@
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.SystemNoticeAddOrEdit">
|
||||
<summary> SystemNoticeAddOrEdit 列表查询参数模型</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.TirggerTaskInfo.TargetAssessmentIsIUorIC">
|
||||
<summary>
|
||||
靶病灶是否为IUPD或者ICPD
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.TirggerTaskInfo.NewTargetLesionAssessmentIsIUorIC">
|
||||
<summary>
|
||||
靶病灶是否为IUPD或者ICPD
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.VisitStudyTime.SubjectVisitId">
|
||||
<summary>
|
||||
访视Id
|
||||
@@ -7343,9 +7531,9 @@
|
||||
满足RECISTPD
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTTargetLesionDto.SODAddGreaterThan5">
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTTargetLesionDto.SODTiggerAddGreaterThan5">
|
||||
<summary>
|
||||
本次访视SOD增加不小于5mm
|
||||
本次访视SOD与触发iRECIST访视相比本次访视SOD增加不小于5mm
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTTargetLesionDto.LowSodAddGreaterThan20Percent">
|
||||
@@ -7379,6 +7567,11 @@
|
||||
与基线期SOD相比减小≥30 %
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTTargetLesionDto.NoTargetLymphLoss">
|
||||
<summary>
|
||||
非靶病灶中淋巴结病灶全部消失
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.IRECISTNoTargetLesion">
|
||||
<summary>
|
||||
IRECIST 非靶病灶
|
||||
@@ -7459,6 +7652,16 @@
|
||||
至少有一个新靶病无法评估
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTNewTargetLesionDto.ExixtsLymphTarget">
|
||||
<summary>
|
||||
当有“存在”状态的淋巴结新靶病灶
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTNewTargetLesionDto.ExixtsOrLessNoLymphTarget">
|
||||
<summary>
|
||||
当有“存在”或“太小”状态的非淋巴结新靶病灶
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.IRECISTOtherNewTargetLesionDto">
|
||||
<summary>
|
||||
其他既往新病灶
|
||||
@@ -7474,9 +7677,9 @@
|
||||
所有状态为消失
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTOtherNewTargetLesionDto.LastTaskNoExists">
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTOtherNewTargetLesionDto.ExistsClear">
|
||||
<summary>
|
||||
当任一病灶从非“存在”状态改为“存在”状态
|
||||
存在明确状态
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTOtherNewTargetLesionDto.ExixtsUnevaluableState">
|
||||
@@ -7534,6 +7737,16 @@
|
||||
上一次任务的新病灶评估为iUPD
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTNewLesionAssessmentDto.LastTaskNewLesioniCPD">
|
||||
<summary>
|
||||
上一次任务的新病灶评估为iCPD
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.ViewModel.IRECISTNewLesionAssessmentDto.ExistxIRECISTNewLesion">
|
||||
<summary>
|
||||
存在触发iRECIST后新病灶
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.IRECISTTargetLesionEvaluateDto">
|
||||
<summary>
|
||||
IRECIST整体肿瘤评估
|
||||
@@ -8019,6 +8232,15 @@
|
||||
任务类型
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.UserWLTemplateView">
|
||||
<summary> UserWLTemplateView 列表视图模型 </summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.UserWLTemplateQuery">
|
||||
<summary>UserWLTemplateQuery 列表查询参数模型</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.UserWLTemplateAddOrEdit">
|
||||
<summary> UserWLTemplateAddOrEdit 列表查询参数模型</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.TrialExternalUserView">
|
||||
<summary> TrialExternalUserView 列表视图模型 </summary>
|
||||
</member>
|
||||
@@ -8067,6 +8289,11 @@
|
||||
IFrontAuditConfigService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Interfaces.IInternationalizationService">
|
||||
<summary>
|
||||
IInternationalizationService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Interfaces.ITrialEmailNoticeConfigService">
|
||||
<summary>
|
||||
ITrialEmailNoticeConfigService
|
||||
@@ -9286,26 +9513,6 @@
|
||||
<summary> 指定资源Id,渲染Dicom序列的Jpeg预览图像 </summary>
|
||||
<param name="seriesId"> Dicom序列的Id </param>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Services.TrialMaintenanceService.TrialSiteUserListExport(IRaCIS.Core.Application.Contracts.DTO.SiteCRCExportQueryDTO,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument})">
|
||||
<summary>
|
||||
Site用户列表导出
|
||||
</summary>
|
||||
<param name="param"></param>
|
||||
<param name="_commonDocumentRepository"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:System.Exception"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Services.TrialMaintenanceService.TrialSiteUserSummaryListExport(IRaCIS.Core.Application.Contracts.TrialSiteUserSurveyExportQueryDto,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialSiteSurvey},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialSiteUserSurvey})">
|
||||
<summary>
|
||||
Site用户汇总表导出
|
||||
</summary>
|
||||
<param name="queryParam"></param>
|
||||
<param name="_commonDocumentRepository"></param>
|
||||
<param name="_trialSiteSurveyRepository"></param>
|
||||
<param name="_trialSiteUserSurveyRepository"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:System.Exception"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Services.TrialMaintenanceService.GetSiteCRCList(IRaCIS.Core.Application.Contracts.DTO.SiteCrcQueryDTO)">
|
||||
<summary>Pannel 进去 SiteTab </summary>
|
||||
</member>
|
||||
@@ -11020,6 +11227,13 @@
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetManualList(IRaCIS.Core.Application.Service.Reading.Dto.GetManualListInDto)">
|
||||
<summary>
|
||||
获取手册
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetTaskAdditionalQuestion(IRaCIS.Core.Application.Service.Reading.Dto.GetTaskAdditionalQuestionInDto)">
|
||||
<summary>
|
||||
获取任务附加问题
|
||||
@@ -11156,7 +11370,7 @@
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.FindChildQuestion(IRaCIS.Core.Application.Service.Reading.Dto.TrialReadQuestionData,System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.TrialReadQuestionData},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.TableQuestionTrial},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionAnswerInfo},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.TableAnsweRowInfo},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.OrganInfo},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},System.Boolean,System.Collections.Generic.List{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer})">
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.FindChildQuestion(IRaCIS.Core.Application.Service.Reading.Dto.TrialReadQuestionData,System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.TrialReadQuestionData},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.TableQuestionTrial},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionAnswerInfo},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.TableAnsweRowInfo},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.OrganInfo},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},System.Boolean,System.Collections.Generic.List{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},System.Nullable{System.Guid})">
|
||||
<summary>
|
||||
获取子元素
|
||||
</summary>
|
||||
@@ -11491,6 +11705,20 @@
|
||||
生成的阅片模块(在大列表上展示的) 阅片期
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadModuleService.GetCanChangeReadVisitList(IRaCIS.Core.Application.Service.Reading.Dto.GetCanChangeReadVisitListInDto)">
|
||||
<summary>
|
||||
获取修改截止访视下拉
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadModuleService.ChangeCutOffVisit(IRaCIS.Core.Application.Service.Reading.Dto.ChangeCutOffVisitInDto)">
|
||||
<summary>
|
||||
修改全局阅片截止访视
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadModuleService.GetReadModuleList(IRaCIS.Core.Application.Service.Reading.Dto.GetReadModuleDto)">
|
||||
<summary>
|
||||
获取读片模块 //加了标准参数
|
||||
@@ -11562,15 +11790,6 @@
|
||||
<member name="M:IRaCIS.Application.Services.StatisticsService.GetLatestWorkLoadList(System.Int32)">
|
||||
<summary> 最新工作量 (已确定的)[New] </summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.TrialMaintenanceService.TrialUserListExport(IRaCIS.Application.Contracts.TrialMaintenanceExportQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument})">
|
||||
<summary>
|
||||
项目参与人员导出
|
||||
</summary>
|
||||
<param name="param"></param>
|
||||
<param name="_commonDocumentRepository"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:System.Exception"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.TrialMaintenanceService.GetMaintenanceUserList(IRaCIS.Application.Contracts.TrialMaintenanceQuery)">
|
||||
<summary>
|
||||
Setting页面 获取项目参与人员列表
|
||||
|
||||
@@ -2,38 +2,62 @@
|
||||
"test{0}{1}": "英文本地化{0}{1}",
|
||||
"RequiredAttribute": "{0} is required",
|
||||
|
||||
// ------------------------------------------------------------_ServiceExtensions--------------------------------------------------------------------
|
||||
//ApiResponseHandler
|
||||
"ApiResponse_NoAccess": "You do not have access to this API",
|
||||
"ApiResponse_Permission": "You do not have permission to do this",
|
||||
|
||||
// ------------------------------------------------------------Controllers--------------------------------------------------------------------
|
||||
//FinancialChangeController
|
||||
"Financial_ChargeSettled": "Expenses have been settled and workload can not be reset.",
|
||||
"Financial_InvalidParameter": "Invalid parameter.",
|
||||
//UploadDownLoadController
|
||||
"UploadDownLoad_UnsupportedMedia": "Unsupported media type.",
|
||||
"UploadDownLoad_ArchiveInProgress": "Another user is uploading or archiving this inspection.",
|
||||
"UploadDownLoad_ArchiveInProgress": "Another user is uploading or archiving this study.",
|
||||
"UploadDownLoad_InvalidData": "Please ensure that the uploaded data conforms to the style of the template file and contains valid data.",
|
||||
"UploadDownLoad_RequestError": "Request error.",
|
||||
"UploadDownLoad_RequestError": "Request error, please try again!",
|
||||
"UploadDownLoad_SupportedFormats": "Supports upload of .xlsx, .xls, and .csv formats.",
|
||||
|
||||
// ------------------------------------------------------------_MediatR--------------------------------------------------------------------
|
||||
//ConsistencyVerificationRequest
|
||||
"ConsistencyVerification_Tech": "Study Type",
|
||||
"ConsistencyVerification_Time": "Incorrect time format",
|
||||
//ConsistencyVerificationHandler
|
||||
"ConsistencyVerification_Img": "Hello, according to the automatic recognition of this system, the imaging study submitted by the subject in the current visit in the IRC system is as follows:",
|
||||
"ConsistencyVerification_Of": "Of",
|
||||
"ConsistencyVerification_ImgC": "Imaging study",
|
||||
"ConsistencyVerification_EDCA": "Check EDC data, completely consistent, approved",
|
||||
"ConsistencyVerification_EDCB": "Check EDC data, completely consistent",
|
||||
"ConsistencyVerification_Auto": "Automatically verified pass",
|
||||
"ConsistencyVerification_Prob": "The following problems exist:",
|
||||
"ConsistencyVerification_EdcL": "Image study (EDC missing)",
|
||||
"ConsistencyVerification_IrcL": "Image study (IRC missing)",
|
||||
"ConsistencyVerification_Desc": "Description: In order to efficiently solve all the above doubts, please verify the actual image study accurately. Please note that the image date may not be consistent with the actual study date, and multiple modalities of image studys (such as PET-CT) may exist at the same time. After accurate verification, please reply with the correct image study for this visit.",
|
||||
"ConsistencyVerification_Conf": "According to the imported consistency check data, please confirm the following inconsistent inspection item information of this visit:",
|
||||
"ConsistencyVerification_Edc": "EDC is lack of:",
|
||||
"ConsistencyVerification_IrcLi": "IRC is lack of:",
|
||||
|
||||
//-------------------------------------------------------------------------------------Reading-----------------------------------------------------------------
|
||||
//ClinicalDataSetService
|
||||
"ClinicalDataSet_DupTypeFail": "There are duplicate clinical data of the same type. The operation failed.",
|
||||
"ClinicalDataSet_DupTypeFail": "The same type of clinical data exists. The operation failed.",
|
||||
//ReadingClinicalDataService
|
||||
"ReadingClinicalData_DupTypeFail": "There are duplicate clinical data of the same type. The operation failed.",
|
||||
"ReadingClinicalData_DupTypeFail": "The same type of clinical data exists. The operation failed.",
|
||||
"ReadingClinicalData_Unchecked": "The current clinical data status is not verified and signing is not allowed!",
|
||||
//ReadingGlobalTaskService
|
||||
"ReadingGlobal_NotGlobal": "System call error. The current read is not a global review read.",
|
||||
//ReadingImageTaskService
|
||||
"ReadingImage_NotVisit": "System call error. The current read is not a timepoint read.",
|
||||
"ReadingImage_CantSplit": "The current read is a baseline read, and lesion split is not allowed.",
|
||||
"ReadingImage_BeSigned": "The current read has already been signed off. Please do not submit it again.",
|
||||
"ReadingImage_BeSigned": "The current read has already been signed. Please do not submit it again.",
|
||||
"ReadingImage_Beinvalid": "The current read has already been invalidated, and reading is not allowed anymore.",
|
||||
"ReadingImage_PresenceReview": "The current subject has a review request that has not been processed and is not allowed to operate",
|
||||
"ReadingImage_NotaTask": "The coalesced lesions are not from the same timepoint. ",
|
||||
"ReadingImage_PresenceReview": "The current subject has a re-read request that has not been processed and is not allowed to operate",
|
||||
"ReadingImage_NotaTask": "The coalesced lesions are not from the same timepoint.",
|
||||
"ReadingImage_DeleteError": "Other lesions have split from or coalesced into the current lesion. Deletion failed.",
|
||||
"ReadingImage_Idnotcorrespond": "Failed to add the lesion mark. The Instance ID and Series ID of the image do not match.",
|
||||
"ReadingImage_IsLymphNotbigger": "The short diameter of this nodal non-target lesion on the current visit is smaller than the value on the previous visit, and the state cannot be set to 'Unequivocal progression'.",
|
||||
"ReadingImage_NotLymphNotbigger": "The long diameter of this non-nodal non-target lesion on the current visit is smaller than the value on the previous visit, and the state cannot be set to 'Unequivocal progression'.",
|
||||
"ReadingImage_Twice": "System call error. Questions & answers submitted are duplicated.",
|
||||
"ReadingImage_MaxQuestion": "According to the imaging charter, the number of the current type of lesion cannot exceed {0}.",
|
||||
"ReadingImage_MaxQuestion": "According to the imaging charter, the number of {0} cannot exceed {1}.",
|
||||
"ReadingImage_Maxlesion": "According to the imaging charter, the number of target lesions in the same organ cannot exceed {0}. Please confirm.",
|
||||
"ReadingImage_Maximum": "{0} can only be repeated {1} times, and it has been repeated {2} times so far.",
|
||||
"ReadingImage_PCWGMaximum": "According to the imaging charter, the number of baseline lesions at the same location should enter only {0} time. Please confirm.",
|
||||
@@ -44,7 +68,7 @@
|
||||
"ReadingImage_TaskFinish": "Please note that all reads of the current subject have been completed.",
|
||||
"ReadingImage_NeedRest": "You have been continuously reading for {0} hours. Please take a break of {1} minutes before resumption.",
|
||||
//ReadingJudgeTaskService
|
||||
"ReadingJudge_SouceIdNull": "System call failed. The Source ID of the global review which is being adjudicated currently is 'null'. ",
|
||||
"ReadingJudge_SouceIdNull": "System call failed. The Source ID of the global review which is being adjudicated currently is 'null'.",
|
||||
//ReadingOncologyTaskService
|
||||
"ReadingOncology_TaskError": "System call error. The current read is not an oncology read.",
|
||||
"ReadingOncology_Abnormal": "System call exception. The result of adjudication is null",
|
||||
@@ -59,17 +83,18 @@
|
||||
"MedicalReview_invalid": "This medical review read has already been invalidated, and the operation failed.",
|
||||
"MedicalReview_SaveQuestion": "Unable to perform the current operation. Please save the medical review questions first.",
|
||||
"MedicalReview_NeedSave": "Unable to perform the current operation. Please save the medical review questions and conclusions first.",
|
||||
"MedicalReview_NotClosed": "Unable to perform the current operation. The current medical inquiry conversation has not been closed.",
|
||||
"MedicalReview_NotClosed": "Unable to perform the current operation. The current medical query conversation has not been closed.",
|
||||
"MedicalReview_Finish": "The current medical review is the last one.",
|
||||
//ReadingMedicineQuestionService
|
||||
"ReadingMed_QNumDup": "Current problem number has duplicates",
|
||||
"ReadingMed_HasSubQ": "This problem has sub-problems, please delete them first",
|
||||
"ReadingMed_QNumDup": "Current question number is repeated",
|
||||
"ReadingMed_HasSubQ": "This question has sub-question, please delete it first",
|
||||
"ReadingMed_NoMedQ": "Medical review question has not been added yet. Please add it first before confirming",
|
||||
"ReadingMed_MedQNumDup": "The display number of the medical imaging review question cannot be duplicated",
|
||||
"ReadingMed_ParentNumSmall": "The display number of the parent problem should be smaller than that of the child problem, please confirm",
|
||||
"ReadingMed_GlobalQNotConfig": "The global reading is enabled in the current standard, but the global medical review question has not been configured",
|
||||
"ReadingMed_ArbitrateQNotConfig": "Arbitration reading is enabled in the current standard, but the arbitration medical review question has not been configured",
|
||||
"ReadingMed_TumorQNotConfig": "Oncology reading is enabled in the current standard, but the oncology medical review question has not been configured",
|
||||
"ReadingMed_MedQNumDup": "The display number of the medical imaging review question cannot be duplicated.",
|
||||
"ReadingMed_ParentNumSmall": "The display number of the parent question should be smaller than that of the child question, please confirm.",
|
||||
"ReadingMed_VisitQNotConfig": "This review criteria has no medical review questions for 'visit'",
|
||||
"ReadingMed_GlobalQNotConfig": "The global review read is enabled in the current criterion, but has not configured with medical review questions",
|
||||
"ReadingMed_ArbitrateQNotConfig": "Adjudication review reading is enabled in the current criterion, but has not configured with medical review questions",
|
||||
"ReadingMed_TumorQNotConfig": "Oncology reading is enabled in the current criterion, but the oncology medical review question has not been configured",
|
||||
//UserService
|
||||
"User_CheckNameOrPw": "Please check the username or password.",
|
||||
//Repository
|
||||
@@ -78,38 +103,44 @@
|
||||
//OrganInfoService
|
||||
"OrganInfo_DuplicateData": "There are duplicate data, operation failed.",
|
||||
//ReadingCriterionService
|
||||
"ReadingCriterion_Referenced": "The current standard has been referenced and cannot be deleted.",
|
||||
"ReadingCriterion_InUse": "This standard has been used in the project and cannot be deleted.",
|
||||
"ReadingCriterion_Referenced": "The current criterion has been referenced and cannot be deleted.",
|
||||
"ReadingCriterion_InUse": "This criterion has been used in the project and cannot be deleted.",
|
||||
"ReadingCriterion_ArbitratorWithoutJudgment": "There is no referee problem but there is an arbitration object, operation failed.",
|
||||
//ReadingQuestionService
|
||||
"ReadingQuestion_IdDup": "Duplicate problem ID.",
|
||||
"ReadingQuestion_ChildrenExist": "This problem has sub-problems, please delete the sub-problems first.",
|
||||
"ReadingQuestion_GroupReferenced": "This grouping has been referenced, please delete the referenced problems first.",
|
||||
"ReadingQuestion_JudgmentSet": "The current problem already has a referee standard set, modification failed.",
|
||||
"ReadingQuestion_ExcludeWithDependency": "The displayed dependent parent problem and the required dependent problem are the same, but the answers are mutually exclusive, operation failed.",
|
||||
"ReadingQuestion_JudgmentSet": "The current question already has a referee criterion set, modification failed.",
|
||||
"ReadingQuestion_ExcludeWithDependency": "The displayed dependent parent question and the required dependent question are the same, but the answers are mutually exclusive, operation failed.",
|
||||
"ReadingQuestion_CircularDependency": "Calculation dependency has looped!",
|
||||
//ReadingPeriodSetService
|
||||
"ReadingPeriodSet_NameDup": "Review period name duplicate, operation failed",
|
||||
"ReadingPeriodSet_Global": "Review period name cannot be Global",
|
||||
"ReadingPeriodSet_AlreadyAdded": "{0} has already added the review period, cannot set it effective.",
|
||||
"ReadingPeriodSet_TaskCompletedCannotRevoke": "The current standard review has generated tasks and the review is completed, revoke failed.",
|
||||
"ReadingPeriodSet_TaskCompletedCannotRevoke": "The current criterion has generated reads and the reads have been completed, revoke failed.",
|
||||
"ReadingPeriodSet_LastVisit": "Last visit.",
|
||||
//ReadModuleService
|
||||
"ReadModule_AlreadyAdded": "The current visit has already added a review period.",
|
||||
"ReadModule_AddGlobalFirst": "Please add global review first.",
|
||||
"ReadModule_VisitNotFound": "No visits found that meet the criteria.",
|
||||
"ReadModule_VisitNotFound": "No qualified visit was found.",
|
||||
"ReadModule_SignedDataCannotDelete": "Clinical data has been signed and cannot be deleted.",
|
||||
"ReadModule_TumorExists": "The current visit has a tumor review, please delete the tumor review first.",
|
||||
"ReadModule_TaskGenerated": "The current review has generated tasks, operation failed.",
|
||||
"ReadModule_TumorExists": "The current visit has a tumor review, please delete it first.",
|
||||
"ReadModule_TaskGenerated": "The current review has generated reads, operation failed.",
|
||||
//UserWLTemplateService
|
||||
"UserWLTS_MaxTemplate": "The same user can add a maximum of 10 templates.",
|
||||
"UserWLTS_NameRepeated": "The template name is repeated",
|
||||
"UserWLTS_ContentRepeated": "The template content is repeated",
|
||||
|
||||
// ------------------------------------------------------------Allocation--------------------------------------------------------------------
|
||||
//TaskAllocationRuleService
|
||||
"TaskAllocation_DoctorIdNotFound": "Error, the doctor is account Id was not found in the enrollment table.",
|
||||
"TaskAllocation_DoctorIdNotFound": "Error, the doctor's account Id was not found in the enrollment table.",
|
||||
"TaskAllocation_DoctorConfigExists": "The doctor configuration is already available, and continued additions cannot be allowed.",
|
||||
"TaskAllocation_TaskAssigned": "A task has been assigned to the doctor and it cannot be deleted.",
|
||||
"TaskAllocation_TaskAssigned": "A read has been assigned to the doctor and it cannot be deleted.",
|
||||
//TaskConsistentRuleService
|
||||
"TaskConsistent_ConsistencyConfigExists": "Please configure the doctor for consistency analysis.",
|
||||
"TaskConsistent_TaskGenerated": "The trial configuration is already available, and no continued additions are allowed.",
|
||||
"TaskConsistent_MedicalAuditTaskExists": "The standard already has tasks generated by the Subject, and configuration modification is not allowed.",
|
||||
"TaskConsistent_SignedTaskCannotBeInvalidated": "This standard has generated a consistency analysis task and cannot be deleted.",
|
||||
"TaskConsistent_MedicalAuditTaskExists": "The criterion already has reads generated by the Subject, and configuration modification is not allowed.",
|
||||
"TaskConsistent_SignedTaskCannotBeInvalidated": "This criterion has generated a consistency analysis task and cannot be deleted.",
|
||||
//TaskMedicalReviewRuleService
|
||||
"TaskMedicalRule_TaskAlreadyAssigned": "The doctor configuration is already available, and continued additions cannot be allowed.",
|
||||
"TaskMedicalRule_TaskStarted": "A medical review task has been generated.",
|
||||
@@ -117,121 +148,123 @@
|
||||
"TaskMedical_DirtyData": "Signed files cannot be set to invalid.",
|
||||
"TaskMedical_SubjectInOtherArm": "A task is currently assigned to someone else,and it cannot be assigned. Please refresh the list.",
|
||||
//VisitTaskService
|
||||
"VisitTask_VisitTask_TaskAlreadyApplied": "The project has not confirmed any of the reading criteria.",
|
||||
"VisitTask_VisitTask_TaskAlreadyApplied": "The trial has not confirmed any of the review criteria.",
|
||||
"VisitTask_DoctorConfigNotFound": "The current doctor has begun to do the task of this standard of subject, so assignment cannot be canceled.",
|
||||
"VisitTask_BackendDataError": "One of the tasks has been assigned to the doctor and is not allowed to be assigned.",
|
||||
"VisitTask_BackendDataError": "One of the reeads has been assigned to the doctor and is not allowed to be assigned.",
|
||||
"VisitTask_DirtyData": "Dirty data appears, and the task source field has no value.",
|
||||
"VisitTask_MissingTaskSource": "The subject had a visit and entered the return process, which has not been verified for consistency and is not allowed to be assigned.",
|
||||
"VisitTask_InconsistentSubjectStatus": "There is a subject that already has the doctor in another Arm group, it is not allowed to add the doctor to a new group.",
|
||||
"VisitTask_InconsistentSubjectStatus": "There is a subject that already has the doctor in another Arm group. It is not allowed to add the doctor to a new group.",
|
||||
"VisitTask_DuplicateDoctorInArm": "There is a subject that already has the doctor in another Arm group, so the futher assignment is not allowed. Please refresh the page to confirm whether the data on the page is expired.",
|
||||
"VisitTask_DoctorAlreadyInArm": "The assignment of a Subject task cannot be canceled because it has been applied.",
|
||||
"VisitTask_TaskAlreadyApplied": "The configured doctor cannot be found in the configuration table, and the binding cannot be applied. Please check the data.",
|
||||
"VisitTask_DoctorConfiguration": "",
|
||||
"VisitTask_BackendData": "Tasks that have not been completed or have not taken effect are not allowed to request re-reading.",
|
||||
"VisitTask_UnreadTask": "Tasks that re-read has been applied or approved are not allowed to apply for re-read.",
|
||||
"VisitTask_NoPMRecheck": "",
|
||||
"VisitTask_Reapply": "PM does not allow apply for re-read of consistency analysis tasks.",
|
||||
"VisitTask_ConsistencyAnalysis": "PM only allows apply for re-read that the view type is visit.",
|
||||
"VisitTask_VisitTypeRestriction": "It is currently an ordered read type, and the subject has visit that has applied for re-read, but has not been processed (project team apply for), so it cannot been applied for continuing re-read at this time.",
|
||||
"VisitTask_SequentialReading": "It is currently an ordered read type, and the subject has visit that has applied for re-read, but has not been processed, so it cannot been applied for re-read for now.",
|
||||
"VisitTask_ImageProblem": "It is currently an ordered read type that there is something wrong with the image. The trial team has applied for returning, so it cannot been applied for re-read for now.",
|
||||
"VisitTask_LastReading": "It is an ordered read type, and only the request for re-readinng by the subject reader after completing the global task for the last time is allowed.",
|
||||
"VisitTask_LastOncologistRecheck": "",
|
||||
"VisitTask_LastAdjudicatorRecheck": "",
|
||||
"VisitTask_IRGlobalRecheck": "",
|
||||
"VisitTask_IRReapply": "It is an disordered read type, only tasks that IR applies for global and visit read type to re-read are allowed.",
|
||||
"VisitTask_InvalidReapplyStatus": "The current re-read task state is not in the requested state and cannot be processed. Please refresh the page.",
|
||||
"VisitTask_ReapplyStatusConflict": "The status of the current task requested to be re-read has been affected by another re-read task. The re-read yes/no operation is not allowed for the task in this state",
|
||||
"VisitTask_ReReadTaskNotApplied": "Only tasks the read type is visit are allowed to be approved of re-read.",
|
||||
"VisitTask_ReReadTaskAlreadyAffected": "Do not conform to the PM request and SPM / CPM approve | IR request and PM approve.",
|
||||
"VisitTask_TaskTypeNotApproved": "The current re-read task state is not in the requested state and cannot be processed. Please refresh the page.",
|
||||
"VisitTask_NoImageReturn": "",
|
||||
"VisitTask_NonEffectiveTaskCannotBeReturned": "Only effective and unfinished visit tasks can be returned. Please refresh the page data.",
|
||||
"VisitTask_NoFurtherReturn": "",
|
||||
"VisitTask_ConsistencyTaskCannotBeReturned": "The consistency analysis task is not allowed to be set return back.",
|
||||
"VisitTask_PMOnlyAllowedForReturn": "Only the PM can perform the rollback.",
|
||||
"VisitTask_UnsupportedTaskType": "Re-read task types are not supported.",
|
||||
"VisitTask_DoctorConfiguration": "Background data error",
|
||||
"VisitTask_BackendData": "Reads that have not been completed or have not been effective are not allowed to request re-reading.",
|
||||
"VisitTask_UnreadTask": "Reads that re-read has been applied or approved are not allowed to apply for re-reading.",
|
||||
"VisitTask_NoPMRecheck": "Additional review reads do not allow the PM to apply for re-reading",
|
||||
"VisitTask_Reapply": "PM is not allowed to apply for re-reading of consistency analysis reads.",
|
||||
"VisitTask_ConsistencyAnalysis": "PM is only allowed to apply for re-reading that the view type is visit.",
|
||||
"VisitTask_VisitTypeRestriction": "This is chronological read, and the subject has visit that has applied for re-read by PM, but has not been processed, so it cannot been applied for continuing re-read at this time.",
|
||||
"VisitTask_SequentialReading": "This is chronological read, and the subject has visit that has applied for re-read, but has not been processed, so it cannot been applied for re-read for now.",
|
||||
"VisitTask_ImageProblem": "This is chronological read, and there is something wrong with the image. PM has applied for returning, so it cannot been applied for re-reading now.",
|
||||
"VisitTask_LastReading": "This is chronological read, and only the request for re-readinng by the subject reader after completing the global task for the last time is allowed.",
|
||||
"VisitTask_LastOncologistRecheck": "This is chronological read, and the subject will only be allowed to re-read after IR completing the last oncology read ",
|
||||
"VisitTask_LastAdjudicatorRecheck": "This is chronological read, and the subject will only be allowed to re-read after IR completing the last adjudication read ",
|
||||
"VisitTask_IRGlobalRecheck": "This is random read, IR is only allowed to apply for re-reading global and visit reads",
|
||||
"VisitTask_IRReapply": "This is random read, IR is only allowed to apply for re-reading global and visit reads ",
|
||||
"VisitTask_InvalidReapplyStatus": "The current re-read status is not requested and cannot be processed. Please refresh the page.",
|
||||
"VisitTask_ReapplyStatusConflict": "The current re-read status has been affected by another re-read reads. The re-read review operation is not allowed for reads in this state",
|
||||
"VisitTask_ReReadTaskNotApplied": "Only reads with visit type are allowed to approve of re-read.",
|
||||
"VisitTask_ReReadTaskAlreadyAffected": "Do not conform to the PM request and SPM / CPM approve , or IR request and PM approve.",
|
||||
"VisitTask_TaskTypeNotApproved": "The current re-read status is not requested and cannot be processed. Please refresh the page.",
|
||||
"VisitTask_NoImageReturn": "Additional review reads do not allow PM to apply for re-reading",
|
||||
"VisitTask_NonEffectiveTaskCannotBeReturned": "Only effective and unfinished visit read can be returned. Please refresh the page data.",
|
||||
"VisitTask_NoFurtherReturn": "The current visit has been returned to image upload, so continuing to return is not allowed!",
|
||||
"VisitTask_ConsistencyTaskCannotBeReturned": "The consistency analysis read is not allowed to be set return back.",
|
||||
"VisitTask_PMOnlyAllowedForReturn": "Only PM can perform the return back.",
|
||||
"VisitTask_UnsupportedTaskType": "Re-read types are not supported.",
|
||||
"VisitTask_UndefinedList": "The current user view list is not defined.",
|
||||
"VisitTask_NoConsistencyReturn": "",
|
||||
"VisitTask_VisitTypeTaskAllowedForPMOnly": "Only visit task type can be returned by PM.",
|
||||
"VisitTask_NoConsistencyReturn": "The conformance analysis read cannot be returned back",
|
||||
"VisitTask_VisitTypeTaskAllowedForPMOnly": "Only read with visit type can be returned by PM.",
|
||||
|
||||
// ------------------------------------------------------------Common--------------------------------------------------------------------
|
||||
//CommonDocumentService
|
||||
"Document_CodeDuplication": "The Code of the document cannot be repeated.",
|
||||
"Document_SingleTemplate": "Only one template document is allowed per scenario and standard.",
|
||||
"Document_SingleTemplate": "Only one template file is allowed per scenario and standard.",
|
||||
"Document_ TemplateRead": "Failed to read the template content, please try saving the file as docx format!",
|
||||
//DictionaryService
|
||||
"Dictionary_DictionaryName": "There is already a dictionary with the name {0}.",
|
||||
"Dictionary_DictionaryDeletion": "The current dictionary is referenced in the standard and cannot be deleted!",
|
||||
"Dictionary_SubitemDeletion": "There is child data, direct deletion is not allowed!",
|
||||
"Dictionary_ResumeReference": "The current entry has been referenced in the reader resume.",
|
||||
"Dictionary_ProjectReference": "The current entry has been referenced in the project information.",
|
||||
"Dictionary_StandardReference": "The current entry has been referenced in the reading standard.",
|
||||
"Dictionary_ProjectReference": "The current entry has been referenced in the trial information.",
|
||||
"Dictionary_StandardReference": "The current entry has been referenced in the review criteria.",
|
||||
//ExcelExportService
|
||||
"ExcelExport_UnsupportedExport": "Currently the standard export is not supported.",
|
||||
"ExcelExport_UnsupportedExport": "Currently the criterion export is not supported.",
|
||||
//MailService
|
||||
"Mail_EmailResetReminder": "[from Extensive Imaging IRC] A reminder about resetting email.",
|
||||
"Mail_EmailResetReminder": "[From Extensive Imaging IRC] A reminder about resetting the email.",
|
||||
"Mail_Dear": "Dear {0},",
|
||||
"Mail_ResettingEmail": "You are resetting an email address.",
|
||||
"Mail_IRCResettingPassword ": "[from Extensive Imaging IRC] A reminder about resetting your password",
|
||||
"Mail_ResettingPassword ": "You are resetting the email password ",
|
||||
"Mail_ImagingIRCReminder": "[from Extensive Imaging IRC] A reminder",
|
||||
"Mail_IRCProject": "You are participating in the Extensive Imaging IRC project",
|
||||
"Mail_ProjectParticipationReminder": "[from Extensive Imaging IRC] [{0}] A reminder of the site info collection",
|
||||
"Mail_CenterResearchReminder": "You are participating in the Site information collection of the IRC Program for Extensive Imaging.",
|
||||
"Mail_AccountCreationReminder": "[from Extensive Imaging IRC] A reminder about creating an account",
|
||||
"Mail_AccountPasswordResetReminder": "[from Film IRC] A reminder about resetting account passwords",
|
||||
"Mail_InvitationEmail": "[from Extensive Imaging IRC][{0}]Invitation",
|
||||
"Mail_IRCResettingPassword ": "[From Extensive Imaging IRC] A reminder about resetting your password",
|
||||
"Mail_ResettingPassword ": "You are resetting the email password",
|
||||
"Mail_ImagingIRCReminder": "[From Extensive Imaging IRC] A reminder",
|
||||
"Mail_IRCProject": "You are participating in the Extensive Imaging IRC trial",
|
||||
"Mail_ProjectParticipationReminder": "[From Extensive Imaging IRC] [{0}] A reminder of the Site Survey",
|
||||
"Mail_CenterResearchReminder": "You are participating in the Site Survey of the Extensive Imaging IRC trial.",
|
||||
"Mail_AccountCreationReminder": "[From Extensive Imaging IRC] A reminder about creating an account",
|
||||
"Mail_AccountPasswordResetReminder": "[From Extensive Imaging IRC] A reminder about resetting account passwords",
|
||||
"Mail_InvitationEmail": "[From Extensive Imaging IRC][{0}]Invitation",
|
||||
//SystemMonitor
|
||||
"SysMon_JsonConfig": "Parsing the Json file configuration failed",
|
||||
|
||||
// ------------------------------------------------------------Doctor--------------------------------------------------------------------
|
||||
//DoctorService
|
||||
"Doctor_DupPhoneOrEmail": "current phone or email number already existed",
|
||||
"Doctor_DupPhone": "The current phone number already existed!",
|
||||
"Doctor_DupPhoneOrEmail": "The current tel or email number already existed",
|
||||
"Doctor_DupPhone": "The current tel number already existed!",
|
||||
"Doctor_DupEmail": "The current email already existed!",
|
||||
"Doctor_StandardDuplicateFileTypeError": "This type of file has already been added to the current criterion.",
|
||||
"Doctor_RequiredDocumentsError": "Resume & Consultant Agreement must be upload ",
|
||||
"Doctor_RequiredDocumentsError": "Resume & Consultant Agreement must be upload",
|
||||
|
||||
// ------------------------------------------------------------Document--------------------------------------------------------------------
|
||||
//SystemDocumentService
|
||||
"SystemD_DuplicateFile": "A file of the same type and name already exists in the system.",
|
||||
"SystemD_CannotDeleteSignedFile": "The document has already been read and signed by a user, and not allowed to be deleted.",
|
||||
"SystemD_DuplicateFile": "A file with the same type and same name already exists in the system.",
|
||||
"SystemD_CannotDeleteSignedFile": "The file has already been read and signed by a user, and not allowed to be deleted.",
|
||||
//TrialDocumentService
|
||||
"TrialD_DuplicateFileInProject": "A file of the same type with the same name already exists in the trial project .",
|
||||
"TrialD_DocumentHasAlready": "The document has already been read and signed by a user, and not allowed to be deleted.",
|
||||
"TrialD_DuplicateFileInProject": "A file with the same type and same name already exists in this trial .",
|
||||
"TrialD_DocumentHasAlready": "The file has already been read and signed by a user, and not allowed to be deleted.",
|
||||
"TrialD_FileAlreadySigned": "The file has been signed.",
|
||||
"TrialD_ObsoleteFile": "Document has been annulled. Signature failed!",
|
||||
"TrialD_ObsoleteFile": "The file has been revoked. Signature failed!",
|
||||
//TrialEmailNoticeConfigService
|
||||
"TrialEmailN_TaskNotSigned": "Before sending the email, the task must have been signed and triggered to complete the corresponding task generation.",
|
||||
"TrialEmailN_NoRecipient": "The message cannot be sent without the recipient.",
|
||||
"TrialEmailN_InvalidEmailConfig": "The configuration of the sender mailbox of the trial is wrong, please check it.",
|
||||
"TrialEmailN_EmailTemplateNotFound": "The email template in the standard scenario of this project cannot be found.",
|
||||
"TrialEmailN_InvalidEmailConfig": "The configuration of the sender mail of the trial is wrong, please check.",
|
||||
"TrialEmailN_EmailTemplateNotFound": "The email template in the standard scenario of this trial cannot be found.",
|
||||
"TrialEmailN_EnrollmentConfirmation": "[Enrollment Confirmation Report] About {0} item {1}Subject",
|
||||
"TrialEmailN_Enrollment": "The attachment is the enrollment confirmation report, please check it.",
|
||||
"TrialEmailN_PDReport": "[PD Report] About {0} item {1}Subject",
|
||||
"TrialEmailN_SubjectDiseaseProgression": "The attachment is the confirmation report of disease progress, please check it.",
|
||||
"TrialEmailN_SingleBlindedSet": "The configuration of the single and ordered reading is incorrect (there should be no adjudicator configuration), please check!",
|
||||
"TrialEmailN_SingleBlindedSequenced": "The single and ordered reading, this type of task should not enter the logic here, please contact the background developers to check!",
|
||||
"TrialEmailN_Enrollment": "The attachment is the Enrollment Confirmation Report, please check.",
|
||||
"TrialEmailN_PDReport": "[PD Confirmation Report] About {0} item {1}Subject",
|
||||
"TrialEmailN_SubjectDiseaseProgression": "The attachment is the PD Confirmation Report, please check.",
|
||||
"TrialEmailN_SingleBlindedSet": "The configuration of the single and chronological read is incorrect (there should be no adjudicator configuration), please check!",
|
||||
"TrialEmailN_SingleBlindedSequenced": "The single and chronological read, should not enter the logic here, please contact the background developers to check!",
|
||||
"TrialEmailN_PDProgressEmailTask": "Send PD progress email found problem with the task data!",
|
||||
"TrialEmailN_DoubleBlindedError": "The adjudication rule processing logic for double and ordered reading is not defined, please contact the business and background developers to check!",
|
||||
"TrialEmailN_InCons": "",
|
||||
"TrialEmailN_NoBaseLine": "",
|
||||
"TrialEmailN_IncompBase": "",
|
||||
"TrialEmailN_EmailFail": "",
|
||||
"TrialEmailN_NoReader": "",
|
||||
"TrialEmailN_NoPDConfig": "",
|
||||
"TrialEmailN_NoPDTasks": "",
|
||||
"TrialEmailN_PDNotFinished": "",
|
||||
"TrialEmailN_PDNoImaging": "",
|
||||
"TrialEmailN_PDPhaseNotFinished": "",
|
||||
"TrialEmailN_NoRuleDefined": "",
|
||||
"TrialEmailN_NoDoubleOrder": "",
|
||||
"TrialEmailN_NoSendLogicDefined": "",
|
||||
"TrialEmailN_BlindedSequencedReading": "The configuration of the ordered reading is wrong (should be single or double reading), please check!",
|
||||
"TrialEmailN_UnblindedSequencedReading": "The configuration of unordered reading is wrong (should be single reading without adjudication, or double reading with adjudication for visiting ), please check!",
|
||||
"TrialEmailN_InvalidTaskTypeForEmailSending": "Do not send emails for other types of tasks except visit, adjudication and global read. Please check the business logic.",
|
||||
"TrialEmailN_PDLogicNotDefined": "The standard task has not yet defined the PD acquisition logic, please supplement it after consultation with the business and background developer.",
|
||||
"TrialEmailN_DoubleBlindedError": "The double and chronological read does not defined the adjudication rule logic, please contact the developers to check!",
|
||||
"TrialEmailN_InCons": "The trial is not configured with the Enrollment Confirmation!",
|
||||
"TrialEmailN_NoBaseLine": "There is no baseline visit configured with Enrollment Confirmation and IR readed,so email failed to send",
|
||||
"TrialEmailN_IncompBase": "The baseline reads for enrollment confirmation has not been finished for IR!",
|
||||
"TrialEmailN_EmailFail": "Email failed to generate manually,please contact developer to verify the failure cause",
|
||||
"TrialEmailN_NoReader": "No IR has finished the baseline read at present!",
|
||||
"TrialEmailN_NoPDConfig": "The trial is not configured with PD Confirmation!",
|
||||
"TrialEmailN_NoPDTasks": "There is no baseline visit configured with “PD Confirmation” and IR readed,so email failed to send",
|
||||
"TrialEmailN_PDNotFinished": "The completion status of the latest PD interview and film reading task of the current subject does not meet the sending conditions",
|
||||
"TrialEmailN_PDNoImaging": "The trial is configured with review period adjudication, but the current subject' s latest visit marked 'PD' have no review period",
|
||||
"TrialEmailN_PDPhaseNotFinished": "The review period status of the current subject's latest PD visit does not meet the sending conditions",
|
||||
"TrialEmailN_NoRuleDefined": "The sending logic for adjudication rule is not defined! ",
|
||||
"TrialEmailN_NoDoubleOrder": "The current trial is not double and chronological read, so the sending condition is not met",
|
||||
"TrialEmailN_NoSendLogicDefined": "The current trial is not defined sending logic",
|
||||
"TrialEmailN_BlindedSequencedReading": "The configuration of the chronological read is wrong (should be single or double reading), please check!",
|
||||
"TrialEmailN_UnblindedSequencedReading": "The configuration of random read is wrong (should be single read without adjudication, or double read with adjudication for visiting ), please check!",
|
||||
"TrialEmailN_InvalidTaskTypeForEmailSending": "Do not send emails for other type except visit, adjudication and global read. Please check the logic.",
|
||||
"TrialEmailN_PDLogicNotDefined": "Reads for this criterion has not yet defined the PD logic, please supplement it after consultation with the developer.",
|
||||
"TrialEmailN_MailboxWrong": "The configuration of the sender mailbox of the trial is wrong, please check it.",
|
||||
"TrialEmailN_InvalidRecipient": "The trial does not have a valid recipient and the message cannot be sent.",
|
||||
"TrialEmailN_InvalidRecipient": "The trial does not have a valid recipient, so the message cannot be sent.",
|
||||
"TrialEmailN_EmailTestMessage": "Trial mail test",
|
||||
"TrialEmailN_ConfigurationCorrect": "If this email is received, the email configuration is correct.",
|
||||
"TrialEmailN_InvalidSenderEmailConfig": "The sender configuration is incorrect. Please check whether the server address or authorization code is correct or not.",
|
||||
@@ -251,12 +284,12 @@
|
||||
|
||||
// ------------------------------------------------------------ImageAndDoc--------------------------------------------------------------------
|
||||
//DicomArchiveService
|
||||
"DAS_NoAnonCacheData": "The cache data for anonymous config is not obtained, and the upload stops. Please contact the developer for verification.",
|
||||
"DAS_NoAnonCacheData": "The cache data for anonymous config is not obtained, and the upload stops. Please contact the developer to verify.",
|
||||
//ImageShareService
|
||||
"ISS_NoImgToShare": "There are no images to share for the current check.",
|
||||
"ISS_ResNotExists": " The request resource wasn’t found.",
|
||||
"ISS_SharePwdError": "The shared password is incorrect",
|
||||
"ISS_ShareExpiration": "Resource sharing expires",
|
||||
"ISS_NoImgToShare": "There are no images to share for the current study.",
|
||||
"ISS_ResNotExists": "The request resource wasn’t found.",
|
||||
"ISS_SharePwdError": "The shared password is incorrect.",
|
||||
"ISS_ShareExpiration": "Resource sharing expires.",
|
||||
//StudyService
|
||||
"Study_VisitBeforePrevError": "The current visit check time {0} cannot be earlier than the previous visit check time {1}. Please check whether the check data is correct.",
|
||||
"Study_VisitAfterSubseqError": "The current visit check time {0} cannot be later than the visit check time {1} .Please check whether the check data is correct.",
|
||||
@@ -268,181 +301,182 @@
|
||||
//FrontAuditConfigService
|
||||
"FrontAudit_IdDup": "The identifier is duplicated.",
|
||||
"FrontAudit_NameDup": "The name is duplicated .",
|
||||
"FrontAudit_CannotDelSub": "Subclasses exist,do not delete.",
|
||||
"FrontAudit_CannotDelSub": "Subclasses exist, cannot delete.",
|
||||
//InspectionService
|
||||
"Inspection_UserDisabled": "The current user has been disabled.",
|
||||
|
||||
// ------------------------------------------------------------Institution--------------------------------------------------------------------
|
||||
//CROService
|
||||
"CRO_DupName": "CRO with the same name already exists.Please confirm",
|
||||
"CRO_InProject": "The CRO has participated in the project and cannot be deleted.",
|
||||
"CRO_DupName": "CRO with the same name already exists. Please confirm.",
|
||||
"CRO_InProject": "The CRO has participated in the trial and cannot be deleted.",
|
||||
//HospitalService
|
||||
"Hospital_DupName": "Hospital with the same name already exists.Please confirm",
|
||||
"Hospital_SiteAdded": "The current Site has been added to another Hospital",
|
||||
"Hospital_DupName": "Hospital with the same name already exists. Please confirm.",
|
||||
"Hospital_SiteAdded": "The current Site has been added to another Hospital.",
|
||||
"Hospital_HasDoctors": "There are already doctors registered under the hospital's account and cannot be deleted.",
|
||||
//SiteService
|
||||
"Site_DupName": "Site with the same name already exists.Please confirm",
|
||||
"Site_DupName": "Site with the same name already exists. Please confirm.",
|
||||
"Site_InProject": "This site has been added to the project and cannot be deleted.",
|
||||
//SponsorService
|
||||
"Sponsor_DupName": "Sponsor with the same name already exists.Please confirm.",
|
||||
"Sponsor_InProject": "The sponsor has been added to the project and it is not allowed to delete.",
|
||||
"Sponsor_DupName": "Sponsor with the same name already exists. Please confirm.",
|
||||
"Sponsor_InProject": "The sponsor has been added to the trial and it is not allowed to delete.",
|
||||
|
||||
// ------------------------------------------------------------Management--------------------------------------------------------------------
|
||||
//MenuService
|
||||
"Menu_ParentDupChild": "A child node with the same name already exists under the parent node.",
|
||||
"Menu_ChildExist": " Child nodes already exists under this node . Delete the child nodes before deleting the node.",
|
||||
"Menu_ChildExist": "Child nodes already exists under this node . Delete the child nodes before deleting the node.",
|
||||
//UserService
|
||||
"User_UsernameExist": "The user name already exists.",
|
||||
"User_PhoneDup": "A user with the same phone number already exists in this user type.",
|
||||
"User_EmailDup": "A user with the same email already exists in this user type.",
|
||||
"User_NewOldPwdSame": "The new password is the same as the old one.",
|
||||
"User_OldPwdInvalid": "Failed to verify the old password. ",
|
||||
"User_LegalEmail": "Please input a legal email",
|
||||
"User_OldPwdInvalid": "Failed to verify the old password.",
|
||||
"User_LegalEmail": "Please input a legal email.",
|
||||
"User_VerificationCodeError": "The verification code is wrong.",
|
||||
"User_VerificationCodeExpired": "The verification code has expired.",
|
||||
"User_CreateFailed": "Check the email address or contact maintainers. The email fails to be sent and the account cannot be created",
|
||||
"User_CreateFailed": "Check the email address or contact maintainers. The email fails to be sent and the account cannot be created.",
|
||||
"User_InvalidEmail": "Please enter a correct E-mail address.",
|
||||
"User_EmailError": "The email adress is wrong.",
|
||||
"User_InProject": "The user has participated in the project and cannot be deleted.",
|
||||
"User_InProject": "The user has participated in the trial and cannot be deleted.",
|
||||
"User_Disabled": "The user has been disabled.",
|
||||
//UserTypeService
|
||||
"UserType_InUse": "User already exists in that user type, and it cannot be deleted.",
|
||||
|
||||
// ------------------------------------------------------------QC--------------------------------------------------------------------
|
||||
//QCCommon
|
||||
"QCCommon_CannotOperate": "CRC has submitted the image and it cannot be operated.",
|
||||
"QCCommon_NoPermission": "You are not the current recipient of the quality control task, so no operation authority!",
|
||||
"QCCommon_CheckTimeEarly": "The current visit check time {0} cannot be earlier than the previous visit check time {1}. Please check whether the check data is correct.",
|
||||
"QCCommon_CheckTimeLate": "The current visit check time {0} cannot be later than the visit check time {1} .Please check whether the check data is correct.",
|
||||
"QCCommon_CannotOperate": "CRC has submitted the image. Operation is not allowed.",
|
||||
"QCCommon_NoPermission": "You are not the current recipient of the image QC. No operation authority!",
|
||||
"QCCommon_CheckTimeEarly": "The current visit study time {0} cannot be earlier than the previous visit study time {1}. Please check whether the study data is correct.",
|
||||
"QCCommon_CheckTimeLate": "The current visit study time {0} cannot be later than the visit study time {1} .Please check whether the study data is correct.",
|
||||
//QCOperationService
|
||||
"QCOperation_CheckFirst": "Please check the image first and save review questions before inquiry.",
|
||||
"QCOperation_QuestionExist": "The current visit with unclosed inquiry has been set to allow CRC to reupload the image. After CRC has reuploaded image, please close the original inquiry first and then add a new inquiry.",
|
||||
"QCOperation_QuestionCannotClose": "CRC has applied for reuploading or QC has agreed to reuploading and to close the inquiry is not allowed. Please do not close the inquiry until the QC rejects the reuploading request or the CRC reuploads the image.",
|
||||
"QCOperation_CheckFirst": "Please check the image first and save review questions before query.",
|
||||
"QCOperation_QuestionExist": "The unclosed query of the current visit has been set to approve CRC reupload. After CRC has reuploaded image, please close the original query first and then add a new query.",
|
||||
"QCOperation_QuestionCannotClose": "CRC has applied for reuploading or QC has agreed to reupload. To close the query is not allowed. Please do not close the query until the QC rejects or the CRC reuploads the image.",
|
||||
"QCOperation_CloseReason": "Reason for closing:",
|
||||
"QCOperation_QuestionReplied": "The QC inquiry has been answered.",
|
||||
"QCOperation_QuestionReplied": "The QC query has been answered.",
|
||||
"QCOperation_NoPermissionReply": "You do not have permission to reply to the data reconciliation conversation.",
|
||||
"QCOperation_CannotClose": "The current visit is in the request fallback state, and the inquiry is not allowed to be closed.",
|
||||
"QCOperation_Reason": "Reason:",
|
||||
"QCOperation_CannotPass": "The current visit is in the rollback state, and the data reconciliation cannot be set.",
|
||||
"QCOperation_PassAfterClose": "Please close the data reconciliation inquiry first, and then set the data reconciliation pass.",
|
||||
"QCOperation_Cannotback": "The current visit has passed the consistency check and cannot be applied for rollback.",
|
||||
"QCOperation_CRCRollback": "CRC Apples for rollback.",
|
||||
"QCOperation_CannotClose": "The current visit status is CRC request re-upload. The query is not allowed to be closed.",
|
||||
"QCOperation_Reason": "Notes:",
|
||||
"QCOperation_CannotPass": "The current visit is in the return status, and the data reconciliation cannot be set.",
|
||||
"QCOperation_PassAfterClose": "Please close the data reconciliation query first, and then set the data reconciliation pass.",
|
||||
"QCOperation_Cannotback": "The current visit has passed the consistency check and cannot be applied for re-upload.",
|
||||
"QCOperation_CRCRollback": "CRC apples for re-upload.",
|
||||
"QCOperation_OtherCRC": "Other CRCs have applied for processing. Please refresh the page.",
|
||||
"QCOperation_PMReject": "PM/APM rejected the data reconciliation rollback.",
|
||||
"QCOperation_PMReject": "PM/APM rejected the data reconciliation return.",
|
||||
"QCOperation_NoPermission": "You do not have operation permission.",
|
||||
"QCOperation_CannotRollback": "If the current visit has not been studied or study has passed, setbacks are not allowed.",
|
||||
"QCOperation_CannotRollback": "If the current visit has not do reconciliation or has passed, setbacks are not allowed.",
|
||||
"QCOperation_PMAPMConsistency": "PM/APM agrees to the data reconciliation rollback.",
|
||||
"QCOperation_NoModifyAfterSubmit": "Once submitted, no modifications are allowed.",
|
||||
"QCOperation_UnresolvedQCQuery": "This operation is not allowed, because the inquiry of the current visitis is not closed. ",
|
||||
"QCOperation_UnresolvedQCQuery": "Image query of the current visit is not closed. This operation is not allowed.",
|
||||
"QCOperation_CrcNoDelete": "The CRC has been committed and cannot be deleted.",
|
||||
"QCOperation_NoRecipient": "You are not the current recipient of the quality control task, no operation authority!",
|
||||
"QCOperation_QCImageTaskAlreadyReleased": "The image quality control task of the current visit has been released by the original recipient. You can get it by 'pick up'.",
|
||||
"QCOperation_QCTaskNoAccess": "The image quality control task of the current visit has been claimed by other QC, so it is not allowed to pick up.",
|
||||
"QCOperation_QCConfigFirst": "Please configure the image quality control review question before receiving the image quality control task.",
|
||||
"QCOperation_NoQC": "The project configuration of image QC process was not check, and the QC Task was not picked up.",
|
||||
"QCOperation_QCImageTaskAlreadyReleased": "The image QC of the current visit has been released by the original recipient. You can get it by 'claime'.",
|
||||
"QCOperation_QCTaskNoAccess": "The image quality control task of the current visit has been claimed by other QC, so it is not allowed to claim.",
|
||||
"QCOperation_QCConfigFirst": "Please configure the image QC question before claiming the image QC task.",
|
||||
"QCOperation_NoQC": "The trial configuration of image QC was not check, and the QC Task was not be claimed.",
|
||||
"QCOperation_InitialAuditPassed": "The first review has passed, continue to receive can not be allowed.",
|
||||
"QCOperation_NoSingleAudit": "The project is configured for single check, does not meet Submmit State: Submitted or Audit State: pending review/ in review, not allowed to collect.Please refresh the page.",
|
||||
"QCOperation_NoSingleAudit": "The trial is configured with single image QC , does not meet Submmit State: Submitted or Audit State: pending QC/ in QC, not allowed to collect.Please refresh the page.",
|
||||
"QCOperation_NoSameReviewer": "The secondary QC cannot be the same person as the primary QC.",
|
||||
"QCOperation_NoSecondaryAudit": "The project is configured for double check, does not meet Submmit State: Submitted or Audit State: pending review/ in QC review, not allowed to collect.Please refresh the page.",
|
||||
"QCOperation_NoSecondaryAudit": "The trial is configured withr double image QC , does not meet Submmit State: Submitted or Audit State: pending review/ in QC, not allowed to collect.Please refresh the page.",
|
||||
"QCOperation_NoTaskAccess": "You are not the current recipient of the quality control task, no operation authority!",
|
||||
"QCOperation_NoQCFunction": "The project configuration of image QC process was not check, so there is no need to cancel the task function.",
|
||||
"QCOperation_NoTaskOwner": "The current visiting image QC task has not been claimed by anyone,and cannot been released.",
|
||||
"QCOperation_DiseaseProgressConfirmation": "Current visit required confirmation of PD. Please process the unsubmitted prior visit before submitting the current visit: {0}.",
|
||||
"QCOperation_NoTaskOwner": "The current visiting image QC has not been claimed by anyone, and cannot been released.",
|
||||
"QCOperation_DiseaseProgressConfirmation": "Current visit required PD Confirmation. Please process the unsubmitted prior visit before submitting the current visit: {0}.",
|
||||
"QCOperation_UnsubmittedVisits": " After submitting the current visit, please as soon as possible process any prior visits that have not been submitted: {0}.",
|
||||
"QCOperation_NoBaselineData": "No clinical data at baseline, confirm submission?",
|
||||
"QCOperation_NoImageData": "Dicom/ non-dicom image data has not been uploaded. Submission is not allowed.",
|
||||
"QCOperation_ImagesSubmitted": "The image data for the current visit has been submitted by another CRC.",
|
||||
"QCOperation_BatchImagesSubmitted": "The image data for visiting is currently submitted in batches, part of which has been submitted by other CRCS.",
|
||||
"QCOperation_MissingBaselineDate": "The project is configured with the visit base time. However, the subject did not fill in the visit base time, which is not allowed to submit.",
|
||||
"QCOperation_RemoveItem": "You have been removed from the project and have no operation rights.",
|
||||
"QCOperation_QCNotClosed": "This operation cannot be performed because the image quality control inquiry has not been closed for the current visit.",
|
||||
"QCOperation_NoQCNeeded": "The project configuration of image QC process was not check, and no need to set to image quality control pass.",
|
||||
"QCOperation_QCNotSaved": "Image quality control review question is not saved, and cannot be performed.",
|
||||
"QCOperation_NotChangePass": "The project configuration of image QC process was double check, so the current image QC task cannot change from the current state to pass.",
|
||||
"QCOperation_CannotChangeToPass": "The project configuration of image QC process was double check. The current audit state is {0}, which cannot be changed to approved.",
|
||||
"QCOperation_NoQCNeededNotEnd": "The project configuration of image QC process was not check, and setting image quality control termination is not allowed.",
|
||||
"QCOperation_CannotChangeToStop": "The project configuration of image QC process was single check, and the current review state is not In Primary QC and cannot be changed to the QC termination.",
|
||||
"QCOperation_CannotChangeStop": "The project configuration of image QC process was double check, and the current review state is {0} and cannot be changed to the QC termination.",
|
||||
"QCOperation_NoBaselineData": "No clinical data at baseline, confirm to submit?",
|
||||
"QCOperation_NoImageData": "Dicom/ Non-dicom image data has not been uploaded. Submission is not allowed.",
|
||||
"QCOperation_ImagesSubmitted": "The image data of the current visit has been submitted by another CRC.",
|
||||
"QCOperation_BatchImagesSubmitted": "The visit image data is currently submitted in batches, part of which has been submitted by other CRCs.",
|
||||
"QCOperation_MissingBaselineDate": "The trial is configured with the visit start date, but the visit start date for the subject is not filled. Submittion is not allowed.",
|
||||
"QCOperation_RemoveItem": "You have been removed from the trial and have no operation rights.",
|
||||
"QCOperation_QCNotClosed": "The QC query has not been closed for the current visit. This operation cannot be performed.",
|
||||
"QCOperation_NoQCNeeded": "The trial configuration of image QC was no. No need to set image QC as pass.",
|
||||
"QCOperation_QCNotSaved": "Image QC question is not saved. This operation is not allowed.",
|
||||
"QCOperation_NotChangePass": "The trial configuration of image QC process was double check, so the current image QC task cannot change from the current state to pass.",
|
||||
"QCOperation_CannotChangeToPass": "The trial configuration of image QC process was double check. The current audit state is {0}, which cannot be changed to approved.",
|
||||
"QCOperation_NoQCNeededNotEnd": "The trial configuration of image QC process was not check, and setting image quality control termination is not allowed.",
|
||||
"QCOperation_CannotChangeToStop": "The trial configuration of image QC process was single check, and the current review state is not In Primary QC and cannot be changed to the QC termination.",
|
||||
"QCOperation_CannotChangeStop": "The trial configuration of image QC process was double check, and the current review state is {0} and cannot be changed to the QC termination.",
|
||||
"QCOperation_InvalidResend": "The current reupload state is not QC agree, so reuploading is not allowed.",
|
||||
"QCOperation_NoResendNeeded": "No check operation, there will be no need to reupload!",
|
||||
"QCOperation_InvalidAgreeResend": "The current reuploading state is not CRC requested and the approve of reuploading cannot be set.",
|
||||
"QCOperation_CannotAgreeResend": "At the current visit, there is an unclosed inquiry that QC set to agree to reupload, CRC has not completed the upload, currently is not allowed to set again.",
|
||||
"QCOperation_AgreeResend": "QC agrees to reupload.",
|
||||
"QCOperation_InvalidCompleteResend": "The current reupload state is not QC agree, setting reuploading completion is not allowed.",
|
||||
"QCOperation_NoImageNotAllowed": "No image is currently available, setting reuploading completion is not allowed.",
|
||||
"QCOperation_InvalidAgreeResend": "The current re-upload- status is not CRC requested and the approve of reuploading cannot be set.",
|
||||
"QCOperation_CannotAgreeResend": "At the current visit, there is an unclosed query that QC set to agree to reupload, CRC has not uploaded, currently is not allowed to set again.",
|
||||
"QCOperation_AgreeResend": "QC agrees to re-upload.",
|
||||
"QCOperation_InvalidCompleteResend": "The current reupload status is not QC approved, setting reuploading completion is not allowed.",
|
||||
"QCOperation_NoImageNotAllowed": "No image is currently available. Setting reuploaded is not allowed.",
|
||||
"QCOperation_CRCTransferCompleted": "CRC reuploading has been completed. ",
|
||||
"QCOperation_InvalidTransferStatus": "The current inquiry reupload state is not the initial state| CRC reupload completed state, and requests for reuploading are not allowed",
|
||||
"QCOperation_InvalidTransferStatus": "The current query re-upload status is not the initial| CRC re-uploaded. Application for re-uploading is not allowed",
|
||||
"QCOperation_CRCTransfer": "CRC requests to reupload/upload images.",
|
||||
"QCOperation_CannotModifyConfirmation": "The visit has been submitted, and the enrollment confirmation state cannot be modified.",
|
||||
"QCOperation_CannotModifyPDStatus": "This visit is regarded as a rollback visit, and modification of PD confirmation status is not allowed.",
|
||||
"QCOperation_CannotModifyPDStatus": "This visit status is return back. Modification of PD Confirmation status is not allowed.",
|
||||
"QCOperation_ForwardingFailed": "Failed to forward the image:",
|
||||
//QCQuestionService
|
||||
"QCQuestion_DuplicateIndexFailed": "Operation failed because the serial number is repeated.",
|
||||
"QCQuestion_HasChildQuestion": "The current task has a sub-question and the deletion fails.",
|
||||
"QCQuestion_HasChildQuestion": "The current task has a sub-question. Deletion failed.",
|
||||
//TrialQCQuestionService
|
||||
"TrialQCQuestion_TemplateConfirmed": "Image quality control review question template has been confirmed, and no operation is allowed.",
|
||||
"TrialQCQuestion_TemplateConfirmed": "Image QC question template has been confirmed. No operation is allowed.",
|
||||
"TrialQCQuestion_DuplicateIndexFailed": "Operation failed because the serial number is repeated.",
|
||||
"TrialQCQuestion_DeleteChildFirst": "Before deleting the parent question, delete the child question that references the parent question.",
|
||||
"TrialQCQuestion_ReferencedByQCProcess": "This review question has been cited by the image quality control process and is not allowed to be deleted.",
|
||||
"TrialQCQuestion_ReferencedByQCProcess": "This review question has been cited by the image QC. Deletion is not allowed.",
|
||||
|
||||
// ------------------------------------------------------------QC--------------------------------------------------------------------
|
||||
|
||||
// ------------------------------------------------------------SiteSurvey--------------------------------------------------------------------
|
||||
//TrialSiteEquipmentSurveyService
|
||||
"TrialSiteEquipment_Locked": "Locked and not allowed to operate.",
|
||||
"TrialSiteEquipment_Locked": "Locked and operation is not allowed.",
|
||||
//TrialSiteSurveyService
|
||||
"TrialSiteSurvey_InvalidEmail": "Please enter the correct email address.",
|
||||
"TrialSiteSurvey_WrongVerificationCode": "The verification code is incorrect.",
|
||||
"TrialSiteSurvey_ExpiredVerificationCode": "The verification code has expired.",
|
||||
"TrialSiteSurvey_NoRecordToUpdate": "The site does not have a site survey record for the transferor , so it is not allowed to choose to update.",
|
||||
"TrialSiteSurvey_RecordUnderReview": "Your site survey record is in review and cannot be updated. If you need to update, please do so after rejection.",
|
||||
"TrialSiteSurvey_LockedByCurrentUser": "In the current site, the survey record form you submitted has been locked, and it is not allowed to update other people's email survey records.",
|
||||
"TrialSiteSurvey_LockedByOtherUsers": "In the current site, the survey record you submitted has been locked, Currently, the survey record form submitted by other personnel is not locked, so it is not allowed to update the survey record submitted by you before.",
|
||||
"TrialSiteSurvey_LockedByCurrentUser": "In the current site, the submitted survey record has been locked. Updation of other people's email survey records is not allowed.",
|
||||
"TrialSiteSurvey_LockedByOtherUsers": "The submitted survey record of the current site has been locked. Currently, the survey record submitted by other personnel is not locked. Updation of the survey submitted before is not allowed.",
|
||||
"TrialSiteSurvey_UnlockedRecordsExist": "The current site has unlocked survey records. Locked survey records cannot be updated.",
|
||||
"TrialSiteSurvey_NonLatestLockedRecord": "The site survey corresponding to the mailbox {0} is not the latest locked record and is not allowed to be updated!",
|
||||
"TrialSiteSurvey_AlreadyFilledByOtherUsers": "There are already survey forms filled out by other users under this site, and you are not allowed to fill them out",
|
||||
"TrialSiteSurvey_NonLatestLockedRecord": "The site survey corresponding to the mailbox {0} is not the latest. Updation is not allowed",
|
||||
"TrialSiteSurvey_AlreadyFilledByOtherUsers": "There are already survey filled out by other users under this site. You are not allowed to fill them out",
|
||||
"TrialSiteSurvey_Locked": "The site survey has been locked, and no operation is allowed.",
|
||||
"TrialSiteSurvey_IRCNotification": "[from Extensive Imaging IRC] A reminder about the site survey approval.",
|
||||
"TrialSiteSurvey_CancelUnsubmittedRecord": "Only unsubmitted records are allowed to be repealed.",
|
||||
"TrialSiteSurvey_NoAdminAcces": "The operation is not allowed by the administrator.",
|
||||
"TrialSiteSurvey_FailedToGenerateAccountId": "If no value is obtained for the generated account Id, please check.",
|
||||
"TrialSiteSurvey_FailedToGenerateAccountId": "If no value is obtained for the generated account Id. Please check.",
|
||||
"TrialSiteSurvey_IRCInvitation": "[from Extensive Imaging IRC][{0}] Invitation letter",
|
||||
"TrialSiteSurvey_IRCInvitationContent": "Hello, as the IRC supplier of experiment plan No. {0} project, Extensive Imaging sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.",
|
||||
"TrialSiteSurvey_IRCInvitationContent": "Hello, as the IRC supplier of experiment plan No. {0} trial, Extensive Imaging sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.",
|
||||
"TrialSiteSurvey_ViewAndConfirm": "Check and confirm",
|
||||
//TrialSiteUserSurveyService
|
||||
"TrialSiteUser_Locked": "Locked and not allowed to operate.",
|
||||
"TrialSiteUser_InconsistentInfo": "The user's account name in the system is{0}, and there are inconsistent items with the information filled in. Now modify the interface information to be consistent with the system and save it.",
|
||||
"TrialSiteUser_NoTestUserForFormal": "It is Formal and training projects that are not allowed to add test users.",
|
||||
"TrialSiteUser_InconsistentInfo": "The corresponding user of this email address is {0}, and the phone number is {1}. Please modify the inputted information and make it consistent with that already in the system, and then save.",
|
||||
"TrialSiteUser_NoTestUserForFormal": "Formal and training triala are not allowed to add test users.",
|
||||
"TrialSiteUser_NoFormalUserForTest": "It is the test project that regular users are not allowed in.",
|
||||
|
||||
// ------------------------------------------------------------Stat--------------------------------------------------------------------
|
||||
|
||||
// ------------------------------------------------------------TrialSiteUser--------------------------------------------------------------------
|
||||
//TrialConfigService
|
||||
"TrialConfig_JudgeTaskFail": "There are judge questions that the conditions for generating judge reading task are not configured, and the operation has failed!",
|
||||
"TrialConfig_StdConfigMissing": "Questions are not configured under the current standard.",
|
||||
"TrialConfig_JudgeTaskFail": "There are adjudication questions that the conditions for generating adjudication review read are not configured. Operation failed!",
|
||||
"TrialConfig_StdConfigMissing": "Questions are not configured under the current criterion.",
|
||||
"TrialConfig_AddEvalReq": "Selected additional assessment, must check additional assessment type",
|
||||
"TrialConfig_SignTemplateMissing": "This operation requires electronic signature confirmation, but the signature template for this scenario is not found in the system.",
|
||||
"TrialConfig_ProjectEnded": "The trial project has ended or stopped, and configuration changes are not allowed.",
|
||||
"TrialConfig_NoImageAuditQuestion": "No image quality control review question is currently added. Please add the image quality control review question first, and then confirm.",
|
||||
"TrialConfig_DuplicateAuditQuestionId": "Image quality control review question display number cannot be repeated.",
|
||||
"TrialConfig_InvalidParentQuestionId": "Make sure that the display sequence number of the parent question is smaller than that of the child question.",
|
||||
"TrialConfig_AuditQuestionConfirmed": "The question of image quality control review has been confirmed by other personnel, and it is not allowed to be confirmed again.",
|
||||
"TrialConfig_ProjectNotInitialized": "This operation is not allowed because the current state of the project is not initialized.",
|
||||
"TrialConfig_UnconfirmedConfiguration": "There are unconfirmed items in the project configuration (logical configuration, process configuration, expedite configuration) and visit management, so the project state cannot be set to start.",
|
||||
"TrialConfig_UnconfirmedUNACKD": "Unable to change project status. There are unconfirmed items in the project configuration and visit management.",
|
||||
"TrialConfig_ProjectNotStarted": "The project is not in the start state and cannot be set to stop or complete.",
|
||||
"TrialConfig_ProjectEnded": "The trial has ended or stopped. Configuration changes are not allowed.",
|
||||
"TrialConfig_NoImageAuditQuestion": "No image QC question is currently added. Please add the image QC questions first, and then confirm.",
|
||||
"TrialConfig_DuplicateAuditQuestionId": "Image QC question display number cannot be repeated.",
|
||||
"TrialConfig_InvalidParentQuestionId": "Make sure that the display sequence number of the parent question is smaller than that of the child.",
|
||||
"TrialConfig_AuditQuestionConfirmed": "The image QC questions have been confirmed by other personnel. Cofirmation again is not allowed. ",
|
||||
"TrialConfig_ProjectNotInitialized": "The current trial status is not initialized. This operation is not allowed.",
|
||||
"TrialConfig_UnconfirmedConfiguration": "This trial’s project configuration, & visit management have not been finished, and its status cannot be changed to “Ongoing”.",
|
||||
"TrialConfig_UnconfirmedUNACKD": "This trial’s project configuration, & visit management have not been all confirmed, and its status cannot be changed",
|
||||
"TrialConfig_ProjectNotStarted": "This trial status is not “Ongoing”, and cannot be set to Stoped or Completed.",
|
||||
//TrialExternalUserService
|
||||
"TrialExternalUser_Inconsistency": "The user's account name in the system is{0}, and there are inconsistent items with the information filled in. Now modify the interface information to be consistent with the system and save it.",
|
||||
"TrialExternalUser_Inconsistency": "The corresponding user of this email address is {0}, and the phone number is {1}. Please modify the inputted information and make it consistent with that already in the system, and then save.",
|
||||
"TrialExternalUser_EmailTypeDuplicate": "Please confirm that the system already has an account with the same email address and user type as the one entered in the list.",
|
||||
"TrialExternalUser_TestUserNotAllowed": "It is Formal and training projects that are not allowed to add test users.",
|
||||
"TrialExternalUser_FormalUserNotAllowed": "It is the test project that regular users are not allowed in.",
|
||||
"TrialExternalUser_NotEditable": "Personnel information cannot be edited. Please delete it and add it again.",
|
||||
"TrialExternalUser_CannotDelete": "The current user has participated in the project and cannot be deleted.",
|
||||
"TrialExternalUser_IRCInvitation": "Hello, as the IRC supplier of experiment plan No. {0} project, Extensive Imaging sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.",
|
||||
"TrialExternalUser_TestUserNotAllowed": "Formal and training trials are not allowed to add test users.",
|
||||
"TrialExternalUser_FormalUserNotAllowed": "It is a training trial that regular users are not allowed in.",
|
||||
"TrialExternalUser_NotEditable": "Staff information cannot be edited. Please delete it and add it again.",
|
||||
"TrialExternalUser_CannotDelete": "The current user has participated in the trial and cannot be deleted.",
|
||||
"TrialExternalUser_IRCInvitation": "Hello, as the IRC supplier of experiment plan No. {0} trial, Extensive Imaging sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.",
|
||||
"TrialExternalUser_ViewAndConfirm": "Check and confirm",
|
||||
"TrialExternalUser_InvitationExpired": "The invitation time has expired. You can only confirm it after you are invited again.",
|
||||
"TrialExternalUser_AccountInfo": "[from Extensive Imaging IRC][{0}] account information",
|
||||
"TrialExternalUser_Welcome": "Hello, welcome to participate in the relevant work of trial scheme No. {0}IRC of the project. This project adopts electronic workflow. The system and your account information are as follows:",
|
||||
"TrialExternalUser_Welcome": "Hello, welcome to participate in the relevant work of trial scheme No. {0}IRC of the project. This trial adopts electronic workflow. The system and your account information are as follows:",
|
||||
"TrialExternalUser_ProjectNumber": "Trial ID: {0}",
|
||||
"TrialExternalUser_ExperimentPlanNumber": "Protocol ID: {0}",
|
||||
"TrialExternalUser_ExperimentName": "Study Name: {0}",
|
||||
@@ -465,37 +499,37 @@
|
||||
"TrialSite_ParticipantJoined": "The subjects has been added to this site, and couldn't be disable.",
|
||||
"TrialSite_CodeDuplicate": "Code is not allowed to be repeated",
|
||||
"TrialSite_CannotDeleteAssociatedCRC": "The site has been associated with CRC, and couldn't be deleted.",
|
||||
"TrialSite_CannotDeleteAssociatedSubject": "The subjects has been added to this site, and couldn't be deleted.",
|
||||
"TrialSite_CannotDeleteUploadedData": "The site has been uploaded study, and couldn't be deleted.",
|
||||
"TrialSite_CannotDeleteAssociatedSubject": "The subjects has been added, and couldn't be deleted.",
|
||||
"TrialSite_CannotDeleteUploadedData": "The site has been uploaded survey, and couldn't be deleted.",
|
||||
|
||||
// ------------------------------------------------------------Visit--------------------------------------------------------------------
|
||||
//SubjectService
|
||||
"Subject_NoConfirmedPlan": "The visit plan of the project is not confirmed. Please contact the program Manager to confirm the visit plan before adding subjects.",
|
||||
"Subject_NoConfirmedPlan": "The visit plan of the trial is not confirmed. Please contact PM to confirm the visit plan before adding subjects.",
|
||||
"Subject_DuplicateSubjectNum": "Subjects with the relevant subject ID already exists.",
|
||||
"Subject_UploadedVisitNoDelete": "The subject has visit that has uploaded the image, so deletion is not allowed.",
|
||||
"Subject_UploadedVisitNoDelete": "The subject has visit that has uploaded the image. Deletion is not allowed.",
|
||||
//SubjectVisitService
|
||||
"Visit_DuplicateVisitNo": "The subject's visit schedule already includes a visit with the same visit ID.",
|
||||
"Visit_LastVisitNoChange": "The subject has already had a visit set as the last visit, and the current visit is not allowed to be set as the last visit.",
|
||||
"Visit_LastVisitNoChange": "The subject has already had a visit set as the last, and the current visit cannot be set as the last visit.",
|
||||
"Visit_DuplicateVisitName": "The subject's visit schedule already includes a visit with the same visit name.",
|
||||
"Visit_NoExtraVisitAfterLast": "Unplanned visits are not allowed after the last evaluation is set.",
|
||||
"Visit_FinishedTasksNoAdd": "The subject has already completed the task of reading ( ordered reading standard ) in follow-up visit, which is not allowed to be added here. If necessary, please return.",
|
||||
"Visit_NoPDStatusChangeAfterSubmission": "The PD confirmation status cannot be modified after the current visit image is submitted.",
|
||||
"Visit_NoExtraVisitAfterLast": "Unplanned visits cannot be added after the last assessment is set.",
|
||||
"Visit_FinishedTasksNoAdd": "The subject has reads completed in follow-up visit ( chronological read ) , which is not allowed to be added here. If necessary, please return.",
|
||||
"Visit_NoPDStatusChangeAfterSubmission": "The PD Confirmation status cannot be modified after the current visit image is submitted.",
|
||||
"Visit_UploadedNoLost": "The current visit has already uploaded images and cannot be set as visit lost to follow-up.",
|
||||
"Visit_UploadedNoDelete": "The current visit has already uploaded images and deletion is not allowed.",
|
||||
"Visit_PlanVisitNoDelete": "Planned visits are not allowed to be deleted.",
|
||||
"Visit_PreviousVisitNoDelete": "The current visit has been set to the previous visit of another visit and cannot be deleted.",
|
||||
//VisitPlanService
|
||||
"VisitPlan_OnlyInitOrOngoing": "Can be operated only when the project state is: Initialization or ongoing.",
|
||||
"VisitPlan_OnlyInitOrOngoing": "Can be operated only when the trial state is: Initialized or ongoing.",
|
||||
"VisitPlan_LargerVisitNumLargerInterval": "In the visit plan, the interval between visits with a large number should also be larger than that of a visit with a smaller number.",
|
||||
"VisitPlan_LargerPlanNumLargerInterval": "In the visit plan, the planned visit with a large number should also have a larger interval than the planned visit with a smaller event number.",
|
||||
"VisitPlan_ExistNameOrNumTemplate": "A plan visit template with visit name or visit ID of project already exists in the visit plan.",
|
||||
"VisitPlan_ExistNameOrNumTemplate": "A plan visit template with visit name or visit ID of trial already exists in the visit plan.",
|
||||
"VisitPlan_ExistBaseline": "A baseline already exists in the visit plan.",
|
||||
"VisitPlan_ExistBaselineImgNoModify": "Subjects’ baseline image data has been uploaded, so modification of baseline visits is not allowed.",
|
||||
"VisitPlan_OnlyInitOrOngoingModifyConfirm": "Modification validation is allowed only when the project is initialized or ongoing.",
|
||||
"VisitPlan_NoBaselineNotConfirm": "No baseline, no validation allowed.",
|
||||
"VisitPlan_ConfigNotConfirmNotConfirm": "If the project configuration is not confirmed, the visit plan cannot be confirmed.",
|
||||
"VisitPlan_BaselineNotMinDayNotConfirm": "Baseline VisitDay is not minimal and does not allow validation.",
|
||||
"VisitPlan_CheckExport": "Check and export _{0}.xlsx",
|
||||
"VisitPlan_ExistBaselineImgNoModify": "The subjects’ baseline image data has been uploaded, so modification of baseline visits is not allowed.",
|
||||
"VisitPlan_OnlyInitOrOngoingModifyConfirm": "Modification confirmation is allowed only when the trial is initialized or ongoing.",
|
||||
"VisitPlan_NoBaselineNotConfirm": "No baseline, no confirmation allowed.",
|
||||
"VisitPlan_ConfigNotConfirmNotConfirm": "If the trial configuration is not confirmed, the visit plan cannot be confirmed.",
|
||||
"VisitPlan_BaselineNotMinDayNotConfirm": "Baseline's VisitDay is not minimal. Confirmation is not allowed.",
|
||||
"VisitPlan_CheckExport": "Study export _{0}.xlsx",
|
||||
"VisitPlan_Assigned": "The visit plan has been assigned to the subjects and executed.",
|
||||
|
||||
// ------------------------------------------------------------WorkLoad--------------------------------------------------------------------
|
||||
@@ -510,10 +544,10 @@
|
||||
|
||||
// ------------------------------------------------------------Triggers--------------------------------------------------------------------
|
||||
//AddlTrialUserTrigger
|
||||
"AddlTrialUser_NoTestUser": "It is Formal and training projects that are not allowed to add test users.",
|
||||
"AddlTrialUser_NoFormalUser": "It is the test project that regular users are not allowed in.",
|
||||
"AddlTrialUser_NoTestUser": "Formal and training trials are not allowed to be added test users.",
|
||||
"AddlTrialUser_NoFormalUser": "It is a training trial that regular users are not allowed in.",
|
||||
//SubjectStateTrigger
|
||||
"SubjectState_CannotSetCurrentAsLastVisit": "The subject has already had a visit set as the last visit, and the current visit is not allowed to be set as the last visit.",
|
||||
"SubjectState_CannotSetCurrentAsLastVisit": "The subject has already had a visit set as the last, and the current visit cannot be set as the last.",
|
||||
"SubjectState_CannotSetAsLastVisitWithImage": "The image of the subject's visit after the current visit has been uploaded, and the current visit is not allowed to be set as the last visit.",
|
||||
//SubjectVisitFinalVisitTrigger
|
||||
"SubjectVisit_CannotSetAsLastVisit": "The subject's follow-up visits has uploaded images or submitted , and the current visit is not allowed to be set as the last visit.",
|
||||
@@ -538,13 +572,19 @@
|
||||
// ------------------------------------------------------------Helper--------------------------------------------------------------------
|
||||
//FileStoreHelper
|
||||
"FileStore_TemplateFileNotFound": "Database did not find the corresponding data template file for FileStoreHelper, please contact system maintenance personnel.",
|
||||
"FileStore_TemplateFileStoragePathInvalid": "No corresponding file was found on the storage path for the data template file of FileStoreHelper, please contact system maintenance personnel.",
|
||||
"FileStore_TemplateFileStoragePathInvalid": "File doesn’t exist. Please contact the system administrator!",
|
||||
//SendEmailHelper
|
||||
"SendEmail_SendFail": "Failed to send email in SendEmailHelper. Your operation was unsuccessful, please check your email or contact maintenance personnel.",
|
||||
"SendEmail_NoRecipient": "No recipient in SendEmailHelper.",
|
||||
|
||||
// ------------------------------------------------------------IRaCIS.Core.Domain--------------------------------------------------------------------
|
||||
//Trial
|
||||
"Trial_number": "The serial number consists of five digits. The first two digits are the center number and the last three digits are the serial number. The serial number must be the same as that recorded by the EDC"
|
||||
"Trial_number": "Subject ID is composed of 5 digits. The first 2 are the Site ID, and the following 3 are the order number. Please ensure it is identical to the ID from the EDC system. ",
|
||||
|
||||
// ------------------------------------------------------------IRaCIS.Core.Infrastructure--------------------------------------------------------------------
|
||||
//ResponseOutput
|
||||
"RO_BizObjNotExistsOrParamIncorrect": "The business object{0} does not exist in the database, or was deleted by someone else, or an incorrect parameter query caused",
|
||||
"RO_ExpectChangeButNoEffect": "Expect a change, but the database data has not changed",
|
||||
"RO_SaveFailed": "Saved failed"
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
"test{0}{1}": "中文本地化{0}{1}",
|
||||
"RequiredAttribute": "{0} 字段是必须的",
|
||||
|
||||
// ------------------------------------------------------------_ServiceExtensions--------------------------------------------------------------------
|
||||
//ApiResponseHandler
|
||||
"ApiResponse_NoAccess": "您无权访问该接口",
|
||||
"ApiResponse_Permission": "您的权限不允许进行该操作",
|
||||
|
||||
// ------------------------------------------------------------Controllers--------------------------------------------------------------------
|
||||
//FinancialChangeController
|
||||
"Financial_ChargeSettled": "费用已经结算,无法重置工作量",
|
||||
@@ -13,6 +18,25 @@
|
||||
"UploadDownLoad_RequestError": "请求异常,请重试!",
|
||||
"UploadDownLoad_SupportedFormats": "支持.xlsx、.xls、.csv格式的文件上传。",
|
||||
|
||||
// ------------------------------------------------------------_MediatR--------------------------------------------------------------------
|
||||
//ConsistencyVerificationRequest
|
||||
"ConsistencyVerification_Tech": "检查技术",
|
||||
"ConsistencyVerification_Time": "时间格式不对",
|
||||
//ConsistencyVerificationHandler
|
||||
"ConsistencyVerification_Img": "您好,根据本系统自动识别,该受试者当前访视在IRC系统中已提交的影像检查情况如下:",
|
||||
"ConsistencyVerification_Of": "的",
|
||||
"ConsistencyVerification_ImgC": "影像检查",
|
||||
"ConsistencyVerification_EDCA": "核对EDC数据,完全一致, 审核通过",
|
||||
"ConsistencyVerification_EDCB": "核对EDC数据,完全一致",
|
||||
"ConsistencyVerification_Auto": "自动核查通过",
|
||||
"ConsistencyVerification_Prob": "存在问题如下:",
|
||||
"ConsistencyVerification_EdcL": "影像检查(EDC 缺少)",
|
||||
"ConsistencyVerification_IrcL": "影像检查(IRC 缺少)",
|
||||
"ConsistencyVerification_Desc": "说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。",
|
||||
"ConsistencyVerification_Conf": "根据导入的一致性核查数据,请确认本访视以下不一致检查项信息:",
|
||||
"ConsistencyVerification_Edc": "EDC 缺少:",
|
||||
"ConsistencyVerification_IrcLi": "IRC 缺少:",
|
||||
|
||||
// ------------------------------------------------------------Reading--------------------------------------------------------------------
|
||||
//ClinicalDataSetService
|
||||
"ClinicalDataSet_DupTypeFail": "存在同类型的临床数据,操作失败",
|
||||
@@ -33,8 +57,8 @@
|
||||
"ReadingImage_IsLymphNotbigger": "当前访视该淋巴结非靶病灶的短径小于上一访视的值,不能设置为显著增大。",
|
||||
"ReadingImage_NotLymphNotbigger": "当前访视该非淋巴结非靶病灶的长径小于上一访视的值,不能设置为显著增大。",
|
||||
"ReadingImage_Twice": "系统调用错误,提交的问题及答案重复。",
|
||||
"ReadingImage_MaxQuestion": "按照《独立影像评估章程》的相关规则,当前病灶类型的病灶数量不超过{0}个。",
|
||||
"ReadingImage_Maxlesion": "按照《独立影像评估章程》的相关规则,同一器官的靶病灶数量不超过{0}个,请确认",
|
||||
"ReadingImage_MaxQuestion": "按照《独立影像评估章程》的相关规则,当前{0}的病灶数量不能超过{1}个。",
|
||||
"ReadingImage_Maxlesion": "按照《独立影像评估章程》的相关规则,同一器官的靶病灶数量不能超过{0}个,请确认",
|
||||
"ReadingImage_Maximum": "{0}的重复次数限制为{1},目前已重复{2}次。",
|
||||
"ReadingImage_PCWGMaximum": "按照《独立影像评估章程》的相关规则,同一部位的基线病灶只需录入{0}次,请确认。",
|
||||
"ReadingImage_NotNewFocus": "转换后的任务不应该存在新病灶",
|
||||
@@ -67,6 +91,7 @@
|
||||
"ReadingMed_NoMedQ": "当前未添加医学审核问题。请先添加医学审核问题,再进行确认。",
|
||||
"ReadingMed_MedQNumDup": "影像医学审核问题显示序号不能重复。",
|
||||
"ReadingMed_ParentNumSmall": "父问题的显示序号要比子问题的显示序号小,请确认。",
|
||||
"ReadingMed_VisitQNotConfig": "当前标准未配置访视医学审核问题。",
|
||||
"ReadingMed_GlobalQNotConfig": "当前标准启用了全局阅片,但未配置全局医学审核问题",
|
||||
"ReadingMed_ArbitrateQNotConfig": "当前标准启用了仲裁阅片,但未配置仲裁医学审核问题",
|
||||
"ReadingMed_TumorQNotConfig": "当前标准启用了肿瘤学阅片,但未配置肿瘤学医学审核问题",
|
||||
@@ -89,6 +114,8 @@
|
||||
"ReadingQuestion_ExcludeWithDependency": "显示依赖父问题和必填依赖的问题为同一个,但答案互斥,操作失败",
|
||||
"ReadingQuestion_CircularDependency": "计算依赖循环了!",
|
||||
//ReadingPeriodSetService
|
||||
"ReadingPeriodSet_NameDup": "阅片期名称重复,操作失败",
|
||||
"ReadingPeriodSet_Global": "阅片期名称不能为Global",
|
||||
"ReadingPeriodSet_AlreadyAdded": "{0}已经添加过阅片期,无法设置生效",
|
||||
"ReadingPeriodSet_TaskCompletedCannotRevoke": "当前标准阅片已生成任务并且阅片完成,撤销失败。",
|
||||
"ReadingPeriodSet_LastVisit": "末次访视",
|
||||
@@ -99,6 +126,10 @@
|
||||
"ReadModule_SignedDataCannotDelete": "临床资料已签名,不允许删除",
|
||||
"ReadModule_TumorExists": "当前访视存在肿瘤学阅片,请先删除肿瘤学阅片",
|
||||
"ReadModule_TaskGenerated": "当前阅片已生成任务,操作失败。",
|
||||
//UserWLTemplateService
|
||||
"UserWLTS_MaxTemplate": "同一个用户最多只能添加10个模板",
|
||||
"UserWLTS_NameRepeated": "模板名称存在重复",
|
||||
"UserWLTS_ContentRepeated": "模板内容存在重复",
|
||||
|
||||
// ------------------------------------------------------------Allocation--------------------------------------------------------------------
|
||||
//TaskAllocationRuleService
|
||||
@@ -129,7 +160,7 @@
|
||||
"VisitTask_DoctorConfiguration": "后台数据有错误",
|
||||
"VisitTask_BackendData": "未阅片完成,或者未生效的任务不允许申请重阅",
|
||||
"VisitTask_UnreadTask": "重阅已申请,或者重阅已同意状态下不允许申请重阅",
|
||||
"VisitTask_NoPMRecheck": "手动生成任务的不允许PM 申请影像重阅",
|
||||
"VisitTask_NoPMRecheck": "附加评估标准任务不允许PM 申请影像重阅",
|
||||
"VisitTask_Reapply": "PM 不允许对一致性分析任务进行申请重阅",
|
||||
"VisitTask_ConsistencyAnalysis": "PM 仅仅允许对访视类型的任务申请重阅",
|
||||
"VisitTask_VisitTypeRestriction": "当前为有序阅片,该受试者已有访视已申请重阅还未处理(项目组申请),暂不能继续申请重阅",
|
||||
@@ -138,14 +169,14 @@
|
||||
"VisitTask_LastReading": "有序阅片,只允许申请该受试者阅片人最后一次完成全局任务重阅",
|
||||
"VisitTask_LastOncologistRecheck": "有序阅片,只允许申请该受试者阅片人最后一次完成肿瘤学任务重阅",
|
||||
"VisitTask_LastAdjudicatorRecheck": "有序阅片,只允许申请该受试者阅片人最后一次完成裁判的任务重阅",
|
||||
"VisitTask_IRGlobalRecheck": "无序阅片,仅仅允许IR 申请 全局和访视类型类别的任务进行重阅",
|
||||
"VisitTask_IRGlobalRecheck": "无序阅片,仅仅允许IR 申请 全局和访视类型类别的任务进行重阅",
|
||||
"VisitTask_IRReapply": "无序阅片,仅仅允许IR申请全局和访视类型类别的任务进行重阅",
|
||||
"VisitTask_InvalidReapplyStatus": "当前重阅任务状态不为已申请状态,不允许进行处理,请刷新页面",
|
||||
"VisitTask_ReapplyStatusConflict": "当前申请重阅任务的状态,已被其他任务重阅已影响,不允许对该状态下的任务进行重阅同意与否操作",
|
||||
"VisitTask_ReReadTaskNotApplied": "仅允许同意访视类型的任务重阅",
|
||||
"VisitTask_ReReadTaskAlreadyAffected": "不符合 PM申请 SPM / CPM审批 | IR申请 PM 审批 ",
|
||||
"VisitTask_TaskTypeNotApproved": "当前重阅任务状态不为已申请状态,不允许进行处理,请刷新页面",
|
||||
"VisitTask_NoImageReturn": "手动生成任务的不允许在此入口影像退回",
|
||||
"VisitTask_NoImageReturn": "附加评估标准任务不允许在此入口影像退回",
|
||||
"VisitTask_NonEffectiveTaskCannotBeReturned": "仅仅允许针对生效、未完成的访视任务进行退回操作,请刷新页面数据",
|
||||
"VisitTask_NoFurtherReturn": "当前访视已回退到影像上传,不允许继续回退!",
|
||||
"VisitTask_ConsistencyTaskCannotBeReturned": "一致性分析的任务,不允许设置退回",
|
||||
@@ -182,6 +213,8 @@
|
||||
"Mail_AccountCreationReminder": "[来自展影IRC] 关于创建账户的提醒",
|
||||
"Mail_AccountPasswordResetReminder": "[来自展影IRC] 关于重置账户密码的提醒",
|
||||
"Mail_InvitationEmail": "[来自展影IRC] [{0}]邀请信",
|
||||
//SystemMonitor
|
||||
"SysMon_JsonConfig": "解析Json文件配置出现问题",
|
||||
|
||||
// ------------------------------------------------------------Doctor--------------------------------------------------------------------
|
||||
//DoctorService
|
||||
@@ -214,12 +247,12 @@
|
||||
"TrialEmailN_PDProgressEmailTask": "发送PD 进展邮件中发现任务数据有问题!",
|
||||
"TrialEmailN_DoubleBlindedError": "双重有序阅片 没有定义该仲裁规则处理逻辑,请联系业务和后台开发核查!",
|
||||
"TrialEmailN_InCons": "项目未配置入组确认!",
|
||||
"TrialEmailN_NoBaseLine": "不存在配置了入组确认的并且生成任务的基线访视",
|
||||
"TrialEmailN_NoBaseLine": "不存在配置了入组确认的并且已阅的基线访视",
|
||||
"TrialEmailN_IncompBase": "做入组确认的阅片人基线任务没有阅片完!",
|
||||
"TrialEmailN_EmailFail": "邮件手动生成失败,请联系开发核实该场景失败原因",
|
||||
"TrialEmailN_NoReader": "当前未有阅片人读完基线任务!",
|
||||
"TrialEmailN_NoPDConfig": "项目未配置PD进展!",
|
||||
"TrialEmailN_NoPDTasks": "不存在配置了PD进展的并且生成任务的访视",
|
||||
"TrialEmailN_NoPDTasks": "不存在配置了PD进展的并且已阅的访视",
|
||||
"TrialEmailN_PDNotFinished": "当前受试者最新PD访视阅片任务完成状态不符合发送条件",
|
||||
"TrialEmailN_PDNoImaging": "项目配置了阅片期仲裁,但是当前受试者最新PD访视没有影像学阅片期",
|
||||
"TrialEmailN_PDPhaseNotFinished": "当前受试者最新PD访视阅片期任务完成状态不符合发送条件",
|
||||
@@ -228,7 +261,7 @@
|
||||
"TrialEmailN_NoSendLogicDefined": "当前项目配置,未定义发送业务逻辑!",
|
||||
"TrialEmailN_BlindedSequencedReading": "有序阅片配置有误(应为单重或者双重阅片),请核查!",
|
||||
"TrialEmailN_UnblindedSequencedReading": "无序阅片配置有误(应为单重无仲裁对象,双重针对访视仲裁),请核查!",
|
||||
"TrialEmailN_InvalidTaskTypeForEmailSending": "不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑",
|
||||
"TrialEmailN_InvalidTaskTypeForEmailSending": "不应有除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑",
|
||||
"TrialEmailN_PDLogicNotDefined": "该标准任务还未定义PD获取逻辑,联系业务和后台开发协商后补充",
|
||||
"TrialEmailN_MailboxWrong": "项目发件邮箱配置有误,请核实",
|
||||
"TrialEmailN_InvalidRecipient": "项目没有有效的收件人,无法发送邮件",
|
||||
@@ -278,7 +311,7 @@
|
||||
"CRO_InProject": "该CRO已经参与项目,不能被删除。",
|
||||
//HospitalService
|
||||
"Hospital_DupName": "已经存在同名的医院,请确认。",
|
||||
"Hospital_SiteAdded": "当前Site已经添加到其他Hospital了",
|
||||
"Hospital_SiteAdded": "当前Site已经添加到其他Hospital了。",
|
||||
"Hospital_HasDoctors": "该医院下已经注册有医生,不可以删除。",
|
||||
//SiteService
|
||||
"Site_DupName": "已经存在同名的中心,请确认。",
|
||||
@@ -297,10 +330,10 @@
|
||||
"User_EmailDup": "该用户类型中已存在具有相同邮箱的用户。",
|
||||
"User_NewOldPwdSame": "新密码与旧密码相同。",
|
||||
"User_OldPwdInvalid": "旧密码验证失败。",
|
||||
"User_LegalEmail": "请输入合法的电子邮件",
|
||||
"User_LegalEmail": "请输入合法的电子邮件。",
|
||||
"User_VerificationCodeError": "验证码错误。",
|
||||
"User_VerificationCodeExpired": "验证码已经过期。",
|
||||
"User_CreateFailed": "请检查邮箱地址或者联系维护人员, 邮件发送失败, 未能创建账户成功",
|
||||
"User_CreateFailed": "请检查邮箱地址或者联系维护人员, 邮件发送失败, 未能创建账户成功。",
|
||||
"User_InvalidEmail": "请输入一个正确的邮箱。",
|
||||
"User_EmailError": "邮箱错误。",
|
||||
"User_InProject": "该用户已经参加项目,不能够删除。",
|
||||
@@ -310,7 +343,7 @@
|
||||
|
||||
// ------------------------------------------------------------QC--------------------------------------------------------------------
|
||||
//QCCommon
|
||||
"QCCommon_CannotOperate": "CRC 已提交影像,不能进行操作。",
|
||||
"QCCommon_CannotOperate": "CRC已提交影像,不能进行操作。",
|
||||
"QCCommon_NoPermission": "您不是该质控任务当前领取人,没有操作权限!",
|
||||
"QCCommon_CheckTimeEarly": "当前访视检查时间{0}不能早于前序访视检查时间{1},请核对检查数据是否有误",
|
||||
"QCCommon_CheckTimeLate": "当前访视检查时间{0}不能晚于该访视之后的检查时间{1},请核对检查数据是否有误",
|
||||
@@ -321,12 +354,12 @@
|
||||
"QCOperation_CloseReason": "关闭原因: ",
|
||||
"QCOperation_QuestionReplied": "当前QC质疑已经回复。",
|
||||
"QCOperation_NoPermissionReply": "您没有权限回复一致性核查对话。",
|
||||
"QCOperation_CannotClose": "当前访视处于申请回退状态, 不允许关闭质疑。",
|
||||
"QCOperation_CannotClose": "当前访视处于申请重传状态, 不允许关闭质疑。",
|
||||
"QCOperation_Reason": "原因:",
|
||||
"QCOperation_CannotPass": "当前访视处于回退状态,不允许设置一致性核查通过",
|
||||
"QCOperation_PassAfterClose": "请先关闭一致性核查质疑后,再设置一致性核查通过。",
|
||||
"QCOperation_Cannotback": "当前访视已通过一致性核查,不允许申请回退",
|
||||
"QCOperation_CRCRollback": "CRC申请回退",
|
||||
"QCOperation_Cannotback": "当前访视已通过一致性核查,不允许申请重传",
|
||||
"QCOperation_CRCRollback": "CRC申请重传",
|
||||
"QCOperation_OtherCRC": "其他CRC已申请处理,请刷新页面",
|
||||
"QCOperation_PMReject": "PM/APM拒绝一致性核查回退",
|
||||
"QCOperation_NoPermission": "您不具备操作权限。",
|
||||
@@ -343,7 +376,7 @@
|
||||
"QCOperation_InitialAuditPassed": "初审已通过,不能继续领取",
|
||||
"QCOperation_NoSingleAudit": "项目配置为单审,不满足Submmit State:已提交 或者 Audit State:待审核/审核中, 不允许领取,请刷新界面",
|
||||
"QCOperation_NoSameReviewer": "复审不能和初审是同一个人",
|
||||
"QCOperation_NoSecondaryAudit": "项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面",
|
||||
"QCOperation_NoSecondaryAudit": "项目配置为复审,不满足提交状态:已提交或者审核状态:待审核/QC中, 不允许领取,请刷新界面",
|
||||
"QCOperation_NoTaskAccess": "您不是该质控任务当前领取人,没有操作权限!",
|
||||
"QCOperation_NoQCFunction": "项目配置影像质控为不审,不需要取消任务功能",
|
||||
"QCOperation_NoTaskOwner": "当前访视影像质控任务没有当前领取人,不能释放。",
|
||||
@@ -411,7 +444,7 @@
|
||||
"TrialSiteSurvey_ViewAndConfirm": "查看并确认",
|
||||
//TrialSiteUserSurveyService
|
||||
"TrialSiteUser_Locked": "已锁定,不允许操作",
|
||||
"TrialSiteUser_InconsistentInfo": "该用户在系统中账户名为:{0} ,与填写信息存在不一致项, 现将界面信息修改为与系统一致,可进行保存",
|
||||
"TrialSiteUser_InconsistentInfo": "该邮件地址在系统中所对应的用户为 {0}, 电话号码是 {1}。请将所输入的信息修改为与系统一致后,再保存。",
|
||||
"TrialSiteUser_NoTestUserForFormal": "正式类型 、培训类型的项目 不允许加入测试用户",
|
||||
"TrialSiteUser_NoFormalUserForTest": "测试项目 不允许加入正式用户",
|
||||
|
||||
@@ -421,6 +454,7 @@
|
||||
//TrialConfigService
|
||||
"TrialConfig_JudgeTaskFail": "有裁判问题未配置产生裁判阅片任务的条件,操作失败!",
|
||||
"TrialConfig_StdConfigMissing": "当前标准下未配置问题",
|
||||
"TrialConfig_AddEvalReq": "选择了附加评估,必须勾选附加评估类型",
|
||||
"TrialConfig_SignTemplateMissing": "该操作需要电子签名确认,但未在系统中找到该场景的签名模板。",
|
||||
"TrialConfig_ProjectEnded": "该项目已结束或停止,不允许修改配置。",
|
||||
"TrialConfig_NoImageAuditQuestion": "当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。",
|
||||
@@ -428,11 +462,11 @@
|
||||
"TrialConfig_InvalidParentQuestionId": "父问题的显示序号要比子问题的显示序号小,请确认。",
|
||||
"TrialConfig_AuditQuestionConfirmed": "影像质控审核问题已被其他人员确认,不允许再次确认。",
|
||||
"TrialConfig_ProjectNotInitialized": "该项目当前状态不是初始化,不允许进行该操作。",
|
||||
"TrialConfig_UnconfirmedConfiguration": "该项目的项目配置(基础配置、流程配置、加急配置) 、访视管理,有配置未确认,不能设置项目状态为启动。",
|
||||
"TrialConfig_UnconfirmedUNACKD": "无法变更项目状态。该项目的项目配置、访视管理中,有未确认项",
|
||||
"TrialConfig_UnconfirmedConfiguration": "该项目的项目配置、访视管理尚未完成,无法将项目状态设为”启动”。",
|
||||
"TrialConfig_UnconfirmedUNACKD": "该项目的项目配置、访视管理中,有未确认项,无法变更项目状态。",
|
||||
"TrialConfig_ProjectNotStarted": "项目没有进入启动状态,不能设置为停止或完成状态",
|
||||
//TrialExternalUserService
|
||||
"TrialExternalUser_Inconsistency": "该用户在系统中的用户名为:{0} 电话:{1},与填写信息存在不一致项, 请将界面信息修改为与系统一致,再进行保存",
|
||||
"TrialExternalUser_Inconsistency": "该邮件地址在系统中所对应的用户为 {0}, 电话号码是 {1}。请将所输入的信息修改为与系统一致后,再保存。",
|
||||
"TrialExternalUser_EmailTypeDuplicate": "系统已经存在与列表中填写的邮箱和用户类型相同的账户,请确认。",
|
||||
"TrialExternalUser_TestUserNotAllowed": "正式类型 、培训类型的项目 不允许加入测试用户 ",
|
||||
"TrialExternalUser_FormalUserNotAllowed": "测试项目 不允许加入正式用户 ",
|
||||
@@ -511,7 +545,7 @@
|
||||
// ------------------------------------------------------------Triggers--------------------------------------------------------------------
|
||||
//AddlTrialUserTrigger
|
||||
"AddlTrialUser_NoTestUser": "正式类型 、培训类型的项目 不允许加入测试用户",
|
||||
"AddlTrialUser_NoFormalUser": "测试项目 不允许加入正式用户",
|
||||
"AddlTrialUser_NoFormalUser": "测试项目不允许加入正式用户",
|
||||
//SubjectStateTrigger
|
||||
"SubjectState_CannotSetCurrentAsLastVisit": "该受试者已经有访视被设置为末次访视,不允许将当前访视设置为末次访视。",
|
||||
"SubjectState_CannotSetAsLastVisitWithImage": "该受试者当前访视后有访视的影像已上传,当前访视不允许设置为末次访视。",
|
||||
@@ -538,13 +572,19 @@
|
||||
// ------------------------------------------------------------Helper--------------------------------------------------------------------
|
||||
//FileStoreHelper
|
||||
"FileStore_TemplateFileNotFound": "数据库没有找到对应的数据模板文件,请联系系统运维人员。",
|
||||
"FileStore_TemplateFileStoragePathInvalid": "数据模板文件存储路径上未找对应文件,请联系系统运维人员。",
|
||||
"FileStore_TemplateFileStoragePathInvalid": "文件不存在,请联系系统管理员!",
|
||||
//SendEmailHelper
|
||||
"SendEmail_SendFail": "邮件发送失败,您进行的操作未能成功,请检查邮箱或联系维护人员",
|
||||
"SendEmail_NoRecipient": "没有收件人",
|
||||
|
||||
// ------------------------------------------------------------IRaCIS.Core.Domain--------------------------------------------------------------------
|
||||
//Trial
|
||||
"Trial_number": "编号由5位数字组成,前2位为中心编号,后3位为顺序号,请与EDC录入的编号保持一致"
|
||||
"Trial_number": "编号由5位数字组成,前2位为中心编号,后3位为顺序号,请与EDC录入的编号保持一致",
|
||||
|
||||
// ------------------------------------------------------------IRaCIS.Core.Infrastructure--------------------------------------------------------------------
|
||||
//ResponseOutput
|
||||
"RO_BizObjNotExistsOrParamIncorrect": "业务对象{0}在数据库中不存在,或被他人删除,或参数查询不正确导致",
|
||||
"RO_ExpectChangeButNoEffect": "期望发生更改,但数据库数据没有更改",
|
||||
"RO_SaveFailed": "保存失败"
|
||||
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
{
|
||||
if (!ReadingDurationTimeSpan.HasValue)
|
||||
return "";
|
||||
else return string.Format("{0}天{1}小时{2}分钟", (SignTime - FirstReadingTime)?.Days, (SignTime - FirstReadingTime)?.Hours, (SignTime - FirstReadingTime)?.Minutes)
|
||||
else return string.Format("{0}d {1}h {2}min", (SignTime - FirstReadingTime)?.Days, (SignTime - FirstReadingTime)?.Hours, (SignTime - FirstReadingTime)?.Minutes)
|
||||
/*string.Format("{0}分钟", (ReadingDurationTimeSpan)?.TotalMinutes)*/;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
public async Task AddConvertedTask(Guid taskId)
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
var taskInfo = await _visitTaskRepository.Where(x => x.Id == taskId).IgnoreAutoIncludes().AsNoTracking().FirstNotNullAsync();
|
||||
taskInfo.ReadingTaskState = ReadingTaskState.WaitReading;
|
||||
@@ -148,7 +148,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
await _visitTaskRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
@@ -237,7 +237,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
//为防止脏数据 这里也多判断一次
|
||||
var existCurrentVisitTaskList = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId
|
||||
&& t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.TaskState == TaskState.Effect
|
||||
&& t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.SourceSubjectVisitId == subjectVisit.Id).ToList();
|
||||
&& t.SourceSubjectVisitId == subjectVisit.Id).ToList();
|
||||
|
||||
if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double)
|
||||
{
|
||||
@@ -1290,6 +1290,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
//加一个去重的判断 IR 申请重阅的时候,有脏数据 (例如多个follow 2 ),但是生成时候不生成
|
||||
|
||||
//var existTask = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == reReadingVisitTask.SubjectId
|
||||
//&& t.TrialReadingCriterionId == reReadingVisitTask.TrialReadingCriterionId && t.TaskState == TaskState.Effect
|
||||
// && t.SourceSubjectVisitId == reReadingVisitTask.SourceSubjectVisitId && t.ArmEnum == reReadingVisitTask.ArmEnum && t.DoctorUserId == reReadingVisitTask.DoctorUserId).FirstOrDefault();
|
||||
|
||||
|
||||
var newTask = await _visitTaskRepository.AddAsync(new VisitTask()
|
||||
{
|
||||
|
||||
@@ -1322,7 +1327,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
IsNeedClinicalDataSign = reReadingVisitTask.IsNeedClinicalDataSign,
|
||||
IsClinicalDataSign = reReadingVisitTask.IsClinicalDataSign,
|
||||
BeforeConvertedTaskId = reReadingVisitTask.BeforeConvertedTaskId,
|
||||
ReReadingApplyState= ReReadingApplyState.Default,
|
||||
ReReadingApplyState = ReReadingApplyState.Default,
|
||||
// TaskAllocationState = reReadingVisitTask.TaskAllocationState,
|
||||
// AllocateTime = DateTime.Now,
|
||||
//DoctorUserId = reReadingVisitTask.DoctorUserId,
|
||||
|
||||
@@ -107,14 +107,12 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
.Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, IsAutoCreate = t.IsAutoCreate, IsAdditionalAssessment = t.IsAdditionalAssessment, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, ReadingType = t.ReadingType, ReadingInfoSignTime = t.ReadingInfoSignTime })
|
||||
.ToListAsync();
|
||||
|
||||
if (list.Count == 0)
|
||||
{
|
||||
//---该项目还未确认任何一个阅片标准
|
||||
throw new BusinessValidationFailedException(_localizer["VisitTask_VisitTask_TaskAlreadyApplied"]);
|
||||
|
||||
}
|
||||
|
||||
//if (list.Count == 0)
|
||||
//{
|
||||
// //---该项目还未确认任何一个阅片标准
|
||||
// throw new BusinessValidationFailedException(_localizer["VisitTask_VisitTask_TaskAlreadyApplied"]);
|
||||
|
||||
//}
|
||||
|
||||
|
||||
return list.AsQueryable().WhereIf(isHaveSigned == true, t => t.ReadingInfoSignTime != null)
|
||||
@@ -122,6 +120,8 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Subject 任务类型 统计 +分配情况
|
||||
/// </summary>
|
||||
@@ -1092,7 +1092,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
.WhereIf(!string.IsNullOrEmpty(inDto.SubjectCode), t => (t.Subject.Code.Contains(inDto.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inDto.SubjectCode) && t.IsAnalysisCreate));
|
||||
|
||||
|
||||
var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode });
|
||||
var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode });
|
||||
|
||||
var visitTaskQuery = visitGroupQuery.Select(x => new IRUnReadSubjectView()
|
||||
{
|
||||
@@ -1141,7 +1141,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|
||||
// 不这样写会有问题
|
||||
var count = visitQuery.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned && y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
|
||||
.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode }).Count();
|
||||
.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode }).Count();
|
||||
|
||||
var result = new List<IRUnReadSubjectView>();
|
||||
|
||||
@@ -1269,7 +1269,6 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == trialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsAutoCreate, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
|
||||
|
||||
foreach (var task in taskList)
|
||||
{
|
||||
|
||||
@@ -1334,13 +1333,13 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
// 有序
|
||||
if (criterionConfig.IsReadingTaskViewInOrder)
|
||||
{
|
||||
|
||||
// 针对同一个subject 不同阅片人 针对同一个访视申请重阅,是允许的,所以同一阅片人,针对同一suject 有访视申请重阅还未处理,不允许申请重阅
|
||||
if (await _visitTaskReReadingRepository.AnyAsync(t => t.OriginalReReadingTask.TrialId == task.TrialId && t.OriginalReReadingTask.SubjectId == task.SubjectId && t.OriginalReReadingTask.TaskState == TaskState.Effect
|
||||
&& t.OriginalReReadingTask.TrialReadingCriterionId == task.TrialReadingCriterionId
|
||||
&& t.OriginalReReadingTask.TrialReadingCriterionId == task.TrialReadingCriterionId && t.OriginalReReadingTask.DoctorUserId == task.DoctorUserId
|
||||
&& t.OriginalReReadingTask.ReadingTaskState == ReadingTaskState.HaveSigned && t.RequestReReadingType == RequestReReadingType.DocotorApply && t.RequestReReadingResultEnum == RequestReReadingResult.Default))
|
||||
{
|
||||
//---当前为有序阅片,该受试者已有访视已申请重阅还未处理,暂不能继续申请重阅
|
||||
return ResponseOutput.NotOk(_localizer["VisitTask_SequentialReading"]);
|
||||
throw new BusinessValidationFailedException(_localizer["VisitTask_SequentialReading"]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1354,10 +1353,11 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
var originalTask = pmApply.OriginalReReadingTask;
|
||||
|
||||
//PM 有序影响列表
|
||||
if (await _visitTaskRepository.Where(t => t.TrialId == originalTask.TrialId && t.SubjectId == originalTask.SubjectId && t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.TrialReadingCriterionId == originalTask.TrialReadingCriterionId && t.VisitTaskNum > originalTask.VisitTaskNum).AnyAsync(t => t.VisitTaskNum == task.VisitTaskNum))
|
||||
if (await _visitTaskRepository.Where(t => t.TrialId == originalTask.TrialId && t.SubjectId == originalTask.SubjectId && t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.TrialReadingCriterionId == originalTask.TrialReadingCriterionId && t.VisitTaskNum >= originalTask.VisitTaskNum)
|
||||
.AnyAsync(t => t.VisitTaskNum == task.VisitTaskNum))
|
||||
{
|
||||
//---当前为有序阅片,影像存在问题,项目组已申请回退,暂不能申请重阅
|
||||
return ResponseOutput.NotOk(_localizer["VisitTask_ImageProblem"]);
|
||||
throw new BusinessValidationFailedException(_localizer["VisitTask_ImageProblem"]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1526,7 +1526,6 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|
||||
var criterionConfig = await _trialReadingCriterionRepository.Where(x => x.Id == origenalTask.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.CriterionType, x.IsAdditionalAssessment, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
//更新申请信息
|
||||
var visitTaskReReadingAppply = await _visitTaskReReadingRepository.FirstOrDefaultAsync(t => t.Id == item.Id);
|
||||
visitTaskReReadingAppply.RequestReReadingConfirmUserId = _userInfo.Id;
|
||||
@@ -1539,6 +1538,44 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
//是否是一致性分析任务 正常申请 会影响一致性分析任务
|
||||
filterExpression = filterExpression.And(t => t.IsAnalysisCreate == origenalTask.IsAnalysisCreate);
|
||||
|
||||
//IR 申请1.1 基线重阅,影响附加评估两个IR所有的任务
|
||||
var isIR1Point1AdditionalAssessmentBaseline = false;
|
||||
|
||||
//附加评估 IR 和PM 看到的影响列表不一样
|
||||
|
||||
//1.1 有附加评估,会影响其他标准的任务
|
||||
if (criterionConfig.CriterionType == CriterionType.RECIST1Point1 && criterionConfig.IsAdditionalAssessment)
|
||||
{
|
||||
// PM申请 SPM / CPM审批
|
||||
if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.TrialGroupApply && (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM))
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId || t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB);
|
||||
}
|
||||
//IR 申请 PM审批
|
||||
else
|
||||
{
|
||||
|
||||
// 1.1 基线任务影响BM任务
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && _subjectVisitRepository.Any(t => t.Id == origenalTask.SourceSubjectVisitId && t.IsBaseLine == true))
|
||||
{
|
||||
|
||||
isIR1Point1AdditionalAssessmentBaseline = true;
|
||||
|
||||
//filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId || t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB);
|
||||
}
|
||||
// 1.1 非基线任务不影响BM任务
|
||||
else
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//默认影响的都是该标准的任务
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId);
|
||||
}
|
||||
|
||||
|
||||
if (agreeReReadingCommand.RequestReReadingResultEnum == RequestReReadingResult.Agree)
|
||||
{
|
||||
@@ -1735,43 +1772,12 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
//IR申请 PM 审批 注意这里有一致性分析的申请同意 不会回退访视,在此要生成影响的访视任务
|
||||
else if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.DocotorApply && (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.AIR))
|
||||
{
|
||||
#region 两个IR 申请同一访视,其他人的申请记录也设置为同意
|
||||
|
||||
|
||||
await _visitTaskReReadingRepository.BatchUpdateNoTrackingAsync(t => t.OriginalReReadingTask.SubjectId == origenalTask.SubjectId &&
|
||||
t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed &&
|
||||
t.RequestReReadingType == RequestReReadingType.DocotorApply &&
|
||||
t.OriginalReReadingTask.VisitTaskNum == origenalTask.VisitTaskNum &&
|
||||
t.Id != item.Id, u => new VisitTaskReReading()
|
||||
{
|
||||
RequestReReadingConfirmUserId = _userInfo.Id,
|
||||
RequestReReadingResultEnum = RequestReReadingResult.Agree,
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
//有序阅片
|
||||
if (criterionConfig.IsReadingTaskViewInOrder)
|
||||
{
|
||||
//1.1 有附加评估,会影响其他标准的任务
|
||||
if (criterionConfig.CriterionType == CriterionType.RECIST1Point1 && criterionConfig.IsAdditionalAssessment == true)
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId || t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#region 有序 IR 申请 重阅 影响的其他访视查询
|
||||
|
||||
|
||||
@@ -1795,6 +1801,17 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
)) || t.Id == origenalTask.Id)
|
||||
;
|
||||
}
|
||||
else if (isIR1Point1AdditionalAssessmentBaseline)
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.VisitTaskNum >= origenalTask.VisitTaskNum &&
|
||||
(((
|
||||
((t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) && t.DoctorUserId == origenalTask.DoctorUserId)
|
||||
// 裁判 肿瘤学是另外的医生做
|
||||
|| t.ReadingCategory == ReadingCategory.Judge
|
||||
|| t.ReadingCategory == ReadingCategory.Oncology
|
||||
) && t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId) || (t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB))
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.VisitTaskNum >= origenalTask.VisitTaskNum &&
|
||||
@@ -1883,7 +1900,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||||
{
|
||||
@@ -1899,7 +1916,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
}
|
||||
|
||||
// 影响的任务 仅仅访视类别的才生成 或者就是IR 申请的任务
|
||||
if ( influenceTask.ReadingCategory == ReadingCategory.Visit || influenceTask.Id == origenalTask.Id)
|
||||
if (influenceTask.ReadingCategory == ReadingCategory.Visit || influenceTask.Id == origenalTask.Id)
|
||||
{
|
||||
|
||||
|
||||
@@ -1912,11 +1929,11 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|
||||
|
||||
// i1.1标准 当前任务是转变任务,并且影响列表里有转变之前的任务 那么该访视任务就不生成
|
||||
if (criterionConfig.CriterionType == CriterionType.IRECIST1Point1 )
|
||||
if (criterionConfig.CriterionType == CriterionType.IRECIST1Point1)
|
||||
{
|
||||
//申请的任务是冻结的任务(该任务发生转变) 影响自己 以及转变后的 以及后续任务 但是生成的时候,仅仅生成转变之前的
|
||||
//申请的是转变之后的任务 (转变生成的任务) 影响自己以及后续任务 生成转变后的任务
|
||||
if ( influenceTask.BeforeConvertedTaskId != null && influenceTaskList.Any(t => t.Id == influenceTask.BeforeConvertedTaskId))
|
||||
if (influenceTask.BeforeConvertedTaskId != null && influenceTaskList.Any(t => t.Id == influenceTask.BeforeConvertedTaskId))
|
||||
{
|
||||
//有转化的任务 和转化之前的任务时,转化后的任务时不生成的
|
||||
continue;
|
||||
@@ -1951,7 +1968,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
newTask.SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget);
|
||||
|
||||
|
||||
if (visitTaskReReadingAppply.IsCopyOrigenalForms && influenceTask.Id==origenalTask.Id)
|
||||
if (visitTaskReReadingAppply.IsCopyOrigenalForms && influenceTask.Id == origenalTask.Id)
|
||||
{
|
||||
if (origenalTask.ReadingCategory == ReadingCategory.Visit)
|
||||
{
|
||||
@@ -2035,7 +2052,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
else
|
||||
{
|
||||
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId);
|
||||
|
||||
//1.当前任务及裁判任务
|
||||
//2.影响当前阅片人的任务
|
||||
filterExpression = filterExpression.And(t => t.Id == origenalTask.Id || t.Id == origenalTask.JudgeVisitTaskId);
|
||||
@@ -2094,7 +2111,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
newTask.TaskAllocationState = TaskAllocationState.Allocated;
|
||||
newTask.AllocateTime = DateTime.Now;
|
||||
newTask.SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget);
|
||||
|
||||
|
||||
|
||||
//裁判任务 需要进行特殊处理 在重阅逻辑里面处理
|
||||
|
||||
@@ -2113,7 +2130,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|
||||
_ = _readingTaskQuestionAnswerRepository.AddRangeAsync(list).Result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
//拷贝后续表单
|
||||
@@ -2205,7 +2222,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|
||||
var task = (await _visitTaskRepository.Where(t => t.Id == taskId).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == task.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.CriterionType, x.IsAutoCreate, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == task.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.CriterionType, x.IsAutoCreate, x.IsAdditionalAssessment, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
if (criterionConfig.IsAutoCreate == false)
|
||||
{
|
||||
@@ -2234,6 +2251,21 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
}
|
||||
|
||||
Expression<Func<VisitTask, bool>> filterExpression = t => t.TrialId == trialId && t.SubjectId == task.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) && t.TaskAllocationState == TaskAllocationState.Allocated;
|
||||
|
||||
|
||||
if (criterionConfig.CriterionType == CriterionType.RECIST1Point1 && criterionConfig.IsAdditionalAssessment)
|
||||
{
|
||||
//影像退回,必定影响两个标准的任务
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == task.TrialReadingCriterionId || t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//默认影响的都是该标准的任务
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == task.TrialReadingCriterionId);
|
||||
}
|
||||
|
||||
//PM 才允许操作
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager)
|
||||
{
|
||||
@@ -2458,7 +2490,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|
||||
|
||||
//BM后续访视 ,筛选状态不变,任务生成状态重置(实际该访视任务状态 可能是重阅重置了或者失效了,需要后续生成,或者取消分配了,需要后续重新分配)
|
||||
await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB && t.SubjectVisit.SubjectId == task.SubjectId && otherVisitIdList.Contains(t.SubjectVisitId),
|
||||
await _subjectCriteriaEvaluationVisitFilterRepository.UpdatePartialFromQueryAsync(t => t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB && t.SubjectVisit.SubjectId == task.SubjectId && otherVisitIdList.Contains(t.SubjectVisitId),
|
||||
t => new SubjectCriteriaEvaluationVisitFilter()
|
||||
{
|
||||
IsGeneratedTask = false
|
||||
@@ -2564,6 +2596,49 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|
||||
filterExpression = filterExpression.And(t => t.IsAnalysisCreate == filterObj.IsAnalysisCreate);
|
||||
|
||||
//IR 申请1.1 基线重阅,影响附加评估所有的任务
|
||||
var isIR1Point1AdditionalAssessmentBaseline = false;
|
||||
|
||||
//附加评估 IR 和PM 看到的影响列表不一样
|
||||
if (criterionConfig.CriterionType == CriterionType.RECIST1Point1 && criterionConfig.IsAdditionalAssessment)
|
||||
{
|
||||
|
||||
// IR 申请 PM 同意
|
||||
if (((_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.IndependentReviewer))
|
||||
|| (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer && applyId == null)))
|
||||
{
|
||||
|
||||
// 1.1 基线任务影响BM任务
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && _subjectVisitRepository.Any(t=>t.Id==filterObj.SourceSubjectVisitId && t.IsBaseLine==true))
|
||||
{
|
||||
|
||||
isIR1Point1AdditionalAssessmentBaseline=true;
|
||||
//filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId || t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB);
|
||||
|
||||
|
||||
}
|
||||
// 1.1 非基线任务不影响BM任务
|
||||
else
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId);
|
||||
}
|
||||
|
||||
}
|
||||
//(1、PM回退,PM申请重阅,SPM同意回退)
|
||||
else
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId || t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//默认影响的都是该标准的任务
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//重阅影响
|
||||
if (isReReading)
|
||||
{
|
||||
@@ -2576,30 +2651,10 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|| (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer && applyId == null))
|
||||
{
|
||||
|
||||
//附加评估 IR 和PM 看到的影响列表不一样
|
||||
if (criterionConfig.CriterionType == CriterionType.RECIST1Point1 && criterionConfig.IsAdditionalAssessment)
|
||||
{
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager)
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId || t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB);
|
||||
}
|
||||
else
|
||||
{
|
||||
//当前任务及其之后的所有访视任务、全局任务、裁判任务、肿瘤学阅片任务
|
||||
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//默认影响的都是该标准的任务
|
||||
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId);
|
||||
}
|
||||
|
||||
|
||||
//当前任务及其之后的所有访视任务、全局任务、裁判任务、肿瘤学阅片任务
|
||||
|
||||
//有序
|
||||
if (criterionConfig.IsReadingTaskViewInOrder)
|
||||
//有序
|
||||
if (criterionConfig.IsReadingTaskViewInOrder)
|
||||
{
|
||||
|
||||
switch (filterObj.ReadingCategory)
|
||||
@@ -2608,11 +2663,6 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
//影响当前医生 以及当前医生之后的 1、访视任务 已经读完的
|
||||
//2、后续任务如果是全局、肿瘤学阅片任务,状态为阅片完成标记为重阅重置;若在阅片中,则标记为失效;若为待阅片,则标记为失效;
|
||||
//3、当前任务、后续访视任务或者全局任务触发了裁判任务,若裁判任务状态为阅片完成,则标记为重阅重置;若在阅片中或待阅片,则标记为失效
|
||||
// filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum &&
|
||||
//((t.DoctorUserId == filterObj.DoctorUserId && ((t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned) || t.ReadingCategory == ReadingCategory.Global))
|
||||
// ||
|
||||
// t.ReadingCategory == ReadingCategory.Judge || t.ReadingCategory == ReadingCategory.Oncology)
|
||||
// );
|
||||
|
||||
//申请的是转化的,那么影响列表要排除转化之前的
|
||||
if (criterionConfig.CriterionType == CriterionType.IRECIST1Point1 && filterObj.BeforeConvertedTaskId != null)
|
||||
@@ -2628,6 +2678,18 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
)) || t.Id == filterObj.Id)
|
||||
;
|
||||
}
|
||||
// IR 申请1.1 基线重阅,影响附加评估所有的任务
|
||||
else if (isIR1Point1AdditionalAssessmentBaseline)
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum &&
|
||||
(((
|
||||
((t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) && t.DoctorUserId == filterObj.DoctorUserId)
|
||||
// 裁判 肿瘤学是另外的医生做
|
||||
|| t.ReadingCategory == ReadingCategory.Judge
|
||||
|| t.ReadingCategory == ReadingCategory.Oncology
|
||||
)&& t.TrialReadingCriterionId==filterObj.TrialReadingCriterionId )||( t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB))
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum &&
|
||||
@@ -2706,6 +2768,10 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
else if (((_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM) && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.ProjectManager) && filterObj.IsAnalysisCreate == false && filterObj.ReadingCategory == ReadingCategory.Visit)
|
||||
|| (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && applyId == null))
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
//有序
|
||||
if (criterionConfig.IsReadingTaskViewInOrder)
|
||||
{
|
||||
|
||||
@@ -144,6 +144,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public string Value { get; set; } = string.Empty;
|
||||
public string ValueCN { get; set; } = string.Empty;
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public string DescriptionCN { get; set; } = string.Empty;
|
||||
public DateTime CreateTime { get; set; }
|
||||
public Guid CreateUserId { get; set; }
|
||||
public DateTime UpdateTime { get; set; }
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-01 13:38:20
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.Collections.Generic;
|
||||
namespace IRaCIS.Core.Application.ViewModel
|
||||
{
|
||||
/// <summary> InternationalizationView 列表视图模型 </summary>
|
||||
public class InternationalizationView
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public int ShowOrder { get; set; }
|
||||
public Guid CreateUserId { get; set; }
|
||||
public DateTime CreateTime { get; set; }
|
||||
public DateTime UpdateTime { get; set; }
|
||||
public Guid UpdateUserId { get; set; }
|
||||
public int State { get; set; }
|
||||
public string FolderPath { get; set; }
|
||||
public string Code { get; set; }
|
||||
public string Value { get; set; }
|
||||
public string ValueCN { get; set; }
|
||||
}
|
||||
|
||||
///<summary>InternationalizationQuery 列表查询参数模型</summary>
|
||||
public class InternationalizationQuery:PageInput
|
||||
{
|
||||
|
||||
public string? FolderPath { get; set; }
|
||||
public string? Code { get; set; }
|
||||
public string? Value { get; set; }
|
||||
|
||||
public string? ValueCN { get; set; }
|
||||
|
||||
}
|
||||
|
||||
///<summary> InternationalizationAddOrEdit 列表查询参数模型</summary>
|
||||
public class InternationalizationAddOrEdit
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
public int State { get; set; }
|
||||
public string FolderPath { get; set; }
|
||||
public string Code { get; set; }
|
||||
public string Value { get; set; }
|
||||
public string ValueCN { get; set; }
|
||||
|
||||
public int InternationalizationType { get; set; }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
using DocumentFormat.OpenXml.Office2010.ExcelAc;
|
||||
using DocumentFormat.OpenXml.Presentation;
|
||||
using DocumentFormat.OpenXml.Spreadsheet;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Contracts.DTO;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
@@ -28,9 +30,167 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
public class ExcelExportService : BaseService
|
||||
{
|
||||
|
||||
|
||||
#region 后续需要移动过来
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 项目参与人员导出
|
||||
/// </summary>
|
||||
/// <param name="param"></param>
|
||||
/// <param name="_commonDocumentRepository"></param>
|
||||
/// <param name="_dictionaryService"></param>
|
||||
/// <param name="_trialRepository"></param>
|
||||
/// <param name="_trialUseRepository"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public async Task<IActionResult> TrialUserListExport(TrialMaintenanceExportQuery param,
|
||||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||||
[FromServices] IDictionaryService _dictionaryService,
|
||||
[FromServices] IRepository<Trial> _trialRepository,
|
||||
[FromServices] IRepository<TrialUser> _trialUseRepository
|
||||
|
||||
)
|
||||
{
|
||||
|
||||
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_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<TrialMaintenanceDTO>(_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));
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Site用户列表导出
|
||||
/// </summary>
|
||||
/// <param name="param"></param>
|
||||
/// <param name="_commonDocumentRepository"></param>
|
||||
/// <param name="_dictionaryService"></param>
|
||||
/// <param name="_trialRepository"></param>
|
||||
/// <param name="_trialSiteUserRepository"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public async Task<IActionResult> TrialSiteUserListExport(SiteCRCExportQueryDTO param,
|
||||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||||
[FromServices] IDictionaryService _dictionaryService,
|
||||
[FromServices] IRepository<Trial> _trialRepository,
|
||||
[FromServices] IRepository<TrialSiteUser> _trialSiteUserRepository
|
||||
)
|
||||
{
|
||||
|
||||
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = await _trialSiteUserRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
||||
.WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.SiteName), t => t.Site.SiteName.Contains(param.SiteName))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteAliasName),
|
||||
t => t.TrialSite.TrialSiteAliasName.Contains(param.TrialSiteAliasName))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteCode),
|
||||
t => t.TrialSite.TrialSiteCode.Contains(param.TrialSiteCode))
|
||||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator,
|
||||
t => t.UserId == _userInfo.Id)
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserKeyInfo), t => (t.User.FullName).Contains(param.UserKeyInfo)
|
||||
|| t.User.UserName.Contains(param.UserKeyInfo) || t.User.EMail.Contains(param.UserKeyInfo))
|
||||
|
||||
.ProjectTo<SiteUserExportDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SiteUserExportDTO));
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Site用户汇总表导出
|
||||
/// </summary>
|
||||
/// <param name="queryParam"></param>
|
||||
/// <param name="_commonDocumentRepository"></param>
|
||||
/// <param name="_trialSiteSurveyRepository"></param>
|
||||
/// <param name="_trialSiteUserSurveyRepository"></param>
|
||||
/// <param name="_trialRepository"></param>
|
||||
/// <param name="_dictionaryService"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public async Task<IActionResult> TrialSiteUserSummaryListExport(TrialSiteUserSurveyExportQueryDto queryParam,
|
||||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||||
[FromServices] IRepository<TrialSiteSurvey> _trialSiteSurveyRepository,
|
||||
[FromServices] IRepository<TrialSiteUserSurvey> _trialSiteUserSurveyRepository,
|
||||
[FromServices] IRepository<Trial> _trialRepository,
|
||||
[FromServices] IDictionaryService _dictionaryService
|
||||
)
|
||||
{
|
||||
|
||||
var data = (await _trialRepository.Where(t => t.Id == queryParam.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
var groupSelectIdQuery =
|
||||
_trialSiteSurveyRepository.Where(t => t.TrialId == queryParam.TrialId)
|
||||
.WhereIf(queryParam.SiteId != null, t => t.SiteId == queryParam.SiteId)
|
||||
.WhereIf(!string.IsNullOrEmpty(queryParam.FormWriterKeyInfo), t => (t.UserName).Contains(queryParam.FormWriterKeyInfo) || t.Email.Contains(queryParam.FormWriterKeyInfo) || t.Phone.Contains(queryParam.FormWriterKeyInfo))
|
||||
.GroupBy(t => t.SiteId)
|
||||
.Select(g => g.OrderByDescending(u => u.CreateTime).Select(t => t.Id).First());
|
||||
|
||||
|
||||
var query = _trialSiteUserSurveyRepository
|
||||
.Where(t => groupSelectIdQuery.Contains(t.TrialSiteSurveyId))
|
||||
.WhereIf(queryParam.UserTypeId != null, t => t.UserTypeId == queryParam.UserTypeId)
|
||||
.WhereIf(queryParam.IsGenerateAccount != null, t => t.IsGenerateAccount == queryParam.IsGenerateAccount)
|
||||
.WhereIf(queryParam.TrialRoleNameId != null, t => t.TrialRoleNameId == queryParam.TrialRoleNameId)
|
||||
.WhereIf(queryParam.State != null && queryParam.State != TrialSiteUserStateEnum.OverTime, t => t.InviteState == queryParam.State)
|
||||
.WhereIf(queryParam.State != null && queryParam.State == TrialSiteUserStateEnum.OverTime, t => t.InviteState == TrialSiteUserStateEnum.HasSend && t.ExpireTime < DateTime.Now)
|
||||
.WhereIf(!string.IsNullOrEmpty(queryParam.UserName), t => (t.LastName + " / " + t.FirstName).Contains(queryParam.UserName))
|
||||
.WhereIf(!string.IsNullOrEmpty(queryParam.OrganizationName), t => t.OrganizationName.Contains(queryParam.OrganizationName))
|
||||
.ProjectTo<TrialSiteUserSummaryDto>(_mapper.ConfigurationProvider);
|
||||
|
||||
data.List = await query.ToListAsync();
|
||||
|
||||
|
||||
|
||||
var exportInfo = data;
|
||||
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserSummary_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialSiteUserSummaryDto));
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#region 导表查询
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 影像上传列表 只导出已上传状态的访视记录
|
||||
/// </summary>
|
||||
@@ -72,7 +232,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == visitSearchDTO.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialCRCUploadImageList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO));
|
||||
@@ -122,6 +282,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == challengeQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialQCImageChanllengeList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(QCChanllengeExportDto));
|
||||
}
|
||||
@@ -158,8 +319,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository , _hostEnvironment, _dictionaryService, typeof(SubjectExportDTO));
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectExportDTO));
|
||||
|
||||
}
|
||||
|
||||
@@ -235,15 +397,15 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
IsFinalVisit = t.IsFinalVisit,
|
||||
IsLostVisit = t.IsLostVisit,
|
||||
ReadingStatus =
|
||||
t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId==dto.TrialReadingCriterionId && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ?
|
||||
t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ?
|
||||
ReadingStatusEnum.ReadCompleted : t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.TaskAllocationState == TaskAllocationState.Allocated).Count() == (int)trialReadingCriterion.ReadingType ? ReadingStatusEnum.ImageReading :
|
||||
t.ReadingStatus
|
||||
}).ToList(),
|
||||
|
||||
ModuleList = subject.ReadModuleList.Where(t=>t.TrialReadingCriterionId==dto.TrialReadingCriterionId).Select(t => new SubjectProgressDto.MouduleProgress()
|
||||
ModuleList = subject.ReadModuleList.Where(t => t.TrialReadingCriterionId == dto.TrialReadingCriterionId).Select(t => new SubjectProgressDto.MouduleProgress()
|
||||
{
|
||||
TaskName = t.ModuleName,
|
||||
VisitTaskNum = (t.ReadingSetType == ReadingSetType.ImageReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : ReadingCommon.TaskNumDic[ReadingCategory.Oncology]) + t.SubjectVisit.VisitNum,
|
||||
VisitTaskNum = (t.ReadingSetType == ReadingSetType.ImageReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : ReadingCommon.TaskNumDic[ReadingCategory.Oncology]) + t.SubjectVisit.VisitNum,
|
||||
ReadingSetType = t.ReadingSetType,
|
||||
ReadingStatus = t.ModuleTaskList.Where(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && (t.ReadingCategory == ReadingCategory.Oncology || t.ReadingCategory == ReadingCategory.Global) && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ?
|
||||
ReadingStatusEnum.ReadCompleted : t.ModuleTaskList.Where(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && (t.ReadingCategory == ReadingCategory.Oncology || t.ReadingCategory == ReadingCategory.Global) && t.TaskAllocationState == TaskAllocationState.Allocated).Count() == (int)trialReadingCriterion.ReadingType ?
|
||||
@@ -262,9 +424,10 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == dto.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t=>t.CriterionName).FirstOrDefaultAsync();
|
||||
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.TrialSubjectProgressList_Export, exportInfo, /*"", */_commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectProgressDto));
|
||||
|
||||
@@ -334,7 +497,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
|
||||
return new FileStreamResult(memoryStream2, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||
{
|
||||
FileDownloadName = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}_{fileName.Substring(startIndex: 0, fileName.LastIndexOf('.'))}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
|
||||
FileDownloadName = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}_{fileName/*.Substring(startIndex: 0, fileName.LastIndexOf('.'))*/}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
|
||||
};
|
||||
|
||||
}
|
||||
@@ -385,7 +548,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
|
||||
UploadFinishedTime = t.UploadFinishedTime,
|
||||
|
||||
ArchiveFinishedTime=t.ArchiveFinishedTime,
|
||||
ArchiveFinishedTime = t.ArchiveFinishedTime,
|
||||
|
||||
|
||||
UploadTime = t.CreateTime,
|
||||
@@ -404,6 +567,8 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == studyQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyUploadMonitor_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyMonitorExportDto));
|
||||
|
||||
@@ -438,6 +603,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectReadingPeriodList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadPeriodExportDto));
|
||||
|
||||
@@ -526,6 +692,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == studyQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyExportDTO));
|
||||
}
|
||||
@@ -564,6 +731,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == checkQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectVisitCheckList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PMKCheckEXportDTO));
|
||||
}
|
||||
@@ -614,6 +782,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadingTaskExportDto));
|
||||
}
|
||||
@@ -664,6 +833,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReReadingTaskExportDto));
|
||||
}
|
||||
@@ -705,6 +875,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialMedicalReviewList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TaskMedicalReviewExportDto));
|
||||
}
|
||||
@@ -738,7 +909,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var subjectQuerybal = _repository.Where<VisitTask>(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsSelfAnalysis == true).Select(t => t.SubjectId).Distinct();
|
||||
|
||||
var allList = await _repository.Where<VisitTask>(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) //一致性分析的结果 + 正常任务的结果 + 仅仅访视的结果 +去除基线
|
||||
.Where(t => (t.IsSelfAnalysis == true || t.IsSelfAnalysis == null) && t.VisitTaskNum > 0) //一致性分析的结果 + 正常任务的结果 + 仅仅访视的结果 +去除基线
|
||||
|
||||
//.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId)
|
||||
//.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState)
|
||||
@@ -788,6 +959,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
|
||||
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSelfAnalysisList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SelftAnalysisExport));
|
||||
}
|
||||
@@ -812,7 +984,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
|
||||
if (criterion.CriterionType != CriterionType.RECIST1Point1)
|
||||
{
|
||||
//---当前标准导出还未支持
|
||||
//---当前标准导出还未支持
|
||||
throw new Exception(_localizer["ExcelExport_UnsupportedExport"]);
|
||||
}
|
||||
|
||||
@@ -891,6 +1063,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
||||
exportInfo.List = newList;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialGroupAnalysisList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(GroupAnalysisExport));
|
||||
}
|
||||
@@ -938,7 +1111,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion });
|
||||
}
|
||||
|
||||
if(criterion.CriterionType == CriterionType.PCWG3)
|
||||
if (criterion.CriterionType == CriterionType.PCWG3)
|
||||
{
|
||||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation });
|
||||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion });
|
||||
@@ -950,9 +1123,37 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
{
|
||||
item.FileName = result.Where(t => t.Code == item.Code).FirstOrDefault()?.FileName;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<T> DealJudgeMark<T>(ArbitrationRule arbitrationRule, IEnumerable<T> list) where T : OverallTumorEvaluationExport
|
||||
{
|
||||
//处理裁判标记
|
||||
|
||||
{
|
||||
var resultList = list.Where(t => t.ReadingCategory != ReadingCategory.Judge).ToList();
|
||||
|
||||
if (arbitrationRule == ArbitrationRule.Visit)
|
||||
{
|
||||
|
||||
foreach (var item in resultList)
|
||||
{
|
||||
item.IsGenerateJudge = list.FirstOrDefault(t => t.ReadingCategory == ReadingCategory.Judge && t.SubjectCode == item.SubjectCode
|
||||
&& (t.VisitTaskNum - ReadingCommon.TaskNumDic[ReadingCategory.Judge]) == item.VisitTaskNum)?.JudgeArmEnum == item.ArmEnum ? true : false;
|
||||
}
|
||||
|
||||
}
|
||||
if (arbitrationRule == ArbitrationRule.Reading)
|
||||
{
|
||||
foreach (var item in resultList)
|
||||
{
|
||||
item.IsGenerateJudge = list.Where(t => t.ReadingCategory == ReadingCategory.Judge && t.SubjectCode == item.SubjectCode && t.VisitTaskNum>item.VisitTaskNum
|
||||
).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault()?.JudgeArmEnum == item.ArmEnum ? true : false;
|
||||
}
|
||||
}
|
||||
|
||||
return resultList;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -976,11 +1177,11 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
|
||||
|
||||
//每次查询必须是单标准的
|
||||
var criterion = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync();
|
||||
var criterion = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync();
|
||||
|
||||
if (criterion.CriterionType != CriterionType.RECIST1Point1 && criterion.CriterionType != CriterionType.PCWG3)
|
||||
{
|
||||
//---当前标准导出还未支持
|
||||
//---当前标准导出还未支持
|
||||
throw new Exception(_localizer["ExcelExport_UnsupportedExport"]);
|
||||
}
|
||||
|
||||
@@ -1006,12 +1207,16 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
.WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1))
|
||||
.ProjectTo<OverallTumorEvaluationExport>(_mapper.ConfigurationProvider, new { criterionType = criterion.CriterionType }).ToListAsync();
|
||||
|
||||
list= list.OrderBy(t=>t.SubjectCode).ThenBy(t=>t.VisitTaskNum).ToList();
|
||||
list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.VisitTaskNum).ToList();
|
||||
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
exportInfo.CriterionName = criterion.CriterionName;
|
||||
|
||||
//处理裁判标记
|
||||
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.OverallTumorEvaluation_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(OverallTumorEvaluationExport), criterion.CriterionType);
|
||||
@@ -1034,7 +1239,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
{
|
||||
|
||||
//每次查询必须是单标准的
|
||||
var criterion = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName} ).FirstOrDefaultAsync();
|
||||
var criterion = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstOrDefaultAsync();
|
||||
|
||||
var query = _repository.Where<VisitTask>(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||||
|
||||
@@ -1064,14 +1269,21 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
{
|
||||
var list = await query.ProjectTo<RECIST1Point1EvaluationOfTumorEfficacyExport>(_mapper.ConfigurationProvider, new { criterionType = criterion.CriterionType }).ToListAsync();
|
||||
|
||||
list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.VisitTaskNum).ToList();
|
||||
|
||||
//处理裁判标记
|
||||
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
||||
|
||||
exportInfo.List = list;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1EvaluationOfTumorEfficacyExport), criterion.CriterionType);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
//---当前标准导出还未支持
|
||||
//---当前标准导出还未支持
|
||||
throw new Exception(_localizer["ExcelExport_UnsupportedExport"]);
|
||||
}
|
||||
|
||||
@@ -1095,7 +1307,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
{
|
||||
|
||||
//每次查询必须是单标准的
|
||||
var criterion = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstOrDefaultAsync();
|
||||
var criterion = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName,t.ArbitrationRule }).FirstOrDefaultAsync();
|
||||
|
||||
var query = _repository.Where<VisitTask>(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||||
|
||||
@@ -1125,6 +1337,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
{
|
||||
var list = await query.ProjectTo<RECIST1Point1DetailedOfEvaluatedLesionExport>(_mapper.ConfigurationProvider, new { criterionType = criterion.CriterionType, isEn_Us = _userInfo.IsEn_Us }).ToListAsync();
|
||||
|
||||
list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.VisitTaskNum).ToList();
|
||||
|
||||
var exportList = list.SelectMany(c =>
|
||||
{
|
||||
@@ -1150,7 +1363,10 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
});
|
||||
}).ToList();
|
||||
|
||||
//处理裁判标记
|
||||
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
||||
exportInfo.List = exportList;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1DetailedOfEvaluatedLesionExport), criterion.CriterionType);
|
||||
|
||||
@@ -1180,7 +1396,10 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
});
|
||||
}).ToList();
|
||||
|
||||
//处理裁判标记
|
||||
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
||||
exportInfo.List = exportList;
|
||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PCWG3DetailedOfEvaluatedLesionExport), criterion.CriterionType);
|
||||
|
||||
@@ -1188,7 +1407,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
|
||||
else
|
||||
{
|
||||
//---当前标准导出还未支持
|
||||
//---当前标准导出还未支持
|
||||
throw new Exception(_localizer["ExcelExport_UnsupportedExport"]);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-01 13:38:06
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
namespace IRaCIS.Core.Application.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// IInternationalizationService
|
||||
/// </summary>
|
||||
public interface IInternationalizationService
|
||||
{
|
||||
|
||||
Task<PageOutput<InternationalizationView>> GetInternationalizationList(InternationalizationQuery inQuery);
|
||||
|
||||
Task<IResponseOutput> AddOrUpdateInternationalization(InternationalizationAddOrEdit addOrEditInternationalization);
|
||||
|
||||
Task<IResponseOutput> DeleteInternationalization(Guid internationalizationId);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-01 13:42:25
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
/// <summary>
|
||||
/// InternationalizationService
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "Common")]
|
||||
public class InternationalizationService : BaseService, IInternationalizationService
|
||||
{
|
||||
|
||||
private readonly IRepository<Internationalization> _internationalizationRepository;
|
||||
|
||||
public InternationalizationService(IRepository<Internationalization> internationalizationRepository)
|
||||
{
|
||||
_internationalizationRepository = internationalizationRepository;
|
||||
}
|
||||
|
||||
public async Task<PageOutput<InternationalizationView>> GetInternationalizationList(InternationalizationQuery inQuery)
|
||||
{
|
||||
|
||||
var internationalizationQueryable =_internationalizationRepository
|
||||
.WhereIf(inQuery.FolderPath!=null,t=>t.FolderPath.Contains(inQuery.FolderPath))
|
||||
.WhereIf(inQuery.Code != null, t => t.FolderPath.Contains(inQuery.Code))
|
||||
.WhereIf(inQuery.Value != null, t => t.FolderPath.Contains(inQuery.Value))
|
||||
.WhereIf(inQuery.ValueCN != null, t => t.FolderPath.Contains(inQuery.ValueCN))
|
||||
.ProjectTo<InternationalizationView>(_mapper.ConfigurationProvider);
|
||||
|
||||
var pageList = await internationalizationQueryable
|
||||
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? "Id" : inQuery.SortField,
|
||||
inQuery.Asc);
|
||||
|
||||
return pageList;
|
||||
}
|
||||
|
||||
|
||||
public async Task<IResponseOutput> AddOrUpdateInternationalization(InternationalizationAddOrEdit addOrEditInternationalization)
|
||||
{
|
||||
var verifyExp1 = new EntityVerifyExp<Internationalization>()
|
||||
{
|
||||
VerifyExp = t => t.Code == addOrEditInternationalization.Code && t.InternationalizationType == addOrEditInternationalization.InternationalizationType,
|
||||
|
||||
VerifyMsg = $"该类型已有{addOrEditInternationalization.Code}名称的国际化标识",
|
||||
IsVerify = true
|
||||
};
|
||||
|
||||
var entity = await _internationalizationRepository.InsertOrUpdateAsync(addOrEditInternationalization, true,verifyExp1);
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
}
|
||||
|
||||
|
||||
[HttpDelete("{internationalizationId:guid}")]
|
||||
public async Task<IResponseOutput> DeleteInternationalization(Guid internationalizationId)
|
||||
{
|
||||
var success = await _internationalizationRepository.DeleteFromQueryAsync(t => t.Id == internationalizationId, true);
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ using System.Text.Encodings.Web;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service.Common
|
||||
{
|
||||
@@ -45,9 +46,6 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public string GetBestStoreDisk()
|
||||
{
|
||||
|
||||
@@ -64,11 +62,12 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
throw new BusinessValidationFailedException("解析Json文件配置出现问题:"+e.Message);
|
||||
//---解析Json文件配置出现问题
|
||||
throw new BusinessValidationFailedException(_localizer["SysMon_JsonConfig"]+e.Message);
|
||||
}
|
||||
|
||||
//默认存储的路径
|
||||
var defaultStoreRootFolder = Path.Combine((Directory.GetParent(_hostEnvironment.ContentRootPath.TrimEnd('\\'))).IfNullThrowException().FullName, StaticData.Folder.IRaCISDataFolder);
|
||||
var defaultStoreRootFolder = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);
|
||||
|
||||
|
||||
DriveInfo defaultDrive = new DriveInfo(Path.GetPathRoot(defaultStoreRootFolder));
|
||||
@@ -95,14 +94,13 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
}
|
||||
|
||||
|
||||
//找到最优驱动器
|
||||
DriveInfo drive = new DriveInfo(Path.GetPathRoot(bestStoreRootFolder));
|
||||
////找到最优驱动器
|
||||
//DriveInfo drive = new DriveInfo(Path.GetPathRoot(bestStoreRootFolder));
|
||||
|
||||
//最优盘符使用率超过百分之80
|
||||
if (((double)(drive.TotalSize - drive.TotalFreeSpace) / drive.TotalSize) * 100 > switchingRatio)
|
||||
{
|
||||
|
||||
}
|
||||
////最优盘符使用率超过百分之80
|
||||
//if (((double)(drive.TotalSize - drive.TotalFreeSpace) / drive.TotalSize) * 100 > switchingRatio)
|
||||
//{
|
||||
//}
|
||||
|
||||
if (!Directory.Exists(bestStoreRootFolder))
|
||||
{
|
||||
@@ -112,6 +110,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||
return bestStoreRootFolder;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class GeneralRule
|
||||
{
|
||||
public string Endpoint { get; set; }
|
||||
|
||||
@@ -54,7 +54,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
CreateMap<CommonDocument, CommonDocumentAddOrEdit>().ReverseMap();
|
||||
|
||||
|
||||
CreateMap<Internationalization, InternationalizationView>();
|
||||
CreateMap<Internationalization, InternationalizationAddOrEdit>().ReverseMap();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -67,9 +67,9 @@ namespace IRaCIS.Application.Services
|
||||
ReviewerSelectionQueryDTO selectionQuery)
|
||||
{
|
||||
//项目配置需要的医生过滤 2表示混合
|
||||
var trialConfig = await _repository.Where<Trial>(s => s.Id == selectionQuery.TrialId).Select(t=>new { t.AttendedReviewerType ,t.TrialType} ).FirstOrDefaultAsync().IfNullThrowException();
|
||||
var trialConfig = await _repository.Where<Trial>(s => s.Id == selectionQuery.TrialId).Select(t=>new { t.AttendedReviewerTypeEnumList ,t.TrialType} ).FirstOrDefaultAsync().IfNullThrowException();
|
||||
|
||||
var nation = trialConfig.AttendedReviewerType;
|
||||
//var nation = trialConfig.AttendedReviewerType;
|
||||
// 临床项目经验 多选
|
||||
var evaluationCriteriaCount = selectionQuery.EvaluationCriteriaIdList.Count();
|
||||
|
||||
@@ -78,7 +78,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
var guidList = selectionQuery.ReadingTypeIdList.Concat(selectionQuery.SubspecialityIdList).Concat(selectionQuery.TitleIdList);
|
||||
|
||||
var query = _doctorRepository.WhereIf(nation != AttendedReviewerType.USAndCN, t => t.Nation ==(int) nation)
|
||||
var query = _doctorRepository/*.WhereIf(nation != AttendedReviewerType.USAndCN, t => t.Nation ==(int) nation)*/
|
||||
|
||||
.WhereIf(selectionQuery.DepartmentId != null, t => t.DepartmentId == selectionQuery.DepartmentId)
|
||||
.WhereIf(selectionQuery.SpecialityId != null, t => t.SpecialityId == selectionQuery.SpecialityId)
|
||||
.WhereIf(trialConfig.TrialType == TrialType.NoneOfficial, t => t.IsVirtual ==true)
|
||||
@@ -161,6 +162,10 @@ namespace IRaCIS.Application.Services
|
||||
u.OptTime = opt.OptTime;
|
||||
u.OptUserName = opt.OptUserName;
|
||||
}
|
||||
else
|
||||
{
|
||||
u.DoctorTrialState = param.IntoGroupSearchState == 1 ? (int)EnrollStatus.HasDownloadResume : (int)EnrollStatus.HasCommittedToCRO;
|
||||
}
|
||||
});
|
||||
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM)
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
Task<(PageOutput<UnionDocumentWithConfirmInfoView>, object)> GetDocumentConfirmList(DocumentTrialUnionQuery querySystemDocument);
|
||||
Task<PageOutput<TrialDocumentView>> GetTrialDocumentList(TrialDocumentQuery queryTrialDocument);
|
||||
|
||||
Task<(PageOutput<UnionDocumentWithConfirmInfoView>, object)> GetUserDocumentList(TrialUserDocUnionQuery querySystemDocument);
|
||||
Task<IResponseOutput<PageOutput<UnionDocumentWithConfirmInfoView>> > GetUserDocumentList(TrialUserDocUnionQuery querySystemDocument);
|
||||
Task<IResponseOutput> SetFirstViewDocumentTime(Guid documentId, bool isSystemDoc);
|
||||
Task<IResponseOutput> UserConfirm(UserConfirmCommand userConfirmCommand);
|
||||
Task<List<TrialUserDto>> GetTrialUserSelect(Guid trialId);
|
||||
|
||||
@@ -27,11 +27,16 @@ namespace IRaCIS.Core.Application.Services
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
private readonly IRepository<SystemDocConfirmedUser> _systemDocConfirmedUserRepository;
|
||||
private readonly IRepository<SystemDocument> _systemDocumentRepository;
|
||||
private readonly IRepository<TrialCriterionAdditionalAssessmentType> _trialCriterionAdditionalAssessmentTypeRepository;
|
||||
private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository;
|
||||
|
||||
|
||||
public TrialDocumentService(IRepository<TrialDocument> trialDocumentRepository,
|
||||
IRepository<TrialDocConfirmedUser> trialDocUserTypeConfirmedUserRepository,
|
||||
IRepository<Trial> trialRepository,
|
||||
IRepository<SystemDocConfirmedUser> systemDocConfirmedUserRepository
|
||||
IRepository<SystemDocConfirmedUser> systemDocConfirmedUserRepository,
|
||||
IRepository<TrialCriterionAdditionalAssessmentType> trialCriterionAdditionalAssessmentTypeRepository,
|
||||
IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository
|
||||
, IRepository<SystemDocument> systemDocumentRepository)
|
||||
{
|
||||
_trialDocumentRepository = trialDocumentRepository;
|
||||
@@ -39,6 +44,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
this._trialRepository = trialRepository;
|
||||
this._systemDocConfirmedUserRepository = systemDocConfirmedUserRepository;
|
||||
_systemDocumentRepository = systemDocumentRepository;
|
||||
_readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
|
||||
_trialCriterionAdditionalAssessmentTypeRepository = trialCriterionAdditionalAssessmentTypeRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -66,7 +73,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
/// <param name="querySystemDocument"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<(PageOutput<UnionDocumentWithConfirmInfoView>,object)> GetUserDocumentList(TrialUserDocUnionQuery querySystemDocument)
|
||||
public async Task< IResponseOutput<PageOutput<UnionDocumentWithConfirmInfoView>> > GetUserDocumentList(TrialUserDocUnionQuery querySystemDocument)
|
||||
{
|
||||
#region https://github.com/dotnet/efcore/issues/16243 操作不行
|
||||
////系统文档查询
|
||||
@@ -128,6 +135,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
#endregion
|
||||
|
||||
var trialId = querySystemDocument.TrialId;
|
||||
|
||||
var trialInfo = await (_repository.Where<Trial>(t => t.Id == querySystemDocument.TrialId).Select(t => new { t.TrialFinishedTime,t.TrialStatusStr } ).FirstOrDefaultAsync());
|
||||
|
||||
//系统文档查询
|
||||
@@ -218,7 +227,15 @@ namespace IRaCIS.Core.Application.Services
|
||||
var trialTaskConfig = _trialRepository.Where(t => t.Id == querySystemDocument.TrialId).ProjectTo<TrialProcessConfigDTO>(_mapper.ConfigurationProvider).FirstOrDefault();
|
||||
|
||||
|
||||
return (result, new { NeedSignCount = needSignTrialDocCount + needSignSystemDocCount, NeedSignTrialDocCount = needSignTrialDocCount, NeedSignSystemDocCount = needSignSystemDocCount, TrialStatusStr= trialInfo.TrialStatusStr,TrialConfig= trialTaskConfig });
|
||||
//var trialCriterionAdditionalAssessmentTypeList = _trialCriterionAdditionalAssessmentTypeRepository
|
||||
// .Where(t => t.TrialReadingCriterion.TrialId == trialId && t.IsSelected == true && t.TrialReadingCriterion.IsSigned).Select(t=>new { t.CriterionType,t.AdditionalAssessmentType}).ToList();
|
||||
|
||||
|
||||
var isManualGenerateTask= _readingQuestionCriterionTrialRepository.Where(t=>t.TrialId==trialId && t.IsSigned && t.IsAutoCreate==false).Any();
|
||||
var isAdditionalAssessment = _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == trialId && t.IsSigned && t.IsAdditionalAssessment == true
|
||||
&&t.TrialCriterionAdditionalAssessmentTypeList.Any(c=>/*c.AdditionalAssessmentType==Domain.Share.Reading.AdditionalAssessmentType.BrainMetastasis &&*/ c.IsSelected==true)).Any();
|
||||
|
||||
return ResponseOutput.Ok<PageOutput<UnionDocumentWithConfirmInfoView>>( result, new { NeedSignCount = needSignTrialDocCount + needSignSystemDocCount, NeedSignTrialDocCount = needSignTrialDocCount, NeedSignSystemDocCount = needSignSystemDocCount, IsAdditionalAssessment = isAdditionalAssessment && isManualGenerateTask, TrialStatusStr = trialInfo.TrialStatusStr,TrialConfig= trialTaskConfig });
|
||||
}
|
||||
|
||||
|
||||
@@ -382,8 +399,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
[HttpGet("{trialId:guid}")]
|
||||
public async Task<IResponseOutput> GetTrialDocAndSystemDocType(Guid trialId)
|
||||
{
|
||||
var result = await _trialDocumentRepository.Where(t => t.TrialId == trialId).Select(t => new { FileType = t.FileType.Value, t.FileTypeId })
|
||||
.Union(_systemDocumentRepository.Select(t => new { FileType = t.FileType.Value, t.FileTypeId }))
|
||||
var result = await _trialDocumentRepository.Where(t => t.TrialId == trialId).Select(t => new { FileType = _userInfo.IsEn_Us? t.FileType.Value :t.FileType.ValueCN, t.FileTypeId })
|
||||
.Union(_systemDocumentRepository.Select(t => new { FileType = _userInfo.IsEn_Us ? t.FileType.Value : t.FileType.ValueCN, t.FileTypeId }))
|
||||
.ToListAsync();
|
||||
|
||||
return ResponseOutput.Ok(result);
|
||||
|
||||
@@ -1384,8 +1384,6 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1424,10 +1422,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
private async Task TestEmailConfigAsync(TrialEmailNoticeConfigAddOrEdit config)
|
||||
{
|
||||
var toUserList = await _repository.Where<TrialUser>(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();
|
||||
|
||||
|
||||
|
||||
if (!config.FromEmail.Contains("@") || string.IsNullOrEmpty(config.FromEmail))
|
||||
{
|
||||
@@ -1435,52 +1430,16 @@ namespace IRaCIS.Core.Application.Service
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidEmailConfig"]);
|
||||
}
|
||||
|
||||
|
||||
if (toUserList.Count() == 0 || toUserList.Where(t => t.EMail.Contains("@")).Count() == 0)
|
||||
{
|
||||
//---项目没有有效的收件人,无法发送邮件
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidRecipient"]);
|
||||
}
|
||||
|
||||
var sendEmailConfig = new SMTPEmailConfig();
|
||||
|
||||
sendEmailConfig.FromEmailAddress = new MimeKit.MailboxAddress(config.FromName, config.FromEmail);
|
||||
sendEmailConfig.AuthorizationCode = config.AuthorizationCode;
|
||||
sendEmailConfig.UserName = config.FromEmail;
|
||||
|
||||
sendEmailConfig.Host = config.SMTPServerAddress;
|
||||
sendEmailConfig.Port = config.SMTPServerPort;
|
||||
|
||||
|
||||
sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress(config.FromName, config.FromEmail));
|
||||
|
||||
|
||||
var pathToFile = _hostEnvironment.WebRootPath
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
//+ "EmailConfigTest.html";
|
||||
|
||||
+ (_userInfo.IsEn_Us ? "EmailConfigTest_US.html" : "EmailConfigTest.html");
|
||||
|
||||
|
||||
//---项目邮件测试
|
||||
sendEmailConfig.TopicDescription = _localizer["TrialEmailN_EmailTestMessage"];
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
var templateInfo = SourceReader.ReadToEnd();
|
||||
|
||||
|
||||
sendEmailConfig.HtmlBodyStr = string.Format(templateInfo,
|
||||
//--- 收到此邮件,代表邮件配置正确
|
||||
_localizer["TrialEmailN_ConfigurationCorrect"]
|
||||
);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await SendEmailHelper.SendEmailAsync(sendEmailConfig);
|
||||
await SendEmailHelper.TestEmailConfigAsync(new SystemEmailSendConfig()
|
||||
{
|
||||
AuthorizationCode = config.AuthorizationCode,
|
||||
FromEmail = config.FromEmail,
|
||||
FromName = config.FromName,
|
||||
Host = config.SMTPServerAddress,
|
||||
Port = config.SMTPServerPort
|
||||
});
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -1490,6 +1449,72 @@ namespace IRaCIS.Core.Application.Service
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidSenderEmailConfig"] + ex.Message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#region 人员还未加入,可以先配置邮件 历史废弃
|
||||
|
||||
//var toUserList = await _repository.Where<TrialUser>(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();
|
||||
|
||||
|
||||
//if (toUserList.Count() == 0 || toUserList.Where(t => t.EMail.Contains("@")).Count() == 0)
|
||||
//{
|
||||
// //---项目没有有效的收件人,无法发送邮件
|
||||
// throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidRecipient"]);
|
||||
//}
|
||||
|
||||
//var sendEmailConfig = new SMTPEmailConfig();
|
||||
|
||||
//sendEmailConfig.FromEmailAddress = new MimeKit.MailboxAddress(config.FromName, config.FromEmail);
|
||||
//sendEmailConfig.AuthorizationCode = config.AuthorizationCode;
|
||||
//sendEmailConfig.UserName = config.FromEmail;
|
||||
|
||||
//sendEmailConfig.Host = config.SMTPServerAddress;
|
||||
//sendEmailConfig.Port = config.SMTPServerPort;
|
||||
|
||||
|
||||
//sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress(config.FromName, config.FromEmail));
|
||||
|
||||
|
||||
//var pathToFile = _hostEnvironment.WebRootPath
|
||||
// + Path.DirectorySeparatorChar.ToString()
|
||||
// + "EmailTemplate"
|
||||
// + Path.DirectorySeparatorChar.ToString()
|
||||
// //+ "EmailConfigTest.html";
|
||||
|
||||
// + (_userInfo.IsEn_Us ? "EmailConfigTest_US.html" : "EmailConfigTest.html");
|
||||
|
||||
|
||||
////---项目邮件测试
|
||||
//sendEmailConfig.TopicDescription = _localizer["TrialEmailN_EmailTestMessage"];
|
||||
|
||||
//using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
//{
|
||||
// var templateInfo = SourceReader.ReadToEnd();
|
||||
|
||||
|
||||
// sendEmailConfig.HtmlBodyStr = string.Format(templateInfo,
|
||||
// //--- 收到此邮件,代表邮件配置正确
|
||||
// _localizer["TrialEmailN_ConfigurationCorrect"]
|
||||
// );
|
||||
//}
|
||||
|
||||
//try
|
||||
//{
|
||||
// await SendEmailHelper.SendEmailAsync(sendEmailConfig);
|
||||
|
||||
//}
|
||||
//catch (Exception ex)
|
||||
//{
|
||||
|
||||
// //---发件人配置错误,请核对服务器地址或者授权码是否填写有误
|
||||
// throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidSenderEmailConfig"] + ex.Message);
|
||||
//}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -174,6 +174,6 @@ namespace IRaCIS.Application.Contracts
|
||||
public DateTime BeginDate { get; set; }
|
||||
public DateTime EndDate { get; set; }
|
||||
|
||||
public AttendedReviewerType? AttendedReviewerType { get; set; }
|
||||
//public AttendedReviewerType? AttendedReviewerType { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -552,10 +552,12 @@ namespace IRaCIS.Application.Services
|
||||
trialLambda = trialLambda.And(u => u.TrialCode.Contains(trialCode));
|
||||
}
|
||||
|
||||
if (queryParam.AttendedReviewerType != null)
|
||||
{
|
||||
trialLambda = trialLambda.And(u => u.AttendedReviewerType == queryParam.AttendedReviewerType);
|
||||
}
|
||||
//if (queryParam.AttendedReviewerType != null)
|
||||
//{
|
||||
// trialLambda = trialLambda.And(u => u.AttendedReviewerType == queryParam.AttendedReviewerType);
|
||||
//}
|
||||
|
||||
|
||||
|
||||
Expression<Func<Doctor, bool>> doctorLambda = x => true;
|
||||
|
||||
@@ -936,15 +938,17 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
trialLambda = trialLambda.And(u => u.CROId == param.CroId);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(param.TrialCode))
|
||||
{
|
||||
var trialCode = param.TrialCode.Trim();
|
||||
trialLambda = trialLambda.And(u => u.TrialCode.Contains(trialCode));
|
||||
}
|
||||
if (param.AttendedReviewerType != null)
|
||||
{
|
||||
trialLambda = trialLambda.And(u => u.AttendedReviewerType == param.AttendedReviewerType);
|
||||
}
|
||||
|
||||
//if (param.AttendedReviewerType != null)
|
||||
//{
|
||||
// trialLambda = trialLambda.And(u => u.AttendedReviewerType == param.AttendedReviewerType);
|
||||
//}
|
||||
|
||||
var lockedPaymentIdAndYearMonth = _paymentRepository.Where(t => t.IsLock && t.YearMonthDate >= bDate && t.YearMonthDate <= eDate).Select(t => new { PaymentId = t.Id, t.YearMonth, t.DoctorId });
|
||||
|
||||
|
||||
@@ -20,25 +20,26 @@ namespace IRaCIS.Core.Application.Service
|
||||
public AdditionalAssessmentType AdditionalAssessmentType { get; set; }
|
||||
|
||||
//附加评估问题
|
||||
public List<ReadingQuestionTrial> AdditionalQuestionList { get; set; }=new List<ReadingQuestionTrial>();
|
||||
public List<ReadingQuestionTrial> AdditionalQuestionList { get; set; } = new List<ReadingQuestionTrial>();
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class AdditionalAssessment
|
||||
public class AdditionalAssessment
|
||||
{
|
||||
|
||||
public List<CriterionAdditionalAssessment> SystemDefeaultAdditionalAssessmentList { get; set; } = new List<CriterionAdditionalAssessment>();
|
||||
public List<CriterionAdditionalAssessment> SystemDefeaultAdditionalAssessmentList { get; set; } = new List<CriterionAdditionalAssessment>();
|
||||
public AdditionalAssessment()
|
||||
{
|
||||
|
||||
var gropId = NewId.NextGuid();
|
||||
//Resist1.1 脑转移 默认评估问题
|
||||
SystemDefeaultAdditionalAssessmentList.Add(new CriterionAdditionalAssessment()
|
||||
{
|
||||
CriterionType = CriterionType.RECIST1Point1,
|
||||
AdditionalAssessmentType = AdditionalAssessmentType.BrainMetastasis,
|
||||
AdditionalQuestionList = new List<ReadingQuestionTrial>(){
|
||||
var gropId = NewId.NextGuid();
|
||||
|
||||
SystemDefeaultAdditionalAssessmentList.Add(new CriterionAdditionalAssessment()
|
||||
{
|
||||
CriterionType = CriterionType.RECIST1Point1,
|
||||
AdditionalAssessmentType = AdditionalAssessmentType.BrainMetastasis,
|
||||
AdditionalQuestionList = new List<ReadingQuestionTrial>(){
|
||||
|
||||
new ReadingQuestionTrial()
|
||||
{
|
||||
@@ -47,7 +48,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
IsJudgeQuestion=false,
|
||||
IsShowInDicom=false,
|
||||
GlobalReadingShowType=GlobalReadingShowType.NotShow,
|
||||
|
||||
|
||||
QuestionName="脑转移评估",
|
||||
QuestionEnName="Brain Metastasis Assessment",
|
||||
GroupName="脑转移评估",
|
||||
@@ -69,27 +70,87 @@ namespace IRaCIS.Core.Application.Service
|
||||
IsJudgeQuestion=false,
|
||||
IsShowInDicom=false,
|
||||
GlobalReadingShowType=GlobalReadingShowType.NotShow,
|
||||
QuestionEnName="Brain metastases present",
|
||||
QuestionEnName="Brain Metastasis Present",
|
||||
QuestionName="存在脑转移",
|
||||
Type="radio",
|
||||
QuestionGenre=TableQuestionType.Dictionary,
|
||||
DataSource=DataSources.ManualEntry,
|
||||
ShowQuestion=ShowQuestion.Show,
|
||||
|
||||
|
||||
|
||||
IsAdditional=true
|
||||
} ,
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
//Resist1.1 TNM分期
|
||||
{
|
||||
|
||||
//var gropId = NewId.NextGuid();
|
||||
|
||||
//SystemDefeaultAdditionalAssessmentList.Add(new CriterionAdditionalAssessment()
|
||||
//{
|
||||
// CriterionType = CriterionType.RECIST1Point1,
|
||||
// AdditionalAssessmentType = AdditionalAssessmentType.TNMStage,
|
||||
// AdditionalQuestionList = new List<ReadingQuestionTrial>(){
|
||||
|
||||
// new ReadingQuestionTrial()
|
||||
//{
|
||||
// LimitEdit=LimitEdit.OnlyBaseLine,
|
||||
// Id=gropId,
|
||||
// IsJudgeQuestion=false,
|
||||
// IsShowInDicom=false,
|
||||
// GlobalReadingShowType=GlobalReadingShowType.NotShow,
|
||||
|
||||
// QuestionName="TNM分期评估",
|
||||
// QuestionEnName="TNM Stage Assessment",
|
||||
// GroupName="TNM分期评估",
|
||||
// GroupEnName="TNM Stage Assessment",
|
||||
// Type="group",
|
||||
// QuestionGenre=TableQuestionType.Customize,
|
||||
// DataSource=DataSources.ManualEntry,
|
||||
// ShowQuestion=ShowQuestion.Show,
|
||||
|
||||
|
||||
// IsAdditional=true
|
||||
//} ,
|
||||
|
||||
// new ReadingQuestionTrial()
|
||||
//{
|
||||
// GroupId=gropId,
|
||||
// LimitEdit=LimitEdit.OnlyBaseLine,
|
||||
// DictionaryCode="YesOrNoOrNa",
|
||||
// IsJudgeQuestion=false,
|
||||
// IsShowInDicom=false,
|
||||
// GlobalReadingShowType=GlobalReadingShowType.NotShow,
|
||||
// QuestionEnName="Brain metastases present",
|
||||
// QuestionName="存在脑转移",
|
||||
// Type="radio",
|
||||
// QuestionGenre=TableQuestionType.Dictionary,
|
||||
// DataSource=DataSources.ManualEntry,
|
||||
// ShowQuestion=ShowQuestion.Show,
|
||||
|
||||
|
||||
// IsAdditional=true
|
||||
//} ,
|
||||
|
||||
//}
|
||||
//});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public List<CriterionAdditionalAssessment> GetSystemDefeaultAdditionalAssessmentList(CriterionType criterionType, AdditionalAssessmentType? additionalAssessmentType=null)
|
||||
public List<CriterionAdditionalAssessment> GetSystemDefeaultAdditionalAssessmentList(CriterionType criterionType, AdditionalAssessmentType? additionalAssessmentType = null)
|
||||
{
|
||||
|
||||
return SystemDefeaultAdditionalAssessmentList.Where(t => t.CriterionType == criterionType)
|
||||
.WhereIf(additionalAssessmentType!=null,t=>t.AdditionalAssessmentType==additionalAssessmentType).ToList();
|
||||
.WhereIf(additionalAssessmentType != null, t => t.AdditionalAssessmentType == additionalAssessmentType).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
//存放在instance 上面
|
||||
public string WindowCenter { get; set; } = string.Empty;
|
||||
public string WindowWidth { get; set; } = string.Empty;
|
||||
|
||||
public string IamgeResizePath { get; set; }
|
||||
}
|
||||
|
||||
public class DicomSeriesWithLabelDTO : DicomSeriesDTO
|
||||
|
||||
@@ -178,6 +178,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
public class PreArchiveDicomStudyCommand
|
||||
{
|
||||
//public string StudyInstanceUid { get; set; }
|
||||
|
||||
[NotDefault]
|
||||
public Guid TrialId { get; set; }
|
||||
[NotDefault]
|
||||
@@ -278,6 +280,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public string AcquisitionNumber { get; set; } = string.Empty;
|
||||
public string TriggerTime { get; set; } = string.Empty;
|
||||
|
||||
public string IamgeResizePath { get; set; }=string.Empty;
|
||||
public List<AddInstanceDto> InstanceList { get; set; }
|
||||
|
||||
|
||||
|
||||
@@ -140,13 +140,46 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
path = (await _instanceRepository.Where(s => s.SeriesId == seriesId).Select(t => t.Path).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
var physicalPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, path);
|
||||
#region 切换磁盘存储之前
|
||||
//var physicalPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, path);
|
||||
|
||||
//DicomInstance dicomInstance = await _instanceRepository.FirstOrDefaultAsync(s => s.SeriesId == seriesId).IfNullThrowException();
|
||||
#endregion
|
||||
|
||||
#region 切换磁盘存储后
|
||||
|
||||
var physicalPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, path);
|
||||
|
||||
//不存在,去其他路径找
|
||||
if (!File.Exists(physicalPath))
|
||||
{
|
||||
//找到所有磁盘
|
||||
var drives = DriveInfo.GetDrives()
|
||||
.Where(d => d.DriveType == DriveType.Fixed && d.IsReady)
|
||||
//剩余空间最多的
|
||||
.OrderByDescending(d => d.AvailableFreeSpace)
|
||||
|
||||
//存储空间相同,则按照按照总空间从大到小排序
|
||||
.ThenByDescending(d => d.TotalSize - d.TotalFreeSpace)
|
||||
.Select(d => d.RootDirectory.FullName)
|
||||
.ToList();
|
||||
|
||||
|
||||
foreach (var drive in drives)
|
||||
{
|
||||
physicalPath = Path.Combine(drive, _hostEnvironment.EnvironmentName, path.Trim('/'));
|
||||
|
||||
if (File.Exists(physicalPath))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
//DicomStudy dicomStudy = await _studyRepository.FirstOrDefaultAsync(s => s.Id == dicomInstance.StudyId).IfNullThrowException();
|
||||
|
||||
//var (physicalPath, relativePath) = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id);
|
||||
|
||||
using (var sw = ImageHelper.RenderPreviewJpeg(physicalPath))
|
||||
{
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
[ApiExplorerSettings(GroupName = "Image")]
|
||||
public class StudyService : BaseService, IStudyService
|
||||
{
|
||||
private static object lockCodeGenerate = new object();
|
||||
private static object lockObj = new object();
|
||||
private static readonly AsyncLock _mutex = new AsyncLock();
|
||||
private static readonly AsyncLock _mutex2 = new AsyncLock();
|
||||
|
||||
@@ -93,8 +93,18 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
public async Task<IResponseOutput> PreArchiveDicomStudy(PreArchiveDicomStudyCommand preArchiveStudyCommand)
|
||||
{
|
||||
|
||||
|
||||
|
||||
//lock (lockObj)
|
||||
//{
|
||||
// if (_provider.Exists($"StudyUid_{preArchiveStudyCommand.TrialId}_{preArchiveStudyCommand.StudyInstanceUid}"))
|
||||
// {
|
||||
// //---当前已有人正在上传和归档该检查!
|
||||
// return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress"));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// _provider.Set($"StudyUid_{preArchiveStudyCommand.TrialId}_{preArchiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30));
|
||||
// }
|
||||
//}
|
||||
|
||||
var studyMonitor = new StudyMonitor()
|
||||
{
|
||||
@@ -111,7 +121,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
IsDicomReUpload = preArchiveStudyCommand.IsDicomReUpload,
|
||||
FileSize = preArchiveStudyCommand.FileSize,
|
||||
FileCount = preArchiveStudyCommand.FileCount,
|
||||
//FailedFileCount = preArchiveStudyCommand.FailedFileCount,
|
||||
|
||||
};
|
||||
|
||||
@@ -122,124 +131,77 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public IResponseOutput DicomUploadInProgress(Guid trialId, string studyInstanceUid)
|
||||
{
|
||||
_provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30));
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand)
|
||||
{
|
||||
var trialId = incommand.TrialId;
|
||||
|
||||
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
|
||||
studyMonitor.UploadFinishedTime = DateTime.Now;
|
||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||
studyMonitor.FailedFileCount = incommand.FailedFileCount;
|
||||
studyMonitor.IsSuccess = true;
|
||||
|
||||
//上传
|
||||
if (studyMonitor.IsDicomReUpload == false)
|
||||
try
|
||||
{
|
||||
var study = _mapper.Map<DicomStudy>(incommand.Study);
|
||||
var trialId = incommand.TrialId;
|
||||
|
||||
using (await _mutex.LockAsync())
|
||||
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
|
||||
studyMonitor.UploadFinishedTime = DateTime.Now;
|
||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||
studyMonitor.FailedFileCount = incommand.FailedFileCount;
|
||||
studyMonitor.IsSuccess = true;
|
||||
|
||||
//上传
|
||||
if (studyMonitor.IsDicomReUpload == false)
|
||||
{
|
||||
//查询数据库获取最大的Code 没有记录则为0
|
||||
var dbStudyCodeIntMax = _dicomstudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
||||
var study = _mapper.Map<DicomStudy>(incommand.Study);
|
||||
|
||||
//获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增
|
||||
var cacheMaxCodeInt = _provider.Get<int>($"{trialId}_{StaticData.CacheKey.StudyMaxCode}").Value;
|
||||
|
||||
int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1;
|
||||
|
||||
study.Code = currentNextCodeInt;
|
||||
|
||||
study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy));
|
||||
|
||||
_provider.Set<int>($"{trialId}_{StaticData.CacheKey.StudyMaxCode}", study.Code, TimeSpan.FromMinutes(30));
|
||||
|
||||
}
|
||||
|
||||
|
||||
study.Id = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString());
|
||||
study.TrialId = incommand.TrialId;
|
||||
study.SiteId = incommand.SiteId;
|
||||
study.SubjectId = incommand.SubjectId;
|
||||
study.SubjectVisitId = incommand.SubjectVisitId;
|
||||
|
||||
|
||||
//特殊处理逻辑
|
||||
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Distinct());
|
||||
SpecialArchiveStudyDeal(study);
|
||||
|
||||
await _dicomstudyRepository.AddAsync(study);
|
||||
|
||||
|
||||
studyMonitor.StudyId = study.Id;
|
||||
studyMonitor.StudyCode = study.StudyCode;
|
||||
|
||||
|
||||
foreach (var seriesItem in incommand.Study.SeriesList)
|
||||
{
|
||||
var series = _mapper.Map<DicomSeries>(seriesItem);
|
||||
|
||||
series.Id = IdentifierHelper.CreateGuid(seriesItem.SeriesInstanceUid, incommand.TrialId.ToString());
|
||||
series.StudyId = study.Id;
|
||||
|
||||
series.TrialId = incommand.TrialId;
|
||||
series.SiteId = incommand.SiteId;
|
||||
series.SubjectId = incommand.SubjectId;
|
||||
series.SubjectVisitId = incommand.SubjectVisitId;
|
||||
|
||||
await _dicomSeriesRepository.AddAsync(series);
|
||||
|
||||
foreach (var instanceItem in seriesItem.InstanceList)
|
||||
using (await _mutex.LockAsync())
|
||||
{
|
||||
var isntance = _mapper.Map<DicomInstance>(instanceItem);
|
||||
isntance.StudyId = study.Id;
|
||||
isntance.SeriesId = series.Id;
|
||||
//查询数据库获取最大的Code 没有记录则为0
|
||||
var dbStudyCodeIntMax = _dicomstudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
||||
|
||||
isntance.TrialId = incommand.TrialId;
|
||||
isntance.SiteId = incommand.SiteId;
|
||||
isntance.SubjectId = incommand.SubjectId;
|
||||
isntance.SubjectVisitId = incommand.SubjectVisitId;
|
||||
//获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增
|
||||
var cacheMaxCodeInt = _provider.Get<int>($"{trialId}_{StaticData.CacheKey.StudyMaxCode}").Value;
|
||||
|
||||
int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1;
|
||||
|
||||
study.Code = currentNextCodeInt;
|
||||
|
||||
study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy));
|
||||
|
||||
_provider.Set<int>($"{trialId}_{StaticData.CacheKey.StudyMaxCode}", study.Code, TimeSpan.FromMinutes(30));
|
||||
|
||||
await _dicomInstanceRepository.AddAsync(isntance);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
study.Id = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString());
|
||||
study.TrialId = incommand.TrialId;
|
||||
study.SiteId = incommand.SiteId;
|
||||
study.SubjectId = incommand.SubjectId;
|
||||
study.SubjectVisitId = incommand.SubjectVisitId;
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//特殊处理逻辑
|
||||
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Distinct());
|
||||
SpecialArchiveStudyDeal(study);
|
||||
|
||||
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); ;
|
||||
|
||||
var study = await _dicomstudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
|
||||
|
||||
//_mapper.Map(incommand.Study, study);
|
||||
|
||||
//特殊处理逻辑
|
||||
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
|
||||
SpecialArchiveStudyDeal(study);
|
||||
await _dicomstudyRepository.AddAsync(study);
|
||||
|
||||
|
||||
studyMonitor.StudyId = study.Id;
|
||||
studyMonitor.StudyCode = study.StudyCode;
|
||||
|
||||
// 少了整个序列
|
||||
|
||||
//某个序列下少了instance
|
||||
foreach (var seriesItem in incommand.Study.SeriesList)
|
||||
{
|
||||
var seriesId = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, trialId.ToString());
|
||||
|
||||
DicomSeries dicomSeries = await _dicomSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
|
||||
|
||||
//判断重复
|
||||
if (dicomSeries == null)
|
||||
foreach (var seriesItem in incommand.Study.SeriesList)
|
||||
{
|
||||
var series = _mapper.Map<DicomSeries>(seriesItem);
|
||||
|
||||
series.Id = seriesId;
|
||||
series.Id = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, incommand.TrialId.ToString());
|
||||
series.StudyId = study.Id;
|
||||
|
||||
series.TrialId = incommand.TrialId;
|
||||
@@ -247,48 +209,118 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
series.SubjectId = incommand.SubjectId;
|
||||
series.SubjectVisitId = incommand.SubjectVisitId;
|
||||
|
||||
await _dicomSeriesRepository.AddAsync(series);
|
||||
|
||||
dicomSeries = await _dicomSeriesRepository.AddAsync(series);
|
||||
foreach (var instanceItem in seriesItem.InstanceList)
|
||||
{
|
||||
var isntance = _mapper.Map<DicomInstance>(instanceItem);
|
||||
isntance.StudyId = study.Id;
|
||||
isntance.SeriesId = series.Id;
|
||||
|
||||
//新的序列 那么 检查的序列数量+1
|
||||
study.SeriesCount += 1;
|
||||
isntance.TrialId = incommand.TrialId;
|
||||
isntance.SiteId = incommand.SiteId;
|
||||
isntance.SubjectId = incommand.SubjectId;
|
||||
isntance.SubjectVisitId = incommand.SubjectVisitId;
|
||||
|
||||
await _dicomInstanceRepository.AddAsync(isntance);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); ;
|
||||
|
||||
var study = await _dicomstudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
|
||||
|
||||
//_mapper.Map(incommand.Study, study);
|
||||
|
||||
//特殊处理逻辑
|
||||
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
|
||||
SpecialArchiveStudyDeal(study);
|
||||
|
||||
|
||||
|
||||
// 少了整个序列
|
||||
|
||||
//某个序列下少了instance
|
||||
foreach (var seriesItem in incommand.Study.SeriesList)
|
||||
{
|
||||
//该序列掉了instance
|
||||
dicomSeries.InstanceCount += seriesItem.InstanceCount;
|
||||
var seriesId = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, trialId.ToString());
|
||||
|
||||
DicomSeries dicomSeries = await _dicomSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
|
||||
|
||||
//判断重复
|
||||
if (dicomSeries == null)
|
||||
{
|
||||
var series = _mapper.Map<DicomSeries>(seriesItem);
|
||||
|
||||
series.Id = seriesId;
|
||||
series.StudyId = study.Id;
|
||||
|
||||
series.TrialId = incommand.TrialId;
|
||||
series.SiteId = incommand.SiteId;
|
||||
series.SubjectId = incommand.SubjectId;
|
||||
series.SubjectVisitId = incommand.SubjectVisitId;
|
||||
|
||||
|
||||
dicomSeries = await _dicomSeriesRepository.AddAsync(series);
|
||||
|
||||
//新的序列 那么 检查的序列数量+1
|
||||
study.SeriesCount += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
//该序列掉了instance
|
||||
dicomSeries.InstanceCount += seriesItem.InstanceList.Count;
|
||||
}
|
||||
|
||||
foreach (var instanceItem in seriesItem.InstanceList)
|
||||
{
|
||||
var insntance = _mapper.Map<DicomInstance>(instanceItem);
|
||||
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString());
|
||||
insntance.StudyId = study.Id;
|
||||
insntance.SeriesId = dicomSeries.Id;
|
||||
|
||||
insntance.TrialId = incommand.TrialId;
|
||||
insntance.SiteId = incommand.SiteId;
|
||||
insntance.SubjectId = incommand.SubjectId;
|
||||
insntance.SubjectVisitId = incommand.SubjectVisitId;
|
||||
|
||||
await _dicomInstanceRepository.AddAsync(insntance);
|
||||
}
|
||||
|
||||
|
||||
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
|
||||
study.InstanceCount += seriesItem.InstanceList.Count;
|
||||
|
||||
}
|
||||
|
||||
|
||||
foreach (var instanceItem in seriesItem.InstanceList)
|
||||
{
|
||||
var insntance = _mapper.Map<DicomInstance>(instanceItem);
|
||||
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString());
|
||||
insntance.StudyId = study.Id;
|
||||
insntance.SeriesId = dicomSeries.Id;
|
||||
|
||||
insntance.TrialId = incommand.TrialId;
|
||||
insntance.SiteId = incommand.SiteId;
|
||||
insntance.SubjectId = incommand.SubjectId;
|
||||
insntance.SubjectVisitId = incommand.SubjectVisitId;
|
||||
|
||||
await _dicomInstanceRepository.AddAsync(insntance);
|
||||
}
|
||||
|
||||
|
||||
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
|
||||
study.InstanceCount += seriesItem.InstanceCount;
|
||||
|
||||
}
|
||||
|
||||
using (await _mutex2.LockAsync())
|
||||
{
|
||||
await _dicomInstanceRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
using (await _mutex2.LockAsync())
|
||||
catch (Exception ex)
|
||||
{
|
||||
await _dicomInstanceRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.NotOk(ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_provider.Remove($"StudyUid_{incommand.TrialId}_{incommand.Study.StudyInstanceUid}");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -728,8 +760,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
|
||||
var result = new VerifyStudyUploadResult();
|
||||
|
||||
if (_provider.Exists("StudyUid_" + studyInstanceUid))
|
||||
if (_provider.Exists($"StudyUid_{trialId}_{studyInstanceUid}"))
|
||||
{
|
||||
|
||||
result.AllowUpload = false;
|
||||
|
||||
result.AllowReUpload = false;
|
||||
@@ -789,6 +822,16 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
}
|
||||
}
|
||||
result.StudyInstanceUid = studyInstanceUid;
|
||||
|
||||
|
||||
if (result.AllowReUpload || result.AllowUpload)
|
||||
{
|
||||
lock (lockObj)
|
||||
{
|
||||
_provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30));
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -275,6 +275,16 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO
|
||||
|
||||
[NotDefault]
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否盲化
|
||||
/// </summary>
|
||||
public bool? IsBlind { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否完整
|
||||
/// </summary>
|
||||
public bool? IsComplete { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -365,8 +375,10 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO
|
||||
public string CreateUserRealName { get; set; } = string.Empty;
|
||||
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public string DescriptionCN { get; set; } = string.Empty;
|
||||
|
||||
public string ModuleTypeName { get; set; } = string.Empty;
|
||||
public string ModuleTypeNameCN { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public string SignText { get; set; } = string.Empty;
|
||||
@@ -376,6 +388,7 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO
|
||||
public bool? InPlan { get; set; }
|
||||
|
||||
public string OptType { get; set; } = string.Empty;
|
||||
public string OptTypeCN { get; set; } = string.Empty;
|
||||
|
||||
public Guid? FrontAuditConfigId { get; set; }
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@ using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Domain.Share.Management;
|
||||
using System.Text.Json.Nodes;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Core.Infrastructure.Extention;
|
||||
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
@@ -387,15 +389,6 @@ namespace IRaCIS.Core.Application.Service
|
||||
Dictionary<string, object> jsonDic = JsonConvert.DeserializeObject<Dictionary<string, object>>(relationParentInspection.JsonDetail);
|
||||
|
||||
|
||||
// //CommonData 仅仅存放关联对象的 Data里面的数据
|
||||
//if (jsonDic.ContainsKey(nameof(InspectionJsonDetail.CommonData)))
|
||||
//{
|
||||
// var commonDataDicObj = jsonDic[nameof(InspectionJsonDetail.CommonData)];
|
||||
|
||||
// objectLsit.Add(commonDataDicObj);
|
||||
//}
|
||||
|
||||
|
||||
//避免对象信息记录 把 Data里面的信息也取过去 但是加上稽查对象的前缀
|
||||
var dataDicObj = jsonDic[nameof(InspectionJsonDetail.Data)];
|
||||
|
||||
@@ -449,112 +442,6 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
await AddJsonObjectToDic(id, objectRelationParentId3, createTime, batchId, objectLsit);
|
||||
|
||||
|
||||
|
||||
#region 废弃
|
||||
//if (objectRelationParentId != null)
|
||||
//{
|
||||
// //父子层级的数据可能在同一个批次 进行更新 但是后插入的是父层级的数据 找父层级的稽查应该优先同一批次的
|
||||
// var relationParentInspection = await _dataInspectionRepository.Where(t => t.GeneralId == objectRelationParentId && (t.CreateTime <= createTime || t.BatchId == batchId)).OrderByDescending(x => x.CreateTime).Select(t => new { t.ObjectRelationParentId, t.CreateTime, t.JsonDetail, t.BatchId, t.ObjectRelationParentId2, t.EntityName }).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
// if (relationParentInspection != null)
|
||||
// {
|
||||
// Dictionary<string, object> jsonDic = JsonConvert.DeserializeObject<Dictionary<string, object>>(relationParentInspection.JsonDetail);
|
||||
|
||||
|
||||
// var commonDataDicObj = jsonDic[nameof(InspectionJsonDetail.CommonData)];
|
||||
|
||||
// objectLsit.Add(commonDataDicObj);
|
||||
|
||||
// //避免对象信息记录 把 Data里面的信息也取过去 但是加上稽查对象的前缀
|
||||
// var dataDicObj = jsonDic[nameof(InspectionJsonDetail.Data)];
|
||||
|
||||
// if (dataDicObj != null)
|
||||
// {
|
||||
// var entityName = relationParentInspection.EntityName;
|
||||
|
||||
// IDictionary<string, object> newNamepDic = new Dictionary<string, object>();
|
||||
|
||||
// var tempDic = JsonConvert.DeserializeObject<Dictionary<string, object>>(dataDicObj.ToJsonStr());
|
||||
|
||||
// foreach (var valuePair in tempDic)
|
||||
// {
|
||||
// newNamepDic.Add(entityName + "_" + valuePair.Key, valuePair.Value);
|
||||
// }
|
||||
|
||||
|
||||
// objectLsit.Add(newNamepDic);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// await GetRelationParentData(relationParentInspection.ObjectRelationParentId, relationParentInspection.ObjectRelationParentId2, relationParentInspection.CreateTime, relationParentInspection.BatchId, objectLsit);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
//}
|
||||
|
||||
//if (objectRelationParentId2 != null)
|
||||
//{
|
||||
// //父子层级的数据可能在同一个批次 进行更新 但是后插入的是父层级的数据 找父层级的稽查应该优先同一批次的
|
||||
// var relationParentInspection = await _dataInspectionRepository.Where(t => t.GeneralId == objectRelationParentId2 && (t.CreateTime <= createTime || t.BatchId == batchId)).OrderByDescending(x => x.CreateTime).Select(t => new { t.ObjectRelationParentId, t.CreateTime, t.JsonDetail, t.BatchId, t.ObjectRelationParentId2, t.EntityName }).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
// if (relationParentInspection != null)
|
||||
// {
|
||||
// Dictionary<string, object> jsonDic = JsonConvert.DeserializeObject<Dictionary<string, object>>(relationParentInspection.JsonDetail);
|
||||
|
||||
|
||||
// var commonDataDicObj = jsonDic[nameof(InspectionJsonDetail.CommonData)];
|
||||
|
||||
// objectLsit.Add(commonDataDicObj);
|
||||
|
||||
|
||||
// //避免对象信息记录 把 Data里面的信息也取过去 但是加上稽查对象的前缀
|
||||
// var dataDicObj = jsonDic[nameof(InspectionJsonDetail.Data)];
|
||||
|
||||
// if (dataDicObj != null)
|
||||
// {
|
||||
// var entityName = relationParentInspection.EntityName;
|
||||
|
||||
// IDictionary<string, object> newNamepDic = new Dictionary<string, object>();
|
||||
|
||||
// var tempDic = JsonConvert.DeserializeObject<Dictionary<string, object>>(dataDicObj.ToJsonStr());
|
||||
|
||||
// foreach (var valuePair in tempDic)
|
||||
// {
|
||||
// newNamepDic.Add(entityName + "_" + valuePair.Key, valuePair.Value);
|
||||
// }
|
||||
|
||||
|
||||
// objectLsit.Add(newNamepDic);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
// await GetRelationParentData(relationParentInspection.ObjectRelationParentId, relationParentInspection.ObjectRelationParentId2, relationParentInspection.CreateTime, relationParentInspection.BatchId, objectLsit);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //用户的数据稽查没有 临时处理
|
||||
|
||||
|
||||
|
||||
// var userObj = await _repository.Where<User>(t => t.Id == objectRelationParentId2).Select(t => new { UserRealName = t.FullName, t.Phone, t.UserName, UserType = t.UserTypeRole.UserTypeShortName, t.EMail, t.OrganizationName }).FirstOrDefaultAsync();
|
||||
|
||||
// objectLsit.Add(userObj);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
//}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
return objectLsit;
|
||||
}
|
||||
|
||||
@@ -754,7 +641,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
JArray arrays = (JArray)value;
|
||||
|
||||
|
||||
//动态配置表翻译
|
||||
if (item.DataType == "Table")
|
||||
{
|
||||
var tableConfigList = JsonConvert.DeserializeObject<List<TableConfig>>(item.TableConfigJsonStr) ?? new List<TableConfig>();
|
||||
@@ -767,7 +654,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
//处理动态翻译 会在数组中提供 一个属性 “DictionaryCode” 这个是默认约束,做稽查的时候记得注意,免得配置麻烦
|
||||
var dynamicTranslateInfoList = tableConfigList.Where(t => t.IsDynamicTranslate && t.IsList).Select(t => new { t.ListName, t.ColumnValue }).Distinct().ToList();
|
||||
var dynamicTranslateInfoList = tableConfigList.Where(t => t.IsDynamicTranslate && t.IsList).Select(t => new { t.ListName, t.ColumnValue }).Distinct().ToList();
|
||||
|
||||
var dynamicDictionaryNameList = new List<string>();
|
||||
|
||||
@@ -780,6 +667,19 @@ namespace IRaCIS.Core.Application.Service
|
||||
dynamicDictionaryNameList = dynamicDictionaryNameList.Distinct().ToList();
|
||||
}
|
||||
|
||||
var specialDynamicColumnValueList = new List<string>();
|
||||
if (tableConfigList.Any(t => t.IsDynamicTranslate && t.IsList == false))
|
||||
{
|
||||
// 兼容之前数组的那种方式 实际配置只会配置一条
|
||||
specialDynamicColumnValueList = tableConfigList.Where(t => t.IsDynamicTranslate && t.IsList == false)
|
||||
.Select(t => t.ColumnValue ).Distinct().ToList();
|
||||
|
||||
var dicNames= arrays.Where(t=>!string.IsNullOrEmpty( t["DictionaryCode"].ToString()) ).Select(t => t["DictionaryCode"].ToString()).Distinct().ToList();
|
||||
|
||||
dictionaryNameList.AddRange(dicNames);
|
||||
}
|
||||
|
||||
|
||||
|
||||
var allDictionaryNameList = dictionaryNameList.Union(dynamicDictionaryNameList).Distinct();
|
||||
|
||||
@@ -798,7 +698,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
foreach (var translateInfo in translateInfoList)
|
||||
{
|
||||
//Json 解析后 true 变为了True
|
||||
jsonObject[translateInfo.ColumnValue] = translateDataList[translateInfo.TranslateDictionaryName].Where(t => t.Code.ToLower() == jsonObject[translateInfo.ColumnValue]?.ToString().ToLower()).Select(t => t.ValueCN).FirstOrDefault();
|
||||
jsonObject[translateInfo.ColumnValue] = translateDataList[translateInfo.TranslateDictionaryName].Where(t => t.Code.ToLower() == jsonObject[translateInfo.ColumnValue]?.ToString().ToLower()).Select(t => _userInfo.IsEn_Us?t.Value: t.ValueCN).FirstOrDefault();
|
||||
}
|
||||
|
||||
foreach (var specialDynamicColumnValue in specialDynamicColumnValueList)
|
||||
{
|
||||
jsonObject[specialDynamicColumnValue] =
|
||||
translateDataList[jsonObject["DictionaryCode"].ToString()].Where(t => t.Code.ToLower() == jsonObject[specialDynamicColumnValue]?.ToString().ToLower()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefault();
|
||||
}
|
||||
|
||||
//处理动态翻译
|
||||
@@ -818,16 +724,16 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
var dicName = innerObject["DictionaryCode"]?.ToString();
|
||||
|
||||
if(dicName!=null && !string.IsNullOrEmpty(dicName))
|
||||
if (dicName != null && !string.IsNullOrEmpty(dicName))
|
||||
{
|
||||
innerObject[dynamicTranslateInfo.ColumnValue] = translateDataList[dicName].Where(t => t.Code.ToLower() == innerObject[dynamicTranslateInfo.ColumnValue].ToString().ToLower()).Select(t => t.ValueCN).FirstOrDefault();
|
||||
innerObject[dynamicTranslateInfo.ColumnValue] = translateDataList[dicName].Where(t => t.Code.ToLower() == innerObject[dynamicTranslateInfo.ColumnValue].ToString().ToLower()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefault();
|
||||
|
||||
}
|
||||
innberJsonList.Add(innerObject);
|
||||
|
||||
}
|
||||
|
||||
jsonObject[dynamicTranslateInfo.ListName] = JToken.FromObject(innberJsonList) ;
|
||||
jsonObject[dynamicTranslateInfo.ListName] = JToken.FromObject(innberJsonList);
|
||||
|
||||
}
|
||||
|
||||
@@ -849,7 +755,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
guids.Add(Guid.Parse(x.ToString()));
|
||||
});
|
||||
jsonDataDic[item.Key] = string.Join(',', await _dictionaryRepository.Where(x => guids.Contains(x.Id)).Select(x => x.ValueCN).ToListAsync());
|
||||
jsonDataDic[item.Key] = string.Join(',', await _dictionaryRepository.Where(x => guids.Contains(x.Id)).Select(x => _userInfo.IsEn_Us ? x.Value : x.ValueCN).ToListAsync());
|
||||
}
|
||||
else if (item.Type.ToLower() == FrontAudit.ChildGroup.GetDescription().ToLower())
|
||||
{
|
||||
@@ -865,7 +771,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
parent = b
|
||||
}).SelectMany(a => a.parent, (m, n) => new
|
||||
{
|
||||
value = n.ValueCN
|
||||
value = _userInfo.IsEn_Us ? n.Value : n.ValueCN
|
||||
}).Select(x => x.value).ToListAsync()
|
||||
);
|
||||
}
|
||||
@@ -886,7 +792,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
jsonObject[item.Code] = await _dictionaryRepository.Where(x => x.Code == jsonObject["DictionaryCode"].ToString()).Join(_dictionaryRepository.Where(x => x.Code == jsonObject[item.Code].ToString()), a => a.Id, b => b.ParentId, (a, b) => new
|
||||
{
|
||||
value = b.ValueCN
|
||||
value = _userInfo.IsEn_Us ? b.Value : b.ValueCN
|
||||
}).Select(x => x.value).FirstOrDefaultAsync();
|
||||
|
||||
}
|
||||
@@ -931,13 +837,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
if (item.Type.ToLower() == FrontAudit.Id.GetDescription().ToLower())
|
||||
{
|
||||
Guid guid = Guid.Parse(value.ToString());
|
||||
jsonDataDic[item.Key] = await _dictionaryRepository.Where(x => x.Id == guid).Select(x => x.ValueCN).FirstOrDefaultAsync();
|
||||
jsonDataDic[item.Key] = await _dictionaryRepository.Where(x => x.Id == guid).Select(x => _userInfo.IsEn_Us ? x.Value : x.ValueCN).FirstOrDefaultAsync();
|
||||
}
|
||||
else if (item.Type.ToLower() == FrontAudit.ChildGroup.GetDescription().ToLower())
|
||||
{
|
||||
jsonDataDic[item.Key] = await _dictionaryRepository.Where(x => x.Code == item.Code).Join(_dictionaryRepository.Where(x => x.ChildGroup == value.ToString()), a => a.Id, b => b.ParentId, (a, b) => new
|
||||
{
|
||||
value = b.ValueCN
|
||||
value = _userInfo.IsEn_Us ? b.Value : b.ValueCN
|
||||
}).Select(x => x.value).FirstOrDefaultAsync();
|
||||
}
|
||||
//通过字典项的code 翻译 枚举或者 bool
|
||||
@@ -945,7 +851,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
jsonDataDic[item.Key] = await _dictionaryRepository.Where(x => x.Code == item.Code).Join(_dictionaryRepository.Where(x => x.Code == value.ToString()), a => a.Id, b => b.ParentId, (a, b) => new
|
||||
{
|
||||
value = b.ValueCN
|
||||
value = _userInfo.IsEn_Us ? b.Value : b.ValueCN
|
||||
}).Select(x => x.value).FirstOrDefaultAsync();
|
||||
}
|
||||
}
|
||||
@@ -1170,8 +1076,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
[HttpGet]
|
||||
public async Task<List<string>> GetModuleTypeDescriptionList(Guid moduleTypeId)
|
||||
{
|
||||
var result = await _frontAuditConfigRepository.Where(x => x.ModuleTypeId == moduleTypeId && x.ObjectTypeId != null && x.OptTypeId != null && x.Description.Length > 0).Select(x => new { x.Description, x.Sort }).OrderBy(t => t.Sort).ToListAsync();
|
||||
return result.Select(t => t.Description).Distinct().ToList();
|
||||
var result = await _frontAuditConfigRepository.Where(x => x.ModuleTypeId == moduleTypeId && x.ObjectTypeId != null && x.OptTypeId != null && x.Description.Length > 0).Select(x => new { x.Description, x.DescriptionCN, x.Sort }).OrderBy(t => t.Sort).Select(t => _userInfo.IsEn_Us? t.Description:t.DescriptionCN).Distinct().ToListAsync();
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1200,6 +1106,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
CreateTime = data.CreateTime,
|
||||
CreateUserId = data.CreateUserId,
|
||||
Description = data.Description,
|
||||
DescriptionCN=data.DescriptionCN,
|
||||
IsConfig = data.IsConfig,
|
||||
IsEnable = data.IsEnable,
|
||||
ModuleTypeId = data.ModuleTypeId,
|
||||
|
||||
@@ -138,7 +138,11 @@ namespace IRaCIS.Core.Application.Service.Inspection
|
||||
ResearchProgramNo = leftrial.ResearchProgramNo,
|
||||
ObjectTypeId = data.ObjectTypeId,
|
||||
Description = leftfrontAuditConfig.Description,
|
||||
ModuleTypeName = leftmoduleTypec.ValueCN,
|
||||
DescriptionCN=leftfrontAuditConfig.DescriptionCN,
|
||||
|
||||
ModuleTypeName = leftmoduleTypec.Value,
|
||||
ModuleTypeNameCN=leftmoduleTypec.ValueCN,
|
||||
|
||||
SignText = lefttrialSign.SignText,
|
||||
Identification = leftfrontAuditConfig.Identification,
|
||||
FrontAuditConfigId = leftfrontAuditConfig.Id,
|
||||
@@ -149,6 +153,7 @@ namespace IRaCIS.Core.Application.Service.Inspection
|
||||
//IsFrontAdd=data.IsFrontAdd,
|
||||
BatchId = data.BatchId,
|
||||
OptType = leftOptType.Value,
|
||||
OptTypeCN = leftOptType.ValueCN,
|
||||
ObjectRelationParentId = data.ObjectRelationParentId,
|
||||
GeneralId = data.GeneralId,
|
||||
|
||||
|
||||
@@ -235,7 +235,7 @@ namespace IRaCIS.Core.Application.Contracts.DTO
|
||||
{
|
||||
if (!ClosedTime.HasValue)
|
||||
return "";
|
||||
else return string.Format("{0}天{1}小时{2}分钟", (ClosedTime - CreateTime)?.Days, (ClosedTime - CreateTime)?.Hours, (ClosedTime - CreateTime)?.Minutes);
|
||||
else return string.Format("{0}Days{1}Hours{2}Minutes", (ClosedTime - CreateTime)?.Days, (ClosedTime - CreateTime)?.Hours, (ClosedTime - CreateTime)?.Minutes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,7 +255,7 @@ namespace IRaCIS.Core.Application.Contracts.DTO
|
||||
|
||||
public class TrialVisitQADTO
|
||||
{
|
||||
|
||||
public bool ExistsManual { get; set; }
|
||||
public SubjectClinicalDataDto SubjectClinicalData { get; set; } = new SubjectClinicalDataDto();
|
||||
|
||||
public List<NoneDicomStudyView> NoneDicomStudyList { get; set; } = new List<NoneDicomStudyView>();
|
||||
|
||||
@@ -204,7 +204,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
if (!ClosedTime.HasValue)
|
||||
return "";
|
||||
else return string.Format("{0}天{1}小时{2}分钟", (ClosedTime - CreateTime)?.Days, (ClosedTime - CreateTime)?.Hours, (ClosedTime - CreateTime)?.Minutes);
|
||||
else return string.Format("{0}d {1}h {2}min", (ClosedTime - CreateTime)?.Days, (ClosedTime - CreateTime)?.Hours, (ClosedTime - CreateTime)?.Minutes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -836,6 +836,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public Arm ArmEnum { get; set; }
|
||||
public string UserName { get; set; }
|
||||
|
||||
public ReadingCategory ReadingCategory { get; set; }
|
||||
|
||||
[DictionaryTranslateAttribute("ExistDisease", CriterionType.RECIST1Point1, nameof(OverallTumorEvaluationExport.IsBaseline), "true")]
|
||||
[DictionaryTranslateAttribute("OverallAssessment", CriterionType.RECIST1Point1, nameof(OverallTumorEvaluationExport.IsBaseline), "false")]
|
||||
@@ -844,11 +845,22 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
//整体肿瘤评估结果 需要翻译
|
||||
public string OverallTumorEvaluationResult { get; set; }
|
||||
|
||||
public Guid? JudgeResultTaskId { get; set; }
|
||||
|
||||
#region old 废弃
|
||||
|
||||
//public Guid? JudgeResultTaskId { get; set; }
|
||||
|
||||
//[DictionaryTranslateAttribute("YesOrNo")]
|
||||
//public bool IsGenerateJudge => JudgeResultTaskId != null;
|
||||
#endregion
|
||||
|
||||
|
||||
public Arm? JudgeArmEnum { get; set; }
|
||||
|
||||
|
||||
//根据裁判的任务结果 设置访视任务的这个字段 该字段表示 裁判认同该任务的结果
|
||||
[DictionaryTranslateAttribute("YesOrNo")]
|
||||
public bool IsGenerateJudge => JudgeResultTaskId != null;
|
||||
|
||||
public bool IsGenerateJudge { get; set; }
|
||||
|
||||
|
||||
}
|
||||
@@ -1180,7 +1192,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
if (!ClosedTime.HasValue)
|
||||
return "";
|
||||
else return string.Format("{0}天{1}小时{2}分钟", (ClosedTime - CreateTime)?.Days, (ClosedTime - CreateTime)?.Hours, (ClosedTime - CreateTime)?.Minutes);
|
||||
else return string.Format("{0}d {1}h {2}min", (ClosedTime - CreateTime)?.Days, (ClosedTime - CreateTime)?.Hours, (ClosedTime - CreateTime)?.Minutes);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,15 +21,19 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
private readonly IRepository<TrialQCQuestion> _trialQCQuestionRepository;
|
||||
private readonly IRepository<ConsistencyCheckFile> _consistencyCheckFileRepository;
|
||||
|
||||
private IReadingImageTaskService _IReadingImageTaskService;
|
||||
|
||||
public QCListService(
|
||||
IRepository<SubjectVisit> subjectVisitRepository,
|
||||
IRepository<Trial> trialRepository,
|
||||
IRepository<ClinicalDataTrialSet> clinicalDataTrialSet,
|
||||
IRepository<TrialQCQuestionAnswer> trialQCQuestionAnswerRepository,
|
||||
IRepository<TrialQCQuestion> trialQCQuestionRepository,
|
||||
IReadingImageTaskService IReadingImageTaskService,
|
||||
IRepository<ConsistencyCheckFile> consistencyCheckFileRepository
|
||||
)
|
||||
{
|
||||
this._IReadingImageTaskService = IReadingImageTaskService;
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
this._trialQCQuestionAnswerRepository = trialQCQuestionAnswerRepository;
|
||||
this._trialQCQuestionRepository = trialQCQuestionRepository;
|
||||
@@ -606,6 +610,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
{
|
||||
QCQuestionAnswerList = qacheckList,
|
||||
StudyList = temp.StudyList,
|
||||
ExistsManual= (await _IReadingImageTaskService.GetManualList(new GetManualListInDto() { TrialId = sv.TrialId })).Count() > 0,
|
||||
SeriesList = temp.SeriesList,
|
||||
RelationInfo = await GetVisitQCSubjectInfo(subjectVisitId),
|
||||
NoneDicomStudyList = await _repository.Where<NoneDicomStudy>(t => t.SubjectVisitId == subjectVisitId).ProjectTo<NoneDicomStudyView>(_mapper.ConfigurationProvider).ToListAsync(),
|
||||
|
||||
@@ -716,9 +716,10 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
|
||||
|
||||
study.BodyPartForEdit = updateModalityCommand.BodyPart;
|
||||
//study.Modalities = updateModalityCommand.Modality;
|
||||
|
||||
study.ModalityForEdit = updateModalityCommand.Modality;
|
||||
await _repository.BatchUpdateAsync<DicomSeries>(t => t.StudyId == studyId, r => new DicomSeries() { BodyPartForEdit = updateModalityCommand.BodyPart, Modality = updateModalityCommand.Modality });
|
||||
|
||||
await _repository.BatchUpdateAsync<DicomSeries>(t => t.StudyId == studyId, r => new DicomSeries() { BodyPartForEdit = updateModalityCommand.BodyPart });
|
||||
}
|
||||
else if (updateModalityCommand.Type == 2)
|
||||
{
|
||||
@@ -954,7 +955,8 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
}
|
||||
else
|
||||
{
|
||||
return ResponseOutput.NotOk("项目配置为单审,不满足SubmmitState:已提交 或者 AuditState:待审核/审核中, 不允许领取,请刷新界面");
|
||||
// ---项目配置为单审,不满足Submmit State:已提交 或者 Audit State:待审核/审核中, 不允许领取,请刷新界面
|
||||
return ResponseOutput.NotOk(_localizer["QCOperation_NoSingleAudit"]);
|
||||
}
|
||||
}
|
||||
else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit)
|
||||
@@ -2044,8 +2046,8 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId,
|
||||
u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed });
|
||||
|
||||
|
||||
return ResponseOutput.NotOk("转发影像失败: " + e.Message);
|
||||
// --转发影像失败
|
||||
return ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"] + e.Message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -100,10 +100,11 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(queryQCQuestionConfigure.Type), t => t.Type.Contains(queryQCQuestionConfigure.Type))
|
||||
.WhereIf(queryQCQuestionConfigure.LanguageType!=null, t =>t.LanguageType== queryQCQuestionConfigure.LanguageType)
|
||||
.WhereIf(queryQCQuestionConfigure.IsDefeaultViewParent==true,t=>t.ParentId==null)
|
||||
.OrderBy(t=>t.ShowOrder)
|
||||
.OrderByDescending(x=>x.LanguageType)
|
||||
.ThenBy(t=>t.ShowOrder)
|
||||
.ProjectTo<QCQuestionConfigureView>(_mapper.ConfigurationProvider);
|
||||
|
||||
return await QCQuestionQueryable.ToPagedListAsync(queryQCQuestionConfigure.PageIndex, queryQCQuestionConfigure.PageSize, queryQCQuestionConfigure.SortField.IsNullOrEmpty()?nameof(queryQCQuestionConfigure.QuestionName): queryQCQuestionConfigure.SortField, queryQCQuestionConfigure.Asc);
|
||||
return await QCQuestionQueryable.ToPagedListAsync(queryQCQuestionConfigure.PageIndex, queryQCQuestionConfigure.PageSize, new string[2] { "LanguageType desc", "ShowOrder asc" });
|
||||
}
|
||||
|
||||
public async Task<IResponseOutput> AddOrUpdateQCQuestionConfigure(QCQuestionAddOrEdit addOrEditQCQuestionConfigure)
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
.ProjectTo<TrialQCQuestionConfigureView>(_mapper.ConfigurationProvider);
|
||||
|
||||
var list = await trialQCQuestionQueryable.OrderBy(t => t.ShowOrder).ToListAsync();
|
||||
var list = await trialQCQuestionQueryable.OrderByDescending(x=>x.LanguageType).ThenBy(t => t.ShowOrder).ToListAsync();
|
||||
|
||||
var isHaveQCQuestion = _repository.Where<TrialQCQuestion>(t => t.TrialId == queryTrialQCQuestionConfigure.TrialId).Any();
|
||||
|
||||
|
||||
@@ -172,6 +172,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
// .ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName))
|
||||
.ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine))
|
||||
|
||||
.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).FirstOrDefault().Answer)
|
||||
|
||||
+62
-16
@@ -19,6 +19,7 @@ using IRaCIS.Core.Domain.Share.Reading;
|
||||
using System.Runtime.InteropServices;
|
||||
using DocumentFormat.OpenXml.Bibliography;
|
||||
using System.Linq.Expressions;
|
||||
using MathNet.Numerics.Statistics.Mcmc;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
@@ -72,7 +73,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<(PageOutput<SubjectCriteriaEvaluationView>, object)> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery)
|
||||
public async Task<IResponseOutput<PageOutput<SubjectCriteriaEvaluationView>> > GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery)
|
||||
{
|
||||
|
||||
var trialReadingCritionList = _trialReadingCriterionRepository.Where(t => t.TrialId == inQuery.TrialId).ToList();
|
||||
@@ -235,7 +236,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
|
||||
return (pageList, addtionalQustionInfoList);
|
||||
return ResponseOutput.Ok (pageList, addtionalQustionInfoList);
|
||||
}
|
||||
|
||||
|
||||
@@ -257,17 +258,24 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
var entity = await _subjectCriteriaEvaluationRepository.InsertFromDTOAsync(addOrEditSubjectCriteriaEvaluation);
|
||||
|
||||
//找到一致性核查通过的访视 并且没有 自动影像筛选的数据
|
||||
var subjectVisitIdList = await _subjectVisitRepository.Where(t => t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId && t.CheckState == CheckStateEnum.CVPassed
|
||||
&& !t.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId)).Select(t => t.Id)
|
||||
.ToListAsync();
|
||||
|
||||
|
||||
foreach (var subjectVisitId in subjectVisitIdList)
|
||||
if (addOrEditSubjectCriteriaEvaluation.IsJoinEvaluation)
|
||||
{
|
||||
await AutoSubjectCriteriaEvaluationVisitFilter(addOrEditSubjectCriteriaEvaluation.SubjectId, subjectVisitId, addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId);
|
||||
|
||||
//找到一致性核查通过的访视 并且没有 自动影像筛选的数据
|
||||
var subjectVisitIdList = await _subjectVisitRepository.Where(t => t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId && t.CheckState == CheckStateEnum.CVPassed
|
||||
&& !t.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId)).Select(t => t.Id)
|
||||
.ToListAsync();
|
||||
|
||||
|
||||
foreach (var subjectVisitId in subjectVisitIdList)
|
||||
{
|
||||
await AutoSubjectCriteriaEvaluationVisitFilter(addOrEditSubjectCriteriaEvaluation.SubjectId, subjectVisitId, addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
//编辑
|
||||
@@ -488,12 +496,21 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[UnitOfWork]
|
||||
public async Task BatchGenerateTask(BatchGenerateTaskCommand batchGenerateTaskCommand)
|
||||
public async Task<IResponseOutput> BatchGenerateTask(BatchGenerateTaskCommand batchGenerateTaskCommand)
|
||||
{
|
||||
|
||||
await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == batchGenerateTaskCommand.SubjectId
|
||||
var trakingList= await _subjectCriteriaEvaluationVisitFilterRepository.Where(t => t.SubjectId == batchGenerateTaskCommand.SubjectId
|
||||
&& t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId
|
||||
&& batchGenerateTaskCommand.SubjectVisitIdList.Contains(t.SubjectVisitId), u => new SubjectCriteriaEvaluationVisitFilter { IsGeneratedTask = true });
|
||||
&& batchGenerateTaskCommand.SubjectVisitIdList.Contains(t.SubjectVisitId),true).ToListAsync();
|
||||
|
||||
foreach (var item in trakingList)
|
||||
{
|
||||
item.IsGeneratedTask = true;
|
||||
}
|
||||
|
||||
//await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == batchGenerateTaskCommand.SubjectId
|
||||
//&& t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId
|
||||
//&& batchGenerateTaskCommand.SubjectVisitIdList.Contains(t.SubjectVisitId), u => new SubjectCriteriaEvaluationVisitFilter { IsGeneratedTask = true });
|
||||
|
||||
//自动生成任务
|
||||
|
||||
@@ -506,6 +523,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
var generateVisitIdList = idList.Except(haveGenerateVisitIdList);
|
||||
|
||||
await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(batchGenerateTaskCommand.TrialId, batchGenerateTaskCommand.TrialReadingCriterionId, true, generateVisitIdList.Select(t => (Guid)t).ToList());
|
||||
|
||||
await _subjectCriteriaEvaluationVisitFilterRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
@@ -566,10 +587,35 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// <returns></returns>
|
||||
public async Task<IResponseOutput> BatchAddSubjectCriteriaEvaluationVisitStudyFilter(List<SubjectCriteriaEvaluationVisitStudyFilterAddOrEdit> batchList)
|
||||
{
|
||||
var ids = batchList.Select(t => t.Id).ToList();
|
||||
await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => ids.Contains(t.Id));
|
||||
|
||||
await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map<List<SubjectCriteriaEvaluationVisitStudyFilter>>(batchList));
|
||||
var ids = batchList.Where(t => t.Id != null).Select(t => t.Id).ToList();
|
||||
#region 稽查修改前
|
||||
|
||||
//await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => ids.Contains(t.Id));
|
||||
|
||||
//await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map<List<SubjectCriteriaEvaluationVisitStudyFilter>>(batchList));
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 查询再更新
|
||||
if (ids.Count > 0)
|
||||
{
|
||||
var list = await _subjectCriteriaEvaluationVisitStudyFilterRepository.Where(t => ids.Contains(t.Id), true).ToListAsync();
|
||||
|
||||
foreach (var item in list)
|
||||
{
|
||||
item.IsReading = batchList.FirstOrDefault(t => t.Id == item.Id)?.IsReading ?? item.IsReading;
|
||||
item.IsConfirmed = batchList.FirstOrDefault(t => t.Id == item.Id)?.IsConfirmed ?? item.IsConfirmed;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map<List<SubjectCriteriaEvaluationVisitStudyFilter>>(batchList));
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
var first = batchList.First();
|
||||
|
||||
@@ -280,11 +280,14 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
var data = await _readingClinicalDataRepository.FirstOrDefaultAsync(t => t.Id == inDto.ReadingClinicalDataId);
|
||||
|
||||
if (data.ReadingClinicalDataState != ReadingClinicalDataStatus.HaveChecked)
|
||||
{
|
||||
//---当前临床数据状态不是已核查状态,不允许签名!
|
||||
throw new BusinessValidationFailedException(_localizer["ReadingClinicalData_Unchecked"]);
|
||||
}
|
||||
//if (data.ReadingClinicalDataState != ReadingClinicalDataStatus.HaveChecked)
|
||||
//{
|
||||
// //---当前临床数据状态不是已核查状态,不允许签名!
|
||||
// throw new BusinessValidationFailedException(_localizer["ReadingClinicalData_Unchecked"]);
|
||||
//}
|
||||
|
||||
data.IsBlind = inDto.IsBlind;
|
||||
data.IsComplete=inDto.IsComplete;
|
||||
data.IsSign = true;
|
||||
data.ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned;
|
||||
|
||||
@@ -414,7 +417,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
|
||||
|
||||
|
||||
// 废弃 接口合并到签名哪里
|
||||
|
||||
[HttpPut]
|
||||
public async Task<IResponseOutput> PMClinicalDataConfirm(PMClinicalDataConfirmCommand command)
|
||||
{
|
||||
@@ -424,9 +428,12 @@ namespace IRaCIS.Application.Services
|
||||
IsComplete = command.IsComplete,
|
||||
ReadingClinicalDataState = ReadingClinicalDataStatus.HaveChecked
|
||||
});
|
||||
|
||||
await _readingClinicalDataRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -54,6 +54,34 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
public string VisitName { get; set; }
|
||||
}
|
||||
|
||||
public class GetCanChangeReadVisitListInDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 受试者ID
|
||||
/// </summary>
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
[NotDefault]
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
public Guid Id { get; set; }
|
||||
}
|
||||
|
||||
public class ChangeCutOffVisitInDto
|
||||
{
|
||||
|
||||
|
||||
[NotDefault]
|
||||
public Guid Id { get; set; }
|
||||
|
||||
|
||||
public Guid SubjectVisitIdId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 模块名称
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
||||
public class GetSubjectReadVisitsInDto
|
||||
{
|
||||
|
||||
@@ -137,7 +137,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
public decimal FristAddTaskNum { get; set; }
|
||||
|
||||
public ReportLayType ReportLayType { get; set; } = ReportLayType.Group;
|
||||
|
||||
|
||||
public string ReportMark { get; set; } = string.Empty;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 问题英文分组
|
||||
@@ -176,7 +178,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
|
||||
public object ReportCalculateResult{ get; set; }
|
||||
|
||||
public object CalculateResult { get; set; }
|
||||
public GetReportVerifyOutDto CalculateResult { get; set; }
|
||||
public ReadingTaskState ReadingTaskState { get; set; }
|
||||
|
||||
public List<VisitTaskInfo> VisitTaskList { get; set; }
|
||||
@@ -330,7 +332,30 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
public List<AdditionalQuestionAnswer> AnswerList { get; set; } = new List<AdditionalQuestionAnswer>();
|
||||
}
|
||||
|
||||
public class GetTaskAdditionalQuestionInDto
|
||||
public class GetManualListInDto
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class GetManualListOutDto
|
||||
{
|
||||
|
||||
public Guid Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Name
|
||||
/// </summary>
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Path
|
||||
/// </summary>
|
||||
public string Path { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
|
||||
public class GetTaskAdditionalQuestionInDto
|
||||
{
|
||||
//public Guid TrialReadingCriterionId { get; set; }
|
||||
public Guid VisitTaskId { get; set; }
|
||||
@@ -447,10 +472,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
/// </summary>
|
||||
public Guid VisitTaskId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// TrialId
|
||||
/// </summary>
|
||||
public Guid TrialId { get; set; }
|
||||
/// <summary>
|
||||
/// 标记工具
|
||||
/// </summary>
|
||||
public string MarkTool { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// TrialId
|
||||
/// </summary>
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 首次添加任务ID
|
||||
@@ -546,6 +576,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
|
||||
|
||||
public int? NumberOfFrames { get; set; }
|
||||
|
||||
@@ -568,6 +599,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
/// </summary>
|
||||
public string FromMark { get; set; } = string.Empty;
|
||||
|
||||
public string ReportMark { get; set; } = string.Empty;
|
||||
|
||||
public string RowMark { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
@@ -1181,7 +1214,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
public List<GlobalQuestionInfo> AgreeOrNot { get; set; }
|
||||
|
||||
public List<GlobalQuestionInfo> AfterQuestionList { get; set; }
|
||||
}
|
||||
|
||||
public List<LesionDto> LesionCountList { get; set; } = new List<LesionDto>();
|
||||
}
|
||||
|
||||
public class GetGlobalQuestionType
|
||||
{
|
||||
@@ -1357,7 +1392,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
|
||||
public string SubjectCode { get; set; }=String.Empty;
|
||||
|
||||
public ReadingCategory ReadingCategory { get; set; }
|
||||
public bool ExistsManual { get; set; }
|
||||
|
||||
public ReadingCategory ReadingCategory { get; set; }
|
||||
|
||||
public decimal VisitNum { get; set; }
|
||||
|
||||
@@ -1374,10 +1411,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
|
||||
public bool IsFirstChangeTask { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 是否是转变的任务(转为IRECIST)
|
||||
/// </summary>
|
||||
public bool IsConvertedTask { get; set; } = false;
|
||||
public ReadingTaskState ReadingTaskState { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否是转变的任务(转为IRECIST)
|
||||
/// </summary>
|
||||
public bool IsConvertedTask { get; set; } = false;
|
||||
|
||||
}
|
||||
|
||||
@@ -1653,6 +1692,19 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
public Func<ReadingCalculateDto, Task<string>> Fun { get; set; }
|
||||
}
|
||||
|
||||
public class GetReportVerifyOutDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 是否存在疾病
|
||||
/// </summary>
|
||||
public string? IsExistDisease { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 整体肿瘤评估
|
||||
/// </summary>
|
||||
public string? TumorEvaluate { get; set; }
|
||||
}
|
||||
|
||||
public class GetReportVerifyInDto
|
||||
{
|
||||
public Guid VisitTaskId { get; set; }
|
||||
@@ -1694,7 +1746,14 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
|
||||
public string FromMark { get; set; } = string.Empty;
|
||||
|
||||
public decimal RowIndex { get; set; }
|
||||
public string ReportMark { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 标记工具
|
||||
/// </summary>
|
||||
public string MarkTool { get; set; } = string.Empty;
|
||||
|
||||
public decimal RowIndex { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 截图地址
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-05-08 15:20:44
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.Collections.Generic;
|
||||
namespace IRaCIS.Core.Application.ViewModel
|
||||
{
|
||||
/// <summary> UserWLTemplateView 列表视图模型 </summary>
|
||||
public class UserWLTemplateView
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string TemplateName { get; set; }
|
||||
public Guid UserId { get; set; }
|
||||
public DateTime CreateTime { get; set; }
|
||||
public Guid CreateUserId { get; set; }
|
||||
public int WW { get; set; }
|
||||
public int WL { get; set; }
|
||||
public int ShowOrder { get; set; } = 0;
|
||||
public bool IsPitchOn { get; set; }
|
||||
}
|
||||
|
||||
///<summary>UserWLTemplateQuery 列表查询参数模型</summary>
|
||||
public class UserWLTemplateQuery
|
||||
{
|
||||
///<summary> TemplateName</summary>
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class SetAutoCutNextTaskInDto
|
||||
{
|
||||
public bool AutoCutNextTask { get; set; }
|
||||
}
|
||||
|
||||
///<summary> UserWLTemplateAddOrEdit 列表查询参数模型</summary>
|
||||
public class UserWLTemplateAddOrEdit
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
public string TemplateName { get; set; }
|
||||
public Guid UserId { get; set; }
|
||||
public DateTime CreateTime { get; set; }
|
||||
public Guid CreateUserId { get; set; }
|
||||
public int WW { get; set; }
|
||||
public int WL { get; set; }
|
||||
//public int ShowOrder { get; set; }
|
||||
//public bool IsPitchOn { get; set; }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -33,5 +33,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
Task<IResponseOutput> SubmitOncologyReadingInfo(SubmitOncologyReadingInfoInDto inDto);
|
||||
|
||||
Task AddOncologyTask(Guid oncologModuleId);
|
||||
|
||||
Task<List<GetManualListOutDto>> GetManualList(GetManualListInDto inDto);
|
||||
}
|
||||
}
|
||||
@@ -585,10 +585,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
TrialId = inDto.TrialId,
|
||||
TaskIdList = new List<Guid>()
|
||||
{
|
||||
visitTaskId
|
||||
|
||||
visitTaskId
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(x => !x.IsClosedDialog && x.Id == inDto.TaskMedicalReviewId, x => new TaskMedicalReview()
|
||||
{
|
||||
IsClosedDialog = true,
|
||||
@@ -598,9 +599,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
IsApplyHeavyReading = true,
|
||||
FileName = inDto.FileName,
|
||||
ImagePath = JsonConvert.SerializeObject(inDto.FileList),
|
||||
DisagreeReason = inDto.DisagreeReason,
|
||||
|
||||
|
||||
DisagreeReason = inDto.DisagreeReason,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+8
-4
@@ -62,7 +62,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
.WhereIf(inDto.LanguageType != null, x => x.LanguageType == inDto.LanguageType.Value)
|
||||
.ProjectTo<ReadingMedicineSystemQuestionView>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder);
|
||||
|
||||
return await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize,inDto.SortField,inDto.Asc);
|
||||
return await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, new string[2] { "LanguageType desc", "ShowOrder asc" });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -158,7 +158,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
.WhereIf(!inDto.Type.IsNullOrEmpty(), x => x.Type.Contains(inDto.Type))
|
||||
.WhereIf(inDto.ReadingCategory != null, x => x.ReadingCategory == inDto.ReadingCategory)
|
||||
.WhereIf(inDto.LanguageType != null, x => x.LanguageType == inDto.LanguageType)
|
||||
.ProjectTo<ReadingMedicineTrialQuestionView>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder);
|
||||
.ProjectTo<ReadingMedicineTrialQuestionView>(_mapper.ConfigurationProvider).OrderByDescending(x=>x.LanguageType).ThenBy(x => x.ShowOrder);
|
||||
|
||||
|
||||
var isConfirmMedicineQuestion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.IsConfirmMedicineQuestion).FirstOrDefaultAsync();
|
||||
@@ -329,9 +329,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
|
||||
if (!readingMedicineQuestionList.Any(x => x.ReadingCategory == ReadingCategory.Visit))
|
||||
{
|
||||
|
||||
throw new BusinessValidationFailedException(_localizer["ReadingMed_VisitQNotConfig"]);
|
||||
}
|
||||
|
||||
|
||||
if (criterionInfo.IsGlobalReading && !readingMedicineQuestionList.Any(x => x.ReadingCategory == ReadingCategory.Global))
|
||||
if (criterionInfo.IsGlobalReading && !readingMedicineQuestionList.Any(x => x.ReadingCategory == ReadingCategory.Global))
|
||||
{
|
||||
//---当前标准启用了全局阅片,但未配置全局医学审核问题
|
||||
throw new BusinessValidationFailedException(_localizer["ReadingMed_GlobalQNotConfig"]);
|
||||
|
||||
@@ -466,6 +466,19 @@ namespace IRaCIS.Core.Application.Service
|
||||
TrialCriterionId= readingQuestionCriterionTrial.Id,
|
||||
OrganInfoId = x.Id,
|
||||
TrialId = readingQuestionCriterionTrial.TrialId,
|
||||
TULAT=x.TULAT,
|
||||
Classification=x.Classification,
|
||||
ClassificationEN=x.ClassificationEN,
|
||||
IsCanEditPosition=x.IsCanEditPosition,
|
||||
Part=x.Part,
|
||||
IsLymphNodes=x.IsLymphNodes,
|
||||
PartEN=x.PartEN,
|
||||
ShowOrder=x.ShowOrder,
|
||||
TULATEN=x.TULATEN,
|
||||
TULOC=x.TULOC,
|
||||
TULOCEN=x.TULOCEN,
|
||||
OrganType=x.OrganType,
|
||||
|
||||
}).ToListAsync();
|
||||
|
||||
organTrialInfoList.ForEach(x => x.Id = NewId.NextGuid());
|
||||
|
||||
@@ -584,8 +584,8 @@ namespace IRaCIS.Core.Application.Service.RC
|
||||
}
|
||||
else
|
||||
{
|
||||
return await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.SystemCriterionId
|
||||
)
|
||||
return await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialCriterionId
|
||||
)
|
||||
.WhereIf(!inDto.ParentCode.IsNullOrEmpty(), x => x.ParentCode == inDto.ParentCode)
|
||||
.ProjectTo<CriterionDictionaryInfo>(_mapper.ConfigurationProvider).OrderBy(x => x.ParentCode).ThenBy(x => x.ShowOrder).ToListAsync();
|
||||
}
|
||||
@@ -682,6 +682,7 @@ namespace IRaCIS.Core.Application.Service.RC
|
||||
x.ReadingQuestionCriterionSystemId = x.Id;
|
||||
x.Id = NewId.NextGuid();
|
||||
|
||||
x.IsAutoCreate=x.CriterionType==CriterionType.RECIST1Pointt1_MB?false:true;
|
||||
// 同步问题暂时注释
|
||||
//List<ReadingQuestionTrial> readingQuestionTrialList = new List<ReadingQuestionTrial>();
|
||||
//SetChildParentQuestion(criterion.Id, trialId, systemQuestionList, readingQuestionTrialList);
|
||||
|
||||
+11
-3
@@ -230,8 +230,13 @@ namespace IRaCIS.Application.Services
|
||||
VisitNum = x.SourceSubjectVisit.VisitNum,
|
||||
IsBaseLine = x.SourceSubjectVisit.IsBaseLine,
|
||||
VisitId = x.SourceSubjectVisitId.Value,
|
||||
//CrterionDictionaryGroup= x.CrterionDictionaryGroup,
|
||||
BeforeQuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.GlobalReadingShowType!=GlobalReadingShowType.NotShow).OrderBy(y => y.ReadingQuestionTrial.ShowOrder)
|
||||
LesionCountList=x.LesionList.GroupBy(y=>y.ReadingQuestionTrial.LesionType).Select(x => new LesionDto
|
||||
{
|
||||
LesionType = x.Key.Value,
|
||||
Count = x.ToList().Count()
|
||||
}).ToList(),
|
||||
//CrterionDictionaryGroup= x.CrterionDictionaryGroup,
|
||||
BeforeQuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.GlobalReadingShowType!=GlobalReadingShowType.NotShow).OrderBy(y => y.ReadingQuestionTrial.ShowOrder)
|
||||
.Select(y => new GlobalQuestionInfo()
|
||||
{
|
||||
|
||||
@@ -345,7 +350,7 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
result.TaskList.ForEach(x =>
|
||||
{
|
||||
x.AfterQuestionList = x.BeforeQuestionList.Where(x => x.IsJudgeQuestion)
|
||||
x.AfterQuestionList = x.BeforeQuestionList
|
||||
.GroupJoin(
|
||||
globalReadingQuestion
|
||||
, l => new { a = l.QuestionId, b = x.VisitTaskId }
|
||||
@@ -474,6 +479,9 @@ namespace IRaCIS.Application.Services
|
||||
// 在修改前 去除这个问题
|
||||
x.BeforeQuestionList = x.BeforeQuestionList.Where(x => x.QuestionType != QuestionType.SiteVisitForTumorEvaluation).ToList();
|
||||
|
||||
|
||||
x.AfterQuestionList = x.AfterQuestionList.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation|| x.GlobalAnswerType != GlobalAnswerType.Question).ToList();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+112
-21
@@ -14,6 +14,7 @@ using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
using DocumentFormat.OpenXml.Drawing;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
@@ -42,9 +43,11 @@ namespace IRaCIS.Application.Services
|
||||
private readonly IRepository<ReadModule> _readModuleRepository;
|
||||
private readonly IRepository<DicomInstance> _dicomInstanceRepository;
|
||||
private readonly IRepository<OrganInfo> _organInfoRepository;
|
||||
private readonly IRepository<TrialDocument> _trialDocumentRepository;
|
||||
private readonly IRepository<User> _userRepository;
|
||||
private readonly IRepository<ReadingSystemCriterionDictionary> _readingCriterionDictionaryRepository;
|
||||
private readonly IRepository<ReadingTrialCriterionDictionary> _readingTrialCriterionDictionaryRepository;
|
||||
private readonly IRepository<TumorAssessment_RECIST1Point1> _tumorAssessmentRepository;
|
||||
private readonly IRepository<ReadingTrialCriterionDictionary> _readingTrialCriterionDictionaryRepository;
|
||||
private readonly IRepository<TumorAssessment_RECIST1Point1> _tumorAssessmentRepository;
|
||||
private readonly IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository;
|
||||
private readonly IRepository<ReadingTableQuestionSystem> _readingTableQuestionSystemRepository;
|
||||
private readonly IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository;
|
||||
@@ -74,15 +77,17 @@ namespace IRaCIS.Application.Services
|
||||
IRepository<Subject> subjectRepository,
|
||||
IRepository<ReadingGlobalTaskInfo> readingGlobalTaskInfoRepository,
|
||||
IRepository<ReadingCriterionPage> readingCriterionPageRepository,
|
||||
IRepository<ReadingTaskRelation> readingTaskRelationRepository,
|
||||
IRepository<ReadingTaskRelation> readingTaskRelationRepository,
|
||||
IRepository<ReadingJudgeInfo> readingJudgeInfoRepository,
|
||||
IRepository<ReadModule> readModuleRepository,
|
||||
IRepository<DicomInstance> dicomInstanceRepository,
|
||||
IRepository<OrganInfo> organInfoRepository,
|
||||
IRepository<OrganInfo> organInfoRepository,
|
||||
IRepository<TrialDocument> trialDocumentRepository,
|
||||
IRepository<User> userRepository,
|
||||
IMemoryCache cache,
|
||||
IRepository<ReadingSystemCriterionDictionary> readingCriterionDictionaryRepository,
|
||||
IRepository<ReadingTrialCriterionDictionary> readingTrialCriterionDictionaryRepository,
|
||||
IRepository<TumorAssessment_RECIST1Point1> tumorAssessmentRepository,
|
||||
IRepository<ReadingTrialCriterionDictionary> readingTrialCriterionDictionaryRepository,
|
||||
IRepository<TumorAssessment_RECIST1Point1> tumorAssessmentRepository,
|
||||
IRepository<ReadingTableAnswerRowInfo> readingTableAnswerRowInfoRepository,
|
||||
IRepository<ReadingTableQuestionSystem> readingTableQuestionSystemRepository,
|
||||
IRepository<ReadingTableQuestionTrial> readingTableQuestionTrialRepository,
|
||||
@@ -90,8 +95,8 @@ namespace IRaCIS.Application.Services
|
||||
IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository,
|
||||
IRepository<ReadingQuestionCriterionSystem> readingQuestionCriterionSystemRepository,
|
||||
IRepository<ReadingQuestionSystem> ReadingQuestionSystem,
|
||||
ITrialEmailNoticeConfigService trialEmailNoticeConfigService,
|
||||
IRepository<NoneDicomStudyFile> noneDicomStudyFileSystem,
|
||||
ITrialEmailNoticeConfigService trialEmailNoticeConfigService,
|
||||
IRepository<NoneDicomStudyFile> noneDicomStudyFileSystem,
|
||||
IRepository<ReadingQuestionTrial> readingQuestionTrialRepository
|
||||
)
|
||||
{
|
||||
@@ -114,6 +119,8 @@ namespace IRaCIS.Application.Services
|
||||
this._readModuleRepository = readModuleRepository;
|
||||
this._dicomInstanceRepository = dicomInstanceRepository;
|
||||
this._organInfoRepository = organInfoRepository;
|
||||
this._trialDocumentRepository = trialDocumentRepository;
|
||||
this._userRepository = userRepository;
|
||||
this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository;
|
||||
this._tumorAssessmentRepository = tumorAssessmentRepository;
|
||||
this._readingTableAnswerRowInfoRepository = readingTableAnswerRowInfoRepository;
|
||||
@@ -124,13 +131,46 @@ namespace IRaCIS.Application.Services
|
||||
this._readingQuestionCriterionSystemRepository = readingQuestionCriterionSystemRepository;
|
||||
this._readingTrialCriterionDictionaryRepository = readingTrialCriterionDictionaryRepository;
|
||||
|
||||
this._readingQuestionSystem = ReadingQuestionSystem;
|
||||
this._readingQuestionSystem = ReadingQuestionSystem;
|
||||
this._noneDicomStudyFileSystem = noneDicomStudyFileSystem;
|
||||
this._readingQuestionTrialRepository = readingQuestionTrialRepository;
|
||||
this._cache = cache;
|
||||
this._trialEmailNoticeConfigService = trialEmailNoticeConfigService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取手册
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<GetManualListOutDto>> GetManualList(GetManualListInDto inDto)
|
||||
{
|
||||
UserTypeEnum userType = (UserTypeEnum)_userInfo.UserTypeEnumInt;
|
||||
|
||||
|
||||
List<UserTypeEnum> canViewUserType = new List<UserTypeEnum>()
|
||||
{
|
||||
UserTypeEnum.IndependentReviewer,
|
||||
UserTypeEnum.IQC,
|
||||
|
||||
};
|
||||
|
||||
return await _trialDocumentRepository.Where(x => x.TrialId == inDto.TrialId
|
||||
&& x.TrialDocConfirmedUserList.Any(y => y.ConfirmUserId == _userInfo.Id && y.ConfirmTime != null)
|
||||
&& x.NeedConfirmedUserTypeList.Any(y => y.NeedConfirmUserTypeId == _userInfo.UserTypeId))
|
||||
.WhereIf(userType== UserTypeEnum.IndependentReviewer, t => t.FileType.Code == "2" || t.FileType.Code == "6")
|
||||
.WhereIf(userType == UserTypeEnum.IQC, t => t.FileType.Code == "4" || t.FileType.Code == "5")
|
||||
.WhereIf(!canViewUserType.Contains(userType),t=>false)
|
||||
.IgnoreQueryFilters()
|
||||
.Select(x => new GetManualListOutDto()
|
||||
{
|
||||
Id = x.Id,
|
||||
Name = x.Name,
|
||||
Path = x.Path
|
||||
}).ToListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取任务附加问题
|
||||
/// </summary>
|
||||
@@ -1027,7 +1067,7 @@ namespace IRaCIS.Application.Services
|
||||
var pageGroupList = newPageQusetionList.Where(x => x.Type == ReadingQestionType.Group).ToList();
|
||||
pageGroupList.ForEach(x =>
|
||||
{
|
||||
this.FindChildQuestion(x, newPageQusetionList, tableQuestionList, inDto.TableAnswers, inDto.TableAnsweRowInfos, inDto.OrganInfos, baseLineTableAnswer, isFirstChangeTask, lastTaskTableAnswer);
|
||||
this.FindChildQuestion(x, newPageQusetionList, tableQuestionList, inDto.TableAnswers, inDto.TableAnsweRowInfos, inDto.OrganInfos, baseLineTableAnswer, isFirstChangeTask, lastTaskTableAnswer, inDto.TaskId);
|
||||
});
|
||||
|
||||
page.Childrens = pageGroupList.Where(x => !(x.Type == ReadingQestionType.Group && x.Childrens.Count() == 0)).ToList();
|
||||
@@ -1044,7 +1084,7 @@ namespace IRaCIS.Application.Services
|
||||
groupList = qusetionList.Where(x => x.Type == ReadingQestionType.Group).ToList();
|
||||
groupList.ForEach(x =>
|
||||
{
|
||||
this.FindChildQuestion(x, qusetionList, tableQuestionList, inDto.TableAnswers, inDto.TableAnsweRowInfos, inDto.OrganInfos, baseLineTableAnswer, isFirstChangeTask, lastTaskTableAnswer);
|
||||
this.FindChildQuestion(x, qusetionList, tableQuestionList, inDto.TableAnswers, inDto.TableAnsweRowInfos, inDto.OrganInfos, baseLineTableAnswer, isFirstChangeTask, lastTaskTableAnswer, inDto.TaskId);
|
||||
});
|
||||
|
||||
groupList = groupList.Where(x => !(x.Type == ReadingQestionType.Group && x.Childrens.Count() == 0)).ToList();
|
||||
@@ -1064,7 +1104,7 @@ namespace IRaCIS.Application.Services
|
||||
/// <param name="item"></param>
|
||||
/// <param name="questionlists"></param>
|
||||
/// <param name="tableQuestionLists"></param>
|
||||
private async void FindChildQuestion(TrialReadQuestionData item, List<TrialReadQuestionData> questionlists, List<TableQuestionTrial> tableQuestionLists, List<ReadingTableQuestionAnswerInfo> tableAnswers, List<TableAnsweRowInfo> tableAnsweRowInfos, List<OrganInfo> organInfos, List<ReadingTableQuestionAnswer> baseLineTableAnswer,bool isFirstChangeTask, List<ReadingTableQuestionAnswer> lastTaskTableAnswer)
|
||||
private async void FindChildQuestion(TrialReadQuestionData item, List<TrialReadQuestionData> questionlists, List<TableQuestionTrial> tableQuestionLists, List<ReadingTableQuestionAnswerInfo> tableAnswers, List<TableAnsweRowInfo> tableAnsweRowInfos, List<OrganInfo> organInfos, List<ReadingTableQuestionAnswer> baseLineTableAnswer,bool isFirstChangeTask, List<ReadingTableQuestionAnswer> lastTaskTableAnswer,Guid? TaskId)
|
||||
{
|
||||
item.Childrens = questionlists.Where(x => x.ParentId == item.Id || (x.GroupId == item.Id && x.ParentId == null)).ToList();
|
||||
item.TableQuestions = new TrialReadTableQuestion();
|
||||
@@ -1112,10 +1152,15 @@ namespace IRaCIS.Application.Services
|
||||
QuestionMark.Part,
|
||||
};
|
||||
|
||||
orders.ForEach(x =>
|
||||
foreach (var x in orders)
|
||||
{
|
||||
Dictionary<string, string> answers = new Dictionary<string, string>();
|
||||
var rowInfo = tableAnsweRowInfos.Where(y => y.RowIndex == x && y.QuestionId == item.Id).FirstOrDefault();
|
||||
var rowInfo = tableAnsweRowInfos.First(y => y.RowIndex == x && y.QuestionId == item.Id);
|
||||
if (rowInfo == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var rowAnswer = thisAnswer.Where(y => y.RowId == rowInfo.Id).OrderBy(y => y.ShowOrder).ToList();
|
||||
|
||||
var organInfo = organInfos.Where(x => x.Id == rowInfo.OrganInfoId).FirstOrDefault();
|
||||
@@ -1193,29 +1238,33 @@ namespace IRaCIS.Application.Services
|
||||
answers.Add("MeasureData", rowInfo == null ? string.Empty : rowInfo.MeasureData);
|
||||
answers.Add("RowIndex", x.ToString());
|
||||
answers.Add("RowId", rowInfo.Id.ToString());
|
||||
answers.Add("StudyId", rowInfo.StudyId.ToString());
|
||||
answers.Add("MarkTool", rowInfo.MarkTool);
|
||||
answers.Add("StudyId", rowInfo.StudyId.ToString());
|
||||
answers.Add("OrganInfoId", rowInfo.OrganInfoId.ToString());
|
||||
answers.Add("IsCanEditPosition", rowInfo.IsCanEditPosition.ToString());
|
||||
answers.Add("IsFristAdd", (rowInfo.FristAddTaskId== TaskId).ToString());
|
||||
answers.Add("IsCanEditPosition", rowInfo.IsCanEditPosition.ToString());
|
||||
answers.Add("InstanceId", rowInfo == null ? string.Empty : rowInfo.InstanceId.ToString());
|
||||
answers.Add("SeriesId", rowInfo == null ? string.Empty : rowInfo.SeriesId.ToString());
|
||||
answers.Add("IsCurrentTaskAdd", rowInfo == null ? false.ToString() : rowInfo.IsCurrentTaskAdd.ToString());
|
||||
answers.Add("SplitOrMergeLesionName", rowInfo.SplitName.IsNullOrEmpty() ? rowInfo.MergeName : rowInfo.SplitName);
|
||||
answers.Add("SplitOrMergeType", rowInfo.SplitOrMergeType == null ? string.Empty : ((int)rowInfo.SplitOrMergeType).ToString());
|
||||
answers.Add("LastTaskState", lastTaskTableAnswer.Where(n=>n.QuestionId== item.Id&&n.ReadingTableQuestionTrial.QuestionMark==QuestionMark.State&&n.RowIndex==x).Select(n=>n.Answer).FirstOrDefault()??string.Empty);
|
||||
if (rowInfo.LesionType == LesionType.BaselineLesions)
|
||||
answers.Add("LastTaskMajorAxis", lastTaskTableAnswer.Where(n => n.QuestionId == item.Id && n.ReadingTableQuestionTrial.QuestionMark == QuestionMark.MajorAxis && n.RowIndex == x).Select(n => n.Answer).FirstOrDefault() ?? string.Empty);
|
||||
answers.Add("LastTaskShortAxis", lastTaskTableAnswer.Where(n => n.QuestionId == item.Id && n.ReadingTableQuestionTrial.QuestionMark == QuestionMark.ShortAxis && n.RowIndex == x).Select(n => n.Answer).FirstOrDefault() ?? string.Empty);
|
||||
if (rowInfo.LesionType == LesionType.BaselineLesions)
|
||||
{
|
||||
answers.Add("BaseLineLesionNumber", baseLineTableAnswer.Where(n => n.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && n.RowIndex == rowInfo.RowIndex).Select(x => x.Answer).FirstIsNullReturnEmpty());
|
||||
}
|
||||
|
||||
|
||||
item.TableQuestions.Answers.Add(answers);
|
||||
});
|
||||
};
|
||||
|
||||
if (item.Childrens != null && item.Childrens.Count != 0)
|
||||
{
|
||||
item.Childrens.ForEach(x =>
|
||||
{
|
||||
this.FindChildQuestion(x, questionlists, tableQuestionLists, tableAnswers, tableAnsweRowInfos, organInfos, baseLineTableAnswer, isFirstChangeTask, lastTaskTableAnswer);
|
||||
this.FindChildQuestion(x, questionlists, tableQuestionLists, tableAnswers, tableAnsweRowInfos, organInfos, baseLineTableAnswer, isFirstChangeTask, lastTaskTableAnswer, TaskId);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1246,6 +1295,8 @@ namespace IRaCIS.Application.Services
|
||||
rowAnswer.MergeRowId = null;
|
||||
rowAnswer.FristAddTaskId = inDto.VisitTaskId;
|
||||
rowAnswer.SplitOrMergeType = SplitOrMergeType.Split;
|
||||
rowAnswer.FromMark = string.Empty;
|
||||
rowAnswer.ReportMark = string.Empty;
|
||||
rowAnswer.SplitRowId = rowAnswer.Id;
|
||||
rowAnswer.Id = NewId.NextGuid();
|
||||
rowAnswer.InstanceId = null;
|
||||
@@ -1374,7 +1425,40 @@ namespace IRaCIS.Application.Services
|
||||
public async Task<IResponseOutput> ChangeDicomReadingQuestionAnswer(ChangeDicomReadingQuestionAnswerInDto inDto)
|
||||
{
|
||||
await VerifyTaskIsSign(inDto.VisitTaskId);
|
||||
|
||||
|
||||
|
||||
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||||
|
||||
var tumorQuestionId = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskInfo.TrialReadingCriterionId && x.QuestionType == QuestionType.Tumor).Select(x => x.Id).FirstOrDefaultAsync();
|
||||
|
||||
var tumorAnswer = inDto.Answers.Where(x => x.Id == tumorQuestionId).FirstOrDefault();
|
||||
if (tumorAnswer != null)
|
||||
{
|
||||
var isConvertedTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.IsConvertedTask).FirstOrDefaultAsync();
|
||||
var reportVerify = await _readingCalculateService.GetReportVerify(new GetReportVerifyInDto() {
|
||||
BeforeConvertedTaskId= taskInfo.BeforeConvertedTaskId,
|
||||
IsConvertTask= isConvertedTask,
|
||||
VisitTaskId=inDto.VisitTaskId
|
||||
});
|
||||
|
||||
if (tumorAnswer.Answer == reportVerify.TumorEvaluate)
|
||||
{
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
|
||||
{
|
||||
IsChangeTumorEvaluate = false
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
|
||||
{
|
||||
IsChangeTumorEvaluate = true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var criterionId = taskInfo.TrialReadingCriterionId;
|
||||
var questionIds = inDto.Answers.Select(x => x.Id).ToList();
|
||||
await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && questionIds.Contains(x.ReadingQuestionTrialId));
|
||||
@@ -1848,6 +1932,9 @@ namespace IRaCIS.Application.Services
|
||||
rowInfo.IsDicomReading = inDto.IsDicomReading;
|
||||
rowInfo.IsCurrentTaskAdd = isCurrentTaskAdd;
|
||||
rowInfo.NumberOfFrames = inDto.NumberOfFrames;
|
||||
rowInfo.MarkTool = inDto.MarkTool;
|
||||
rowInfo.ReportMark = inDto.ReportMark;
|
||||
|
||||
rowInfo.FristAddTaskNum = taskinfo.VisitTaskNum;
|
||||
rowInfo.FristAddTaskId = inDto.VisitTaskId;
|
||||
rowInfo.PicturePath = inDto.PicturePath;
|
||||
@@ -1899,6 +1986,7 @@ namespace IRaCIS.Application.Services
|
||||
IsCurrentTaskAdd = isCurrentTaskAdd,
|
||||
WL = rowInfo.WL,
|
||||
WW = rowInfo.WW,
|
||||
MarkTool = inDto.MarkTool,
|
||||
OrganInfoId = rowInfo.OrganInfoId,
|
||||
PicturePath = rowInfo.PicturePath,
|
||||
NumberOfFrames = rowInfo.NumberOfFrames,
|
||||
@@ -1908,7 +1996,8 @@ namespace IRaCIS.Application.Services
|
||||
VisitTaskId = rowInfo.VisitTaskId,
|
||||
StudyId = rowInfo.StudyId,
|
||||
IsCanEditPosition = rowInfo.IsCanEditPosition,
|
||||
});
|
||||
ReportMark = rowInfo.ReportMark
|
||||
}) ;
|
||||
|
||||
|
||||
foreach (var item in inDto.AnswerList)
|
||||
@@ -2329,7 +2418,9 @@ namespace IRaCIS.Application.Services
|
||||
task.IsConvertedTask = visitTaskInfo.IsConvertedTask;
|
||||
var blindSubjectCode = await _visitTaskRepository.Where(x => x.Id == task.VisitTaskId).Select(x => x.BlindSubjectCode).FirstNotNullAsync();
|
||||
task.SubjectCode = blindSubjectCode.IsNullOrEmpty() ? task.SubjectCode : blindSubjectCode;
|
||||
return task;
|
||||
task.ExistsManual = (await GetManualList(new GetManualListInDto() { TrialId = visitTaskInfo.TrialId })).Count() > 0;
|
||||
task.ReadingTaskState = visitTaskInfo.ReadingTaskState;
|
||||
return task;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace IRaCIS.Application.Services
|
||||
/// 生成的阅片模块(在大列表上展示的) 阅片期
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "Reading")]
|
||||
public class ReadModuleService : BaseService
|
||||
public class ReadModuleService : BaseService
|
||||
{
|
||||
|
||||
public IRepository<SubjectVisit> _subjectVisitRepository;
|
||||
@@ -66,6 +66,62 @@ namespace IRaCIS.Application.Services
|
||||
this._readModuleRepository = readModuleRepository;
|
||||
}
|
||||
|
||||
#region 获取修改时可选择的阅片期截止访视
|
||||
|
||||
/// <summary>
|
||||
/// 获取修改截止访视下拉
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<GetSubjectReadVisitsOutDto>> GetCanChangeReadVisitList(GetCanChangeReadVisitListInDto inDto)
|
||||
{
|
||||
//增加标准
|
||||
var mixReadVisitNum = await _visitTaskRepository.Where(x =>
|
||||
x.TrialReadingCriterionId == inDto.TrialReadingCriterionId
|
||||
&& x.ReadingTaskState == ReadingTaskState.HaveSigned
|
||||
&& x.ReadingCategory == ReadingCategory.Visit
|
||||
&& x.SubjectId == inDto.SubjectId
|
||||
&& x.TaskState == TaskState.Effect).OrderByDescending(x => x.VisitTaskNum).Select(x=> x.VisitTaskNum).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
var visitQuery = _subjectVisitRepository.Where(x => x.SubjectId == inDto.SubjectId && x.LatestScanDate != null && !x.IsLostVisit);
|
||||
var finalVisitNum = await visitQuery.Where(x => x.IsFinalVisit).Select(x => x.VisitNum).FirstOrDefaultAsync();
|
||||
|
||||
//增加标准
|
||||
var readModulequery = _readModuleRepository.AsQueryable().Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId);
|
||||
|
||||
var resultlist = await visitQuery.WhereIf(finalVisitNum != null && finalVisitNum != 0, x => x.VisitNum <= finalVisitNum)
|
||||
.Where(x => x.VisitNum > mixReadVisitNum)
|
||||
.Where(x => !x.IsBaseLine) // 排除基线
|
||||
.Where(x => readModulequery.Where(y => y.Id != inDto.Id && y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == ReadingSetType.ImageReading).Count() == 0)
|
||||
.Select(x => new GetSubjectReadVisitsOutDto()
|
||||
{
|
||||
SubjectVisitId = x.Id,
|
||||
VisitName = x.VisitName,
|
||||
VisitNum = x.VisitNum,
|
||||
}).OrderBy(x => x.VisitNum).ToListAsync();
|
||||
|
||||
return resultlist;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 修改全局阅片截止访视
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<bool> ChangeCutOffVisit(ChangeCutOffVisitInDto inDto)
|
||||
{
|
||||
await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.Id, x => new ReadModule() {
|
||||
SubjectVisitId=inDto.SubjectVisitIdId,
|
||||
ModuleName=inDto.Name,
|
||||
});
|
||||
|
||||
return await _readModuleRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取读片模块 //加了标准参数
|
||||
@@ -117,6 +173,7 @@ namespace IRaCIS.Application.Services
|
||||
maxcount = maxcount < x.Data.Count ? x.Data.Count : maxcount;
|
||||
});
|
||||
|
||||
|
||||
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == dto.TrialReadingCriterionId).Select(x => new
|
||||
{
|
||||
x.IsReadingTaskViewInOrder,
|
||||
|
||||
@@ -72,11 +72,13 @@ namespace IRaCIS.Application.Services
|
||||
if (await _readingPeriodSetRepository.AnyAsync(x => x.Id != addOrEditReadingPeriodSet.Id && x.IsTakeEffect != ReadingPeriodStatus.Revocation
|
||||
&& x.TrialId == addOrEditReadingPeriodSet.TrialId && x.ReadingPeriodName == addOrEditReadingPeriodSet.ReadingPeriodName && x.TrialReadingCriterionId == addOrEditReadingPeriodSet.TrialReadingCriterionId))
|
||||
{
|
||||
return ResponseOutput.NotOk("阅片期名称重复,操作失败");
|
||||
//---阅片期名称重复,操作失败
|
||||
return ResponseOutput.NotOk(_localizer["ReadingPeriodSet_NameDup"]);
|
||||
}
|
||||
if (addOrEditReadingPeriodSet.ReadingPeriodName == "Global")
|
||||
{
|
||||
return ResponseOutput.NotOk("阅片期名称不能为Global");
|
||||
//---阅片期名称不能为Global
|
||||
return ResponseOutput.NotOk(_localizer["ReadingPeriodSet_Global"]);
|
||||
}
|
||||
if (addOrEditReadingPeriodSet.Id == null)
|
||||
{
|
||||
|
||||
@@ -281,7 +281,20 @@ namespace IRaCIS.Core.Application.Service
|
||||
MetaKey = false,
|
||||
Text= "Space",
|
||||
Code= "Space"
|
||||
}, };
|
||||
},
|
||||
new ShortcutKey (){
|
||||
|
||||
Keyboardkey= "m",
|
||||
ShortcutKeyEnum = 19,
|
||||
ImageToolType= 0,
|
||||
AltKey = false,
|
||||
CtrlKey = false,
|
||||
ShiftKey = false,
|
||||
MetaKey = false,
|
||||
Text= "M",
|
||||
Code= "KeyM"
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
return shortcutKeys;
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-05-08 15:26:52
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户WL模板
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "Reading")]
|
||||
public class UserWLTemplateService : BaseService
|
||||
{
|
||||
|
||||
private readonly IRepository<UserWLTemplate> _userWLTemplateRepository;
|
||||
private readonly IRepository<User> _userRepository;
|
||||
|
||||
public UserWLTemplateService(IRepository<UserWLTemplate> userWLTemplateRepository,
|
||||
IRepository<User> userRepository
|
||||
)
|
||||
{
|
||||
_userWLTemplateRepository = userWLTemplateRepository;
|
||||
this._userRepository = userRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取模板
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<UserWLTemplateView>> GetUserWLTemplateList(UserWLTemplateQuery inQuery)
|
||||
{
|
||||
var userWLTemplateQueryable = _userWLTemplateRepository
|
||||
.Where(x=>x.UserId==_userInfo.Id)
|
||||
.ProjectTo<UserWLTemplateView>(_mapper.ConfigurationProvider);
|
||||
return await userWLTemplateQueryable.ToListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 新增修改模板
|
||||
/// </summary>
|
||||
/// <param name="addOrEditUserWLTemplate"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IResponseOutput> AddOrUpdateUserWLTemplate(UserWLTemplateAddOrEdit addOrEditUserWLTemplate)
|
||||
{
|
||||
addOrEditUserWLTemplate.UserId = _userInfo.Id;
|
||||
if (addOrEditUserWLTemplate.Id == null)
|
||||
{
|
||||
var count = await _userWLTemplateRepository.Where(x => x.UserId == _userInfo.Id).CountAsync();
|
||||
if (count >= 10)
|
||||
{
|
||||
throw new BusinessValidationFailedException(_localizer["UserWLTS_MaxTemplate"]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(await _userWLTemplateRepository.AnyAsync(x=> x.UserId == _userInfo.Id&&x.TemplateName== addOrEditUserWLTemplate.TemplateName&&x.Id!= addOrEditUserWLTemplate.Id))
|
||||
{
|
||||
throw new BusinessValidationFailedException(_localizer["UserWLTS_NameRepeated"]);
|
||||
}
|
||||
|
||||
if (await _userWLTemplateRepository.AnyAsync(x => x.UserId == _userInfo.Id && x.WW == addOrEditUserWLTemplate.WW && x.WL == addOrEditUserWLTemplate.WL && x.Id != addOrEditUserWLTemplate.Id))
|
||||
{
|
||||
throw new BusinessValidationFailedException(_localizer["UserWLTS_ContentRepeated"]);
|
||||
}
|
||||
|
||||
var entity = await _userWLTemplateRepository.InsertOrUpdateAsync(addOrEditUserWLTemplate, true);
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除模板
|
||||
/// </summary>
|
||||
/// <param name="userWLTemplateId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpDelete("{userWLTemplateId:guid}")]
|
||||
public async Task<IResponseOutput> DeleteUserWLTemplate(Guid userWLTemplateId)
|
||||
{
|
||||
var success = await _userWLTemplateRepository.DeleteFromQueryAsync(t => t.Id == userWLTemplateId, true);
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取自动切换任务配置
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<object> GetAutoCutNextTask()
|
||||
{
|
||||
|
||||
return await _userRepository.Where(x=>x.Id==_userInfo.Id).Select(x => new
|
||||
{
|
||||
AutoCutNextTask = x.AutoCutNextTask
|
||||
}).FirstNotNullAsync();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 设置自动切换任务
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> SetAutoCutNextTask(SetAutoCutNextTaskInDto inDto)
|
||||
{
|
||||
await _userRepository.UpdatePartialNowNoQueryAsync(_userInfo.Id, x => new User()
|
||||
{
|
||||
|
||||
AutoCutNextTask = inDto.AutoCutNextTask
|
||||
});
|
||||
|
||||
await _userRepository.SaveChangesAsync ();
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
CreateMap<VisitTask, VisitTaskDto>();
|
||||
CreateMap<ShortcutKey, DefaultShortcutKeyView>();
|
||||
|
||||
CreateMap<ReadingPeriodSetAddOrEdit, ReadingPeriodSet>();
|
||||
|
||||
CreateMap<UserWLTemplate, UserWLTemplateView>();
|
||||
CreateMap<UserWLTemplate,UserWLTemplateAddOrEdit>().ReverseMap();
|
||||
|
||||
CreateMap<ReadingPeriodSetAddOrEdit, ReadingPeriodSet>();
|
||||
|
||||
CreateMap<AddOrUpdateTumorAssessmentInDto, TumorAssessment_RECIST1Point1>();
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@@ -11,6 +12,39 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public Guid VisitTaskId { get; set; }
|
||||
}
|
||||
|
||||
public class ReadingTaskQuestionAnswerDto : ReadingTaskQuestionAnswer
|
||||
{
|
||||
public QuestionType QuestionType { get; set; }
|
||||
}
|
||||
public class TirggerTaskInfo
|
||||
{
|
||||
public Guid VisitTaskId { get; set; }
|
||||
|
||||
public decimal VisitNum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 靶病灶是否为IUPD或者ICPD
|
||||
/// </summary>
|
||||
public bool TargetAssessmentIsIUorIC { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 靶病灶是否为IUPD或者ICPD
|
||||
/// </summary>
|
||||
public bool NewTargetLesionAssessmentIsIUorIC { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class TirggerAnswerInfo
|
||||
{
|
||||
public Guid VisitTaskId { get; set; }
|
||||
|
||||
public QuestionType QuestionType { get; set; }
|
||||
|
||||
public string Answer { get; set; } = string.Empty;
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class VisitStudyTime
|
||||
{
|
||||
/// <summary>
|
||||
@@ -66,9 +100,9 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public bool MeetRECISTPD { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 本次访视SOD增加不小于5mm
|
||||
/// 本次访视SOD与触发iRECIST访视相比本次访视SOD增加不小于5mm
|
||||
/// </summary>
|
||||
public bool SODAddGreaterThan5 { get; set; }
|
||||
public bool SODTiggerAddGreaterThan5 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 比整体访视期间最低点SOD增加≥20 %
|
||||
@@ -105,6 +139,11 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
/// </summary>
|
||||
public bool BaseLineLessThan30 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 非靶病灶中淋巴结病灶全部消失
|
||||
/// </summary>
|
||||
public bool NoTargetLymphLoss { get; set; }
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -187,6 +226,16 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
/// 至少有一个新靶病无法评估
|
||||
/// </summary>
|
||||
public bool ExixtsUnevaluableState { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当有“存在”状态的淋巴结新靶病灶
|
||||
/// </summary>
|
||||
public bool ExixtsLymphTarget { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当有“存在”或“太小”状态的非淋巴结新靶病灶
|
||||
/// </summary>
|
||||
public bool ExixtsOrLessNoLymphTarget{ get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -205,9 +254,9 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public bool AllVanish { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当任一病灶从非“存在”状态改为“存在”状态
|
||||
/// 存在明确状态
|
||||
/// </summary>
|
||||
public bool LastTaskNoExists { get; set; }
|
||||
public bool ExistsClear { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 至少有一个病灶无法评估
|
||||
@@ -276,6 +325,16 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
/// 上一次任务的新病灶评估为iUPD
|
||||
/// </summary>
|
||||
public bool LastTaskNewLesioniUPD { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 上一次任务的新病灶评估为iCPD
|
||||
/// </summary>
|
||||
public bool LastTaskNewLesioniCPD { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 存在触发iRECIST后新病灶
|
||||
/// </summary>
|
||||
public bool ExistxIRECISTNewLesion { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
+72
-4
@@ -2,6 +2,7 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using MassTransit;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -16,6 +17,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
private readonly IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository;
|
||||
private readonly IRepository<VisitTask> _visitTaskRepository;
|
||||
private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository;
|
||||
private readonly ILogger<GeneralCalculateService> _logger;
|
||||
private readonly IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository;
|
||||
private readonly IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository;
|
||||
private readonly IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository;
|
||||
@@ -26,7 +28,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
public GeneralCalculateService(
|
||||
IRepository<ReadingTableQuestionAnswer> readingTableQuestionAnswerRepository,
|
||||
IRepository<VisitTask> visitTaskRepository,
|
||||
IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository,
|
||||
IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository,
|
||||
ILogger<GeneralCalculateService> logger,
|
||||
IRepository<ReadingTableQuestionTrial> readingTableQuestionTrialRepository,
|
||||
IRepository<ReadingTableAnswerRowInfo> readingTableAnswerRowInfoRepository,
|
||||
IRepository<ReadingQuestionTrial> readingQuestionTrialRepository,
|
||||
@@ -38,6 +41,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
this._readingTableQuestionAnswerRepository = readingTableQuestionAnswerRepository;
|
||||
this._visitTaskRepository = visitTaskRepository;
|
||||
this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
|
||||
this._logger = logger;
|
||||
this._readingTableQuestionTrialRepository = readingTableQuestionTrialRepository;
|
||||
this._readingTableAnswerRowInfoRepository = readingTableAnswerRowInfoRepository;
|
||||
this._readingQuestionTrialRepository = readingQuestionTrialRepository;
|
||||
@@ -46,6 +50,52 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加计算错误日志
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <param name="lesionName"></param>
|
||||
/// <param name="lesionType"></param>
|
||||
/// <returns></returns>
|
||||
public async Task LogRecord(ReadingCalculateDto inDto,string lesionName, LesionType lesionType)
|
||||
{
|
||||
// 这里是记录日志 不需要国际化
|
||||
var criterionInfo =await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).Include(x => x.Trial).FirstNotNullAsync();
|
||||
var taskInfo= await _visitTaskRepository.Where(x=>x.Id==inDto.VisitTaskId).Include(x=>x.Subject).Include(x=>x.DoctorUser).FirstNotNullAsync();
|
||||
|
||||
//错误级别日志:项目、标准、受试者、阅片人、任务。输出其它既往新病灶数据:
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.AppendLine($"");
|
||||
builder.AppendLine($"【项目】:【{criterionInfo.Trial.TrialCode}】");
|
||||
builder.AppendLine($"【项目Id】:【{criterionInfo.TrialId}】");
|
||||
builder.AppendLine($"【标准】:【{criterionInfo.CriterionName}】");
|
||||
builder.AppendLine($"【标准Id】:【{criterionInfo.Id}】");
|
||||
builder.AppendLine($"【受试者】:【{taskInfo.Subject.ShortName}】");
|
||||
builder.AppendLine($"【受试者Id】:【{taskInfo.Subject.Id}】");
|
||||
builder.AppendLine($"【阅片人】:【{taskInfo.DoctorUser.FirstName}】");
|
||||
builder.AppendLine($"【阅片人Id】:【{taskInfo.DoctorUser.Id}】");
|
||||
builder.AppendLine($"【任务】:【{taskInfo.TaskBlindName}】");
|
||||
builder.AppendLine($"【任务Id】:【{taskInfo.Id}】");
|
||||
builder.AppendLine($"【病灶类型】:【{lesionName}】");
|
||||
|
||||
var lesionInfo = inDto.QuestionInfo.Where(x => x.LesionType == lesionType).FirstOrDefault();
|
||||
if (lesionInfo != null)
|
||||
{
|
||||
lesionInfo.TableRowInfoList.OrderBy(x => x.RowIndex).ForEach(x =>
|
||||
{
|
||||
builder.AppendLine(@$"【病灶编号】:【{x.RowIndex.ToString()}】,
|
||||
【病灶长径】:【{x.TableQuestionList.Where(y=>y.QuestionMark==QuestionMark.MajorAxis).Select(y=>y.Answer).FirstIsNullReturnEmpty()}】,
|
||||
【病灶短径】:【{x.TableQuestionList.Where(y => y.QuestionMark == QuestionMark.ShortAxis).Select(y => y.Answer).FirstIsNullReturnEmpty()}】,
|
||||
【病灶状态】:【{x.TableQuestionList.Where(y => y.QuestionMark == QuestionMark.State).Select(y => y.Answer).FirstIsNullReturnEmpty()}】");
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
_logger.LogError(builder.ToString());
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取ReadingCalculateDto
|
||||
/// </summary>
|
||||
@@ -155,7 +205,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
{
|
||||
var originalTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
|
||||
|
||||
var taskAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == beforeConvertedTaskId && x.ReadingQuestionTrial.Type != "calculation").IgnoreAutoIncludes().AsNoTracking().ToListAsync();
|
||||
var taskAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == beforeConvertedTaskId &&x.ReadingQuestionTrial.QuestionType!=QuestionType.AdjustReason && x.ReadingQuestionTrial.Type != "calculation").IgnoreAutoIncludes().AsNoTracking().ToListAsync();
|
||||
|
||||
taskAnswer.ForEach(x => {
|
||||
|
||||
@@ -171,7 +221,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
{
|
||||
x.VisitTaskId = visitTaskId;
|
||||
x.IsCurrentTaskAdd = false;
|
||||
x.FristAddTaskId = visitTaskId;
|
||||
x.FristAddTaskId = x.FristAddTaskId== beforeConvertedTaskId? visitTaskId : x.FristAddTaskId;
|
||||
x.Id = NewId.NextGuid();
|
||||
});
|
||||
|
||||
@@ -239,23 +289,41 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
|
||||
|
||||
|
||||
var index = 0;
|
||||
|
||||
addrowInfo.ForEach(x =>
|
||||
{
|
||||
|
||||
if (needRowIds.Contains(x.Id))
|
||||
{
|
||||
index++;
|
||||
x.RowIndex = index;
|
||||
x.RowMark = otherLesionQuestion.OrderMark + x.RowIndex.GetLesionMark();
|
||||
var fristAddTaskId = x.FristAddTaskId.Clone();
|
||||
x.FromMark = fristAddTaskId == beforeConvertedTaskId ? string.Empty : x.RowMark;
|
||||
x.FristAddTaskId = fristAddTaskId == beforeConvertedTaskId? visitTaskId: fristAddTaskId;
|
||||
x.QuestionId = otherLesionQuestion.Id;
|
||||
x.OrderMark = otherLesionQuestion.OrderMark;
|
||||
x.RowMark = otherLesionQuestion.OrderMark + x.RowIndex.GetLesionMark();
|
||||
x.ReportMark = x.RowMark;
|
||||
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
tableAnswer.ForEach(x =>
|
||||
{
|
||||
if (needRowIds.Contains(x.RowId))
|
||||
{
|
||||
|
||||
var row = addrowInfo.Where(y => y.Id == x.RowId).FirstOrDefault();
|
||||
if (row != null)
|
||||
{
|
||||
x.RowIndex = row.RowIndex;
|
||||
}
|
||||
|
||||
|
||||
x.QuestionId = otherLesionQuestion.Id;
|
||||
|
||||
var newLesionTableQuestion = newLesionTableQuestionList.Where(y => y.Id == x.TableQuestionId).FirstOrDefault();
|
||||
|
||||
@@ -162,7 +162,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
public async Task<GetReportVerifyOutDto> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
{
|
||||
|
||||
var service = await this.GetService(inDto.VisitTaskId);
|
||||
@@ -173,7 +173,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
}
|
||||
else
|
||||
{
|
||||
return new { };
|
||||
return new GetReportVerifyOutDto() { };
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+626
-238
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -37,7 +37,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
Task<object> GetReportVerify(GetReportVerifyInDto inDto);
|
||||
Task<GetReportVerifyOutDto> GetReportVerify(GetReportVerifyInDto inDto);
|
||||
|
||||
/// <summary>
|
||||
/// 获取阅片报告
|
||||
|
||||
+10
@@ -1,4 +1,5 @@
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -31,5 +32,14 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// <param name="beforeConvertedTaskId"></param>
|
||||
/// <returns></returns>
|
||||
Task AddConvertedTaskFocus(Guid visitTaskId, Guid beforeConvertedTaskId);
|
||||
|
||||
/// <summary>
|
||||
/// 添加计算错误日志
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <param name="lesionName"></param>
|
||||
/// <param name="lesionType"></param>
|
||||
/// <returns></returns>
|
||||
Task LogRecord(ReadingCalculateDto inDto, string lesionName, LesionType lesionType);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
Task<object> GetReportVerify(GetReportVerifyInDto inDto);
|
||||
Task<GetReportVerifyOutDto> GetReportVerify(GetReportVerifyInDto inDto);
|
||||
|
||||
/// <summary>
|
||||
/// 获取阅片报告
|
||||
|
||||
@@ -1018,15 +1018,22 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
}
|
||||
|
||||
|
||||
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
public async Task<GetReportVerifyOutDto> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
{
|
||||
return new() {
|
||||
return new GetReportVerifyOutDto() {
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
|
||||
{
|
||||
|
||||
if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ImageQualityAssessment && x.VisitTaskId == inDto.VisitTaskId && x.Answer == ImageQualityEvaluation.Abnormal.GetEnumInt()))
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && (x.Answer == string.Empty || x.Answer == null)
|
||||
&& x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State
|
||||
)
|
||||
|
||||
@@ -110,8 +110,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
var questionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == criterionId && x.ShowQuestion != ShowQuestion.Hide).ToListAsync();
|
||||
var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => x.TrialCriterionId == criterionId).OrderBy(x => x.ShowOrder).ToListAsync();
|
||||
var tableAnsweRowInfos = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == indto.VisitTaskId).ProjectTo<TableAnsweRowInfo>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var answers = await _readingTaskQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync();
|
||||
result.LesionCountList = tableAnsweRowInfos.GroupBy(x => x.LesionType).Select(x => new LesionDto
|
||||
{
|
||||
LesionType = x.Key.Value,
|
||||
Count = x.ToList().Count()
|
||||
}).ToList();
|
||||
var answers = await _readingTaskQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync();
|
||||
var tableAnswers = await _readingTableQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync();
|
||||
|
||||
var alltableAnsweRowInfos = await _readingTableAnswerRowInfoRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync();
|
||||
@@ -367,9 +371,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
public async Task<GetReportVerifyOutDto> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
{
|
||||
return new
|
||||
return new GetReportVerifyOutDto()
|
||||
{
|
||||
TumorEvaluate = await this.GetReportTumor(inDto.VisitTaskId),
|
||||
IsExistDisease = await this.GetReportIsExistDisease(inDto.VisitTaskId),
|
||||
@@ -629,6 +633,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
|
||||
{
|
||||
|
||||
if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ImageQualityAssessment && x.VisitTaskId == inDto.VisitTaskId && x.Answer == ImageQualityEvaluation.Abnormal.GetEnumInt()))
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && (x.Answer == string.Empty || x.Answer == null)
|
||||
&& x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State
|
||||
)
|
||||
|
||||
+8
-2
@@ -367,9 +367,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
public async Task<GetReportVerifyOutDto> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
{
|
||||
return new
|
||||
return new GetReportVerifyOutDto()
|
||||
{
|
||||
TumorEvaluate = await this.GetReportTumor(inDto.VisitTaskId),
|
||||
IsExistDisease = await this.GetReportIsExistDisease(inDto.VisitTaskId),
|
||||
@@ -629,6 +629,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
|
||||
{
|
||||
|
||||
if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ImageQualityAssessment && x.VisitTaskId == inDto.VisitTaskId && x.Answer == ImageQualityEvaluation.Abnormal.GetEnumInt()))
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && (x.Answer == string.Empty || x.Answer == null)
|
||||
&& x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State
|
||||
)
|
||||
|
||||
@@ -506,9 +506,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
|
||||
|
||||
|
||||
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
public async Task<GetReportVerifyOutDto> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
{
|
||||
return new() {
|
||||
return new GetReportVerifyOutDto() {
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
// 生成时间 2021-12-23 13:21:04
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
@@ -24,13 +25,14 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
public DateTime? ExpireTime { get; set; }
|
||||
|
||||
[DictionaryTranslateAttribute("YesOrNo")]
|
||||
public bool? IsJoin { get; set; }
|
||||
|
||||
public DateTime? ConfirmTime { get; set; }
|
||||
|
||||
public string RejectReason { get; set; } = string.Empty;
|
||||
|
||||
|
||||
[DictionaryTranslateAttribute("researchUserState")]
|
||||
public TrialSiteUserStateEnum State
|
||||
{
|
||||
get
|
||||
@@ -89,6 +91,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public string LastName { get; set; } = string.Empty;
|
||||
public string Phone { get; set; } = string.Empty;
|
||||
public string Email { get; set; } = string.Empty;
|
||||
|
||||
[DictionaryTranslateAttribute("YesOrNo")]
|
||||
public bool IsGenerateAccount { get; set; }
|
||||
public Guid TrialRoleNameId { get; set; }
|
||||
|
||||
|
||||
@@ -442,7 +442,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
if (await _trialSiteSurveyRepository.AnyAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.PMCreatedAndLock))
|
||||
{
|
||||
return ResponseOutput.NotOk("中心调研表已锁定,不允许操作");
|
||||
//---中心调研已锁定,不允许操作。
|
||||
return ResponseOutput.NotOk(_localizer["TrialSiteSurvey_Locked"]);
|
||||
}
|
||||
|
||||
var success = await _trialSiteSurveyRepository.BatchDeleteNoTrackingAsync(t => t.Id == trialSiteSurveyId);
|
||||
@@ -561,7 +562,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
if (await _repository.AnyAsync<TrialSiteSurvey>(t => t.State == TrialSiteSurveyEnum.PMCreatedAndLock && t.Id == trialSiteSurveyId))
|
||||
{
|
||||
return ResponseOutput.NotOk("中心调研表已锁定,不允许操作。");
|
||||
//---中心调研已锁定,不允许操作。
|
||||
return ResponseOutput.NotOk(_localizer["TrialSiteSurvey_Locked"]);
|
||||
}
|
||||
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM)
|
||||
@@ -668,7 +670,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
if (await _repository.AnyAsync<TrialSiteSurvey>(t => t.State == TrialSiteSurveyEnum.PMCreatedAndLock && t.Id == trialSiteSurveyId))
|
||||
{
|
||||
return ResponseOutput.NotOk("中心调研表已锁定,不允许操作。");
|
||||
//---中心调研已锁定,不允许操作。
|
||||
return ResponseOutput.NotOk(_localizer["TrialSiteSurvey_Locked"]);
|
||||
}
|
||||
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM)
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
if (existSysUser.LastName != addOrEditTrialSiteUserSurvey.LastName || existSysUser.FirstName != addOrEditTrialSiteUserSurvey.FirstName)
|
||||
{
|
||||
//$"该用户在系统中账户名为:{existSysUser.LastName + " / " + existSysUser.FirstName} ,与填写信息存在不一致项, 现将界面信息修改为与系统一致,可进行保存"
|
||||
return ResponseOutput.NotOk(_localizer["TrialSiteUser_InconsistentInfo", existSysUser.LastName + " / " + existSysUser.FirstName],
|
||||
return ResponseOutput.NotOk(_localizer["TrialSiteUser_InconsistentInfo", existSysUser.LastName + " / " + existSysUser.FirstName,existSysUser.Phone],
|
||||
new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone,existSysUser.IsTestUser,existSysUser.IsZhiZhun }, ApiResponseCodeEnum.NeedTips);
|
||||
}
|
||||
|
||||
|
||||
@@ -148,7 +148,8 @@ namespace IRaCIS.Application.Contracts
|
||||
|
||||
//医生付费类型 CN US
|
||||
public int? Nation { get; set; }
|
||||
public AttendedReviewerType? AttendedReviewerType { get; set; }
|
||||
|
||||
//public AttendedReviewerType? AttendedReviewerType { get; set; }
|
||||
}
|
||||
|
||||
public class StatisticsWorkloadQueryParam : PageInput
|
||||
|
||||
@@ -849,7 +849,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public CriterionType CriterionType { get; set; }
|
||||
|
||||
//自动 手动生成任务
|
||||
public bool IsAutoCreate { get; set; }
|
||||
public bool IsAutoCreate { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 项目标准ID
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using IRaCIS.Core.Infrastructure.Extention;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Newtonsoft.Json;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace IRaCIS.Application.Contracts
|
||||
{
|
||||
@@ -15,6 +16,8 @@ namespace IRaCIS.Application.Contracts
|
||||
public string TrialCode { get; set; } = string.Empty;
|
||||
public string Indication { get; set; } = string.Empty;
|
||||
|
||||
public int IndicationEnum { get; set; }
|
||||
|
||||
//public Guid? ReviewTypeId { get; set; } = Guid.Empty;
|
||||
|
||||
//public Guid? CriterionId { get; set; } = Guid.Empty;
|
||||
@@ -28,7 +31,7 @@ namespace IRaCIS.Application.Contracts
|
||||
public int? GRRReviewers { get; set; }
|
||||
public int TotalReviewers { get; set; }
|
||||
public int? Expedited { get; set; }
|
||||
public int? AttendedReviewerType { get; set; }
|
||||
|
||||
|
||||
//研究方案号
|
||||
public string ResearchProgramNo { get; set; } = string.Empty;
|
||||
@@ -42,12 +45,20 @@ namespace IRaCIS.Application.Contracts
|
||||
// 负责人PI
|
||||
public string HeadPI { get; set; } = string.Empty;
|
||||
|
||||
public Guid DeclarationTypeId { get; set; }
|
||||
//public Guid DeclarationTypeId { get; set; }
|
||||
//public int? AttendedReviewerType { get; set; }
|
||||
|
||||
public Guid IndicationTypeId { get; set; }
|
||||
public Guid? PhaseId { get; set; }
|
||||
|
||||
|
||||
public List<DeclarationType> DeclarationTypeEnumList { get; set; }
|
||||
|
||||
public List<AttendedReviewerType> AttendedReviewerTypeEnumList { get; set; }
|
||||
public string DeclarationTypes { get; set; }=string.Empty;
|
||||
public string AttendedReviewerTypes { get; set; } = string.Empty;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -114,7 +125,7 @@ namespace IRaCIS.Application.Contracts
|
||||
//统计字段
|
||||
public string Phase { get; set; } = string.Empty;
|
||||
|
||||
public string DeclarationType { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public string IndicationType { get; set; } = string.Empty;
|
||||
|
||||
@@ -138,6 +149,9 @@ namespace IRaCIS.Application.Contracts
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
public bool IsLocked { get; set; }
|
||||
|
||||
|
||||
//public string DeclarationType { get; set; } = string.Empty;
|
||||
//public int? SubjectCount { get; set; }
|
||||
|
||||
//public int? StudyCount { get; set; } = 0;
|
||||
@@ -172,7 +186,11 @@ namespace IRaCIS.Application.Contracts
|
||||
|
||||
public class TrialQueryDTO : PageInput
|
||||
{
|
||||
public Guid? DeclarationTypeId { get; set; }
|
||||
//public Guid? DeclarationTypeId { get; set; }
|
||||
|
||||
public List<DeclarationType> DeclarationTypeEnumList { get; set; }=new List<DeclarationType>();
|
||||
|
||||
public List<AttendedReviewerType> AttendedReviewerTypeEnumList { get; set; } = new List<AttendedReviewerType>();
|
||||
|
||||
public Guid? IndicationTypeId { get; set; }
|
||||
public Guid? SponsorId { get; set; }
|
||||
@@ -198,7 +216,7 @@ namespace IRaCIS.Application.Contracts
|
||||
public DateTime? BeginDate { get; set; }
|
||||
public DateTime? EndDate { get; set; }
|
||||
public int? Expedited { get; set; }
|
||||
public AttendedReviewerType? AttendedReviewerType { get; set; }
|
||||
//public AttendedReviewerType? AttendedReviewerType { get; set; }
|
||||
}
|
||||
|
||||
public class ReviewerTrialQueryDTO : PageInput
|
||||
|
||||
@@ -5,6 +5,7 @@ using Magicodes.ExporterAndImporter.Core;
|
||||
using MiniExcelLibs.Attributes;
|
||||
using Newtonsoft.Json;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
|
||||
namespace IRaCIS.Application.Contracts
|
||||
{
|
||||
@@ -17,6 +18,8 @@ namespace IRaCIS.Application.Contracts
|
||||
[JsonIgnore]
|
||||
public string State => IsDeleted ? "退出" : "加入";
|
||||
|
||||
|
||||
[DictionaryTranslateAttribute("IsUserExitTrial")]
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
[ExcelFormat("yyyy-MM-dd hh:mm:ss")]
|
||||
@@ -53,14 +56,16 @@ namespace IRaCIS.Application.Contracts
|
||||
|
||||
public class TrialMaintenanceDTO : UserTrialCommand
|
||||
{
|
||||
[JsonIgnore]
|
||||
public int No { get; set; }
|
||||
//[JsonIgnore]
|
||||
//public int No { get; set; }
|
||||
//For MiniExcel ExcelFormat
|
||||
public string State => IsDeleted ? "退出" : "加入";
|
||||
|
||||
|
||||
[ValueMapping(text: "退出", true)]
|
||||
[ValueMapping(text: "加入", false)]
|
||||
|
||||
[DictionaryTranslateAttribute("IsUserExitTrial")]
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
[ExporterHeader(Format = "yyyy-mm-DD hh:mm:ss")]
|
||||
@@ -115,6 +120,7 @@ namespace IRaCIS.Application.Contracts
|
||||
{
|
||||
public DateTime CurrentTime { get; set; } = DateTime.Now;
|
||||
|
||||
public bool IsEn_US { get; set; }
|
||||
|
||||
public object List { get; set; }
|
||||
|
||||
@@ -134,8 +140,6 @@ namespace IRaCIS.Application.Contracts
|
||||
}
|
||||
public class SiteUserExportDTO : UserTrialDTO
|
||||
{
|
||||
[JsonIgnore]
|
||||
public int No { get; set; }
|
||||
|
||||
public string TrialSiteCode { get; set; } = String.Empty;
|
||||
public string TrialSiteAliasName { get; set; } = String.Empty;
|
||||
@@ -150,17 +154,18 @@ namespace IRaCIS.Application.Contracts
|
||||
|
||||
public class TrialSiteUserSummaryDto: TrialSiteUserSurveyView
|
||||
{
|
||||
[JsonIgnore]
|
||||
public int No { get; set; }
|
||||
|
||||
|
||||
public string TrialSiteCode { get; set; } = String.Empty;
|
||||
public string TrialSiteAliasName { get; set; } = String.Empty;
|
||||
|
||||
public string UserRealName => LastName + " / " + FirstName;
|
||||
|
||||
public string IsGenerateAccountStr => IsGenerateAccount ? "是" : "否";
|
||||
|
||||
public string StateStr => State.GetDescription();
|
||||
//public string IsGenerateAccountStr => IsGenerateAccount ? "是" : "否";
|
||||
|
||||
|
||||
//public string StateStr => State.GetDescription();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -39,8 +39,8 @@ namespace IRaCIS.Core.Application
|
||||
private readonly IOrganInfoService _iOrganInfoService;
|
||||
private readonly IRepository<TaskAllocationRule> _taskAllocationRuleRepository;
|
||||
private readonly IRepository<ReadingSystemCriterionDictionary> _readingCriterionDictionaryRepository;
|
||||
private readonly IRepository<ReadingTrialCriterionDictionary> _readingTrialCriterionDictionaryRepository;
|
||||
private readonly IReadingQuestionService iReadingQuestionService;
|
||||
private readonly IRepository<ReadingTrialCriterionDictionary> _readingTrialCriterionDictionaryRepository;
|
||||
private readonly IReadingQuestionService iReadingQuestionService;
|
||||
private readonly IRepository<TrialCriterionAdditionalAssessmentType> _trialCriterionAdditionalAssessmentTypeRepository;
|
||||
|
||||
private readonly IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswer;
|
||||
@@ -62,8 +62,8 @@ namespace IRaCIS.Core.Application
|
||||
IRepository<ReadingCriterionPage> readingCriterionPageRepository,
|
||||
IRepository<TaskAllocationRule> taskAllocationRuleRepository,
|
||||
IRepository<ReadingSystemCriterionDictionary> readingCriterionDictionaryRepository,
|
||||
IRepository<ReadingTrialCriterionDictionary> readingTrialCriterionDictionaryRepository,
|
||||
IReadingQuestionService iReadingQuestionService,
|
||||
IRepository<ReadingTrialCriterionDictionary> readingTrialCriterionDictionaryRepository,
|
||||
IReadingQuestionService iReadingQuestionService,
|
||||
IEasyCachingProvider provider,
|
||||
IOrganInfoService iOrganInfoService,
|
||||
IRepository<TrialCriterionAdditionalAssessmentType> trialCriterionAdditionalAssessmentTypeRepository,
|
||||
@@ -79,8 +79,8 @@ namespace IRaCIS.Core.Application
|
||||
_trialRepository = trialRepository;
|
||||
_taskAllocationRuleRepository = taskAllocationRuleRepository;
|
||||
this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository;
|
||||
this._readingTrialCriterionDictionaryRepository = readingTrialCriterionDictionaryRepository;
|
||||
this.iReadingQuestionService = iReadingQuestionService;
|
||||
this._readingTrialCriterionDictionaryRepository = readingTrialCriterionDictionaryRepository;
|
||||
this.iReadingQuestionService = iReadingQuestionService;
|
||||
this._trialQCQuestionRepository = trialQCQuestionRepository;
|
||||
this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
|
||||
this._readingQuestionTrialRepository = readingQuestionTrialRepository;
|
||||
@@ -269,15 +269,16 @@ namespace IRaCIS.Core.Application
|
||||
|
||||
|
||||
var criterionDictionaryList = await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == trialCriterion.ReadingQuestionCriterionSystemId.Value)
|
||||
.Select(x=>new ReadingTrialCriterionDictionary() {
|
||||
.Select(x => new ReadingTrialCriterionDictionary()
|
||||
{
|
||||
|
||||
CriterionId = inDto.TrialReadingCriterionId,
|
||||
CrterionDictionaryGroup=x.CrterionDictionaryGroup,
|
||||
IsBaseLineUse=x.IsBaseLineUse,
|
||||
IsFollowVisitUse=x.IsFollowVisitUse,
|
||||
DictionaryId=x.DictionaryId,
|
||||
ParentCode=x.ParentCode,
|
||||
})
|
||||
CriterionId = inDto.TrialReadingCriterionId,
|
||||
CrterionDictionaryGroup = x.CrterionDictionaryGroup,
|
||||
IsBaseLineUse = x.IsBaseLineUse,
|
||||
IsFollowVisitUse = x.IsFollowVisitUse,
|
||||
DictionaryId = x.DictionaryId,
|
||||
ParentCode = x.ParentCode,
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
criterionDictionaryList.ForEach(x =>
|
||||
@@ -287,7 +288,7 @@ namespace IRaCIS.Core.Application
|
||||
|
||||
});
|
||||
|
||||
await _readingTrialCriterionDictionaryRepository.AddRangeAsync(criterionDictionaryList);
|
||||
await _readingTrialCriterionDictionaryRepository.AddRangeAsync(criterionDictionaryList);
|
||||
|
||||
await _trialCriterionDictionaryCode.AddRangeAsync(criterionDictionaryCodeList);
|
||||
#endregion
|
||||
@@ -624,7 +625,8 @@ namespace IRaCIS.Core.Application
|
||||
|
||||
if (inDto.TrialCriterionAdditionalAssessmentTypeList.All(t => t.IsSelected != true))
|
||||
{
|
||||
throw new BusinessValidationFailedException("选择了附加评估,必须勾选附加评估类型");
|
||||
//---选择了附加评估,必须勾选附加评估类型
|
||||
throw new BusinessValidationFailedException(_localizer["TrialConfig_AddEvalReq"]);
|
||||
}
|
||||
|
||||
var trialId = _readingQuestionTrialRepository.Where(t => t.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).Select(t => t.TrialId).FirstOrDefault();
|
||||
@@ -640,7 +642,7 @@ namespace IRaCIS.Core.Application
|
||||
AdditionalAssessment additional = new AdditionalAssessment();
|
||||
var addTypeList = additional.GetSystemDefeaultAdditionalAssessmentList(updateItem.CriterionType, updateItem.AdditionalAssessmentType);
|
||||
|
||||
if(!await _readingQuestionTrialRepository.AsQueryable().IgnoreQueryFilters().AnyAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional==true))
|
||||
if (!await _readingQuestionTrialRepository.AsQueryable().IgnoreQueryFilters().AnyAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional == true))
|
||||
{
|
||||
foreach (var addType in addTypeList)
|
||||
{
|
||||
@@ -652,9 +654,9 @@ namespace IRaCIS.Core.Application
|
||||
await _readingQuestionTrialRepository.AddAsync(question);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
await _trialCriterionAdditionalAssessmentTypeRepository.UpdatePartialFromQueryAsync(updateItem.Id, t => new TrialCriterionAdditionalAssessmentType() { IsSelected = updateItem.IsSelected });
|
||||
}
|
||||
}
|
||||
@@ -952,6 +954,47 @@ namespace IRaCIS.Core.Application
|
||||
|
||||
_mapper.Map(trialConfig, trialInfo);
|
||||
|
||||
//不管是否修改,一定要记录稽查
|
||||
trialInfo.UpdateTime=DateTime.Now;
|
||||
|
||||
//// 修改临床数据
|
||||
|
||||
var clinicalDataTrialSetList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialConfig.TrialId, true).ToListAsync();
|
||||
|
||||
foreach (var item in clinicalDataTrialSetList)
|
||||
{
|
||||
|
||||
if(trialConfig.ClinicalDataTrialSetIds.Contains(item.Id))
|
||||
{
|
||||
item.IsConfirm = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
item.IsConfirm = false;
|
||||
}
|
||||
}
|
||||
//// 修改阅片标准
|
||||
|
||||
var readingQuestionCriterionTrialList = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialConfig.TrialId, true).ToListAsync();
|
||||
|
||||
foreach (var item in readingQuestionCriterionTrialList)
|
||||
{
|
||||
|
||||
if (trialConfig.TrialCriterionIds.Contains(item.Id))
|
||||
{
|
||||
item.IsConfirm = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
item.IsConfirm = false;
|
||||
}
|
||||
}
|
||||
|
||||
#region 废弃
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
//if (trialInfo.IsGlobalReading && (trialInfo.IsArbitrationReading ?? false))
|
||||
//{
|
||||
// trialInfo.ArbitrationRule = ArbitrationRule.Reading;
|
||||
@@ -961,40 +1004,40 @@ namespace IRaCIS.Core.Application
|
||||
//{
|
||||
// trialInfo.ArbitrationRule = ArbitrationRule.Visit;
|
||||
//}
|
||||
trialInfo.UpdateTime = DateTime.Now;
|
||||
//trialInfo.UpdateTime = DateTime.Now;
|
||||
|
||||
// 修改临床数据
|
||||
var noconfirmids = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialConfig.TrialId && !trialConfig.ClinicalDataTrialSetIds.Contains(x.Id)).Select(x => x.Id).ToListAsync();
|
||||
foreach (var item in trialConfig.ClinicalDataTrialSetIds)
|
||||
{
|
||||
await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(item, x => new ClinicalDataTrialSet()
|
||||
{
|
||||
//// 修改临床数据
|
||||
//var noconfirmids = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialConfig.TrialId && !trialConfig.ClinicalDataTrialSetIds.Contains(x.Id)).Select(x => x.Id).ToListAsync();
|
||||
//foreach (var item in trialConfig.ClinicalDataTrialSetIds)
|
||||
//{
|
||||
// await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(item, x => new ClinicalDataTrialSet()
|
||||
// {
|
||||
|
||||
IsConfirm = true
|
||||
});
|
||||
}
|
||||
// IsConfirm = true
|
||||
// });
|
||||
//}
|
||||
|
||||
foreach (var item in noconfirmids)
|
||||
{
|
||||
await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(item, x => new ClinicalDataTrialSet()
|
||||
{
|
||||
//foreach (var item in noconfirmids)
|
||||
//{
|
||||
// await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(item, x => new ClinicalDataTrialSet()
|
||||
// {
|
||||
|
||||
IsConfirm = false
|
||||
});
|
||||
}
|
||||
// IsConfirm = false
|
||||
// });
|
||||
//}
|
||||
|
||||
// 修改阅片标准
|
||||
var cancelConfirmCriterionIds = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialConfig.TrialId && x.IsConfirm && !trialConfig.TrialCriterionIds.Contains(x.Id)).Select(x => x.Id).ToListAsync();
|
||||
//// 修改阅片标准
|
||||
//var cancelConfirmCriterionIds = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialConfig.TrialId && x.IsConfirm && !trialConfig.TrialCriterionIds.Contains(x.Id)).Select(x => x.Id).ToListAsync();
|
||||
|
||||
await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => cancelConfirmCriterionIds.Contains(x.Id), x => new ReadingQuestionCriterionTrial()
|
||||
{
|
||||
IsConfirm = false
|
||||
});
|
||||
//await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => cancelConfirmCriterionIds.Contains(x.Id), x => new ReadingQuestionCriterionTrial()
|
||||
//{
|
||||
// IsConfirm = false
|
||||
//});
|
||||
|
||||
await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => trialConfig.TrialCriterionIds.Contains(x.Id), x => new ReadingQuestionCriterionTrial()
|
||||
{
|
||||
IsConfirm = true
|
||||
}); ;
|
||||
//await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => trialConfig.TrialCriterionIds.Contains(x.Id), x => new ReadingQuestionCriterionTrial()
|
||||
//{
|
||||
// IsConfirm = true
|
||||
//}); ;
|
||||
|
||||
|
||||
|
||||
@@ -1158,11 +1201,11 @@ namespace IRaCIS.Core.Application
|
||||
public async Task<TrialConfigDTO> GetTrialConfigInfo(Guid trialId)
|
||||
{
|
||||
return await _trialRepository.Where(t => t.Id == trialId).ProjectTo<TrialConfigDTO>(_mapper.ConfigurationProvider, new
|
||||
{
|
||||
isEn_Us = _userInfo.IsEn_Us
|
||||
{
|
||||
isEn_Us = _userInfo.IsEn_Us
|
||||
|
||||
})
|
||||
.FirstOrDefaultAsync().IfNullThrowException();
|
||||
})
|
||||
.FirstOrDefaultAsync().IfNullThrowException();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ using IRaCIS.Core.Application.Service;
|
||||
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using IRaCIS.Core.Application.Auth;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
@@ -17,43 +18,49 @@ namespace IRaCIS.Application.Services
|
||||
private readonly IRepository<TrialUser> _trialUseRepository;
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
|
||||
|
||||
public TrialMaintenanceService(IRepository<TrialUser> trialUseRepository, IRepository<Trial> trialRepository)
|
||||
{
|
||||
_trialUseRepository = trialUseRepository;
|
||||
_trialRepository = trialRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 项目参与人员导出
|
||||
/// </summary>
|
||||
/// <param name="param"></param>
|
||||
/// <param name="_commonDocumentRepository"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public async Task<IActionResult> TrialUserListExport(TrialMaintenanceExportQuery param, [FromServices] IRepository<CommonDocument> _commonDocumentRepository)
|
||||
{
|
||||
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<TrialUserExportDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
#region 移动废弃
|
||||
|
||||
exportInfo.TrialUserList = 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))
|
||||
///// <summary>
|
||||
///// 项目参与人员导出
|
||||
///// </summary>
|
||||
///// <param name="param"></param>
|
||||
///// <param name="_commonDocumentRepository"></param>
|
||||
///// <returns></returns>
|
||||
///// <exception cref="Exception"></exception>
|
||||
//[HttpPost]
|
||||
//[AllowAnonymous]
|
||||
//public async Task<IActionResult> TrialUserListExport(TrialMaintenanceExportQuery param, [FromServices] IRepository<CommonDocument> _commonDocumentRepository, [FromServices] IDictionaryService _dictionaryService)
|
||||
//{
|
||||
|
||||
.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<TrialMaintenanceDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
// var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
var no = 1;
|
||||
exportInfo.TrialUserList.ForEach(t => t.No = no++);
|
||||
// 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))
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment);
|
||||
// .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<TrialMaintenanceDTO>(_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
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -184,7 +191,8 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
if (await _repository.AnyAsync<TrialSiteUser>(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId))
|
||||
{
|
||||
return ResponseOutput.NotOk("Participant has participated in site maintenance");
|
||||
// ----人员已加入现场维护
|
||||
return ResponseOutput.NotOk(_localizer["TrialMaint_PersonnelJoined"]);
|
||||
}
|
||||
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC)
|
||||
|
||||
@@ -9,6 +9,8 @@ using IRaCIS.Core.Infrastructure;
|
||||
using Microsoft.Extensions.Options;
|
||||
using static IRaCIS.Core.Domain.Share.StaticData;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using System.Linq.Expressions;
|
||||
using System.Linq;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
@@ -44,11 +46,28 @@ namespace IRaCIS.Application.Services
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<TrialDetailDTO>> GetTrialList(TrialQueryDTO searchParam)
|
||||
{
|
||||
|
||||
var multiModalityIdSelectCount = searchParam.ModalityIds.Count;
|
||||
|
||||
var multiModalityIdSelectCount = searchParam.ModalityIds.Count;
|
||||
var multiCriteriaSelectCount = searchParam.CriterionIds.Count;
|
||||
var multiReviewTypeSelectCount = searchParam.ReviewTypeIds.Count;
|
||||
|
||||
Expression<Func<Trial, bool>> trialDeclarationTypeExpression = x => true;
|
||||
|
||||
|
||||
|
||||
foreach (var item in searchParam.DeclarationTypeEnumList)
|
||||
{
|
||||
trialDeclarationTypeExpression = trialDeclarationTypeExpression.And(t => t.DeclarationTypes.Contains($"|{item}|"));
|
||||
}
|
||||
|
||||
Expression<Func<Trial, bool>> trialAttendedReviewerTypeExpression = x => true;
|
||||
|
||||
foreach (var item in searchParam.AttendedReviewerTypeEnumList)
|
||||
{
|
||||
trialAttendedReviewerTypeExpression = trialAttendedReviewerTypeExpression.And(t => t.AttendedReviewerTypes.Contains($"|{item}|"));
|
||||
}
|
||||
|
||||
|
||||
var query = _trialRepository.AsQueryable().IgnoreQueryFilters()
|
||||
.WhereIf(!string.IsNullOrEmpty(searchParam.TrialStatusStr), o => o.TrialStatusStr.Contains(searchParam.TrialStatusStr))
|
||||
.WhereIf(searchParam.SponsorId != null, o => o.SponsorId == searchParam.SponsorId)
|
||||
@@ -58,16 +77,21 @@ namespace IRaCIS.Application.Services
|
||||
.WhereIf(!string.IsNullOrEmpty(searchParam.ResearchProgramNo), o => o.ResearchProgramNo.Contains(searchParam.ResearchProgramNo))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(searchParam.ExperimentName), o => o.ExperimentName.Contains(searchParam.ExperimentName))
|
||||
.WhereIf(searchParam.PhaseId != null, o => o.PhaseId == searchParam.PhaseId)
|
||||
.WhereIf(searchParam.DeclarationTypeId != null, o => o.DeclarationTypeId == searchParam.DeclarationTypeId)
|
||||
|
||||
.WhereIf(searchParam.DeclarationTypeEnumList.Count > 0, trialDeclarationTypeExpression)
|
||||
.WhereIf(searchParam.AttendedReviewerTypeEnumList.Count > 0, trialAttendedReviewerTypeExpression)
|
||||
|
||||
//.WhereIf(searchParam.AttendedReviewerType != null, o => o.AttendedReviewerType == searchParam.AttendedReviewerType)
|
||||
|
||||
.WhereIf(searchParam.IndicationTypeId != null, o => o.IndicationTypeId == searchParam.IndicationTypeId)
|
||||
.WhereIf(searchParam.CROId != null, o => o.CROId == searchParam.CROId)
|
||||
.WhereIf(searchParam.BeginDate != null, o => o.CreateTime >= searchParam.BeginDate)
|
||||
.WhereIf(searchParam.EndDate != null, o => o.CreateTime <= searchParam.EndDate)
|
||||
.WhereIf(searchParam.AttendedReviewerType != null, o => o.AttendedReviewerType == searchParam.AttendedReviewerType)
|
||||
|
||||
.WhereIf(multiModalityIdSelectCount > 0, t => t.TrialDicList.Count(t => t.KeyName == StaticData.Modality) == multiModalityIdSelectCount)
|
||||
.WhereIf(multiCriteriaSelectCount > 0, t => t.TrialDicList.Count(t => t.KeyName == StaticData.Criterion) == multiCriteriaSelectCount)
|
||||
.WhereIf(multiReviewTypeSelectCount > 0, t => t.TrialDicList.Count(t => t.KeyName == StaticData.ReviewType) == multiReviewTypeSelectCount)
|
||||
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted==false) && t.IsDeleted == false)
|
||||
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false)
|
||||
.ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id });
|
||||
|
||||
return await query.ToPagedListAsync(searchParam.PageIndex, searchParam.PageSize, string.IsNullOrWhiteSpace(searchParam.SortField) ? "CreateTime" : searchParam.SortField, searchParam.Asc);
|
||||
@@ -153,7 +177,7 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
if (await _trialRepository.AnyAsync(u => u.TrialCode == trialAddModel.TrialCode))
|
||||
{
|
||||
//---已经存在相同的项目编号。
|
||||
//---已经存在相同的项目编号。
|
||||
throw new BusinessValidationFailedException(_localizer["Trial_DuplicateProjectNumber"]);
|
||||
}
|
||||
|
||||
@@ -171,6 +195,9 @@ namespace IRaCIS.Application.Services
|
||||
trial.TrialCode = (trial.TrialType == TrialType.NoneOfficial ? "T0" : yearStr.Substring(yearStr.Length - 2)) + trial.TrialCode + currentYearMaxCodeNext.ToString("D3");
|
||||
|
||||
|
||||
trial.DeclarationTypes = $"|{string.Join('|', trialAddModel.DeclarationTypeEnumList.Select(x => ((int)x).ToString()).ToList())}|";
|
||||
trial.AttendedReviewerTypes = $"|{string.Join('|', trialAddModel.AttendedReviewerTypeEnumList.Select(x => ((int)x).ToString()).ToList())}|";
|
||||
|
||||
//多选信息
|
||||
trialAddModel.ModalityIds.ForEach(modalityId => trial.TrialDicList.Add(new TrialDictionary() { DictionaryId = modalityId, KeyName = StaticData.Modality, TrialId = trial.Id }));
|
||||
trialAddModel.CriterionIds.ForEach(criterionId => trial.TrialDicList.Add(new TrialDictionary() { DictionaryId = criterionId, KeyName = StaticData.Criterion, TrialId = trial.Id }));
|
||||
@@ -209,14 +236,14 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
if (!await _repository.AnyAsync<Trial>(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<Trial>(u => u.TrialCode == updateModel.TrialCode && u.Id != updateModel.Id))
|
||||
{
|
||||
//---已经存在相同的项目编号。
|
||||
//---已经存在相同的项目编号。
|
||||
throw new BusinessValidationFailedException(_localizer["Trial_DuplicateProjectNumber"]);
|
||||
}
|
||||
|
||||
@@ -242,6 +269,9 @@ namespace IRaCIS.Application.Services
|
||||
}
|
||||
_mapper.Map(updateModel, trial);
|
||||
|
||||
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();
|
||||
return ResponseOutput.Ok(trial);
|
||||
|
||||
@@ -352,7 +382,7 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
/// <summary> 真删除项目 方便清理测试数据 </summary>
|
||||
/// <param name="trialId">临床试验项目Id</param>
|
||||
|
||||
[AllowAnonymous]
|
||||
[HttpDelete, Route("{trialId:guid}")]
|
||||
public async Task<IResponseOutput> DeleteTrial(Guid trialId)
|
||||
{
|
||||
@@ -404,142 +434,129 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
|
||||
|
||||
var success = await _repository.BatchDeleteAsync<CheckChallengeDialog>(o => o.SubjectVisit.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ClinicalDataTrialSet>(o => o.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ConsistencyCheckFile>(o => o.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<CheckChallengeDialog>(o => o.SubjectVisit.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ClinicalDataTrialSet>(o => o.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ConsistencyCheckFile>(o => o.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<CriterionNidusSystem>(o => o.TrialReadingCriterion.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<DataInspection>(o => o.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<DicomStudy>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<StudyMonitor>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<DicomSeries>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<DicomInstance>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<EnrollReadingCategory>(t => t.Enroll.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<Enroll>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<EnrollDetail>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<NoneDicomStudyFile>(t => t.NoneDicomStudy.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<NoneDicomStudy>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<CriterionNidusSystem>(o => o.TrialReadingCriterion.TrialId == trialId) ||
|
||||
|
||||
await _repository.BatchDeleteAsync<OrganTrialInfo>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<DataInspection>(o => o.TrialId == trialId) ||
|
||||
|
||||
await _repository.BatchDeleteAsync<DicomStudy>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<StudyMonitor>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<DicomSeries>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<DicomInstance>(t => t.TrialId == trialId) ||
|
||||
|
||||
await _repository.BatchDeleteAsync<EnrollReadingCategory>(t => t.Enroll.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<Enroll>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<EnrollDetail>(t => t.TrialId == trialId) ||
|
||||
|
||||
await _repository.BatchDeleteAsync<NoneDicomStudyFile>(t => t.NoneDicomStudy.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<NoneDicomStudy>(t => t.TrialId == trialId) ||
|
||||
|
||||
await _repository.BatchDeleteAsync<OrganTrialInfo>(t => t.TrialId == trialId) ||
|
||||
|
||||
await _repository.BatchDeleteAsync<PaymentAdjustment>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<PaymentDetail>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<PaymentAdjustment>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<PaymentDetail>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<PreviousHistory>(t => t.SubjectVisit.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<PreviousOther>(t => t.SubjectVisit.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<PreviousPDF>(t => t.SubjectVisit.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<PreviousHistory>(t => t.SubjectVisit.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<PreviousOther>(t => t.SubjectVisit.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<PreviousPDF>(t => t.SubjectVisit.TrialId == trialId);
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<QCChallengeDialog>(t => t.QCChallenge.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<QCChallenge>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<QCChallengeDialog>(t => t.QCChallenge.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<QCChallenge>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<ReadingClinicalDataPDF>(t => t.ReadingClinicalData.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingClinicalData>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingGlobalTaskInfo>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingJudgeInfo>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingClinicalDataPDF>(t => t.ReadingClinicalData.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingClinicalData>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingGlobalTaskInfo>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingJudgeInfo>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<ReadingMedicalReviewDialog>(t => t.TaskMedicalReview.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingMedicineQuestionAnswer>(t => t.TaskMedicalReview.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingMedicineTrialQuestion>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingMedicalReviewDialog>(t => t.TaskMedicalReview.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingMedicineQuestionAnswer>(t => t.TaskMedicalReview.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingMedicineTrialQuestion>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<ReadingOncologyTaskInfo>(t => t.VisitTask.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingPeriodPlan>(t => t.ReadingPeriodSet.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingPeriodSet>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingOncologyTaskInfo>(t => t.VisitTask.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingPeriodPlan>(t => t.ReadingPeriodSet.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingPeriodSet>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<ReadingQuestionTrial>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingTableAnswerRowInfo>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingQuestionTrial>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingTableAnswerRowInfo>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<ReadingTableQuestionAnswer>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingTableQuestionTrial>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingTaskQuestionAnswer>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingTableQuestionAnswer>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingTableQuestionTrial>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingTaskQuestionAnswer>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<ReadingTaskRelation>(t => t.VisitTask.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadModule>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingTaskQuestionAnswer>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingTaskRelation>(t => t.VisitTask.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadModule>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingTaskQuestionAnswer>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<SubjectCanceDoctor>(t => t.Subject.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<SubjectUser>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<SubjectCanceDoctor>(t => t.Subject.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<SubjectUser>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<Subject>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<SubjectVisit>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<Subject>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<SubjectVisit>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<TaskAllocationRule>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TaskConsistentRule>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TaskInfluence>(t => t.InfluenceTask.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TaskMedicalReview>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TaskMedicalReviewRule>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TaskAllocationRule>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TaskConsistentRule>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TaskInfluence>(t => t.InfluenceTask.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TaskMedicalReview>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TaskMedicalReviewRule>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialStateChange>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialPaymentPrice>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialStateChange>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialPaymentPrice>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<Trial>(o => o.Id == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialClinicalDataSetCriterion>(t => t.TrialReadingCriterion.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialCriterionDictionaryCode>(t => t.TrialReadingCriterion.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<ReadingQuestionCriterionTrial>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialDictionary>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialDocConfirmedUser>(t => t.TrialDocument.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<Trial>(o => o.Id == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialClinicalDataSetCriterion>(t => t.TrialReadingCriterion.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialCriterionDictionaryCode>(t => t.TrialReadingCriterion.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<ReadingQuestionCriterionTrial>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialDictionary>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialDocConfirmedUser>(t => t.TrialDocument.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialDocument>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialDocNeedConfirmedUserType>(t => t.TrialDocument.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialDocument>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialDocNeedConfirmedUserType>(t => t.TrialDocument.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialEmailNoticeUser>(t => t.TrialEmailNoticeConfig.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialEmailNoticeUser>(t => t.TrialEmailNoticeConfig.TrialId == trialId);
|
||||
|
||||
//await _repository.BatchDeleteAsync<TrialExperience>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialEmailNoticeUser>(t => t.TrialEmailNoticeConfig.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialEmailNoticeConfig>(t => t.TrialId == trialId) ||
|
||||
//await _repository.BatchDeleteAsync<TrialExperience>(t => t.TrialId == trialId) ;
|
||||
await _repository.BatchDeleteAsync<TrialEmailNoticeUser>(t => t.TrialEmailNoticeConfig.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialEmailNoticeConfig>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialExternalUser>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialExternalUser>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialPaymentPrice>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialPaymentPrice>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialQCQuestion>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialQCQuestionAnswer>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialQCQuestion>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialQCQuestionAnswer>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialRevenuesPrice>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialRevenuesPriceVerification>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialRevenuesPrice>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialRevenuesPriceVerification>(t => t.TrialId == trialId);
|
||||
|
||||
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialSign>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialSite>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialSiteSurvey>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialSiteUserSurvey>(t => t.TrialSiteSurvey.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialSiteEquipmentSurvey>(t => t.TrialSiteSurvey.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialSign>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialSite>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialSiteSurvey>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialSiteUserSurvey>(t => t.TrialSiteSurvey.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialSiteEquipmentSurvey>(t => t.TrialSiteSurvey.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialUser>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialSiteUser>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<VisitStage>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<VisitPlanInfluenceStat>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<VisitPlanInfluenceStudy>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialUser>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialSiteUser>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<VisitStage>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<VisitPlanInfluenceStat>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<VisitPlanInfluenceStudy>(t => t.TrialId == trialId);
|
||||
|
||||
await _repository.BatchDeleteAsync<VisitTaskReReading>(t => t.OriginalReReadingTask.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<VisitTask>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialAttachment>(t => t.TrialId == trialId) ||
|
||||
await _repository.BatchDeleteAsync<TrialStateChange>(t => t.TrialId == trialId)
|
||||
await _repository.BatchDeleteAsync<VisitTaskReReading>(t => t.OriginalReReadingTask.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<VisitTask>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialAttachment>(t => t.TrialId == trialId);
|
||||
await _repository.BatchDeleteAsync<TrialStateChange>(t => t.TrialId == trialId) ;
|
||||
|
||||
|
||||
|
||||
|
||||
;
|
||||
|
||||
return ResponseOutput.Result(success);
|
||||
return ResponseOutput.Ok();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.Service;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using IRaCIS.Core.Application.Auth;
|
||||
using IRaCIS.Application.Interfaces;
|
||||
|
||||
namespace IRaCIS.Core.Application.Services
|
||||
{
|
||||
@@ -29,95 +30,92 @@ namespace IRaCIS.Core.Application.Services
|
||||
}
|
||||
|
||||
|
||||
#region 导出列表
|
||||
#region 移动废弃
|
||||
|
||||
/// <summary>
|
||||
/// Site用户列表导出
|
||||
/// </summary>
|
||||
/// <param name="param"></param>
|
||||
/// <param name="_commonDocumentRepository"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public async Task<IActionResult> TrialSiteUserListExport(SiteCRCExportQueryDTO param, [FromServices] IRepository<CommonDocument> _commonDocumentRepository)
|
||||
{
|
||||
///// <summary>
|
||||
///// Site用户列表导出
|
||||
///// </summary>
|
||||
///// <param name="param"></param>
|
||||
///// <param name="_commonDocumentRepository"></param>
|
||||
///// <returns></returns>
|
||||
///// <exception cref="Exception"></exception>
|
||||
//[HttpPost]
|
||||
//[AllowAnonymous]
|
||||
//public async Task<IActionResult> TrialSiteUserListExport(SiteCRCExportQueryDTO param, [FromServices] IRepository<CommonDocument> _commonDocumentRepository, [FromServices] IDictionaryService _dictionaryService)
|
||||
//{
|
||||
|
||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<TrialSiteUserExportDto>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
// var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
exportInfo.TrialSiteUserList = await _trialSiteUserRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
||||
.WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.SiteName), t => t.Site.SiteName.Contains(param.SiteName))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteAliasName),
|
||||
t => t.TrialSite.TrialSiteAliasName.Contains(param.TrialSiteAliasName))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteCode),
|
||||
t => t.TrialSite.TrialSiteCode.Contains(param.TrialSiteCode))
|
||||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator,
|
||||
t => t.UserId == _userInfo.Id)
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserKeyInfo), t => (t.User.FullName).Contains(param.UserKeyInfo)
|
||||
|| t.User.UserName.Contains(param.UserKeyInfo) || t.User.EMail.Contains(param.UserKeyInfo))
|
||||
// exportInfo.List = await _trialSiteUserRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
||||
// .WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
||||
// .WhereIf(!string.IsNullOrWhiteSpace(param.SiteName), t => t.Site.SiteName.Contains(param.SiteName))
|
||||
// .WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteAliasName),
|
||||
// t => t.TrialSite.TrialSiteAliasName.Contains(param.TrialSiteAliasName))
|
||||
// .WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteCode),
|
||||
// t => t.TrialSite.TrialSiteCode.Contains(param.TrialSiteCode))
|
||||
// .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator,
|
||||
// t => t.UserId == _userInfo.Id)
|
||||
// .WhereIf(!string.IsNullOrWhiteSpace(param.UserKeyInfo), t => (t.User.FullName).Contains(param.UserKeyInfo)
|
||||
// || t.User.UserName.Contains(param.UserKeyInfo) || t.User.EMail.Contains(param.UserKeyInfo))
|
||||
|
||||
.ProjectTo<SiteUserExportDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
// .ProjectTo<SiteUserExportDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var no = 1;
|
||||
exportInfo.TrialSiteUserList.ForEach(t => t.No = no++);
|
||||
// exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
// return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment,_dictionaryService,typeof(SiteUserExportDTO));
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment);
|
||||
//}
|
||||
|
||||
}
|
||||
///// <summary>
|
||||
///// Site用户汇总表导出
|
||||
///// </summary>
|
||||
///// <param name="queryParam"></param>
|
||||
///// <param name="_commonDocumentRepository"></param>
|
||||
///// <param name="_trialSiteSurveyRepository"></param>
|
||||
///// <param name="_trialSiteUserSurveyRepository"></param>
|
||||
///// <param name="_dictionaryService"></param>
|
||||
///// <returns></returns>
|
||||
///// <exception cref="Exception"></exception>
|
||||
//[HttpPost]
|
||||
//[AllowAnonymous]
|
||||
//public async Task<IActionResult> TrialSiteUserSummaryListExport(TrialSiteUserSurveyExportQueryDto queryParam,
|
||||
// [FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||||
// [FromServices] IRepository<TrialSiteSurvey> _trialSiteSurveyRepository,
|
||||
// [FromServices] IRepository<TrialSiteUserSurvey> _trialSiteUserSurveyRepository
|
||||
// , [FromServices] IDictionaryService _dictionaryService
|
||||
//)
|
||||
//{
|
||||
|
||||
/// <summary>
|
||||
/// Site用户汇总表导出
|
||||
/// </summary>
|
||||
/// <param name="queryParam"></param>
|
||||
/// <param name="_commonDocumentRepository"></param>
|
||||
/// <param name="_trialSiteSurveyRepository"></param>
|
||||
/// <param name="_trialSiteUserSurveyRepository"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public async Task<IActionResult> TrialSiteUserSummaryListExport(TrialSiteUserSurveyExportQueryDto queryParam,
|
||||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||||
[FromServices] IRepository<TrialSiteSurvey> _trialSiteSurveyRepository,
|
||||
[FromServices] IRepository<TrialSiteUserSurvey> _trialSiteUserSurveyRepository
|
||||
)
|
||||
{
|
||||
// var data = (await _trialRepository.Where(t => t.Id == queryParam.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
var data = (await _trialRepository.Where(t => t.Id == queryParam.TrialId).IgnoreQueryFilters().ProjectTo<TrialSiteUserSummaryExportDto>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
var groupSelectIdQuery =
|
||||
_trialSiteSurveyRepository.Where(t => t.TrialId == queryParam.TrialId)
|
||||
.WhereIf(queryParam.SiteId != null, t => t.SiteId == queryParam.SiteId)
|
||||
.WhereIf(!string.IsNullOrEmpty(queryParam.FormWriterKeyInfo), t => (t.UserName).Contains(queryParam.FormWriterKeyInfo) || t.Email.Contains(queryParam.FormWriterKeyInfo) || t.Phone.Contains(queryParam.FormWriterKeyInfo))
|
||||
.GroupBy(t => t.SiteId)
|
||||
.Select(g => g.OrderByDescending(u => u.CreateTime).Select(t => t.Id).First());
|
||||
// var groupSelectIdQuery =
|
||||
// _trialSiteSurveyRepository.Where(t => t.TrialId == queryParam.TrialId)
|
||||
// .WhereIf(queryParam.SiteId != null, t => t.SiteId == queryParam.SiteId)
|
||||
// .WhereIf(!string.IsNullOrEmpty(queryParam.FormWriterKeyInfo), t => (t.UserName).Contains(queryParam.FormWriterKeyInfo) || t.Email.Contains(queryParam.FormWriterKeyInfo) || t.Phone.Contains(queryParam.FormWriterKeyInfo))
|
||||
// .GroupBy(t => t.SiteId)
|
||||
// .Select(g => g.OrderByDescending(u => u.CreateTime).Select(t => t.Id).First());
|
||||
|
||||
|
||||
var query = _trialSiteUserSurveyRepository
|
||||
.Where(t => groupSelectIdQuery.Contains(t.TrialSiteSurveyId))
|
||||
.WhereIf(queryParam.UserTypeId != null, t => t.UserTypeId == queryParam.UserTypeId)
|
||||
.WhereIf(queryParam.IsGenerateAccount != null, t => t.IsGenerateAccount == queryParam.IsGenerateAccount)
|
||||
.WhereIf(queryParam.TrialRoleNameId != null, t => t.TrialRoleNameId == queryParam.TrialRoleNameId)
|
||||
.WhereIf(queryParam.State != null && queryParam.State != TrialSiteUserStateEnum.OverTime, t => t.InviteState == queryParam.State)
|
||||
.WhereIf(queryParam.State != null && queryParam.State == TrialSiteUserStateEnum.OverTime, t => t.InviteState == TrialSiteUserStateEnum.HasSend && t.ExpireTime < DateTime.Now)
|
||||
.WhereIf(!string.IsNullOrEmpty(queryParam.UserName), t => (t.LastName + " / " + t.FirstName).Contains(queryParam.UserName))
|
||||
.WhereIf(!string.IsNullOrEmpty(queryParam.OrganizationName), t => t.OrganizationName.Contains(queryParam.OrganizationName))
|
||||
.ProjectTo<TrialSiteUserSummaryDto>(_mapper.ConfigurationProvider);
|
||||
// var query = _trialSiteUserSurveyRepository
|
||||
// .Where(t => groupSelectIdQuery.Contains(t.TrialSiteSurveyId))
|
||||
// .WhereIf(queryParam.UserTypeId != null, t => t.UserTypeId == queryParam.UserTypeId)
|
||||
// .WhereIf(queryParam.IsGenerateAccount != null, t => t.IsGenerateAccount == queryParam.IsGenerateAccount)
|
||||
// .WhereIf(queryParam.TrialRoleNameId != null, t => t.TrialRoleNameId == queryParam.TrialRoleNameId)
|
||||
// .WhereIf(queryParam.State != null && queryParam.State != TrialSiteUserStateEnum.OverTime, t => t.InviteState == queryParam.State)
|
||||
// .WhereIf(queryParam.State != null && queryParam.State == TrialSiteUserStateEnum.OverTime, t => t.InviteState == TrialSiteUserStateEnum.HasSend && t.ExpireTime < DateTime.Now)
|
||||
// .WhereIf(!string.IsNullOrEmpty(queryParam.UserName), t => (t.LastName + " / " + t.FirstName).Contains(queryParam.UserName))
|
||||
// .WhereIf(!string.IsNullOrEmpty(queryParam.OrganizationName), t => t.OrganizationName.Contains(queryParam.OrganizationName))
|
||||
// .ProjectTo<TrialSiteUserSummaryDto>(_mapper.ConfigurationProvider);
|
||||
|
||||
data.TrialSiteUserList = await query.ToListAsync();
|
||||
// data.List = await query.ToListAsync();
|
||||
|
||||
|
||||
|
||||
var exportInfo = data;
|
||||
// var exportInfo = data;
|
||||
|
||||
//处理翻译
|
||||
var no = 1;
|
||||
exportInfo.TrialSiteUserList.ForEach(t => t.No = no++);
|
||||
// exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||
// return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserSummary_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment,_dictionaryService,typeof(TrialSiteUserSummaryDto));
|
||||
|
||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserSummary_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment);
|
||||
|
||||
}
|
||||
//}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
//.ForMember(d => d.Code, u => u.MapFrom(s => s.TrialCode))
|
||||
.ForMember(d => d.Sponsor, u => u.MapFrom(s => s.Sponsor.SponsorName))
|
||||
.ForMember(d => d.Phase, u => u.MapFrom(s => s.Phase.MappedValue))
|
||||
.ForMember(d => d.DeclarationType, u => u.MapFrom(s => s.DeclarationType.MappedValue))
|
||||
//.ForMember(d => d.DeclarationType, u => u.MapFrom(s => s.DeclarationType.MappedValue))
|
||||
.ForMember(d => d.IndicationType, u => u.MapFrom(s => s.IndicationType.MappedValue))
|
||||
.ForMember(d => d.CRO, u => u.MapFrom(s => s.CRO.CROName))
|
||||
.ForMember(d => d.ReviewMode, u => u.MapFrom(s => s.ReviewMode.MappedValue))
|
||||
|
||||
@@ -9,6 +9,7 @@ namespace IRaCIS.Application.Interfaces
|
||||
Task<IResponseOutput> DeleteSubject(Guid id);
|
||||
|
||||
Task<IResponseOutput> UpdateSubjectStatus(SubjectStatusChangeCommand subjectStatusChangeCommand);
|
||||
Task<IResponseOutput<PageOutput<SubjectQueryView>, TrialSubjectConfig>> GetSubjectList(SubjectQueryParam param);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -114,7 +114,7 @@ namespace IRaCIS.Application.Services
|
||||
/// <summary> 分页获取受试者列表[New] </summary>
|
||||
/// /// <param name="param">state:1-访视中,2-出组。0-全部</param>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput<PageOutput<SubjectQueryView>, TrialSubjectConfig>> GetSubjectList(SubjectQueryParam param)
|
||||
public async Task<IResponseOutput<PageOutput<SubjectQueryView>>> GetSubjectList(SubjectQueryParam param)
|
||||
{
|
||||
|
||||
var subjectQuery = _subjectRepository.Where(u => u.TrialId == param.TrialId)
|
||||
|
||||
@@ -111,7 +111,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
if (!await _trialRepository.Where(t => t.Id == visitPlan.TrialId).IgnoreQueryFilters().AnyAsync(t => t.TrialStatusStr == StaticData.TrialState.TrialOngoing || t.TrialStatusStr == StaticData.TrialState.TrialInitializing))
|
||||
{
|
||||
throw new BusinessValidationFailedException("只有当项目状态为:初始化或进行中时,可以操作。 ");
|
||||
//---只有当项目状态为:初始化或进行中时,可以操作。
|
||||
throw new BusinessValidationFailedException(_localizer["VisitPlan_OnlyInitOrOngoing"]);
|
||||
}
|
||||
|
||||
var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == visitPlan.TrialId, ignoreQueryFilters: true)
|
||||
|
||||
+15
-13
@@ -1,4 +1,5 @@
|
||||
using Magicodes.ExporterAndImporter.Core;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Magicodes.ExporterAndImporter.Core;
|
||||
using Magicodes.ExporterAndImporter.Core.Filters;
|
||||
using Magicodes.ExporterAndImporter.Core.Models;
|
||||
using Magicodes.ExporterAndImporter.Excel;
|
||||
@@ -44,7 +45,8 @@ namespace IRaCIS.Core.Application.MediatR.CommandAndQueries
|
||||
var index= data.IndexOf(item);
|
||||
if ( DateTime.TryParse(item.StudyDate, out dt) == false)
|
||||
{
|
||||
importResult.RowErrors.Add(new DataRowErrorInfo() { RowIndex = index, FieldErrors = new Dictionary<string, string> { { "检查技术", "时间格式不对" } } });
|
||||
|
||||
importResult.RowErrors.Add(new DataRowErrorInfo() { RowIndex = index, FieldErrors = new Dictionary<string, string> { { StaticData.International("ConsistencyVerification_Tech") , StaticData.International("ConsistencyVerification_Time") } } });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -72,35 +74,35 @@ namespace IRaCIS.Core.Application.MediatR.CommandAndQueries
|
||||
public class CheckViewModel
|
||||
{
|
||||
//[Required(ErrorMessage = "中心编号不能为空")]
|
||||
[ImporterHeader(Name = "中心编号", AutoTrim = true)]
|
||||
[ExcelColumnName("中心编号")]
|
||||
[ImporterHeader(Name = "Site ID", AutoTrim = true)]
|
||||
[ExcelColumnIndex("Site ID")]
|
||||
public string SiteCode { get; set; } = string.Empty;
|
||||
|
||||
|
||||
//[Required(ErrorMessage = "受试者筛选号不能为空")]
|
||||
[ImporterHeader(Name = "受试者筛选号", AutoTrim = true)]
|
||||
[ExcelColumnName("受试者筛选号")]
|
||||
[ImporterHeader(Name = "Subject ID", AutoTrim = true)]
|
||||
[ExcelColumnName("Subject ID")]
|
||||
public string SubjectCode { get; set; } = string.Empty;
|
||||
|
||||
//[Required(ErrorMessage = "访视名称不能为空")]
|
||||
[ImporterHeader(Name = "访视名称", AutoTrim = true)]
|
||||
[ExcelColumnName("访视名称")]
|
||||
[ImporterHeader(Name = "Visit Name", AutoTrim = true)]
|
||||
[ExcelColumnName("Visit Name")]
|
||||
public string VisitName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
|
||||
//[Required(ErrorMessage = "检查日期不能为空")]
|
||||
[CanConvertToTime(ErrorMessage = "检查日期格式有问题")]
|
||||
[CanConvertToTime(ErrorMessage = "Does not conform to Stusy Date format")]
|
||||
|
||||
[ImporterHeader(Name = "检查日期", AutoTrim = true)]
|
||||
[ExcelColumnName("检查日期")]
|
||||
[ImporterHeader(Name = "Stusy Date", AutoTrim = true)]
|
||||
[ExcelColumnName("Stusy Date")]
|
||||
public string StudyDate { get; set; } = string.Empty;
|
||||
|
||||
|
||||
|
||||
//[Required(ErrorMessage = "Modality不能为空")]
|
||||
[ImporterHeader(Name = "检查技术", AutoTrim = true)]
|
||||
[ExcelColumnName("检查技术")]
|
||||
[ImporterHeader(Name = "Modality", AutoTrim = true)]
|
||||
[ExcelColumnName("Modality")]
|
||||
public string Modality { get; set; } = string.Empty;
|
||||
|
||||
|
||||
|
||||
@@ -112,13 +112,14 @@ namespace IRaCIS.Core.Application.MediatR.Handlers
|
||||
|
||||
|
||||
StringBuilder dialogMsg = new StringBuilder();
|
||||
dialogMsg.Append("您好,根据本系统自动识别,该受试者当前访视在IRC系统中已提交的影像检查情况如下:");
|
||||
//---您好,根据本系统自动识别,该受试者当前访视在IRC系统中已提交的影像检查情况如下:
|
||||
dialogMsg.Append(StaticData.International("ConsistencyVerification_Img"));
|
||||
var num = 0;
|
||||
List<ParamInfoDto> paramInfoList = new List<ParamInfoDto>();
|
||||
foreach (var item in dbVisitStudyList)
|
||||
{
|
||||
num++;
|
||||
dialogMsg.AppendLine($"<br>{num}.{item.StudyDate}的{item.Modality}影像检查");
|
||||
dialogMsg.AppendLine($"<br>{num}.{item.StudyDate}{StaticData.International("ConsistencyVerification_Of")}{item.Modality}{StaticData.International("ConsistencyVerification_ImgC")}");
|
||||
paramInfoList.Add(new ParamInfoDto()
|
||||
{
|
||||
Modality = item.Modality,
|
||||
@@ -175,15 +176,18 @@ namespace IRaCIS.Core.Application.MediatR.Handlers
|
||||
if (dbExceptExcel.Count() == 0 && excelExceptDB.Count() == 0)
|
||||
{
|
||||
dialogMsg.AppendLine($"<br/>");
|
||||
dialogMsg.AppendLine($"核对EDC数据,完全一致, 审核通过");
|
||||
//---核对EDC数据,完全一致, 审核通过
|
||||
dialogMsg.AppendLine(StaticData.International("ConsistencyVerification_EDCA"));
|
||||
|
||||
|
||||
// dialogMsg.AppendLine(@$"<br>说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。");
|
||||
dbSV.CheckState = CheckStateEnum.CVPassed;
|
||||
dbSV.CheckUserId = _userInfo.Id;
|
||||
dbSV.CheckPassedTime = DateTime.Now;
|
||||
dbSV.CheckResult = "核对EDC数据,完全一致";
|
||||
dbSV.ManualPassReason = "自动核查通过";
|
||||
//---核对EDC数据,完全一致
|
||||
dbSV.CheckResult = StaticData.International("ConsistencyVerification_EDCB");
|
||||
//---自动核查通过
|
||||
dbSV.ManualPassReason = StaticData.International("ConsistencyVerification_Auto");
|
||||
|
||||
//维护状态
|
||||
dbSV.ReadingStatus = ReadingStatusEnum.TaskAllocate;
|
||||
@@ -202,26 +206,30 @@ namespace IRaCIS.Core.Application.MediatR.Handlers
|
||||
else
|
||||
{
|
||||
dialogMsg.AppendLine($"<br/>");
|
||||
dialogMsg.AppendLine($"<br><span style='color: #f00'>存在问题如下:</span>");
|
||||
//存在问题如下:
|
||||
dialogMsg.AppendLine($"<br><span style='color: #f00'>{StaticData.International("ConsistencyVerification_Prob")}</span>");
|
||||
|
||||
num = 0;
|
||||
foreach (var item in dbExceptExcel)
|
||||
{
|
||||
num++;
|
||||
dialogMsg.AppendLine($"<br>{num}.{item.StudyDate}的{item.Modality}影像检查(EDC 缺少) ");
|
||||
//影像检查(EDC 缺少) ConsistencyVerification_EdcL
|
||||
dialogMsg.AppendLine($"<br>{num}.{item.StudyDate}{StaticData.International("ConsistencyVerification_Of")}{item.Modality}{StaticData.International("ConsistencyVerification_EdcL")} ");
|
||||
}
|
||||
|
||||
foreach (var item in excelExceptDB)
|
||||
{
|
||||
num++;
|
||||
dialogMsg.AppendLine($"<br>{num}.{item.StudyDate}的{item.Modality}影像检查(IRC 缺少) ");
|
||||
// 影像检查(IRC 缺少)
|
||||
dialogMsg.AppendLine($"<br>{num}.{item.StudyDate}{StaticData.International("ConsistencyVerification_Of")}{item.Modality}{StaticData.International("ConsistencyVerification_IrcL")} ");
|
||||
}
|
||||
|
||||
dialogMsg.AppendLine($"<br/>");
|
||||
dialogMsg.AppendLine(@$"<br>说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。");
|
||||
dialogMsg.AppendLine(@$"<br>{StaticData.International("ConsistencyVerification_Desc")}");
|
||||
|
||||
dbSV.CheckResult = "根据导入的一致性核查数据,请确认本访视以下不一致检查项信息:" + String.Join(" | ", dbExceptExcel.Select(t => $"EDC 缺少:{t.StudyDate} {t.Modality} ")) + " | "
|
||||
+ String.Join(" | ", excelExceptDB.Select(t => $"IRC 缺少:{t.StudyDate} {t.Modality}"));
|
||||
//---根据导入的一致性核查数据,请确认本访视以下不一致检查项信息:
|
||||
dbSV.CheckResult = StaticData.International("ConsistencyVerification_Conf") + String.Join(" | ", dbExceptExcel.Select(t => $"{StaticData.International("ConsistencyVerification_Edc")}{t.StudyDate} {t.Modality} ")) + " | "
|
||||
+ String.Join(" | ", excelExceptDB.Select(t => $"{StaticData.International("ConsistencyVerification_IrcLi")}{t.StudyDate} {t.Modality}"));
|
||||
//新增一致性核查质疑记录
|
||||
|
||||
|
||||
|
||||
@@ -296,13 +296,20 @@ namespace IRaCIS.Core.Domain.Share
|
||||
//阅片状态
|
||||
public enum ReadingTaskState
|
||||
{
|
||||
/// <summary>
|
||||
/// 待阅
|
||||
/// </summary>
|
||||
WaitReading = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 阅片中
|
||||
/// </summary>
|
||||
Reading = 1,
|
||||
|
||||
HaveSigned = 2,
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 已签名
|
||||
/// </summary>
|
||||
HaveSigned = 2,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -16,11 +16,26 @@ namespace IRaCIS.Core.Domain.Share
|
||||
public static readonly string Group = "group";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 影像质量评估
|
||||
/// </summary>
|
||||
public enum ImageQualityEvaluation
|
||||
{
|
||||
/// <summary>
|
||||
/// 正常
|
||||
/// </summary>
|
||||
Normal = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 语言类型
|
||||
/// </summary>
|
||||
public enum LanguageType
|
||||
/// <summary>
|
||||
/// 不正常
|
||||
/// </summary>
|
||||
Abnormal = 2,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 语言类型
|
||||
/// </summary>
|
||||
public enum LanguageType
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
@@ -1231,6 +1246,11 @@ namespace IRaCIS.Core.Domain.Share
|
||||
/// 无法评估
|
||||
/// </summary>
|
||||
NotEvaluable=3,
|
||||
|
||||
/// <summary>
|
||||
/// 太小
|
||||
/// </summary>
|
||||
TooSmall=4,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1241,7 +1261,7 @@ namespace IRaCIS.Core.Domain.Share
|
||||
/// <summary>
|
||||
/// 存在
|
||||
/// </summary>
|
||||
Exist = 1,
|
||||
Exist = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 增大
|
||||
@@ -1446,7 +1466,7 @@ namespace IRaCIS.Core.Domain.Share
|
||||
/// <summary>
|
||||
/// 与前一访视SOD相比变化量
|
||||
/// </summary>
|
||||
LastVisitSODChange = 23,
|
||||
ComparedTriggeringSODChange = 23,
|
||||
|
||||
/// <summary>
|
||||
/// 新靶病灶直径之和(iSOD)
|
||||
@@ -1454,9 +1474,9 @@ namespace IRaCIS.Core.Domain.Share
|
||||
ISOD = 24,
|
||||
|
||||
/// <summary>
|
||||
/// 与前一访视相比iSOD变化量
|
||||
/// 与触发iRECIST访视相比iSOD变化量 Compared with triggering iRECIST visit
|
||||
/// </summary>
|
||||
LastVisitiSODChange = 25,
|
||||
ComparedTriggeringiSODChange = 25,
|
||||
|
||||
/// <summary>
|
||||
/// 新靶病灶评估
|
||||
@@ -1490,7 +1510,12 @@ namespace IRaCIS.Core.Domain.Share
|
||||
/// </summary>
|
||||
IsBrainMetastasis =43,
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 影像质量评估
|
||||
/// </summary>
|
||||
ImageQualityAssessment=44,
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -33,8 +33,13 @@ namespace IRaCIS.Core.Domain.Share.Reading
|
||||
|
||||
//TNM分期
|
||||
|
||||
TNM = 2
|
||||
TNMStage = 2,
|
||||
|
||||
//骨转移
|
||||
BoneMetastasis = 3,
|
||||
|
||||
//手术期
|
||||
SurgicalPeriod = 4,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
|
||||
HasAuditPassDownload = 3,//下载简历审核 同意
|
||||
|
||||
|
||||
|
||||
HasDownloadResume = 4, // 下载简历 完成
|
||||
|
||||
HasCommittedToCRO = 5, //已提交CRO
|
||||
|
||||
@@ -33,6 +33,22 @@
|
||||
|
||||
US=1,
|
||||
|
||||
USAndCN=2,
|
||||
EU=2,
|
||||
|
||||
Other=3
|
||||
|
||||
}
|
||||
|
||||
public enum DeclarationType
|
||||
{
|
||||
Other=3,
|
||||
|
||||
US=1,
|
||||
|
||||
CN=0,
|
||||
|
||||
EU=2,
|
||||
|
||||
JP=4
|
||||
}
|
||||
}
|
||||
@@ -335,6 +335,10 @@ namespace IRaCIS.Core.Domain.Models
|
||||
).Any();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 是否修改了整体肿瘤评估
|
||||
/// </summary>
|
||||
public bool IsChangeTumorEvaluate { get; set; } = false;
|
||||
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -24,6 +24,8 @@ namespace IRaCIS.Core.Domain.Models
|
||||
|
||||
public string Description { get; set; } = String.Empty;
|
||||
|
||||
public string DescriptionCN { get; set; } = String.Empty;
|
||||
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
public Guid CreateUserId { get; set; }
|
||||
@@ -54,7 +56,7 @@ namespace IRaCIS.Core.Domain.Models
|
||||
/// <summary>
|
||||
/// 标识
|
||||
/// </summary>
|
||||
public string Identification { get; set; }
|
||||
public string Identification { get; set; } = string.Empty;
|
||||
|
||||
public Guid? ParentId { get; set; }
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-01 13:37:10
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
///Internationalization
|
||||
///</summary>
|
||||
[Table("Internationalization")]
|
||||
public class Internationalization : Entity, IAuditUpdate, IAuditAdd
|
||||
{
|
||||
public int ShowOrder { get; set; }
|
||||
|
||||
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
|
||||
public DateTime UpdateTime { get; set; }
|
||||
|
||||
|
||||
public Guid UpdateUserId { get; set; }
|
||||
|
||||
|
||||
public int State { get; set; }
|
||||
|
||||
|
||||
public string FolderPath { get; set; }
|
||||
|
||||
public string Code { get; set; }
|
||||
|
||||
public string Value { get; set; }
|
||||
|
||||
public string ValueCN { get; set; }
|
||||
|
||||
public int InternationalizationType { get; set; }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -30,7 +30,6 @@ namespace IRaCIS.Core.Domain.Models
|
||||
public Dictionary FileType { get; set; }
|
||||
|
||||
|
||||
|
||||
public Guid FileTypeId { get; set; }
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user