合并
continuous-integration/drone/push Build is failing Details

Temp_Uat_IRC_Net8
he 2025-10-16 13:20:01 +08:00
commit 629116cb6a
79 changed files with 163682 additions and 1081 deletions

View File

@ -19,7 +19,7 @@
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.1" /> <PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
<PackageReference Include="AutoMapper" Version="13.0.1" /> <PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="Minio" Version="6.0.4" /> <PackageReference Include="Minio" Version="6.0.3" />
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0"> <PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
<TreatAsUsed>true</TreatAsUsed> <TreatAsUsed>true</TreatAsUsed>
</PackageReference> </PackageReference>

View File

@ -22,6 +22,7 @@ using SharpCompress.Common;
using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Formats.Jpeg;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention; using IRaCIS.Core.Infrastructure.Extention;
using FellowOakDicom.IO.Buffer;
namespace IRaCIS.Core.SCP.Service namespace IRaCIS.Core.SCP.Service
{ {
@ -40,7 +41,9 @@ namespace IRaCIS.Core.SCP.Service
{ {
private IServiceProvider _serviceProvider { get; set; } private IServiceProvider _serviceProvider { get; set; }
private List<Guid> _SCPStudyIdList { get; set; } = new List<Guid>(); private List<Guid> _SCPStudyIdList => _ImageUploadList.Where(t => t.SCPStudyId != Guid.Empty).Select(t => t.SCPStudyId).ToList();
private List<ImageUploadInfo> _ImageUploadList { get; set; } = new List<ImageUploadInfo>();
private SCPImageUpload _upload { get; set; } private SCPImageUpload _upload { get; set; }
@ -163,27 +166,48 @@ namespace IRaCIS.Core.SCP.Service
public async Task OnReceiveAssociationReleaseRequestAsync() public async Task OnReceiveAssociationReleaseRequestAsync()
{ {
await DataMaintenanceAsaync(); var _distributedLockProvider = _serviceProvider.GetService<IDistributedLockProvider>();
var @lock = _distributedLockProvider.CreateLock($"{_upload.CallingAE}");
using (await @lock.AcquireAsync())
{
await DataMaintenanceAsaync();
//记录监控
await AddUploadLogAsync();
var _studyRepository = _serviceProvider.GetService<IRepository<SCPStudy>>();
//将检查设置为传输结束
await _studyRepository.BatchUpdateNoTrackingAsync(t => _SCPStudyIdList.Contains(t.Id), u => new SCPStudy() { IsUploadFinished = true });
await _studyRepository.SaveChangesAndClearAllTrackingAsync();
}
await SendAssociationReleaseResponseAsync();
}
private async Task AddUploadLogAsync()
{
//记录监控 //记录监控
var _SCPImageUploadRepository = _serviceProvider.GetService<IRepository<SCPImageUpload>>(); var _SCPImageUploadRepository = _serviceProvider.GetService<IRepository<SCPImageUpload>>();
_upload.EndTime = DateTime.Now; _upload.EndTime = DateTime.Now;
_upload.StudyCount = _SCPStudyIdList.Count; _upload.StudyCount = _ImageUploadList.Count;
_upload.TrialId = _trialId; _upload.TrialId = _trialId;
_upload.TrialSiteId = _trialSiteId; _upload.TrialSiteId = _trialSiteId;
await _SCPImageUploadRepository.AddAsync(_upload, true); _upload.UploadJsonStr = (new SCPImageLog() { UploadList = _ImageUploadList }).ToJsonStr();
//可能是测试echo 导致记录了
var _studyRepository = _serviceProvider.GetService<IRepository<SCPStudy>>(); await _SCPImageUploadRepository.AddAsync(_upload, _upload.FileCount > 0 ? true : false);
//将检查设置为传输结束
await _studyRepository.BatchUpdateNoTrackingAsync(t => _SCPStudyIdList.Contains(t.Id), u => new SCPStudy() { IsUploadFinished = true });
await _studyRepository.SaveChangesAndClearAllTrackingAsync();
await SendAssociationReleaseResponseAsync();
} }
@ -249,6 +273,11 @@ namespace IRaCIS.Core.SCP.Service
//await _studyRepository.SaveChangesAndClearAllTrackingAsync(); //await _studyRepository.SaveChangesAndClearAllTrackingAsync();
} }
else
{
//记录日志
await AddUploadLogAsync();
}
Log.Logger.Warning($"连接关闭 {exception?.Message} {exception?.InnerException?.Message}"); Log.Logger.Warning($"连接关闭 {exception?.Message} {exception?.InnerException?.Message}");
} }
@ -259,17 +288,24 @@ namespace IRaCIS.Core.SCP.Service
public async Task<DicomCStoreResponse> OnCStoreRequestAsync(DicomCStoreRequest request) public async Task<DicomCStoreResponse> OnCStoreRequestAsync(DicomCStoreRequest request)
{ {
string studyInstanceUid = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID,string.Empty); string studyInstanceUid = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty);
string seriesInstanceUid = request.Dataset.GetSingleValueOrDefault(DicomTag.SeriesInstanceUID, string.Empty); string seriesInstanceUid = request.Dataset.GetSingleValueOrDefault(DicomTag.SeriesInstanceUID, string.Empty);
string sopInstanceUid = request.Dataset.GetSingleValueOrDefault(DicomTag.SOPInstanceUID, string.Empty); string sopInstanceUid = request.Dataset.GetSingleValueOrDefault(DicomTag.SOPInstanceUID, string.Empty);
string patientIdStr = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty);
if(studyInstanceUid.IsNullOrEmpty() || seriesInstanceUid.IsNullOrEmpty() || sopInstanceUid.IsNullOrEmpty()) if (studyInstanceUid.IsNullOrEmpty() || seriesInstanceUid.IsNullOrEmpty() || sopInstanceUid.IsNullOrEmpty())
{ {
Log.Logger.Error($"接收数据读取StudyInstanceUID{studyInstanceUid}、SeriesInstanceUID{seriesInstanceUid}、SOPInstanceUID{sopInstanceUid}有空 "); Log.Logger.Error($"接收数据读取StudyInstanceUID{studyInstanceUid}、SeriesInstanceUID{seriesInstanceUid}、SOPInstanceUID{sopInstanceUid}有空 ");
return new DicomCStoreResponse(request, DicomStatus.Success); return new DicomCStoreResponse(request, DicomStatus.Success);
} }
//确保来了影像集合存在
if (!_ImageUploadList.Any(t => t.StudyInstanceUid == studyInstanceUid))
{
_ImageUploadList.Add(new ImageUploadInfo() { StudyInstanceUid = studyInstanceUid });
}
//Guid studyId = IdentifierHelper.CreateGuid(studyInstanceUid, trialId.ToString()); //Guid studyId = IdentifierHelper.CreateGuid(studyInstanceUid, trialId.ToString());
Guid seriesId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, _trialId.ToString()); Guid seriesId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, _trialId.ToString());
Guid instanceId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, sopInstanceUid, _trialId.ToString()); Guid instanceId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, sopInstanceUid, _trialId.ToString());
@ -288,11 +324,70 @@ namespace IRaCIS.Core.SCP.Service
long fileSize = 0; long fileSize = 0;
try try
{ {
using (MemoryStream ms = new MemoryStream()) using (MemoryStream ms = new MemoryStream())
{ {
await request.File.SaveAsync(ms); await request.File.SaveAsync(ms);
#region 1帧拆成多个固定大小的方便移动端浏览
// 回到开头,读取 dicom
ms.Position = 0;
var dicomFile = DicomFile.Open(ms);
var pixelData = DicomPixelData.Create(dicomFile.Dataset);
var syntax = pixelData.Syntax;
// 每个 fragment 固定大小 (64KB 示例,可以自己调整)
int fragmentSize = 20 * 1024;
if (syntax.IsEncapsulated)
{
var newFragments = new DicomOtherByteFragment(DicomTag.PixelData);
for (int n = 0; n < pixelData.NumberOfFrames; n++)
{
var frameData = pixelData.GetFrame(n); // 获取完整一帧
var data = frameData.Data;
int offset = 0;
while (offset < data.Length)
{
int size = Math.Min(fragmentSize, data.Length - offset);
var buffer = new byte[size];
Buffer.BlockCopy(data, offset, buffer, 0, size);
newFragments.Fragments.Add(new MemoryByteBuffer(buffer));
offset += size;
}
}
// 替换原 PixelData
dicomFile.Dataset.AddOrUpdate(newFragments);
// 重新保存 dicom 到流
ms.SetLength(0);
dicomFile.Save(ms);
}
ms.Position = 0;
#endregion
#region 本地测试
//// --- 保存到本地文件测试 ---
//var localPath = @"D:\TestDicom.dcm";
//using (var fs = new FileStream(localPath, FileMode.Create, FileAccess.Write))
//{
// ms.CopyTo(fs);
//}
//return new DicomCStoreResponse(request, DicomStatus.Success);
#endregion
//irc 从路径最后一截取Guid //irc 从路径最后一截取Guid
storeRelativePath = await ossService.UploadToOSSAsync(ms, ossFolderPath, instanceId.ToString(), false); storeRelativePath = await ossService.UploadToOSSAsync(ms, ossFolderPath, instanceId.ToString(), false);
@ -315,12 +410,8 @@ namespace IRaCIS.Core.SCP.Service
{ {
try try
{ {
var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(request.Dataset, _trialId, _trialSiteId, storeRelativePath, Association.CallingAE, Association.CalledAE,fileSize); var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(request.File, _trialId, _trialSiteId, storeRelativePath, Association.CallingAE, Association.CalledAE,fileSize);
if (!_SCPStudyIdList.Contains(scpStudyId))
{
_SCPStudyIdList.Add(scpStudyId);
}
var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId); var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
@ -349,12 +440,40 @@ namespace IRaCIS.Core.SCP.Service
await _seriesRepository.SaveChangesAsync(); await _seriesRepository.SaveChangesAsync();
if (_ImageUploadList.Any(t => t.StudyInstanceUid == studyInstanceUid))
{
var find = _ImageUploadList.FirstOrDefault(t => t.StudyInstanceUid.Equals(studyInstanceUid));
find.SuccessImageCount++;
if (!find.PatientNameList.Any(t => t == patientIdStr) && patientIdStr.IsNotNullOrEmpty())
{
find.PatientNameList.Add(patientIdStr);
}
//首次 默认是Guid 空数据库归档出了Id
if (find.SCPStudyId != scpStudyId)
{
find.SCPStudyId = scpStudyId;
}
}
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 传输处理异常:{ex.ToString()}"); Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 传输处理异常:{ex.ToString()}");
if (_ImageUploadList.Any(t => t.StudyInstanceUid == studyInstanceUid))
{
var find = _ImageUploadList.FirstOrDefault(t => t.StudyInstanceUid.Equals(studyInstanceUid));
find.FailedImageCount++;
}
} }
} }

View File

@ -13,6 +13,7 @@ using IRaCIS.Core.Infra.EFCore;
using MassTransit; using MassTransit;
using System.Runtime.Intrinsics.X86; using System.Runtime.Intrinsics.X86;
using Serilog.Sinks.File; using Serilog.Sinks.File;
using IRaCIS.Core.Infrastructure.Extention;
namespace IRaCIS.Core.SCP.Service namespace IRaCIS.Core.SCP.Service
{ {
@ -52,8 +53,10 @@ namespace IRaCIS.Core.SCP.Service
/// <param name="dataset"></param> /// <param name="dataset"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="NotImplementedException"></exception> /// <exception cref="NotImplementedException"></exception>
public async Task<Guid> ArchiveDicomFileAsync(DicomDataset dataset, Guid trialId, Guid trialSiteId, string fileRelativePath, string callingAE, string calledAE,long fileSize) public async Task<Guid> ArchiveDicomFileAsync(DicomFile dicomFile, Guid trialId, Guid trialSiteId, string fileRelativePath, string callingAE, string calledAE,long fileSize)
{ {
var dataset = dicomFile.Dataset;
string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID); string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID);
string seriesInstanceUid = dataset.GetString(DicomTag.SeriesInstanceUID); string seriesInstanceUid = dataset.GetString(DicomTag.SeriesInstanceUID);
string sopInstanceUid = dataset.GetString(DicomTag.SOPInstanceUID); string sopInstanceUid = dataset.GetString(DicomTag.SOPInstanceUID);
@ -82,7 +85,7 @@ namespace IRaCIS.Core.SCP.Service
DateTime? studyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.StudyDate).Add(dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.StudyTime).TimeOfDay); DateTime? studyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.StudyDate).Add(dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.StudyTime).TimeOfDay);
//先传输了修改了患者编号的又传输了没有修改患者编号的导致后传输的没有修改患者编号的下面的检查为0 //先传输了修改了患者编号的又传输了没有修改患者编号的导致后传输的没有修改患者编号的下面的检查为0
if (findPatient == null && findStudy==null) if (findPatient == null /*&& findStudy==null*/)
{ {
isPatientNeedAdd = true; isPatientNeedAdd = true;
@ -151,6 +154,32 @@ namespace IRaCIS.Core.SCP.Service
} }
findPatient.LatestPushTime = DateTime.Now; findPatient.LatestPushTime = DateTime.Now;
findPatient.PatientName = dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
findPatient.PatientSex = dataset.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty);
findPatient.PatientAge = dataset.GetSingleValueOrDefault(DicomTag.PatientAge, string.Empty);
findPatient.PatientBirthDate = dataset.GetSingleValueOrDefault(DicomTag.PatientBirthDate, string.Empty);
if (findPatient.PatientBirthDate.Length == 8)
{
var birthDateStr = $"{findPatient.PatientBirthDate[0]}{findPatient.PatientBirthDate[1]}{findPatient.PatientBirthDate[2]}{findPatient.PatientBirthDate[3]}-{findPatient.PatientBirthDate[4]}{findPatient.PatientBirthDate[5]}-{findPatient.PatientBirthDate[6]}{findPatient.PatientBirthDate[7]}";
var yearStr = $"{findPatient.PatientBirthDate[0]}{findPatient.PatientBirthDate[1]}{findPatient.PatientBirthDate[2]}{findPatient.PatientBirthDate[3]}";
int year = 0;
var canParse = int.TryParse(yearStr, out year);
if (canParse && year > 1900)
{
findPatient.PatientBirthDate = birthDateStr;
}
else
{
findPatient.PatientBirthDate = string.Empty;
}
}
} }
if (findStudy == null) if (findStudy == null)
@ -167,6 +196,9 @@ namespace IRaCIS.Core.SCP.Service
TrialSiteId = trialSiteId, TrialSiteId = trialSiteId,
StudyInstanceUid = studyInstanceUid, StudyInstanceUid = studyInstanceUid,
StudyTime = studyTime, StudyTime = studyTime,
DicomStudyDate = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty),
DicomStudyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty),
Modalities = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty), Modalities = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty),
//ModalityForEdit = modalityForEdit, //ModalityForEdit = modalityForEdit,
Description = dataset.GetSingleValueOrDefault(DicomTag.StudyDescription, string.Empty), Description = dataset.GetSingleValueOrDefault(DicomTag.StudyDescription, string.Empty),
@ -201,6 +233,19 @@ namespace IRaCIS.Core.SCP.Service
findStudy.PatientBirthDate = $"{findStudy.PatientBirthDate[0]}{findStudy.PatientBirthDate[1]}{findStudy.PatientBirthDate[2]}{findStudy.PatientBirthDate[3]}-{findStudy.PatientBirthDate[4]}{findStudy.PatientBirthDate[5]}-{findStudy.PatientBirthDate[6]}{findStudy.PatientBirthDate[7]}"; findStudy.PatientBirthDate = $"{findStudy.PatientBirthDate[0]}{findStudy.PatientBirthDate[1]}{findStudy.PatientBirthDate[2]}{findStudy.PatientBirthDate[3]}-{findStudy.PatientBirthDate[4]}{findStudy.PatientBirthDate[5]}-{findStudy.PatientBirthDate[6]}{findStudy.PatientBirthDate[7]}";
} }
} }
else
{
findStudy.DicomStudyDate = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty);
findStudy.DicomStudyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty);
findStudy.CalledAE = calledAE;
findStudy.CallingAE = callingAE;
findStudy.PatientName = dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
findStudy.PatientSex = dataset.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty);
findStudy.PatientAge = dataset.GetSingleValueOrDefault(DicomTag.PatientAge, string.Empty);
findStudy.UpdateTime = DateTime.Now;
await _patientRepository.BatchUpdateNoTrackingAsync(t => t.Id == findStudy.PatientId, u => new SCPPatient() { LatestPushTime = DateTime.Now });
}
if (findSerice == null) if (findSerice == null)
@ -218,6 +263,9 @@ namespace IRaCIS.Core.SCP.Service
//SeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, DateTime.Now).Add(dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, DateTime.Now).TimeOfDay), //SeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, DateTime.Now).Add(dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, DateTime.Now).TimeOfDay),
//SeriesTime = DateTime.TryParse(dataset.GetSingleValue<string>(DicomTag.SeriesDate) + dataset.GetSingleValue<string>(DicomTag.SeriesTime), out DateTime dt) ? dt : null, //SeriesTime = DateTime.TryParse(dataset.GetSingleValue<string>(DicomTag.SeriesDate) + dataset.GetSingleValue<string>(DicomTag.SeriesTime), out DateTime dt) ? dt : null,
SeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.SeriesDate).Add(dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.SeriesTime).TimeOfDay), SeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.SeriesDate).Add(dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.SeriesTime).TimeOfDay),
DicomSeriesDate = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, string.Empty),
DicomSeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, string.Empty),
Modality = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty), Modality = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty),
Description = dataset.GetSingleValueOrDefault(DicomTag.SeriesDescription, string.Empty), Description = dataset.GetSingleValueOrDefault(DicomTag.SeriesDescription, string.Empty),
SliceThickness = dataset.GetSingleValueOrDefault(DicomTag.SliceThickness, string.Empty), SliceThickness = dataset.GetSingleValueOrDefault(DicomTag.SliceThickness, string.Empty),
@ -239,7 +287,20 @@ namespace IRaCIS.Core.SCP.Service
++findStudy.SeriesCount; ++findStudy.SeriesCount;
} }
else
{
findSerice.DicomSeriesDate = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, string.Empty);
findSerice.DicomSeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, string.Empty);
findSerice.UpdateTime = DateTime.Now;
}
var transferSyntaxUID = dicomFile.FileMetaInfo.GetSingleValueOrDefault(DicomTag.TransferSyntaxUID, string.Empty);
var isEncapsulated = false;
if (transferSyntaxUID.IsNotNullOrEmpty())
{
isEncapsulated = DicomTransferSyntax.Lookup(DicomUID.Parse(transferSyntaxUID)).IsEncapsulated;
}
if (findInstance == null) if (findInstance == null)
{ {
@ -280,6 +341,15 @@ namespace IRaCIS.Core.SCP.Service
++findStudy.InstanceCount; ++findStudy.InstanceCount;
++findSerice.InstanceCount; ++findSerice.InstanceCount;
} }
else
{
findInstance.SOPClassUID = dataset.GetSingleValueOrDefault(DicomTag.SOPClassUID, string.Empty);
findInstance.MediaStorageSOPClassUID = dataset.GetSingleValueOrDefault(DicomTag.MediaStorageSOPClassUID, string.Empty);
findInstance.TransferSytaxUID = transferSyntaxUID;
findInstance.MediaStorageSOPInstanceUID = dataset.GetSingleValueOrDefault(DicomTag.MediaStorageSOPInstanceUID, string.Empty);
findInstance.IsEncapsulated = isEncapsulated;
findInstance.UpdateTime = DateTime.Now;
}
if (isPatientNeedAdd) if (isPatientNeedAdd)
{ {

View File

@ -5,7 +5,7 @@ namespace IRaCIS.Core.SCP.Service
{ {
public interface IDicomArchiveService public interface IDicomArchiveService
{ {
Task<Guid> ArchiveDicomFileAsync(DicomDataset dicomDataset,Guid trialId,Guid trialSiteId, string fileRelativePath,string callingAE,string calledAE,long fileSize); Task<Guid> ArchiveDicomFileAsync(DicomFile dicomFile, Guid trialId,Guid trialSiteId, string fileRelativePath,string callingAE,string calledAE,long fileSize);
} }
} }

View File

@ -126,6 +126,51 @@ namespace IRaCIS.Core.API
} }
public class DateOnlyUniversalJsonConverter : JsonConverter
{
private readonly string _format;
public DateOnlyUniversalJsonConverter(string format = "yyyy-MM-dd")
{
_format = format;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateOnly) || objectType == typeof(DateOnly?);
}
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteValue(""); // null -> 空字符串
return;
}
var date = (DateOnly)value;
if (date == default)
{
writer.WriteValue(""); // default(DateOnly) -> 空字符串
}
else
{
writer.WriteValue(date.ToString(_format));
}
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
var str = reader.TokenType == JsonToken.Null ? null : reader.Value?.ToString();
if (string.IsNullOrWhiteSpace(str) || !DateOnly.TryParse(str, out var date))
{
return objectType == typeof(DateOnly?) ? null : default(DateOnly);
}
return date;
}
}
#region 废弃 #region 废弃

View File

@ -49,6 +49,8 @@ namespace IRaCIS.Core.API
//必须放在后面 //必须放在后面
options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONTimeZoneConverter>()); options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONTimeZoneConverter>());
//options.SerializerSettings.Converters.Add(new DateOnlyUniversalJsonConverter("yyyy-MM-dd"));
}) })
.AddControllersAsServices()//动态webApi属性注入需要 .AddControllersAsServices()//动态webApi属性注入需要

View File

@ -294,7 +294,7 @@ public class OSSService : IOSSService
GetObjectStoreTempToken(); GetObjectStoreTempToken();
} }
//token 过期了 //token 过期了
if (AliyunOSSTempToken.Expiration.AddSeconds(10) <= DateTime.Now) if (AliyunOSSTempToken?.Expiration.AddSeconds(10) <= DateTime.Now)
{ {
GetObjectStoreTempToken(); GetObjectStoreTempToken();
} }

View File

@ -41,11 +41,11 @@
<PackageReference Include="FreeSpire.Doc" Version="12.2.0" /> <PackageReference Include="FreeSpire.Doc" Version="12.2.0" />
<PackageReference Include="ExcelDataReader" Version="3.7.0" /> <PackageReference Include="ExcelDataReader" Version="3.7.0" />
<PackageReference Include="ExcelDataReader.DataSet" Version="3.7.0" /> <PackageReference Include="ExcelDataReader.DataSet" Version="3.7.0" />
<PackageReference Include="DistributedLock.Redis" Version="1.0.3" /> <PackageReference Include="DistributedLock.Redis" Version="1.1.0" />
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.6" /> <PackageReference Include="DistributedLock.SqlServer" Version="1.0.6" />
<PackageReference Include="fo-dicom" Version="5.2.2" /> <PackageReference Include="fo-dicom" Version="5.2.2" />
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.2" /> <PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.2" />
<PackageReference Include="fo-dicom.Codecs" Version="5.16.3" /> <PackageReference Include="fo-dicom.Codecs" Version="5.16.4" />
<PackageReference Include="IP2Region.Net" Version="2.0.2" /> <PackageReference Include="IP2Region.Net" Version="2.0.2" />
<PackageReference Include="MailKit" Version="4.11.0" /> <PackageReference Include="MailKit" Version="4.11.0" />
<PackageReference Include="Masa.Contrib.Service.MinimalAPIs" Version="1.0.0" /> <PackageReference Include="Masa.Contrib.Service.MinimalAPIs" Version="1.0.0" />
@ -53,7 +53,7 @@
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" /> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" />
<PackageReference Include="MimeKit" Version="4.11.0" /> <PackageReference Include="MimeKit" Version="4.11.0" />
<PackageReference Include="MiniExcel" Version="1.41.2" /> <PackageReference Include="MiniExcel" Version="1.41.2" />
<PackageReference Include="Minio" Version="6.0.5" /> <PackageReference Include="Minio" Version="6.0.3" />
<PackageReference Include="MiniWord" Version="0.9.2" /> <PackageReference Include="MiniWord" Version="0.9.2" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0"> <PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
@ -62,9 +62,9 @@
<PackageReference Include="NPOI" Version="2.7.4" /> <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="112.1.0" /> <PackageReference Include="RestSharp" Version="112.1.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.10" /> <PackageReference Include="SixLabors.ImageSharp" Version="3.1.11" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="8.0.2" /> <PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="8.0.2" />
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.3.0" /> <PackageReference Include="ZiggyCreatures.FusionCache" Version="2.4.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -957,16 +957,6 @@
<param name="_dictionaryService"></param> <param name="_dictionaryService"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetAnalysisTaskList_Export(IRaCIS.Core.Application.ViewModel.VisitTaskQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},IRaCIS.Application.Interfaces.IDictionaryService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
<summary>
一致性分析结果导出 7 8 分别是自身 和组件一致性
</summary>
<param name="inQuery"></param>
<param name="_commonDocumentRepository"></param>
<param name="_dictionaryService"></param>
<param name="_trialRepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetTrialReadingCriterionCanExportDocumentList(System.Guid)"> <member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetTrialReadingCriterionCanExportDocumentList(System.Guid)">
<summary> <summary>
获取阅片标准可以导出的列表 获取阅片标准可以导出的列表
@ -1126,6 +1116,14 @@
<param name="trialId"></param> <param name="trialId"></param>
<returns></returns> <returns></returns>
</member> </member>
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.TrialImageDownloadService.TrialImageAddExtralField(System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries})" -->
<member name="M:IRaCIS.Core.Application.Service.TrialImageDownloadService.DownloadDeleteTrialImage(System.Guid)">
<summary>
下载已经删除的影像
</summary>
<param name="trialId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.TrialImageDownloadService.WriteTrialNeedDealData(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},System.Guid)"> <member name="M:IRaCIS.Core.Application.Service.TrialImageDownloadService.WriteTrialNeedDealData(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},System.Guid)">
<summary> <summary>
读取该项目的数据,进行维护 读取该项目的数据,进行维护
@ -1142,7 +1140,7 @@
<param name="_hostEnvironment"></param> <param name="_hostEnvironment"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.TrialImageDownloadService.ArchiveDicomFileAsync(FellowOakDicom.DicomFile,System.Guid,System.Guid,System.Guid,System.String,System.Int64,System.Collections.Generic.List{System.Guid},System.Collections.Generic.List{System.Guid})"> <member name="M:IRaCIS.Core.Application.Service.TrialImageDownloadService.ArchiveDicomFileAsync(FellowOakDicom.DicomDataset,System.Guid,System.Guid,System.Guid)">
<summary> <summary>
单个文件接收 归档 单个文件接收 归档
</summary> </summary>
@ -1493,19 +1491,92 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditDocument},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)"> <member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditDocument},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditRecord},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditRecordPermission},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditRecordIdentityUser},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditDocumentClosure},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
<summary> <summary>
稽查文档 稽查文档
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetAuditDocumentList(IRaCIS.Core.Application.ViewModel.AuditDocumentQuery)"> <member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetAuditRecordSelectList(IRaCIS.Core.Application.ViewModel.AuditRecordQuery)">
<summary> <summary>
获取稽查文档 查看授权时间内的稽查 admin qa 看所有 EA只看到自己参与的
</summary> </summary>
<param name="inQuery"></param> <param name="inQuery"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetAuditRecordList(IRaCIS.Core.Application.ViewModel.AuditRecordQuery)">
<summary>
稽查记录 列表
</summary>
<param name="inQuery"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.DeleteAuditRecord(System.Guid)">
<summary>
删除稽查记录
</summary>
<param name="auditRecordId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.SetAuditRecordPermission(IRaCIS.Core.Application.ViewModel.SetAuditRecordPermissionCommand)">
<summary>
设置稽查记录某个文件 或者某个文件夹授权
</summary>
<param name="inCommand"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.AddClosureRelationsAsync(System.Guid,System.Nullable{System.Guid})">
<summary>
插入闭包表关系
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetAuditDocumentData(IRaCIS.Core.Application.ViewModel.GetAuditDocumentDataInDto)">
<summary>
获取文件树形结构 (传Id 根节点就是自己)
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.SetIsAuthorization(IRaCIS.Core.Application.ViewModel.SetIsAuthorizationInDto)">
<summary>
设置是否授权
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.DeleteAuditDocument(IRaCIS.Core.Application.ViewModel.DeleteAuditDocumentInDto)">
<summary>
删除稽查文档
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.SetCurrentVersion(IRaCIS.Core.Application.ViewModel.SetCurrentVersionInDto)">
<summary>
把历史版本设置为当前版本--修改 维护闭包表,之间的闭包关系指向新版本文件
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetBreadcrumbData(IRaCIS.Core.Application.ViewModel.GetBreadcrumbDataInDto)">
<summary>
获取面包屑导航 (查询自己的祖先,不包括自己)
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.MovieFileOrFolder(IRaCIS.Core.Application.ViewModel.MovieFileOrFolderInDto)">
<summary>
移动文件或者文件夹 到其他文件夹
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.CopyFileOrFolder(IRaCIS.Core.Application.ViewModel.MovieFileOrFolderInDto)">
<summary>
复制文件或者文件夹
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.UpdateAuditDocument(IRaCIS.Core.Application.ViewModel.AuditDocumentUpdateDto)"> <member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.UpdateAuditDocument(IRaCIS.Core.Application.ViewModel.AuditDocumentUpdateDto)">
<summary> <summary>
修改稽查文档 修改稽查文档
@ -1523,7 +1594,7 @@
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.AddAuditDocument(System.Collections.Generic.List{IRaCIS.Core.Application.ViewModel.AuditDocumentAddOrEdit})"> <member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.AddAuditDocument(System.Collections.Generic.List{IRaCIS.Core.Application.ViewModel.AuditDocumentAddOrEdit})">
<summary> <summary>
新增稽查文档 新增稽查文档 (批量上传文件时才是数组,文件夹时单个对象)
</summary> </summary>
<param name="inDto"></param> <param name="inDto"></param>
<returns></returns> <returns></returns>
@ -1534,39 +1605,13 @@
</summary> </summary>
<param name="inDto"></param> <param name="inDto"></param>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetBreadcrumbData(IRaCIS.Core.Application.ViewModel.GetBreadcrumbDataInDto)"> <member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetAuditDocumentList(IRaCIS.Core.Application.ViewModel.AuditDocumentQuery)">
<summary> <summary>
获取面包屑导航 获取稽查文档
</summary> </summary>
<param name="inDto"></param> <param name="inQuery"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetAuditDocumentData(IRaCIS.Core.Application.ViewModel.GetAuditDocumentDataInDto)">
<summary>
获取文件树形结构 (传Id 根节点就是自己)
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.DeleteAuditDocument(IRaCIS.Core.Application.ViewModel.DeleteAuditDocumentInDto)">
<summary>
删除稽查文档
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.MovieFileOrFolder(IRaCIS.Core.Application.ViewModel.MovieFileOrFolderInDto)">
<summary>
移动文件或者文件夹 到其他文件夹
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.CopyFileOrFolder(IRaCIS.Core.Application.ViewModel.MovieFileOrFolderInDto)">
<summary>
复制文件或者文件夹
</summary>
<param name="inDto"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetHistoricalVersion(IRaCIS.Core.Application.ViewModel.GetHistoricalVersionInDto)"> <member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetHistoricalVersion(IRaCIS.Core.Application.ViewModel.GetHistoricalVersionInDto)">
<summary> <summary>
@ -1575,19 +1620,6 @@
<param name="inDto"></param> <param name="inDto"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.SetCurrentVersion(IRaCIS.Core.Application.ViewModel.SetCurrentVersionInDto)">
<summary>
把历史版本设置为当前版本
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.SetIsAuthorization(IRaCIS.Core.Application.ViewModel.SetIsAuthorizationInDto)">
<summary>
设置是否授权
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="T:IRaCIS.Core.Application.Service.SysFileTypeService"> <member name="T:IRaCIS.Core.Application.Service.SysFileTypeService">
<summary> <summary>
系统文件类型 系统文件类型
@ -2801,7 +2833,7 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.UserService.GetUserList(IRaCIS.Application.Contracts.UserListQueryDTO)"> <member name="M:IRaCIS.Core.Application.Service.UserService.GetUserList(IRaCIS.Application.Contracts.UserListQueryDTO,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditRecordIdentityUser})">
<summary> <summary>
获取用户列表 获取用户列表
</summary> </summary>
@ -8722,11 +8754,6 @@
截图地址 截图地址
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableAnswerRowInfoBase.FristAddTaskNum">
<summary>
第一次添加的任务ID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableAnswerRowInfoBase.CreateUserId"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableAnswerRowInfoBase.CreateUserId">
<summary> <summary>
CreateUserId CreateUserId
@ -9137,6 +9164,11 @@
修约小数点 修约小数点
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReadingTaskDto.IsViewStudyPart">
<summary>
是否查看检查部位
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReadingTaskDto.CriterionType"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReadingTaskDto.CriterionType">
<summary> <summary>
标准类型 标准类型
@ -12178,6 +12210,11 @@
是否是系统数据 是否是系统数据
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.VisitTaskDto.IsViewStudyPart">
<summary>
是否查看检查部位
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.VisitTaskDto.ReadingCategory"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.VisitTaskDto.ReadingCategory">
<summary> <summary>
任务类型 任务类型
@ -13101,7 +13138,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.NoneDicomStudyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMark},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.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.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.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.UserLog},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingOncologyTaskInfo},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.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.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)">
<summary> <summary>
IR影像阅片 IR影像阅片
</summary> </summary>
@ -13113,6 +13150,13 @@
<param name="inDto"></param> <param name="inDto"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.ViewStudyPart(IRaCIS.Core.Application.Service.Reading.Dto.ViewStudyPartInDto)">
<summary>
查看检查部位
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.DeleteSingleTableQuestionMark(IRaCIS.Core.Application.Service.Reading.Dto.DeleteSingleTableQuestionMarkInDto,System.String)"> <member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.DeleteSingleTableQuestionMark(IRaCIS.Core.Application.Service.Reading.Dto.DeleteSingleTableQuestionMarkInDto,System.String)">
<summary> <summary>
删除单个表格问题标记 删除单个表格问题标记
@ -14275,6 +14319,14 @@
<param name="outEnrollTime"></param> <param name="outEnrollTime"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.TestService.RebuildAuditDocumentClosureAsync(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditDocumentClosure},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditDocument})">
<summary>
重建闭包表
</summary>
<param name="_auditDocumentClosureRepository"></param>
<param name="_auditDocumentRepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.TestService.DeleteConsistentDate(System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskConsistentRule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingConsistentClinicalDataPDF},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingConsistentClinicalData})"> <member name="M:IRaCIS.Core.Application.Service.TestService.DeleteConsistentDate(System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskConsistentRule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingConsistentClinicalDataPDF},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingConsistentClinicalData})">
<summary> <summary>
清理一致性分析任务 清理一致性分析任务

View File

@ -9,6 +9,7 @@ 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
@ -57,17 +58,15 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
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
from identityUser in _identityUserRepository.AsQueryable(false) join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
on trialIdentityUser.IdentityUserId equals identityUser.Id
.Where(t => t.Status == UserStateEnum.Enable &&
t.Id == trialIdentityUser.IdentityUserId &&
t.UserRoleList.Where(t => t.IsUserRoleDisabled == false)
.Any(t => trialDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
join confirm in _trialDocConfirmedUserRepository.Where() on join confirm in _trialDocConfirmedUserRepository.Where() on
new { trialIdentityUser.IdentityUserId, TrialDocumentId = trialDoc.Id } equals new { IdentityUserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc new { trialIdentityUser.IdentityUserId, TrialDocumentId = trialDoc.Id } equals new { IdentityUserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc
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))
select new TrialSignDocView() select new TrialSignDocView()
{ {
TrialCode = trialDoc.Trial.TrialCode, TrialCode = trialDoc.Trial.TrialCode,
@ -191,12 +190,10 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
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
from identityUser in _identityUserRepository.AsQueryable(false) join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
.Where(t => t.Status == UserStateEnum.Enable && on trialIdentityUser.IdentityUserId equals identityUser.Id
t.Id == trialIdentityUser.IdentityUserId && where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted && context.Message.NewUserTypeIds.Contains(ur.UserRole.UserTypeId) && trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
t.UserRoleList.Where(t => t.IsUserRoleDisabled == false)
.Any(t => context.Message.NewUserTypeIds.Contains(t.UserTypeId) &&
trialDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
select new UnionDocumentWithConfirmInfoView() select new UnionDocumentWithConfirmInfoView()
{ {
IsSystemDoc = true, IsSystemDoc = true,
@ -222,11 +219,11 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
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
from identityUser in _identityUserRepository.AsQueryable(false) join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
.Where(t => t.Status == UserStateEnum.Enable && on trialIdentityUser.IdentityUserId equals identityUser.Id
t.Id== trialIdentityUser.IdentityUserId&& where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted &&trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
t.UserRoleList.Where(t => t.IsUserRoleDisabled == false)
.Any(t => trialDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
select new UnionDocumentWithConfirmInfoView() select new UnionDocumentWithConfirmInfoView()
{ {
IsSystemDoc = false, IsSystemDoc = false,

View File

@ -135,7 +135,7 @@ namespace IRaCIS.Core.Application.Service.Common
QuestionAnswerList = g.Select(t => new QCQuestionAnswerExport() { Answer = t.Answer, QuestionName = t.QuesitonName, ShowOrder = t.ShowOrder, QuestionId = t.QuestionId }).OrderBy(t => t.ShowOrder).ToList() QuestionAnswerList = g.Select(t => new QCQuestionAnswerExport() { Answer = t.Answer, QuestionName = t.QuesitonName, ShowOrder = t.ShowOrder, QuestionId = t.QuestionId }).OrderBy(t => t.ShowOrder).ToList()
}).OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitNum).ThenBy(t=>t.CurrentQCEnum).ThenBy(t=>t.AuditTime).ToList(); }).OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitNum).ThenBy(t => t.CurrentQCEnum).ThenBy(t => t.AuditTime).ToList();
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
@ -2310,263 +2310,8 @@ namespace IRaCIS.Core.Application.Service.Common
#region 通用阅片结果导出 #region 通用阅片结果导出
/// <summary>
/// 一致性分析结果导出 7 8 分别是自身 和组件一致性
/// </summary>
/// <param name="inQuery"></param>
/// <param name="_commonDocumentRepository"></param>
/// <param name="_dictionaryService"></param>
/// <param name="_trialRepository"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> GetAnalysisTaskList_Export(VisitTaskQuery inQuery,
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
[FromServices] IDictionaryService _dictionaryService,
[FromServices] IRepository<Trial> _trialRepository)
{
//每次查询必须是单标准的
var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync();
var query = _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.TaskAllocationState == TaskAllocationState.Allocated && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze))
//一致性分析
.WhereIf(inQuery.ReadingExportType == ExportResult.DetailedTableOfIntraReaderAnalysisResults, t => t.IsSelfAnalysis == true || t.IsSelfAnalysis == null)
.WhereIf(inQuery.ReadingExportType == ExportResult.DetailedTableOfIntraReaderAnalysisResults, t => t.IsSelfAnalysis == null ? t.Subject.SubjectVisitTaskList.Any(u => u.IsSelfAnalysis == true && u.VisitTaskNum == t.VisitTaskNum && u.DoctorUserId == t.DoctorUserId && u.TrialReadingCriterionId == t.TrialReadingCriterionId) : true)
.WhereIf(inQuery.ReadingExportType == ExportResult.DetailedTableOfInterReaderAnalysisResults, t => t.IsSelfAnalysis == false || t.IsSelfAnalysis == null)
//访视和全局查询已签名完成的,裁判可以是未签名,未完成的
.Where(t => (t.ReadingTaskState == ReadingTaskState.HaveSigned && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global)) || t.ReadingCategory == ReadingCategory.Judge)
.WhereIf(inQuery.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
.WhereIf(inQuery.TrialSiteId != null, t => t.Subject.TrialSiteId == inQuery.TrialSiteId)
.WhereIf(inQuery.IsUrgent != null, t => t.IsUrgent == inQuery.IsUrgent)
.WhereIf(inQuery.DoctorUserId != null, t => t.DoctorUserId == inQuery.DoctorUserId)
.WhereIf(inQuery.ReadingCategory != null, t => t.ReadingCategory == inQuery.ReadingCategory)
//.WhereIf(inQuery.ReadingTaskState != null, t => t.ReadingTaskState == inQuery.ReadingTaskState)
.WhereIf(inQuery.TaskAllocationState != null, t => t.TaskAllocationState == inQuery.TaskAllocationState)
.WhereIf(inQuery.ArmEnum != null, t => t.ArmEnum == inQuery.ArmEnum)
.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.SubjectCode), t => t.Subject.Code.Contains(inQuery.SubjectCode))
.WhereIf(inQuery.BeginAllocateDate != null, t => t.AllocateTime > inQuery.BeginAllocateDate)
.WhereIf(inQuery.EndAllocateDate != null, t => t.AllocateTime < inQuery.EndAllocateDate);
var list = await query.ProjectTo<AnalysisDynamicCommonExport>(_mapper.ConfigurationProvider,
new
{
readingExportType = inQuery.ReadingExportType,
criterionType = criterion.CriterionType,
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
isEn_Us = _userInfo.IsEn_Us
}).ToListAsync();
list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum).ToList();
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
exportInfo.CriterionName = criterion.CriterionName;
#region 处理系统标准存在疾病和整体肿瘤合并
//如果是以合并后的找翻译字典,会少,所以必须放在前面
var translateDicNameList = list.SelectMany(t => t.QuestionAnswerList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(t => t.TranslateDicName).Distinct().ToList();
//针对1.1 整体肿瘤评估 有的两列要合并一列
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB || criterion.CriterionType == CriterionType.IRECIST1Point1)
{
foreach (var item in list)
{
//处理合并表头
var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.Tumor;
var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault();
if (findItem != null)
{
findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估";
}
if (item.IsBaseline == true)
{
item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.Tumor).ToList();
}
else
{
item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList();
}
}
}
else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
{
foreach (var item in list)
{
//处理合并表头
var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.ImgOncology;
var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault();
if (findItem != null)
{
findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估";
}
if (item.IsBaseline == true)
{
item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ImgOncology).ToList();
}
else
{
item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList();
}
}
}
else if (criterion.CriterionType == CriterionType.PCWG3)
{
}
else if (criterion.CriterionType == CriterionType.SelfDefine)
{
//自定义的又问题名称重复 所以统一加上组名
//有重复的就加,没有重复的就不加
if (list.Any(t => t.QuestionAnswerList.Select(t => t.QuestionName).Count() != t.QuestionAnswerList.Select(t => t.QuestionName).Distinct().Count()))
{
foreach (var item in list)
{
foreach (var qs in item.QuestionAnswerList)
{
qs.QuestionName = qs.Group + "_" + qs.QuestionName;
}
}
}
}
#endregion
var export_Template = StaticData.Export.TrialSelfAnalysisList_Export;
#region 自身一致性分析和组间一致性分析
if (inQuery.ReadingExportType == ExportResult.DetailedTableOfIntraReaderAnalysisResults)
{
//找到非一致性分析的任务
var selfExportList = list.Where(t => t.IsSelfAnalysis == null).ToList();
//处理一致性分析结果是否和原始阅片是否一致
foreach (var item in selfExportList)
{
//找到一致性分析的结果
var selfAnalysisTask = list.Where(t => t.IsSelfAnalysis == true && t.SubjectCode == item.SubjectCode && t.VisitTaskNum == item.VisitTaskNum && t.TaskName == t.TaskName && t.UserName == item.UserName).FirstOrDefault();
//将自身一致性分析的字段 赋值到访视任务这个字段
item.IsAnalysisDiffToOriginalData = selfAnalysisTask?.IsAnalysisDiffToOriginalData;
//处理再次阅片人的结果
if (selfAnalysisTask != null)
{
var cloneQuestionAnswerList = selfAnalysisTask.QuestionAnswerList.Clone();
foreach (var qItem in cloneQuestionAnswerList)
{
qItem.QuestionName = qItem.QuestionName + $"{(_userInfo.IsEn_Us ? "(Again)" : "()")}";
}
item.QuestionAnswerList = item.QuestionAnswerList.Union(cloneQuestionAnswerList).ToList();
}
}
list = selfExportList;
}
else
{
export_Template = StaticData.Export.TrialGroupAnalysisList_Export;
var newList = new List<AnalysisDynamicCommonExport>();
foreach (var group in list.GroupBy(t => new { t.SubjectCode, t.VisitTaskNum, t.TaskName }).OrderBy(g => g.Key.SubjectCode).ThenBy(g => g.Key.VisitTaskNum))
{
var subjectVisitGroupList = group.ToList();
//找到当前访视组间一致性分析的任务结果
var groupOtherTaskList = subjectVisitGroupList.Where(t => t.IsSelfAnalysis == false).ToList();
foreach (var subjectVisitTaskArm in subjectVisitGroupList.Where(t => t.IsSelfAnalysis == null).OrderBy(t => t.ArmEnum))
{
foreach (var otherTask in groupOtherTaskList)
{
//非一致性分析任务
var cloneObj = subjectVisitTaskArm.Clone();
var otherTaskQuestionAnserList = otherTask.QuestionAnswerList.Clone();
foreach (var qItem in otherTaskQuestionAnserList)
{
qItem.QuestionName = qItem.QuestionName + $"{(_userInfo.IsEn_Us ? "(Again)" : "()")}";
}
//处理 再次阅片人,再次阅片人角色 两列
var addQuestionList = new List<CommonQuesionInfo>();
addQuestionList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Reviwer(Again)" : "阅片人(再次)", QuestionValue = otherTask.UserName });
addQuestionList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Reviwer Role(Again)" : "阅片人角色(再次)", QuestionValue = ((int)otherTask.ArmEnum).ToString(), TranslateDicName = "ArmEnum" });
cloneObj.QuestionAnswerList = cloneObj.QuestionAnswerList.Union(addQuestionList).Union(otherTaskQuestionAnserList).ToList();
cloneObj.IsGroupAnalysisDiffToOriginalData = cloneObj.ArmEnum == Arm.DoubleReadingArm1 ? otherTask.IsGroupDiffArm1 : otherTask.IsGroupDiffArm2;
newList.Add(cloneObj);
}
}
}
translateDicNameList.Add("ArmEnum");
list = newList;
}
#endregion
var columNameList = list.SelectMany(t => t.QuestionAnswerList).Where(t => t.QuestionName.IsNotNullOrEmpty()).Select(t => t.QuestionName).Distinct().ToList();
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list.Where(t => t.ReadingCategory != ReadingCategory.Global).ToList(), _userInfo.TimeZoneId);
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
var dynamicColumnConfig = new DynamicColumnConfig()
{
//可读的列表名行索引,不是{{}} 模板行索引
AutoColumnTitleRowIndex = 2,
AutoColumnStartIndex = 5,
TempalteLastColumnIndex = 4,
DynamicItemDicName = "TranslateDicName",
DynamicItemValueName = "QuestionValue",
DynamicItemTitleName = "QuestionName",
DynamicListName = "QuestionAnswerList",
RemoveColunmIndexList = new List<int>() { },
ColumnIdNameList = columNameList.Select(t => new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = t }).ToList(),
TranslateDicNameList = translateDicNameList ?? new List<string>()
};
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(AnalysisDynamicCommonExport), criterion.CriterionType, dynamicColumnConfig);
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}_{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
};
}
/// <summary> /// <summary>
/// 获取阅片标准可以导出的列表 /// 获取阅片标准可以导出的列表
@ -2897,7 +2642,8 @@ namespace IRaCIS.Core.Application.Service.Common
{ {
#region 外层问题处理 #region 外层问题处理
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB || criterion.CriterionType == CriterionType.IRECIST1Point1) if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC)
{ {
fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem() fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem()
@ -2940,7 +2686,8 @@ namespace IRaCIS.Core.Application.Service.Common
var extralNameList = new List<DynamicColumnConfig.ColumItem>(); var extralNameList = new List<DynamicColumnConfig.ColumItem>();
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC
|| criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
{ {
//if(inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions) //if(inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions)
@ -2981,7 +2728,8 @@ namespace IRaCIS.Core.Application.Service.Common
var addLessionInfoList = new List<CommonQuesionInfo>(); var addLessionInfoList = new List<CommonQuesionInfo>();
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC
|| criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
{ {
//病灶编号 和病灶类型没有配置,但是需要有的 //病灶编号 和病灶类型没有配置,但是需要有的
addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion ID" : "病灶编号", QuestionValue = lession.LessionCode }); addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion ID" : "病灶编号", QuestionValue = lession.LessionCode });
@ -3021,7 +2769,8 @@ namespace IRaCIS.Core.Application.Service.Common
#endregion #endregion
#region 不管是list 还是taskList 最终处理的数据都是list 处理好数据后合并 #region 不管是list 还是taskList 最终处理的数据都是list 处理好数据后合并
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB || criterion.CriterionType == CriterionType.IRECIST1Point1) if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC)
{ {
//针对1.1 整体肿瘤评估 有的两列要合并一列 //针对1.1 整体肿瘤评估 有的两列要合并一列
foreach (var item in list) foreach (var item in list)

View File

@ -760,7 +760,7 @@ namespace IRaCIS.Core.Application.Service
if (feedBack.VisitTaskId != null) if (feedBack.VisitTaskId != null)
{ {
var emailType = await _dictionaryRepository.Where(t => t.Parent.Code == "Email_BusinessScenario" && t.ParentId != null && t.Code == ((int)EmailBusinessScenario.IRImageError).ToString()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefaultAsync(); var emailType = await _dictionaryRepository.Where(t => t.Parent.Code == "FeedBackTypeToIR" && t.ParentId != null && t.Code == ((int)feedBack.QuestionType).ToString()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefaultAsync();
var info = await _visitTaskRepository.Where(t => t.Id == feedBack.VisitTaskId).Select(t => new { t.Trial.ResearchProgramNo, t.Trial.TrialCode, SubejctCode = t.Subject.Code, t.SourceSubjectVisit.VisitName }).FirstNotNullAsync(); var info = await _visitTaskRepository.Where(t => t.Id == feedBack.VisitTaskId).Select(t => new { t.Trial.ResearchProgramNo, t.Trial.TrialCode, SubejctCode = t.Subject.Code, t.SourceSubjectVisit.VisitName }).FirstNotNullAsync();

View File

@ -9,6 +9,95 @@ using IRaCIS.Core.Domain.Share;
using System.Collections.Generic; using System.Collections.Generic;
namespace IRaCIS.Core.Application.ViewModel; namespace IRaCIS.Core.Application.ViewModel;
public class AuditRecordView : AuditRecordAddOrEdit
{
public Guid CreateUserId { get; set; }
public DateTime CreateTime { get; set; }
public Guid UpdateUserId { get; set; }
public DateTime UpdateTime { get; set; }
public new List<Guid> IdnetityUserIdList => IdentityUserList.Select(t => t.Id).ToList();
public List<AuditIdentiUserInfo> IdentityUserList { get; set; }
}
public class AuditIdentiUserInfo
{
public Guid Id { get; set; }
public string UserName { get; set; }
public string FullName { get; set; }
}
public class AuditRecordAddOrEdit
{
public Guid? Id { get; set; }
public string CompanyName { get; set; }
public string AuditContent { get; set; }
public DateOnly AuditTime { get; set; }
public DateTime? BeginTime { get; set; }
public DateTime? EndTime { get; set; }
public AuditState AuditState { get; set; }
public AuditType AuditType { get; set; }
//public List<Guid> IdnetityUserIdList { get; set; }
}
public class AddOrDeleteAuditUserCommand
{
public Guid AuditRecordId { get; set; }
public List<Guid> IdentityUserIdList { get; set; }
public bool IsAdd { get; set; }
}
public class AuditRecordQuery : PageInput
{
public string? CompanyName { get; set; }
public string? AuditContent { get; set; }
public DateOnly? BeginAuditTime { get; set; }
public DateOnly? EndAuditTime { get; set; }
public DateTime? BeginTime { get; set; }
public DateTime? EndTime { get; set; }
public AuditState? AuditState { get; set; }
public AuditType? AuditType { get; set; }
public DateTime? BeginCreateTime { get; set; }
public DateTime? EndCreateTime { get; set; }
public string? IdentityUserName { get; set; }
}
public class SetAuditRecordPermissionCommand
{
public List<Guid> AuditDocumentIdList { get; set; }
public Guid AuditRecordId { get; set; }
public bool IsAuthorization { get; set; }
}
public class DeleteAudit public class DeleteAudit
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
@ -24,16 +113,21 @@ public class DeleteAuditDocumentInDto
public List<Guid> Ids { get; set; } public List<Guid> Ids { get; set; }
} }
public class GetAuditDocumentDataInDto:PageInput public class GetAuditDocumentDataInDto : PageInput
{ {
public Guid? Id { get; set; } public Guid? Id { get; set; }
public Guid? SelfId { get; set; } public Guid? SelfId { get; set; }
public bool? IsAuthorization { get; set; } public bool? IsAuthorization { get; set; }
public bool? IsCurrentAuditRecordAuthorization { get; set; }
public string Name { get; set; } = string.Empty; public string Name { get; set; } = string.Empty;
//当前稽查记录Id
public Guid? AuditRecordId { get; set; }
} }
public class GetAuditDocumentDataOutDto public class GetAuditDocumentDataOutDto
@ -53,17 +147,20 @@ public class AuditDocumentData : AuditDocumentUpdateDto
public int? Version { get; set; } public int? Version { get; set; }
public int HistoricalVersionsCount { get; set; } public int HistoricalVersionsCount { get; set; }
public List<AuditDocumentData> Children { get; set; }=new List<AuditDocumentData> (){ }; public List<AuditDocumentData> Children { get; set; } = new List<AuditDocumentData>() { };
public bool? IsCurrentAuditRecordAuthorization { get; set; }
} }
public class AuditDocumentView : AuditDocumentAddOrEdit public class AuditDocumentView : AuditDocumentAddOrEdit
{ {
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
public DateTime UpdateTime { get; set; } public DateTime UpdateTime { get; set; }
} }
public class SetIsAuthorizationInDto public class SetIsAuthorizationInDto
@ -80,7 +177,7 @@ public class SetCurrentVersionInDto
public class GetHistoricalVersionInDto public class GetHistoricalVersionInDto
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
} }
public class GetHistoricalVersionOutDto public class GetHistoricalVersionOutDto
@ -93,10 +190,10 @@ public class MovieFileOrFolderInDto
{ {
public List<Guid> Ids { get; set; } public List<Guid> Ids { get; set; }
public Guid ParentId { get; set; } public Guid? ParentId { get; set; }
} }
public class HistoricalVersionDto: AuditDocumentUpdateDto public class HistoricalVersionDto : AuditDocumentUpdateDto
{ {
public bool IsCurrentVersion { get; set; } = false; public bool IsCurrentVersion { get; set; } = false;
@ -113,7 +210,7 @@ public class AuditDocumentUpdateDto
public AuditDocumentType AuditDocumentTypeEnum { get; set; } public AuditDocumentType AuditDocumentTypeEnum { get; set; }
public string? FileFormat { get; set; } public string? FileFormat { get; set; }
public string? FilePath { get; set; } public string? FilePath { get; set; }
@ -133,34 +230,34 @@ public class GetBreadcrumbDataInDto
public Guid Id { get; set; } public Guid Id { get; set; }
} }
public class AuditDocumentAddOrEdit: AuditDocumentUpdateDto public class AuditDocumentAddOrEdit : AuditDocumentUpdateDto
{ {
public List<AuditDocumentAddOrEdit> Children { get; set; }=new List<AuditDocumentAddOrEdit>() { };
public List<AuditDocumentAddOrEdit> Children { get; set; } = new List<AuditDocumentAddOrEdit>() { };
public bool IsUpdate { get; set; } = true; public bool IsUpdate { get; set; } = true;
} }
public class AuditDocumentQuery:PageInput public class AuditDocumentQuery : PageInput
{ {
public AuditDocumentType? AuditDocumentTypeEnum { get; set; } public AuditDocumentType? AuditDocumentTypeEnum { get; set; }
public string? FileFormat { get; set; } public string? FileFormat { get; set; }
public string? FilePath { get; set; } public string? FilePath { get; set; }
public decimal? FileSize { get; set; } public decimal? FileSize { get; set; }
public bool? IsAuthorization { get; set; } public bool? IsAuthorization { get; set; }
public Guid? MainFileId { get; set; } public Guid? MainFileId { get; set; }
public string? Name { get; set; } public string? Name { get; set; }
public Guid? ParentId { get; set; } public Guid? ParentId { get; set; }
} }

View File

@ -900,7 +900,12 @@ namespace IRaCIS.Core.Application.Services
/// <returns></returns> /// <returns></returns>
public async Task<IResponseOutput> GetSysDocSignUserList() public async Task<IResponseOutput> GetSysDocSignUserList()
{ {
var list = _systemDocConfirmedUserRepository.Where(t => t.ConfirmTime != null).Select(t => new { t.ConfirmUserId, t.ConfirmUser.UserName, t.ConfirmUser.FullName }).Distinct().ToList(); //EA 只能查看内部人员文档
var isEA = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.EA;
var list = _systemDocConfirmedUserRepository.Where(t => t.ConfirmTime != null)
.WhereIf(isEA, t => t.ConfirmUser.IsZhiZhun == true)
.Select(t => new { t.ConfirmUserId, t.ConfirmUser.UserName, t.ConfirmUser.FullName }).Distinct().ToList();
return ResponseOutput.Ok(list); return ResponseOutput.Ok(list);
} }
@ -911,12 +916,15 @@ namespace IRaCIS.Core.Application.Services
var isInternal = _userInfo.IsZhiZhun; var isInternal = _userInfo.IsZhiZhun;
var isEA = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.EA;
var systemDocQuery = var systemDocQuery =
from sysDoc in _systemDocumentRepository.AsQueryable(false) from sysDoc in _systemDocumentRepository.AsQueryable(false)
.Where(t => inQuery.UserTypeId != null ? t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == inQuery.UserTypeId) : true) .Where(t => inQuery.UserTypeId != null ? t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == inQuery.UserTypeId) : true)
from identityUser in _identityUserRepository.AsQueryable(false).Where(t => t.Status == UserStateEnum.Enable && 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 && t.UserRoleList.Where(t => t.IsUserRoleDisabled == false).Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
.Where(t => inQuery.UserId != null ? t.Id == inQuery.UserId : true) .Where(t => inQuery.UserId != null ? t.Id == inQuery.UserId : true)
.Where(t => inQuery.UserTypeId != null ? t.UserRoleList.Any(t => t.UserTypeId == inQuery.UserTypeId && t.IsUserRoleDisabled == false) : true) .Where(t => inQuery.UserTypeId != null ? t.UserRoleList.Any(t => t.UserTypeId == inQuery.UserTypeId && t.IsUserRoleDisabled == false) : true)
.Where(t => isEA ? t.IsZhiZhun == true : true) //EA 只能查看内部人员文档
join confirm in _systemDocConfirmedUserRepository.Where() on new { ConfirmUserId = identityUser.Id, SystemDocumentId = sysDoc.Id } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc join confirm in _systemDocConfirmedUserRepository.Where() on new { ConfirmUserId = identityUser.Id, SystemDocumentId = sysDoc.Id } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc
from confirm in cc.DefaultIfEmpty() from confirm in cc.DefaultIfEmpty()
select new UnionDocumentWithConfirmInfoView() select new UnionDocumentWithConfirmInfoView()
@ -942,7 +950,14 @@ namespace IRaCIS.Core.Application.Services
//UserTypeId = trialUser.UserRole.UserTypeId, //UserTypeId = trialUser.UserRole.UserTypeId,
//UserTypeShortName = trialUser.UserRole.UserTypeRole.UserTypeShortName, //UserTypeShortName = trialUser.UserRole.UserTypeRole.UserTypeShortName,
FullFilePath = sysDoc.Path FullFilePath = sysDoc.Path,
AttachmentCount = sysDoc.SystemDocumentAttachmentList.Where(t => t.OffLine == false).Count(),
DocNeedSignUserTypeList = sysDoc.NeedConfirmedUserTypeList.Select(t => t.UserTypeRole.UserTypeShortName).ToList(),
IdentityUserTypeList = identityUser.UserRoleList.Where(t => t.IsUserRoleDisabled == false).Select(c => c.UserTypeRole.UserTypeShortName).ToList()
}; };
var unionQuery = systemDocQuery.IgnoreQueryFilters().Where(t => !(t.IsDeleted == true && t.ConfirmTime == null)) var unionQuery = systemDocQuery.IgnoreQueryFilters().Where(t => !(t.IsDeleted == true && t.ConfirmTime == null))
@ -956,44 +971,44 @@ namespace IRaCIS.Core.Application.Services
.WhereIf(inQuery.EndCreateTime != null, t => t.CreateTime <= inQuery.EndCreateTime) .WhereIf(inQuery.EndCreateTime != null, t => t.CreateTime <= inQuery.EndCreateTime)
.WhereIf(!string.IsNullOrEmpty(inQuery.UserName), t => t.UserName.Contains(inQuery.UserName)) .WhereIf(!string.IsNullOrEmpty(inQuery.UserName), t => t.UserName.Contains(inQuery.UserName))
.WhereIf(inQuery.IsDeleted != null, t => t.IsDeleted == inQuery.IsDeleted) .WhereIf(inQuery.IsDeleted != null, t => t.IsDeleted == inQuery.IsDeleted)
.WhereIf(isInternal == false, t => t.ConfirmTime != null); .WhereIf(isInternal == false, t => t.ConfirmTime != null); //不是内部的人,看有签名时间的
var result = await unionQuery.ToPagedListAsync(inQuery); var result = await unionQuery.ToPagedListAsync(inQuery);
#region 处理文档 需要签署的角色类型 和每个人的角色信息 #region 处理文档 需要签署的角色类型 和每个人的角色信息
var trialDocIdList = result.CurrentPageData.Where(t => t.IsSystemDoc == false).Select(t => t.Id).ToList(); //var trialDocIdList = result.CurrentPageData.Where(t => t.IsSystemDoc == false).Select(t => t.Id).ToList();
var sysDocIdList = result.CurrentPageData.Where(t => t.IsSystemDoc == true).Select(t => t.Id).ToList(); //var sysDocIdList = result.CurrentPageData.Where(t => t.IsSystemDoc == true).Select(t => t.Id).ToList();
var identityUserIdList = result.CurrentPageData.Select(t => t.ConfirmUserId).Distinct().ToList(); //var identityUserIdList = result.CurrentPageData.Select(t => t.ConfirmUserId).Distinct().ToList();
var sysDocUserTypeList = _systemDocNeedConfirmedUserTypeRepository.Where(t => sysDocIdList.Contains(t.SystemDocumentId)).Select(t => new { t.SystemDocumentId, t.UserTypeRole.UserTypeShortName }).ToList(); //var sysDocUserTypeList = _systemDocNeedConfirmedUserTypeRepository.Where(t => sysDocIdList.Contains(t.SystemDocumentId)).Select(t => new { t.SystemDocumentId, t.UserTypeRole.UserTypeShortName }).ToList();
var identityUserUserTypeList = _identityUserRepository.Where(t => identityUserIdList.Contains(t.Id)).IgnoreQueryFilters().Select(t => new { IdentityUserId = t.Id, UserTypeList = t.UserRoleList.Where(t => t.IsUserRoleDisabled == false).Select(c => c.UserTypeRole.UserTypeShortName).ToList() }); //var identityUserUserTypeList = _identityUserRepository.Where(t => identityUserIdList.Contains(t.Id)).IgnoreQueryFilters().Select(t => new { IdentityUserId = t.Id, UserTypeList = t.UserRoleList.Where(t => t.IsUserRoleDisabled == false).Select(c => c.UserTypeRole.UserTypeShortName).ToList() });
//Concat 不能用导航属性 ////Concat 不能用导航属性
var sysids = result.CurrentPageData.Where(t => t.IsSystemDoc == true).Select(t => t.Id).ToList(); //var sysids = result.CurrentPageData.Where(t => t.IsSystemDoc == true).Select(t => t.Id).ToList();
var sysDataList = await _systemDocumentRepository.Where(x => sysids.Contains(x.Id)).Include(x => x.SystemDocumentAttachmentList).ToListAsync(); //var sysDataList = await _systemDocumentRepository.Where(x => sysids.Contains(x.Id)).Include(x => x.SystemDocumentAttachmentList).ToListAsync();
foreach (var item in result.CurrentPageData) //foreach (var item in result.CurrentPageData)
{ //{
if (sysDataList.Any(y => y.Id == item.Id)) // if (sysDataList.Any(y => y.Id == item.Id))
{ // {
item.AttachmentCount = sysDataList.Where(y => y.Id == item.Id).Select(x => x.SystemDocumentAttachmentList.Where(z => !z.OffLine).Count()).FirstOrDefault(); // item.AttachmentCount = sysDataList.Where(y => y.Id == item.Id).Select(x => x.SystemDocumentAttachmentList.Where(z => !z.OffLine).Count()).FirstOrDefault();
} // }
if (item.IsSystemDoc) // if (item.IsSystemDoc)
{ // {
item.DocNeedSignUserTypeList = sysDocUserTypeList.Where(t => t.SystemDocumentId == item.Id).Select(t => t.UserTypeShortName).ToList(); // item.DocNeedSignUserTypeList = sysDocUserTypeList.Where(t => t.SystemDocumentId == item.Id).Select(t => t.UserTypeShortName).ToList();
} // }
item.IdentityUserTypeList = identityUserUserTypeList.Where(t => t.IdentityUserId == item.ConfirmUserId).SelectMany(c => c.UserTypeList).ToList(); // item.IdentityUserTypeList = identityUserUserTypeList.Where(t => t.IdentityUserId == item.ConfirmUserId).SelectMany(c => c.UserTypeList).ToList();
} //}
#endregion #endregion

View File

@ -29,7 +29,8 @@ namespace IRaCIS.Core.Application.Service
CreateMap<AuditDocument, AuditDocumentUpdateDto>(); CreateMap<AuditDocument, AuditDocumentUpdateDto>();
CreateMap<AuditDocument, HistoricalVersionDto>(); CreateMap<AuditDocument, HistoricalVersionDto>();
CreateMap<AuditDocumentUpdateDto, AuditDocumentAddOrEdit>(); CreateMap<AuditDocumentUpdateDto, AuditDocumentAddOrEdit>();
CreateMap<AuditDocument, AuditDocumentData>(); CreateMap<AuditDocument, AuditDocumentData>()
.ForMember(d => d.HistoricalVersionsCount, u => u.MapFrom(s => s.AuditDocumentOldVersionList.Count()));
CreateMap<AuditDocument, AuditDocumentAddOrEdit>().ReverseMap(); CreateMap<AuditDocument, AuditDocumentAddOrEdit>().ReverseMap();
CreateMap<SystemDocument, SystemDocumentView>() CreateMap<SystemDocument, SystemDocumentView>()
.ForMember(d => d.AttachmentCount, u => u.MapFrom(s => s.SystemDocumentAttachmentList.Count())) .ForMember(d => d.AttachmentCount, u => u.MapFrom(s => s.SystemDocumentAttachmentList.Count()))
@ -43,7 +44,7 @@ namespace IRaCIS.Core.Application.Service
.ForMember(dest => dest.CreateUserRole, opt => opt.Ignore()); .ForMember(dest => dest.CreateUserRole, opt => opt.Ignore());
CreateMap<TrialDocument, TrialDocumentView>() CreateMap<TrialDocument, TrialDocumentView>()
.ForMember(d => d.AttachmentCount, u => u.MapFrom(s =>s.TrialDocumentAttachmentList.Count())) .ForMember(d => d.AttachmentCount, u => u.MapFrom(s => s.TrialDocumentAttachmentList.Count()))
.ForMember(d => d.FileType, u => u.MapFrom(s => isEn_Us ? s.FileType.Value : s.FileType.ValueCN)) .ForMember(d => d.FileType, u => u.MapFrom(s => isEn_Us ? s.FileType.Value : s.FileType.ValueCN))
.ForMember(d => d.IsSomeUserSigned, u => u.MapFrom(s => s.TrialDocConfirmedUserList.Any(t => t.ConfirmTime != null))) .ForMember(d => d.IsSomeUserSigned, u => u.MapFrom(s => s.TrialDocConfirmedUserList.Any(t => t.ConfirmTime != null)))
.ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path)); .ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path));
@ -81,7 +82,7 @@ namespace IRaCIS.Core.Application.Service
CreateMap<BatchAddTrialEmailNoticeConfig, TrialEmailNoticeConfig>(); CreateMap<BatchAddTrialEmailNoticeConfig, TrialEmailNoticeConfig>();
CreateMap<TrialSelectEmailNoticeConfigView, BatchAddTrialEmailNoticeConfig > (); CreateMap<TrialSelectEmailNoticeConfigView, BatchAddTrialEmailNoticeConfig>();
CreateMap<AddOrEditTrialDocument, TrialDocument>() CreateMap<AddOrEditTrialDocument, TrialDocument>()
@ -94,13 +95,14 @@ namespace IRaCIS.Core.Application.Service
CreateMap<AddOrEditSystemDocument, SystemDocument>().ForMember(d => d.NeedConfirmedUserTypeList, c => c.MapFrom(t => t.NeedConfirmedUserTypeIdList)); CreateMap<AddOrEditSystemDocument, SystemDocument>().ForMember(d => d.NeedConfirmedUserTypeList, c => c.MapFrom(t => t.NeedConfirmedUserTypeIdList));
CreateMap<Guid, SystemDocNeedConfirmedUserType>().EqualityComparison((odto, o) => odto == o.NeedConfirmUserTypeId) CreateMap<Guid, SystemDocNeedConfirmedUserType>()
.EqualityComparison((odto, o) => odto == o.NeedConfirmUserTypeId)
.ForMember(d => d.NeedConfirmUserTypeId, c => c.MapFrom(t => t)) .ForMember(d => d.NeedConfirmUserTypeId, c => c.MapFrom(t => t))
.ForMember(d => d.SystemDocumentId, c => c.Ignore()); .ForMember(d => d.SystemDocumentId, c => c.Ignore());
CreateMap<TrialEmailNoticeConfig, TrialEmailNoticeConfigView>() CreateMap<TrialEmailNoticeConfig, TrialEmailNoticeConfigView>()
.ForMember(d => d.SysCriterionTypeList, c => c.MapFrom(t => t.SysEmailNoticeConfig.CriterionTypeList)) .ForMember(d => d.SysCriterionTypeList, c => c.MapFrom(t => t.SysEmailNoticeConfig.CriterionTypeList))
.ForMember(d => d.TrialCriterionName, c => c.MapFrom(t => t.TrialReadingCriterion.CriterionName)) .ForMember(d => d.TrialCriterionName, c => c.MapFrom(t => t.TrialReadingCriterion.CriterionName))
.ForMember(d => d.TrialEmailNoticeUserList, c => c.MapFrom(t => t.TrialEmailNoticeUserList)); .ForMember(d => d.TrialEmailNoticeUserList, c => c.MapFrom(t => t.TrialEmailNoticeUserList));
@ -146,6 +148,26 @@ namespace IRaCIS.Core.Application.Service
CreateMap<TrialHistoryRecordFile, TrialHistoryRecordFileView>(); CreateMap<TrialHistoryRecordFile, TrialHistoryRecordFileView>();
CreateMap<TrialHistoryRecordFile, TrialHistoryRecordFileAddOrEdit>().ReverseMap(); CreateMap<TrialHistoryRecordFile, TrialHistoryRecordFileAddOrEdit>().ReverseMap();
CreateMap<AuditRecord, AuditRecordView>()
.ForMember(d => d.IdentityUserList, c => c.MapFrom(t => t.AuditRecordIdentityUserList));
CreateMap<AuditRecordAddOrEdit, AuditRecord>()
/* .ForMember(d => d.AuditRecordIdentityUserList, c => c.MapFrom(t => t.IdnetityUserIdList))*/;
CreateMap<Guid, AuditRecordIdentityUser>()
.EqualityComparison((odto, o) => odto == o.IdentityUserId)
.ForMember(d => d.AuditRecordId, c => c.Ignore())
.ForMember(d => d.IdentityUserId, c => c.MapFrom(t => t));
CreateMap<AuditRecordIdentityUser, AuditIdentiUserInfo>()
.ForMember(d => d.Id, c => c.MapFrom(t => t.IdentityUser.Id))
.ForMember(d => d.UserName, c => c.MapFrom(t => t.IdentityUser.UserName))
.ForMember(d => d.FullName, c => c.MapFrom(t => t.IdentityUser.FullName));
} }
} }

View File

@ -102,6 +102,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
public string BodyPartForEdit { get; set; } public string BodyPartForEdit { get; set; }
public string BodyPartForEditOther { get; set; }
public DateTime? StudyTime { get; set; } public DateTime? StudyTime { get; set; }
public string Modalities { get; set; } public string Modalities { get; set; }
@ -126,6 +128,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
public string BodyPart { get; set; } public string BodyPart { get; set; }
public string BodyPartForEditOther { get; set; }
public string Modality { get; set; } public string Modality { get; set; }
public DateTime ImageDate { get; set; } public DateTime ImageDate { get; set; }

View File

@ -190,6 +190,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
ModalityForEdit = t.ModalityForEdit, ModalityForEdit = t.ModalityForEdit,
BodyPartExamined = t.BodyPartExamined, BodyPartExamined = t.BodyPartExamined,
BodyPartForEdit = t.BodyPartForEdit, BodyPartForEdit = t.BodyPartForEdit,
BodyPartForEditOther = t.BodyPartForEditOther,
StudyCode = t.StudyCode, StudyCode = t.StudyCode,
StudyTime = t.StudyTime, StudyTime = t.StudyTime,
@ -209,6 +210,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
ModalityForEdit = t.ModalityForEdit, ModalityForEdit = t.ModalityForEdit,
BodyPartExamined = t.BodyPartExamined, BodyPartExamined = t.BodyPartExamined,
BodyPartForEdit = t.BodyPartForEdit, BodyPartForEdit = t.BodyPartForEdit,
BodyPartForEditOther = t.BodyPartForEditOther,
StudyCode = t.StudyCode, StudyCode = t.StudyCode,
StudyTime = t.StudyTime, StudyTime = t.StudyTime,
@ -435,7 +437,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
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(), visiTaskId.ToString());
var findStudy = await _taskStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId); var findStudy = await _taskStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
@ -471,7 +473,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
} }
study.Id = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), visiTaskId.ToString()); study.Id = studyId;
study.TrialId = incommand.TrialId; study.TrialId = incommand.TrialId;
study.SubjectId = incommand.SubjectId; study.SubjectId = incommand.SubjectId;
study.VisitTaskId = visiTaskId; study.VisitTaskId = visiTaskId;
@ -524,6 +526,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
await _taskInstanceRepository.AddAsync(isntance); await _taskInstanceRepository.AddAsync(isntance);
} }
} }
findStudy = study;
} }
else else
{ {
@ -568,35 +573,71 @@ 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 = _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);
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString(), visiTaskId.ToString());
insntance.StudyId = findStudy.Id;
insntance.SeriesId = dicomSeries.Id;
insntance.TrialId = incommand.TrialId; var instanceId = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString(), visiTaskId.ToString());
insntance.SubjectId = incommand.SubjectId;
insntance.VisitTaskId = visiTaskId;
if (!existInstanceIdList.Any(t => t == instanceId))
{
insntance.Id = instanceId;
insntance.StudyId = findStudy.Id;
insntance.SeriesId = dicomSeries.Id;
insntance.TrialId = incommand.TrialId;
insntance.SubjectId = incommand.SubjectId;
insntance.VisitTaskId = visiTaskId;
await _taskInstanceRepository.AddAsync(insntance);
dicomSeries.InstanceCount++;
findStudy.InstanceCount++;
}
await _taskInstanceRepository.AddAsync(insntance);
} }
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加 // 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
findStudy.InstanceCount += seriesItem.InstanceList.Count; //findStudy.InstanceCount += seriesItem.InstanceList.Count;
} }
} }
#region 只配置单个部位自动赋值
var originStudy = _dicomStudyRepository.Where(t => t.TrialId == incommand.TrialId && t.StudyInstanceUid == findStudy.StudyInstanceUid).FirstOrDefault();
if (originStudy != null)
{
findStudy.BodyPartForEdit = originStudy.BodyPartForEdit;
findStudy.BodyPartForEditOther = originStudy.BodyPartForEditOther;
}
////项目配置的影像部位
//var trialBodyParts = _trialRepository.Where(t => t.Id == trialId).Select(t => t.BodyPartTypes).FirstOrDefault();
//var trialBodyPartList = trialBodyParts.Split('|', StringSplitOptions.RemoveEmptyEntries);
//if (trialBodyPartList.Count() == 1)
//{
// var first = trialBodyPartList.First();
// findStudy.BodyPartForEdit = first;
//}
#endregion
var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit"); var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit");
using (await @lock2.AcquireAsync()) using (await @lock2.AcquireAsync())
@ -722,6 +763,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
Description = ns.Description, Description = ns.Description,
ImageDate = ns.ImageDate, ImageDate = ns.ImageDate,
BodyPart = ns.BodyPart, BodyPart = ns.BodyPart,
BodyPartForEditOther=ns.BodyPartForEditOther,
FileCount = ns.FileCount, FileCount = ns.FileCount,
Modality = ns.Modality, Modality = ns.Modality,
StudyCode = ns.StudyCode, StudyCode = ns.StudyCode,
@ -974,6 +1016,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
subjectCode = inQuery.SubjectCode; subjectCode = inQuery.SubjectCode;
} }
//下载这里查看也需要维护编号,维护的时候不会处理一致性分析任务
if (inQuery.SubjectId != null && inQuery.TrialReadingCriterionId != null)
{
await SubejctRandomReadingTaskNameDeal((Guid)subjectId, inQuery.TrialReadingCriterionId);
}
TaskState? taskState = null; TaskState? taskState = null;
if (inQuery.VisitTaskId != null) if (inQuery.VisitTaskId != null)
{ {

View File

@ -323,18 +323,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
} }
#region 只配置单个部位自动赋值
//项目配置的影像部位
var trialBodyParts = _trialRepository.Where(t => t.Id == trialId).Select(t => t.BodyPartTypes).FirstOrDefault();
var trialBodyPartList = trialBodyParts.Split('|', StringSplitOptions.RemoveEmptyEntries);
if (trialBodyPartList.Count() == 1)
{
var first = trialBodyPartList.First();
findStudy.BodyPartForEdit = first;
}
#endregion
var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit"); var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit");
@ -579,7 +568,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <returns></returns> /// <returns></returns>
[HttpGet("{subjectVisitId:guid}")] [HttpGet("{subjectVisitId:guid}")]
[AllowAnonymous] [AllowAnonymous]
public IResponseOutput<List<RelationStudyDTO>> GetAllRelationStudyList(Guid subjectVisitId,bool? isReading) public IResponseOutput<List<RelationStudyDTO>> GetAllRelationStudyList(Guid subjectVisitId, bool? isReading)
{ {
#region 废弃 #region 废弃
//var studylist = _studyRepository.Where(u => u.SubjectVisitId == subjectVisitId && u.IsDeleted == false).Select(t => new { StudyId = t.Id, t.SubjectId, t.TrialId }).ToList(); //var studylist = _studyRepository.Where(u => u.SubjectVisitId == subjectVisitId && u.IsDeleted == false).Select(t => new { StudyId = t.Id, t.SubjectId, t.TrialId }).ToList();
@ -608,17 +597,17 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var studyInfo = _dicomStudyRepository.Where(u => u.SubjectVisitId == subjectVisitId).Select(t => new { t.SubjectId, t.TrialId }).FirstOrDefault().IfNullThrowException(); var studyInfo = _dicomStudyRepository.Where(u => u.SubjectVisitId == subjectVisitId).Select(t => new { t.SubjectId, t.TrialId }).FirstOrDefault().IfNullThrowException();
var list = _dicomStudyRepository.Where(t => t.SubjectVisitId != subjectVisitId && t.TrialId == studyInfo.TrialId && t.SubjectId == studyInfo.SubjectId) var list = _dicomStudyRepository.Where(t => t.SubjectVisitId != subjectVisitId && t.TrialId == studyInfo.TrialId && t.SubjectId == studyInfo.SubjectId)
.Select(t=> new RelationStudyDTO() .Select(t => new RelationStudyDTO()
{ {
StudyId = t.Id, StudyId = t.Id,
StudyCode = t.StudyCode, StudyCode = t.StudyCode,
VisitName = t.SubjectVisit.VisitName, VisitName = t.SubjectVisit.VisitName,
Modalities = t.Modalities, Modalities = t.Modalities,
Description = t.Description, Description = t.Description,
SeriesCount = t.SeriesList.Where(t=> isReading==true? t.IsReading==true:true).Count() SeriesCount = t.SeriesList.Where(t => isReading == true ? t.IsReading == true : true).Count()
}) .ToList(); }).ToList();
list = list.Where(t=>t.SeriesCount>0).OrderBy(u => u.VisitName).ThenBy(s => s.StudyCode).ToList(); list = list.Where(t => t.SeriesCount > 0).OrderBy(u => u.VisitName).ThenBy(s => s.StudyCode).ToList();
return ResponseOutput.Ok(list); return ResponseOutput.Ok(list);
} }
@ -628,7 +617,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="studyId"> Dicom检查的Id </param> /// <param name="studyId"> Dicom检查的Id </param>
[HttpGet, Route("{studyId:guid}")] [HttpGet, Route("{studyId:guid}")]
[AllowAnonymous] [AllowAnonymous]
public IResponseOutput<DicomStudyDTO> Item(Guid studyId,bool? isPacs) public IResponseOutput<DicomStudyDTO> Item(Guid studyId, bool? isPacs)
{ {
if (isPacs == true) if (isPacs == true)
{ {
@ -861,7 +850,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var verifyStudyInfo = _dicomStudyRepository.Where(t => t.TrialId == trialId && t.Id == expectStudyId,false,true).ProjectTo<VerifyStudyDto>(_mapper.ConfigurationProvider).FirstOrDefault(); var verifyStudyInfo = _dicomStudyRepository.Where(t => t.TrialId == trialId && t.Id == expectStudyId, false, true).ProjectTo<VerifyStudyDto>(_mapper.ConfigurationProvider).FirstOrDefault();
result.StudyInfo = verifyStudyInfo; result.StudyInfo = verifyStudyInfo;

View File

@ -292,6 +292,8 @@ namespace IRaCIS.Application.Contracts
public string OrganizationName { get; set; } = string.Empty; public string OrganizationName { get; set; } = string.Empty;
public Guid? UserType { get; set; } public Guid? UserType { get; set; }
public UserTypeEnum? UserTypeEnum { get; set; }
public bool? IsTestUser { get; set; } public bool? IsTestUser { get; set; }
public bool? IsZhiZhun { get; set; } public bool? IsZhiZhun { get; set; }
@ -313,6 +315,10 @@ namespace IRaCIS.Application.Contracts
public DateTime? EndLastChangePassWordTime { get; set; } public DateTime? EndLastChangePassWordTime { get; set; }
public UserCeateSource? UserCeateSource { get; set; } public UserCeateSource? UserCeateSource { get; set; }
public Guid? AuditRecordId { get; set; }
public bool? IsAuditRecordUserSelect { get; set; }
} }
public class UserRoleInfoDTO public class UserRoleInfoDTO
@ -352,6 +358,9 @@ namespace IRaCIS.Application.Contracts
#endregion #endregion
public int JoinedTrialCount { get; set; } public int JoinedTrialCount { get; set; }
public bool IsAuditRecordUserSelect { get; set; }
} }

View File

@ -9,7 +9,7 @@ namespace IRaCIS.Core.Application.Service
Task<IResponseOutput<UserAddedReturnDTO>> AddUser(UserCommand userAddModel); Task<IResponseOutput<UserAddedReturnDTO>> AddUser(UserCommand userAddModel);
//Task<IResponseOutput> DeleteUser(Guid userId); //Task<IResponseOutput> DeleteUser(Guid userId);
//Task<UserDetailDTO> GetUser(Guid id); //Task<UserDetailDTO> GetUser(Guid id);
Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO param); //Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO param);
//Task<IResponseOutput<LoginReturnDTO>> Login(string userName, string password); //Task<IResponseOutput<LoginReturnDTO>> Login(string userName, string password);
Task<IResponseOutput> VerifyMFACodeAsync(string Code); Task<IResponseOutput> VerifyMFACodeAsync(string Code);

View File

@ -495,7 +495,7 @@ namespace IRaCIS.Core.Application.Service
/// <param name="inQuery"></param> /// <param name="inQuery"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public async Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO inQuery) public async Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO inQuery, [FromServices] IRepository<AuditRecordIdentityUser> _auditRecordIdentityUserRepository)
{ {
var userQueryable = _identityUserRepository.Where(x => x.UserRoleList.Any(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin)) var userQueryable = _identityUserRepository.Where(x => x.UserRoleList.Any(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin))
@ -510,14 +510,36 @@ namespace IRaCIS.Core.Application.Service
.WhereIf(inQuery.EndLastLoginTime != null, t => t.LastLoginTime <= inQuery.EndLastLoginTime) .WhereIf(inQuery.EndLastLoginTime != null, t => t.LastLoginTime <= inQuery.EndLastLoginTime)
.WhereIf(inQuery.BeginLastChangePassWordTime != null, t => t.LastChangePassWordTime >= inQuery.BeginLastChangePassWordTime) .WhereIf(inQuery.BeginLastChangePassWordTime != null, t => t.LastChangePassWordTime >= inQuery.BeginLastChangePassWordTime)
.WhereIf(inQuery.EndLastChangePassWordTime != null, t => t.LastChangePassWordTime <= inQuery.EndLastChangePassWordTime) .WhereIf(inQuery.EndLastChangePassWordTime != null, t => t.LastChangePassWordTime <= inQuery.EndLastChangePassWordTime)
.WhereIf(inQuery.UserType != null, t => t.UserRoleList.Any(t => t.UserTypeId == inQuery.UserType && t.IsUserRoleDisabled==false)) .WhereIf(inQuery.UserType != null, t => t.UserRoleList.Any(t => t.UserTypeId == inQuery.UserType && t.IsUserRoleDisabled == false))
.WhereIf(inQuery.UserTypeEnum != null, t => t.UserRoleList.Any(t => t.UserTypeRole.UserTypeEnum == inQuery.UserTypeEnum && t.IsUserRoleDisabled == false))
.WhereIf(inQuery.UserState != null, t => t.Status == inQuery.UserState) .WhereIf(inQuery.UserState != null, t => t.Status == inQuery.UserState)
.WhereIf(inQuery.IsTestUser != null, t => t.IsTestUser == inQuery.IsTestUser) .WhereIf(inQuery.IsTestUser != null, t => t.IsTestUser == inQuery.IsTestUser)
.WhereIf(inQuery.IsZhiZhun != null, t => t.IsZhiZhun == inQuery.IsZhiZhun) .WhereIf(inQuery.IsZhiZhun != null, t => t.IsZhiZhun == inQuery.IsZhiZhun)
.WhereIf(inQuery.UserCeateSource != null, t => t.UserCeateSource == inQuery.UserCeateSource) .WhereIf(inQuery.UserCeateSource != null, t => t.UserCeateSource == inQuery.UserCeateSource)
.WhereIf(inQuery.AuditRecordId != null && inQuery.IsAuditRecordUserSelect == true, t => t.AuditRecordList.Any(t => t.AuditRecordId == inQuery.AuditRecordId))
.WhereIf(inQuery.AuditRecordId != null && inQuery.IsAuditRecordUserSelect == false, t => !t.AuditRecordList.Any(t => t.AuditRecordId == inQuery.AuditRecordId))
.ProjectTo<UserListDTO>(_mapper.ConfigurationProvider); .ProjectTo<UserListDTO>(_mapper.ConfigurationProvider);
return await userQueryable.ToPagedListAsync(inQuery); var pageList = await userQueryable.ToPagedListAsync(inQuery);
if (inQuery.AuditRecordId != null)
{
var selectIdList = _auditRecordIdentityUserRepository.Where(t => t.AuditRecordId == inQuery.AuditRecordId).Select(t => t.IdentityUserId).ToList();
foreach (var item in selectIdList)
{
var find = pageList.CurrentPageData.Where(t => t.Id == item).FirstOrDefault();
if (find != null)
{
find.IsAuditRecordUserSelect = true;
}
}
}
return pageList;
} }
@ -863,8 +885,8 @@ namespace IRaCIS.Core.Application.Service
.WhereIf(inQuery.OptTypeList != null && inQuery.OptTypeList.Count > 0, t => inQuery.OptTypeList.Contains(t.OptType)) .WhereIf(inQuery.OptTypeList != null && inQuery.OptTypeList.Count > 0, t => inQuery.OptTypeList.Contains(t.OptType))
.WhereIf(inQuery.BeginDate != null, t => t.CreateTime >= inQuery.BeginDate) .WhereIf(inQuery.BeginDate != null, t => t.CreateTime >= inQuery.BeginDate)
.WhereIf(inQuery.EndDate != null, t => t.CreateTime <= inQuery.EndDate) .WhereIf(inQuery.EndDate != null, t => t.CreateTime <= inQuery.EndDate)
.WhereIf(inQuery.IsLoginUncommonly != null , t => t.IsLoginUncommonly== inQuery.IsLoginUncommonly) .WhereIf(inQuery.IsLoginUncommonly != null, t => t.IsLoginUncommonly == inQuery.IsLoginUncommonly)
.WhereIf(!string.IsNullOrEmpty(inQuery.LoginUserName), t => t.ActionUserName.Contains(inQuery.LoginUserName!)) .WhereIf(!string.IsNullOrEmpty(inQuery.LoginUserName), t => t.ActionUserName.Contains(inQuery.LoginUserName!))
.WhereIf(!string.IsNullOrEmpty(inQuery.LoginFaildName), t => t.ActionUserName.Contains(inQuery.LoginFaildName!)) .WhereIf(!string.IsNullOrEmpty(inQuery.LoginFaildName), t => t.ActionUserName.Contains(inQuery.LoginFaildName!))
.WhereIf(!string.IsNullOrEmpty(inQuery.IP), t => t.IP.Contains(inQuery.IP!)) .WhereIf(!string.IsNullOrEmpty(inQuery.IP), t => t.IP.Contains(inQuery.IP!))
@ -922,7 +944,7 @@ namespace IRaCIS.Core.Application.Service
var password = loginDto.Password; var password = loginDto.Password;
var emailConfig = _emailConfig.CurrentValue; var emailConfig = _emailConfig.CurrentValue;
var companyInfo = new SystemEmailSendConfigView() { CompanyName = emailConfig.CompanyName, CompanyNameCN = emailConfig.CompanyNameCN, CompanyShortName = emailConfig.CompanyShortName, CompanyShortNameCN = emailConfig.CompanyShortNameCN,SystemShortName=emailConfig.SystemShortName ,EmailRegexStr=emailConfig.EmailRegexStr}; var companyInfo = new SystemEmailSendConfigView() { CompanyName = emailConfig.CompanyName, CompanyNameCN = emailConfig.CompanyNameCN, CompanyShortName = emailConfig.CompanyShortName, CompanyShortNameCN = emailConfig.CompanyShortNameCN, SystemShortName = emailConfig.SystemShortName, EmailRegexStr = emailConfig.EmailRegexStr };
int maxFailures = _verifyConfig.CurrentValue.LoginMaxFailCount; int maxFailures = _verifyConfig.CurrentValue.LoginMaxFailCount;
@ -991,7 +1013,7 @@ namespace IRaCIS.Core.Application.Service
//超过90天没修改密码 //超过90天没修改密码
if (loginUser!= null&&_verifyConfig.CurrentValue.IsNeedChangePassWord && loginUser.LastChangePassWordTime != null && DateTime.Now.AddDays(-_verifyConfig.CurrentValue.ChangePassWordDays) > loginUser.LastChangePassWordTime.Value) if (loginUser != null && _verifyConfig.CurrentValue.IsNeedChangePassWord && loginUser.LastChangePassWordTime != null && DateTime.Now.AddDays(-_verifyConfig.CurrentValue.ChangePassWordDays) > loginUser.LastChangePassWordTime.Value)
{ {
loginUser.NeedChangePassWord = true; loginUser.NeedChangePassWord = true;
} }
@ -1002,7 +1024,7 @@ namespace IRaCIS.Core.Application.Service
UserOptType.LoginLockedAccount UserOptType.LoginLockedAccount
}; };
var actionUserName= loginUser!= null ? loginUser.UserName : userName; var actionUserName = loginUser != null ? loginUser.UserName : userName;
var lastLoginIPRegion = await _userLogRepository.Where(t => t.ActionUserName == actionUserName && userOptTypes.Contains(t.OptType)) var lastLoginIPRegion = await _userLogRepository.Where(t => t.ActionUserName == actionUserName && userOptTypes.Contains(t.OptType))
.OrderByDescending(t => t.CreateTime).Select(t => t.IPRegion).FirstOrDefaultAsync(); .OrderByDescending(t => t.CreateTime).Select(t => t.IPRegion).FirstOrDefaultAsync();
@ -1022,7 +1044,7 @@ namespace IRaCIS.Core.Application.Service
//异地登录 //异地登录
loginUser.LoginState = 2; loginUser.LoginState = 2;
} }
} }
} }

View File

@ -81,6 +81,8 @@ namespace IRaCIS.Core.Application.Contracts
public string VideoUrl { get; set; } = string.Empty; public string VideoUrl { get; set; } = string.Empty;
public string BodyPartForEditOther { get; set; }
} }

View File

@ -39,6 +39,8 @@ namespace IRaCIS.Core.Application.Contracts.DTO
public string BodyPart { get; set; } = String.Empty; public string BodyPart { get; set; } = String.Empty;
public string BodyPartForEditOther { get; set; }
} }
public class QCQuestionAnswerCommand public class QCQuestionAnswerCommand
@ -427,6 +429,8 @@ namespace IRaCIS.Core.Application.Contracts.DTO
public bool IsCompleteClinicalData { get; set; } public bool IsCompleteClinicalData { get; set; }
public string BodyPartForEditOther { get; set; }
} }
public class QASeriesInfoDto public class QASeriesInfoDto

View File

@ -518,7 +518,11 @@ namespace IRaCIS.Core.Application.Contracts
public int? CheckWaitReplyCount { get; set; } public int? CheckWaitReplyCount { get; set; }
public string SuspendReason { get; set; }
public string Reason { get; set; }
public string ExportReason => Status == SubjectStatus.OutOfVisit ? Reason : (Status == SubjectStatus.EndOfVisit ? SuspendReason : "");
} }
@ -1795,7 +1799,7 @@ namespace IRaCIS.Core.Application.Contracts
public decimal VisitNum { get; set; } public decimal VisitNum { get; set; }
[DictionaryTranslateAttribute("Subject_Visit_Status")] [DictionaryTranslateAttribute("Subject_Visit_Status")]
public SubjectStatus SubjectStatus { get; set; } public SubjectStatus SubjectStatus { get; set; }
public string SubjectCode { get; set; } = String.Empty; public string SubjectCode { get; set; } = String.Empty;
public String TrialSiteCode { get; set; } = String.Empty; public String TrialSiteCode { get; set; } = String.Empty;

View File

@ -541,6 +541,7 @@ namespace IRaCIS.Core.Application.Image.QA
sv.CheckUserId = _userInfo.UserRoleId; sv.CheckUserId = _userInfo.UserRoleId;
sv.CheckState = CheckStateEnum.CVPassed; sv.CheckState = CheckStateEnum.CVPassed;
sv.CheckTime = DateTime.Now;
sv.ReadingStatus = ReadingStatusEnum.TaskAllocate; sv.ReadingStatus = ReadingStatusEnum.TaskAllocate;
@ -1066,6 +1067,7 @@ namespace IRaCIS.Core.Application.Image.QA
study.BodyPartForEdit = updateModalityCommand.BodyPart; study.BodyPartForEdit = updateModalityCommand.BodyPart;
study.BodyPartForEditOther = updateModalityCommand.BodyPartForEditOther;
study.ModalityForEdit = updateModalityCommand.Modality; study.ModalityForEdit = updateModalityCommand.Modality;
study.StudyName = updateModalityCommand.StudyName; study.StudyName = updateModalityCommand.StudyName;

View File

@ -446,6 +446,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
} }
public class ViewStudyPartInDto
{
public Guid VisitTaskId { get; set; }
}
public class DeleteSingleTableQuestionMarkInDto public class DeleteSingleTableQuestionMarkInDto
{ {
[NotDefault] [NotDefault]
@ -855,12 +860,6 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary> /// </summary>
public string? PicturePath { get; set; } public string? PicturePath { get; set; }
/// <summary>
/// 第一次添加的任务ID
/// </summary>
public decimal FristAddTaskNum { get; set; } = 0;
public SplitOrMergeType? SplitOrMergeType { get; set; } public SplitOrMergeType? SplitOrMergeType { get; set; }
/// <summary> /// <summary>
@ -1033,6 +1032,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public string MergeName { get; set; } public string MergeName { get; set; }
public decimal FristAddTaskNum { get; set; }
/// <summary> /// <summary>
/// 病灶类型 /// 病灶类型
/// </summary> /// </summary>
@ -1867,6 +1868,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary> /// </summary>
public int? DigitPlaces { get; set; } = 2; public int? DigitPlaces { get; set; } = 2;
/// <summary>
/// 是否查看检查部位
/// </summary>
public bool IsViewStudyPart { get; set; } = false;
/// <summary> /// <summary>
/// 标准类型 /// 标准类型
@ -2350,8 +2356,6 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public bool? IsCanEditPosition { get; set; } public bool? IsCanEditPosition { get; set; }
public decimal FristAddTaskNum { get; set; } = 0;
public decimal? WW { get; set; } public decimal? WW { get; set; }
public decimal? WL { get; set; } public decimal? WL { get; set; }

View File

@ -12,6 +12,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public string TaskBlindName { get; set; } = string.Empty; public string TaskBlindName { get; set; } = string.Empty;
/// <summary>
/// 是否查看检查部位
/// </summary>
public bool IsViewStudyPart { get; set; } = false;
//任务来源访视Id 方便回更访视读片状态 //任务来源访视Id 方便回更访视读片状态
public Guid? SourceSubjectVisitId { get; set; } public Guid? SourceSubjectVisitId { get; set; }
public Guid? SouceReadModuleId { get; set; } public Guid? SouceReadModuleId { get; set; }

View File

@ -35,6 +35,7 @@ namespace IRaCIS.Core.Application.Service
IRepository<NoneDicomStudy> _noneDicomStudyRepository, IRepository<NoneDicomStudy> _noneDicomStudyRepository,
IRepository<VisitTask> _visitTaskRepository, IRepository<VisitTask> _visitTaskRepository,
IRepository<Trial> _trialRepository, IRepository<Trial> _trialRepository,
IRepository<TaskInstance> _taskInstanceRepository,
IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository, IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository,
IRepository<ReadingNoneDicomMark> _readingNoneDicomMarkRepository, IRepository<ReadingNoneDicomMark> _readingNoneDicomMarkRepository,
IRepository<UserLog> _userLogRepository, IRepository<UserLog> _userLogRepository,
@ -93,6 +94,22 @@ namespace IRaCIS.Core.Application.Service
} }
#endregion #endregion
/// <summary>
/// 查看检查部位
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<bool> ViewStudyPart(ViewStudyPartInDto inDto)
{
await _visitTaskRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
{
IsViewStudyPart = true,
});
return await _visitTaskRepository.SaveChangesAsync();
}
/// <summary> /// <summary>
/// 删除单个表格问题标记 /// 删除单个表格问题标记
@ -2602,7 +2619,7 @@ namespace IRaCIS.Core.Application.Service
await VerifyTaskIsSign(inDto.VisitTaskId); await VerifyTaskIsSign(inDto.VisitTaskId);
if (inDto.InstanceId != null && inDto.IsDicomReading) if (inDto.InstanceId != null && inDto.IsDicomReading)
{ {
if (!(await _dicomInstanceRepository.AnyAsync(x => x.Id == inDto.InstanceId && x.SeriesId == inDto.SeriesId))) if ((!(await _dicomInstanceRepository.AnyAsync(x => x.Id == inDto.InstanceId && x.SeriesId == inDto.SeriesId))) && (!(await _taskInstanceRepository.AnyAsync(x => x.Id == inDto.InstanceId && x.SeriesId == inDto.SeriesId))))
{ {
throw new BusinessValidationFailedException(_localizer["ReadingImage_Idnotcorrespond"]); throw new BusinessValidationFailedException(_localizer["ReadingImage_Idnotcorrespond"]);
} }
@ -3178,7 +3195,9 @@ namespace IRaCIS.Core.Application.Service
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
var isBaseline = await _subjectVisitRepository.Where(x => x.Id == taskInfo.SourceSubjectVisitId).Select(x => x.IsBaseLine).FirstOrDefaultAsync(); var isBaseline = await _subjectVisitRepository.Where(x => x.Id == taskInfo.SourceSubjectVisitId).Select(x => x.IsBaseLine).FirstOrDefaultAsync();
var readingQuestionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskInfo.TrialReadingCriterionId && x.Type != "group"
var readingQuestionList = await _readingQuestionTrialRepository.Where(x => !x.ExcludeShowVisitList.Contains(taskInfo.VisitTaskNum) &&x.ReadingQuestionCriterionTrialId == taskInfo.TrialReadingCriterionId && x.Type != "group"
&& (x.IsJudgeQuestion || (x.IsRequired == IsRequired.Required && x.ShowQuestion == ShowQuestion.Show)) && (x.IsJudgeQuestion || (x.IsRequired == IsRequired.Required && x.ShowQuestion == ShowQuestion.Show))
).ToListAsync(); ).ToListAsync();
if (isBaseline) if (isBaseline)
@ -3622,6 +3641,7 @@ namespace IRaCIS.Core.Application.Service
task.ReadingVersionEnum = criterionInfo.ReadingVersionEnum; task.ReadingVersionEnum = criterionInfo.ReadingVersionEnum;
task.ReadingToolList = criterionInfo.ReadingToolList; task.ReadingToolList = criterionInfo.ReadingToolList;
task.IsExistUnprocessedFeedback = await _userFeedBackRepository.AnyAsync(x => x.VisitTaskId == task.VisitTaskId && x.State == 0); task.IsExistUnprocessedFeedback = await _userFeedBackRepository.AnyAsync(x => x.VisitTaskId == task.VisitTaskId && x.State == 0);
task.IsViewStudyPart= visitTaskInfo.IsViewStudyPart;
// 添加默认答案 // 添加默认答案
if (inDto.VisitTaskId == null && visitTaskInfo.ReadingTaskState != ReadingTaskState.HaveSigned) if (inDto.VisitTaskId == null && visitTaskInfo.ReadingTaskState != ReadingTaskState.HaveSigned)
{ {

View File

@ -280,6 +280,7 @@ namespace IRaCIS.Core.Application.Service
.ForMember(d => d.ReadingQuestionSystemId, u => u.MapFrom(s => s.Id)); .ForMember(d => d.ReadingQuestionSystemId, u => u.MapFrom(s => s.Id));
CreateMap<ReadingTableAnswerRowInfo, TableAnsweRowInfo>() CreateMap<ReadingTableAnswerRowInfo, TableAnsweRowInfo>()
.ForMember(d => d.FristAddTaskNum, u => u.MapFrom(s => s.FristAddTask.VisitTaskNum))
.ForMember(dest => dest.CreateUserRole, opt => opt.Ignore()) .ForMember(dest => dest.CreateUserRole, opt => opt.Ignore())
.ForMember(d => d.MergeName, u => u.MapFrom(s => s.MergeRow == null ? string.Empty : s.MergeRow.ReadingQuestionTrial.OrderMark + s.MergeRow.RowIndex.GetLesionMark())) .ForMember(d => d.MergeName, u => u.MapFrom(s => s.MergeRow == null ? string.Empty : s.MergeRow.ReadingQuestionTrial.OrderMark + s.MergeRow.RowIndex.GetLesionMark()))
.ForMember(d => d.SplitName, u => u.MapFrom(s => s.SplitRow == null ? string.Empty : s.SplitRow.ReadingQuestionTrial.OrderMark + s.SplitRow.RowIndex.GetLesionMark())) .ForMember(d => d.SplitName, u => u.MapFrom(s => s.SplitRow == null ? string.Empty : s.SplitRow.ReadingQuestionTrial.OrderMark + s.SplitRow.RowIndex.GetLesionMark()))

View File

@ -179,7 +179,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == visitTask.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync(); var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == visitTask.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync();
var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == visitTaskId).ToListAsync(); var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == visitTaskId).Include(x=>x.FristAddTask).ToListAsync();
var baseLinetaskId = await _visitTaskRepository.Where(x => x.SourceSubjectVisitId == baseLineVisitId && x.TaskState == TaskState.Effect var baseLinetaskId = await _visitTaskRepository.Where(x => x.SourceSubjectVisitId == baseLineVisitId && x.TaskState == TaskState.Effect
&& x.TrialReadingCriterionId == visitTask.TrialReadingCriterionId && x.TrialReadingCriterionId == visitTask.TrialReadingCriterionId
@ -228,7 +228,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
RowIndex = x.RowIndex, RowIndex = x.RowIndex,
MeasureData = x.MeasureData, MeasureData = x.MeasureData,
OtherMeasureData = x.OtherMeasureData, OtherMeasureData = x.OtherMeasureData,
FristAddTaskNum = x.FristAddTaskNum, FristAddTaskNum = x.FristAddTask.VisitTaskNum,
TableQuestionList = tableQuestion.Where(y => y.QuestionId == item.QuestionId && y.RowId == x.Id).ToList(), TableQuestionList = tableQuestion.Where(y => y.QuestionId == item.QuestionId && y.RowId == x.Id).ToList(),
}).ToList(); }).ToList();

View File

@ -702,7 +702,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
IsCurrentTaskAdd = true, IsCurrentTaskAdd = true,
BlindName = taskinfo.TaskBlindName, BlindName = taskinfo.TaskBlindName,
OrderMark = questionInfo.OrderMark, OrderMark = questionInfo.OrderMark,
FristAddTaskNum = taskinfo.VisitTaskNum,
FristAddTaskId = taskinfo.Id, FristAddTaskId = taskinfo.Id,
RowMark = questionInfo.OrderMark + decimal.Parse(maxnum.ToString()).GetLesionMark() RowMark = questionInfo.OrderMark + decimal.Parse(maxnum.ToString()).GetLesionMark()
}); });
@ -842,7 +841,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
IsCurrentTaskAdd = true, IsCurrentTaskAdd = true,
BlindName = inDto.BlindName, BlindName = inDto.BlindName,
OrderMark = questionInfo.OrderMark, OrderMark = questionInfo.OrderMark,
FristAddTaskNum = inDto.VisitTaskNum,
FristAddTaskId = inDto.VisitTaskId, FristAddTaskId = inDto.VisitTaskId,
RowMark = questionInfo.OrderMark + decimal.Parse(item.ToString()).GetLesionMark() RowMark = questionInfo.OrderMark + decimal.Parse(item.ToString()).GetLesionMark()
}); });
@ -903,7 +901,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
IsCurrentTaskAdd = true, IsCurrentTaskAdd = true,
BlindName = inDto.BlindName, BlindName = inDto.BlindName,
OrderMark = pAVquestionInfo.OrderMark, OrderMark = pAVquestionInfo.OrderMark,
FristAddTaskNum = inDto.VisitTaskNum,
FristAddTaskId = inDto.VisitTaskId, FristAddTaskId = inDto.VisitTaskId,
RowMark = pAVquestionInfo.OrderMark + decimal.Parse(item.ToString()).GetLesionMark() RowMark = pAVquestionInfo.OrderMark + decimal.Parse(item.ToString()).GetLesionMark()
}); });

View File

@ -867,30 +867,59 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
TrialId = x.TrialId, TrialId = x.TrialId,
}).ToListAsync(); }).ToListAsync();
foreach (var item in recistTableAnswers)
{ // 肛门淋巴结
var portalOrgan = await _organInfoRepository.Where(x => x.SystemCriterionId == trialReadingCriterion.ReadingQuestionCriterionSystemId &&
x.Part == "肝门淋巴结" &&
item.QuestionId = tableRowAnswers.Where(y => y.OriginalId == item.RowId).Select(x => x.QuestionId).FirstOrDefault(); x.IsLymphNodes == IsLymph.Yes
item.TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == item.QuestionId && x.QuestionMark == item.QuestionMark).Select(x => x.Id).FirstOrDefault(); ).FirstOrDefaultAsync();
}
foreach (var item in recistTableAnswers)
{
var rowinfo = tableRowAnswers.Where(y => y.OriginalId == item.RowId).FirstOrDefault();
if (rowinfo != null)
{
item.QuestionId = rowinfo.QuestionId;
if (portalOrgan != null && rowinfo.OrganInfoId == portalOrgan.Id)
{
var IslymphNode = recistTableAnswers.Where(x => x.RowId == item.RowId && x.QuestionMark == QuestionMark.IsLymph).Select(x => x.Answer).FirstIsNullReturnEmpty().EqEnum(YesOrNoOrNa.Yes);
var minorAxis = recistTableAnswers.Where(x => x.RowId == item.RowId && x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstIsNullReturnEmpty().IsNullOrEmptyReturn0();
var iSbetween15and20 = minorAxis >= 15 && minorAxis < 20;
if (item.QuestionMark == QuestionMark.State && IslymphNode && iSbetween15and20 && rowinfo.LesionType == LesionType.TargetLesion)
{
item.Answer = string.Empty;
}
}
}
item.TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == item.QuestionId && x.QuestionMark == item.QuestionMark).Select(x => x.Id).FirstOrDefault();
}
recistTableAnswers = recistTableAnswers.Where(x => x.TableQuestionId != default(Guid)).ToList(); recistTableAnswers = recistTableAnswers.Where(x => x.TableQuestionId != default(Guid)).ToList();
List<QuestionMark?> notNeedCopyMarks = new List<QuestionMark?>() List<QuestionMark?> notNeedCopyMarks = new List<QuestionMark?>()
{ {
}; };
var tableAnswers = recistTableAnswers.Select(x => new ReadingTableQuestionAnswer
{ var tableAnswers = recistTableAnswers.Select(x => new ReadingTableQuestionAnswer
Id = NewId.NextGuid(), {
Answer = notNeedCopyMarks.Contains(x.QuestionMark) ? string.Empty : x.Answer, Id = NewId.NextGuid(),
QuestionId = x.QuestionId, Answer = notNeedCopyMarks.Contains(x.QuestionMark) ? string.Empty : x.Answer,
RowIndex = x.RowIndex, QuestionId = x.QuestionId,
RowId = tableRowAnswers.Where(y => y.OriginalId == x.RowId).Select(x => x.Id).FirstOrDefault(), RowIndex = x.RowIndex,
TableQuestionId = x.TableQuestionId, RowId = tableRowAnswers.Where(y => y.OriginalId == x.RowId).Select(x => x.Id).FirstOrDefault(),
TrialId = x.TrialId, TableQuestionId = x.TableQuestionId,
VisitTaskId = visitTaskId, TrialId = x.TrialId,
}).ToList(); VisitTaskId = visitTaskId,
}).ToList();
// 添加 典型肝内病灶 默认值 // 添加 典型肝内病灶 默认值
tableRowAnswers.ForEach(x => tableRowAnswers.ForEach(x =>

View File

@ -414,7 +414,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
rowlist.Add(new ReadingTableAnswerRowInfo() rowlist.Add(new ReadingTableAnswerRowInfo()
{ {
FristAddTaskId = visitTaskId, FristAddTaskId = visitTaskId,
FristAddTaskNum = taskinfo.VisitTaskNum,
IsCurrentTaskAdd = true, IsCurrentTaskAdd = true,
BlindName = taskinfo.TaskBlindName, BlindName = taskinfo.TaskBlindName,
OrderMark = tableQuestion.OrderMark, OrderMark = tableQuestion.OrderMark,

View File

@ -558,7 +558,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
IsCurrentTaskAdd = true, IsCurrentTaskAdd = true,
BlindName = taskinfo.TaskBlindName, BlindName = taskinfo.TaskBlindName,
OrderMark = questionInfo.OrderMark, OrderMark = questionInfo.OrderMark,
FristAddTaskNum = taskinfo.VisitTaskNum,
FristAddTaskId = taskinfo.Id, FristAddTaskId = taskinfo.Id,
RowMark = questionInfo.OrderMark + decimal.Parse(maxnum.ToString()).GetLesionMark() RowMark = questionInfo.OrderMark + decimal.Parse(maxnum.ToString()).GetLesionMark()
}); });
@ -769,7 +768,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
IsCurrentTaskAdd = true, IsCurrentTaskAdd = true,
BlindName = taskinfo.TaskBlindName, BlindName = taskinfo.TaskBlindName,
OrderMark = questionInfo.OrderMark, OrderMark = questionInfo.OrderMark,
FristAddTaskNum = taskinfo.VisitTaskNum,
FristAddTaskId = taskinfo.Id, FristAddTaskId = taskinfo.Id,
RowMark = questionInfo.OrderMark + decimal.Parse(maxnum.ToString()).GetLesionMark() RowMark = questionInfo.OrderMark + decimal.Parse(maxnum.ToString()).GetLesionMark()
}); });
@ -1043,7 +1041,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
IsCurrentTaskAdd = true, IsCurrentTaskAdd = true,
BlindName = inDto.BlindName, BlindName = inDto.BlindName,
OrderMark = patchDataStatisticsInfo.OrderMark, OrderMark = patchDataStatisticsInfo.OrderMark,
FristAddTaskNum = inDto.VisitTaskNum,
FristAddTaskId = inDto.VisitTaskId, FristAddTaskId = inDto.VisitTaskId,
RowMark = patchDataStatisticsInfo.OrderMark + decimal.Parse(item.ToString()).GetLesionMark() RowMark = patchDataStatisticsInfo.OrderMark + decimal.Parse(item.ToString()).GetLesionMark()
}); });

View File

@ -211,6 +211,7 @@ namespace IRaCIS.Core.Application.Service
//测试项目 可以加入 测试用户 或者内部正式用户 //测试项目 可以加入 测试用户 或者内部正式用户
.WhereIf(trialType == TrialType.NoneOfficial, t => t.IdentityUser.IsTestUser == true || (t.IdentityUser.IsTestUser == false && t.IdentityUser.IsZhiZhun)) .WhereIf(trialType == TrialType.NoneOfficial, t => t.IdentityUser.IsTestUser == true || (t.IdentityUser.IsTestUser == false && t.IdentityUser.IsZhiZhun))
.Where(t => t.IdentityUser.Status == UserStateEnum.Enable && t.IsUserRoleDisabled == false)
.Where(t => userTypeEnums.Contains(t.UserTypeEnum)) .Where(t => userTypeEnums.Contains(t.UserTypeEnum))
.WhereIf(inQuery.UserTypeEnum != null, t => t.UserTypeEnum == inQuery.UserTypeEnum) .WhereIf(inQuery.UserTypeEnum != null, t => t.UserTypeEnum == inQuery.UserTypeEnum)
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserRealName), t => t.IdentityUser.FullName.Contains(inQuery.UserRealName)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserRealName), t => t.IdentityUser.FullName.Contains(inQuery.UserRealName))

View File

@ -62,6 +62,8 @@ namespace IRaCIS.Application.Contracts
public Guid? FinalSubjectVisitId { get; set; } public Guid? FinalSubjectVisitId { get; set; }
public bool IsSubjectQuit { get; set; } public bool IsSubjectQuit { get; set; }
public string SuspendReason { get; set; } = string.Empty;
} }
@ -136,7 +138,7 @@ namespace IRaCIS.Application.Contracts
public Guid LatestSubmitSubjectVisitId { get; set; } public Guid LatestSubmitSubjectVisitId { get; set; }
public string SuspendReason { get; set; }
} }

View File

@ -1029,6 +1029,8 @@ namespace IRaCIS.Application.Contracts
public int StudyCount { get; set; } public int StudyCount { get; set; }
public string UploadJsonStr { get; set; }
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
public Guid TrialSiteId { get; set; } public Guid TrialSiteId { get; set; }

View File

@ -272,6 +272,10 @@ namespace IRaCIS.Core.Application.Contracts
public string StudyName { get; set; } = string.Empty; public string StudyName { get; set; } = string.Empty;
public string BodyPartForEdit { get; set; }
public string BodyPartForEditOther { get; set; }
public List<DicomSeriesDTO> SeriesList { get; set; } = new List<DicomSeriesDTO>(); public List<DicomSeriesDTO> SeriesList { get; set; } = new List<DicomSeriesDTO>();
} }

View File

@ -515,6 +515,10 @@ namespace IRaCIS.Core.Application.Services
StudyCode = k.StudyCode, StudyCode = k.StudyCode,
StudyId = k.Id, StudyId = k.Id,
BodyPartForEdit=k.BodyPartForEdit,
BodyPartForEditOther=k.BodyPartForEditOther
}).ToListAsync(); }).ToListAsync();
var studyIds = dicomStudyList.Select(t => t.StudyId).ToList(); var studyIds = dicomStudyList.Select(t => t.StudyId).ToList();
@ -718,6 +722,9 @@ namespace IRaCIS.Core.Application.Services
StudyCode = x.StudyCode, StudyCode = x.StudyCode,
IsDicom = false, IsDicom = false,
BodyPartForEdit=x.BodyPart,
BodyPartForEditOther=x.BodyPartForEditOther
}).ToList(); }).ToList();
var isExistTaskNoneDicomFile = _noneDicomStudyFileRepository.Any(t => t.VisitTaskId == indto.VisitTaskId); var isExistTaskNoneDicomFile = _noneDicomStudyFileRepository.Any(t => t.VisitTaskId == indto.VisitTaskId);

View File

@ -73,6 +73,72 @@ namespace IRaCIS.Core.Application.Service
ILogger<TestService> _logger, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService ILogger<TestService> _logger, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
{ {
public static int IntValue = 100; public static int IntValue = 100;
/// <summary>
/// 重建闭包表
/// </summary>
/// <param name="_auditDocumentClosureRepository"></param>
/// <param name="_auditDocumentRepository"></param>
/// <returns></returns>
[AllowAnonymous]
public async Task<IResponseOutput> RebuildAuditDocumentClosureAsync([FromServices] IRepository<AuditDocumentClosure> _auditDocumentClosureRepository, [FromServices] IRepository<AuditDocument> _auditDocumentRepository)
{
await _auditDocumentClosureRepository.BatchDeleteNoTrackingAsync(t => t.Id != Guid.Empty);
//过滤版本文件,防止污染闭包表
var documents = await _auditDocumentRepository.Where(t => t.MainFileId == null).Select(t => new { t.Id, t.ParentId }).ToListAsync();
var closures = new List<AuditDocumentClosure>();
// 建立一个字典,加快查找
var lookup = documents.ToDictionary(d => d.Id, d => d.ParentId);
foreach (var doc in documents)
{
// 1 自己 -> 自己 (depth = 0)
closures.Add(new AuditDocumentClosure
{
AncestorId = doc.Id,
DescendantId = doc.Id,
Depth = 0
});
// 2 递归向上找所有祖先
int depth = 1;
var currentParentId = doc.ParentId;
//脏数据 parentId==Guid.Empty
while (currentParentId.HasValue && currentParentId != Guid.Empty)
{
closures.Add(new AuditDocumentClosure
{
AncestorId = currentParentId.Value,
DescendantId = doc.Id,
Depth = depth
});
depth++;
// 继续向上查找
if (!lookup.TryGetValue(currentParentId.Value, out var nextParent))
break;
currentParentId = nextParent;
}
}
await _auditDocumentClosureRepository.AddRangeAsync(closures);
await _auditDocumentClosureRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
/// <summary> /// <summary>
/// 清理一致性分析任务 /// 清理一致性分析任务
/// </summary> /// </summary>
@ -372,6 +438,9 @@ namespace IRaCIS.Core.Application.Service
} }
[AllowAnonymous] [AllowAnonymous]
public async Task<IResponseOutput> RestoreDBOSSDate( public async Task<IResponseOutput> RestoreDBOSSDate(
[FromServices] IOSSService _oSSService, [FromServices] IWebHostEnvironment _hostEnvironment, [FromServices] IRepository<DicomStudy> _studyRepository) [FromServices] IOSSService _oSSService, [FromServices] IWebHostEnvironment _hostEnvironment, [FromServices] IRepository<DicomStudy> _studyRepository)

View File

@ -297,6 +297,11 @@ public class VisitTask : BaseFullAuditEntity
[Comment("退回原因")] [Comment("退回原因")]
public string PMBackReason { get; set; } public string PMBackReason { get; set; }
/// <summary>
/// 是否查看检查部位
/// </summary>
public bool IsViewStudyPart { get; set; } = false;
#region 完全随机增加字段 #region 完全随机增加字段
[Comment("完全随机阅片号")] [Comment("完全随机阅片号")]

View File

@ -11,7 +11,19 @@ namespace IRaCIS.Core.Domain.Models
[Table("AuditDocument")] [Table("AuditDocument")]
public class AuditDocument : BaseFullAuditEntity public class AuditDocument : BaseFullAuditEntity
{ {
// 0=自己, 1=直接子节点, 2=孙节点...
[JsonIgnore]
public List<AuditDocumentClosure> AncestorList { get; set; } = new List<AuditDocumentClosure>();
[JsonIgnore]
public List<AuditDocumentClosure> DescendantList { get; set; } = new List<AuditDocumentClosure>();
[JsonIgnore]
public List<AuditDocument> AuditDocumentOldVersionList { get; set; }
[JsonIgnore]
[ForeignKey(nameof(MainFileId))]
public AuditDocument MainAuditDocument { get; set; }
/// <summary> /// <summary>
/// 文件夹名或者文件名 /// 文件夹名或者文件名
/// </summary> /// </summary>
@ -80,4 +92,110 @@ namespace IRaCIS.Core.Domain.Models
HistoricalVersion = 2, HistoricalVersion = 2,
} }
/// <summary>
/// 稽查文档闭包表
/// </summary>
public class AuditDocumentClosure : Entity
{
[JsonIgnore]
public AuditDocument Ancestor { get; set; }
[JsonIgnore]
public AuditDocument Descendant { get; set; }
/// <summary>
/// 父Id
/// </summary>
[Comment("祖先")]
public Guid AncestorId { get; set; }
/// <summary>
/// 子Id
/// </summary>
[Comment("后代")]
public Guid DescendantId { get; set; }
public int Depth { get; set; } // 0=自己, 1=直接子节点, 2=孙节点...
}
public class AuditRecord : BaseFullAuditEntity
{
[JsonIgnore]
public List<AuditRecordIdentityUser> AuditRecordIdentityUserList { get; set; }
public string CompanyName { get; set; }
public string AuditContent { get; set; }
[Comment("稽查日期")]
public DateOnly AuditTime { get; set; }
public DateTime? BeginTime { get; set; }
public DateTime? EndTime { get; set; }
[Comment("稽查状态")]
public AuditState AuditState { get; set; }
[Comment("稽查形式")]
public AuditType AuditType { get; set; }
}
public class AuditRecordIdentityUser : BaseAddAuditEntity
{
[JsonIgnore]
public IdentityUser IdentityUser { get; set; }
[JsonIgnore]
public AuditRecord AuditRecord { get; set; }
public Guid IdentityUserId { get; set; }
public Guid AuditRecordId { get; set; }
}
public class AuditRecordPermission : BaseAddAuditEntity
{
[JsonIgnore]
public AuditRecord AuditRecord { get; set; }
[JsonIgnore]
public AuditDocument AuditDocument { get; set; }
public Guid AuditRecordId { get; set; }
public Guid AuditDocumentId { get; set; }
}
public enum AuditState
{
NotStart = 0,
Ongoing = 1,
End = 2
}
public enum AuditType
{
None = 0,
Online = 1,
OnSite = 2
}
} }

View File

@ -41,6 +41,8 @@ public class DicomStudy : BaseFullDeleteAuditEntity, IEntitySeqId
public string BodyPartForEdit { get; set; } = null!; public string BodyPartForEdit { get; set; } = null!;
public string BodyPartForEditOther { get; set; }
public int Code { get; set; } public int Code { get; set; }
/// <summary> /// <summary>

View File

@ -53,5 +53,7 @@ public class NoneDicomStudy : BaseFullDeleteAuditEntity
#endregion #endregion
public string ModifyReason { get; set; } public string ModifyReason { get; set; }
public string BodyPartForEditOther { get; set; }
} }

View File

@ -1,3 +1,5 @@
using System.Linq;
namespace IRaCIS.Core.Domain.Models; namespace IRaCIS.Core.Domain.Models;
[Comment("项目中心 - 影像推送记录")] [Comment("项目中心 - 影像推送记录")]
@ -21,4 +23,36 @@ public class SCPImageUpload : BaseAddAuditEntity
public int StudyCount { get; set; } public int StudyCount { get; set; }
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
public Guid TrialSiteId { get; set; } public Guid TrialSiteId { get; set; }
[MaxLength]
public string UploadJsonStr { get; set; }
} }
public class SCPImageLog
{
////当前传输 检查患者名字,一个检查可能患者名字不同 记录去重的,然后,拼接
//public string PatientNames => string.Join(",", UploadList.SelectMany(t => t.PatientNameList).ToList());
/// <summary>
/// 归档到数据库的检查Id
/// </summary>
public List<Guid> SCPStudyIdList => UploadList.Select(t => t.SCPStudyId).ToList();
public List<ImageUploadInfo> UploadList { get; set; } = new List<ImageUploadInfo>();
}
public class ImageUploadInfo
{
public List<string> PatientNameList { get; set; } = new List<string>();
public Guid SCPStudyId { get; set; }
public string StudyInstanceUid { get; set; }
public int FailedImageCount { get; set; }
public int SuccessImageCount { get; set; }
}

View File

@ -40,4 +40,20 @@ public class SCPInstance : BaseFullAuditEntity, IEntitySeqId
public string Path { get; set; } = string.Empty; public string Path { get; set; } = string.Empty;
public long? FileSize { get; set; } public long? FileSize { get; set; }
#region DIR 增加
public string SOPClassUID { get; set; }
public string MediaStorageSOPClassUID { get; set; }
public string TransferSytaxUID { get; set; }
public string MediaStorageSOPInstanceUID { get; set; }
public bool IsEncapsulated { get; set; }
#endregion
} }

View File

@ -39,4 +39,11 @@ public class SCPSeries : BaseFullDeleteAuditEntity, IEntitySeqId
[StringLength(1000)] [StringLength(1000)]
public string ImageResizePath { get; set; } = string.Empty; public string ImageResizePath { get; set; } = string.Empty;
#region DIR 增加
public string DicomSeriesDate { get; set; }
public string DicomSeriesTime { get; set; }
#endregion
} }

View File

@ -64,4 +64,18 @@ public class SCPStudy : BaseFullDeleteAuditEntity, IEntitySeqId
public Guid TrialSiteId { get; set; } public Guid TrialSiteId { get; set; }
public Guid? SubjectVisitId { get; set; } public Guid? SubjectVisitId { get; set; }
public string BodyPartForEditOther { get; set; }
#region DIR 增加字段
public string DicomStudyDate { get; set; }
public string DicomStudyTime { get; set; }
public string StudyDIRPath { get; set; }
#endregion
} }

View File

@ -46,4 +46,19 @@ public class TaskInstance : BaseFullAuditEntity, IEntitySeqId
public long? FileSize { get; set; } public long? FileSize { get; set; }
#region DIR 增加
public string SOPClassUID { get; set; }
public string MediaStorageSOPClassUID { get; set; }
public string TransferSytaxUID { get; set; }
public string MediaStorageSOPInstanceUID { get; set; }
public bool IsEncapsulated { get; set; }
#endregion
} }

View File

@ -41,4 +41,12 @@ public class TaskSeries : BaseFullDeleteAuditEntity, IEntitySeqId
[StringLength(1000)] [StringLength(1000)]
public string ImageResizePath { get; set; } = string.Empty; public string ImageResizePath { get; set; } = string.Empty;
#region DIR 增加
public string DicomSeriesDate { get; set; }
public string DicomSeriesTime { get; set; }
#endregion
} }

View File

@ -54,4 +54,17 @@ public class TaskStudy : BaseFullDeleteAuditEntity, IEntitySeqId
public string BodyPartForEdit { get; set; } = string.Empty; public string BodyPartForEdit { get; set; } = string.Empty;
public string ModalityForEdit { get; set; } = string.Empty; public string ModalityForEdit { get; set; } = string.Empty;
public string BodyPartForEditOther { get; set; }
#region DIR 增加字段
public string DicomStudyDate { get; set; }
public string DicomStudyTime { get; set; }
public string StudyDIRPath { get; set; }
#endregion
} }

View File

@ -69,6 +69,10 @@ public class IdentityUser : BaseFullAuditEntity
[JsonIgnore] [JsonIgnore]
public List<TrialIdentityUser> UserTrialList { get; set; } public List<TrialIdentityUser> UserTrialList { get; set; }
[JsonIgnore]
public List<AuditRecordIdentityUser> AuditRecordList { get; set; }
[JsonIgnore] [JsonIgnore]
public List<UserRole> UserRoleList { get; set; } = new List<UserRole>(); public List<UserRole> UserRoleList { get; set; } = new List<UserRole>();

View File

@ -10,12 +10,19 @@ public class ReadingTableAnswerRowInfo : BaseFullDeleteAuditEntity
[JsonIgnore] [JsonIgnore]
[ForeignKey("InstanceId")] [ForeignKey("InstanceId")]
public DicomInstance Instance { get; set; } public DicomInstance Instance { get; set; }
[JsonIgnore]
[ForeignKey("VisitTaskId")]
public VisitTask VisitTask { get; set; }
[JsonIgnore] [JsonIgnore]
[ForeignKey("OrganInfoId")] [ForeignKey("OrganInfoId")]
public OrganInfo OrganInfo { get; set; } public OrganInfo OrganInfo { get; set; }
[JsonIgnore]
[ForeignKey("VisitTaskId")]
public VisitTask VisitTask { get; set; }
[JsonIgnore]
[ForeignKey("FristAddTaskId")]
public VisitTask FristAddTask { get; set; }
[JsonIgnore] [JsonIgnore]
[ForeignKey("SplitRowId")] [ForeignKey("SplitRowId")]
public ReadingTableAnswerRowInfo SplitRow { get; set; } public ReadingTableAnswerRowInfo SplitRow { get; set; }
@ -76,9 +83,6 @@ public class ReadingTableAnswerRowInfo : BaseFullDeleteAuditEntity
[StringLength(1000)] [StringLength(1000)]
public string PicturePath { get; set; } = string.Empty; public string PicturePath { get; set; } = string.Empty;
[Comment("第一次添加的任务ID")]
public decimal FristAddTaskNum { get; set; } = 0;
[Comment("首次添加任务ID")] [Comment("首次添加任务ID")]
public Guid FristAddTaskId { get; set; } public Guid FristAddTaskId { get; set; }

View File

@ -95,4 +95,7 @@ public class Subject : BaseFullDeleteAuditEntity
[Comment("受试者退出")] [Comment("受试者退出")]
public bool IsSubjectQuit { get; set; } public bool IsSubjectQuit { get; set; }
[Comment("访视中止原因")]
public string SuspendReason { get; set; }
} }

View File

@ -3,6 +3,7 @@ using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure.Encryption; using IRaCIS.Core.Infrastructure.Encryption;
using IRaCIS.Core.Infrastructure.Extention; using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -58,6 +59,9 @@ public class IRaCISDBContext : DbContext
//configurationBuilder.Conventions.Add(_ => new DecimalPrecisionConvention(18,2)); //configurationBuilder.Conventions.Add(_ => new DecimalPrecisionConvention(18,2));
//针对字符串使用默认的长度配置为200如果标注了StringLength 其他长度就是标注的长度如果标注了MaxLength 那么就是nvarcharMax //针对字符串使用默认的长度配置为200如果标注了StringLength 其他长度就是标注的长度如果标注了MaxLength 那么就是nvarcharMax
configurationBuilder.Conventions.Add(_ => new DefaultStringLengthConvention(400)); configurationBuilder.Conventions.Add(_ => new DefaultStringLengthConvention(400));
//https://learn.microsoft.com/zh-cn/ef/core/modeling/relationships/conventions?utm_source=chatgpt.com
//configurationBuilder.Conventions.Remove(typeof(ForeignKeyIndexConvention));
} }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
@ -669,6 +673,14 @@ public class IRaCISDBContext : DbContext
public virtual DbSet<SubjectVisitImageBackRecord> SubjectVisitImageBackRecord { get; set; } public virtual DbSet<SubjectVisitImageBackRecord> SubjectVisitImageBackRecord { get; set; }
public virtual DbSet<AuditRecord> AuditRecord { get; set; }
public virtual DbSet<AuditRecordIdentityUser> AuditRecordIdentityUser { get; set; }
public virtual DbSet<AuditRecordPermission> AuditRecordPermission { get; set; }
public virtual DbSet<AuditDocumentClosure> AuditDocumentClosure { get; set; }
} }

View File

@ -0,0 +1,40 @@
using IRaCIS.Core.Domain.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace IRaCIS.Core.Infra.EFCore.EntityConfigration
{
public class AuditDocumentConfigration : IEntityTypeConfiguration<AuditDocument>
{
public void Configure(EntityTypeBuilder<AuditDocument> builder)
{
builder.HasMany(r => r.AncestorList).WithOne(t => t.Descendant).HasForeignKey(f => f.DescendantId);
builder.HasMany(r => r.DescendantList).WithOne(t => t.Ancestor).HasForeignKey(f => f.AncestorId);
builder.HasMany(r => r.AuditDocumentOldVersionList).WithOne(t => t.MainAuditDocument).HasForeignKey(f => f.MainFileId);
// builder.HasOne(r => r.WordFileRecord)
//.WithOne(t => t.WordFileRecord)
//.HasForeignKey<TrialFile>(t => t.WordFileRecordId)
//.OnDelete(DeleteBehavior.Cascade);
// builder.HasOne(r => r.PDFFileRecord).WithOne().HasForeignKey<TrialFile>(f => f.TrialFileTypeId);
// builder.HasOne(r => r.WordFileRecord).WithOne().HasForeignKey<TrialFile>(f => f.TrialFileTypeId);
// builder.HasOne(r => r.SignFileRecord).WithOne().HasForeignKey<TrialFile>(f => f.TrialFileTypeId);
// builder.HasOne(r => r.HistoryFileRecord).WithOne().HasForeignKey<TrialFile>(f => f.TrialFileTypeId);
}
}
}

View File

@ -23,6 +23,10 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration
//subject 删除了,但是任务没删除,导致的查询问题 //subject 删除了,但是任务没删除,导致的查询问题
builder.HasQueryFilter(b => b.Subject.IsDeleted == false); builder.HasQueryFilter(b => b.Subject.IsDeleted == false);
builder.HasMany(t => t.LesionList).WithOne(s => s.VisitTask).HasForeignKey(t => t.VisitTaskId);
} }
} }
public class ReadingQuestionTrialConfigration : IEntityTypeConfiguration<ReadingQuestionTrial> public class ReadingQuestionTrialConfigration : IEntityTypeConfiguration<ReadingQuestionTrial>
@ -35,4 +39,6 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration
} }
} }
} }

View File

@ -31,12 +31,12 @@
<PackageReference Include="Hangfire.Core" Version="1.8.18" /> <PackageReference Include="Hangfire.Core" Version="1.8.18" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="8.0.10" /> <PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="8.0.10" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.15" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.19" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.15"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.19">
<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="Microsoft.EntityFrameworkCore.Tools" Version="8.0.10"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.19">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class FristAddTaskNum : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "FristAddTaskNum",
table: "ReadingTableAnswerRowInfo");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<decimal>(
name: "FristAddTaskNum",
table: "ReadingTableAnswerRowInfo",
type: "decimal(18,2)",
precision: 18,
scale: 2,
nullable: false,
defaultValue: 0m,
comment: "第一次添加的任务ID");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class FristAddTaskNum1 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateIndex(
name: "IX_ReadingTableAnswerRowInfo_FristAddTaskId",
table: "ReadingTableAnswerRowInfo",
column: "FristAddTaskId");
migrationBuilder.AddForeignKey(
name: "FK_ReadingTableAnswerRowInfo_VisitTask_FristAddTaskId",
table: "ReadingTableAnswerRowInfo",
column: "FristAddTaskId",
principalTable: "VisitTask",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_ReadingTableAnswerRowInfo_VisitTask_FristAddTaskId",
table: "ReadingTableAnswerRowInfo");
migrationBuilder.DropIndex(
name: "IX_ReadingTableAnswerRowInfo_FristAddTaskId",
table: "ReadingTableAnswerRowInfo");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,31 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class addSubjectReson : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "SuspendReason",
table: "Subject",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "",
comment: "访视中止原因");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "SuspendReason",
table: "Subject");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,42 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class studyAddBodyPart : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "BodyPartForEditOther",
table: "NoneDicomStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "BodyPartForEditOther",
table: "DicomStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "BodyPartForEditOther",
table: "NoneDicomStudy");
migrationBuilder.DropColumn(
name: "BodyPartForEditOther",
table: "DicomStudy");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class ViewStudyPart : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "IsViewStudyPart",
table: "VisitTask",
type: "bit",
nullable: false,
defaultValue: false);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "IsViewStudyPart",
table: "VisitTask");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,291 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class ImageModify : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "BodyPartForEditOther",
table: "TaskStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "DicomStudyDate",
table: "TaskStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "DicomStudyTime",
table: "TaskStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "StudyDIRPath",
table: "TaskStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "DicomSeriesDate",
table: "TaskSeries",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "DicomSeriesTime",
table: "TaskSeries",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<bool>(
name: "IsEncapsulated",
table: "TaskInstance",
type: "bit",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<string>(
name: "MediaStorageSOPClassUID",
table: "TaskInstance",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "MediaStorageSOPInstanceUID",
table: "TaskInstance",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "SOPClassUID",
table: "TaskInstance",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "TransferSytaxUID",
table: "TaskInstance",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "BodyPartForEditOther",
table: "SCPStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "DicomStudyDate",
table: "SCPStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "DicomStudyTime",
table: "SCPStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "StudyDIRPath",
table: "SCPStudy",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "DicomSeriesDate",
table: "SCPSeries",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "DicomSeriesTime",
table: "SCPSeries",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<bool>(
name: "IsEncapsulated",
table: "SCPInstance",
type: "bit",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<string>(
name: "MediaStorageSOPClassUID",
table: "SCPInstance",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "MediaStorageSOPInstanceUID",
table: "SCPInstance",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "SOPClassUID",
table: "SCPInstance",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "TransferSytaxUID",
table: "SCPInstance",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "UploadJsonStr",
table: "SCPImageUpload",
type: "nvarchar(max)",
nullable: false,
defaultValue: "");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "BodyPartForEditOther",
table: "TaskStudy");
migrationBuilder.DropColumn(
name: "DicomStudyDate",
table: "TaskStudy");
migrationBuilder.DropColumn(
name: "DicomStudyTime",
table: "TaskStudy");
migrationBuilder.DropColumn(
name: "StudyDIRPath",
table: "TaskStudy");
migrationBuilder.DropColumn(
name: "DicomSeriesDate",
table: "TaskSeries");
migrationBuilder.DropColumn(
name: "DicomSeriesTime",
table: "TaskSeries");
migrationBuilder.DropColumn(
name: "IsEncapsulated",
table: "TaskInstance");
migrationBuilder.DropColumn(
name: "MediaStorageSOPClassUID",
table: "TaskInstance");
migrationBuilder.DropColumn(
name: "MediaStorageSOPInstanceUID",
table: "TaskInstance");
migrationBuilder.DropColumn(
name: "SOPClassUID",
table: "TaskInstance");
migrationBuilder.DropColumn(
name: "TransferSytaxUID",
table: "TaskInstance");
migrationBuilder.DropColumn(
name: "BodyPartForEditOther",
table: "SCPStudy");
migrationBuilder.DropColumn(
name: "DicomStudyDate",
table: "SCPStudy");
migrationBuilder.DropColumn(
name: "DicomStudyTime",
table: "SCPStudy");
migrationBuilder.DropColumn(
name: "StudyDIRPath",
table: "SCPStudy");
migrationBuilder.DropColumn(
name: "DicomSeriesDate",
table: "SCPSeries");
migrationBuilder.DropColumn(
name: "DicomSeriesTime",
table: "SCPSeries");
migrationBuilder.DropColumn(
name: "IsEncapsulated",
table: "SCPInstance");
migrationBuilder.DropColumn(
name: "MediaStorageSOPClassUID",
table: "SCPInstance");
migrationBuilder.DropColumn(
name: "MediaStorageSOPInstanceUID",
table: "SCPInstance");
migrationBuilder.DropColumn(
name: "SOPClassUID",
table: "SCPInstance");
migrationBuilder.DropColumn(
name: "TransferSytaxUID",
table: "SCPInstance");
migrationBuilder.DropColumn(
name: "UploadJsonStr",
table: "SCPImageUpload");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,157 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class auditRecord : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AuditRecord",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CompanyName = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
AuditContent = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
AuditTime = table.Column<DateOnly>(type: "date", nullable: false, comment: "稽查日期"),
BeginTime = table.Column<DateTime>(type: "datetime2", nullable: true),
EndTime = table.Column<DateTime>(type: "datetime2", nullable: true),
AuditState = table.Column<int>(type: "int", nullable: false, comment: "稽查状态"),
AuditType = table.Column<int>(type: "int", nullable: false, comment: "稽查形式"),
CreateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreateTime = table.Column<DateTime>(type: "datetime2", nullable: false),
UpdateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
UpdateTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AuditRecord", x => x.Id);
table.ForeignKey(
name: "FK_AuditRecord_User_CreateUserId",
column: x => x.CreateUserId,
principalTable: "User",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "AuditRecordIdentityUser",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
IdentityUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
AuditRecordId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreateTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AuditRecordIdentityUser", x => x.Id);
table.ForeignKey(
name: "FK_AuditRecordIdentityUser_AuditRecord_AuditRecordId",
column: x => x.AuditRecordId,
principalTable: "AuditRecord",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_AuditRecordIdentityUser_IdentityUser_IdentityUserId",
column: x => x.IdentityUserId,
principalTable: "IdentityUser",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_AuditRecordIdentityUser_User_CreateUserId",
column: x => x.CreateUserId,
principalTable: "User",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "AuditRecordPermission",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
AuditRecordId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
AuditDocumentId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreateTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AuditRecordPermission", x => x.Id);
table.ForeignKey(
name: "FK_AuditRecordPermission_AuditDocument_AuditDocumentId",
column: x => x.AuditDocumentId,
principalTable: "AuditDocument",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_AuditRecordPermission_AuditRecord_AuditRecordId",
column: x => x.AuditRecordId,
principalTable: "AuditRecord",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_AuditRecordPermission_User_CreateUserId",
column: x => x.CreateUserId,
principalTable: "User",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_AuditRecord_CreateUserId",
table: "AuditRecord",
column: "CreateUserId");
migrationBuilder.CreateIndex(
name: "IX_AuditRecordIdentityUser_AuditRecordId",
table: "AuditRecordIdentityUser",
column: "AuditRecordId");
migrationBuilder.CreateIndex(
name: "IX_AuditRecordIdentityUser_CreateUserId",
table: "AuditRecordIdentityUser",
column: "CreateUserId");
migrationBuilder.CreateIndex(
name: "IX_AuditRecordIdentityUser_IdentityUserId",
table: "AuditRecordIdentityUser",
column: "IdentityUserId");
migrationBuilder.CreateIndex(
name: "IX_AuditRecordPermission_AuditDocumentId",
table: "AuditRecordPermission",
column: "AuditDocumentId");
migrationBuilder.CreateIndex(
name: "IX_AuditRecordPermission_AuditRecordId",
table: "AuditRecordPermission",
column: "AuditRecordId");
migrationBuilder.CreateIndex(
name: "IX_AuditRecordPermission_CreateUserId",
table: "AuditRecordPermission",
column: "CreateUserId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "AuditRecordIdentityUser");
migrationBuilder.DropTable(
name: "AuditRecordPermission");
migrationBuilder.DropTable(
name: "AuditRecord");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,78 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class modifyAudictDoc : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AuditDocumentClosure",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
AncestorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false, comment: "祖先"),
DescendantId = table.Column<Guid>(type: "uniqueidentifier", nullable: false, comment: "后代"),
Depth = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AuditDocumentClosure", x => x.Id);
table.ForeignKey(
name: "FK_AuditDocumentClosure_AuditDocument_AncestorId",
column: x => x.AncestorId,
principalTable: "AuditDocument",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_AuditDocumentClosure_AuditDocument_DescendantId",
column: x => x.DescendantId,
principalTable: "AuditDocument",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_AuditDocument_MainFileId",
table: "AuditDocument",
column: "MainFileId");
migrationBuilder.CreateIndex(
name: "IX_AuditDocumentClosure_AncestorId",
table: "AuditDocumentClosure",
column: "AncestorId");
migrationBuilder.CreateIndex(
name: "IX_AuditDocumentClosure_DescendantId",
table: "AuditDocumentClosure",
column: "DescendantId");
migrationBuilder.AddForeignKey(
name: "FK_AuditDocument_AuditDocument_MainFileId",
table: "AuditDocument",
column: "MainFileId",
principalTable: "AuditDocument",
principalColumn: "Id");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_AuditDocument_AuditDocument_MainFileId",
table: "AuditDocument");
migrationBuilder.DropTable(
name: "AuditDocumentClosure");
migrationBuilder.DropIndex(
name: "IX_AuditDocument_MainFileId",
table: "AuditDocument");
}
}
}

View File

@ -17,7 +17,7 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "8.0.15") .HasAnnotation("ProductVersion", "8.0.19")
.HasAnnotation("Relational:MaxIdentifierLength", 128); .HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
@ -149,12 +149,147 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.HasIndex("CreateUserId"); b.HasIndex("CreateUserId");
b.HasIndex("MainFileId");
b.ToTable("AuditDocument", t => b.ToTable("AuditDocument", t =>
{ {
t.HasComment("稽查文档管理"); t.HasComment("稽查文档管理");
}); });
}); });
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditDocumentClosure", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("AncestorId")
.HasColumnType("uniqueidentifier")
.HasComment("祖先");
b.Property<int>("Depth")
.HasColumnType("int");
b.Property<Guid>("DescendantId")
.HasColumnType("uniqueidentifier")
.HasComment("后代");
b.HasKey("Id");
b.HasIndex("AncestorId");
b.HasIndex("DescendantId");
b.ToTable("AuditDocumentClosure");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecord", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("AuditContent")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<int>("AuditState")
.HasColumnType("int")
.HasComment("稽查状态");
b.Property<DateOnly>("AuditTime")
.HasColumnType("date")
.HasComment("稽查日期");
b.Property<int>("AuditType")
.HasColumnType("int")
.HasComment("稽查形式");
b.Property<DateTime?>("BeginTime")
.HasColumnType("datetime2");
b.Property<string>("CompanyName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime2");
b.Property<Guid>("CreateUserId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime?>("EndTime")
.HasColumnType("datetime2");
b.Property<DateTime>("UpdateTime")
.HasColumnType("datetime2");
b.Property<Guid>("UpdateUserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("CreateUserId");
b.ToTable("AuditRecord");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecordIdentityUser", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("AuditRecordId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime2");
b.Property<Guid>("CreateUserId")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("IdentityUserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("AuditRecordId");
b.HasIndex("CreateUserId");
b.HasIndex("IdentityUserId");
b.ToTable("AuditRecordIdentityUser");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecordPermission", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("AuditDocumentId")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("AuditRecordId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime2");
b.Property<Guid>("CreateUserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("AuditDocumentId");
b.HasIndex("AuditRecordId");
b.HasIndex("CreateUserId");
b.ToTable("AuditRecordPermission");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.CRO", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.CRO", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
@ -1230,6 +1365,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("BodyPartForEditOther")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<int>("Code") b.Property<int>("Code")
.HasColumnType("int"); .HasColumnType("int");
@ -3262,6 +3402,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("BodyPartForEditOther")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<int>("Code") b.Property<int>("Code")
.HasColumnType("int"); .HasColumnType("int");
@ -6641,11 +6786,6 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasComment("首次添加任务ID"); .HasComment("首次添加任务ID");
b.Property<decimal>("FristAddTaskNum")
.HasPrecision(18, 2)
.HasColumnType("decimal(18,2)")
.HasComment("第一次添加的任务ID");
b.Property<string>("FromMark") b.Property<string>("FromMark")
.IsRequired() .IsRequired()
.HasMaxLength(400) .HasMaxLength(400)
@ -6786,6 +6926,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.HasIndex("CreateUserId"); b.HasIndex("CreateUserId");
b.HasIndex("FristAddTaskId");
b.HasIndex("InstanceId"); b.HasIndex("InstanceId");
b.HasIndex("MergeRowId"); b.HasIndex("MergeRowId");
@ -7719,6 +7861,10 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<Guid>("TrialSiteId") b.Property<Guid>("TrialSiteId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<string>("UploadJsonStr")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id"); b.HasKey("Id");
b.HasIndex("CreateUserId"); b.HasIndex("CreateUserId");
@ -7779,6 +7925,19 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<DateTime?>("InstanceTime") b.Property<DateTime?>("InstanceTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
b.Property<bool>("IsEncapsulated")
.HasColumnType("bit");
b.Property<string>("MediaStorageSOPClassUID")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("MediaStorageSOPInstanceUID")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<int>("NumberOfFrames") b.Property<int>("NumberOfFrames")
.HasColumnType("int"); .HasColumnType("int");
@ -7792,6 +7951,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("SOPClassUID")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<Guid>("SeriesId") b.Property<Guid>("SeriesId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -7821,6 +7985,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("TransferSytaxUID")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<DateTime>("UpdateTime") b.Property<DateTime>("UpdateTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
@ -7970,6 +8139,16 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("DicomSeriesDate")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("DicomSeriesTime")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<Guid>("Id") b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -8092,6 +8271,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("BodyPartForEditOther")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("CalledAE") b.Property<string>("CalledAE")
.IsRequired() .IsRequired()
.HasMaxLength(400) .HasMaxLength(400)
@ -8119,6 +8303,16 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("DicomStudyDate")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("DicomStudyTime")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<Guid>("Id") b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -8177,6 +8371,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<int>("SeriesCount") b.Property<int>("SeriesCount")
.HasColumnType("int"); .HasColumnType("int");
b.Property<string>("StudyDIRPath")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("StudyId") b.Property<string>("StudyId")
.IsRequired() .IsRequired()
.HasMaxLength(400) .HasMaxLength(400)
@ -8628,6 +8827,12 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasColumnType("int") .HasColumnType("int")
.HasComment("1 访视中2 出组 3 访视结束"); .HasComment("1 访视中2 出组 3 访视结束");
b.Property<string>("SuspendReason")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)")
.HasComment("访视中止原因");
b.Property<Guid>("TrialId") b.Property<Guid>("TrialId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -10296,6 +10501,19 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<DateTime?>("InstanceTime") b.Property<DateTime?>("InstanceTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
b.Property<bool>("IsEncapsulated")
.HasColumnType("bit");
b.Property<string>("MediaStorageSOPClassUID")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("MediaStorageSOPInstanceUID")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<int>("NumberOfFrames") b.Property<int>("NumberOfFrames")
.HasColumnType("int"); .HasColumnType("int");
@ -10309,6 +10527,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("SOPClassUID")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<Guid>("SeriesId") b.Property<Guid>("SeriesId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -10341,6 +10564,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<Guid>("SubjectId") b.Property<Guid>("SubjectId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<string>("TransferSytaxUID")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<Guid>("TrialId") b.Property<Guid>("TrialId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -10612,6 +10840,16 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("DicomSeriesDate")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("DicomSeriesTime")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<Guid>("Id") b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -10743,6 +10981,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("BodyPartForEditOther")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<int>("Code") b.Property<int>("Code")
.HasColumnType("int"); .HasColumnType("int");
@ -10763,6 +11006,16 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("DicomStudyDate")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("DicomStudyTime")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<Guid>("Id") b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -10820,6 +11073,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<string>("StudyDIRPath")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("StudyId") b.Property<string>("StudyId")
.IsRequired() .IsRequired()
.HasMaxLength(400) .HasMaxLength(400)
@ -14716,6 +14974,9 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<bool>("IsUrgent") b.Property<bool>("IsUrgent")
.HasColumnType("bit"); .HasColumnType("bit");
b.Property<bool>("IsViewStudyPart")
.HasColumnType("bit");
b.Property<string>("JudgeResultImagePath") b.Property<string>("JudgeResultImagePath")
.IsRequired() .IsRequired()
.HasMaxLength(1000) .HasMaxLength(1000)
@ -15135,6 +15396,96 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.AuditDocument", "MainAuditDocument")
.WithMany("AuditDocumentOldVersionList")
.HasForeignKey("MainFileId");
b.Navigation("CreateUserRole");
b.Navigation("MainAuditDocument");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditDocumentClosure", b =>
{
b.HasOne("IRaCIS.Core.Domain.Models.AuditDocument", "Ancestor")
.WithMany("DescendantList")
.HasForeignKey("AncestorId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.AuditDocument", "Descendant")
.WithMany("AncestorList")
.HasForeignKey("DescendantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Ancestor");
b.Navigation("Descendant");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecord", b =>
{
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
.WithMany()
.HasForeignKey("CreateUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("CreateUserRole");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecordIdentityUser", b =>
{
b.HasOne("IRaCIS.Core.Domain.Models.AuditRecord", "AuditRecord")
.WithMany("AuditRecordIdentityUserList")
.HasForeignKey("AuditRecordId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
.WithMany()
.HasForeignKey("CreateUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.IdentityUser", "IdentityUser")
.WithMany()
.HasForeignKey("IdentityUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("AuditRecord");
b.Navigation("CreateUserRole");
b.Navigation("IdentityUser");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecordPermission", b =>
{
b.HasOne("IRaCIS.Core.Domain.Models.AuditDocument", "AuditDocument")
.WithMany()
.HasForeignKey("AuditDocumentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.AuditRecord", "AuditRecord")
.WithMany()
.HasForeignKey("AuditRecordId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
.WithMany()
.HasForeignKey("CreateUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("AuditDocument");
b.Navigation("AuditRecord");
b.Navigation("CreateUserRole"); b.Navigation("CreateUserRole");
}); });
@ -16787,6 +17138,12 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.VisitTask", "FristAddTask")
.WithMany()
.HasForeignKey("FristAddTaskId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.DicomInstance", "Instance") b.HasOne("IRaCIS.Core.Domain.Models.DicomInstance", "Instance")
.WithMany("ReadingTableAnswerRowInfoList") .WithMany("ReadingTableAnswerRowInfoList")
.HasForeignKey("InstanceId") .HasForeignKey("InstanceId")
@ -16818,6 +17175,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("CreateUserRole"); b.Navigation("CreateUserRole");
b.Navigation("FristAddTask");
b.Navigation("Instance"); b.Navigation("Instance");
b.Navigation("MergeRow"); b.Navigation("MergeRow");
@ -19495,6 +19854,20 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("CreateUserRole"); b.Navigation("CreateUserRole");
}); });
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditDocument", b =>
{
b.Navigation("AncestorList");
b.Navigation("AuditDocumentOldVersionList");
b.Navigation("DescendantList");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecord", b =>
{
b.Navigation("AuditRecordIdentityUserList");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalDataTrialSet", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalDataTrialSet", b =>
{ {
b.Navigation("ReadingClinicalDataList"); b.Navigation("ReadingClinicalDataList");

View File

@ -185,5 +185,15 @@ namespace IRaCIS.Core.Infrastructure.Extention
} }
public static async Task<List<T>> SortToListAsync<T>(this IQueryable<T> source, string[] sortArray = default, CancellationToken cancellationToken = default)
{
var sortString = string.Join(',', sortArray);
source = source.OrderBy(sortString);
return await source.ToListAsync(cancellationToken);
}
} }
} }

View File

@ -50,10 +50,10 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Fluid.Core" Version="2.21.0" /> <PackageReference Include="Fluid.Core" Version="2.21.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.15" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.19" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="8.0.15" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="8.0.19" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.11" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.11" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.15"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.19">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>