Files
irc-netcore-api/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs
T
he a0193fc694
continuous-integration/drone/push Build is running
阅片信息签名验证接口修改
2026-08-18 13:53:27 +08:00

1783 lines
81 KiB
C#

using Aliyun.OSS;
using IRaCIS.Application.Contracts;
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure;
using MassTransit;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Panda.DynamicWebApi.Attributes;
using System.IO;
using ZiggyCreatures.Caching.Fusion;
namespace IRaCIS.Core.Application
{
[ApiExplorerSettings(GroupName = "Trial")]
public class TrialConfigService(IRepository<Trial> _trialRepository,
IRepository<TrialQCQuestion> _trialQCQuestionRepository,
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
IRepository<ReadingQuestionVisitJudgeRule> _readingQuestionVisitJudgeRuleRepository,
IRepository<TrialCriterionDictionaryCode> _trialCriterionDictionaryCode,
IRepository<SystemCriterionDictionaryCode> _systemCriterionDictionaryCode,
IRepository<ReadingQuestionCriterionSystem> _readingQuestionCriterionSystemRepository,
IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository,
IRepository<ReadingCriterionPage> _readingCriterionPageRepository,
IRepository<SystemCriterionKeyFile> _systemCriterionKeyFileRepository,
IOSSService _oSSService,
IRepository<VisitStage> _visitStageRepository,
IRepository<TrialCriterionKeyFile> _trialCriterionKeyFileRepository,
IOrganInfoService _iOrganInfoService,
IRepository<TrialBodyPart> _trialBodyPartRepository,
IRepository<ReadingSystemCriterionDictionary> _readingCriterionDictionaryRepository,
IRepository<ReadingTrialCriterionDictionary> _readingTrialCriterionDictionaryRepository,
IReadingQuestionService iReadingQuestionService,
IRepository<TrialCriterionAdditionalAssessmentType> _trialCriterionAdditionalAssessmentTypeRepository,
IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswer,
IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository,
IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository,
IRepository<SystemBasicData> _systemBasicDataRepository,
IRepository<SubjectVisit> _subjectVisitRepository,
IRepository<Enroll> _enrollRepository,
IRepository<TrialQCQuestionAnswer> _qcQuestionAnswerRepository,
IRepository<TrialStateChange> _trialStateChangeRepository,
IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository, IRepository<TrialDicomAE> _dicomAERepository,
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, ITrialConfigService
{
/// <summary>
/// 替换受试者
/// </summary>
/// <returns></returns>
public async Task ReplaceSubject()
{
// 使用 AsTracking() 确保变更追踪开启
var trialList = await _trialRepository
.AsQueryable()
.AsTracking() // 显式启用追踪
.ToListAsync();
foreach (var data in trialList)
{
if (data.TrialObjectNameList == null || !data.TrialObjectNameList.Any())
continue;
foreach (var item in data.TrialObjectNameList)
{
item.Name = item.Name
.Replace("受试者", "试验参与者")
.Replace("Subject", "Participant");
}
// 不调用 Update(),直接 SaveChanges
}
await _trialRepository.SaveChangesAsync();
}
/// <summary>
/// 阅片信息签名验证接口
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
[HttpPost]
public async Task<IResponseOutput> TrialReadingInfoSignVerify(TrialReadingInfoSignInDto inDto)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
var existsJudge = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialCriterion.Id && x.IsJudgeQuestion && x.JudgeType == JudgeTypeEnum.None)
.WhereIf(trialCriterion.FormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null)
.WhereIf(trialCriterion.FormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null)
.AnyAsync();
if (existsJudge && trialCriterion.IsArbitrationReading)
{
//---有裁判问题未配置产生裁判阅片任务的条件,操作失败!
throw new BusinessValidationFailedException(_localizer["TrialConfig_JudgeTaskFail"]);
}
if (trialCriterion.JudgeRuleEnum == JudgeRule.Difference)
{
var visitStageList = await _visitStageRepository.Where(x => x.TrialId == trialCriterion.TrialId).ToListAsync();
visitStageList.Add(new VisitStage()
{
VisitName = "Out of Plan",
VisitNum=-1,
});
var judgeCount = await _readingQuestionTrialRepository.CountAsync(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion);
var ruleList = await _readingQuestionVisitJudgeRuleRepository.Where(x => x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).ToListAsync();
var errorList = new List<string>();
visitStageList.ForEach(x =>
{
if (judgeCount != ruleList.Count(y => y.VisitNum == x.VisitNum))
{
errorList.Add(x.VisitName);
}
});
if (errorList.Count() > 0)
{
throw new BusinessValidationFailedException(_localizer["TrialConfig_VisitjudgeDeficiency", string.Join(",", errorList)]);
}
}
return ResponseOutput.Ok(true);
}
/// <summary>
/// 设置项目链接过期时间
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> SetTrialLinkExpirationTime(TrialLinkExpirationTimeDto inDto)
{
await _trialRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.TrialId, x => new Trial()
{
LinkExpirationTime = DateTime.Now.AddDays(inDto.ExpirationDays),
LinkVerificationCode=inDto.LinkVerificationCode,
});
await _trialRepository.SaveChangesAsync();
return ResponseOutput.Ok(true);
}
/// <summary>
/// 获取项目链接过期时间
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<SetTrialLinkExpirationTimeDto> GetTrialLinkExpirationTime(SetTrialLinkExpirationTimeDto inDto)
{
var result = await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x => new SetTrialLinkExpirationTimeDto()
{
TrialId = x.Id,
LinkExpirationTime = x.LinkExpirationTime,
LinkVerificationCode=x.LinkVerificationCode,
ResearchProgramNo = x.ResearchProgramNo,
}).FirstOrDefaultAsync();
return result;
}
/// <summary>
/// 获取时间是否过期 过期返回true 没有过期返回false
/// </summary>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public async Task<VerifyLinkExpirationTimeOutDto> GetLinkLinkExpirationTime(VerifyLinkExpirationTimeDto inDto)
{
var time = await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x
=> new VerifyLinkExpirationTimeOutDto() {
LinkExpirationTime = x.LinkExpirationTime
} ).FirstNotNullAsync();
return time;
}
/// <summary>
/// 获取是否Code是否有效 有效返回true 无效返回false
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public async Task<GetLinkVerificationCodeIsEffectiveOutDto> GetLinkVerificationCodeIsEffective(GetLinkVerificationCodeIsEffectiveDto inDto)
{
var trial=await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x => new { x.LinkVerificationCode, x.ResearchProgramNo }).FirstNotNullAsync();
return new GetLinkVerificationCodeIsEffectiveOutDto()
{
IsEffective = inDto.LinkVerificationCode == (trial.LinkVerificationCode.IsNullOrEmpty() ? trial.ResearchProgramNo : trial.LinkVerificationCode)
};
}
/// <summary>
/// 获取项目已经确认的标准
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<List<GetTrialConfirmCriterionOutDto>> GetTrialConfirmCriterionList(GetTrialConfirmCriterionListInDto inDto)
{
List<GetTrialConfirmCriterionOutDto> result = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm)
.Select(x => new GetTrialConfirmCriterionOutDto()
{
TrialCriterionId = x.Id,
CriterionName = x.CriterionName
}).ToListAsync();
return result;
}
/// <summary>
/// 阅片信息签名
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[NonDynamicMethod]
public async Task<IResponseOutput> TrialReadingInfoSign(TrialReadingInfoSignInDto inDto)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
var existsJudge = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialCriterion.Id && x.IsJudgeQuestion && x.JudgeType == JudgeTypeEnum.None)
.WhereIf(trialCriterion.FormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null)
.WhereIf(trialCriterion.FormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null)
.AnyAsync();
if (existsJudge && trialCriterion.IsArbitrationReading)
{
//---有裁判问题未配置产生裁判阅片任务的条件,操作失败!
throw new BusinessValidationFailedException(_localizer["TrialConfig_JudgeTaskFail"]);
}
var criterionFormType = trialCriterion.FormType;
var count = _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId)
.WhereIf(criterionFormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null)
.WhereIf(criterionFormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null).Count();
if (count == 0)
{
//---当前标准下未配置问题
throw new BusinessValidationFailedException(_localizer["TrialConfig_StdConfigMissing"]);
}
await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
{
IsSigned = true,
ReadingInfoSignTime = DateTime.Now
});
var result = await _trialRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
/// <summary>
/// 获取项目阅片信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<(GetTrialReadingInfoOutDto, bool)> GetCriterionReadingInfo(GetTrialReadingInfoInDto inDto)
{
GetTrialReadingInfoOutDto trialInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).ProjectTo<GetTrialReadingInfoOutDto>(_mapper.ConfigurationProvider).FirstNotNullAsync();
if (trialInfo.ReadingTool == null)
{
trialInfo.ReadingTool = ReadingTool.Dicom;
}
trialInfo.TrialCriterionAdditionalAssessmentTypeList = await _trialCriterionAdditionalAssessmentTypeRepository.Where(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId).ToListAsync();
return (trialInfo, true);
}
/// <summary>
/// 重置并同步标准
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<IResponseOutput> ResetAndAsyncCriterion(ResetAndAsyncCriterionInDto inDto)
{
await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial
{
SynchronizeOriginalTime = null,
SynchronizeTime = DateTime.Now.AddYears(-20),
IsSigned = false,
ReadingInfoSignTime = null,
});
await AsyncTrialCriterionDictionary(new AsyncTrialCriterionDictionaryInDto() { TrialReadingCriterionId = inDto.TrialReadingCriterionId });
return ResponseOutput.Ok(true);
}
/// <summary>
/// 同步项目标准所有信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> AsyncTrialCriterionDictionary(AsyncTrialCriterionDictionaryInDto inDto)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
if (trialCriterion.ReadingQuestionCriterionSystemId != null)
{
if (trialCriterion.SynchronizeOriginalTime == null)
{
//同步附加评估类型
if (!await _trialCriterionAdditionalAssessmentTypeRepository.AnyAsync(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId))
{
AdditionalAssessment additional = new AdditionalAssessment();
var addList = additional.GetSystemDefeaultAdditionalAssessmentList(trialCriterion.CriterionType);
foreach (var addItem in addList)
{
await _trialCriterionAdditionalAssessmentTypeRepository.AddAsync(new TrialCriterionAdditionalAssessmentType()
{
CriterionType = trialCriterion.CriterionType,
TrialReadingCriterionId = inDto.TrialReadingCriterionId,
AdditionalAssessmentType = addItem.AdditionalAssessmentType
});
}
}
// 同步器官
await _iOrganInfoService.SynchronizeSystemOrganToTrial(new SynchronizeSystemOrganToTrialInDto()
{
TrialReadingCriterionId = inDto.TrialReadingCriterionId,
SystemCriterionId = trialCriterion.ReadingQuestionCriterionSystemId
});
// 同步问题
await iReadingQuestionService.SynchronizeCriterion(new SynchronizeCriterionInDto()
{
TrialReadingCriterionId = inDto.TrialReadingCriterionId,
});
// 同步字典
#region 同步字典
await _trialCriterionDictionaryCode.BatchDeleteNoTrackingAsync(x => x.TrialCriterionId == trialCriterion.Id);
await _readingTrialCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.CriterionId == trialCriterion.Id);
var criterionDictionaryCodeList = await _systemCriterionDictionaryCode.Where(x => x.SystemCriterionId == trialCriterion.ReadingQuestionCriterionSystemId.Value)
.Select(x => new TrialCriterionDictionaryCode()
{
Code = x.Code,
TrialCriterionId = trialCriterion.Id,
}).ToListAsync();
criterionDictionaryCodeList.ForEach(x =>
{
x.Id = NewId.NextGuid();
});
var criterionDictionaryList = await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == trialCriterion.ReadingQuestionCriterionSystemId.Value)
.Select(x => new ReadingTrialCriterionDictionary()
{
CriterionId = inDto.TrialReadingCriterionId,
CrterionDictionaryGroup = x.CrterionDictionaryGroup,
IsBaseLineUse = x.IsBaseLineUse,
IsFollowVisitUse = x.IsFollowVisitUse,
DictionaryId = x.DictionaryId,
ParentCode = x.ParentCode,
})
.ToListAsync();
criterionDictionaryList.ForEach(x =>
{
x.Id = NewId.NextGuid();
});
await _readingTrialCriterionDictionaryRepository.AddRangeAsync(criterionDictionaryList);
await _trialCriterionDictionaryCode.AddRangeAsync(criterionDictionaryCodeList);
#endregion
// 同步阅片关键点
await SynchronizeKeyFile(inDto.TrialReadingCriterionId);
//var trialModalitys = _readingQuestionCriterionTrialRepository.Where(t => t.Id == inDto.TrialReadingCriterionId).Select(t => t.Trial.Modalitys).FirstOrDefault();
var systemCriterion = await _readingQuestionCriterionSystemRepository.Where(x => x.Id == trialCriterion.ReadingQuestionCriterionSystemId).FirstNotNullAsync();
await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
{
//CriterionModalitys= trialModalitys,
IsOncologyReading = systemCriterion.IsOncologyReading,
IsSystemSetOncology = systemCriterion.IsOncologyReading,
IseCRFShowInDicomReading = systemCriterion.IseCRFShowInDicomReading,
});
await _readingCriterionDictionaryRepository.SaveChangesAsync();
// 清除多余答案 --
var questionQuery = _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).AsQueryable();
var tableQuestionQuery = _readingTableQuestionTrialRepository.Where(x => x.TrialCriterionId == inDto.TrialReadingCriterionId).AsQueryable();
await _readingTaskQuestionAnswer.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && questionQuery.Count(y => y.Id == x.ReadingQuestionTrialId) == 0);
await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && questionQuery.Count(y => y.Id == x.QuestionId) == 0);
await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.ReadingTableQuestionTrial.TrialCriterionId == inDto.TrialReadingCriterionId && tableQuestionQuery.Count(y => y.Id == x.TableQuestionId) == 0);
}
await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
{
SynchronizeOriginalTime = DateTime.Now
});
await _readingCriterionDictionaryRepository.SaveChangesAsync();
}
return ResponseOutput.Ok(true);
}
/// <summary>
/// 同步阅片关键点
/// </summary>
/// <returns></returns>
public async Task SynchronizeKeyFile(Guid TrialReadingCriterionId)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == TrialReadingCriterionId).AsNoTracking().FirstOrDefaultAsync();
if (trialCriterion != null && trialCriterion.ReadingQuestionCriterionSystemId != null)
{
var systemCriterionKeyFile = await _systemCriterionKeyFileRepository.Where(x => x.SystemCriterionId == trialCriterion.ReadingQuestionCriterionSystemId).ToListAsync();
List<TrialCriterionKeyFile> trialCriterionKeyFiles = new List<TrialCriterionKeyFile>();
foreach (var item in systemCriterionKeyFile)
{
var path = await _oSSService.UploadToOSSAsync(item.FilePath, $"{trialCriterion.TrialId}/ReadingModule/{trialCriterion.CriterionName}", true, true, uploadInfo: new FileUploadRecordAddOrEdit() { TrialId = trialCriterion.TrialId, BatchDataType = BatchDataType.ReadingKeyFile });
trialCriterionKeyFiles.Add(new TrialCriterionKeyFile
{
TrialCriterionId = TrialReadingCriterionId,
FileName = item.FileName,
FilePath = path
});
}
await _trialCriterionKeyFileRepository.BatchDeleteNoTrackingAsync(x => x.TrialCriterionId == TrialReadingCriterionId);
await _trialCriterionKeyFileRepository.AddRangeAsync(trialCriterionKeyFiles);
await _trialCriterionKeyFileRepository.SaveChangesAsync();
}
}
/// <summary>
/// 修改全局阅片配置信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> SetGlobalReadingInfo(SetGlobalReadingInfoInDto inDto)
{
//await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
//{
// IsGlobalReading = inDto.IsGlobalReading
//});
await _readingTrialCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.CriterionId == inDto.TrialReadingCriterionId && x.ParentCode == ReadingCommon.CriterionDictionary.GlobalAssess);
await _readingTrialCriterionDictionaryRepository.AddRangeAsync(inDto.GlobalAssessList.Select(x => new ReadingTrialCriterionDictionary
{
CriterionId = inDto.TrialReadingCriterionId,
DictionaryId = x.DictionaryId,
IsBaseLineUse = x.IsBaseLineUse,
IsFollowVisitUse = x.IsFollowVisitUse,
ParentCode = ReadingCommon.CriterionDictionary.GlobalAssess
}));
var result = await _readingCriterionDictionaryRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
/// <summary>
/// 获取全局阅片信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<GetGlobalReadingOutDto> GetGlobalReadingInfo(GetOncologySetInDto inDto)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
GetGlobalReadingOutDto result = new GetGlobalReadingOutDto()
{
IsGlobalReading = trialCriterion.IsGlobalReading,
IsSystemCriterion = trialCriterion.ReadingQuestionCriterionSystemId != null,
IsSign = trialCriterion.IsSigned,
GlobalAssessTypes = await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialReadingCriterionId
&& x.ParentCode == ReadingCommon.CriterionDictionary.GlobalAssess
)
.Select(x => new CriterionDictionaryInfo()
{
Id = x.Id,
DictionaryId = x.DictionaryId,
ChildGroup = x.Dictionary.ChildGroup,
IsBaseLineUse = x.IsBaseLineUse,
IsFollowVisitUse = x.IsFollowVisitUse,
Code = x.Dictionary.Code,
Description = x.Dictionary.Description,
ShowOrder = x.Dictionary.ShowOrder,
ParentCode = x.Dictionary.Parent.Code,
Value = x.Dictionary.Value,
ValueCN = x.Dictionary.ValueCN
}).OrderBy(x => x.ParentCode).ThenBy(x => x.ShowOrder).ToListAsync()
};
return result;
}
/// <summary>
/// 获取项目肿瘤学配置
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<GetOncologySetOutDto> GetOncologySet(GetOncologySetInDto inDto)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
return new GetOncologySetOutDto
{
EvaluationReason = trialCriterion.EvaluationReason.IsNullOrEmpty() ? ReadingCommon.EvaluationReason : trialCriterion.EvaluationReason,
OncologyAssessIds = await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialReadingCriterionId && x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess).Select(x => x.DictionaryId).ToListAsync(),
IsSystemCriterion = trialCriterion.ReadingQuestionCriterionSystemId != null,
IsSign = trialCriterion.IsSigned,
};
}
/// <summary>
/// 设置项目肿瘤学配置
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> SetOncologySet(SetOncologySetInDto inDto)
{
await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
{
EvaluationResult = inDto.EvaluationResult,
EvaluationReason = inDto.EvaluationReason,
IsShowDetail = inDto.IsShowDetail,
});
await _readingTrialCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.CriterionId == inDto.TrialReadingCriterionId && x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess);
await _readingTrialCriterionDictionaryRepository.AddRangeAsync(inDto.OncologyAssessIds.Select(x => new ReadingTrialCriterionDictionary
{
CriterionId = inDto.TrialReadingCriterionId,
DictionaryId = x,
ParentCode = ReadingCommon.CriterionDictionary.OncologyAssess
}));
var result = await _readingQuestionCriterionTrialRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
/// <summary>
/// 获取项目裁判信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<(List<TrialJudgeQuestion>, object)> GetTrialReadingJudgeList(GetTrialReadingInfoInDto inDto)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
var judgeQuestionList = await _readingQuestionTrialRepository
.WhereIf(trialCriterion.FormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null)
.WhereIf(trialCriterion.FormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null)
.Where(x => x.ReadingQuestionCriterionTrial.IsConfirm && x.IsJudgeQuestion && x.TrialId == inDto.TrialId && x.ReadingQuestionCriterionTrialId == trialCriterion.Id)
.Select(x => new TrialJudgeQuestion()
{
AnswerCombination = x.AnswerCombination,
AnswerGroup = x.AnswerGroup,
JudgeType = x.JudgeType,
QuestionId = x.Id,
PageName = x.ReadingCriterionPage.PageName,
QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us),
ReadingQuestionCriterionTrialId = x.ReadingQuestionCriterionTrialId
}).ToListAsync();
return (judgeQuestionList, new
{
IsSign = trialCriterion.IsSigned,
});
}
/// <summary>
/// 获取项目标准分页信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<ReadingCriterionPageDto>> GetReadingCriterionPageList(GetTrialReadingInfoInDto inDto)
{
return await _readingCriterionPageRepository.Where(x => x.TrialId == inDto.TrialId).ProjectTo<ReadingCriterionPageDto>(_mapper.ConfigurationProvider).ToListAsync();
}
/// <summary>
/// 获取项目阅片标准信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<(GetTrialReadingCriterionInfoOutDto, object)> GetTrialReadingCriterionInfo(GetTrialReadingInfoInDto inDto)
{
GetTrialReadingCriterionInfoOutDto result = new GetTrialReadingCriterionInfoOutDto();
result.ReadingCriterionPageList = await _readingCriterionPageRepository.Where(x => x.TrialId == inDto.TrialId).ProjectTo<ReadingCriterionPageDto>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync();
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
result.ReadingInfoSignTime = trialCriterion.ReadingInfoSignTime;
result.DigitPlaces = trialCriterion.DigitPlaces;
result.TrialCriterionId = trialCriterion.Id;
result.FormType = trialCriterion.FormType;
result.IsFromSystem = trialCriterion.ReadingQuestionCriterionSystemId != null;
result.IsMustGlobalReading = trialCriterion.IsMustGlobalReading;
result.IsSystemCriterion = trialCriterion.ReadingQuestionCriterionSystemId != null;
result.TrialQuestionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrial.IsConfirm && x.TrialId == inDto.TrialId && x.ReadingQuestionCriterionTrialId == result.TrialCriterionId
&& x.ReadingCriterionPageId == null)
.ProjectTo<TrialReadQuestion>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync();
return (result, new
{
ReadingVersionEnum = trialCriterion.ReadingVersionEnum
});
}
///// <summary>
///// 设置项目阅片标准
///// </summary>
///// <returns></returns>
//[TrialGlobalLimit( "AfterStopCannNotOpt" )]
//public async Task<IResponseOutput> SetTrialReadingCriterion(SetTrialReadingCriterionInDto inDto)
//{
// if (inDto.IsSignSave)
// {
// var criterionFormType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.FormType).FirstOrDefaultAsync();
// var count = _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId)
// .WhereIf(criterionFormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null)
// .WhereIf(criterionFormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null).Count();
// if (count == 0)
// {
// //---当前标准下未配置问题
// throw new BusinessValidationFailedException(_localizer["TrialConfig_StdConfigMissing"]);
// }
// }
// await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
// {
// FormType = inDto.FormType,
// });
// var result = await _trialRepository.SaveChangesAsync();
// return ResponseOutput.Ok(result);
//}
/// <summary>
/// 设置项目阅片信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> SetCriterionReadingInfo(SetCriterionReadingInfoInDto inDto)
{
#region 验证阅片工具配置
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
var toolList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).Where(x => x.ImageTool != string.Empty).Select(x => x.ImageTool).ToListAsync();
var tabletoolList = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).Where(x => x.ImageTool != string.Empty).Select(x => x.ImageTool).ToListAsync();
toolList.AddRange(tabletoolList);
toolList = toolList.Distinct().ToList();
var alltool = trialCriterion.ReadingToolList.Union(trialCriterion.SegmentToolList).ToList();
if (tabletoolList.Except(alltool).Count() > 0)
{
//---问题的阅片工具不在标准配置的阅片工具列表中
throw new BusinessValidationFailedException(_localizer["TrialConfig_TableToolNotInStdTool"]);
}
#endregion
ArbitrationRule arbitration = ArbitrationRule.NA;
if (inDto.IsArbitrationReading)
{
arbitration = inDto.IsReadingPeriod ? ArbitrationRule.Reading : ArbitrationRule.Visit;
}
await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
{
CircleRadius = inDto.CircleRadius,
ReadingToolList = inDto.ReadingToolList,
SegmentToolList = inDto.SegmentToolList,
IsImageFilter = inDto.IsImageFilter,
ImageDownloadEnum = inDto.ImageDownloadEnum,
ImageUploadEnum = inDto.ImageUploadEnum,
CriterionModalitys = inDto.CriterionModalitys,
ReadingTool = inDto.ReadingTool,
IsReadingPeriod = inDto.IsReadingPeriod,
DefaultSegmentName = inDto.DefaultSegmentName,
//DigitPlaces=inDto.DigitPlaces,
IsReadingTaskViewInOrder = inDto.IsReadingTaskViewInOrder,
ReadingTaskViewEnum = inDto.ReadingTaskViewEnum,
DigitPlaces = inDto.DigitPlaces,
//IsImageIabeled = inDto.IsImageIabeled,
IsReadingShowSubjectInfo = inDto.IsReadingShowSubjectInfo,
IsReadingShowPreviousResults = inDto.IsReadingShowPreviousResults,
GlobalUpdateType = inDto.GlobalUpdateType,
ImagePlatform = inDto.ImagePlatform,
IseCRFShowInDicomReading = inDto.IseCRFShowInDicomReading,
ArbitrationRule = arbitration,
ReadingType = inDto.ReadingType,
IsGlobalReading = inDto.IsGlobalReading,
IsArbitrationReading = inDto.IsArbitrationReading,
IsOncologyReading = inDto.IsOncologyReading,
IsUrgent = inDto.IsUrgent,
IsAdditionalAssessment = inDto.IsAdditionalAssessment,
IsAutoCreate = inDto.IsAutoCreate
});
if (!inDto.IsArbitrationReading)
{
await _readingQuestionTrialRepository.UpdatePartialFromQueryAsync(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId, x => new ReadingQuestionTrial()
{
JudgeType = JudgeTypeEnum.None
});
}
List<TrialCriterionKeyFile> keyFileList = new List<TrialCriterionKeyFile>();
await _trialCriterionKeyFileRepository.BatchDeleteNoTrackingAsync(t => t.TrialCriterionId == inDto.TrialReadingCriterionId);
if (inDto.KeyFileList != null && inDto.KeyFileList.Count > 0)
{
foreach (var keyFile in inDto.KeyFileList)
{
keyFileList.Add(new TrialCriterionKeyFile()
{
TrialCriterionId = inDto.TrialReadingCriterionId,
FileName = keyFile.FileName,
FilePath = keyFile.FilePath
});
}
await _trialCriterionKeyFileRepository.AddRangeAsync(keyFileList);
}
//判断是否存在附加评估
if (inDto.IsAdditionalAssessment)
{
#region 存在,就将标准对应的附加评估选项加进去--废弃 修改到同步标准的地方去了,不管存在附加评估与否,都增加附加评估类型
//if (!await _trialCriterionAdditionalAssessmentTypeRepository.AnyAsync(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId))
//{
// AdditionalAssessment additional = new AdditionalAssessment();
// var addList = additional.GetSystemDefeaultAdditionalAssessmentList(inDto.CriterionType);
// foreach (var addItem in addList)
// {
// await _trialCriterionAdditionalAssessmentTypeRepository.AddAsync(new TrialCriterionAdditionalAssessmentType()
// {
// CriterionType = inDto.CriterionType,
// TrialReadingCriterionId = inDto.TrialReadingCriterionId,
// AdditionalAssessmentType = addItem.AdditionalAssessmentType
// });
// }
//}
#endregion
if (inDto.TrialCriterionAdditionalAssessmentTypeList.All(t => t.IsSelected != true))
{
//---选择了附加评估,必须勾选附加评估类型
throw new BusinessValidationFailedException(_localizer["TrialConfig_AddEvalReq"]);
}
var trialId = _readingQuestionTrialRepository.Where(t => t.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).Select(t => t.TrialId).FirstOrDefault();
if (inDto.TrialCriterionAdditionalAssessmentTypeList.Count != 0)
{
foreach (var updateItem in inDto.TrialCriterionAdditionalAssessmentTypeList)
{
if (updateItem.IsSelected == true)
{
//添加默认问题
AdditionalAssessment additional = new AdditionalAssessment();
var addTypeList = additional.GetSystemDefeaultAdditionalAssessmentList(updateItem.CriterionType, updateItem.AdditionalAssessmentType);
if (!await _readingQuestionTrialRepository.AsQueryable().IgnoreQueryFilters().AnyAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional == true))
{
foreach (var addType in addTypeList)
{
foreach (var question in addType.AdditionalQuestionList)
{
question.ReadingQuestionCriterionTrialId = updateItem.TrialReadingCriterionId;
question.TrialId = trialId;
await _readingQuestionTrialRepository.AddAsync(question);
}
}
}
}
await _trialCriterionAdditionalAssessmentTypeRepository.UpdatePartialFromQueryAsync(updateItem.Id, t => new TrialCriterionAdditionalAssessmentType() { IsSelected = updateItem.IsSelected });
}
}
}
else
{
//删除附加问题
await _readingQuestionTrialRepository.BatchDeleteNoTrackingAsync(t => t.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && t.IsAdditional == true);
}
var result = await _readingQuestionCriterionTrialRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
/// <summary>
/// 获取附加评估选项列表
/// </summary>
/// <param name="trialReadingCriterionId"></param>
/// <returns></returns>
[Obsolete]
public async Task<List<TrialCriterionAdditionalAssessmentType>> GetTrialCriterionAdditionalAssessmentOptionList(Guid trialReadingCriterionId)
{
return await _trialCriterionAdditionalAssessmentTypeRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).ToListAsync();
}
/// <summary>
/// 保存附加评估设置 (自动添加 或者删除附加评估问题)
/// </summary>
/// <param name="updateList"></param>
/// <returns></returns>
[Obsolete]
public async Task<IResponseOutput> SetTrialCriterionAdditionalAssessment(List<AddOrUpdateTrialCriterionAdditional> updateList)
{
if (updateList.Count == 0)
{
return ResponseOutput.Ok();
}
var trialId = _readingQuestionTrialRepository.Where(t => t.ReadingQuestionCriterionTrialId == updateList.First().TrialReadingCriterionId).Select(t => t.TrialId).FirstOrDefault();
foreach (var updateItem in updateList)
{
if (updateItem.IsSelected == true)
{
//添加默认问题
AdditionalAssessment additional = new AdditionalAssessment();
var addTypeList = additional.GetSystemDefeaultAdditionalAssessmentList(updateItem.CriterionType, updateItem.AdditionalAssessmentType);
foreach (var addType in addTypeList)
{
foreach (var question in addType.AdditionalQuestionList)
{
question.ReadingQuestionCriterionTrialId = updateItem.TrialReadingCriterionId;
question.TrialId = trialId;
await _readingQuestionTrialRepository.AddAsync(question);
}
}
}
else
{
//删除附加问题
await _readingQuestionTrialRepository.BatchDeleteNoTrackingAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional == true);
}
await _trialCriterionAdditionalAssessmentTypeRepository.UpdatePartialFromQueryAsync(updateItem.Id, t => new TrialCriterionAdditionalAssessmentType() { IsSelected = updateItem.IsSelected });
}
await _readingQuestionTrialRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
/// <summary>
/// 获取签名文本
/// </summary>
/// <param name="signCode"></param>
/// <returns></returns>
[HttpGet("{signCode}")]
public async Task<IResponseOutput> GetSignText(string signCode)
{
var signRawText = await _systemBasicDataRepository.Where(t => t.Code == signCode).Select(t => new { t.Code, t.Value, t.ValueCN, t.Id, ParentValue = t.Parent.Value, ParentValueCN = t.Parent.ValueCN }).FirstOrDefaultAsync();
if (signRawText == null)
{
//---该操作需要电子签名确认,但未在系统中找到该场景的签名模板。
return ResponseOutput.NotOk(_localizer["TrialConfig_SignTemplateMissing"]);
}
return ResponseOutput.Ok(new
{
SignCodeId = signRawText.Id,
SignCode = signRawText.Code,
SignText = _userInfo.IsEn_Us ? signRawText.ParentValue.Replace("xxx", signRawText.Value) : signRawText.ParentValueCN.Replace("xxx", signRawText.ValueCN),
//SignTextCN = signRawText.ParentValueCN.Replace("xxx", signRawText.Value)
});
}
//验证 仅仅在 Initializing/Ongoing 才可以操作
private async Task VerifyOnlyInOngoingOrInitialIzingOptAsync(Guid trialId)
{
if (!await _trialRepository.AnyAsync(t => t.Id == trialId && (t.TrialStatusStr == StaticData.TrialState.TrialInitializing || t.TrialStatusStr == StaticData.TrialState.TrialOngoing)))
{
//---该项目已结束或停止,不允许修改配置。
throw new BusinessValidationFailedException(_localizer["TrialConfig_ProjectEnded"]);
}
}
/// <summary>
/// 验证签名确认
/// </summary>
/// <param name="signConfirmDTO"></param>
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
[HttpPost]
public async Task<IResponseOutput> VerifyTrialConfigSignatureConfirm(SignConfirmDTO signConfirmDTO)
{
var trialConfig = (await _trialRepository
.Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification })
.FirstOrDefaultAsync(t => t.TrialId == signConfirmDTO.TrialId))
.IfNullThrowException();
var showOrderList = await _trialQCQuestionRepository.Where(t => t.TrialId == signConfirmDTO.TrialId).Select(t =>
new { t.ShowOrder, ParentShowOrder = (int?)t.ParentQCQuestion.ShowOrder }).ToListAsync();
if (trialConfig.QCProcessEnum ==
TrialQCProcess.DoubleAudit || trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit)
{
if (showOrderList.Count == 0)
{
//---当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。
throw new BusinessValidationFailedException(_localizer["TrialConfig_NoImageAuditQuestion"]);
}
}
if (showOrderList.Count != showOrderList.Select(t => t.ShowOrder).Distinct().Count())
{
//---影像质控审核问题显示序号不能重复。
throw new BusinessValidationFailedException(_localizer["TrialConfig_DuplicateAuditQuestionId"]);
}
if (showOrderList.Where(t => t.ParentShowOrder != null).Any(t => t.ParentShowOrder > t.ShowOrder))
{
//---父问题的显示序号要比子问题的显示序号小,请确认。
throw new BusinessValidationFailedException(_localizer["TrialConfig_InvalidParentQuestionId"]);
}
if (await _trialRepository.AnyAsync(t => t.Id == signConfirmDTO.TrialId && t.QCQuestionConfirmedUserId != null && t.QCQuestionConfirmedUserId != _userInfo.UserRoleId))
{
//---影像质控审核问题已被其他人员确认,不允许再次确认。
throw new BusinessValidationFailedException(_localizer["TrialConfig_AuditQuestionConfirmed"]);
}
return ResponseOutput.Ok();
}
/// <summary>
/// 签名确认 包括项目的三组配置 + QC问题确认 后修改状态 (适用于不会回退的,项目废除、状态修改, 存在回退 不在这里弄,提供单独接口修改状态)
/// </summary>
/// <returns></returns>
//[Authorize(Policy = IRaCISPolicy.PM_APM)]
public async Task<IResponseOutput> TrialConfigSignatureConfirm(SignConfirmDTO signConfirmDTO)
{
await VerifyOnlyInOngoingOrInitialIzingOptAsync(signConfirmDTO.TrialId);
if (signConfirmDTO.SignCode == ((int)SignEnum.TrialLogicConfim).ToString())
{
await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == signConfirmDTO.TrialId, u => new Trial() { IsTrialBasicLogicConfirmed = true });
}
else if (signConfirmDTO.SignCode == ((int)SignEnum.TrialProcessConfim).ToString())
{
await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == signConfirmDTO.TrialId, u => new Trial() { IsTrialProcessConfirmed = true });
}
else if (signConfirmDTO.SignCode == ((int)SignEnum.TrialUrgentConfim).ToString())
{
await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == signConfirmDTO.TrialId, u => new Trial() { IsTrialUrgentConfirmed = true });
}
else if (signConfirmDTO.SignCode == ((int)SignEnum.TrialQCQuestionConfirmUpdate).ToString())
{
var trialConfirmTime = _trialRepository.Where(t => t.Id == signConfirmDTO.TrialId).Select(t => t.QCQuestionConfirmedTime).FirstOrDefault();
if (trialConfirmTime != null)
{
//删除复审中间临时数据
await _qcQuestionAnswerRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == signConfirmDTO.TrialId && t.SubjectVisit.SecondReviewState == SecondReviewState.WaitAudit
&& t.CurrentQCEnum == CurrentQC.SecondReview && t.UpdateTime > trialConfirmTime);
}
await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == signConfirmDTO.TrialId, u => new Trial() { QCQuestionConfirmedTime = null, QCQuestionConfirmedUserId = null, IsQCQuestionConfirmed = false });
}
else if (signConfirmDTO.SignCode == ((int)SignEnum.SecondReviewConfirm).ToString())
{
var trialConfirmTime = _trialRepository.Where(t => t.Id == signConfirmDTO.TrialId).Select(t => t.QCQuestionConfirmedTime).FirstOrDefault();
if (trialConfirmTime != null)
{
//删除复审中间临时数据--没重置,一直点生成复核任务
await _qcQuestionAnswerRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == signConfirmDTO.TrialId && t.SubjectVisit.SecondReviewState == SecondReviewState.WaitAudit
&& t.CurrentQCEnum == CurrentQC.SecondReview && t.UpdateTime > trialConfirmTime);
//删除质控中 临时保存的问题答案 (因为添加那里只会新增 和全部更新,如果不处理,那么有新增,也有更新,稽查那里也会有问题)
await _qcQuestionAnswerRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == signConfirmDTO.TrialId && t.SubjectVisit.AuditState == AuditStateEnum.InPrimaryQC
&& t.CurrentQCEnum == CurrentQC.First);
await _qcQuestionAnswerRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == signConfirmDTO.TrialId && t.SubjectVisit.AuditState == AuditStateEnum.InSecondaryQC
&& t.CurrentQCEnum == CurrentQC.Second);
//重复二次复核签名
await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.TrialId == signConfirmDTO.TrialId && t.AuditState == AuditStateEnum.QCPassed
&& !t.TrialQCQuestionAnswerList.Any(t => t.SecondReviewTime == trialConfirmTime), u => new SubjectVisit() { SecondReviewState = SecondReviewState.WaitAudit });
}
}
else if (signConfirmDTO.SignCode == ((int)SignEnum.TrialQCQuestionConfirm).ToString())
{
var trialConfig = (await _trialRepository
.Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification })
.FirstOrDefaultAsync(t => t.TrialId == signConfirmDTO.TrialId))
.IfNullThrowException();
var showOrderList = await _trialQCQuestionRepository.Where(t => t.TrialId == signConfirmDTO.TrialId).Select(t =>
new { t.ShowOrder, ParentShowOrder = (int?)t.ParentQCQuestion.ShowOrder }).ToListAsync();
if (trialConfig.QCProcessEnum ==
TrialQCProcess.DoubleAudit || trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit)
{
if (showOrderList.Count == 0)
{
//---当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。
throw new BusinessValidationFailedException(_localizer["TrialConfig_NoImageAuditQuestion"]);
}
}
if (showOrderList.Count != showOrderList.Select(t => t.ShowOrder).Distinct().Count())
{
//---影像质控审核问题显示序号不能重复。
throw new BusinessValidationFailedException(_localizer["TrialConfig_DuplicateAuditQuestionId"]);
}
if (showOrderList.Where(t => t.ParentShowOrder != null).Any(t => t.ParentShowOrder > t.ShowOrder))
{
//---父问题的显示序号要比子问题的显示序号小,请确认。
throw new BusinessValidationFailedException(_localizer["TrialConfig_InvalidParentQuestionId"]);
}
if (await _trialRepository.AnyAsync(t => t.Id == signConfirmDTO.TrialId && t.QCQuestionConfirmedUserId != null && t.QCQuestionConfirmedUserId != _userInfo.UserRoleId))
{
//---影像质控审核问题已被其他人员确认,不允许再次确认。
throw new BusinessValidationFailedException(_localizer["TrialConfig_AuditQuestionConfirmed"]);
}
//不记录这个稽查,不关注问题上的确认标记
await _trialQCQuestionRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == signConfirmDTO.TrialId, x => new TrialQCQuestion
{
IsConfirm = true
});
await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == signConfirmDTO.TrialId, u => new Trial() { QCQuestionConfirmedTime = DateTime.Now, QCQuestionConfirmedUserId = _userInfo.UserRoleId, IsQCQuestionConfirmed = true });
}
await _trialRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
/// <summary>
/// 配置 基础逻辑信息
/// </summary>
/// <param name="trialConfig"></param>
/// <returns></returns>
[HttpPut]
//[Authorize(Policy = IRaCISPolicy.PM_APM)]
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
public async Task<IResponseOutput> ConfigTrialBasicInfo(BasicTrialConfig trialConfig)
{
await VerifyOnlyInOngoingOrInitialIzingOptAsync(trialConfig.TrialId);
var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
trialConfig.Modalitys = $"{String.Join('|', trialConfig.ModalityList)}";
_mapper.Map(trialConfig, trialInfo);
trialInfo.UpdateTime = DateTime.Now;
//_trialRepository.MarkAsModified(trialInfo, nameof(trialInfo.TrialObjectNameList));
//await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys });
return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
}
/// <summary>
/// 配置流程验证
/// </summary>
/// <param name="trialConfig"></param>
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
[HttpPost]
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
public async Task ConfigTrialProcessInfoVerification(ConfigTrialProcessInfoVerificationInDto trialConfig)
{
if (!await _trialRepository.Where(t => t.Id == trialConfig.TrialId).IgnoreQueryFilters().AnyAsync(t => t.TrialStatusStr == StaticData.TrialState.TrialInitializing))
{
//---该项目当前状态不是初始化,不允许进行该操作。
throw new BusinessValidationFailedException(_localizer["TrialConfig_ProjectNotInitialized"]);
}
var clinicalDataTrialSetDataList = await _clinicalDataTrialSetRepository.Where(x => trialConfig.ClinicalDataTrialSetIds.Contains(x.Id)).Include(x => x.TrialClinicalDataSetCriteriaList).ToListAsync();
foreach (var item in clinicalDataTrialSetDataList)
{
var clinicalids = item.TrialClinicalDataSetCriteriaList.Select(x => x.TrialReadingCriterionId).ToList();
if (clinicalids.Intersect(trialConfig.TrialCriterionIds).ToList().Count() == 0)
{
throw new BusinessValidationFailedException(_localizer["TrialConfig_NoCriteriaClinicalData"]);
}
}
}
/// <summary>
/// 配置流程
/// </summary>
/// <param name="trialConfig"></param>
/// <returns></returns>
[HttpPut]
//[Authorize(Policy = IRaCISPolicy.PM_APM)]
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
public async Task<IResponseOutput> ConfigTrialProcessInfo(TrialProcessConfig trialConfig)
{
if (!await _trialRepository.Where(t => t.Id == trialConfig.TrialId).IgnoreQueryFilters().AnyAsync(t => t.TrialStatusStr == StaticData.TrialState.TrialInitializing))
{
//---该项目当前状态不是初始化,不允许进行该操作。
return ResponseOutput.NotOk(_localizer["TrialConfig_ProjectNotInitialized"]);
}
var trialInfo = await _trialRepository.Where(t => t.Id == trialConfig.TrialId, true).Include(t => t.TrialDicList.Where(u => u.KeyName == StaticData.Criterion)).FirstOrDefaultAsync();
if (trialInfo == null) return Null404NotFound(trialInfo);
_mapper.Map(trialConfig, trialInfo);
//不管是否修改,一定要记录稽查
trialInfo.UpdateTime = DateTime.Now;
//// 修改临床数据
var clinicalDataTrialSetList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialConfig.TrialId, true).ToListAsync();
foreach (var item in clinicalDataTrialSetList)
{
if (trialConfig.ClinicalDataTrialSetIds.Contains(item.Id))
{
item.IsConfirm = true;
}
else
{
item.IsConfirm = false;
}
}
//// 修改阅片标准
var readingQuestionCriterionTrialList = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialConfig.TrialId, true).ToListAsync();
foreach (var item in readingQuestionCriterionTrialList)
{
if (trialConfig.TrialCriterionIds.Contains(item.Id))
{
item.IsConfirm = true;
//item.CriterionModalitys = trialInfo.Modalitys;
}
else
{
item.IsConfirm = false;
}
}
#region 废弃
#endregion
//if (trialInfo.IsGlobalReading && (trialInfo.IsArbitrationReading ?? false))
//{
// trialInfo.ArbitrationRule = ArbitrationRule.Reading;
//}
//if (!trialInfo.IsGlobalReading && (trialInfo.IsArbitrationReading ?? false))
//{
// trialInfo.ArbitrationRule = ArbitrationRule.Visit;
//}
//trialInfo.UpdateTime = DateTime.Now;
//// 修改临床数据
//var noconfirmids = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialConfig.TrialId && !trialConfig.ClinicalDataTrialSetIds.Contains(x.Id)).Select(x => x.Id).ToListAsync();
//foreach (var item in trialConfig.ClinicalDataTrialSetIds)
//{
// await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(item, x => new ClinicalDataTrialSet()
// {
// IsConfirm = true
// });
//}
//foreach (var item in noconfirmids)
//{
// await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(item, x => new ClinicalDataTrialSet()
// {
// IsConfirm = false
// });
//}
//// 修改阅片标准
//var cancelConfirmCriterionIds = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialConfig.TrialId && x.IsConfirm && !trialConfig.TrialCriterionIds.Contains(x.Id)).Select(x => x.Id).ToListAsync();
//await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => cancelConfirmCriterionIds.Contains(x.Id), x => new ReadingQuestionCriterionTrial()
//{
// IsConfirm = false
//});
//await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => trialConfig.TrialCriterionIds.Contains(x.Id), x => new ReadingQuestionCriterionTrial()
//{
// IsConfirm = true
//}); ;
var result = await _trialRepository.SaveChangesAsync();
if (trialConfig.IsTrialProcessConfirmed)
{
var criterionTrialList = await _readingQuestionCriterionTrialRepository.Where(x => x.IsConfirm && x.TrialId == trialConfig.TrialId && x.ReadingQuestionCriterionSystemId != null && x.SynchronizeOriginalTime == null).ToListAsync();
foreach (var item in criterionTrialList)
{
await AsyncTrialCriterionDictionary(new AsyncTrialCriterionDictionaryInDto()
{
TrialReadingCriterionId = item.Id
});
}
}
return ResponseOutput.Ok(result);
}
/// <summary>
/// 配置加急信息
/// </summary>
/// <param name="trialConfig"></param>
/// <returns></returns>
[HttpPut]
//[Authorize(Policy = IRaCISPolicy.PM_APM)]
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
public async Task<IResponseOutput> ConfigTrialUrgentInfo(TrialUrgentConfig trialConfig)
{
await VerifyOnlyInOngoingOrInitialIzingOptAsync(trialConfig.TrialId);
var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
//项目紧急 当前所有已提交,但未完成的访视,设置为加急。后续提交的访视也设置为加急 (在提交的时候,回去判断 项目加急,Subject加急,是否入组确认,是否Pd,从而设置访视是否加急)
if (trialConfig.IsUrgent)
{
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialInfo.Id && t.SubmitState == SubmitStateEnum.Submitted && t.ForwardState < ForwardStateEnum.Forwarded,
s => new SubjectVisit() { IsUrgent = trialConfig.IsUrgent });
}
else //之前设置为加急的访视状态不变。后续提交的访视,为不加急。
{
}
_mapper.Map(trialConfig, trialInfo);
trialInfo.UpdateTime = DateTime.Now;
return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
}
/// <summary>
/// 配置pacs信息
/// </summary>
/// <param name="trialConfig"></param>
/// <returns></returns>
[HttpPut]
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
public async Task<IResponseOutput> ConfigTrialPACSInfo(TrialPACSConfig trialConfig)
{
var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
trialInfo.IsPACSConnect = trialConfig.IsPACSConnect;
trialInfo.IsTrialPACSConfirmed = trialConfig.IsTrialPACSConfirmed;
trialInfo.UpdateTime = DateTime.Now;
await _dicomAERepository.DeleteFromQueryAsync(t => t.TrialId == trialConfig.TrialId);
await _trialRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
[HttpGet("{trialId:guid}")]
public async Task<IResponseOutput> IfTrialCanOngoing(Guid trialId)
{
var canOPt = await _trialRepository.AnyAsync(trial =>
trial.Id == trialId && trial.IsTrialBasicLogicConfirmed && trial.IsTrialProcessConfirmed &&
trial.IsTrialUrgentConfirmed && trial.VisitPlanConfirmed && trial.IsTrialPACSConfirmed);
//---该项目的项目配置(基础配置、流程配置、加急配置) 、访视管理,有配置未确认,不能设置项目状态为启动。
return ResponseOutput.Ok(canOPt, msg: canOPt ? "" : _localizer["TrialConfig_UnconfirmedConfiguration"]);
}
/// <summary>
/// 更新项目状态
/// </summary>
/// <param name="trialId"></param>
/// <param name="trialStatusStr"></param>
/// <param name="reason"></param>
/// <returns></returns>
[HttpPut("{trialId:guid}/{trialStatusStr}/{reason?}")]
[UnitOfWork]
//[Authorize(Policy = IRaCISPolicy.PM)]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> UpdateTrialState(Guid trialId, string trialStatusStr, string? reason)
{
var trial = (await _trialRepository.Where(t => t.Id == trialId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException();
if (trialStatusStr == StaticData.TrialState.TrialOngoing)
{
if (trial.IsTrialBasicLogicConfirmed && trial.IsTrialProcessConfirmed && trial.IsTrialUrgentConfirmed && trial.VisitPlanConfirmed && trial.IsTrialPACSConfirmed)
{
}
else
{
//---无法变更项目状态。该项目的项目配置、访视管理中,有未确认项
return ResponseOutput.NotOk(_localizer["TrialConfig_UnconfirmedUNACKD"]);
}
}
if ((trialStatusStr == StaticData.TrialState.TrialStopped || trialStatusStr == StaticData.TrialState.TrialCompleted) && trial.TrialStatusStr != StaticData.TrialState.TrialOngoing)
{
//---项目没有进入启动状态,不能设置为停止或完成状态
return ResponseOutput.NotOk(_localizer["TrialConfig_ProjectNotStarted"]);
}
//if (trialStatusStr != StaticData.TrialState.TrialOngoing)
//{
// trial.TrialFinishTime = DateTime.Now;
//}
trial.TrialStateChangeList.Add(new TrialStateChange() { OriginState = trial.TrialStatusStr, NowState = trialStatusStr, Reason = reason ?? String.Empty, TrialId = trialId });
trial.TrialStatusStr = trialStatusStr;
//Paused、 添加工总量 算医生读片中
if (trialStatusStr.Contains(StaticData.TrialState.TrialCompleted))
{
await _enrollRepository.BatchUpdateNoTrackingAsync(u => u.TrialId == trialId, e => new Enroll
{
EnrollStatus = EnrollStatus.Finished
});
await _trialRepository.BatchUpdateNoTrackingAsync(u => u.Id == trialId, s => new Trial { TrialFinishedTime = DateTime.Now });
if (_readingQuestionCriterionTrialRepository.Any(t => t.TrialId == trial.Id && t.IsSigned && t.ImageUploadEnum != ReadingImageUpload.None))
{
await _oSSService.SetImmediateArchiveRule($"{trial.Id}/Image/");
await _oSSService.SetImmediateArchiveRule($"{trial.Id}/TaskImage/");
}
else
{
await _oSSService.SetImmediateArchiveRule($"{trial.Id}/Image/");
}
}
await _fusionCache.SetAsync(CacheKeys.Trial(trial.Id.ToString()), trialStatusStr, TimeSpan.FromDays(7));
await _trialRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
/// <summary>
/// 项目状态 变更历史
/// </summary>
/// <param name="trialId"></param>
/// <returns></returns>
[HttpGet("{trialId:guid}")]
public async Task<List<TrialStateChangeDTO>> GetTrialStateChangeList(Guid trialId)
{
return await _trialStateChangeRepository.Where(t => t.TrialId == trialId).ProjectTo<TrialStateChangeDTO>(_mapper.ConfigurationProvider).ToListAsync();
}
/// <summary>
/// 废除项目
/// </summary>
/// <param name="trialId"></param>
/// <param name="isAbandon"></param>
/// <returns></returns>
[HttpPut("{trialId:guid}/{isAbandon:bool}")]
//[Authorize(Policy = IRaCISPolicy.PM)]
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
public async Task<IResponseOutput> AbandonTrial(Guid trialId, /*Guid? signId,*/ bool isAbandon)
{
await _trialRepository.UpdatePartialFromQueryAsync(trialId, u => new Trial()
{
IsDeleted = isAbandon,
TrialFinishTime = isAbandon ? DateTime.Now : null
}, true);
return ResponseOutput.Ok();
}
/// <summary>
/// 获取 配置的所有信息 没有分多个接口
/// </summary>
/// <param name="trialId"></param>
/// <returns></returns>
[HttpGet("{trialId:guid}")]
public async Task<TrialConfigDTO> GetTrialConfigInfo(Guid trialId)
{
var result = await _trialRepository.Where(t => t.Id == trialId).ProjectTo<TrialConfigDTO>(_mapper.ConfigurationProvider, new
{
isEn_Us = _userInfo.IsEn_Us
})
.FirstOrDefaultAsync().IfNullThrowException();
var use = _trialRepository.Where(t => t.Id == trialId).Select(t => new
{
DicomModalityList = t.StudyList.Where(t => t.ModalityForEdit != "")
.Select(c => c.ModalityForEdit)
.Distinct(),
DicomStudyNameList = t.StudyList.Where(t => t.StudyName != "")
.Select(c => c.StudyName)
.Distinct(),
NoneDicomStudyNameList = t.NoneDicomStudyList.Where(t => t.StudyName != "")
.Select(c => c.StudyName)
.Distinct(),
NoneDicomModalityList = t.NoneDicomStudyList.Where(t => t.Modality != "")
.Select(c => c.Modality)
.Distinct(),
}).FirstOrDefault();
result.StudyUseModalityList = use.DicomModalityList.Union(use.NoneDicomModalityList).Distinct().ToList();
result.StudyUseStudyNameList = use.DicomStudyNameList.Union(use.NoneDicomStudyNameList).Distinct().ToList();
return result;
}
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
public async Task<IResponseOutput> ConfigTrialSPMInfo(TrialSPMConfigCommand trialConfig)
{
var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.Id)).IfNullThrowException();
_mapper.Map(trialConfig, trialInfo);
return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
}
/// <summary>
/// 配置项目任务信息
/// </summary>
/// <param name="trialConfig"></param>
/// <returns></returns>
[HttpPut]
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
//[TrialGlobalLimit( "AfterStopCannNotOpt" )]
public async Task<IResponseOutput> ConfigTrialTaskInfo(TrialTaskConfig trialConfig)
{
var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
_mapper.Map(trialConfig, trialInfo);
return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
}
/// <summary>
/// 配置项目读片查看规则
/// </summary>
/// <param name="trialConfig"></param>
/// <returns></returns>
[HttpPut]
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
//[TrialGlobalLimit( "AfterStopCannNotOpt" )]
public async Task<IResponseOutput> ConfigTrialReadingTaskViewRule(TrialReadingTaskViewConfig trialConfig)
{
var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
_mapper.Map(trialConfig, trialInfo);
return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
}
/// <summary>
/// 获取项目部位配置列表
/// </summary>
/// <param name="trialId"></param>
/// <returns></returns>
public async Task<IResponseOutput<List<TrialBodyPartView>>> GetTrialBodyPartList(Guid trialId)
{
var list = await _trialRepository.Where(t => t.Id == trialId)
.SelectMany(t => t.TrialBodyPartList)
.Select(t => new TrialBodyPartView() { Code = t.Code, Name = _userInfo.IsEn_Us ? t.Name : t.NameCN, Id = t.Id, IsHandAdd = t.IsHandAdd })
.OrderBy(t => t.Name).ToListAsync();
var useBodyPart = _trialRepository.Where(t => t.Id == trialId).Select(t => new
{
DicomBodyPartList = t.StudyList.Where(t => t.BodyPartForEdit != "")
.Select(c => c.BodyPartForEdit)
.Distinct(),
NoneDicomBodyPartList = t.NoneDicomStudyList.Where(t => t.BodyPart != "")
.Select(c => c.BodyPart)
.Distinct(),
}).FirstOrDefault();
foreach (var item in list)
{
var useBodyPartList = new List<string>();
if (useBodyPart != null)
{
useBodyPartList = useBodyPart.DicomBodyPartList.Union(useBodyPart.NoneDicomBodyPartList).Distinct().ToList();
}
item.IsStudyUse = useBodyPartList.Any(t => t == item.Name);
}
return ResponseOutput.Ok(list);
}
/// <summary>
/// 添加更新 项目部位配置
/// </summary>
/// <param name="incommand"></param>
/// <returns></returns>
public async Task<IResponseOutput> AddOrUpdateTrialBodyPart(AddOrUpdateTrialBodyPartCommand incommand)
{
var codeList = await _trialBodyPartRepository.Where(t => t.TrialId == incommand.TrialId)
.WhereIf(incommand.Id != null, t => t.Id != incommand.Id)
.Select(t => t.Code).ToListAsync();
var newString = incommand.Code;
// 检查字符串是否在集合中存在,如果存在,则在后面加上一个数字
int count = 1;
while (codeList.Contains(newString))
{
newString = $"{newString}{count}";
count++;
}
incommand.Code = newString;
var exp = new EntityVerifyExp<TrialBodyPart>()
{
VerifyExp = t => (_userInfo.IsEn_Us ? t.Name.Equals(incommand.Name) : t.NameCN.Equals(incommand.NameCN)) && t.TrialId == incommand.TrialId,
VerifyMsg = _localizer["TrialBodyPart_DupName"]
};
var cro = await _trialBodyPartRepository.InsertOrUpdateAsync(incommand, true, exp);
return ResponseOutput.Ok(cro.Id.ToString(), ApiResponseCodeEnum.NeedTips);
}
/// <summary>
/// 获取项目额外配置
/// </summary>
/// <param name="trialId"></param>
/// <returns></returns>
[AllowAnonymous]
public async Task<TrialConfigInfo> GetTrialExtralConfig(Guid trialId)
{
var extralObj = _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.TrialExtraConfigJsonStr, t.TrialDataStoreType, t.IsExternalViewTrialChart, t.TrialObjectNameList, t.CollectImagesEnum, t.IsIQCAutoNextTask, t.IsImageQualityControl, t.TrialType }).FirstOrDefault();
var extralConfig = JsonConvert.DeserializeObject<TrialExtraConfig>(extralObj?.TrialExtraConfigJsonStr) ?? new TrialExtraConfig();
var trialConfig = _mapper.Map<TrialConfigInfo>(extralConfig);
trialConfig.IsImageQualityControl = extralObj.IsImageQualityControl;
trialConfig.TrialObjectNameList = extralObj.TrialObjectNameList;
trialConfig.IsExternalViewTrialChart = extralObj.IsExternalViewTrialChart;
trialConfig.CollectImagesEnum = extralObj.CollectImagesEnum;
trialConfig.IsIQCAutoNextTask = extralObj.IsIQCAutoNextTask;
trialConfig.TrialDataStoreType = extralObj.TrialDataStoreType;
trialConfig.TrialType = extralObj.TrialType;
return trialConfig;
}
/// <summary>
/// 获取项目Pacs 配置
/// </summary>
/// <param name="trialId"></param>
/// <param name="optionsMonitor"></param>
/// <returns></returns>
public async Task<TrialPacsInfo> GetTrialPacsConfigInfo(Guid trialId, [FromServices] IOptionsMonitor<SystemPacsConfig> optionsMonitor)
{
var trialCode = await _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialCode).FirstOrDefaultAsync();
return new TrialPacsInfo() { Ip = optionsMonitor.CurrentValue.IP, Port = optionsMonitor.CurrentValue.Port, TrialCalledAE = $"EI{trialCode}" };
}
/// <summary>
/// 修改项目的StudyNameList
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> UpdateTrialStudyNameList(UpdateTrialStudyNameListInDto inDto)
{
var trial = await _trialRepository.FirstOrDefaultAsync(x => x.Id == inDto.TrialId);
trial.StudyNameList = trial.StudyNameList.Where(x => x.IsChoose).ToList();
inDto.StudyNameList.ForEach(x =>
{
if (trial.StudyNameList.Any(y => y.Name == x.Name && y.EnName == x.EnName))
{
x.IsChoose = true;
}
});
trial.StudyNameList = inDto.StudyNameList;
await _trialRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
/// <summary>
/// 更新项目额外json 配置
/// </summary>
/// <param name="trialId"></param>
/// <param name="trialExtralConfig"></param>
/// <returns></returns>
[HttpPut]
public async Task<IResponseOutput> UpdateTrialExtralConfig(Guid trialId, TrialExtraConfig trialExtralConfig)
{
var trial = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
trial.TrialExtraConfigJsonStr = trialExtralConfig.ToJsonStr();
await _trialRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
}
}