using AutoMapper;
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Share;

using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Service.Inspection.Interface;
using IRaCIS.Core.Application.Service.Inspection.DTO;
using Newtonsoft.Json;

namespace IRaCIS.Application.Services
{
    //[Intercept(typeof(QANoticeAOP))]
    public class StudyService : IStudyService
    {
        private readonly IRepository<DicomStudy> _studyRepository;

        private readonly IRepository<SubjectVisit> _subjectVisitRepository;
        private readonly IRepository<DicomInstance> _dicomInstanceRepository;
        private readonly IRepository<DicomSeries> _dicomSeriesRepository;
        private readonly IInspectionService _inspectionService;
        private readonly IUserInfo _userInfo;

        private readonly IMapper _mapper;


        private static string _fileStorePath = string.Empty;

        private readonly IRepository<StudyMonitor> _dicomStudyMonitorRepository;
       




        public StudyService(IRepository<DicomStudy> studyRepository,
            IRepository<SubjectVisit> subjectVisitRepository,
            IRepository<DicomInstance> dicomInstanceRepository,
            IRepository<DicomSeries> dicomSeriesRepository,
            IInspectionService inspectionService,
            IUserInfo userInfo,

             IRepository<StudyMonitor> dicomStudyMonitorRepository,

            IMapper mapper)
        {
            _dicomStudyMonitorRepository = dicomStudyMonitorRepository;

         
            _userInfo = userInfo;
            _studyRepository = studyRepository;

            _subjectVisitRepository = subjectVisitRepository;
            _dicomInstanceRepository = dicomInstanceRepository;
            _dicomSeriesRepository = dicomSeriesRepository;
            this._inspectionService = inspectionService;
            _mapper = mapper;
        }





        /// <summary>
        /// 获取保存到Dicom文件中的信息
        /// </summary>
        /// <param name="subjectVisitId"></param>
        /// <returns></returns>
        public DicomTrialSiteSubjectInfo GetSaveToDicomInfo(Guid subjectVisitId)
        {
            //6表连接 subject trial trialSite sponsor subjectVisit   site 
            var info = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).ProjectTo<DicomTrialSiteSubjectInfo>(_mapper.ConfigurationProvider).FirstOrDefault().IfNullThrowException();

            return info;
        }

        public void GetHasUploadSeriesAndInstance(Guid studyId, ref List<string> seriesInstanceUidList, ref List<string> sopInstanceUidList)
        {
            seriesInstanceUidList = _dicomSeriesRepository.Where(t => t.StudyId == studyId).Select(t => t.SeriesInstanceUid).ToList();

            sopInstanceUidList = _dicomInstanceRepository.Where(t => t.StudyId == studyId).Select(t => t.SopInstanceUid).ToList();
        }

        public  void UploadOrReUploadNeedTodo(ArchiveStudyCommand archiveStudyCommand, List<Guid> archiveStudyIds, ref DicomArchiveResult result,StudyMonitor monitor)
        {


            var archivedStudyId = archiveStudyIds[0];

            result.ArchivedDicomStudies = _studyRepository.Where(t => t.SubjectVisitId == archiveStudyCommand.SubjectVisitId)
                .ProjectTo<DicomStudyBasicDTO>(_mapper.ConfigurationProvider).ToList();

            #region 更新受试者访视信息 及访视状态为待提交  最早最晚拍片时间   访视已执行

            var subjectVisit = _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == archiveStudyCommand.SubjectVisitId).Result;

            //正常情况下  上传或者重传(待提交之前 要改为待提交 ) QA后上传 不能改为待提交
            if (subjectVisit.SubmitState == SubmitStateEnum.None)
            {
                subjectVisit.SubmitState = SubmitStateEnum.ToSubmit;
            }

            subjectVisit.VisitExecuted = VisitExecutedEnum.Executed;







            ////处理拍片日期
            //var svTime = _subjectVisitRepository.Where(t => t.Id == archiveStudyCommand.SubjectVisitId).Select(t => new
            //{
            //    DicomStudyMinStudyTime = t.StudyList.Min(t => (DateTime?)t.StudyTime),
            //    DicomStudyMaxStudyTime = t.StudyList.Max(t => (DateTime?)t.StudyTime),
            //    NoneDicomStudyMinStudyTime = t.NoneDicomStudyList.Min(t => (DateTime?)t.ImageDate),
            //    NoneDicomStudyMaxStudyTime = t.NoneDicomStudyList.Max(t => (DateTime?)t.ImageDate)
            //}).FirstOrDefault();

            //var minArray = new DateTime?[] { svTime.DicomStudyMinStudyTime, svTime.NoneDicomStudyMinStudyTime };
            //var maxArray = new DateTime?[] { svTime.DicomStudyMaxStudyTime, svTime.NoneDicomStudyMaxStudyTime };

            //subjectVisit.EarliestScanDate = minArray.Min();
            //subjectVisit.LatestScanDate = maxArray.Max();

            #endregion


            //按照访视维度,上传只存在重传同一份,和上传新的(不存在之前检查维度 重传同一份 和重传不同的)

            if (archiveStudyCommand.AbandonStudyId != null && archiveStudyCommand.AbandonStudyId == archivedStudyId)
            {
                result.ReuploadNewStudyId = archivedStudyId;


                // 1、普通上传后重传
                // 2、QC后重传                             
                //_studyService.ReUploadSameStudy(archiveStudyCommand.SubjectVisitId, archivedDicomStudy.Id);

            }//上传
            else
            {
                //汇总  Series的Modality 更新到检查里面 检查状态  上传人
                var seriesModalityList = _dicomSeriesRepository.Where(t => t.StudyId == archivedStudyId).Select(u => u.Modality).Distinct();
                string ModaliyStr = string.Join('、', seriesModalityList.ToList());

                var study = _studyRepository.FirstOrDefaultAsync(t => t.Id == archivedStudyId).Result.IfNullThrowException();
                study.Status = (int)StudyStatus.Uploaded;
                study.Modalities = ModaliyStr;

            }
            _ = _dicomStudyMonitorRepository.AddAsync(monitor).Result;
            _ = _studyRepository.SaveChangesAsync().Result;

       



        }





        //public virtual IResponseOutput ForwardStudy(Guid studyId)
        //{

        //    var study = _studyRepository.FirstOrDefault(u => u.Id == studyId);



        //    //数据库状态,其他人已经操作过了,此时提醒
        //    if (study.Status != (int)StudyStatus.Anonymized)
        //    {
        //        ResponseOutput.NotOk($"当前界面Study:{study.StudyCode} 状态被其他人已变更,不允许该操作,请刷新界面");
        //    }

        //    _studyRepository.Update(t => t.Id == studyId, u => new DicomStudy()
        //    {
        //        Status = (int)StudyStatus.Forwarding
        //    });

        //    var subject = _subjectRepository.FirstOrDefault(u => u.Id == study.SubjectId);
        //    var trial = _trialRepository.FirstOrDefault(u => u.Id == study.TrialId);
        //    var subjectVisit = _subjectVisitRepository.FirstOrDefault(u => u.Id == study.SubjectVisitId);
        //    var targetPath = Path.Combine("/IMPORT-IMAGES",
        //        trial.TrialCode + "_" + subject.Code + "_" + subjectVisit.VisitName + "_" + study.StudyCode);
        //    var path = Path.Combine(_fileStorePath, study.CreateTime.Year.ToString(), study.TrialId.ToString(),
        //        study.SiteId.ToString(), study.SubjectId.ToString(), study.SubjectVisitId.ToString(), study.Id.ToString(), "Data");
        //    try
        //    {
        //        // 主机及端口信息后面可以改到 配置文件
        //        SessionOptions sessionOptions = new SessionOptions
        //        {
        //            Protocol = Protocol.Sftp,
        //            PortNumber = 8022,
        //            HostName = "CS-690-sftp.mint-imaging.com",
        //            UserName = "zdong",
        //            Password = "Everest@2021",
        //            //GiveUpSecurityAndAcceptAnySshHostKey = true,
        //            SshHostKeyFingerprint = @"ecdsa-sha2-nistp384 384 59gkjJ5lMwv3jsB8Wz2B35tBAIor5pSd8PcJYtoamPo="
        //        };
        //        using (Session session = new Session())
        //        {
        //            session.Open(sessionOptions);
        //            if (!session.FileExists(targetPath))
        //            {
        //                session.CreateDirectory(targetPath);
        //            }

        //            var files = (new DirectoryInfo(path)).GetFiles();
        //            foreach (var file in files)
        //            {
        //                if (file.Name.Contains("Anonymize") && file.Extension.Contains("dcm"))
        //                {
        //                    string remoteFilePath =
        //                        RemotePath.TranslateLocalPathToRemote(file.FullName, path, targetPath);
        //                    var result = session.PutFiles(file.FullName, remoteFilePath, false);
        //                    if (!result.IsSuccess)
        //                    {
        //                        return ResponseOutput.NotOk("Forward Failed");
        //                    }
        //                }
        //            }

        //            //_studyStatusDetailRepository.Add(new StudyStatusDetail
        //            //{
        //            //    Status = (int)StudyStatus.Forwarded,
        //            //    StudyId = studyId,
        //            //    Note = string.Empty,
        //            //    OptUserName = _userInfo.RealName,
        //            //    OptTime = DateTime.Now
        //            //});

        //            study.Status = (int)StudyStatus.Forwarded;
        //            _studyRepository.Update(study);

        //            //_workloadTPRepository.Add(new WorkloadTP
        //            //{
        //            //    SiteId = study.SiteId,
        //            //    StudyId = study.Id,
        //            //    SubjectId = study.SubjectId,
        //            //    SubjectVisitId = study.SubjectVisitId,
        //            //    Status = 0,
        //            //    ReviewerId = Guid.Empty,
        //            //    TrialId = study.TrialId,
        //            //    UpdateTime = DateTime.Now,
        //            //    TimepointCode = study.StudyCode + "_T01"
        //            //});
        //            //if (study.IsDoubleReview) //双重阅片,则再添加一条,编号变为T02
        //            //{
        //            //    _workloadTPRepository.Add(new WorkloadTP
        //            //    {
        //            //        SiteId = study.SiteId,
        //            //        StudyId = study.Id,
        //            //        SubjectId = study.SubjectId,
        //            //        SubjectVisitId = study.SubjectVisitId,
        //            //        Status = 0,
        //            //        ReviewerId = Guid.Empty,
        //            //        TrialId = study.TrialId,
        //            //        UpdateTime = DateTime.Now,
        //            //        TimepointCode = study.StudyCode + "_T02"
        //            //    });
        //            //}


        //            return ResponseOutput.Result(_studyRepository.SaveChanges());
        //        }
        //    }
        //    catch (Exception e)
        //    {
        //        _studyRepository.Update(t => t.Id == studyId, u => new DicomStudy()
        //        {
        //            Status = (int)StudyStatus.ForwardFailed
        //        });
        //        return ResponseOutput.NotOk("Forward Failed " + e.Message);
        //    }
        //}








        #region 暂存 读片

        //public IEnumerable<DicomSeriesDTO> GetSeriesList(Guid studyId)
        //{
        //    return _dicomSeriesRepository.Where(s => s.StudyId == studyId).OrderBy(s => s.SeriesNumber).
        //        ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
        //        .ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider);
        //}


        //public IEnumerable<ImageLabelDTO> GetImageLabel(string tpCode)
        //{
        //    return _imageLabelRepository.Where(s => s.TpCode == tpCode)
        //    .ProjectTo<ImageLabelDTO>(_mapper.ConfigurationProvider);
        //}

        //public bool SaveImageLabelList(ImageLabelCommand imageLabelCommand)
        //{
        //    var success = _imageLabelRepository.Delete(u => u.TpCode == imageLabelCommand.TpCode);
        //    _keyInstanceRepository.Delete(u => u.TpCode == imageLabelCommand.TpCode);
        //    if (imageLabelCommand.ImageLabelList.Count == 0)
        //    {
        //        return true;
        //    }
        //    else
        //    {

        //        foreach (var label in imageLabelCommand.ImageLabelList)
        //        {
        //            _imageLabelRepository.Add(new ImageLabel
        //            {
        //                TpCode = imageLabelCommand.TpCode,
        //                StudyId = label.StudyId,
        //                SeriesId = label.SeriesId,
        //                InstanceId = label.InstanceId,
        //                LabelValue = label.LabelValue
        //            });
        //            _keyInstanceRepository.Add(new KeyInstance
        //            {
        //                TpCode = imageLabelCommand.TpCode,
        //                SeriesId = label.SeriesId,
        //                InstanceId = label.InstanceId,
        //            });
        //        }
        //        success = _imageLabelRepository.SaveChanges();
        //        return success;
        //    }
        //}


        #endregion




        #region 废弃
        //public DicomStudyDTO GetStudyItem(Guid studyId)
        //{
        //    return _mapper.Map<DicomStudyDTO>(_studyRepository.FirstOrDefault(s => s.Id == studyId));
        //}
        //public virtual async Task<IResponseOutput> DicomAnonymize(Guid studyId, string optUserName)
        //{
        //    var study = _studyRepository.FirstOrDefault(t => t.Id == studyId);

        //    //数据库状态,其他人已经操作过了,此时提醒
        //    if (study.Status != (int)StudyStatus.QAFinish)
        //    {
        //        ResponseOutput.NotOk($"当前界面Study:{study.StudyCode} 状态被其他人已变更,不允许该操作,请刷新界面");
        //    }

        //    var subject = _subjectRepository.Select(t => new { Id = t.Id, Code = t.Code }).FirstOrDefault(u => u.Id == study.SubjectId).IfNullThrowException();
        //    var trial = _trialRepository.Select(t => new { Id = t.Id, Code = t.TrialCode }).FirstOrDefault(u => u.Id == study.TrialId).IfNullThrowException();

        //    study.Status = (int)StudyStatus.Anonymizing;


        //    // 查询受试者 信息
        //    //string subjectCde = string.Empty;
        //    //string subjectSex = string.Empty;

        //    //读取Dicom 文件,匿名化

        //    //按照配置文件 匿名化
        //    var dicomSeries = _dicomSeriesRepository.Where(s => s.StudyId == studyId).ToList();
        //    foreach (var seriesItem in dicomSeries)
        //    {
        //        var dicomInstances = _dicomInstanceRepository.Where(s => s.SeriesId == seriesItem.Id).ToList();

        //        foreach (var instanceItem in dicomInstances)
        //        {
        //            _dicomInstanceRepository.Attach(instanceItem);

        //            try
        //            {
        //                string filePath = _dicomFileStoreHelper.CreateInstanceFilePath(study, seriesItem.Id, instanceItem.Id);
        //                DicomFile dicomFile = await DicomFile.OpenAsync(filePath, Encoding.Default);

        //                #region 废弃

        //                //if (SystemConfig.AddClinicalInfo) //是否需要写入临床信息
        //                //{
        //                //    dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, subjectCde + " " + subjectSex);//SubjectId
        //                //}
        //                //DicomDataset dataset = dicomFile.Dataset;

        //                #endregion

        //                foreach (var anonymizeItem in AppSettings.AnonymizeTagList)
        //                {
        //                    if (anonymizeItem.Enable)
        //                    {
        //                        ushort group = Convert.ToUInt16(anonymizeItem.Group, 16);
        //                        ushort element = Convert.ToUInt16(anonymizeItem.Element, 16);
        //                        dicomFile.Dataset.AddOrUpdate(new DicomTag(group, element), anonymizeItem.ReplaceValue);
        //                    }
        //                }

        //                dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, trial.Code + "_" + subject.Code);

        //                //_dicomFileStoreHelper.CreateInstanceFilePath(study, seriesItem.Id, instanceItem.Id);

        //                string path = Path.Combine(_fileStorePath, study.CreateTime.Year.ToString(),
        //                    study.TrialId.ToString(),
        //                    study.SiteId.ToString(), study.SubjectId.ToString(), study.SubjectVisitId.ToString(), study.Id.ToString(), "Data");

        //                //await dicomFile.SaveAsync(Path.Combine(path, instanceItem.Id.ToString() + ".dcm"));
        //                await dicomFile.SaveAsync(
        //                    Path.Combine(path, instanceItem.Id.ToString() + ".Anonymize" + ".dcm"));

        //                instanceItem.Anonymize = true;

        //                //_dicomInstanceRepository.Update(instanceItem);
        //            }
        //            catch (Exception ex)
        //            {

        //                study.Status = (int)StudyStatus.AnonymizeFailed;

        //                _dicomInstanceRepository.SaveChanges();

        //                //这个地方返回没用  
        //                return ResponseOutput.NotOk(ex.Message);
        //            }
        //        }

        //    }

        //    study.Status = (int)StudyStatus.Anonymized;

        //    var success = _dicomInstanceRepository.SaveChanges();

        //    return ResponseOutput.Result(success);
        //}
        //public string GetStudyPreview(Guid studyId)
        //{
        //    DicomInstance dicomInstance = _dicomInstanceRepository.FirstOrDefault(s => s.StudyId == studyId);
        //    if (dicomInstance != null)
        //    {
        //        DicomStudy dicomStudy = _studyRepository.FirstOrDefault(s => s.Id == dicomInstance.StudyId);
        //        if (dicomStudy != null)
        //        {
        //            return _dicomFileStoreHelper.GetInstanceFilePath(dicomStudy, dicomInstance.SeriesId, dicomInstance.Id.ToString());
        //        }
        //    }
        //    return string.Empty;
        //}

        //public IEnumerable<RelationStudyDTO> GetAllRelationStudyList(Guid subjectVisitId)
        //{
        //    #region 废弃
        //    //var studylist = _studyRepository.Where(u => u.SubjectVisitId == subjectVisitId && u.IsDeleted == false).Select(t => new { StudyId = t.Id, t.SubjectId, t.TrialId }).ToList();
        //    //var subjectId = studylist.FirstOrDefault().SubjectId;
        //    //var trialId = studylist.FirstOrDefault().TrialId;
        //    //var studyIds = studylist.Select(t => t.StudyId).ToList();


        //    //var query = from studyItem in _studyRepository.Where(u => u.SubjectId == subjectId
        //    //                                                                   && u.TrialId == trialId && u.IsDeleted == false &&
        //    //                                                                   !studyIds.Contains(u.Id)
        //    //                                                                    /* && u.Status != (int)StudyStatus.Abandon*/)
        //    //            join visitItem in _subjectVisitRepository.AsQueryable()
        //    //                on studyItem.SubjectVisitId equals visitItem.Id
        //    //            select new RelationStudyDTO
        //    //            {
        //    //                StudyId = studyItem.Id,
        //    //                StudyCode = studyItem.StudyCode,
        //    //                VisitName = visitItem.VisitName,
        //    //                Modalities = studyItem.Modalities,
        //    //                Description = studyItem.Description,
        //    //                SeriesCount = studyItem.SeriesCount
        //    //            };
        //    #endregion

        //    var studyInfo = _studyRepository.Where(u => u.SubjectVisitId == subjectVisitId).Select(t => new { t.SubjectId, t.TrialId }).FirstOrDefault().IfNullThrowException();

        //    var query = _studyRepository.Where(t => t.SubjectVisitId != subjectVisitId && t.TrialId == studyInfo.TrialId && t.SubjectId == studyInfo.SubjectId)
        //        .ProjectTo<RelationStudyDTO>(_mapper.ConfigurationProvider).ToList();

        //    return query.OrderBy(u => u.VisitName).ThenBy(s => s.StudyCode).ToList();
        //}


        ///// <summary>
        ///// 检查列表
        ///// </summary>
        ///// <param name="queryDto"></param>
        ///// <returns></returns>
        //public PageOutput<StudyDTO> GetStudyList(StudyQueryDTO queryDto)
        //{
        //    var query = _studyRepository.Where(x => x.TrialId == queryDto.TrialId)
        //          .WhereIf(queryDto.SubjectId != null, t => t.SubjectId == queryDto.SubjectId)
        //          .WhereIf(queryDto.SubjectVisitId != null, t => t.SubjectId == queryDto.SubjectVisitId)
        //          .WhereIf(!string.IsNullOrEmpty(queryDto.VisitPlanInfo), queryDto.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(queryDto.VisitPlanInfo))
        //          .WhereIf(queryDto.StudyTimeBegin != null, t => t.StudyTime >= queryDto.StudyTimeBegin)
        //          .WhereIf(queryDto.StudyTimeEnd != null, t => t.StudyTime <= queryDto.StudyTimeEnd)
        //          .WhereIf(queryDto.UpdateTimeBegin != null, t => t.StudyTime >= queryDto.UpdateTimeBegin)
        //          .WhereIf(queryDto.UpdateTimeEnd != null, t => t.StudyTime <= queryDto.UpdateTimeEnd)
        //          .WhereIf(queryDto.SiteId != null, t => t.SiteId == queryDto.SiteId)
        //          .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))
        //          .WhereIf(!string.IsNullOrWhiteSpace(queryDto.SubjectInfo), t => t.Subject.Code.Contains(queryDto.SubjectInfo))
        //          .ProjectTo<StudyDTO>(_mapper.ConfigurationProvider);


        //    var list = query.ToPagedList(queryDto.PageIndex, queryDto.PageSize, queryDto.SortField == string.Empty ? "StudyCode" : queryDto.SortField, queryDto.Asc);


        //    foreach (var item in list.CurrentPageData)
        //    {
        //        if (item.PatientBirthDate.Length == 8)
        //        {
        //            item.PatientBirthDate =
        //                $"{item.PatientBirthDate[0]}{item.PatientBirthDate[1]}{item.PatientBirthDate[2]}{item.PatientBirthDate[3]}-{item.PatientBirthDate[4]}{item.PatientBirthDate[5]}-{item.PatientBirthDate[6]}{item.PatientBirthDate[7]}";
        //        }
        //    }

        //    return list;
        //}



        //public IResponseOutput DeleteStudy(Guid id)
        //{
        //    var needDelete = _studyRepository.FirstOrDefault(t => t.Id == id);

        //    if (needDelete == null)
        //    {
        //        return ResponseOutput.DBNotExistIfNUll(needDelete);
        //    }
        //    else //移除内存中缓存的StudyCode  这样刚上传的,删除 再上传还是用同样的Code
        //    {

        //        if (_provider.Get<string>($"{needDelete.TrialId }_{ StaticData.StudyMaxCode}").Value == needDelete.StudyCode)
        //        {
        //            _provider.Remove($"{needDelete.TrialId }_{ StaticData.StudyMaxCode}");
        //        }
        //    }



        //    //if (study.Status != (int)StudyStatus.Uploaded)
        //    //{
        //    //    return ResponseOutput.NotOk("This study has been quality controlled and couldn't be deleted ");
        //    //}

        //    #region 废弃的直接删除了  这里不用处理了

        //    ////处理废弃的Study  如果有的话  
        //    //var oldStudy = _studyRepository.FirstOrDefault(t => t.StudyCode == study.StudyCode && t.Id != id);
        //    //if (oldStudy != null)
        //    //{
        //    //    _studyRepository.Delete(t => t.Id == oldStudy.Id);
        //    //    _dicomInstanceRepository.Delete(t => t.StudyId == oldStudy.Id);
        //    //    _dicomSeriesRepository.Delete(t => t.StudyId == oldStudy.Id);
        //    //}
        //    //处理废弃的Study
        //    //var success5 = _studyRepository.Delete(t => t.StudyCode == study.StudyCode);
        //    #endregion


        //    //清除现有Study记录
        //    var success1 = _studyRepository.Delete(t => t.Id == id);
        //    var succeess2 = _dicomInstanceRepository.Delete(t => t.StudyId == id);
        //    var success3 = _dicomSeriesRepository.Delete(t => t.StudyId == id);


        //    //一个访视下面有多个检查,所以需要检测 没有的时候才清空
        //    if (_studyRepository.Count(t => t.SubjectVisitId == needDelete.SubjectVisitId) == 0)
        //    {
        //        _subjectVisitRepository.Update(t => t.Id == needDelete.SubjectVisitId,

        //         u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.UnExecuted, SVENDTC = null, SVSTDTC = null });

        //        _qcChallengeRepository.Delete(t => t.SubjectVisitId == needDelete.SubjectVisitId);

        //        //_qcChallengeRepository.Delete(t => t.SubjectVisitId == subjectVisitId);

        //        //_trialQCQuestionAnswerRepository.Delete(t => t.SubjectVisitId == subjectVisitId);
        //    }





        //    return ResponseOutput.Result(success1 || succeess2 || success3);
        //}

        //public void ClearStudyInstanceAndSeriseData(Guid studyId)
        //{
        //    //重新开始计数,怕数据库又脏数据,影响数量
        //    _studyRepository.Update(t => t.Id == studyId, u => new DicomStudy()
        //    {
        //        InstanceCount = 0,
        //        SeriesCount = 0
        //    });

        //    _dicomSeriesRepository.Delete(t => t.StudyId == studyId);
        //    _dicomInstanceRepository.Delete(t => t.StudyId == studyId);
        //}



        //public bool ReUploadDifferentStudy(Guid subjectVisitId, Guid abandonStudyId, Guid newStudyId)
        //{
        //    //_qcChallengeRepository.Update(t => t.SubjectVisitId == subjectVisitId && t.NeedReUpload == true, u => new QCChallenge() { ReUploadedTime = DateTime.Now, ReUploader = _userInfo.RealName });

        //    //注意这里不是用SeqId  主键查询,因为Seq id 是后续加的,为了不改变代码和前端接口参数
        //    var study = _studyRepository.FirstOrDefault(t => t.Id == abandonStudyId);

        //    var code = study.StudyCode;

        //    //清理以前的数据
        //    _studyRepository.Delete(t => t.Id == abandonStudyId);
        //    _dicomInstanceRepository.Delete(t => t.StudyId == abandonStudyId);
        //    _dicomSeriesRepository.Delete(t => t.StudyId == abandonStudyId);

        //    ////将以前的qa记录数据绑定到现在新生成的Study上
        //    //_qaNoticeRepository.Update(t => t.SubjectVisitId == abandonStudyId, u => new QANotice() { SubjectVisitId = newStudyId });
        //    //_qaNoticeUserRepository.Update(t => t.SubjectVisitId == abandonStudyId,
        //    //    u => new QANoticeUser() { SubjectVisitId = newStudyId });
        //    //_qaRecordRepository.Update(t => t.SubjectVisitId == abandonStudyId, u => new QARecord() { SubjectVisitId = newStudyId });


        //    var success = false;
        //    if (study.Status == (int)StudyStatus.Uploading)
        //    {
        //        success = _studyRepository.Update(t => t.Id == newStudyId, u => new DicomStudy()
        //        {
        //            Status = (int)StudyStatus.Uploaded,
        //            StudyCode = code
        //        });
        //    }
        //    else
        //    {
        //        //新一份的影像状态为旧影像的状态  不改变
        //        success = _studyRepository.Update(t => t.Id == newStudyId, u => new DicomStudy()
        //        {
        //            Status = study.Status,
        //            StudyCode = code
        //        });
        //    }



        //    #region 废弃之前的Study记录  讲新产生的记录的StudyCode  变更为老的  这样可以关联在一起

        //    //var realName = _userInfo.RealName;
        //    //var code = _studyRepository.GetAll().First(t => t.Id == abandonStudyId).StudyCode;
        //    //_studyRepository.Update(t => t.Id == abandonStudyId, u => new DicomStudy()
        //    //{
        //    //    Status = (int)StudyStatus.Abandon
        //    //});
        //    //_studyRepository.Update(t => t.Id == newStudyId, u => new DicomStudy()
        //    //{
        //    //    Status = (int)StudyStatus.Uploaded,
        //    //    StudyCode = code
        //    //});
        //    //_studyStatusDetailRepository.Add(new StudyStatusDetail
        //    //{
        //    //    Status = (int)StudyStatus.Abandon,
        //    //    StudyId = abandonStudyId,
        //    //    Note = string.Empty,
        //    //    OptUserName = realName,
        //    //    OptTime = DateTime.Now
        //    //});
        //    //_studyStatusDetailRepository.Add(new StudyStatusDetail
        //    //{
        //    //    Status = (int)StudyStatus.Uploaded,
        //    //    StudyId = newStudyId,
        //    //    Note = string.Empty,
        //    //    OptUserName = realName,
        //    //    OptTime = DateTime.Now
        //    //});

        //    //_studyStatusDetailRepository.SaveChanges();

        //    #endregion


        //    return success;

        //}


        //public virtual void ReUploadSameStudy(Guid subjectVisitId, Guid studyId)
        //{
        //    //_qcChallengeRepository.Update(t => t.SubjectVisitId == subjectVisitId && t.NeedReUpload == true, u => new QCChallenge() { ReUploadedTime = DateTime.Now, ReUploader = _userInfo.RealName });

        //    #region  之前整个上传过程操作没有放在一个整体事务  会有脏数据    现在整体一个事务,不会产生,废弃 但是切入AOP 所以保留空方法
        //    //var study = _studyRepository.FirstOrDefault(t=>t.Id== studyId);
        //    //var status = study.Status;

        //    //if (status == (int)StudyStatus.Uploading)
        //    //{
        //    //    _studyRepository.Update(t => t.Id == studyId, u => new DicomStudy()
        //    //    {
        //    //        Status = (int)StudyStatus.Uploaded
        //    //    });
        //    //}
        //    #endregion
        //}
        ///// <summary>
        ///// 上传完检查后,处理检查 汇总  Series的Modality 更新到检查里面 检查状态  上传人
        ///// </summary>
        ///// <param name="studyId"></param>
        //public void UploadStudyDeal(Guid studyId)
        //{

        //    var seriesModalityList = _dicomSeriesRepository.Where(t => t.StudyId == studyId).Select(u => u.Modality).Distinct();
        //    string ModaliyStr = string.Join('、', seriesModalityList.ToList());

        //    var study = _studyRepository.FirstOrDefault(t => t.Id == studyId);
        //    study.Status = (int)StudyStatus.Uploaded;
        //    study.Modalities = ModaliyStr;
        //    _studyRepository.SaveChanges();
        //}


        //public List<SubjectVisitStudyDTO> GetSubjectVisitStudyList(Guid trialId, Guid siteId, Guid subjectId, Guid subjectVisitId)
        //{
        //    var query = _studyRepository.Where(t => t.TrialId == trialId && t.SiteId == siteId && t.SubjectId == t.SubjectId && t.SubjectVisitId == subjectVisitId)
        //        .Select(u => new SubjectVisitStudyDTO() { Modalities = u.Modalities, StudyCode = u.StudyCode, StudyId = u.Id, Status = u.Status });

        //    return query.ToList();
        //}

        ////此处有AOP操作,不要更改为动态Api
        //public virtual IResponseOutput UpdateStudyStatus(StudyStatusDetailCommand studyStatus)
        //{

        //    //注意这里不是用SeqId  主键查询,因为Seq id 是后续加的,为了不改变代码和前端接口参数
        //    var study = _studyRepository.FirstOrDefault(t => t.Id == studyStatus.StudyId);

        //    //数据库状态,其他人已经操作过了,此时提醒
        //    if (study.Status > studyStatus.Status)
        //    {
        //        ResponseOutput.NotOk($"当前界面Study:{study.StudyCode} 状态被其他人已变更,不允许该操作,请刷新界面");
        //    }

        //    ////防止多次调用,更新 没必要
        //    //if (study.Status == studyStatus.Status)
        //    //{
        //    //    return ResponseOutput.Ok();
        //    //}

        //    study.Status = studyStatus.Status;
        //    study.UpdateTime = DateTime.Now;

        //    //if (studyStatus.Status == (int)StudyStatus.Uploaded)
        //    //{
        //    //    study.UploadedTime = DateTime.Now;
        //    //    study.Uploader = _userInfo.RealName;


        //    //}
        //    //if (study.Status == (int)StudyStatus.QAing)
        //    //{
        //    //    study.DeadlineTime = studyStatus.DeadlineTime;
        //    //}

        //    if (studyStatus.Status == (int)StudyStatus.QAFInishNotPass)
        //    {
        //        study.QAComment = studyStatus.QAComment;
        //    }


        //    return ResponseOutput.Ok(_studyRepository.SaveChanges());
        //}

        //public List<StudyStatusDetailDTO> GetStudyStatusDetailList(Guid studyId)
        //{
        //    return _studyStatusDetailRepository.Where(s => s.StudyId == studyId).OrderByDescending(s => s.OptTime)
        //        .ProjectTo<StudyStatusDetailDTO>(_mapper.ConfigurationProvider).ToList();
        //}


        //public bool DistributeStudy(StudyReviewerCommand studyReviewer)
        //{
        //    //更新Study表中,总的状态
        //    // 插入中间表
        //    studyReviewer.StudyList.ForEach(study =>
        //    {
        //        var workloadType = 1;
        //        StudyStatus studyStatus = StudyStatus.Distributed;

        //        if (study.Status >= (int)StudyStatus.NeedAd)
        //        {
        //            workloadType = 2;
        //            studyStatus = StudyStatus.AdDistributed;
        //        }

        //        var tempStudy = _studyRepository.FirstOrDefault(s => s.Id == study.StudyId);
        //        tempStudy.Status = (int)studyStatus;
        //        _studyRepository.Update(tempStudy);

        //        _studyReviewerRepository.Add(new StudyReviewer()
        //        {
        //            ReviewerId = studyReviewer.ReviewerId,
        //            StudyId = study.StudyId,
        //            WorkloadType = workloadType,
        //            TrialId = studyReviewer.TrialId,
        //            Status = (int)studyStatus
        //        });
        //    });

        //    return _studyReviewerRepository.SaveChanges();
        //}


        //public IResponseOutput EditStudyReviewer(StudyReviewerEditCommand studyReviewerEditCommand)
        //{
        //    _studyReviewerRepository.Delete(t => studyReviewerEditCommand.StudyId == t.StudyId);

        //    if (studyReviewerEditCommand.IsDoubleReview)
        //    {
        //        if (studyReviewerEditCommand.ReviewerId1 != null)
        //        {
        //            _studyReviewerRepository.Add(
        //                new StudyReviewer()
        //                {
        //                    StudyId = studyReviewerEditCommand.StudyId,
        //                    TrialId = studyReviewerEditCommand.TrialId,
        //                    ReviewerId = studyReviewerEditCommand.ReviewerId1.Value,
        //                    WorkloadType = 1
        //                });
        //        }

        //        if (studyReviewerEditCommand.ReviewerId2 != null)
        //        {
        //            _studyReviewerRepository.Add(
        //                new StudyReviewer()
        //                {
        //                    StudyId = studyReviewerEditCommand.StudyId,
        //                    TrialId = studyReviewerEditCommand.TrialId,
        //                    ReviewerId = studyReviewerEditCommand.ReviewerId2.Value,
        //                    WorkloadType = 1
        //                });
        //        }

        //        if (studyReviewerEditCommand.ReviewerIdForAD != null)
        //        {
        //            _studyReviewerRepository.Add(
        //                new StudyReviewer()
        //                {
        //                    StudyId = studyReviewerEditCommand.StudyId,
        //                    TrialId = studyReviewerEditCommand.TrialId,
        //                    ReviewerId = studyReviewerEditCommand.ReviewerIdForAD.Value,
        //                    WorkloadType = 2
        //                });
        //        }

        //        if (studyReviewerEditCommand.ReviewerId2 == null || studyReviewerEditCommand.ReviewerId1 == null)
        //        {
        //            _studyRepository.Update(t => t.Id == studyReviewerEditCommand.StudyId,
        //                u => new DicomStudy()
        //                {
        //                    Status = (int)StudyStatus.QAFinish
        //                });
        //        }
        //    }
        //    else
        //    {
        //        if (studyReviewerEditCommand.ReviewerId1 != null)
        //        {
        //            _studyReviewerRepository.Add(
        //                new StudyReviewer()
        //                {
        //                    StudyId = studyReviewerEditCommand.StudyId,
        //                    TrialId = studyReviewerEditCommand.TrialId,
        //                    ReviewerId = studyReviewerEditCommand.ReviewerId1.Value,
        //                    WorkloadType = 1
        //                });
        //        }
        //        else
        //        {
        //            _studyRepository.Update(t => t.Id == studyReviewerEditCommand.StudyId,
        //                u => new DicomStudy()
        //                {
        //                    Status = (int)StudyStatus.QAFinish
        //                });
        //        }
        //    }

        //    var success = _studyReviewerRepository.SaveChanges();
        //    return ResponseOutput.Result(success);
        //}

        //public List<ReviewerDistributionDTO> GetReviewerListByTrialId(Guid trialId)
        //{
        //    var query = from enrollItem in _enrollRepository
        //            .Where(t => t.TrialId == trialId && t.EnrollStatus >= 10)
        //                join doctorItem in _doctorRepository.AsQueryable()
        //                    on enrollItem.DoctorId equals doctorItem.Id into g
        //                from doctor in g.DefaultIfEmpty()
        //                select new
        //                {
        //                    ReviewerCode = doctor.ReviewerCode,
        //                    FirstName = doctor.FirstName,
        //                    LastName = doctor.LastName,
        //                    ReviewerId = enrollItem.DoctorId,
        //                    ActivelyReading = doctor.ActivelyReading,
        //                };

        //    return query.Where(s => s.ActivelyReading).Select(s => new ReviewerDistributionDTO
        //    {
        //        ReviewerCode = s.ReviewerCode,
        //        FirstName = s.FirstName,
        //        LastName = s.LastName,
        //        ReviewerId = s.ReviewerId,

        //    }).ToList();
        //}


        //public PageOutput<DistributeReviewerStudyStatusDTO> GetDistributeStudyList(
        //  StudyStatusQueryDTO studyStatusQueryDto)
        //{
        //    Expression<Func<StudyReviewer, bool>> studyReviewerLambda = x => x.TrialId == studyStatusQueryDto.TrialId;

        //    if (studyStatusQueryDto.ReviewerId != null)
        //    {
        //        studyReviewerLambda = studyReviewerLambda.And(t => t.ReviewerId == studyStatusQueryDto.ReviewerId);
        //    }

        //    if (studyStatusQueryDto.StudyStatus != null)
        //    {
        //        studyReviewerLambda = studyReviewerLambda.And(t => t.Status == studyStatusQueryDto.StudyStatus);
        //    }

        //    var query = from studyReviewer in _studyReviewerRepository.Where(studyReviewerLambda)
        //                join doctor in _doctorRepository.AsQueryable() on studyReviewer.ReviewerId equals doctor.Id
        //                join study in _studyRepository.AsQueryable() on studyReviewer.StudyId equals study.Id
        //                select new DistributeReviewerStudyStatusDTO()
        //                {
        //                    Name = doctor.LastName + " / " + doctor.FirstName,
        //                    NameCN = doctor.ChineseName,
        //                    ReviewerCode = doctor.ReviewerCode,
        //                    Status = studyReviewer.Status,
        //                    StudyCode = study.StudyCode
        //                };

        //    return query.ToPagedList(studyStatusQueryDto.PageIndex,
        //        studyStatusQueryDto.PageSize, studyStatusQueryDto.SortField == string.Empty
        //            ? "ReviewerCode"
        //            : studyStatusQueryDto.SortField, studyStatusQueryDto.Asc);


        //}

        //public IEnumerable<RelationVisitDTO> GetRelationVisitList(decimal visitNum, string tpCode)
        //{
        //    string tpGroup = tpCode.Substring(tpCode.Length - 3, 3);
        //    var tp = _workloadTPRepository.FirstOrDefault(u => u.TimepointCode == tpCode);
        //    var query = from workloadTp in _workloadTPRepository.Where(u => u.SubjectId == tp.SubjectId
        //                                                                             && u.TrialId == tp.TrialId &&
        //                                                                             u.TimepointCode.Contains(tpGroup))
        //                join subjectVisit in _subjectVisitRepository.Where(u => u.VisitNum <= visitNum)
        //                    on workloadTp.SubjectVisitId equals subjectVisit.Id
        //                select new RelationVisitDTO
        //                {
        //                    StudyId = workloadTp.StudyId,
        //                    TpCode = workloadTp.TimepointCode,
        //                    VisitName = subjectVisit.VisitName
        //                };
        //    return query.ToList();
        //}

        //public List<QANoticeDTO> GetQANoticeList(Guid subjectVisitId)
        //{

        //    var query = from noticeUser in _qaNoticeUserRepository.AsQueryable()
        //            .Where(t => t.ToUserId == _userInfo.Id && t.SubjectVisitId == subjectVisitId)
        //                join notice in _qaNoticeRepository.Where(u => u.NeedDeal == true && u.SubjectVisitId == subjectVisitId) on
        //                    noticeUser.QANoticeId equals notice.Id
        //                select notice.Id;

        //    var noticeUserList = query.ToList();

        //    //待处理的消息数量
        //    var count = noticeUserList.Count;


        //    var list = _qaNoticeRepository.Where(t => t.SubjectVisitId == subjectVisitId)
        //        .ProjectTo<QANoticeDTO>(_mapper.ConfigurationProvider).OrderByDescending(t => t.SendTime).ToList();

        //    list.ForEach(t => t.IsMessageReceiver = count > 0 && noticeUserList.Contains(t.Id) ? t.NeedDeal : false);


        //    return list;
        //}

        //public IResponseOutput DealNonDicomFile(Dictionary<string, string> filePathDic,
        //    ArchiveStudyCommand archiveStudyCommand)
        //{


        //    var savedInfo = GetSaveToDicomInfo(archiveStudyCommand.SubjectVisitId);

        //    var dicomStudy = new DicomStudy
        //    {
        //        Id = Guid.NewGuid(),

        //        //SiteId = addtionalInfo.SiteId,
        //        //TrialId = addtionalInfo.TrialId,
        //        //SubjectId = addtionalInfo.SubjectId,
        //        //SubjectVisitId = addtionalInfo.SubjectVisitId,
        //        IsDoubleReview = savedInfo.IsDoubleReview,
        //        Comment = savedInfo.Comment
        //    };



        //    #region Setting Code

        //    //var last = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId)
        //    //    .OrderByDescending(c => c.StudyCode).FirstOrDefault();
        //    //if (last != null)
        //    //{
        //    //    var len = last.StudyCode.Length;
        //    //    if (len > 5 && int.TryParse(last.StudyCode.Substring(len - 5, 5), out var num))
        //    //    {
        //    //        dicomStudy.StudyCode = "ST" + (++num).ToString().PadLeft(5, '0');
        //    //    }
        //    //    else
        //    //    {
        //    //        return ResponseOutput.NotOk("Generate StudyCode failed");
        //    //    }
        //    //}
        //    //else
        //    //{
        //    //    dicomStudy.StudyCode = "ST" + 1.ToString().PadLeft(5, '0');
        //    //}

        //    #endregion

        //    var study = _studyRepository.Add(dicomStudy);
        //    var saveFileList = new List<NoneDicomFile>();

        //    foreach (var key in filePathDic.Keys)
        //    {
        //        saveFileList.Add(new NoneDicomFile() { FileName = filePathDic[key], StudyId = study.Id, Path = key });
        //    }


        //    _noneDicomFileRepository.AddRange(saveFileList);



        //    var success = _noneDicomFileRepository.SaveChanges();

        //    UpdateStudyStatus(new StudyStatusDetailCommand
        //    {
        //        StudyId = study.Id,
        //        Status = (int)StudyStatus.Uploaded,
        //        Note = string.Empty
        //    });


        //    return ResponseOutput.Result(success);

        //}
        #endregion


    }
}