Compare commits
105 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 79ffa3e29a | |||
| db0319bfba | |||
| 747ad313e6 | |||
| 4f5b7be7b8 | |||
| e3b9576a2d | |||
| 0dcd74388f | |||
| 302f99172f | |||
| 05adb5ee84 | |||
| 013f63b52f | |||
| 640c28a260 | |||
| 2c06dfb553 | |||
| 63ae52d99c | |||
| 03026a84c7 | |||
| fd33e4c3d4 | |||
| 4606b3980c | |||
| be6affb2c6 | |||
| b75fc89011 | |||
| 5849309dad | |||
| 02dd9aca32 | |||
| 4c4905e60b | |||
| c63251b832 | |||
| 808ade6e8d | |||
| 73fb523b3d | |||
| 0c56b55c2a | |||
| e66b56af58 | |||
| a718aa9c69 | |||
| 49749b3f59 | |||
| 045c6bfc9f | |||
| 91a6f20dba | |||
| 4eb5c97725 | |||
| 978b230f00 | |||
| 9d2632106c | |||
| dd73415c00 | |||
| f0635ba323 | |||
| 38205b3b97 | |||
| ae7306a3ef | |||
| 5448216e7a | |||
| 4f111a710d | |||
| f5df39a971 | |||
| 1866257ff5 | |||
| 8d9fbbf7e9 | |||
| bcd87dfa6d | |||
| 653aca500f | |||
| ca36fd35a6 | |||
| 260b2ad5c9 | |||
| 230413a5cc | |||
| d9618472cb | |||
| 9d96789302 | |||
| 0a69979417 | |||
| ce21c72f37 | |||
| b4ade5e956 | |||
| c79f387af2 | |||
| 9171a62979 | |||
| 793704c111 | |||
| 0cb5c8ca94 | |||
| ca5f50586b | |||
| 6f09c10bd7 | |||
| 8205f33ec6 | |||
| 5360c577af | |||
| ea48fcac64 | |||
| fbc639030a | |||
| eef042b469 | |||
| d34bf1ee7d | |||
| 6987f4be83 | |||
| 1b443af123 | |||
| aa100c2383 | |||
| e3541d78ce | |||
| c0b973370c | |||
| 129419df9d | |||
| ac635c4b38 | |||
| f05f7168ac | |||
| 21a5c25760 | |||
| 756b44db5e | |||
| 38538ca358 | |||
| e22b019147 | |||
| 39fab36541 | |||
| b96a1dcefc | |||
| 4ab56202f0 | |||
| 9baa6e3c85 | |||
| 300b4582ec | |||
| 3cdd9b6af2 | |||
| 355d71769a | |||
| 851f785f50 | |||
| c462dbb745 | |||
| 5706fea2eb | |||
| c403951050 | |||
| 214e425796 | |||
| 2ea2c037e8 | |||
| a20ed9c876 | |||
| d995cc01bc | |||
| 3643693bde | |||
| 928c3ea3c2 | |||
| 779b07b1b5 | |||
| 2aea40d26f | |||
| 7a2a05063b | |||
| fa58ac7419 | |||
| 44ad83790d | |||
| 48ede05926 | |||
| 50ef2e83ce | |||
| 1be72c87f2 | |||
| 961b76fd1e | |||
| bc6a82a7fe | |||
| 1ac81b8f17 | |||
| 79e556ac80 | |||
| 50fdea4095 |
@@ -93,6 +93,7 @@ namespace IRaCIS.Api.Controllers
|
||||
[FromServices] ITokenService _tokenService, [FromServices] IConfiguration configuration)
|
||||
{
|
||||
|
||||
|
||||
var returnModel = await _userService.Login(loginUser.UserName, loginUser.Password);
|
||||
|
||||
if (returnModel.IsSuccess)
|
||||
@@ -160,6 +161,17 @@ namespace IRaCIS.Api.Controllers
|
||||
|
||||
returnModel.Data.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(returnModel.Data.BasicInfo));
|
||||
|
||||
// 创建一个 CookieOptions 对象,用于设置 Cookie 的属性
|
||||
var option = new CookieOptions
|
||||
{
|
||||
Expires = DateTime.Now.AddMonths(1), // 设置过期时间为 30 分钟之后
|
||||
HttpOnly = false, // 确保 cookie 只能通过 HTTP 访问
|
||||
SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None, // 设置 SameSite 属性
|
||||
Secure = false // 确保 cookie 只能通过 HTTPS 访问
|
||||
};
|
||||
|
||||
HttpContext.Response.Cookies.Append("access_token", returnModel.Data.JWTStr, option);
|
||||
|
||||
}
|
||||
|
||||
var userId = returnModel.Data.BasicInfo.Id.ToString();
|
||||
@@ -205,6 +217,8 @@ namespace IRaCIS.Api.Controllers
|
||||
|
||||
var token = decodeUrl.Substring(decodeUrl.IndexOf("access_token=") + "access_token=".Length);
|
||||
|
||||
var lang = decodeUrl.Substring(decodeUrl.IndexOf("lang=") + "lang=".Length, 2);
|
||||
|
||||
var domainStrList = decodeUrl.Split("/").ToList().Take(3).ToList();
|
||||
|
||||
var errorUrl = domainStrList[0]+"//"+ domainStrList[2]+ "/error";
|
||||
@@ -212,7 +226,7 @@ namespace IRaCIS.Api.Controllers
|
||||
|
||||
if (!await _userRepository.AnyAsync(t => t.Id == Guid.Parse(userId) && t.EmailToken == token && t.IsFirstAdd))
|
||||
{
|
||||
decodeUrl = errorUrl+ $"?ErrorMessage={System.Web.HttpUtility.UrlEncode("您的初始化链接已过期")} ";
|
||||
decodeUrl = errorUrl+ $"?lang={lang}&ErrorMessage={System.Web.HttpUtility.UrlEncode(lang=="zh"? "您的初始化链接已过期": "Error!The initialization link has expired. Return")} ";
|
||||
}
|
||||
|
||||
return Redirect(decodeUrl);
|
||||
|
||||
@@ -86,6 +86,8 @@
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.10" />
|
||||
<PackageReference Include="Quartz.Extensions.DependencyInjection" Version="3.6.2" />
|
||||
<PackageReference Include="Quartz.Extensions.Hosting" Version="3.6.2" />
|
||||
<PackageReference Include="Serilog.AspNetCore" Version="6.0.1" />
|
||||
<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="1.2.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Email" Version="2.4.0" />
|
||||
@@ -115,12 +117,6 @@
|
||||
<Content Update="wwwroot\EmailTemplate\AdminResetUser.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\EmailConfigTest_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\EmailConfigTest.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\SubjectEnrollConfirmOrPDProgress_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
|
||||
+15
-45
@@ -11,6 +11,8 @@ using MassTransit;
|
||||
using MassTransit.NewIdProviders;
|
||||
using System.IO;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infra.EFCore;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
@@ -64,13 +66,11 @@ namespace IRaCIS.Core.API
|
||||
//缓存项目的状态 匿名化数据
|
||||
await InitCache(host);
|
||||
|
||||
WatchJsonFile(Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, StaticData.En_US_Json) );
|
||||
|
||||
WatchJsonFile(Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, StaticData.Zh_CN_Json));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
host.Run();
|
||||
|
||||
|
||||
@@ -100,58 +100,28 @@ namespace IRaCIS.Core.API
|
||||
webBuilder.UseStartup<Startup>();
|
||||
}).UseSerilog()
|
||||
.UseServiceProviderFactory(new AutofacServiceProviderFactory());
|
||||
|
||||
|
||||
|
||||
private static async Task InitCache(IHost host)
|
||||
{
|
||||
var _repository = host.Services.GetService(typeof(IRepository)) as IRepository;
|
||||
|
||||
//初始化 国际化数据,并且监测国际化文件变更
|
||||
await InternationalizationHelper.InitInternationlizationDataAndWatchJsonFileAsync(_repository);
|
||||
|
||||
var _mediator = host.Services.GetService(typeof(IMediator)) as IMediator;
|
||||
|
||||
await _mediator.Send(new AnonymizeCacheRequest());
|
||||
|
||||
await _mediator.Send(new TrialStateCacheRequest());
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static void LoadJsonFile(string filePath)
|
||||
{
|
||||
|
||||
IConfigurationBuilder builder = new ConfigurationBuilder()
|
||||
.AddJsonFile(filePath);
|
||||
|
||||
IConfigurationRoot enConfiguration = builder.Build();
|
||||
|
||||
|
||||
|
||||
foreach (IConfigurationSection section in enConfiguration.GetChildren())
|
||||
{
|
||||
if (filePath.Contains(StaticData.En_US_Json) )
|
||||
{
|
||||
StaticData.En_US_Dic[section.Key] = section.Value;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
StaticData.Zh_CN_Dic[section.Key] = section.Value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
public static void WatchJsonFile(string filePath)
|
||||
{
|
||||
LoadJsonFile(filePath);
|
||||
|
||||
|
||||
FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(filePath), Path.GetFileName(filePath));
|
||||
watcher.Changed += (sender, e) => LoadJsonFile(filePath);
|
||||
watcher.EnableRaisingEvents = true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@ namespace IRaCIS.Core.API
|
||||
//services.AddDistributedMemoryCache();
|
||||
|
||||
// hangfire 定时任务框架 有界面,更友好~
|
||||
services.AddhangfireSetup(_configuration);
|
||||
//services.AddhangfireSetup(_configuration);
|
||||
// QuartZ 定时任务框架 使用了hangfire 暂时不用,后续需要可以打开,已经配好
|
||||
services.AddQuartZSetup(_configuration);
|
||||
|
||||
@@ -181,7 +181,7 @@ namespace IRaCIS.Core.API
|
||||
app.UseLogDashboard("/LogDashboard");
|
||||
|
||||
//hangfire
|
||||
app.UseHangfireConfig(env);
|
||||
//app.UseHangfireConfig(env);
|
||||
|
||||
////暂时废弃
|
||||
//app.UseHttpReports();
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
|
||||
using IRaCIS.Application.Services.BackGroundJob;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Quartz;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
@@ -8,37 +10,35 @@ namespace IRaCIS.Core.API
|
||||
{
|
||||
public static void AddQuartZSetup(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
//services.AddTransient<CacheTrialStatusQuartZJob>();
|
||||
services.AddTransient<CacheTrialStatusQuartZJob>();
|
||||
|
||||
//services.AddQuartz(q =>
|
||||
//{
|
||||
// // base quartz scheduler, job and trigger configuration
|
||||
services.AddQuartz(q =>
|
||||
{
|
||||
// base quartz scheduler, job and trigger configuration
|
||||
|
||||
// // as of 3.3.2 this also injects scoped services (like EF DbContext) without problems
|
||||
// q.UseMicrosoftDependencyInjectionJobFactory();
|
||||
// as of 3.3.2 this also injects scoped services (like EF DbContext) without problems
|
||||
q.UseMicrosoftDependencyInjectionJobFactory();
|
||||
|
||||
// // 基本Quartz调度器、作业和触发器配置
|
||||
// var jobKey = new JobKey("RegularTrialWork", "regularWorkGroup");
|
||||
// q.AddJob<CacheTrialStatusQuartZJob>(jobKey, j => j
|
||||
// .WithDescription("Trial regular work")
|
||||
// );
|
||||
// q.AddTrigger(t => t
|
||||
// .WithIdentity("TrialStatusTrigger")
|
||||
// .ForJob(jobKey)
|
||||
// //.StartNow()
|
||||
// //.WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(15))//开始秒数 15s
|
||||
// // .RepeatForever())//持续工作
|
||||
// .WithCronSchedule("0 0 0/2 * * ?")//每小时执行一次
|
||||
// .WithDescription("My regular trial work trigger")
|
||||
// );
|
||||
//});
|
||||
// 基本Quartz调度器、作业和触发器配置
|
||||
var jobKey = new JobKey("RegularTrialWork", "regularWorkGroup");
|
||||
q.AddJob<CacheTrialStatusQuartZJob>(jobKey, j => j
|
||||
.WithDescription("Trial regular work")
|
||||
);
|
||||
q.AddTrigger(t => t
|
||||
.WithIdentity("TrialStatusTrigger")
|
||||
.ForJob(jobKey)
|
||||
|
||||
.WithCronSchedule("0 0 * * * ?")
|
||||
.WithDescription("My regular trial work trigger")
|
||||
);
|
||||
});
|
||||
|
||||
//// ASP.NET Core hosting
|
||||
//services.AddQuartzServer(options =>
|
||||
//{
|
||||
// // when shutting down we want jobs to complete gracefully
|
||||
// options.WaitForJobsToComplete = true;
|
||||
//});
|
||||
// ASP.NET Core hosting
|
||||
services.AddQuartzHostedService(options =>
|
||||
{
|
||||
// when shutting down we want jobs to complete gracefully
|
||||
options.WaitForJobsToComplete = true;
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -32,7 +32,7 @@
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,35 +4,35 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear {0} ,
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Extimaging has added an account for you. The account information is as follows:
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
Extensive Imaging has generated a user account for you. <br>The account information is as follows:
|
||||
</div>
|
||||
<span style="color: #00D1B2"></span>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'>
|
||||
<div>
|
||||
User name: {1}
|
||||
User ID: {1}
|
||||
</div>
|
||||
<div>
|
||||
Role: {2}
|
||||
</div>
|
||||
<div>
|
||||
Before logging in for the first time, please modify your account information by this link:
|
||||
<a href='{3}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||
Initialize the account information
|
||||
Before logging in for the first time, please initialize your account information through this link:
|
||||
<a href='{3}' style='margin-left:30px;font-size:12px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;font-size: 16px'>
|
||||
Initialize Account Information
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,19 +4,19 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear {0} ,
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Extimaging has reset your account password, and the account information is as follows:
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
Extensive Imaging has reset your password.<br>The account information is as follows:
|
||||
</div>
|
||||
<span style="color: #00D1B2"></span>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 12px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'>
|
||||
<div>
|
||||
User name: {1}
|
||||
User ID: {1}
|
||||
</div>
|
||||
<div>
|
||||
Role: {2}
|
||||
@@ -27,9 +27,9 @@
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
您好:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
感谢您使用展影云平台。
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
{0}。
|
||||
</div>
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,27 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Thank you for using Extensive Imaging Cloud System.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
{0}。
|
||||
</div>
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,22 +4,22 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;font-size: 16px'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear:
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear Sir or Madam:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Thank you for using Extensive Imaging Cloud System.
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
Thank you for using our IRC imaging system.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
{0}。
|
||||
</div>
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
尊敬的 {0} ,您好:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作。
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
As the IRC service provider of {1} trial(Protocol ID is {2}), Extensive Imaging invites you to participate in the independent assessment work of this trial.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
This project adopts electronic workflow. The system and your account information are as follows:
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
Digital workflow is implemented for this trial, and your account information is as follows:
|
||||
</div>
|
||||
<span style="color: #00D1B2"></span>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'>
|
||||
<div>
|
||||
Trial ID: {3}
|
||||
</div>
|
||||
@@ -25,23 +25,22 @@
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {1}
|
||||
Study Name: {1}
|
||||
</div>
|
||||
<div>
|
||||
User name: {4}
|
||||
User Name: {4}
|
||||
</div>
|
||||
<div>
|
||||
Role: {5}
|
||||
</div>
|
||||
<div>
|
||||
System login address:{6}
|
||||
Login URL: {6}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,20 +4,21 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
As the IRC service provider of {1}trial (Protocol ID is {2}), Extensive Imaging invites you to participate in the independent assessment work of this trial.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
This project adopts electronic workflow. The system and your account information are as follows:
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
Digital workflow is implemented for this trial, and your account information is as follows:
|
||||
</div>
|
||||
<span style="color: #00D1B2"></span>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'>
|
||||
<div>
|
||||
Trial ID: {3}
|
||||
</div>
|
||||
@@ -25,26 +26,26 @@
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {1}
|
||||
Study Name: {1}
|
||||
</div>
|
||||
<div>
|
||||
User name: {4}
|
||||
User ID: {4}
|
||||
</div>
|
||||
<div>
|
||||
Role: {5}
|
||||
</div>
|
||||
<div>
|
||||
Before logging in for the first time, please modify your account information by this link:
|
||||
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||
Initialize the account information
|
||||
Before logging in for the first time, please modify your account information through this link:
|
||||
<a href='{6}' style='margin-left:30px;font-size:16px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||
Initialize Account Information
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;font-size: 16px'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,17 +4,17 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;font-size: 16px'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'>
|
||||
<div style='padding-top: 20px;font-size: 16px'>
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear {0} ,
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, the center survey form you filled in has been rejected. The details are as follows:
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
The site survey questionnaire you filled in has been rejected. Details are as follows:
|
||||
</div>
|
||||
<span style="color: #00D1B2"></span>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'>
|
||||
<div>
|
||||
Trial ID: {1}
|
||||
</div>
|
||||
@@ -22,26 +22,26 @@
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {3}
|
||||
Study Name: {3}
|
||||
</div>
|
||||
<div>
|
||||
Site ID: {4}
|
||||
</div>
|
||||
<div>
|
||||
Site name: {5}
|
||||
Site Name: {5}
|
||||
</div>
|
||||
<div>
|
||||
Reason for rejection: {6}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<a href='{7}' style='margin-left:60px;font-size:14px;padding: 10px;text-decoration: none;display:{8} ;height: 40px;width: 140px;background: #00D1B2;color:#fff;border-radius: 5px;line-height: 40px;text-align: center;margin-bottom: 100px;'>
|
||||
Login and view
|
||||
<a href='{7}' style='margin-left:60px;font-size:16px;padding: 10px;text-decoration: none;display:{8} ;height: 40px;width: 140px;background: #00D1B2;color:#fff;border-radius: 5px;line-height: 40px;text-align: center;margin-bottom: 100px;font-size: 16px'>
|
||||
Login & View
|
||||
</a>
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;font-size: 16px'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'>
|
||||
<div style='padding-top: 20px;font-size: 16px'>
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
As the IRC service provider of {1} trial (Protocol ID is {2}), Extensive Imaging invites you to participate in IRC-related work of this trial.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
This project adopts electronic workflow. The system and your account information are as follows:
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
Digital workflow is implemented for this trial, and your account information is as follows:
|
||||
</div>
|
||||
<span style="color: #00D1B2"></span>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'>
|
||||
<div>
|
||||
Trial ID: {3}
|
||||
</div>
|
||||
@@ -25,23 +25,23 @@
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {1}
|
||||
Study Name: {1}
|
||||
</div>
|
||||
<div>
|
||||
User name: {4}
|
||||
User Name: {4}
|
||||
</div>
|
||||
<div>
|
||||
Role: {5}
|
||||
</div>
|
||||
<div>
|
||||
System login address:{6}
|
||||
Login URL: {6}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
尊敬的 {0} ,您好:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作。
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;font-size: 16px'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
As the IRC service provider of {1} trial (Protocol ID is {2}), Extensive Imaging invites you to participate in IRC-related work of this trial.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
This project adopts electronic workflow. The system and your account information are as follows:
|
||||
Digital workflow is implemented for this trial, and your account information is as follows:
|
||||
</div>
|
||||
<span style="color: #00D1B2"></span>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'>
|
||||
<div>
|
||||
Trial ID: {3}
|
||||
</div>
|
||||
@@ -25,26 +25,26 @@
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {1}
|
||||
Study Name: {1}
|
||||
</div>
|
||||
<div>
|
||||
User name: {4}
|
||||
User Name: {4}
|
||||
</div>
|
||||
<div>
|
||||
Role: {5}
|
||||
</div>
|
||||
<div>
|
||||
Before logging in for the first time, please modify your account information by this link:
|
||||
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||
Initialize the account information
|
||||
Before logging in for the first time, please modify your account information through this link:
|
||||
<a href='{6}' style='margin-left:30px;font-size:16px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||
Initialize Account Information
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,18 +8,18 @@
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0},
|
||||
亲爱的用户 ,
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
感谢您使用展影云平台。
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
{1},验证码是: {2},请在3分钟内输入该验证码,进行后续操作。如非本人操作,请忽略该邮件。
|
||||
{0},验证码是: {1},请在3分钟内输入该验证码,进行后续操作。如非本人操作,请忽略该邮件。
|
||||
</div>
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>祝您顺利!/Best Regards</div>
|
||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
||||
<div style="font-size: 14px;">展影医疗</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,23 +4,25 @@
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<body style='font-family: Times New Roman;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0},
|
||||
<div style='line-height: 40px;font-size: 16px'>
|
||||
Dear Sir or Madam:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Thank you for using Extensive Imaging Cloud System.
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
Thank you for using our IRC imaging system.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
{1}, the verification code is {2}. Enter the verification code within 3 minutes for subsequent operations. Please ignore this email if not by yourself.
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
{0}, the verification code is {1}. Please enter this code within 3 minutes for follow-up operations.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||
If you are not the intended person, please ignore this email.
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;font-size: 16px'>
|
||||
<div>Best regards,</div>
|
||||
<div style="font-size: 16px;">Extensive Imaging</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -7,6 +7,7 @@ using IRaCIS.Core.Infra.EFCore;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Quartz;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
|
||||
namespace IRaCIS.Application.Services.BackGroundJob
|
||||
{
|
||||
@@ -17,36 +18,55 @@ namespace IRaCIS.Application.Services.BackGroundJob
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
private readonly IEasyCachingProvider _provider;
|
||||
private readonly ILogger<CacheTrialStatusQuartZJob> _logger;
|
||||
private readonly IRepository<SystemAnonymization> _systemAnonymizationRepository;
|
||||
|
||||
public CacheTrialStatusQuartZJob(IRepository<Trial> trialRepository, IEasyCachingProvider provider,ILogger<CacheTrialStatusQuartZJob> logger)
|
||||
public CacheTrialStatusQuartZJob(IRepository<Trial> trialRepository, IEasyCachingProvider provider,ILogger<CacheTrialStatusQuartZJob> logger, IRepository<SystemAnonymization> systemAnonymizationRepository)
|
||||
{
|
||||
_trialRepository = trialRepository;
|
||||
_provider = provider;
|
||||
_logger = logger;
|
||||
_systemAnonymizationRepository = systemAnonymizationRepository;
|
||||
}
|
||||
|
||||
public Task Execute(IJobExecutionContext context)
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
|
||||
{
|
||||
_logger.LogInformation($"开始执行QuartZ定时任务作业");
|
||||
try
|
||||
{
|
||||
var list = _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr })
|
||||
.ToList();
|
||||
await MemoryCacheTrialStatus();
|
||||
|
||||
await MemoryCacheAnonymizeData();
|
||||
|
||||
list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(1)));
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError($" 查询和缓存过程出现异常"+e.Message);
|
||||
}
|
||||
_logger.LogInformation("QuartZ定时任务作业结束");
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task MemoryCacheTrialStatus()
|
||||
{
|
||||
var list = await _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr })
|
||||
.ToListAsync();
|
||||
|
||||
list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(7)));
|
||||
|
||||
}
|
||||
|
||||
public async Task MemoryCacheAnonymizeData()
|
||||
{
|
||||
var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync();
|
||||
|
||||
_provider.Set(StaticData.Anonymize.Anonymize_AddFixedFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed).ToList(), TimeSpan.FromDays(7));
|
||||
_provider.Set(StaticData.Anonymize.Anonymize_AddIRCInfoFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed == false).ToList(), TimeSpan.FromDays(7));
|
||||
_provider.Set(StaticData.Anonymize.Anonymize_FixedField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed).ToList(), TimeSpan.FromDays(7));
|
||||
_provider.Set(StaticData.Anonymize.Anonymize_IRCInfoField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed == false).ToList(), TimeSpan.FromDays(7));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,11 @@
|
||||
using EasyCaching.Core;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
@@ -11,9 +14,9 @@ namespace IRaCIS.Core.Application.Filter;
|
||||
|
||||
|
||||
|
||||
public class LimitUserRequestAuthorization :BaseService, IAsyncAuthorizationFilter
|
||||
public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
|
||||
{
|
||||
|
||||
public IStringLocalizer _localizer { get; set; }
|
||||
|
||||
private readonly IEasyCachingProvider _provider;
|
||||
|
||||
@@ -21,11 +24,12 @@ public class LimitUserRequestAuthorization :BaseService, IAsyncAuthorizationFilt
|
||||
|
||||
private readonly IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig;
|
||||
|
||||
public LimitUserRequestAuthorization(IEasyCachingProvider provider, IUserInfo userInfo, IOptionsMonitor<ServiceVerifyConfigOption> verifyConfig)
|
||||
public LimitUserRequestAuthorization(IEasyCachingProvider provider, IUserInfo userInfo, IStringLocalizer localizer ,IOptionsMonitor<ServiceVerifyConfigOption> verifyConfig)
|
||||
{
|
||||
_provider = provider;
|
||||
_userInfo = userInfo;
|
||||
_verifyConfig = verifyConfig;
|
||||
_localizer = localizer;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +53,9 @@ public class LimitUserRequestAuthorization :BaseService, IAsyncAuthorizationFilt
|
||||
context.HttpContext.Response.ContentType = "application/json";
|
||||
context.HttpContext.Response.StatusCode = StatusCodes.Status200OK;
|
||||
//---当前请求未从Header/Url取到用户Token,请联系开发者
|
||||
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["LimitUser_AuthTokenMissing"])));
|
||||
//await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["LimitUser_AuthTokenMissing"])));
|
||||
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["LimitUser_AuthTokenMissing"]));
|
||||
}
|
||||
|
||||
//2、在这里取缓存 进行比较 看是否有其他人进行了登陆,如果其他人登陆了,就把之前用户挤掉
|
||||
@@ -75,8 +81,13 @@ public class LimitUserRequestAuthorization :BaseService, IAsyncAuthorizationFilt
|
||||
|
||||
context.HttpContext.Response.ContentType = "application/json";
|
||||
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
|
||||
//---您的账户在其他地方已登陆,您被迫下线。
|
||||
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["LimitUser_AccountLoggedInElsewhere"], ApiResponseCodeEnum.LoginInOtherPlace)));
|
||||
//---您的账户在其他地方已登陆,您被迫下线。
|
||||
|
||||
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["LimitUser_AccountLoggedInElsewhere"], ApiResponseCodeEnum.LoginInOtherPlace));
|
||||
|
||||
|
||||
//await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["LimitUser_AccountLoggedInElsewhere"], ApiResponseCodeEnum.LoginInOtherPlace)));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static BeetleX.Redis.Commands.HSCAN;
|
||||
using static IRaCIS.Core.Application.Service.Common.SystemMonitor;
|
||||
|
||||
namespace IRaCIS.Core.Application.Helper
|
||||
{
|
||||
public static class InternationalizationHelper
|
||||
{
|
||||
public static string JsonFileFolder = Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources);
|
||||
|
||||
private static void VerifyFolder()
|
||||
{
|
||||
if (!Directory.Exists(JsonFileFolder) ||
|
||||
Directory.GetFiles(JsonFileFolder).Any(filePath => Path.GetExtension(filePath).Equals(".json", StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
throw new BusinessValidationFailedException("国际化Json文件目录有误");
|
||||
}
|
||||
}
|
||||
|
||||
public static async Task BatchAddJsonKeyValueAsync(List<BatchAddInternationalizationDto> batchAddDtos)
|
||||
{
|
||||
VerifyFolder();
|
||||
|
||||
var usJsonPath = Path.Combine(JsonFileFolder, StaticData.En_US_Json);
|
||||
var cnJsonPath = Path.Combine(JsonFileFolder, StaticData.Zh_CN_Json);
|
||||
|
||||
|
||||
//更新json 文件 同时更新内存缓存的数据
|
||||
foreach (var filePath in new string[] { usJsonPath, cnJsonPath })
|
||||
{
|
||||
var json = await File.ReadAllTextAsync(filePath);
|
||||
|
||||
JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load });
|
||||
|
||||
// 添加或更新指定的键值对
|
||||
|
||||
if (filePath.Contains(StaticData.En_US_Json))
|
||||
{
|
||||
foreach (var item in batchAddDtos)
|
||||
{
|
||||
jsonObject[item.Code] = item.Value;
|
||||
|
||||
StaticData.En_US_Dic[item.Code] = item.Value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var item in batchAddDtos)
|
||||
{
|
||||
jsonObject[item.Code] = item.Value;
|
||||
|
||||
StaticData.Zh_CN_Dic[item.Code] = item.Value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
await File.WriteAllTextAsync(filePath, jsonObject.ToString());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static async Task AddOrUpdateJsonKeyValueAsync(string key, string value, string valueCN)
|
||||
{
|
||||
|
||||
VerifyFolder();
|
||||
|
||||
var usJsonPath = Path.Combine(JsonFileFolder, StaticData.En_US_Json);
|
||||
var cnJsonPath = Path.Combine(JsonFileFolder, StaticData.Zh_CN_Json);
|
||||
|
||||
|
||||
//更新json 文件 同时更新内存缓存的数据
|
||||
foreach (var filePath in new string[] { usJsonPath, cnJsonPath })
|
||||
{
|
||||
var json = await File.ReadAllTextAsync(filePath);
|
||||
|
||||
JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load });
|
||||
|
||||
// 添加或更新指定的键值对
|
||||
|
||||
if (filePath.Contains(StaticData.En_US_Json))
|
||||
{
|
||||
jsonObject[key] = value;
|
||||
|
||||
StaticData.En_US_Dic[key] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
jsonObject[key] = valueCN;
|
||||
|
||||
StaticData.Zh_CN_Dic[key] = valueCN;
|
||||
}
|
||||
|
||||
|
||||
await File.WriteAllTextAsync(filePath, jsonObject.ToString());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static async Task InitInternationlizationDataAndWatchJsonFileAsync(IRepository _repository)
|
||||
{
|
||||
//查询数据库的数据
|
||||
var toJsonList = await _repository.Where<Internationalization>(t => t.InternationalizationType == 1).Select(t => new
|
||||
{
|
||||
t.Code,
|
||||
t.Value,
|
||||
t.ValueCN
|
||||
}).ToListAsync();
|
||||
|
||||
//组织成json 文件
|
||||
|
||||
var usJsonPath = Path.Combine(JsonFileFolder, StaticData.En_US_Json);
|
||||
var cnJsonPath = Path.Combine(JsonFileFolder, StaticData.Zh_CN_Json);
|
||||
|
||||
|
||||
//本地静态文件国际化需要
|
||||
foreach (var tojsonItem in toJsonList)
|
||||
{
|
||||
StaticData.En_US_Dic[tojsonItem.Code] = tojsonItem.Value;
|
||||
StaticData.Zh_CN_Dic[tojsonItem.Code] = tojsonItem.ValueCN;
|
||||
}
|
||||
|
||||
File.WriteAllText(usJsonPath, JsonConvert.SerializeObject(StaticData.En_US_Dic));
|
||||
File.WriteAllText(cnJsonPath, JsonConvert.SerializeObject(StaticData.Zh_CN_Dic));
|
||||
|
||||
|
||||
//监测Json文件变更 实时刷新数据
|
||||
|
||||
WatchJsonFile(usJsonPath);
|
||||
WatchJsonFile(cnJsonPath);
|
||||
|
||||
}
|
||||
|
||||
public static void WatchJsonFile(string filePath)
|
||||
{
|
||||
if (!File.Exists(filePath))
|
||||
{
|
||||
throw new BusinessValidationFailedException("国际化Json文件不存在");
|
||||
}
|
||||
|
||||
FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(filePath), Path.GetFileName(filePath));
|
||||
watcher.Changed += (sender, e) => LoadJsonFile(filePath);
|
||||
watcher.EnableRaisingEvents = true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static void LoadJsonFile(string filePath)
|
||||
{
|
||||
|
||||
IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile(filePath);
|
||||
|
||||
IConfigurationRoot enConfiguration = builder.Build();
|
||||
|
||||
foreach (IConfigurationSection section in enConfiguration.GetChildren())
|
||||
{
|
||||
if (filePath.Contains(StaticData.En_US_Json))
|
||||
{
|
||||
StaticData.En_US_Dic[section.Key] = section.Value;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
StaticData.Zh_CN_Dic[section.Key] = section.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -680,6 +680,11 @@
|
||||
InternationalizationService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.PublishLogService">
|
||||
<summary>
|
||||
PublishLogService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.TrialEmailNoticeConfigService">
|
||||
<summary>
|
||||
TrialEmailNoticeConfigService
|
||||
@@ -2484,6 +2489,207 @@
|
||||
<param name="command"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.ClinicalAnswerService">
|
||||
<summary>
|
||||
临床答案
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalAnswerService.AutoAddCRCClinical(IRaCIS.Core.Application.Service.Reading.Dto.AutoAddClinicalInDto)">
|
||||
<summary>
|
||||
自动添加CRC临床数据
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalAnswerService.GetCRCSubjectClinicalList(IRaCIS.Core.Application.Service.Reading.Dto.GetCRCSubjectClinicalInDto)">
|
||||
<summary>
|
||||
获取CRC受试者临床数据
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalAnswerService.GetClinicalQuestionFormList(IRaCIS.Core.Application.Service.Reading.Dto.GetClinicalQuestionAnswerListInDto)">
|
||||
<summary>
|
||||
获取表单列表
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalAnswerService.GetClinicalFormInfo(IRaCIS.Core.Application.Service.Reading.Dto.GetClinicalFormInfoInDto)">
|
||||
<summary>
|
||||
获取临床数据表单问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalAnswerService.SubmitClinicalForm(IRaCIS.Core.Application.Service.Reading.Dto.SubmitClinicalFormInDto)">
|
||||
<summary>
|
||||
提交临床数据表单
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.ClinicalQuestionService">
|
||||
<summary>
|
||||
临床数据问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetSystemClinicalQuestionPreview(IRaCIS.Core.Application.Service.Reading.Dto.GetSystemClinicalQuestionPreviewDto)">
|
||||
<summary>
|
||||
获取系统临床数据预览
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetTrialClinicalQuestionPreview(IRaCIS.Core.Application.Service.Reading.Dto.GetTrialClinicalQuestionPreviewDto)">
|
||||
<summary>
|
||||
获取项目临床数据预览
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.FindChildQuestion(IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionPreviewDto,System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionPreviewDto},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTablePreviewDto},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.ClinicalFormQuestionAnswer},System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.ClinicalFormTableQuestionAnswer})">
|
||||
<summary>
|
||||
获取子元素
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<param name="questions"></param>
|
||||
<param name="tableQuestions"></param>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetTrialClinicalQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalQuestionQuery)">
|
||||
<summary>
|
||||
获取项目临床问题
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.AddOrUpdateTrialClinicalQuestion(IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalQuestionDto)">
|
||||
<summary>
|
||||
新增或者修改项目临床问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.DeleteTrialClinicalQuestion(System.Guid)">
|
||||
<summary>
|
||||
删除项目临床数据问题
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetTrialClinicalGroupQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.GetTrialGroupDto)">
|
||||
<summary>
|
||||
获取项目问题分组
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetTrialClinicalOtherQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.GetTrialGroupDto)">
|
||||
<summary>
|
||||
获取项目标准其他问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetSystemClinicalQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalQuestionQuery)">
|
||||
<summary>
|
||||
获取系统临床问题
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.AddOrUpdateSystemClinicalQuestion(IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalQuestionDto)">
|
||||
<summary>
|
||||
新增或者修改系统临床问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.DeleteSystemClinicalQuestion(System.Guid)">
|
||||
<summary>
|
||||
删除系统临床数据问题
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetSystemClinicalGroupQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.GetSystemGroupDto)">
|
||||
<summary>
|
||||
获取系统问题分组
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetSystemClinicalOtherQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.GetSystemGroupDto)">
|
||||
<summary>
|
||||
获取系统其他问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetSystemClinicalTableQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalTableQuestionQuery)">
|
||||
<summary>
|
||||
获取系统表格问题
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.AddOrUpdateSystemClinicalTableQuestion(IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalTableQuestionDto)">
|
||||
<summary>
|
||||
新增或修改系统表格问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.DeleteSystemClinicalTableQuestion(System.Guid)">
|
||||
<summary>
|
||||
删除系统表格问题
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.GetTrialClinicalTableQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalTableQuestionQuery)">
|
||||
<summary>
|
||||
获取项目表格问题
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.AddOrUpdateTrialClinicalTableQuestion(IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalTableQuestionDto)">
|
||||
<summary>
|
||||
新增或修改项目表格问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.DeleteTrialClinicalTableQuestion(System.Guid)">
|
||||
<summary>
|
||||
删除项目表格问题
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ClinicalQuestionService.SynchronizationQuestion(System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.SynchronizationQuestionDto})">
|
||||
<summary>
|
||||
同步系统问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SubmitClinicalFormInDto.VisitId">
|
||||
<summary>
|
||||
VisitId
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SubmitClinicalFormInDto.ReadingId">
|
||||
<summary>
|
||||
VisitId
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalDataTrialSetAddOrEdit.IsApply">
|
||||
<summary>
|
||||
是否应用
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalDataTrialSetAddOrEdit.ClinicalDataSetName">
|
||||
<summary>
|
||||
名称
|
||||
@@ -2534,6 +2740,11 @@
|
||||
文件路径
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalDataSystemSetAddOrEdit.IsApply">
|
||||
<summary>
|
||||
是否应用
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalDataSystemSetAddOrEdit.ClinicalDataSetEnum">
|
||||
<summary>
|
||||
枚举
|
||||
@@ -2694,6 +2905,356 @@
|
||||
是否启用
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetSystemClinicalQuestionPreviewDto.SystemClinicalId">
|
||||
<summary>
|
||||
系统临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetTrialClinicalQuestionPreviewDto.TrialClinicalId">
|
||||
<summary>
|
||||
项目临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionPreviewDto">
|
||||
<summary>
|
||||
项目预览问题Dto
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionPreviewDto.SystemClinicalId">
|
||||
<summary>
|
||||
系统临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionPreviewDto.Childrens">
|
||||
<summary>
|
||||
子问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionPreviewDto.TableQuestions">
|
||||
<summary>
|
||||
表格问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTablePreviewDto">
|
||||
<summary>
|
||||
项目临床数据问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTablePreviewDto.SystemClinicalId">
|
||||
<summary>
|
||||
系统临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase">
|
||||
<summary>
|
||||
临床问题基本信息
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.Id">
|
||||
<summary>
|
||||
Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.QuestionName">
|
||||
<summary>
|
||||
问题名称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.QuestionEnName">
|
||||
<summary>
|
||||
问题英文名称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.ClinicalQuestionType">
|
||||
<summary>
|
||||
临床问题类型(分组,单选。)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.ClinicalQuestionMarkEnum">
|
||||
<summary>
|
||||
问题标识
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.MaxAnswerLength">
|
||||
<summary>
|
||||
最大长度
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.ClinicalOptionTypeEnum">
|
||||
<summary>
|
||||
临床数据选项类型(无,自定义)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.GroupId">
|
||||
<summary>
|
||||
分组Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.TypeValue">
|
||||
<summary>
|
||||
自定义选项
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.DictionaryCode">
|
||||
<summary>
|
||||
字典Code
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.ShowOrder">
|
||||
<summary>
|
||||
排序
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.IsRequired">
|
||||
<summary>
|
||||
是否必填
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.ParentId">
|
||||
<summary>
|
||||
父问题Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.ParentTriggerValue">
|
||||
<summary>
|
||||
父问题触发值
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.ClinicalQuestionShowEnum">
|
||||
<summary>
|
||||
显示类型
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.IsCheckDate">
|
||||
<summary>
|
||||
是否是检查日期
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.DigitPlaces">
|
||||
<summary>
|
||||
小数点位数
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionBase.Unit">
|
||||
<summary>
|
||||
单位
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionQueryBase">
|
||||
<summary>
|
||||
查询临床数据基类
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalQuestionQueryBase.QuestionName">
|
||||
<summary>
|
||||
问题名称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalQuestionQuery">
|
||||
<summary>
|
||||
获取项目临床数据
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.GetTrialGroupDto">
|
||||
<summary>
|
||||
获取项目分组
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalQuestionDto">
|
||||
<summary>
|
||||
项目临床数据问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalQuestionDto.TrialClinicalId">
|
||||
<summary>
|
||||
项目临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalQuestionDto.ClinicalCalculateMarkEnum">
|
||||
<summary>
|
||||
自定义计算标记
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalQuestionDto.CalculateQuestions">
|
||||
<summary>
|
||||
自定义计算问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalQuestionQuery">
|
||||
<summary>
|
||||
获取系统临床数据
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalQuestionDto">
|
||||
<summary>
|
||||
系统临床数据问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalQuestionDto.SystemClinicalId">
|
||||
<summary>
|
||||
系统临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.GetSystemGroupDto">
|
||||
<summary>
|
||||
获取系统分组
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.QuestionName">
|
||||
<summary>
|
||||
问题名称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.QuestionEnName">
|
||||
<summary>
|
||||
问题英文名称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.ClinicalTableQuestionType">
|
||||
<summary>
|
||||
临床问题类型(分组,单选。)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.ClinicalTableQuestionMarkEnum">
|
||||
<summary>
|
||||
问题标识
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.MaxAnswerLength">
|
||||
<summary>
|
||||
最大长度
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.ClinicalOptionTypeEnum">
|
||||
<summary>
|
||||
临床数据选项类型(无,自定义)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.TypeValue">
|
||||
<summary>
|
||||
自定义选项
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.DictionaryCode">
|
||||
<summary>
|
||||
字典Code
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.ShowOrder">
|
||||
<summary>
|
||||
排序
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.IsRequired">
|
||||
<summary>
|
||||
是否必填
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.CreateTime">
|
||||
<summary>
|
||||
创建时间
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.CreateUserId">
|
||||
<summary>
|
||||
创建人
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.QuestionId">
|
||||
<summary>
|
||||
外层问题Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.DigitPlaces">
|
||||
<summary>
|
||||
小数点位数
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionBase.Unit">
|
||||
<summary>
|
||||
单位
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalTableQuestionDto">
|
||||
<summary>
|
||||
项目临床数据问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalTableQuestionDto.TrialClinicalId">
|
||||
<summary>
|
||||
项目临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalTableQuestionDto.ClinicalCalculateMarkEnum">
|
||||
<summary>
|
||||
自定义计算标记
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalTableQuestionDto.CalculateQuestions">
|
||||
<summary>
|
||||
自定义计算问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalTableQuestionDto">
|
||||
<summary>
|
||||
系统临床数据问题
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalTableQuestionDto.SystemClinicalId">
|
||||
<summary>
|
||||
系统临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionQueryBase">
|
||||
<summary>
|
||||
查询临床数据基类
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionQueryBase.QuestionName">
|
||||
<summary>
|
||||
问题名称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ClinicalTableQuestionQueryBase.QuestionId">
|
||||
<summary>
|
||||
外层问题Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalTableQuestionQuery">
|
||||
<summary>
|
||||
获取项目临床数据
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.Reading.Dto.SystemClinicalTableQuestionQuery">
|
||||
<summary>
|
||||
获取系统临床数据
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalTableQuestionSynchronize.SystemClinicalId">
|
||||
<summary>
|
||||
系统临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.TrialClinicalQuestionSynchronize.SystemClinicalId">
|
||||
<summary>
|
||||
系统临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SynchronizationQuestionDto.SystemClinicalId">
|
||||
<summary>
|
||||
系统临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SynchronizationQuestionDto.TrialClinicalId">
|
||||
<summary>
|
||||
项目临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.QuestionDic.TrialClinicalId">
|
||||
<summary>
|
||||
项目临床数据Id
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReadModuleDto.TrialSiteCode">
|
||||
<summary>
|
||||
项目中心Code
|
||||
@@ -6706,6 +7267,13 @@
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingMedicineQuestionService.BatchDeteteCriterionMedicineQuestion(IRaCIS.Core.Application.ViewModel.BatchDeteteCriterionMedicineQuestionInDto)">
|
||||
<summary>
|
||||
批量删除项目标准医学审核问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.ReadingMedicineQuestionService.AddTrialDataFromSystem(IRaCIS.Core.Application.ViewModel.AddTrialDataFromSystemInDto)">
|
||||
<summary>
|
||||
从系统里面选择问题添加到项目里面
|
||||
@@ -7429,6 +7997,15 @@
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.InternationalizationAddOrEdit">
|
||||
<summary> InternationalizationAddOrEdit 列表查询参数模型</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.PublishLogView">
|
||||
<summary> PublishLogView 列表视图模型 </summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.PublishLogQuery">
|
||||
<summary>PublishLogQuery 列表查询参数模型</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.PublishLogAddOrEdit">
|
||||
<summary> PublishLogAddOrEdit 列表查询参数模型</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.ViewModel.TrialEmailNoticeConfigView">
|
||||
<summary> TrialEmailNoticeConfigView 列表视图模型 </summary>
|
||||
</member>
|
||||
@@ -8294,6 +8871,11 @@
|
||||
IInternationalizationService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Interfaces.IPublishLogService">
|
||||
<summary>
|
||||
IPublishLogService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Interfaces.ITrialEmailNoticeConfigService">
|
||||
<summary>
|
||||
ITrialEmailNoticeConfigService
|
||||
@@ -8314,6 +8896,11 @@
|
||||
ISubjectCriteriaEvaluationService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Interfaces.IClinicalQuestionService">
|
||||
<summary>
|
||||
IClinicalQuestionService
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Interfaces.IOrganInfoService">
|
||||
<summary>
|
||||
IOrganInfoService
|
||||
@@ -9027,6 +9614,11 @@
|
||||
是否有阅片期
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Contracts.GetTrialReadingInfoOutDto.IsUrgent">
|
||||
<summary>
|
||||
是否加急
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Contracts.GetTrialReadingInfoOutDto.ImagePlatform">
|
||||
<summary>
|
||||
阅片平台
|
||||
@@ -9347,6 +9939,11 @@
|
||||
肿瘤学阅片 原字段 IsClinicalReading
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Contracts.SetCriterionReadingInfoInDto.IsUrgent">
|
||||
<summary>
|
||||
是否加急
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Core.Application.Contracts.TrialConfigDTO.QCProcessEnum">
|
||||
<summary>
|
||||
QC流程 0 不审,1 单审,2双审
|
||||
@@ -9904,18 +10501,154 @@
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetSiteSurveyApprovalList(IRaCIS.Core.Application.Contracts.TrialSiteSurveyStatQuery)">
|
||||
<summary>
|
||||
Site 调研 每个项目 需要处理的审批统计
|
||||
中心调研 每个项目 需要处理的审批统计
|
||||
</summary>
|
||||
<param name="query"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetTrialDocStatList(IRaCIS.Core.Application.Contracts.TrialSiteSurveyStatQuery)">
|
||||
<summary>
|
||||
需要签署文件数量 系统级别的在第一行
|
||||
待签署的项目文件 需要签署文件数量 系统级别的在第一行
|
||||
</summary>
|
||||
<param name="query"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetCheckToBeDoneList(IRaCIS.Core.Application.Contracts.CheckToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
一致性核查待处理 -- PM APM 待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_subjectVisitRepository"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetReReadingApplyToBeDoneList(IRaCIS.Core.Application.Contracts.ReReadingApplyToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTaskReReading},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
重阅申请待审核 -- PM APM 待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_visitTaskReReadingRepository"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetPM_ReviewerSelectToBeDoneList(IRaCIS.Core.Application.Contracts.ReviewerSelectToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Enroll},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
PM 阅片人筛选 -- PM APM 待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_enrollRepository"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<returns></returns> vvv
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetSPM_ReviewerSelectToBeDoneList(IRaCIS.Core.Application.Contracts.ReviewerSelectToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Enroll},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
SPM 阅片人筛选
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_enrollRepository"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<returns></returns> vvv
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetReReadingApprovalToBeDoneToBeDoneList(IRaCIS.Core.Application.Contracts.ReReadingApprovalToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTaskReReading},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
重阅审批
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_visitTaskReReadingRepository"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetImageClinicalDataToBeDoneList(IRaCIS.Core.Application.Contracts.ImageClinicalDataToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
临床数据 --CRC 待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_subjectVisitRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetCRCImageQuestionToBeDoneList(IRaCIS.Core.Application.Contracts.ImageQuestionToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
CRC影像质疑待处理 --CRC 待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_subjectVisitRepository"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetImageCheckQuestionToBeDoneList(IRaCIS.Core.Application.Contracts.ImageCheckQuestionToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
核查质疑待处理 --CRC 待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_subjectVisitRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetImageReUploadToBeDoneList(IRaCIS.Core.Application.Contracts.ImageReUploadToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
影像重传 --CRC 待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_subjectVisitRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetImageSubmittedToBeDoneList(IRaCIS.Core.Application.Contracts.ImageSubmittedToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
加急影像提交 --CRC 待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_subjectVisitRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetImageQualityToBeDoneList(IRaCIS.Core.Application.Contracts.ImageQualityToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
影像质控 待领取 跟项目配置有关系 --IQC待办
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_subjectVisitRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetQCImageQuestionToBeDoneList(IRaCIS.Core.Application.Contracts.ImageQuestionToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
QC 质疑
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_subjectVisitRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetIRImageReadingToBeDoneList(IRaCIS.Core.Application.Contracts.IRImageReadingToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
|
||||
<summary>
|
||||
IR 影像阅片 待阅量
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_visitTaskRepository"></param>
|
||||
<param name="_trialReadingCriterionRepository"></param>
|
||||
<param name="_trialRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetIRMedicalCommentsToBeDoneList(IRaCIS.Core.Application.Contracts.MedicalCommentsToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskMedicalReview})">
|
||||
<summary>
|
||||
IR医学反馈
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetMIMMedicalCommentsToBeDoneList(IRaCIS.Core.Application.Contracts.MedicalCommentsToBeDoneQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskMedicalReview})">
|
||||
<summary>
|
||||
MIM医学反馈
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_taskMedicalReviewRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.PersonalWorkstation.GetMedicalCommentsFirstToBeDone(IRaCIS.Core.Application.Contracts.MedicalCommentsFirstToBeDoneQuery,IRaCIS.Core.Application.Interfaces.ITaskMedicalReviewService)">
|
||||
<summary>
|
||||
获取某项目 某标准 第一条未读的医学审核
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<param name="_taskMedicalReviewService"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.TrialConfigService.TrialReadingInfoSignVerify(IRaCIS.Core.Application.Contracts.TrialReadingInfoSignInDto)">
|
||||
<summary>
|
||||
阅片信息签名验证接口
|
||||
@@ -10853,6 +11586,22 @@
|
||||
临床数据配置
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ClinicalDataSetService.ApplySystemClinical(IRaCIS.Core.Application.Service.Reading.Dto.ApplySystemClinicalInDto)">
|
||||
<summary>
|
||||
应用系统临床数据
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ClinicalDataSetService.ApplyTrialClinical(IRaCIS.Core.Application.Service.Reading.Dto.ApplyTrialClinicalInDto)">
|
||||
<summary>
|
||||
应用项目临床数据
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ClinicalDataSetService.AddOrUpdateClinicalDataSystemSet(IRaCIS.Core.Application.Service.Reading.Dto.ClinicalDataSystemSetAddOrEdit)">
|
||||
<summary>
|
||||
新增或者修改(系统)
|
||||
|
||||
@@ -39,7 +39,10 @@
|
||||
|
||||
//-------------------------------------------------------------------------------------Reading-----------------------------------------------------------------
|
||||
//ClinicalDataSetService
|
||||
"ClinicalDataSet_Apply": "",
|
||||
"ClinicalDataSet_DupTypeFail": "The same type of clinical data exists. The operation failed.",
|
||||
//ClinicalQuestionService
|
||||
"ClinicalQuestion_Repeat": "",
|
||||
//ReadingClinicalDataService
|
||||
"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!",
|
||||
@@ -371,7 +374,7 @@
|
||||
"QCOperation_NoRecipient": "You are not the current recipient of the quality control task, no operation authority!",
|
||||
"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_QCConfigFirst": "Please configure the image QC questions before claiming any image QC work.",
|
||||
"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 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.",
|
||||
@@ -381,8 +384,8 @@
|
||||
"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 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 to submit?",
|
||||
"QCOperation_UnsubmittedVisits": "After submitting the current visit, please submit any prior visits which have not been submitted as soon as possible. ({0})",
|
||||
"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.",
|
||||
|
||||
@@ -39,7 +39,10 @@
|
||||
|
||||
// ------------------------------------------------------------Reading--------------------------------------------------------------------
|
||||
//ClinicalDataSetService
|
||||
"ClinicalDataSet_Apply": "当前临床数据需要配置一个检查日期才能应用",
|
||||
"ClinicalDataSet_DupTypeFail": "存在同类型的临床数据,操作失败",
|
||||
//ClinicalQuestionService
|
||||
"ClinicalQuestion_Repeat": "存在相同的问题名称!",
|
||||
//ReadingClinicalDataService
|
||||
"ReadingClinicalData_DupTypeFail": "存在同类型的临床数据,操作失败",
|
||||
"ReadingClinicalData_Unchecked": "当前临床数据状态不是已核查状态,不允许签名!",
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace IRaCIS.Core.Application.Interfaces
|
||||
|
||||
//Task<PageOutput<TaskMedicalReviewView>> GetTaskMedicalReviewList(TaskMedicalReviewQuery queryTaskMedicalReview);
|
||||
|
||||
|
||||
|
||||
Task<TaskMedicalReviewView> GetNextMedicalReviewTask(GetNextMedicalReviewTaskInDto inDto);
|
||||
Task<IResponseOutput<PageOutput<TaskMedicalReviewView>>> GetMIMMedicalReviewTaskList(TaskMedicalReviewQuery inQuery);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
var medicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.MedicalReviewId).Include(x=>x.VisitTask).FirstNotNullAsync();
|
||||
|
||||
var subjectReview = await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery()
|
||||
var subjectReview = (await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery()
|
||||
{
|
||||
|
||||
TrialId = medicalReview.TrialId,
|
||||
@@ -148,14 +148,14 @@ namespace IRaCIS.Core.Application.Service
|
||||
TrialReadingCriterionId = medicalReview.VisitTask.TrialReadingCriterionId,
|
||||
PageIndex=1,
|
||||
PageSize=1,
|
||||
});
|
||||
})).Data;
|
||||
|
||||
if (subjectReview.Item1.CurrentPageData.Count == 1)
|
||||
if (subjectReview.CurrentPageData.Count == 1)
|
||||
{
|
||||
return subjectReview.Item1.CurrentPageData[0];
|
||||
return subjectReview.CurrentPageData[0];
|
||||
}
|
||||
|
||||
var data = await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery()
|
||||
var data = (await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery()
|
||||
{
|
||||
|
||||
TrialId = medicalReview.TrialId,
|
||||
@@ -164,11 +164,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
TrialReadingCriterionId = medicalReview.VisitTask.TrialReadingCriterionId,
|
||||
PageIndex = 1,
|
||||
PageSize = 1,
|
||||
});
|
||||
})).Data;
|
||||
|
||||
if (data.Item1.CurrentPageData.Count == 1)
|
||||
if (data.CurrentPageData.Count == 1)
|
||||
{
|
||||
return data.Item1.CurrentPageData[0];
|
||||
return data.CurrentPageData[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -186,7 +186,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<(PageOutput<TaskMedicalReviewView>, object)> GetMIMMedicalReviewTaskList(TaskMedicalReviewQuery inQuery)
|
||||
public async Task<IResponseOutput< PageOutput<TaskMedicalReviewView>>> GetMIMMedicalReviewTaskList(TaskMedicalReviewQuery inQuery)
|
||||
{
|
||||
|
||||
var taskMedicalReviewQueryable = _taskMedicalReviewRepository.Where(t => t.VisitTask.TrialId == inQuery.TrialId && t.MedicalManagerUserId == _userInfo.Id&&t.VisitTask.TrialReadingCriterionId==inQuery.TrialReadingCriterionId)
|
||||
@@ -206,7 +206,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
var pageList = await taskMedicalReviewQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TaskMedicalReviewView.Id) : inQuery.SortField, inQuery.Asc);
|
||||
|
||||
return (pageList, new
|
||||
return ResponseOutput.Ok(pageList, new
|
||||
{
|
||||
|
||||
IsConfirmMedicineQuestion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inQuery.TrialReadingCriterionId).Select(x => x.IsConfirmMedicineQuestion).FirstOrDefaultAsync()
|
||||
|
||||
@@ -1081,11 +1081,15 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
|
||||
var visitQuery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.DoctorUserId == _userInfo.Id
|
||||
&& x.TaskState == TaskState.Effect /*&& x.TrialReadingCriterionId== inDto.TrialReadingCriterionId*/)
|
||||
.WhereIf(critrion.IsAutoCreate == false, t => t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(t => t.IsGeneratedTask == false) ?
|
||||
t.VisitTaskNum <= t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsGeneratedTask == false).Min(t => t.SubjectVisit.VisitNum) : true)
|
||||
|
||||
//前序 不存在 未生成任务的访视
|
||||
.WhereIf(critrion.IsAutoCreate == false, t => !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) )
|
||||
|
||||
.Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum <= t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true)
|
||||
// 前序 不存在 未一致性核查未通过的
|
||||
.Where( t=>! t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
|
||||
//.WhereIf(critrion.IsAutoCreate == false, t => t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(t => t.IsGeneratedTask == false) ?
|
||||
//t.VisitTaskNum <= t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsGeneratedTask == false).Min(t => t.SubjectVisit.VisitNum) : true)
|
||||
//.Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum <= t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true)
|
||||
//满足前序访视不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang
|
||||
//但是加字段 IsFrontTaskNeedSignButNotSign 那么签名临床数据的时候,要对该subject 该标准的有效的任务 这个字段需要在签名的时候维护 采取这种方式 统计数字灵活
|
||||
//.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum))
|
||||
@@ -1412,7 +1416,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||
//添加申请记录
|
||||
var visitTaskReReading = await _visitTaskReReadingRepository.AddAsync(new VisitTaskReReading()
|
||||
{
|
||||
|
||||
TrialId=applyReReadingCommand.TrialId,
|
||||
RootReReadingTaskId = rootReReadingTaskId == Guid.Empty ? task.Id : rootReReadingTaskId,
|
||||
OriginalReReadingTaskId = task.Id,
|
||||
RequestReReadingTime = DateTime.Now,
|
||||
|
||||
@@ -9,27 +9,23 @@ using System.Collections.Generic;
|
||||
namespace IRaCIS.Core.Application.ViewModel
|
||||
{
|
||||
/// <summary> InternationalizationView 列表视图模型 </summary>
|
||||
public class InternationalizationView
|
||||
public class InternationalizationView : InternationalizationAddOrEdit
|
||||
{
|
||||
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 class InternationalizationQuery : PageInput
|
||||
{
|
||||
|
||||
public string? FolderPath { get; set; }
|
||||
public string? Code { get; set; }
|
||||
public int? InternationalizationType { get; set; }
|
||||
public int? State { get; set; }
|
||||
public string? Description { get; set; }
|
||||
public string? Code { get; set; }
|
||||
public string? Value { get; set; }
|
||||
|
||||
public string? ValueCN { get; set; }
|
||||
@@ -41,14 +37,38 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
{
|
||||
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 string Description { get; set; } = string.Empty;
|
||||
public string Code { get; set; } = string.Empty;
|
||||
public string Value { get; set; } = string.Empty;
|
||||
public string ValueCN { get; set; } = string.Empty;
|
||||
|
||||
public int InternationalizationType { get; set; }
|
||||
}
|
||||
|
||||
public class BatchAddInternationalization
|
||||
{
|
||||
public int InternationalizationType { get; set; }
|
||||
|
||||
public int State { get; set; }
|
||||
|
||||
public List<BatchAddInternationalizationDto> AddList { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class BatchAddInternationalizationDto
|
||||
{
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public string Code { get; set; } = string.Empty;
|
||||
public string Value { get; set; } = string.Empty;
|
||||
public string ValueCN { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class InternationalizationSimpleDto
|
||||
{
|
||||
public string Code { get; set; } = string.Empty;
|
||||
public string Value { get; set; } = string.Empty;
|
||||
public string ValueCN { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-27 15:47:02
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.Collections.Generic;
|
||||
namespace IRaCIS.Core.Application.ViewModel
|
||||
{
|
||||
/// <summary> PublishLogView 列表视图模型 </summary>
|
||||
public class PublishLogView : PublishLogAddOrEdit
|
||||
{
|
||||
|
||||
public DateTime CreateTime { get; set; }
|
||||
public Guid CreateUserId { get; set; }
|
||||
public Guid UpdateUserId { get; set; }
|
||||
public DateTime UpdateTime { get; set; }
|
||||
}
|
||||
|
||||
///<summary>PublishLogQuery 列表查询参数模型</summary>
|
||||
public class PublishLogQuery:PageInput
|
||||
{
|
||||
|
||||
public string? Version { get; set; }
|
||||
|
||||
public string? UpdateContent { get; set; }
|
||||
|
||||
}
|
||||
|
||||
///<summary> PublishLogAddOrEdit 列表查询参数模型</summary>
|
||||
public class PublishLogAddOrEdit
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
public string Version { get; set; }
|
||||
public DateTime PublishTime { get; set; }
|
||||
public string UpdateContent { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-27 15:47:10
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
namespace IRaCIS.Core.Application.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// IPublishLogService
|
||||
/// </summary>
|
||||
public interface IPublishLogService
|
||||
{
|
||||
|
||||
Task<PageOutput<PublishLogView>> GetPublishLogList(PublishLogQuery inQuery);
|
||||
|
||||
Task<IResponseOutput> AddOrUpdatePublishLog(PublishLogAddOrEdit addOrEditPublishLog);
|
||||
|
||||
Task<IResponseOutput> DeletePublishLog(Guid publishLogId);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,9 @@ using IRaCIS.Core.Domain.Models;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
/// <summary>
|
||||
@@ -24,23 +27,70 @@ namespace IRaCIS.Core.Application.Service
|
||||
_internationalizationRepository = internationalizationRepository;
|
||||
}
|
||||
|
||||
|
||||
[AllowAnonymous]
|
||||
|
||||
public async Task<List<InternationalizationSimpleDto>> GetFrontInternationalizationList()
|
||||
{
|
||||
|
||||
var list = await _internationalizationRepository.Where(t => t.InternationalizationType == 0).Select(t => new InternationalizationSimpleDto()
|
||||
{
|
||||
Code = t.Code,
|
||||
Value = t.Value,
|
||||
ValueCN = t.ValueCN
|
||||
}).ToListAsync();
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
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 internationalizationQueryable = _internationalizationRepository
|
||||
.WhereIf(inQuery.Description != null, t => t.Description.Contains(inQuery.Description))
|
||||
.WhereIf(inQuery.Code != null, t => t.Code.Contains(inQuery.Code))
|
||||
.WhereIf(inQuery.State != null, t => t.State == inQuery.State)
|
||||
.WhereIf(inQuery.InternationalizationType != null, t => t.InternationalizationType == inQuery.InternationalizationType)
|
||||
.WhereIf(inQuery.Value != null, t => t.Value.Contains(inQuery.Value))
|
||||
.WhereIf(inQuery.ValueCN != null, t => t.ValueCN.Contains(inQuery.ValueCN))
|
||||
.ProjectTo<InternationalizationView>(_mapper.ConfigurationProvider);
|
||||
|
||||
var pageList = await internationalizationQueryable
|
||||
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? "Id" : inQuery.SortField,
|
||||
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(InternationalizationView.State) : inQuery.SortField,
|
||||
inQuery.Asc);
|
||||
|
||||
return pageList;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> BatchAddInternationalization(BatchAddInternationalization batchAdd)
|
||||
{
|
||||
foreach (var item in batchAdd.AddList)
|
||||
{
|
||||
|
||||
var mapItem = _mapper.Map<InternationalizationAddOrEdit>(item);
|
||||
|
||||
mapItem.InternationalizationType = batchAdd.InternationalizationType;
|
||||
mapItem.State = batchAdd.State;
|
||||
|
||||
var verifyExp1 = new EntityVerifyExp<Internationalization>()
|
||||
{
|
||||
VerifyExp = t => t.Code == mapItem.Code && t.InternationalizationType == mapItem.InternationalizationType,
|
||||
|
||||
VerifyMsg = $"该类型已有{item.Code}名称的国际化标识",
|
||||
IsVerify = true
|
||||
};
|
||||
|
||||
var entity = await _internationalizationRepository.InsertOrUpdateAsync(mapItem, false, verifyExp1);
|
||||
}
|
||||
|
||||
await _internationalizationRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
public async Task<IResponseOutput> AddOrUpdateInternationalization(InternationalizationAddOrEdit addOrEditInternationalization)
|
||||
{
|
||||
@@ -52,7 +102,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
IsVerify = true
|
||||
};
|
||||
|
||||
var entity = await _internationalizationRepository.InsertOrUpdateAsync(addOrEditInternationalization, true,verifyExp1);
|
||||
var entity = await _internationalizationRepository.InsertOrUpdateAsync(addOrEditInternationalization, true, verifyExp1);
|
||||
|
||||
if (addOrEditInternationalization.InternationalizationType == 1)
|
||||
{
|
||||
await InternationalizationHelper.AddOrUpdateJsonKeyValueAsync(entity.Code, entity.Value, entity.ValueCN);
|
||||
|
||||
}
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
|
||||
@@ -186,7 +186,6 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
|
||||
builder.HtmlBody = string.Format(templateInfo,
|
||||
"",
|
||||
//---您正在进行邮箱重置密码操作
|
||||
_localizer["Mail_ResettingPassword "],
|
||||
verificationCode
|
||||
@@ -254,7 +253,6 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
|
||||
builder.HtmlBody = string.Format(templateInfo,
|
||||
"",
|
||||
//---您正在参与展影医疗IRC项目
|
||||
_localizer["Mail_IRCProject"],
|
||||
verificationCode
|
||||
@@ -321,7 +319,6 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
|
||||
builder.HtmlBody = string.Format(templateInfo,
|
||||
"",
|
||||
//---您正在参与展影医疗IRC项目中心调研工作
|
||||
_localizer["Mail_CenterResearchReminder"],
|
||||
verificationCode
|
||||
@@ -398,7 +395,7 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token });
|
||||
|
||||
routeUrl = routeUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token;
|
||||
routeUrl = routeUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us?"en":"zh") + "&access_token=" + token;
|
||||
|
||||
var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login"));
|
||||
|
||||
@@ -512,7 +509,7 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
var templateInfo = SourceReader.ReadToEnd();
|
||||
|
||||
var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token;
|
||||
var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token;
|
||||
|
||||
var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login"));
|
||||
|
||||
@@ -576,7 +573,7 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login"));
|
||||
|
||||
var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token;
|
||||
var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token;
|
||||
|
||||
var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}";
|
||||
|
||||
@@ -694,7 +691,7 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
var templateInfo = SourceReader.ReadToEnd();
|
||||
|
||||
var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + userType.UserTypeShortName + "&access_token=" + token;
|
||||
var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + userType.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token;
|
||||
|
||||
var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login"));
|
||||
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-27 15:47:06
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Application.Contracts;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
/// <summary>
|
||||
/// PublishLogService
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "Common")]
|
||||
public class PublishLogService : BaseService, IPublishLogService
|
||||
{
|
||||
|
||||
private readonly IRepository<PublishLog> _publishLogRepository;
|
||||
|
||||
public PublishLogService(IRepository<PublishLog> publishLogRepository)
|
||||
{
|
||||
_publishLogRepository = publishLogRepository;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<PublishLogView>> GetPublishLogList(PublishLogQuery inQuery)
|
||||
{
|
||||
|
||||
var publishLogQueryable = _publishLogRepository
|
||||
.WhereIf(!string.IsNullOrEmpty(inQuery.Version) , t => t.Version.Contains(inQuery.Version))
|
||||
.WhereIf(!string.IsNullOrEmpty(inQuery.UpdateContent), t => t.UpdateContent.Contains(inQuery.UpdateContent))
|
||||
.ProjectTo<PublishLogView>(_mapper.ConfigurationProvider);
|
||||
|
||||
var pageList = await publishLogQueryable
|
||||
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
|
||||
|
||||
return pageList;
|
||||
}
|
||||
|
||||
|
||||
public async Task<IResponseOutput> AddOrUpdatePublishLog(PublishLogAddOrEdit addOrEditPublishLog)
|
||||
{
|
||||
Version version;
|
||||
|
||||
if (!Version.TryParse(addOrEditPublishLog.Version, out version))
|
||||
{
|
||||
return ResponseOutput.NotOk("版本号不符合要求");
|
||||
}
|
||||
|
||||
var verifyExp1 = new EntityVerifyExp<PublishLog>()
|
||||
{
|
||||
VerifyExp = u => u.Version == addOrEditPublishLog.Version ,
|
||||
|
||||
VerifyMsg = "发布编号不能重复"
|
||||
};
|
||||
|
||||
|
||||
|
||||
var entity = await _publishLogRepository.InsertOrUpdateAsync(addOrEditPublishLog, true, verifyExp1);
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
}
|
||||
|
||||
|
||||
[HttpDelete("{publishLogId:guid}")]
|
||||
public async Task<IResponseOutput> DeletePublishLog(Guid publishLogId)
|
||||
{
|
||||
var success = await _publishLogRepository.DeleteFromQueryAsync(t => t.Id == publishLogId, true);
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -57,6 +57,12 @@ namespace IRaCIS.Core.Application.Service
|
||||
CreateMap<Internationalization, InternationalizationView>();
|
||||
CreateMap<Internationalization, InternationalizationAddOrEdit>().ReverseMap();
|
||||
|
||||
CreateMap<BatchAddInternationalizationDto, InternationalizationAddOrEdit>();
|
||||
|
||||
|
||||
CreateMap<PublishLog, PublishLogView>();
|
||||
CreateMap<PublishLog, PublishLogAddOrEdit>().ReverseMap();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,5 @@ namespace IRaCIS.Application.Contracts
|
||||
public string AwardsHonorsCN { get; set; } = String.Empty;
|
||||
|
||||
|
||||
public string BlindPublications { get; set; }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -155,8 +155,6 @@ namespace IRaCIS.Application.Services
|
||||
await _repository.BatchDeleteAsync<Attachment>(a => a.Id == updateGCPExperienceParam.GCPId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
return ResponseOutput.Result(successs, updateGCPExperienceParam.GCPId.ToString());
|
||||
|
||||
}
|
||||
|
||||
@@ -35,13 +35,15 @@ namespace IRaCIS.Application.Services
|
||||
VerifyMsg = _localizer["Hospital_DupName"]
|
||||
};
|
||||
|
||||
if (await _hospitalRepository.AnyAsync(x => x.SiteId == hospitalCommand.SiteId && hospitalCommand.SiteId != null))
|
||||
var exp1 = new EntityVerifyExp<Hospital>()
|
||||
{
|
||||
//---当前Site已经添加到其他Hospital了
|
||||
throw new BusinessValidationFailedException(_localizer["Hospital_SiteAdded"]);
|
||||
}
|
||||
VerifyExp = x => x.SiteId == hospitalCommand.SiteId && hospitalCommand.SiteId != null,
|
||||
//---已经存在同名的医院,请确认。
|
||||
VerifyMsg = _localizer["Hospital_SiteAdded"]
|
||||
};
|
||||
|
||||
var hospital = await _hospitalRepository.InsertOrUpdateAsync(hospitalCommand, true, exp);
|
||||
|
||||
var hospital = await _hospitalRepository.InsertOrUpdateAsync(hospitalCommand, true, exp,exp1);
|
||||
|
||||
return ResponseOutput.Ok(hospital.Id.ToString());
|
||||
|
||||
|
||||
@@ -477,7 +477,6 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
return await userQueryable.ToPagedListAsync(param.PageIndex, param.PageSize, param.SortField == string.Empty ? "UserName" : param.SortField, param.Asc);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -157,7 +157,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public async Task<List<TrialUserType>> GetTrialUserTypeList()
|
||||
{
|
||||
var query = userTypeServiceRepository.Where(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin)
|
||||
//.Where(t => t.Type == UserTypeGroup.TrialUser)
|
||||
.Where(t => !t.UserTypeGroupList.Any(t=> t.Group.Code=="3"))
|
||||
.OrderBy(t => t.Order).ProjectTo<TrialUserType>(_mapper.ConfigurationProvider);
|
||||
|
||||
return await query.ToListAsync();
|
||||
|
||||
@@ -0,0 +1,397 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-15 15:06:06
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using MassTransit;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Infrastructure.Extention;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
/// <summary>
|
||||
/// 临床答案
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "Reading")]
|
||||
public class ClinicalAnswerService : BaseService
|
||||
{
|
||||
|
||||
private readonly IRepository<TrialClinicalQuestion> _trialClinicalQuestionRepository;
|
||||
|
||||
private readonly IRepository<SystemClinicalQuestion> _systemClinicalQuestionRepository;
|
||||
|
||||
|
||||
private readonly IRepository<SystemClinicalTableQuestion> _systemClinicalTableQuestionRepository;
|
||||
|
||||
private readonly IRepository<TrialClinicalTableQuestion> _trialClinicalTableQuestionRepository;
|
||||
|
||||
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
|
||||
|
||||
private readonly IRepository<ClinicalForm> _clinicalFormRepository;
|
||||
private readonly IRepository<Subject> _subjectRepository;
|
||||
private readonly IRepository<ClinicalQuestionAnswer> _clinicalQuestionAnswerRepository;
|
||||
|
||||
private readonly IRepository<ClinicalTableAnswer> _clinicalTableAnswerRepository;
|
||||
|
||||
private readonly IRepository<ClinicalAnswerRowInfo> _clinicalAnswerRowInfoRepository;
|
||||
|
||||
private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository;
|
||||
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
||||
|
||||
private readonly IClinicalQuestionService _iClinicalQuestionService;
|
||||
|
||||
|
||||
public ClinicalAnswerService(IRepository<TrialClinicalQuestion> trialClinicalQuestionRepository,
|
||||
IRepository<SystemClinicalTableQuestion> systemClinicalTableQuestionRepository,
|
||||
IRepository<TrialClinicalTableQuestion> trialClinicalTableQuestionRepository,
|
||||
IRepository<ReadingClinicalData> readingClinicalDataRepository,
|
||||
IRepository<ClinicalForm> clinicalFormRepository,
|
||||
IRepository<Subject> subjectRepository,
|
||||
IRepository<SubjectVisit> subjectVisitRepository,
|
||||
IRepository<ClinicalTableAnswer> clinicalTableAnswerRepository,
|
||||
IRepository<ClinicalQuestionAnswer> clinicalQuestionAnswerRepository,
|
||||
IClinicalQuestionService iClinicalQuestionService,
|
||||
IRepository<ClinicalAnswerRowInfo> clinicalAnswerRowInfoRepository,
|
||||
IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository,
|
||||
IRepository<SystemClinicalQuestion> systemClinicalQuestionRepository
|
||||
)
|
||||
{
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
_readingClinicalDataRepository = readingClinicalDataRepository;
|
||||
_clinicalAnswerRowInfoRepository = clinicalAnswerRowInfoRepository;
|
||||
_clinicalQuestionAnswerRepository = clinicalQuestionAnswerRepository;
|
||||
_systemClinicalTableQuestionRepository = systemClinicalTableQuestionRepository;
|
||||
_trialClinicalQuestionRepository = trialClinicalQuestionRepository;
|
||||
_trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository;
|
||||
_systemClinicalQuestionRepository = systemClinicalQuestionRepository;
|
||||
_clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
|
||||
|
||||
_clinicalFormRepository = clinicalFormRepository;
|
||||
this._subjectRepository = subjectRepository;
|
||||
_clinicalTableAnswerRepository = clinicalTableAnswerRepository;
|
||||
_iClinicalQuestionService = iClinicalQuestionService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自动添加CRC临床数据
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task AutoAddCRCClinical(AutoAddClinicalInDto inDto)
|
||||
{
|
||||
var dataTrialSetList = await _clinicalDataTrialSetRepository.Where(x =>x.TrialId == inDto.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm)
|
||||
.IgnoreAutoIncludes().ToListAsync();
|
||||
var baseLine = await _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId)
|
||||
.WhereIf(inDto.SubjectId!=null,x=>x.SubjectId==inDto.SubjectId)
|
||||
|
||||
.Select(x => new
|
||||
{
|
||||
|
||||
x.SubjectId,
|
||||
VisitId = x.Id,
|
||||
x.IsBaseLine,
|
||||
}).ToListAsync();
|
||||
|
||||
var clinicalDataList =await _readingClinicalDataRepository.Where(x =>x.TrialId==inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole== UploadRole.CRC).IgnoreAutoIncludes().ToListAsync();
|
||||
|
||||
List<ReadingClinicalData> readingClinicalDatas = new List<ReadingClinicalData>();
|
||||
|
||||
baseLine.Select(x => x.SubjectId).Distinct().ForEach(n =>
|
||||
{
|
||||
var baseLineVisitId = baseLine.Where(x => x.IsBaseLine && x.SubjectId == n).Select(x => x.VisitId).First();
|
||||
readingClinicalDatas.AddRange(
|
||||
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.Subject).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0)
|
||||
.Select(x => new ReadingClinicalData()
|
||||
{
|
||||
ClinicalDataTrialSetId = x.Id,
|
||||
IsVisit = true,
|
||||
SubjectId = n,
|
||||
ReadingId = baseLineVisitId,
|
||||
TrialId = inDto.TrialId
|
||||
}).ToList());
|
||||
|
||||
|
||||
readingClinicalDatas.AddRange(
|
||||
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.ImageRead).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0)
|
||||
.Select(x => new ReadingClinicalData()
|
||||
{
|
||||
ClinicalDataTrialSetId = x.Id,
|
||||
IsVisit = false,
|
||||
SubjectId = n,
|
||||
ReadingId = default(Guid),
|
||||
TrialId = inDto.TrialId
|
||||
}).ToList());
|
||||
|
||||
readingClinicalDatas.AddRange(
|
||||
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0)
|
||||
.Select(x => new ReadingClinicalData()
|
||||
{
|
||||
ClinicalDataTrialSetId = x.Id,
|
||||
IsVisit = false,
|
||||
SubjectId = n,
|
||||
ReadingId = default(Guid),
|
||||
TrialId = inDto.TrialId
|
||||
}).ToList());
|
||||
});
|
||||
|
||||
baseLine.ForEach(n =>
|
||||
{
|
||||
readingClinicalDatas.AddRange(
|
||||
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.ReadingId == n.VisitId).Count() == 0)
|
||||
.Select(x => new ReadingClinicalData()
|
||||
{
|
||||
ClinicalDataTrialSetId = x.Id,
|
||||
IsVisit = true,
|
||||
SubjectId = n.SubjectId,
|
||||
ReadingId = n.VisitId,
|
||||
TrialId = inDto.TrialId
|
||||
}).ToList());
|
||||
});
|
||||
|
||||
await _readingClinicalDataRepository.AddRangeAsync(readingClinicalDatas);
|
||||
|
||||
await _readingClinicalDataRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取CRC受试者临床数据
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<GetCRCSubjectClinicalOutDto>> GetCRCSubjectClinicalList(GetCRCSubjectClinicalInDto inDto)
|
||||
{
|
||||
|
||||
await AutoAddCRCClinical(new AutoAddClinicalInDto()
|
||||
{
|
||||
|
||||
TrialId = inDto.TrialId
|
||||
}) ;
|
||||
|
||||
|
||||
|
||||
var subjects = await _subjectRepository.Where(x => x.TrialId == inDto.TrialId).Select(x => new GetCRCSubjectClinicalResultDto()
|
||||
{
|
||||
SubjectId = x.Id,
|
||||
SubjectCode = x.Code
|
||||
}).ToListAsync();
|
||||
|
||||
|
||||
var clinicalData=await _readingClinicalDataRepository.Where(x=>x.TrialId == inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole==UploadRole.CRC&&x.ClinicalDataTrialSet.ClinicalDataLevel!= ClinicalLevel.SubjectVisit)
|
||||
.Where(x=>!x.IsSign)
|
||||
.Include(x=>x.ClinicalDataTrialSet).Select(x=>new GetCRCSubjectClinicalOutDto() {
|
||||
SubjectId=x.SubjectId,
|
||||
SubjectCode=x.Subject.Code,
|
||||
ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id,
|
||||
ClinicalDataSetEnName= x.ClinicalDataTrialSet.ClinicalDataSetEnName,
|
||||
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName,
|
||||
}).OrderBy(x=>x.SubjectCode).ToListAsync();
|
||||
|
||||
// 一次查询报错 分两次写
|
||||
clinicalData.ForEach(x =>
|
||||
{
|
||||
x.ClinicalDataSetEnName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us);
|
||||
|
||||
});
|
||||
|
||||
|
||||
var clinicalFormData = await _clinicalFormRepository.Where(x => x.TrialId == inDto.TrialId).ToListAsync();
|
||||
clinicalData.ForEach(n =>
|
||||
{
|
||||
n.ClinicalCount = clinicalFormData.Where(y => y.ClinicalDataTrialSetId == n.ClinicalDataTrialSetId && y.SubjectId == n.SubjectId).Count();
|
||||
});
|
||||
|
||||
|
||||
return clinicalData;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取表单列表
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<GetClinicalQuestionAnswerListOutDto> GetClinicalQuestionFormList(GetClinicalQuestionAnswerListInDto inDto)
|
||||
{
|
||||
var result = new GetClinicalQuestionAnswerListOutDto();
|
||||
result.AnswerList = new List<Dictionary<string, string>>();
|
||||
result.QuestionList=await _trialClinicalQuestionRepository.Where(x=>x.TrialClinicalId==inDto.ClinicalDataTrialSetId
|
||||
&&x.ClinicalQuestionType!= ReadingQestionType.Group
|
||||
&& x.ClinicalQuestionType != ReadingQestionType.Table).OrderBy(x=>x.ShowOrder)
|
||||
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var answers = await _clinicalQuestionAnswerRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId)
|
||||
.Select(x => new
|
||||
{
|
||||
x.ClinicalFormId,
|
||||
x.ClinicalForm.CheckDate,
|
||||
x.QuestionId,
|
||||
x.Answer
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
var ClinicalFormIds = answers.OrderBy(x=>x.CheckDate).Select(x => x.ClinicalFormId).Distinct().ToList();
|
||||
ClinicalFormIds.ForEach(x =>
|
||||
{
|
||||
var dic = answers.Where(y => y.ClinicalFormId == x).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer);
|
||||
dic.Add("clinicalFormId", x.ToString());
|
||||
result.AnswerList.Add(dic);
|
||||
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取临床数据表单问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<GetClinicalFormInfoOutDto> GetClinicalFormInfo(GetClinicalFormInfoInDto inDto)
|
||||
{
|
||||
var formInfo = await _clinicalFormRepository.Where(x => x.Id == inDto.ClinicalFormId).FirstNotNullAsync();
|
||||
|
||||
var questionAnswer = await _clinicalQuestionAnswerRepository.Where(x => x.ClinicalFormId == inDto.ClinicalFormId).Select(x => new ClinicalFormQuestionAnswer
|
||||
{
|
||||
QuestionId = x.QuestionId,
|
||||
Answer = x.Answer
|
||||
}).ToListAsync();
|
||||
|
||||
var tableAnswer = await _clinicalTableAnswerRepository.Where(x => x.ClinicalFormId == inDto.ClinicalFormId).Select(x => new ClinicalFormTableQuestionAnswer
|
||||
{
|
||||
TableQuestionId = x.TableQuestionId,
|
||||
Answer = x.Answer,
|
||||
QuestionId = x.QuestionId,
|
||||
RowIndex = x.ClinicalAnswerRowInfo.RowIndex
|
||||
}).ToListAsync();
|
||||
|
||||
var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId)
|
||||
.ProjectTo<ClinicalQuestionPreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var tableQuestions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId)
|
||||
.ProjectTo<ClinicalTablePreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
|
||||
var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList();
|
||||
|
||||
result.ForEach(x =>
|
||||
{
|
||||
_iClinicalQuestionService.FindChildQuestion(x, questions, tableQuestions, questionAnswer, tableAnswer);
|
||||
});
|
||||
|
||||
return new GetClinicalFormInfoOutDto()
|
||||
{
|
||||
|
||||
Question = result
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 提交临床数据表单
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> SubmitClinicalForm(SubmitClinicalFormInDto inDto)
|
||||
{
|
||||
|
||||
|
||||
|
||||
ClinicalForm clinicalForm = new ClinicalForm() { };
|
||||
clinicalForm = new ClinicalForm()
|
||||
{
|
||||
ClinicalDataTrialSetId = inDto.ClinicalDataTrialSetId,
|
||||
SubjectId = inDto.SubjectId,
|
||||
TrialId= inDto.TrialId,
|
||||
Id = inDto.ClinicalFormId ?? NewId.NextGuid(),
|
||||
ReadingId = inDto.ReadingId,
|
||||
VisitId = inDto.VisitId,
|
||||
};
|
||||
try
|
||||
{
|
||||
var checkDateQuestionId = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.ClinicalDataTrialSetId && x.IsCheckDate).Select(x => x.Id).FirstNotNullAsync();
|
||||
clinicalForm.CheckDate = DateTime.Parse(inDto.QuestionAnswers.Where(x => x.QuestionId == checkDateQuestionId).Select(x => x.Answer).First());
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
List<ClinicalQuestionAnswer> clinicalQuestionAnswers = inDto.QuestionAnswers.Select(x => new ClinicalQuestionAnswer()
|
||||
{
|
||||
Answer=x.Answer,
|
||||
ClinicalDataTrialSetId=inDto.ClinicalDataTrialSetId,
|
||||
SubjectId=inDto.SubjectId,
|
||||
ClinicalFormId= clinicalForm.Id,
|
||||
QuestionId=x.QuestionId,
|
||||
}).ToList();
|
||||
|
||||
List<ClinicalAnswerRowInfo> clinicalAnswerRowInfos = new List<ClinicalAnswerRowInfo>();
|
||||
|
||||
List<ClinicalTableAnswer> clinicalTableAnswers = new List<ClinicalTableAnswer>();
|
||||
|
||||
inDto.TableQuestionAnswerList.ForEach(x => {
|
||||
var questionid = x.QuestionId;
|
||||
|
||||
for (int i = 0; i < x.TableQuestionAnswers.Count(); i++)
|
||||
{
|
||||
var rowInfo = new ClinicalAnswerRowInfo()
|
||||
{
|
||||
Id = NewId.NextGuid(),
|
||||
SubjectId = inDto.SubjectId,
|
||||
ClinicalFormId = clinicalForm.Id,
|
||||
QuestionId = questionid,
|
||||
RowIndex = i+1,
|
||||
};
|
||||
clinicalAnswerRowInfos.Add(rowInfo);
|
||||
|
||||
x.TableQuestionAnswers[i].ForEach(y => {
|
||||
|
||||
clinicalTableAnswers.Add(new ClinicalTableAnswer()
|
||||
{
|
||||
Answer=y.Answer,
|
||||
ClinicalFormId= clinicalForm.Id,
|
||||
QuestionId= questionid,
|
||||
RowId= rowInfo.Id,
|
||||
TableQuestionId=y.TableQuestionId,
|
||||
SubjectId= inDto.SubjectId,
|
||||
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
if (inDto.ClinicalFormId != null)
|
||||
{
|
||||
await _clinicalFormRepository.BatchDeleteNoTrackingAsync(x => x.Id == inDto.ClinicalFormId);
|
||||
await _clinicalQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
|
||||
await _clinicalAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
|
||||
await _clinicalTableAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
|
||||
}
|
||||
|
||||
await _clinicalFormRepository.AddAsync(clinicalForm);
|
||||
await _clinicalQuestionAnswerRepository.AddRangeAsync(clinicalQuestionAnswers);
|
||||
await _clinicalAnswerRowInfoRepository.AddRangeAsync(clinicalAnswerRowInfos);
|
||||
await _clinicalTableAnswerRepository.AddRangeAsync(clinicalTableAnswers);
|
||||
await _clinicalTableAnswerRepository.SaveChangesAsync();
|
||||
return ResponseOutput.Ok(true);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,9 @@
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using MassTransit;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
@@ -11,7 +14,7 @@ namespace IRaCIS.Application.Services
|
||||
[ApiExplorerSettings(GroupName = "Reading")]
|
||||
public class ClinicalDataSetService : BaseService
|
||||
{
|
||||
|
||||
public IClinicalQuestionService _iClinicalQuestionService;
|
||||
public IRepository<SubjectVisit> _subjectVisitRepository;
|
||||
|
||||
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
|
||||
@@ -19,22 +22,28 @@ namespace IRaCIS.Application.Services
|
||||
private readonly IRepository<PreviousPDF> _previousPDFRepository;
|
||||
private readonly IRepository<Dictionary> _dictionaryRepository;
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
|
||||
private readonly IRepository<TrialClinicalQuestion> _trialClinicalQuestionRepository;
|
||||
|
||||
private readonly IRepository<SystemClinicalQuestion> _systemClinicalQuestionRepository;
|
||||
|
||||
public ClinicalDataSetService(IRepository<SubjectVisit> subjectVisitRepository,
|
||||
|
||||
IClinicalQuestionService iClinicalQuestionService,
|
||||
IRepository<ClinicalDataTrialSet> ClinicalDataTrialSetRepository,
|
||||
IRepository<ClinicalDataSystemSet> ClinicalDataSystemSetRepository,
|
||||
IRepository<PreviousPDF> previousPDFRepository,
|
||||
IRepository<Dictionary> dictionaryRepository,
|
||||
IRepository<Trial> trialRepository
|
||||
IRepository<TrialClinicalQuestion> trialClinicalQuestionRepository,
|
||||
IRepository<SystemClinicalQuestion> systemClinicalQuestionRepository,
|
||||
|
||||
IRepository<Trial> trialRepository
|
||||
|
||||
|
||||
)
|
||||
{
|
||||
|
||||
_iClinicalQuestionService = iClinicalQuestionService;
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
|
||||
_trialClinicalQuestionRepository = trialClinicalQuestionRepository;
|
||||
_systemClinicalQuestionRepository = systemClinicalQuestionRepository;
|
||||
_clinicalDataTrialSetRepository = ClinicalDataTrialSetRepository;
|
||||
_clinicalDataSystemSetRepository = ClinicalDataSystemSetRepository;
|
||||
this._previousPDFRepository = previousPDFRepository;
|
||||
@@ -43,6 +52,69 @@ namespace IRaCIS.Application.Services
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 应用系统临床数据
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> ApplySystemClinical(ApplySystemClinicalInDto inDto)
|
||||
{
|
||||
|
||||
var isNeedVerify = await _clinicalDataSystemSetRepository.AnyAsync(x => x.Id == inDto.SystemClinicalId && (x.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataLevel == ClinicalLevel.OncologyRead)
|
||||
&& x.ClinicalUploadType == ClinicalUploadType.Structuring && x.UploadRole == UploadRole.CRC
|
||||
);
|
||||
|
||||
|
||||
if (_systemClinicalQuestionRepository.Where(x => isNeedVerify&& x.SystemClinicalId == inDto.SystemClinicalId && x.IsCheckDate).Count() != 1)
|
||||
{
|
||||
throw new BusinessValidationFailedException(_localizer["ClinicalDataSet_Apply"]);
|
||||
|
||||
}
|
||||
|
||||
await _clinicalDataSystemSetRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.SystemClinicalId, x => new ClinicalDataSystemSet()
|
||||
{
|
||||
IsApply = true
|
||||
});
|
||||
|
||||
|
||||
await _clinicalDataSystemSetRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用项目临床数据
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> ApplyTrialClinical(ApplyTrialClinicalInDto inDto)
|
||||
{
|
||||
|
||||
var isNeedVerify = await _clinicalDataTrialSetRepository.AnyAsync(x => x.Id == inDto.TrialClinicalId && (x.ClinicalDataLevel == ClinicalLevel.ImageRead|| x.ClinicalDataLevel==ClinicalLevel.OncologyRead)
|
||||
&& x.ClinicalUploadType == ClinicalUploadType.Structuring && x.UploadRole == UploadRole.CRC
|
||||
);
|
||||
|
||||
if (_trialClinicalQuestionRepository.Where(x => isNeedVerify&& x.TrialClinicalId == inDto.TrialClinicalId && x.IsCheckDate).Count() != 1)
|
||||
{
|
||||
throw new BusinessValidationFailedException(_localizer["ClinicalDataSet_Apply"]);
|
||||
|
||||
}
|
||||
|
||||
await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.TrialClinicalId, x => new ClinicalDataTrialSet()
|
||||
{
|
||||
IsApply = true
|
||||
});
|
||||
|
||||
|
||||
await _clinicalDataTrialSetRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok(true);
|
||||
}
|
||||
|
||||
|
||||
#region 系统
|
||||
/// <summary>
|
||||
@@ -53,7 +125,10 @@ namespace IRaCIS.Application.Services
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateClinicalDataSystemSet(ClinicalDataSystemSetAddOrEdit indto)
|
||||
{
|
||||
|
||||
if (indto.ClinicalUploadType == ClinicalUploadType.Table || indto.ClinicalUploadType == ClinicalUploadType.PDF)
|
||||
{
|
||||
indto.IsApply = true;
|
||||
}
|
||||
var dictionary = await _dictionaryRepository.Where(x => x.Parent.Code == "ClinicalDataType" && x.Code == indto.ClinicalDataSetEnum.ToString()).FirstNotNullAsync();
|
||||
indto.ClinicalDataSetName = dictionary.ValueCN;
|
||||
indto.ClinicalDataSetEnName = dictionary.Value;
|
||||
@@ -129,6 +204,12 @@ namespace IRaCIS.Application.Services
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateClinicalDataTrialSet(ClinicalDataTrialSetAddOrEdit indto)
|
||||
{
|
||||
|
||||
if (indto.ClinicalUploadType == ClinicalUploadType.Table || indto.ClinicalUploadType == ClinicalUploadType.PDF)
|
||||
{
|
||||
indto.IsApply = true;
|
||||
}
|
||||
|
||||
var existsQuery = _clinicalDataTrialSetRepository
|
||||
.WhereIf(indto.Id != null, x => x.Id != indto.Id)
|
||||
.Where(x => (x.ClinicalDataSetName == indto.ClinicalDataSetName||x.ClinicalDataSetEnName==indto.ClinicalDataSetEnName) && x.TrialId == indto.TrialId);
|
||||
@@ -260,7 +341,7 @@ namespace IRaCIS.Application.Services
|
||||
//不存在的时候,就将系统数据同步到项目临床数据配置
|
||||
if (!await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == trialId && x.SystemClinicalDataSetId != null))
|
||||
{
|
||||
var systemClinicalDataList = await _clinicalDataSystemSetRepository.AsQueryable().ToListAsync();
|
||||
var systemClinicalDataList = await _clinicalDataSystemSetRepository.Where(x=>x.IsApply).AsQueryable().ToListAsync();
|
||||
var systemIds = systemClinicalDataList.Select(x => x.Id).ToList();
|
||||
|
||||
var trialSystemClinicalDataSetIds = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialId && x.SystemClinicalDataSetId != null).Select(x => x.SystemClinicalDataSetId.Value).ToListAsync();
|
||||
@@ -285,6 +366,7 @@ namespace IRaCIS.Application.Services
|
||||
FileName = x.FileName,
|
||||
Path = x.Path,
|
||||
TrialId = trialId,
|
||||
IsApply = x.IsApply,
|
||||
|
||||
//项目不采用 标准枚举字符串的方式
|
||||
//CriterionEnumListStr=x.CriterionEnumListStr
|
||||
@@ -299,6 +381,13 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
var result = await _clinicalDataTrialSetRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
await _iClinicalQuestionService.SynchronizationQuestion(dataSets.Select(x => new SynchronizationQuestionDto()
|
||||
{
|
||||
SystemClinicalId = x.SystemClinicalDataSetId.Value,
|
||||
TrialClinicalId = x.Id,
|
||||
|
||||
}).ToList());
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -0,0 +1,527 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-15 15:06:06
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using MassTransit;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
/// <summary>
|
||||
/// 临床数据问题
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "Reading")]
|
||||
public class ClinicalQuestionService : BaseService, IClinicalQuestionService
|
||||
{
|
||||
|
||||
private readonly IRepository<TrialClinicalQuestion> _trialClinicalQuestionRepository;
|
||||
|
||||
private readonly IRepository<SystemClinicalQuestion> _systemClinicalQuestionRepository;
|
||||
|
||||
|
||||
private readonly IRepository<SystemClinicalTableQuestion> _systemClinicalTableQuestionRepository;
|
||||
|
||||
private readonly IRepository<TrialClinicalTableQuestion> _trialClinicalTableQuestionRepository;
|
||||
|
||||
public ClinicalQuestionService(IRepository<TrialClinicalQuestion> trialClinicalQuestionRepository,
|
||||
IRepository<SystemClinicalTableQuestion> systemClinicalTableQuestionRepository,
|
||||
IRepository<TrialClinicalTableQuestion> trialClinicalTableQuestionRepository,
|
||||
IRepository<SystemClinicalQuestion> systemClinicalQuestionRepository
|
||||
)
|
||||
{
|
||||
_systemClinicalTableQuestionRepository = systemClinicalTableQuestionRepository;
|
||||
_trialClinicalQuestionRepository = trialClinicalQuestionRepository;
|
||||
_trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository;
|
||||
_systemClinicalQuestionRepository = systemClinicalQuestionRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统临床数据预览
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<(List<ClinicalQuestionPreviewDto>, bool)> GetSystemClinicalQuestionPreview(GetSystemClinicalQuestionPreviewDto inDto)
|
||||
{
|
||||
var questions = await _systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId)
|
||||
.ProjectTo<ClinicalQuestionPreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var tableQuestions= await _systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId)
|
||||
.ProjectTo<ClinicalTablePreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
|
||||
var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList();
|
||||
|
||||
result.ForEach(x =>
|
||||
{
|
||||
this.FindChildQuestion(x, questions, tableQuestions, new List<ClinicalFormQuestionAnswer>(), new List<ClinicalFormTableQuestionAnswer>());
|
||||
});
|
||||
|
||||
return (result, true);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目临床数据预览
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<(List<ClinicalQuestionPreviewDto>, bool)> GetTrialClinicalQuestionPreview(GetTrialClinicalQuestionPreviewDto inDto)
|
||||
{
|
||||
var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId)
|
||||
.ProjectTo<ClinicalQuestionPreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var tableQuestions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId)
|
||||
.ProjectTo<ClinicalTablePreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
|
||||
var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList();
|
||||
|
||||
result.ForEach(x =>
|
||||
{
|
||||
this.FindChildQuestion(x, questions, tableQuestions,new List<ClinicalFormQuestionAnswer> (),new List<ClinicalFormTableQuestionAnswer>());
|
||||
});
|
||||
|
||||
return (result, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取子元素
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <param name="questions"></param>
|
||||
/// <param name="tableQuestions"></param>
|
||||
public void FindChildQuestion(ClinicalQuestionPreviewDto item, List<ClinicalQuestionPreviewDto> questions, List<ClinicalTablePreviewDto> tableQuestions,List<ClinicalFormQuestionAnswer> answers, List<ClinicalFormTableQuestionAnswer> tableAnswers)
|
||||
{
|
||||
item.Childrens = questions.Where(x => (x.ParentId == item.Id)||(x.GroupId== item.Id&&x.ParentId==null)).ToList();
|
||||
item.Answer = answers.Where(x => x.QuestionId == item.Id).Select(x => x.Answer).FirstOrDefault()??string.Empty;
|
||||
|
||||
var tableIndexs = tableAnswers.Where(x => x.QuestionId == item.Id).Select(x => x.RowIndex).Distinct().OrderBy(x=>x).ToList();
|
||||
|
||||
item.TableAnswer = new List<Dictionary<Guid, string>>();
|
||||
|
||||
tableIndexs.ForEach(x =>
|
||||
{
|
||||
item.TableAnswer.Add(tableAnswers.Where(y => y.RowIndex == x).ToDictionary(y => y.TableQuestionId, y => y.Answer));
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
item.TableQuestions = tableQuestions.Where(x => x.QuestionId == item.Id).OrderBy(x=>x.ShowOrder).ToList();
|
||||
|
||||
item.Childrens.ForEach(x => {
|
||||
this.FindChildQuestion(x, questions, tableQuestions, answers, tableAnswers);
|
||||
});
|
||||
}
|
||||
|
||||
#region 项目问题
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目临床问题
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<TrialClinicalQuestionDto>> GetTrialClinicalQuestionList(TrialClinicalQuestionQuery inQuery)
|
||||
{
|
||||
|
||||
var trialClinicalQuestionQueryable = _trialClinicalQuestionRepository.Where(x=>x.TrialClinicalId==inQuery.TrialClinicalId)
|
||||
.WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName))
|
||||
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider);
|
||||
var pageList = await trialClinicalQuestionQueryable
|
||||
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialClinicalQuestion.ShowOrder) : inQuery.SortField,
|
||||
inQuery.Asc);
|
||||
return pageList;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 新增或者修改项目临床问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateTrialClinicalQuestion(TrialClinicalQuestionDto inDto)
|
||||
{
|
||||
if (await _trialClinicalQuestionRepository.AnyAsync(x =>x.TrialClinicalId==inDto.TrialClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
|
||||
{
|
||||
return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
|
||||
}
|
||||
|
||||
var entity = await _trialClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true);
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除项目临床数据问题
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteTrialClinicalQuestion(Guid id)
|
||||
{
|
||||
var success = await _trialClinicalQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目问题分组
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<TrialClinicalQuestionDto>> GetTrialClinicalGroupQuestionList(GetTrialGroupDto inDto)
|
||||
{
|
||||
return await this._trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId&&x.ClinicalQuestionType== "group")
|
||||
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目标准其他问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<TrialClinicalQuestionDto>> GetTrialClinicalOtherQuestionList(GetTrialGroupDto inDto)
|
||||
{
|
||||
var types = new List<string>()
|
||||
{
|
||||
"select","radio"
|
||||
};
|
||||
return await this._trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId && types.Contains( x.ClinicalQuestionType))
|
||||
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 系统问题
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统临床问题
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<SystemClinicalQuestionDto>> GetSystemClinicalQuestionList(SystemClinicalQuestionQuery inQuery)
|
||||
{
|
||||
|
||||
var systemClinicalQuestionQueryable = _systemClinicalQuestionRepository
|
||||
.WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName))
|
||||
.ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider);
|
||||
var pageList = await systemClinicalQuestionQueryable
|
||||
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(SystemClinicalQuestion.ShowOrder) : inQuery.SortField,
|
||||
inQuery.Asc);
|
||||
return pageList;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 新增或者修改系统临床问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateSystemClinicalQuestion(SystemClinicalQuestionDto inDto)
|
||||
{
|
||||
|
||||
if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
|
||||
{
|
||||
return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
|
||||
}
|
||||
var entity = await _systemClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true);
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 删除系统临床数据问题
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteSystemClinicalQuestion(Guid id)
|
||||
{
|
||||
var success = await _systemClinicalQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统问题分组
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<SystemClinicalQuestionDto>> GetSystemClinicalGroupQuestionList(GetSystemGroupDto inDto)
|
||||
{
|
||||
return await this._systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && x.ClinicalQuestionType =="group")
|
||||
.ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统其他问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<SystemClinicalQuestionDto>> GetSystemClinicalOtherQuestionList(GetSystemGroupDto inDto)
|
||||
{
|
||||
var types = new List<string>()
|
||||
{
|
||||
"select","radio"
|
||||
};
|
||||
return await this._systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && types.Contains(x.ClinicalQuestionType))
|
||||
.ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 系统表格问题
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统表格问题
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<SystemClinicalTableQuestionDto>> GetSystemClinicalTableQuestionList(SystemClinicalTableQuestionQuery inQuery)
|
||||
{
|
||||
|
||||
var systemClinicalTableQuestionQueryable = this._systemClinicalTableQuestionRepository
|
||||
.Where(x => x.QuestionId == inQuery.QuestionId)
|
||||
.ProjectTo<SystemClinicalTableQuestionDto>(_mapper.ConfigurationProvider);
|
||||
|
||||
var pageList = await systemClinicalTableQuestionQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(SystemClinicalTableQuestion.ShowOrder) : inQuery.SortField,
|
||||
inQuery.Asc);
|
||||
|
||||
return pageList;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 新增或修改系统表格问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateSystemClinicalTableQuestion(SystemClinicalTableQuestionDto inDto)
|
||||
{
|
||||
if (await _systemClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
|
||||
{
|
||||
return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
|
||||
}
|
||||
|
||||
var entity = await _systemClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true);
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除系统表格问题
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteSystemClinicalTableQuestion(Guid id)
|
||||
{
|
||||
var success = await _systemClinicalTableQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 项目表格问题
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目表格问题
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<TrialClinicalTableQuestionDto>> GetTrialClinicalTableQuestionList(TrialClinicalTableQuestionQuery inQuery)
|
||||
{
|
||||
|
||||
var trialClinicalTableQuestionQueryable = this._trialClinicalTableQuestionRepository
|
||||
.Where(x => x.QuestionId == inQuery.QuestionId)
|
||||
.ProjectTo<TrialClinicalTableQuestionDto>(_mapper.ConfigurationProvider);
|
||||
|
||||
var pageList = await trialClinicalTableQuestionQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialClinicalTableQuestion.ShowOrder) : inQuery.SortField,
|
||||
inQuery.Asc);
|
||||
|
||||
return pageList;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 新增或修改项目表格问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateTrialClinicalTableQuestion(TrialClinicalTableQuestionDto inDto)
|
||||
{
|
||||
if (await _trialClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
|
||||
{
|
||||
return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
|
||||
}
|
||||
var entity = await _trialClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true);
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除项目表格问题
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteTrialClinicalTableQuestion(Guid id)
|
||||
{
|
||||
var success = await _trialClinicalTableQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 同步系统问题
|
||||
|
||||
/// <summary>
|
||||
/// 同步系统问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task SynchronizationQuestion(List<SynchronizationQuestionDto> inDto)
|
||||
{
|
||||
var trialClinicalId = inDto.Select(x => x.TrialClinicalId).ToList();
|
||||
|
||||
var systemClinicalId = inDto.Select(x => x.SystemClinicalId).ToList();
|
||||
var questionRelationList =await _trialClinicalQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic()
|
||||
{
|
||||
SystemQuestionId=x.SystemClinicalQuestionId?? default(Guid),
|
||||
TrialQuestionId=x.Id,
|
||||
TrialClinicalId=x.TrialClinicalId,
|
||||
}).ToListAsync();
|
||||
|
||||
var tableQuestionRelationList = await _trialClinicalTableQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic()
|
||||
{
|
||||
SystemQuestionId = x.SystemTableQuestionId ?? default(Guid),
|
||||
TrialQuestionId = x.Id,
|
||||
TrialClinicalId = x.TrialClinicalId,
|
||||
}).ToListAsync();
|
||||
|
||||
var newTrialQuestionAll = await _systemClinicalQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId))
|
||||
.ProjectTo<TrialClinicalQuestionSynchronize>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var newTrialTableQuestionAll = await _systemClinicalTableQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId))
|
||||
.ProjectTo<TrialClinicalTableQuestionSynchronize>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
|
||||
List<TrialClinicalQuestion> addTrialDataList = new List<TrialClinicalQuestion>();
|
||||
List<TrialClinicalTableQuestion> addTrialTableList = new List<TrialClinicalTableQuestion>();
|
||||
foreach (var item in inDto)
|
||||
{
|
||||
var questionRelation = questionRelationList.Where(x=>x.TrialClinicalId==item.TrialClinicalId).ToDictionary(
|
||||
x => x.SystemQuestionId,
|
||||
x => x.TrialQuestionId
|
||||
);
|
||||
|
||||
var newTrialQuestionList = newTrialQuestionAll.Where(x => x.SystemClinicalId == item.SystemClinicalId).ToList();
|
||||
newTrialQuestionList.ForEach(x =>
|
||||
{
|
||||
if (questionRelation.ContainsKey(x.Id))
|
||||
{
|
||||
x.Id = questionRelation[x.Id];
|
||||
}
|
||||
else
|
||||
{
|
||||
var newid = NewId.NextGuid();
|
||||
questionRelation.Add(x.Id, newid);
|
||||
x.Id = newid;
|
||||
}
|
||||
|
||||
x.TrialClinicalId = item.TrialClinicalId;
|
||||
});
|
||||
|
||||
var copyNewQuestionList = newTrialQuestionList.Clone();
|
||||
foreach (var x in newTrialQuestionList)
|
||||
{
|
||||
var question = x.Clone();
|
||||
if (question.ParentId != null)
|
||||
{
|
||||
question.ParentId = questionRelation[question.ParentId ?? default(Guid)];
|
||||
}
|
||||
if (question.GroupId != null)
|
||||
{
|
||||
question.GroupId = questionRelation[question.GroupId ?? default(Guid)];
|
||||
}
|
||||
addTrialDataList.Add(question);
|
||||
};
|
||||
|
||||
|
||||
|
||||
var tableQuestionRelation = tableQuestionRelationList.Where(x => x.TrialClinicalId == item.TrialClinicalId).ToDictionary(
|
||||
x => x.SystemQuestionId,
|
||||
x => x.TrialQuestionId
|
||||
);
|
||||
|
||||
var newTrialTableQuestionList = newTrialTableQuestionAll.Where(x => x.SystemClinicalId == item.SystemClinicalId)
|
||||
.ToList();
|
||||
|
||||
|
||||
newTrialTableQuestionList.ForEach(x =>
|
||||
{
|
||||
if (tableQuestionRelation.ContainsKey(x.Id))
|
||||
{
|
||||
x.Id = tableQuestionRelation[x.Id];
|
||||
}
|
||||
else
|
||||
{
|
||||
var newid = NewId.NextGuid();
|
||||
tableQuestionRelation.Add(x.Id, newid);
|
||||
x.Id = newid;
|
||||
}
|
||||
});
|
||||
|
||||
foreach (var x in newTrialTableQuestionList)
|
||||
{
|
||||
var tableQuestion = x.Clone();
|
||||
tableQuestion.TrialClinicalId = item.TrialClinicalId;
|
||||
|
||||
tableQuestion.QuestionId = copyNewQuestionList.Where(y => y.SystemClinicalQuestionId == x.QuestionId).Select(y => y.Id).FirstOrDefault();
|
||||
|
||||
|
||||
addTrialTableList.Add(tableQuestion);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
await _trialClinicalQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId));
|
||||
await _trialClinicalQuestionRepository.AddRangeAsync(addTrialDataList);
|
||||
await _trialClinicalTableQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId) );
|
||||
await _trialClinicalTableQuestionRepository.AddRangeAsync(addTrialTableList);
|
||||
await _trialClinicalQuestionRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
+44
-24
@@ -383,35 +383,55 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
}
|
||||
|
||||
Expression<Func<VisitTask, bool>> visitTaskLambda = x => x.TrialId == trialId && x.SubjectId == subjectId && x.TrialReadingCriterionId == trialReadingCritrialId;
|
||||
|
||||
|
||||
|
||||
|
||||
//维护 IsFrontTaskNeedSignButNotSign 在添加任务哪里用触发器也维护了
|
||||
var visitTaskIdQueryable = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务
|
||||
//小于自己任务号的任务 存在需要签名 但是没签名
|
||||
.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)
|
||||
&& t.IsFrontTaskNeedSignButNotSign == false )
|
||||
.Select(t => t.Id);
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable.Contains(t.Id), u => new VisitTask()
|
||||
//有序阅片才维护 IsFrontTaskNeedSignButNotSign 这个状态
|
||||
if (_readingQuestionCriterionTrialRepository.Any(t=>t.Id==trialReadingCritrialId && t.IsReadingTaskViewInOrder == true))
|
||||
{
|
||||
IsFrontTaskNeedSignButNotSign = true
|
||||
});
|
||||
|
||||
|
||||
Expression<Func<VisitTask, bool>> visitTaskLambda = x => x.TrialId == trialId && x.SubjectId == subjectId && x.TrialReadingCriterionId == trialReadingCritrialId;
|
||||
|
||||
|
||||
//维护 IsFrontTaskNeedSignButNotSign 在添加任务哪里用触发器也维护了
|
||||
var visitTaskIdQueryable = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务
|
||||
//小于自己任务号的任务 存在需要签名 但是没签名
|
||||
.Where(t => t.IsFrontTaskNeedSignButNotSign == false &&
|
||||
|
||||
(t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)
|
||||
|
||||
// 前序存在 未一致性核查未通过的
|
||||
|| t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum>sv.VisitNum)
|
||||
|
||||
))
|
||||
.Select(t => t.Id);
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable.Contains(t.Id), u => new VisitTask()
|
||||
{
|
||||
IsFrontTaskNeedSignButNotSign = true
|
||||
});
|
||||
|
||||
|
||||
|
||||
var visitTaskIdQueryable2 = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务
|
||||
//小于自己任务号的任务 存在需要签名 但是没签名
|
||||
.Where(t => !t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)
|
||||
&& t.IsFrontTaskNeedSignButNotSign == true )
|
||||
.Select(t => t.Id);
|
||||
var visitTaskIdQueryable2 = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务
|
||||
|
||||
.Where(t => t.IsFrontTaskNeedSignButNotSign == true &&
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable2.Contains(t.Id), u => new VisitTask()
|
||||
{
|
||||
IsFrontTaskNeedSignButNotSign = false
|
||||
});
|
||||
//前序任务 不存在需要签名 但是没签名
|
||||
!t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)
|
||||
|
||||
// 前序 不存在 未一致性核查未通过的
|
||||
&& !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)
|
||||
)
|
||||
.Select(t => t.Id);
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable2.Contains(t.Id), u => new VisitTask()
|
||||
{
|
||||
IsFrontTaskNeedSignButNotSign = false
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
{
|
||||
|
||||
public class AutoAddClinicalInDto
|
||||
{
|
||||
public Guid? SubjectId { get; set; }
|
||||
|
||||
//public Guid? VisitId { get; set; }
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class GetCRCSubjectClinicalInDto
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class GetCRCSubjectClinicalOutDto
|
||||
{
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
public string SubjectCode { get; set; }
|
||||
public Guid ClinicalDataTrialSetId { get; set; }
|
||||
|
||||
public string ClinicalDataSetName { get; set; }
|
||||
|
||||
public string ClinicalDataSetEnName { get; set; }
|
||||
|
||||
public int ClinicalCount { get; set; } = 0;
|
||||
}
|
||||
|
||||
|
||||
public class GetCRCSubjectClinicalResultDto
|
||||
{
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
public string SubjectCode { get; set; }
|
||||
|
||||
public List<GetCRCSubjectClinicalOutDto> ClinicalDataList { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public class GetClinicalQuestionAnswerListInDto
|
||||
{
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
public Guid ClinicalDataTrialSetId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class GetClinicalQuestionAnswerListOutDto
|
||||
{
|
||||
public List<TrialClinicalQuestionDto> QuestionList { get; set; }
|
||||
|
||||
public List<Dictionary<string, string>> AnswerList { get; set; }
|
||||
}
|
||||
|
||||
public class GetClinicalFormInfoInDto
|
||||
{
|
||||
public Guid ClinicalFormId { get; set; }
|
||||
}
|
||||
|
||||
public class GetClinicalFormInfoOutDto
|
||||
{
|
||||
public List<ClinicalQuestionPreviewDto> Question { get; set; }
|
||||
}
|
||||
|
||||
public class ClinicalFormQuestionAnswer
|
||||
{
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
public string Answer { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class ClinicalFormTableQuestionAnswer
|
||||
{
|
||||
public Guid TableQuestionId { get; set; }
|
||||
|
||||
public int RowIndex { get; set; }
|
||||
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
public string Answer { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class SubmitClinicalFormInDto
|
||||
{
|
||||
/// <summary>
|
||||
/// VisitId
|
||||
/// </summary>
|
||||
public Guid? VisitId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// VisitId
|
||||
/// </summary>
|
||||
public Guid? ReadingId { get; set; }
|
||||
|
||||
public Guid? ClinicalFormId { get; set; }
|
||||
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
public Guid ClinicalDataTrialSetId { get; set; }
|
||||
|
||||
|
||||
public List<ClinicalFormQuestionAnswer> QuestionAnswers { get; set; }
|
||||
|
||||
public List<ClinicalQuestionForm> TableQuestionAnswerList { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class ClinicalQuestionForm
|
||||
{
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
public List<List<ClinicalTableQuestionForm>> TableQuestionAnswers { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class ClinicalTableQuestionForm
|
||||
{
|
||||
public Guid TableQuestionId { get; set; }
|
||||
|
||||
public string Answer { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否应用
|
||||
/// </summary>
|
||||
public bool IsApply { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 名称
|
||||
@@ -73,10 +77,23 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
//public List<int> CriterionEnumList { get; set; }
|
||||
}
|
||||
|
||||
public class ApplySystemClinicalInDto
|
||||
{
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
|
||||
public class ApplyTrialClinicalInDto
|
||||
{
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
}
|
||||
public class ClinicalDataSystemSetAddOrEdit
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否应用
|
||||
/// </summary>
|
||||
public bool IsApply { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 枚举
|
||||
|
||||
@@ -0,0 +1,453 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
{
|
||||
|
||||
#region 预览
|
||||
|
||||
|
||||
public class GetSystemClinicalQuestionPreviewDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
|
||||
public class GetTrialClinicalQuestionPreviewDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 项目临床数据Id
|
||||
/// </summary>
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 项目预览问题Dto
|
||||
/// </summary>
|
||||
public class ClinicalQuestionPreviewDto : TrialClinicalQuestionDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
|
||||
public string Answer { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 子问题
|
||||
/// </summary>
|
||||
public List<ClinicalQuestionPreviewDto> Childrens { get; set; } = new List<ClinicalQuestionPreviewDto>();
|
||||
|
||||
/// <summary>
|
||||
/// 表格问题
|
||||
/// </summary>
|
||||
public List<ClinicalTablePreviewDto> TableQuestions { get; set; } = new List<ClinicalTablePreviewDto>();
|
||||
|
||||
public List<Dictionary<Guid,string>> TableAnswer { get; set; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 项目临床数据问题
|
||||
/// </summary>
|
||||
public class ClinicalTablePreviewDto : TrialClinicalTableQuestionDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 外层问题
|
||||
/// <summary>
|
||||
/// 临床问题基本信息
|
||||
/// </summary>
|
||||
public class ClinicalQuestionBase
|
||||
{
|
||||
/// <summary>
|
||||
/// Id
|
||||
/// </summary>
|
||||
public Guid? Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题名称
|
||||
/// </summary>
|
||||
public string QuestionName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 问题英文名称
|
||||
/// </summary>
|
||||
public string QuestionEnName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 临床问题类型(分组,单选。)
|
||||
/// </summary>
|
||||
public string ClinicalQuestionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题标识
|
||||
/// </summary>
|
||||
public ClinicalQuestionMark? ClinicalQuestionMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最大长度
|
||||
/// </summary>
|
||||
public int? MaxAnswerLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据选项类型(无,自定义)
|
||||
/// </summary>
|
||||
public ClinicalOptionType ClinicalOptionTypeEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分组Id
|
||||
/// </summary>
|
||||
public Guid? GroupId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义选项
|
||||
/// </summary>
|
||||
public string TypeValue { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 字典Code
|
||||
/// </summary>
|
||||
public string DictionaryCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 排序
|
||||
/// </summary>
|
||||
public int ShowOrder { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 是否必填
|
||||
/// </summary>
|
||||
public bool IsRequired { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 父问题Id
|
||||
/// </summary>
|
||||
public Guid? ParentId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 父问题触发值
|
||||
/// </summary>
|
||||
public string ParentTriggerValue { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 显示类型
|
||||
/// </summary>
|
||||
public ClinicalQuestionShow ClinicalQuestionShowEnum { get; set; } = ClinicalQuestionShow.Show;
|
||||
|
||||
/// <summary>
|
||||
/// 是否是检查日期
|
||||
/// </summary>
|
||||
public bool IsCheckDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 小数点位数
|
||||
/// </summary>
|
||||
public int? DigitPlaces { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询临床数据基类
|
||||
/// </summary>
|
||||
public class ClinicalQuestionQueryBase : PageInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 问题名称
|
||||
/// </summary>
|
||||
public string QuestionName { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目临床数据
|
||||
/// </summary>
|
||||
public class TrialClinicalQuestionQuery : ClinicalQuestionQueryBase
|
||||
{
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目分组
|
||||
/// </summary>
|
||||
public class GetTrialGroupDto
|
||||
{
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 项目临床数据问题
|
||||
/// </summary>
|
||||
public class TrialClinicalQuestionDto : ClinicalQuestionBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 项目临床数据Id
|
||||
/// </summary>
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义计算标记
|
||||
/// </summary>
|
||||
public ClinicalCalculateMark? ClinicalCalculateMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义计算问题
|
||||
/// </summary>
|
||||
public string CalculateQuestions { get; set; } = "[]";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统临床数据
|
||||
/// </summary>
|
||||
public class SystemClinicalQuestionQuery : ClinicalQuestionQueryBase
|
||||
{
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 系统临床数据问题
|
||||
/// </summary>
|
||||
public class SystemClinicalQuestionDto : ClinicalQuestionBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统分组
|
||||
/// </summary>
|
||||
public class GetSystemGroupDto
|
||||
{
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 表格问题
|
||||
public class ClinicalTableQuestionBase
|
||||
|
||||
{
|
||||
|
||||
public Guid? Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题名称
|
||||
/// </summary>
|
||||
public string QuestionName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 问题英文名称
|
||||
/// </summary>
|
||||
public string QuestionEnName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 临床问题类型(分组,单选。)
|
||||
/// </summary>
|
||||
public string ClinicalTableQuestionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题标识
|
||||
/// </summary>
|
||||
public ClinicalTableQuestionMark? ClinicalTableQuestionMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最大长度
|
||||
/// </summary>
|
||||
public int? MaxAnswerLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据选项类型(无,自定义)
|
||||
/// </summary>
|
||||
public ClinicalOptionType ClinicalOptionTypeEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义选项
|
||||
/// </summary>
|
||||
public string TypeValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 字典Code
|
||||
/// </summary>
|
||||
public string DictionaryCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 排序
|
||||
/// </summary>
|
||||
public int ShowOrder { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否必填
|
||||
/// </summary>
|
||||
public bool IsRequired { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 外层问题Id
|
||||
/// </summary>
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 小数点位数
|
||||
/// </summary>
|
||||
public int? DigitPlaces { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 项目临床数据问题
|
||||
/// </summary>
|
||||
public class TrialClinicalTableQuestionDto : ClinicalTableQuestionBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 项目临床数据Id
|
||||
/// </summary>
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义计算标记
|
||||
/// </summary>
|
||||
public ClinicalCalculateMark? ClinicalCalculateMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义计算问题
|
||||
/// </summary>
|
||||
public string CalculateQuestions { get; set; } = "[]";
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 系统临床数据问题
|
||||
/// </summary>
|
||||
public class SystemClinicalTableQuestionDto : ClinicalTableQuestionBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 查询临床数据基类
|
||||
/// </summary>
|
||||
public class ClinicalTableQuestionQueryBase : PageInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 问题名称
|
||||
/// </summary>
|
||||
public string QuestionName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 外层问题Id
|
||||
/// </summary>
|
||||
public Guid QuestionId { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目临床数据
|
||||
/// </summary>
|
||||
public class TrialClinicalTableQuestionQuery : ClinicalTableQuestionQueryBase
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统临床数据
|
||||
/// </summary>
|
||||
public class SystemClinicalTableQuestionQuery : ClinicalTableQuestionQueryBase
|
||||
{
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 同步临床数据
|
||||
|
||||
|
||||
public class TrialClinicalTableQuestionSynchronize : TrialClinicalTableQuestion
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
|
||||
public class TrialClinicalQuestionSynchronize : TrialClinicalQuestion
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class SynchronizationQuestionDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 项目临床数据Id
|
||||
/// </summary>
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class QuestionDic
|
||||
{
|
||||
public Guid SystemQuestionId { get; set; }
|
||||
|
||||
public Guid TrialQuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 项目临床数据Id
|
||||
/// </summary>
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -79,6 +79,14 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public Guid Id { get; set; }
|
||||
}
|
||||
|
||||
public class BatchDeteteCriterionMedicineQuestionInDto
|
||||
{
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
public List<Guid> Ids { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class TrialDataFromSystem : ReadingMedicineTrialQuestion
|
||||
{
|
||||
public Guid SystemQuestionId { get; set; }
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2022-08-12 14:07:43
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
namespace IRaCIS.Core.Application.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// IClinicalQuestionService
|
||||
/// </summary>
|
||||
public interface IClinicalQuestionService
|
||||
{
|
||||
|
||||
|
||||
Task SynchronizationQuestion(List<SynchronizationQuestionDto> inDto);
|
||||
|
||||
|
||||
void FindChildQuestion(ClinicalQuestionPreviewDto item, List<ClinicalQuestionPreviewDto> questions, List<ClinicalTablePreviewDto> tableQuestions, List<ClinicalFormQuestionAnswer> answers, List<ClinicalFormTableQuestionAnswer> tableAnswers);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+19
-6
@@ -452,13 +452,26 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量删除项目标准医学审核问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> BatchDeteteCriterionMedicineQuestion(BatchDeteteCriterionMedicineQuestionInDto inDto)
|
||||
{
|
||||
await _readingMedicineTrialQuestionRepository.BatchDeleteNoTrackingAsync(x => inDto.Ids.Contains(x.Id));
|
||||
var result= await _readingMedicineTrialQuestionRepository.SaveChangesAsync();
|
||||
return ResponseOutput.Result(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从系统里面选择问题添加到项目里面
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
|
||||
/// <summary>
|
||||
/// 从系统里面选择问题添加到项目里面
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddTrialDataFromSystem(AddTrialDataFromSystemInDto inDto)
|
||||
{
|
||||
// 直接写??
|
||||
|
||||
@@ -980,7 +980,7 @@ namespace IRaCIS.Application.Services
|
||||
x.TrialId = trialCriterion.TrialId;
|
||||
});
|
||||
var copyNewQuestionList = newTrialQuestionList.Clone();
|
||||
var trialQuestionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialCriterion.Id).ToListAsync();
|
||||
// var trialQuestionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialCriterion.Id).ToListAsync();
|
||||
var needAddDatas = new List<ReadingQuestionTrial>();
|
||||
|
||||
foreach (var x in newTrialQuestionList)
|
||||
|
||||
+3
-3
@@ -107,7 +107,7 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
qusetionList = qusetionList.Where(x => x.ReadingCriterionPageId == null).ToList();
|
||||
|
||||
groupList = qusetionList.Where(x => x.Type == ReadingQestionType.Group || (x.ParentId == null && x.GroupName.IsNullOrEmpty())).ToList();
|
||||
groupList = qusetionList.Where(x => x.Type == ReadingQestionType.Group || (x.ParentId == null && x.GroupId==null)).ToList();
|
||||
groupList.ForEach(x =>
|
||||
{
|
||||
this.FindChildQuestion(x, qusetionList, tableQuestionList);
|
||||
@@ -152,7 +152,7 @@ namespace IRaCIS.Application.Services
|
||||
TrialId = data.TrialId,
|
||||
Type = data.Type,
|
||||
ParentTriggerValue = data.ParentTriggerValue,
|
||||
GroupName = data.GroupName,
|
||||
GroupName = data.GroupName.LanguageName(data.GroupEnName, _userInfo.IsEn_Us),
|
||||
QuestionName = data.QuestionName.LanguageName(data.QuestionEnName, _userInfo.IsEn_Us),
|
||||
IsRequired = data.IsRequired,
|
||||
ShowQuestion = data.ShowQuestion,
|
||||
@@ -196,7 +196,7 @@ namespace IRaCIS.Application.Services
|
||||
[NonDynamicMethod]
|
||||
public void FindChildQuestion(GetTrialReadingQuestionOutDto item, List<GetTrialReadingQuestionOutDto> questionlists, List<TableQuestionDataInfo> tableQuestions)
|
||||
{
|
||||
item.Childrens = questionlists.Where(x => x.ParentId == item.Id || (item.Type == ReadingQestionType.Group && x.Type != ReadingQestionType.Group && x.ParentId == null && x.GroupName == item.GroupName)).ToList();
|
||||
item.Childrens = questionlists.Where(x => x.ParentId == item.Id || (item.Type == ReadingQestionType.Group && x.Type != ReadingQestionType.Group && x.ParentId == null && x.GroupId == item.Id)).ToList();
|
||||
|
||||
|
||||
item.Childrens.AddRange(tableQuestions.Where(x => x.ReadingQuestionId == item.Id).Select(x => new GetTrialReadingQuestionOutDto
|
||||
|
||||
@@ -64,7 +64,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
AltKey = isnull ? false : key.AltKey,
|
||||
CtrlKey = isnull ? false : key.CtrlKey,
|
||||
MetaKey = isnull ? false : key.MetaKey,
|
||||
ShiftKey = isnull ? false : key.ShiftKey,
|
||||
ShiftKey = isnull && int.Parse(x.Code) == 11 ? true : isnull ? false : key.ShiftKey,
|
||||
Text = isnull ? defaultkey.Text : key.Text,
|
||||
Code = isnull ? defaultkey.Code : key.Code,
|
||||
});
|
||||
|
||||
@@ -17,6 +17,39 @@ namespace IRaCIS.Core.Application.Service
|
||||
//是否英文环境
|
||||
var isEn_Us=false;
|
||||
|
||||
#region 临床问题
|
||||
CreateMap<TrialClinicalQuestion, TrialClinicalQuestionDto>();
|
||||
CreateMap<TrialClinicalQuestionDto, TrialClinicalQuestion>();
|
||||
|
||||
CreateMap<SystemClinicalQuestion, SystemClinicalQuestionDto>();
|
||||
CreateMap<SystemClinicalQuestionDto, SystemClinicalQuestion>();
|
||||
|
||||
CreateMap<SystemClinicalTableQuestion, SystemClinicalTableQuestionDto>();
|
||||
CreateMap<SystemClinicalTableQuestionDto, SystemClinicalTableQuestion>();
|
||||
|
||||
CreateMap<TrialClinicalTableQuestion, TrialClinicalTableQuestionDto>();
|
||||
CreateMap<TrialClinicalTableQuestionDto, TrialClinicalTableQuestion>();
|
||||
|
||||
CreateMap<SystemClinicalQuestion, TrialClinicalQuestion>()
|
||||
.ForMember(d => d.SystemClinicalQuestionId, opt => opt.MapFrom(src => src.Id));
|
||||
|
||||
CreateMap<SystemClinicalQuestion, TrialClinicalQuestionSynchronize>()
|
||||
.ForMember(d => d.SystemClinicalQuestionId, opt => opt.MapFrom(src => src.Id));
|
||||
|
||||
|
||||
CreateMap<SystemClinicalTableQuestion, TrialClinicalTableQuestion>()
|
||||
.ForMember(d => d.SystemTableQuestionId, u => u.MapFrom(s => s.Id));
|
||||
CreateMap<SystemClinicalTableQuestion, TrialClinicalTableQuestionSynchronize>()
|
||||
.ForMember(d => d.SystemTableQuestionId, opt => opt.MapFrom(src => src.Id));
|
||||
|
||||
|
||||
// 预览
|
||||
CreateMap<TrialClinicalQuestion, ClinicalQuestionPreviewDto>();
|
||||
CreateMap<SystemClinicalQuestion, ClinicalQuestionPreviewDto>();
|
||||
CreateMap<SystemClinicalTableQuestion, ClinicalTablePreviewDto>();
|
||||
CreateMap<TrialClinicalTableQuestion, ClinicalTablePreviewDto>();
|
||||
#endregion
|
||||
|
||||
CreateMap<VisitTask, VisitTaskDto>();
|
||||
CreateMap<ShortcutKey, DefaultShortcutKeyView>();
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
|
||||
@@ -42,7 +43,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public int? TotalNeedSignDocCount => TotalNeedSignTrialDocCount + TotalNeedSignSystemDocCount;
|
||||
|
||||
|
||||
public int? TotalApprovalRequiredCount { get; set; }
|
||||
public int? TotalApprovalRequiredCount { get; set; }
|
||||
|
||||
|
||||
public int? TotalSystemNoticeCount { get; set; }
|
||||
@@ -56,9 +57,9 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
}
|
||||
|
||||
public class TrialSiteSurveyStat:TrialSelectDTO
|
||||
public class TrialSiteSurveyStat : TrialSelectDTO
|
||||
{
|
||||
public int? ApprovalRequiredCount { get; set; }
|
||||
public int? ApprovalRequiredCount { get; set; }
|
||||
|
||||
|
||||
|
||||
@@ -75,4 +76,312 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
}
|
||||
|
||||
|
||||
public class CheckToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class CheckToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeCheckedCount { get; set; }
|
||||
|
||||
public int? ToBeRepliedCount { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class ReReadingApplyToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ReReadingApplyToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
|
||||
|
||||
public int? ToBeApprovalCount { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class ReviewerSelectToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ReviewerSelectToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public bool IsUrgent { get; set; }
|
||||
|
||||
public int? ToBeApprovalCount { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class ReReadingApprovalToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ReReadingApprovalToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeApprovalCount { get; set; }
|
||||
}
|
||||
|
||||
public class ImageQuestionToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ImageQuestionToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeDealedCount { get; set; }
|
||||
}
|
||||
|
||||
public class IRImageReadingToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class IRImageReadingToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
public string CriterionName { get; set; }
|
||||
|
||||
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? UnReadCount { get; set; }
|
||||
|
||||
public int? HaveSignedCount { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public class MedicalCommentsToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class MedicalCommentsFirstToBeDoneQuery
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
[NotDefault]
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
}
|
||||
|
||||
public class MedicalCommentsToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
public string CriterionName { get; set; }
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeReplyedCount { get; set; }
|
||||
|
||||
public int? ToBeReviewedCount { get; set; }
|
||||
}
|
||||
|
||||
public class ImageCheckQuestionToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ImageCheckQuestionToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeReplyedCount { get; set; }
|
||||
}
|
||||
|
||||
public class ImageSubmittedToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ImageSubmittedToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeDealedCount { get; set; }
|
||||
}
|
||||
|
||||
public class ImageQualityToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ImageQualityToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeReviewedCount { get; set; }
|
||||
|
||||
public int? ToBeClaimedCount { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public class ImageReUploadToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ImageReUploadToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeReUploadCount { get; set; }
|
||||
}
|
||||
|
||||
public class ImageClinicalDataToBeDoneQuery : PageInput
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class ImageClinicalDataToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
public int? UrgentCount { get; set; }
|
||||
|
||||
public int? ToBeDealedCount { get; set; }
|
||||
}
|
||||
|
||||
public class TrialToBeDoneQuery : PageInput
|
||||
{
|
||||
public string ExperimentName { get; set; } = string.Empty;
|
||||
|
||||
public string Code { get; set; } = string.Empty;
|
||||
|
||||
public string ResearchProgramNo { get; set; } = string.Empty;
|
||||
|
||||
public Guid? SponsorId { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class TrialToBeDoneDto : TrialBaseInfoDto
|
||||
{
|
||||
|
||||
public Guid Id => TrialId;
|
||||
|
||||
public DateTime? CreateTime { get; set; }
|
||||
|
||||
public string Sponsor { get; set; }
|
||||
|
||||
public string TrialStatusStr { get; set; }
|
||||
|
||||
|
||||
public int? ExpetiedTaskCount { get; set; }
|
||||
|
||||
|
||||
public int? ReReadingApprovalCount { get; set; }
|
||||
|
||||
|
||||
public int? PendingReconciliationCount { get; set; }
|
||||
|
||||
public int? PendingResponseCount { get; set; }
|
||||
|
||||
public bool IsIQCHaveToBeDone { get; set; }
|
||||
public bool IsCRCHaveToBeDone { get; set; }
|
||||
|
||||
public bool IsMIMHaveToBeDone { get; set; }
|
||||
|
||||
|
||||
public bool IsIRHaveToBeDone { get; set; }
|
||||
|
||||
public bool IsSPMOrCPMHaveToBeDone { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class TrialUserToBeDoneQuery
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class TrialUserToBeDoneDto
|
||||
{
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string FullName { get; set; }
|
||||
|
||||
public UserTypeEnum UserType { get; set; }
|
||||
|
||||
|
||||
|
||||
|
||||
public int? ReviewerSelect_SPM_ToBeApprovalCount { get; set; }
|
||||
public int? ReviewerSelect_PM_ToBeConfirmCount { get; set; }
|
||||
|
||||
public int? ImageUpload_CRC_ToBeReUploadCount { get; set; }
|
||||
public int? ImageUpload_CRC_ToBeSubmitCount { get; set; }
|
||||
|
||||
|
||||
public int? QC_IQC_ToBeReviewedCount { get; set; }
|
||||
public int? QC_IQC_ToBeClaimedCount { get; set; }
|
||||
|
||||
public int? QC_IQC_ToBeDealedCount { get; set; }
|
||||
|
||||
public int? QC_CRC_ToBeDealedCount { get; set; }
|
||||
|
||||
|
||||
public int? Check_CRC_ToBeDealedCount { get; set; }
|
||||
|
||||
public int? Check_PM_ToBeDealedCount { get; set; }
|
||||
|
||||
public int? Check_PM_ToBeReplyedCount { get; set; }
|
||||
|
||||
public int? Reading_IR_UnReadCount { get; set; }
|
||||
|
||||
public int? Reading_SPM_ToBeApprovalCount { get; set; }
|
||||
public int? Reading_PM_ToBeApprovalCount { get; set; }
|
||||
|
||||
public int? Medical_MIM_ToBeDealedCount { get; set; }
|
||||
|
||||
public int? Medical_MIM_ToBeReviewedCount { get; set; }
|
||||
|
||||
public int? Medical_IR_ToBeDealedCount { get; set; }
|
||||
|
||||
public int UserTotalToBeDoneCount => new[]
|
||||
{
|
||||
ReviewerSelect_SPM_ToBeApprovalCount ?? 0,
|
||||
ReviewerSelect_PM_ToBeConfirmCount ?? 0,
|
||||
ImageUpload_CRC_ToBeReUploadCount ?? 0,
|
||||
ImageUpload_CRC_ToBeSubmitCount ?? 0,
|
||||
QC_IQC_ToBeReviewedCount ?? 0,
|
||||
QC_IQC_ToBeClaimedCount ?? 0,
|
||||
QC_IQC_ToBeDealedCount ?? 0,
|
||||
QC_CRC_ToBeDealedCount ?? 0,
|
||||
Check_CRC_ToBeDealedCount ?? 0,
|
||||
Check_PM_ToBeDealedCount ?? 0,
|
||||
Check_PM_ToBeReplyedCount ?? 0,
|
||||
Reading_IR_UnReadCount ?? 0,
|
||||
Reading_SPM_ToBeApprovalCount ?? 0,
|
||||
Reading_PM_ToBeApprovalCount ?? 0,
|
||||
Medical_MIM_ToBeDealedCount ?? 0,
|
||||
Medical_IR_ToBeDealedCount ?? 0,
|
||||
Medical_MIM_ToBeReviewedCount??0
|
||||
}.Sum();
|
||||
|
||||
}
|
||||
|
||||
public class TrialBaseInfoDto
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
public string ExperimentName { get; set; } = string.Empty;
|
||||
|
||||
public string TrialCode { get; set; } = string.Empty;
|
||||
|
||||
public string ResearchProgramNo { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
@@ -355,6 +355,11 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否加急
|
||||
/// </summary>
|
||||
public bool IsUrgent { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 阅片平台
|
||||
/// </summary>
|
||||
@@ -940,7 +945,13 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
/// </summary>
|
||||
public bool IsOncologyReading { get; set; }
|
||||
|
||||
public List<AddOrUpdateTrialCriterionAdditional> TrialCriterionAdditionalAssessmentTypeList { get; set; }=new List<AddOrUpdateTrialCriterionAdditional>();
|
||||
|
||||
/// <summary>
|
||||
/// 是否加急
|
||||
/// </summary>
|
||||
public bool IsUrgent { get; set; } = false;
|
||||
|
||||
public List<AddOrUpdateTrialCriterionAdditional> TrialCriterionAdditionalAssessmentTypeList { get; set; }=new List<AddOrUpdateTrialCriterionAdditional>();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -296,6 +296,7 @@ namespace IRaCIS.Application.Contracts
|
||||
public string UserName { get; set; } = string.Empty;
|
||||
|
||||
public string UserRealName { get; set; } = string.Empty;
|
||||
public string OrganizationName { get; set; } = String.Empty;
|
||||
|
||||
public UserTypeEnum? UserTypeEnum { get; set; }
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -596,6 +596,7 @@ namespace IRaCIS.Core.Application
|
||||
IsGlobalReading = inDto.IsGlobalReading,
|
||||
IsArbitrationReading = inDto.IsArbitrationReading,
|
||||
IsOncologyReading = inDto.IsOncologyReading,
|
||||
IsUrgent= inDto.IsUrgent,
|
||||
IsAdditionalAssessment = inDto.IsAdditionalAssessment,
|
||||
IsAutoCreate = inDto.IsAutoCreate
|
||||
|
||||
|
||||
@@ -100,6 +100,7 @@ namespace IRaCIS.Application.Services
|
||||
.Where(t => t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator || t.User.UserTypeEnum == UserTypeEnum.CRA)
|
||||
.WhereIf(param.UserTypeId != null, t => t.User.UserTypeId == param.UserTypeId)
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserRealName), t => (t.User.FullName).Contains(param.UserRealName))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(param.OrganizationName), t => t.User.OrganizationName.Contains(param.OrganizationName))
|
||||
.ProjectTo<AssginSiteCRCListDTO>(_mapper.ConfigurationProvider, new { siteId = param.SiteId });
|
||||
|
||||
return await query.ToPagedListAsync(param.PageIndex,
|
||||
@@ -136,7 +137,7 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(trialUserQuery.UserRealName), t => (t.FullName).Contains(trialUserQuery.UserRealName))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(trialUserQuery.UserName), t => t.UserName.Contains(trialUserQuery.UserName))
|
||||
//.WhereIf(!string.IsNullOrWhiteSpace(trialUserQuery.OrganizationName), t => t.OrganizationName.Contains(trialUserQuery.OrganizationName))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(trialUserQuery.OrganizationName), t => t.OrganizationName.Contains(trialUserQuery.OrganizationName))
|
||||
.WhereIf(trialUserQuery.UserTypeEnum != null, t => t.UserTypeEnum == trialUserQuery.UserTypeEnum)
|
||||
//.WhereIf(_userInfo.IsAdmin, t => t.UserTypeRole.Type == UserTypeGroup.TrialUser)
|
||||
//.WhereIf(!_userInfo.IsAdmin, t => t.UserTypeRole.Type == UserTypeGroup.TrialUser || t.UserTypeEnum != UserTypeEnum.ProjectManager)
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
using AutoMapper;
|
||||
using AutoMapper.EquivalencyExpression;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Contracts.DTO;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
public class PersonalWorkstation : Profile
|
||||
{
|
||||
public PersonalWorkstation()
|
||||
{
|
||||
var userTypeEnumInt = 0;
|
||||
|
||||
var userTypeId = Guid.Empty;
|
||||
|
||||
|
||||
CreateMap<Trial, CheckToBeDoneDto>()
|
||||
.ForMember(t => t.ExperimentName, u => u.MapFrom(c => c.ExperimentName))
|
||||
.ForMember(t => t.TrialCode, u => u.MapFrom(c => c.TrialCode))
|
||||
.ForMember(t => t.ResearchProgramNo, u => u.MapFrom(c => c.ResearchProgramNo))
|
||||
|
||||
.ForMember(t => t.UrgentCount, u => u.MapFrom(c => c
|
||||
.SubjectVisitList.Where(t=>(t.CheckState==CheckStateEnum.ToCheck ||t.CheckState==CheckStateEnum.CVIng) && t.IsUrgent).Count()))
|
||||
.ForMember(t => t.ToBeCheckedCount, u => u.MapFrom(c => c
|
||||
.SubjectVisitList.Where(t => t.CheckState == CheckStateEnum.ToCheck ).Count()))
|
||||
.ForMember(t => t.ToBeRepliedCount, u => u.MapFrom(c => c
|
||||
.SubjectVisitList.Where(t => (t.CheckState == CheckStateEnum.ToCheck || t.CheckState == CheckStateEnum.CVIng) && t.IsUrgent).Count()));
|
||||
|
||||
|
||||
|
||||
|
||||
CreateMap<VisitTask, ReReadingApplyToBeDoneDto>();
|
||||
|
||||
|
||||
|
||||
CreateMap<Enroll, ReviewerSelectToBeDoneDto>();
|
||||
|
||||
|
||||
CreateMap<VisitTask, ReReadingApprovalToBeDoneDto>();
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using BeetleX.BNR;
|
||||
using IRaCIS.Core.Application.Service;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
@@ -7,6 +8,7 @@ using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Caching.Distributed;
|
||||
using Microsoft.Extensions.Options;
|
||||
using MiniExcelLibs;
|
||||
using System.Linq.Expressions;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
@@ -43,6 +45,27 @@ namespace IRaCIS.Application.Services
|
||||
//_cache = cache;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
[AllowAnonymous]
|
||||
public async Task<IResponseOutput> InternationazitionInit()
|
||||
{
|
||||
|
||||
|
||||
var rows = await MiniExcel.QueryAsync<InternationalizationAddOrEdit>(@"C:\Users\Administrator\Desktop\Export\vue.xlsx");
|
||||
|
||||
foreach (var row in rows)
|
||||
{
|
||||
await _repository.InsertOrUpdateAsync<Internationalization, InternationalizationAddOrEdit>(row);
|
||||
|
||||
}
|
||||
|
||||
await _repository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<string> Get()
|
||||
{
|
||||
@@ -151,7 +174,7 @@ namespace IRaCIS.Application.Services
|
||||
[AllowAnonymous]
|
||||
public async Task testwwwww([FromServices] IWebHostEnvironment env)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -50,33 +50,53 @@ namespace IRaCIS.Core.Application.Triggers
|
||||
Expression<Func<VisitTask, bool>> visitTaskLambda = x => x.TrialId == visitTask.TrialId && x.SubjectId == visitTask.SubjectId && x.TrialReadingCriterionId == visitTask.TrialReadingCriterionId;
|
||||
if (context.ChangeType == ChangeType.Added)
|
||||
{
|
||||
|
||||
|
||||
//判断是否需要临床数据签名 不需要 就不用维护
|
||||
if (visitTask.IsNeedClinicalDataSign)
|
||||
{
|
||||
|
||||
var visitTaskIdQueryable = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务
|
||||
//小于自己任务号的任务 存在需要签名 但是没签名
|
||||
.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)
|
||||
&& t.IsFrontTaskNeedSignButNotSign == false)
|
||||
.Select(t => t.Id);
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable.Contains(t.Id), u => new VisitTask()
|
||||
//有序阅片 IsFrontTaskNeedSignButNotSign 维护才有意义
|
||||
if (_trialReadingCriterionRepository.Any(t => t.Id == visitTask.TrialReadingCriterionId && t.IsReadingTaskViewInOrder == true))
|
||||
{
|
||||
IsFrontTaskNeedSignButNotSign = true
|
||||
});
|
||||
var visitTaskIdQueryable = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务
|
||||
//小于自己任务号的任务 存在需要签名 但是没签名
|
||||
.Where(t => t.IsFrontTaskNeedSignButNotSign == false &&
|
||||
|
||||
(t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)
|
||||
|
||||
// 前序存在 未一致性核查未通过的
|
||||
|| t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)
|
||||
|
||||
))
|
||||
.Select(t => t.Id);
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable.Contains(t.Id), u => new VisitTask()
|
||||
{
|
||||
IsFrontTaskNeedSignButNotSign = true
|
||||
});
|
||||
|
||||
|
||||
|
||||
var visitTaskIdQueryable2 = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务
|
||||
//小于自己任务号的任务 存在需要签名 但是没签名
|
||||
.Where(t => !t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)
|
||||
&& t.IsFrontTaskNeedSignButNotSign == true)
|
||||
.Select(t => t.Id);
|
||||
var visitTaskIdQueryable2 = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务
|
||||
|
||||
.Where(t => t.IsFrontTaskNeedSignButNotSign == true &&
|
||||
|
||||
//前序任务 不存在需要签名 但是没签名
|
||||
!t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)
|
||||
|
||||
// 前序 不存在 未一致性核查未通过的
|
||||
&& !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)
|
||||
)
|
||||
.Select(t => t.Id);
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable2.Contains(t.Id), u => new VisitTask()
|
||||
{
|
||||
IsFrontTaskNeedSignButNotSign = false
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable2.Contains(t.Id), u => new VisitTask()
|
||||
{
|
||||
IsFrontTaskNeedSignButNotSign = false
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,6 +16,173 @@ namespace IRaCIS.Core.Domain.Share
|
||||
public static readonly string Group = "group";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 临床表格问题标识
|
||||
/// </summary>
|
||||
public enum ClinicalTableQuestionMark
|
||||
{
|
||||
Test=1,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 临床表格问题类型
|
||||
/// </summary>
|
||||
public enum ClinicalTableQuestionType
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 单行文本框
|
||||
/// </summary>
|
||||
Input = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 多行文本框
|
||||
/// </summary>
|
||||
TextArea = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 单选题
|
||||
/// </summary>
|
||||
Select = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 多选题
|
||||
/// </summary>
|
||||
Multiple = 6,
|
||||
|
||||
/// <summary>
|
||||
/// 时间
|
||||
/// </summary>
|
||||
Time = 7
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据计算标记
|
||||
/// </summary>
|
||||
public enum ClinicalCalculateMark
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// +
|
||||
/// </summary>
|
||||
Add = 1,
|
||||
|
||||
/// <summary>
|
||||
/// -
|
||||
/// </summary>
|
||||
Subtract = 2,
|
||||
|
||||
/// <summary>
|
||||
/// ×
|
||||
/// </summary>
|
||||
Multiply = 3,
|
||||
|
||||
/// <summary>
|
||||
/// ÷
|
||||
/// </summary>
|
||||
Divide = 4,
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据问题显示
|
||||
/// </summary>
|
||||
public enum ClinicalQuestionShow
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 显示
|
||||
/// </summary>
|
||||
Show = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 依赖父问题
|
||||
/// </summary>
|
||||
Rely = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 隐藏
|
||||
/// </summary>
|
||||
Hide = 2
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据问题类型
|
||||
/// </summary>
|
||||
public enum ClinicalQuestionType
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 分组
|
||||
/// </summary>
|
||||
Group = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 表格
|
||||
/// </summary>
|
||||
Table = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 单行文本框
|
||||
/// </summary>
|
||||
Input = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 多行文本框
|
||||
/// </summary>
|
||||
TextArea = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 单选题
|
||||
/// </summary>
|
||||
Select = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 多选题
|
||||
/// </summary>
|
||||
Multiple = 6,
|
||||
|
||||
/// <summary>
|
||||
/// 时间
|
||||
/// </summary>
|
||||
Time = 7
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 临床问题标识
|
||||
/// </summary>
|
||||
public enum ClinicalQuestionMark
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 检查日期
|
||||
/// </summary>
|
||||
CheckDate = 1
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据选项类型
|
||||
/// </summary>
|
||||
public enum ClinicalOptionType
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 无
|
||||
/// </summary>
|
||||
None = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 自定义
|
||||
/// </summary>
|
||||
Custom = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 字典
|
||||
/// </summary>
|
||||
Dictionary = 3
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 影像质量评估
|
||||
/// </summary>
|
||||
@@ -1072,7 +1239,12 @@ namespace IRaCIS.Core.Domain.Share
|
||||
[Display(Name = "PDF")]
|
||||
PDF = 1,
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 结构化录入
|
||||
/// </summary>
|
||||
Structuring = 2,
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 数据类型
|
||||
|
||||
@@ -82,6 +82,8 @@ namespace IRaCIS.Core.Domain.Models
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
public Trial Trial { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 冗余 废弃
|
||||
/// </summary>
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace IRaCIS.Core.Domain.Models
|
||||
[Table("VisitTaskReReading")]
|
||||
public class VisitTaskReReading : Entity, IAuditUpdate, IAuditAdd
|
||||
{
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
//重阅原始任务Id 重阅会产生新的任务
|
||||
public Guid OriginalReReadingTaskId { get; set; }
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace IRaCIS.Core.Domain.Models
|
||||
public int State { get; set; }
|
||||
|
||||
|
||||
public string FolderPath { get; set; }
|
||||
public string Description { get; set; }
|
||||
|
||||
public string Code { get; set; }
|
||||
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-27 15:46:59
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
///PublishLog
|
||||
///</summary>
|
||||
[Table("PublishLog")]
|
||||
public class PublishLog : Entity, IAuditUpdate, IAuditAdd
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Version
|
||||
/// </summary>
|
||||
[Required]
|
||||
public string Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// PublishTime
|
||||
/// </summary>
|
||||
[Required]
|
||||
public DateTime PublishTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// UpdateContent
|
||||
/// </summary>
|
||||
[Required]
|
||||
public string UpdateContent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// CreateTime
|
||||
/// </summary>
|
||||
[Required]
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// CreateUserId
|
||||
/// </summary>
|
||||
[Required]
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// UpdateUserId
|
||||
/// </summary>
|
||||
[Required]
|
||||
public Guid UpdateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// UpdateTime
|
||||
/// </summary>
|
||||
[Required]
|
||||
public DateTime UpdateTime { get; set; }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -26,10 +26,15 @@ namespace IRaCIS.Core.Domain.Models
|
||||
/// </summary>
|
||||
public string ClinicalDataSetName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 英文名称
|
||||
/// </summary>
|
||||
public string ClinicalDataSetEnName { get; set; } = string.Empty;
|
||||
/// <summary>
|
||||
/// 是否应用
|
||||
/// </summary>
|
||||
public bool IsApply { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 英文名称
|
||||
/// </summary>
|
||||
public string ClinicalDataSetEnName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 临床级别
|
||||
|
||||
@@ -63,6 +63,12 @@ namespace IRaCIS.Core.Domain.Models
|
||||
/// </summary>
|
||||
public bool IsConfirm { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 是否应用
|
||||
/// </summary>
|
||||
public bool IsApply { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 上传角色
|
||||
/// </summary>
|
||||
|
||||
@@ -80,6 +80,11 @@ namespace IRaCIS.Core.Domain.Models
|
||||
|
||||
public SubjectVisit SubjectVisit { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
[ForeignKey("SubjectId")]
|
||||
|
||||
public Subject Subject { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
[ForeignKey("ReadingId")]
|
||||
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-16 13:37:24
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
///系统临床数据问题
|
||||
///</summary>
|
||||
[Table("SystemClinicalQuestion")]
|
||||
public class SystemClinicalQuestion : Entity, IAuditAdd
|
||||
{
|
||||
/// <summary>
|
||||
/// 项目临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题名称
|
||||
/// </summary>
|
||||
public string QuestionName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 问题英文名称
|
||||
/// </summary>
|
||||
public string QuestionEnName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 临床问题类型(分组,单选。)
|
||||
/// </summary>
|
||||
public string ClinicalQuestionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题标识
|
||||
/// </summary>
|
||||
public ClinicalQuestionMark? ClinicalQuestionMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最大长度
|
||||
/// </summary>
|
||||
public int? MaxAnswerLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据选项类型(无,自定义)
|
||||
/// </summary>
|
||||
public ClinicalOptionType ClinicalOptionTypeEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分组Id
|
||||
/// </summary>
|
||||
public Guid? GroupId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义选项
|
||||
/// </summary>
|
||||
public string TypeValue { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 字典Code
|
||||
/// </summary>
|
||||
public string DictionaryCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 排序
|
||||
/// </summary>
|
||||
public int ShowOrder { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 是否必填
|
||||
/// </summary>
|
||||
public bool IsRequired { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 父问题Id
|
||||
/// </summary>
|
||||
public Guid? ParentId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 父问题触发值
|
||||
/// </summary>
|
||||
public string ParentTriggerValue { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 显示类型
|
||||
/// </summary>
|
||||
public ClinicalQuestionShow ClinicalQuestionShowEnum { get; set; } = ClinicalQuestionShow.Show;
|
||||
|
||||
/// <summary>
|
||||
/// 是否是检查日期
|
||||
/// </summary>
|
||||
public bool IsCheckDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 小数点位数
|
||||
/// </summary>
|
||||
public int? DigitPlaces { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-19 11:32:48
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
/// 系统临床表格问题
|
||||
///</summary>
|
||||
[Table("SystemClinicalTableQuestion")]
|
||||
public class SystemClinicalTableQuestion : Entity, IAuditAdd
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统临床数据Id
|
||||
/// </summary>
|
||||
public Guid SystemClinicalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题名称
|
||||
/// </summary>
|
||||
public string QuestionName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 问题英文名称
|
||||
/// </summary>
|
||||
public string QuestionEnName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 临床问题类型(分组,单选。)
|
||||
/// </summary>
|
||||
public string ClinicalTableQuestionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题标识
|
||||
/// </summary>
|
||||
public ClinicalTableQuestionMark? ClinicalTableQuestionMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最大长度
|
||||
/// </summary>
|
||||
public int? MaxAnswerLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据选项类型(无,自定义)
|
||||
/// </summary>
|
||||
public ClinicalOptionType ClinicalOptionTypeEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义选项
|
||||
/// </summary>
|
||||
public string TypeValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 字典Code
|
||||
/// </summary>
|
||||
public string DictionaryCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 排序
|
||||
/// </summary>
|
||||
public int ShowOrder { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否必填
|
||||
/// </summary>
|
||||
public bool IsRequired { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 外层问题Id
|
||||
/// </summary>
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 小数点位数
|
||||
/// </summary>
|
||||
public int? DigitPlaces { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; } = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-16 13:37:24
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
///项目临床数据问题
|
||||
///</summary>
|
||||
[Table("TrialClinicalQuestion")]
|
||||
public class TrialClinicalQuestion : Entity, IAuditAdd
|
||||
{
|
||||
/// <summary>
|
||||
/// 项目临床数据Id
|
||||
/// </summary>
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题名称
|
||||
/// </summary>
|
||||
public string QuestionName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 问题英文名称
|
||||
/// </summary>
|
||||
public string QuestionEnName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 临床问题类型(分组,单选。)
|
||||
/// </summary>
|
||||
public string ClinicalQuestionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题标识
|
||||
/// </summary>
|
||||
public ClinicalQuestionMark? ClinicalQuestionMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最大长度
|
||||
/// </summary>
|
||||
public int? MaxAnswerLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据选项类型(无,自定义)
|
||||
/// </summary>
|
||||
public ClinicalOptionType ClinicalOptionTypeEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分组Id
|
||||
/// </summary>
|
||||
public Guid? GroupId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义选项
|
||||
/// </summary>
|
||||
public string TypeValue { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 字典Code
|
||||
/// </summary>
|
||||
public string DictionaryCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 排序
|
||||
/// </summary>
|
||||
public int ShowOrder { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 是否必填
|
||||
/// </summary>
|
||||
public bool IsRequired { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 系统临床问题Id
|
||||
/// </summary>
|
||||
public Guid? SystemClinicalQuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 父问题Id
|
||||
/// </summary>
|
||||
public Guid? ParentId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 父问题触发值
|
||||
/// </summary>
|
||||
public string ParentTriggerValue { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 显示类型
|
||||
/// </summary>
|
||||
public ClinicalQuestionShow ClinicalQuestionShowEnum { get; set; } = ClinicalQuestionShow.Show;
|
||||
|
||||
/// <summary>
|
||||
/// 是否是检查日期
|
||||
/// </summary>
|
||||
public bool IsCheckDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义计算标记
|
||||
/// </summary>
|
||||
public ClinicalCalculateMark? ClinicalCalculateMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义计算问题
|
||||
/// </summary>
|
||||
public string CalculateQuestions { get; set; } = "[]";
|
||||
|
||||
/// <summary>
|
||||
/// 小数点位数
|
||||
/// </summary>
|
||||
public int? DigitPlaces { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-19 11:32:48
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
/// 项目临床表格问题
|
||||
///</summary>
|
||||
[Table("TrialClinicalTableQuestion")]
|
||||
public class TrialClinicalTableQuestion : Entity, IAuditAdd
|
||||
{
|
||||
/// <summary>
|
||||
/// 项目临床数据Id
|
||||
/// </summary>
|
||||
public Guid TrialClinicalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题名称
|
||||
/// </summary>
|
||||
public string QuestionName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 问题英文名称
|
||||
/// </summary>
|
||||
public string QuestionEnName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 临床问题类型(分组,单选。)
|
||||
/// </summary>
|
||||
public string ClinicalTableQuestionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题标识
|
||||
/// </summary>
|
||||
public ClinicalTableQuestionMark? ClinicalTableQuestionMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最大长度
|
||||
/// </summary>
|
||||
public int? MaxAnswerLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 临床数据选项类型(无,自定义)
|
||||
/// </summary>
|
||||
public ClinicalOptionType ClinicalOptionTypeEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义选项
|
||||
/// </summary>
|
||||
public string TypeValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 字典Code
|
||||
/// </summary>
|
||||
public string DictionaryCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 排序
|
||||
/// </summary>
|
||||
public int ShowOrder { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否必填
|
||||
/// </summary>
|
||||
public bool IsRequired { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 外层问题Id
|
||||
/// </summary>
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 系统表格问题Id
|
||||
/// </summary>
|
||||
public Guid? SystemTableQuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义计算标记
|
||||
/// </summary>
|
||||
public ClinicalCalculateMark? ClinicalCalculateMarkEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义计算问题
|
||||
/// </summary>
|
||||
public string CalculateQuestions { get; set; } = "[]";
|
||||
|
||||
/// <summary>
|
||||
/// 小数点位数
|
||||
/// </summary>
|
||||
public int? DigitPlaces { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; } = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-26 11:01:54
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
///ClinicalAnswerRowInfo
|
||||
///</summary>
|
||||
[Table("ClinicalAnswerRowInfo")]
|
||||
public class ClinicalAnswerRowInfo : Entity, IAuditAdd
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 受试者Id
|
||||
/// </summary>
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单Id
|
||||
/// </summary>
|
||||
public Guid ClinicalFormId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建日期
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题Id
|
||||
/// </summary>
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// RowIndex
|
||||
/// </summary>
|
||||
public int RowIndex { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-26 11:39:53
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
///ClinicalForm
|
||||
///</summary>
|
||||
[Table("ClinicalForm")]
|
||||
public class ClinicalForm : Entity, IAuditAdd
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 受试者Id
|
||||
/// </summary>
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 检查日期
|
||||
/// </summary>
|
||||
public DateTime CheckDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建日期
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ClinicalDataTrialSetId
|
||||
/// </summary>
|
||||
public Guid ClinicalDataTrialSetId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// VisitId
|
||||
/// </summary>
|
||||
public Guid? VisitId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// VisitId
|
||||
/// </summary>
|
||||
public Guid? ReadingId { get; set; }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-26 10:58:41
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
///ClinicalQuestionAnswer
|
||||
///</summary>
|
||||
[Table("ClinicalQuestionAnswer")]
|
||||
public class ClinicalQuestionAnswer : Entity, IAuditAdd
|
||||
{
|
||||
/// <summary>
|
||||
/// 受试者Id
|
||||
/// </summary>
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单Id
|
||||
/// </summary>
|
||||
public Guid ClinicalFormId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建日期
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建用户
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题Id
|
||||
/// </summary>
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Answer
|
||||
/// </summary>
|
||||
public string Answer { get; set; }
|
||||
|
||||
public Guid ClinicalDataTrialSetId { get; set; }
|
||||
|
||||
|
||||
[JsonIgnore]
|
||||
[ForeignKey("ClinicalFormId")]
|
||||
public ClinicalForm ClinicalForm { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2023-06-26 11:03:26
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
using System;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace IRaCIS.Core.Domain.Models
|
||||
{
|
||||
///<summary>
|
||||
///ClinicalTableAnswer
|
||||
///</summary>
|
||||
[Table("ClinicalTableAnswer")]
|
||||
public class ClinicalTableAnswer : Entity, IAuditAdd
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 受试者Id
|
||||
/// </summary>
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单Id
|
||||
/// </summary>
|
||||
public Guid ClinicalFormId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建日期
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题Id
|
||||
/// </summary>
|
||||
public Guid QuestionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 答案行的Id
|
||||
/// </summary>
|
||||
public Guid RowId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 答案
|
||||
/// </summary>
|
||||
public string Answer { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表格问题id
|
||||
/// </summary>
|
||||
public Guid TableQuestionId { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
[ForeignKey("RowId")]
|
||||
public ClinicalAnswerRowInfo ClinicalAnswerRowInfo { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -116,9 +116,14 @@ namespace IRaCIS.Core.Domain.Models
|
||||
public CriterionType CriterionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// eCRF报告是否显示在图像页面
|
||||
/// 是否加急
|
||||
/// </summary>
|
||||
public bool IseCRFShowInDicomReading { get; set; } = false;
|
||||
public bool IsUrgent { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// eCRF报告是否显示在图像页面
|
||||
/// </summary>
|
||||
public bool IseCRFShowInDicomReading { get; set; } = false;
|
||||
|
||||
#region 阅片单元配置 新加
|
||||
|
||||
@@ -256,6 +261,11 @@ namespace IRaCIS.Core.Domain.Models
|
||||
[JsonIgnore]
|
||||
|
||||
public List<TrialCriterionAdditionalAssessmentType> TrialCriterionAdditionalAssessmentTypeList { get; set; } = new List<TrialCriterionAdditionalAssessmentType>();
|
||||
|
||||
|
||||
[JsonIgnore]
|
||||
|
||||
public List<VisitTask> VisitTaskList { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
--同步重阅申请表结构后,再维护该字段
|
||||
|
||||
UPDATE VisitTaskReReading
|
||||
SET TrialId = VisitTask.TrialId
|
||||
FROM VisitTaskReReading
|
||||
INNER JOIN VisitTask ON VisitTaskReReading.OriginalReReadingTaskId = VisitTask.Id;
|
||||
|
||||
delete VisitTaskReReading where TrialId is NULL
|
||||
|
||||
|
||||
--数据库列字符串列 长度
|
||||
SELECT t.name AS table_name,
|
||||
c.name AS column_name,
|
||||
d.name AS constraint_name,
|
||||
ty.Name as typeName,
|
||||
c.max_length as length
|
||||
FROM sys.tables t
|
||||
INNER JOIN sys.columns c ON c.object_id = t.object_id
|
||||
LEFT JOIN sys.default_constraints d ON d.parent_object_id = c.object_id AND d.parent_column_id = c.column_id
|
||||
INNER JOIN sys.types ty on ty.system_type_id = c.system_type_id
|
||||
AND ty.name in ('nvarchar', 'varchar', 'char', 'nchar')
|
||||
WHERE c.max_length < 100 AND c.max_length > 0
|
||||
|
||||
--带维护sql 的查询
|
||||
|
||||
SELECT t.name AS table_name,
|
||||
c.name AS column_name,
|
||||
d.name AS constraint_name,
|
||||
ty.Name as typeName,
|
||||
c.max_length as length,
|
||||
'ALTER TABLE ' + QUOTENAME(t.name) + ' DROP CONSTRAINT [' + d.name + ']' AS drop_constraint_sql,
|
||||
CASE WHEN c.max_length = -1 THEN 'ALTER TABLE ' + QUOTENAME(t.name) + ' ALTER COLUMN ' + QUOTENAME(c.name) + ' NVARCHAR(MAX)' + CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END
|
||||
WHEN c.max_length > 0 AND c.max_length < 100 THEN 'ALTER TABLE ' + QUOTENAME(t.name) + ' ALTER COLUMN ' + QUOTENAME(c.name) + ' NVARCHAR(' + CAST(100 AS VARCHAR(10)) + ')' + CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END
|
||||
WHEN c.max_length = 8000 THEN 'ALTER TABLE ' + QUOTENAME(t.name) + ' ALTER COLUMN ' + QUOTENAME(c.name) + ' NVARCHAR(' + CAST(4000 AS VARCHAR(10)) + ')' + CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END
|
||||
ELSE 'ALTER TABLE ' + QUOTENAME(t.name) + ' ALTER COLUMN ' + QUOTENAME(c.name) + ' ' + ty.name + '(' + CAST(c.max_length AS VARCHAR(10)) + ')' + CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END
|
||||
END AS AlterColumnSQL,
|
||||
'ALTER TABLE ' + QUOTENAME(t.name) + ' ADD CONSTRAINT ' +'DF_'+t.name+ '_'+ c.name + ' DEFAULT ' + d.definition + ' FOR ' + QUOTENAME(c.name) AS add_constraint_sql
|
||||
FROM sys.tables t
|
||||
INNER JOIN sys.columns c ON c.object_id = t.object_id
|
||||
LEFT JOIN sys.default_constraints d ON d.parent_object_id = c.object_id AND d.parent_column_id = c.column_id
|
||||
INNER JOIN sys.types ty on ty.system_type_id = c.system_type_id
|
||||
AND ty.name in ('nvarchar', 'varchar', 'char', 'nchar')
|
||||
and (ty.name != 'nvarchar' or (ty.name = 'nvarchar' and (c.max_length = -1 or (c.max_length < 100 and c.max_length > 0))))
|
||||
|
||||
|
||||
|
||||
--修改默认约束名
|
||||
SELECT
|
||||
OBJECT_SCHEMA_NAME(dc.parent_object_id) AS schema_name,
|
||||
OBJECT_NAME(dc.parent_object_id) AS table_name,
|
||||
dc.name AS constraint_name,
|
||||
COL_NAME(dc.parent_object_id, dc.parent_column_id) AS column_name,
|
||||
CONCAT('EXEC sp_rename N''', dc.name, ''', N''DF_', OBJECT_NAME(dc.parent_object_id), '_', COL_NAME(dc.parent_object_id, dc.parent_column_id), '''') AS executable_sql
|
||||
FROM
|
||||
sys.default_constraints dc
|
||||
WHERE
|
||||
dc.is_system_named = 1 -- 只查询自动生成的系统默认约束
|
||||
AND dc.name NOT LIKE 'DF\[_%]\[_%]' ESCAPE '\'; -- 排除符合 "DF_表名_列名" 格式的约束名
|
||||
|
||||
SELECT
|
||||
sys.tables.name AS table_name,
|
||||
sys.columns.name AS column_name,
|
||||
sys.default_constraints.name AS constraint_name,
|
||||
'EXEC sp_rename N''' + sys.default_constraints.name + ''', N''DF_' + sys.tables.name + '_' + sys.columns.name + ''''
|
||||
AS executable_sql
|
||||
FROM sys.default_constraints
|
||||
INNER JOIN sys.tables ON sys.default_constraints.parent_object_id = sys.tables.object_id
|
||||
INNER JOIN sys.columns ON sys.default_constraints.parent_column_id = sys.columns.column_id AND sys.tables.object_id = sys.columns.object_id
|
||||
|
||||
|
||||
--修改主键
|
||||
SELECT
|
||||
OBJECT_NAME(i.object_id) AS '表名',
|
||||
COL_NAME(ic.object_id, ic.column_id) AS '列名',
|
||||
i.name AS '索引名',
|
||||
CONCAT('EXEC sp_rename ''', i.name, ''', ''PK_', OBJECT_NAME(i.object_id), '_',
|
||||
COL_NAME(ic.object_id, ic.column_id), '''')
|
||||
AS '修改索引名为 PK_表名_字段名',
|
||||
i.is_primary_key AS '是否主键'
|
||||
FROM
|
||||
sys.indexes i
|
||||
INNER JOIN
|
||||
sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
||||
WHERE
|
||||
(i.is_primary_key = 1 OR i.is_unique_constraint = 1)
|
||||
AND OBJECTPROPERTY(i.object_id, 'IsSystemTable') = 0
|
||||
AND OBJECTPROPERTY(i.object_id, 'IsMSShipped') = 0
|
||||
AND OBJECT_NAME(i.object_id) <> 'sysdiagrams';
|
||||
|
||||
|
||||
|
||||
---------------------------维护临床数据是否应用 之前默认都是应用 现在添加字段 把状态都改为应用
|
||||
update ClinicalDataTrialSet set IsApply=1
|
||||
|
||||
|
||||
--维护 删除临床数据配置,导致删除阅片期问题
|
||||
delete ReadingClinicalData
|
||||
--88020000-3E02-0016-9DA6-08DB6705F7C1
|
||||
--select *
|
||||
from ReadingClinicalData
|
||||
INNER JOIN ReadModule on ReadingClinicalData.ReadingId = ReadModule.Id
|
||||
|
||||
|
||||
where not EXISTS (select Id from TrialClinicalDataSetCriterion where ReadModule.TrialReadingCriterionId =TrialClinicalDataSetCriterion.TrialReadingCriterionId)
|
||||
@@ -17,12 +17,19 @@ namespace IRaCIS.Core.Domain.Models
|
||||
TrialDicList = new List<TrialDictionary>();
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public List<TaskMedicalReview> TaskMedicalReviewList { get; set; }
|
||||
|
||||
|
||||
[JsonIgnore]
|
||||
public List<TaskConsistentRule> TaskConsistentRuleList { get; set; }
|
||||
[JsonIgnore]
|
||||
public List<SubjectUser> SubjectDoctorUserList { get; set; } = new List<SubjectUser>();
|
||||
[JsonIgnore]
|
||||
public List<VisitTask> VisitTaskList { get; set; } = new List<VisitTask>() { };
|
||||
|
||||
[JsonIgnore]
|
||||
public List<VisitTaskReReading> VisitTaskReReadingList { get; set; }
|
||||
[JsonIgnore]
|
||||
public List<TrialSiteSurvey> TrialSiteSurveyList { get; set; } = new List<TrialSiteSurvey>();
|
||||
|
||||
@@ -39,6 +46,8 @@ namespace IRaCIS.Core.Domain.Models
|
||||
[JsonIgnore]
|
||||
public List<Subject> SubjectList { get; set; } = new List<Subject>();
|
||||
[JsonIgnore]
|
||||
public List<SubjectVisit> SubjectVisitList { get; set; } = new List<SubjectVisit>();
|
||||
[JsonIgnore]
|
||||
public List<DicomStudy> StudyList { get; set; } = new List<DicomStudy>();
|
||||
[JsonIgnore]
|
||||
public List<TrialSite> TrialSiteList { get; set; } = new List<TrialSite>();
|
||||
|
||||
@@ -17,28 +17,32 @@ using Microsoft.EntityFrameworkCore.ValueGeneration;
|
||||
using UserTypeGroup = IRaCIS.Core.Domain.Models.UserTypeGroup;
|
||||
using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using IRaCIS.Core.Infra.EFCore.Common.Dto;
|
||||
using Microsoft.Identity.Client;
|
||||
using EntityFramework.Exceptions.Common;
|
||||
using System.Data;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
|
||||
namespace IRaCIS.Core.Infra.EFCore
|
||||
{
|
||||
public class IRaCISDBContext : DbContext
|
||||
{
|
||||
public readonly IUserInfo _userInfo;
|
||||
//private readonly IAuditingData _auditingData;
|
||||
|
||||
public readonly ILogger<IRaCISDBContext> _logger;
|
||||
// 在控制台
|
||||
//public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); });
|
||||
// 调试窗口
|
||||
public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddDebug(); });
|
||||
|
||||
public IRaCISDBContext(DbContextOptions<IRaCISDBContext> options, IUserInfo userInfo
|
||||
public IRaCISDBContext(DbContextOptions<IRaCISDBContext> options, IUserInfo userInfo, ILogger<IRaCISDBContext> logger
|
||||
|
||||
|
||||
//IAuditingData auditingData
|
||||
//IAuditingData auditingData
|
||||
) : base(options)
|
||||
{
|
||||
_logger= logger;
|
||||
_userInfo = userInfo;
|
||||
//this._auditingData = auditingData;
|
||||
//_configuration = configuration;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -399,6 +403,25 @@ namespace IRaCIS.Core.Infra.EFCore
|
||||
public virtual DbSet<SubjectVisit> SubjectVisit { get; set; }
|
||||
#endregion
|
||||
|
||||
#region ClinicalQuestion
|
||||
public virtual DbSet<TrialClinicalQuestion> TrialClinicalQuestion { get; set; }
|
||||
|
||||
public virtual DbSet<SystemClinicalQuestion> SystemClinicalQuestion { get; set; }
|
||||
|
||||
public virtual DbSet<SystemClinicalTableQuestion> SystemClinicalTableQuestion { get; set; }
|
||||
|
||||
public virtual DbSet<TrialClinicalTableQuestion> TrialClinicalTableQuestion { get; set; }
|
||||
|
||||
public virtual DbSet<ClinicalQuestionAnswer> ClinicalQuestionAnswer { get; set; }
|
||||
|
||||
public virtual DbSet<ClinicalAnswerRowInfo> ClinicalAnswerRowInfo { get; set; }
|
||||
|
||||
public virtual DbSet<ClinicalTableAnswer> ClinicalTableAnswer { get; set; }
|
||||
|
||||
|
||||
public virtual DbSet<ClinicalForm> ClinicalForm { get; set; }
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -484,6 +507,9 @@ namespace IRaCIS.Core.Infra.EFCore
|
||||
|
||||
public virtual DbSet<ReadingTableQuestionAnswer> ReadingTableQuestionAnswer { get; set; }
|
||||
|
||||
public virtual DbSet<PublishLog> PublishLog { get; set; }
|
||||
|
||||
|
||||
|
||||
|
||||
#region 废弃
|
||||
@@ -496,12 +522,69 @@ namespace IRaCIS.Core.Infra.EFCore
|
||||
return base.SaveChanges();
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||
{
|
||||
// 采用触发器的方式 设置 CreateUserId CreateTime UpdateTime UpdateUserId 稽查实体里面没有这四个字段的值 因为先后顺序的原因
|
||||
SetCommonEntityAuditInfo();
|
||||
await AddAudit();
|
||||
return await base.SaveChangesAsync(cancellationToken);
|
||||
|
||||
try
|
||||
{
|
||||
return await base.SaveChangesAsync(cancellationToken);
|
||||
|
||||
}
|
||||
catch (UniqueConstraintException ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
throw new DBSaveFailedException("该唯一键已经存在于数据库中。");
|
||||
|
||||
}
|
||||
catch (TimeoutException ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
throw new DBSaveFailedException("数据库操作已经超时,请稍后重试。");
|
||||
|
||||
}
|
||||
catch (CannotInsertNullException ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
throw new DBSaveFailedException("无法在非空列上插入空值。");
|
||||
}
|
||||
catch (MaxLengthExceededException ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
throw new DBSaveFailedException("字符串超过了数据库列的最大长度。");
|
||||
}
|
||||
catch (NumericOverflowException ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
throw new DBSaveFailedException("数值超过了数据类型的范围。");
|
||||
}
|
||||
catch (SyntaxErrorException ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
throw new DBSaveFailedException("SQL 查询中存在语法错误。");
|
||||
}
|
||||
catch (ReferenceConstraintException ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
throw new DBSaveFailedException("无法进行当前操作,当前数据不符合外键约束。");
|
||||
}
|
||||
catch (DbUpdateConcurrencyException ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
throw new DBSaveFailedException("SQL 事务失败,请检查环境。");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -670,7 +753,6 @@ namespace IRaCIS.Core.Infra.EFCore
|
||||
#endregion
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
public virtual DbSet<TaskAllocationRule> TaskAllocationRule { get; set; }
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
using System;
|
||||
|
||||
|
||||
namespace IRaCIS.Core.Infrastructure
|
||||
|
||||
{
|
||||
|
||||
|
||||
public class DBSaveFailedException : Exception
|
||||
{
|
||||
|
||||
public DBSaveFailedException()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public DBSaveFailedException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
public static readonly string ConnectionString = "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_New_Tet;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true";
|
||||
public static readonly string DbDatabase = "IRaCIS_New_Tet";
|
||||
//表名称用字符串,拼接
|
||||
public static readonly string TableName = "Internationalization";
|
||||
public static readonly string TableName = "ClinicalForm";
|
||||
//具体文件里面 例如service 可以配置是否分页
|
||||
}
|
||||
#>
|
||||
|
||||
Reference in New Issue
Block a user