Compare commits
189 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1e9efd6d40 | |||
| 80d78cb989 | |||
| 681ba17e37 | |||
| 3385b65967 | |||
| d6045ef7e7 | |||
| f66829ca62 | |||
| 471ea524b7 | |||
| 34e9269916 | |||
| 29d50fdd2d | |||
| 9f19dfceac | |||
| 799c579121 | |||
| 4841a9ac1e | |||
| 287dd5d0bf | |||
| 32e23ca0a2 | |||
| b7d7b8c815 | |||
| 96fd034c5a | |||
| 6118e0a4f8 | |||
| c00d1fb89c | |||
| 900f4dfb64 | |||
| 11f8c9ca56 | |||
| 026f63c730 | |||
| e322952ff4 | |||
| e762da2bf5 | |||
| 822a4331aa | |||
| 2b2ba2a551 | |||
| 317fbc2ea7 | |||
| 0cd9d666c1 | |||
| 187ea3b92f | |||
| d2beb399dd | |||
| 15623ab515 | |||
| f771a23c2a | |||
| f20b8708a3 | |||
| 536ed731ed | |||
| 5b10619460 | |||
| 311ac85419 | |||
| dba3351195 | |||
| 506d6504c7 | |||
| 1eede7832b | |||
| 5ec79bb61b | |||
| 548863845b | |||
| 2f73376ff6 | |||
| 9a8ee3a6aa | |||
| 28e367eb88 | |||
| 7d642b46c9 | |||
| 2be6757e23 | |||
| 4ca67212aa | |||
| 503f99ccbe | |||
| 93410b4075 | |||
| a96945201f | |||
| 35c495f8a8 | |||
| 9abd8e2c54 | |||
| b9a79f0658 | |||
| 83111d3338 | |||
| 92072d3640 | |||
| fd0ea313c2 | |||
| 79a15a08cc | |||
| 1af798fb04 | |||
| c19eb5bab7 | |||
| db693de576 | |||
| 651fa35018 | |||
| 36f1e9e8dd | |||
| 7e454467d1 | |||
| 978caf8e9c | |||
| 2bf4e5d8fd | |||
| dfb0c5a61c | |||
| 9d54fac8c5 | |||
| 5842590f6d | |||
| 06a60cac38 | |||
| dac5eb0d7d | |||
| 923edf166b | |||
| a0776e5462 | |||
| 9ac6d3df70 | |||
| a8a3104019 | |||
| 7cd476028a | |||
| fe96ff5924 | |||
| 890d349ee9 | |||
| 895eaa42c8 | |||
| 2e4457b56d | |||
| b30638fa82 | |||
| a3fac7bcb1 | |||
| 7228bdd9e9 | |||
| fa84171da4 | |||
| f4c3f685eb | |||
| db17d23360 | |||
| 76fe1e12d3 | |||
| d7f455c740 | |||
| d62d7172d0 | |||
| 9bfdb2f06a | |||
| d6436b01d4 | |||
| e848ee1972 | |||
| 2716b462b1 | |||
| 10f3db1ec2 | |||
| 0848a441b1 | |||
| 00c59958e6 | |||
| 9cc438a647 | |||
| 1053fdc8a8 | |||
| e1ee129f41 | |||
| dae0cab261 | |||
| 5871d054d3 | |||
| a69e8969a4 | |||
| dd05e26feb | |||
| 8cd8b7cf43 | |||
| 1d90aba7cd | |||
| 826aff3d36 | |||
| 718294f776 | |||
| 7a003eb490 | |||
| bcceb5d42d | |||
| b1802d7d79 | |||
| e14eeb4da3 | |||
| f726088cc9 | |||
| 4082850b7a | |||
| 641d61d242 | |||
| e2b67bb3f5 | |||
| 1f3e1ceb37 | |||
| 254e9508b6 | |||
| 631be6d7c7 | |||
| ca31e9a062 | |||
| 9fd7d9928a | |||
| 9362b2fb23 | |||
| 1735a4621e | |||
| 6ff332367d | |||
| e045302d38 | |||
| 88793cf011 | |||
| a4181f819b | |||
| 79aeb663c6 | |||
| 169301836a | |||
| 71bd67ba01 | |||
| 3e94dc6518 | |||
| 503322d57e | |||
| 0c9ffbf5e4 | |||
| fae7889995 | |||
| 532e514060 | |||
| b3a5047ba8 | |||
| 810e6ccb19 | |||
| 352e719fae | |||
| d8e0c73f56 | |||
| 46374be4c0 | |||
| 020c5280b3 | |||
| 4beba23f99 | |||
| 59f36cceb4 | |||
| d08b409f0e | |||
| 1612201101 | |||
| 924347361a | |||
| 061d212623 | |||
| af937b3f53 | |||
| 1faa72c5ea | |||
| db53e5a60b | |||
| 802e768bad | |||
| 67f17cffe0 | |||
| 70160cb937 | |||
| 6e22246555 | |||
| 7ed0258cfd | |||
| ddd06c8313 | |||
| d33b84c245 | |||
| 14cd5dd91c | |||
| 2b29ebc29b | |||
| 84b65ee122 | |||
| c3e9024a57 | |||
| d49b5663ba | |||
| e1386da5ae | |||
| b9f9af06f4 | |||
| 01a79e0612 | |||
| 3e69d72597 | |||
| f69c7af9d6 | |||
| ae03503d76 | |||
| 39eade67f0 | |||
| e6d7a0c0e0 | |||
| 98103451e9 | |||
| b64eed88cf | |||
| bafe61ae64 | |||
| 0579c4aeda | |||
| 7599e06b9d | |||
| 8e77d2e3ed | |||
| c2a129c56a | |||
| 111d5509bc | |||
| 7c9987f3de | |||
| f1471b6424 | |||
| 935369c05c | |||
| 2b03f382bd | |||
| 152a142d82 | |||
| f55ce703b0 | |||
| a08c8a0d64 | |||
| 76dd0c46ae | |||
| 1e8056f689 | |||
| 388dac5f8d | |||
| ec0a4aeef9 | |||
| 8bf0be9699 | |||
| 7707b339dc | |||
| 8eaa6606c4 |
@@ -0,0 +1,9 @@
|
|||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<!-- 在这里定义所有项目共享的属性 -->
|
||||||
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<!-- 如果需要Nullable等全局设置,也可以加在这里 -->
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -1,37 +1,35 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.11" />
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.8" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
|
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.2.0" />
|
||||||
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.5" />
|
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="11.0.0" />
|
||||||
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" />
|
|
||||||
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
||||||
<PackageReference Include="AWSSDK.S3" Version="4.0.21" />
|
<PackageReference Include="AWSSDK.S3" Version="4.0.24" />
|
||||||
<PackageReference Include="AWSSDK.SecurityToken" Version="4.0.5.19" />
|
<PackageReference Include="AWSSDK.SecurityToken" Version="4.0.7" />
|
||||||
|
|
||||||
<PackageReference Include="DistributedLock.Core" Version="1.0.8" />
|
<PackageReference Include="DistributedLock.Core" Version="1.0.9" />
|
||||||
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.6" />
|
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.7" />
|
||||||
<PackageReference Include="fo-dicom" Version="5.2.1" />
|
<PackageReference Include="fo-dicom" Version="5.2.6" />
|
||||||
<PackageReference Include="fo-dicom.Codecs" Version="5.16.1" />
|
<PackageReference Include="fo-dicom.Codecs" Version="5.16.7" />
|
||||||
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.1" />
|
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.6" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="10.0.8" />
|
||||||
<PackageReference Include="AutoMapper" Version="13.0.1" />
|
<PackageReference Include="AutoMapper" Version="14.0.0" />
|
||||||
<PackageReference Include="Minio" Version="6.0.4" />
|
<PackageReference Include="Minio" Version="7.0.0" />
|
||||||
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
|
<PackageReference Include="My.Extensions.Localization.Json" Version="4.0.0">
|
||||||
<TreatAsUsed>true</TreatAsUsed>
|
<TreatAsUsed>true</TreatAsUsed>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
|
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
|
||||||
<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="2.1.2" />
|
<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="2.9.0" />
|
||||||
<PackageReference Include="Serilog.Extensions.Hosting" Version="9.0.0" />
|
<PackageReference Include="Serilog.Extensions.Hosting" Version="10.0.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
|
<PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" />
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
|
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.1" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.2.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ var _configuration = builder.Configuration;
|
|||||||
builder.Services.AddHealthChecks();
|
builder.Services.AddHealthChecks();
|
||||||
|
|
||||||
//本地化
|
//本地化
|
||||||
builder.Services.AddJsonLocalization(options => options.ResourcesPath = "Resources");
|
builder.Services.AddJsonLocalization(options => options.ResourcesPath = new[] { "Resources" });
|
||||||
|
|
||||||
|
|
||||||
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
|
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
@@ -10,17 +8,17 @@
|
|||||||
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.2.0" />
|
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.2.0" />
|
||||||
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="11.0.0" />
|
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="11.0.0" />
|
||||||
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
||||||
<PackageReference Include="AWSSDK.S3" Version="4.0.21" />
|
<PackageReference Include="AWSSDK.S3" Version="4.0.24" />
|
||||||
<PackageReference Include="AWSSDK.SecurityToken" Version="4.0.5.19" />
|
<PackageReference Include="AWSSDK.SecurityToken" Version="4.0.7" />
|
||||||
<PackageReference Include="DistributedLock.Core" Version="1.0.9" />
|
<PackageReference Include="DistributedLock.Core" Version="1.0.9" />
|
||||||
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.7" />
|
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.7" />
|
||||||
<PackageReference Include="fo-dicom" Version="5.2.6" />
|
<PackageReference Include="fo-dicom" Version="5.2.6" />
|
||||||
<PackageReference Include="fo-dicom.Codecs" Version="5.16.7" />
|
<PackageReference Include="fo-dicom.Codecs" Version="5.16.7" />
|
||||||
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.6" />
|
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.6" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="10.0.8" />
|
||||||
<PackageReference Include="AutoMapper" Version="16.1.1" />
|
<PackageReference Include="AutoMapper" Version="14.0.0" />
|
||||||
<PackageReference Include="Minio" Version="7.0.0" />
|
<PackageReference Include="Minio" Version="7.0.0" />
|
||||||
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
|
<PackageReference Include="My.Extensions.Localization.Json" Version="4.0.0">
|
||||||
<TreatAsUsed>true</TreatAsUsed>
|
<TreatAsUsed>true</TreatAsUsed>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
|
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
|
||||||
@@ -28,7 +26,7 @@
|
|||||||
<PackageReference Include="Serilog.Extensions.Hosting" Version="10.0.0" />
|
<PackageReference Include="Serilog.Extensions.Hosting" Version="10.0.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" />
|
<PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" />
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.2.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ using IRaCIS.Core.SCP.Service;
|
|||||||
using MassTransit;
|
using MassTransit;
|
||||||
using MassTransit.NewIdProviders;
|
using MassTransit.NewIdProviders;
|
||||||
using Microsoft.AspNetCore.HttpOverrides;
|
using Microsoft.AspNetCore.HttpOverrides;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Panda.DynamicWebApi;
|
using Panda.DynamicWebApi;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using Serilog.Events;
|
using Serilog.Events;
|
||||||
@@ -71,7 +70,7 @@ builder.Services.AddHostedService<FileSyncWorker>();
|
|||||||
builder.Services.AddHealthChecks();
|
builder.Services.AddHealthChecks();
|
||||||
|
|
||||||
//本地化
|
//本地化
|
||||||
builder.Services.AddJsonLocalization(options => options.ResourcesPath = "Resources");
|
builder.Services.AddJsonLocalization(options => options.ResourcesPath = new[] { "Resources" });
|
||||||
|
|
||||||
|
|
||||||
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
|
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ public class FileUploadRecordService(IRepository<FileUploadRecord> _fileUploadRe
|
|||||||
|
|
||||||
public async Task<IResponseOutput> AddOrUpdateFileUploadRecord(FileUploadRecordAddOrEdit addOrEditFileUploadRecord)
|
public async Task<IResponseOutput> AddOrUpdateFileUploadRecord(FileUploadRecordAddOrEdit addOrEditFileUploadRecord)
|
||||||
{
|
{
|
||||||
|
return ResponseOutput.Ok();
|
||||||
|
|
||||||
addOrEditFileUploadRecord.IP = _userInfo.IP;
|
addOrEditFileUploadRecord.IP = _userInfo.IP;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ObjectStoreService": {
|
||||||
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
"IsOpenStoreSync": true,
|
||||||
|
"ApiDeployRegion": "CN",
|
||||||
|
"SyncConfigList": [
|
||||||
|
{
|
||||||
|
"Domain": "irc.test.rayplus.net",
|
||||||
|
"Primary": "AliyunOSS",
|
||||||
|
"Target": "AWS",
|
||||||
|
"UploadRegion": "CN",
|
||||||
|
"TargetRegion": "US",
|
||||||
|
"IsOpenSync": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Domain": "lili.uat.extimaging.com",
|
||||||
|
"Primary": "AWS",
|
||||||
|
"Target": "AliyunOSS",
|
||||||
|
"UploadRegion": "US",
|
||||||
|
"TargetRegion": "CN",
|
||||||
|
"IsOpenSync": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"AliyunOSS": {
|
||||||
|
"RegionId": "cn-shanghai",
|
||||||
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"AccessKeyId": "LTAI5tRRZehUp2V9pyTPtAJm",
|
||||||
|
"AccessKeySecret": "FLizxkHsMm4CGYHtkV8E3PNJJZU7oV",
|
||||||
|
"RoleArn": "acs:ram::1899121822495495:role/dev-oss-access",
|
||||||
|
"BucketName": "rayplus-irc-test-store",
|
||||||
|
"ViewEndpoint": "https://rayplus-irc-test-store.oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"Region": "oss-cn-shanghai",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
},
|
||||||
|
// AWS S3 对象存储服务的配置
|
||||||
|
"AWS": {
|
||||||
|
// AWS S3 的Region
|
||||||
|
"Region": "us-east-1",
|
||||||
|
// AWS S3 的内部访问端点
|
||||||
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
|
// 是否使用 SSL
|
||||||
|
"UseSSL": true,
|
||||||
|
// AWS S3 的角色 ARN
|
||||||
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
|
// AWS S3 的访问密钥 ID
|
||||||
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
|
// AWS S3 的访问密钥 Secret
|
||||||
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
|
// AWS S3 的Bucket名称
|
||||||
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
|
// AWS S3 的访问端点
|
||||||
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com",
|
||||||
|
// AWS S3 的持续数秒
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_Rayplus;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_Rayplus_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
||||||
|
},
|
||||||
|
"DicomSCPServiceConfig": {
|
||||||
|
"CalledAEList": [
|
||||||
|
"STORESCP"
|
||||||
|
],
|
||||||
|
"ServerPort": 11112
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ObjectStoreService": {
|
||||||
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
"IsOpenStoreSync": true,
|
||||||
|
"ApiDeployRegion": "CN",
|
||||||
|
"SyncConfigList": [
|
||||||
|
{
|
||||||
|
"Domain": "irc.test.rayplus.net",
|
||||||
|
"Primary": "AliyunOSS",
|
||||||
|
"Target": "AWS",
|
||||||
|
"UploadRegion": "CN",
|
||||||
|
"TargetRegion": "US",
|
||||||
|
"IsOpenSync": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Domain": "lili.uat.extimaging.com",
|
||||||
|
"Primary": "AWS",
|
||||||
|
"Target": "AliyunOSS",
|
||||||
|
"UploadRegion": "US",
|
||||||
|
"TargetRegion": "CN",
|
||||||
|
"IsOpenSync": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"AliyunOSS": {
|
||||||
|
"RegionId": "cn-shanghai",
|
||||||
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"AccessKeyId": "LTAI5tRRZehUp2V9pyTPtAJm",
|
||||||
|
"AccessKeySecret": "FLizxkHsMm4CGYHtkV8E3PNJJZU7oV",
|
||||||
|
"RoleArn": "acs:ram::1899121822495495:role/dev-oss-access",
|
||||||
|
"BucketName": "rayplus-irc-test-store",
|
||||||
|
"ViewEndpoint": "https://rayplus-irc-test-store.oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"Region": "oss-cn-shanghai",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
},
|
||||||
|
// AWS S3 对象存储服务的配置
|
||||||
|
"AWS": {
|
||||||
|
// AWS S3 的Region
|
||||||
|
"Region": "us-east-1",
|
||||||
|
// AWS S3 的内部访问端点
|
||||||
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
|
// 是否使用 SSL
|
||||||
|
"UseSSL": true,
|
||||||
|
// AWS S3 的角色 ARN
|
||||||
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
|
// AWS S3 的访问密钥 ID
|
||||||
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
|
// AWS S3 的访问密钥 Secret
|
||||||
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
|
// AWS S3 的Bucket名称
|
||||||
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
|
// AWS S3 的访问端点
|
||||||
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com",
|
||||||
|
// AWS S3 的持续数秒
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"RemoteNew": "Server=106.14.89.110,1435;Database=Test_Rayplus;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server=106.14.89.110,1435;Database=Test_Rayplus_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
|
||||||
|
},
|
||||||
|
"DicomSCPServiceConfig": {
|
||||||
|
"CalledAEList": [
|
||||||
|
"STORESCP"
|
||||||
|
],
|
||||||
|
"ServerPort": 11112
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ObjectStoreService": {
|
||||||
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
"IsOpenStoreSync": true,
|
||||||
|
"ApiDeployRegion": "CN",
|
||||||
|
"SyncConfigList": [
|
||||||
|
{
|
||||||
|
"Domain": "irc.uat.extimaging.com",
|
||||||
|
"Primary": "AliyunOSS",
|
||||||
|
"Target": "AWS",
|
||||||
|
"UploadRegion": "CN",
|
||||||
|
"TargetRegion": "US",
|
||||||
|
"IsOpenSync": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Domain": "lili.uat.extimaging.com",
|
||||||
|
"Primary": "AWS",
|
||||||
|
"Target": "AliyunOSS",
|
||||||
|
"UploadRegion": "US",
|
||||||
|
"TargetRegion": "CN",
|
||||||
|
"IsOpenSync": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"AliyunOSS": {
|
||||||
|
"RegionId": "cn-shanghai",
|
||||||
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"AccessKeyId": "LTAI5tRRZehUp2V9pyTPtAJm",
|
||||||
|
"AccessKeySecret": "FLizxkHsMm4CGYHtkV8E3PNJJZU7oV",
|
||||||
|
"RoleArn": "acs:ram::1899121822495495:role/dev-oss-access",
|
||||||
|
"BucketName": "zy-irc-test-store",
|
||||||
|
"ViewEndpoint": "https://zy-irc-test-store.oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"Region": "oss-cn-shanghai",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
},
|
||||||
|
// AWS S3 对象存储服务的配置
|
||||||
|
"AWS": {
|
||||||
|
// AWS S3 的Region
|
||||||
|
"Region": "us-east-1",
|
||||||
|
// AWS S3 的内部访问端点
|
||||||
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
|
// 是否使用 SSL
|
||||||
|
"UseSSL": true,
|
||||||
|
// AWS S3 的角色 ARN
|
||||||
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
|
// AWS S3 的访问密钥 ID
|
||||||
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
|
// AWS S3 的访问密钥 Secret
|
||||||
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
|
// AWS S3 的Bucket名称
|
||||||
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
|
// AWS S3 的访问端点
|
||||||
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com",
|
||||||
|
// AWS S3 的持续数秒
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"RemoteNew": "Server=101.132.253.119,1435;Database=Uat_HeAnShu;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server101.132.253.119,1435;Database=Uat_HeAnShu_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
|
||||||
|
},
|
||||||
|
"DicomSCPServiceConfig": {
|
||||||
|
"CalledAEList": [
|
||||||
|
"STORESCP"
|
||||||
|
],
|
||||||
|
"ServerPort": 11112
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ObjectStoreService": {
|
||||||
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
"IsOpenStoreSync": true,
|
||||||
|
"ApiDeployRegion": "CN",
|
||||||
|
"SyncConfigList": [
|
||||||
|
{
|
||||||
|
"Domain": "irc.uat.rayplus.net",
|
||||||
|
"Primary": "AliyunOSS",
|
||||||
|
"Target": "AWS",
|
||||||
|
"UploadRegion": "CN",
|
||||||
|
"TargetRegion": "US",
|
||||||
|
"IsOpenSync": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Domain": "lili.uat.extimaging.com",
|
||||||
|
"Primary": "AWS",
|
||||||
|
"Target": "AliyunOSS",
|
||||||
|
"UploadRegion": "US",
|
||||||
|
"TargetRegion": "CN",
|
||||||
|
"IsOpenSync": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"AliyunOSS": {
|
||||||
|
"RegionId": "cn-shanghai",
|
||||||
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"AccessKeyId": "LTAI5tFUCCmz5TwghZHsj45Y",
|
||||||
|
"AccessKeySecret": "8evrBy1fVfzJG25i67Jm0xqn9Xcw2T",
|
||||||
|
"RoleArn": "acs:ram::1078130221702011:role/uat-oss-access",
|
||||||
|
"BucketName": "rayplus-irc-uat-store",
|
||||||
|
"ViewEndpoint": "https://rayplus-irc-uat-store.oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"Region": "oss-cn-shanghai",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
},
|
||||||
|
// AWS S3 对象存储服务的配置
|
||||||
|
"AWS": {
|
||||||
|
// AWS S3 的Region
|
||||||
|
"Region": "us-east-1",
|
||||||
|
// AWS S3 的内部访问端点
|
||||||
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
|
// 是否使用 SSL
|
||||||
|
"UseSSL": true,
|
||||||
|
// AWS S3 的角色 ARN
|
||||||
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
|
// AWS S3 的访问密钥 ID
|
||||||
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
|
// AWS S3 的访问密钥 Secret
|
||||||
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
|
// AWS S3 的Bucket名称
|
||||||
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
|
// AWS S3 的访问端点
|
||||||
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com",
|
||||||
|
// AWS S3 的持续数秒
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"RemoteNew": "Server=101.132.253.119,1435;Database=Uat_Rayplus;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server101.132.253.119,1435;Database=Uat_Rayplus_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
|
||||||
|
},
|
||||||
|
"DicomSCPServiceConfig": {
|
||||||
|
"CalledAEList": [
|
||||||
|
"STORESCP"
|
||||||
|
],
|
||||||
|
"ServerPort": 11112
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,43 +1,21 @@
|
|||||||
using AlibabaCloud.SDK.Sts20150401;
|
using AlibabaCloud.SDK.Sts20150401;
|
||||||
using Amazon.Auth.AccessControlPolicy;
|
|
||||||
using Amazon.SecurityToken;
|
using Amazon.SecurityToken;
|
||||||
using AutoMapper;
|
|
||||||
using Azure.Core;
|
|
||||||
using IdentityModel.Client;
|
|
||||||
using IdentityModel.OidcClient;
|
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
using IRaCIS.Application.Interfaces;
|
using IRaCIS.Application.Interfaces;
|
||||||
using IRaCIS.Core.Application.Auth;
|
using IRaCIS.Core.Application.Auth;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Service;
|
|
||||||
using IRaCIS.Core.Domain.Models;
|
using IRaCIS.Core.Domain.Models;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using IRaCIS.Core.Infra.EFCore;
|
using IRaCIS.Core.Infra.EFCore;
|
||||||
using IRaCIS.Core.Infrastructure.Extention;
|
using IRaCIS.Core.Infrastructure.Extention;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using MassTransit.Futures.Contracts;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Org.BouncyCastle.Tls;
|
|
||||||
using RestSharp;
|
|
||||||
using RestSharp.Authenticators;
|
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using ZiggyCreatures.Caching.Fusion;
|
|
||||||
using AssumeRoleRequest = Amazon.SecurityToken.Model.AssumeRoleRequest;
|
using AssumeRoleRequest = Amazon.SecurityToken.Model.AssumeRoleRequest;
|
||||||
using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO;
|
|
||||||
|
|
||||||
namespace IRaCIS.Api.Controllers
|
namespace IRaCIS.Api.Controllers
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using ExcelDataReader;
|
using ExcelDataReader;
|
||||||
using IRaCIS.Application.Interfaces;
|
|
||||||
using IRaCIS.Core.Application.BusinessFilter;
|
using IRaCIS.Core.Application.BusinessFilter;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts.Dicom;
|
using IRaCIS.Core.Application.Contracts.Dicom;
|
||||||
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
|
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.MassTransit.Command;
|
using IRaCIS.Core.Application.MassTransit.Command;
|
||||||
using IRaCIS.Core.Application.Service;
|
using IRaCIS.Core.Application.Service;
|
||||||
@@ -17,8 +15,6 @@ using IRaCIS.Core.Infrastructure;
|
|||||||
using IRaCIS.Core.Infrastructure.Extention;
|
using IRaCIS.Core.Infrastructure.Extention;
|
||||||
using MassTransit.Mediator;
|
using MassTransit.Mediator;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
@@ -27,21 +23,15 @@ using Microsoft.AspNetCore.StaticFiles;
|
|||||||
using Microsoft.AspNetCore.WebUtilities;
|
using Microsoft.AspNetCore.WebUtilities;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Localization;
|
using Microsoft.Extensions.Localization;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
using MiniExcelLibs;
|
using MiniExcelLibs;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using SharpCompress.Archives;
|
using SharpCompress.Archives;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Path = System.IO.Path;
|
using Path = System.IO.Path;
|
||||||
|
|
||||||
namespace IRaCIS.Core.API.Controllers
|
namespace IRaCIS.Core.API.Controllers
|
||||||
@@ -132,7 +122,7 @@ namespace IRaCIS.Core.API.Controllers
|
|||||||
//处理压缩文件
|
//处理压缩文件
|
||||||
if (fileName.Contains(".Zip", StringComparison.OrdinalIgnoreCase) || fileName.Contains(".rar", StringComparison.OrdinalIgnoreCase))
|
if (fileName.Contains(".Zip", StringComparison.OrdinalIgnoreCase) || fileName.Contains(".rar", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
var archive = ArchiveFactory.Open(section.Body);
|
var archive = ArchiveFactory.OpenArchive(section.Body);
|
||||||
|
|
||||||
foreach (var entry in archive.Entries)
|
foreach (var entry in archive.Entries)
|
||||||
{
|
{
|
||||||
@@ -213,7 +203,7 @@ namespace IRaCIS.Core.API.Controllers
|
|||||||
//处理压缩文件
|
//处理压缩文件
|
||||||
if (fileName.Contains(".Zip", StringComparison.OrdinalIgnoreCase) || fileName.Contains(".rar", StringComparison.OrdinalIgnoreCase))
|
if (fileName.Contains(".Zip", StringComparison.OrdinalIgnoreCase) || fileName.Contains(".rar", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
var archive = ArchiveFactory.Open(section.Body);
|
var archive = ArchiveFactory.OpenArchive(section.Body);
|
||||||
|
|
||||||
foreach (var entry in archive.Entries)
|
foreach (var entry in archive.Entries)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<SignAssembly>false</SignAssembly>
|
<SignAssembly>false</SignAssembly>
|
||||||
<UserSecretsId>354572d4-9e15-4099-807c-63a2d29ff9f2</UserSecretsId>
|
<UserSecretsId>354572d4-9e15-4099-807c-63a2d29ff9f2</UserSecretsId>
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
@@ -10,6 +9,7 @@
|
|||||||
<Company>上海展影医疗科技有限公司</Company>
|
<Company>上海展影医疗科技有限公司</Company>
|
||||||
<Product>IRC影像系统 (EICS)</Product>
|
<Product>IRC影像系统 (EICS)</Product>
|
||||||
<Copyright>上海展影医疗科技有限公司版权所有</Copyright>
|
<Copyright>上海展影医疗科技有限公司版权所有</Copyright>
|
||||||
|
<NoWarn>$(NoWarn);NU1903</NoWarn>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
@@ -69,22 +69,21 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
|
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.14" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.8" />
|
||||||
|
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.15">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.8">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="ConfigMapFileProvider" Version="2.0.1" />
|
<PackageReference Include="ConfigMapFileProvider" Version="2.0.1" />
|
||||||
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.20" />
|
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.23" />
|
||||||
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
|
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
|
||||||
<PackageReference Include="Hangfire.InMemory" Version="1.0.0" />
|
<PackageReference Include="Hangfire.InMemory" Version="1.0.0" />
|
||||||
<PackageReference Include="Hangfire.SqlServer" Version="1.8.20" />
|
<PackageReference Include="Hangfire.SqlServer" Version="1.8.23" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="10.0.8" />
|
||||||
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" />
|
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.Email" Version="4.1.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.1" />
|
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="10.2.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -378,6 +378,11 @@
|
|||||||
LowerCamelCaseJsonAttribute 可以设置类小写返回给前端
|
LowerCamelCaseJsonAttribute 可以设置类小写返回给前端
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="T:Program">
|
||||||
|
<summary>
|
||||||
|
Auto-generated public partial Program class for top-level statement apps.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="T:ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt.CustomHSJWTService">
|
<member name="T:ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt.CustomHSJWTService">
|
||||||
<summary>
|
<summary>
|
||||||
对称可逆加密
|
对称可逆加密
|
||||||
@@ -413,5 +418,49 @@
|
|||||||
<param name="withPrivate"></param>
|
<param name="withPrivate"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Type)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation comment ID for a type.
|
||||||
|
Example: T:Namespace.Outer+Inner`1 becomes T:Namespace.Outer.Inner`1
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Reflection.PropertyInfo)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation comment ID for a property.
|
||||||
|
Example: P:Namespace.ContainingType.PropertyName or for an indexer P:Namespace.ContainingType.Item(System.Int32)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Type,System.String)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation comment ID for a property given its container type and property name.
|
||||||
|
Example: P:Namespace.ContainingType.PropertyName
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Reflection.MethodInfo)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation comment ID for a method (or constructor).
|
||||||
|
For example:
|
||||||
|
M:Namespace.ContainingType.MethodName(ParamType1,ParamType2)~ReturnType
|
||||||
|
M:Namespace.ContainingType.#ctor(ParamType)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.GetTypeDocId(System.Type,System.Boolean,System.Boolean)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation ID string for a type.
|
||||||
|
This method handles nested types (replacing '+' with '.'),
|
||||||
|
generic types, arrays, pointers, by-ref types, and generic parameters.
|
||||||
|
The <paramref name="includeGenericArguments"/> flag controls whether
|
||||||
|
constructed generic type arguments are emitted, while <paramref name="omitGenericArity"/>
|
||||||
|
controls whether the generic arity marker (e.g. "`1") is appended.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.NormalizeDocId(System.String)">
|
||||||
|
<summary>
|
||||||
|
Normalizes a documentation comment ID to match the compiler-style format.
|
||||||
|
Strips the return type suffix for ordinary methods but retains it for conversion operators.
|
||||||
|
</summary>
|
||||||
|
<param name="docId">The documentation comment ID to normalize.</param>
|
||||||
|
<returns>The normalized documentation comment ID.</returns>
|
||||||
|
</member>
|
||||||
</members>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
|
|||||||
builder.Services.AddHealthChecks();
|
builder.Services.AddHealthChecks();
|
||||||
builder.Services.AddSerilog();
|
builder.Services.AddSerilog();
|
||||||
//本地化
|
//本地化
|
||||||
builder.Services.AddJsonLocalization(options => options.ResourcesPath = "Resources");
|
builder.Services.AddJsonLocalization(options => options.ResourcesPath = new[] { "Resources" });
|
||||||
|
|
||||||
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
|
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
|
||||||
builder.Services.AddControllers(options =>
|
builder.Services.AddControllers(options =>
|
||||||
@@ -286,6 +286,7 @@ try
|
|||||||
#region 运行环境 部署平台
|
#region 运行环境 部署平台
|
||||||
|
|
||||||
Log.Logger.Warning($"当前环境:{enviromentName}");
|
Log.Logger.Warning($"当前环境:{enviromentName}");
|
||||||
|
Log.Logger.Warning($".NET 运行时版本:{Environment.Version}");
|
||||||
|
|
||||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,6 +25,24 @@
|
|||||||
},
|
},
|
||||||
"applicationUrl": "http://0.0.0.0:6100"
|
"applicationUrl": "http://0.0.0.0:6100"
|
||||||
},
|
},
|
||||||
|
"IRaCIS.Test_Rayplus": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Test_Rayplus",
|
||||||
|
"ASPNETCORE_OpenSwagger": "true"
|
||||||
|
},
|
||||||
|
"applicationUrl": "http://0.0.0.0:6100"
|
||||||
|
},
|
||||||
|
"IRaCIS.Uat_Rayplus": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Uat_Rayplus",
|
||||||
|
"ASPNETCORE_OpenSwagger": "true"
|
||||||
|
},
|
||||||
|
"applicationUrl": "http://0.0.0.0:6100"
|
||||||
|
},
|
||||||
"IRaCIS.Test_IRC_PGSQL": {
|
"IRaCIS.Test_IRC_PGSQL": {
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
|
|||||||
@@ -1,15 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.OpenApi;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.OpenApi.Models;
|
|
||||||
using Swashbuckle.AspNetCore.Filters;
|
using Swashbuckle.AspNetCore.Filters;
|
||||||
using Swashbuckle.AspNetCore.SwaggerGen;
|
|
||||||
using Swashbuckle.AspNetCore.SwaggerUI;
|
using Swashbuckle.AspNetCore.SwaggerUI;
|
||||||
using System;
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace IRaCIS.Core.API;
|
namespace IRaCIS.Core.API;
|
||||||
@@ -52,11 +44,13 @@ public static class SwaggerSetup
|
|||||||
services.AddSwaggerGen(options =>
|
services.AddSwaggerGen(options =>
|
||||||
{
|
{
|
||||||
|
|
||||||
typeof(SwaggerVersion).GetFields(BindingFlags.Public | BindingFlags.Static).ToList()
|
// 使用反射获取字段并动态创建 Swagger 文档
|
||||||
|
typeof(SwaggerVersion).GetFields(BindingFlags.Public | BindingFlags.Static)
|
||||||
|
.ToList()
|
||||||
.ForEach(field =>
|
.ForEach(field =>
|
||||||
{
|
{
|
||||||
var description = field.GetCustomAttribute<DescriptionAttribute>()?.Description ?? field.Name;
|
var description = field.GetCustomAttribute<DescriptionAttribute>()?.Description ?? field.Name;
|
||||||
options.SwaggerDoc(field.Name, new Microsoft.OpenApi.Models.OpenApiInfo
|
options.SwaggerDoc(field.Name, new OpenApiInfo
|
||||||
{
|
{
|
||||||
Version = field.Name,
|
Version = field.Name,
|
||||||
Description = $"{field.Name} API",
|
Description = $"{field.Name} API",
|
||||||
@@ -64,6 +58,7 @@ public static class SwaggerSetup
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// 接口排序
|
// 接口排序
|
||||||
options.OrderActionsBy(o => o.GroupName);
|
options.OrderActionsBy(o => o.GroupName);
|
||||||
|
|
||||||
|
|||||||
@@ -44,11 +44,11 @@
|
|||||||
"RegionId": "cn-shanghai",
|
"RegionId": "cn-shanghai",
|
||||||
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
"AccessKeyId": "LTAI5tNRTsqL6aWmHkDmTwoH",
|
"AccessKeyId": "LTAI5tFUCCmz5TwghZHsj45Y",
|
||||||
"AccessKeySecret": "7mtGz3qrYWI6JMMBZiLeC119VWicZH",
|
"AccessKeySecret": "8evrBy1fVfzJG25i67Jm0xqn9Xcw2T",
|
||||||
"RoleArn": "acs:ram::1899121822495495:role/irc-oss-access",
|
"RoleArn": "acs:ram::1078130221702011:role/uat-oss-access",
|
||||||
"BucketName": "zy-irc-store",
|
"BucketName": "tl-med-irc-event-store",
|
||||||
"ViewEndpoint": "https://zy-irc-cache.oss-cn-shanghai.aliyuncs.com",
|
"ViewEndpoint": "https://tl-med-rc-event-cache.oss-cn-shanghai.aliyuncs.com",
|
||||||
"Region": "oss-cn-shanghai",
|
"Region": "oss-cn-shanghai",
|
||||||
"DurationSeconds": 7200
|
"DurationSeconds": 7200
|
||||||
},
|
},
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
"OpenUserComplexPassword": true,
|
"OpenUserComplexPassword": true,
|
||||||
"OpenSignDocumentBeforeWork": true,
|
"OpenSignDocumentBeforeWork": true,
|
||||||
|
|
||||||
"OpenLoginLimit": true,
|
"OpenLoginLimit": false,
|
||||||
"LoginMaxFailCount": 5,
|
"LoginMaxFailCount": 5,
|
||||||
"LoginFailLockMinutes": 30,
|
"LoginFailLockMinutes": 30,
|
||||||
"AutoLoginOutMinutes": 120,
|
"AutoLoginOutMinutes": 120,
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
"Imap": "imap.qiye.aliyun.com",
|
"Imap": "imap.qiye.aliyun.com",
|
||||||
"ImapPort": 993,
|
"ImapPort": 993,
|
||||||
"FromEmail": "irc@extimaging.com",
|
"FromEmail": "irc@extimaging.com",
|
||||||
"FromName": "IRC Imaging System",
|
"FromName": "EIC Imaging System",
|
||||||
"AuthorizationCode": "ExtImg@2022",
|
"AuthorizationCode": "ExtImg@2022",
|
||||||
"SiteUrl": "http://irc.extimaging.com/login",
|
"SiteUrl": "http://irc.extimaging.com/login",
|
||||||
|
|
||||||
@@ -117,7 +117,7 @@
|
|||||||
},
|
},
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
"DuplicationWindowMs": 200,
|
"DuplicationWindowMs": 500,
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": [
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"RemoteNew": "Server=10.10.10.49,1434;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
//"RemoteNew": "Server=10.10.10.49,1434;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
||||||
"Hangfire": "Server=10.10.10.49,1434;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
//"Hangfire": "Server=10.10.10.49,1434;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
||||||
//"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
||||||
//"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
||||||
},
|
},
|
||||||
"WeComNoticeConfig": {
|
"WeComNoticeConfig": {
|
||||||
"IsOpenWeComNotice": true,
|
"IsOpenWeComNotice": true,
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
"Imap": "imap.qiye.aliyun.com",
|
"Imap": "imap.qiye.aliyun.com",
|
||||||
"ImapPort": 993,
|
"ImapPort": 993,
|
||||||
"FromEmail": "irc@extimaging.com",
|
"FromEmail": "irc@extimaging.com",
|
||||||
"FromName": "IRC Imaging System",
|
"FromName": "EIC Imaging System",
|
||||||
"AuthorizationCode": "ExtImg@2022",
|
"AuthorizationCode": "ExtImg@2022",
|
||||||
"SiteUrl": "http://irc.extimaging.com/login",
|
"SiteUrl": "http://irc.extimaging.com/login",
|
||||||
|
|
||||||
@@ -117,7 +117,7 @@
|
|||||||
},
|
},
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
"DuplicationWindowMs": 200,
|
"DuplicationWindowMs": 500,
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": [
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_Rayplus;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_Rayplus_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
||||||
|
},
|
||||||
|
"WeComNoticeConfig": {
|
||||||
|
"IsOpenWeComNotice": true,
|
||||||
|
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
|
||||||
|
"APINoticeUserList": [ "u", "wait..." ],
|
||||||
|
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621b97b96f74e6f3d" ]
|
||||||
|
},
|
||||||
|
"ObjectStoreService": {
|
||||||
|
|
||||||
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
"IsOpenStoreSync": true,
|
||||||
|
"ApiDeployRegion": "CN",
|
||||||
|
"SyncConfigList": [
|
||||||
|
{
|
||||||
|
"Domain": "irc.uat.rayplus.net",
|
||||||
|
"Primary": "AliyunOSS",
|
||||||
|
"Target": "AWS",
|
||||||
|
"UploadRegion": "CN",
|
||||||
|
"TargetRegion": "US",
|
||||||
|
"IsOpenSync": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Domain": "lili.uat.extimaging.com",
|
||||||
|
"Primary": "AWS",
|
||||||
|
"Target": "AliyunOSS",
|
||||||
|
"UploadRegion": "US",
|
||||||
|
"TargetRegion": "CN",
|
||||||
|
"IsOpenSync": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"AliyunOSS": {
|
||||||
|
"RegionId": "cn-shanghai",
|
||||||
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"AccessKeyId": "LTAI5tNRTsqL6aWmHkDmTwoH",
|
||||||
|
"AccessKeySecret": "7mtGz3qrYWI6JMMBZiLeC119VWicZH",
|
||||||
|
"RoleArn": "acs:ram::1899121822495495:role/irc-oss-access",
|
||||||
|
"BucketName": "rayplus-irc-store",
|
||||||
|
"ViewEndpoint": "https://rayplus-irc-store.oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"Region": "oss-cn-shanghai",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
},
|
||||||
|
|
||||||
|
"MinIO": {
|
||||||
|
"endPoint": "hir-oss.uat.extimaging.com",
|
||||||
|
"port": "80",
|
||||||
|
"useSSL": false,
|
||||||
|
"viewEndpoint": "http://hir-oss.uat.extimaging.com/irc-uat",
|
||||||
|
//"port": "443",
|
||||||
|
//"useSSL": true,
|
||||||
|
//"viewEndpoint": "https://hir-oss.uat.extimaging.com/irc-uat",
|
||||||
|
"accessKey": "b9Ul0e98xPzt6PwRXA1Q",
|
||||||
|
"secretKey": "DzMaU2L4OXl90uytwOmDXF2encN0Jf4Nxu2XkYqQ",
|
||||||
|
"bucketName": "irc-uat"
|
||||||
|
|
||||||
|
},
|
||||||
|
"AWS": {
|
||||||
|
"Region": "us-east-1",
|
||||||
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
|
"UseSSL": true,
|
||||||
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com/",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"BasicSystemConfig": {
|
||||||
|
// 启用质控风险控制功能
|
||||||
|
"QCRiskControl": true,
|
||||||
|
"OpenUserComplexPassword": true,
|
||||||
|
"OpenSignDocumentBeforeWork": true,
|
||||||
|
|
||||||
|
"OpenLoginLimit": true,
|
||||||
|
"LoginMaxFailCount": 5,
|
||||||
|
|
||||||
|
"LoginFailLockMinutes": 30,
|
||||||
|
"AutoLoginOutMinutes": 120,
|
||||||
|
|
||||||
|
"OpenLoginMFA": false,
|
||||||
|
|
||||||
|
"ContinuousReadingTimeMin": 120,
|
||||||
|
"ReadingRestTimeMin": 10,
|
||||||
|
|
||||||
|
"IsNeedChangePassWord": true,
|
||||||
|
"ChangePassWordDays": 90,
|
||||||
|
// 模板类型 1 Elevate 2 Extensive
|
||||||
|
"TemplateType": 2,
|
||||||
|
//MFA免验证发送天数
|
||||||
|
"UserMFAVerifyMinutes": 1440
|
||||||
|
|
||||||
|
},
|
||||||
|
"SystemEmailSendConfig": {
|
||||||
|
"Port": 465,
|
||||||
|
"Host": "smtp.qiye.aliyun.com",
|
||||||
|
"Imap": "imap.qiye.aliyun.com",
|
||||||
|
"ImapPort": 993,
|
||||||
|
"FromEmail": "irc@mail.rayplus.net",
|
||||||
|
"FromName": "RayPlus Imaging System",
|
||||||
|
"AuthorizationCode": "QWE1zxcv7632",
|
||||||
|
"SiteUrl": "https://irc.rayplus.net/login",
|
||||||
|
|
||||||
|
"PlatformName": "RayPlus",
|
||||||
|
"PlatformNameCN": "睿佳影像云平台",
|
||||||
|
"SystemShortName": "RayPlus",
|
||||||
|
"OrganizationName": "RayPlus",
|
||||||
|
"OrganizationNameCN": "RayPlus",
|
||||||
|
"CompanyName": "RayPlus",
|
||||||
|
"CompanyNameCN": "睿佳(武汉)软件科技有限公司",
|
||||||
|
"CompanyShortName": "RayPlus",
|
||||||
|
"CompanyShortNameCN": "睿佳",
|
||||||
|
"IsEnv_US": false,
|
||||||
|
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
||||||
|
"CronEmailDefaultCulture": "zh-CN"
|
||||||
|
},
|
||||||
|
|
||||||
|
"SystemPacsConfig": {
|
||||||
|
"Port": "11113",
|
||||||
|
"IP": "47.117.165.18"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 200,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,34 +1,30 @@
|
|||||||
{
|
{
|
||||||
// 日志信息
|
|
||||||
"Logging": {
|
"Logging": {
|
||||||
// 日志等级
|
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
// 默认日志等级
|
|
||||||
"Default": "Information",
|
"Default": "Information",
|
||||||
// 调试日志等级
|
|
||||||
"Microsoft": "Warning",
|
"Microsoft": "Warning",
|
||||||
// ASP.NET Core 日志等级
|
|
||||||
"Microsoft.Hosting.Lifetime": "Information"
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 数据库链接字符串
|
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
// 本地数据库链接字符串
|
|
||||||
"RemoteNew": "Server=106.14.89.110,1435;Database=Test_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
|
"RemoteNew": "Server=106.14.89.110,1435;Database=Test_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
|
||||||
// Hangfire 定时任务数据库链接字符串
|
|
||||||
"Hangfire": "Server=106.14.89.110,1435;Database=Test_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
|
"Hangfire": "Server=106.14.89.110,1435;Database=Test_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
|
||||||
},
|
},
|
||||||
"WeComNoticeConfig": {
|
"WeComNoticeConfig": {
|
||||||
"IsOpenWeComNotice": true,
|
"IsOpenWeComNotice": true,
|
||||||
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
|
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449",
|
||||||
"APINoticeUserList": [ "u", "wait..." ],
|
"APINoticeUserList": [
|
||||||
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621b97b96f74e6f3d" ]
|
"u",
|
||||||
|
"wait..."
|
||||||
|
],
|
||||||
|
"VueNoticeUserList": [
|
||||||
|
"wangxiaoshuang",
|
||||||
|
"6b7717a31647293621b97b96f74e6f3d"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
// 对象存储服务配置
|
|
||||||
"ObjectStoreService": {
|
"ObjectStoreService": {
|
||||||
// 使用的对象存储服务类型
|
|
||||||
"ObjectStoreUse": "AliyunOSS",
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
"IsOpenStoreSync": true,
|
"IsOpenStoreSync": false,
|
||||||
"ApiDeployRegion": "CN",
|
"ApiDeployRegion": "CN",
|
||||||
"SyncConfigList": [
|
"SyncConfigList": [
|
||||||
{
|
{
|
||||||
@@ -45,171 +41,91 @@
|
|||||||
"Target": "AliyunOSS",
|
"Target": "AliyunOSS",
|
||||||
"UploadRegion": "US",
|
"UploadRegion": "US",
|
||||||
"TargetRegion": "CN",
|
"TargetRegion": "CN",
|
||||||
"IsOpenSync": true
|
"IsOpenSync": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
// 阿里云对象存储服务的配置
|
|
||||||
"AliyunOSS": {
|
"AliyunOSS": {
|
||||||
// 阿里云 OSS 的 Region ID
|
|
||||||
"RegionId": "cn-shanghai",
|
"RegionId": "cn-shanghai",
|
||||||
// 阿里云 OSS 的内部访问端点
|
|
||||||
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
// 阿里云 OSS 的外部访问端点
|
|
||||||
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
// 阿里云 OSS 的访问密钥 ID
|
|
||||||
"AccessKeyId": "LTAI5tRRZehUp2V9pyTPtAJm",
|
"AccessKeyId": "LTAI5tRRZehUp2V9pyTPtAJm",
|
||||||
// 阿里云 OSS 的访问密钥 Secret
|
|
||||||
"AccessKeySecret": "FLizxkHsMm4CGYHtkV8E3PNJJZU7oV",
|
"AccessKeySecret": "FLizxkHsMm4CGYHtkV8E3PNJJZU7oV",
|
||||||
// 阿里云 OSS 的角色 ARN
|
|
||||||
"RoleArn": "acs:ram::1899121822495495:role/dev-oss-access",
|
"RoleArn": "acs:ram::1899121822495495:role/dev-oss-access",
|
||||||
// 阿里云 OSS 的Bucket名称
|
|
||||||
"BucketName": "zy-irc-test-store",
|
"BucketName": "zy-irc-test-store",
|
||||||
// 阿里云 OSS 的访问端点
|
|
||||||
"ViewEndpoint": "https://zy-irc-test-dev-cache.oss-cn-shanghai.aliyuncs.com",
|
"ViewEndpoint": "https://zy-irc-test-dev-cache.oss-cn-shanghai.aliyuncs.com",
|
||||||
// 阿里云 OSS 的预览端点
|
|
||||||
"Region": "oss-cn-shanghai",
|
"Region": "oss-cn-shanghai",
|
||||||
// 阿里云 OSS 的临时访问凭证有效时间(秒)
|
|
||||||
"DurationSeconds": 7200,
|
"DurationSeconds": 7200,
|
||||||
// 阿里云 OSS 的预览端点
|
|
||||||
"PreviewEndpoint": "https://test-oss.test.extimaging.com"
|
"PreviewEndpoint": "https://test-oss.test.extimaging.com"
|
||||||
},
|
},
|
||||||
// MinIO 对象存储服务的配置
|
|
||||||
"MinIO": {
|
"MinIO": {
|
||||||
// MinIO 的访问端点
|
|
||||||
"EndPoint": "hir-oss.test.extimaging.com",
|
"EndPoint": "hir-oss.test.extimaging.com",
|
||||||
// MinIO 的端口
|
|
||||||
"Port": "443",
|
"Port": "443",
|
||||||
// 是否使用 SSL
|
|
||||||
"UseSSL": true,
|
"UseSSL": true,
|
||||||
// MinIO 的角色 ARN
|
|
||||||
"AccessKey": "fbStsVYCIPKHQneeqMwD",
|
"AccessKey": "fbStsVYCIPKHQneeqMwD",
|
||||||
// MinIO 的访问密钥
|
|
||||||
"SecretKey": "TzgvyA3zGXMUnpilJNUlyMYHfosl1hBMl6lxPmjy",
|
"SecretKey": "TzgvyA3zGXMUnpilJNUlyMYHfosl1hBMl6lxPmjy",
|
||||||
// MinIO 的BucketName
|
|
||||||
"BucketName": "irc-test",
|
"BucketName": "irc-test",
|
||||||
// MinIO 的访问端点
|
|
||||||
"ViewEndpoint": "https://hir-oss.test.extimaging.com/irc-test"
|
"ViewEndpoint": "https://hir-oss.test.extimaging.com/irc-test"
|
||||||
},
|
},
|
||||||
// AWS S3 对象存储服务的配置
|
|
||||||
"AWS": {
|
"AWS": {
|
||||||
// AWS S3 的Region
|
|
||||||
"Region": "us-east-1",
|
"Region": "us-east-1",
|
||||||
// AWS S3 的内部访问端点
|
|
||||||
"EndPoint": "s3.us-east-1.amazonaws.com",
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
// 是否使用 SSL
|
|
||||||
"UseSSL": true,
|
"UseSSL": true,
|
||||||
// AWS S3 的角色 ARN
|
|
||||||
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
// AWS S3 的访问密钥 ID
|
|
||||||
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
// AWS S3 的访问密钥 Secret
|
|
||||||
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
// AWS S3 的Bucket名称
|
|
||||||
"BucketName": "ei-med-s3-lili-uat-store",
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
// AWS S3 的访问端点
|
|
||||||
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com",
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com",
|
||||||
// AWS S3 的持续数秒
|
|
||||||
"DurationSeconds": 7200
|
"DurationSeconds": 7200
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 系统配置
|
|
||||||
"BasicSystemConfig": {
|
"BasicSystemConfig": {
|
||||||
// 启用质控风险控制功能
|
|
||||||
"QCRiskControl": true,
|
"QCRiskControl": true,
|
||||||
// 打开用户复杂密码
|
|
||||||
"OpenUserComplexPassword": false,
|
"OpenUserComplexPassword": false,
|
||||||
// 是否在开始工作前强制签署电子知情同意书
|
|
||||||
"OpenSignDocumentBeforeWork": false,
|
"OpenSignDocumentBeforeWork": false,
|
||||||
// 是否启用登录失败次数限制(防暴力破解)
|
|
||||||
"OpenLoginLimit": false,
|
"OpenLoginLimit": false,
|
||||||
// 连续登录失败多少次后触发锁定
|
|
||||||
"LoginMaxFailCount": 5,
|
"LoginMaxFailCount": 5,
|
||||||
// 触发锁定后账号锁定时长(分钟)
|
|
||||||
"LoginFailLockMinutes": 1,
|
"LoginFailLockMinutes": 1,
|
||||||
// 无操作自动登出的超时时间(分钟)
|
|
||||||
"AutoLoginOutMinutes": 10,
|
"AutoLoginOutMinutes": 10,
|
||||||
// 是否启用多因子登录认证(MFA)
|
|
||||||
"OpenLoginMFA": false,
|
"OpenLoginMFA": false,
|
||||||
// 连续阅片的最长工作时间(分钟),超时后强制休息
|
|
||||||
"ContinuousReadingTimeMin": 120,
|
"ContinuousReadingTimeMin": 120,
|
||||||
// 强制休息时长(分钟)
|
|
||||||
"ReadingRestTimeMin": 10,
|
"ReadingRestTimeMin": 10,
|
||||||
// 是否强制用户定期修改密码
|
|
||||||
"IsNeedChangePassWord": true,
|
"IsNeedChangePassWord": true,
|
||||||
// 密码有效期(天),到期后必须修改
|
|
||||||
"ChangePassWordDays": 90,
|
"ChangePassWordDays": 90,
|
||||||
// 模板类型 1 Elevate(LiLi) 2 Extensive(展影)
|
|
||||||
"TemplateType": 2,
|
"TemplateType": 2,
|
||||||
// 是否打开项目关联删除
|
"OpenTrialRelationDelete": false,
|
||||||
"OpenTrialRelationDelete": true,
|
|
||||||
// 转换PDF服务配置
|
|
||||||
"ThirdPdfUrl": "http://106.14.89.110:30088/api/v1/convert/file/pdf",
|
"ThirdPdfUrl": "http://106.14.89.110:30088/api/v1/convert/file/pdf",
|
||||||
//MFA免验证发送天数
|
|
||||||
"UserMFAVerifyMinutes": 1440
|
"UserMFAVerifyMinutes": 1440
|
||||||
},
|
},
|
||||||
// 邮件服务配置(用于系统通知、找回密码、错误报警等)
|
|
||||||
"SystemEmailSendConfig": {
|
"SystemEmailSendConfig": {
|
||||||
|
|
||||||
// 企业邮箱SMTP服务器地址
|
|
||||||
"Host": "smtp.qiye.aliyun.com",
|
"Host": "smtp.qiye.aliyun.com",
|
||||||
// SMTP端口
|
|
||||||
"Port": 465,
|
"Port": 465,
|
||||||
|
|
||||||
"Imap": "imap.qiye.aliyun.com",
|
"Imap": "imap.qiye.aliyun.com",
|
||||||
"ImapPort": 993,
|
"ImapPort": 993,
|
||||||
|
|
||||||
// 发件人邮箱地址
|
|
||||||
"FromEmail": "test@extimaging.com",
|
"FromEmail": "test@extimaging.com",
|
||||||
// 发件人显示名称
|
"FromName": "Test EIC Imaging System",
|
||||||
"FromName": "Test IRC Imaging System",
|
|
||||||
// SMTP授权码
|
|
||||||
"AuthorizationCode": "SHzyyl2021",
|
"AuthorizationCode": "SHzyyl2021",
|
||||||
// 系统对外访问地址
|
|
||||||
"SiteUrl": "http://irc.test.extimaging.com/login",
|
"SiteUrl": "http://irc.test.extimaging.com/login",
|
||||||
|
|
||||||
|
|
||||||
// 系统简称 - 一致性核查使用
|
|
||||||
"SystemShortName": "IRC",
|
"SystemShortName": "IRC",
|
||||||
// 组织英文名称-添加用户默认值
|
|
||||||
"OrganizationName": "ExtImaging",
|
"OrganizationName": "ExtImaging",
|
||||||
// 组织中文名称
|
|
||||||
"OrganizationNameCN": "ExtImaging",
|
"OrganizationNameCN": "ExtImaging",
|
||||||
|
|
||||||
"PlatformName": "EICS",
|
"PlatformName": "EICS",
|
||||||
"PlatformNameCN": "展影云平台",
|
"PlatformNameCN": "展影云平台",
|
||||||
// 公司英文全称
|
|
||||||
"CompanyName": "Extensive Imaging",
|
"CompanyName": "Extensive Imaging",
|
||||||
// 公司中文全称
|
|
||||||
"CompanyNameCN": "上海展影医疗科技有限公司",
|
"CompanyNameCN": "上海展影医疗科技有限公司",
|
||||||
// 公司英文简称
|
|
||||||
"CompanyShortName": "Extensive Imaging",
|
"CompanyShortName": "Extensive Imaging",
|
||||||
// 公司中文简称
|
|
||||||
"CompanyShortNameCN": "展影医疗",
|
"CompanyShortNameCN": "展影医疗",
|
||||||
|
|
||||||
// 是否为国际版环境 方便前端区分,用于区分lili 还是irc 做一些事情
|
|
||||||
"IsEnv_US": false,
|
"IsEnv_US": false,
|
||||||
// 邮箱格式校验正则表达式
|
|
||||||
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
||||||
|
|
||||||
//后端周期性邮件默认语言
|
|
||||||
"CronEmailDefaultCulture": "zh-CN"
|
"CronEmailDefaultCulture": "zh-CN"
|
||||||
},
|
},
|
||||||
// PACS 连接配置
|
|
||||||
"SystemPacsConfig": {
|
"SystemPacsConfig": {
|
||||||
// PACS服务器端口
|
|
||||||
"Port": "11113",
|
"Port": "11113",
|
||||||
// PACS服务器IP地址
|
|
||||||
"IP": "106.14.89.110"
|
"IP": "106.14.89.110"
|
||||||
},
|
},
|
||||||
// 重复请求配置
|
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
// 是否启用重复请求检测
|
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
// 重复请求时间窗口(毫秒)
|
"DuplicationWindowMs": 500,
|
||||||
"DuplicationWindowMs": 200,
|
|
||||||
// 缓存请求时间(秒)
|
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": []
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
},
|
},
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
"DuplicationWindowMs": 200,
|
"DuplicationWindowMs": 500,
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": [
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"RemoteNew": "Server=106.14.89.110,1435;Database=Test_Rayplus;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server=106.14.89.110,1435;Database=Test_Rayplus_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
|
||||||
|
},
|
||||||
|
"WeComNoticeConfig": {
|
||||||
|
"IsOpenWeComNotice": true,
|
||||||
|
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
|
||||||
|
"APINoticeUserList": [ "u", "wait..." ],
|
||||||
|
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621b97b96f74e6f3d" ]
|
||||||
|
},
|
||||||
|
"ObjectStoreService": {
|
||||||
|
|
||||||
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
"IsOpenStoreSync": true,
|
||||||
|
"ApiDeployRegion": "CN",
|
||||||
|
"SyncConfigList": [
|
||||||
|
{
|
||||||
|
"Domain": "irc.test.rayplus.net",
|
||||||
|
"Primary": "AliyunOSS",
|
||||||
|
"Target": "AWS",
|
||||||
|
"UploadRegion": "CN",
|
||||||
|
"TargetRegion": "US",
|
||||||
|
"IsOpenSync": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Domain": "lili.uat.extimaging.com",
|
||||||
|
"Primary": "AWS",
|
||||||
|
"Target": "AliyunOSS",
|
||||||
|
"UploadRegion": "US",
|
||||||
|
"TargetRegion": "CN",
|
||||||
|
"IsOpenSync": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"AliyunOSS": {
|
||||||
|
"RegionId": "cn-shanghai",
|
||||||
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"AccessKeyId": "LTAI5tRRZehUp2V9pyTPtAJm",
|
||||||
|
"AccessKeySecret": "FLizxkHsMm4CGYHtkV8E3PNJJZU7oV",
|
||||||
|
"RoleArn": "acs:ram::1899121822495495:role/dev-oss-access",
|
||||||
|
"BucketName": "rayplus-irc-test-store",
|
||||||
|
"ViewEndpoint": "https://rayplus-irc-test-store.oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"Region": "oss-cn-shanghai",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
},
|
||||||
|
|
||||||
|
"MinIO": {
|
||||||
|
"endPoint": "hir-oss.uat.extimaging.com",
|
||||||
|
"port": "80",
|
||||||
|
"useSSL": false,
|
||||||
|
"viewEndpoint": "http://hir-oss.uat.extimaging.com/irc-uat",
|
||||||
|
//"port": "443",
|
||||||
|
//"useSSL": true,
|
||||||
|
//"viewEndpoint": "https://hir-oss.uat.extimaging.com/irc-uat",
|
||||||
|
"accessKey": "b9Ul0e98xPzt6PwRXA1Q",
|
||||||
|
"secretKey": "DzMaU2L4OXl90uytwOmDXF2encN0Jf4Nxu2XkYqQ",
|
||||||
|
"bucketName": "irc-uat"
|
||||||
|
|
||||||
|
},
|
||||||
|
"AWS": {
|
||||||
|
"Region": "us-east-1",
|
||||||
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
|
"UseSSL": true,
|
||||||
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com/",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"BasicSystemConfig": {
|
||||||
|
// 启用质控风险控制功能
|
||||||
|
"QCRiskControl": true,
|
||||||
|
"OpenUserComplexPassword": true,
|
||||||
|
"OpenSignDocumentBeforeWork": true,
|
||||||
|
|
||||||
|
"OpenLoginLimit": true,
|
||||||
|
"LoginMaxFailCount": 5,
|
||||||
|
|
||||||
|
"LoginFailLockMinutes": 30,
|
||||||
|
"AutoLoginOutMinutes": 120,
|
||||||
|
|
||||||
|
"OpenLoginMFA": false,
|
||||||
|
|
||||||
|
"ContinuousReadingTimeMin": 120,
|
||||||
|
"ReadingRestTimeMin": 10,
|
||||||
|
|
||||||
|
"IsNeedChangePassWord": true,
|
||||||
|
"ChangePassWordDays": 90,
|
||||||
|
// 模板类型 1 Elevate 2 Extensive
|
||||||
|
"TemplateType": 2,
|
||||||
|
//MFA免验证发送天数
|
||||||
|
"UserMFAVerifyMinutes": 1440
|
||||||
|
|
||||||
|
},
|
||||||
|
"SystemEmailSendConfig": {
|
||||||
|
"Port": 465,
|
||||||
|
"Host": "smtp.qiye.aliyun.com",
|
||||||
|
"Imap": "imap.qiye.aliyun.com",
|
||||||
|
"ImapPort": 993,
|
||||||
|
"FromEmail": "test_irc@mail.rayplus.net",
|
||||||
|
"FromName": "Test RayPlus Imaging System",
|
||||||
|
"AuthorizationCode": "QWE1zxcv7632",
|
||||||
|
"SiteUrl": "https://irc.test.rayplus.net/login",
|
||||||
|
|
||||||
|
"PlatformName": "RayPlus",
|
||||||
|
"PlatformNameCN": "睿佳影像云平台",
|
||||||
|
"SystemShortName": "RayPlus",
|
||||||
|
"OrganizationName": "RayPlus",
|
||||||
|
"OrganizationNameCN": "RayPlus",
|
||||||
|
"CompanyName": "RayPlus",
|
||||||
|
"CompanyNameCN": "睿佳(武汉)软件科技有限公司",
|
||||||
|
"CompanyShortName": "RayPlus",
|
||||||
|
"CompanyShortNameCN": "睿佳",
|
||||||
|
"IsEnv_US": false,
|
||||||
|
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
||||||
|
"CronEmailDefaultCulture": "zh-CN"
|
||||||
|
},
|
||||||
|
|
||||||
|
"SystemPacsConfig": {
|
||||||
|
"Port": "11113",
|
||||||
|
"IP": "101.132.253.119"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 200,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
},
|
},
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
"DuplicationWindowMs": 200,
|
"DuplicationWindowMs": 500,
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": [
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -102,7 +102,7 @@
|
|||||||
},
|
},
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
"DuplicationWindowMs": 200,
|
"DuplicationWindowMs": 500,
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": [
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
},
|
},
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
"DuplicationWindowMs": 200,
|
"DuplicationWindowMs": 500,
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": [
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,152 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"RemoteNew": "Server=101.132.253.119,1435;Database=Uat_HeAnShu;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server=101.132.253.119,1435;Database=Uat_HeAnShu_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
|
||||||
|
},
|
||||||
|
"WeComNoticeConfig": {
|
||||||
|
"IsOpenWeComNotice": true,
|
||||||
|
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
|
||||||
|
"APINoticeUserList": [ "u", "wait..." ],
|
||||||
|
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621b97b96f74e6f3d" ]
|
||||||
|
},
|
||||||
|
"ObjectStoreService": {
|
||||||
|
|
||||||
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
"IsOpenStoreSync": true,
|
||||||
|
"ApiDeployRegion": "CN",
|
||||||
|
"SyncConfigList": [
|
||||||
|
{
|
||||||
|
"Domain": "irc.uat.rayplus.net",
|
||||||
|
"Primary": "AliyunOSS",
|
||||||
|
"Target": "AWS",
|
||||||
|
"UploadRegion": "CN",
|
||||||
|
"TargetRegion": "US",
|
||||||
|
"IsOpenSync": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Domain": "lili.uat.extimaging.com",
|
||||||
|
"Primary": "AWS",
|
||||||
|
"Target": "AliyunOSS",
|
||||||
|
"UploadRegion": "US",
|
||||||
|
"TargetRegion": "CN",
|
||||||
|
"IsOpenSync": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"AliyunOSS": {
|
||||||
|
"RegionId": "cn-shanghai",
|
||||||
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"AccessKeyId": "LTAI5tFUCCmz5TwghZHsj45Y",
|
||||||
|
"AccessKeySecret": "8evrBy1fVfzJG25i67Jm0xqn9Xcw2T",
|
||||||
|
"RoleArn": "acs:ram::1078130221702011:role/uat-oss-access",
|
||||||
|
"BucketName": "heanshu-irc-uat-store",
|
||||||
|
"ViewEndpoint": "https://heanshu-irc-uat-store.oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"Region": "oss-cn-shanghai",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
},
|
||||||
|
|
||||||
|
"MinIO": {
|
||||||
|
"endPoint": "hir-oss.uat.extimaging.com",
|
||||||
|
"port": "80",
|
||||||
|
"useSSL": false,
|
||||||
|
"viewEndpoint": "http://hir-oss.uat.extimaging.com/irc-uat",
|
||||||
|
//"port": "443",
|
||||||
|
//"useSSL": true,
|
||||||
|
//"viewEndpoint": "https://hir-oss.uat.extimaging.com/irc-uat",
|
||||||
|
"accessKey": "b9Ul0e98xPzt6PwRXA1Q",
|
||||||
|
"secretKey": "DzMaU2L4OXl90uytwOmDXF2encN0Jf4Nxu2XkYqQ",
|
||||||
|
"bucketName": "irc-uat"
|
||||||
|
|
||||||
|
},
|
||||||
|
"AWS": {
|
||||||
|
"Region": "us-east-1",
|
||||||
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
|
"UseSSL": true,
|
||||||
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com/",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"BasicSystemConfig": {
|
||||||
|
// 启用质控风险控制功能
|
||||||
|
"QCRiskControl": true,
|
||||||
|
"OpenUserComplexPassword": true,
|
||||||
|
"OpenSignDocumentBeforeWork": true,
|
||||||
|
|
||||||
|
"OpenLoginLimit": true,
|
||||||
|
"LoginMaxFailCount": 5,
|
||||||
|
|
||||||
|
"LoginFailLockMinutes": 30,
|
||||||
|
"AutoLoginOutMinutes": 120,
|
||||||
|
|
||||||
|
"OpenLoginMFA": false,
|
||||||
|
|
||||||
|
"ContinuousReadingTimeMin": 120,
|
||||||
|
"ReadingRestTimeMin": 10,
|
||||||
|
|
||||||
|
"IsNeedChangePassWord": true,
|
||||||
|
"ChangePassWordDays": 90,
|
||||||
|
// 模板类型 1 Elevate 2 Extensive
|
||||||
|
"TemplateType": 2,
|
||||||
|
//MFA免验证发送天数
|
||||||
|
"UserMFAVerifyMinutes": 1440
|
||||||
|
|
||||||
|
},
|
||||||
|
"SystemEmailSendConfig": {
|
||||||
|
//"Port": 465,
|
||||||
|
//"Host": "smtp.qiye.163.com",
|
||||||
|
//"Imap": "imap.qiye.163.com",
|
||||||
|
//"ImapPort": 993,
|
||||||
|
//"FromEmail": "service@heanshu.com",
|
||||||
|
//"FromName": "Uat HeAnShu Imaging System",
|
||||||
|
//"AuthorizationCode": "j#cAPU%XgvcHWn3N",
|
||||||
|
//"SiteUrl": "https://irc.uat.heanshu.com",
|
||||||
|
|
||||||
|
"Port": 465,
|
||||||
|
"Host": "smtp.qiye.aliyun.com",
|
||||||
|
"Imap": "imap.qiye.aliyun.com",
|
||||||
|
"ImapPort": 993,
|
||||||
|
"FromEmail": "service@mail.rayplus.net",
|
||||||
|
"FromName": "Uat HeAnShu Imaging System",
|
||||||
|
"AuthorizationCode": "crefHpx3WtenFr6X",
|
||||||
|
"SiteUrl": "https://irc.uat.heanshu.com",
|
||||||
|
|
||||||
|
"PlatformName": "HeAnShu",
|
||||||
|
"PlatformNameCN": "禾安枢影像云平台",
|
||||||
|
"SystemShortName": "HeAnShu",
|
||||||
|
"OrganizationName": "HeAnShu",
|
||||||
|
"OrganizationNameCN": "HeAnShu",
|
||||||
|
"CompanyName": "HeAnShu",
|
||||||
|
"CompanyNameCN": "禾安枢软件科技有限公司",
|
||||||
|
"CompanyShortName": "HeAnShu",
|
||||||
|
"CompanyShortNameCN": "禾安枢",
|
||||||
|
"IsEnv_US": false,
|
||||||
|
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
||||||
|
"CronEmailDefaultCulture": "zh-CN"
|
||||||
|
},
|
||||||
|
|
||||||
|
"SystemPacsConfig": {
|
||||||
|
"Port": "11113",
|
||||||
|
"IP": "101.132.253.119"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 200,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
"Imap": "imap.qiye.aliyun.com",
|
"Imap": "imap.qiye.aliyun.com",
|
||||||
"ImapPort": 993,
|
"ImapPort": 993,
|
||||||
"FromEmail": "uat@extimaging.com",
|
"FromEmail": "uat@extimaging.com",
|
||||||
"FromName": "Uat IRC Imaging System",
|
"FromName": "Uat EIC Imaging System",
|
||||||
"AuthorizationCode": "SHzyyl2021",
|
"AuthorizationCode": "SHzyyl2021",
|
||||||
"SiteUrl": "http://irc.uat.extimaging.com/login",
|
"SiteUrl": "http://irc.uat.extimaging.com/login",
|
||||||
|
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
},
|
},
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
"DuplicationWindowMs": 200,
|
"DuplicationWindowMs": 500,
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": [
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"RemoteNew": "Server=101.132.253.119,1435;Database=Uat_Rayplus;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server=101.132.253.119,1435;Database=Uat_Rayplus_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
|
||||||
|
},
|
||||||
|
"WeComNoticeConfig": {
|
||||||
|
"IsOpenWeComNotice": true,
|
||||||
|
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
|
||||||
|
"APINoticeUserList": [ "u", "wait..." ],
|
||||||
|
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621b97b96f74e6f3d" ]
|
||||||
|
},
|
||||||
|
"ObjectStoreService": {
|
||||||
|
|
||||||
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
"IsOpenStoreSync": true,
|
||||||
|
"ApiDeployRegion": "CN",
|
||||||
|
"SyncConfigList": [
|
||||||
|
{
|
||||||
|
"Domain": "irc.uat.rayplus.net",
|
||||||
|
"Primary": "AliyunOSS",
|
||||||
|
"Target": "AWS",
|
||||||
|
"UploadRegion": "CN",
|
||||||
|
"TargetRegion": "US",
|
||||||
|
"IsOpenSync": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Domain": "lili.uat.extimaging.com",
|
||||||
|
"Primary": "AWS",
|
||||||
|
"Target": "AliyunOSS",
|
||||||
|
"UploadRegion": "US",
|
||||||
|
"TargetRegion": "CN",
|
||||||
|
"IsOpenSync": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"AliyunOSS": {
|
||||||
|
"RegionId": "cn-shanghai",
|
||||||
|
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
|
||||||
|
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"AccessKeyId": "LTAI5tFUCCmz5TwghZHsj45Y",
|
||||||
|
"AccessKeySecret": "8evrBy1fVfzJG25i67Jm0xqn9Xcw2T",
|
||||||
|
"RoleArn": "acs:ram::1078130221702011:role/uat-oss-access",
|
||||||
|
"BucketName": "rayplus-irc-uat-store",
|
||||||
|
"ViewEndpoint": "https://rayplus-irc-uat-store.oss-cn-shanghai.aliyuncs.com",
|
||||||
|
"Region": "oss-cn-shanghai",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
},
|
||||||
|
|
||||||
|
"MinIO": {
|
||||||
|
"endPoint": "hir-oss.uat.extimaging.com",
|
||||||
|
"port": "80",
|
||||||
|
"useSSL": false,
|
||||||
|
"viewEndpoint": "http://hir-oss.uat.extimaging.com/irc-uat",
|
||||||
|
//"port": "443",
|
||||||
|
//"useSSL": true,
|
||||||
|
//"viewEndpoint": "https://hir-oss.uat.extimaging.com/irc-uat",
|
||||||
|
"accessKey": "b9Ul0e98xPzt6PwRXA1Q",
|
||||||
|
"secretKey": "DzMaU2L4OXl90uytwOmDXF2encN0Jf4Nxu2XkYqQ",
|
||||||
|
"bucketName": "irc-uat"
|
||||||
|
|
||||||
|
},
|
||||||
|
"AWS": {
|
||||||
|
"Region": "us-east-1",
|
||||||
|
"EndPoint": "s3.us-east-1.amazonaws.com",
|
||||||
|
"UseSSL": true,
|
||||||
|
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
|
||||||
|
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
|
||||||
|
"SecretAccessKey": "Pgrg3le5jPxZQ7MR1yYNS30J0XRyJeKVyIIjElXc",
|
||||||
|
"BucketName": "ei-med-s3-lili-uat-store",
|
||||||
|
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com/",
|
||||||
|
"DurationSeconds": 7200
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"BasicSystemConfig": {
|
||||||
|
// 启用质控风险控制功能
|
||||||
|
"QCRiskControl": true,
|
||||||
|
"OpenUserComplexPassword": true,
|
||||||
|
"OpenSignDocumentBeforeWork": true,
|
||||||
|
|
||||||
|
"OpenLoginLimit": true,
|
||||||
|
"LoginMaxFailCount": 5,
|
||||||
|
|
||||||
|
"LoginFailLockMinutes": 30,
|
||||||
|
"AutoLoginOutMinutes": 120,
|
||||||
|
|
||||||
|
"OpenLoginMFA": false,
|
||||||
|
|
||||||
|
"ContinuousReadingTimeMin": 120,
|
||||||
|
"ReadingRestTimeMin": 10,
|
||||||
|
|
||||||
|
"IsNeedChangePassWord": true,
|
||||||
|
"ChangePassWordDays": 90,
|
||||||
|
// 模板类型 1 Elevate 2 Extensive
|
||||||
|
"TemplateType": 2,
|
||||||
|
//MFA免验证发送天数
|
||||||
|
"UserMFAVerifyMinutes": 1440
|
||||||
|
|
||||||
|
},
|
||||||
|
"SystemEmailSendConfig": {
|
||||||
|
"Port": 465,
|
||||||
|
"Host": "smtp.qiye.aliyun.com",
|
||||||
|
"Imap": "imap.qiye.aliyun.com",
|
||||||
|
"ImapPort": 993,
|
||||||
|
"FromEmail": "uat@mail.rayplus.net",
|
||||||
|
"FromName": "Uat RayPlus Imaging System",
|
||||||
|
"AuthorizationCode": "QWE1zxcv7632",
|
||||||
|
"SiteUrl": "https://irc.uat.rayplus.net/login",
|
||||||
|
|
||||||
|
"PlatformName": "RayPlus",
|
||||||
|
"PlatformNameCN": "睿佳影像云平台",
|
||||||
|
"SystemShortName": "RayPlus",
|
||||||
|
"OrganizationName": "RayPlus",
|
||||||
|
"OrganizationNameCN": "RayPlus",
|
||||||
|
"CompanyName": "RayPlus",
|
||||||
|
"CompanyNameCN": "睿佳(武汉)软件科技有限公司",
|
||||||
|
"CompanyShortName": "RayPlus",
|
||||||
|
"CompanyShortNameCN": "睿佳",
|
||||||
|
"IsEnv_US": false,
|
||||||
|
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
||||||
|
"CronEmailDefaultCulture": "zh-CN"
|
||||||
|
},
|
||||||
|
|
||||||
|
"SystemPacsConfig": {
|
||||||
|
"Port": "11113",
|
||||||
|
"IP": "101.132.253.119"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 200,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
},
|
},
|
||||||
"RequestDuplicationOptions": {
|
"RequestDuplicationOptions": {
|
||||||
"IsEnabled": true,
|
"IsEnabled": true,
|
||||||
"DuplicationWindowMs": 200,
|
"DuplicationWindowMs": 500,
|
||||||
"CacheTimeSeconds": 5,
|
"CacheTimeSeconds": 5,
|
||||||
"ExcludedPaths": [
|
"ExcludedPaths": [
|
||||||
]
|
]
|
||||||
|
|||||||
+58
-10
@@ -8,6 +8,8 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
|||||||
{
|
{
|
||||||
using Database.Api;
|
using Database.Api;
|
||||||
using DocumentFormat.OpenXml.InkML;
|
using DocumentFormat.OpenXml.InkML;
|
||||||
|
using global::MassTransit;
|
||||||
|
using IRaCIS.Core.Application.Helper.OtherTool;
|
||||||
using IRaCIS.Core.Application.Service.Common;
|
using IRaCIS.Core.Application.Service.Common;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using IRaCIS.Core.Infrastructure.Extention;
|
using IRaCIS.Core.Infrastructure.Extention;
|
||||||
@@ -17,6 +19,7 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
|||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
@@ -35,7 +38,7 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="logger">logger</param>
|
/// <param name="logger">logger</param>
|
||||||
/// <param name="accessor">loggerHelper</param>
|
/// <param name="accessor">loggerHelper</param>
|
||||||
public class RequestDuplicationFilter(ILogger<RequestDuplicationFilter> logger, IHttpContextAccessor accessor, IUserInfo _userInfo, IStringLocalizer _localizer, IOptionsMonitor<RequestDuplicationOptions> RequestDuplicationOptionsMonitor) : ExceptionFilterAttribute, IAsyncActionFilter
|
public class RequestDuplicationFilter(ILogger<RequestDuplicationFilter> logger, IHttpContextAccessor accessor, IUserInfo _userInfo, IStringLocalizer _localizer, IOptionsMonitor<RequestDuplicationOptions> RequestDuplicationOptionsMonitor, IConfiguration _config) : ExceptionFilterAttribute, IAsyncActionFilter
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 传入的参数
|
/// 传入的参数
|
||||||
@@ -70,6 +73,10 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
|||||||
{
|
{
|
||||||
this.RequestDuplication();
|
this.RequestDuplication();
|
||||||
}
|
}
|
||||||
|
catch (BusinessValidationFailedException)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -89,8 +96,12 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
|||||||
{
|
{
|
||||||
var requestPath = accessor?.HttpContext?.Request?.Path.ToString() ?? string.Empty;
|
var requestPath = accessor?.HttpContext?.Request?.Path.ToString() ?? string.Empty;
|
||||||
|
|
||||||
|
var httpMethod = accessor?.HttpContext?.Request?.Method?.ToUpper() ?? string.Empty;
|
||||||
|
|
||||||
// 验证请求频繁情况
|
// 验证请求频繁情况
|
||||||
if (
|
if (
|
||||||
|
!httpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
|
||||||
!requestPath
|
!requestPath
|
||||||
.Split("/", StringSplitOptions.RemoveEmptyEntries)
|
.Split("/", StringSplitOptions.RemoveEmptyEntries)
|
||||||
.Any(segment => segment.StartsWith("get", StringComparison.OrdinalIgnoreCase)) &&
|
.Any(segment => segment.StartsWith("get", StringComparison.OrdinalIgnoreCase)) &&
|
||||||
@@ -106,17 +117,54 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
|||||||
RequestTime = DateTime.Now
|
RequestTime = DateTime.Now
|
||||||
};
|
};
|
||||||
|
|
||||||
IRCSystemInfo.RequestRecordList= IRCSystemInfo.RequestRecordList.Where(x => x.RequestTime >= DateTime.Now.AddSeconds(-RequestDuplicationOptionsMonitor.CurrentValue.CacheTimeSeconds)).ToList();
|
var isAdded = IRCSystemInfo.TryAddRequestRecord(
|
||||||
|
requestInfo,
|
||||||
|
RequestDuplicationOptionsMonitor.CurrentValue.CacheTimeSeconds,
|
||||||
var requestsTimes = IRCSystemInfo.RequestRecordList.Any(x=>
|
RequestDuplicationOptionsMonitor.CurrentValue.DuplicationWindowMs);
|
||||||
x.RequestTime>= requestInfo.RequestTime.AddMilliseconds(-RequestDuplicationOptionsMonitor.CurrentValue.DuplicationWindowMs)&&
|
if (!isAdded)
|
||||||
x.RequestKey== requestInfo.RequestKey);
|
|
||||||
if (requestsTimes)
|
|
||||||
{
|
{
|
||||||
throw new BusinessValidationFailedException(_localizer["RequestDuplicationFilter_RequestDuplication"], ApiResponseCodeEnum.BusinessValidationFailed);
|
SendRequestDuplicationWeComNotice(requestPath);
|
||||||
|
logger.LogError($"重复请求出现错误:{this.Intoparam}");
|
||||||
|
throw new BusinessValidationFailedException(_localizer["RequestDuplicationFilter_RequestDuplication"], ApiResponseCodeEnum.NotRemind);
|
||||||
}
|
}
|
||||||
IRCSystemInfo.RequestRecordList.Add(requestInfo);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SendRequestDuplicationWeComNotice(string requestPath)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
bool isOpenWeComNotice = _config.GetValue<bool>("WeComNoticeConfig:IsOpenWeComNotice");
|
||||||
|
|
||||||
|
if (isOpenWeComNotice)
|
||||||
|
{
|
||||||
|
string webhook = _config["WeComNoticeConfig:WebhookUrl"] ?? string.Empty;
|
||||||
|
|
||||||
|
var uri = new Uri(_config["SystemEmailSendConfig:SiteUrl"]);
|
||||||
|
var baseUrl = uri.GetLeftPart(UriPartial.Authority);
|
||||||
|
|
||||||
|
var userList = _config.GetSection("WeComNoticeConfig:VueNoticeUserList").Get<string[]>();
|
||||||
|
|
||||||
|
var request = accessor?.HttpContext?.Request;
|
||||||
|
|
||||||
|
_ = WeComNotifier.SendAlertAsync(
|
||||||
|
webhook: webhook,
|
||||||
|
alert: new WeComAlert
|
||||||
|
{
|
||||||
|
Env = baseUrl,
|
||||||
|
UserName = _userInfo.UserName.IsNotNullOrEmpty() ? $"{_userInfo.UserName}({_userInfo.UserTypeShortName})" : "匿名",
|
||||||
|
Api = $"{request?.Method} {requestPath}",
|
||||||
|
Message = "重复请求拦截",
|
||||||
|
JsonData = this.Intoparam,
|
||||||
|
Stack = string.Empty,
|
||||||
|
AtUsers = userList ?? []
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
logger.LogError($"重复请求过滤器里发送企业微信出现错误:{ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -37,13 +37,13 @@ public class TrialGlobalLimitActionFilter(IFusionCache _fusionCache, IUserInfo _
|
|||||||
|
|
||||||
#region 特殊用户类型拦截
|
#region 特殊用户类型拦截
|
||||||
// 用户类型检查
|
// 用户类型检查
|
||||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
|
//if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
|
||||||
{
|
//{
|
||||||
//对不起,您的账户没有操作权限
|
// //对不起,您的账户没有操作权限
|
||||||
context.Result = new JsonResult(ResponseOutput.NotOk(I18n.T("TrialResource_NoAccessPermission")));
|
// context.Result = new JsonResult(ResponseOutput.NotOk(I18n.T("TrialResource_NoAccessPermission")));
|
||||||
|
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,12 +47,12 @@ public class TrialGlobalLimitEndpointFilter(IFusionCache _fusionCache, IUserInfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
#region 特殊用户类型拦截
|
#region 特殊用户类型拦截
|
||||||
// 用户类型检查
|
//// 用户类型检查
|
||||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
|
//if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
|
||||||
{
|
//{
|
||||||
//对不起,您的账户没有操作权限
|
// //对不起,您的账户没有操作权限
|
||||||
return Results.Json(ResponseOutput.NotOk(I18n.T("TrialResource_NoAccessPermission")));
|
// return Results.Json(ResponseOutput.NotOk(I18n.T("TrialResource_NoAccessPermission")));
|
||||||
}
|
//}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -146,6 +146,31 @@ public class RequestDuplicationOptions
|
|||||||
public static class IRCSystemInfo
|
public static class IRCSystemInfo
|
||||||
{
|
{
|
||||||
public static List<RequestInfo> RequestRecordList { get; set; } = new List<RequestInfo>();
|
public static List<RequestInfo> RequestRecordList { get; set; } = new List<RequestInfo>();
|
||||||
|
|
||||||
|
private static readonly object requestRecordLock = new object();
|
||||||
|
|
||||||
|
public static bool TryAddRequestRecord(RequestInfo requestInfo, int cacheTimeSeconds, int duplicationWindowMs)
|
||||||
|
{
|
||||||
|
lock (requestRecordLock)
|
||||||
|
{
|
||||||
|
var now = DateTime.Now;
|
||||||
|
RequestRecordList = RequestRecordList
|
||||||
|
.Where(x => x.RequestTime >= now.AddSeconds(-cacheTimeSeconds))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var isDuplicate = RequestRecordList.Any(x =>
|
||||||
|
x.RequestTime >= requestInfo.RequestTime.AddMilliseconds(-duplicationWindowMs) &&
|
||||||
|
x.RequestKey == requestInfo.RequestKey);
|
||||||
|
|
||||||
|
if (isDuplicate)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestRecordList.Add(requestInfo);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RequestInfo
|
public class RequestInfo
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ public static class CacheKeys
|
|||||||
//项目缓存
|
//项目缓存
|
||||||
public static string Trial(string trialIdStr) => $"TrialId:{trialIdStr}";
|
public static string Trial(string trialIdStr) => $"TrialId:{trialIdStr}";
|
||||||
|
|
||||||
|
public static string TrialVisitTaskMaxCode(Guid trialId) => $"TrialVisitTaskMaxCode:{trialId}";
|
||||||
|
|
||||||
//检查编号递增锁
|
//检查编号递增锁
|
||||||
public static string TrialStudyMaxCode(Guid trialId) => $"TrialStudyMaxCode:{trialId}";
|
public static string TrialStudyMaxCode(Guid trialId) => $"TrialStudyMaxCode:{trialId}";
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,8 @@
|
|||||||
using DocumentFormat.OpenXml.Office.CustomUI;
|
using FellowOakDicom;
|
||||||
using FellowOakDicom;
|
|
||||||
using FellowOakDicom.Media;
|
using FellowOakDicom.Media;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using NPOI.Util;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Helper
|
namespace IRaCIS.Core.Application.Helper
|
||||||
{
|
{
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,4 @@
|
|||||||
using IRaCIS.Core.Domain.Share;
|
using System.Globalization;
|
||||||
using NPOI.XWPF.UserModel;
|
|
||||||
using System.Globalization;
|
|
||||||
using Xceed.Document.NET;
|
using Xceed.Document.NET;
|
||||||
using Xceed.Words.NET;
|
using Xceed.Words.NET;
|
||||||
|
|
||||||
@@ -54,42 +52,42 @@ public static class WordTempleteHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void Npoi_GetInternationalTempleteStream(string filePath, Stream memoryStream)
|
//public static void Npoi_GetInternationalTempleteStream(string filePath, Stream memoryStream)
|
||||||
{
|
//{
|
||||||
|
|
||||||
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
|
// var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
|
||||||
|
|
||||||
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
|
// using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
|
||||||
{
|
// {
|
||||||
XWPFDocument doc = new XWPFDocument(fs);
|
// XWPFDocument doc = new XWPFDocument(fs);
|
||||||
|
|
||||||
// 查找包含指定书签的段落及其索引
|
// // 查找包含指定书签的段落及其索引
|
||||||
var bookmarkParagraph = doc.Paragraphs
|
// var bookmarkParagraph = doc.Paragraphs
|
||||||
.FirstOrDefault(p => p.GetCTP().GetBookmarkStartList().Any(b => b.name == StaticData.CultureInfo.en_US_bookMark));
|
// .FirstOrDefault(p => p.GetCTP().GetBookmarkStartList().Any(b => b.name == StaticData.CultureInfo.en_US_bookMark));
|
||||||
|
|
||||||
if (bookmarkParagraph != null)
|
// if (bookmarkParagraph != null)
|
||||||
{
|
// {
|
||||||
int bookmarkIndex = doc.Paragraphs.IndexOf(bookmarkParagraph);
|
// int bookmarkIndex = doc.Paragraphs.IndexOf(bookmarkParagraph);
|
||||||
|
|
||||||
if (isEn_US)
|
// if (isEn_US)
|
||||||
{
|
// {
|
||||||
// 从书签所在段落开始,删除之前的所有段落
|
// // 从书签所在段落开始,删除之前的所有段落
|
||||||
for (int i = bookmarkIndex - 1; i >= 0; i--)
|
// for (int i = bookmarkIndex - 1; i >= 0; i--)
|
||||||
{
|
// {
|
||||||
doc.RemoveBodyElement(i);
|
// doc.RemoveBodyElement(i);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
// 删除书签之后的所有段落
|
// // 删除书签之后的所有段落
|
||||||
for (int i = doc.Paragraphs.Count - 1; i >= bookmarkIndex; i--)
|
// for (int i = doc.Paragraphs.Count - 1; i >= bookmarkIndex; i--)
|
||||||
{
|
// {
|
||||||
doc.RemoveBodyElement(i);
|
// doc.RemoveBodyElement(i);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
doc.Write(memoryStream);
|
// doc.Write(memoryStream);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,11 @@ using FellowOakDicom.Imaging;
|
|||||||
using SixLabors.ImageSharp;
|
using SixLabors.ImageSharp;
|
||||||
using SixLabors.ImageSharp.Formats.Jpeg;
|
using SixLabors.ImageSharp.Formats.Jpeg;
|
||||||
using SixLabors.ImageSharp.Processing;
|
using SixLabors.ImageSharp.Processing;
|
||||||
|
using SixLabors.ImageSharp.PixelFormats;
|
||||||
|
using IRaCIS.Core.Application.Helper;
|
||||||
|
using SixLabors.ImageSharp.Drawing.Processing;
|
||||||
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Helper;
|
|
||||||
|
|
||||||
public static class ImageHelper
|
public static class ImageHelper
|
||||||
{
|
{
|
||||||
@@ -60,6 +63,36 @@ public static class ImageHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static class ImageMaskHelper
|
||||||
|
{
|
||||||
|
public static async Task MaskAsync(Stream input, Stream output, IEnumerable<MaskRegion> regions)
|
||||||
|
{
|
||||||
|
// 确保输入流从起始位置读取
|
||||||
|
if (input.CanSeek && input.Position != 0)
|
||||||
|
{
|
||||||
|
input.Position = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
using var image = await Image.LoadAsync(input);
|
||||||
|
|
||||||
|
// 保存原始图片的编码格式
|
||||||
|
var originalFormat = image.Metadata.DecodedImageFormat;
|
||||||
|
|
||||||
|
image.Mutate(ctx =>
|
||||||
|
{
|
||||||
|
foreach (var r in regions)
|
||||||
|
{
|
||||||
|
ctx.Fill(Color.Black, new Rectangle(r.X, r.Y, r.Width, r.Height));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 使用原始格式保存,保持格式不变
|
||||||
|
await image.SaveAsync(output, originalFormat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,5 @@
|
|||||||
using System;
|
using Newtonsoft.Json;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net.Security;
|
|
||||||
using System.Net;
|
|
||||||
using System.Security.Cryptography.X509Certificates;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using RestSharp;
|
using RestSharp;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using IRaCIS.Core.Infrastructure.Extention;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Helper.OtherTool
|
namespace IRaCIS.Core.Application.Helper.OtherTool
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -12,6 +10,7 @@
|
|||||||
<OutputPath>..\bin\</OutputPath>
|
<OutputPath>..\bin\</OutputPath>
|
||||||
<DocumentationFile>.\IRaCIS.Core.Application.xml</DocumentationFile>
|
<DocumentationFile>.\IRaCIS.Core.Application.xml</DocumentationFile>
|
||||||
<NoWarn>1701;1702;1591</NoWarn>
|
<NoWarn>1701;1702;1591</NoWarn>
|
||||||
|
<NoWarn>$(NoWarn);NU1903</NoWarn>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
@@ -32,13 +31,14 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="ClosedXML" Version="0.105.0" />
|
||||||
<PackageReference Include="IdentityModel.OidcClient" Version="6.0.0" />
|
<PackageReference Include="IdentityModel.OidcClient" Version="6.0.0" />
|
||||||
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.2.0" />
|
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.2.0" />
|
||||||
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
||||||
<PackageReference Include="AWSSDK.S3" Version="4.0.21" />
|
<PackageReference Include="AWSSDK.S3" Version="4.0.24" />
|
||||||
<PackageReference Include="AWSSDK.SecurityToken" Version="4.0.5.19" />
|
<PackageReference Include="AWSSDK.SecurityToken" Version="4.0.7" />
|
||||||
<PackageReference Include="DocX" Version="5.0.0" />
|
<PackageReference Include="DocX" Version="5.0.0" />
|
||||||
<PackageReference Include="FreeSpire.Doc" Version="12.2.0" />
|
<PackageReference Include="FreeSpire.Doc" Version="14.4.0" />
|
||||||
<PackageReference Include="ExcelDataReader" Version="3.8.0" />
|
<PackageReference Include="ExcelDataReader" Version="3.8.0" />
|
||||||
<PackageReference Include="ExcelDataReader.DataSet" Version="3.8.0" />
|
<PackageReference Include="ExcelDataReader.DataSet" Version="3.8.0" />
|
||||||
<PackageReference Include="DistributedLock.Redis" Version="1.1.1" />
|
<PackageReference Include="DistributedLock.Redis" Version="1.1.1" />
|
||||||
@@ -47,23 +47,23 @@
|
|||||||
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.6" />
|
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.6" />
|
||||||
<PackageReference Include="fo-dicom.Codecs" Version="5.16.7" />
|
<PackageReference Include="fo-dicom.Codecs" Version="5.16.7" />
|
||||||
<PackageReference Include="IP2Region.Net" Version="3.0.2" />
|
<PackageReference Include="IP2Region.Net" Version="3.0.2" />
|
||||||
<PackageReference Include="MailKit" Version="4.15.1" />
|
<PackageReference Include="MailKit" Version="4.17.0" />
|
||||||
<PackageReference Include="Masa.Contrib.Service.MinimalAPIs" Version="1.1.0" />
|
<PackageReference Include="Masa.Contrib.Service.MinimalAPIs" Version="1.1.0" />
|
||||||
<PackageReference Include="MaxMind.GeoIP2" Version="5.4.1" />
|
<PackageReference Include="MaxMind.GeoIP2" Version="6.0.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" />
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.8" />
|
||||||
<PackageReference Include="MimeKit" Version="4.15.1" />
|
<PackageReference Include="MimeKit" Version="4.17.0" />
|
||||||
<PackageReference Include="MiniExcel" Version="1.41.2" />
|
<PackageReference Include="MiniExcel" Version="1.44.1" />
|
||||||
<PackageReference Include="Minio" Version="6.0.3" />
|
<PackageReference Include="Minio" Version="7.0.0" />
|
||||||
<PackageReference Include="MiniWord" Version="0.9.2" />
|
<PackageReference Include="MiniWord" Version="0.9.2" />
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
|
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
|
||||||
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
|
<PackageReference Include="My.Extensions.Localization.Json" Version="4.0.0">
|
||||||
<TreatAsUsed>true</TreatAsUsed>
|
<TreatAsUsed>true</TreatAsUsed>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="NPOI" Version="2.7.4" />
|
|
||||||
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
|
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
|
||||||
<PackageReference Include="RestSharp" Version="114.0.0" />
|
<PackageReference Include="RestSharp" Version="114.0.0" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.12" />
|
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.12" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="8.0.2" />
|
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="2.1.7" />
|
||||||
|
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="10.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -59,17 +59,17 @@
|
|||||||
</member>
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig.AutoColumnStartIndex">
|
<member name="P:IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig.AutoColumnStartIndex">
|
||||||
<summary>
|
<summary>
|
||||||
增加动态列开始索引 从0 开始算
|
增加动态列开始索引 npoi从0开始 现在ClosedXML 从1开始
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig.AutoColumnTitleRowIndex">
|
<member name="P:IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig.AutoColumnTitleRowIndex">
|
||||||
<summary>
|
<summary>
|
||||||
动态列开始的行index 从0开始
|
动态列开始的行index npoi从0开始 现在ClosedXML 从1开始
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig.TempalteLastColumnIndex">
|
<member name="P:IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig.TempalteLastColumnIndex">
|
||||||
<summary>
|
<summary>
|
||||||
模板列最后的索引
|
模板列最后的索引 npoi从0开始 现在ClosedXML 从1开始
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig.ColumnIdNameList">
|
<member name="P:IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig.ColumnIdNameList">
|
||||||
@@ -102,20 +102,6 @@
|
|||||||
Excel Title Name
|
Excel Title Name
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ExcelExportHelper.CDISC_DataExport_Async(System.String,IRaCIS.Application.Contracts.ExcelExportInfo,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},Microsoft.AspNetCore.Hosting.IWebHostEnvironment,IRaCIS.Application.Interfaces.IDictionaryService,System.Type,System.Nullable{IRaCIS.Core.Domain.Share.CriterionType},IRaCIS.Core.Application.Service.ExcelExportHelper.DynamicColumnConfig)">
|
|
||||||
<summary>
|
|
||||||
暂时废弃--合并到上面
|
|
||||||
</summary>
|
|
||||||
<param name="code"></param>
|
|
||||||
<param name="data"></param>
|
|
||||||
<param name="_commonDocumentRepository"></param>
|
|
||||||
<param name="_hostEnvironment"></param>
|
|
||||||
<param name="_dictionaryService"></param>
|
|
||||||
<param name="translateType"></param>
|
|
||||||
<param name="criterionType"></param>
|
|
||||||
<param name="dynamicColumnConfig"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ExcelExportHelper.ExportTemplateAsync(IRaCIS.Application.Contracts.ExportTemplateServiceDto)">
|
<member name="M:IRaCIS.Core.Application.Service.ExcelExportHelper.ExportTemplateAsync(IRaCIS.Application.Contracts.ExportTemplateServiceDto)">
|
||||||
<summary>
|
<summary>
|
||||||
导出文件模板
|
导出文件模板
|
||||||
@@ -351,6 +337,12 @@
|
|||||||
<param name="taskId"></param>
|
<param name="taskId"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.VisitTaskHelpeService.GenerateTaskNo">
|
||||||
|
<summary>
|
||||||
|
从 NewId 的后 3 个字节(24 位)生成一个 6 位十六进制字符串
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.VisitTaskHelpeService.GetIsClinicalDataSignTest(System.Guid)">
|
<member name="M:IRaCIS.Core.Application.Service.VisitTaskHelpeService.GetIsClinicalDataSignTest(System.Guid)">
|
||||||
<summary>
|
<summary>
|
||||||
获取GetIsClinicalDataSignTest
|
获取GetIsClinicalDataSignTest
|
||||||
@@ -363,7 +355,7 @@
|
|||||||
访视读片任务
|
访视读片任务
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskAllocationRule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectUser},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTaskReReading},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskMedicalReview},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingClinicalData},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluationVisitFilter},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Segment},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Segmentation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SegmentBinding},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCanceDoctor},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMarkBinding},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableAnswerRowInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInfluence},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestionAnswer},Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.Application.Service.Allocation.VisitTaskService},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluationVisitStudyFilter},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
|
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskAllocationRule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectUser},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTaskReReading},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskMedicalReview},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingClinicalData},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluationVisitFilter},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Segment},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Segmentation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SegmentBinding},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCanceDoctor},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMarkBinding},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableAnswerRowInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInfluence},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestionAnswer},Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.Application.Service.Allocation.VisitTaskService},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluationVisitStudyFilter},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
|
||||||
<summary>
|
<summary>
|
||||||
访视读片任务
|
访视读片任务
|
||||||
</summary>
|
</summary>
|
||||||
@@ -1453,6 +1445,14 @@
|
|||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.DictionaryService.ChangeTrialObjectNameList(System.Collections.Generic.Dictionary{System.String,System.Collections.Generic.List{IRaCIS.Application.Contracts.BasicDicSelect}},System.Nullable{System.Guid})">
|
||||||
|
<summary>
|
||||||
|
替换字典中的项目名称为试验对象名称 --New
|
||||||
|
</summary>
|
||||||
|
<param name="data"></param>
|
||||||
|
<param name="trialId"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.DictionaryService.GetBoolValueState(System.Boolean)">
|
<member name="M:IRaCIS.Core.Application.Service.DictionaryService.GetBoolValueState(System.Boolean)">
|
||||||
<summary>
|
<summary>
|
||||||
获取是和否
|
获取是和否
|
||||||
@@ -1584,6 +1584,13 @@
|
|||||||
<param name="_attachmentrepository"></param>
|
<param name="_attachmentrepository"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.FileUploadRecordService.AddOrUpdateCommonUploadRecord(IRaCIS.Core.Application.ViewModel.CommonUploadRecordAddOrEdit)">
|
||||||
|
<summary>
|
||||||
|
上传通用文件记录
|
||||||
|
</summary>
|
||||||
|
<param name="addOrEditCommonUploadRecord"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.FileUploadRecordService.GetSubjectUploadRecordList(IRaCIS.Core.Application.ViewModel.SubjectFileUploadRecordQuery)">
|
<member name="M:IRaCIS.Core.Application.Service.FileUploadRecordService.GetSubjectUploadRecordList(IRaCIS.Core.Application.ViewModel.SubjectFileUploadRecordQuery)">
|
||||||
<summary>
|
<summary>
|
||||||
按照 subject visit studyCode 三个维度进行分组的查询列表 (subject相关)
|
按照 subject visit studyCode 三个维度进行分组的查询列表 (subject相关)
|
||||||
@@ -2933,7 +2940,7 @@
|
|||||||
<param name="modality"></param>
|
<param name="modality"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.DownloadImageSuccess(System.Guid)">
|
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.DownloadImageSuccess(System.Guid,System.Nullable{System.Guid})">
|
||||||
<summary>
|
<summary>
|
||||||
影像下载成功回调
|
影像下载成功回调
|
||||||
</summary>
|
</summary>
|
||||||
@@ -3081,7 +3088,7 @@
|
|||||||
SystemAnonymizationService
|
SystemAnonymizationService
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.SystemAnonymizationService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SystemAnonymization},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
|
<member name="M:IRaCIS.Core.Application.Service.SystemAnonymizationService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SystemAnonymization},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer,ZiggyCreatures.Caching.Fusion.IFusionCache)">
|
||||||
<summary>
|
<summary>
|
||||||
SystemAnonymizationService
|
SystemAnonymizationService
|
||||||
</summary>
|
</summary>
|
||||||
@@ -3277,6 +3284,20 @@
|
|||||||
批次Id
|
批次Id
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.Inspection.InspectionService.getInspectionById(IRaCIS.Core.Application.Service.Inspection.DTO.InspectionDto)">
|
||||||
|
<summary>
|
||||||
|
根据Id获取稽查记录
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.Inspection.InspectionService.SetJsonDetail(IRaCIS.Core.Application.Service.Inspection.DTO.InspectionDto)">
|
||||||
|
<summary>
|
||||||
|
设置稽查记录JsonDetail
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.Inspection.InspectionService.SetTrialShowInspection(IRaCIS.Core.Application.Service.Inspection.DTO.SetTrialShowInspection)">
|
<member name="M:IRaCIS.Core.Application.Service.Inspection.InspectionService.SetTrialShowInspection(IRaCIS.Core.Application.Service.Inspection.DTO.SetTrialShowInspection)">
|
||||||
<summary>
|
<summary>
|
||||||
设置项目稽查配置
|
设置项目稽查配置
|
||||||
@@ -3713,29 +3734,6 @@
|
|||||||
<param name="code"></param>
|
<param name="code"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:IRaCIS.Core.Application.Service.MinimalApiService.FileToPDFService">
|
|
||||||
<summary>
|
|
||||||
上传文件转PDF 或者给url 这边下载然后转PDF
|
|
||||||
|
|
||||||
</summary>
|
|
||||||
<param name="_hostEnvironment"></param>
|
|
||||||
</member>
|
|
||||||
<member name="M:IRaCIS.Core.Application.Service.MinimalApiService.FileToPDFService.#ctor(Microsoft.AspNetCore.Hosting.IWebHostEnvironment)">
|
|
||||||
<summary>
|
|
||||||
上传文件转PDF 或者给url 这边下载然后转PDF
|
|
||||||
|
|
||||||
</summary>
|
|
||||||
<param name="_hostEnvironment"></param>
|
|
||||||
</member>
|
|
||||||
<!-- Badly formed XML comment ignored for member "T:IRaCIS.Core.Application.Service.MinimalApiService.TestMinimalApiService" -->
|
|
||||||
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.MinimalApiService.TestMinimalApiService.#ctor(IRaCIS.Core.Domain.Share.IUserInfo,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Infra.EFCore.TestLength})" -->
|
|
||||||
<member name="M:IRaCIS.Core.Application.Service.MinimalApiService.TestMinimalApiService.TestEfcoreJson">
|
|
||||||
<summary>
|
|
||||||
测试efcore json 列支持情况
|
|
||||||
https://devblogs.microsoft.com/dotnet/array-mapping-in-ef-core-8/
|
|
||||||
</summary>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IRaCIS.Core.Application.Service.HIRActivateService.GetAuthorizationCodeInfo(System.String,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Application.Contracts.SystemHospitalOption})">
|
<member name="M:IRaCIS.Core.Application.Service.HIRActivateService.GetAuthorizationCodeInfo(System.String,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Application.Contracts.SystemHospitalOption})">
|
||||||
<summary>
|
<summary>
|
||||||
获取授权码明文信息
|
获取授权码明文信息
|
||||||
@@ -3898,6 +3896,15 @@
|
|||||||
The ID token, which can be used to verify the identity of the user.
|
The ID token, which can be used to verify the identity of the user.
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<!-- Badly formed XML comment ignored for member "T:IRaCIS.Core.Application.Service.MinimalApiService.TestMinimalApiService" -->
|
||||||
|
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.MinimalApiService.TestMinimalApiService.#ctor(IRaCIS.Core.Domain.Share.IUserInfo,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Infra.EFCore.TestLength})" -->
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.MinimalApiService.TestMinimalApiService.TestEfcoreJson">
|
||||||
|
<summary>
|
||||||
|
测试efcore json 列支持情况
|
||||||
|
https://devblogs.microsoft.com/dotnet/array-mapping-in-ef-core-8/
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.QCCommon.VerifyIsCRCSubmmitAsync(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Domain.Share.IUserInfo,System.Nullable{System.Guid})">
|
<member name="M:IRaCIS.Core.Application.Service.QCCommon.VerifyIsCRCSubmmitAsync(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Domain.Share.IUserInfo,System.Nullable{System.Guid})">
|
||||||
<summary>
|
<summary>
|
||||||
验证CRC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人
|
验证CRC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人
|
||||||
@@ -9020,6 +9027,11 @@
|
|||||||
外弹力膜面积- 管腔面积
|
外弹力膜面积- 管腔面积
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.IVUSMeasuredValue.PlaqueRupture">
|
||||||
|
<summary>
|
||||||
|
斑块破裂
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTFCTUploadData.FrameNumber">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTFCTUploadData.FrameNumber">
|
||||||
<summary>
|
<summary>
|
||||||
帧数
|
帧数
|
||||||
@@ -9070,6 +9082,16 @@
|
|||||||
脂质角度
|
脂质角度
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTFCTUploadData.PlaqueRupture">
|
||||||
|
<summary>
|
||||||
|
斑块破裂
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTFCTUploadData.PlaqueHealing">
|
||||||
|
<summary>
|
||||||
|
斑块愈合
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTInfo.PlaqueNum">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTInfo.PlaqueNum">
|
||||||
<summary>
|
<summary>
|
||||||
斑块编号
|
斑块编号
|
||||||
@@ -9750,6 +9772,16 @@
|
|||||||
融合的病灶
|
融合的病灶
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetMarkListInDto.VisitTaskId">
|
||||||
|
<summary>
|
||||||
|
任务Id
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.NoneDicomMarkInfo.MarkId">
|
||||||
|
<summary>
|
||||||
|
标记的唯一标识符
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetCustomTagInDto.VisitTaskId">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetCustomTagInDto.VisitTaskId">
|
||||||
<summary>
|
<summary>
|
||||||
任务Id
|
任务Id
|
||||||
@@ -10200,6 +10232,11 @@
|
|||||||
问题分类
|
问题分类
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetFilterTableQuestionInDto.QuestionClassify">
|
||||||
|
<summary>
|
||||||
|
问题分类
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SetOncologyQuestion.EvaluationResult">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SetOncologyQuestion.EvaluationResult">
|
||||||
<summary>
|
<summary>
|
||||||
评估结果
|
评估结果
|
||||||
@@ -12381,6 +12418,11 @@
|
|||||||
影像工具
|
影像工具
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.AddDeleteTypeEnum">
|
||||||
|
<summary>
|
||||||
|
新增修改类型
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.ImageToolAttribute">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.ImageToolAttribute">
|
||||||
<summary>
|
<summary>
|
||||||
影像工具属性
|
影像工具属性
|
||||||
@@ -13326,6 +13368,11 @@
|
|||||||
影像工具
|
影像工具
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.AddDeleteTypeEnum">
|
||||||
|
<summary>
|
||||||
|
新增修改类型
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.ImageToolAttribute">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.ImageToolAttribute">
|
||||||
<summary>
|
<summary>
|
||||||
影像工具属性
|
影像工具属性
|
||||||
@@ -14736,7 +14783,7 @@
|
|||||||
<param name="inDto"></param>
|
<param name="inDto"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMarkBinding},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserLog},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingOncologyTaskInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Segmentation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SegmentBinding},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Application.Service.IVisitTaskService,IRaCIS.Core.Application.Contracts.IReadingClinicalDataService,IRaCIS.Core.Application.Service.IReadingCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserFeedBack},Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingGlobalTaskInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingCriterionPage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskRelation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingJudgeInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.OrganInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.OrganTrialInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialDocument},IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoCalculateService,IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoWithoutPETCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTrialCriterionDictionary},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableAnswerRowInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionSystem},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionSystem},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CriterionKeyFileRead},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialCriterionKeyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Application.Service.IGeneralCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskStudy},IRaCIS.Core.Application.Service.ImageAndDoc.IDownloadAndUploadService,IRaCIS.Core.Application.Interfaces.ITrialEmailNoticeConfigService,AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer,ZiggyCreatures.Caching.Fusion.IFusionCache)">
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMarkBinding},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserLog},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingOncologyTaskInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Segmentation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SegmentBinding},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Application.Service.IVisitTaskService,IRaCIS.Core.Application.Contracts.IReadingClinicalDataService,IRaCIS.Core.Application.Service.IReadingCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserFeedBack},Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingGlobalTaskInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingCriterionPage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskRelation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingJudgeInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.OrganInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialUserRole},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.EmailNoticeUserType},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.EmailNoticeConfig},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.OrganTrialInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialDocument},IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoCalculateService,IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoWithoutPETCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTrialCriterionDictionary},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableAnswerRowInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionSystem},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionSystem},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CriterionKeyFileRead},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialCriterionKeyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Application.Service.IGeneralCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskStudy},Microsoft.Extensions.Configuration.IConfiguration,IRaCIS.Core.Application.Service.ImageAndDoc.IDownloadAndUploadService,IRaCIS.Core.Application.Interfaces.ITrialEmailNoticeConfigService,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.SystemEmailSendConfig},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer,ZiggyCreatures.Caching.Fusion.IFusionCache)">
|
||||||
<summary>
|
<summary>
|
||||||
IR影像阅片
|
IR影像阅片
|
||||||
</summary>
|
</summary>
|
||||||
@@ -14828,6 +14875,20 @@
|
|||||||
<param name="inQuery"></param>
|
<param name="inQuery"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetMarkList(IRaCIS.Core.Application.Service.Reading.Dto.GetMarkListInDto)">
|
||||||
|
<summary>
|
||||||
|
获取标记信息
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetNoneDicomMarkList(IRaCIS.Core.Application.Service.Reading.Dto.GetMarkListInDto)">
|
||||||
|
<summary>
|
||||||
|
获取非DICOM标记信息
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetManualList(IRaCIS.Core.Application.Service.Reading.Dto.GetManualListInDto)">
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetManualList(IRaCIS.Core.Application.Service.Reading.Dto.GetManualListInDto)">
|
||||||
<summary>
|
<summary>
|
||||||
获取手册
|
获取手册
|
||||||
@@ -14959,6 +15020,13 @@
|
|||||||
<param name="inDto"></param>
|
<param name="inDto"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetFilterTableQuestion(IRaCIS.Core.Application.Service.Reading.Dto.GetFilterTableQuestionInDto)">
|
||||||
|
<summary>
|
||||||
|
获取单个表格问题及答案 过滤问题
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetCustomTableQuestionAnswer(IRaCIS.Core.Application.Service.Reading.Dto.GetCustomTableQuestionAnswerInDto)">
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetCustomTableQuestionAnswer(IRaCIS.Core.Application.Service.Reading.Dto.GetCustomTableQuestionAnswerInDto)">
|
||||||
<summary>
|
<summary>
|
||||||
获取自定义问题以及答案
|
获取自定义问题以及答案
|
||||||
@@ -15178,7 +15246,21 @@
|
|||||||
<param name="visitTaskId"></param>
|
<param name="visitTaskId"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.ComputeJudgeResult(System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.GroupTaskAnswerDto})">
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.SendWeComNotifier(System.Guid,System.String)">
|
||||||
|
<summary>
|
||||||
|
发送微信通知
|
||||||
|
</summary>
|
||||||
|
<param name="visiTaskId"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.SendAbnormalEmail(System.Guid,IRaCIS.Core.Domain.Share.EmailBusinessScenario)">
|
||||||
|
<summary>
|
||||||
|
发送邮件通知
|
||||||
|
</summary>
|
||||||
|
<param name="visiTaskId"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.ComputeJudgeResult(System.Collections.Generic.List{IRaCIS.Core.Application.Service.Reading.Dto.GroupTaskAnswerDto},System.Guid)">
|
||||||
<summary>
|
<summary>
|
||||||
计算返回的结果 为True表示不相等
|
计算返回的结果 为True表示不相等
|
||||||
</summary>
|
</summary>
|
||||||
@@ -16063,6 +16145,12 @@
|
|||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.DoctorWorkloadService.GetDoctorUserTrialReadingStat(IRaCIS.Application.Contracts.TrialReadingStatQuery)">
|
||||||
|
<summary>
|
||||||
|
获取项目阅片统计
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.DoctorWorkloadService.GetTrialEnrollmentWorkloadStats(IRaCIS.Application.Contracts.WorkLoadDoctorQueryDTO)">
|
<member name="M:IRaCIS.Core.Application.Service.DoctorWorkloadService.GetTrialEnrollmentWorkloadStats(IRaCIS.Application.Contracts.WorkLoadDoctorQueryDTO)">
|
||||||
<summary>
|
<summary>
|
||||||
获取某个项目入组的医生工作量统计列表
|
获取某个项目入组的医生工作量统计列表
|
||||||
@@ -16248,7 +16336,7 @@
|
|||||||
<param name="logger">logger</param>
|
<param name="logger">logger</param>
|
||||||
<param name="accessor">loggerHelper</param>
|
<param name="accessor">loggerHelper</param>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter.#ctor(Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter},Microsoft.AspNetCore.Http.IHttpContextAccessor,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.RequestDuplicationOptions})">
|
<member name="M:IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter.#ctor(Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter},Microsoft.AspNetCore.Http.IHttpContextAccessor,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.RequestDuplicationOptions},Microsoft.Extensions.Configuration.IConfiguration)">
|
||||||
<summary>
|
<summary>
|
||||||
请求拦截 请求前后的操作
|
请求拦截 请求前后的操作
|
||||||
</summary>
|
</summary>
|
||||||
@@ -18777,11 +18865,24 @@
|
|||||||
NoneDicomStudyService
|
NoneDicomStudyService
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Contracts.NoneDicomStudyService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},Medallion.Threading.IDistributedLockProvider,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Application.Service.QCCommon,AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
|
<member name="M:IRaCIS.Core.Application.Contracts.NoneDicomStudyService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},Medallion.Threading.IDistributedLockProvider,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Application.Helper.IOSSService,IRaCIS.Core.Application.Service.QCCommon,AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
|
||||||
<summary>
|
<summary>
|
||||||
NoneDicomStudyService
|
NoneDicomStudyService
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Contracts.NoneDicomStudyService.NoneDicomStudyMaskImage(IRaCIS.Core.Application.Contracts.NoneDicomStudyMaskImageCommand)">
|
||||||
|
<summary>
|
||||||
|
标注遮盖影像 路径后面加了.MaskNoneDicom_ 就是遮盖的新路径
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Contracts.NoneDicomStudyService.NoneDicomStudyUndoMaskImage(IRaCIS.Core.Application.Contracts.NoneDicomStudyUndoMaskImageCommand)">
|
||||||
|
<summary>
|
||||||
|
撤销遮盖的影像,可以单张,也可以整个检查
|
||||||
|
</summary>
|
||||||
|
<param name="inCommand"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Contracts.NoneDicomStudyService.GetNoneDicomStudyFileList(System.Guid)">
|
<member name="M:IRaCIS.Core.Application.Contracts.NoneDicomStudyService.GetNoneDicomStudyFileList(System.Guid)">
|
||||||
<summary>
|
<summary>
|
||||||
非Dicom检查 文件列表
|
非Dicom检查 文件列表
|
||||||
@@ -20245,11 +20346,12 @@
|
|||||||
<param name="editTrialSiteCommand"></param>
|
<param name="editTrialSiteCommand"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Services.TrialMaintenanceService.GetTrialSiteSelect(System.Guid)">
|
<member name="M:IRaCIS.Core.Application.Services.TrialMaintenanceService.GetTrialSiteSelect(System.Guid,System.Nullable{System.Boolean})">
|
||||||
<summary>
|
<summary>
|
||||||
获取项目下的 site 下拉框数据 CRC只看到他负责的
|
获取项目下的 site 下拉框数据 CRC只看到他负责的
|
||||||
</summary>
|
</summary>
|
||||||
<param name="trialId"></param>
|
<param name="trialId"></param>
|
||||||
|
<param name="ignoreDisable"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Services.TrialMaintenanceService.DeleteTrialSite(System.Guid)">
|
<member name="M:IRaCIS.Core.Application.Services.TrialMaintenanceService.DeleteTrialSite(System.Guid)">
|
||||||
@@ -20857,6 +20959,12 @@
|
|||||||
<returns></returns>
|
<returns></returns>
|
||||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.TrialConfigService.ReplaceSubject">
|
||||||
|
<summary>
|
||||||
|
替换受试者
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.TrialConfigService.TrialReadingInfoSignVerify(IRaCIS.Core.Application.Contracts.TrialReadingInfoSignInDto)">
|
<member name="M:IRaCIS.Core.Application.TrialConfigService.TrialReadingInfoSignVerify(IRaCIS.Core.Application.Contracts.TrialReadingInfoSignInDto)">
|
||||||
<summary>
|
<summary>
|
||||||
阅片信息签名验证接口
|
阅片信息签名验证接口
|
||||||
@@ -20865,6 +20973,33 @@
|
|||||||
<returns></returns>
|
<returns></returns>
|
||||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.TrialConfigService.SetTrialLinkExpirationTime(IRaCIS.Core.Application.Contracts.TrialLinkExpirationTimeDto)">
|
||||||
|
<summary>
|
||||||
|
设置项目链接过期时间
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.TrialConfigService.GetTrialLinkExpirationTime(IRaCIS.Core.Application.Contracts.SetTrialLinkExpirationTimeDto)">
|
||||||
|
<summary>
|
||||||
|
获取项目链接过期时间
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.TrialConfigService.GetLinkLinkExpirationTime(IRaCIS.Core.Application.Contracts.VerifyLinkExpirationTimeDto)">
|
||||||
|
<summary>
|
||||||
|
获取时间是否过期 过期返回true 没有过期返回false
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.TrialConfigService.GetLinkVerificationCodeIsEffective(IRaCIS.Core.Application.Contracts.GetLinkVerificationCodeIsEffectiveDto)">
|
||||||
|
<summary>
|
||||||
|
获取是否Code是否有效 有效返回true 无效返回false
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.TrialConfigService.GetTrialConfirmCriterionList(IRaCIS.Core.Application.Contracts.GetTrialConfirmCriterionListInDto)">
|
<member name="M:IRaCIS.Core.Application.TrialConfigService.GetTrialConfirmCriterionList(IRaCIS.Core.Application.Contracts.GetTrialConfirmCriterionListInDto)">
|
||||||
<summary>
|
<summary>
|
||||||
获取项目已经确认的标准
|
获取项目已经确认的标准
|
||||||
@@ -21831,11 +21966,6 @@
|
|||||||
读片数量分类统计
|
读片数量分类统计
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:IRaCIS.Application.Contracts.TrialExtraConfig.IsOpenLostVistRead">
|
|
||||||
<summary>
|
|
||||||
打开失访可读
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:IRaCIS.Application.Contracts.TrialConfigInfo.IsImageQualityControl">
|
<member name="P:IRaCIS.Application.Contracts.TrialConfigInfo.IsImageQualityControl">
|
||||||
<summary>
|
<summary>
|
||||||
影像质控风险控制
|
影像质控风险控制
|
||||||
@@ -22090,5 +22220,49 @@
|
|||||||
<member name="M:IRaCIS.Application.Interfaces.ITrialEnrollmentService.ConfirmReviewer(System.Guid,System.Guid[],System.Int32)">
|
<member name="M:IRaCIS.Application.Interfaces.ITrialEnrollmentService.ConfirmReviewer(System.Guid,System.Guid[],System.Int32)">
|
||||||
<summary>入组流程-向CRO提交医生[Submit]</summary>
|
<summary>入组流程-向CRO提交医生[Submit]</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Type)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation comment ID for a type.
|
||||||
|
Example: T:Namespace.Outer+Inner`1 becomes T:Namespace.Outer.Inner`1
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Reflection.PropertyInfo)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation comment ID for a property.
|
||||||
|
Example: P:Namespace.ContainingType.PropertyName or for an indexer P:Namespace.ContainingType.Item(System.Int32)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Type,System.String)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation comment ID for a property given its container type and property name.
|
||||||
|
Example: P:Namespace.ContainingType.PropertyName
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Reflection.MethodInfo)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation comment ID for a method (or constructor).
|
||||||
|
For example:
|
||||||
|
M:Namespace.ContainingType.MethodName(ParamType1,ParamType2)~ReturnType
|
||||||
|
M:Namespace.ContainingType.#ctor(ParamType)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.GetTypeDocId(System.Type,System.Boolean,System.Boolean)">
|
||||||
|
<summary>
|
||||||
|
Generates a documentation ID string for a type.
|
||||||
|
This method handles nested types (replacing '+' with '.'),
|
||||||
|
generic types, arrays, pointers, by-ref types, and generic parameters.
|
||||||
|
The <paramref name="includeGenericArguments"/> flag controls whether
|
||||||
|
constructed generic type arguments are emitted, while <paramref name="omitGenericArity"/>
|
||||||
|
controls whether the generic arity marker (e.g. "`1") is appended.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.NormalizeDocId(System.String)">
|
||||||
|
<summary>
|
||||||
|
Normalizes a documentation comment ID to match the compiler-style format.
|
||||||
|
Strips the return type suffix for ordinary methods but retains it for conversion operators.
|
||||||
|
</summary>
|
||||||
|
<param name="docId">The documentation comment ID to normalize.</param>
|
||||||
|
<returns>The normalized documentation comment ID.</returns>
|
||||||
|
</member>
|
||||||
</members>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ namespace IRaCIS.Core.Application.MassTransit.Command
|
|||||||
|
|
||||||
//[Required(ErrorMessage = "受试者筛选号不能为空")]
|
//[Required(ErrorMessage = "受试者筛选号不能为空")]
|
||||||
//[ImporterHeader(Name = "Subject ID", AutoTrim = true)]
|
//[ImporterHeader(Name = "Subject ID", AutoTrim = true)]
|
||||||
[ExcelColumnName("Subject ID")]
|
[ExcelColumnName("Participant ID")]
|
||||||
public string SubjectCode { get; set; } = string.Empty;
|
public string SubjectCode { get; set; } = string.Empty;
|
||||||
|
|
||||||
//[Required(ErrorMessage = "访视名称不能为空")]
|
//[Required(ErrorMessage = "访视名称不能为空")]
|
||||||
|
|||||||
@@ -1,27 +1,9 @@
|
|||||||
using DocumentFormat.OpenXml.Office2013.Excel;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using DocumentFormat.OpenXml.Spreadsheet;
|
|
||||||
using DocumentFormat.OpenXml.Vml;
|
|
||||||
using DocumentFormat.OpenXml.Wordprocessing;
|
|
||||||
using IRaCIS.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
|
||||||
using IRaCIS.Core.Application.MassTransit.Command;
|
|
||||||
using IRaCIS.Core.Domain;
|
using IRaCIS.Core.Domain;
|
||||||
using IRaCIS.Core.Domain.BaseModel;
|
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.AspNetCore.Components.Routing;
|
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using MimeKit;
|
using MimeKit;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using NPOI.Util;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.MassTransit.Consumer;
|
namespace IRaCIS.Core.Application.MassTransit.Consumer;
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
using System.Globalization;
|
using IRaCIS.Core.Domain.BaseModel;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using IRaCIS.Core.Domain.BaseModel;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using NPOI.SS.Formula.Functions;
|
using System.Globalization;
|
||||||
|
|
||||||
public class CultureInfoFilter<T> (IRepository<EventStoreRecord> _eventStoreRecordRepository) : IFilter<ConsumeContext<T>> where T : DomainEvent
|
public class CultureInfoFilter<T> (IRepository<EventStoreRecord> _eventStoreRecordRepository) : IFilter<ConsumeContext<T>> where T : DomainEvent
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -51,11 +51,13 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
|
|
||||||
var systemDocQuery =
|
var systemDocQuery =
|
||||||
from sysDoc in _systemDocumentRepository.AsQueryable(false)
|
from sysDoc in _systemDocumentRepository.AsQueryable(false)
|
||||||
from identityUser in _identityUserRepository.AsQueryable(false).Where(t => t.UserRoleList.Where(t => t.IsUserRoleDisabled == false).Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
|
from identityUser in _identityUserRepository.AsQueryable(false).Where(t => t.Status == UserStateEnum.Enable).Where(t => t.UserRoleList.Where(t => t.IsUserRoleDisabled == false).Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
|
||||||
join confirmc in _systemDocConfirmedUserRepository.Where() on new { ConfirmUserId = identityUser.Id, SystemDocumentId = sysDoc.Id } equals new { confirmc.ConfirmUserId, confirmc.SystemDocumentId } into cc
|
join confirmc in _systemDocConfirmedUserRepository.Where() on new { ConfirmUserId = identityUser.Id, SystemDocumentId = sysDoc.Id } equals new { confirmc.ConfirmUserId, confirmc.SystemDocumentId } into cc
|
||||||
from confirm in cc.DefaultIfEmpty()
|
from confirm in cc.DefaultIfEmpty()
|
||||||
select new UnionDocumentWithConfirmInfoView()
|
select new TriaAndSystemlSignDocView()
|
||||||
{
|
{
|
||||||
|
DocLanguageType=sysDoc.DocLanguageType,
|
||||||
|
UserWorkLanguage=identityUser.UserWorkLanguage,
|
||||||
IsSystemDoc = true,
|
IsSystemDoc = true,
|
||||||
Id = sysDoc.Id,
|
Id = sysDoc.Id,
|
||||||
CreateTime = sysDoc.CreateTime,
|
CreateTime = sysDoc.CreateTime,
|
||||||
@@ -79,7 +81,9 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
};
|
};
|
||||||
var datalist = await systemDocQuery.IgnoreQueryFilters().Where(t => t.IsDeleted == false && t.ConfirmTime == null)
|
var datalist = await systemDocQuery.IgnoreQueryFilters().Where(t => t.IsDeleted == false && t.ConfirmTime == null)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
datalist = datalist.Where(x => x.SuggestFinishTime != null && x.SuggestFinishTime.Value.Date == DateTime.Now.Date)
|
datalist = datalist
|
||||||
|
.Where(x=>x.DocLanguageType == DocLanguageType.CN_US || (int)x.DocLanguageType == (int)x.UserWorkLanguage)
|
||||||
|
.Where(x => x.SuggestFinishTime != null && x.SuggestFinishTime.Value.Date == DateTime.Now.Date)
|
||||||
.Where(x => x.IsNeedSendEmial).ToList();
|
.Where(x => x.IsNeedSendEmial).ToList();
|
||||||
var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList();
|
var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList();
|
||||||
var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync();
|
var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync();
|
||||||
@@ -95,8 +99,6 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
|
|
||||||
var userWorkLanguageList = userinfoList.Select(x => x.UserWorkLanguage).Distinct().ToList();
|
var userWorkLanguageList = userinfoList.Select(x => x.UserWorkLanguage).Distinct().ToList();
|
||||||
foreach (var workLanguage in userWorkLanguageList)
|
foreach (var workLanguage in userWorkLanguageList)
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
var langUserInfoList = userinfoList.Where(x => x.UserWorkLanguage == workLanguage).ToList();
|
var langUserInfoList = userinfoList.Where(x => x.UserWorkLanguage == workLanguage).ToList();
|
||||||
if (!langUserInfoList.Any())
|
if (!langUserInfoList.Any())
|
||||||
@@ -105,17 +107,15 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
}
|
}
|
||||||
|
|
||||||
var userIsEn_US = workLanguage == UserWorkLanguage.US;
|
var userIsEn_US = workLanguage == UserWorkLanguage.US;
|
||||||
|
var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
|
||||||
var messageToSend = new MimeMessage();
|
|
||||||
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
|
||||||
|
|
||||||
foreach (var userinfo in langUserInfoList)
|
foreach (var userinfo in langUserInfoList)
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var messageToSend = new MimeMessage();
|
||||||
|
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
||||||
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
||||||
}
|
|
||||||
|
|
||||||
var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
|
|
||||||
var userNames = langUserInfoList.Select(x => x.UserName).ToList();
|
|
||||||
|
|
||||||
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
||||||
{
|
{
|
||||||
@@ -123,7 +123,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
|
|
||||||
var htmlBodyStr = string.Format(
|
var htmlBodyStr = string.Format(
|
||||||
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
||||||
string.Join(',', userNames),
|
userinfo.FullName,
|
||||||
_systemEmailConfig.SiteUrl
|
_systemEmailConfig.SiteUrl
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -137,6 +137,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,7 +172,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
Console.WriteLine($"只发送给新增的角色,角色数量: {context.Message.NewUserTypeIds.Count}");
|
Console.WriteLine($"只发送给新增的角色,角色数量: {context.Message.NewUserTypeIds.Count}");
|
||||||
}
|
}
|
||||||
// 构建查询
|
// 构建查询
|
||||||
IQueryable<UnionDocumentWithConfirmInfoView> systemDocQuery;
|
IQueryable<TriaAndSystemlSignDocView> systemDocQuery;
|
||||||
|
|
||||||
if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any())
|
if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any())
|
||||||
{
|
{
|
||||||
@@ -183,8 +184,10 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
t.UserRoleList.Where(t => t.IsUserRoleDisabled == false)
|
t.UserRoleList.Where(t => t.IsUserRoleDisabled == false)
|
||||||
.Any(t => context.Message.NewUserTypeIds.Contains(t.UserTypeId) &&
|
.Any(t => context.Message.NewUserTypeIds.Contains(t.UserTypeId) &&
|
||||||
sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
|
sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
|
||||||
select new UnionDocumentWithConfirmInfoView()
|
select new TriaAndSystemlSignDocView()
|
||||||
{
|
{
|
||||||
|
DocLanguageType = sysDoc.DocLanguageType,
|
||||||
|
UserWorkLanguage = identityUser.UserWorkLanguage,
|
||||||
IsSystemDoc = true,
|
IsSystemDoc = true,
|
||||||
Id = sysDoc.Id,
|
Id = sysDoc.Id,
|
||||||
CreateTime = sysDoc.CreateTime,
|
CreateTime = sysDoc.CreateTime,
|
||||||
@@ -210,8 +213,10 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
.Where(t => t.Status == UserStateEnum.Enable &&
|
.Where(t => t.Status == UserStateEnum.Enable &&
|
||||||
t.UserRoleList.Where(t => t.IsUserRoleDisabled == false)
|
t.UserRoleList.Where(t => t.IsUserRoleDisabled == false)
|
||||||
.Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
|
.Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
|
||||||
select new UnionDocumentWithConfirmInfoView()
|
select new TriaAndSystemlSignDocView()
|
||||||
{
|
{
|
||||||
|
DocLanguageType = sysDoc.DocLanguageType,
|
||||||
|
UserWorkLanguage = identityUser.UserWorkLanguage,
|
||||||
IsSystemDoc = true,
|
IsSystemDoc = true,
|
||||||
Id = sysDoc.Id,
|
Id = sysDoc.Id,
|
||||||
CreateTime = sysDoc.CreateTime,
|
CreateTime = sysDoc.CreateTime,
|
||||||
@@ -229,7 +234,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
var datalist = await systemDocQuery.IgnoreQueryFilters().Where(x => x.IsNeedSendEmial).ToListAsync();
|
var datalist = await systemDocQuery.IgnoreQueryFilters().Where(x => x.IsNeedSendEmial).ToListAsync();
|
||||||
|
datalist = datalist.Where(x => x.DocLanguageType == DocLanguageType.CN_US || (int)x.DocLanguageType == (int)x.UserWorkLanguage).ToList();
|
||||||
var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList();
|
var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList();
|
||||||
var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync();
|
var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync();
|
||||||
|
|
||||||
@@ -240,29 +245,18 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var userWorkLanguageList = userinfoList.Select(x => x.UserWorkLanguage).Distinct().ToList();
|
foreach (var userinfo in userinfoList)
|
||||||
foreach (var workLanguage in userWorkLanguageList)
|
|
||||||
{
|
{
|
||||||
var langUserInfoList = userinfoList.Where(x => x.UserWorkLanguage == workLanguage).ToList();
|
string msg = $"{userinfo.UserName}生效通知,";
|
||||||
if (!langUserInfoList.Any())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
string msg = $"{langUserInfoList.Count}生效通知,";
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var messageToSend = new MimeMessage();
|
var messageToSend = new MimeMessage();
|
||||||
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
||||||
|
|
||||||
foreach (var userinfo in langUserInfoList)
|
|
||||||
{
|
|
||||||
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
||||||
}
|
|
||||||
|
|
||||||
|
var workLanguage = userinfo.UserWorkLanguage;
|
||||||
var userIsEn_US = workLanguage == UserWorkLanguage.US;
|
var userIsEn_US = workLanguage == UserWorkLanguage.US;
|
||||||
var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
|
var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
|
||||||
var userNames = langUserInfoList.Select(x => x.UserName).ToList();
|
|
||||||
|
|
||||||
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
||||||
{
|
{
|
||||||
@@ -270,7 +264,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
|
|
||||||
var htmlBodyStr = string.Format(
|
var htmlBodyStr = string.Format(
|
||||||
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
||||||
string.Join(',', userNames),
|
userinfo.FullName,
|
||||||
_systemEmailConfig.SiteUrl
|
_systemEmailConfig.SiteUrl
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using DocumentFormat.OpenXml;
|
using DocumentFormat.OpenXml;
|
||||||
using IRaCIS.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.MassTransit.Consumer;
|
using IRaCIS.Core.Application.MassTransit.Consumer;
|
||||||
@@ -10,16 +9,8 @@ using MassTransit;
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using MimeKit;
|
using MimeKit;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
|
||||||
using System.Linq.Dynamic.Core;
|
using System.Linq.Dynamic.Core;
|
||||||
using System.Reactive.Joins;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.MassTransit.Recurring
|
namespace IRaCIS.Core.Application.MassTransit.Recurring
|
||||||
{
|
{
|
||||||
@@ -61,7 +52,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
|
|
||||||
var trialDocQuery =
|
var trialDocQuery =
|
||||||
from trialDoc in _trialDocumentRepository.AsQueryable(true)
|
from trialDoc in _trialDocumentRepository.AsQueryable(true)
|
||||||
|
join trial in _trialRepository.Where(x => x.IsDeleted == false) on trialDoc.TrialId equals trial.Id
|
||||||
join trialIdentityUser in _trialIdentityUserRepository.Where(x => x.IsDeleted == false) on trialDoc.TrialId equals trialIdentityUser.TrialId
|
join trialIdentityUser in _trialIdentityUserRepository.Where(x => x.IsDeleted == false) on trialDoc.TrialId equals trialIdentityUser.TrialId
|
||||||
join trialUserRole in _trialUserRoleRepository.Where(x => x.IsDeleted == false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
|
join trialUserRole in _trialUserRoleRepository.Where(x => x.IsDeleted == false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
|
||||||
join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
|
join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
|
||||||
@@ -73,14 +64,17 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
|
|
||||||
from confirm in cc.DefaultIfEmpty()
|
from confirm in cc.DefaultIfEmpty()
|
||||||
where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted && trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
|
where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted && trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
|
||||||
select new TrialSignDocView()
|
select new TriaAndSystemlSignDocView()
|
||||||
{
|
{
|
||||||
|
|
||||||
TrialCode = trialDoc.Trial.TrialCode,
|
TrialCode = trialDoc.Trial.TrialCode,
|
||||||
ResearchProgramNo = trialDoc.Trial.ResearchProgramNo,
|
ResearchProgramNo = trialDoc.Trial.ResearchProgramNo,
|
||||||
ExperimentName = trialDoc.Trial.ExperimentName,
|
ExperimentName = trialDoc.Trial.ExperimentName,
|
||||||
CurrentStaffTrainDays = trialDoc.CurrentStaffTrainDays,
|
CurrentStaffTrainDays = trialDoc.CurrentStaffTrainDays,
|
||||||
NewStaffTrainDays = trialDoc.NewStaffTrainDays,
|
NewStaffTrainDays = trialDoc.NewStaffTrainDays,
|
||||||
Id = trialDoc.Id,
|
Id = trialDoc.Id,
|
||||||
|
TrialType= trial.TrialType,
|
||||||
|
IsTestUser= identityUser.IsTestUser,
|
||||||
TrialId = trialDoc.TrialId,
|
TrialId = trialDoc.TrialId,
|
||||||
IsSystemDoc = false,
|
IsSystemDoc = false,
|
||||||
CreateTime = trialDoc.CreateTime,
|
CreateTime = trialDoc.CreateTime,
|
||||||
@@ -103,7 +97,11 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
};
|
};
|
||||||
var datalist = await trialDocQuery.IgnoreQueryFilters().Where(t => t.IsDeleted == false && t.ConfirmTime == null&&t.ConfirmTime==null)
|
var datalist = await trialDocQuery.IgnoreQueryFilters().Where(t => t.IsDeleted == false && t.ConfirmTime == null&&t.ConfirmTime==null)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
datalist = datalist.Where(x => x.SuggestFinishTime != null && x.SuggestFinishTime.Value.Date == DateTime.Now.Date)
|
|
||||||
|
|
||||||
|
datalist = datalist
|
||||||
|
.Where(x=>((x.TrialType== TrialType.OfficialTrial|| x.TrialType== TrialType.Training) && !x.IsTestUser) || (x.TrialType==TrialType.NoneOfficial &&x.IsTestUser))
|
||||||
|
.Where(x => x.SuggestFinishTime != null && x.SuggestFinishTime.Value.Date == DateTime.Now.Date)
|
||||||
.ToList();
|
.ToList();
|
||||||
var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList();
|
var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList();
|
||||||
var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync();
|
var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync();
|
||||||
@@ -124,8 +122,6 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
|
|
||||||
var groupedList = userWithTrialList.GroupBy(x => new { x.TrialId, x.User.UserWorkLanguage }).ToList();
|
var groupedList = userWithTrialList.GroupBy(x => new { x.TrialId, x.User.UserWorkLanguage }).ToList();
|
||||||
foreach (var groupItem in groupedList)
|
foreach (var groupItem in groupedList)
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
var langUserInfoList = groupItem.Select(x => x.User).Distinct().ToList();
|
var langUserInfoList = groupItem.Select(x => x.User).Distinct().ToList();
|
||||||
if (!langUserInfoList.Any())
|
if (!langUserInfoList.Any())
|
||||||
@@ -143,23 +139,23 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
|
|
||||||
var workLanguage = groupItem.Key.UserWorkLanguage;
|
var workLanguage = groupItem.Key.UserWorkLanguage;
|
||||||
var userIsEn_US = workLanguage == UserWorkLanguage.US;
|
var userIsEn_US = workLanguage == UserWorkLanguage.US;
|
||||||
var messageToSend = new MimeMessage();
|
var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
|
||||||
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
|
||||||
|
|
||||||
foreach (var userinfo in langUserInfoList)
|
foreach (var userinfo in langUserInfoList)
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var messageToSend = new MimeMessage();
|
||||||
|
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
||||||
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
||||||
}
|
|
||||||
|
|
||||||
var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
|
|
||||||
var userNames = langUserInfoList.Select(x => x.UserName).ToList();
|
|
||||||
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
||||||
{
|
{
|
||||||
var topicStr = string.Format(input.topicStr, companyName);
|
var topicStr = string.Format(input.topicStr, companyName);
|
||||||
|
|
||||||
var htmlBodyStr = string.Format(
|
var htmlBodyStr = string.Format(
|
||||||
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
||||||
string.Join(',', userNames),
|
userinfo.FullName,
|
||||||
_systemEmailConfig.SiteUrl
|
_systemEmailConfig.SiteUrl
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -174,6 +170,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,20 +210,21 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
Console.WriteLine($"只发送给新增项目的角色,角色数量: {context.Message.NewUserTypeIds.Count}");
|
Console.WriteLine($"只发送给新增项目的角色,角色数量: {context.Message.NewUserTypeIds.Count}");
|
||||||
}
|
}
|
||||||
// 构建查询
|
// 构建查询
|
||||||
IQueryable<UnionDocumentWithConfirmInfoView> systemDocQuery;
|
IQueryable<TriaAndSystemlSignDocView> trialDocQuery;
|
||||||
|
|
||||||
if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any())
|
if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any())
|
||||||
{
|
{
|
||||||
// 只查询新增角色的用户
|
// 只查询新增角色的用户
|
||||||
systemDocQuery =
|
trialDocQuery =
|
||||||
from trialDoc in _trialDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id))
|
from trialDoc in _trialDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id))
|
||||||
|
join trial in _trialRepository.Where(x => x.IsDeleted == false) on trialDoc.TrialId equals trial.Id
|
||||||
join trialIdentityUser in _trialIdentityUserRepository.Where(x=>x.IsDeleted==false) on trialDoc.TrialId equals trialIdentityUser.TrialId
|
join trialIdentityUser in _trialIdentityUserRepository.Where(x=>x.IsDeleted==false) on trialDoc.TrialId equals trialIdentityUser.TrialId
|
||||||
join trialUserRole in _trialUserRoleRepository.Where(x => x.IsDeleted == false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
|
join trialUserRole in _trialUserRoleRepository.Where(x => x.IsDeleted == false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
|
||||||
join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
|
join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
|
||||||
on trialIdentityUser.IdentityUserId equals identityUser.Id
|
on trialIdentityUser.IdentityUserId equals identityUser.Id
|
||||||
where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted && context.Message.NewUserTypeIds.Contains(ur.UserRole.UserTypeId) && trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
|
where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted && context.Message.NewUserTypeIds.Contains(ur.UserRole.UserTypeId) && trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
|
||||||
|
|
||||||
select new UnionDocumentWithConfirmInfoView()
|
select new TriaAndSystemlSignDocView()
|
||||||
{
|
{
|
||||||
IsSystemDoc = true,
|
IsSystemDoc = true,
|
||||||
Id = trialDoc.Id,
|
Id = trialDoc.Id,
|
||||||
@@ -234,6 +232,8 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
CreateTime = trialDoc.CreateTime,
|
CreateTime = trialDoc.CreateTime,
|
||||||
IsDeleted = trialDoc.IsDeleted,
|
IsDeleted = trialDoc.IsDeleted,
|
||||||
SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes,
|
SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes,
|
||||||
|
TrialType = trial.TrialType,
|
||||||
|
IsTestUser = identityUser.IsTestUser,
|
||||||
Name = trialDoc.Name,
|
Name = trialDoc.Name,
|
||||||
Path = trialDoc.Path,
|
Path = trialDoc.Path,
|
||||||
FileTypeId = trialDoc.FileTypeId,
|
FileTypeId = trialDoc.FileTypeId,
|
||||||
@@ -248,8 +248,9 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 查询所有相关角色的用户
|
// 查询所有相关角色的用户
|
||||||
systemDocQuery =
|
trialDocQuery =
|
||||||
from trialDoc in _trialDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id))
|
from trialDoc in _trialDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id))
|
||||||
|
|
||||||
join trialIdentityUser in _trialIdentityUserRepository.Where(x => x.IsDeleted == false) on trialDoc.TrialId equals trialIdentityUser.TrialId
|
join trialIdentityUser in _trialIdentityUserRepository.Where(x => x.IsDeleted == false) on trialDoc.TrialId equals trialIdentityUser.TrialId
|
||||||
join trialUserRole in _trialUserRoleRepository.Where(x=>x.IsDeleted==false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
|
join trialUserRole in _trialUserRoleRepository.Where(x=>x.IsDeleted==false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
|
||||||
|
|
||||||
@@ -259,7 +260,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted &&trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
|
where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted &&trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
|
||||||
|
|
||||||
|
|
||||||
select new UnionDocumentWithConfirmInfoView()
|
select new TriaAndSystemlSignDocView()
|
||||||
{
|
{
|
||||||
IsSystemDoc = false,
|
IsSystemDoc = false,
|
||||||
Id = trialDoc.Id,
|
Id = trialDoc.Id,
|
||||||
@@ -268,6 +269,8 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
CreateTime = trialDoc.CreateTime,
|
CreateTime = trialDoc.CreateTime,
|
||||||
IsDeleted = trialDoc.IsDeleted,
|
IsDeleted = trialDoc.IsDeleted,
|
||||||
SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes,
|
SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes,
|
||||||
|
TrialType = trial.TrialType,
|
||||||
|
IsTestUser = identityUser.IsTestUser,
|
||||||
Name = trialDoc.Name,
|
Name = trialDoc.Name,
|
||||||
Path = trialDoc.Path,
|
Path = trialDoc.Path,
|
||||||
FileTypeId = trialDoc.FileTypeId,
|
FileTypeId = trialDoc.FileTypeId,
|
||||||
@@ -280,7 +283,9 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var datalist = await systemDocQuery.IgnoreQueryFilters().ToListAsync();
|
var datalist = await trialDocQuery.IgnoreQueryFilters().ToListAsync();
|
||||||
|
datalist = datalist.Where(x => ((x.TrialType == TrialType.OfficialTrial || x.TrialType == TrialType.Training) && !x.IsTestUser) || (x.TrialType == TrialType.NoneOfficial && x.IsTestUser)).ToList();
|
||||||
|
|
||||||
|
|
||||||
var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList();
|
var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList();
|
||||||
var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync();
|
var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync();
|
||||||
@@ -297,37 +302,26 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
join u in userinfoList on ut.ConfirmUserId equals u.Id
|
join u in userinfoList on ut.ConfirmUserId equals u.Id
|
||||||
select new { ut.TrialId, User = u }).ToList();
|
select new { ut.TrialId, User = u }).ToList();
|
||||||
|
|
||||||
var groupedList = userWithTrialList.GroupBy(x => new { x.TrialId, x.User.UserWorkLanguage }).ToList();
|
foreach (var userWithTrial in userWithTrialList)
|
||||||
foreach (var groupItem in groupedList)
|
|
||||||
{
|
{
|
||||||
var langUserInfoList = groupItem.Select(x => x.User).Distinct().ToList();
|
var userinfo = userWithTrial.User;
|
||||||
if (!langUserInfoList.Any())
|
string msg = $"{userinfo.UserName}项目生效通知,";
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
string msg = $"{langUserInfoList.Count}项目生效通知,";
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var messageToSend = new MimeMessage();
|
var messageToSend = new MimeMessage();
|
||||||
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
||||||
|
|
||||||
foreach (var userinfo in langUserInfoList)
|
|
||||||
{
|
|
||||||
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
||||||
}
|
|
||||||
|
|
||||||
var workLanguage = groupItem.Key.UserWorkLanguage;
|
var workLanguage = userinfo.UserWorkLanguage;
|
||||||
var userIsEn_US = workLanguage == UserWorkLanguage.US;
|
var userIsEn_US = workLanguage == UserWorkLanguage.US;
|
||||||
var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
|
var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
|
||||||
var userNames = langUserInfoList.Select(x => x.UserName).ToList();
|
|
||||||
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
||||||
{
|
{
|
||||||
var topicStr = string.Format(input.topicStr, companyName);
|
var topicStr = string.Format(input.topicStr, companyName);
|
||||||
|
|
||||||
var htmlBodyStr = string.Format(
|
var htmlBodyStr = string.Format(
|
||||||
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
||||||
string.Join(',', userNames),
|
userinfo.FullName,
|
||||||
_systemEmailConfig.SiteUrl
|
_systemEmailConfig.SiteUrl
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -335,7 +329,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
|
|||||||
};
|
};
|
||||||
await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc, workLanguage);
|
await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc, workLanguage);
|
||||||
|
|
||||||
var trialInfo = await _trialRepository.Where(x => x.Id == groupItem.Key.TrialId).FirstOrDefaultAsync();
|
var trialInfo = await _trialRepository.Where(x => x.Id == userWithTrial.TrialId).FirstOrDefaultAsync();
|
||||||
if (trialInfo == null)
|
if (trialInfo == null)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -439,6 +439,8 @@ namespace IRaCIS.Core.Application.ViewModel
|
|||||||
|
|
||||||
public string TaskName { get; set; } = String.Empty;
|
public string TaskName { get; set; } = String.Empty;
|
||||||
|
|
||||||
|
public string TaskBlindName { get; set; } = String.Empty;
|
||||||
|
|
||||||
public Guid? DoctorUserId { get; set; }
|
public Guid? DoctorUserId { get; set; }
|
||||||
|
|
||||||
public ReadingCategory? ReadingCategory { get; set; }
|
public ReadingCategory? ReadingCategory { get; set; }
|
||||||
|
|||||||
@@ -124,6 +124,45 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region 获取随机编号
|
||||||
|
/// <summary>
|
||||||
|
/// 从 NewId 的后 3 个字节(24 位)生成一个 6 位十六进制字符串
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GenerateTaskNo()
|
||||||
|
{
|
||||||
|
var bytes = NewId.Next().ToByteArray();
|
||||||
|
|
||||||
|
uint value =
|
||||||
|
BitConverter.ToUInt32(bytes, 0)
|
||||||
|
^ BitConverter.ToUInt32(bytes, 4)
|
||||||
|
^ BitConverter.ToUInt32(bytes, 8)
|
||||||
|
^ BitConverter.ToUInt32(bytes, 12);
|
||||||
|
|
||||||
|
return (value & 0xFFFFFF).ToString("X6");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<string> GetRandomTaskName(Guid trialId, List<string> existList)
|
||||||
|
{
|
||||||
|
var taskName = GenerateTaskNo();
|
||||||
|
|
||||||
|
while (existList.Any(t => t == taskName))
|
||||||
|
{
|
||||||
|
taskName = GenerateTaskNo();
|
||||||
|
}
|
||||||
|
|
||||||
|
while (await _visitTaskRepository.AnyAsync(t => t.TaskBlindName == taskName && t.TrialId == trialId))
|
||||||
|
{
|
||||||
|
taskName = GenerateTaskNo();
|
||||||
|
}
|
||||||
|
|
||||||
|
existList.Add(taskName);
|
||||||
|
|
||||||
|
return taskName;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
//基于标准签名 产生任务 (或者手动选择某些访视生成该标准的任务)
|
//基于标准签名 产生任务 (或者手动选择某些访视生成该标准的任务)
|
||||||
public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId, bool? isManualSelectVisit = null, List<Guid>? subjectVisitIdList = null)
|
public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId, bool? isManualSelectVisit = null, List<Guid>? subjectVisitIdList = null)
|
||||||
@@ -151,11 +190,11 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
||||||
|
|
||||||
var cacheMaxCodeInt = _fusionCache.GetOrDefault<int>(CacheKeys.TrialStudyMaxCode(trialId));
|
var cacheMaxCodeInt = _fusionCache.GetOrDefault<int>(CacheKeys.TrialVisitTaskMaxCode(trialId));
|
||||||
|
|
||||||
int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
|
int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
|
||||||
|
|
||||||
|
var randomTaskBlindNameList = new List<string>();
|
||||||
|
|
||||||
foreach (var subjectGroup in needGenerateVisit.GroupBy(t => t.SubjectId).Select(g => new { SubjectId = g.Key, SubjectVisitList = g.ToList() }))
|
foreach (var subjectGroup in needGenerateVisit.GroupBy(t => t.SubjectId).Select(g => new { SubjectId = g.Key, SubjectVisitList = g.ToList() }))
|
||||||
{
|
{
|
||||||
@@ -173,6 +212,8 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var blindTaskName = string.Empty;
|
var blindTaskName = string.Empty;
|
||||||
|
|
||||||
|
var isRandom = false;
|
||||||
|
|
||||||
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
|
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
|
||||||
{
|
{
|
||||||
if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0 && subjectVisit.VisitNum == 0)
|
if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0 && subjectVisit.VisitNum == 0)
|
||||||
@@ -185,6 +226,12 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.Random)
|
||||||
|
{
|
||||||
|
blindTaskName = await GetRandomTaskName(trialId, randomTaskBlindNameList);
|
||||||
|
|
||||||
|
isRandom = true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
blindTaskName = "Timepoint";
|
blindTaskName = "Timepoint";
|
||||||
@@ -258,12 +305,14 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
|
|
||||||
|
var blindTaskName2 = isRandom ? await GetRandomTaskName(trialId, randomTaskBlindNameList) : blindTaskName;
|
||||||
|
|
||||||
task2 = await _visitTaskRepository.AddAsync(new VisitTask()
|
task2 = await _visitTaskRepository.AddAsync(new VisitTask()
|
||||||
{
|
{
|
||||||
TrialId = trialId,
|
TrialId = trialId,
|
||||||
SubjectId = subjectVisit.SubjectId,
|
SubjectId = subjectVisit.SubjectId,
|
||||||
IsUrgent = subjectVisit.IsUrgent,
|
IsUrgent = subjectVisit.IsUrgent,
|
||||||
TaskBlindName = blindTaskName,
|
TaskBlindName = blindTaskName2,
|
||||||
TaskName = subjectVisit.VisitName,
|
TaskName = subjectVisit.VisitName,
|
||||||
TaskUrgentType = taskUrgentType,
|
TaskUrgentType = taskUrgentType,
|
||||||
IsCanEditUrgentState = isCanEditUrgentState,
|
IsCanEditUrgentState = isCanEditUrgentState,
|
||||||
@@ -283,7 +332,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -344,7 +393,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -590,11 +639,11 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
||||||
|
|
||||||
var cacheMaxCodeInt = _fusionCache.GetOrDefault<int>(CacheKeys.TrialStudyMaxCode(trialId));
|
var cacheMaxCodeInt = _fusionCache.GetOrDefault<int>(CacheKeys.TrialVisitTaskMaxCode(trialId));
|
||||||
|
|
||||||
int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
|
int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
|
||||||
|
|
||||||
|
var randomTaskBlindNameList = new List<string>();
|
||||||
|
|
||||||
|
|
||||||
switch (generateTaskCommand.ReadingCategory)
|
switch (generateTaskCommand.ReadingCategory)
|
||||||
@@ -654,7 +703,9 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var isFrontTaskNeedSignButNotSign = await _visitTaskRepository.AnyAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum < subjectVisit.VisitNum && t.IsNeedClinicalDataSign == true && t.IsClinicalDataSign == false);
|
var isFrontTaskNeedSignButNotSign = await _visitTaskRepository.AnyAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum < subjectVisit.VisitNum && t.IsNeedClinicalDataSign == true && t.IsClinicalDataSign == false);
|
||||||
|
|
||||||
|
|
||||||
var blindTaskName = string.Empty;
|
var blindTaskName = string.Empty;
|
||||||
|
var isFullRandom = false;
|
||||||
|
|
||||||
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
|
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
|
||||||
{
|
{
|
||||||
@@ -668,6 +719,12 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.Random)
|
||||||
|
{
|
||||||
|
blindTaskName = await GetRandomTaskName(trialId, randomTaskBlindNameList);
|
||||||
|
isFullRandom = true;
|
||||||
|
}
|
||||||
|
//受试者随机
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
blindTaskName = "Timepoint";
|
blindTaskName = "Timepoint";
|
||||||
@@ -721,11 +778,15 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))
|
if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))
|
||||||
{
|
{
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
|
var blindTaskName2 = isFullRandom ? await GetRandomTaskName(trialId, randomTaskBlindNameList) : blindTaskName;
|
||||||
|
|
||||||
|
|
||||||
task2 = await _visitTaskRepository.AddAsync(new VisitTask()
|
task2 = await _visitTaskRepository.AddAsync(new VisitTask()
|
||||||
{
|
{
|
||||||
TrialId = trialId,
|
TrialId = trialId,
|
||||||
SubjectId = subjectVisit.SubjectId,
|
SubjectId = subjectVisit.SubjectId,
|
||||||
TaskBlindName = blindTaskName,
|
TaskBlindName = blindTaskName2,
|
||||||
TaskName = subjectVisit.VisitName,
|
TaskName = subjectVisit.VisitName,
|
||||||
IsUrgent = subjectVisit.IsUrgent,
|
IsUrgent = subjectVisit.IsUrgent,
|
||||||
|
|
||||||
@@ -747,7 +808,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
|
|
||||||
|
|
||||||
#region 分配
|
#region 分配
|
||||||
@@ -920,7 +981,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -992,7 +1053,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1069,7 +1130,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
|
|
||||||
#region 分配
|
#region 分配
|
||||||
|
|
||||||
@@ -1197,7 +1258,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1277,6 +1338,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var reReadingVisitTask = generateTaskCommand.ReReadingTask;
|
var reReadingVisitTask = generateTaskCommand.ReReadingTask;
|
||||||
|
|
||||||
|
|
||||||
Guid? subjectVisitId = Guid.Empty;
|
Guid? subjectVisitId = Guid.Empty;
|
||||||
|
|
||||||
if (reReadingVisitTask.SourceSubjectVisitId == null)
|
if (reReadingVisitTask.SourceSubjectVisitId == null)
|
||||||
@@ -1317,6 +1379,10 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
//&& t.TrialReadingCriterionId == reReadingVisitTask.TrialReadingCriterionId && t.TaskState == TaskState.Effect
|
//&& t.TrialReadingCriterionId == reReadingVisitTask.TrialReadingCriterionId && t.TaskState == TaskState.Effect
|
||||||
// && t.SourceSubjectVisitId == reReadingVisitTask.SourceSubjectVisitId && t.ArmEnum == reReadingVisitTask.ArmEnum && t.DoctorUserId == reReadingVisitTask.DoctorUserId).FirstOrDefault();
|
// && t.SourceSubjectVisitId == reReadingVisitTask.SourceSubjectVisitId && t.ArmEnum == reReadingVisitTask.ArmEnum && t.DoctorUserId == reReadingVisitTask.DoctorUserId).FirstOrDefault();
|
||||||
|
|
||||||
|
var isRandomReading = trialReadingCriterionConfigList.FirstOrDefault(t => t.TrialReadingCriterionId == reReadingVisitTask.TrialReadingCriterionId)?.IsReadingTaskViewInOrder == ReadingOrder.Random;
|
||||||
|
|
||||||
|
var taskBlindName = isRandomReading ? await GetRandomTaskName(trialId, randomTaskBlindNameList) : reReadingVisitTask.TaskBlindName;
|
||||||
|
|
||||||
|
|
||||||
var newTask = await _visitTaskRepository.AddAsync(new VisitTask()
|
var newTask = await _visitTaskRepository.AddAsync(new VisitTask()
|
||||||
{
|
{
|
||||||
@@ -1325,7 +1391,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
SubjectId = reReadingVisitTask.SubjectId,
|
SubjectId = reReadingVisitTask.SubjectId,
|
||||||
ArmEnum = reReadingVisitTask.ArmEnum,
|
ArmEnum = reReadingVisitTask.ArmEnum,
|
||||||
TaskName = reReadingVisitTask.TaskName,
|
TaskName = reReadingVisitTask.TaskName,
|
||||||
TaskBlindName = reReadingVisitTask.TaskBlindName,
|
TaskBlindName = taskBlindName,
|
||||||
|
|
||||||
IsUrgent = reReadingVisitTask.IsAnalysisCreate ? false : subjectVisitUrgentInfo.IsUrgent,
|
IsUrgent = reReadingVisitTask.IsAnalysisCreate ? false : subjectVisitUrgentInfo.IsUrgent,
|
||||||
TaskUrgentType = reReadingVisitTask.IsAnalysisCreate ? null : taskUrgent,
|
TaskUrgentType = reReadingVisitTask.IsAnalysisCreate ? null : taskUrgent,
|
||||||
@@ -1386,7 +1452,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
@@ -1491,7 +1557,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -1538,7 +1604,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -1548,6 +1614,11 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var subjectUser = await _subjectUserRepository.Where(x => x.SubjectId == firstTask.SubjectId && x.ArmEnum == Arm.JudgeArm && x.IsConfirmed && x.TrialReadingCriterionId == firstTask.TrialReadingCriterionId).FirstOrDefaultAsync();
|
var subjectUser = await _subjectUserRepository.Where(x => x.SubjectId == firstTask.SubjectId && x.ArmEnum == Arm.JudgeArm && x.IsConfirmed && x.TrialReadingCriterionId == firstTask.TrialReadingCriterionId).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
|
||||||
|
var isRandom = trialReadingCriterionConfigList.FirstOrDefault(t => t.TrialReadingCriterionId == firstTask.TrialReadingCriterionId)?.IsReadingTaskViewInOrder == ReadingOrder.Random;
|
||||||
|
|
||||||
|
var blindName = isRandom ? await GetRandomTaskName(trialId, randomTaskBlindNameList) : firstTask.TaskBlindName;
|
||||||
|
|
||||||
VisitTask visitTask = new VisitTask()
|
VisitTask visitTask = new VisitTask()
|
||||||
{
|
{
|
||||||
ArmEnum = Arm.JudgeArm,
|
ArmEnum = Arm.JudgeArm,
|
||||||
@@ -1564,7 +1635,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
SouceReadModuleId = firstTask.SouceReadModuleId,
|
SouceReadModuleId = firstTask.SouceReadModuleId,
|
||||||
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
|
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
|
||||||
TaskState = TaskState.Effect,
|
TaskState = TaskState.Effect,
|
||||||
TaskBlindName = firstTask.TaskBlindName,
|
TaskBlindName = blindName,
|
||||||
DoctorUserId = subjectUser == null ? null : subjectUser.DoctorUserId,
|
DoctorUserId = subjectUser == null ? null : subjectUser.DoctorUserId,
|
||||||
TaskAllocationState = subjectUser == null ? TaskAllocationState.NotAllocate : TaskAllocationState.Allocated,
|
TaskAllocationState = subjectUser == null ? TaskAllocationState.NotAllocate : TaskAllocationState.Allocated,
|
||||||
AllocateTime = subjectUser == null ? null : DateTime.Now,
|
AllocateTime = subjectUser == null ? null : DateTime.Now,
|
||||||
@@ -1576,7 +1647,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
await _visitTaskRepository.AddAsync(visitTask);
|
await _visitTaskRepository.AddAsync(visitTask);
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
|
|
||||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => generateTaskCommand.JudgeVisitTaskIdList.Contains(x.Id), x => new VisitTask()
|
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => generateTaskCommand.JudgeVisitTaskIdList.Contains(x.Id), x => new VisitTask()
|
||||||
{
|
{
|
||||||
@@ -1637,7 +1708,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
});
|
});
|
||||||
|
|
||||||
currentMaxCodeInt = currentMaxCodeInt + 1;
|
currentMaxCodeInt = currentMaxCodeInt + 1;
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1707,7 +1778,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
TrialId = originalTaskInfo.TrialId
|
TrialId = originalTaskInfo.TrialId
|
||||||
});
|
});
|
||||||
|
|
||||||
_fusionCache.Set<int>(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
_fusionCache.Set<int>(CacheKeys.TrialVisitTaskMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
IRepository<ReadingNoneDicomMarkBinding> _readingNoneDicomMarkBindingRepository,
|
IRepository<ReadingNoneDicomMarkBinding> _readingNoneDicomMarkBindingRepository,
|
||||||
IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository,
|
IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository,
|
||||||
//IRepository<ReadingCustomTag> _readingCustomTagRepository,
|
//IRepository<ReadingCustomTag> _readingCustomTagRepository,
|
||||||
|
IRepository<TaskStudy> _taskStudyRepository,
|
||||||
|
IRepository<TaskSeries> _taskSeriesRepository,
|
||||||
|
IRepository<TaskInstance> _taskInstanceRepository,
|
||||||
|
IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository,
|
||||||
IRepository<TaskInfluence> _taskInfluenceRepository,
|
IRepository<TaskInfluence> _taskInfluenceRepository,
|
||||||
IRepository<TrialQCQuestionAnswer> _trialQCQuestionAnswerRepository,
|
IRepository<TrialQCQuestionAnswer> _trialQCQuestionAnswerRepository,
|
||||||
ILogger<VisitTaskService> _logger,
|
ILogger<VisitTaskService> _logger,
|
||||||
@@ -91,6 +95,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
{
|
{
|
||||||
TrialReadingCriterionId = t.Id,
|
TrialReadingCriterionId = t.Id,
|
||||||
IsAutoCreate = t.IsAutoCreate,
|
IsAutoCreate = t.IsAutoCreate,
|
||||||
|
ReadingTool = t.ReadingTool,
|
||||||
IsAdditionalAssessment = t.IsAdditionalAssessment,
|
IsAdditionalAssessment = t.IsAdditionalAssessment,
|
||||||
TrialReadingCriterionName = t.CriterionName,
|
TrialReadingCriterionName = t.CriterionName,
|
||||||
CriterionType = t.CriterionType,
|
CriterionType = t.CriterionType,
|
||||||
@@ -849,7 +854,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
/// <param name="inQuery"></param>
|
/// <param name="inQuery"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<PageOutput<ReReadingTaskView>> GetIRReReadingTaskList(VisitTaskQuery inQuery)
|
public async Task<IResponseOutput<PageOutput<ReReadingTaskView>>> GetIRReReadingTaskList(VisitTaskQuery inQuery)
|
||||||
{
|
{
|
||||||
|
|
||||||
var visitTaskQueryable = _visitTaskReReadingRepository
|
var visitTaskQueryable = _visitTaskReReadingRepository
|
||||||
@@ -873,6 +878,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
|
|
||||||
.WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false))
|
.WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false))
|
||||||
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(inQuery.TaskName) || t.NewReReadingTask.TaskBlindName.Contains(inQuery.TaskName))
|
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(inQuery.TaskName) || t.NewReReadingTask.TaskBlindName.Contains(inQuery.TaskName))
|
||||||
|
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskBlindName), t => t.NewReReadingTask.TaskBlindName.Contains(inQuery.TaskBlindName))
|
||||||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(inQuery.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(inQuery.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate))
|
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(inQuery.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(inQuery.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate))
|
||||||
.WhereIf(inQuery.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > inQuery.BeginAllocateDate)
|
.WhereIf(inQuery.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > inQuery.BeginAllocateDate)
|
||||||
.WhereIf(inQuery.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < inQuery.EndAllocateDate!.Value.AddDays(1))
|
.WhereIf(inQuery.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < inQuery.EndAllocateDate!.Value.AddDays(1))
|
||||||
@@ -884,7 +890,11 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
|
|
||||||
var pageList = await visitTaskQueryable.ToPagedListAsync(inQuery, defalutSortArray);
|
var pageList = await visitTaskQueryable.ToPagedListAsync(inQuery, defalutSortArray);
|
||||||
|
|
||||||
return pageList;
|
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
|
||||||
|
.Select(t => new { t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(pageList, criterionInfo);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1237,7 +1247,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
/// <param name="inQuery"></param>
|
/// <param name="inQuery"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<PageOutput<IRHaveReadView>> GetIRHaveReadTaskList(VisitTaskQuery inQuery)
|
public async Task<IResponseOutput<PageOutput<IRHaveReadView>>> GetIRHaveReadTaskList(VisitTaskQuery inQuery)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -1256,6 +1266,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
.WhereIf(inQuery.TaskState != null, t => t.TaskState == inQuery.TaskState)
|
.WhereIf(inQuery.TaskState != null, t => t.TaskState == inQuery.TaskState)
|
||||||
.WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate == false))
|
.WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate == false))
|
||||||
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.TaskName.Contains(inQuery.TaskName) || t.TaskBlindName.Contains(inQuery.TaskName))
|
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.TaskName.Contains(inQuery.TaskName) || t.TaskBlindName.Contains(inQuery.TaskName))
|
||||||
|
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskBlindName), t => t.TaskBlindName.Contains(inQuery.TaskBlindName))
|
||||||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => (t.Subject.Code.Contains(inQuery.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inQuery.SubjectCode) && t.IsAnalysisCreate))
|
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => (t.Subject.Code.Contains(inQuery.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inQuery.SubjectCode) && t.IsAnalysisCreate))
|
||||||
.WhereIf(inQuery.BeginAllocateDate != null, t => t.AllocateTime > inQuery.BeginAllocateDate)
|
.WhereIf(inQuery.BeginAllocateDate != null, t => t.AllocateTime > inQuery.BeginAllocateDate)
|
||||||
.WhereIf(inQuery.EndAllocateDate != null, t => t.AllocateTime < inQuery.EndAllocateDate!.Value.AddDays(1))
|
.WhereIf(inQuery.EndAllocateDate != null, t => t.AllocateTime < inQuery.EndAllocateDate!.Value.AddDays(1))
|
||||||
@@ -1265,7 +1276,10 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
|
|
||||||
var pageList = await visitTaskQueryable.ToPagedListAsync(inQuery, defalutSortArray);
|
var pageList = await visitTaskQueryable.ToPagedListAsync(inQuery, defalutSortArray);
|
||||||
|
|
||||||
return pageList;
|
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
|
||||||
|
.Select(t => new { t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(pageList, criterionInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2074,29 +2088,27 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
//申请表 设置新任务Id
|
//申请表 设置新任务Id
|
||||||
visitTaskReReadingAppply.NewReReadingTaskId = newTask.Id;
|
visitTaskReReadingAppply.NewReReadingTaskId = newTask.Id;
|
||||||
|
|
||||||
|
|
||||||
|
if (origenalTask.ReadingCategory == ReadingCategory.Visit)
|
||||||
|
{
|
||||||
|
CopyImages(newTask, influenceTask);
|
||||||
|
|
||||||
//拷贝原始表单
|
//拷贝原始表单
|
||||||
if (visitTaskReReadingAppply.IsCopyOrigenalForms && influenceTask.Id == origenalTask.Id)
|
if (visitTaskReReadingAppply.IsCopyOrigenalForms && influenceTask.Id == origenalTask.Id)
|
||||||
{
|
|
||||||
if (origenalTask.ReadingCategory == ReadingCategory.Visit)
|
|
||||||
{
|
{
|
||||||
CopyForms(newTask, origenalTask);
|
CopyForms(newTask, origenalTask);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//拷贝后续表单
|
//拷贝后续表单
|
||||||
if (visitTaskReReadingAppply.IsCopyFollowForms && origenalTask.VisitTaskNum != influenceTask.VisitTaskNum)
|
if (visitTaskReReadingAppply.IsCopyFollowForms && origenalTask.VisitTaskNum != influenceTask.VisitTaskNum)
|
||||||
{
|
|
||||||
if (origenalTask.ReadingCategory == ReadingCategory.Visit)
|
|
||||||
{
|
{
|
||||||
newTask.IsCopyLesionAnswer = true;
|
newTask.IsCopyLesionAnswer = true;
|
||||||
|
|
||||||
//CopyForms(newTask, origenalTask);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2185,6 +2197,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
//申请表 设置新任务Id
|
//申请表 设置新任务Id
|
||||||
visitTaskReReadingAppply.NewReReadingTaskId = newTask.Id;
|
visitTaskReReadingAppply.NewReReadingTaskId = newTask.Id;
|
||||||
|
|
||||||
|
|
||||||
if (visitTaskReReadingAppply.IsCopyOrigenalForms && influenceTask.Id == origenalTask.Id)
|
if (visitTaskReReadingAppply.IsCopyOrigenalForms && influenceTask.Id == origenalTask.Id)
|
||||||
{
|
{
|
||||||
if (origenalTask.ReadingCategory == ReadingCategory.Visit)
|
if (origenalTask.ReadingCategory == ReadingCategory.Visit)
|
||||||
@@ -2194,16 +2207,16 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//拷贝后续表单
|
////拷贝后续表单
|
||||||
if (visitTaskReReadingAppply.IsCopyFollowForms && origenalTask.VisitTaskNum != influenceTask.VisitTaskNum)
|
//if (visitTaskReReadingAppply.IsCopyFollowForms && origenalTask.VisitTaskNum != influenceTask.VisitTaskNum)
|
||||||
{
|
//{
|
||||||
if (origenalTask.ReadingCategory == ReadingCategory.Visit)
|
// if (origenalTask.ReadingCategory == ReadingCategory.Visit)
|
||||||
{
|
// {
|
||||||
newTask.IsCopyLesionAnswer = true;
|
// newTask.IsCopyLesionAnswer = true;
|
||||||
//CopyForms(newTask, origenalTask);
|
// //CopyForms(newTask, origenalTask);
|
||||||
|
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -2223,7 +2236,84 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task CopyForms(VisitTask newTask, VisitTask origenalTask)
|
|
||||||
|
private void CopyImages(VisitTask newTask, VisitTask origenalTask)
|
||||||
|
{
|
||||||
|
//拷贝后处理绑定的的Dicom影像
|
||||||
|
|
||||||
|
var newTaskId = newTask.Id;
|
||||||
|
|
||||||
|
var taskStudyList = _taskStudyRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList();
|
||||||
|
|
||||||
|
var taskSeriesList = _taskSeriesRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList();
|
||||||
|
var taskInstanceList = _taskInstanceRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList();
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var taskStudy in taskStudyList)
|
||||||
|
{
|
||||||
|
var newStudyId = IdentifierHelper.CreateGuid(taskStudy.StudyInstanceUid, taskStudy.TrialId.ToString(), newTaskId.ToString());
|
||||||
|
|
||||||
|
var newStudy = taskStudy.Clone();
|
||||||
|
newStudy.Id = newStudyId;
|
||||||
|
newStudy.SeqId = NewId.NextSequentialGuid();
|
||||||
|
newStudy.VisitTaskId = newTaskId;
|
||||||
|
|
||||||
|
_ = _taskStudyRepository.AddAsync(newStudy).Result;
|
||||||
|
|
||||||
|
var studySeriesList = taskSeriesList.Where(t => t.StudyId == taskStudy.Id).ToList();
|
||||||
|
|
||||||
|
foreach (var series in studySeriesList)
|
||||||
|
{
|
||||||
|
var newSeriesId = IdentifierHelper.CreateGuid(series.StudyInstanceUid, series.SeriesInstanceUid, series.TrialId.ToString(), newTaskId.ToString());
|
||||||
|
|
||||||
|
var newSeries = series.Clone();
|
||||||
|
newSeries.Id = newSeriesId;
|
||||||
|
newSeries.SeqId = NewId.NextSequentialGuid();
|
||||||
|
newSeries.StudyId = newStudyId;
|
||||||
|
newSeries.VisitTaskId = newTaskId;
|
||||||
|
|
||||||
|
|
||||||
|
_ = _taskSeriesRepository.AddAsync(newSeries).Result;
|
||||||
|
|
||||||
|
|
||||||
|
var studyInstanceList = taskInstanceList.Where(t => t.StudyId == taskStudy.Id && t.SeriesId == series.Id).ToList();
|
||||||
|
|
||||||
|
foreach (var instance in studyInstanceList)
|
||||||
|
{
|
||||||
|
var newInstanceId = IdentifierHelper.CreateGuid(newStudy.StudyInstanceUid, newSeries.SeriesInstanceUid, instance.SopInstanceUid, newStudy.TrialId.ToString(), newTaskId.ToString());
|
||||||
|
|
||||||
|
var newInstance = instance.Clone();
|
||||||
|
|
||||||
|
newInstance.Id = newInstanceId;
|
||||||
|
newInstance.SeqId = NewId.NextSequentialGuid();
|
||||||
|
newInstance.StudyId = newStudyId;
|
||||||
|
newInstance.SeriesId = newSeriesId;
|
||||||
|
newInstance.VisitTaskId = newTaskId;
|
||||||
|
|
||||||
|
Console.WriteLine($"StudyInstanceUid:{newStudy.StudyInstanceUid} SeriesInstanceUid:{newSeries.SeriesInstanceUid} SopInstanceUid: {instance.SopInstanceUid},newInstanceId:{newInstanceId} ");
|
||||||
|
|
||||||
|
_ = _taskInstanceRepository.AddAsync(newInstance).Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//拷贝后处理的NoneDicom
|
||||||
|
|
||||||
|
var fileList = _noneDicomStudyFileRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList();
|
||||||
|
|
||||||
|
foreach (var file in fileList)
|
||||||
|
{
|
||||||
|
var newFile = file.Clone();
|
||||||
|
|
||||||
|
newFile.Id = NewId.NextSequentialGuid();
|
||||||
|
newFile.VisitTaskId = newTaskId;
|
||||||
|
|
||||||
|
_ = _noneDicomStudyFileRepository.AddAsync(newFile).Result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void CopyForms(VisitTask newTask, VisitTask origenalTask)
|
||||||
{
|
{
|
||||||
newTask.IsCopyLesionAnswer = true;
|
newTask.IsCopyLesionAnswer = true;
|
||||||
//自定义
|
//自定义
|
||||||
@@ -2242,6 +2332,8 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var readingTaskQuestionAnswerList = _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList();
|
var readingTaskQuestionAnswerList = _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList();
|
||||||
|
|
||||||
foreach (var item in readingTaskQuestionAnswerList)
|
foreach (var item in readingTaskQuestionAnswerList)
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ namespace IRaCIS.Application.Contracts
|
|||||||
public Guid? TrialReadingCriterionId { get; set; }
|
public Guid? TrialReadingCriterionId { get; set; }
|
||||||
|
|
||||||
public Guid? SystemReadingCriterionId { get; set; }
|
public Guid? SystemReadingCriterionId { get; set; }
|
||||||
|
|
||||||
|
public Guid? TrialId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
// 生成时间 2026-03-10 06:15:31Z
|
// 生成时间 2026-03-10 06:15:31Z
|
||||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
using System;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
namespace IRaCIS.Core.Application.ViewModel;
|
namespace IRaCIS.Core.Application.ViewModel;
|
||||||
@@ -96,7 +95,22 @@ public class FileUploadRecordAddOrEdit
|
|||||||
public bool? IsSync { get; set; }
|
public bool? IsSync { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class CommonUploadRecordDto: CommonUploadRecordAddOrEdit
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CommonUploadRecordAddOrEdit
|
||||||
|
{
|
||||||
|
public Guid? Id { get; set; }
|
||||||
|
public string FileType { get; set; }
|
||||||
|
|
||||||
|
public string FileName { get; set; }
|
||||||
|
|
||||||
|
public long FileSize { get; set; }
|
||||||
|
|
||||||
|
public string Path { get; set; }
|
||||||
|
}
|
||||||
public class SubjectFileUploadRecordQuery : PageInput
|
public class SubjectFileUploadRecordQuery : PageInput
|
||||||
{
|
{
|
||||||
public Guid TrialId { get; set; }
|
public Guid TrialId { get; set; }
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using Medallion.Threading;
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@@ -16,7 +17,7 @@ using System.Threading.Tasks;
|
|||||||
namespace IRaCIS.Core.Application.Service.Common;
|
namespace IRaCIS.Core.Application.Service.Common;
|
||||||
|
|
||||||
[ApiExplorerSettings(GroupName = "Common")]
|
[ApiExplorerSettings(GroupName = "Common")]
|
||||||
public class DeployConfigService(IMapper _mapper, IUserInfo _userInfo, IWebHostEnvironment _hostEnvironment, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService
|
public class DeployConfigService(IMapper _mapper, IConfiguration _configuration, IDistributedLockProvider _distributedLockProvider, IUserInfo _userInfo, IWebHostEnvironment _hostEnvironment, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -26,7 +27,18 @@ public class DeployConfigService(IMapper _mapper, IUserInfo _userInfo, IWebHostE
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<ServiceVerifyConfigOption> GetSystemBasicConfigInfo([FromServices] IOptionsMonitor<ServiceVerifyConfigOption> options)
|
public async Task<ServiceVerifyConfigOption> GetSystemBasicConfigInfo([FromServices] IOptionsMonitor<ServiceVerifyConfigOption> options)
|
||||||
{
|
{
|
||||||
return options.CurrentValue;
|
//var config = _configuration.GetSection("BasicSystemConfig").Get<ServiceVerifyConfigOption>();
|
||||||
|
//return config;
|
||||||
|
|
||||||
|
|
||||||
|
var path = Path.Combine( _hostEnvironment.ContentRootPath,$"appsettings.{_hostEnvironment.EnvironmentName}.json");
|
||||||
|
|
||||||
|
var json = File.ReadAllText(path);
|
||||||
|
|
||||||
|
var obj = JObject.Parse(json);
|
||||||
|
|
||||||
|
return obj["BasicSystemConfig"]!.ToObject<ServiceVerifyConfigOption>()!;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -37,7 +49,16 @@ public class DeployConfigService(IMapper _mapper, IUserInfo _userInfo, IWebHostE
|
|||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<IResponseOutput> UpdateSystemBasicConfig(ServiceVerifyConfigOption basicSystemConfigOption)
|
public async Task<IResponseOutput> UpdateSystemBasicConfig(ServiceVerifyConfigOption basicSystemConfigOption)
|
||||||
{
|
{
|
||||||
var path = $"appsettings.{_hostEnvironment.EnvironmentName}.json";
|
//var path = $"appsettings.{_hostEnvironment.EnvironmentName}.json";
|
||||||
|
var path = Path.Combine(_hostEnvironment.ContentRootPath, $"appsettings.{_hostEnvironment.EnvironmentName}.json");
|
||||||
|
|
||||||
|
|
||||||
|
var @lock = _distributedLockProvider.CreateLock("WriteConfigFile");
|
||||||
|
|
||||||
|
|
||||||
|
using (await @lock.AcquireAsync())
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
string text = System.IO.File.ReadAllText(path);
|
string text = System.IO.File.ReadAllText(path);
|
||||||
|
|
||||||
@@ -66,6 +87,8 @@ public class DeployConfigService(IMapper _mapper, IUserInfo _userInfo, IWebHostE
|
|||||||
string result = obj.ToString();
|
string result = obj.ToString();
|
||||||
System.IO.File.WriteAllText(path, result);
|
System.IO.File.WriteAllText(path, result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
@@ -77,7 +100,18 @@ public class DeployConfigService(IMapper _mapper, IUserInfo _userInfo, IWebHostE
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<SystemEmailSendConfig> GetEmailConfigInfo([FromServices] IOptionsMonitor<SystemEmailSendConfig> options)
|
public async Task<SystemEmailSendConfig> GetEmailConfigInfo([FromServices] IOptionsMonitor<SystemEmailSendConfig> options)
|
||||||
{
|
{
|
||||||
return options.CurrentValue;
|
//两种方式都有问题
|
||||||
|
//var config = _configuration.GetSection("BasicSystemConfig").Get<SystemEmailSendConfig>();
|
||||||
|
//return config;
|
||||||
|
//return options.CurrentValue;
|
||||||
|
|
||||||
|
var path = Path.Combine(_hostEnvironment.ContentRootPath, $"appsettings.{_hostEnvironment.EnvironmentName}.json");
|
||||||
|
|
||||||
|
var json = File.ReadAllText(path);
|
||||||
|
|
||||||
|
var obj = JObject.Parse(json);
|
||||||
|
|
||||||
|
return obj["SystemEmailSendConfig"]!.ToObject<SystemEmailSendConfig>()!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -89,7 +123,15 @@ public class DeployConfigService(IMapper _mapper, IUserInfo _userInfo, IWebHostE
|
|||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<IResponseOutput> UpdateSystemEmailConfig(SystemEmailSendConfig emailConfig)
|
public async Task<IResponseOutput> UpdateSystemEmailConfig(SystemEmailSendConfig emailConfig)
|
||||||
{
|
{
|
||||||
var path = $"appsettings.{_hostEnvironment.EnvironmentName}.json";
|
var path = Path.Combine(_hostEnvironment.ContentRootPath,$"appsettings.{_hostEnvironment.EnvironmentName}.json");
|
||||||
|
//var path = $"appsettings.{_hostEnvironment.EnvironmentName}.json";
|
||||||
|
|
||||||
|
var @lock = _distributedLockProvider.CreateLock("WriteConfigFile");
|
||||||
|
|
||||||
|
|
||||||
|
using (await @lock.AcquireAsync())
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
string text = System.IO.File.ReadAllText(path);
|
string text = System.IO.File.ReadAllText(path);
|
||||||
|
|
||||||
@@ -124,6 +166,8 @@ public class DeployConfigService(IMapper _mapper, IUserInfo _userInfo, IWebHostE
|
|||||||
System.IO.File.WriteAllText(path, result);
|
System.IO.File.WriteAllText(path, result);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -452,14 +452,14 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
if (inDto.TrialReadingCriterionId == null && inDto.SystemReadingCriterionId == null)
|
if (inDto.TrialReadingCriterionId == null && inDto.SystemReadingCriterionId == null)
|
||||||
{
|
{
|
||||||
return result;
|
return await ChangeTrialObjectNameList(result,inDto.TrialId);
|
||||||
}
|
}
|
||||||
else if (inDto.TrialReadingCriterionId != null)
|
else if (inDto.TrialReadingCriterionId != null)
|
||||||
{
|
{
|
||||||
var trialCriterionType = await _readingQuestionCriterionTrial.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.CriterionType).FirstOrDefaultAsync();
|
var trialCriterionType = await _readingQuestionCriterionTrial.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.CriterionType).FirstOrDefaultAsync();
|
||||||
if (trialCriterionType == CriterionType.SelfDefine)
|
if (trialCriterionType == CriterionType.SelfDefine)
|
||||||
{
|
{
|
||||||
return result;
|
return await ChangeTrialObjectNameList(result, inDto.TrialId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -505,7 +505,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
result[item.Key] = item.Value;
|
result[item.Key] = item.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return await ChangeTrialObjectNameList(result, inDto.TrialId);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -548,12 +548,76 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
result[item.Key] = item.Value;
|
result[item.Key] = item.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return await ChangeTrialObjectNameList(result, inDto.TrialId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 替换字典中的项目名称为试验对象名称 --New
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <param name="trialId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task<Dictionary<string, List<BasicDicSelect>>> ChangeTrialObjectNameList(Dictionary<string, List<BasicDicSelect>> data,Guid? trialId)
|
||||||
|
{
|
||||||
|
if (!trialId.HasValue)
|
||||||
|
{
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 查询映射集合
|
||||||
|
var trialObjectNameList = await _trialRepository
|
||||||
|
.Where(x => x.Id == trialId)
|
||||||
|
.Select(x => x.TrialObjectNameList)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
// 无映射数据直接返回
|
||||||
|
if (trialObjectNameList == null || !trialObjectNameList.Any())
|
||||||
|
{
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 构建映射字典,过滤空名称,避免无效替换
|
||||||
|
var replaceDict = trialObjectNameList
|
||||||
|
.Where(m => !string.IsNullOrEmpty(m.Name))
|
||||||
|
.ToDictionary(m => m.Name, m => m.TrialName);
|
||||||
|
|
||||||
|
// 遍历替换
|
||||||
|
foreach (var (_, selectList) in data)
|
||||||
|
{
|
||||||
|
foreach (var selectItem in selectList)
|
||||||
|
{
|
||||||
|
// 替换Value,判null保护
|
||||||
|
if (selectItem.Value != null)
|
||||||
|
{
|
||||||
|
string tempVal = selectItem.Value;
|
||||||
|
foreach (var (oldStr, newStr) in replaceDict)
|
||||||
|
{
|
||||||
|
tempVal = tempVal.Replace(oldStr, newStr);
|
||||||
|
}
|
||||||
|
selectItem.Value = tempVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 替换中文名称ValueCN
|
||||||
|
if (selectItem.ValueCN != null)
|
||||||
|
{
|
||||||
|
string tempCn = selectItem.ValueCN;
|
||||||
|
foreach (var (oldStr, newStr) in replaceDict)
|
||||||
|
{
|
||||||
|
tempCn = tempCn.Replace(oldStr, newStr);
|
||||||
|
}
|
||||||
|
selectItem.ValueCN = tempCn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
#region 稽查相关
|
#region 稽查相关
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -4,19 +4,13 @@
|
|||||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
using DocumentFormat.OpenXml.Spreadsheet;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using MailKit;
|
using MailKit;
|
||||||
using MailKit.Net.Imap;
|
using MailKit.Net.Imap;
|
||||||
using MailKit.Search;
|
using MailKit.Search;
|
||||||
using MailKit.Security;
|
using MailKit.Security;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Contracts
|
namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|||||||
@@ -1,27 +1,15 @@
|
|||||||
using DocumentFormat.OpenXml.Spreadsheet;
|
using ClosedXML.Excel;
|
||||||
|
using DocumentFormat.OpenXml.Spreadsheet;
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
using IRaCIS.Application.Interfaces;
|
|
||||||
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
|
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts.DTO;
|
using IRaCIS.Core.Application.Contracts.DTO;
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using IRaCIS.Core.Infra.EFCore.Migrations;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
|
||||||
using NPOI.HPSF;
|
|
||||||
using NPOI.POIFS.Properties;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using NPOI.XSSF.UserModel;
|
|
||||||
using System.ComponentModel.Design;
|
|
||||||
using System.Globalization;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using static IRaCIS.Core.Application.Service.ExcelExportHelper;
|
using static IRaCIS.Core.Application.Service.ExcelExportHelper;
|
||||||
@@ -153,9 +141,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
|
|
||||||
var dynamicColumnConfig = new DynamicColumnConfig()
|
var dynamicColumnConfig = new DynamicColumnConfig()
|
||||||
{
|
{
|
||||||
AutoColumnTitleRowIndex = 2,
|
AutoColumnTitleRowIndex = 3, //2
|
||||||
AutoColumnStartIndex = 7,
|
AutoColumnStartIndex = 8, //7
|
||||||
TempalteLastColumnIndex = 6,
|
TempalteLastColumnIndex = 7, //6
|
||||||
DynamicItemDicName = "TranslateDicName",
|
DynamicItemDicName = "TranslateDicName",
|
||||||
DynamicItemValueName = "Answer",
|
DynamicItemValueName = "Answer",
|
||||||
DynamicItemTitleName = "QuestionName",
|
DynamicItemTitleName = "QuestionName",
|
||||||
@@ -167,7 +155,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.TrialQCResult_Export, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(QCQuestionResult_Export), dynamicColumnConfig: dynamicColumnConfig);
|
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_ClosedXMLAsync(StaticData.Export.TrialQCResult_Export, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(QCQuestionResult_Export), dynamicColumnConfig: dynamicColumnConfig);
|
||||||
|
|
||||||
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||||
{
|
{
|
||||||
@@ -1209,7 +1197,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ?
|
t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ?
|
||||||
ReadingStatusEnum.ReadCompleted : t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.TaskAllocationState == TaskAllocationState.Allocated).Count() == (int)trialReadingCriterion.ReadingType ? ReadingStatusEnum.ImageReading :
|
ReadingStatusEnum.ReadCompleted : t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.TaskAllocationState == TaskAllocationState.Allocated).Count() == (int)trialReadingCriterion.ReadingType ? ReadingStatusEnum.ImageReading :
|
||||||
t.ReadingStatus
|
t.ReadingStatus
|
||||||
}).ToList(),
|
}).OrderBy(t=>t.VisitTaskNum).ToList(),
|
||||||
|
|
||||||
ModuleList = subject.ReadModuleList.Where(t => t.TrialReadingCriterionId == dto.TrialReadingCriterionId).Select(t => new SubjectProgressDto.MouduleProgress()
|
ModuleList = subject.ReadModuleList.Where(t => t.TrialReadingCriterionId == dto.TrialReadingCriterionId).Select(t => new SubjectProgressDto.MouduleProgress()
|
||||||
{
|
{
|
||||||
@@ -1239,55 +1227,60 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||||||
|
|
||||||
|
|
||||||
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.TrialSubjectProgressList_Export, exportInfo, /*"", */_commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectProgressDto));
|
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_ClosedXMLAsync(StaticData.Export.TrialSubjectProgressList_Export, exportInfo, /*"", */_commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectProgressDto));
|
||||||
|
|
||||||
|
|
||||||
// 使用NPOI 进行二次处理
|
// 使用 ClosedXML 进行二次处理
|
||||||
|
using var workbook = new XLWorkbook(memoryStream);
|
||||||
var wb = new XSSFWorkbook(memoryStream);
|
var worksheet = workbook.Worksheet(1); // 获取第一个工作表,索引从1开始
|
||||||
|
|
||||||
var sheet = wb.GetSheetAt(0);
|
|
||||||
|
|
||||||
foreach (var subject in list)
|
foreach (var subject in list)
|
||||||
{
|
{
|
||||||
var index = list.IndexOf(subject);
|
var index = list.IndexOf(subject);
|
||||||
var row = sheet.GetRow(index + 4);
|
|
||||||
|
// ClosedXML 行索引从1开始,原来 NPOI 从0开始,所以 +1
|
||||||
|
var row = worksheet.Row(index + 4 + 1); // NPOI: index + 4, ClosedXML: +1 = index + 5
|
||||||
|
|
||||||
|
|
||||||
foreach (var item in subject.TotalList)
|
foreach (var item in subject.TotalList)
|
||||||
{
|
{
|
||||||
//从第五列开始动态写
|
// 从第五列开始动态写(ClosedXML 列索引从1开始)
|
||||||
var visitIndex = subject.TotalList.IndexOf(item) + 4;
|
var visitIndex = subject.TotalList.IndexOf(item) + 4 + 1; // NPOI: +4, ClosedXML: +1 = +5
|
||||||
|
|
||||||
var cell = row.CreateCell(visitIndex);
|
var cell = row.Cell(visitIndex);
|
||||||
|
|
||||||
if (item.IsLostVisit == true)
|
if (item.IsLostVisit == true)
|
||||||
{
|
{
|
||||||
cell.CellStyle = sheet.GetRow(1).GetCell(7).CellStyle;
|
//cell.CellStyle = sheet.GetRow(1).GetCell(7).CellStyle;
|
||||||
|
|
||||||
|
// 复制样式 - ClosedXML 需要先获取源样式,然后应用到目标单元格
|
||||||
|
var sourceCell = worksheet.Row(2).Cell(8); // 原 NPOI: GetRow(1).GetCell(7) -> +1 转换
|
||||||
|
|
||||||
|
cell.Style = sourceCell.Style;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (item.ReadingStatus)
|
switch (item.ReadingStatus)
|
||||||
{
|
{
|
||||||
case ReadingStatusEnum.ImageNotSubmit:
|
case ReadingStatusEnum.ImageNotSubmit:
|
||||||
|
cell.Style = worksheet.Row(2).Cell(2).Style; // NPOI: (1,1) -> ClosedXML: (2,2)
|
||||||
cell.CellStyle = sheet.GetRow(1).GetCell(1).CellStyle;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case ReadingStatusEnum.ImageQuality:
|
case ReadingStatusEnum.ImageQuality:
|
||||||
cell.CellStyle = sheet.GetRow(1).GetCell(2).CellStyle;
|
cell.Style = worksheet.Row(2).Cell(3).Style; // (1,2) -> (2,3)
|
||||||
break;
|
break;
|
||||||
case ReadingStatusEnum.ConsistencyCheck:
|
case ReadingStatusEnum.ConsistencyCheck:
|
||||||
cell.CellStyle = sheet.GetRow(1).GetCell(3).CellStyle;
|
cell.Style = worksheet.Row(2).Cell(4).Style; // (1,3) -> (2,4)
|
||||||
break;
|
break;
|
||||||
case ReadingStatusEnum.TaskAllocate:
|
case ReadingStatusEnum.TaskAllocate:
|
||||||
cell.CellStyle = sheet.GetRow(1).GetCell(4).CellStyle;
|
cell.Style = worksheet.Row(2).Cell(5).Style;// (1,4) -> (2,5)
|
||||||
break;
|
break;
|
||||||
case ReadingStatusEnum.ImageReading:
|
case ReadingStatusEnum.ImageReading:
|
||||||
cell.CellStyle = sheet.GetRow(1).GetCell(5).CellStyle;
|
cell.Style = worksheet.Row(2).Cell(6).Style;// (1,5) -> (2,6)
|
||||||
break;
|
break;
|
||||||
case ReadingStatusEnum.ReadCompleted:
|
case ReadingStatusEnum.ReadCompleted:
|
||||||
cell.CellStyle = sheet.GetRow(1).GetCell(6).CellStyle;
|
cell.Style = worksheet.Row(2).Cell(7).Style; // (1,6) -> (2,7)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -1297,12 +1290,13 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
cell.SetCellValue(item.TaskName);
|
cell.SetValue(item.TaskName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 保存到 MemoryStream
|
||||||
var memoryStream2 = new MemoryStream();
|
var memoryStream2 = new MemoryStream();
|
||||||
wb.Write(memoryStream2, true);
|
workbook.SaveAs(memoryStream2);
|
||||||
memoryStream2.Seek(0, SeekOrigin.Begin);
|
memoryStream2.Seek(0, SeekOrigin.Begin);
|
||||||
|
|
||||||
return new FileStreamResult(memoryStream2, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
return new FileStreamResult(memoryStream2, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||||
@@ -2709,9 +2703,10 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
var dynamicColumnConfig = new DynamicColumnConfig()
|
var dynamicColumnConfig = new DynamicColumnConfig()
|
||||||
{
|
{
|
||||||
//可读的列表名行索引,不是{{}} 模板行索引
|
//可读的列表名行索引,不是{{}} 模板行索引
|
||||||
AutoColumnTitleRowIndex = 2,
|
AutoColumnTitleRowIndex = 3, //2
|
||||||
AutoColumnStartIndex = 5,
|
AutoColumnStartIndex = 6, //5
|
||||||
TempalteLastColumnIndex = 4,
|
TempalteLastColumnIndex = 5, //4
|
||||||
|
|
||||||
DynamicItemDicName = "TranslateDicName",
|
DynamicItemDicName = "TranslateDicName",
|
||||||
DynamicItemValueName = "QuestionValue",
|
DynamicItemValueName = "QuestionValue",
|
||||||
DynamicItemTitleName = "QuestionName",
|
DynamicItemTitleName = "QuestionName",
|
||||||
@@ -2722,7 +2717,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(AnalysisDynamicCommonExport), criterion.CriterionType, dynamicColumnConfig);
|
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_ClosedXMLAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(AnalysisDynamicCommonExport), criterion.CriterionType, dynamicColumnConfig);
|
||||||
|
|
||||||
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||||
{
|
{
|
||||||
@@ -2867,7 +2862,8 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
if (!criterion.IsArbitrationReading)
|
if (!criterion.IsArbitrationReading)
|
||||||
{
|
{
|
||||||
//仲裁阅片 才有裁判阅片明细表 同时要把模板里面的三列给去掉
|
//仲裁阅片 才有裁判阅片明细表 同时要把模板里面的三列给去掉
|
||||||
removeColumnIndexList = new List<int>() { 6, 7, 8 };
|
//removeColumnIndexList = new List<int>() { 6, 7, 8 };
|
||||||
|
removeColumnIndexList = new List<int>() { 7, 8 ,9};
|
||||||
}
|
}
|
||||||
|
|
||||||
//阅片结果表 和阅片结果明细表 没有肿瘤学的时候需要移除肿瘤学三个字段
|
//阅片结果表 和阅片结果明细表 没有肿瘤学的时候需要移除肿瘤学三个字段
|
||||||
@@ -2876,7 +2872,8 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
{
|
{
|
||||||
if (inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults || inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults)
|
if (inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults || inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults)
|
||||||
{
|
{
|
||||||
removeColumnIndexList = removeColumnIndexList.Union(new List<int>() { 9, 10, 11 }).ToList();
|
//removeColumnIndexList = removeColumnIndexList.Union(new List<int>() { 9, 10, 11 }).ToList();
|
||||||
|
removeColumnIndexList = removeColumnIndexList.Union(new List<int>() { 10, 11, 12 }).ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2933,7 +2930,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
arbitrationRule = criterion.ArbitrationRule,
|
arbitrationRule = criterion.ArbitrationRule,
|
||||||
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
||||||
isEn_Us = _userInfo.IsEn_Us
|
isEn_Us = _userInfo.IsEn_Us
|
||||||
}).ToListAsync();
|
}).AsSplitQuery().ToListAsync();
|
||||||
|
|
||||||
}
|
}
|
||||||
//肿瘤标准 病灶明细表 按照病灶级别 (OCT 暂时不删除,先看是否能覆盖)
|
//肿瘤标准 病灶明细表 按照病灶级别 (OCT 暂时不删除,先看是否能覆盖)
|
||||||
@@ -2952,7 +2949,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
arbitrationRule = criterion.ArbitrationRule,
|
arbitrationRule = criterion.ArbitrationRule,
|
||||||
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
||||||
isEn_Us = _userInfo.IsEn_Us
|
isEn_Us = _userInfo.IsEn_Us
|
||||||
}).ToListAsync();
|
}).AsSplitQuery().ToListAsync();
|
||||||
|
|
||||||
}
|
}
|
||||||
// 非肿瘤标准 包括自定义,以及系统非肿瘤 会配置到表格层级 问题名称是 表格名称_表格子问题名
|
// 非肿瘤标准 包括自定义,以及系统非肿瘤 会配置到表格层级 问题名称是 表格名称_表格子问题名
|
||||||
@@ -2970,7 +2967,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
arbitrationRule = criterion.ArbitrationRule,
|
arbitrationRule = criterion.ArbitrationRule,
|
||||||
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
||||||
isEn_Us = _userInfo.IsEn_Us
|
isEn_Us = _userInfo.IsEn_Us
|
||||||
}).ToListAsync();
|
}).AsSplitQuery().ToListAsync();
|
||||||
|
|
||||||
}
|
}
|
||||||
// CDISC 导出 只管到 外层问题层级 和阅片结果表是保持一致
|
// CDISC 导出 只管到 外层问题层级 和阅片结果表是保持一致
|
||||||
@@ -2988,7 +2985,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
arbitrationRule = criterion.ArbitrationRule,
|
arbitrationRule = criterion.ArbitrationRule,
|
||||||
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
||||||
isEn_Us = _userInfo.IsEn_Us
|
isEn_Us = _userInfo.IsEn_Us
|
||||||
}).ToListAsync();
|
}).AsSplitQuery().ToListAsync();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3000,7 +2997,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
arbitrationRule = criterion.ArbitrationRule,
|
arbitrationRule = criterion.ArbitrationRule,
|
||||||
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
||||||
isEn_Us = _userInfo.IsEn_Us
|
isEn_Us = _userInfo.IsEn_Us
|
||||||
}).ToListAsync();
|
}).AsSplitQuery().ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3358,9 +3355,10 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
|
|
||||||
dynamicColumnConfig = new DynamicColumnConfig()
|
dynamicColumnConfig = new DynamicColumnConfig()
|
||||||
{
|
{
|
||||||
AutoColumnTitleRowIndex = 2,
|
|
||||||
AutoColumnStartIndex = 6,
|
AutoColumnTitleRowIndex = 3, //2
|
||||||
TempalteLastColumnIndex = 11,
|
AutoColumnStartIndex = 7, //6
|
||||||
|
TempalteLastColumnIndex = 12,//11
|
||||||
DynamicItemDicName = "TranslateDicName",
|
DynamicItemDicName = "TranslateDicName",
|
||||||
DynamicItemValueName = "QuestionValue",
|
DynamicItemValueName = "QuestionValue",
|
||||||
DynamicItemTitleName = "QuestionName",
|
DynamicItemTitleName = "QuestionName",
|
||||||
@@ -3458,9 +3456,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
|
|
||||||
dynamicColumnConfig = new DynamicColumnConfig()
|
dynamicColumnConfig = new DynamicColumnConfig()
|
||||||
{
|
{
|
||||||
AutoColumnTitleRowIndex = 1,
|
AutoColumnTitleRowIndex = 2, //1
|
||||||
AutoColumnStartIndex = 6,
|
AutoColumnStartIndex = 7, //6
|
||||||
TempalteLastColumnIndex = 10,
|
TempalteLastColumnIndex = 11, //10
|
||||||
DynamicItemDicName = "TranslateDicName",
|
DynamicItemDicName = "TranslateDicName",
|
||||||
DynamicItemValueName = "QuestionValue",
|
DynamicItemValueName = "QuestionValue",
|
||||||
DynamicItemTitleName = "QuestionName",
|
DynamicItemTitleName = "QuestionName",
|
||||||
@@ -3543,9 +3541,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
|
|
||||||
dynamicColumnConfig = new DynamicColumnConfig()
|
dynamicColumnConfig = new DynamicColumnConfig()
|
||||||
{
|
{
|
||||||
AutoColumnTitleRowIndex = 1,
|
AutoColumnTitleRowIndex = 2, //1
|
||||||
AutoColumnStartIndex = 6,
|
AutoColumnStartIndex = 7, //6
|
||||||
TempalteLastColumnIndex = 15,
|
TempalteLastColumnIndex = 16, //15
|
||||||
DynamicItemDicName = "TranslateDicName",
|
DynamicItemDicName = "TranslateDicName",
|
||||||
DynamicItemValueName = "QuestionValue",
|
DynamicItemValueName = "QuestionValue",
|
||||||
DynamicItemTitleName = "QuestionName",
|
DynamicItemTitleName = "QuestionName",
|
||||||
@@ -3578,9 +3576,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
|
|
||||||
dynamicColumnConfig = new DynamicColumnConfig()
|
dynamicColumnConfig = new DynamicColumnConfig()
|
||||||
{
|
{
|
||||||
AutoColumnTitleRowIndex = 1,
|
AutoColumnTitleRowIndex = 2, //1
|
||||||
AutoColumnStartIndex = 6,
|
AutoColumnStartIndex = 7, //6
|
||||||
TempalteLastColumnIndex = 10,
|
TempalteLastColumnIndex = 11, //10
|
||||||
DynamicItemDicName = "TranslateDicName",
|
DynamicItemDicName = "TranslateDicName",
|
||||||
DynamicItemValueName = "QuestionValue",
|
DynamicItemValueName = "QuestionValue",
|
||||||
DynamicItemTitleName = "QuestionName",
|
DynamicItemTitleName = "QuestionName",
|
||||||
@@ -3650,12 +3648,12 @@ namespace IRaCIS.Core.Application.Service.Common
|
|||||||
|
|
||||||
if (inQuery.ReadingExportType == ExportResult.NoneTumorCDISC)
|
if (inQuery.ReadingExportType == ExportResult.NoneTumorCDISC)
|
||||||
{
|
{
|
||||||
(memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig);
|
(memoryStream, fileName) = await ExcelExportHelper.DataExport_ClosedXMLAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig);
|
(memoryStream, fileName) = await ExcelExportHelper.DataExport_ClosedXMLAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,15 @@
|
|||||||
using DocumentFormat.OpenXml.Spreadsheet;
|
using IRaCIS.Application.Contracts;
|
||||||
using IRaCIS.Application.Contracts;
|
|
||||||
using IRaCIS.Application.Interfaces;
|
using IRaCIS.Application.Interfaces;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using IRaCIS.Core.Infrastructure.Extention;
|
|
||||||
using MassTransit;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using MiniExcelLibs;
|
using MiniExcelLibs;
|
||||||
using MiniExcelLibs.OpenXml;
|
using MiniExcelLibs.OpenXml;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using Org.BouncyCastle.Asn1.X509;
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.Common;
|
namespace IRaCIS.Core.Application.Service.Common;
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +1,9 @@
|
|||||||
using Amazon.Runtime.Internal.Transform;
|
using IRaCIS.Application.Contracts;
|
||||||
using DocumentFormat.OpenXml.Bibliography;
|
|
||||||
using DocumentFormat.OpenXml.Office2010.CustomUI;
|
|
||||||
using DocumentFormat.OpenXml.Office2021.DocumentTasks;
|
|
||||||
using DocumentFormat.OpenXml.Spreadsheet;
|
|
||||||
using IRaCIS.Application.Contracts;
|
|
||||||
using IRaCIS.Application.Interfaces;
|
using IRaCIS.Application.Interfaces;
|
||||||
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using MailKit;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using NetTopologySuite.Triangulate.Tri;
|
|
||||||
using NPOI.OpenXmlFormats.Spreadsheet;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using NPOI.Util;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using static IRaCIS.Core.Application.Service.ExcelExportHelper;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.Common;
|
namespace IRaCIS.Core.Application.Service.Common;
|
||||||
|
|
||||||
|
|||||||
@@ -24,11 +24,26 @@ namespace IRaCIS.Core.Application.Service;
|
|||||||
[ApiExplorerSettings(GroupName = "Common")]
|
[ApiExplorerSettings(GroupName = "Common")]
|
||||||
public class FileUploadRecordService(IRepository<FileUploadRecord> _fileUploadRecordRepository, IRepository<UploadFileSyncRecord> _uploadFileSyncRecordRepository,
|
public class FileUploadRecordService(IRepository<FileUploadRecord> _fileUploadRecordRepository, IRepository<UploadFileSyncRecord> _uploadFileSyncRecordRepository,
|
||||||
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IOptionsMonitor<ObjectStoreServiceOptions> options,
|
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IOptionsMonitor<ObjectStoreServiceOptions> options,
|
||||||
|
IRepository<CommonUploadRecord> _commonUploadRecordRepository,
|
||||||
IFusionCache _fusionCache, IRepository<Trial> _trialRepository, FileSyncQueue _fileSyncQueue) : BaseService, IFileUploadRecordService
|
IFusionCache _fusionCache, IRepository<Trial> _trialRepository, FileSyncQueue _fileSyncQueue) : BaseService, IFileUploadRecordService
|
||||||
{
|
{
|
||||||
|
|
||||||
ObjectStoreServiceOptions ObjectStoreServiceConfig = options.CurrentValue;
|
ObjectStoreServiceOptions ObjectStoreServiceConfig = options.CurrentValue;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上传通用文件记录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="addOrEditCommonUploadRecord"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<IResponseOutput> AddOrUpdateCommonUploadRecord(CommonUploadRecordAddOrEdit addOrEditCommonUploadRecord)
|
||||||
|
{
|
||||||
|
|
||||||
|
var entity = await _commonUploadRecordRepository.InsertOrUpdateAsync(addOrEditCommonUploadRecord, true);
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(entity.Id.ToString());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,44 +1,22 @@
|
|||||||
using Aliyun.OSS;
|
using Aliyun.OSS;
|
||||||
using CommunityToolkit.HighPerformance;
|
using CommunityToolkit.HighPerformance;
|
||||||
using DocumentFormat.OpenXml.EMMA;
|
|
||||||
using DocumentFormat.OpenXml.Office.CustomUI;
|
|
||||||
using DocumentFormat.OpenXml.Office2010.Excel;
|
|
||||||
using DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle;
|
|
||||||
using FellowOakDicom;
|
using FellowOakDicom;
|
||||||
using FellowOakDicom.Imaging;
|
using FellowOakDicom.Imaging;
|
||||||
using FellowOakDicom.Imaging.Render;
|
|
||||||
using FellowOakDicom.IO.Buffer;
|
using FellowOakDicom.IO.Buffer;
|
||||||
using Hangfire.Common;
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.MassTransit.Command;
|
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Medallion.Threading;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using MiniExcelLibs;
|
using MiniExcelLibs;
|
||||||
using NPOI.Util;
|
|
||||||
using Org.BouncyCastle.Utilities.Zlib;
|
|
||||||
using SharpCompress.Common;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using static IRaCIS.Core.Application.Service.TestService;
|
using static IRaCIS.Core.Application.Service.TestService;
|
||||||
using static IRaCIS.Core.Application.Service.TrialImageDownloadService;
|
|
||||||
using static IRaCIS.Core.Domain.Share.StaticData;
|
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
@@ -63,7 +41,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
#region 方式一 有的必须在内存中,不能用这种
|
#region 方式一 有的多帧必须在内存中,不能用这种
|
||||||
//await using var source = await sourceFactory();
|
//await using var source = await sourceFactory();
|
||||||
//// 如果你是从 stream 打开
|
//// 如果你是从 stream 打开
|
||||||
//var dicomFile = await DicomFile.OpenAsync(source);
|
//var dicomFile = await DicomFile.OpenAsync(source);
|
||||||
@@ -242,6 +220,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
var skipCount = 0;
|
var skipCount = 0;
|
||||||
foreach (var downloadVisit in downloadVisits)
|
foreach (var downloadVisit in downloadVisits)
|
||||||
{
|
{
|
||||||
|
visitIndex++;
|
||||||
var downloadInfo = _trialRepository.Where(t => t.Id == trialId).Select(t => new
|
var downloadInfo = _trialRepository.Where(t => t.Id == trialId).Select(t => new
|
||||||
{
|
{
|
||||||
t.ResearchProgramNo,
|
t.ResearchProgramNo,
|
||||||
@@ -347,7 +326,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
{
|
{
|
||||||
var dirDic = new Dictionary<string, string>();
|
var dirDic = new Dictionary<string, string>();
|
||||||
|
|
||||||
var studyFolderName = $"{studyInfo.StudyCode}_{studyInfo.StudyTime:yyyy-MM-dd}_{string.Join('_', studyInfo.SeriesList.Select(t => t.Modality))}";
|
var studyFolderName = $"{studyInfo.StudyCode}_{studyInfo.StudyTime:yyyy-MM-dd}_{string.Join('_', studyInfo.SeriesList.Select(t => t.Modality).Distinct())}";
|
||||||
|
|
||||||
#region DICOMDIR
|
#region DICOMDIR
|
||||||
|
|
||||||
@@ -475,14 +454,14 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
//Log.Logger.Warning($"zip exists={File.Exists(zipPath)} size={new FileInfo(zipPath).Length}");
|
//Log.Logger.Warning($"zip exists={File.Exists(zipPath)} size={new FileInfo(zipPath).Length}");
|
||||||
|
|
||||||
Log.Logger.Warning($"[{visitIndex}] {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}访视打包下载完成:{visitFolderName}");
|
Log.Logger.Warning($"[{visitIndex}] {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 下载完成:{visitFolderName}");
|
||||||
|
|
||||||
DownloadLogger.Write(logFilePath, visitItem.SubjectCode, visitItem.VisitNum, visitItem.VisitName, "Success");
|
DownloadLogger.Write(logFilePath, visitItem.SubjectCode, visitItem.VisitNum, visitItem.VisitName, "Success");
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Log.Logger.Warning($"出现异常{ex}删除压缩包:{visitFolderName}");
|
Log.Logger.Warning($"出现异常{ex}自动删除压缩包:{visitFolderName}");
|
||||||
//如果有异常,删除失败的压缩包
|
//如果有异常,删除失败的压缩包
|
||||||
if (File.Exists(zipPath))
|
if (File.Exists(zipPath))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -131,6 +131,11 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
CreateMap<FileUploadRecord, FileUploadRecordAddOrEdit>().ReverseMap();
|
CreateMap<FileUploadRecord, FileUploadRecordAddOrEdit>().ReverseMap();
|
||||||
|
|
||||||
|
|
||||||
|
CreateMap<CommonUploadRecordAddOrEdit, CommonUploadRecord>().ReverseMap();
|
||||||
|
|
||||||
|
CreateMap<CommonUploadRecord, CommonUploadRecordDto>();
|
||||||
|
|
||||||
|
|
||||||
CreateMap<UploadFileSyncRecord, UploadFileSyncRecordView>()
|
CreateMap<UploadFileSyncRecord, UploadFileSyncRecordView>()
|
||||||
.ForMember(d => d.FileName, u => u.MapFrom(s => s.FileUploadRecord.FileName))
|
.ForMember(d => d.FileName, u => u.MapFrom(s => s.FileUploadRecord.FileName))
|
||||||
.ForMember(d => d.FileType, u => u.MapFrom(s => s.FileUploadRecord.FileType))
|
.ForMember(d => d.FileType, u => u.MapFrom(s => s.FileUploadRecord.FileType))
|
||||||
|
|||||||
@@ -4,26 +4,10 @@
|
|||||||
// 生成时间 2025-03-27 06:13:33Z
|
// 生成时间 2025-03-27 06:13:33Z
|
||||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using IRaCIS.Core.Application.Interfaces;
|
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Infrastructure.Extention;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using IRaCIS.Core.Infra.EFCore;
|
|
||||||
using AutoMapper.Execution;
|
|
||||||
using System.Linq;
|
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using DocumentFormat.OpenXml.Office2010.Excel;
|
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using NPOI.POIFS.Properties;
|
|
||||||
using Org.BouncyCastle.Crypto;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using static Microsoft.Extensions.Logging.EventSource.LoggingEventSource;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using EFCore.BulkExtensions;
|
|
||||||
namespace IRaCIS.Core.Application.Service;
|
namespace IRaCIS.Core.Application.Service;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -80,14 +80,18 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TrialSignDocView : UnionDocumentWithConfirmInfoView
|
public class TriaAndSystemlSignDocView : UnionDocumentWithConfirmInfoView
|
||||||
{
|
{
|
||||||
public string TrialCode { get; set; }
|
public string TrialCode { get; set; }
|
||||||
public string ResearchProgramNo { get; set; }
|
public string ResearchProgramNo { get; set; }
|
||||||
|
|
||||||
public string ExperimentName { get; set; }
|
public string ExperimentName { get; set; }
|
||||||
|
|
||||||
|
public TrialType TrialType { get; set; }
|
||||||
|
|
||||||
|
public bool IsTestUser { get; set; }
|
||||||
|
|
||||||
|
public UserWorkLanguage UserWorkLanguage { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -365,6 +369,8 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
|
|
||||||
public DocLanguageType DocLanguageType { get; set; }
|
public DocLanguageType DocLanguageType { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -216,6 +216,8 @@ namespace IRaCIS.Core.Application.Services
|
|||||||
return ResponseOutput.Result(true);
|
return ResponseOutput.Result(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 下线系统文档
|
/// 下线系统文档
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -5,18 +5,10 @@
|
|||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.MassTransit.Consumer;
|
using IRaCIS.Core.Application.MassTransit.Consumer;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using MassTransit.Mediator;
|
using MassTransit.Mediator;
|
||||||
using Microsoft.AspNetCore.Identity;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Linq.Dynamic.Core;
|
using System.Linq.Dynamic.Core;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Services
|
namespace IRaCIS.Core.Application.Services
|
||||||
@@ -161,7 +153,7 @@ namespace IRaCIS.Core.Application.Services
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<PageOutput<TrialSignDocView>> GetTrialSignDocumentList(TrialDocQuery inQuery)
|
public async Task<PageOutput<TriaAndSystemlSignDocView>> GetTrialSignDocumentList(TrialDocQuery inQuery)
|
||||||
{
|
{
|
||||||
var trialDocQueryable = from trialDoc in _trialDocumentRepository.Where(t => t.IsPublish)
|
var trialDocQueryable = from trialDoc in _trialDocumentRepository.Where(t => t.IsPublish)
|
||||||
.WhereIf(inQuery.TrialId != null, t => t.TrialId == inQuery.TrialId)
|
.WhereIf(inQuery.TrialId != null, t => t.TrialId == inQuery.TrialId)
|
||||||
@@ -172,7 +164,7 @@ namespace IRaCIS.Core.Application.Services
|
|||||||
new { trialUser.IdentityUserId, TrialDocumentId = trialDoc.Id } equals new { IdentityUserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc
|
new { trialUser.IdentityUserId, TrialDocumentId = trialDoc.Id } equals new { IdentityUserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc
|
||||||
|
|
||||||
from confirm in cc.DefaultIfEmpty()
|
from confirm in cc.DefaultIfEmpty()
|
||||||
select new TrialSignDocView()
|
select new TriaAndSystemlSignDocView()
|
||||||
{
|
{
|
||||||
TrialCode = trialDoc.Trial.TrialCode,
|
TrialCode = trialDoc.Trial.TrialCode,
|
||||||
ResearchProgramNo = trialDoc.Trial.ResearchProgramNo,
|
ResearchProgramNo = trialDoc.Trial.ResearchProgramNo,
|
||||||
|
|||||||
@@ -1551,14 +1551,23 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi
|
|||||||
.WhereIf(inQuery.IsReturnRequired != null, t => t.IsReturnRequired == inQuery.IsReturnRequired)
|
.WhereIf(inQuery.IsReturnRequired != null, t => t.IsReturnRequired == inQuery.IsReturnRequired)
|
||||||
.WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)
|
.WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)
|
||||||
.WhereIf(inQuery.IsDistinguishCriteria != null, t => t.IsDistinguishCriteria == inQuery.IsDistinguishCriteria)
|
.WhereIf(inQuery.IsDistinguishCriteria != null, t => t.IsDistinguishCriteria == inQuery.IsDistinguishCriteria)
|
||||||
|
.WhereIf(inQuery.IsDistinguishCriteria == true && trialConfig.IsEnrollementQualificationConfirm == true && trialConfig.IsPDProgressView == false, t => t.IsDistinguishCriteria == true && t.BusinessScenarioEnum == EmailBusinessScenario.EnrollConfirmed)
|
||||||
|
.WhereIf(inQuery.IsDistinguishCriteria == true && trialConfig.IsEnrollementQualificationConfirm == false && trialConfig.IsPDProgressView == true, t => t.IsDistinguishCriteria == true && t.BusinessScenarioEnum == EmailBusinessScenario.PDConfirmed)
|
||||||
|
.WhereIf(inQuery.IsDistinguishCriteria == true && trialConfig.IsEnrollementQualificationConfirm == true && trialConfig.IsPDProgressView == true, t => t.IsDistinguishCriteria == true)
|
||||||
|
.WhereIf(inQuery.IsDistinguishCriteria == true && trialConfig.IsEnrollementQualificationConfirm == false && trialConfig.IsPDProgressView == false, t => t.IsDistinguishCriteria == true && (t.BusinessScenarioEnum != EmailBusinessScenario.EnrollConfirmed && t.BusinessScenarioEnum != EmailBusinessScenario.PDConfirmed))
|
||||||
|
|
||||||
.WhereIf(inQuery.BusinessModuleEnum != null, t => t.BusinessModuleEnum == inQuery.BusinessModuleEnum)
|
.WhereIf(inQuery.BusinessModuleEnum != null, t => t.BusinessModuleEnum == inQuery.BusinessModuleEnum)
|
||||||
.WhereIf(inQuery.EmailUrgentEnum != null, t => t.EmailUrgentEnum == inQuery.EmailUrgentEnum)
|
.WhereIf(inQuery.EmailUrgentEnum != null, t => t.EmailUrgentEnum == inQuery.EmailUrgentEnum)
|
||||||
.WhereIf(inQuery.ToUserType != null, t => t.EmailNoticeUserTypeList.Any(t => t.UserType == inQuery.ToUserType && t.EmailUserType == EmailUserType.To))
|
.WhereIf(inQuery.ToUserType != null, t => t.EmailNoticeUserTypeList.Any(t => t.UserType == inQuery.ToUserType && t.EmailUserType == EmailUserType.To))
|
||||||
.WhereIf(inQuery.CopyUserType != null, t => t.EmailNoticeUserTypeList.Any(t => t.UserType == inQuery.CopyUserType && t.EmailUserType == EmailUserType.Copy))
|
.WhereIf(inQuery.CopyUserType != null, t => t.EmailNoticeUserTypeList.Any(t => t.UserType == inQuery.CopyUserType && t.EmailUserType == EmailUserType.Copy))
|
||||||
.WhereIf(trialConfig.IsEnrollementQualificationConfirm == false, t => t.BusinessModuleEnum != BusinessModule.EligibilityVerification)
|
|
||||||
.WhereIf(trialConfig.IsPDProgressView == false, t => t.BusinessModuleEnum != BusinessModule.PDVerification)
|
.WhereIf(trialConfig.IsEnrollementQualificationConfirm == false && trialConfig.IsPDProgressView == true, t => t.BusinessModuleEnum != BusinessModule.EligibilityVerification)
|
||||||
|
.WhereIf(trialConfig.IsEnrollementQualificationConfirm == true && trialConfig.IsPDProgressView == false, t => t.BusinessModuleEnum != BusinessModule.PDVerification)
|
||||||
|
|
||||||
.WhereIf(trialConfig.IsPDProgressView == false && trialConfig.IsEnrollementQualificationConfirm == false, t => t.BusinessModuleEnum != BusinessModule.PDVerification
|
.WhereIf(trialConfig.IsPDProgressView == false && trialConfig.IsEnrollementQualificationConfirm == false, t => t.BusinessModuleEnum != BusinessModule.PDVerification
|
||||||
&& t.BusinessModuleEnum != BusinessModule.EligibilityVerification)
|
&& t.BusinessModuleEnum != BusinessModule.EligibilityVerification && t.BusinessModuleEnum != BusinessModule.Eligibility_PDVerification)
|
||||||
|
|
||||||
|
|
||||||
.ProjectTo<TrialSelectEmailNoticeConfigView>(_mapper.ConfigurationProvider, new { trialId = inQuery.TrialId });
|
.ProjectTo<TrialSelectEmailNoticeConfigView>(_mapper.ConfigurationProvider, new { trialId = inQuery.TrialId });
|
||||||
|
|
||||||
return await emailNoticeConfigQueryable.ToPagedListAsync(inQuery);
|
return await emailNoticeConfigQueryable.ToPagedListAsync(inQuery);
|
||||||
|
|||||||
@@ -749,6 +749,17 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
public long? FileSize { get; set; }
|
public long? FileSize { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class DownloadFileDto
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
public string Path { get; set; }
|
||||||
|
|
||||||
|
public string FileName { get; set; }
|
||||||
|
|
||||||
|
public string FileType { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class DownloadNoneDicomStudyDto
|
public class DownloadNoneDicomStudyDto
|
||||||
{
|
{
|
||||||
public string Modality { get; set; }
|
public string Modality { get; set; }
|
||||||
@@ -849,9 +860,13 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
public List<TrialKeyPicturePath> QuestionMarkPictureList { get; set; }
|
public List<TrialKeyPicturePath> QuestionMarkPictureList { get; set; }
|
||||||
|
|
||||||
public List<TrialKeyPicturePath> TableQuestionRowPictureList { get; set; }
|
public List<TrialKeyPicturePath> TableQuestionRowPictureList { get; set; }
|
||||||
|
|
||||||
|
public List<TrialKeyPicturePath> SegmentationFileList { get; set; }
|
||||||
}
|
}
|
||||||
public class TrialKeyPicturePath
|
public class TrialKeyPicturePath
|
||||||
{
|
{
|
||||||
|
public string SegmentationName { get; set; }
|
||||||
|
|
||||||
public string PicturePath { get; set; }
|
public string PicturePath { get; set; }
|
||||||
|
|
||||||
public string OtherPicturePath { get; set; }
|
public string OtherPicturePath { get; set; }
|
||||||
@@ -1160,6 +1175,20 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
public List<MaskRegion> MaskRegionList { get; set; }
|
public List<MaskRegion> MaskRegionList { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
public class NoneDicomStudyMaskImageCommand
|
||||||
|
{
|
||||||
|
public Guid? NodicomStudyId { get; set; }
|
||||||
|
public List<Guid>? NoneDicomStudyFileIdList { get; set; }
|
||||||
|
public List<MaskRegion> MaskRegionList { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NoneDicomStudyUndoMaskImageCommand
|
||||||
|
{
|
||||||
|
public Guid? NodicomStudyId { get; set; }
|
||||||
|
|
||||||
|
public List<Guid>? NoneDicomStudyFileIdList { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StudyUndoMaskImageCommand
|
public class StudyUndoMaskImageCommand
|
||||||
|
|||||||
@@ -1,31 +1,18 @@
|
|||||||
using DocumentFormat.OpenXml.EMMA;
|
using FellowOakDicom;
|
||||||
using FellowOakDicom;
|
|
||||||
using FellowOakDicom.Media;
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
|
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
|
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using MassTransit.Initializers;
|
using MassTransit.Initializers;
|
||||||
using MathNet.Numerics;
|
|
||||||
using Medallion.Threading;
|
using Medallion.Threading;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NetTopologySuite.Mathematics;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.IO;
|
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using ZiggyCreatures.Caching.Fusion;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
{
|
{
|
||||||
@@ -71,8 +58,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
{
|
{
|
||||||
//subject 随机阅片 或者无序 有上传 才处理任务编号
|
//subject 随机阅片 或者无序 有上传 才处理任务编号
|
||||||
if (_visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId &&
|
if (_visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId &&
|
||||||
(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom ||
|
(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom
|
||||||
(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.Random && t.TrialReadingCriterion.ImageDownloadEnum != ReadingImageDownload.None))))
|
//||(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.Random && t.TrialReadingCriterion.ImageDownloadEnum != ReadingImageDownload.None)
|
||||||
|
)))
|
||||||
{
|
{
|
||||||
//找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务
|
//找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务
|
||||||
var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.UserRoleId
|
var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.UserRoleId
|
||||||
@@ -131,6 +119,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
var subjectCode = string.Empty;
|
var subjectCode = string.Empty;
|
||||||
var subjectId = inQuery.SubjectId;
|
var subjectId = inQuery.SubjectId;
|
||||||
|
bool? isIRImageDownloaded = true;
|
||||||
|
|
||||||
|
if(inQuery.VisitTaskId != null)
|
||||||
|
{
|
||||||
|
//isIRImageDownloaded= _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => t.IsIRImageDownloaded).FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
if (criterionInfo.IsReadingTaskViewInOrder == ReadingOrder.Random)
|
if (criterionInfo.IsReadingTaskViewInOrder == ReadingOrder.Random)
|
||||||
{
|
{
|
||||||
@@ -224,7 +218,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
var SVlist = await querySV.ToListAsync();
|
var SVlist = await querySV.ToListAsync();
|
||||||
|
|
||||||
return ResponseOutput.Ok(SVlist, new { TrialModality = criterionInfo.Modalitys });
|
return ResponseOutput.Ok(SVlist, new { TrialModality = criterionInfo.Modalitys, IsReadingTaskViewInOrder = criterionInfo.IsReadingTaskViewInOrder });
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -234,7 +228,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
|
|
||||||
var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed
|
var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed
|
||||||
&& t.DoctorUserId == _userInfo.UserRoleId && t.TaskState == TaskState.Effect)
|
/* && t.DoctorUserId == _userInfo.UserRoleId*/ && t.TaskState == TaskState.Effect)
|
||||||
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
||||||
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
||||||
.Select(u => new SubjectImageUploadDTO()
|
.Select(u => new SubjectImageUploadDTO()
|
||||||
@@ -337,7 +331,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return ResponseOutput.Ok(list, new { TrialModality = criterionInfo.Modalitys });
|
return ResponseOutput.Ok(list, new { TrialModality = criterionInfo.Modalitys, IsReadingTaskViewInOrder = criterionInfo.IsReadingTaskViewInOrder, IsIRImageDownloaded= isIRImageDownloaded });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -397,9 +391,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
|
//var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
|
||||||
|
|
||||||
return ResponseOutput.Ok(addEntity.Id);
|
return ResponseOutput.Ok(Guid.NewGuid());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -586,25 +580,25 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
var trialId = incommand.TrialId;
|
var trialId = incommand.TrialId;
|
||||||
|
|
||||||
|
|
||||||
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
|
//var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
|
||||||
studyMonitor.UploadFinishedTime = DateTime.Now;
|
//studyMonitor.UploadFinishedTime = DateTime.Now;
|
||||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
//studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||||
studyMonitor.FailedFileCount = incommand.FailedFileCount;
|
//studyMonitor.FailedFileCount = incommand.FailedFileCount;
|
||||||
studyMonitor.IsSuccess = incommand.FailedFileCount == 0;
|
//studyMonitor.IsSuccess = incommand.FailedFileCount == 0;
|
||||||
studyMonitor.RecordPath = incommand.RecordPath;
|
//studyMonitor.RecordPath = incommand.RecordPath;
|
||||||
studyMonitor.FileSize = incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize);
|
//studyMonitor.FileSize = incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize);
|
||||||
|
|
||||||
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), visiTaskId.ToString());
|
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), visiTaskId.ToString());
|
||||||
var findStudy = await _taskStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
|
var findStudy = await _taskStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
|
||||||
|
|
||||||
|
|
||||||
studyMonitor.StudyId = studyId;
|
//studyMonitor.StudyId = studyId;
|
||||||
studyMonitor.StudyCode = findStudy?.StudyCode ?? "";
|
//studyMonitor.StudyCode = findStudy?.StudyCode ?? "";
|
||||||
|
|
||||||
studyMonitor.IsDicomReUpload = findStudy != null;
|
//studyMonitor.IsDicomReUpload = findStudy != null;
|
||||||
|
|
||||||
//上传
|
//上传
|
||||||
if (studyMonitor.IsDicomReUpload == false)
|
if (findStudy == null)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -646,7 +640,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
await _taskStudyRepository.AddAsync(study);
|
await _taskStudyRepository.AddAsync(study);
|
||||||
|
|
||||||
|
|
||||||
studyMonitor.StudyCode = study.StudyCode;
|
//studyMonitor.StudyCode = study.StudyCode;
|
||||||
|
|
||||||
|
|
||||||
foreach (var seriesItem in incommand.Study.SeriesList)
|
foreach (var seriesItem in incommand.Study.SeriesList)
|
||||||
@@ -695,9 +689,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//重传的时候也要赋值检查Id
|
////重传的时候也要赋值检查Id
|
||||||
studyMonitor.StudyId = findStudy.Id;
|
//studyMonitor.StudyId = findStudy.Id;
|
||||||
studyMonitor.StudyCode = findStudy.StudyCode;
|
//studyMonitor.StudyCode = findStudy.StudyCode;
|
||||||
|
|
||||||
//特殊处理逻辑
|
//特殊处理逻辑
|
||||||
findStudy.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(findStudy.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
|
findStudy.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(findStudy.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
|
||||||
@@ -714,9 +708,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
TaskSeries dicomSeries = await _taskSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
|
TaskSeries dicomSeries = await _taskSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
|
||||||
|
|
||||||
|
var isNewSeries = false;
|
||||||
//判断重复
|
//判断重复
|
||||||
if (dicomSeries == null)
|
if (dicomSeries == null)
|
||||||
{
|
{
|
||||||
|
isNewSeries = true;
|
||||||
|
|
||||||
var series = _mapper.Map<TaskSeries>(seriesItem);
|
var series = _mapper.Map<TaskSeries>(seriesItem);
|
||||||
|
|
||||||
series.Id = seriesId;
|
series.Id = seriesId;
|
||||||
@@ -742,6 +739,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
//找到该序列已经存在的instanceId
|
//找到该序列已经存在的instanceId
|
||||||
var existInstanceIdList = _taskInstanceRepository.Where(t => t.SeriesId == dicomSeries.Id).Select(t => t.Id).ToList();
|
var existInstanceIdList = _taskInstanceRepository.Where(t => t.SeriesId == dicomSeries.Id).Select(t => t.Id).ToList();
|
||||||
|
|
||||||
|
|
||||||
foreach (var instanceItem in seriesItem.InstanceList)
|
foreach (var instanceItem in seriesItem.InstanceList)
|
||||||
{
|
{
|
||||||
var insntance = _mapper.Map<TaskInstance>(instanceItem);
|
var insntance = _mapper.Map<TaskInstance>(instanceItem);
|
||||||
@@ -761,9 +759,20 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
await _taskInstanceRepository.AddAsync(insntance);
|
await _taskInstanceRepository.AddAsync(insntance);
|
||||||
|
|
||||||
|
if (isNewSeries == false)
|
||||||
|
{
|
||||||
dicomSeries.InstanceCount++;
|
dicomSeries.InstanceCount++;
|
||||||
|
}
|
||||||
findStudy.InstanceCount++;
|
findStudy.InstanceCount++;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//更新,需要删除缓存,并更新路径
|
||||||
|
|
||||||
|
await _oSSService.DeleteFromPrefix(insntance.Path, true);
|
||||||
|
|
||||||
|
await _taskInstanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == instanceId, u => new TaskInstance() { Path = insntance.Path });
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
|
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
|
||||||
@@ -911,6 +920,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
var subjectCode = inQuery.SubjectCode;
|
var subjectCode = inQuery.SubjectCode;
|
||||||
var subjectId = inQuery.SubjectId;
|
var subjectId = inQuery.SubjectId;
|
||||||
var doctorUserId = _userInfo.UserRoleId;
|
var doctorUserId = _userInfo.UserRoleId;
|
||||||
|
bool? isIRImageDownloaded = null;
|
||||||
|
|
||||||
if (inQuery.VisitTaskId != null)
|
if (inQuery.VisitTaskId != null)
|
||||||
{
|
{
|
||||||
@@ -922,18 +932,20 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
|
SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
|
||||||
SubjectId = t.SubjectId,
|
SubjectId = t.SubjectId,
|
||||||
t.DoctorUserId,
|
t.DoctorUserId,
|
||||||
t.IsAnalysisCreate
|
t.IsAnalysisCreate,
|
||||||
|
t.IsIRImageDownloaded,
|
||||||
}).FirstNotNullAsync();
|
}).FirstNotNullAsync();
|
||||||
|
|
||||||
subjectId = taskInfo.SubjectId;
|
subjectId = taskInfo.SubjectId;
|
||||||
subjectCode = taskInfo.SubjectCode;
|
subjectCode = taskInfo.SubjectCode;
|
||||||
doctorUserId = (Guid)taskInfo.DoctorUserId!;
|
doctorUserId = (Guid)taskInfo.DoctorUserId!;
|
||||||
|
isIRImageDownloaded = taskInfo.IsIRImageDownloaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
|
var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
|
||||||
.Select(t => new { t.IsImageFilter, t.CriterionType, t.TrialId, t.CriterionModalitys, t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
|
.Select(t => new { t.IsImageFilter, t.CriterionType, t.TrialId, t.CriterionModalitys, t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
|
||||||
|
|
||||||
var config = await _subjectRepository.Where(t => t.Id == subjectId).Select(t => new { t.Trial.ImageFormatList, t.Trial.StudyNameList, t.Trial.IsShowStudyName }).FirstOrDefaultAsync();
|
var config = await _subjectRepository.Where(t => t.Id == subjectId).Select(t => new { t.Trial.ImageFormatList, t.Trial.StudyNameList, t.Trial.IsShowStudyName, IsIRImageDownloaded= isIRImageDownloaded }).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
|
||||||
//靶段标注上传,查看访视级别,上传绑定访视级别
|
//靶段标注上传,查看访视级别,上传绑定访视级别
|
||||||
@@ -1056,7 +1068,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
|
var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
|
||||||
&& t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect)
|
&& t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed /*&& t.DoctorUserId == doctorUserId*/ && t.TaskState == TaskState.Effect)
|
||||||
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
||||||
.WhereIf(info.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
.WhereIf(info.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
||||||
join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId).WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
|
join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId).WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
|
||||||
@@ -1887,10 +1899,15 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="trialImageDownloadId"></param>
|
/// <param name="trialImageDownloadId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<IResponseOutput> DownloadImageSuccess(Guid trialImageDownloadId)
|
public async Task<IResponseOutput> DownloadImageSuccess(Guid trialImageDownloadId, Guid? visitTaskId)
|
||||||
{
|
{
|
||||||
await _trialImageDownloadRepository.UpdatePartialFromQueryAsync(t => t.Id == trialImageDownloadId, u => new TrialImageDownload()
|
await _trialImageDownloadRepository.UpdatePartialFromQueryAsync(t => t.Id == trialImageDownloadId, u => new TrialImageDownload()
|
||||||
{ DownloadEndTime = DateTime.Now, IsSuccess = true }, true);
|
{ DownloadEndTime = DateTime.Now, IsSuccess = true }, true);
|
||||||
|
|
||||||
|
if (visitTaskId != null)
|
||||||
|
{
|
||||||
|
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTaskId.Value, u => new VisitTask() { IsIRImageDownloaded = true });
|
||||||
|
}
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2067,6 +2084,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
TableQuestionRowPictureList = t.LesionList.Select(c => new TrialKeyPicturePath { PicturePath = c.PicturePath, OtherPicturePath = c.OtherPicturePath }).ToList(),
|
TableQuestionRowPictureList = t.LesionList.Select(c => new TrialKeyPicturePath { PicturePath = c.PicturePath, OtherPicturePath = c.OtherPicturePath }).ToList(),
|
||||||
|
|
||||||
|
SegmentationFileList = t.SegmentationList.Select(c => new TrialKeyPicturePath { PicturePath = c.SEGUrl, SegmentationName = c.SegmentationName, OtherPicturePath = string.Empty }).ToList(),
|
||||||
|
|
||||||
Id = t.Id,
|
Id = t.Id,
|
||||||
//裁判选择结果
|
//裁判选择结果
|
||||||
JudgeResultTaskId = t.JudgeVisitTask.JudgeResultTaskId,
|
JudgeResultTaskId = t.JudgeVisitTask.JudgeResultTaskId,
|
||||||
|
|||||||
@@ -3,16 +3,12 @@
|
|||||||
// 生成时间 2021-12-06 10:54:55
|
// 生成时间 2021-12-06 10:54:55
|
||||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
using DocumentFormat.OpenXml.EMMA;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using Medallion.Threading;
|
using Medallion.Threading;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using static ImageHelper;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Contracts
|
namespace IRaCIS.Core.Application.Contracts
|
||||||
{
|
{
|
||||||
@@ -25,11 +21,176 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
IRepository<Trial> _trialRepository,
|
IRepository<Trial> _trialRepository,
|
||||||
IDistributedLockProvider _distributedLockProvider,
|
IDistributedLockProvider _distributedLockProvider,
|
||||||
IRepository<SubjectVisit> _subjectVisitRepository,
|
IRepository<SubjectVisit> _subjectVisitRepository,
|
||||||
IRepository<VisitTask> _visitTaskRepository,
|
IRepository<VisitTask> _visitTaskRepository, IOSSService _oSSService,
|
||||||
QCCommon _qCCommon, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, INoneDicomStudyService
|
QCCommon _qCCommon, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, INoneDicomStudyService
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标注遮盖影像 路径后面加了.MaskNoneDicom_ 就是遮盖的新路径
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<IResponseOutput> NoneDicomStudyMaskImage(NoneDicomStudyMaskImageCommand inCommand)
|
||||||
|
{
|
||||||
|
if (inCommand.NodicomStudyId == null && inCommand.NoneDicomStudyFileIdList == null)
|
||||||
|
{
|
||||||
|
return ResponseOutput.NotOk("NodicomStudyId and NoneDicomStudyFileIdList can not both be null");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var idPathList = new List<DownloadFileDto>();
|
||||||
|
|
||||||
|
if (inCommand.NodicomStudyId == null && inCommand.NoneDicomStudyFileIdList != null)
|
||||||
|
{
|
||||||
|
idPathList = await _noneDicomStudyFileRepository.Where(t => inCommand.NoneDicomStudyFileIdList.Contains(t.Id)).ProjectTo<DownloadFileDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idPathList = await _noneDicomStudyFileRepository.Where(t => inCommand.NodicomStudyId == t.NoneDicomStudyId).ProjectTo<DownloadFileDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var errorList = new List<DownloadFileDto>();
|
||||||
|
|
||||||
|
var okList = new List<DownloadFileDto>();
|
||||||
|
|
||||||
|
var batchId = Guid.NewGuid();
|
||||||
|
|
||||||
|
foreach (var item in idPathList)
|
||||||
|
{
|
||||||
|
var path = item.Path;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
// 1. 下载文件
|
||||||
|
using var inputStream = new MemoryStream();
|
||||||
|
await (await _oSSService.GetStreamFromOSSAsync(path)).CopyToAsync(inputStream);
|
||||||
|
inputStream.Position = 0;
|
||||||
|
|
||||||
|
// 2. 处理图片
|
||||||
|
using var outputStream = new MemoryStream();
|
||||||
|
await ImageMaskHelper.MaskAsync(inputStream, outputStream, inCommand.MaskRegionList);
|
||||||
|
outputStream.Position = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var prefix = path.Substring(1, path.LastIndexOf('/') - 1);
|
||||||
|
|
||||||
|
//每次都用一个新的名字
|
||||||
|
var maskFileName = string.Empty;
|
||||||
|
|
||||||
|
if (path.Contains(".MaskNoneDicom_"))
|
||||||
|
{
|
||||||
|
//清理缓存的里面的遮盖图,多次遮盖同一张图时,清除缓存很重要
|
||||||
|
await _oSSService.DeleteFromPrefix(path, true); //清理缓存的里面的遮盖图,多次遮盖同一张图时,清除缓存很重要
|
||||||
|
|
||||||
|
//本身就是遮盖的图,那么就要要替换guid
|
||||||
|
var length = Guid.Empty.ToString().Length + ".MaskNoneDicom_".Length;
|
||||||
|
|
||||||
|
var restorePath = item.Path[..^length];
|
||||||
|
|
||||||
|
maskFileName = $"{Path.GetFileName(restorePath)}.MaskNoneDicom_{batchId}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//没有遮盖的,直接加上.批次_MaskDicom
|
||||||
|
maskFileName = $"{Path.GetFileName(path)}.MaskNoneDicom_{batchId}";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
await _oSSService.UploadToOSSAsync(outputStream, prefix, maskFileName, false);
|
||||||
|
|
||||||
|
var newPath = $"/{prefix}/{maskFileName}";
|
||||||
|
|
||||||
|
okList.Add(new DownloadFileDto() { Id = item.Id, Path = newPath });
|
||||||
|
|
||||||
|
await _noneDicomStudyFileRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Id, u => new NoneDicomStudyFile() { Path = newPath, IsMasked = true });
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
|
||||||
|
errorList.Add(new DownloadFileDto() { Id = item.Id, Path = path });
|
||||||
|
|
||||||
|
Log.Logger.Error(ex, $"NoneDicomStudyMaskImage Error for NoneDicomStudyFileIdList Path:{path} {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
await _noneDicomStudyFileRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(new { OkList = okList, ErrorList = errorList });
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 撤销遮盖的影像,可以单张,也可以整个检查
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inCommand"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<IResponseOutput> NoneDicomStudyUndoMaskImage(NoneDicomStudyUndoMaskImageCommand inCommand)
|
||||||
|
{
|
||||||
|
if (inCommand.NodicomStudyId == null && inCommand.NoneDicomStudyFileIdList == null)
|
||||||
|
{
|
||||||
|
return ResponseOutput.NotOk("NodicomStudyId and NoneDicomStudyFileIdList can not both be null");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var idPathList = new List<DownloadFileDto>();
|
||||||
|
|
||||||
|
if (inCommand.NodicomStudyId == null && inCommand.NoneDicomStudyFileIdList != null)
|
||||||
|
{
|
||||||
|
idPathList = await _noneDicomStudyFileRepository.Where(t => inCommand.NoneDicomStudyFileIdList.Contains(t.Id)).ProjectTo<DownloadFileDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idPathList = await _noneDicomStudyFileRepository.Where(t => inCommand.NodicomStudyId == t.NoneDicomStudyId).ProjectTo<DownloadFileDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var okList = new List<DownloadFileDto>();
|
||||||
|
|
||||||
|
foreach (var item in idPathList)
|
||||||
|
{
|
||||||
|
if (item.Path.Contains(".MaskNoneDicom_"))
|
||||||
|
{
|
||||||
|
await _oSSService.DeleteFromPrefix(item.Path, true);
|
||||||
|
|
||||||
|
var length = Guid.Empty.ToString().Length + ".MaskNoneDicom_".Length;
|
||||||
|
var newPath = item.Path[..^length];
|
||||||
|
|
||||||
|
okList.Add(new DownloadFileDto() { Id = item.Id, Path = newPath });
|
||||||
|
|
||||||
|
await _noneDicomStudyFileRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Id, u => new NoneDicomStudyFile() { Path = newPath, IsMasked = false });
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (item.Path.EndsWith("."))
|
||||||
|
//{
|
||||||
|
// await _oSSService.DeleteFromPrefix(item.Path, true);
|
||||||
|
|
||||||
|
// var newPath = item.Path[..^1];
|
||||||
|
|
||||||
|
// okList.Add(new InstanceIdPath() { Id = item.Id, Path = newPath });
|
||||||
|
|
||||||
|
// await _dicomInstanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Id, u => new DicomInstance() { Path = newPath, IsMasked = false });
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
await _noneDicomStudyFileRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(new { OkList = okList });
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<IResponseOutput<List<NoneDicomStudyView>>> GetNoneDicomStudyList(
|
public async Task<IResponseOutput<List<NoneDicomStudyView>>> GetNoneDicomStudyList(
|
||||||
|
|||||||
@@ -1,25 +1,16 @@
|
|||||||
using FellowOakDicom;
|
using DocumentFormat.OpenXml.InkML;
|
||||||
|
using FellowOakDicom;
|
||||||
using FellowOakDicom.Imaging;
|
using FellowOakDicom.Imaging;
|
||||||
using FellowOakDicom.IO.Buffer;
|
using FellowOakDicom.IO.Buffer;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
|
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MathNet.Numerics;
|
|
||||||
using Medallion.Threading;
|
using Medallion.Threading;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Components.Forms;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using NetTopologySuite.Algorithm;
|
|
||||||
using SharpCompress.Common;
|
|
||||||
using SkiaSharp;
|
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Drawing;
|
|
||||||
using ZiggyCreatures.Caching.Fusion;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
{
|
{
|
||||||
@@ -77,6 +68,80 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class DeleteImagePathCommand
|
||||||
|
{
|
||||||
|
public string Path { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IResponseOutput> DeleteImageCache(DeleteImagePathCommand incommand)
|
||||||
|
{
|
||||||
|
await _oSSService.DeleteFromPrefix(incommand.Path, true);
|
||||||
|
|
||||||
|
return ResponseOutput.Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IResponseOutput> GetAnonymizeInfo(Guid visitTaskId, Guid? subjectVisitId)
|
||||||
|
{
|
||||||
|
|
||||||
|
Guid svId = Guid.Empty;
|
||||||
|
|
||||||
|
if (subjectVisitId != null)
|
||||||
|
{
|
||||||
|
svId = subjectVisitId.Value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
svId = (Guid)_visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.SourceSubjectVisitId).FirstOrDefault();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 写入dicom 固定的信息,以及组织路径的信息 以及匿名化的信息
|
||||||
|
var otherData = GetSaveToDicomInfo(svId);
|
||||||
|
|
||||||
|
var anonymizeList = _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_systemAnonymizationRepository), TimeSpan.FromDays(7)).Result;
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(new
|
||||||
|
{
|
||||||
|
DicomStoreInfo = otherData,
|
||||||
|
AnonymizeFixedList = anonymizeList.Where(t => t.IsFixed).ToList(),
|
||||||
|
AnonymizeNotFixedList = anonymizeList.Where(t => t.IsFixed == false).ToList()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IResponseOutput> UpdateModality(Guid seriesId, string modality, bool isCRCReplace,
|
||||||
|
[FromServices] IRepository<TaskSeries> _taskSeriesRepository,
|
||||||
|
[FromServices] IRepository<TaskStudy> _taskStudyRepository
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (isCRCReplace)
|
||||||
|
{
|
||||||
|
await _dicomSeriesRepository.BatchUpdateNoTrackingAsync(t => t.Id == seriesId, u => new DicomSeries() { Modality = modality });
|
||||||
|
|
||||||
|
var studyId = _dicomSeriesRepository.Where(t => t.Id == seriesId).Select(t => t.StudyId).FirstOrDefault();
|
||||||
|
|
||||||
|
//处理Modality
|
||||||
|
var seriesModalityList = _dicomStudyRepository.Where(t => t.Id == studyId).SelectMany(u => u.SeriesList.Select(t => t.Modality)).Distinct();
|
||||||
|
string ModaliyStr = string.Join('、', seriesModalityList.ToList());
|
||||||
|
|
||||||
|
await _dicomStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == studyId, u => new DicomStudy() { Modalities = ModaliyStr });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _taskSeriesRepository.BatchUpdateNoTrackingAsync(t => t.Id == seriesId, u => new TaskSeries() { Modality = modality });
|
||||||
|
|
||||||
|
|
||||||
|
var studyId = _taskSeriesRepository.Where(t => t.Id == seriesId).Select(t => t.StudyId).FirstOrDefault();
|
||||||
|
|
||||||
|
//处理Modality
|
||||||
|
var seriesModalityList = _taskStudyRepository.Where(t => t.Id == studyId).SelectMany(u => u.SeriesList.Select(t => t.Modality)).Distinct();
|
||||||
|
string ModaliyStr = string.Join('、', seriesModalityList.ToList());
|
||||||
|
|
||||||
|
await _taskStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == studyId, u => new TaskStudy() { Modalities = ModaliyStr });
|
||||||
|
|
||||||
|
}
|
||||||
|
return ResponseOutput.Ok();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private static async Task<bool> TryWriteMergedDicomAsync(Func<Task<Stream>> sourceFactory, Stream output)
|
private static async Task<bool> TryWriteMergedDicomAsync(Func<Task<Stream>> sourceFactory, Stream output)
|
||||||
{
|
{
|
||||||
@@ -591,9 +656,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
|
//var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
|
||||||
|
|
||||||
return ResponseOutput.Ok(addEntity.Id);
|
return ResponseOutput.Ok(Guid.NewGuid());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -654,20 +719,20 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
{
|
{
|
||||||
var trialId = incommand.TrialId;
|
var trialId = incommand.TrialId;
|
||||||
|
|
||||||
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
|
//var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
|
||||||
studyMonitor.UploadFinishedTime = DateTime.Now;
|
//studyMonitor.UploadFinishedTime = DateTime.Now;
|
||||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
//studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||||
studyMonitor.FailedFileCount = incommand.FailedFileCount;
|
//studyMonitor.FailedFileCount = incommand.FailedFileCount;
|
||||||
studyMonitor.IsSuccess = incommand.FailedFileCount == 0;
|
//studyMonitor.IsSuccess = incommand.FailedFileCount == 0;
|
||||||
studyMonitor.RecordPath = incommand.RecordPath;
|
//studyMonitor.RecordPath = incommand.RecordPath;
|
||||||
studyMonitor.FileSize = incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize);
|
//studyMonitor.FileSize = incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize);
|
||||||
|
|
||||||
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString());
|
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString());
|
||||||
var findStudy = await _dicomStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
|
var findStudy = await _dicomStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
|
||||||
|
|
||||||
studyMonitor.StudyId = studyId;
|
//studyMonitor.StudyId = studyId;
|
||||||
studyMonitor.StudyCode = findStudy?.StudyCode ?? "";
|
//studyMonitor.StudyCode = findStudy?.StudyCode ?? "";
|
||||||
studyMonitor.IsDicomReUpload = findStudy != null;
|
//studyMonitor.IsDicomReUpload = findStudy != null;
|
||||||
|
|
||||||
|
|
||||||
if (incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Count() == 0)
|
if (incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Count() == 0)
|
||||||
@@ -678,7 +743,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
//上传
|
//上传
|
||||||
if (studyMonitor.IsDicomReUpload == false)
|
if ((findStudy != null) == false)
|
||||||
{
|
{
|
||||||
var addStudy = _mapper.Map<DicomStudy>(incommand.Study);
|
var addStudy = _mapper.Map<DicomStudy>(incommand.Study);
|
||||||
|
|
||||||
@@ -723,7 +788,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
studyMonitor.StudyCode = addStudy.StudyCode;
|
//studyMonitor.StudyCode = addStudy.StudyCode;
|
||||||
|
|
||||||
|
|
||||||
foreach (var seriesItem in incommand.Study.SeriesList)
|
foreach (var seriesItem in incommand.Study.SeriesList)
|
||||||
@@ -782,9 +847,14 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
DicomSeries dicomSeries = await _dicomSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
|
DicomSeries dicomSeries = await _dicomSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
|
||||||
|
|
||||||
|
|
||||||
|
var isNewSeries = false;
|
||||||
|
|
||||||
//判断重复
|
//判断重复
|
||||||
if (dicomSeries == null)
|
if (dicomSeries == null)
|
||||||
{
|
{
|
||||||
|
isNewSeries = true;
|
||||||
|
|
||||||
var series = _mapper.Map<DicomSeries>(seriesItem);
|
var series = _mapper.Map<DicomSeries>(seriesItem);
|
||||||
|
|
||||||
series.Id = seriesId;
|
series.Id = seriesId;
|
||||||
@@ -800,16 +870,23 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
//新的序列 那么 检查的序列数量+1
|
//新的序列 那么 检查的序列数量+1
|
||||||
findStudy.SeriesCount += 1;
|
findStudy.SeriesCount += 1;
|
||||||
}
|
}
|
||||||
else
|
//else
|
||||||
{
|
//{
|
||||||
//该序列掉了instance
|
// //该序列掉了instance
|
||||||
dicomSeries.InstanceCount += seriesItem.InstanceList.Count;
|
// dicomSeries.InstanceCount += seriesItem.InstanceList.Count;
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
//找到该序列已经存在的instanceId
|
||||||
|
var existInstanceIdList = _dicomInstanceRepository.Where(t => t.SeriesId == dicomSeries.Id).Select(t => t.Id).ToList();
|
||||||
|
|
||||||
foreach (var instanceItem in seriesItem.InstanceList)
|
foreach (var instanceItem in seriesItem.InstanceList)
|
||||||
{
|
{
|
||||||
var insntance = _mapper.Map<DicomInstance>(instanceItem);
|
var insntance = _mapper.Map<DicomInstance>(instanceItem);
|
||||||
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString());
|
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString());
|
||||||
|
|
||||||
|
if (!existInstanceIdList.Any(t => t == insntance.Id))
|
||||||
|
{
|
||||||
insntance.StudyId = findStudy.Id;
|
insntance.StudyId = findStudy.Id;
|
||||||
insntance.SeriesId = dicomSeries.Id;
|
insntance.SeriesId = dicomSeries.Id;
|
||||||
|
|
||||||
@@ -818,11 +895,28 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
insntance.SubjectVisitId = incommand.SubjectVisitId;
|
insntance.SubjectVisitId = incommand.SubjectVisitId;
|
||||||
|
|
||||||
await _dicomInstanceRepository.AddAsync(insntance);
|
await _dicomInstanceRepository.AddAsync(insntance);
|
||||||
|
|
||||||
|
if (isNewSeries == false)
|
||||||
|
{
|
||||||
|
dicomSeries.InstanceCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
findStudy.InstanceCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//更新,需要删除缓存,并更新路径
|
||||||
|
|
||||||
|
await _oSSService.DeleteFromPrefix(insntance.Path, true);
|
||||||
|
|
||||||
|
await _dicomInstanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == insntance.Id, u => new DicomInstance() { Path = insntance.Path });
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
|
//// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
|
||||||
findStudy.InstanceCount += seriesItem.InstanceList.Count;
|
//findStudy.InstanceCount += seriesItem.InstanceList.Count;
|
||||||
|
|
||||||
|
|
||||||
if (incommand.Study.RadionuclideTotalDose != string.Empty
|
if (incommand.Study.RadionuclideTotalDose != string.Empty
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Interfaces;
|
using IRaCIS.Core.Application.Interfaces;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@@ -13,7 +14,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
/// SystemAnonymizationService
|
/// SystemAnonymizationService
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ApiExplorerSettings(GroupName = "Image")]
|
[ApiExplorerSettings(GroupName = "Image")]
|
||||||
public class SystemAnonymizationService(IRepository<SystemAnonymization> _systemAnonymizationRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ISystemAnonymizationService
|
public class SystemAnonymizationService(IRepository<SystemAnonymization> _systemAnonymizationRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, ISystemAnonymizationService
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -37,6 +38,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var entity = await _systemAnonymizationRepository.InsertOrUpdateAsync(addOrEditSystemAnonymization, true);
|
var entity = await _systemAnonymizationRepository.InsertOrUpdateAsync(addOrEditSystemAnonymization, true);
|
||||||
|
|
||||||
|
await _fusionCache.SetAsync(CacheKeys.SystemAnonymization, CacheHelper.GetSystemAnonymizationListAsync(_systemAnonymizationRepository), TimeSpan.FromDays(7));
|
||||||
|
|
||||||
return ResponseOutput.Ok(entity.Id.ToString());
|
return ResponseOutput.Ok(entity.Id.ToString());
|
||||||
|
|
||||||
|
|||||||
@@ -189,6 +189,11 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
.ForMember(d => d.InstanceId, u => u.MapFrom(s => s.Id));
|
.ForMember(d => d.InstanceId, u => u.MapFrom(s => s.Id));
|
||||||
|
|
||||||
|
|
||||||
|
CreateMap<NoneDicomStudyFile, DownloadFileDto>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -449,6 +449,12 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO
|
|||||||
public List<GetTrialShowInspectionOutDto> Children { get; set; }
|
public List<GetTrialShowInspectionOutDto> Children { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class InspectionDto
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
public string? JsonDetail { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class SetTrialShowInspection
|
public class SetTrialShowInspection
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27,6 +27,39 @@ namespace IRaCIS.Core.Application.Service.Inspection
|
|||||||
IRepository<FrontAuditConfig> _frontAuditConfigRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IInspectionService
|
IRepository<FrontAuditConfig> _frontAuditConfigRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IInspectionService
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据Id获取稽查记录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inDto"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<IResponseOutput> getInspectionById(InspectionDto inDto)
|
||||||
|
{
|
||||||
|
var dataInspection = await _dataInspectionRepository.Where(x=>x.Id==inDto.Id).Select(x=> new InspectionDto()
|
||||||
|
{
|
||||||
|
Id=x.Id,
|
||||||
|
JsonDetail = x.JsonDetail,
|
||||||
|
|
||||||
|
}).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(dataInspection);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置稽查记录JsonDetail
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inDto"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<IResponseOutput> SetJsonDetail(InspectionDto inDto)
|
||||||
|
{
|
||||||
|
await _dataInspectionRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.Id, u => new DataInspection() { JsonDetail = inDto.JsonDetail });
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(inDto);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置项目稽查配置
|
/// 设置项目稽查配置
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -127,9 +160,9 @@ namespace IRaCIS.Core.Application.Service.Inspection
|
|||||||
join trialSign in _trialSignRepository.Where().IgnoreQueryFilters() on data.SignId equals trialSign.Id into trialSigntemp
|
join trialSign in _trialSignRepository.Where().IgnoreQueryFilters() on data.SignId equals trialSign.Id into trialSigntemp
|
||||||
from lefttrialSign in trialSigntemp.DefaultIfEmpty()
|
from lefttrialSign in trialSigntemp.DefaultIfEmpty()
|
||||||
join leftfrontAuditConfig in _frontAuditConfigRepository.Where().Where(x => x.ConfigType == "M" && x.Identification != null && x.IsEnable == true) on
|
join leftfrontAuditConfig in _frontAuditConfigRepository.Where().Where(x => x.ConfigType == "M" && x.Identification != null && x.IsEnable == true) on
|
||||||
data.Identification.ToLower()
|
data.Identification
|
||||||
equals
|
equals
|
||||||
leftfrontAuditConfig.Identification.ToLower()
|
leftfrontAuditConfig.Identification
|
||||||
join moduleTypec in _dictionaryRepository.Where() on new { ModuleType = leftfrontAuditConfig.ModuleTypeId!.Value } equals new { ModuleType = moduleTypec.Id } into moduleTypectemp
|
join moduleTypec in _dictionaryRepository.Where() on new { ModuleType = leftfrontAuditConfig.ModuleTypeId!.Value } equals new { ModuleType = moduleTypec.Id } into moduleTypectemp
|
||||||
from leftmoduleTypec in moduleTypectemp.DefaultIfEmpty()
|
from leftmoduleTypec in moduleTypectemp.DefaultIfEmpty()
|
||||||
join OptTypec in _dictionaryRepository.Where() on new { ModuleType = leftfrontAuditConfig.OptTypeId!.Value } equals new { ModuleType = OptTypec.Id } into optTypetemp
|
join OptTypec in _dictionaryRepository.Where() on new { ModuleType = leftfrontAuditConfig.OptTypeId!.Value } equals new { ModuleType = OptTypec.Id } into optTypetemp
|
||||||
|
|||||||
@@ -103,6 +103,8 @@ namespace IRaCIS.Application.Contracts
|
|||||||
public bool IsZhiZhun { get; set; }
|
public bool IsZhiZhun { get; set; }
|
||||||
public bool IsFirstAdd { get; set; }
|
public bool IsFirstAdd { get; set; }
|
||||||
|
|
||||||
|
public bool IsNeedResetPwd { get; set; }
|
||||||
|
|
||||||
public bool NeedChangePassWord { get; set; } = false;
|
public bool NeedChangePassWord { get; set; } = false;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -168,6 +168,19 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
.Where(t => t.UserTypeId == _userInfo.UserTypeId && (t.Menu.MenuType == "M" || t.Menu.MenuType == "C") && t.Menu.IsEnable)
|
.Where(t => t.UserTypeId == _userInfo.UserTypeId && (t.Menu.MenuType == "M" || t.Menu.MenuType == "C") && t.Menu.IsEnable)
|
||||||
.ProjectTo<MenuTreeNode>(_mapper.ConfigurationProvider).ToListAsync();
|
.ProjectTo<MenuTreeNode>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
|
||||||
|
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA)
|
||||||
|
{
|
||||||
|
var otherGuid = new List<Guid>() { Guid.Parse("41d2bcbe-4ae2-4158-856e-08da0661d17d"), Guid.Parse("5acebe02-99de-4e39-f090-08da0c7fe82c") };
|
||||||
|
|
||||||
|
var otherlist = await _userTypeMenuRepository
|
||||||
|
.Where(t => otherGuid.Contains(t.MenuId) && (t.Menu.MenuType == "M" || t.Menu.MenuType == "C") && t.Menu.IsEnable)
|
||||||
|
.ProjectTo<MenuTreeNode>(_mapper.ConfigurationProvider).Distinct().ToListAsync();
|
||||||
|
|
||||||
|
menuFunctionlist.AddRange(otherlist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
var list = menuFunctionlist!.ToTree((root, child) => child!.ParentId == Guid.Empty,
|
var list = menuFunctionlist!.ToTree((root, child) => child!.ParentId == Guid.Empty,
|
||||||
(root, child) => child!.ParentId == root!.MenuId,
|
(root, child) => child!.ParentId == root!.MenuId,
|
||||||
(child, datalist) =>
|
(child, datalist) =>
|
||||||
|
|||||||
@@ -263,6 +263,8 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
IsFirstAdd = false,
|
IsFirstAdd = false,
|
||||||
|
|
||||||
|
IsNeedResetPwd = false,
|
||||||
|
|
||||||
EmailToken = String.Empty
|
EmailToken = String.Empty
|
||||||
|
|
||||||
}, true);
|
}, true);
|
||||||
@@ -301,7 +303,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
await _identityUserRepository.UpdatePartialFromQueryAsync(t => t.Id == identityUserId, u => new IdentityUser()
|
await _identityUserRepository.UpdatePartialFromQueryAsync(t => t.Id == identityUserId, u => new IdentityUser()
|
||||||
{
|
{
|
||||||
Password = MD5Helper.Md5(pwd),
|
Password = MD5Helper.Md5(pwd),
|
||||||
IsFirstAdd = true
|
IsNeedResetPwd = true
|
||||||
});
|
});
|
||||||
|
|
||||||
var userName = _identityUserRepository.Where(t => t.Id == identityUserId).Select(t => t.UserName).FirstOrDefault();
|
var userName = _identityUserRepository.Where(t => t.Id == identityUserId).Select(t => t.UserName).FirstOrDefault();
|
||||||
@@ -489,7 +491,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
{
|
{
|
||||||
Password = editPwModel.NewPassWord,
|
Password = editPwModel.NewPassWord,
|
||||||
LastChangePassWordTime = DateTime.Now,
|
LastChangePassWordTime = DateTime.Now,
|
||||||
IsFirstAdd = false
|
IsNeedResetPwd = false
|
||||||
});
|
});
|
||||||
|
|
||||||
await _userPassWordLogRepository.AddAsync(new UserPassWordLog()
|
await _userPassWordLogRepository.AddAsync(new UserPassWordLog()
|
||||||
|
|||||||
+1
-9
@@ -1,16 +1,8 @@
|
|||||||
using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing;
|
using IRaCIS.Application.Contracts;
|
||||||
using IRaCIS.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Service.DTO;
|
using IRaCIS.Core.Application.Service.DTO;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using NPOI.HPSF;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,137 +1,137 @@
|
|||||||
using IRaCIS.Core.Application.Helper;
|
//using IRaCIS.Core.Application.Helper;
|
||||||
using MassTransit;
|
//using MassTransit;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
//using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Builder;
|
//using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
//using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Http;
|
//using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
//using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.StaticFiles;
|
//using Microsoft.AspNetCore.StaticFiles;
|
||||||
using RestSharp;
|
//using RestSharp;
|
||||||
using SharpCompress.Common;
|
//using SharpCompress.Common;
|
||||||
using System;
|
//using System;
|
||||||
using System.Collections.Generic;
|
//using System.Collections.Generic;
|
||||||
using System.Linq;
|
//using System.Linq;
|
||||||
using System.Text;
|
//using System.Text;
|
||||||
using System.Threading.Tasks;
|
//using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.MinimalApiService
|
//namespace IRaCIS.Core.Application.Service.MinimalApiService
|
||||||
{
|
//{
|
||||||
/// <summary>
|
// /// <summary>
|
||||||
/// 上传文件转PDF 或者给url 这边下载然后转PDF
|
// /// 上传文件转PDF 或者给url 这边下载然后转PDF
|
||||||
///
|
// ///
|
||||||
/// </summary>
|
// /// </summary>
|
||||||
/// <param name="_hostEnvironment"></param>
|
// /// <param name="_hostEnvironment"></param>
|
||||||
[ApiExplorerSettings(GroupName = "Institution")]
|
// [ApiExplorerSettings(GroupName = "Institution")]
|
||||||
public class FileToPDFService(IWebHostEnvironment _hostEnvironment) : ServiceBase
|
// public class FileToPDFService(IWebHostEnvironment _hostEnvironment) : ServiceBase
|
||||||
{
|
// {
|
||||||
|
|
||||||
[AllowAnonymous]
|
// [AllowAnonymous]
|
||||||
[RoutePattern(HttpMethod = "Post")]
|
// [RoutePattern(HttpMethod = "Post")]
|
||||||
public async Task<IResult> UploadFileAsync([FromForm] IFormFile file)
|
// public async Task<IResult> UploadFileAsync([FromForm] IFormFile file)
|
||||||
{
|
// {
|
||||||
var tempFileName = NewId.NextGuid() + file.FileName;
|
// var tempFileName = NewId.NextGuid() + file.FileName;
|
||||||
var tempPDFName = Path.GetFileNameWithoutExtension(tempFileName) + ".pdf";
|
// var tempPDFName = Path.GetFileNameWithoutExtension(tempFileName) + ".pdf";
|
||||||
|
|
||||||
|
|
||||||
// 获取wwwroot目录
|
// // 获取wwwroot目录
|
||||||
var wwwRootPath = Path.Combine(FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment), "temp");
|
// var wwwRootPath = Path.Combine(FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment), "temp");
|
||||||
|
|
||||||
// 检查wwwroot/temp目录是否存在,不存在则创建
|
// // 检查wwwroot/temp目录是否存在,不存在则创建
|
||||||
if (!Directory.Exists(wwwRootPath))
|
// if (!Directory.Exists(wwwRootPath))
|
||||||
{
|
// {
|
||||||
Directory.CreateDirectory(wwwRootPath);
|
// Directory.CreateDirectory(wwwRootPath);
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 文件保存路径
|
// // 文件保存路径
|
||||||
var pdfFilePath = Path.Combine(wwwRootPath, tempPDFName);
|
// var pdfFilePath = Path.Combine(wwwRootPath, tempPDFName);
|
||||||
var tempFilePath = Path.Combine(wwwRootPath, tempFileName);
|
// var tempFilePath = Path.Combine(wwwRootPath, tempFileName);
|
||||||
|
|
||||||
|
|
||||||
using var stream = File.OpenWrite(tempFilePath);
|
// using var stream = File.OpenWrite(tempFilePath);
|
||||||
await file.CopyToAsync(stream);
|
// await file.CopyToAsync(stream);
|
||||||
|
|
||||||
FileConvertHelper.ConvertWordToPdf(tempFilePath, Path.GetDirectoryName(pdfFilePath));
|
// FileConvertHelper.ConvertWordToPdf(tempFilePath, Path.GetDirectoryName(pdfFilePath));
|
||||||
|
|
||||||
var fileBytes = await File.ReadAllBytesAsync(pdfFilePath);
|
// var fileBytes = await File.ReadAllBytesAsync(pdfFilePath);
|
||||||
|
|
||||||
// 清理临时上传的文件和pdf
|
// // 清理临时上传的文件和pdf
|
||||||
if (File.Exists(pdfFilePath))
|
// if (File.Exists(pdfFilePath))
|
||||||
{
|
// {
|
||||||
File.Delete(pdfFilePath);
|
// File.Delete(pdfFilePath);
|
||||||
}
|
// }
|
||||||
if (File.Exists(tempFilePath))
|
// if (File.Exists(tempFilePath))
|
||||||
{
|
// {
|
||||||
File.Delete(tempFilePath);
|
// File.Delete(tempFilePath);
|
||||||
}
|
// }
|
||||||
|
|
||||||
new FileExtensionContentTypeProvider().Mappings.TryGetValue(Path.GetExtension(tempPDFName), out var contentType);
|
// new FileExtensionContentTypeProvider().Mappings.TryGetValue(Path.GetExtension(tempPDFName), out var contentType);
|
||||||
|
|
||||||
return Results.File(fileBytes, contentType);
|
// return Results.File(fileBytes, contentType);
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
public async Task<IResult> GetPDFFileAsync(string fileUrl)
|
// public async Task<IResult> GetPDFFileAsync(string fileUrl)
|
||||||
{
|
// {
|
||||||
var tempFileName = NewId.NextGuid() + Path.GetFileName(fileUrl);
|
// var tempFileName = NewId.NextGuid() + Path.GetFileName(fileUrl);
|
||||||
var tempPDFName = Path.GetFileNameWithoutExtension(tempFileName) + ".pdf";
|
// var tempPDFName = Path.GetFileNameWithoutExtension(tempFileName) + ".pdf";
|
||||||
|
|
||||||
|
|
||||||
// 获取wwwroot目录
|
// // 获取wwwroot目录
|
||||||
var wwwRootPath = Path.Combine(FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment), "temp");
|
// var wwwRootPath = Path.Combine(FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment), "temp");
|
||||||
|
|
||||||
// 检查wwwroot/temp目录是否存在,不存在则创建
|
// // 检查wwwroot/temp目录是否存在,不存在则创建
|
||||||
if (!Directory.Exists(wwwRootPath))
|
// if (!Directory.Exists(wwwRootPath))
|
||||||
{
|
// {
|
||||||
Directory.CreateDirectory(wwwRootPath);
|
// Directory.CreateDirectory(wwwRootPath);
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 文件保存路径
|
// // 文件保存路径
|
||||||
var pdfFilePath = Path.Combine(wwwRootPath, tempPDFName);
|
// var pdfFilePath = Path.Combine(wwwRootPath, tempPDFName);
|
||||||
var tempFilePath = Path.Combine(wwwRootPath, tempFileName);
|
// var tempFilePath = Path.Combine(wwwRootPath, tempFileName);
|
||||||
|
|
||||||
|
|
||||||
//请求url获取文件
|
// //请求url获取文件
|
||||||
var client = new RestClient(fileUrl);
|
// var client = new RestClient(fileUrl);
|
||||||
|
|
||||||
var request = new RestRequest(fileUrl, Method.Get);
|
// var request = new RestRequest(fileUrl, Method.Get);
|
||||||
|
|
||||||
var response = await client.ExecuteAsync(request);
|
// var response = await client.ExecuteAsync(request);
|
||||||
|
|
||||||
// 检查响应是否成功
|
// // 检查响应是否成功
|
||||||
if (response.IsSuccessful)
|
// if (response.IsSuccessful)
|
||||||
{
|
// {
|
||||||
// 将响应内容写入到本地文件
|
// // 将响应内容写入到本地文件
|
||||||
await File.WriteAllBytesAsync(tempFilePath, response.RawBytes);
|
// await File.WriteAllBytesAsync(tempFilePath, response.RawBytes);
|
||||||
|
|
||||||
FileConvertHelper.ConvertWordToPdf(tempFilePath, Path.GetDirectoryName(pdfFilePath));
|
// FileConvertHelper.ConvertWordToPdf(tempFilePath, Path.GetDirectoryName(pdfFilePath));
|
||||||
|
|
||||||
var fileBytes = await File.ReadAllBytesAsync(pdfFilePath);
|
// var fileBytes = await File.ReadAllBytesAsync(pdfFilePath);
|
||||||
|
|
||||||
// 清理临时上传的文件和pdf
|
// // 清理临时上传的文件和pdf
|
||||||
if (File.Exists(pdfFilePath))
|
// if (File.Exists(pdfFilePath))
|
||||||
{
|
// {
|
||||||
File.Delete(pdfFilePath);
|
// File.Delete(pdfFilePath);
|
||||||
}
|
// }
|
||||||
if (File.Exists(tempFilePath))
|
// if (File.Exists(tempFilePath))
|
||||||
{
|
// {
|
||||||
File.Delete(tempFilePath);
|
// File.Delete(tempFilePath);
|
||||||
}
|
// }
|
||||||
|
|
||||||
new FileExtensionContentTypeProvider().Mappings.TryGetValue(Path.GetExtension(tempPDFName), out var contentType);
|
// new FileExtensionContentTypeProvider().Mappings.TryGetValue(Path.GetExtension(tempPDFName), out var contentType);
|
||||||
|
|
||||||
return Results.File(fileBytes, contentType);
|
// return Results.File(fileBytes, contentType);
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
Console.WriteLine($"下载文件失败: {response.ErrorMessage}");
|
// Console.WriteLine($"下载文件失败: {response.ErrorMessage}");
|
||||||
|
|
||||||
return Results.Problem("下载文件失败", statusCode: StatusCodes.Status500InternalServerError);
|
// return Results.Problem("下载文件失败", statusCode: StatusCodes.Status500InternalServerError);
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using Azure.Core;
|
using IdentityModel.Client;
|
||||||
using IdentityModel;
|
|
||||||
using IdentityModel.Client;
|
|
||||||
using IRaCIS.Core.Application.Service.OAuth;
|
using IRaCIS.Core.Application.Service.OAuth;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
@@ -8,18 +6,11 @@ using Microsoft.AspNetCore.Builder;
|
|||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using Org.BouncyCastle.Utilities.Net;
|
|
||||||
using RestSharp;
|
using RestSharp;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,10 @@
|
|||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts.DTO;
|
using IRaCIS.Core.Application.Contracts.DTO;
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using IRaCIS.Core.Infrastructure.Extention;
|
|
||||||
using MassTransit.Initializers;
|
using MassTransit.Initializers;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Image.QA
|
namespace IRaCIS.Core.Application.Image.QA
|
||||||
{
|
{
|
||||||
@@ -45,8 +40,10 @@ namespace IRaCIS.Core.Application.Image.QA
|
|||||||
public async Task<IResponseOutput<PageOutput<ImageBackViewModel>>> GetImageBackList(ImageBackQueryDto inQuery)
|
public async Task<IResponseOutput<PageOutput<ImageBackViewModel>>> GetImageBackList(ImageBackQueryDto inQuery)
|
||||||
{
|
{
|
||||||
var svExpression = QCCommon.GetSubjectVisitImageBackRecordFilter(inQuery.VisitPlanArray);
|
var svExpression = QCCommon.GetSubjectVisitImageBackRecordFilter(inQuery.VisitPlanArray);
|
||||||
|
var isCRC = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA;
|
||||||
|
|
||||||
var query = _subjectVisitImageBackRecordReposiotry.Where(t => t.SubjectVisit.TrialId == inQuery.TrialId)
|
var query = _subjectVisitImageBackRecordReposiotry.Where(t => t.SubjectVisit.TrialId == inQuery.TrialId)
|
||||||
|
.WhereIf(isCRC == true, t => t.SubjectVisit.Trial.TrialSiteUserList.Any(t => t.UserId == _userInfo.UserRoleId))
|
||||||
.WhereIf(inQuery.TrialSiteId != null, t => t.SubjectVisit.TrialSiteId == inQuery.TrialSiteId)
|
.WhereIf(inQuery.TrialSiteId != null, t => t.SubjectVisit.TrialSiteId == inQuery.TrialSiteId)
|
||||||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.SubjectVisit.Subject.Code.Contains(inQuery.SubjectCode))
|
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.SubjectVisit.Subject.Code.Contains(inQuery.SubjectCode))
|
||||||
.WhereIf(!string.IsNullOrEmpty(inQuery.VisitName), t => t.SubjectVisit.VisitName.Contains(inQuery.VisitName))
|
.WhereIf(!string.IsNullOrEmpty(inQuery.VisitName), t => t.SubjectVisit.VisitName.Contains(inQuery.VisitName))
|
||||||
@@ -458,6 +455,15 @@ namespace IRaCIS.Core.Application.Image.QA
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var isFilterIVUSNoneDicom = false;
|
||||||
|
//ivus-在访视的时候visitTaskId==null 需要过滤掉空检查 ,但是在靶段标注的查看访视级别的时候不能过滤
|
||||||
|
if (_subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.Trial.TrialReadingCriterionList)
|
||||||
|
.Where(t => (t.CriterionType == CriterionType.IVUS || t.CriterionType == CriterionType.OCT) && t.IsConfirm).Distinct().Count() == 2
|
||||||
|
)
|
||||||
|
{
|
||||||
|
isFilterIVUSNoneDicom = true;
|
||||||
|
}
|
||||||
|
|
||||||
return new TrialVisitQADTO
|
return new TrialVisitQADTO
|
||||||
{
|
{
|
||||||
IsSupportQCDownloadImage = isSupportQCImageDownload,
|
IsSupportQCDownloadImage = isSupportQCImageDownload,
|
||||||
@@ -470,7 +476,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|||||||
ExistsManual = (await _IReadingImageTaskService.GetManualList(new GetManualListInDto() { TrialId = sv.TrialId })).Count() > 0,
|
ExistsManual = (await _IReadingImageTaskService.GetManualList(new GetManualListInDto() { TrialId = sv.TrialId })).Count() > 0,
|
||||||
SeriesList = temp.SeriesList,
|
SeriesList = temp.SeriesList,
|
||||||
RelationInfo = await GetVisitQCSubjectInfo(subjectVisitId),
|
RelationInfo = await GetVisitQCSubjectInfo(subjectVisitId),
|
||||||
NoneDicomStudyList = await _noneDicomStudyRepository.Where(t => t.SubjectVisitId == subjectVisitId, ignoreQueryFilters: true).ProjectTo<NoneDicomStudyView>(_mapper.ConfigurationProvider).ToListAsync(),
|
NoneDicomStudyList = await _noneDicomStudyRepository.Where(t => t.SubjectVisitId == subjectVisitId, ignoreQueryFilters: true).Where(t => isFilterIVUSNoneDicom ? t.Modality != "IVUS" : true).ProjectTo<NoneDicomStudyView>(_mapper.ConfigurationProvider).ToListAsync(),
|
||||||
SubjectClinicalData = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId)
|
SubjectClinicalData = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId)
|
||||||
.ProjectTo<SubjectClinicalDataDto>(_mapper.ConfigurationProvider, new { subjectVisitId = subjectVisitId, token = _userInfo.UserToken }).FirstOrDefaultAsync()
|
.ProjectTo<SubjectClinicalDataDto>(_mapper.ConfigurationProvider, new { subjectVisitId = subjectVisitId, token = _userInfo.UserToken }).FirstOrDefaultAsync()
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,14 +1,8 @@
|
|||||||
using AutoMapper;
|
using AutoMapper.EquivalencyExpression;
|
||||||
using AutoMapper.EquivalencyExpression;
|
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts.DTO;
|
using IRaCIS.Core.Application.Contracts.DTO;
|
||||||
using IRaCIS.Core.Application.MassTransit.Command;
|
using IRaCIS.Core.Application.MassTransit.Command;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Migrations;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -238,6 +238,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||||||
return this.Emm - this.Lumen;
|
return this.Emm - this.Lumen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 斑块破裂
|
||||||
|
/// </summary>
|
||||||
|
public string PlaqueRupture { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TemplateData
|
public class TemplateData
|
||||||
@@ -300,6 +305,16 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal? LipidAngle { get; set; }
|
public decimal? LipidAngle { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 斑块破裂
|
||||||
|
/// </summary>
|
||||||
|
public string PlaqueRupture { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 斑块愈合
|
||||||
|
/// </summary>
|
||||||
|
public string PlaqueHealing { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public decimal? Avg
|
public decimal? Avg
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||||||
|
|
||||||
public class GetReadingReportEvaluationOutDto
|
public class GetReadingReportEvaluationOutDto
|
||||||
{
|
{
|
||||||
|
public Guid? VisitTaskId { get; set; }
|
||||||
|
|
||||||
public object ReportCalculateResult { get; set; }
|
public object ReportCalculateResult { get; set; }
|
||||||
|
|
||||||
@@ -452,6 +453,58 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||||||
public List<AdditionalQuestionAnswer> AnswerList { get; set; } = new List<AdditionalQuestionAnswer>();
|
public List<AdditionalQuestionAnswer> AnswerList { get; set; } = new List<AdditionalQuestionAnswer>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class GetMarkListInDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 任务Id
|
||||||
|
/// </summary>
|
||||||
|
public Guid VisitTaskId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MarkListInfo
|
||||||
|
{
|
||||||
|
public string MeasureData { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public string PicturePath { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public Guid? InstanceId { get; set; }
|
||||||
|
|
||||||
|
public Guid? SeriesId { get; set; }
|
||||||
|
public Guid? StudyId { get; set; }
|
||||||
|
|
||||||
|
public string MarkName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public string StudyInstanceUid { get; set; }
|
||||||
|
public string SopInstanceUid { get; set; }
|
||||||
|
|
||||||
|
public int NumberOfFrames { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NoneDicomMarkInfo
|
||||||
|
{
|
||||||
|
|
||||||
|
public Guid? StudyId { get; set; }
|
||||||
|
|
||||||
|
public Guid? NoneDicomFileId { get; set; }
|
||||||
|
|
||||||
|
public string Path { get; set; }
|
||||||
|
public string PicturePath { get; set; } = string.Empty;
|
||||||
|
public string MeasureData { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public string MarkTool { get; set; }
|
||||||
|
|
||||||
|
public string MarkName { get; set; }
|
||||||
|
|
||||||
|
public string FileName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标记的唯一标识符
|
||||||
|
/// </summary>
|
||||||
|
public Guid? MarkId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class GetCustomTagInDto
|
public class GetCustomTagInDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -544,6 +597,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||||||
public string Value { get; set; }
|
public string Value { get; set; }
|
||||||
|
|
||||||
public string DictionaryCode { get; set; }
|
public string DictionaryCode { get; set; }
|
||||||
|
|
||||||
|
public bool IsHighlight { get; set; } = false;
|
||||||
|
|
||||||
|
public Guid? VisitTaskId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ChartItem
|
public class ChartItem
|
||||||
@@ -1489,6 +1546,20 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||||||
public QuestionClassify? QuestionClassify { get; set; }
|
public QuestionClassify? QuestionClassify { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class GetFilterTableQuestionInDto
|
||||||
|
{
|
||||||
|
public Guid TrialId { get; set; }
|
||||||
|
|
||||||
|
public Guid VisitTaskId { get; set; }
|
||||||
|
|
||||||
|
public Guid QuestionId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 问题分类
|
||||||
|
/// </summary>
|
||||||
|
public QuestionClassify? QuestionClassify { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
public class GetHistoryGlobalInfoOutDto
|
public class GetHistoryGlobalInfoOutDto
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1002,6 +1002,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ImageTool { get; set; } = string.Empty;
|
public string ImageTool { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 新增修改类型
|
||||||
|
/// </summary>
|
||||||
|
public AddDeleteType AddDeleteTypeEnum { get; set; } = AddDeleteType.Arbitrium;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 影像工具属性
|
/// 影像工具属性
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2483,6 +2488,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ImageTool { get; set; } = string.Empty;
|
public string ImageTool { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 新增修改类型
|
||||||
|
/// </summary>
|
||||||
|
public AddDeleteType AddDeleteTypeEnum { get; set; } = AddDeleteType.Arbitrium;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 影像工具属性
|
/// 影像工具属性
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
+10
-8
@@ -1,16 +1,12 @@
|
|||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.Interfaces;
|
using IRaCIS.Core.Application.Interfaces;
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using Panda.DynamicWebApi.Attributes;
|
using Panda.DynamicWebApi.Attributes;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -914,7 +910,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<GetIRMedicalFeedbackListOutDto> GetNextIRMedicalFeedback(GetNextIRMedicalFeedbackInDto inDto)
|
public async Task<GetIRMedicalFeedbackListOutDto> GetNextIRMedicalFeedback(GetNextIRMedicalFeedbackInDto inDto)
|
||||||
{
|
{
|
||||||
var list = await GetIRMedicalFeedbackList(new GetIRMedicalFeedbackListInDto()
|
var responseOutput = await GetIRMedicalFeedbackList(new GetIRMedicalFeedbackListInDto()
|
||||||
{
|
{
|
||||||
TrialId = inDto.TrialId,
|
TrialId = inDto.TrialId,
|
||||||
TrialReadingCriterionId = inDto.TrialReadingCriterionId,
|
TrialReadingCriterionId = inDto.TrialReadingCriterionId,
|
||||||
@@ -923,6 +919,8 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
PageSize = 99999,
|
PageSize = 99999,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var list = responseOutput.Data;
|
||||||
|
|
||||||
var index = list.CurrentPageData.ToList().FindIndex(x => x.Id == inDto.TaskMedicalReviewId);
|
var index = list.CurrentPageData.ToList().FindIndex(x => x.Id == inDto.TaskMedicalReviewId);
|
||||||
|
|
||||||
var result = new GetIRMedicalFeedbackListOutDto() { };
|
var result = new GetIRMedicalFeedbackListOutDto() { };
|
||||||
@@ -953,12 +951,12 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
/// <param name="inDto"></param>
|
/// <param name="inDto"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<PageOutput<GetIRMedicalFeedbackListOutDto>> GetIRMedicalFeedbackList(GetIRMedicalFeedbackListInDto inDto)
|
public async Task<IResponseOutput<PageOutput<GetIRMedicalFeedbackListOutDto>>> GetIRMedicalFeedbackList(GetIRMedicalFeedbackListInDto inDto)
|
||||||
{
|
{
|
||||||
var taskMedicalReviewquery = _taskMedicalReviewRepository.Where(x => x.TrialId == inDto.TrialId).Include(x => x.VisitTask)
|
var taskMedicalReviewquery = _taskMedicalReviewRepository.Where(x => x.TrialId == inDto.TrialId).Include(x => x.VisitTask)
|
||||||
.Where(x => x.VisitTask.DoctorUserId == _userInfo.UserRoleId)
|
.Where(x => x.VisitTask.DoctorUserId == _userInfo.UserRoleId)
|
||||||
.Where(x => x.IsHaveQuestion)
|
.Where(x => x.IsHaveQuestion)
|
||||||
.WhereIf(!inDto.TaskBlindName.IsNullOrEmpty(), x => x.VisitTask.TaskBlindName == inDto.TaskBlindName)
|
.WhereIf(!inDto.TaskBlindName.IsNullOrEmpty(), x => x.VisitTask.TaskBlindName.Contains(inDto.TaskBlindName))
|
||||||
.WhereIf(inDto.SubjectId != null, x => x.VisitTask.SubjectId == inDto.SubjectId!)
|
.WhereIf(inDto.SubjectId != null, x => x.VisitTask.SubjectId == inDto.SubjectId!)
|
||||||
.WhereIf(inDto.IsUrgent != null, x => x.VisitTask.IsUrgent == inDto.IsUrgent!)
|
.WhereIf(inDto.IsUrgent != null, x => x.VisitTask.IsUrgent == inDto.IsUrgent!)
|
||||||
.WhereIf(inDto.AuditState != null, x => x.AuditState == inDto.AuditState!)
|
.WhereIf(inDto.AuditState != null, x => x.AuditState == inDto.AuditState!)
|
||||||
@@ -1008,7 +1006,11 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var result = await taskMedicalReviewquery.ToPagedListAsync(inDto, nameof(GetIRMedicalFeedbackListOutDto.AuditState));
|
var result = await taskMedicalReviewquery.ToPagedListAsync(inDto, nameof(GetIRMedicalFeedbackListOutDto.AuditState));
|
||||||
|
|
||||||
return result;
|
var criterionInfo = await _readingQuestionCriterionTrial.Where(t => t.Id == inDto.TrialReadingCriterionId)
|
||||||
|
.Select(t => new { t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(result, criterionInfo);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+156
-30
@@ -1,31 +1,21 @@
|
|||||||
using Amazon.Runtime.Internal.Transform;
|
using DocumentFormat.OpenXml;
|
||||||
using DocumentFormat.OpenXml;
|
|
||||||
using DocumentFormat.OpenXml.Drawing.Charts;
|
|
||||||
using DocumentFormat.OpenXml.Office2019.Excel.ThreadedComments;
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
|
using IRaCIS.Core.Application.Helper.OtherTool;
|
||||||
using IRaCIS.Core.Application.Interfaces;
|
using IRaCIS.Core.Application.Interfaces;
|
||||||
using IRaCIS.Core.Application.Service.ImageAndDoc;
|
using IRaCIS.Core.Application.Service.ImageAndDoc;
|
||||||
using IRaCIS.Core.Application.Service.OAuth;
|
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Application.Service.ReadingCalculate.Interface;
|
using IRaCIS.Core.Application.Service.ReadingCalculate.Interface;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using Newtonsoft.Json.Serialization;
|
|
||||||
using NPOI.POIFS.Properties;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using Panda.DynamicWebApi.Attributes;
|
using Panda.DynamicWebApi.Attributes;
|
||||||
using System.Linq;
|
|
||||||
using ZiggyCreatures.Caching.Fusion;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
@@ -61,6 +51,9 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
IRepository<ReadModule> _readModuleRepository,
|
IRepository<ReadModule> _readModuleRepository,
|
||||||
IRepository<DicomInstance> _dicomInstanceRepository,
|
IRepository<DicomInstance> _dicomInstanceRepository,
|
||||||
IRepository<OrganInfo> _organInfoRepository,
|
IRepository<OrganInfo> _organInfoRepository,
|
||||||
|
IRepository<TrialUserRole> _trialUserRoleRepository,
|
||||||
|
IRepository<EmailNoticeUserType> _emailNoticeUserTypeRepository,
|
||||||
|
IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
|
||||||
IRepository<OrganTrialInfo> _organTrialInfoRepository,
|
IRepository<OrganTrialInfo> _organTrialInfoRepository,
|
||||||
IRepository<TrialDocument> _trialDocumentRepository,
|
IRepository<TrialDocument> _trialDocumentRepository,
|
||||||
ILuganoCalculateService _luganoCalculateService,
|
ILuganoCalculateService _luganoCalculateService,
|
||||||
@@ -80,10 +73,13 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
IGeneralCalculateService _generalCalculateService,
|
IGeneralCalculateService _generalCalculateService,
|
||||||
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
|
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
|
||||||
IRepository<TaskStudy> _taskStudyRepository,
|
IRepository<TaskStudy> _taskStudyRepository,
|
||||||
|
IConfiguration _config,
|
||||||
IDownloadAndUploadService _downloadAndUploadService,
|
IDownloadAndUploadService _downloadAndUploadService,
|
||||||
ITrialEmailNoticeConfigService _trialEmailNoticeConfigService,
|
ITrialEmailNoticeConfigService _trialEmailNoticeConfigService,
|
||||||
|
IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig,
|
||||||
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IReadingImageTaskService
|
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IReadingImageTaskService
|
||||||
{
|
{
|
||||||
|
private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取报告图表数据
|
/// 获取报告图表数据
|
||||||
@@ -452,6 +448,81 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取标记信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inDto"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<List<MarkListInfo>> GetMarkList(GetMarkListInDto inDto)
|
||||||
|
{
|
||||||
|
var questionMarkList = await _readingTaskQuestionMarkRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId&&x.InstanceId!=null)
|
||||||
|
.Select(x => new MarkListInfo() {
|
||||||
|
|
||||||
|
MeasureData = x.MeasureData,
|
||||||
|
PicturePath = x.PicturePath,
|
||||||
|
InstanceId = x.InstanceId,
|
||||||
|
SeriesId = x.SeriesId,
|
||||||
|
StudyId = x.StudyId,
|
||||||
|
MarkName= x.OrderMarkName,
|
||||||
|
SopInstanceUid = x.Instance.SopInstanceUid,
|
||||||
|
StudyInstanceUid = x.Instance.StudyInstanceUid,
|
||||||
|
NumberOfFrames= x.Instance.NumberOfFrames,
|
||||||
|
}).ToListAsync();
|
||||||
|
|
||||||
|
|
||||||
|
var rowMarkList=await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.InstanceId != null)
|
||||||
|
.Select(x => new MarkListInfo()
|
||||||
|
{
|
||||||
|
|
||||||
|
MeasureData = x.MeasureData,
|
||||||
|
PicturePath = x.PicturePath,
|
||||||
|
InstanceId = x.InstanceId,
|
||||||
|
SeriesId = x.SeriesId,
|
||||||
|
StudyId = x.StudyId,
|
||||||
|
MarkName = x.RowMark,
|
||||||
|
SopInstanceUid = x.Instance.SopInstanceUid,
|
||||||
|
StudyInstanceUid = x.Instance.StudyInstanceUid,
|
||||||
|
NumberOfFrames = x.Instance.NumberOfFrames,
|
||||||
|
}).ToListAsync();
|
||||||
|
|
||||||
|
|
||||||
|
return questionMarkList.Union(rowMarkList).OrderBy(x=>x.MarkName).ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取非DICOM标记信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inDto"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<List<NoneDicomMarkInfo>> GetNoneDicomMarkList(GetMarkListInDto inDto)
|
||||||
|
{
|
||||||
|
var markList = await _readingNoneDicomMarkRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId).Include(x => x.NoneDicomStudyFile)
|
||||||
|
.Select(x => new NoneDicomMarkInfo()
|
||||||
|
{
|
||||||
|
StudyId = x.StudyId,
|
||||||
|
NoneDicomFileId = x.NoneDicomFileId,
|
||||||
|
Path = x.Path,
|
||||||
|
PicturePath = x.PicturePath,
|
||||||
|
MeasureData = x.MeasureData,
|
||||||
|
MarkTool = x.MarkTool,
|
||||||
|
MarkName = x.OrderMarkName,
|
||||||
|
FileName = x.NoneDicomStudyFile==null? string.Empty: x.NoneDicomStudyFile.FileName,
|
||||||
|
MarkId = x.MarkId,
|
||||||
|
}).ToListAsync();
|
||||||
|
|
||||||
|
return markList.OrderBy(x => x.MarkName).ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取手册
|
/// 获取手册
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1003,28 +1074,28 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
/// <exception cref="BusinessValidationFailedException"></exception>
|
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||||
private async Task VerifyTaskIsSign(Guid visitTaskid)
|
private async Task VerifyTaskIsSign(Guid visitTaskid)
|
||||||
{
|
{
|
||||||
var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskid).FirstNotNullAsync();
|
//var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskid).FirstNotNullAsync();
|
||||||
|
|
||||||
if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.ReadingTaskState == ReadingTaskState.HaveSigned))
|
//if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.ReadingTaskState == ReadingTaskState.HaveSigned))
|
||||||
{
|
//{
|
||||||
throw new BusinessValidationFailedException(_localizer["ReadingImage_BeSigned"]);
|
// throw new BusinessValidationFailedException(_localizer["ReadingImage_BeSigned"]);
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.TaskState != TaskState.Effect))
|
//if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.TaskState != TaskState.Effect))
|
||||||
{
|
//{
|
||||||
throw new BusinessValidationFailedException(_localizer["ReadingImage_Beinvalid"]);
|
// throw new BusinessValidationFailedException(_localizer["ReadingImage_Beinvalid"]);
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (await _visitTaskRepository.AnyAsync(x => x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId
|
//if (await _visitTaskRepository.AnyAsync(x => x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId
|
||||||
&& x.IsAnalysisCreate && taskInfo.IsAnalysisCreate
|
//&& x.IsAnalysisCreate && taskInfo.IsAnalysisCreate
|
||||||
&& x.SubjectId == taskInfo.SubjectId && x.TaskState == TaskState.Effect &&
|
//&& x.SubjectId == taskInfo.SubjectId && x.TaskState == TaskState.Effect &&
|
||||||
((x.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && x.DoctorUserId == taskInfo.DoctorUserId) || x.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed)
|
//((x.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && x.DoctorUserId == taskInfo.DoctorUserId) || x.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed)
|
||||||
|
|
||||||
))
|
//))
|
||||||
{
|
//{
|
||||||
throw new BusinessValidationFailedException(_localizer["ReadingImage_PresenceReview"]);
|
// throw new BusinessValidationFailedException(_localizer["ReadingImage_PresenceReview"]);
|
||||||
}
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1330,6 +1401,38 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
}); ;
|
}); ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取单个表格问题及答案 过滤问题
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inDto"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<IResponseOutput> GetFilterTableQuestion(GetFilterTableQuestionInDto inDto)
|
||||||
|
{
|
||||||
|
var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||||||
|
var tableAnswers = await _readingTableQuestionAnswerRepository
|
||||||
|
.ProjectTo<ReadingTableQuestionAnswerInfo>(_mapper.ConfigurationProvider)
|
||||||
|
.Where(x => x.VisitTaskId == inDto.VisitTaskId).ToListAsync();
|
||||||
|
var tableAnsweRowInfos = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId).ProjectTo<TableAnsweRowInfo>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
var organIds = tableAnsweRowInfos.Where(x => x.OrganInfoId != null).Select(x => x.OrganInfoId).Distinct().ToList();
|
||||||
|
var organList = await _organInfoRepository.Where(x => organIds.Contains(x.Id)).ToListAsync();
|
||||||
|
var questionPage = await GetReadingTableQuestion(
|
||||||
|
new GetReadingTableQuestionOrAnswerInDto()
|
||||||
|
{
|
||||||
|
TrialReadingCriterionId = taskinfo.TrialReadingCriterionId,
|
||||||
|
TaskId = inDto.VisitTaskId,
|
||||||
|
TableAnswers = tableAnswers,
|
||||||
|
TableAnsweRowInfos = tableAnsweRowInfos,
|
||||||
|
OrganInfos = organList,
|
||||||
|
QuestionClassify = inDto.QuestionClassify,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var result = questionPage.SinglePage.SelectMany(x => x.Childrens).Where(x => x.Id == inDto.QuestionId).FirstOrDefault();
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(result);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取自定义问题以及答案
|
/// 获取自定义问题以及答案
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -3363,6 +3466,29 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<IResponseOutput> VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
|
public async Task<IResponseOutput> VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
|
||||||
{
|
{
|
||||||
|
// 验证一个问题不能有多个答案
|
||||||
|
bool hasDuplicate = await _readingTaskQuestionAnswerRepository
|
||||||
|
.Where(x => x.VisitTaskId == inDto.VisitTaskId)
|
||||||
|
.GroupBy(x => x.ReadingQuestionTrialId)
|
||||||
|
.AnyAsync(g => g.Count() > 1);
|
||||||
|
|
||||||
|
if (hasDuplicate)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_ = SendWeComNotifier(inDto.VisitTaskId, "阅片问题答案有重复");
|
||||||
|
_ = SendAbnormalEmail(inDto.VisitTaskId, EmailBusinessScenario.RepeatedVisitAnswers);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new BusinessValidationFailedException(_localizer["ReadingImage_VisitAnswerRepeated"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//验证后处理影像必须传
|
//验证后处理影像必须传
|
||||||
if (_visitTaskRepository.Any(t => t.Id == inDto.VisitTaskId && t.TrialReadingCriterion.ImageUploadEnum != ReadingImageUpload.None))
|
if (_visitTaskRepository.Any(t => t.Id == inDto.VisitTaskId && t.TrialReadingCriterion.ImageUploadEnum != ReadingImageUpload.None))
|
||||||
{
|
{
|
||||||
|
|||||||
+179
-6
@@ -1,5 +1,9 @@
|
|||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Filter;
|
using IRaCIS.Core.Application.Filter;
|
||||||
|
using IRaCIS.Core.Application.Helper;
|
||||||
|
using IRaCIS.Core.Application.Helper.OtherTool;
|
||||||
|
using IRaCIS.Core.Application.MassTransit.Consumer;
|
||||||
|
using IRaCIS.Core.Application.MassTransit.Consumer.Dto;
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
@@ -7,6 +11,8 @@ using IRaCIS.Core.Infra.EFCore.Common;
|
|||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using MimeKit;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
@@ -676,7 +682,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
JudgeDifferenceType = x.Key.JudgeDifferenceType,
|
JudgeDifferenceType = x.Key.JudgeDifferenceType,
|
||||||
TaskAnswerList = x.Select(y => y.Answer).ToList(),
|
TaskAnswerList = x.Select(y => y.Answer).ToList(),
|
||||||
}).ToList();
|
}).ToList();
|
||||||
noteEqual = noteEqual || ComputeJudgeResult(groupTasks);
|
noteEqual = noteEqual || ComputeJudgeResult(groupTasks, visitTask.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -708,7 +714,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
JudgeDifferenceType = x.Key.JudgeDifferenceType,
|
JudgeDifferenceType = x.Key.JudgeDifferenceType,
|
||||||
TaskAnswerList = x.Select(y => y.Answer).ToList(),
|
TaskAnswerList = x.Select(y => y.Answer).ToList(),
|
||||||
}).ToList();
|
}).ToList();
|
||||||
noteEqual = ComputeJudgeResult(groupTasks);
|
noteEqual = ComputeJudgeResult(groupTasks, visitTask.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -757,7 +763,8 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
JudgeDifferenceValue = x.Key.JudgeDifferenceValue,
|
JudgeDifferenceValue = x.Key.JudgeDifferenceValue,
|
||||||
JudgeDifferenceType = x.Key.JudgeDifferenceType,
|
JudgeDifferenceType = x.Key.JudgeDifferenceType,
|
||||||
}).ToList();
|
}).ToList();
|
||||||
noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks);
|
|
||||||
|
noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks, visitTask.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -819,7 +826,8 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
JudgeDifferenceType = x.Key.JudgeDifferenceType,
|
JudgeDifferenceType = x.Key.JudgeDifferenceType,
|
||||||
TaskAnswerList = x.Select(y => y.Answer).ToList(),
|
TaskAnswerList = x.Select(y => y.Answer).ToList(),
|
||||||
}).ToList();
|
}).ToList();
|
||||||
noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks);
|
|
||||||
|
noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks, visitTask.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -922,12 +930,154 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发送微信通知
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="visiTaskId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task SendWeComNotifier(Guid visiTaskId,string msg)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
bool isOpenWeComNotice = _config.GetValue<bool>("WeComNoticeConfig:IsOpenWeComNotice");
|
||||||
|
|
||||||
|
if (isOpenWeComNotice)
|
||||||
|
{
|
||||||
|
string webhook = _config["WeComNoticeConfig:WebhookUrl"] ?? string.Empty;
|
||||||
|
|
||||||
|
var uri = new Uri(_config["SystemEmailSendConfig:SiteUrl"]);
|
||||||
|
var baseUrl = uri.GetLeftPart(UriPartial.Authority);
|
||||||
|
|
||||||
|
var userList = _config.GetSection("WeComNoticeConfig:APINoticeUserList").Get<string[]>();
|
||||||
|
|
||||||
|
var visitTask = _visitTaskRepository.Where(x => x.Id == visiTaskId).Include(x=>x.Subject).Include(x=>x.Trial).Include(x=>x.SourceSubjectVisit).FirstOrDefault();
|
||||||
|
|
||||||
|
|
||||||
|
// 🔔 异步告警(不要阻塞请求)
|
||||||
|
_ = WeComNotifier.SendAlertAsync(
|
||||||
|
webhook: webhook,
|
||||||
|
alert: new WeComAlert
|
||||||
|
{
|
||||||
|
Env = baseUrl,
|
||||||
|
UserName = msg,
|
||||||
|
Api = "",
|
||||||
|
Message = $"异常信息:{msg}, 项目方案号:{visitTask.Trial.ResearchProgramNo}, 试验参与者:{visitTask.Subject.Code}, 访视:{visitTask.SourceSubjectVisit.VisitName}, 任务名称:{visitTask.TaskName}, 任务Id:{visiTaskId}",
|
||||||
|
Stack = string.Empty,
|
||||||
|
AtUsers = userList ?? []
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Logger.Error($"MassTransit里发送企业微信出现错误:{ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发送邮件通知
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="visiTaskId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task SendAbnormalEmail(Guid visiTaskId, EmailBusinessScenario type)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
var emailNotice = _emailNoticeConfigrepository.Where(x => x.BusinessScenarioEnum == type).FirstOrDefault();
|
||||||
|
|
||||||
|
var taskinfo= _visitTaskRepository.Where(x => x.Id == visiTaskId).Include(x => x.Trial).Include(x => x.Subject).Include(x => x.SourceSubjectVisit).FirstOrDefault();
|
||||||
|
if (taskinfo == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据不同场景获取不同角色的用户
|
||||||
|
var trialUser = _trialUserRoleRepository.Where(x => x.TrialId == taskinfo.TrialId && !x.TrialUser.IsDeleted).Include(x => x.UserRole).Select(x => x.UserRole)
|
||||||
|
.Select(x => new SendEmailUserDto()
|
||||||
|
{
|
||||||
|
UserTypeEnum = x.UserTypeEnum,
|
||||||
|
FullName = x.FullName,
|
||||||
|
UserWorkLanguage = x.IdentityUser.UserWorkLanguage,
|
||||||
|
EMail = x.EMail,
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
// 根据场景确定收件人
|
||||||
|
List<SendEmailUserDto> toUserList = new List<SendEmailUserDto>();
|
||||||
|
List<SendEmailUserDto> ccUserList = new List<SendEmailUserDto>();
|
||||||
|
|
||||||
|
var emailNoticeUserList = _emailNoticeUserTypeRepository.Where(x => x.EmailNoticeConfigId == emailNotice.Id).ToList();
|
||||||
|
|
||||||
|
var toList = emailNoticeUserList.Where(x => x.EmailUserType == EmailUserType.To).Select(x => x.UserType).ToList();
|
||||||
|
|
||||||
|
toUserList = trialUser.Where(x => toList.Contains(x.UserTypeEnum)).ToList();
|
||||||
|
|
||||||
|
var ccList = emailNoticeUserList.Where(x => x.EmailUserType == EmailUserType.Copy).Select(x => x.UserType).ToList();
|
||||||
|
|
||||||
|
ccUserList = trialUser.Where(x => ccList.Contains(x.UserTypeEnum)).ToList();
|
||||||
|
|
||||||
|
|
||||||
|
// 如果没有收件人,则不发送邮件
|
||||||
|
if (toUserList.Count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var userWorkLanguageList = toUserList.Select(x => x.UserWorkLanguage).Distinct().ToList();
|
||||||
|
|
||||||
|
foreach (var workLanguage in userWorkLanguageList)
|
||||||
|
{
|
||||||
|
var userinfoList = toUserList.Where(x => x.UserWorkLanguage == workLanguage).ToList();
|
||||||
|
var messageToSend = new MimeMessage();
|
||||||
|
// 发件地址
|
||||||
|
messageToSend.From.Add(new MailboxAddress(taskinfo.Trial.EmailFromName, taskinfo.Trial.EmailFromEmail));
|
||||||
|
|
||||||
|
foreach (var userinfo in userinfoList)
|
||||||
|
{
|
||||||
|
messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加抄送
|
||||||
|
foreach (var ccUser in ccUserList)
|
||||||
|
{
|
||||||
|
messageToSend.Cc.Add(new MailboxAddress(ccUser.FullName, ccUser.EMail));
|
||||||
|
}
|
||||||
|
|
||||||
|
var userNames = userinfoList.Select(x => x.FullName).ToList();
|
||||||
|
|
||||||
|
// 格式化邮件内容
|
||||||
|
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
|
||||||
|
{
|
||||||
|
var topicStr = string.Format(input.topicStr, taskinfo.Trial.ResearchProgramNo, taskinfo.Subject.Code,taskinfo.SourceSubjectVisit.VisitName);
|
||||||
|
var htmlBodyStr = string.Format(
|
||||||
|
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage),
|
||||||
|
string.Join(',', userNames), // 用户名 {0}
|
||||||
|
taskinfo.Trial.ExperimentName, // 项目 {1}
|
||||||
|
taskinfo.Subject.Code, // 受试者编号 {2}
|
||||||
|
taskinfo.SourceSubjectVisit.VisitName, // 访视名称 {3}
|
||||||
|
type== EmailBusinessScenario.JudgeExceptio ? _systemEmailConfig.SiteUrl: taskinfo.TaskName, // 任务名称 {4}
|
||||||
|
taskinfo.Id.ToString(), // 任务Id {5}
|
||||||
|
_systemEmailConfig.SiteUrl // 链接 {6}
|
||||||
|
);
|
||||||
|
|
||||||
|
return (topicStr, htmlBodyStr);
|
||||||
|
};
|
||||||
|
|
||||||
|
await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailNotice, messageToSend, emailConfigFunc, workLanguage);
|
||||||
|
|
||||||
|
await SendEmailHelper.SendTrialEmailAsync(messageToSend, taskinfo.Trial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 计算返回的结果 为True表示不相等
|
/// 计算返回的结果 为True表示不相等
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="groupTasks"></param>
|
/// <param name="groupTasks"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private bool ComputeJudgeResult(List<GroupTaskAnswerDto> groupTasks)
|
private bool ComputeJudgeResult(List<GroupTaskAnswerDto> groupTasks,Guid visiTaskId)
|
||||||
{
|
{
|
||||||
var noteEqual = false;
|
var noteEqual = false;
|
||||||
foreach (var item in groupTasks)
|
foreach (var item in groupTasks)
|
||||||
@@ -935,11 +1085,34 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
// 裁判问题可以不必填
|
// 裁判问题可以不必填
|
||||||
if(item.TaskAnswerList.Count()==0)
|
if(item.TaskAnswerList.Count()==0)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_ = SendWeComNotifier(visiTaskId, "两个阅片任务的答案等于0");
|
||||||
|
_ = SendAbnormalEmail(visiTaskId, EmailBusinessScenario.JudgeExceptio);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (item.TaskAnswerList.Count() != 2)
|
else if (item.TaskAnswerList.Count() != 2)
|
||||||
{
|
{
|
||||||
noteEqual = true;
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 发送微信通知
|
||||||
|
_ = SendWeComNotifier(visiTaskId, "两个阅片任务的答案不等于2");
|
||||||
|
_ = SendAbnormalEmail(visiTaskId, EmailBusinessScenario.JudgeExceptio);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (noteEqual)
|
else if (noteEqual)
|
||||||
|
|||||||
+1
-5
@@ -1,12 +1,8 @@
|
|||||||
using DocumentFormat.OpenXml.Office2019.Excel.ThreadedComments;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NPOI.POIFS.Properties;
|
|
||||||
using Panda.DynamicWebApi.Attributes;
|
using Panda.DynamicWebApi.Attributes;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -527,7 +527,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var subjectVisitQuery = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)/*.Where(t => t.IsLostVisit == false)*/
|
var subjectVisitQuery = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)/*.Where(t => t.IsLostVisit == false)*/
|
||||||
.Where(t => t.Subject.IsSubjectQuit == false || (t.Subject.IsSubjectQuit == true && t.SubmitState == SubmitStateEnum.Submitted))
|
.Where(t => t.Subject.IsSubjectQuit == false || (t.Subject.IsSubjectQuit == true && t.SubmitState == SubmitStateEnum.Submitted))
|
||||||
.Where(sv => sv.Subject.FinalSubjectVisitId == null ? true : sv.VisitNum <= sv.Subject.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
|
.Where(sv => sv.Subject.FinalSubjectVisitId == null ? true : sv.VisitNum <= sv.Subject.FinalSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
|
||||||
{
|
{
|
||||||
Id = sv.Id,
|
Id = sv.Id,
|
||||||
CreateTime = sv.CreateTime,
|
CreateTime = sv.CreateTime,
|
||||||
|
|||||||
@@ -1,14 +1,9 @@
|
|||||||
using DocumentFormat.OpenXml.Drawing;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NPOI.Util;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
|
|||||||
+75
-1
@@ -1,4 +1,5 @@
|
|||||||
using DocumentFormat.OpenXml.Drawing.Spreadsheet;
|
using Amazon.Runtime.Internal.Transform;
|
||||||
|
using DocumentFormat.OpenXml.Drawing.Spreadsheet;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
@@ -10,6 +11,7 @@ using MassTransit.Saga;
|
|||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using MiniExcelLibs;
|
using MiniExcelLibs;
|
||||||
|
using System.Collections.Immutable;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -18,6 +20,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
{
|
{
|
||||||
public class GeneralCalculateService(IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository,
|
public class GeneralCalculateService(IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository,
|
||||||
IRepository<VisitTask> _visitTaskRepository,
|
IRepository<VisitTask> _visitTaskRepository,
|
||||||
|
IRepository<Segmentation> _segmentationRepository,
|
||||||
|
IRepository<Segment> _segmentRepository,
|
||||||
|
IRepository<SegmentBinding> _segmentBindingRepository,
|
||||||
|
|
||||||
IRepository<ReadingTaskQuestionMark> _readingTaskQuestionMarkRepository,
|
IRepository<ReadingTaskQuestionMark> _readingTaskQuestionMarkRepository,
|
||||||
IRepository<ReadingNoneDicomMark> _readingNoneDicomMarkRepository,
|
IRepository<ReadingNoneDicomMark> _readingNoneDicomMarkRepository,
|
||||||
IRepository<ReadingNoneDicomMarkBinding> _readingNoneDicomMarkBindingRepository,
|
IRepository<ReadingNoneDicomMarkBinding> _readingNoneDicomMarkBindingRepository,
|
||||||
@@ -225,6 +231,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果有表格问题或者外层问题答案就不复制了
|
||||||
|
if ((await _readingTableQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == taskinfo.Id))
|
||||||
|
|| (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == taskinfo.Id)))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (taskinfo.IsCopyLesionAnswer)
|
if (taskinfo.IsCopyLesionAnswer)
|
||||||
{
|
{
|
||||||
var historyTaskId = await _visitTaskRepository.Where(x =>
|
var historyTaskId = await _visitTaskRepository.Where(x =>
|
||||||
@@ -255,7 +268,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
var questionMarkList = await _readingTaskQuestionMarkRepository.Where(x => x.VisitTaskId == historyTaskId).ToListAsync();
|
var questionMarkList = await _readingTaskQuestionMarkRepository.Where(x => x.VisitTaskId == historyTaskId).ToListAsync();
|
||||||
var noneDicomMarkList = await _readingNoneDicomMarkRepository.Where(x => x.VisitTaskId == historyTaskId).ToListAsync();
|
var noneDicomMarkList = await _readingNoneDicomMarkRepository.Where(x => x.VisitTaskId == historyTaskId).ToListAsync();
|
||||||
var noneDicomMarkBindingList = await _readingNoneDicomMarkBindingRepository.Where(x => x.VisitTaskId == historyTaskId).ToListAsync();
|
var noneDicomMarkBindingList = await _readingNoneDicomMarkBindingRepository.Where(x => x.VisitTaskId == historyTaskId).ToListAsync();
|
||||||
|
Dictionary<Guid, Guid> lesionRelationship = new Dictionary<Guid, Guid>() { };
|
||||||
|
|
||||||
|
// 这里后续还要添加病灶 比如现在是访视三 要把失效任务访视三的 在访视三的病灶添加过来
|
||||||
|
// 同时自定义的 除了根据器官判断还需要根据 复制前值的答案相不相等
|
||||||
foreach (var item in tableRowList)
|
foreach (var item in tableRowList)
|
||||||
{
|
{
|
||||||
if (item.SplitOrMergeType == SplitOrMergeType.Merged)
|
if (item.SplitOrMergeType == SplitOrMergeType.Merged)
|
||||||
@@ -272,6 +288,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
|
|
||||||
if (historyRow != null)
|
if (historyRow != null)
|
||||||
{
|
{
|
||||||
|
lesionRelationship.Add(historyRow.Id, item.Id);
|
||||||
item.StudyId = historyRow.StudyId;
|
item.StudyId = historyRow.StudyId;
|
||||||
item.SeriesId = historyRow.SeriesId;
|
item.SeriesId = historyRow.SeriesId;
|
||||||
item.InstanceId = historyRow.InstanceId;
|
item.InstanceId = historyRow.InstanceId;
|
||||||
@@ -380,6 +397,63 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
item.Id = NewId.NextGuid();
|
item.Id = NewId.NextGuid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region 分割
|
||||||
|
Dictionary<Guid, Guid> segmentationRelationship = new Dictionary<Guid, Guid>() { };
|
||||||
|
var segmentationList = _segmentationRepository.Where(t => t.VisitTaskId == historyTaskId).ToList();
|
||||||
|
|
||||||
|
foreach (var item in segmentationList)
|
||||||
|
{
|
||||||
|
|
||||||
|
var newSegmentationId = NewId.NextSequentialGuid();
|
||||||
|
segmentationRelationship.Add(item.Id, newSegmentationId);
|
||||||
|
item.Id = newSegmentationId;
|
||||||
|
item.VisitTaskId = taskinfo.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Dictionary<Guid, Guid> segmentRelationship = new Dictionary<Guid, Guid>() { };
|
||||||
|
var segmentList = _segmentRepository.Where(t => t.VisitTaskId == historyTaskId).ToList();
|
||||||
|
foreach (var item in segmentList)
|
||||||
|
{
|
||||||
|
var newSegmentationId = NewId.NextSequentialGuid();
|
||||||
|
segmentRelationship.Add(item.Id, newSegmentationId);
|
||||||
|
if (segmentationRelationship.ContainsKey(item.SegmentationId))
|
||||||
|
{
|
||||||
|
item.SegmentationId = segmentationRelationship[item.SegmentationId];
|
||||||
|
}
|
||||||
|
item.Id = newSegmentationId;
|
||||||
|
item.VisitTaskId = taskinfo.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
var segmentBindingList = _segmentBindingRepository.Where(x => x.VisitTaskId == historyTaskId).ToList();
|
||||||
|
|
||||||
|
foreach (var item in segmentBindingList)
|
||||||
|
{
|
||||||
|
if (segmentationRelationship.ContainsKey(item.SegmentationId))
|
||||||
|
{
|
||||||
|
item.SegmentationId = segmentationRelationship[item.SegmentationId];
|
||||||
|
}
|
||||||
|
if (segmentRelationship.ContainsKey(item.SegmentId))
|
||||||
|
{
|
||||||
|
item.SegmentId = segmentRelationship[item.SegmentId];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.RowId != null && lesionRelationship.ContainsKey(item.RowId.Value))
|
||||||
|
{
|
||||||
|
item.RowId = lesionRelationship[item.RowId.Value];
|
||||||
|
}
|
||||||
|
item.Id = NewId.NextSequentialGuid();
|
||||||
|
item.VisitTaskId = taskinfo.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_ = _segmentationRepository.AddRangeAsync(segmentationList).Result;
|
||||||
|
_ = _segmentRepository.AddRangeAsync(segmentList).Result;
|
||||||
|
_ = _segmentBindingRepository.AddRangeAsync(segmentBindingList).Result;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
await _readingNoneDicomMarkRepository.AddRangeAsync(noneDicomMarkList);
|
await _readingNoneDicomMarkRepository.AddRangeAsync(noneDicomMarkList);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+77
-2
@@ -30,6 +30,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
|
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
|
||||||
IRepository<OrganInfo> _organInfoRepository,
|
IRepository<OrganInfo> _organInfoRepository,
|
||||||
IRepository<ReadingGlobalTaskInfo> _readingGlobalTaskInfoRepository,
|
IRepository<ReadingGlobalTaskInfo> _readingGlobalTaskInfoRepository,
|
||||||
|
IRepository<ReadingJudgeInfo> _readingJudgeInfoRepository,
|
||||||
IRepository<SubjectVisit> _subjectVisitRepository,
|
IRepository<SubjectVisit> _subjectVisitRepository,
|
||||||
IRepository<TumorAssessment_IRECIST1Point1> _tumorAssessmentRepository,
|
IRepository<TumorAssessment_IRECIST1Point1> _tumorAssessmentRepository,
|
||||||
IGeneralCalculateService _generalCalculateService,
|
IGeneralCalculateService _generalCalculateService,
|
||||||
@@ -508,12 +509,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
TrialId = task.TrialId,
|
TrialId = task.TrialId,
|
||||||
VisitTaskId = task.Id,
|
VisitTaskId = task.Id,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
data.VisitTaskId= task.Id;
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EvaluationColumn BuildEvaluationTable(GetReadingReportEvaluationOutDto r1, GetReadingReportEvaluationOutDto r2)
|
async Task<EvaluationColumn> BuildEvaluationTable(GetReadingReportEvaluationOutDto r1, GetReadingReportEvaluationOutDto r2)
|
||||||
{
|
{
|
||||||
EvaluationColumn result = new EvaluationColumn()
|
EvaluationColumn result = new EvaluationColumn()
|
||||||
{
|
{
|
||||||
@@ -537,6 +540,74 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Arm? highlightArm = null;
|
||||||
|
ArbitrationRule? highlightRule = null;
|
||||||
|
decimal? highlightVisitTaskNum = null;
|
||||||
|
|
||||||
|
if (r1.VisitTaskId != null && r2.VisitTaskList != null)
|
||||||
|
{
|
||||||
|
var judgeInfo =await _visitTaskRepository.Where(x => x.SubjectId == inDto.SubjectId && x.TrialReadingCriterionId == inDto.TrialCriterionId
|
||||||
|
&& x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned
|
||||||
|
&& x.ReadingCategory== ReadingCategory.Judge
|
||||||
|
|
||||||
|
).OrderByDescending(x => x.VisitTaskNum).Include(x=>x.JudgeResultTask).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
|
||||||
|
if (judgeInfo != null && judgeInfo.JudgeResultTask != null)
|
||||||
|
{
|
||||||
|
if (judgeInfo.JudgeResultTask.ArmEnum == Arm.DoubleReadingArm1
|
||||||
|
|| judgeInfo.JudgeResultTask.ArmEnum == Arm.DoubleReadingArm2)
|
||||||
|
{
|
||||||
|
highlightArm = judgeInfo.JudgeResultTask.ArmEnum;
|
||||||
|
highlightRule = criterion.ArbitrationRule;
|
||||||
|
highlightVisitTaskNum = judgeInfo.VisitTaskNum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetHighlight(List<EvaluationValue> data, Arm arm)
|
||||||
|
{
|
||||||
|
if (highlightArm != arm || highlightVisitTaskNum == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (highlightRule == ArbitrationRule.Reading)
|
||||||
|
{
|
||||||
|
for (var index = 0; index < data.Count && index < highlightVisitTaskNum.Value; index++)
|
||||||
|
{
|
||||||
|
data[index].IsHighlight = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (highlightRule == ArbitrationRule.Visit)
|
||||||
|
{
|
||||||
|
var index = decimal.ToInt32(decimal.Floor(highlightVisitTaskNum.Value));
|
||||||
|
if (index >= 0 && index < data.Count)
|
||||||
|
{
|
||||||
|
data[index].IsHighlight = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SetVisitTaskId(List<EvaluationValue> data, List<VisitTaskInfo> VisitTaskList)
|
||||||
|
{
|
||||||
|
for (var index = 0; index < data.Count; index++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
data[index].VisitTaskId = VisitTaskList[index].VisitTaskId;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
result.Evaluation.Add(visitTaskName.Select(x => new EvaluationValue()
|
result.Evaluation.Add(visitTaskName.Select(x => new EvaluationValue()
|
||||||
@@ -570,6 +641,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
r1data = r1data.Concat(Enumerable.Repeat(new EvaluationValue() { Value = "" }, length))
|
r1data = r1data.Concat(Enumerable.Repeat(new EvaluationValue() { Value = "" }, length))
|
||||||
.Take(length)
|
.Take(length)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
SetHighlight(r1data, Arm.DoubleReadingArm1);
|
||||||
|
SetVisitTaskId(r1data, r1.VisitTaskList);
|
||||||
result.Evaluation.Add(r1data);
|
result.Evaluation.Add(r1data);
|
||||||
|
|
||||||
|
|
||||||
@@ -601,6 +674,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
r2data = r2data.Concat(Enumerable.Repeat(new EvaluationValue() { Value = "" }, length))
|
r2data = r2data.Concat(Enumerable.Repeat(new EvaluationValue() { Value = "" }, length))
|
||||||
.Take(length)
|
.Take(length)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
SetHighlight(r2data, Arm.DoubleReadingArm2);
|
||||||
|
SetVisitTaskId(r2data, r2.VisitTaskList);
|
||||||
result.Evaluation.Add(r2data);
|
result.Evaluation.Add(r2data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -679,7 +754,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
result.Evaluation = BuildEvaluationTable(r1Data, r2Data);
|
result.Evaluation =await BuildEvaluationTable(r1Data, r2Data);
|
||||||
if (r1Data != null)
|
if (r1Data != null)
|
||||||
{
|
{
|
||||||
var r1Target = await BuildTargetChart(r1Data, Arm.DoubleReadingArm1);
|
var r1Target = await BuildTargetChart(r1Data, Arm.DoubleReadingArm1);
|
||||||
|
|||||||
@@ -1,18 +1,11 @@
|
|||||||
using DocumentFormat.OpenXml.EMMA;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using DocumentFormat.OpenXml.Presentation;
|
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using MathNet.Numerics;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
using MiniExcelLibs;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
{
|
{
|
||||||
@@ -305,10 +298,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
//new ReadingCalculateData (){QuestionType=QuestionType.Plaque3PVA,GetDecimalNullFun=GetPlaque3PVA},
|
//new ReadingCalculateData (){QuestionType=QuestionType.Plaque3PVA,GetDecimalNullFun=GetPlaque3PVA},
|
||||||
|
|
||||||
|
|
||||||
// (EEM-Lumen)求和
|
// 获取EMM求和
|
||||||
new ReadingCalculateData (){QuestionType=QuestionType.EEMSum,GetDecimalNullFun=GetEmmSum},
|
new ReadingCalculateData (){QuestionType=QuestionType.EEMSum,GetDecimalNullFun=GetEmmSum},
|
||||||
|
|
||||||
// 斑块2-PAV
|
// (EEM-Lumen)求和
|
||||||
new ReadingCalculateData (){QuestionType=QuestionType.EEMSubLumenSum,GetDecimalNullFun=GetEEMLumenSum},
|
new ReadingCalculateData (){QuestionType=QuestionType.EEMSubLumenSum,GetDecimalNullFun=GetEEMLumenSum},
|
||||||
|
|
||||||
// PAV(冠状动脉粥样硬化体积百分比)
|
// PAV(冠状动脉粥样硬化体积百分比)
|
||||||
@@ -501,6 +494,38 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string getNone(string value)
|
||||||
|
{
|
||||||
|
if (value == string.Empty || value == null)
|
||||||
|
{
|
||||||
|
return "无";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Dictionary<string, string> isPresent = new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
{ "有","1"},
|
||||||
|
{ "无","0"},
|
||||||
|
{ "Existence","1"},
|
||||||
|
{ "Non-existence","0"},
|
||||||
|
{ string.Empty,string.Empty},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Dictionary<string, string> yesOrNo = new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
{ "是","1"},
|
||||||
|
{ "否","0"},
|
||||||
|
{ "Yes","1"},
|
||||||
|
{ "No","0"},
|
||||||
|
};
|
||||||
|
|
||||||
List<IVUSMeasuredValue> measuredValueList = new List<IVUSMeasuredValue>();
|
List<IVUSMeasuredValue> measuredValueList = new List<IVUSMeasuredValue>();
|
||||||
var errorRow = new List<int> { };
|
var errorRow = new List<int> { };
|
||||||
|
|
||||||
@@ -509,12 +534,19 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
IVUSMeasuredValue iVUSMeasuredValue = new IVUSMeasuredValue() { };
|
IVUSMeasuredValue iVUSMeasuredValue = new IVUSMeasuredValue() { };
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 手动抛出异常进入catch
|
||||||
|
if (!yesOrNo.ContainsKey(dataTable.Rows[i]["D"].ToString()))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("NullError");
|
||||||
|
}
|
||||||
|
|
||||||
iVUSMeasuredValue = new IVUSMeasuredValue()
|
iVUSMeasuredValue = new IVUSMeasuredValue()
|
||||||
{
|
{
|
||||||
//PlaqueNum = int.Parse(dataTable.Rows[i]["A"].ToString()),
|
//PlaqueNum = int.Parse(dataTable.Rows[i]["A"].ToString()),
|
||||||
FrameNumber = dataTable.Rows[i]["A"].ToString()??string.Empty,
|
FrameNumber = dataTable.Rows[i]["A"].ToString()??string.Empty,
|
||||||
Emm = getdecimalEmptyData(dataTable.Rows[i]["B"].ToString()),
|
Emm = getdecimalEmptyData(dataTable.Rows[i]["B"].ToString()),
|
||||||
Lumen = getdecimalEmptyData(dataTable.Rows[i]["C"].ToString()),
|
Lumen = getdecimalEmptyData(dataTable.Rows[i]["C"].ToString()),
|
||||||
|
PlaqueRupture= getNone(dataTable.Rows[i]["D"].ToString()),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
@@ -630,6 +662,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.ElasticAreaDiffValue).Select(x => x.Id).FirstOrDefault(),
|
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.ElasticAreaDiffValue).Select(x => x.Id).FirstOrDefault(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 斑块破裂
|
||||||
|
tableAnswers.Add(new ReadingTableQuestionAnswer()
|
||||||
|
{
|
||||||
|
Answer = yesOrNo[item.PlaqueRupture.ToString()],
|
||||||
|
QuestionId = questionInfo.Id,
|
||||||
|
TrialId = taskinfo.TrialId,
|
||||||
|
VisitTaskId = taskinfo.Id,
|
||||||
|
RowId = newRowId,
|
||||||
|
RowIndex = maxnum,
|
||||||
|
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.PlaqueRupture).Select(x => x.Id).FirstOrDefault(),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
// 添加其他问题答案
|
// 添加其他问题答案
|
||||||
foreach (var otherQuestion in tableQuestionList.Where(x => !tableAnswers.Any(y => y.TableQuestionId == x.Id && y.RowId == newRowId)))
|
foreach (var otherQuestion in tableQuestionList.Where(x => !tableAnswers.Any(y => y.TableQuestionId == x.Id && y.RowId == newRowId)))
|
||||||
|
|||||||
@@ -336,6 +336,15 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
List<OCTFCTUploadData> measuredValueList = new List<OCTFCTUploadData>();
|
List<OCTFCTUploadData> measuredValueList = new List<OCTFCTUploadData>();
|
||||||
var errorRow = new List<int> { };
|
var errorRow = new List<int> { };
|
||||||
|
|
||||||
|
Dictionary<string, string> yesOrNo = new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
{ "是","1"},
|
||||||
|
{ "否","0"},
|
||||||
|
{ "Yes","1"},
|
||||||
|
{ "No","0"},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
string getNone(string value)
|
string getNone(string value)
|
||||||
{
|
{
|
||||||
if (value == string.Empty || value == null)
|
if (value == string.Empty || value == null)
|
||||||
@@ -351,19 +360,29 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// 手动抛出异常进入catch
|
||||||
|
if (!yesOrNo.ContainsKey(dataTable.Rows[i]["K"].ToString())|| !yesOrNo.ContainsKey(dataTable.Rows[i]["L"].ToString()))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("NullError");
|
||||||
|
}
|
||||||
|
|
||||||
measuredValueList.Add(new OCTFCTUploadData()
|
measuredValueList.Add(new OCTFCTUploadData()
|
||||||
{
|
{
|
||||||
//PlaqueNum = int.Parse(dataTable.Rows[i]["A"].ToString()),
|
//PlaqueNum = int.Parse(dataTable.Rows[i]["A"].ToString()),
|
||||||
FrameNumber = dataTable.Rows[i]["A"].ToString() ?? string.Empty,
|
FrameNumber = dataTable.Rows[i]["A"].ToString() ?? string.Empty,
|
||||||
FirstData = getdecimalEmptyData(dataTable.Rows[i]["B"].ToString()),
|
LumenAreaMeasurement = getdecimalEmptyData(dataTable.Rows[i]["B"].ToString()),
|
||||||
SecondData = getdecimalEmptyData(dataTable.Rows[i]["C"].ToString()),
|
LipidAngle = getdecimalEmptyData(dataTable.Rows[i]["C"].ToString() ?? string.Empty),
|
||||||
ThirdData = getdecimalEmptyData(dataTable.Rows[i]["D"].ToString()),
|
FirstData = getdecimalEmptyData(dataTable.Rows[i]["D"].ToString()),
|
||||||
MacrophageInfiltrationMeasurement = getNone(dataTable.Rows[i]["E"].ToString()),
|
SecondData = getdecimalEmptyData(dataTable.Rows[i]["E"].ToString()),
|
||||||
MacrophageInfiltrationAngle = getdecimalEmptyData(dataTable.Rows[i]["F"].ToString() ?? string.Empty),
|
ThirdData = getdecimalEmptyData(dataTable.Rows[i]["F"].ToString()),
|
||||||
MicrochannelMeasurement = getNone(dataTable.Rows[i]["G"].ToString()),
|
MicrochannelMeasurement = getNone(dataTable.Rows[i]["G"].ToString()),
|
||||||
CholesterolCrystalMeasurement = getNone(dataTable.Rows[i]["H"].ToString()),
|
CholesterolCrystalMeasurement = getNone(dataTable.Rows[i]["H"].ToString()),
|
||||||
LumenAreaMeasurement = getdecimalEmptyData(dataTable.Rows[i]["I"].ToString()),
|
MacrophageInfiltrationMeasurement = getNone(dataTable.Rows[i]["I"].ToString()),
|
||||||
LipidAngle = getdecimalEmptyData(dataTable.Rows[i]["J"].ToString() ?? string.Empty),
|
MacrophageInfiltrationAngle = getdecimalEmptyData(dataTable.Rows[i]["J"].ToString() ?? string.Empty),
|
||||||
|
PlaqueRupture = getNone(dataTable.Rows[i]["K"].ToString()),
|
||||||
|
PlaqueHealing = getNone(dataTable.Rows[i]["L"].ToString()),
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
@@ -598,6 +617,30 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.LipidAngle).Select(x => x.Id).FirstOrDefault(),
|
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.LipidAngle).Select(x => x.Id).FirstOrDefault(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 斑块破裂
|
||||||
|
tableAnswers.Add(new ReadingTableQuestionAnswer()
|
||||||
|
{
|
||||||
|
Answer = yesOrNo[item.PlaqueRupture.ToString()],
|
||||||
|
QuestionId = questionInfo.Id,
|
||||||
|
TrialId = taskinfo.TrialId,
|
||||||
|
VisitTaskId = taskinfo.Id,
|
||||||
|
RowId = newRowId,
|
||||||
|
RowIndex = maxnum,
|
||||||
|
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.PlaqueRupture).Select(x => x.Id).FirstOrDefault(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// 斑块愈合
|
||||||
|
tableAnswers.Add(new ReadingTableQuestionAnswer()
|
||||||
|
{
|
||||||
|
Answer = yesOrNo[item.PlaqueHealing.ToString()],
|
||||||
|
QuestionId = questionInfo.Id,
|
||||||
|
TrialId = taskinfo.TrialId,
|
||||||
|
VisitTaskId = taskinfo.Id,
|
||||||
|
RowId = newRowId,
|
||||||
|
RowIndex = maxnum,
|
||||||
|
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.PlaqueHealing).Select(x => x.Id).FirstOrDefault(),
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
using DocumentFormat.OpenXml.EMMA;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NPOI.Util;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
{
|
{
|
||||||
@@ -299,10 +296,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(trialReadingCriterion.IsOncologyReading)
|
|
||||||
{
|
// 自定义的复制
|
||||||
await _generalCalculateService.CopyHistoryAnswer(taskinfo, addRowList, addTableQuestionAnswerList);
|
await _generalCalculateService.CopyHistoryAnswer(taskinfo, addRowList, addTableQuestionAnswerList);
|
||||||
}
|
|
||||||
|
|
||||||
await _readingTableAnswerRowInfoRepository.AddRangeAsync(addRowList);
|
await _readingTableAnswerRowInfoRepository.AddRangeAsync(addRowList);
|
||||||
await _readingTableQuestionAnswerRepository.AddRangeAsync(addTableQuestionAnswerList);
|
await _readingTableQuestionAnswerRepository.AddRangeAsync(addTableQuestionAnswerList);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
namespace IRaCIS.Core.Application.Contracts
|
namespace IRaCIS.Core.Application.Contracts
|
||||||
@@ -162,7 +163,7 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
public DateTime? ReviewerTime { get; set; }
|
public DateTime? ReviewerTime { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public CommonUploadRecordDto SiteSurveyFile { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -360,7 +361,7 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
[Comment("不严格按照影像手册参数完成刻盘原因")]
|
[Comment("不严格按照影像手册参数完成刻盘原因")]
|
||||||
public string NotStrictManualBurnFlagReason { get; set; }
|
public string NotStrictManualBurnFlagReason { get; set; }
|
||||||
|
|
||||||
|
public Guid? CommonUploadRecordId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,36 +3,17 @@
|
|||||||
// 生成时间 2021-12-23 13:20:59
|
// 生成时间 2021-12-23 13:20:59
|
||||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
using DocumentFormat.OpenXml.Spreadsheet;
|
|
||||||
using DocumentFormat.OpenXml.Vml.Spreadsheet;
|
|
||||||
using IdentityModel;
|
|
||||||
using IdentityModel.OidcClient;
|
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Auth;
|
using IRaCIS.Core.Application.Auth;
|
||||||
using IRaCIS.Core.Application.Filter;
|
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Service;
|
|
||||||
using IRaCIS.Core.Application.Service.OAuth;
|
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
|
||||||
using IRaCIS.Core.Domain.Models;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Medallion.Threading;
|
using Medallion.Threading;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Components.Routing;
|
|
||||||
using Microsoft.AspNetCore.Identity;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Microsoft.VisualBasic;
|
|
||||||
using MimeKit;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using Panda.DynamicWebApi.Attributes;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
using System.Security.Policy;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using static MassTransit.ValidationResultExtensions;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Contracts
|
namespace IRaCIS.Core.Application.Contracts
|
||||||
{
|
{
|
||||||
@@ -849,7 +830,8 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var config = await _trialRepository.Where(t => t.Id == trialSiteSurvey.TrialId).Select(t => t.TrialExtraConfigJsonStr).FirstOrDefaultAsync();
|
||||||
|
var extralConfig = JsonConvert.DeserializeObject<TrialExtraConfig>(config);
|
||||||
|
|
||||||
var siteUserList = await _trialSiteUserSurveyRepository.Where(t => t.TrialSiteSurveyId == trialSiteSurveyId)
|
var siteUserList = await _trialSiteUserSurveyRepository.Where(t => t.TrialSiteSurveyId == trialSiteSurveyId)
|
||||||
.Where(t => !(t.IsHistoryUser && t.IsHistoryUserDeleted == true))
|
.Where(t => !(t.IsHistoryUser && t.IsHistoryUserDeleted == true))
|
||||||
@@ -868,7 +850,7 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
//var currentUserList = siteUserList.Where(t => t.TrialSiteSurveyId == trialSiteSurveyId).ToList();
|
//var currentUserList = siteUserList.Where(t => t.TrialSiteSurveyId == trialSiteSurveyId).ToList();
|
||||||
|
|
||||||
|
|
||||||
if (!siteUserList.Any(t => t.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator || t.UserTypeEnum == UserTypeEnum.CRA))
|
if (!siteUserList.Any(t => t.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator || t.UserTypeEnum == UserTypeEnum.CRA) && extralConfig.IsOnlyUploadFile == false)
|
||||||
{
|
{
|
||||||
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_MissingAccount"]);
|
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_MissingAccount"]);
|
||||||
}
|
}
|
||||||
@@ -938,7 +920,7 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
|
|
||||||
var trialType = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault();
|
var trialType = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault();
|
||||||
|
|
||||||
foreach (var item in needGenerateList.GroupBy(t => t.Email))
|
foreach (var item in needSendEmailList.GroupBy(t => t.Email))
|
||||||
{
|
{
|
||||||
var addUserRoleList = item.ToList();
|
var addUserRoleList = item.ToList();
|
||||||
|
|
||||||
@@ -1155,8 +1137,15 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
|
|
||||||
await _trialSiteUserSurveyRepository.UpdatePartialFromQueryAsync(t => userJoinIdList.Contains(t.Id), u => new TrialSiteUserSurvey() { IsJoin = true, SystemUserId = existSysUser.Id });
|
await _trialSiteUserSurveyRepository.UpdatePartialFromQueryAsync(t => userJoinIdList.Contains(t.Id), u => new TrialSiteUserSurvey() { IsJoin = true, SystemUserId = existSysUser.Id });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
await _trialSiteUserRoleRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//中心调研设置用户角色退出
|
//中心调研设置用户角色退出
|
||||||
var needQuitUserList = item.Where(t => t.IsHistoryUser && t.IsHistoryUserOriginDeleted == false && t.IsHistoryUserDeleted == true).ToList();
|
var needQuitUserList = allUserList.Where(t => t.IsHistoryUser && t.IsHistoryUserOriginDeleted == false && t.IsHistoryUserDeleted == true).ToList();
|
||||||
|
|
||||||
var queitUserTypeIdList = needQuitUserList.Select(t => t.UserTypeId).ToList();
|
var queitUserTypeIdList = needQuitUserList.Select(t => t.UserTypeId).ToList();
|
||||||
|
|
||||||
@@ -1168,10 +1157,6 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
await _trialSiteUserRoleRepository.SaveChangesAsync();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
await _trialSiteSurveyRepository.UpdatePartialFromQueryAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.SPMApproved, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.PMCreatedAndLock, ReviewerUserId = _userInfo.UserRoleId, ReviewerTime = DateTime.Now });
|
await _trialSiteSurveyRepository.UpdatePartialFromQueryAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.SPMApproved, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.PMCreatedAndLock, ReviewerUserId = _userInfo.UserRoleId, ReviewerTime = DateTime.Now });
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ namespace IRaCIS.Core.Application.AutoMapper
|
|||||||
CreateMap<TrialSiteSurvey, TrialSiteSurveyView>()
|
CreateMap<TrialSiteSurvey, TrialSiteSurveyView>()
|
||||||
.ForMember(d => d.TrialSiteAliasName, u => u.MapFrom(s => s.TrialSite.TrialSiteAliasName))
|
.ForMember(d => d.TrialSiteAliasName, u => u.MapFrom(s => s.TrialSite.TrialSiteAliasName))
|
||||||
.ForMember(d => d.SiteName, u => u.MapFrom(s => s.TrialSite.TrialSiteName))
|
.ForMember(d => d.SiteName, u => u.MapFrom(s => s.TrialSite.TrialSiteName))
|
||||||
|
.ForMember(d => d.SiteSurveyFile, u => u.MapFrom(s => s.SiteSurveyFile))
|
||||||
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode));
|
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode));
|
||||||
|
|
||||||
CreateMap<TrialSiteSurvey, TrialSiteSurveySelectView>();
|
CreateMap<TrialSiteSurvey, TrialSiteSurveySelectView>();
|
||||||
|
|||||||
@@ -750,6 +750,59 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
public Guid TrialReadingCriterionId { get; set; }
|
public Guid TrialReadingCriterionId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TrialLinkExpirationTimeDto
|
||||||
|
{
|
||||||
|
public Guid TrialId { get; set; }
|
||||||
|
|
||||||
|
public int ExpirationDays { get; set; }
|
||||||
|
|
||||||
|
public string LinkVerificationCode { get; set; }
|
||||||
|
}
|
||||||
|
public class SetTrialLinkExpirationTimeDto
|
||||||
|
{
|
||||||
|
public Guid TrialId { get; set; }
|
||||||
|
|
||||||
|
public DateTime? LinkExpirationTime { get; set; }
|
||||||
|
|
||||||
|
public string LinkVerificationCode { get; set; }
|
||||||
|
|
||||||
|
public string ResearchProgramNo { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class VerifyLinkExpirationTimeDto
|
||||||
|
{
|
||||||
|
public Guid TrialId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class VerifyLinkExpirationTimeOutDto
|
||||||
|
{
|
||||||
|
public DateTime? LinkExpirationTime { get; set; }
|
||||||
|
|
||||||
|
public bool IsExpired
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.LinkExpirationTime != null && this.LinkExpirationTime < DateTime.Now;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetLinkVerificationCodeIsEffectiveDto
|
||||||
|
{
|
||||||
|
public Guid TrialId { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public string LinkVerificationCode { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetLinkVerificationCodeIsEffectiveOutDto
|
||||||
|
{
|
||||||
|
public bool IsEffective { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class GetTrialReadingCriterionInfoOutDto
|
public class GetTrialReadingCriterionInfoOutDto
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user