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.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 ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application { [ApiExplorerSettings(GroupName = "Trial")] public class TrialConfigService(IRepository _trialRepository, IRepository _trialQCQuestionRepository, IRepository _readingQuestionCriterionTrialRepository, IRepository _readingQuestionTrialRepository, IRepository _trialCriterionDictionaryCode, IRepository _systemCriterionDictionaryCode, IRepository _readingQuestionCriterionSystemRepository, IRepository _clinicalDataTrialSetRepository, IRepository _readingCriterionPageRepository, IOrganInfoService _iOrganInfoService, IRepository _trialBodyPartRepository, IRepository _readingCriterionDictionaryRepository, IRepository _readingTrialCriterionDictionaryRepository, IReadingQuestionService iReadingQuestionService, IRepository _trialCriterionAdditionalAssessmentTypeRepository, IRepository _readingTaskQuestionAnswer, IRepository _readingTableQuestionAnswerRepository, IRepository _readingTableAnswerRowInfoRepository, IRepository _systemBasicDataRepository, IRepository _subjectVisitRepository, IRepository _enrollRepository, IRepository _trialStateChangeRepository, IRepository _readingTableQuestionTrialRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, ITrialConfigService { /// /// 阅片信息签名验证接口 /// /// /// /// [HttpPost] public async Task 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"]); } return ResponseOutput.Ok(true); } /// /// 获取项目已经确认的标准 /// /// [HttpPost] public async Task> GetTrialConfirmCriterionList(GetTrialConfirmCriterionListInDto inDto) { List result = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm) .Select(x => new GetTrialConfirmCriterionOutDto() { TrialCriterionId = x.Id, CriterionName = x.CriterionName }).ToListAsync(); return result; } /// /// 阅片信息签名 /// /// /// [NonDynamicMethod] public async Task 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); } /// /// 获取项目阅片信息 /// /// /// [HttpPost] public async Task> GetCriterionReadingInfo(GetTrialReadingInfoInDto inDto) { GetTrialReadingInfoOutDto trialInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); if (trialInfo.ReadingTool == null) { trialInfo.ReadingTool = ReadingTool.Dicom; } trialInfo.TrialCriterionAdditionalAssessmentTypeList = await _trialCriterionAdditionalAssessmentTypeRepository.Where(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId).ToListAsync(); return ResponseOutput.Ok(trialInfo); } /// /// 重置并同步标准 /// /// /// public async Task 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); } /// /// 同步项目标准所有信息 /// /// /// [HttpPost] public async Task 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 //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); } /// /// 修改全局阅片配置信息 /// /// /// [HttpPost] [TrialGlobalLimit("AfterStopCannNotOpt")] public async Task 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); } /// /// 获取全局阅片信息 /// /// /// [HttpPost] public async Task 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; } /// /// 获取项目肿瘤学配置 /// /// /// [HttpPost] public async Task 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, }; } /// /// 设置项目肿瘤学配置 /// /// /// [HttpPost] [TrialGlobalLimit("AfterStopCannNotOpt")] public async Task 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); } /// /// 获取项目裁判信息 /// /// /// [HttpPost] public async Task<(List, 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, }); } /// /// 获取项目标准分页信息 /// /// /// [HttpPost] public async Task> GetReadingCriterionPageList(GetTrialReadingInfoInDto inDto) { return await _readingCriterionPageRepository.Where(x => x.TrialId == inDto.TrialId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } /// /// 获取项目阅片标准信息 /// /// /// [HttpPost] public async Task<(GetTrialReadingCriterionInfoOutDto, bool)> GetTrialReadingCriterionInfo(GetTrialReadingInfoInDto inDto) { GetTrialReadingCriterionInfoOutDto result = new GetTrialReadingCriterionInfoOutDto(); result.ReadingCriterionPageList = await _readingCriterionPageRepository.Where(x => x.TrialId == inDto.TrialId).ProjectTo(_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(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); return (result, true); } ///// ///// 设置项目阅片标准 ///// ///// //[TrialGlobalLimit( "AfterStopCannNotOpt" )] //public async Task 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); //} /// /// 设置项目阅片信息 /// /// /// [HttpPost] [TrialGlobalLimit("AfterStopCannNotOpt")] public async Task SetCriterionReadingInfo(SetCriterionReadingInfoInDto inDto) { ArbitrationRule arbitration = ArbitrationRule.NA; if (inDto.IsArbitrationReading) { arbitration = inDto.IsReadingPeriod ? ArbitrationRule.Reading : ArbitrationRule.Visit; } await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial() { IsImageFilter = inDto.IsImageFilter, ImageDownloadEnum = inDto.ImageDownloadEnum, ImageUploadEnum = inDto.ImageUploadEnum, CriterionModalitys = inDto.CriterionModalitys, ReadingTool = inDto.ReadingTool, IsReadingPeriod = inDto.IsReadingPeriod, //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.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); } /// /// 获取附加评估选项列表 /// /// /// [Obsolete] public async Task> GetTrialCriterionAdditionalAssessmentOptionList(Guid trialReadingCriterionId) { return await _trialCriterionAdditionalAssessmentTypeRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).ToListAsync(); } /// /// 保存附加评估设置 (自动添加 或者删除附加评估问题) /// /// /// [Obsolete] public async Task SetTrialCriterionAdditionalAssessment(List 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(); } /// /// 获取签名文本 /// /// /// [HttpGet("{signCode}")] public async Task 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"]); } } /// /// 验证签名确认 /// /// /// /// [HttpPost] public async Task 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.Id)) { //---影像质控审核问题已被其他人员确认,不允许再次确认。 throw new BusinessValidationFailedException(_localizer["TrialConfig_AuditQuestionConfirmed"]); } return ResponseOutput.Ok(); } /// /// 签名确认 包括项目的三组配置 + QC问题确认 后修改状态 (适用于不会回退的,项目废除、状态修改, 存在回退 不在这里弄,提供单独接口修改状态) /// /// //[Authorize(Policy = IRaCISPolicy.PM_APM)] public async Task 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.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.Id)) { //---影像质控审核问题已被其他人员确认,不允许再次确认。 throw new BusinessValidationFailedException(_localizer["TrialConfig_AuditQuestionConfirmed"]); } await _trialQCQuestionRepository.UpdatePartialFromQueryAsync(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.Id, IsQCQuestionConfirmed = true }); await _trialRepository.SaveChangesAsync(); } return ResponseOutput.Ok(); } /// /// 配置 基础逻辑信息 /// /// /// [HttpPut] //[Authorize(Policy = IRaCISPolicy.PM_APM)] [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")] public async Task 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()); } /// /// 配置流程验证 /// /// /// /// [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"]); } } } /// /// 配置流程 /// /// /// [HttpPut] //[Authorize(Policy = IRaCISPolicy.PM_APM)] [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")] public async Task 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); } /// /// 配置加急信息 /// /// /// [HttpPut] //[Authorize(Policy = IRaCISPolicy.PM_APM)] [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")] public async Task 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()); } /// /// 配置pacs信息 /// /// /// [HttpPut] [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")] public async Task 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 _trialRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } [HttpGet("{trialId:guid}")] public async Task 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"]); } /// /// 更新项目状态 /// /// /// /// /// [HttpPut("{trialId:guid}/{trialStatusStr}/{reason?}")] [UnitOfWork] //[Authorize(Policy = IRaCISPolicy.PM)] [TrialGlobalLimit("AfterStopCannNotOpt")] public async Task 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 }); } await _fusionCache.SetAsync(CacheKeys.Trial(trial.Id.ToString()), trialStatusStr, TimeSpan.FromDays(7)); await _trialRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 项目状态 变更历史 /// /// /// [HttpGet("{trialId:guid}")] public async Task> GetTrialStateChangeList(Guid trialId) { return await _trialStateChangeRepository.Where(t => t.TrialId == trialId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } /// /// 废除项目 /// /// /// /// [HttpPut("{trialId:guid}/{isAbandon:bool}")] //[Authorize(Policy = IRaCISPolicy.PM)] [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")] public async Task 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(); } /// /// 获取 配置的所有信息 没有分多个接口 /// /// /// [HttpGet("{trialId:guid}")] public async Task GetTrialConfigInfo(Guid trialId) { return await _trialRepository.Where(t => t.Id == trialId).ProjectTo(_mapper.ConfigurationProvider, new { isEn_Us = _userInfo.IsEn_Us }) .FirstOrDefaultAsync().IfNullThrowException(); } /// /// 配置项目任务信息 /// /// /// [HttpPut] [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")] //[TrialGlobalLimit( "AfterStopCannNotOpt" )] public async Task ConfigTrialTaskInfo(TrialTaskConfig trialConfig) { var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException(); _mapper.Map(trialConfig, trialInfo); return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync()); } /// /// 配置项目读片查看规则 /// /// /// [HttpPut] [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")] //[TrialGlobalLimit( "AfterStopCannNotOpt" )] public async Task ConfigTrialReadingTaskViewRule(TrialReadingTaskViewConfig trialConfig) { var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException(); _mapper.Map(trialConfig, trialInfo); return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync()); } /// /// 获取项目部位配置列表 /// /// /// public async Task>> 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 }).ToListAsync(); return ResponseOutput.Ok(list); } /// /// 添加更新 项目部位配置 /// /// /// public async Task 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() { 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); } /// /// 获取项目额外配置 /// /// /// [AllowAnonymous] public async Task GetTrialExtralConfig(Guid trialId) { var extralObj = _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.TrialExtraConfigJsonStr, t.TrialObjectNameList }).FirstOrDefault(); var extralConfig = JsonConvert.DeserializeObject(extralObj?.TrialExtraConfigJsonStr) ?? new TrialExtraConfig(); extralConfig.TrialObjectNameList = extralObj.TrialObjectNameList; return extralConfig; } /// /// 获取项目Pacs 配置 /// /// /// /// public async Task GetTrialPacsConfigInfo(Guid trialId, [FromServices] IOptionsMonitor 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}" }; } } }