irc-netcore-api/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs

1462 lines
67 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 IRaCIS.Core.Infrastructure.Encryption;
using MassTransit;
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<Trial> _trialRepository,
IRepository<TrialQCQuestion> _trialQCQuestionRepository,
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
IRepository<TrialCriterionDictionaryCode> _trialCriterionDictionaryCode,
IRepository<SystemCriterionDictionaryCode> _systemCriterionDictionaryCode,
IRepository<ReadingQuestionCriterionSystem> _readingQuestionCriterionSystemRepository,
IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository,
IRepository<ReadingCriterionPage> _readingCriterionPageRepository,
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<TrialStateChange> _trialStateChangeRepository,
IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository,
IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig,
IRepository<HIRHospital> _hIRHospitalRepository,
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, ITrialConfigService
{
/// <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"]);
}
return ResponseOutput.Ok(true);
}
/// <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<IResponseOutput<GetTrialReadingInfoOutDto>> 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 ResponseOutput.Ok(trialInfo);
}
/// <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
//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>
/// <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, bool)> 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, true);
}
///// <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)
{
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);
}
/// <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.Id))
{
//---影像质控审核问题已被其他人员确认,不允许再次确认。
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.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();
}
/// <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 _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"]);
}
trial.TrialStateChangeList.Add(new TrialStateChange() { OriginState = trial.TrialStatusStr, NowState = trialStatusStr, Reason = reason ?? String.Empty, TrialId = trialId });
trial.TrialStatusStr = trialStatusStr;
//项目启动,需要添加项目标准,设置默认数据
if (trialStatusStr.Contains(StaticData.TrialState.TrialOngoing))
{
//配置的要同步的系统标准
var criterionTypeList = trial.CriterionTypeList;
//删除项目项目已有的,之前查询接口,每次会自动添加,属实恶心
await _readingQuestionCriterionTrialRepository.BatchDeleteNoTrackingAsync(x => x.TrialId == trialId && x.IsConfirm == false);
var trialCriterionTypes = _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialId)
.Select(x => x.CriterionType);
var needAddCriterionList = await _readingQuestionCriterionSystemRepository.Where(x => x.IsEnable && criterionTypeList.Contains(x.CriterionType) && !trialCriterionTypes.Contains(x.CriterionType)).ProjectTo<ReadingQuestionCriterionTrial>(_mapper.ConfigurationProvider).ToListAsync();
needAddCriterionList.ForEach(x =>
{
x.TrialId = trialId;
x.ReadingQuestionCriterionSystemId = x.Id;
x.Id = NewId.NextGuid();
x.IsAutoCreate =/* x.CriterionType == CriterionType.RECIST1Pointt1_MB ? false :*/ true;
//对应勾选确认
x.IsConfirm = true;
//对应签名
x.IsSigned = true;
x.ReadingInfoSignTime = DateTime.Now;
});
await _readingQuestionCriterionTrialRepository.AddRangeAsync(needAddCriterionList);
await _readingQuestionCriterionTrialRepository.SaveChangesAsync();
//同步标准数据
foreach (var item in needAddCriterionList)
{
await AsyncTrialCriterionDictionary(new AsyncTrialCriterionDictionaryInDto() { TrialReadingCriterionId = item.Id });
}
}
//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 });
}
#region 自动激活一个月
if (trial.AuthorizationDate == null && trial.AuthorizationEncrypt.IsNotNullOrEmpty())
{
var query = _hIRHospitalRepository.Where(t => t.IsDefault == true).ProjectTo<HIRHospitalView>(_mapper.ConfigurationProvider);
var hospitalInfo = await query.FirstNotNullAsync();
var hospitalCode = hospitalInfo.HospitalCode;
var hospitalName = hospitalInfo.HospitalName;
var deadLineDate = DateTime.Now.Date.AddMonths(1).AddDays(1).AddSeconds(-1);
var authorizationInfo = new TrialAuthorizationInfo()
{
ActiveTime = DateTime.Now,
PurchaseDuration = 1,
CriterionTypeList = trial.CriterionTypeList,
HospitalCode = hospitalCode,
HospitalName = hospitalName,
CreateUserId = trial.CreateUserId,
TrialId = trial.Id,
TrialCode = trial.TrialCode,
AuthorizationDeadLineDate = deadLineDate,
ActiveDeadLineDate = DateTime.Now.Date.AddDays(8).AddSeconds(-1)
};
var newActivationCode = AesEncryption.Encrypt($"{JsonConvert.SerializeObject(authorizationInfo)}", _basicSystemConfigConfig.CurrentValue.AESKey, "Trial_AuthorizationEncrypt");
trial.AuthorizationEncrypt = newActivationCode;
trial.AuthorizationDate = deadLineDate;
//await _trialRepository.BatchUpdateNoTrackingAsync(t => t.Id == trialId, u => new Trial() { AuthorizationEncrypt = newActivationCode, AuthorizationDate = deadLineDate });
}
#endregion
var caheInfo = new TrialCacheInfo() { TrialId = trial.Id, TrialStatusStr = trial.TrialStatusStr, CriterionTypes = trial.CriterionTypes, AuthorizationEncrypt = trial.AuthorizationEncrypt, AuthorizationDate = trial.AuthorizationDate, CreateUserId = trial.CreateUserId, TrialCode = trial.TrialCode };
await _fusionCache.SetAsync(CacheKeys.Trial(trial.Id.ToString()), caheInfo, 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)
{
return await _trialRepository.Where(t => t.Id == trialId).ProjectTo<TrialConfigDTO>(_mapper.ConfigurationProvider, new
{
isEn_Us = _userInfo.IsEn_Us
})
.FirstOrDefaultAsync().IfNullThrowException();
}
/// <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 }).ToListAsync();
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>
public async Task<TrialExtraConfig> GetTrialExtralConfig(Guid trialId)
{
var extralObj = _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.TrialExtraConfigJsonStr, t.TrialObjectNameList }).FirstOrDefault();
var extralConfig = JsonConvert.DeserializeObject<TrialExtraConfig>(extralObj?.TrialExtraConfigJsonStr) ?? new TrialExtraConfig();
extralConfig.TrialObjectNameList = extralObj.TrialObjectNameList;
return extralConfig;
}
/// <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}" };
}
}
}