746 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			746 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C#
		
	
	
//--------------------------------------------------------------------
 | 
						|
//     此代码由T4模板自动生成  byzhouhang 20210918
 | 
						|
//	   生成时间 2023-03-17 11:58:57 
 | 
						|
//     对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
 | 
						|
//--------------------------------------------------------------------
 | 
						|
 | 
						|
using IRaCIS.Core.Application.Interfaces;
 | 
						|
using IRaCIS.Core.Application.ViewModel;
 | 
						|
using IRaCIS.Core.Domain.Share;
 | 
						|
using IRaCIS.Core.Domain.Share.Reading;
 | 
						|
using Microsoft.AspNetCore.Mvc;
 | 
						|
using Panda.DynamicWebApi.Attributes;
 | 
						|
using System.Linq.Dynamic.Core;
 | 
						|
 | 
						|
namespace IRaCIS.Core.Application.Service
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// SubjectCriteriaEvaluationService
 | 
						|
    /// </summary>	
 | 
						|
    [ApiExplorerSettings(GroupName = "Trial")]
 | 
						|
    public class SubjectCriteriaEvaluationService(IRepository<SubjectCriteriaEvaluation> _subjectCriteriaEvaluationRepository,
 | 
						|
        IRepository<Subject> _subjectRepository,
 | 
						|
        IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						|
        IRepository<SubjectCriteriaEvaluationVisitFilter> _subjectCriteriaEvaluationVisitFilterRepository,
 | 
						|
        IRepository<SubjectCriteriaEvaluationVisitStudyFilter> _subjectCriteriaEvaluationVisitStudyFilterRepository,
 | 
						|
        IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository,
 | 
						|
        IRepository<ReadingQuestionTrial> _trialReadingQuestionRepository,
 | 
						|
        IRepository<VisitTask> _visitTaskRepository,
 | 
						|
        IVisitTaskHelpeService _IVisitTaskHelpeService,
 | 
						|
        IRepository<DicomStudy> _dicomStudyRepository,
 | 
						|
        IRepository<DicomSeries> _dicomSeriesRepository,
 | 
						|
        IRepository<TaskMedicalReview> _taskMedicalReviewRepository,
 | 
						|
        IRepository<VisitTaskReReading> _visitTaskReReadingRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ISubjectCriteriaEvaluationService
 | 
						|
    {
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// subject  某标准  是否评估列表
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inQuery"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput<PageOutput<SubjectCriteriaEvaluationView>>> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery)
 | 
						|
        {
 | 
						|
 | 
						|
            var trialReadingCritionList = _trialReadingCriterionRepository.Where(t => t.TrialId == inQuery.TrialId).ToList();
 | 
						|
 | 
						|
            var resultTrialReadingCriterionId = Guid.Empty;
 | 
						|
 | 
						|
            var resultTrialReadingCriterion = trialReadingCritionList.First();
 | 
						|
 | 
						|
            var curentCriterionType = CriterionType.NoCriterion;
 | 
						|
 | 
						|
 | 
						|
            //BM  需要找基线 两个人做的结果
 | 
						|
            if (trialReadingCritionList.First(t => t.Id == inQuery.TrialReadingCriterionId).CriterionType == CriterionType.RECIST1Pointt1_MB)
 | 
						|
            {
 | 
						|
 | 
						|
                resultTrialReadingCriterion = trialReadingCritionList.First(t => t.CriterionType == CriterionType.RECIST1Point1);
 | 
						|
                resultTrialReadingCriterionId = resultTrialReadingCriterion.Id;
 | 
						|
 | 
						|
                curentCriterionType = CriterionType.RECIST1Pointt1_MB;
 | 
						|
            }
 | 
						|
 | 
						|
            var addtionalQustionInfoList = _trialReadingQuestionRepository.Where(t => t.ReadingQuestionCriterionTrialId == resultTrialReadingCriterionId && t.IsAdditional == true && t.Type != "group").IgnoreQueryFilters().Select(t => new
 | 
						|
            {
 | 
						|
                QuestionId = t.Id,
 | 
						|
                t.QuestionEnName,
 | 
						|
                t.QuestionName
 | 
						|
            }).ToList();
 | 
						|
 | 
						|
            var questionIdList = addtionalQustionInfoList.Select(t => t.QuestionId).ToList();
 | 
						|
 | 
						|
 | 
						|
            var subjectCriteriaEvaluationQueryable = from subject in _subjectRepository.Where(t => t.TrialId == inQuery.TrialId && t.IsDeleted == false)
 | 
						|
                   .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), t => t.Code.Contains(inQuery.SubjectCode))
 | 
						|
                   .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), t => t.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode))
 | 
						|
                   .WhereIf(inQuery.SubjectStatus != null, t => t.Status == inQuery.SubjectStatus)
 | 
						|
 | 
						|
                                                     join subjectCriteriaEvaluation in _subjectCriteriaEvaluationRepository
 | 
						|
                                                     .Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
 | 
						|
 | 
						|
                                                     on subject.Id equals subjectCriteriaEvaluation.SubjectId into d
 | 
						|
                                                     from subjectCriteriaEvaluation in d.DefaultIfEmpty()
 | 
						|
 | 
						|
                                                     select new SubjectCriteriaEvaluationView()
 | 
						|
                                                     {
 | 
						|
                                                         SubjectCode = subject.Code,
 | 
						|
                                                         SubjectId = subject.Id,
 | 
						|
                                                         SubjectStatus = subject.Status,
 | 
						|
                                                         TrialSiteCode = subject.TrialSite.TrialSiteCode,
 | 
						|
 | 
						|
                                                         Id = subjectCriteriaEvaluation.Id,
 | 
						|
                                                         TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
 | 
						|
 | 
						|
                                                         IsImageFiltering = subject.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
 | 
						|
                                                         && t.ImageFilterState == ImageFilterState.None),
 | 
						|
 | 
						|
                                                         IsJoinEvaluation = subjectCriteriaEvaluation.IsJoinEvaluation,
 | 
						|
 | 
						|
 | 
						|
                                                         ReadingEvaluationList = subject.ReadingTaskQuestionAnswerList.AsQueryable().IgnoreQueryFilters()
 | 
						|
                                                         .Where(t => t.ReadingQuestionCriterionTrialId == resultTrialReadingCriterionId &&
 | 
						|
                                                        questionIdList.Contains(t.ReadingQuestionTrialId)
 | 
						|
                                                         && t.VisitTask.TaskState == TaskState.Effect)
 | 
						|
                                                         .Select(u => new EvaluationInfo()
 | 
						|
                                                         {
 | 
						|
                                                             QuestionId = u.ReadingQuestionTrialId,
 | 
						|
                                                             Answer = u.Answer,
 | 
						|
                                                             ArmEnum = u.VisitTask.ArmEnum,
 | 
						|
                                                             FinalTranslateDictionaryCode = u.ReadingQuestionTrial.DictionaryCode
 | 
						|
                                                         }).ToList()
 | 
						|
 | 
						|
                                                     };
 | 
						|
 | 
						|
            var pageList = await subjectCriteriaEvaluationQueryable
 | 
						|
                 .WhereIf(inQuery.IsImageFiltering != null, t => t.IsImageFiltering == inQuery.IsImageFiltering)
 | 
						|
                 .WhereIf(inQuery.IsJoinEvaluation != null, t => t.IsJoinEvaluation == inQuery.IsJoinEvaluation)
 | 
						|
                .ToPagedListAsync(inQuery, nameof(SubjectCriteriaEvaluationView.SubjectCode));
 | 
						|
 | 
						|
 | 
						|
            foreach (var item in pageList.CurrentPageData)
 | 
						|
            {
 | 
						|
                switch (curentCriterionType)
 | 
						|
                {
 | 
						|
 | 
						|
                    case CriterionType.RECIST1Pointt1_MB:
 | 
						|
 | 
						|
                        if (resultTrialReadingCriterion.ReadingType == ReadingMethod.Double)
 | 
						|
                        {
 | 
						|
                            if (item.ReadingEvaluationList.Count == 2)
 | 
						|
                            {
 | 
						|
                                if (item.ReadingEvaluationList.All(t => t.Answer == 1.ToString()))
 | 
						|
                                {
 | 
						|
                                    item.FinalEvaluationList.Add(new EvaluationInfo()
 | 
						|
                                    {
 | 
						|
                                        QuestionId = item.ReadingEvaluationList.First().QuestionId,
 | 
						|
                                        Answer = ((int)BrainMetastasisResult.Yes).ToString(),
 | 
						|
                                        FinalTranslateDictionaryCode = nameof(BrainMetastasisResult)
 | 
						|
                                    });
 | 
						|
                                }
 | 
						|
                                else if (item.ReadingEvaluationList.All(t => t.Answer == 0.ToString()))
 | 
						|
                                {
 | 
						|
                                    item.FinalEvaluationList.Add(new EvaluationInfo()
 | 
						|
                                    {
 | 
						|
                                        QuestionId = item.ReadingEvaluationList.First().QuestionId,
 | 
						|
                                        Answer = ((int)BrainMetastasisResult.No).ToString(),
 | 
						|
                                        FinalTranslateDictionaryCode = nameof(BrainMetastasisResult)
 | 
						|
                                    });
 | 
						|
                                }
 | 
						|
                                else if (item.ReadingEvaluationList.First().Answer != item.ReadingEvaluationList.Last().Answer && item.ReadingEvaluationList.Any(t => t.Answer == 1.ToString()))
 | 
						|
                                {
 | 
						|
                                    item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = item.ReadingEvaluationList.First().QuestionId, Answer = ((int)BrainMetastasisResult.Maybe).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
 | 
						|
                                }
 | 
						|
                                else
 | 
						|
                                {
 | 
						|
                                    item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = addtionalQustionInfoList.FirstOrDefault()?.QuestionId, Answer = ((int)BrainMetastasisResult.Unknown).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
 | 
						|
                                }
 | 
						|
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                            {
 | 
						|
                                item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = addtionalQustionInfoList.FirstOrDefault()?.QuestionId, Answer = ((int)BrainMetastasisResult.Unknown).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        else if (resultTrialReadingCriterion.ReadingType == ReadingMethod.Single)
 | 
						|
                        {
 | 
						|
 | 
						|
                            if (item.ReadingEvaluationList.Count == 1)
 | 
						|
                            {
 | 
						|
                                if (item.ReadingEvaluationList.All(t => t.Answer == 1.ToString()))
 | 
						|
                                {
 | 
						|
                                    item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = item.ReadingEvaluationList.First().QuestionId, Answer = ((int)BrainMetastasisResult.Yes).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
 | 
						|
                                }
 | 
						|
                                else if (item.ReadingEvaluationList.All(t => t.Answer == 0.ToString()))
 | 
						|
                                {
 | 
						|
                                    item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = item.ReadingEvaluationList.First().QuestionId, Answer = ((int)BrainMetastasisResult.No).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
 | 
						|
                                }
 | 
						|
                                else
 | 
						|
                                {
 | 
						|
                                    item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = addtionalQustionInfoList.FirstOrDefault()?.QuestionId, Answer = ((int)BrainMetastasisResult.Unknown).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                            {
 | 
						|
                                item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = addtionalQustionInfoList.FirstOrDefault()?.QuestionId, Answer = ((int)BrainMetastasisResult.Unknown).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
 | 
						|
                            }
 | 
						|
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                        {
 | 
						|
 | 
						|
                        }
 | 
						|
 | 
						|
                        break;
 | 
						|
                    default:
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            return ResponseOutput.Ok(pageList, addtionalQustionInfoList);
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        ///  添加 编辑 是否参与评估
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="addOrEditSubjectCriteriaEvaluationList"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [UnitOfWork]
 | 
						|
        public async Task<IResponseOutput> BatchAddOrUpdateSubjectCriteriaEvaluation(List<SubjectCriteriaEvaluationAddOrEdit> addOrEditSubjectCriteriaEvaluationList)
 | 
						|
        {
 | 
						|
            //  在此处拷贝automapper 映射
 | 
						|
 | 
						|
            foreach (var addOrEditSubjectCriteriaEvaluation in addOrEditSubjectCriteriaEvaluationList)
 | 
						|
            {
 | 
						|
 | 
						|
 | 
						|
                if (addOrEditSubjectCriteriaEvaluation.Id == null)
 | 
						|
                {
 | 
						|
                    var entity = await _subjectCriteriaEvaluationRepository.InsertFromDTOAsync(addOrEditSubjectCriteriaEvaluation);
 | 
						|
 | 
						|
                    if (addOrEditSubjectCriteriaEvaluation.IsJoinEvaluation)
 | 
						|
                    {
 | 
						|
 | 
						|
                        //找到一致性核查通过的访视  并且没有 自动影像筛选的数据
 | 
						|
                        var subjectVisitIdList = await _subjectVisitRepository.Where(t => t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId && t.CheckState == CheckStateEnum.CVPassed
 | 
						|
                        && !t.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId)).Select(t => t.Id)
 | 
						|
                        .ToListAsync();
 | 
						|
 | 
						|
 | 
						|
                        foreach (var subjectVisitId in subjectVisitIdList)
 | 
						|
                        {
 | 
						|
                            await AutoSubjectCriteriaEvaluationVisitFilter(addOrEditSubjectCriteriaEvaluation.SubjectId, subjectVisitId, addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId);
 | 
						|
                        }
 | 
						|
 | 
						|
                    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
                }
 | 
						|
                //编辑
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    //参与评估
 | 
						|
                    if (addOrEditSubjectCriteriaEvaluation.IsJoinEvaluation)
 | 
						|
                    {
 | 
						|
                        var dbBeforeEntity = await _subjectCriteriaEvaluationRepository.UpdateFromDTOAsync(addOrEditSubjectCriteriaEvaluation);
 | 
						|
 | 
						|
                        //从不评估 改为评估
 | 
						|
                        if (addOrEditSubjectCriteriaEvaluation.IsJoinEvaluation != dbBeforeEntity.IsJoinEvaluation)
 | 
						|
                        {
 | 
						|
                            //找到一致性核查通过的访视    并且没有 自动影像筛选的数据
 | 
						|
                            var subjectVisitIdList = await _subjectVisitRepository.Where(t => t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId && t.CheckState == CheckStateEnum.CVPassed &&
 | 
						|
                              !t.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId)).
 | 
						|
                                Select(t => t.Id).ToListAsync();
 | 
						|
 | 
						|
 | 
						|
                            foreach (var subjectVisitId in subjectVisitIdList)
 | 
						|
                            {
 | 
						|
                                await AutoSubjectCriteriaEvaluationVisitFilter(addOrEditSubjectCriteriaEvaluation.SubjectId, subjectVisitId, addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        //未修改  不做任何操作
 | 
						|
 | 
						|
 | 
						|
                    }
 | 
						|
                    //不参与评估
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        //删除该Subject  该标准访视的所有 访视筛选记录数据
 | 
						|
                        await _subjectCriteriaEvaluationVisitFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId);
 | 
						|
                        await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectVisit.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
            }
 | 
						|
 | 
						|
            await _subjectCriteriaEvaluationRepository.SaveChangesAsync();
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 自动访视筛选  (针对单一访视,重新筛选一遍,可能不存在该接口,仅仅留存)
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        [NonDynamicMethod]
 | 
						|
        public async Task AutoSubjectCriteriaEvaluationVisitFilter(Guid subjectId, Guid subjectVisitId, Guid trialReadingCriterionId)
 | 
						|
        {
 | 
						|
 | 
						|
            if ((await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId)).CriterionType == CriterionType.RECIST1Pointt1_MB)
 | 
						|
            {
 | 
						|
                //如果所有访视 的所有序列部位都是脑部  那么自动筛选通过,同时需要插入序列的筛选记录
 | 
						|
 | 
						|
 | 
						|
                //找到该方式的所有序列
 | 
						|
                var list = await _dicomSeriesRepository.Where(t => t.SubjectVisitId == subjectVisitId && t.SubjectId == subjectId).Select(t => new { SeriesId = t.Id, t.StudyId, t.BodyPartForEdit }).ToListAsync();
 | 
						|
 | 
						|
 | 
						|
                ////已经自动筛选过
 | 
						|
                //if (await _subjectCriteriaEvaluationVisitFilterRepository.AnyAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == subjectVisitId))
 | 
						|
                //{
 | 
						|
                //    await _subjectCriteriaEvaluationVisitFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == subjectVisitId);
 | 
						|
 | 
						|
                //    await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == subjectVisitId);
 | 
						|
                //}
 | 
						|
 | 
						|
                var existEntity = await _subjectCriteriaEvaluationVisitFilterRepository.FirstOrDefaultAsync(t => t.SubjectId == subjectId && t.SubjectVisitId == subjectVisitId && t.TrialReadingCriterionId == trialReadingCriterionId);
 | 
						|
 | 
						|
                //已经自动筛选过
 | 
						|
 | 
						|
                if (existEntity != null)
 | 
						|
                {
 | 
						|
                    await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == subjectVisitId);
 | 
						|
                }
 | 
						|
 | 
						|
                //有不是脑部的序列
 | 
						|
                if (list.Any(t => t.BodyPartForEdit != "脑部"))
 | 
						|
                {
 | 
						|
 | 
						|
 | 
						|
                    if (existEntity == null)
 | 
						|
                    {
 | 
						|
                        var addItem = new SubjectCriteriaEvaluationVisitFilter
 | 
						|
                        {
 | 
						|
                            SubjectVisitId = subjectVisitId,
 | 
						|
                            SubjectId = subjectId,
 | 
						|
                            ImageDeterminationResultState = ImageDeterminationResultState.None,
 | 
						|
                            ImageFilterState = ImageFilterState.None,
 | 
						|
                            TrialReadingCriterionId = trialReadingCriterionId
 | 
						|
                        };
 | 
						|
 | 
						|
 | 
						|
                        var subjectCriteriaEvaluationVisitFilter = await _subjectCriteriaEvaluationVisitFilterRepository.AddAsync(addItem);
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        existEntity.ImageDeterminationResultState = ImageDeterminationResultState.None;
 | 
						|
                        existEntity.ImageFilterState = ImageFilterState.None;
 | 
						|
                    }
 | 
						|
 | 
						|
                }
 | 
						|
                //都是脑部的序列
 | 
						|
                else
 | 
						|
                {
 | 
						|
 | 
						|
                    if (existEntity == null)
 | 
						|
                    {
 | 
						|
                        var addItem = new SubjectCriteriaEvaluationVisitFilter
 | 
						|
                        {
 | 
						|
                            SubjectVisitId = subjectVisitId,
 | 
						|
                            SubjectId = subjectId,
 | 
						|
                            ImageDeterminationResultState = ImageDeterminationResultState.Passed,
 | 
						|
                            ImageFilterState = ImageFilterState.Finished,
 | 
						|
                            TrialReadingCriterionId = trialReadingCriterionId,
 | 
						|
                            IsGeneratedTask = true
 | 
						|
                        };
 | 
						|
 | 
						|
                        var subjectCriteriaEvaluationVisitFilter = await _subjectCriteriaEvaluationVisitFilterRepository.AddAsync(addItem);
 | 
						|
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        existEntity.ImageDeterminationResultState = ImageDeterminationResultState.Passed;
 | 
						|
                        existEntity.ImageFilterState = ImageFilterState.Finished;
 | 
						|
                    }
 | 
						|
 | 
						|
                    foreach (var item in list)
 | 
						|
                    {
 | 
						|
                        await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitStudyFilter { SubjectVisitId = subjectVisitId, SeriesId = item.SeriesId, TrialReadingCriterionId = trialReadingCriterionId, StudyId = item.StudyId, IsConfirmed = true, IsReading = true });
 | 
						|
                    }
 | 
						|
 | 
						|
                    //自动生成任务
 | 
						|
 | 
						|
                    var trialId = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => t.TrialId).FirstOrDefault();
 | 
						|
 | 
						|
                    await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(trialId, trialReadingCriterionId, true, new List<Guid>() { subjectVisitId });
 | 
						|
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            await _subjectCriteriaEvaluationVisitFilterRepository.SaveChangesAsync();
 | 
						|
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 评估访视筛选列表(一致性核查通过的访视都会出现  根据条件筛选)
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inQuery"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<List<SubjectCriteriaEvaluationVisitFilterView>> GetSubjectCriteriaEvaluationVisitFilterList(SubjectCriteriaEvaluationVisitFilterQuery inQuery)
 | 
						|
        {
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            var subjectCriteriaEvaluationVisitFilterQueryable = from subjectVisit in _subjectVisitRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.CheckState == CheckStateEnum.CVPassed)
 | 
						|
 | 
						|
 | 
						|
                                                                join subjectCriteriaEvaluationVisitFilter in _subjectCriteriaEvaluationVisitFilterRepository
 | 
						|
                                                                .Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
 | 
						|
                                                                .WhereIf(inQuery.ImageDeterminationResultState != null, t => t.ImageDeterminationResultState == inQuery.ImageDeterminationResultState)
 | 
						|
                                                                .WhereIf(inQuery.ImageFilterState != null, t => t.ImageFilterState == inQuery.ImageFilterState)
 | 
						|
                                                                .WhereIf(inQuery.IsGeneratedTask != null, t => t.IsGeneratedTask == inQuery.IsGeneratedTask)
 | 
						|
                                                                on subjectVisit.Id equals subjectCriteriaEvaluationVisitFilter.SubjectVisitId
 | 
						|
 | 
						|
                                                                //into d from subjectCriteriaEvaluationVisitFilter in d.DefaultIfEmpty()
 | 
						|
 | 
						|
                                                                select new SubjectCriteriaEvaluationVisitFilterView()
 | 
						|
                                                                {
 | 
						|
                                                                    VisitName = subjectVisit.VisitName,
 | 
						|
                                                                    VisitNum = subjectVisit.VisitNum,
 | 
						|
                                                                    SubjectVisitId = subjectVisit.Id,
 | 
						|
                                                                    TrialId = subjectVisit.TrialId,
 | 
						|
                                                                    SubjectId = subjectVisit.SubjectId,
 | 
						|
                                                                    SubjectCode = subjectVisit.Subject.Code,
 | 
						|
                                                                    TrialSiteId = subjectVisit.TrialSiteId,
 | 
						|
                                                                    TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
 | 
						|
                                                                    LatestScanDate = subjectVisit.LatestScanDate,
 | 
						|
                                                                    EarliestScanDate = subjectVisit.LatestScanDate,
 | 
						|
                                                                    ImageDeterminationResultState = subjectCriteriaEvaluationVisitFilter.ImageDeterminationResultState,
 | 
						|
                                                                    ImageFilterState = subjectCriteriaEvaluationVisitFilter.ImageFilterState,
 | 
						|
                                                                    IsGeneratedTask = subjectCriteriaEvaluationVisitFilter.IsGeneratedTask,
 | 
						|
                                                                    Id = subjectCriteriaEvaluationVisitFilter.Id,
 | 
						|
 | 
						|
                                                                    CreateTime = subjectCriteriaEvaluationVisitFilter.CreateTime,
 | 
						|
                                                                    CreateUserId = subjectCriteriaEvaluationVisitFilter.CreateUserId,
 | 
						|
                                                                    UpdateTime = subjectCriteriaEvaluationVisitFilter.UpdateTime,
 | 
						|
                                                                    UpdateUserId = subjectCriteriaEvaluationVisitFilter.UpdateUserId,
 | 
						|
 | 
						|
                                                                };
 | 
						|
 | 
						|
 | 
						|
            return await subjectCriteriaEvaluationVisitFilterQueryable.OrderBy(t => t.VisitNum).ToListAsync();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 已生成任务列表
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inQuery"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<List<HaveGeneratedTaskDto>> GetHaveGeneratedTaskList(HaveGeneratedTaskQuery inQuery)
 | 
						|
        {
 | 
						|
            var list = await _visitTaskRepository.Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectId == inQuery.SubjectId && t.TaskState == TaskState.Effect).OrderBy(t => t.VisitTaskNum)
 | 
						|
                .ProjectTo<HaveGeneratedTaskDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
            return list;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 批量勾选 生成该标准的任务
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        [UnitOfWork]
 | 
						|
        public async Task<IResponseOutput> BatchGenerateTask(BatchGenerateTaskCommand batchGenerateTaskCommand)
 | 
						|
        {
 | 
						|
 | 
						|
            var trakingList = await _subjectCriteriaEvaluationVisitFilterRepository.Where(t => t.SubjectId == batchGenerateTaskCommand.SubjectId
 | 
						|
            && t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId
 | 
						|
            && batchGenerateTaskCommand.SubjectVisitIdList.Contains(t.SubjectVisitId), true).ToListAsync();
 | 
						|
 | 
						|
            foreach (var item in trakingList)
 | 
						|
            {
 | 
						|
                item.IsGeneratedTask = true;
 | 
						|
            }
 | 
						|
 | 
						|
            //await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == batchGenerateTaskCommand.SubjectId
 | 
						|
            //&& t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId
 | 
						|
            //&& batchGenerateTaskCommand.SubjectVisitIdList.Contains(t.SubjectVisitId), u => new SubjectCriteriaEvaluationVisitFilter { IsGeneratedTask = true });
 | 
						|
 | 
						|
            //自动生成任务
 | 
						|
 | 
						|
            var idList = batchGenerateTaskCommand.SubjectVisitIdList.Select(t => (Guid?)t).ToList();
 | 
						|
 | 
						|
            //存在任务的访视
 | 
						|
            var haveGenerateVisitIdList = await _visitTaskRepository.Where(t => idList.Contains(t.SourceSubjectVisitId) && t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId && t.TaskState == TaskState.Effect)
 | 
						|
                .Select(t => t.SourceSubjectVisitId).ToListAsync();
 | 
						|
 | 
						|
            var generateVisitIdList = idList.Except(haveGenerateVisitIdList);
 | 
						|
 | 
						|
            await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(batchGenerateTaskCommand.TrialId, batchGenerateTaskCommand.TrialReadingCriterionId, true, generateVisitIdList.Select(t => (Guid)t.Value).ToList());
 | 
						|
 | 
						|
            await _subjectCriteriaEvaluationVisitFilterRepository.SaveChangesAsync();
 | 
						|
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取dicom     访视检查列表  (序列的 Id  CreateTime    是否为空 代表了记录是否创建、IsConfirmed 代表 保存  确认)
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<SelctStudySeriesView> GetVisitStudyAndSeriesList(VisitStudyAndSeriesQuery inQuery)
 | 
						|
        {
 | 
						|
            var studyList = await _dicomStudyRepository.Where(s => s.SubjectVisitId == inQuery.SubjectVisitId).ProjectTo<SelectStudyView>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
            var studyIds = studyList.Select(t => t.StudyId).ToList();
 | 
						|
 | 
						|
 | 
						|
            var query = from series in _dicomSeriesRepository.Where(t => studyIds.Contains(t.StudyId))
 | 
						|
                        join visitStudyFilter in _subjectCriteriaEvaluationVisitStudyFilterRepository.Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectVisitId == inQuery.SubjectVisitId) on series.Id equals visitStudyFilter.SeriesId into d
 | 
						|
                        from visitStudyFilter in d.DefaultIfEmpty()
 | 
						|
 | 
						|
                        select new SelectSeriesView()
 | 
						|
                        {
 | 
						|
                            Description = series.Description,
 | 
						|
                            BodyPartExamined = series.BodyPartExamined,
 | 
						|
                            BodyPartForEdit = series.BodyPartForEdit,
 | 
						|
                            Modality = series.Modality,
 | 
						|
                            SeriesInstanceUid = series.SeriesInstanceUid,
 | 
						|
                            StudyCode = series.DicomStudy.StudyCode,
 | 
						|
                            SeriesNumber = series.SeriesNumber,
 | 
						|
                            SeriesTime = series.SeriesTime,
 | 
						|
 | 
						|
                            InstanceCount = series.InstanceCount,
 | 
						|
                            StudyTime = series.DicomStudy.StudyTime,
 | 
						|
                            StudyId = series.StudyId,
 | 
						|
                            SeriesId = series.Id,
 | 
						|
                            SubjectVisitId = series.SubjectVisitId,
 | 
						|
                            TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
 | 
						|
 | 
						|
 | 
						|
                            IsReading = visitStudyFilter.IsReading,
 | 
						|
                            Id = visitStudyFilter.Id,
 | 
						|
                            CreateTime = visitStudyFilter.CreateTime,
 | 
						|
                            IsConfirmed = visitStudyFilter.IsConfirmed,
 | 
						|
                        };
 | 
						|
 | 
						|
 | 
						|
            var seriesList = query.ToList();
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            return new SelctStudySeriesView { StudyList = studyList, SeriesList = seriesList };
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 批量保存或者确认  选择的序列
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        public async Task<IResponseOutput> BatchAddSubjectCriteriaEvaluationVisitStudyFilter(List<SubjectCriteriaEvaluationVisitStudyFilterAddOrEdit> batchList)
 | 
						|
        {
 | 
						|
 | 
						|
            var ids = batchList.Where(t => t.Id != null).Select(t => t.Id).ToList();
 | 
						|
            #region 稽查修改前
 | 
						|
 | 
						|
            //await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => ids.Contains(t.Id));
 | 
						|
 | 
						|
            //await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map<List<SubjectCriteriaEvaluationVisitStudyFilter>>(batchList));
 | 
						|
 | 
						|
            #endregion
 | 
						|
 | 
						|
 | 
						|
            #region 查询再更新
 | 
						|
            if (ids.Count > 0)
 | 
						|
            {
 | 
						|
                var list = await _subjectCriteriaEvaluationVisitStudyFilterRepository.Where(t => ids.Contains(t.Id), true).ToListAsync();
 | 
						|
 | 
						|
                foreach (var item in list)
 | 
						|
                {
 | 
						|
                    item.IsReading = batchList.FirstOrDefault(t => t.Id == item.Id)?.IsReading ?? item.IsReading;
 | 
						|
                    item.IsConfirmed = batchList.FirstOrDefault(t => t.Id == item.Id)?.IsConfirmed ?? item.IsConfirmed;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map<List<SubjectCriteriaEvaluationVisitStudyFilter>>(batchList));
 | 
						|
            }
 | 
						|
            #endregion
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            var first = batchList.First();
 | 
						|
 | 
						|
            if (batchList.Count(t => t.IsReading == true) >= 0 && batchList.All(t => t.IsConfirmed == false))
 | 
						|
            {
 | 
						|
                await _subjectCriteriaEvaluationVisitFilterRepository.UpdatePartialFromQueryAsync(t => t.SubjectVisitId == first.SubjectVisitId && t.TrialReadingCriterionId == first.TrialReadingCriterionId,
 | 
						|
                u => new SubjectCriteriaEvaluationVisitFilter() { ImageFilterState = ImageFilterState.Filtering });
 | 
						|
            }
 | 
						|
 | 
						|
            if (batchList.All(t => t.IsConfirmed == true))
 | 
						|
            {
 | 
						|
 | 
						|
                await _subjectCriteriaEvaluationVisitFilterRepository.UpdatePartialFromQueryAsync(t => t.SubjectVisitId == first.SubjectVisitId && t.TrialReadingCriterionId == first.TrialReadingCriterionId,
 | 
						|
                    u => new SubjectCriteriaEvaluationVisitFilter() { ImageFilterState = ImageFilterState.Finished });
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            await _subjectCriteriaEvaluationVisitStudyFilterRepository.SaveChangesAsync();
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 附加评估标准 PM 退回某一访视 影响任务列表
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="command"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
 | 
						|
        public async Task<(List<InfluenceTaskInfo>, object)> GetCriteriaVisitBackInfluenceTaskList(CriteriaVisitBackCommand command)
 | 
						|
        {
 | 
						|
 | 
						|
            var isIRAppyTaskInfluenced = false;
 | 
						|
 | 
						|
            var filterExpression = await GetTaskExpressionAsync(command);
 | 
						|
 | 
						|
            var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == command.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException();
 | 
						|
 | 
						|
            var subjectVisit = await _subjectVisitRepository.FindAsync(command.SubjectVisitId);
 | 
						|
 | 
						|
            if (await _visitTaskReReadingRepository.AnyAsync(t => t.RequestReReadingType == RequestReReadingType.DocotorApply && t.RequestReReadingResultEnum == RequestReReadingResult.Default &&
 | 
						|
  t.OriginalReReadingTask.VisitTaskNum >= subjectVisit.VisitNum && t.OriginalReReadingTask.SubjectId == subjectVisit.SubjectId && t.OriginalReReadingTask.TrialReadingCriterionId == command.TrialReadingCriterionId))
 | 
						|
            {
 | 
						|
                isIRAppyTaskInfluenced = true;
 | 
						|
            }
 | 
						|
 | 
						|
            var list = await _visitTaskRepository.Where(filterExpression)
 | 
						|
 | 
						|
               .OrderBy(t => t.VisitTaskNum).ProjectTo<InfluenceTaskInfo>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
            foreach (var influenceTask in list)
 | 
						|
            {
 | 
						|
 | 
						|
                //重阅重置或者失效
 | 
						|
                influenceTask.OptType = influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned ? ReReadingOrBackOptType.Return : ReReadingOrBackOptType.Abandon;
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            return (list, new { IsIRAppyTaskInfluenced = isIRAppyTaskInfluenced });
 | 
						|
        }
 | 
						|
 | 
						|
        private async Task<Expression<Func<VisitTask, bool>>> GetTaskExpressionAsync(CriteriaVisitBackCommand command)
 | 
						|
        {
 | 
						|
            var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == command.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException();
 | 
						|
 | 
						|
            var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == command.SubjectVisitId);
 | 
						|
 | 
						|
            //仅仅影响该标准自己的任务
 | 
						|
            Expression<Func<VisitTask, bool>> filterExpression = t => t.TrialId == command.TrialId && t.SubjectId == command.SubjectId && t.TaskState == TaskState.Effect /*&& t.TaskAllocationState == TaskAllocationState.Allocated*/
 | 
						|
            && t.TrialReadingCriterionId == command.TrialReadingCriterionId;
 | 
						|
 | 
						|
            //有序
 | 
						|
            if (criterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
 | 
						|
            {
 | 
						|
                filterExpression = filterExpression.And(t => t.VisitTaskNum >= subjectVisit.VisitNum);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                filterExpression = filterExpression.And(t => t.VisitTaskNum == subjectVisit.VisitNum);
 | 
						|
            }
 | 
						|
 | 
						|
            return filterExpression;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        ///  退回任务
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="command"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public async Task ConfirmBackCriteriaVisitTask(CriteriaVisitBackCommand command)
 | 
						|
        {
 | 
						|
 | 
						|
            var filterExpression = await GetTaskExpressionAsync(command);
 | 
						|
 | 
						|
            var influenceTaskList = await _visitTaskRepository.Where(filterExpression, true).ToListAsync();
 | 
						|
 | 
						|
            var subjectVisit = await _subjectVisitRepository.FindAsync(command.SubjectVisitId);
 | 
						|
 | 
						|
            foreach (var influenceTask in influenceTaskList)
 | 
						|
            {
 | 
						|
 | 
						|
                if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned)
 | 
						|
                {
 | 
						|
                    influenceTask.TaskState = TaskState.HaveReturned;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    influenceTask.TaskState = TaskState.Adbandon;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            var taskIdList = influenceTaskList.Select(t => t.Id).ToList();
 | 
						|
            var subjectVisitIdLsit = influenceTaskList.Where(t => t.SourceSubjectVisitId != null).Select(t => t.SourceSubjectVisitId).ToList();
 | 
						|
 | 
						|
            if (subjectVisitIdLsit.Count == 0)
 | 
						|
            {
 | 
						|
                subjectVisitIdLsit.Add(command.SubjectVisitId);
 | 
						|
            }
 | 
						|
 | 
						|
            //医学审核任务失效
 | 
						|
            await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(t => taskIdList.Contains(t.VisitTaskId) && t.AuditState != MedicalReviewAuditState.HaveSigned, u => new TaskMedicalReview() { IsInvalid = true });
 | 
						|
 | 
						|
            //将筛选的访视 序列状态重置
 | 
						|
 | 
						|
 | 
						|
            //当前申请影像回退的访视  筛选状态重置,任务生成状态重置
 | 
						|
 | 
						|
 | 
						|
            var otherVisitIdList = subjectVisitIdLsit.Where(t => t != command.SubjectVisitId).ToList();
 | 
						|
 | 
						|
            await _subjectCriteriaEvaluationVisitFilterRepository.UpdatePartialFromQueryAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.SubjectId == command.SubjectId && t.SubjectVisitId == command.SubjectVisitId,
 | 
						|
                t => new SubjectCriteriaEvaluationVisitFilter()
 | 
						|
                {
 | 
						|
                    ImageFilterState = ImageFilterState.None,
 | 
						|
                    ImageDeterminationResultState = ImageDeterminationResultState.None,
 | 
						|
                    IsGeneratedTask = false
 | 
						|
                });
 | 
						|
 | 
						|
            //删除序列数据
 | 
						|
            await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.SubjectVisitId == command.SubjectVisitId);
 | 
						|
 | 
						|
            //BM后续访视 ,筛选状态不变,任务生成状态重置(实际该访视任务状态 可能是重阅重置了或者失效了,需要后续生成,或者取消分配了,需要后续重新分配)
 | 
						|
            await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.SubjectId == command.SubjectId && otherVisitIdList.Contains(t.SubjectVisitId),
 | 
						|
                t => new SubjectCriteriaEvaluationVisitFilter()
 | 
						|
                {
 | 
						|
                    IsGeneratedTask = false
 | 
						|
                });
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            await _visitTaskRepository.SaveChangesAsync();
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |