1387 lines
		
	
	
		
			64 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			1387 lines
		
	
	
		
			64 KiB
		
	
	
	
		
			C#
		
	
	
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<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,
 | 
						||
        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.UserRoleId))
 | 
						||
            {
 | 
						||
                //---影像质控审核问题已被其他人员确认,不允许再次确认。
 | 
						||
                throw new BusinessValidationFailedException(_localizer["TrialConfig_AuditQuestionConfirmed"]);
 | 
						||
            }
 | 
						||
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 签名确认   包括项目的三组配置 +  QC问题确认     后修改状态  (适用于不会回退的,项目废除、状态修改, 存在回退 不在这里弄,提供单独接口修改状态)
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        //[Authorize(Policy = IRaCISPolicy.PM_APM)]
 | 
						||
        public async Task<IResponseOutput> TrialConfigSignatureConfirm(SignConfirmDTO signConfirmDTO)
 | 
						||
        {
 | 
						||
            await VerifyOnlyInOngoingOrInitialIzingOptAsync(signConfirmDTO.TrialId);
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            if (signConfirmDTO.SignCode == ((int)SignEnum.TrialLogicConfim).ToString())
 | 
						||
            {
 | 
						||
                await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == signConfirmDTO.TrialId, u => new Trial() { IsTrialBasicLogicConfirmed = true });
 | 
						||
            }
 | 
						||
            else if (signConfirmDTO.SignCode == ((int)SignEnum.TrialProcessConfim).ToString())
 | 
						||
            {
 | 
						||
                await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == signConfirmDTO.TrialId, u => new Trial() { IsTrialProcessConfirmed = true });
 | 
						||
            }
 | 
						||
            else if (signConfirmDTO.SignCode == ((int)SignEnum.TrialUrgentConfim).ToString())
 | 
						||
            {
 | 
						||
                await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == signConfirmDTO.TrialId, u => new Trial() { IsTrialUrgentConfirmed = true });
 | 
						||
            }
 | 
						||
            else
 | 
						||
 | 
						||
            if (signConfirmDTO.SignCode == ((int)SignEnum.TrialQCQuestionConfirm).ToString())
 | 
						||
            {
 | 
						||
 | 
						||
                var trialConfig = (await _trialRepository
 | 
						||
                    .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification })
 | 
						||
                    .FirstOrDefaultAsync(t => t.TrialId == signConfirmDTO.TrialId))
 | 
						||
                    .IfNullThrowException();
 | 
						||
 | 
						||
 | 
						||
                var showOrderList = await _trialQCQuestionRepository.Where(t => t.TrialId == signConfirmDTO.TrialId).Select(t =>
 | 
						||
                new { t.ShowOrder, ParentShowOrder = (int?)t.ParentQCQuestion.ShowOrder }).ToListAsync();
 | 
						||
 | 
						||
                if (trialConfig.QCProcessEnum ==
 | 
						||
                    TrialQCProcess.DoubleAudit || trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit)
 | 
						||
                {
 | 
						||
                    if (showOrderList.Count == 0)
 | 
						||
                    {
 | 
						||
                        //---当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。
 | 
						||
                        throw new BusinessValidationFailedException(_localizer["TrialConfig_NoImageAuditQuestion"]);
 | 
						||
                    }
 | 
						||
                }
 | 
						||
 | 
						||
                if (showOrderList.Count != showOrderList.Select(t => t.ShowOrder).Distinct().Count())
 | 
						||
                {
 | 
						||
                    //---影像质控审核问题显示序号不能重复。
 | 
						||
                    throw new BusinessValidationFailedException(_localizer["TrialConfig_DuplicateAuditQuestionId"]);
 | 
						||
                }
 | 
						||
 | 
						||
                if (showOrderList.Where(t => t.ParentShowOrder != null).Any(t => t.ParentShowOrder > t.ShowOrder))
 | 
						||
                {
 | 
						||
                    //---父问题的显示序号要比子问题的显示序号小,请确认。
 | 
						||
                    throw new BusinessValidationFailedException(_localizer["TrialConfig_InvalidParentQuestionId"]);
 | 
						||
                }
 | 
						||
 | 
						||
                if (await _trialRepository.AnyAsync(t => t.Id == signConfirmDTO.TrialId && t.QCQuestionConfirmedUserId != null && t.QCQuestionConfirmedUserId != _userInfo.UserRoleId))
 | 
						||
                {
 | 
						||
                    //---影像质控审核问题已被其他人员确认,不允许再次确认。
 | 
						||
                    throw new BusinessValidationFailedException(_localizer["TrialConfig_AuditQuestionConfirmed"]);
 | 
						||
                }
 | 
						||
 | 
						||
                await _trialQCQuestionRepository.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.UserRoleId, IsQCQuestionConfirmed = true });
 | 
						||
                await _trialRepository.SaveChangesAsync();
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 配置 基础逻辑信息
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialConfig"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut]
 | 
						||
        //[Authorize(Policy = IRaCISPolicy.PM_APM)]
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        public async Task<IResponseOutput> ConfigTrialBasicInfo(BasicTrialConfig trialConfig)
 | 
						||
        {
 | 
						||
            await VerifyOnlyInOngoingOrInitialIzingOptAsync(trialConfig.TrialId);
 | 
						||
 | 
						||
            var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
 | 
						||
 | 
						||
            trialConfig.Modalitys = $"{String.Join('|', trialConfig.ModalityList)}";
 | 
						||
 | 
						||
            _mapper.Map(trialConfig, trialInfo);
 | 
						||
            trialInfo.UpdateTime = DateTime.Now;
 | 
						||
 | 
						||
            //_trialRepository.MarkAsModified(trialInfo, nameof(trialInfo.TrialObjectNameList));
 | 
						||
 | 
						||
            //await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys });
 | 
						||
 | 
						||
            return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 配置流程验证
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialConfig"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        /// <exception cref="BusinessValidationFailedException"></exception>
 | 
						||
        [HttpPost]
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        public async Task ConfigTrialProcessInfoVerification(ConfigTrialProcessInfoVerificationInDto trialConfig)
 | 
						||
        {
 | 
						||
            if (!await _trialRepository.Where(t => t.Id == trialConfig.TrialId).IgnoreQueryFilters().AnyAsync(t => t.TrialStatusStr == StaticData.TrialState.TrialInitializing))
 | 
						||
            {
 | 
						||
                //---该项目当前状态不是初始化,不允许进行该操作。
 | 
						||
                throw new BusinessValidationFailedException(_localizer["TrialConfig_ProjectNotInitialized"]);
 | 
						||
            }
 | 
						||
            var clinicalDataTrialSetDataList = await _clinicalDataTrialSetRepository.Where(x => trialConfig.ClinicalDataTrialSetIds.Contains(x.Id)).Include(x => x.TrialClinicalDataSetCriteriaList).ToListAsync();
 | 
						||
            foreach (var item in clinicalDataTrialSetDataList)
 | 
						||
            {
 | 
						||
                var clinicalids = item.TrialClinicalDataSetCriteriaList.Select(x => x.TrialReadingCriterionId).ToList();
 | 
						||
                if (clinicalids.Intersect(trialConfig.TrialCriterionIds).ToList().Count() == 0)
 | 
						||
                {
 | 
						||
                    throw new BusinessValidationFailedException(_localizer["TrialConfig_NoCriteriaClinicalData"]);
 | 
						||
                }
 | 
						||
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 配置流程
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialConfig"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut]
 | 
						||
        //[Authorize(Policy = IRaCISPolicy.PM_APM)]
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        public async Task<IResponseOutput> ConfigTrialProcessInfo(TrialProcessConfig trialConfig)
 | 
						||
        {
 | 
						||
            if (!await _trialRepository.Where(t => t.Id == trialConfig.TrialId).IgnoreQueryFilters().AnyAsync(t => t.TrialStatusStr == StaticData.TrialState.TrialInitializing))
 | 
						||
            {
 | 
						||
                //---该项目当前状态不是初始化,不允许进行该操作。
 | 
						||
                return ResponseOutput.NotOk(_localizer["TrialConfig_ProjectNotInitialized"]);
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            var trialInfo = await _trialRepository.Where(t => t.Id == trialConfig.TrialId, true).Include(t => t.TrialDicList.Where(u => u.KeyName == StaticData.Criterion)).FirstOrDefaultAsync();
 | 
						||
            if (trialInfo == null) return Null404NotFound(trialInfo);
 | 
						||
 | 
						||
 | 
						||
            _mapper.Map(trialConfig, trialInfo);
 | 
						||
 | 
						||
            //不管是否修改,一定要记录稽查
 | 
						||
            trialInfo.UpdateTime = DateTime.Now;
 | 
						||
 | 
						||
            //// 修改临床数据
 | 
						||
 | 
						||
            var clinicalDataTrialSetList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialConfig.TrialId, true).ToListAsync();
 | 
						||
 | 
						||
            foreach (var item in clinicalDataTrialSetList)
 | 
						||
            {
 | 
						||
 | 
						||
                if (trialConfig.ClinicalDataTrialSetIds.Contains(item.Id))
 | 
						||
                {
 | 
						||
                    item.IsConfirm = true;
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    item.IsConfirm = false;
 | 
						||
                }
 | 
						||
            }
 | 
						||
            //// 修改阅片标准
 | 
						||
 | 
						||
            var readingQuestionCriterionTrialList = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialConfig.TrialId, true).ToListAsync();
 | 
						||
 | 
						||
            foreach (var item in readingQuestionCriterionTrialList)
 | 
						||
            {
 | 
						||
 | 
						||
                if (trialConfig.TrialCriterionIds.Contains(item.Id))
 | 
						||
                {
 | 
						||
                    item.IsConfirm = true;
 | 
						||
 | 
						||
                    //item.CriterionModalitys = trialInfo.Modalitys;
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    item.IsConfirm = false;
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            #region 废弃
 | 
						||
 | 
						||
 | 
						||
            #endregion
 | 
						||
 | 
						||
            //if (trialInfo.IsGlobalReading && (trialInfo.IsArbitrationReading ?? false))
 | 
						||
            //{
 | 
						||
            //    trialInfo.ArbitrationRule = ArbitrationRule.Reading;
 | 
						||
            //}
 | 
						||
 | 
						||
            //if (!trialInfo.IsGlobalReading && (trialInfo.IsArbitrationReading ?? false))
 | 
						||
            //{
 | 
						||
            //    trialInfo.ArbitrationRule = ArbitrationRule.Visit;
 | 
						||
            //}
 | 
						||
            //trialInfo.UpdateTime = DateTime.Now;
 | 
						||
 | 
						||
            //// 修改临床数据
 | 
						||
            //var noconfirmids = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialConfig.TrialId && !trialConfig.ClinicalDataTrialSetIds.Contains(x.Id)).Select(x => x.Id).ToListAsync();
 | 
						||
            //foreach (var item in trialConfig.ClinicalDataTrialSetIds)
 | 
						||
            //{
 | 
						||
            //    await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(item, x => new ClinicalDataTrialSet()
 | 
						||
            //    {
 | 
						||
 | 
						||
            //        IsConfirm = true
 | 
						||
            //    });
 | 
						||
            //}
 | 
						||
 | 
						||
            //foreach (var item in noconfirmids)
 | 
						||
            //{
 | 
						||
            //    await _clinicalDataTrialSetRepository.UpdatePartialFromQueryAsync(item, x => new ClinicalDataTrialSet()
 | 
						||
            //    {
 | 
						||
 | 
						||
            //        IsConfirm = false
 | 
						||
            //    });
 | 
						||
            //}
 | 
						||
 | 
						||
            //// 修改阅片标准
 | 
						||
            //var cancelConfirmCriterionIds = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialConfig.TrialId && x.IsConfirm && !trialConfig.TrialCriterionIds.Contains(x.Id)).Select(x => x.Id).ToListAsync();
 | 
						||
 | 
						||
            //await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => cancelConfirmCriterionIds.Contains(x.Id), x => new ReadingQuestionCriterionTrial()
 | 
						||
            //{
 | 
						||
            //    IsConfirm = false
 | 
						||
            //});
 | 
						||
 | 
						||
            //await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => trialConfig.TrialCriterionIds.Contains(x.Id), x => new ReadingQuestionCriterionTrial()
 | 
						||
            //{
 | 
						||
            //    IsConfirm = true
 | 
						||
            //}); ;
 | 
						||
 | 
						||
 | 
						||
            var result = await _trialRepository.SaveChangesAsync();
 | 
						||
 | 
						||
            if (trialConfig.IsTrialProcessConfirmed)
 | 
						||
            {
 | 
						||
                var criterionTrialList = await _readingQuestionCriterionTrialRepository.Where(x => x.IsConfirm && x.TrialId == trialConfig.TrialId && x.ReadingQuestionCriterionSystemId != null && x.SynchronizeOriginalTime == null).ToListAsync();
 | 
						||
                foreach (var item in criterionTrialList)
 | 
						||
                {
 | 
						||
                    await AsyncTrialCriterionDictionary(new AsyncTrialCriterionDictionaryInDto()
 | 
						||
                    {
 | 
						||
                        TrialReadingCriterionId = item.Id
 | 
						||
                    });
 | 
						||
                }
 | 
						||
            }
 | 
						||
            return ResponseOutput.Ok(result);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 配置加急信息
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialConfig"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut]
 | 
						||
        //[Authorize(Policy = IRaCISPolicy.PM_APM)]
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        public async Task<IResponseOutput> ConfigTrialUrgentInfo(TrialUrgentConfig trialConfig)
 | 
						||
        {
 | 
						||
 | 
						||
            await VerifyOnlyInOngoingOrInitialIzingOptAsync(trialConfig.TrialId);
 | 
						||
 | 
						||
 | 
						||
            var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
 | 
						||
 | 
						||
 | 
						||
            //项目紧急  当前所有已提交,但未完成的访视,设置为加急。后续提交的访视也设置为加急 (在提交的时候,回去判断 项目加急,Subject加急,是否入组确认,是否Pd,从而设置访视是否加急)
 | 
						||
            if (trialConfig.IsUrgent)
 | 
						||
            {
 | 
						||
 | 
						||
                await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialInfo.Id && t.SubmitState == SubmitStateEnum.Submitted && t.ForwardState < ForwardStateEnum.Forwarded,
 | 
						||
                    s => new SubjectVisit() { IsUrgent = trialConfig.IsUrgent });
 | 
						||
            }
 | 
						||
            else //之前设置为加急的访视状态不变。后续提交的访视,为不加急。
 | 
						||
            {
 | 
						||
 | 
						||
            }
 | 
						||
 | 
						||
            _mapper.Map(trialConfig, trialInfo);
 | 
						||
 | 
						||
            trialInfo.UpdateTime = DateTime.Now;
 | 
						||
 | 
						||
            return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 配置pacs信息
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialConfig"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut]
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        public async Task<IResponseOutput> ConfigTrialPACSInfo(TrialPACSConfig trialConfig)
 | 
						||
        {
 | 
						||
            var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
 | 
						||
            trialInfo.IsPACSConnect = trialConfig.IsPACSConnect;
 | 
						||
            trialInfo.IsTrialPACSConfirmed = trialConfig.IsTrialPACSConfirmed;
 | 
						||
            trialInfo.UpdateTime = DateTime.Now;
 | 
						||
            await _trialRepository.SaveChangesAsync();
 | 
						||
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        [HttpGet("{trialId:guid}")]
 | 
						||
        public async Task<IResponseOutput> IfTrialCanOngoing(Guid trialId)
 | 
						||
        {
 | 
						||
            var canOPt = await _trialRepository.AnyAsync(trial =>
 | 
						||
                trial.Id == trialId && trial.IsTrialBasicLogicConfirmed && trial.IsTrialProcessConfirmed &&
 | 
						||
                trial.IsTrialUrgentConfirmed && trial.VisitPlanConfirmed && trial.IsTrialPACSConfirmed);
 | 
						||
            //---该项目的项目配置(基础配置、流程配置、加急配置) 、访视管理,有配置未确认,不能设置项目状态为启动。
 | 
						||
            return ResponseOutput.Ok(canOPt, msg: canOPt ? "" : _localizer["TrialConfig_UnconfirmedConfiguration"]);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 更新项目状态
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialId"></param>
 | 
						||
        /// <param name="trialStatusStr"></param>
 | 
						||
        /// <param name="reason"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut("{trialId:guid}/{trialStatusStr}/{reason?}")]
 | 
						||
        [UnitOfWork]
 | 
						||
        //[Authorize(Policy = IRaCISPolicy.PM)]
 | 
						||
        [TrialGlobalLimit("AfterStopCannNotOpt")]
 | 
						||
        public async Task<IResponseOutput> UpdateTrialState(Guid trialId, string trialStatusStr, string? reason)
 | 
						||
        {
 | 
						||
 | 
						||
            var trial = (await _trialRepository.Where(t => t.Id == trialId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException();
 | 
						||
 | 
						||
            if (trialStatusStr == StaticData.TrialState.TrialOngoing)
 | 
						||
            {
 | 
						||
                if (trial.IsTrialBasicLogicConfirmed && trial.IsTrialProcessConfirmed && trial.IsTrialUrgentConfirmed && trial.VisitPlanConfirmed && trial.IsTrialPACSConfirmed)
 | 
						||
                {
 | 
						||
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    //---无法变更项目状态。该项目的项目配置、访视管理中,有未确认项
 | 
						||
                    return ResponseOutput.NotOk(_localizer["TrialConfig_UnconfirmedUNACKD"]);
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            if ((trialStatusStr == StaticData.TrialState.TrialStopped || trialStatusStr == StaticData.TrialState.TrialCompleted) && trial.TrialStatusStr != StaticData.TrialState.TrialOngoing)
 | 
						||
            {
 | 
						||
                //---项目没有进入启动状态,不能设置为停止或完成状态
 | 
						||
                return ResponseOutput.NotOk(_localizer["TrialConfig_ProjectNotStarted"]);
 | 
						||
            }
 | 
						||
 | 
						||
            //if (trialStatusStr != StaticData.TrialState.TrialOngoing)
 | 
						||
            //{
 | 
						||
            //    trial.TrialFinishTime = DateTime.Now;
 | 
						||
            //}
 | 
						||
 | 
						||
            trial.TrialStateChangeList.Add(new TrialStateChange() { OriginState = trial.TrialStatusStr, NowState = trialStatusStr, Reason = reason ?? String.Empty, TrialId = trialId });
 | 
						||
 | 
						||
            trial.TrialStatusStr = trialStatusStr;
 | 
						||
 | 
						||
 | 
						||
            //Paused、 添加工总量  算医生读片中
 | 
						||
            if (trialStatusStr.Contains(StaticData.TrialState.TrialCompleted))
 | 
						||
            {
 | 
						||
                await _enrollRepository.BatchUpdateNoTrackingAsync(u => u.TrialId == trialId, e => new Enroll
 | 
						||
                {
 | 
						||
                    EnrollStatus = EnrollStatus.Finished
 | 
						||
                });
 | 
						||
 | 
						||
                await _trialRepository.BatchUpdateNoTrackingAsync(u => u.Id == trialId, s => new Trial { TrialFinishedTime = DateTime.Now });
 | 
						||
 | 
						||
            }
 | 
						||
 | 
						||
            await _fusionCache.SetAsync(CacheKeys.Trial(trial.Id.ToString()), trialStatusStr, TimeSpan.FromDays(7));
 | 
						||
 | 
						||
            await _trialRepository.SaveChangesAsync();
 | 
						||
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 项目状态 变更历史  
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialId"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
 | 
						||
        [HttpGet("{trialId:guid}")]
 | 
						||
        public async Task<List<TrialStateChangeDTO>> GetTrialStateChangeList(Guid trialId)
 | 
						||
        {
 | 
						||
            return await _trialStateChangeRepository.Where(t => t.TrialId == trialId).ProjectTo<TrialStateChangeDTO>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 废除项目
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialId"></param>
 | 
						||
        /// <param name="isAbandon"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut("{trialId:guid}/{isAbandon:bool}")]
 | 
						||
        //[Authorize(Policy = IRaCISPolicy.PM)]
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        public async Task<IResponseOutput> AbandonTrial(Guid trialId, /*Guid? signId,*/ bool isAbandon)
 | 
						||
        {
 | 
						||
 | 
						||
            await _trialRepository.UpdatePartialFromQueryAsync(trialId, u => new Trial()
 | 
						||
            {
 | 
						||
                IsDeleted = isAbandon,
 | 
						||
                TrialFinishTime = isAbandon ? DateTime.Now : null
 | 
						||
            }, true);
 | 
						||
 | 
						||
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 获取 配置的所有信息  没有分多个接口  
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialId"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpGet("{trialId:guid}")]
 | 
						||
        public async Task<TrialConfigDTO> GetTrialConfigInfo(Guid trialId)
 | 
						||
        {
 | 
						||
            return await _trialRepository.Where(t => t.Id == trialId).ProjectTo<TrialConfigDTO>(_mapper.ConfigurationProvider, new
 | 
						||
            {
 | 
						||
                isEn_Us = _userInfo.IsEn_Us
 | 
						||
 | 
						||
            })
 | 
						||
        .FirstOrDefaultAsync().IfNullThrowException();
 | 
						||
        }
 | 
						||
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        public async Task<IResponseOutput> ConfigTrialSPMInfo(TrialSPMConfigCommand trialConfig)
 | 
						||
        {
 | 
						||
            var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.Id)).IfNullThrowException();
 | 
						||
 | 
						||
            _mapper.Map(trialConfig, trialInfo);
 | 
						||
 | 
						||
            return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 配置项目任务信息
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialConfig"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut]
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        //[TrialGlobalLimit( "AfterStopCannNotOpt" )]
 | 
						||
        public async Task<IResponseOutput> ConfigTrialTaskInfo(TrialTaskConfig trialConfig)
 | 
						||
        {
 | 
						||
            var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
 | 
						||
 | 
						||
            _mapper.Map(trialConfig, trialInfo);
 | 
						||
 | 
						||
            return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 配置项目读片查看规则
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialConfig"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut]
 | 
						||
        [TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
 | 
						||
        //[TrialGlobalLimit( "AfterStopCannNotOpt" )]
 | 
						||
        public async Task<IResponseOutput> ConfigTrialReadingTaskViewRule(TrialReadingTaskViewConfig trialConfig)
 | 
						||
        {
 | 
						||
            var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
 | 
						||
 | 
						||
            _mapper.Map(trialConfig, trialInfo);
 | 
						||
 | 
						||
            return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 获取项目部位配置列表
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialId"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        public async Task<IResponseOutput<List<TrialBodyPartView>>> GetTrialBodyPartList(Guid trialId)
 | 
						||
        {
 | 
						||
            var list = await _trialRepository.Where(t => t.Id == trialId).SelectMany(t => t.TrialBodyPartList).Select(t => new TrialBodyPartView() { Code = t.Code, Name = _userInfo.IsEn_Us ? t.Name : t.NameCN, Id = t.Id, IsHandAdd = t.IsHandAdd }).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>
 | 
						||
        [AllowAnonymous]
 | 
						||
        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}" };
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |