Compare commits

..

64 Commits

Author SHA1 Message Date
hang da57773cd3 邮箱验证修改
continuous-integration/drone/push Build is passing
2024-05-31 17:42:59 +08:00
hang d3c2ded3d4 返回 SliceThickness
continuous-integration/drone/push Build is passing
2024-05-31 15:56:29 +08:00
hang 37e7ab575f Merge branch 'Test.Study' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-31 15:39:31 +08:00
hang 39a9a0c05d 日志遗漏接口
continuous-integration/drone/push Build is passing
2024-05-31 09:09:28 +08:00
hang 570c5863c0 ip所在地遗漏
continuous-integration/drone/push Build is passing
2024-05-30 16:04:42 +08:00
hang 343f9211e2 区域 依赖注入
continuous-integration/drone/push Build is passing
2024-05-30 15:57:53 +08:00
hang 4b7fff9869 修改日志区域
continuous-integration/drone/push Build is passing
2024-05-30 15:53:16 +08:00
hang 1b1ac3ee65 Merge branch 'Test.Study' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-28 17:39:04 +08:00
he 37b4860668 修改
continuous-integration/drone/push Build is passing
2024-05-28 14:44:54 +08:00
he 96f3ecb45d 代码提交
continuous-integration/drone/push Build is passing
2024-05-28 14:33:15 +08:00
he 4966a32bcb 问题修改
continuous-integration/drone/push Build is passing
2024-05-27 15:07:46 +08:00
he 07dcb6fe47 稽查翻译修改
continuous-integration/drone/push Build is passing
2024-05-24 14:55:24 +08:00
he f802897b14 修改
continuous-integration/drone/push Build is passing
2024-05-23 16:19:20 +08:00
he 0642b9e4fb Merge branch 'Test.Study' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-23 15:01:17 +08:00
he f945793d6d 稽查翻译修改 2024-05-23 15:01:16 +08:00
hang 7b4eb7a459 修改Study 加急设置
continuous-integration/drone/push Build is passing
2024-05-23 13:50:46 +08:00
hang 5fbebe9cc0 一致性核查通过自动关闭质疑
continuous-integration/drone/push Build is passing
2024-05-23 11:16:09 +08:00
hang 6feb2b20f8 Merge branch 'Test.Study' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-23 09:15:26 +08:00
hang 2f87048f65 修改导表格式 2024-05-23 09:15:26 +08:00
he 5e613fd9d3 Merge branch 'Test.Study' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-23 09:08:30 +08:00
he 3fa4db75d0 异常修改 2024-05-23 09:08:29 +08:00
hang 0c4bc87ee9 Merge branch 'Test.Study' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-23 09:00:15 +08:00
hang 6fb0562a0b 修改邮箱验证正则 2024-05-23 09:00:15 +08:00
he 10fc07ec03 修改
continuous-integration/drone/push Build is passing
2024-05-22 17:56:28 +08:00
he 400421a337 修改
continuous-integration/drone/push Build is passing
2024-05-22 17:53:31 +08:00
he 4983def85b Merge branch 'Test.Study' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-22 17:49:01 +08:00
he d60a2567c1 修改 2024-05-22 17:48:59 +08:00
hang 2cd9716e68 修改临床数据维护
continuous-integration/drone/push Build is passing
2024-05-22 17:39:28 +08:00
hang 1cf0ac0c53 临床数据bug
continuous-integration/drone/push Build is passing
2024-05-22 09:42:26 +08:00
hang 74dd5369cb 增加查询条件
continuous-integration/drone/push Build is passing
2024-05-20 17:43:18 +08:00
hang 9d6a046d7f 清理多余的字段
continuous-integration/drone/push Build is passing
2024-05-20 15:36:10 +08:00
hang a31eef5ccd 修改评估结果
continuous-integration/drone/push Build is passing
2024-05-20 15:34:24 +08:00
hang 21beeecb7d Merge branch 'Test.Study' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-20 15:19:31 +08:00
hang c5c3c3334d 缓存清理 2024-05-20 15:19:29 +08:00
he 92008fe6ba Merge branch 'Test.Study' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-05-20 15:10:02 +08:00
he 138a967283 修改 2024-05-20 15:10:01 +08:00
hang ed72ed9a5e 自定义阅片显示评估结果
continuous-integration/drone/push Build is passing
2024-05-20 15:04:25 +08:00
hang 5d0dca121f 修改site 和hospital 以及增加字段
continuous-integration/drone/push Build is passing
2024-05-20 14:34:35 +08:00
hang 3d656dfa17 修改提交事务地点
continuous-integration/drone/push Build is passing
2024-05-16 14:25:55 +08:00
hang 7adb291a0f 先一致性核查,再确认标准的时候,批量生成任务的时候,前序任务是否需要签名但是没签名状态有误
continuous-integration/drone/push Build is passing
2024-05-16 14:02:20 +08:00
hang 3c790965fe 阅片界面调整-查询条件 2024-05-15 13:27:39 +08:00
hang da4fe122ab 重阅跟踪修改 2024-05-15 13:27:14 +08:00
hang e029f32bad 迁移study 打包
continuous-integration/drone/push Build is failing
2024-05-06 14:00:43 +08:00
hang 4320f06b77 x 2024-04-17 10:06:51 +08:00
hang ac43952c18 修改测试环境存放bucket 2024-04-17 09:59:42 +08:00
hang 5ef97ff742 修改PI 自动审核通过的 2024-04-15 17:01:32 +08:00
hang 2c8056c77b 设置访视上入组和pd默认值 2024-04-15 16:17:17 +08:00
hang 5ac6e186c0 修改中心调研bug 需要迁移 2024-04-10 14:54:56 +08:00
hang e4e02225c5 稽查排序修改,需要迁移 2024-04-08 17:40:01 +08:00
hang 72b21fc021 study 列表修改
continuous-integration/drone/push Build is passing
2024-04-07 15:01:47 +08:00
he b8175c8ed5 修改 2024-04-02 13:09:17 +08:00
hang 885b115927 修改访视默认值 2024-03-19 10:45:54 +08:00
hang 776c8f5c5e 修改阅片任务查询 2024-03-19 10:05:17 +08:00
hang 5564d8cc42 一致性分析修改 2024-03-06 14:09:19 +08:00
hang 2b9d3785d6 修改生产配置文件
continuous-integration/drone/push Build is passing
2024-02-02 17:40:19 +08:00
hang 46db19f513 修改邮件bug
continuous-integration/drone/push Build is passing
2024-02-02 15:22:25 +08:00
hang 3a479fe724 修改邮件发送
continuous-integration/drone/push Build is passing
2024-02-02 15:20:34 +08:00
hang a1afb299b3 修改邮件发送bug 2024-02-02 15:03:37 +08:00
hang c54074dd3d Merge branch 'Test.Study' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-02-01 16:54:24 +08:00
he 203bce15ea 修改查询阅片图像
continuous-integration/drone/push Build is passing
2024-02-01 13:40:37 +08:00
he c1096ae473 阅片图像查询修改
continuous-integration/drone/push Build is passing
2024-02-01 13:30:20 +08:00
hang f2cd5f35e3 [修改一致性核查模板] 2024-01-31 16:37:17 +08:00
hang 40afae1f37 Merge branch 'Test.Study' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing
2024-01-31 11:05:38 +08:00
he eb1d90e304 study去掉疲劳阅片
continuous-integration/drone/push Build is passing
2024-01-29 14:34:50 +08:00
54 changed files with 680 additions and 340 deletions
+3
View File
@@ -25,6 +25,8 @@ using Microsoft.AspNetCore.HttpOverrides;
using IRaCIS.Application.Services.BackGroundJob; using IRaCIS.Application.Services.BackGroundJob;
using LogDashboard; using LogDashboard;
using OfficeOpenXml.Utils; using OfficeOpenXml.Utils;
using IP2Region.Net.Abstractions;
using IP2Region.Net.XDB;
@@ -179,6 +181,7 @@ builder.Services.AddSingleton<IUserIdProvider, IRaCISUserIdProvider>();
//services.AddAuthorizationPolicySetup(_configuration); //services.AddAuthorizationPolicySetup(_configuration);
#endregion #endregion
builder.Services.AddSingleton<ISearcher>(new Searcher(CachePolicy.Content, Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "ip2region.xdb")));
#endregion #endregion
var app = builder.Build(); var app = builder.Build();
@@ -50,6 +50,7 @@ namespace IRaCIS.Core.API
//triggerOptions.AddTrigger<AddlTrialUserTrigger>(); //triggerOptions.AddTrigger<AddlTrialUserTrigger>();
triggerOptions.AddTrigger<VisitTaskIsFrontTaskNeedSignButNotSignTrigger>(); triggerOptions.AddTrigger<VisitTaskIsFrontTaskNeedSignButNotSignTrigger>();
triggerOptions.AddTrigger<VisitTaskIAfterSignTrigger>(); triggerOptions.AddTrigger<VisitTaskIAfterSignTrigger>();
triggerOptions.AddTrigger<UserLogTrigger>();
}); });
+4 -2
View File
@@ -30,8 +30,10 @@
}, },
"ConnectionStrings": { "ConnectionStrings": {
"RemoteNew": "Server=101.132.193.237,1434;Database=Prod_Study;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true", //"RemoteNew": "Server=47.117.165.18,1434;Database=Prod_Study;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
"Hangfire": "Server=101.132.193.237,1434;Database=Prod_Study_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true" //"Hangfire": "Server=47.117.165.18,1434;Database=Prod_Study_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_Study;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_Study_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
}, },
"BasicSystemConfig": { "BasicSystemConfig": {
+9 -9
View File
@@ -20,13 +20,13 @@
}, },
"MinIO": { "MinIO": {
"endPoint": "192.168.3.68", "endPoint": "123.56.94.154",
"port": "8001", "port": "9001",
"useSSL": false, "useSSL": true,
"accessKey": "IDFkwEpWej0b4DtiuThL", "accessKey": "fbStsVYCIPKHQneeqMwD",
"secretKey": "Lhuu83yMhVwu7c1SnjvGY6lq74jzpYqifK6Qtj4h", "secretKey": "TzgvyA3zGXMUnpilJNUlyMYHfosl1hBMl6lxPmjy",
"bucketName": "test", "bucketName": "study-test",
"viewEndpoint": "http://192.168.3.68:8001/test/" "viewEndpoint": "http://study.test.extimaging.com/oss/study-test"
}, },
"AWS": { "AWS": {
@@ -40,8 +40,8 @@
}, },
"ConnectionStrings": { "ConnectionStrings": {
"RemoteNew": "Server=123.56.94.154,1435;Database=Test_Study;User ID=sa;Password=xc@123456;TrustServerCertificate=true", "RemoteNew": "Server=106.14.89.110,1435;Database=Test_Study;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=123.56.94.154,1435;Database=Test_Study_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true" "Hangfire": "Server=106.14.89.110,1435;Database=Test_Study_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
}, },
"BasicSystemConfig": { "BasicSystemConfig": {
@@ -8,13 +8,13 @@
<div style='padding-left: 40px;background: #f6f6f6'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 18px'> <div style='line-height: 40px;font-size: 18px'>
亲爱的用户 , Hello {0},
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
感谢您使用展影云平台。 感谢您使用展影云平台。
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
{0},验证码是: {1},请在3分钟内输入该验证码,进行后续操作。如非本人操作,请忽略该邮件。 {1},验证码是: {2},请在3分钟内输入该验证码,进行后续操作。如非本人操作,请忽略该邮件。
</div> </div>
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
@@ -8,13 +8,13 @@
<div style='padding-left: 40px;background: #f6f6f6'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 16px'>
Dear Sir or Madam: Hello {0},
</div> </div>
<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'>
Thank you for using our imaging system. Thank you for using our imaging system.
</div> </div>
<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'>
{0}, the verification code is {1}. Please enter this code within 3 minutes for follow-up operations. {1}, the verification code is {2}. Please enter this code within 3 minutes for follow-up operations.
</div> </div>
<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'>
If you are not the intended person, please ignore this email. If you are not the intended person, please ignore this email.
@@ -32,7 +32,9 @@ namespace IRaCIS.Core.Application.Filter
if (context.Exception.GetType() == typeof(BusinessValidationFailedException)) if (context.Exception.GetType() == typeof(BusinessValidationFailedException))
{ {
context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message,ApiResponseCodeEnum.BusinessValidationFailed)); var error = context.Exception as BusinessValidationFailedException;
context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message, error!.Code));
} }
else if(context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException)) else if(context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException))
{ {
@@ -77,6 +77,7 @@
<PackageReference Include="fo-dicom.Codecs" Version="5.10.8" /> <PackageReference Include="fo-dicom.Codecs" Version="5.10.8" />
<PackageReference Include="FreeSpire.Doc" Version="11.6.0" /> <PackageReference Include="FreeSpire.Doc" Version="11.6.0" />
<PackageReference Include="Hangfire.Core" Version="1.8.5" /> <PackageReference Include="Hangfire.Core" Version="1.8.5" />
<PackageReference Include="IP2Region.Net" Version="2.0.2" />
<PackageReference Include="Magicodes.IE.Core" Version="2.7.4.5" /> <PackageReference Include="Magicodes.IE.Core" Version="2.7.4.5" />
<PackageReference Include="Magicodes.IE.Csv" Version="2.7.4.5"> <PackageReference Include="Magicodes.IE.Csv" Version="2.7.4.5">
<TreatAsUsed>true</TreatAsUsed> <TreatAsUsed>true</TreatAsUsed>
@@ -107,4 +108,10 @@
<ProjectReference Include="..\IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj" /> <ProjectReference Include="..\IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Update="Resources\ip2region.xdb">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project> </Project>
@@ -978,7 +978,7 @@
<param name="currentInspectionId"></param> <param name="currentInspectionId"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.FrontAuditConfigService.SetDataInspectionDateType(System.Collections.Generic.List{System.String},System.String)"> <member name="M:IRaCIS.Core.Application.Service.FrontAuditConfigService.SetDataInspectionDateType(System.Collections.Generic.List{System.String},System.String,System.String)">
<summary> <summary>
格式化日期和时间 格式化日期和时间
</summary> </summary>
@@ -986,7 +986,7 @@
<param name="jsonStr"></param> <param name="jsonStr"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.FrontAuditConfigService.GetInspectionEnumValue(System.Collections.Generic.List{System.String},System.String)"> <member name="M:IRaCIS.Core.Application.Service.FrontAuditConfigService.GetInspectionEnumValue(System.Collections.Generic.List{System.String},System.String,System.String)">
<summary> <summary>
获取外键表数据 获取外键表数据
</summary> </summary>
@@ -994,7 +994,7 @@
<param name="jsonStr"></param> <param name="jsonStr"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.FrontAuditConfigService.SetEnum(System.Guid,System.Collections.Generic.List{System.String},System.String)"> <member name="M:IRaCIS.Core.Application.Service.FrontAuditConfigService.SetEnum(System.Guid,System.Collections.Generic.List{System.String},System.String,System.String)">
<summary> <summary>
获取枚举 获取枚举
</summary> </summary>
@@ -4521,6 +4521,11 @@
是否是第一次转化的任务 是否是第一次转化的任务
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetRelatedVisitTaskOutDto.IsExistsClinicalData">
<summary>
是否存在临床数据
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetGlobalReadingInfoInDto.UsingOriginalData"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetGlobalReadingInfoInDto.UsingOriginalData">
<summary> <summary>
当新答案为空的时候 是否是有原数据 当新答案为空的时候 是否是有原数据
@@ -5911,6 +5916,11 @@
限制编辑 限制编辑
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit.LimitShow">
<summary>
限制显示
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit.MaxAnswerLength"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit.MaxAnswerLength">
<summary> <summary>
最大答案长度 最大答案长度
@@ -5989,6 +5999,11 @@
限制编辑 限制编辑
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionSystemAddOrEdit.LimitShow">
<summary>
限制显示
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionSystemAddOrEdit.MaxAnswerLength"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionSystemAddOrEdit.MaxAnswerLength">
<summary> <summary>
最大答案长度 最大答案长度
@@ -6332,6 +6347,11 @@
限制编辑 限制编辑
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.LimitShow">
<summary>
限制显示
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.MaxAnswerLength"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.MaxAnswerLength">
<summary> <summary>
最大答案长度 最大答案长度
@@ -6382,6 +6402,11 @@
限制编辑 限制编辑
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionSystemView.LimitShow">
<summary>
限制显示
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionSystemView.MaxAnswerLength"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionSystemView.MaxAnswerLength">
<summary> <summary>
最大答案长度 最大答案长度
@@ -6717,6 +6742,11 @@
限制编辑 限制编辑
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionSystemInDto.LimitShow">
<summary>
限制显示
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionSystemInDto.MaxAnswerLength"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionSystemInDto.MaxAnswerLength">
<summary> <summary>
最大答案长度 最大答案长度
@@ -7042,6 +7072,11 @@
限制编辑 限制编辑
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.LimitShow">
<summary>
限制显示
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.MaxAnswerLength"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.MaxAnswerLength">
<summary> <summary>
最大答案长度 最大答案长度
Binary file not shown.
@@ -56,9 +56,15 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid SiteId { get; set; } public Guid SiteId { get; set; }
public string BlindTrialSiteCode { get; set; }
public String TrialSiteCode { get; set; } = String.Empty; public String TrialSiteCode { get; set; } = String.Empty;
public string SubjectCode { get; set; } = String.Empty; public string SubjectCode { get; set; } = String.Empty;
public string MedicalNo { get; set; } = string.Empty;
public string BlindSubjectCode { get; set; } = string.Empty;
public bool IsPMSetBack { get; set; } public bool IsPMSetBack { get; set; }
@@ -358,6 +364,9 @@ namespace IRaCIS.Core.Application.ViewModel
{ {
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
public Guid? SubjectId { get; set; }
public Guid TrialReadingCriterionId { get; set; } public Guid TrialReadingCriterionId { get; set; }
public string? SubjectCode { get; set; } = null; public string? SubjectCode { get; set; } = null;
@@ -431,6 +440,7 @@ namespace IRaCIS.Core.Application.ViewModel
public DateTime? LatestReplyTimeBegin { get; set; } public DateTime? LatestReplyTimeBegin { get; set; }
public DateTime? LatestReplyTimeEnd { get; set; } public DateTime? LatestReplyTimeEnd { get; set; }
public string? RequestReReadingReason { get; set; }
} }
public class PIAuditTaskEnrollOrPdCommand public class PIAuditTaskEnrollOrPdCommand
@@ -280,15 +280,15 @@ namespace IRaCIS.Core.Application.Service
var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
} }
}
}
await _visitTaskRepository.SaveChangesAsync(); await _visitTaskRepository.SaveChangesAsync();
} }
}
}
@@ -26,6 +26,7 @@ using IRaCIS.Application.Services.BackGroundJob;
using Magicodes.ExporterAndImporter.Core.Extension; using Magicodes.ExporterAndImporter.Core.Extension;
using Hangfire; using Hangfire;
using MassTransit; using MassTransit;
using static IRaCIS.Core.Domain.Models.ReadingQuestionTrial;
namespace IRaCIS.Core.Application.Service.Allocation namespace IRaCIS.Core.Application.Service.Allocation
{ {
@@ -103,7 +104,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
var list = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.TrialId == trialId && t.IsConfirm) var list = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.TrialId == trialId && t.IsConfirm)
.OrderBy(t => t.ShowOrder) .OrderBy(t => t.ShowOrder)
.Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, IsAutoCreate = t.IsAutoCreate, IsAdditionalAssessment = t.IsAdditionalAssessment, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, ReadingType = t.ReadingType, ReadingInfoSignTime = t.ReadingInfoSignTime }) .Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, IsAutoCreate = t.IsAutoCreate, IsAdditionalAssessment = t.IsAdditionalAssessment, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, ReadingType = t.ReadingType, ReadingInfoSignTime = t.ReadingInfoSignTime , IsReadingPeriod= t.IsReadingPeriod })
.ToListAsync(); .ToListAsync();
return list.AsQueryable().WhereIf(isHaveSigned == true, t => t.ReadingInfoSignTime != null) return list.AsQueryable().WhereIf(isHaveSigned == true, t => t.ReadingInfoSignTime != null)
@@ -209,8 +210,8 @@ namespace IRaCIS.Core.Application.Service.Allocation
.WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate) .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate)
.WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1))
.WhereIf(trialConfig?.EnrollConfirmDefaultUserType == UserTypeEnum.MIM && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM, t => t.SourceSubjectVisit.IsBaseLine == true) .WhereIf(trialConfig?.EnrollConfirmDefaultUserType == UserTypeEnum.MIM && trialConfig?.PDProgressDefaultUserType != UserTypeEnum.MIM && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM , t => t.SourceSubjectVisit.IsBaseLine == true)
.WhereIf(trialConfig?.PDProgressDefaultUserType == UserTypeEnum.MIM && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM, t => t.SourceSubjectVisit.IsBaseLine == false) .WhereIf(trialConfig?.EnrollConfirmDefaultUserType != UserTypeEnum.MIM && trialConfig?.PDProgressDefaultUserType == UserTypeEnum.MIM && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM, t => t.SourceSubjectVisit.IsBaseLine == false)
.WhereIf(queryVisitTask.IsWaitPIAudit == true, t => t.FirstAuditUserId == null) .WhereIf(queryVisitTask.IsWaitPIAudit == true, t => t.FirstAuditUserId == null)
.WhereIf(queryVisitTask.IsWaitPIAudit == false, t => t.FirstAuditUserId != null) .WhereIf(queryVisitTask.IsWaitPIAudit == false, t => t.FirstAuditUserId != null)
.WhereIf(queryVisitTask.PIAuditState != null, t => t.PIAuditState == queryVisitTask.PIAuditState) .WhereIf(queryVisitTask.PIAuditState != null, t => t.PIAuditState == queryVisitTask.PIAuditState)
@@ -226,6 +227,8 @@ namespace IRaCIS.Core.Application.Service.Allocation
public async Task<IResponseOutput<PageOutput<PIReaingTaskView>>> GetPIReadingAuditList(VisitTaskQuery queryVisitTask) public async Task<IResponseOutput<PageOutput<PIReaingTaskView>>> GetPIReadingAuditList(VisitTaskQuery queryVisitTask)
{ {
//CriterionType? criterionType = _trialReadingCriterionRepository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t=>t.CriterionType).FirstOrDefault();
var visitTaskQueryable = GetReadingTaskQueryable(queryVisitTask) var visitTaskQueryable = GetReadingTaskQueryable(queryVisitTask)
.ProjectTo<PIReaingTaskView>(_mapper.ConfigurationProvider); .ProjectTo<PIReaingTaskView>(_mapper.ConfigurationProvider);
@@ -237,6 +240,8 @@ namespace IRaCIS.Core.Application.Service.Allocation
var questionList = _readingQuestionTrialRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.ReadingQuestionCriterionTrialId == queryVisitTask.TrialReadingCriterionId) var questionList = _readingQuestionTrialRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.ReadingQuestionCriterionTrialId == queryVisitTask.TrialReadingCriterionId)
.Where(t => t.IsJudgeQuestion == true) .Where(t => t.IsJudgeQuestion == true)
//.WhereIf(criterionType!=null&& criterionType!=CriterionType.SelfDefine,t=>t.IsJudgeQuestion==true)
// .WhereIf(criterionType != null && criterionType == CriterionType.SelfDefine, t => t.AssessmentResultEnum == AssessmentResultType.AssessmentResult)
.Select(t => new { QuestionId = t.Id, QuestionName = _userInfo.IsEn_Us ? t.QuestionEnName : t.QuestionName ,t.DictionaryCode}).ToList(); .Select(t => new { QuestionId = t.Id, QuestionName = _userInfo.IsEn_Us ? t.QuestionEnName : t.QuestionName ,t.DictionaryCode}).ToList();
trialTaskConfig!.OtherObj = questionList; trialTaskConfig!.OtherObj = questionList;
@@ -418,6 +423,8 @@ namespace IRaCIS.Core.Application.Service.Allocation
.WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.OriginalReReadingTask.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId) .WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.OriginalReReadingTask.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId)
.WhereIf(queryVisitTask.ReadingCategory != null, t => t.OriginalReReadingTask.ReadingCategory == queryVisitTask.ReadingCategory) .WhereIf(queryVisitTask.ReadingCategory != null, t => t.OriginalReReadingTask.ReadingCategory == queryVisitTask.ReadingCategory)
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.RequestReReadingReason), t => t.RequestReReadingReason.Contains(queryVisitTask.RequestReReadingReason))
.WhereIf(queryVisitTask.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == queryVisitTask.RequestReReadingResultEnum) .WhereIf(queryVisitTask.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == queryVisitTask.RequestReReadingResultEnum)
.WhereIf(queryVisitTask.PIAuditState != null, t => t.OriginalReReadingTask.PIAuditState == queryVisitTask.PIAuditState) .WhereIf(queryVisitTask.PIAuditState != null, t => t.OriginalReReadingTask.PIAuditState == queryVisitTask.PIAuditState)
@@ -656,39 +663,40 @@ namespace IRaCIS.Core.Application.Service.Allocation
var visitQuery = _visitTaskRepository var visitQuery = _visitTaskRepository
.Where(x => x.TrialId == inDto.TrialId && x.TaskState == TaskState.Effect) .Where(x => x.TrialId == inDto.TrialId && x.TaskState == TaskState.Effect)
.WhereIf(inDto.SubjectId!=null,t=>t.SubjectId==inDto.SubjectId)
//PI 读基线的时候,subject 如果PI基线没阅片完,SR就不能看 //PI 读基线的时候,subject 如果PI基线没阅片完,SR就不能看
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline, .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline && readingDivisionEnum == ReadingDivisionEnum.PIandSR,
t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId == trialReadingCriterionId)) t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId == trialReadingCriterionId))
//PI 读随访的时候, subject 如果SR基线没阅片完,PI就不能看 //PI 读随访的时候, subject 如果SR基线没阅片完,PI就不能看
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit, .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit && readingDivisionEnum == ReadingDivisionEnum.PIandSR,
t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId == trialReadingCriterionId)) t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId == trialReadingCriterionId))
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR, t => t.Subject.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.Id)) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR, t => t.Subject.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.Id))
// 仅仅SR阅片 PI 没有任务列表 // 仅仅SR阅片 PI 没有任务列表
.WhereIf(readingDivisionEnum == ReadingDivisionEnum.OnlySR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI, t => t.TrialId == Guid.Empty) .WhereIf(readingDivisionEnum == ReadingDivisionEnum.OnlySR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI, t => t.TrialId == Guid.Empty)
//PI查看 PI阅片所有基线
.WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline, .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline,
t => t.SourceSubjectVisit.IsBaseLine == true) t => t.SourceSubjectVisit.IsBaseLine == true)
//PI 阅片所有 // PI查看 PI 阅片所有
.WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllBaselineandVisit, .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllBaselineandVisit,
t => true) t => true)
// PI查看 PI 阅片访视
.WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit, .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit,
t => t.SourceSubjectVisit.IsBaseLine == false) t => t.SourceSubjectVisit.IsBaseLine == false)
//SR查看 PI阅片所有基线
.WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline, .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline,
t => t.SourceSubjectVisit.IsBaseLine == false) t => t.SourceSubjectVisit.IsBaseLine == false)
//SR 不阅片 //SR查看 PI 阅片所有
.WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaselineandVisit, .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaselineandVisit,
t => t.TrialId == Guid.Empty) t => t.TrialId == Guid.Empty)
//SR查看 PI 阅片访视
.WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllVisit, .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllVisit,
t => t.SourceSubjectVisit.IsBaseLine == true) t => t.SourceSubjectVisit.IsBaseLine == true)
@@ -4,6 +4,7 @@ using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using static IRaCIS.Core.Domain.Models.ReadingQuestionTrial;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
{ {
@@ -63,8 +64,10 @@ namespace IRaCIS.Core.Application.Service
.ForMember(o => o.SiteId, t => t.MapFrom(u => u.Subject.SiteId)) .ForMember(o => o.SiteId, t => t.MapFrom(u => u.Subject.SiteId))
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindTrialSiteCode : u.Subject.TrialSite.TrialSiteCode)) .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => /*u.IsAnalysisCreate == true ? u.BlindTrialSiteCode :*/ u.Subject.TrialSite.TrialSiteCode))
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code)) .ForMember(o => o.SubjectCode, t => t.MapFrom(u => /*u.IsAnalysisCreate == true ? u.BlindSubjectCode :*/ u.Subject.Code))
.ForMember(o => o.MedicalNo, t => t.MapFrom(u => u.Subject.MedicalNo))
.ForMember(o => o.UserCode, t => t.MapFrom(u => u.DoctorUser.UserCode)) .ForMember(o => o.UserCode, t => t.MapFrom(u => u.DoctorUser.UserCode))
.ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)) .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName))
.ForMember(o => o.FullName, t => t.MapFrom(u => u.DoctorUser.FullName)) .ForMember(o => o.FullName, t => t.MapFrom(u => u.DoctorUser.FullName))
@@ -83,7 +86,8 @@ namespace IRaCIS.Core.Application.Service
CreateMap<VisitTask, ReadingTaskView>().IncludeBase<VisitTask, VisitTaskView>() CreateMap<VisitTask, ReadingTaskView>().IncludeBase<VisitTask, VisitTaskView>()
.ForMember(t=>t.PIReadingResultList,u=>u.MapFrom(c=>c.ReadingTaskQuestionAnswerList .ForMember(t=>t.PIReadingResultList,u=>u.MapFrom(c=>c.ReadingTaskQuestionAnswerList
.Where(t=>t.ReadingQuestionTrial.IsJudgeQuestion==true ).Select(d=>new PIReadingResult() { QuestionId= d.ReadingQuestionTrialId,Answer=d.Answer}))); .Where(t=> /*t.ReadingQuestionCriterionTrial.CriterionType==CriterionType.SelfDefine? t.ReadingQuestionTrial.AssessmentResultEnum == AssessmentResultType.AssessmentResult:*/ t.ReadingQuestionTrial.IsJudgeQuestion==true)
.Select(d=>new PIReadingResult() { QuestionId= d.ReadingQuestionTrialId,Answer=d.Answer})));
CreateMap<VisitTask, PIReaingTaskView>().IncludeBase<VisitTask, ReadingTaskView>() CreateMap<VisitTask, PIReaingTaskView>().IncludeBase<VisitTask, ReadingTaskView>()
.ForMember(o => o.FirstAuditUserName, t => t.MapFrom(u => u.FirstAuditUser.UserName)) .ForMember(o => o.FirstAuditUserName, t => t.MapFrom(u => u.FirstAuditUser.UserName))
@@ -165,13 +169,13 @@ namespace IRaCIS.Core.Application.Service
CreateMap<VisitTask, TaskMedicalReviewView>() CreateMap<VisitTask, TaskMedicalReviewView>()
.ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName)) .ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName))
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindTrialSiteCode : u.Subject.TrialSite.TrialSiteCode)) .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u =>/* u.IsAnalysisCreate == true ? u.BlindTrialSiteCode :*/ u.Subject.TrialSite.TrialSiteCode))
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code)); .ForMember(o => o.SubjectCode, t => t.MapFrom(u => /*u.IsAnalysisCreate == true ? u.BlindSubjectCode :*/ u.Subject.Code));
CreateMap<VisitTask, GenerateMedicalReviewTaskView>() CreateMap<VisitTask, GenerateMedicalReviewTaskView>()
.ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName)) .ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName))
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindTrialSiteCode : u.Subject.TrialSite.TrialSiteCode)) .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => /*u.IsAnalysisCreate == true ? u.BlindTrialSiteCode :*/ u.Subject.TrialSite.TrialSiteCode))
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code)) .ForMember(o => o.SubjectCode, t => t.MapFrom(u => /*u.IsAnalysisCreate == true ? u.BlindSubjectCode :*/ u.Subject.Code))
.ForMember(o => o.GeneratedMedicalReviewCount, t => t.MapFrom(u => u.TaskMedicalReviewList.Count())) .ForMember(o => o.GeneratedMedicalReviewCount, t => t.MapFrom(u => u.TaskMedicalReviewList.Count()))
.ForMember(o => o.MedicalNo, t => t.MapFrom(u => u.Subject.MedicalNo)) .ForMember(o => o.MedicalNo, t => t.MapFrom(u => u.Subject.MedicalNo))
.ForMember(o => o.IsGeneratedJudge, t => t.MapFrom(u => u.JudgeVisitTaskId != null)) .ForMember(o => o.IsGeneratedJudge, t => t.MapFrom(u => u.JudgeVisitTaskId != null))
@@ -755,6 +755,7 @@ namespace IRaCIS.Core.Application.Service.Common
//.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null) //.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null)
.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) .WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState)
.WhereIf(queryVisitTask.ArmEnum != null, t => t.ArmEnum == queryVisitTask.ArmEnum)
.WhereIf(queryVisitTask.SiteId != null, t => t.Subject.SiteId == queryVisitTask.SiteId) .WhereIf(queryVisitTask.SiteId != null, t => t.Subject.SiteId == queryVisitTask.SiteId)
.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) .WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId)
.WhereIf(queryVisitTask.IsUrgent != null, t => t.IsUrgent == queryVisitTask.IsUrgent) .WhereIf(queryVisitTask.IsUrgent != null, t => t.IsUrgent == queryVisitTask.IsUrgent)
@@ -144,7 +144,8 @@ namespace IRaCIS.Core.Application.Service
await _internationalizationRepository.SaveChangesAsync(); await _internationalizationRepository.SaveChangesAsync();
//清理缓存
_provider.Set<List<InternationalizationSimpleDto>>(StaticData.InternationalData.Front, new List<InternationalizationSimpleDto>(), TimeSpan.FromDays(1));
return ResponseOutput.Ok(); return ResponseOutput.Ok();
} }
@@ -183,6 +184,9 @@ namespace IRaCIS.Core.Application.Service
} }
//清理缓存
_provider.Set<List<InternationalizationSimpleDto>>(StaticData.InternationalData.Front, new List<InternationalizationSimpleDto>(), TimeSpan.FromDays(1));
return ResponseOutput.Ok(entity.Id.ToString()); return ResponseOutput.Ok(entity.Id.ToString());
} }
@@ -192,6 +196,9 @@ namespace IRaCIS.Core.Application.Service
public async Task<IResponseOutput> DeleteInternationalization(Guid internationalizationId) public async Task<IResponseOutput> DeleteInternationalization(Guid internationalizationId)
{ {
var success = await _internationalizationRepository.DeleteFromQueryAsync(t => t.Id == internationalizationId, true); var success = await _internationalizationRepository.DeleteFromQueryAsync(t => t.Id == internationalizationId, true);
//清理缓存
_provider.Set<List<InternationalizationSimpleDto>>(StaticData.InternationalData.Front, new List<InternationalizationSimpleDto>(), TimeSpan.FromDays(1));
return ResponseOutput.Ok(); return ResponseOutput.Ok();
} }
@@ -177,6 +177,7 @@ namespace IRaCIS.Application.Services
builder.HtmlBody = string.Format(templateInfo, builder.HtmlBody = string.Format(templateInfo,
"",
//---您正在进行邮箱重置密码操作 //---您正在进行邮箱重置密码操作
_localizer["Mail_ResettingPassword"], _localizer["Mail_ResettingPassword"],
verificationCode verificationCode
@@ -244,6 +245,7 @@ namespace IRaCIS.Application.Services
builder.HtmlBody = string.Format(templateInfo, builder.HtmlBody = string.Format(templateInfo,
"",
//---您正在参与展影医疗IRC项目 //---您正在参与展影医疗IRC项目
_localizer["Mail_IRCProject"], _localizer["Mail_IRCProject"],
verificationCode verificationCode
@@ -310,6 +312,7 @@ namespace IRaCIS.Application.Services
builder.HtmlBody = string.Format(templateInfo, builder.HtmlBody = string.Format(templateInfo,
"",
//---您正在参与展影医疗IRC项目中心调研工作 //---您正在参与展影医疗IRC项目中心调研工作
_localizer["Mail_CenterResearchReminder"], _localizer["Mail_CenterResearchReminder"],
verificationCode verificationCode
@@ -1322,13 +1322,14 @@ namespace IRaCIS.Core.Application.Service
/// </summary> /// </summary>
/// <param name="queryEmailNoticeConfig"></param> /// <param name="queryEmailNoticeConfig"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost]
public async Task<PageOutput<TrialSelectEmailNoticeConfigView>> GetSysEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig) public async Task<PageOutput<TrialSelectEmailNoticeConfigView>> GetSysEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig)
{ {
var emailNoticeConfigQueryable = _emailNoticeConfigRepository var emailNoticeConfigQueryable = _emailNoticeConfigRepository
.WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum) .WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum)
.WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired) .WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired)
.WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable) .WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable)
.WhereIf(queryEmailNoticeConfig.CriterionTypeEnum != null, t => t.CriterionTypeEnum == queryEmailNoticeConfig.CriterionTypeEnum)
.ProjectTo<TrialSelectEmailNoticeConfigView>(_mapper.ConfigurationProvider, new { trialId = queryEmailNoticeConfig.TrialId }); .ProjectTo<TrialSelectEmailNoticeConfigView>(_mapper.ConfigurationProvider, new { trialId = queryEmailNoticeConfig.TrialId });
return await emailNoticeConfigQueryable.ToPagedListAsync(queryEmailNoticeConfig.PageIndex, queryEmailNoticeConfig.PageSize, queryEmailNoticeConfig.SortField, queryEmailNoticeConfig.Asc); return await emailNoticeConfigQueryable.ToPagedListAsync(queryEmailNoticeConfig.PageIndex, queryEmailNoticeConfig.PageSize, queryEmailNoticeConfig.SortField, queryEmailNoticeConfig.Asc);
@@ -30,6 +30,8 @@ namespace IRaCIS.Core.Application.Contracts
public bool IsDeleted { get; set; } public bool IsDeleted { get; set; }
public bool IsReading { get; set; } = true; public bool IsReading { get; set; } = true;
public string SliceThickness { get; set; } = String.Empty;
public string ImageResizePath { get; set; } public string ImageResizePath { get; set; }
} }
@@ -81,6 +81,7 @@ namespace IRaCIS.Core.Application.Service
CreateMap<DicomInstance, DicomInstanceDTO>() CreateMap<DicomInstance, DicomInstanceDTO>()
.ForMember(o => o.IsDeleted, t => t.MapFrom(u => u.DicomSerie.IsDeleted)) .ForMember(o => o.IsDeleted, t => t.MapFrom(u => u.DicomSerie.IsDeleted))
.ForMember(o => o.SliceThickness, t => t.MapFrom(u => u.DicomSerie.SliceThickness))
.ForMember(o => o.IsReading, t => t.MapFrom(u => u.DicomSerie.IsReading)); .ForMember(o => o.IsReading, t => t.MapFrom(u => u.DicomSerie.IsReading));
CreateMap<DicomStudy, DicomStudyDTO>(); CreateMap<DicomStudy, DicomStudyDTO>();
CreateMap<DicomSeries, DicomSeriesDTO>(); CreateMap<DicomSeries, DicomSeriesDTO>();
@@ -319,9 +319,9 @@ namespace IRaCIS.Core.Application.Service
{ {
continue; continue;
} }
str = await GetInspectionEnumValue(listIdentification, str); str = await GetInspectionEnumValue(listIdentification, item.Identification, str);
str = await SetEnum(dto.TrialId, listIdentification, str); str = await SetEnum(dto.TrialId, listIdentification, item.Identification, str);
str = await SetDataInspectionDateType(listIdentification, str); str = await SetDataInspectionDateType(listIdentification, item.Identification, str);
jsonDict[nameof(InspectionJsonDetail.Data)] = JsonConvert.DeserializeObject<object>(str); jsonDict[nameof(InspectionJsonDetail.Data)] = JsonConvert.DeserializeObject<object>(str);
@@ -331,9 +331,9 @@ namespace IRaCIS.Core.Application.Service
{ {
continue; continue;
} }
str2 = await GetInspectionEnumValue(listIdentification, str2); str2 = await GetInspectionEnumValue(listIdentification, item.Identification, str2);
str2 = await SetEnum(dto.TrialId, listIdentification, str2); str2 = await SetEnum(dto.TrialId, listIdentification, item.Identification, str2);
str2 = await SetDataInspectionDateType(listIdentification, str2); str2 = await SetDataInspectionDateType(listIdentification, item.Identification, str2);
jsonDict[nameof(InspectionJsonDetail.CommonData)] = JsonConvert.DeserializeObject<object>(str2); jsonDict[nameof(InspectionJsonDetail.CommonData)] = JsonConvert.DeserializeObject<object>(str2);
#endregion #endregion
@@ -456,20 +456,23 @@ namespace IRaCIS.Core.Application.Service
/// <param name="identificationList"></param> /// <param name="identificationList"></param>
/// <param name="jsonStr"></param> /// <param name="jsonStr"></param>
/// <returns></returns> /// <returns></returns>
private async Task<string> SetDataInspectionDateType(List<string> identificationList, string jsonStr) private async Task<string> SetDataInspectionDateType(List<string> identificationList,string identification, string jsonStr)
{ {
var list = await (from parent in _frontAuditConfigRepository.AsQueryable().Where(x => identificationList.Contains(x.Identification)) var list = await (from parent in _frontAuditConfigRepository.AsQueryable().Where(x => identificationList.Contains(x.Identification))
join child in _frontAuditConfigRepository.AsQueryable().Where(x => x.EnumType == "Date" && x.IsEnable) on parent.Id equals child.ParentId join child in _frontAuditConfigRepository.AsQueryable().Where(x => x.EnumType == "Date" && x.IsEnable) on parent.Id equals child.ParentId
select new DateDto() select new DateDto()
{ {
Identification= parent.Identification,
Code = child.Code, Code = child.Code,
DateType = child.DateType, DateType = child.DateType,
}).ToListAsync(); }).ToListAsync();
list = list.GroupBy(x => new { x.Code }, (key, lst) => new DateDto() list = list.GroupBy(x => new { x.Code }, (key, lst) => new DateDto()
{ {
Code = key.Code, Code = key.Code,
DateType = lst.Max(x => x.DateType), DateType = lst.FirstOrDefault(y => y.Identification == identification)?.DateType ?? lst.Max(x => x.DateType),
}).ToList(); }).ToList();
var jsonDataDic = JsonConvert.DeserializeObject<IDictionary<string, object>>(jsonStr); var jsonDataDic = JsonConvert.DeserializeObject<IDictionary<string, object>>(jsonStr);
@@ -519,13 +522,14 @@ namespace IRaCIS.Core.Application.Service
///// <param name="ForeignKeyValue">外键value</param> ///// <param name="ForeignKeyValue">外键value</param>
///// <param name="ForeignKeyText">要查询的外键值</param> ///// <param name="ForeignKeyText">要查询的外键值</param>
///// <param name="value">传入的纸</param> ///// <param name="value">传入的纸</param>
private async Task<string> GetInspectionEnumValue(List<string> identificationList, string jsonStr) private async Task<string> GetInspectionEnumValue(List<string> identificationList,string identification, string jsonStr)
{ {
var list = await (from u in _frontAuditConfigRepository.Where(x => identificationList.Contains(x.Identification)) var list = await (from u in _frontAuditConfigRepository.Where(x => identificationList.Contains(x.Identification))
join p in _frontAuditConfigRepository.Where(x => x.EnumType == "Foreign" && x.IsEnable) on u.Id equals p.ParentId join p in _frontAuditConfigRepository.Where(x => x.EnumType == "Foreign" && x.IsEnable) on u.Id equals p.ParentId
select new select new
{ {
Key = p.Code, Key = p.Code,
Identification=u.Identification,
ForeignKeyValue = p.ForeignKeyValue, ForeignKeyValue = p.ForeignKeyValue,
ForeignKeyText = p.ForeignKeyText, ForeignKeyText = p.ForeignKeyText,
ForeignKeyTable = p.ForeignKeyTableName ForeignKeyTable = p.ForeignKeyTableName
@@ -533,9 +537,10 @@ namespace IRaCIS.Core.Application.Service
list = list.GroupBy(x => new { x.Key }, (key, lst) => new list = list.GroupBy(x => new { x.Key }, (key, lst) => new
{ {
Key = key.Key, Key = key.Key,
ForeignKeyValue = lst.Max(x => x.ForeignKeyValue), Identification=string.Empty,
ForeignKeyText = lst.Max(x => x.ForeignKeyText), ForeignKeyValue= lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyValue ?? lst.Max(x => x.ForeignKeyValue),
ForeignKeyTable = lst.Max(x => x.ForeignKeyTable), ForeignKeyText = lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyText ?? lst.Max(x => x.ForeignKeyText),
ForeignKeyTable = lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyTable ?? lst.Max(x => x.ForeignKeyTable),
}).ToList(); }).ToList();
@@ -585,7 +590,7 @@ namespace IRaCIS.Core.Application.Service
/// <param name="identificationList">标识</param> /// <param name="identificationList">标识</param>
/// <param name="jsonStr">Json对象</param> /// <param name="jsonStr">Json对象</param>
/// <returns></returns> /// <returns></returns>
private async Task<string> SetEnum(Guid trialId, List<string> identificationList, string jsonStr) private async Task<string> SetEnum(Guid trialId, List<string> identificationList, string identification, string jsonStr)
{ {
if (jsonStr == null || jsonStr == "null") if (jsonStr == null || jsonStr == "null")
{ {
@@ -598,16 +603,29 @@ namespace IRaCIS.Core.Application.Service
join p in _frontAuditConfigRepository.Where(x => (x.DictionaryCode != string.Empty && x.EnumType == "Dictionary") || (x.DataType == "Table") && x.IsEnable) on u.Id equals p.ParentId join p in _frontAuditConfigRepository.Where(x => (x.DictionaryCode != string.Empty && x.EnumType == "Dictionary") || (x.DataType == "Table") && x.IsEnable) on u.Id equals p.ParentId
select new select new
{ {
Key = p.Code,
Identification = u.Identification,
//前端展示类型 //前端展示类型
DataType = p.DataType, DataType = p.DataType,
TableConfigJsonStr = p.TableConfigJsonStr, TableConfigJsonStr = p.TableConfigJsonStr,
Key = p.Code,
Code = p.DictionaryCode, Code = p.DictionaryCode,
Type = p.DictionaryType Type = p.DictionaryType
}).ToListAsync(); }).ToListAsync();
//两条不同的标识 但是里面配置有相同的翻译字典 //两条不同的标识 但是里面配置有相同的翻译字典
list = list.Distinct().ToList(); list = list.GroupBy(x => new { x.Key }, (key, lst) => new
{
Key = key.Key,
Identification = string.Empty,
DataType = lst.FirstOrDefault(y => y.Identification == identification)?.DataType ?? lst.Max(x => x.DataType),
TableConfigJsonStr = lst.FirstOrDefault(y => y.Identification == identification)?.TableConfigJsonStr ?? lst.Max(x => x.TableConfigJsonStr),
Code = lst.FirstOrDefault(y => y.Identification == identification)?.Code ?? lst.Max(x => x.Code),
Type = lst.FirstOrDefault(y => y.Identification == identification)?.Type ?? lst.Max(x => x.Type),
}).ToList();
// 添加单双审 // 添加单双审
var trialtype = await _trialRepository.AsQueryable().Where(x => x.Id == trialId).Select(x => x.QCProcessEnum).FirstOrDefaultAsync(); var trialtype = await _trialRepository.AsQueryable().Where(x => x.Id == trialId).Select(x => x.QCProcessEnum).FirstOrDefaultAsync();
@@ -616,9 +634,10 @@ namespace IRaCIS.Core.Application.Service
{ {
list.Add(new list.Add(new
{ {
Key = "AuditState",
Identification = string.Empty,
DataType = string.Empty, DataType = string.Empty,
TableConfigJsonStr = string.Empty, TableConfigJsonStr = string.Empty,
Key = "AuditState",
Code = trialtype == TrialQCProcess.SingleAudit ? "AuditStatePE" : "AuditStateRC", Code = trialtype == TrialQCProcess.SingleAudit ? "AuditStatePE" : "AuditStateRC",
Type = "Code", Type = "Code",
}); });
@@ -1076,7 +1095,8 @@ namespace IRaCIS.Core.Application.Service
[HttpGet] [HttpGet]
public async Task<List<string>> GetModuleTypeDescriptionList(Guid moduleTypeId) public async Task<List<string>> GetModuleTypeDescriptionList(Guid moduleTypeId)
{ {
var result = await _frontAuditConfigRepository.Where(x => x.ModuleTypeId == moduleTypeId && x.ObjectTypeId != null && x.OptTypeId != null && x.Description.Length > 0).Select(x => new { x.Description, x.DescriptionCN, x.Sort }).OrderBy(t => t.Sort).Select(t => _userInfo.IsEn_Us? t.Description:t.DescriptionCN).Distinct().ToListAsync(); var result =( await _frontAuditConfigRepository.Where(x => x.ModuleTypeId == moduleTypeId && x.ObjectTypeId != null && x.OptTypeId != null && x.Description.Length > 0).Select(x => new { x.Description, x.DescriptionCN, x.Sort }).OrderBy(t => t.Sort).ToListAsync()
).Select(t => _userInfo.IsEn_Us? t.Description:t.DescriptionCN).Distinct().ToList();
return result; return result;
} }
@@ -3,7 +3,7 @@ using IRaCIS.Core.Infrastructure.Extention;
namespace IRaCIS.Application.Contracts namespace IRaCIS.Application.Contracts
{ {
public class SiteDTO: SiteCommand public class SiteDTO : SiteCommand
{ {
} }
@@ -35,6 +35,9 @@ namespace IRaCIS.Application.Contracts
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public string SiteName { get; set; } = String.Empty; public string SiteName { get; set; } = String.Empty;
public string SiteNameCN { get; set; } = String.Empty;
public string City { get; set; } = String.Empty; public string City { get; set; } = String.Empty;
public string Province { get; set; } = string.Empty; public string Province { get; set; } = string.Empty;
@@ -3,18 +3,20 @@ using IRaCIS.Application.Contracts;
using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using Microsoft.Data.Sqlite;
namespace IRaCIS.Application.Services namespace IRaCIS.Application.Services
{ {
[ ApiExplorerSettings(GroupName = "Institution")] [ApiExplorerSettings(GroupName = "Institution")]
public class HospitalService : BaseService, IHospitalService public class HospitalService : BaseService, IHospitalService
{ {
private readonly IRepository<Hospital> _hospitalRepository; private readonly IRepository<Hospital> _hospitalRepository;
private readonly IRepository<Site> _siteRepository;
public HospitalService(IRepository<Hospital> hospitalRepository ) public HospitalService(IRepository<Hospital> hospitalRepository, IRepository<Site> siteRepository)
{ {
_hospitalRepository = hospitalRepository; _hospitalRepository = hospitalRepository;
_siteRepository = siteRepository;
} }
/// <summary> 获取所有医院列表 </summary> /// <summary> 获取所有医院列表 </summary>
@@ -37,13 +39,24 @@ namespace IRaCIS.Application.Services
var exp1 = new EntityVerifyExp<Hospital>() var exp1 = new EntityVerifyExp<Hospital>()
{ {
VerifyExp = x => x.SiteId == hospitalCommand.SiteId && hospitalCommand.SiteId != null, VerifyExp = x => x.SiteId == hospitalCommand.SiteId && hospitalCommand.SiteId != null,
//---已经存在同名的医院,请确认 //---当前中心已经添加到其他医院了
VerifyMsg = _localizer["Hospital_SiteAdded"] VerifyMsg = _localizer["Hospital_SiteAdded"]
}; };
var hospital = await _hospitalRepository.InsertOrUpdateAsync(hospitalCommand, true, exp,exp1); var hospital = await _hospitalRepository.InsertOrUpdateAsync(hospitalCommand, true, exp, exp1);
//手动解绑医院与site的关系
if (hospitalCommand.SiteId == null && hospital.SiteId != null)
{
await _siteRepository.BatchUpdateNoTrackingAsync(t => t.Id == hospital.SiteId, u => new Site() { HospitalId = null });
}
//手动绑
if (hospitalCommand.SiteId != null)
{
await _siteRepository.BatchUpdateNoTrackingAsync(t => t.Id == hospitalCommand.SiteId, u => new Site() { HospitalId = hospital.Id });
}
return ResponseOutput.Ok(hospital.Id.ToString()); return ResponseOutput.Ok(hospital.Id.ToString());
} }
@@ -55,11 +68,6 @@ namespace IRaCIS.Application.Services
public async Task<IResponseOutput> DeleteHospital(Guid hospitalId) public async Task<IResponseOutput> DeleteHospital(Guid hospitalId)
{ {
//if (_userRepository.Find().Any(t => t.OrganizationId == hospitalId))
//{
// return ResponseOutput.NotOk("该医院下存在用户,暂时无法删除。");
//}
var success = await _hospitalRepository.BatchDeleteNoTrackingAsync(x => x.Id == hospitalId); var success = await _hospitalRepository.BatchDeleteNoTrackingAsync(x => x.Id == hospitalId);
return ResponseOutput.Result(success); return ResponseOutput.Result(success);
@@ -72,7 +80,7 @@ namespace IRaCIS.Application.Services
var hospitalQueryable = var hospitalQueryable =
_hospitalRepository _hospitalRepository
.WhereIf(hospitalSearchModel.HospitalName!=null, t => t.HospitalName.Contains(hospitalSearchModel.HospitalName!) || t.HospitalNameCN.Contains(hospitalSearchModel.HospitalName!)) .WhereIf(hospitalSearchModel.HospitalName != null, t => t.HospitalName.Contains(hospitalSearchModel.HospitalName!) || t.HospitalNameCN.Contains(hospitalSearchModel.HospitalName!))
.WhereIf(hospitalSearchModel.City != null, t => t.City.Contains(hospitalSearchModel.City!) || t.HospitalNameCN.Contains(hospitalSearchModel.City!)) .WhereIf(hospitalSearchModel.City != null, t => t.City.Contains(hospitalSearchModel.City!) || t.HospitalNameCN.Contains(hospitalSearchModel.City!))
.WhereIf(hospitalSearchModel.Province != null, t => t.Province.Contains(hospitalSearchModel.Province!) || t.HospitalNameCN.Contains(hospitalSearchModel.Province!)) .WhereIf(hospitalSearchModel.Province != null, t => t.Province.Contains(hospitalSearchModel.Province!) || t.HospitalNameCN.Contains(hospitalSearchModel.Province!))
.ProjectTo<HospitalDTO>(_mapper.ConfigurationProvider); .ProjectTo<HospitalDTO>(_mapper.ConfigurationProvider);
@@ -4,6 +4,7 @@ using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Medallion.Threading; using Medallion.Threading;
using IRaCIS.Core.Domain.Models;
namespace IRaCIS.Application.Services namespace IRaCIS.Application.Services
{ {
@@ -13,12 +14,14 @@ namespace IRaCIS.Application.Services
private readonly IRepository<Site> _siteRepository; private readonly IRepository<Site> _siteRepository;
private readonly IRepository<TrialSiteUser> _trialSiteUserRepository; private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;
private readonly IDistributedLockProvider _distributedLockProvider; private readonly IDistributedLockProvider _distributedLockProvider;
private readonly IRepository<Hospital> _hospitalRepository;
public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository, IDistributedLockProvider distributedLockProvider) public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository, IDistributedLockProvider distributedLockProvider, IRepository<Hospital> hospitalRepository)
{ {
_siteRepository = siteRepository; _siteRepository = siteRepository;
_trialSiteUserRepository = trialSiteUserRepository; _trialSiteUserRepository = trialSiteUserRepository;
_distributedLockProvider = distributedLockProvider; _distributedLockProvider = distributedLockProvider;
_hospitalRepository = hospitalRepository;
} }
/// <summary> 分页获取研究中心列表 </summary> /// <summary> 分页获取研究中心列表 </summary>
@@ -72,6 +75,18 @@ namespace IRaCIS.Application.Services
var site = await _siteRepository.InsertOrUpdateAsync(siteCommand, true, exp); var site = await _siteRepository.InsertOrUpdateAsync(siteCommand, true, exp);
//手动解绑医院与site的关系
if (siteCommand.HospitalId == null && site.HospitalId != null)
{
await _hospitalRepository.BatchUpdateNoTrackingAsync(t => t.Id == site.HospitalId, u => new Hospital() { SiteId = null });
}
//手动绑
if (siteCommand.HospitalId != null)
{
await _hospitalRepository.BatchUpdateNoTrackingAsync(t => t.Id == siteCommand.HospitalId, u => new Hospital() { SiteId = site.Id });
}
return ResponseOutput.Ok(site.Id.ToString()); return ResponseOutput.Ok(site.Id.ToString());
} }
@@ -34,6 +34,8 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid? LoginUserId { get; set; } public Guid? LoginUserId { get; set; }
public Guid? OptUserId { get; set; } public Guid? OptUserId { get; set; }
public string IPRegion { get; set; }
} }
///<summary>UserLogQuery 列表查询参数模型</summary> ///<summary>UserLogQuery 列表查询参数模型</summary>
@@ -47,10 +49,17 @@ namespace IRaCIS.Core.Application.ViewModel
public string? LoginFaildName { get; set; } public string? LoginFaildName { get; set; }
public string? LoginUserName { get; set; }
public DateTime? BeginDate { get; set; } public DateTime? BeginDate { get; set; }
public DateTime? EndDate { get; set; } public DateTime? EndDate { get; set; }
public UserTypeEnum? LoginUserTypeEnum { get; set; }
public Guid? UserTypeId { get; set; }
public Guid? UserId { get; set; }
} }
@@ -129,7 +129,7 @@ namespace IRaCIS.Application.Services
{ {
//检查手机或者邮箱是否有效 //检查手机或者邮箱是否有效
if (!Regex.IsMatch(email, @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")) if (!Regex.IsMatch(email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
{ {
//---Please input a legal email //---Please input a legal email
return ResponseOutput.NotOk(_localizer["User_LegalEmail"]); return ResponseOutput.NotOk(_localizer["User_LegalEmail"]);
@@ -311,7 +311,7 @@ namespace IRaCIS.Application.Services
{ {
//检查手机或者邮箱是否有效 //检查手机或者邮箱是否有效
if (!Regex.IsMatch(email, @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")) if (!Regex.IsMatch(email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
{ {
//---请输入一个正确的邮箱。 //---请输入一个正确的邮箱。
@@ -661,7 +661,9 @@ namespace IRaCIS.Application.Services
failCount++; failCount++;
_cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes)); _cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = Guid.Empty, OptUserId=Guid.Empty, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true); var errorPwdUserId = await _userRepository.Where(u => u.UserName == userName).Select(t => t.Id).FirstOrDefaultAsync();
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = errorPwdUserId, OptUserId=Guid.Empty, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true);
return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO()); return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO());
@@ -694,15 +696,22 @@ namespace IRaCIS.Application.Services
[HttpPost] [HttpPost]
public async Task<PageOutput<UserLogView>> GetUserLogList(UserLogQuery inQuery) public async Task<PageOutput<UserLogView>> GetUserLogList(UserLogQuery inQuery)
{ {
DateTime? trialCreateTime = inQuery.TrialId != null ? _repository.Where<Trial>(t => t.Id == inQuery.TrialId).Select(t => t.CreateTime).FirstOrDefault() : null;
var userLogQueryable = var userLogQueryable =
_userLogRepository _userLogRepository
.WhereIf(inQuery.TrialId != null, t => t.LoginUser.UserTrials.Any(c => c.TrialId == inQuery.TrialId && c.UserId == t.LoginUserId)) .WhereIf(inQuery.TrialId != null, t => t.LoginUser.UserTrials.Any(c => c.TrialId == inQuery.TrialId && (c.UserId == t.LoginUserId || c.UserId == t.OptUserId)))
.WhereIf(trialCreateTime != null, t => t.CreateTime >= trialCreateTime)
.WhereIf(inQuery.OptType != null, t => t.OptType == inQuery.OptType) .WhereIf(inQuery.OptType != null, t => t.OptType == inQuery.OptType)
.WhereIf(inQuery.UserId != null, t => t.LoginUserId == inQuery.UserId)
.WhereIf(inQuery.BeginDate != null, t => t.CreateTime >= inQuery.BeginDate) .WhereIf(inQuery.BeginDate != null, t => t.CreateTime >= inQuery.BeginDate)
.WhereIf(inQuery.EndDate != null, t => t.CreateTime <= inQuery.EndDate) .WhereIf(inQuery.EndDate != null, t => t.CreateTime <= inQuery.EndDate)
.WhereIf(!string.IsNullOrEmpty(inQuery.LoginUserName), t => t.LoginUser.UserName.Contains(inQuery.LoginUserName!))
.WhereIf(!string.IsNullOrEmpty(inQuery.LoginFaildName), t => t.LoginFaildName.Contains(inQuery.LoginFaildName!)) .WhereIf(!string.IsNullOrEmpty(inQuery.LoginFaildName), t => t.LoginFaildName.Contains(inQuery.LoginFaildName!))
.WhereIf(!string.IsNullOrEmpty(inQuery.IP), t => t.IP.Contains(inQuery.IP!)) .WhereIf(!string.IsNullOrEmpty(inQuery.IP), t => t.IP.Contains(inQuery.IP!))
.WhereIf(inQuery.LoginUserTypeEnum != null, t => t.LoginUser.UserTypeEnum == inQuery.LoginUserTypeEnum)
.WhereIf(inQuery.UserTypeId != null, t => t.LoginUser.UserTypeId == inQuery.UserTypeId)
.ProjectTo<UserLogView>(_mapper.ConfigurationProvider); .ProjectTo<UserLogView>(_mapper.ConfigurationProvider);
var pageList = await userLogQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? "Id" : inQuery.SortField, inQuery.Asc); var pageList = await userLogQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? "Id" : inQuery.SortField, inQuery.Asc);
@@ -1224,7 +1224,7 @@ namespace IRaCIS.Core.Application.Image.QA
var trialId = cRCRequestToQCCommand.TrialId; var trialId = cRCRequestToQCCommand.TrialId;
var trialConfig = (await _trialRepository var trialConfig = (await _trialRepository
.Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification, t.IsUrgent, t.IsHaveFirstGiveMedicineDate, t.ClinicalInformationTransmissionEnum }) .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification, t.IsUrgent, t.IsEnrollementQualificationConfirm,t.IsPDProgressView, t.IsHaveFirstGiveMedicineDate, t.ClinicalInformationTransmissionEnum })
.FirstOrDefaultAsync(t => t.TrialId == cRCRequestToQCCommand.TrialId)).IfNullThrowException(); .FirstOrDefaultAsync(t => t.TrialId == cRCRequestToQCCommand.TrialId)).IfNullThrowException();
//找到符合配置的标准 确认的并且签名的、双重,有序,阅片期仲裁 //找到符合配置的标准 确认的并且签名的、双重,有序,阅片期仲裁
@@ -1307,6 +1307,11 @@ namespace IRaCIS.Core.Application.Image.QA
//已确认临床数据完整性 //已确认临床数据完整性
dbSubjectVisit.IsConfirmedClinicalData = true; dbSubjectVisit.IsConfirmedClinicalData = true;
// 根据项目配置 设置访视的入组确认和pd进展
dbSubjectVisit.IsEnrollmentConfirm= dbSubjectVisit.IsBaseLine && trialConfig.IsEnrollementQualificationConfirm ?true:false;
dbSubjectVisit.PDState = dbSubjectVisit.IsBaseLine==false && trialConfig.IsPDProgressView ? PDStateEnum.PDProgress:PDStateEnum.None;
// CRC 上传的基线数据签名 // CRC 上传的基线数据签名
@@ -1355,40 +1360,40 @@ namespace IRaCIS.Core.Application.Image.QA
//dbSubjectVisit.Subject.IsMissingImages = await _subjectVisitRepository.AnyAsync(t => (t.VisitNum < maxVisitNum && t.SubmitState != SubmitStateEnum.Submitted && t.IsLostVisit == false)); //dbSubjectVisit.Subject.IsMissingImages = await _subjectVisitRepository.AnyAsync(t => (t.VisitNum < maxVisitNum && t.SubmitState != SubmitStateEnum.Submitted && t.IsLostVisit == false));
//项目或者Subject IsUrgent 提交时 访视也设置为紧急 //项目或者Subject IsUrgent 提交时 访视也设置为紧急
if (trialConfig.IsUrgent || dbSubjectVisit.Subject.IsUrgent || (dbSubjectVisit.PDState == PDStateEnum.PDProgress && !dbSubjectVisit.IsBaseLine) || (dbSubjectVisit.IsEnrollmentConfirm && dbSubjectVisit.IsBaseLine)) if (trialConfig.IsUrgent || dbSubjectVisit.Subject.IsUrgent || (dbSubjectVisit.IsEnrollmentConfirm && dbSubjectVisit.IsBaseLine))
{ {
if (dbSubjectVisit.PDState == PDStateEnum.PDProgress) //if (dbSubjectVisit.PDState == PDStateEnum.PDProgress)
{ //{
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(x => x.SubjectId == dbSubjectVisit.SubjectId && x.VisitNum <= dbSubjectVisit.VisitNum, x => new SubjectVisit() // await _subjectVisitRepository.BatchUpdateNoTrackingAsync(x => x.SubjectId == dbSubjectVisit.SubjectId && x.VisitNum <= dbSubjectVisit.VisitNum, x => new SubjectVisit()
{ // {
IsUrgent = true // IsUrgent = true
}); // });
// await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId &&
// dbSubjectVisit.VisitNum <= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 及之前 全都加急
// && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
// {
// IsUrgent = true,
// TaskUrgentType = TaskUrgentType.PDProgress,
// IsCanEditUrgentState = false,
// });
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId)&& x.SubjectId == dbSubjectVisit.SubjectId&& // await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId
dbSubjectVisit.VisitNum<= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum+0.01m) // 当前的访视 全局 裁判 及之前 全都加急 // && x.VisitTaskNum < dbSubjectVisit.VisitNum // 当前的访视 全局 裁判 及之前 全都加急
&& x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() // && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
{ // {
IsUrgent = true, // IsUrgent = true,
TaskUrgentType = TaskUrgentType.PDProgress, // TaskUrgentType = TaskUrgentType.Other,
IsCanEditUrgentState=false, // TaskUrgentRemake = "后续访视设为pd",
}); // IsCanEditUrgentState = false,
// });
//}
//else
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId if (dbSubjectVisit.IsEnrollmentConfirm)
&& x.VisitTaskNum < dbSubjectVisit.VisitNum // 当前的访视 全局 裁判 及之前 全都加急
&& x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
{
IsUrgent = true,
TaskUrgentType = TaskUrgentType.Other,
TaskUrgentRemake= "后续访视设为pd",
IsCanEditUrgentState = false,
});
}
else if (dbSubjectVisit.IsEnrollmentConfirm)
{ {
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(x => x.Id == dbSubjectVisit.Id, x => new SubjectVisit() await _subjectVisitRepository.BatchUpdateNoTrackingAsync(x => x.Id == dbSubjectVisit.Id, x => new SubjectVisit()
{ {
@@ -1420,14 +1425,14 @@ namespace IRaCIS.Core.Application.Image.QA
dbSubjectVisit.IsUrgent = true; dbSubjectVisit.IsUrgent = true;
//PD确认的紧急会把前面所有未QC完成的访视均标记为紧急 ////PD确认的紧急会把前面所有未QC完成的访视均标记为紧急
var previosSVlist = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.VisitNum < dbSubjectVisit.VisitNum && t.IsUrgent == false && t.SubmitState == SubmitStateEnum.Submitted, true).ToListAsync(); //var previosSVlist = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.VisitNum < dbSubjectVisit.VisitNum && t.IsUrgent == false && t.SubmitState == SubmitStateEnum.Submitted, true).ToListAsync();
previosSVlist.ForEach(t => //previosSVlist.ForEach(t =>
{ //{
t.IsUrgent = true; // t.IsUrgent = true;
}); //});
} }
@@ -104,7 +104,7 @@ namespace IRaCIS.Core.Application.Service
.ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code))
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode)) .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode))
.ForMember(d => d.CheckDialogStr, u => u.MapFrom(t => string.Join(" | ", t.CheckChallengeDialogList.OrderBy(t => t.CreateTime).Select(c => c.CreateUser.UserName + " " + c.CreateTime.ToString("yyyy-mm-dd hh:mm:ss") + " :" + c.TalkContent)))) .ForMember(d => d.CheckDialogStr, u => u.MapFrom(t => string.Join(" | ", t.CheckChallengeDialogList.OrderBy(t => t.CreateTime).Select(c => c.CreateUser.UserName + " " + c.CreateTime.ToString("yyyy-MM-dd HH:mm:ss") + " :" + c.TalkContent))))
.ForMember(d => d.ModalityList, c => c.MapFrom(s => .ForMember(d => d.ModalityList, c => c.MapFrom(s =>
(s.NoneDicomStudyList.Select(t => t.Modality) (s.NoneDicomStudyList.Select(t => t.Modality)
.Union(s.StudyList.Select(k => k.ModalityForEdit))).Distinct())) .Union(s.StudyList.Select(k => k.ModalityForEdit))).Distinct()))
@@ -190,23 +190,24 @@ namespace IRaCIS.Application.Services
.WhereIf(inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit) .WhereIf(inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
.WhereIf(!inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit) .WhereIf(!inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
.Where(x => x.ClinicalDataTrialSet.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC) .Where(x => x.ClinicalDataTrialSet.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC)
.Include(x=>x.ClinicalDataTrialSet) .Include(x => x.ClinicalDataTrialSet)
.OrderBy(x=>x.ClinicalDataTrialSet.CreateTime) .OrderBy(x => x.ClinicalDataTrialSet.CreateTime)
.Select(x => new GetCRCClinicalDataOutDto() .Select(x => new GetCRCClinicalDataOutDto()
{ {
Id = x.Id, Id = x.Id,
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us) , ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us),
ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType, ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType,
ClinicalDataSetEnName=x.ClinicalDataTrialSet.ClinicalDataSetEnName, ClinicalDataSetEnName = x.ClinicalDataTrialSet.ClinicalDataSetEnName,
ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id, ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id,
FileName = x.ClinicalDataTrialSet.FileName, FileName = x.ClinicalDataTrialSet.FileName,
UploadRole = x.ClinicalDataTrialSet.UploadRole, UploadRole = x.ClinicalDataTrialSet.UploadRole,
Path = x.ClinicalDataTrialSet.Path, Path = x.ClinicalDataTrialSet.Path,
IsBlind = x.IsBlind, IsBlind = x.IsBlind,
IsComplete = x.IsComplete, IsComplete = x.IsComplete,
ClinicalFromList=x.Subject.ClinicalFormList.Where(y=>y.ReadingId==x.ReadingId&&y.ClinicalDataTrialSetId==x.ClinicalDataTrialSetId).Select(y=> new ClinicalFromData() { ClinicalFromList = x.Subject.ClinicalFormList.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData()
CheckDate=y.CheckDate, {
ClinicalFormId=y.Id CheckDate = y.CheckDate,
ClinicalFormId = y.Id
}).ToList(), }).ToList(),
PDFFileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto() PDFFileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto()
{ {
@@ -287,7 +288,7 @@ namespace IRaCIS.Application.Services
//} //}
data.IsBlind = inDto.IsBlind; data.IsBlind = inDto.IsBlind;
data.IsComplete=inDto.IsComplete; data.IsComplete = inDto.IsComplete;
data.IsSign = true; data.IsSign = true;
data.ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned; data.ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned;
@@ -304,8 +305,25 @@ namespace IRaCIS.Application.Services
await this.iServiceProvider.GetService<IReadingImageTaskService>().AddOncologyTask(readingId); await this.iServiceProvider.GetService<IReadingImageTaskService>().AddOncologyTask(readingId);
//如果先生成了任务,再签名subject级别 PM 临床数据,那么会导致其他标准的任务签名状态无法得到维护
if (await _repository.AnyAsync<ClinicalDataTrialSet>(t => t.Id == data.ClinicalDataTrialSetId && t.UploadRole == UploadRole.PM && t.ClinicalDataLevel == ClinicalLevel.Subject))
{
var needDealTrialReadingCriterionIdList = _repository.Where<ClinicalDataTrialSet>(t => t.Id == data.ClinicalDataTrialSetId)
.SelectMany(t => t.TrialClinicalDataSetCriteriaList)
.Select(u => u.TrialReadingCriterionId).Distinct().ToList();
foreach (var trialReadingCriterionId in needDealTrialReadingCriterionIdList)
{
await DealVisiTaskClinicalDataSignedAsync(data.TrialId, data.SubjectId, data.ReadingId, data.IsVisit, trialReadingCriterionId);
}
}
else
{
await DealVisiTaskClinicalDataSignedAsync(data.TrialId, data.SubjectId, data.ReadingId, data.IsVisit, inDto.TrialReadingCriterionId); await DealVisiTaskClinicalDataSignedAsync(data.TrialId, data.SubjectId, data.ReadingId, data.IsVisit, inDto.TrialReadingCriterionId);
}
return ResponseOutput.Result(result); return ResponseOutput.Result(result);
} }
@@ -414,7 +432,7 @@ namespace IRaCIS.Application.Services
} }
//有序阅片才维护 IsFrontTaskNeedSignButNotSign 这个状态 //有序阅片才维护 IsFrontTaskNeedSignButNotSign 这个状态
if (_readingQuestionCriterionTrialRepository.Any(t=>t.Id==trialReadingCritrialId && t.IsReadingTaskViewInOrder == true)) if (_readingQuestionCriterionTrialRepository.Any(t => t.Id == trialReadingCritrialId && t.IsReadingTaskViewInOrder == true))
{ {
@@ -429,7 +447,7 @@ namespace IRaCIS.Application.Services
(t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum) (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) || t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)
)) ))
.Select(t => t.Id); .Select(t => t.Id);
@@ -537,13 +555,13 @@ namespace IRaCIS.Application.Services
.WhereIf(inDto.IsVisit && !inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit) .WhereIf(inDto.IsVisit && !inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
.WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataLevel == ClinicalLevel.OncologyRead) .WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataLevel == ClinicalLevel.OncologyRead)
.WhereIf(readModule != null, x => x.ClinicalDataLevel == keyValuePairs[readModule!.ModuleType]) .WhereIf(readModule != null, x => x.ClinicalDataLevel == keyValuePairs[readModule!.ModuleType])
.WhereIf(inDto.TrialReadingCriterionId!=null,x=>x.TrialClinicalDataSetCriteriaList.Any(y=>y.TrialReadingCriterionId== inDto.TrialReadingCriterionId)) .WhereIf(inDto.TrialReadingCriterionId != null, x => x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inDto.TrialReadingCriterionId))
//.WhereIf(criterion!=null,x=>x.CriterionEnumListStr.Contains($"|{(int)criterion.CriterionType}|")) //.WhereIf(criterion!=null,x=>x.CriterionEnumListStr.Contains($"|{(int)criterion.CriterionType}|"))
.Select(x => new GetTrialClinicalDataSelectOutDto() .Select(x => new GetTrialClinicalDataSelectOutDto()
{ {
ClinicalDataLevel = x.ClinicalDataLevel, ClinicalDataLevel = x.ClinicalDataLevel,
ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us), ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us),
ClinicalDataSetEnName=x.ClinicalDataSetEnName, ClinicalDataSetEnName = x.ClinicalDataSetEnName,
ClinicalUploadType = x.ClinicalUploadType, ClinicalUploadType = x.ClinicalUploadType,
FileName = x.FileName, FileName = x.FileName,
Path = x.Path, Path = x.Path,
@@ -709,10 +727,11 @@ namespace IRaCIS.Application.Services
} }
var readingIds = result.Select(x => x.ReadingId).ToList(); var readingIds = result.Select(x => x.ReadingId).ToList();
var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId??default(Guid))).ToListAsync(); var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId ?? default(Guid))).ToListAsync();
result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x => { result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x =>
{
x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId&&y.ClinicalDataTrialSetId==x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData() x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData()
{ {
CheckDate = y.CheckDate, CheckDate = y.CheckDate,
ClinicalFormId = y.Id ClinicalFormId = y.Id
@@ -723,17 +742,18 @@ namespace IRaCIS.Application.Services
// 这里处理CRC上传 阅片期的临床数据 // 这里处理CRC上传 阅片期的临床数据
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId) var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId)
.WhereIf(inDto.SelectIsSign,x=>x.IsPMConfirm) .WhereIf(inDto.SelectIsSign, x => x.IsPMConfirm)
.WhereIf(!inDto.SelectIsSign, x => x.IsCRCConfirm) .WhereIf(!inDto.SelectIsSign, x => x.IsCRCConfirm)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (readModule != null) if (readModule != null)
{ {
var moduleCriterionFromList = await _readModuleCriterionFromRepository var moduleCriterionFromList = await _readModuleCriterionFromRepository
.WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId) .WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId)
.Where(x => x.ReadModuleId == readModule.Id).Select(x => new{ .Where(x => x.ReadModuleId == readModule.Id).Select(x => new
ClinicalFormId= x.ClinicalFormId, {
CheckDate= x.ClinicalForm.CheckDate, ClinicalFormId = x.ClinicalFormId,
ClinicalDataTrialSetId= x.ClinicalForm.ClinicalDataTrialSetId CheckDate = x.ClinicalForm.CheckDate,
ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId
}).ToListAsync(); }).ToListAsync();
@@ -742,16 +762,16 @@ namespace IRaCIS.Application.Services
var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.Structuring) var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.Structuring)
.WhereIf(readModule.ReadingSetType == ReadingSetType.ImageReading, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead) .WhereIf(readModule.ReadingSetType == ReadingSetType.ImageReading, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead)
.WhereIf(readModule.ReadingSetType == ReadingSetType.TumorReading, x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead) .WhereIf(readModule.ReadingSetType == ReadingSetType.TumorReading, x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead)
.Where(x=>x.TrialClinicalDataSetCriteriaList.Any(y=>y.TrialReadingCriterionId==readModule.TrialReadingCriterionId)) .Where(x => x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == readModule.TrialReadingCriterionId))
.Select(x => new GetReadingClinicalDataListOutDto() .Select(x => new GetReadingClinicalDataListOutDto()
{ {
ClinicalDataLevel = x.ClinicalDataLevel, ClinicalDataLevel = x.ClinicalDataLevel,
SubjectId = inDto.SubjectId, SubjectId = inDto.SubjectId,
ReadingId = default(Guid), ReadingId = default(Guid),
IsCRCApplicationRevoke=readModule.IsCRCApplicationRevoke, IsCRCApplicationRevoke = readModule.IsCRCApplicationRevoke,
IsCRCConfirm= readModule.IsCRCConfirm, IsCRCConfirm = readModule.IsCRCConfirm,
IsPMConfirm= readModule.IsPMConfirm, IsPMConfirm = readModule.IsPMConfirm,
ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us), ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us),
ClinicalDataSetEnName = x.ClinicalDataSetEnName, ClinicalDataSetEnName = x.ClinicalDataSetEnName,
ClinicalDataTrialSetId = x.Id, ClinicalDataTrialSetId = x.Id,
@@ -762,7 +782,7 @@ namespace IRaCIS.Application.Services
IsCRCUpload = x.UploadRole == UploadRole.CRC, IsCRCUpload = x.UploadRole == UploadRole.CRC,
IsNeedMerge = true, IsNeedMerge = true,
ReadModuleId = readModule.Id, ReadModuleId = readModule.Id,
TrialClinicalDataSetCriteriaList=x.TrialClinicalDataSetCriteriaList, TrialClinicalDataSetCriteriaList = x.TrialClinicalDataSetCriteriaList,
//FileCount = x.FileCount, //FileCount = x.FileCount,
//ReadingClinicalDataState = x.ReadingClinicalDataState, //ReadingClinicalDataState = x.ReadingClinicalDataState,
@@ -813,7 +833,7 @@ namespace IRaCIS.Application.Services
result = result.Where(x => x.UploadRole == UploadRole.PM).ToList(); result = result.Where(x => x.UploadRole == UploadRole.PM).ToList();
break; break;
case GetClinicalType.CRCConfirm: case GetClinicalType.CRCConfirm:
result = result.Where(x => x.UploadRole == UploadRole.CRC&&x.IsCRCConfirm&&!x.IsPMConfirm).ToList(); result = result.Where(x => x.UploadRole == UploadRole.CRC && x.IsCRCConfirm && !x.IsPMConfirm).ToList();
break; break;
case GetClinicalType.HasSign: case GetClinicalType.HasSign:
result = result.Where(x => x.IsSign).ToList(); result = result.Where(x => x.IsSign).ToList();
@@ -849,15 +869,15 @@ namespace IRaCIS.Application.Services
{ {
var resultQuery = _readingClinicalDataRepository.Where(x => x.SubjectId == inDto.SubjectId) var resultQuery = _readingClinicalDataRepository.Where(x => x.SubjectId == inDto.SubjectId)
.Where(x => x.ReadingId == inDto.ReadingId) .Where(x => x.ReadingId == inDto.ReadingId)
.WhereIf(inDto.ClinicalDataTrialSetId!=null, x=>x.ClinicalDataTrialSetId==inDto.TrialReadingCriterionId) .WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalDataTrialSetId == inDto.TrialReadingCriterionId)
.Where(x => x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t=>t.TrialReadingCriterionId==inDto.TrialReadingCriterionId)) .Where(x => x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId))
.Select(x => new GetReadingClinicalDataListOutDto() .Select(x => new GetReadingClinicalDataListOutDto()
{ {
ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel,
SubjectId = x.SubjectId, SubjectId = x.SubjectId,
ReadingId = x.ReadingId, ReadingId = x.ReadingId,
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us), ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us),
ClinicalDataSetEnName =x.ClinicalDataTrialSet.ClinicalDataSetEnName, ClinicalDataSetEnName = x.ClinicalDataTrialSet.ClinicalDataSetEnName,
ClinicalDataTrialSetId = x.ClinicalDataTrialSetId, ClinicalDataTrialSetId = x.ClinicalDataTrialSetId,
IsSign = x.IsSign, IsSign = x.IsSign,
ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType, ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType,
@@ -884,7 +904,8 @@ namespace IRaCIS.Application.Services
var readingIds = result.Select(x => x.ReadingId).ToList(); var readingIds = result.Select(x => x.ReadingId).ToList();
var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId ?? default(Guid))).ToListAsync(); var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId ?? default(Guid))).ToListAsync();
result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x => { result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x =>
{
x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData() x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData()
{ {
@@ -895,14 +916,15 @@ namespace IRaCIS.Application.Services
}); });
// 这里处理CRC上传 阅片期的临床数据 // 这里处理CRC上传 阅片期的临床数据
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId&&x.IsCRCConfirm) var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId && x.IsCRCConfirm)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (readModule != null) if (readModule != null)
{ {
var moduleCriterionFromList = await _readModuleCriterionFromRepository.Where(x => x.ReadModuleId == readModule.Id) var moduleCriterionFromList = await _readModuleCriterionFromRepository.Where(x => x.ReadModuleId == readModule.Id)
.WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.TrialReadingCriterionId) .WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.TrialReadingCriterionId)
.Select(x => new { .Select(x => new
{
ClinicalFormId = x.ClinicalFormId, ClinicalFormId = x.ClinicalFormId,
CheckDate = x.ClinicalForm.CheckDate, CheckDate = x.ClinicalForm.CheckDate,
ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId
@@ -911,8 +933,8 @@ namespace IRaCIS.Application.Services
}).ToListAsync(); }).ToListAsync();
var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC&&x.ClinicalUploadType== ClinicalUploadType.Structuring) var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.Structuring)
.WhereIf(readModule.ReadingSetType == ReadingSetType.ImageReading,x=>x.ClinicalDataLevel== ClinicalLevel.ImageRead) .WhereIf(readModule.ReadingSetType == ReadingSetType.ImageReading, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead)
.WhereIf(readModule.ReadingSetType == ReadingSetType.TumorReading, x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead) .WhereIf(readModule.ReadingSetType == ReadingSetType.TumorReading, x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead)
.Where(x => x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == readModule.TrialReadingCriterionId)) .Where(x => x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == readModule.TrialReadingCriterionId))
.Select(x => new GetReadingClinicalDataListOutDto() .Select(x => new GetReadingClinicalDataListOutDto()
@@ -921,9 +943,9 @@ namespace IRaCIS.Application.Services
ClinicalDataLevel = x.ClinicalDataLevel, ClinicalDataLevel = x.ClinicalDataLevel,
SubjectId = inDto.SubjectId, SubjectId = inDto.SubjectId,
ReadingId = default(Guid), ReadingId = default(Guid),
IsCRCApplicationRevoke= readModule.IsCRCApplicationRevoke, IsCRCApplicationRevoke = readModule.IsCRCApplicationRevoke,
IsCRCConfirm = readModule.IsCRCConfirm, IsCRCConfirm = readModule.IsCRCConfirm,
IsPMConfirm=readModule.IsPMConfirm, IsPMConfirm = readModule.IsPMConfirm,
ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us), ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us),
ClinicalDataSetEnName = x.ClinicalDataSetEnName, ClinicalDataSetEnName = x.ClinicalDataSetEnName,
@@ -959,7 +981,7 @@ namespace IRaCIS.Application.Services
}).ToList(); }).ToList();
x.IsSign = readModule.IsPMConfirm ?true : false; x.IsSign = readModule.IsPMConfirm ? true : false;
x.ReadingClinicalDataState = readModule.IsPMConfirm ? ReadingClinicalDataStatus.HaveSigned : ReadingClinicalDataStatus.HaveChecked; x.ReadingClinicalDataState = readModule.IsPMConfirm ? ReadingClinicalDataStatus.HaveSigned : ReadingClinicalDataStatus.HaveChecked;
}); });
@@ -976,7 +998,7 @@ namespace IRaCIS.Application.Services
result = result.Where(x => x.UploadRole == UploadRole.PM).ToList(); result = result.Where(x => x.UploadRole == UploadRole.PM).ToList();
break; break;
case GetClinicalType.CRCConfirm: case GetClinicalType.CRCConfirm:
result = result.Where(x => x.UploadRole == UploadRole.CRC&&x.IsCRCConfirm&&!x.IsPMConfirm).ToList(); result = result.Where(x => x.UploadRole == UploadRole.CRC && x.IsCRCConfirm && !x.IsPMConfirm).ToList();
break; break;
case GetClinicalType.HasSign: case GetClinicalType.HasSign:
result = result.Where(x => x.IsSign).ToList(); result = result.Where(x => x.IsSign).ToList();
@@ -1162,6 +1162,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// 是否是第一次转化的任务 /// 是否是第一次转化的任务
/// </summary> /// </summary>
public bool IsFirstChangeTask { get; set; } = false; public bool IsFirstChangeTask { get; set; } = false;
/// <summary>
/// 是否存在临床数据
/// </summary>
public bool IsExistsClinicalData { get; set; } = false;
} }
public class GetVisitReadingQuestionOutDto public class GetVisitReadingQuestionOutDto
@@ -5,6 +5,7 @@ using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using static IRaCIS.Core.Domain.Models.ReadingQuestionTrial;
namespace IRaCIS.Core.Application.Service.Reading.Dto namespace IRaCIS.Core.Application.Service.Reading.Dto
{ {
@@ -1044,6 +1045,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public List<string> RelevanceValueList { get; set; } public List<string> RelevanceValueList { get; set; }
public List<CalculateInfo> CalculateQuestionList { get; set; } public List<CalculateInfo> CalculateQuestionList { get; set; }
} }
public class ReadingQuestionSystemView public class ReadingQuestionSystemView
@@ -1984,6 +1986,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public List<string> ParentTriggerValueList { get; set; } public List<string> ParentTriggerValueList { get; set; }
public List<string> RelevanceValueList { get; set; } public List<string> RelevanceValueList { get; set; }
} }
public class GetSystemCriterionSelectDto public class GetSystemCriterionSelectDto
@@ -1013,8 +1013,8 @@ namespace IRaCIS.Application.Services
SynchronizeTime = DateTime.Now, SynchronizeTime = DateTime.Now,
IsMustGlobalReading = systemCriterion.IsMustGlobalReading, IsMustGlobalReading = systemCriterion.IsMustGlobalReading,
IseCRFShowInDicomReading=systemCriterion.IseCRFShowInDicomReading, IseCRFShowInDicomReading=systemCriterion.IseCRFShowInDicomReading,
IsGlobalReading = systemCriterion.IsMustGlobalReading ? true : trialCriterion.IsGlobalReading, //IsGlobalReading = systemCriterion.IsMustGlobalReading ? true : trialCriterion.IsGlobalReading,
IsReadingPeriod = systemCriterion.IsMustGlobalReading ? true : trialCriterion.IsReadingPeriod, //IsReadingPeriod = systemCriterion.IsMustGlobalReading ? true : trialCriterion.IsReadingPeriod,
}) ; }) ;
@@ -539,6 +539,20 @@ namespace IRaCIS.Application.Services
}).ToListAsync(); }).ToListAsync();
foreach (var item in result)
{
var clinicalDataList = await _readingClinicalDataService.GetClinicalDataList(new GetReadingOrTaskClinicalDataListInDto()
{
SubjectId = taskInfo.SubjectId,
TrialId = taskInfo.TrialId,
VisitTaskId = item.VisitTaskId,
});
item.IsExistsClinicalData = clinicalDataList.Count > 0;
}
if (!taskInfo.TrialReadingCriterion.IsReadingTaskViewInOrder) if (!taskInfo.TrialReadingCriterion.IsReadingTaskViewInOrder)
{ {
result = result.Where(x => x.VisitTaskId == inDto.VisitTaskId).ToList(); result = result.Where(x => x.VisitTaskId == inDto.VisitTaskId).ToList();
@@ -2315,6 +2329,7 @@ namespace IRaCIS.Application.Services
var subjectTaskList = (await _visitTaskService.GetOrderReadingIQueryable(new GetOrderReadingIQueryableInDto() var subjectTaskList = (await _visitTaskService.GetOrderReadingIQueryable(new GetOrderReadingIQueryableInDto()
{ {
TrialId = inDto.TrialId, TrialId = inDto.TrialId,
SubjectId=inDto.SubjectId,
TrialReadingCriterionId = trialReadingCriterionId!.Value, TrialReadingCriterionId = trialReadingCriterionId!.Value,
Page = new PageInput() Page = new PageInput()
{ {
@@ -2336,7 +2351,7 @@ namespace IRaCIS.Application.Services
if (currentSubject == null) if (currentSubject == null)
{ {
throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"]); throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"], ApiResponseCodeEnum.CloseCurrentWindows);
} }
task = currentSubject.UnReadCanReadTaskList.Select(x => new GetReadingTaskDto() task = currentSubject.UnReadCanReadTaskList.Select(x => new GetReadingTaskDto()
@@ -2409,7 +2424,7 @@ namespace IRaCIS.Application.Services
if (task == null) if (task == null)
{ {
throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"]); throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"], ApiResponseCodeEnum.CloseCurrentWindows);
} }
if (task.SubjectCode.IsNullOrEmpty()) if (task.SubjectCode.IsNullOrEmpty())
@@ -2498,51 +2513,51 @@ namespace IRaCIS.Application.Services
[HttpPost] [HttpPost]
public async Task VerifyReadingRestTime() public async Task VerifyReadingRestTime()
{ {
var cacheKey = _userInfo.Id.ToString() + "RestTime"; //var cacheKey = _userInfo.Id.ToString() + "RestTime";
var value = _provider.Get<string>(cacheKey).Value; //var value = _provider.Get<string>(cacheKey).Value;
if (value == null) //if (value == null)
{
_provider.Set(cacheKey, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromHours(5));
// _cache.Set(cacheKey, DateTime.Now.ToString(), TimeSpan.FromHours(5));
}
else
{
#region
var cacheDate = DateTime.Parse(value.ToString());
int timespanMin = (DateTime.Now - cacheDate).Minutes;
if (timespanMin > 120 && timespanMin < 140)
{
throw new BusinessValidationFailedException(_localizer["ReadingImage_NeedRest", 2, 20]);
}
else if (timespanMin > 140)
{
cacheDate = cacheDate.AddMinutes((Math.Floor((double)(timespanMin / 140))) * 140);
_provider.Set(cacheKey, cacheDate.ToString(), TimeSpan.FromHours(5));
// _cache.Set(cacheKey, cacheDate.ToString(), TimeSpan.FromHours(5));
}
#endregion
#region 5
//var cacheDate = DateTime.Parse(value.ToString());
//int timespanMin = (DateTime.Now - cacheDate).Minutes;
//if (timespanMin >= 5 && timespanMin <= 10)
//{ //{
// throw new BusinessValidationFailedException("您已连续阅片2个小时,请休息20分钟后,再继续阅片。"); // _provider.Set(cacheKey, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromHours(5));
//} // // _cache.Set(cacheKey, DateTime.Now.ToString(), TimeSpan.FromHours(5));
//else if (timespanMin > 10)
//{
// cacheDate = cacheDate.AddMinutes((Math.Floor((double)(timespanMin / 10))) * 10);
// _cache.Set(cacheKey, cacheDate.ToString(), TimeSpan.FromHours(5));
//} //}
#endregion //else
//{
// #region 两小时
// var cacheDate = DateTime.Parse(value.ToString());
// int timespanMin = (DateTime.Now - cacheDate).Minutes;
// if (timespanMin > 120 && timespanMin < 140)
// {
// throw new BusinessValidationFailedException(_localizer["ReadingImage_NeedRest", 2, 20]);
// }
// else if (timespanMin > 140)
// {
// cacheDate = cacheDate.AddMinutes((Math.Floor((double)(timespanMin / 140))) * 140);
// _provider.Set(cacheKey, cacheDate.ToString(), TimeSpan.FromHours(5));
// // _cache.Set(cacheKey, cacheDate.ToString(), TimeSpan.FromHours(5));
// }
// #endregion
// #region 测试用的5分钟
// //var cacheDate = DateTime.Parse(value.ToString());
// //int timespanMin = (DateTime.Now - cacheDate).Minutes;
// //if (timespanMin >= 5 && timespanMin <= 10)
// //{
// // throw new BusinessValidationFailedException("您已连续阅片2个小时,请休息20分钟后,再继续阅片。");
// //}
// //else if (timespanMin > 10)
// //{
// // cacheDate = cacheDate.AddMinutes((Math.Floor((double)(timespanMin / 10))) * 10);
// // _cache.Set(cacheKey, cacheDate.ToString(), TimeSpan.FromHours(5));
// //}
// #endregion
} //}
@@ -107,7 +107,7 @@ namespace IRaCIS.Core.Application.Contracts
public bool? IsGenerateAccount { get; set; } public bool? IsGenerateAccount { get; set; }
public Guid? TrialRoleNameId { get; set; } public int? TrialRoleCode { get; set; }
public TrialSiteUserStateEnum? State { get; set; } public TrialSiteUserStateEnum? State { get; set; }
@@ -66,7 +66,7 @@ namespace IRaCIS.Core.Application.Contracts
public async Task<IResponseOutput> SendEmialVerifyCode(SendEmialVerifyCodeInDto userInfo) public async Task<IResponseOutput> SendEmialVerifyCode(SendEmialVerifyCodeInDto userInfo)
{ {
//检查手机或者邮箱是否有效 //检查手机或者邮箱是否有效
if (!Regex.IsMatch(userInfo.Email, @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")) if (!Regex.IsMatch(userInfo.Email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
{ {
//---请输入正确的邮箱地址。 //---请输入正确的邮箱地址。
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_InvalidEmail"]); throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_InvalidEmail"]);
@@ -124,7 +124,7 @@ namespace IRaCIS.Core.Application.Contracts
public async Task<IResponseOutput> SendVerifyCode(SiteSurveySendVerifyCode userInfo) public async Task<IResponseOutput> SendVerifyCode(SiteSurveySendVerifyCode userInfo)
{ {
//检查手机或者邮箱是否有效 //检查手机或者邮箱是否有效
if (!Regex.IsMatch(userInfo.Email, @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")) if (!Regex.IsMatch(userInfo.Email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
{ {
//---请输入正确的邮箱地址。 //---请输入正确的邮箱地址。
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_InvalidEmail"]); throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_InvalidEmail"]);
@@ -531,6 +531,7 @@ namespace IRaCIS.Core.Application.Contracts
var groupSelectIdQuery = var groupSelectIdQuery =
_trialSiteSurveyRepository.Where(t => t.TrialId == queryParam.TrialId) _trialSiteSurveyRepository.Where(t => t.TrialId == queryParam.TrialId)
.WhereIf(queryParam.SiteId != null, t => t.SiteId == queryParam.SiteId) .WhereIf(queryParam.SiteId != null, t => t.SiteId == queryParam.SiteId)
.WhereIf(!string.IsNullOrEmpty(queryParam.FormWriterKeyInfo), t => (t.UserName).Contains(queryParam.FormWriterKeyInfo) || t.Email.Contains(queryParam.FormWriterKeyInfo) || t.Phone.Contains(queryParam.FormWriterKeyInfo)) .WhereIf(!string.IsNullOrEmpty(queryParam.FormWriterKeyInfo), t => (t.UserName).Contains(queryParam.FormWriterKeyInfo) || t.Email.Contains(queryParam.FormWriterKeyInfo) || t.Phone.Contains(queryParam.FormWriterKeyInfo))
.GroupBy(t => t.SiteId) .GroupBy(t => t.SiteId)
.Select(g => g.OrderByDescending(u => u.CreateTime).Select(t => t.Id).First()); .Select(g => g.OrderByDescending(u => u.CreateTime).Select(t => t.Id).First());
@@ -538,6 +539,7 @@ namespace IRaCIS.Core.Application.Contracts
var query = _trialSiteUserSurveyRepository var query = _trialSiteUserSurveyRepository
.Where(t => groupSelectIdQuery.Contains(t.TrialSiteSurveyId)) .Where(t => groupSelectIdQuery.Contains(t.TrialSiteSurveyId))
.WhereIf(queryParam.TrialRoleCode != null, t => t.TrialRoleCode == queryParam.TrialRoleCode)
.WhereIf(queryParam.UserTypeId != null, t => t.UserTypeId == queryParam.UserTypeId) .WhereIf(queryParam.UserTypeId != null, t => t.UserTypeId == queryParam.UserTypeId)
.WhereIf(queryParam.IsGenerateAccount != null, t => t.IsGenerateAccount == queryParam.IsGenerateAccount) .WhereIf(queryParam.IsGenerateAccount != null, t => t.IsGenerateAccount == queryParam.IsGenerateAccount)
.WhereIf(queryParam.State != null && queryParam.State != TrialSiteUserStateEnum.OverTime, t => t.InviteState == queryParam.State) .WhereIf(queryParam.State != null && queryParam.State != TrialSiteUserStateEnum.OverTime, t => t.InviteState == queryParam.State)
@@ -53,6 +53,16 @@ namespace IRaCIS.Application.Contracts
public string RealName { get; set; } = String.Empty; public string RealName { get; set; } = String.Empty;
public string UserName { get; set; } = String.Empty; public string UserName { get; set; } = String.Empty;
} }
public class TrialUserBasicInfo
{
public Guid UserTypeId { get; set; }
public string UserName { get; set; }
public string FullName { get; set; }
public Guid UserId { get; set; }
}
public class TrialMaintenanceDTO : UserTrialCommand public class TrialMaintenanceDTO : UserTrialCommand
{ {
@@ -62,7 +62,13 @@ namespace IRaCIS.Application.Services
#endregion #endregion
[HttpGet]
public async Task<List<TrialUserBasicInfo>> GetTrialUserList(Guid trialId)
{
return await _trialUseRepository.Where(t => t.TrialId == trialId, ignoreQueryFilters: true)
.Select(t => new TrialUserBasicInfo() { FullName = t.User.FullName, UserId = t.UserId, UserTypeId = t.User.UserTypeId, UserName = t.User.UserName })
.ToListAsync();
}
/// <summary> /// <summary>
/// Setting页面 获取项目参与人员列表 /// Setting页面 获取项目参与人员列表
@@ -330,8 +330,8 @@ namespace IRaCIS.Core.Application.Services
var tag = await _readingCustomTagRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).Select(x => new var tag = await _readingCustomTagRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).Select(x => new
{ {
ShowOrder= 0, ShowOrder = 0,
RowIndex= 0m, RowIndex = 0m,
x.SeriesId, x.SeriesId,
x.StudyId, x.StudyId,
x.InstanceId, x.InstanceId,
@@ -458,12 +458,12 @@ namespace IRaCIS.Core.Application.Services
var studyIds = studyList.Select(t => t.StudyId).ToList(); var studyIds = studyList.Select(t => t.StudyId).ToList();
var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId)) var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId))
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames,t.WindowCenter,t.WindowWidth }).ToListAsync(); .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth }).ToListAsync();
List<DicomSeriesDTO> seriesLists = await _repository.Where<DicomSeries>(s => studyIds.Contains(s.StudyId) /*&& s.IsReading*/) List<DicomSeriesDTO> seriesLists = await _repository.Where<DicomSeries>(s => studyIds.Contains(s.StudyId) /*&& s.IsReading*/)
.WhereIf(isManualGenerate==false, t => t.IsReading) .WhereIf(isManualGenerate == false, t => t.IsReading)
.OrderBy(s => s.SeriesNumber). .OrderBy(s => s.SeriesNumber).
ThenBy(s => s.SeriesTime) ThenBy(s => s.SeriesTime)
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync(); .ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
@@ -531,12 +531,22 @@ namespace IRaCIS.Core.Application.Services
foreach (var item in noDicomStudyList) foreach (var item in noDicomStudyList)
{ {
var nodicom = noDicomList.Where(x => x.Id == item.StudyId).First(); var nodicom = noDicomList.Where(x => x.Id == item.StudyId).First();
var instanceCount = await _noneDicomStudyFileRepository.Where(x => x.NoneDicomStudyId == item.StudyId).CountAsync();
if (instanceCount == 0)
{
item.SeriesList = new List<DicomSeriesDTO>();
item.SeriesCount = 0;
}
else
{
item.SeriesList = new List<DicomSeriesDTO>() item.SeriesList = new List<DicomSeriesDTO>()
{ {
new DicomSeriesDTO (){ new DicomSeriesDTO (){
IsDicom=false, IsDicom=false,
Id=item.StudyId, Id=item.StudyId,
InstanceCount=await _noneDicomStudyFileRepository.Where(x=>x.NoneDicomStudyId==item.StudyId).CountAsync(), InstanceCount=instanceCount,
Modality=item.Modalities, Modality=item.Modalities,
StudyId=item.StudyId, StudyId=item.StudyId,
TrialId=nodicom.TrialId, TrialId=nodicom.TrialId,
@@ -550,6 +560,8 @@ namespace IRaCIS.Core.Application.Services
}; };
} }
}
if (studyList == null || studyList.Count == 0) if (studyList == null || studyList.Count == 0)
{ {
@@ -354,6 +354,8 @@ namespace IRaCIS.Application.Contracts
public bool IsOncologyReading { get; set; } public bool IsOncologyReading { get; set; }
public bool IsReadingPeriod { get; set; }
} }
public class TrialCriterionReadingCategory public class TrialCriterionReadingCategory
@@ -54,7 +54,7 @@ namespace IRaCIS.Core.Application.Triggers
t.TrialId = subject.TrialId; t.TrialId = subject.TrialId;
t.SiteId = subject.SiteId; t.SiteId = subject.SiteId;
t.IsEnrollmentConfirm = t.IsBaseLine ? triconfig.IsEnrollementQualificationConfirm : false; t.IsEnrollmentConfirm = t.IsBaseLine ? triconfig.IsEnrollementQualificationConfirm : false;
t.PDState = t.IsBaseLine==false && triconfig.IsPDProgressView ? PDStateEnum.PDProgress : PDStateEnum.None; t.PDState = t.IsBaseLine == false && triconfig.IsPDProgressView ? PDStateEnum.PDProgress : PDStateEnum.None;
t.Id = NewId.NextGuid(); t.Id = NewId.NextGuid();
}); });
@@ -65,6 +65,7 @@ namespace IRaCIS.Core.Application.Triggers
await _subjectVisitRepository.SaveChangesAsync(); await _subjectVisitRepository.SaveChangesAsync();
#region f访视计划确认的时候处理 subject添加访视计划 #region f访视计划确认的时候处理 subject添加访视计划
////已添加受试者 都不存在该新增的计划名称 那么该项目所有受试者都增加一个访视记录 ////已添加受试者 都不存在该新增的计划名称 那么该项目所有受试者都增加一个访视记录
//if (!await _subjectVisitRepository.AnyAsync(t => t.VisitName == visitPlan.VisitName && t.TrialId == visitPlan.TrialId)) //if (!await _subjectVisitRepository.AnyAsync(t => t.VisitName == visitPlan.VisitName && t.TrialId == visitPlan.TrialId))
//{ //{
@@ -0,0 +1,42 @@
using EntityFrameworkCore.Triggered;
using IP2Region.Net.Abstractions;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.Triggers
{
public class UserLogTrigger : IBeforeSaveTrigger<UserLog>
{
public ISearcher _searcher;
public ILogger<UserLogTrigger> _logger;
public UserLogTrigger(ISearcher searcher,ILogger<UserLogTrigger> logger)
{
_searcher = searcher;
_logger= logger;
}
//国家|区域|省份|城市|ISP 缺省的地域信息默认是0
//0|0|0|内网IP|内网IP
// 中国|0|湖北省|武汉市|电信
public async Task BeforeSave(ITriggerContext<UserLog> context, CancellationToken cancellationToken)
{
var userLog = context.Entity;
if (context.ChangeType == ChangeType.Added)
{
var ipinfo = _searcher.Search(userLog.IP);
userLog.IPRegion = string.Join('|', ipinfo.Split('|').TakeLast(3));
}
}
}
}
@@ -52,6 +52,7 @@ namespace IRaCIS.Core.Application.Triggers
if (context.ChangeType == ChangeType.Modified && visitTask.ReadingTaskState==ReadingTaskState.HaveSigned && visitTask.ReadingTaskState != context.UnmodifiedEntity.ReadingTaskState && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI) if (context.ChangeType == ChangeType.Modified && visitTask.ReadingTaskState==ReadingTaskState.HaveSigned && visitTask.ReadingTaskState != context.UnmodifiedEntity.ReadingTaskState && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI)
{ {
visitTask.PIAuditState = PIAuditState.PIAgree; visitTask.PIAuditState = PIAuditState.PIAgree;
visitTask.FirstAuditUserId = _userInfo.Id;
} }
if (context.ChangeType == ChangeType.Modified && visitTask.PIAuditState!=context.UnmodifiedEntity.PIAuditState && visitTask.PIAuditState==PIAuditState.PIAgree) if (context.ChangeType == ChangeType.Modified && visitTask.PIAuditState!=context.UnmodifiedEntity.PIAuditState && visitTask.PIAuditState==PIAuditState.PIAgree)
@@ -92,10 +92,10 @@ namespace IRaCIS.Core.Application.MediatR.CommandAndQueries
//[Required(ErrorMessage = "检查日期不能为空")] //[Required(ErrorMessage = "检查日期不能为空")]
[CanConvertToTime(ErrorMessage = "Does not conform to Stusy Date format")] [CanConvertToTime(ErrorMessage = "Does not conform to Study Date format")]
[ImporterHeader(Name = "Stusy Date", AutoTrim = true)] [ImporterHeader(Name = "Study Date", AutoTrim = true)]
[ExcelColumnName("Stusy Date")] [ExcelColumnName("Study Date")]
public string StudyDate { get; set; } = string.Empty; public string StudyDate { get; set; } = string.Empty;
@@ -191,6 +191,8 @@ namespace IRaCIS.Core.Application.MediatR.Handlers
dbSV.CheckState = CheckStateEnum.CVPassed; dbSV.CheckState = CheckStateEnum.CVPassed;
dbSV.CheckUserId = _userInfo.Id; dbSV.CheckUserId = _userInfo.Id;
dbSV.CheckPassedTime = DateTime.Now; dbSV.CheckPassedTime = DateTime.Now;
dbSV.CheckChallengeState = CheckChanllengeTypeEnum.Closed;
//---核对EDC数据,完全一致 //---核对EDC数据,完全一致
dbSV.CheckResult = _localizer["ConsistencyVerification_EDCB"]; dbSV.CheckResult = _localizer["ConsistencyVerification_EDCB"];
//---自动核查通过 //---自动核查通过
@@ -41,7 +41,7 @@ namespace IRaCIS.Core.Domain.Models
[JsonIgnore] [JsonIgnore]
public List<TrialEmailNoticeUser> TrialEmailNoticeUserList { get; set; } = new List<TrialEmailNoticeUser>(); public List<TrialEmailNoticeUser> TrialEmailNoticeUserList { get; set; } = new List<TrialEmailNoticeUser>();
[JsonIgnore]
public List<TrialEmailBlackUser> TrialEmailBlackUserList { get; set; } = new List<TrialEmailBlackUser>(); public List<TrialEmailBlackUser> TrialEmailBlackUserList { get; set; } = new List<TrialEmailBlackUser>();
+2
View File
@@ -47,6 +47,8 @@ namespace IRaCIS.Core.Domain.Models
[JsonIgnore] [JsonIgnore]
public User OptUser { get; set; } public User OptUser { get; set; }
public string IPRegion { get; set; }
} }
/// <summary> /// <summary>
@@ -266,6 +266,10 @@ namespace IRaCIS.Core.Domain.Models
/// </summary> /// </summary>
public Guid? GroupId { get; set; } public Guid? GroupId { get; set; }
//
[JsonIgnore] [JsonIgnore]
[ForeignKey("GroupId")] [ForeignKey("GroupId")]
public ReadingQuestionTrial GroupInfo { get; set; } public ReadingQuestionTrial GroupInfo { get; set; }
@@ -290,6 +294,16 @@ namespace IRaCIS.Core.Domain.Models
public List<ReadingTableQuestionTrial> ReadingTableQuestionTrialList { get; set; } public List<ReadingTableQuestionTrial> ReadingTableQuestionTrialList { get; set; }
public enum AssessmentResultType
{
//没有特殊标记
None=0,
//评估结果
AssessmentResult = 1,
}
[NotMapped] [NotMapped]
public List<string> ParentTriggerValueList public List<string> ParentTriggerValueList
{ {
@@ -74,7 +74,9 @@ namespace IRaCIS.Core.Domain.Models
public ReadingQuestionTrial ReadingQuestionTrial { get; set; } public ReadingQuestionTrial ReadingQuestionTrial { get; set; }
[JsonIgnore]
[ForeignKey("ReadingQuestionCriterionTrialId")]
public ReadingQuestionCriterionTrial ReadingQuestionCriterionTrial { get; set; }
} }
@@ -69,7 +69,20 @@ namespace IRaCIS.Core.Infra.EFCore.Common
typeof(TrialSiteSurvey), typeof(TrialSiteSurvey),
typeof(TrialSiteUser), typeof(TrialSiteUser),
typeof(VisitStage), typeof(VisitStage),
typeof(TrialSite) typeof(TrialSite),
};
}
}
// 修改为删除
private List<Type> UpdateIsDelete
{
get
{
return new List<Type>()
{
typeof(TrialDocument)
}; };
} }
} }
@@ -81,6 +94,15 @@ namespace IRaCIS.Core.Infra.EFCore.Common
{ {
return AuditOpt.Add; return AuditOpt.Add;
} }
else if (
UpdateIsDelete.Contains(entityEntry.Entity.GetType())
&& entityEntry.State == EntityState.Modified
&& (bool)entityEntry.Entity.GetType().GetProperty(nameof(ISoftDelete.IsDeleted)).GetValue(entityEntry.Entity)
)
{
return AuditOpt.Deleted;
}
else if (entityEntry.State == EntityState.Deleted || else if (entityEntry.State == EntityState.Deleted ||
(entityEntry.State == EntityState.Modified (entityEntry.State == EntityState.Modified
@@ -1272,6 +1294,8 @@ namespace IRaCIS.Core.Infra.EFCore.Common
var entity = item.Entity as QCChallenge; var entity = item.Entity as QCChallenge;
var challengeState= await _dbContext.SubjectVisit.Where(x => x.Id == entity.SubjectVisitId).Select(x => x.ChallengeState).FirstOrDefaultAsync();
await InsertInspection<QCChallenge>(entity, type, x => new InspectionConvertDTO() await InsertInspection<QCChallenge>(entity, type, x => new InspectionConvertDTO()
{ {
SubjectVisitId = x.SubjectVisitId, SubjectVisitId = x.SubjectVisitId,
@@ -1281,6 +1305,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common
{ {
IsOverTime = entity.IsClosed ? entity.ClosedTime > entity.DeadlineTime : DateTime.Now > entity.DeadlineTime, IsOverTime = entity.IsClosed ? entity.ClosedTime > entity.DeadlineTime : DateTime.Now > entity.DeadlineTime,
ChallengeState= challengeState,
}); });
} }
@@ -1394,6 +1419,11 @@ namespace IRaCIS.Core.Infra.EFCore.Common
var trialSiteId = entity.TrialSite?.Id; var trialSiteId = entity.TrialSite?.Id;
var equipmentTypeList = await _dbContext.TrialSiteEquipmentSurvey.Where(x => x.TrialSiteSurveyId == entity.Id).Select(x => x.EquipmentType.ValueCN).ToListAsync();
var siteUserList = await _dbContext.TrialSiteUserSurvey.Where(x => x.TrialSiteSurveyId == entity.Id).Select(x => x.LastName + "/" + x.FirstName).ToListAsync();
await InsertInspection<TrialSiteSurvey>(item.Entity as TrialSiteSurvey, type, x => new InspectionConvertDTO() await InsertInspection<TrialSiteSurvey>(item.Entity as TrialSiteSurvey, type, x => new InspectionConvertDTO()
{ {
ObjectRelationParentId = trialSiteId, ObjectRelationParentId = trialSiteId,
@@ -1405,7 +1435,8 @@ namespace IRaCIS.Core.Infra.EFCore.Common
//Phone = entity.Phone, //Phone = entity.Phone,
//Email = entity.Email, //Email = entity.Email,
EquipmentTypeList=string.Join(",", equipmentTypeList),
SiteUserList= string.Join(",", siteUserList),
PreliminaryUser = entity.PreliminaryUser == null ? "" : entity.PreliminaryUser.FullName, PreliminaryUser = entity.PreliminaryUser == null ? "" : entity.PreliminaryUser.FullName,
ReviewerUser = entity.ReviewerUser == null ? "" : entity.ReviewerUser.FullName, ReviewerUser = entity.ReviewerUser == null ? "" : entity.ReviewerUser.FullName,
@@ -10,6 +10,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common.Dto
{ {
public string Code { get; set; } public string Code { get; set; }
public string Identification { get; set; }
public string DateType { get; set; } public string DateType { get; set; }
} }
@@ -1,17 +1,22 @@
using System; using IRaCIS.Core.Infrastructure.Extention;
using System;
namespace IRaCIS.Core.Infrastructure namespace IRaCIS.Core.Infrastructure
{ {
public class BusinessValidationFailedException : Exception public class BusinessValidationFailedException : Exception
{ {
public ApiResponseCodeEnum Code { get; set; }
public BusinessValidationFailedException() public BusinessValidationFailedException()
{ {
} }
public BusinessValidationFailedException( string message) : base(message) public BusinessValidationFailedException(string message, ApiResponseCodeEnum code = ApiResponseCodeEnum.BusinessValidationFailed) : base(message)
{ {
Code = code;
} }
} }
} }
@@ -26,6 +26,10 @@ namespace IRaCIS.Core.Infrastructure.Extention
//需要提示 ,需要提示 从Result 取数据 ( 0 可以继续处理提交 ,1 不能进行继续处理提交 ,2 刷新列表 ) //需要提示 ,需要提示 从Result 取数据 ( 0 可以继续处理提交 ,1 不能进行继续处理提交 ,2 刷新列表 )
NeedTips = 5, NeedTips = 5,
/// <summary>
/// 关闭当前页面
/// </summary>
CloseCurrentWindows=6,
//在其他地方登陆,被迫下线 //在其他地方登陆,被迫下线
LoginInOtherPlace = -1, LoginInOtherPlace = -1,
+2 -2
View File
@@ -90,7 +90,7 @@ clone:
disable: true #禁用默认克隆 disable: true #禁用默认克隆
server: server:
host: 123.56.94.154 host: 106.14.89.110
user: root user: root
password: password:
from_secret: test_ssh_pwd from_secret: test_ssh_pwd
@@ -121,7 +121,7 @@ clone:
disable: true #禁用默认克隆 disable: true #禁用默认克隆
server: server:
host: 123.56.94.154 host: 106.14.89.110
user: root user: root
password: password:
from_secret: test_ssh_pwd from_secret: test_ssh_pwd