Compare commits

...

9 Commits

Author SHA1 Message Date
hang 80d78cb989 修改 2026-07-31 18:53:15 +08:00
hang 681ba17e37 修改清理缓存 2026-07-31 18:03:46 +08:00
hang 3385b65967 修复后处理增加数量bug 2026-07-30 17:52:21 +08:00
hang d6045ef7e7 Merge branch 'irc-add-image' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into irc-add-image 2026-07-30 17:43:17 +08:00
hang f66829ca62 上传记录屏蔽+IR已下载修改 2026-07-30 17:43:17 +08:00
he 471ea524b7 查询修改 2026-07-30 17:38:50 +08:00
he 34e9269916 提交答案取消签名验证 2026-07-30 16:03:57 +08:00
he 29d50fdd2d 稽查修改 2026-07-30 16:02:04 +08:00
hang 9f19dfceac 临时屏蔽CRC 上传监控 以及稽查 2026-07-30 16:00:30 +08:00
12 changed files with 194 additions and 71 deletions

View File

@ -89,6 +89,7 @@ public class FileUploadRecordService(IRepository<FileUploadRecord> _fileUploadRe
public async Task<IResponseOutput> AddOrUpdateFileUploadRecord(FileUploadRecordAddOrEdit addOrEditFileUploadRecord)
{
return ResponseOutput.Ok();
addOrEditFileUploadRecord.IP = _userInfo.IP;

View File

@ -7,7 +7,7 @@
}
},
"ConnectionStrings": {
"RemoteNew": "Server=101.132.193.237,1433;Database=Prod_IRC_pidr_restore_new;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"RemoteNew": "Server=101.132.193.237,1433;Database=Prod_IRC_pidr_restore;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=101.132.193.237,1433;Database=irc_Hangfire_bak;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
//"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
//"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
@ -44,11 +44,11 @@
"RegionId": "cn-shanghai",
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
"AccessKeyId": "LTAI5tNRTsqL6aWmHkDmTwoH",
"AccessKeySecret": "7mtGz3qrYWI6JMMBZiLeC119VWicZH",
"RoleArn": "acs:ram::1899121822495495:role/irc-oss-access",
"BucketName": "zy-irc-store",
"ViewEndpoint": "https://zy-irc-cache.oss-cn-shanghai.aliyuncs.com",
"AccessKeyId": "LTAI5tFUCCmz5TwghZHsj45Y",
"AccessKeySecret": "8evrBy1fVfzJG25i67Jm0xqn9Xcw2T",
"RoleArn": "acs:ram::1078130221702011:role/uat-oss-access",
"BucketName": "tl-med-irc-event-store",
"ViewEndpoint": "https://tl-med-rc-event-cache.oss-cn-shanghai.aliyuncs.com",
"Region": "oss-cn-shanghai",
"DurationSeconds": 7200
},
@ -70,7 +70,7 @@
"OpenUserComplexPassword": true,
"OpenSignDocumentBeforeWork": true,
"OpenLoginLimit": true,
"OpenLoginLimit": false,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 120,

View File

@ -37,13 +37,13 @@ public class TrialGlobalLimitActionFilter(IFusionCache _fusionCache, IUserInfo _
#region 特殊用户类型拦截
// 用户类型检查
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
{
//对不起,您的账户没有操作权限
context.Result = new JsonResult(ResponseOutput.NotOk(I18n.T("TrialResource_NoAccessPermission")));
//if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
//{
// //对不起,您的账户没有操作权限
// context.Result = new JsonResult(ResponseOutput.NotOk(I18n.T("TrialResource_NoAccessPermission")));
return;
}
// return;
//}
#endregion

View File

@ -47,12 +47,12 @@ public class TrialGlobalLimitEndpointFilter(IFusionCache _fusionCache, IUserInfo
}
#region 特殊用户类型拦截
// 用户类型检查
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
{
//对不起,您的账户没有操作权限
return Results.Json(ResponseOutput.NotOk(I18n.T("TrialResource_NoAccessPermission")));
}
//// 用户类型检查
//if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
//{
// //对不起,您的账户没有操作权限
// return Results.Json(ResponseOutput.NotOk(I18n.T("TrialResource_NoAccessPermission")));
//}
#endregion

View File

@ -3284,6 +3284,20 @@
批次Id
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Service.Inspection.InspectionService.getInspectionById(IRaCIS.Core.Application.Service.Inspection.DTO.InspectionDto)">
<summary>
根据Id获取稽查记录
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Inspection.InspectionService.SetJsonDetail(IRaCIS.Core.Application.Service.Inspection.DTO.InspectionDto)">
<summary>
设置稽查记录JsonDetail
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Inspection.InspectionService.SetTrialShowInspection(IRaCIS.Core.Application.Service.Inspection.DTO.SetTrialShowInspection)">
<summary>
设置项目稽查配置
@ -10218,6 +10232,11 @@
问题分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetFilterTableQuestionInDto.QuestionClassify">
<summary>
问题分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.SetOncologyQuestion.EvaluationResult">
<summary>
评估结果
@ -15001,6 +15020,13 @@
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetFilterTableQuestion(IRaCIS.Core.Application.Service.Reading.Dto.GetFilterTableQuestionInDto)">
<summary>
获取单个表格问题及答案 过滤问题
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.GetCustomTableQuestionAnswer(IRaCIS.Core.Application.Service.Reading.Dto.GetCustomTableQuestionAnswerInDto)">
<summary>
获取自定义问题以及答案

View File

@ -119,11 +119,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var subjectCode = string.Empty;
var subjectId = inQuery.SubjectId;
bool? isIRImageDownloaded = null;
bool? isIRImageDownloaded = true;
if(inQuery.VisitTaskId != null)
{
isIRImageDownloaded= _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => t.IsIRImageDownloaded).FirstOrDefault();
//isIRImageDownloaded= _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => t.IsIRImageDownloaded).FirstOrDefault();
}
if (criterionInfo.IsReadingTaskViewInOrder == ReadingOrder.Random)
@ -228,7 +228,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed
&& t.DoctorUserId == _userInfo.UserRoleId && t.TaskState == TaskState.Effect)
/* && t.DoctorUserId == _userInfo.UserRoleId*/ && t.TaskState == TaskState.Effect)
//满足 有序或者随机只看到当前任务的dicom 非dicom检查
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
.Select(u => new SubjectImageUploadDTO()
@ -708,9 +708,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
TaskSeries dicomSeries = await _taskSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
var isNewSeries = false;
//判断重复
if (dicomSeries == null)
{
isNewSeries = true;
var series = _mapper.Map<TaskSeries>(seriesItem);
series.Id = seriesId;
@ -736,6 +739,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
//找到该序列已经存在的instanceId
var existInstanceIdList = _taskInstanceRepository.Where(t => t.SeriesId == dicomSeries.Id).Select(t => t.Id).ToList();
foreach (var instanceItem in seriesItem.InstanceList)
{
var insntance = _mapper.Map<TaskInstance>(instanceItem);
@ -755,9 +759,20 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
await _taskInstanceRepository.AddAsync(insntance);
if (isNewSeries == false)
{
dicomSeries.InstanceCount++;
}
findStudy.InstanceCount++;
}
else
{
//更新,需要删除缓存,并更新路径
await _oSSService.DeleteFromPrefix(insntance.Path, true);
await _taskInstanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == instanceId, u => new TaskInstance() { Path = insntance.Path });
}
}
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
@ -1053,7 +1068,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
else
{
var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
&& t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect)
&& t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed /*&& t.DoctorUserId == doctorUserId*/ && t.TaskState == TaskState.Effect)
//满足 有序或者随机只看到当前任务的dicom 非dicom检查
.WhereIf(info.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId).WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))

View File

@ -581,9 +581,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
};
var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
//var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
return ResponseOutput.Ok(addEntity.Id);
return ResponseOutput.Ok(Guid.NewGuid());
}
@ -644,20 +644,20 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
{
var trialId = incommand.TrialId;
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
studyMonitor.UploadFinishedTime = DateTime.Now;
studyMonitor.ArchiveFinishedTime = DateTime.Now;
studyMonitor.FailedFileCount = incommand.FailedFileCount;
studyMonitor.IsSuccess = incommand.FailedFileCount == 0;
studyMonitor.RecordPath = incommand.RecordPath;
studyMonitor.FileSize = incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize);
//var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
//studyMonitor.UploadFinishedTime = DateTime.Now;
//studyMonitor.ArchiveFinishedTime = DateTime.Now;
//studyMonitor.FailedFileCount = incommand.FailedFileCount;
//studyMonitor.IsSuccess = incommand.FailedFileCount == 0;
//studyMonitor.RecordPath = incommand.RecordPath;
//studyMonitor.FileSize = incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize);
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString());
var findStudy = await _dicomStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
studyMonitor.StudyId = studyId;
studyMonitor.StudyCode = findStudy?.StudyCode ?? "";
studyMonitor.IsDicomReUpload = findStudy != null;
//studyMonitor.StudyId = studyId;
//studyMonitor.StudyCode = findStudy?.StudyCode ?? "";
//studyMonitor.IsDicomReUpload = findStudy != null;
if (incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Count() == 0)
@ -668,7 +668,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}
//上传
if (studyMonitor.IsDicomReUpload == false)
if ((findStudy != null) == false)
{
var addStudy = _mapper.Map<DicomStudy>(incommand.Study);
@ -713,7 +713,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
studyMonitor.StudyCode = addStudy.StudyCode;
//studyMonitor.StudyCode = addStudy.StudyCode;
foreach (var seriesItem in incommand.Study.SeriesList)
@ -772,9 +772,14 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
DicomSeries dicomSeries = await _dicomSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
var isNewSeries = false;
//判断重复
if (dicomSeries == null)
{
isNewSeries = true;
var series = _mapper.Map<DicomSeries>(seriesItem);
series.Id = seriesId;
@ -790,16 +795,23 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
//新的序列 那么 检查的序列数量+1
findStudy.SeriesCount += 1;
}
else
{
//该序列掉了instance
dicomSeries.InstanceCount += seriesItem.InstanceList.Count;
}
//else
//{
// //该序列掉了instance
// dicomSeries.InstanceCount += seriesItem.InstanceList.Count;
//}
//找到该序列已经存在的instanceId
var existInstanceIdList = _dicomInstanceRepository.Where(t => t.SeriesId == dicomSeries.Id).Select(t => t.Id).ToList();
foreach (var instanceItem in seriesItem.InstanceList)
{
var insntance = _mapper.Map<DicomInstance>(instanceItem);
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString());
if (!existInstanceIdList.Any(t => t == insntance.Id))
{
insntance.StudyId = findStudy.Id;
insntance.SeriesId = dicomSeries.Id;
@ -808,11 +820,28 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
insntance.SubjectVisitId = incommand.SubjectVisitId;
await _dicomInstanceRepository.AddAsync(insntance);
if (isNewSeries == false)
{
dicomSeries.InstanceCount++;
}
findStudy.InstanceCount++;
}
else
{
//更新,需要删除缓存,并更新路径
await _oSSService.DeleteFromPrefix(insntance.Path,true);
await _dicomInstanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == insntance.Id, u => new DicomInstance() { Path = insntance.Path });
}
}
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
findStudy.InstanceCount += seriesItem.InstanceList.Count;
//// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
//findStudy.InstanceCount += seriesItem.InstanceList.Count;
if (incommand.Study.RadionuclideTotalDose != string.Empty

View File

@ -449,6 +449,12 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO
public List<GetTrialShowInspectionOutDto> Children { get; set; }
}
public class InspectionDto
{
public Guid Id { get; set; }
public string? JsonDetail { get; set; }
}
public class SetTrialShowInspection
{

View File

@ -27,6 +27,39 @@ namespace IRaCIS.Core.Application.Service.Inspection
IRepository<FrontAuditConfig> _frontAuditConfigRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IInspectionService
{
/// <summary>
/// 根据Id获取稽查记录
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> getInspectionById(InspectionDto inDto)
{
var dataInspection = await _dataInspectionRepository.Where(x=>x.Id==inDto.Id).Select(x=> new InspectionDto()
{
Id=x.Id,
JsonDetail = x.JsonDetail,
}).FirstOrDefaultAsync();
return ResponseOutput.Ok(dataInspection);
}
/// <summary>
/// 设置稽查记录JsonDetail
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> SetJsonDetail(InspectionDto inDto)
{
await _dataInspectionRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.Id, u => new DataInspection() { JsonDetail = inDto.JsonDetail });
return ResponseOutput.Ok(inDto);
}
/// <summary>
/// 设置项目稽查配置
/// </summary>

View File

@ -168,6 +168,19 @@ namespace IRaCIS.Core.Application.Service
.Where(t => t.UserTypeId == _userInfo.UserTypeId && (t.Menu.MenuType == "M" || t.Menu.MenuType == "C") && t.Menu.IsEnable)
.ProjectTo<MenuTreeNode>(_mapper.ConfigurationProvider).ToListAsync();
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA)
{
var otherGuid = new List<Guid>() { Guid.Parse("41d2bcbe-4ae2-4158-856e-08da0661d17d"), Guid.Parse("5acebe02-99de-4e39-f090-08da0c7fe82c") };
var otherlist = await _userTypeMenuRepository
.Where(t => otherGuid.Contains(t.MenuId) && (t.Menu.MenuType == "M" || t.Menu.MenuType == "C") && t.Menu.IsEnable)
.ProjectTo<MenuTreeNode>(_mapper.ConfigurationProvider).Distinct().ToListAsync();
menuFunctionlist.AddRange(otherlist);
}
var list = menuFunctionlist!.ToTree((root, child) => child!.ParentId == Guid.Empty,
(root, child) => child!.ParentId == root!.MenuId,
(child, datalist) =>

View File

@ -1074,28 +1074,28 @@ namespace IRaCIS.Core.Application.Service
/// <exception cref="BusinessValidationFailedException"></exception>
private async Task VerifyTaskIsSign(Guid visitTaskid)
{
var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskid).FirstNotNullAsync();
//var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskid).FirstNotNullAsync();
if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.ReadingTaskState == ReadingTaskState.HaveSigned))
{
throw new BusinessValidationFailedException(_localizer["ReadingImage_BeSigned"]);
}
//if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.ReadingTaskState == ReadingTaskState.HaveSigned))
//{
// throw new BusinessValidationFailedException(_localizer["ReadingImage_BeSigned"]);
//}
if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.TaskState != TaskState.Effect))
{
throw new BusinessValidationFailedException(_localizer["ReadingImage_Beinvalid"]);
}
//if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.TaskState != TaskState.Effect))
//{
// throw new BusinessValidationFailedException(_localizer["ReadingImage_Beinvalid"]);
//}
if (await _visitTaskRepository.AnyAsync(x => x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId
&& x.IsAnalysisCreate && taskInfo.IsAnalysisCreate
&& x.SubjectId == taskInfo.SubjectId && x.TaskState == TaskState.Effect &&
((x.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && x.DoctorUserId == taskInfo.DoctorUserId) || x.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed)
//if (await _visitTaskRepository.AnyAsync(x => x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId
//&& x.IsAnalysisCreate && taskInfo.IsAnalysisCreate
//&& x.SubjectId == taskInfo.SubjectId && x.TaskState == TaskState.Effect &&
//((x.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && x.DoctorUserId == taskInfo.DoctorUserId) || x.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed)
))
{
throw new BusinessValidationFailedException(_localizer["ReadingImage_PresenceReview"]);
}
//))
//{
// throw new BusinessValidationFailedException(_localizer["ReadingImage_PresenceReview"]);
//}
}

View File

@ -48,7 +48,7 @@ public class AuditEntityInterceptor(IUserInfo _userInfo,
AuditEntities(eventData.Context);
//IRC稽查 放在savechange 之前 不影响之前的逻辑
IRCDataInspection(eventData.Context);
//IRCDataInspection(eventData.Context);
//return result;
@ -64,7 +64,7 @@ public class AuditEntityInterceptor(IUserInfo _userInfo,
AuditEntities(eventData.Context);
//IRC稽查 放在savechange 之前 不影响之前的逻辑
IRCDataInspection(eventData.Context);
//IRCDataInspection(eventData.Context);
//return result;